desmume-0.9.9/0000755000175000017500000000000012140305317013716 5ustar guillaumeguillaumedesmume-0.9.9/aclocal.m40000644000175000017500000020537512140304535015573 0ustar guillaumeguillaume# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 42 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' AC_SUBST(INTLTOOL_V_MERGE) AC_SUBST(INTLTOOL__v_MERGE_) AC_SUBST(INTLTOOL__v_MERGE_0) INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) AC_SUBST(intltool__v_merge_options_) AC_SUBST(intltool__v_merge_options_0) INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) # nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR desmume-0.9.9/Makefile.am0000644000175000017500000000022212140261635015752 0ustar guillaumeguillaumeEXTRA_DIST = README.LIN README.MAC README.WIN dsm.txt dsv.txt autogen.sh \ $(PO_FILES_IN) DISTCLEANFILES = $(PO_FILES) SUBDIRS = $(PO_DIR) src desmume-0.9.9/INSTALL0000644000175000017500000003660012140304540014751 0ustar guillaumeguillaumeInstallation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. desmume-0.9.9/README.LIN0000644000175000017500000001357612140261635015237 0ustar guillaumeguillaume DeSmuME _________________________________________ Copyright (C) 2006 yopyop Copyright (C) 2006-2007 DeSmuME team 1) Compiling instructions...................................13 2) How to use DeSmuME.......................................53 3) Contact information......................................142 4) Disclaimer...............................................160 1 Compiling instructions______________________________________ DeSmuME is written in C using the gtk+ and SDL libraries. So you need a working C compiler, such as gcc and the above libraries runtime and development packages: * http://www.gtk.org * http://www.libsdl.org/ Once these libraries are installed, you should be ready to install DeSmuME. DeSmuME provides another interface based on libglade, to use it, you'll need glade: * http://glade.gnome.org/ 1.1 From a release archive____________________________________ Uncompress the DeSmuME archive, move to the newly created directory, type "./configure", then "make". It will generate three programs: 1) "desmume" in the "src/gtk" directory; 2) "desmume-cli" in the "src/cli" directory. If glade is installed on your system, you'll get a third binary: 3) "desmume-glade" in the "src/gtk-glade" directory. You can even type "make install" to install those programs on your system (in /usr/local/ by default), then uninstalling is done by typing "make uninstall". 1.2 From a CVS copy___________________________________________ Move to the toplevel directory (the one that contains the configure.ac file). Type "./autogen.sh" to generate the configure/install scripts and needed Makefiles. Then you can follow the same procedure as in 1.1 . 2 How to use DeSmuME__________________________________________ There are three versions of DeSmuME under Linux. These are a Gtk+ build, a Glade build and a CLI SDL build. All these builds have some common command line options: --disable-limiter Disables the 60 fps limiter --soft-convert Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port --cflash=PATH_TO_DISK_IMAGE Enable disk image GBAMP compact flash emulation --help Display this message NOTE: The Gtk+ and Glade builds use gtkGLext to handle the OpenGL rendering and contexts. You may get improved performance by also passing the argument --gdk-gl-force-indirect. This has been seen to improve things for Nvidia based graphics cards under Linux. GDB Debugger Stubs: Source level debugging of ARM9 and/or ARM7 code is supported using a GDB/Insight debugger. The GDB stubs are enabled from the command line using the following options: --arm9gdb= (for the ARM9) --arm7gdb= (for the ARM7) The PORT_NUM is the TCP port upon which the stub will listen for connections. Once enabled you can connect to the stub using the following command at the GDB debugger prompt (assuming GDB and DeSmuME are running on the same machine): target remote : NOTE: there are problems with the ARM support when stepping code with GDB versions prior to version 6.6. It is recommended that you use at least version 6.6 if possible. GBAMP compact flash emulation: The default behaviour of DeSmumME is to attempt to emulate the FAT image for the contents of the directory where the running .nds file was located. This behaviour can be altered using the --cflash= command line option. Using this option DeSmuME will emulation a GBAMP and read and write sectors from/to the disk image file. The disk image file must be created and populated with files using some external tool. NOTE: currently if desmume fails to open the disk image file it will silently continue minus a working GBAMP emulation. 2.1 Gtk+ version______________________________________________ Type "desmume" in a shell, a window should appear, then open a rom file using the "open" button, next use the "run" button to start emulation. The following command line options are specific to the Gtk+ build: --opengl-2d Enables using OpenGL for screen rendering --disable-sound Disables the sound emulation --disable-3d Disables the 3D emulation 2.2 CLI SDL version_______________________________________________ Just type "desmume-cli path-to-a-rom" in a shell. The following command line options are specific to the CLI build: --opengl-2d Enables using OpenGL for screen rendering --disable-sound Disables the sound emulation 3 Contact information_________________________________________ General inquiries should go to: E-mail: guillaume@desmume.org Linux Port-related inquiries should go to: E-mail: guillaume@desmume.org Web: http://desmume.org Please don't ask for roms, bios files or any other copyrighted stuff. If you want to submit a bug report, please run desmume, go into the "Help" menu, and click on "Submit a bug report". If you're having trouble with it, please feel free to email. 4 Disclaimer__________________________________________________ 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the GNU General Public License details in COPYING. desmume-0.9.9/ChangeLog0000644000175000017500000010471212140261635015501 0ustar guillaumeguillaume0.9.8 -> 0.9.9 (r4228-r4591-r4623) Yes, it's been a while since the last release, but we haven't been completely idle. There's a brand new jit cpu core which yields some impressive speedups! General/Core: !!!: add optional arm cpu jit (functioning on x86 and x64 hosts only) bug: we're not going to list 70% of the emulation fixes, as is traditional. bug: savestate reliability fixes related to halt states, gxstat, firmware bug: lua: fix readbyterange, gdscreenshot functions bug: commandline slot-1 handling straightened out enh: fixes and additions to resize filter options Graphics: enh: opengl 3d driver compatibility improvements bug: fix giant regression from 0.9.7 that left garbage from previous frames on the screen in some games bug: 3d: fix some single poly pixels bug: 3d: fix some polygon and texture coloring bugs on big-endian systems Windows: bug: fixes to advanscene DB import bug: fix some full screen stretching bugs enh: add xaudio2 output driver enh: add opengl display method (as opposed to directdraw), with controllable bilinear filter enh: upgrade archive handling system, lzma2 supported enh: reorganize main menu quite a bit enh: add rotation hotkeys, and hotkey to control mouse cursor visibility enh: memory viewer improvements and fixes enh: improve interface for rom eject to prevent accidents and improve usefulness (hide in slot-1 config screen) Cocoa: bug: fix missing display when running on OS X v10.8 Mountain Lion bug: fix possible sound crash when using Dual SPU Synch/Asynch bug: fix File menu items being disabled after the file migration sheet is used bug: fix window resizing issues bug: fix text rendering in About box enh: show the icon and name of the loaded ROM enh: add Support Request and Bug Report forms to the Help menu enh: add more detailed info to the About box enh: add OpenGL as a 3D rendering option enh: add support for MSAA when using OpenGL as the 3D rendering engine enh: add V-Sync option enh: add Display Orientation, Display Order, and Display Separation options for Combo Display mode enh: add HQ4xS filter enh: completely revamp the user interface for Input Preferences enh: many emulator commands may now be mapped enh: add ability to map an input to user-defined touch screen coordinates enh: add support for saving and applying input profiles enh: add support for using an audio file for the microphone input enh: add sine wave tone generator for microphone input enh: add support for multiple display windows (File > New Display Window) enh: add support for SLOT-1 devices (Emulation > Show SLOT-1 Manager) enh: overall performance and stability improvements enh: miscellaneous user interface improvements 0.9.7 -> 0.9.8 (r3812-r4228) Yes, it's been a while since the last release, but we haven't been completely idle. There's a brand new top shelf Cocoa frontend to make life far more pleasant for OSX users, and a host of compatibility fixes. General/Core: bug: fix more IPC FIFO errors bug: import more save files correctly bug: don't autopatch already-patched roms bug: fix bugs in piano and guitar grip bug: fix ARM7's VRAMSTAT register bug: fix memory leaks on compact flash emulation bug: fix reading of rom from low header area bug: spu: fix some poppy interpolation audio quality issues bug: improve timing of dma operations by running through normal mem cycle accounting; fixes an annoying number of games and graphical glitches bug: fix opcode MRC and fake bios CRC16 enh: jitter some related register and irq events to simulate pipeline effects and stimulate some race conditions to other outcomes enh: fake (deterministic) some tiny jitter from human's hand holding stylus; some games were accidentally depending on this enh: support nocash-style prints from arm enh: add lua apis for accessing vram enh: platforms other than windows receive threading optimizations enh: provide diagnostics when system powers off (useful for homebrewers returning from main()) enh: clarify handling of different console types within the family (ds,dslite,debug) enh: vfat support for slot-1 devices enh: emulate temperature register enh: add paddle emulation Graphics: bug: fix occasional crash from uninitialized blending table bug: fix some 2d alpha blending cases resulting in white screens bug: fix VRAM_I B_OBJ mirroring and fix sprites rendering across the end of vram bug: fix rotoscaled sprites wrapping around screen bug: dont fix rotscaled bitmap sprites with alpha==0 bug: opengl: fix degradation of toon rendering during loadstate bug: opengl: alpha blending fixes bug: many refinements to opengl renderer bug: opengl: support rear-plane/ClearImage emulation (fixes many graphics) bug: rasterizer: fix some rare alpha blending cases bug: fix bug in environment mapping introduced after 0.9.6 bug: fix totally glitched out 3d graphics with several improvements involving matrix stack bug: fix memory overflows in epx filter bug: prevent backdrop from blending with ??? enh: opengl: better depth buffering emulation enh: better support for line segment "polys" by detection and special rendering logic enh: opengl: support quad primitives directly enh: add hq4x filter Windows: bug: fix a long-standing loadstate crash bug: fix lag frame accounting bug: fix glitches in cheat entry menu bug: stop compact flash emulation from accidentally scanning c:\ sometimes enh: add support for game database for improved save type detection enh: hotkey for limit framerate toggle enh: remove stop and reset toolbar buttons which were accidentally getting used enh: additional complexification to desmume's behaviour run from a console prompt. whether it's better is uncertain. enh: add support for cheats databases enh: improvements to ram search tool enh: preliminary support for varying stylus pressure enh: add [Display] Show Console=1 to ini file enh: more graceful cheat parsing and add some hotkeys enh: add 5x window size enh: add big endian and 20.12 toggle to memview and ramwatch enh: improve FPS throttle feedback and granularity enh: add lua menu API enh: hud font switching enh: add optional file association for .nds to path config dialog Cocoa: enh: Big update to cocoa frontend. Pretty much entirely new. (rogerman) Linux: bug: gtk: glitches in rom and recent rom loading bug: glade: normalize savestate slot to hotkey mapping enh: support soundtouch for use by metaspu enh: gtk: add SPU mode selection (Tobias Jakobi) enh: cli: better fps limiting (Thomas Jones) Wx: bug: some small fixes here and there (Jan Bcken) enh: lot of code cleanup (Jan Bcken) 0.9.6 -> 0.9.7 (r3493-r3812) General/Core: bug: fix a ton of old, broken cpu opcodes and CP15 logic bug: return Z1 and Z2 from TSC (fixes some touch logic) bug: gba slot save type detection improved bug: handle unusual rom headers more correctly bug: dont confuse motion pack commands with save memory commands bug: make cheat system a little less flaky and add AR 1.54 support bug: fix nondeterministic backup memory behaviour while rerecording bug: correct emulation of register accesses of wrong size and during powerdown bug: rewrite --cflash-path emulation bug: rewrite IPC/GX FIFO, IRQ flag generation, and wait-for-IRQ logics bug: rewrite RTC calendar handling; now supports years > 2038 enh: auto-DLDI patching for homebrew enh: --gbaslot-rom=self mounts self.nds in slot2 enh: more realistic exception handling enh: piano controller emulation enh: modular slot-1 system for exact emulation of homebrew cards Graphics: bug: edge marking colors were wrong bug: handle some "invalid" vram configurations correctly bug: convert half of geometry engine to fixed point bug: fix sprite blend+fadein/fadeout bug: improve rasterizer shadows bug: fix main memory display DMA bug: fix some raster fx timing bugs enh: add a hack for improving some non-stencil shadows Windows: bug: misc fixes and improvements to gpu viewer tools bug: sub screen layer display toggling fixed bug: fixes and improvements to ram watch, ram search, cheats list bug: fix start-paused commandline bug: fix memory leaks when sound disabled bug: improve load average calculators and add arm7 load average enh: background input support enh: add vsync option enh: support more knobs on joysticks enh: import cheats from R4 database enh: add xinput rumble for 360 pads Linux/OSX: bug: crash less in recent roms list enh: Add horizontal screen layout and swap screen ability to gtk frontend (noodlebox) enh: Big improvement to joystick support, support complex configurations and multiple devices (noodlebox) 0.9.5 -> 0.9.6 (r3075-r3493) Users of gtk, cli and gtk-glade frontends please note that now we have a common directory in ~/.config/desmume for config file, saves and savestates. The old .desmume.ini will be moved automatically with the name config but you have to move your saves manually. Some save files may be invalidated due to use of broken crc logic. Back up your DSV files before using this version of the emulator or else the game might wipe it. General/Core: bug: emulate keypad interrupt bug: spu overhaul, add capture support bug: fix dma address reloading bug: fix rom close memory corruption bug: fix div and sqrt busy flag bug bug: fix vectest bug: fix lid savestate desync bug: fix texcache memory GB explosion when games use tons of tiny 3d sprites bug: fix huge rerecording movie file handle leak bug: fix EXXXXXXX cheat codes and some add/edit/save/load bugs bug: add 8MBit - 512MBit flash emulation bug: fix firmware booted-from-card flag bug: fix some failures to wake bug: fix some rtc calendar logic bug: op_bkpt emulation bug: correctly emulate POWCNT1 and POWCNT2 and SPI power device bug: corrections to bootup stack configuration bug: protect bios from being overwritten bug: initialize save data to 0xFF instead of 0x00 bug: handle relocated irq vectors bug: support patched firmwares bug: handle 8bit auxspidata, 32bit BLDY, 32bit div regs bug: fix some divide by zero cases bug: don't print \n in ideas debug message bug: don't let games read off end of cart and crash emulator bug: fix SWI 0x0E crc16 ; some save files using wrong crc may be invalidated bug: fix many big endian bugs bug: fix CPSR.I idle wakeup bug: fix loadstate crashes, mostly when sound is enabled enh: support devkitpro argv enh: add gbaslot-rom commandline enh: add no$gba debug message enh: add rtc start to dsm header Graphics: bug: fix a mistakenly rendered OBJ window and 3d blend effects bug: fixes to matrix stacks, fixing lots of garbled geometry bug: fix fog density registers bug: fix hblank dma to run also on scanline 262 bug: fix w/z depth flags for broken GUIs in dual screen 3d games bug: fixes to poly sorting bug: block 8bit vram writes enh: improve accuracy of opengl shaders Windows: bug: fix 16bpp display bug: more fixes to multi-gamepads bug: cheat windows robustification bug: fix that sticky pause state when resetting and loading roms bug: dont crash when no sound device is available bug: change F10 to be save slot 0 bug: fix --start-paused enh: try not to screensave while using gamepad enh: add EPX and EPX1.5X resize filters enh: add a japanese translation which will soon be stale like the others enh: add fancy ctrl+printscreen with emulator info on it enh: add "lockdown" window mode to keep window safe from fast stylus action enh: add alt+enter fullscreen command enh: add card eject command enh: add ddraw software mode forcer enh: improve oam viewer enh: default 3d to rasterizer so we dont have to suggest it 1000 times a day enh: add dump-all-memory tool enh: add reload rom menu/hotkey Linux/OSX: bug: fix building for nosse2 systems bug: fix --num-cores bug: fix occasional touchscreen failures bug: fix crash starting dsm record enh: add --nojoy=1 to fix laptops with accelerometers enh: add simple auto frameskip mode in the gtk frontend enh: add gui for configuring joystick in the gtk frontend enh: make the cli frontend read the ini config file too enh: additional OpenAL microphone backend (ncalexan) enh: common place for config and saves (Jan Steffens) enh: libagg is now optional if you don't need the hud 0.9.4 -> 0.9.5 (r2437-r3075) 0.9.5 introduces an entirely rewritten main emulation loop This totally changes the timing, and totally breaks old savestates. The OSX build is now based on the GTK port which is more up-to-date. Assorted Highlights: * synchronous SPU mode to fix streaming sounds * win32: lua engine, path configuration, 7z dearchiving support General/Core: bug: rewrite main emulation loop and cycle accounting, fixes a lot of timings bug: add more detailed timing emulation, removes much bogus lag bug: rewrite DMA,gxfifo,gxstat; fix many games and no more alternate flush mode bug: fix cflash directory support for non-windows and sector-writing bug: fix freeze in cart irq bug: correctly emulate dma to/from tcm bug: fix in thumb LSR carryflag bug: fix thumb BX PC switch to arm state bug: fix adpcm looping, remove adpcm caching (no longer necessary) bug: fixes to swi 3,4,5,8,0x10 bug: fixes to exmemstat and ipc sync registers bug: support new backup commands bug: improve bootup bios/firmware emulation steps enh: gbaslot: add guitar grip, gbagame flash support, expansion memory pak enh: add more powerful antigrain-based drawing library and rewrite OSD system enh: ideas-style debugging prints enh: most optimizations now SSE instead of SSE2 enh: more improvements to frameskipping and frame advance/speed controls Graphics: bug: fix backdrop blending with garbage bug: fix 256B granularity sprite addressing for sub gpu bug: fix obj blending, bmp obj rendering, and some obj window cases bug: fix 128-wide captures bug: fix 16color BG line buffer overflow bug: fix color overflow in capture blending bug: fix disp fifo capture bug: fix simultaneous vram display and capture via same bank bug: fix 3d overflow acknowledge registers bug: fix 32bit toon table writes bug: change 3d cores to use 18bit color bug: fix boxtest (addition overflow!), move clipper to main graphics engine bug: fix failure in some cases of polygon clipping bug: fix disp3dcnt emulations bug: fixes to poly sorting bug: fix ogl renderer wireframe support bug: swrast: fix backface culling of nonconvex polys bug: swrast: add clear image and scroll emulation bug: swrast: add fog emulation bug: swrast: fixes to shadow rendering bug: swrast: preliminary edge marking, works decent enh: swrast: multicore optimization for a few fps speedup Windows: bug: fix support for multiple gamepads and gamepad hotkeys bug: fix mic noise code and load wav instead of raw; effective in more cases bug: fix for several sticky and broken hotkeys, and f10 hotkeys bug: fixes in ram search, add DTCM and ITCM searching, ... bug: fix sound settings vol slider bug: recover from missing window -32000 problem bug: don't turn on mic unless mic input is enabled enh: x64 build type now supported enh: side-by-side and single screen view modes, many fixes to window resizing enh: choose any gap size by dragging bottom window edge (must be enabled) enh: choose a gap color enh: import/export no$GBA savefiles directly enh: multicore optimization for filters, rotation, OSD enh: soundview can now mute channels enh: new ioregview enh: common commandline system, many arguments shared with linux enh: improve map view tool to support more modes enh: add "FORCE AS CURRENT" recovery tool for mis-sized savefiles enh: add some kind of very small savestate rewinding buffer enh: autoframeskip works better enh: add Italian translation enh: added 2x resizing filters (hq2x, hq2xs, lq2x, lq2xs, 2xsai, supereagle) (scanlines, nearest2x, bilinear) Linux: enh: alsa microphone support enh: hud and osd notification for gtk and cli frontends enh: add support for the SSE optimizations 0.9.2 -> 0.9.4 (r1844->r2352->r2437) 0.9.3 was skipped due to emu news sites sneaking it out of our staging area and releasing it prematurely while it still had bugs. I was going to curse them individually, but then I decided that they would just like the publicity. Highlights: * New save autodetection and save file format * Full rerecording support General/Core: bug: fix many 64 bit and endian issues bug: fix mic input, which was nearly useless before bug: fix failures of large dmas bug: fix in ipc sync which broke devkitpro touch bug: screenshots now exclude hud and rotation bug: rewritten vram mapping (fixes corrupted or missing BG) enh: add universal commandline system (same commandline options on every port) enh: cheats: added Action Replay code parser enh: more reliable and useful frameskipping enh: SPU: speedup: add adpcm caching enh: SPU: speedup: interpolation is now optional enh: print svn build number so we can identify people's svn builds from screenshots Graphics: bug: add polygon y-sorting (fixes 3d guis) bug: fix texcoordgen mode 3; fixes some ortho sprites and some entirely broken games bug: display capture fixes bug: fix a number of OBJ modes bug: fixes to affine BG modes bug: better emulate some translucent OBJ bug: more correct handling of color effect windows and backdrop colors bug: fix matrix stack overrun which crashed emulator bug: swrast: add clear depth image emulation and other fixes to depth buffering bug: swrast: fix some toon and highlight cases bug: fix bug in matrix stack, fixes some broken models enh: add alternate flush mode HACK 3d config toggle, fixes some entirely broken 3d games Windows: bug: more robust cheats engine and dialog enh: more solid avi and wav recording enh: improved tools: memory viewer enh: added tools: spu viewer, ram watch, ram search enh: change build configuration system enh: speedup: add gpu core disabling to hide useless screens enh: add background pause feature (for when emulator loses focus) enh: add missing autohold for L and R enh: add chinese translation Gtk frontend: enh: switch all of menu/toolbar system to GtkAction + GtkUIManager enh: remove the gtglext 3d code enh: improve/speedup screen resize and final presentation logic in gtk frontend enh: minimal rerecording hookups Cli frontend: enh: hooked the frameskip (szigor) enh: misc usability improvements: auto pause switch for pausing when focus is lost and exit on escape pressing (szigor) enh: hook the fake noise mic; use m to toggle 0.9.1 -> 0.9.2 General/Core: bug: fix error in SBCS/RSCS flags; fixes many odd behaviors and crashes [zeromus] bug: add support for sleep mode and power registers [luigi__] bug: important fixes to RTC so correct time is actually told [luigi__] bug: fix card reads below 0x8000; fixes some game freezes [normatt] bug: fix 4 mbit save type; fix non-autodetect savefile dumping [zeromus, matusz] enh: add sram to GBA game addon emulation for importing savefiles [zeromus] enh: many improvements and feature hookups in linux ports [matusz, luigi__] Graphics: bug: fix specular texture mapping mode [luigi__] bug: repairs to some capture modes and vram mapping [zeromus, CrazyMax] bug: viewports finally correctly handled [zeromus] enh: add software rasterizer. quirky, but on par with opengl [zeromus] Windows: bug: mitigate bad frameskipper; default to old frameskipping mode [zeromus] bug: fixes with recent roms and zipfile loading [zeromus] bug: fix window position memory [zeromus] enh: bios and firmware may now be used and booted [luigi__] enh: many display, OSD, and input enhancements [luigi__] enh: brand new hotkey and controls binding system [zeromus] enh: configurable screen separation [luigi__] enh: fast forward key [pa__] enh: improvements to mic [luigi__] enh: faster updates in debug tools, up to once per frame [pa__] Mac OS X Port: enh: added Italian translation thanks to Paolo Bernini [jeff] enh: resurrection of GDB stub [sigmaris] 0.9 -> 0.9.1 General/Core: enh: GBA slot emulation [CrazyMax] - Rumble support (windows only) - GBA game enh: Mic support (windows only?) [luigi__] enh: Preliminary cheats system [CrazyMax] enh: Savestates invalidated, as more variables have been added. bug: Added PSG white noise [luigi__] bug: fix arm/thumb ROR [zeromus] bug: [ 2550645 ] Super Princess Peach: crash when starting a puzzle [zeromus] bug: win32: fix spu wav file writer (regression from 0.8) [zeromus,luigi__] bug: Much work on FIFOs, still not finished [CrazyMax] bug: Many fixes to dma [zeromus, CrazyMax] bug: bios WaitForVblank and WaitForInterrupt fixed [luigi__] Graphics: bug: Added sprite blending [luigi__] bug: more correct mosaic effects, still imperfect [zeromus] bug: Many fixes to tile rendering; all graphics tests now pass [luigi__] bug: fix crashes in some affine BG [zeromus] bug: Implement some pos test function [luigi__] bug: fix texture mapping across texture and palette banks and to unmapped banks [zeromus] bug: fix texture handling for texels with MSB set (fixes some texture corruption) [zeromus] bug: fix texture coordinate generation, including environment mapping [zeromus] bug: texture cache invalidates when palettes change, prevents some texture corruption [zeromus] bug: fix display capturing from 2d+3d source when display mode is display-vram [zeromus] bug: [ 2488334 ].1 fixes to layer compositing [luigi__] bug: [ 2488334 ].3 fix bug in support for hdma affine bg parameters [zeromus] bug: Improvements to 3d h-scrolling [luigi__] bug: Fix some errors in rendering 512 tall BG [zeromus,CrazyMax] (still not fully resolved) bug: Add optional fragment shading pipeline (more precision) [luigi__] bug: Fix bug where some sprites got cut of on x=255 [zeromus] bug: Implement GXSTAT register [CrazyMax] Windows: bug: resizing and rotating work in vista [luigi__] enh: 0 frameskip now lets emulator run at excess speed [zeromus] Mac OS X Port: bug: left key setting no longer gets confused with the right key [jeff] enh: more keys can be mapped 0.8 -> 0.9 There have been so many changes that this list can hardly be considered complete. For this release, we have formatted the list into a high level overview of big changes and bad bugs relative to the previous release. Hopefully what you're interested in. This list does not include items which are solely performance boosts, for let us just say that virtually every system has been speeded up. * The savestate system is totally changed and incompatible with old savestates. * The 3d system should be considered rewritten. General/Core: enh: Convert to c++ enh: Add functions for a lid open/close. Holding key (default "Backspace" in Windows port) while game is freeze/non freeze. [CrazyMax] enh: Add secure area decryption from ndstool [zeromus] enh: Change savestate code to support loosely bound chunks and more easily other parts of the emu (GE, GPU). The savestate format is changed, but from now on it is in principle more resilient (though it will continue to break as we tinker with the internals) [zeromus] enh: Added SSE2 optimizations for matrices. Since we now make an SSE2 build, more optimizations can be made. [CrazyMax] enh: Add a preliminary GUI hud system [CrazyMax,zeromus] CPU/MMU: bug: Many fixes in IPC and GE FIFOs. Fixes freezes in NSMB, dsracing, and others. [CrazyMax,luigi__,shash] bug: Fix ARM instructions SBC and RSC (likewise SBC in thumb) [normatt] bug: Fixed Thumb LDMIA (fixes ingame Dead'n'Furious) [shash] bug: Fix repeating DMA (fixes NSMB parallax BG) [zeromus] bug: Proper handling for unaligned CPU accesses [luigi__] bug: Proper handling for undefined instruction exceptions [Salva Peir] bug: correctly return vram control register values (fixes homebrew 3d games) [zeromus] enh: Remove 16MB of WRAM at 0x01****** from arm9. Mapped to unused instead. Nobody knows what this was. [zeromus] enh: Changed instruction execution to 16 at a time blocks (tested and stable) [shash] Hardware: bug: Newer and better sqrt and div emulation; makes SM64DS playable [luigi__,shash,zeromus] bug: Add preliminary RTC implementations [CrazyMax] enh: Add cosine interpolation in the SPU (conditionally compiled) [zeromus,luigi__] enh: Experimental: always one silent non-mixing SPU core at 44.1khz synched with emu, for more precision. The audible core runs with the host, causing music to slow down but not tear or pitch bend. [zeromus] Graphics: - Overhaul 3d: . Move entire GE to core emu. . Move OpenGL renderer to emu core for optional use by platforms, removing ogl_collector. Now every platform shares the same 3d code. . Reorganize 3d code to defer rendering to after 3d vblank. Eliminates tearing, and texturing artifacts. [zeromus] . Add optional fragment shading pipeline (more precision) [luigi__] . Move lighting model to software instead of using opengl's fixed function model [zeromus] . Render shadow volumes; toon shading and highlight table [zeromus, luigi__] . Added texture caching! big speed up. [CrazyMax] bug: Many assorted tweaks and improvements to 3d and 2d precision [zeromus,CrazyMax,luigi__] bug: Fixes to GE: command unpacking, projection and pos-vector mode matrix handling, mult and load commands [zeromus] bug: Fix a bug in texture transformation mode 1 [zeromus] bug: Fixed GPU rendering bugs in sprites and BG [CrazyMax] bug: Fixes to texture conversion [CrazyMax,zeromus] bug: Fixes in capture display (no blinking in many games with dual 3D) [CrazyMax] bug: Fixes in master brightness (this fixes some games with black screens) [CrazyMax] bug: Fixes in screen, backdrop, and sprite blending [luigi__] bug: Changed clear depths and how depth initial values are calculated (fixes SM64DS skybox, Castlevania) [shash,lugi__] bug: Add 3d layer h-scrolling [zeromus] bug: Added transparency and fixed material alpha support and alpha testing on the 3D core [shash] bug: Rewrite VRAM mapping control and rendering (more accurate) [CrazyMax,luigi__] bug: convert colors to opengl better to prevent alpha=31 polys from being ever so slightly transparent [zeromus] enh: Add MMU->GPU signal for when vram mappings change to function as a texture cache invalidate signal [zeromus] enh: Make matrix 4x4 multiply routines use W-coordinate; carry w coord through pipeline [zeromus] Mac OS X port: bug: Fixed: Filenames and paths with unicode characters now work. [Jeff] bug: Fixed: Load state from file button works again. [Jeff] enh: Save State panel now pauses emulation while the file selection box is open. [Jeff] bug: Fixed: Frozen video output (and/or messed 3d emulation) after loading a state. [Jeff] bug: Added option to load the most recent file upon launching the program. [Jeff] enh: Added French translation (thanks to Pierre Rudloff). [Jeff] enh: Added basic key mapping configuration to application preferences (thanks to Julio Gorg). [Jeff] enh: Added keyboard shortcuts for Execute, Pause and Reset command (thanks to Julio Gorg). [Jeff] enh: Default key mappings are no longer case sensitive. [Jeff] enh: Added ability to limit speed. [Jeff] enh: Fixed: Video output should work on software-only 3D renderers. [Jeff] Windows port: bug: Fix a race condition in NDS_3D_Reset and NDS_glInit [zeromus] bug: Fix the buggy auto frameskip logic which made the emu slow to a crawl. Now it runs fast! [zeromus] bug: Fix resizing, rotate & aspect ration of main window. [CrazyMax,_zeromus] bug: Remove multithreading from user interface after finding several synchronization issues [zeromus] enh: recent roms menu [luigi_] enh: Changed graphics render core to DirectDraw (work faster) [CrazyMax] enh: Add an arm9 cpu load average calculator similar to no$. but I dont think it works right. [zeromus] enh: Rewrite all debug tools (autoupdate works now) [CrazyMax] enh: Rewrite input core & replace config input dialog [CrazyMax] enh: Add AVI output [zeromus] enh: Add pause toggle and frame advance hotkeys [adelikat] enh: Add frame counter display and hud messages framework [adelikat] enh: Main window remembers position, size, and a few other emu preferences [adelikat] enh: Removed directx sdk dependency for easier building. [zeromus] enh: Savestate doesnt unpause emu if it is already paused [adelikat] 0.7.3 -> 0.8 Cocoa: - Save State As function now works. [Jeff B] - Recent Items menu now works. [Jeff B] - Opening NDS files from Finder now works. [Jeff B] - Added screenshot feature. [Jeff B] - Added preferences. [Jeff B] - Many more strings are translatable now. [Jeff B] - Default screen color is black (better represents being "off" and easier on eyes at night). [Jeff B] - Added sound. [Jeff B] - Now is a universal binary. [Jeff B] - Leopard resolution icon added. [Jeff B] - Added a Japanese translation. [Jeff B] - Added an optional status bar (resize handle no longer overlaps screen). [Jeff B] - New ROM Info and About DeSmuME windows have been added. [Jeff B] - Fixed several bugs in window resizing. [Jeff B] - Added FAT image support for homebrew games (thanks to TypeError). [Jeff B] - Key config can be changed on the command line. Save/load hotkeys changed (so expose doesn't override). [Jeff B] - Key bindings may work better on non-US keyboards now (needs testing). [Jeff B] general: - Encapsulate GDB debug stub to avoid certain problems [shash] - Fixed CPU LD*/ST* bugs [shash] - Fixed New SMB mini-games freeze [shash] - Fixed possible segfault in ROMReader on ia64 and amd64. [evilynux] - Fixed a crash bug with 2D background corrupting memory [shash] - Flag check optimization [carlo_bramini] - Applied some endian fixes in GPU (thanks to Phazz) [Jeff B] gtk-glade: - Added DeSmuME version in about dialog. [evilynux] - Updated website url in about dialog. [evilynux] - Added Brazilian Portuguese translation by Dreampeppers99. [evilynux] - Better desktop menu entry following FreeDesktop specifications. [evilynux] gtk: - Updated website url in about dialog. [evilynux] - Better desktop menu entry following FreeDesktop specifications. [evilynux] windows port: - Added an "about" box [shash] - DirectInput control interface with joystick support [CrazyMax] - Matrix and Light viewer [Acid Burn] 0.7.2 -> 0.7.3 gtk-glade: - Full localization using intltool/gettext. [evilynux] general: - Added a README.TRANSLATION documenting the localization process. [evilynux] MacOS X: - Initial version of the Mac interface added. [Jeff B] 0.7.1 -> 0.7.2 spu: - big endian fixes. [cyberwarriorx] gpu: - big endian fixes. [marcus_c] gtk-glade: - opengl improvements. [masscat] general: - Added support for setting NDS firmware language value. [masscat] - Function added for setting firmware language. [masscat] - Mac/msys compilation fixes. [cyberwarriorx] - Fix compilation when pkg-config macros are not available [evilynux] 0.7.0 -> 0.7.1 general: - Added GDB debugger stub [masscat] - Added new/different GBAMP CFlash image reader/writer [masscat] gpu: - Major speedup to the 2D core [shash] gtk-glade: - Added command line options. [masscat] - Added FPS limiter [masscat] cli: - Added command line options. [masscat] - Added FPS limiter [masscat] - Added option to use OpenGl to render window (allows resizing). [masscat] windows port: - Added command line options. [masscat] - Added multiple language support [cyberwarriorx] - Added Danish language translation [thomas-2007] 0.6.0 -> 0.7.0 general: - Added support for *.duc files [cyberwarriorx] gpu: - Added support for sprite rotation/scaling [shash] - Added support for the 3D core (openGL and null plugins) [shash] windows port: - A bunch of fixes [Dmitry Krutskih] - Fixed a bug in sound that was causing it to still not work for some people [cyberwarriorx] gtk: - Added 3D emulation - Added command line options. - Added option to use OpenGL to render window (allows resizing). gtk-glade: - Added 3D emulation 0.5.0 -> 0.6.0 general: - Added zipped (based on zziplib) and gzipped (based on zlib) rom support. arm: - Added relocation interrupt vector. - Added region access right checks. - Enabled LDC/STC instructions. - Fixed powersave (cp15) IRQ wait. - Fixed MOV instructions gpu: - Added special color effects. - Added windowing feature. - Fixed transparent direct color backgrounds. - Fixed disabled sprites showing. - Fixed 8/32 bit access to gpu registers. - Fixed missing backgrounds - Support for master brightness wifi: - Added RF chip interface. - Added BB chip interface. windows port: - Fixed address calculation in disassembler. - Added Force Maintain Ratio option for window stretching linux port (cli, gtk and gtk-glade): all: - Added joystick support. - Fixed X and Y buttons. gtk-glade: - Added joystick configuration. - Improved I/O registers viewer tool. - Added save and load states support. 0.3.3 -> 0.5.0 arm: - Fixed MSR with immediate value opcode. - Fixed LSR_0 thumb opcode (C flag is correctly set now). - Fixed LDR*/STR* opcodes. - Fixed unaligned memory access on THUMB Core. - Added relocating SWI routines. bios: - Added decompression functions. - Added GetPitchTable function. - Added GetVolumeTable function. - Added GetCRC16 function. - Added experimental SoundBias function. - Added GetSineTable function. cart: - Added CompactFlash/FAT emulation. - Added Get ROM chip ID Cartridge command. gpu: - Added framebuffer emulation. - Fixed a bug in GPU (xfin could be greater than LG causing a segfault). - Added support for Display Mode 0(Display Off). - Added the basic framework for Display Mode 3(Display from Main RAM). spu: - Added sound emulation. - Added sound core system. - Added WAV write core. - Added dummy core. - Added Direct Sound core. linux port: - Added GTK+ GUI. - Added command line interface. - Added stylus and arm9 keypad support in CLI version. - Added FPS display. - Added basic frameskip. windows port: - Fixed a bug when displaying a ROM's information. - Added key configuration. - Removed the debug key. - Added new experimental auto frameskip/frame limit code. - Added sound settings dialog. - Added a few menu options for accessing the website, forums, and for submitting bugs. general: - Rewrote code in C. - Fixed warnings. - Used defines and typedef's to make things more portable and easier to read. - Added autotools stuff. - Changes to logging system. - Added screenshot function. - Translated most french to english. - Added savestate support. - Added firmware reading support(needs work). - Added Backup Memory support with autodetection. - Fixed some endianess issues. - Fixed things so Visual C++ can compile code. - Added bsd support. - Reworked ROM loading so you can load a different rom without any problems. - Finished NDS_Reset. Now the emulation can be reset even while running. desmume-0.9.9/missing0000755000175000017500000002415212140304537015324 0ustar guillaumeguillaume#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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 for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: desmume-0.9.9/wxwin.m40000644000175000017500000003022112140261635015336 0ustar guillaumeguillaumednl --------------------------------------------------------------------------- dnl Macros for wxWidgets detection. Typically used in configure.in as: dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl AM_OPTIONS_WXCONFIG dnl ... dnl ... dnl AM_PATH_WXCONFIG(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.3.4 or above. dnl ]) dnl fi dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LIBS="$LIBS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl AM_OPTIONS_WXCONFIG dnl dnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and dnl --wx-config command line options dnl --------------------------------------------------------------------------- AC_DEFUN([AM_OPTIONS_WXCONFIG], [ AC_ARG_WITH(wxdir, [ --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH], [ wx_config_name="$withval/wx-config" wx_config_args="--inplace"]) AC_ARG_WITH(wx-config, [ --with-wx-config=CONFIG wx-config script to use (optional)], wx_config_name="$withval" ) AC_ARG_WITH(wx-prefix, [ --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)], wx_config_prefix="$withval", wx_config_prefix="") AC_ARG_WITH(wx-exec-prefix, [ --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional)], wx_config_exec_prefix="$withval", wx_config_exec_prefix="") ]) dnl Helper macro for checking if wx version is at least $1.$2.$3, set's dnl wx_ver_ok=yes if it is: AC_DEFUN([_WX_PRIVATE_CHECK_VERSION], [ wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $1; then wx_ver_ok=yes else if test $wx_config_major_version -eq $1; then if test $wx_config_minor_version -gt $2; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $2; then if test $wx_config_micro_version -ge $3; then wx_ver_ok=yes fi fi fi fi fi fi ]) dnl --------------------------------------------------------------------------- dnl AM_PATH_WXCONFIG(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND dnl [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]]) dnl dnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC dnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME dnl environment variable to override the default name of the wx-config script dnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this dnl case the macro won't even waste time on tests for its existence. dnl dnl Optional WX-LIBS argument contains comma- or space-separated list of dnl wxWidgets libraries to link against (it may include contrib libraries). If dnl it is not specified then WX_LIBS and WX_LIBS_STATIC will contain flags to dnl link with all of the core wxWidgets libraries. dnl dnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config dnl invocation command in present. It can be used to fine-tune lookup of dnl best wxWidgets build available. dnl dnl Example use: dnl AM_PATH_WXCONFIG([2.6.0], [wxWin=1], [wxWin=0], [html,core,net] dnl [--unicode --debug]) dnl --------------------------------------------------------------------------- dnl dnl Get the cflags and libraries from the wx-config script dnl AC_DEFUN([AM_PATH_WXCONFIG], [ dnl do we have wx-config name: it can be wx-config or wxd-config or ... if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi dnl deal with optional prefixes if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi dnl don't search the PATH if WX_CONFIG_NAME is absolute filename if test -x "$WX_CONFIG_NAME" ; then AC_MSG_CHECKING(for wx-config) WX_CONFIG_PATH="$WX_CONFIG_NAME" AC_MSG_RESULT($WX_CONFIG_PATH) else AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, "$WX_LOOKUP_PATH:$PATH") fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=ifelse([$1], ,2.2.1,$1) if test -z "$5" ; then AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version]) else AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)]) fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $5 $4" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version], [$wx_requested_minor_version], [$wx_requested_micro_version]) if test -n "$wx_ver_ok"; then AC_MSG_RESULT(yes (version $WX_VERSION)) WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` dnl is this even still appropriate? --static is a real option now dnl and WX_CONFIG_WITH_ARGS is likely to contain it if that is dnl what the user actually wants, making this redundant at best. dnl For now keep it in case anyone actually used it in the past. AC_MSG_CHECKING([for wxWidgets static library]) WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi dnl starting with version 2.2.6 wx-config has --cppflags argument wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi dnl starting with version 2.7.0 wx-config has --rescomp option wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then dnl cannot give any useful info for resource compiler WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then dnl no choice but to define all flags like CFLAGS WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else dnl we have CPPFLAGS included in CFLAGS included in CXXFLAGS WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi ifelse([$2], , :, [$2]) else if test "x$WX_VERSION" = x; then dnl no wx-config at all AC_MSG_RESULT(no) else AC_MSG_RESULT(no (version $WX_VERSION is not new enough)) fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi AC_SUBST(WX_CPPFLAGS) AC_SUBST(WX_CFLAGS) AC_SUBST(WX_CXXFLAGS) AC_SUBST(WX_CFLAGS_ONLY) AC_SUBST(WX_CXXFLAGS_ONLY) AC_SUBST(WX_LIBS) AC_SUBST(WX_LIBS_STATIC) AC_SUBST(WX_VERSION) AC_SUBST(WX_RESCOMP) ]) dnl --------------------------------------------------------------------------- dnl Get information on the wxrc program for making C++, Python and xrs dnl resource files. dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl AM_OPTIONS_WXCONFIG dnl ... dnl AM_PATH_WXCONFIG(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.6.0 or above. dnl ]) dnl fi dnl dnl AM_PATH_WXRC([HAVE_WXRC=1], [HAVE_WXRC=0]) dnl if test "x$HAVE_WXRC" != x1; then dnl AC_MSG_ERROR([ dnl The wxrc program was not installed or not found. dnl dnl Please check the wxWidgets installation. dnl ]) dnl fi dnl dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LDFLAGS="$LDFLAGS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl AM_PATH_WXRC([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS dnl resources. The variable WXRC will be set and substituted in the configure dnl script and Makefiles. dnl dnl Example use: dnl AM_PATH_WXRC([wxrc=1], [wxrc=0]) dnl --------------------------------------------------------------------------- dnl dnl wxrc program from the wx-config script dnl AC_DEFUN([AM_PATH_WXRC], [ AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler]) if test "x$WX_CONFIG_NAME" = x; then AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.]) else AC_MSG_CHECKING([for wxrc]) if test "x$WXRC" = x ; then dnl wx-config --utility is a new addition to wxWidgets: _WX_PRIVATE_CHECK_VERSION(2,5,3) if test -n "$wx_ver_ok"; then WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc` fi fi if test "x$WXRC" = x ; then AC_MSG_RESULT([not found]) ifelse([$2], , :, [$2]) else AC_MSG_RESULT([$WXRC]) ifelse([$1], , :, [$1]) fi AC_SUBST(WXRC) fi ]) desmume-0.9.9/config.guess0000755000175000017500000012743212140304537016252 0ustar guillaumeguillaume#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file 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 for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: desmume-0.9.9/po/0000755000175000017500000000000012140305317014334 5ustar guillaumeguillaumedesmume-0.9.9/po/zh_TW.po0000644000175000017500000003744512140261635015750 0ustar guillaumeguillaumemsgid "" msgstr "" "Project-Id-Version: desmume\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-28 15:37+0100\n" "PO-Revision-Date: \n" "Last-Translator: Ronmi Ren \n" "Language-Team: DeSmuME Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: TAIWAN\n" "X-Poedit-SourceCharset: iso-8859-1\n" #: ../src/gtk-glade/callbacks.cpp:53 #, c-format msgid "State %d (empty)" msgstr "存檔 %d (空的)" #. Creating the selection window #: ../src/gtk-glade/callbacks.cpp:166 msgid "Open..." msgstr "開啟..." #: ../src/gtk-glade/callbacks.cpp:175 msgid "Nds binary (.nds)" msgstr "NDS遊戲 (.nds)" #: ../src/gtk-glade/callbacks.cpp:176 msgid "Nds binary with loader (.ds.gba)" msgstr "NDS遊戲與載入器 (.ds.gba)" #: ../src/gtk-glade/callbacks.cpp:177 msgid "All files" msgstr "所有檔案" #: ../src/gtk-glade/callbacks.cpp:192 #: ../src/gtk-glade/main.cpp:553 #, c-format msgid "" "Unable to load :\n" "%s" msgstr "" "載入失敗:\n" "%s" #: ../src/gtk-glade/callbacks.cpp:408 msgid "You don't have any joystick!" msgstr "沒有偵測到搖桿" #: ../src/gtk-glade/callbacks.cpp:410 msgid "Can't configure joystick while the game is running!" msgstr "在遊戲執行時不可以調整搖桿設定" #: ../src/gtk-glade/gdk_3Demu.cpp:66 #, c-format msgid "*** Cannot get %s attribute value\n" msgstr "*** 無法取得屬性 %s 的值\n" #: ../src/gtk-glade/gdk_3Demu.cpp:164 #, c-format msgid "*** Failed to create pixmap.\n" msgstr "*** 創造點陣圖失敗\n" #: ../src/gtk-glade/gdk_3Demu.cpp:174 #, c-format msgid "*** No appropriate OpenGL-capable visual found.\n" msgstr "*** 找不到與 OpenGL 相容的可用視覺效果\n" #: ../src/gtk-glade/gdk_3Demu.cpp:187 #, c-format msgid "Failed to create the GdkGLPixmap\n" msgstr "創造 GdkGLPixmap 失敗\n" #: ../src/gtk-glade/gdk_3Demu.cpp:197 #, c-format msgid "Connot create the OpenGL rendering context\n" msgstr "創造 OpenGL rendering context 失敗\n" #: ../src/gtk-glade/glade-xml.cpp:58 #, c-format msgid "could not find signal handler '%s'." msgstr "找不到 signal handler '%s'" #: ../src/gtk-glade/main.cpp:132 #, c-format msgid "USAGE: %s [OPTIONS] [nds-file]\n" msgstr "使用方式: %s [選項] [nds檔]\n" #: ../src/gtk-glade/main.cpp:133 #, c-format msgid "OPTIONS:\n" msgstr "可用選項:\n" #: ../src/gtk-glade/main.cpp:134 #, c-format msgid "" " --load-slot=NUM Load game saved under NUM position.\n" "\n" msgstr "" " --load-slot=存檔編號 讀取第幾號的即時存檔\n" "\n" #: ../src/gtk-glade/main.cpp:137 #, c-format msgid "" " --soft-convert Use software colour conversion during OpenGL\n" " screen rendering. May produce better or worse\n" " frame rates depending on hardware.\n" "\n" msgstr "" " --soft-convert 在 OpenGL 模式中使用軟體轉換色彩。\n" " 在不同的硬體下,效能可能更好也可能更壞。\n" " \n" #: ../src/gtk-glade/main.cpp:142 #, c-format msgid "" " --3d-engine=ENGINE Selects 3D rendering engine\n" " 0 = disabled\n" " 1 = internal desmume rasterizer (default)\n" msgstr "" " --3d-engine=3D引擎 選擇3D引擎\n" " 0 = 不使用3D\n" " 1 = desmume內建的軟體模擬引擎 (預設值)\n" #: ../src/gtk-glade/main.cpp:147 #, c-format msgid "" " 2 = gtkglext off-screen 3d opengl\n" "\n" msgstr "" " 2 = gtkglext 於幕後演算的 OpenGL 3D 支援\n" "\n" #: ../src/gtk-glade/main.cpp:150 #, c-format msgid "" " --disable-limiter Disables the 60 fps limiter\n" "\n" msgstr "" " --disable-limiter 取消畫面更新率最高60的上限\n" "\n" #: ../src/gtk-glade/main.cpp:152 #, c-format msgid "" " --save-type=TYPE Selects savetype:\n" " 0 = Autodetect (default)\n" " 1 = EEPROM 4kbit\n" " 2 = EEPROM 64kbit\n" " 3 = EEPROM 512kbit\n" " 4 = FRAM 256kbit\n" " 5 = FLASH 2mbit\n" " 6 = FLASH 4mbit\n" " \n" msgstr "" " --save-type=類型 選擇記憶卡類型:\n" " 0 = 自動選擇 (default)\n" " 1 = EEPROM 4kbit\n" " 2 = EEPROM 64kbit\n" " 3 = EEPROM 512kbit\n" " 4 = FRAM 256kbit\n" " 5 = FLASH 2mbit\n" " 6 = FLASH 4mbit\n" " \n" #: ../src/gtk-glade/main.cpp:162 #, c-format msgid "" " --fwlang=LANG Set the language in the firmware, LANG as follows:\n" " 0 = Japanese\n" " 1 = English\n" " 2 = French\n" " 3 = German\n" " 4 = Italian\n" " 5 = Spanish\n" "\n" msgstr "" " --fwlang=LANG 設定韌體的語言, 可用的 LANG 設定有:\n" " 0 = 日文\n" " 1 = 英文\n" " 2 = 法文\n" " 3 = 德文\n" " 4 = 義大利文\n" " 5 = 西班牙文\n" "\n" #: ../src/gtk-glade/main.cpp:171 #, c-format msgid "" " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n" " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n" "\n" msgstr "" #: ../src/gtk-glade/main.cpp:175 #, c-format msgid " --help Display this message\n" msgstr " --help 顯示這份幫助訊息\n" #: ../src/gtk-glade/main.cpp:188 #, c-format msgid "I only know how to load from slots 1-10.\n" msgstr "即時存檔的編號只能介於 1 到 10 之間\n" #: ../src/gtk-glade/main.cpp:212 #, c-format msgid "Supported 3d engines: 0, 1, and on some machines 2; use --help option for details\n" msgstr "可用的3D引擎有: 0, 1, 在某些機器上可能可以用2; 你可以用 --help 選項查看詳細說明\n" #: ../src/gtk-glade/main.cpp:224 #, c-format msgid "select savetype from 0 to 6; use --help option for details\n" msgstr "記憶卡的類型只能介於 0 到 6之間; 你可以用 --help 選項查看詳細說明\n" #: ../src/gtk-glade/main.cpp:236 #, c-format msgid "Firmware language must be set to a value from 0 to 5.\n" msgstr "韌體語言必須設定 0 到 5 之間的值\n" #: ../src/gtk-glade/main.cpp:249 #, c-format msgid "ARM9 GDB stub port must be in the range 1 to 65535\n" msgstr "" #: ../src/gtk-glade/main.cpp:261 #, c-format msgid "ARM7 GDB stub port must be in the range 1 to 65535\n" msgstr "" #: ../src/gtk-glade/main.cpp:274 #, c-format msgid "NDS file (\"%s\") already set\n" msgstr "NDS檔 (\"%s\") 已經設定\n" #: ../src/gtk-glade/main.cpp:287 #, c-format msgid "USAGE: %s [options] [nds-file]\n" msgstr "使用方式: %s [選項] [nds檔]\n" #: ../src/gtk-glade/main.cpp:288 #, c-format msgid "USAGE: %s --help - for help\n" msgstr "使用方式: %s --help - 顯示幫助訊息\n" #: ../src/gtk-glade/main.cpp:466 #, c-format msgid "Failed to create ARM9 gdbstub on port %d\n" msgstr "" #: ../src/gtk-glade/main.cpp:477 #, c-format msgid "Failed to create ARM7 gdbstub on port %d\n" msgstr "" #: ../src/gtk-glade/main.cpp:486 #, c-format msgid "Error trying to initialize SDL: %s\n" msgstr "SDL 初始化錯誤: %s\n" #: ../src/gtk-glade/main.cpp:569 #, c-format msgid "Failed to initialise openGL 3D emulation; removing 3D support\n" msgstr "無法初始化 OpenGL 3D 模擬。取消 3D 支援\n" #: ../src/gtk-glade/main.cpp:576 #, c-format msgid "Failed to setup 3D engine; removing 3D support\n" msgstr "無法設定 OpenGL 3D 模擬; 取消 3D 支援\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "原始大小" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2倍" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "偵測到 3D 操作" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3倍" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "開啟音效" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "方向軸 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "設定" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "Debug : " msgstr "除錯 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Down : " msgstr "下 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "FrameSkip" msgstr "畫面跳過" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "IO regs" msgstr "IO 暫存器" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "Joystick Config" msgstr "搖桿設定" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick controls" msgstr "搖桿控制" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Key definition" msgstr "按鍵定義" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Keyboard Config" msgstr "鍵盤設定" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboard controls" msgstr "鍵盤控制" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "L : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "Layers" msgstr "圖層" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Left : " msgstr "左 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Load State" msgstr "讀取即時存檔" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "No Gap" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "物件" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "請按一個按鈕..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "請按一個按鍵..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "重新啟動" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "右 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "視窗水平排列" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "螢幕旋轉 0 度" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "螢幕旋轉 180 度" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "螢幕旋轉 270 度" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "螢幕旋轉 90 度" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "即時存檔" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "大小" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "存檔 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "存檔 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "存檔 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "存檔 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "存檔 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "存檔 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "存檔 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "存檔 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "存檔 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "存檔 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TYPE: 自動選擇 (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "TYPE: FRAM (4MB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "Tools" msgstr "工具" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "True Gap" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "Up : " msgstr "上 :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Memory" msgstr "檢視記憶體" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Palette" msgstr "檢視調色盤" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "View Tiles" msgstr "檢視物件" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "X : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "Y : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_Emulation" msgstr "模擬器 (_E)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_File" msgstr "檔案 (_F)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_PrintScreen" msgstr "截圖 (_P)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "_Saves" msgstr "存檔 (_S)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:87 msgid "http://desmume.org" msgstr "" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:89 msgid "translator-credits" msgstr "Ronmi Ren " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr "調色盤:" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "16 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16c" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "256c" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "32 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "8 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10 msgid "BMP" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "Go!" msgstr "執行" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "" "cpu : ARM9\n" "cpu : ARM7" msgstr "" #~ msgid "Error trying to start FPS limiter timer: %s\n" #~ msgstr "無法啟始 fps 限制的計時器: %s\n" desmume-0.9.9/po/pt_BR.po0000644000175000017500000003453612140261635015721 0ustar guillaumeguillaume# BRAZILIAN PORTUGUESE TRANSLATION # Copyright (C) 2007 # This file is distributed under the same license as the PACKAGE package. # Dreampeppers99 , 2007. # msgid "" msgstr "" "Project-Id-Version: Desmume 0.9.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-11 01:38-0400\n" "PO-Revision-Date: 2009-10-18 13:01-0300\n" "Last-Translator: Felipe \n" "Language-Team: Felipe\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Portuguese\n" "X-Poedit-Country: BRAZIL\n" "X-Poedit-SourceCharset: utf-8\n" #. Creating the selection window #: ../src/gtk-glade/callbacks.c:91 msgid "Open..." msgstr "Abrir..." #: ../src/gtk-glade/callbacks.c:100 msgid "Nds binary (.nds)" msgstr "Binário nds (.nds)" #: ../src/gtk-glade/callbacks.c:101 msgid "Nds binary with loader (.ds.gba)" msgstr "Binário nds com o loader (.ds.gba)" #: ../src/gtk-glade/callbacks.c:102 msgid "All files" msgstr "Todos os arquivos" #: ../src/gtk-glade/callbacks.c:117 #: ../src/gtk-glade/main.c:532 #, c-format msgid "" "Unable to load :\n" "%s" msgstr "" "Incapaz de carregar :\n" "%s" #: ../src/gtk-glade/callbacks.c:291 msgid "You don't have any joystick!" msgstr "Você não tem nenhum joystick!" #: ../src/gtk-glade/callbacks.c:293 msgid "Can't configure joystick while the game is running!" msgstr "Não pode configurar o joystick enquanto o jogo está rodando!" #: ../src/gtk-glade/gdk_3Demu.c:64 #, c-format msgid "*** Cannot get %s attribute value\n" msgstr "*** Não consegue obter o valor do atributo %s\n" #: ../src/gtk-glade/gdk_3Demu.c:158 msgid "*** Failed to create pixmap.\n" msgstr "*** Falhou em criar o pixmap.\n" #: ../src/gtk-glade/gdk_3Demu.c:168 msgid "*** No appropriate OpenGL-capable visual found.\n" msgstr "*** Nenhum visual -capaz do OpenGL encontrado.\n" #: ../src/gtk-glade/gdk_3Demu.c:181 msgid "Failed to create the GdkGLPixmap\n" msgstr "Falhou em criar o GdkGLPixmap\n" #: ../src/gtk-glade/gdk_3Demu.c:191 msgid "Cannot create the OpenGL rendering context\n" msgstr "Não pôde criar o contexto de renderização do OpenGL\n" #: ../src/gtk-glade/glade-xml.c:113 #, c-format msgid "could not find signal handler '%s'." msgstr "não pôde achar o manejador do sinal '%s'." #: ../src/gtk-glade/main.c:106 #, c-format msgid "USAGE: %s [OPTIONS] [nds-file]\n" msgstr "USO: %s [OPÇÕES] [arquivo-nds]\n" #: ../src/gtk-glade/main.c:107 msgid "OPTIONS:\n" msgstr "OPÇÕES:\n" #: ../src/gtk-glade/main.c:109 msgid "" " --soft-convert Use software colour conversion during OpenGL\n" " screen rendering. May produce better or worse\n" " frame rates depending on hardware.\n" " \n" " --disable-3d Disables the 3D emulation\n" "\n" msgstr "" " --soft-convert Usa conversão de cor via software durante a\n" " renderização da tela em OpenGl. Pode produzir melhores ou piores\n" " taxas de frames dependendo do hardware.\n" " \n" " --disable-3d Desativa a emulação 3D\n" "\n" #: ../src/gtk-glade/main.c:116 msgid "" " --disable-limiter Disables the 60 fps limiter\n" " \n" " --fwlang=LANG Set the language in the firmware, LANG as follows:\n" " 0 = Japanese\n" " 1 = English\n" " 2 = French\n" " 3 = German\n" " 4 = Italian\n" " 5 = Spanish\n" "\n" " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n" " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n" " \n" " --help Display this message\n" msgstr "" " --disable-limiter Desativa o limitador de 60 fps\n" " \n" " --fwlang=LANG Defina o idioma no firmware, LANG como segue:\n" " 0 = Japonês\n" " 1 = Inglês\n" " 2 = Francês\n" " 3 = Alemão\n" " 4 = Italiano\n" " 5 = Espanhol\n" "\n" " --arm9gdb=PORT_NUM Ativa o stub ARM9 GDB na porta dada\n" " --arm7gdb=PORT_NUM Ativa o stub ARM7 GDB na porta dada\n" " \n" " --help Exibir esta mensagem\n" #: ../src/gtk-glade/main.c:149 msgid "Firmware language must be set to a value from 0 to 5.\n" msgstr "O idioma do firmware deve ser definido em um valor de 0 a 5.\n" #: ../src/gtk-glade/main.c:161 msgid "ARM9 GDB stub port must be in the range 1 to 65535\n" msgstr "A porta stub ARM9 GDB deve estar no alcance de 1 a 65535\n" #: ../src/gtk-glade/main.c:173 msgid "ARM7 GDB stub port must be in the range 1 to 65535\n" msgstr "A porta stub ARM7 GDB deve estar no alcance de 1 a 65535\n" #: ../src/gtk-glade/main.c:185 #, c-format msgid "NDS file (\"%s\") already set\n" msgstr "Arquivo NDS (\"%s\") já definido\n" #: ../src/gtk-glade/main.c:198 #, c-format msgid "USAGE: %s [options] [nds-file]\n" msgstr "USO: %s [opções] [arquivo-nds]\n" #: ../src/gtk-glade/main.c:199 #, c-format msgid "USAGE: %s --help - for help\n" msgstr "USO: %s --help - para ajuda\n" #: ../src/gtk-glade/main.c:332 #, c-format msgid "State %d (empty)" msgstr "Estado %d (vazio)" #: ../src/gtk-glade/main.c:459 #, c-format msgid "Failed to create ARM9 gdbstub on port %d\n" msgstr "Falhou em criar o gdbstub ARM9 na porta %d\n" #: ../src/gtk-glade/main.c:470 #, c-format msgid "Failed to create ARM7 gdbstub on port %d\n" msgstr "Falhou em criar o gdbstub ARM7 na porta %d\n" #: ../src/gtk-glade/main.c:479 #, c-format msgid "Error trying to initialize SDL: %s\n" msgstr "Erro ao tentar inicializar o SDL: %s\n" #: ../src/gtk-glade/main.c:551 #, c-format msgid "Failed to initialise openGL 3D emulation; removing 3D support\n" msgstr "Falhou em inicializar a emulação 3D no openGL; removendo o suporte 3D\n" #: ../src/gtk-glade/main.c:557 #, c-format msgid "Failed to setup openGL 3D emulation; removing 3D support\n" msgstr "Falhou em configurar a emulação 3D no openGL; removendo o suporte 3D\n" #: ../src/gtk-glade/main.c:584 #, c-format msgid "Error trying to start FPS limiter timer: %s\n" msgstr "Erro ao tentar iniciar o timer limitador de FPS: %s\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "1x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "Operação 3D detectada" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "Rom 3D" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "?" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "A : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "Áudio Ligado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "Eixos : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "B : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "BG0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "BG1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "BG2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "BG3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "Aumentar : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "Configurar" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "DeSmuME" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "DeSmuMe" msgstr "DeSmuMe" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Debug : " msgstr "Debug : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "Down : " msgstr "Baixo : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "FrameSkip" msgstr "FrameSkip" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "IO regs" msgstr "IO regs" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick Config" msgstr "Configurar Joystick" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Joystick controls" msgstr "Controles do joystick" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Key definition" msgstr "Definição das teclas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboard Config" msgstr "Configurar o Teclado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "Keyboard controls" msgstr "Controles do teclado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "L : " msgstr "L : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Layers" msgstr "Camadas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Left : " msgstr "Esquerda : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Load State" msgstr "Carregar State" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Emulador de Nintendo DS baseado no trabalho do Yopyop" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "OBJ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Pressione um botão..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Pressione uma tecla..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "R : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "Resetar" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Direita : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "Tela Direita" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Rotacionar a Tela 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Rotacionar a Tela 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Rotacionar a Tela 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Rotacionar a Tela 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Save State" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "Selecione : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Tamanho" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "Iniciar : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "Estado 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "Estado 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "Estado 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "Estado 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "Estado 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "Estado 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "Estado 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "Estado 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "Estado 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "Estado 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TIPO: Auto (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4kB)" msgstr "TIPO: EEPROM1 (4kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512kB)" msgstr "TIPO: EEPROM2 (512kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64kB)" msgstr "TIPO: EEPROM2 (64kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256kB)" msgstr "TIPO: FLASH (256kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "TIPO: FRAM (2MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "Tools" msgstr "Ferramentas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "True Gap" msgstr "Lacuna Real" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "Up : " msgstr "Cima : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "View Memory" msgstr "Visualizar a Memória" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Palette" msgstr "Visualizar a Paleta" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Tiles" msgstr "Visualizar os Tiles" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "X : " msgstr "X :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "Y : " msgstr "Y :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "_Emulation" msgstr "_Emulação" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_File" msgstr "_Arquivo" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_PrintScreen" msgstr "_PrintScreen" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_Saves" msgstr "_Saves" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "http://desmume.sf.net" msgstr "http://desmume.sf.net" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:88 msgid "translator-credits" msgstr "Dreampeppers99\nFelipe" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr " IrPara: " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr " Paleta : " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "16 bit" msgstr "16 bits" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16c" msgstr "16c" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "256c" msgstr "256c" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "32 bit" msgstr "32 bits" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "8 bit" msgstr "8 bits" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" "cpu ARM9\n" "cpu ARM7" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10 msgid "BMP" msgstr "BMP" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "Go!" msgstr "Ir!" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "" "cpu : ARM9\n" "cpu : ARM7" msgstr "" "cpu : ARM9\n" "cpu : ARM7" desmume-0.9.9/po/es.po0000644000175000017500000004145312140261635015316 0ustar guillaumeguillaume# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-04-07 14:37+0000\n" "PO-Revision-Date: 2012-09-13 01:16-0000\n" "Last-Translator: Tim Roden \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/gtk-glade/callbacks.cpp:53 #, c-format msgid "State %d (empty)" msgstr "Estado %d (vacío)" #. Creating the selection window #: ../src/gtk-glade/callbacks.cpp:166 msgid "Open..." msgstr "Abre..." #: ../src/gtk-glade/callbacks.cpp:175 msgid "Nds binary (.nds)" msgstr "Binario Nds (.nds)" #: ../src/gtk-glade/callbacks.cpp:176 msgid "Nds binary with loader (.ds.gba)" msgstr "Binario Nds con cargador (.ds.gba)" #: ../src/gtk-glade/callbacks.cpp:177 msgid "All files" msgstr "Todos los archivos" #: ../src/gtk-glade/callbacks.cpp:192 #: ../src/gtk-glade/main.cpp:488 #, c-format msgid "" "Unable to load :\n" "%s" msgstr "" "No pudo cargar :\n" "%s" #: ../src/gtk-glade/callbacks.cpp:408 msgid "You don't have any joystick!" msgstr "¡No tienes ningún palanca de juego!" #: ../src/gtk-glade/callbacks.cpp:410 msgid "Can't configure joystick while the game is running!" msgstr "¡No se puede configurar palanca de juego mientras está funcionando el juego!" #: ../src/gtk-glade/gdk_3Demu.cpp:66 #, c-format msgid "*** Cannot get %s attribute value\n" msgstr "*** No puede sacar valor atributo %s\n" #: ../src/gtk-glade/gdk_3Demu.cpp:164 #, c-format msgid "*** Failed to create pixmap.\n" msgstr "*** Falló en crear el pixmap.\n" #: ../src/gtk-glade/gdk_3Demu.cpp:174 #, c-format msgid "*** No appropriate OpenGL-capable visual found.\n" msgstr "*** Visual OpenGL-capaz apropiado no encontrado.\n" #: ../src/gtk-glade/gdk_3Demu.cpp:187 #, c-format msgid "Failed to create the GdkGLPixmap\n" msgstr "Falló a crear el GdkGLPixmap\n" #: ../src/gtk-glade/gdk_3Demu.cpp:197 #, c-format msgid "Connot create the OpenGL rendering context\n" msgstr "No puede crear el contexto de sintesis de imágenes OpenGL\n" #: ../src/gtk-glade/glade-xml.cpp:58 #, c-format msgid "could not find signal handler '%s'." msgstr "no pudo encontrar manipulador de señal '%s'." #: ../src/gtk-glade/main.cpp:133 #, c-format msgid "USAGE: %s [OPTIONS] [nds-file]\n" msgstr "SE USA: %s [OPCIONES] [archivo-nds]\n" #: ../src/gtk-glade/main.cpp:134 #, c-format msgid "OPTIONS:\n" msgstr "OPCIONES:\n" #: ../src/gtk-glade/main.cpp:135 #, c-format msgid "" " --load-slot=NUM Load game saved under NUM position.\n" "\n" msgstr "" " --load-slot=NÚM Carga el juego guardado en posición NÚM.\n" "\n" #: ../src/gtk-glade/main.cpp:138 #, c-format msgid "" " --soft-convert Use software colour conversion during OpenGL\n" " screen rendering. May produce better or worse\n" " frame rates depending on hardware.\n" "\n" msgstr "" " --soft-convert Usa conversión color software durante sintesis\n" " de imágenes en pantalla OpenGL. Puede producir\n" " mejor o peor velocidades de fotograma\n" " dependiendo en hardware.\n" "\n" #: ../src/gtk-glade/main.cpp:143 #, c-format msgid "" " --3d-engine=ENGINE Selects 3D rendering engine\n" " 0 = disabled\n" " 1 = internal desmume rasterizer (default)\n" msgstr "" " --3d-engine=MOTOR Selecciona motor de sintesis de imágenes 3D\n" " 0 = inutilizado\n" " 1 = rasterizador desmume internal (opción por defecto)\n" #: ../src/gtk-glade/main.cpp:148 #, c-format msgid "" " 2 = gtkglext off-screen 3d opengl\n" "\n" msgstr "" " 2 = opengl 3d fuera de pantalla gtkglext\n" "\n" #: ../src/gtk-glade/main.cpp:151 #, c-format msgid "" " --disable-limiter Disables the 60 fps limiter\n" "\n" msgstr "" " --disable-limiter Inutiliza el limitador 60 fps\n" "\n" #: ../src/gtk-glade/main.cpp:153 #, c-format msgid "" " --save-type=TYPE Selects savetype:\n" " 0 = Autodetect (default)\n" " 1 = EEPROM 4kbit\n" " 2 = EEPROM 64kbit\n" " 3 = EEPROM 512kbit\n" " 4 = FRAM 256kbit\n" " 5 = FLASH 2mbit\n" " 6 = FLASH 4mbit\n" " \n" msgstr "" " --save-type=TIPO Selecciona tipo de parada:\n" " 0 = Autodetecta (opción por defecto)\n" " 1 = EEPROM 4kbit\n" " 2 = EEPROM 64kbit\n" " 3 = EEPROM 512kbit\n" " 4 = FRAM 256kbit\n" " 5 = FLASH 2mbit\n" " 6 = FLASH 4mbit\n" " \n" #: ../src/gtk-glade/main.cpp:163 #, c-format msgid "" " --fwlang=LANG Set the language in the firmware, LANG as follows:\n" " 0 = Japanese\n" " 1 = English\n" " 2 = French\n" " 3 = German\n" " 4 = Italian\n" " 5 = Spanish\n" "\n" msgstr "" " --fwlang=LENG Pone el idioma en el microprograma, LENG a continuación:\n" " 0 = japonés\n" " 1 = inglés\n" " 2 = francés\n" " 3 = alemán\n" " 4 = italiano\n" " 5 = español\n" "\n" #: ../src/gtk-glade/main.cpp:172 #, c-format msgid "" " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n" " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n" "\n" msgstr "" " --arm9gdb=NÚM_PTO Admite el fragmento GDB ARM9 en el puerto dado\n" " --arm7gdb=NÚM_PTO Admite el fragmento GDB ARM7 en el puerto dado\n" "\n" #: ../src/gtk-glade/main.cpp:176 #, c-format msgid " --help Display this message\n" msgstr " --help Visualiza este mensaje\n" #: ../src/gtk-glade/main.cpp:189 #, c-format msgid "I only know how to load from slots 1-10.\n" msgstr "Sólo yo sé como cargar desde espacios 1-10.\n" #: ../src/gtk-glade/main.cpp:213 #, c-format msgid "Supported 3d engines: 0, 1, and on some machines 2; use --help option for details\n" msgstr "Motores 3D admitidos: 0, 1 y en algunas máquinas 2; usa la opción --help para detalles\n" #: ../src/gtk-glade/main.cpp:225 #, c-format msgid "select savetype from 0 to 6; use --help option for details\n" msgstr "selecciona tipo de parada desde 0 a 6; usa la opción --help para detalles\n" #: ../src/gtk-glade/main.cpp:237 #, c-format msgid "Firmware language must be set to a value from 0 to 5.\n" msgstr "El idioma de microprograma tiene que ser puesto a un valor entre 0 a 5.\n" #: ../src/gtk-glade/main.cpp:250 #, c-format msgid "ARM9 GDB stub port must be in the range 1 to 65535\n" msgstr "El puerto fragmento de código GDB ARM9 tiene que ser entre el rango de 1 a 65535\n" #: ../src/gtk-glade/main.cpp:262 #, c-format msgid "ARM7 GDB stub port must be in the range 1 to 65535\n" msgstr "El puerto fragmento de código GDB ARM7 tiene que ser entre el rango de 1 a 65535\n" #: ../src/gtk-glade/main.cpp:275 #, c-format msgid "NDS file (\"%s\") already set\n" msgstr "Ya puesto el archivo NDS (\"%s\") \n" #: ../src/gtk-glade/main.cpp:288 #, c-format msgid "USAGE: %s [options] [nds-file]\n" msgstr "SE USA: %s [opciones] [archivo-nds]\n" #: ../src/gtk-glade/main.cpp:289 #, c-format msgid "USAGE: %s --help - for help\n" msgstr "SE USA: %s --help -para ayuda\n" #: ../src/gtk-glade/main.cpp:402 #, c-format msgid "Failed to create ARM9 gdbstub on port %d\n" msgstr "Falló en crear el gdbstub ARM9 en puerto %d\n" #: ../src/gtk-glade/main.cpp:413 #, c-format msgid "Failed to create ARM7 gdbstub on port %d\n" msgstr "Falló en crear el gdbstub ARM7 en puerto %d\n" #: ../src/gtk-glade/main.cpp:422 #, c-format msgid "Error trying to initialize SDL: %s\n" msgstr "Error probando a iniciar SDL: %s\n" #: ../src/gtk-glade/main.cpp:504 #, c-format msgid "Failed to initialise openGL 3D emulation; removing 3D support\n" msgstr "Falló en inicializar la emulación 3D OpenGL; sacando apoyo 3D\n" #: ../src/gtk-glade/main.cpp:511 #, c-format msgid "Failed to setup 3D engine; removing 3D support\n" msgstr "Falló en montar el motor 3D; sacando apoyo 3D\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "1x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "Detectado la operación 3D" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "ROM 3D" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "¿?" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "A :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "Audio encendido" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "Eje :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "B :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "F0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "F1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "F2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "F3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "Aumenta : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "Config" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "DeSmuME" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "Debug : " msgstr "Depura : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Down : " msgstr "Bajo :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "FrameSkip" msgstr "SáltateFotograma" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "IO regs" msgstr "Regs IO" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "Joystick Config" msgstr "Config de palanca de juego" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick controls" msgstr "Controles de palanca de juego" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Key definition" msgstr "Definición de tecla" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Keyboard Config" msgstr "Config de teclado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboard controls" msgstr "Controles de teclado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "L : " msgstr "L :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "Layers" msgstr "Capas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Left : " msgstr "Izquierda :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Load State" msgstr "Carga estado" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Emulador de Nintendo DS basado en trabajo hecho por Yopyop" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "No Gap" msgstr "No espacio" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "OBJ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Presiona un botón..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Presiona una tecla..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "R :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "Reinicia" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Derecha :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "Pantalla derecha" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Rota la pantalla 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Rota la pantalla 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Rota la pantalla 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Rota la pantalla 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Guarda parada" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "Selecciona : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Tamaño" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "Empieza : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "Estado 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "Estado 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "Estado 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "Estado 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "Estado 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "Estado 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "Estado 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "Estado 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "Estado 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "Estado 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TIPO: Auto (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4kB)" msgstr "TIPO: EEPROM1 (4kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512kB)" msgstr "TIPO: EEPROM2 (512kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64kB)" msgstr "TIPO: EEPROM2 (64kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256kB)" msgstr "TIPO: FLASH (256kB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "TIPO: FRAM (2MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "TYPE: FRAM (4MB)" msgstr "TIPO: FRAM (4MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "Tools" msgstr "Herramientas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "True Gap" msgstr "Espacio verdadero" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "Up : " msgstr "Arriba :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Memory" msgstr "Ve memoria" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Palette" msgstr "Ve gama" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "View Tiles" msgstr "Ve losas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "X : " msgstr "X :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "Y : " msgstr "Y :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_Emulation" msgstr "_Emulación" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_File" msgstr "_Archivo" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_PrintScreen" msgstr "_ImprimePantalla" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "_Saves" msgstr "_Paradas" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:87 msgid "http://desmume.org" msgstr "http://desmume.org" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:89 msgid "translator-credits" msgstr "creditos-de-traductor" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr " VeA: " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr " Gama : " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "16 bit" msgstr "16 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16c" msgstr "16c" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "256c" msgstr "256c" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "32 bit" msgstr "32 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "8 bit" msgstr "8 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" "cpu ARM9\n" "cpu ARM7" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10 msgid "BMP" msgstr "BMP" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "Go!" msgstr "¡Ve!" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "" "cpu : ARM9\n" "cpu : ARM7" msgstr "" "cpu : ARM9\n" "cpu : ARM7" desmume-0.9.9/po/POTFILES.skip0000644000175000017500000000040312140261635016452 0ustar guillaumeguillaumesrc/wx/PadSimple/GUI/ConfigDlg.cpp src/wxdlg/wxdlg3dViewer.cpp src/wxdlg/wxcontrolsconfigdialog.cpp src/windows/libelf_libdwarf/libelf/errors.h src/windows/wx/include/wx/msw/ole/oleutils.h src/windows/wx/include/wx/unix/pipe.h src/windows/wx/include/wx/xti.h desmume-0.9.9/po/ChangeLog0000644000175000017500000000000012140261635016100 0ustar guillaumeguillaumedesmume-0.9.9/po/nb.po0000644000175000017500000002177112140261635015307 0ustar guillaumeguillaume# Norwegian translation for desmume. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the desmume package. # Stian Drøbak , 2009. # msgid "" msgstr "" "Project-Id-Version: desmume\n" "Report-Msgid-Bugs-To: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "1x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "3D operasjon oppdaget" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "3D ROM" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "?" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "A : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "Lyd På" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "Akse :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "B : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "BG0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "BG1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "BG2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "BG3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "Boost : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "Konfigurer" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "DeSmuME" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "DeSmuMe" msgstr "DeSmuMe" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Debug : " msgstr "Feilsøk : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "Down : " msgstr "Ned : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "FrameSkip" msgstr "Ramme Hopp" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "IO regs" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick Config" msgstr "Konfigurer Joystick" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Joystick controls" msgstr "Joystick kontroller" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Key definition" msgstr "Tastdefinisjon" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboad Config" msgstr "Tastaturkonfigurasjon" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "Keyboard controls" msgstr "Tastaturkontroller" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "L : " msgstr "V : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Layers" msgstr "Lag" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Left : " msgstr "Venstre : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Load State" msgstr "Last Status" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Nintendo DS-emulator basert på Yopyops arbeid" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Trykk på en knapp..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Trykk på en tast..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "H : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "Restart" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Høyre : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "Høyre Skjerm" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Roter Skjermen 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Roter Skjermen 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Roter Skjermen 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Roter Skjermen 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Lagre State" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "Select : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Størrelse" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "Start : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "Plass 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "Plass 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "Plass 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "Plass 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "Plass 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "Plass 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "Plass 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "Plass 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "Plass 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "Plass 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TYPE: Auto (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4KB)" msgstr "TYPE: EEPROM1 (4KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512KB)" msgstr "TYPE: EEPROM2 (512KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64KB)" msgstr "TYPE: EEPROM2 (64KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256KB)" msgstr "TYPE: FLASH (256KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "TYPE: FRAM (2MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "Tools" msgstr "Verktøy" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "True Gap" msgstr "Virkelig Mellomrom" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "Up : " msgstr "Opp : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "View Memory" msgstr "Vis Minne" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Palette" msgstr "Vis Palett" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Tiles" msgstr "Se Plater" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "X : " msgstr "X : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "Y : " msgstr "Y : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "_Emulation" msgstr "_Emulering" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_File" msgstr "_Fil" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_PrintScreen" msgstr "_Skjermdump" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_Saves" msgstr "_Lagringsplasser" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "http://desmume.sf.net" msgstr "http://desmume.sf.net" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:88 msgid "translator-credits" msgstr "Onizuka89 " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr " GåTil:" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr " Palett : " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "0x00000000" msgstr "0x00000000" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16 bit" msgstr "16 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "16c" msgstr "16 farger" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "256c" msgstr "256 farger" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "32 bit" msgstr "32 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "8 bit" msgstr "8 bit" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:9 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" "ARM9-processor\n" "ARM7-processor" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "BMP" msgstr "BMP" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "Go!" msgstr "Kjør!" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:13 msgid "IO registers" msgstr "IO-register" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:14 msgid "Palette Viewer" msgstr "Palettviser" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:15 msgid "Tile viewer" msgstr "Plateviser" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:16 msgid "" "cpu : ARM7\n" "cpu : ARM9" msgstr "" "processor : ARM7\n" "processor : ARM9" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:18 msgid "memory viewer" msgstr "minnesviser" desmume-0.9.9/po/LINGUAS0000644000175000017500000000003512140261635015363 0ustar guillaumeguillaumefr nb pt_BR sv zh_CN zh_TW esdesmume-0.9.9/po/fr.po0000644000175000017500000003331112140261635015310 0ustar guillaumeguillaume# French translation for the desmume-glade UI. # Copyright (C) 2007 The DeSmuME Team. # Pascal Giard , 2007. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-07-17 01:38-0400\n" "PO-Revision-Date: 2007-07-17 05:27-0400\n" "Last-Translator: Pascal Giard \n" "Language-Team: DeSmuME Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #. Creating the selection window #: ../src/gtk-glade/callbacks.c:91 msgid "Open..." msgstr "Ouvrir..." #: ../src/gtk-glade/callbacks.c:100 msgid "Nds binary (.nds)" msgstr "Binaire NDS (.nds)" #: ../src/gtk-glade/callbacks.c:101 msgid "Nds binary with loader (.ds.gba)" msgstr "Binaire NDS avec lanceur (.ds.gba)" #: ../src/gtk-glade/callbacks.c:102 msgid "All files" msgstr "Tous les fichiers" #: ../src/gtk-glade/callbacks.c:117 ../src/gtk-glade/main.c:532 #, c-format msgid "" "Unable to load :\n" "%s" msgstr "" "Impossible de charger:\n" "%s" #: ../src/gtk-glade/callbacks.c:291 msgid "You don't have any joystick!" msgstr "Aucune manette de jeu n'est connecte!" #: ../src/gtk-glade/callbacks.c:293 msgid "Can't configure joystick while the game is running!" msgstr "Vous ne pouvez pas configurer la manette de jeux pendant l'excution du jeu!" #: ../src/gtk-glade/gdk_3Demu.c:64 #, c-format msgid "*** Cannot get %s attribute value\n" msgstr "*** Impossible d'obtenir la valeur de l'attribut %s\n" #: ../src/gtk-glade/gdk_3Demu.c:158 msgid "*** Failed to create pixmap.\n" msgstr "*** chec lors de la cration du pixmap.\n" #: ../src/gtk-glade/gdk_3Demu.c:168 msgid "*** No appropriate OpenGL-capable visual found.\n" msgstr "*** Aucun affichage supportant OpenGL n'est dtect.\n" #: ../src/gtk-glade/gdk_3Demu.c:181 msgid "Failed to create the GdkGLPixmap\n" msgstr "chec lors de la cration du GdkGLPixmap\n" #: ../src/gtk-glade/gdk_3Demu.c:191 msgid "Connot create the OpenGL rendering context\n" msgstr "Impossible de crer le contexte d'affichage OpenGL\n" #: ../src/gtk-glade/glade-xml.c:113 #, c-format msgid "could not find signal handler '%s'." msgstr "impossible de trouver la fonction associ au signal '%s'." #: ../src/gtk-glade/main.c:106 #, c-format msgid "USAGE: %s [OPTIONS] [nds-file]\n" msgstr "UTILISATION: %s [OPTIONS] [fichier-nds]\n" #: ../src/gtk-glade/main.c:107 msgid "OPTIONS:\n" msgstr "OPTIONS:\n" #: ../src/gtk-glade/main.c:109 msgid "" " --soft-convert Use software colour conversion during OpenGL\n" " screen rendering. May produce better or worse\n" " frame rates depending on hardware.\n" " \n" " --disable-3d Disables the 3D emulation\n" "\n" msgstr "" " --soft-convert Utiliser la conversion logiciel des couleurs lors de\n" " l'affichage OpenGL. Peut amliorer ou dtriorer les\n" " performances dpendamment de la carte vido.\n" "\n" " --disable-3d Dsactiver l'mulation 3D.\n" "\n" #: ../src/gtk-glade/main.c:116 msgid "" " --disable-limiter Disables the 60 fps limiter\n" " \n" " --fwlang=LANG Set the language in the firmware, LANG as follows:\n" " 0 = Japanese\n" " 1 = English\n" " 2 = French\n" " 3 = German\n" " 4 = Italian\n" " 5 = Spanish\n" "\n" " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n" " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n" " \n" " --help Display this message\n" msgstr "" " --disable-limiter Dsactiver la limitation de 60 images/seconde.\n" " \n" " --fwlang=LANG Configurer la langue du firmware o LANG est:\n" " 0 = Japanais\n" " 1 = Anglais\n" " 2 = Franais\n" " 3 = Allemand\n" " 4 = Italien\n" " 5 = Espagnol\n" "\n" " --arm9gdb=PORT_NUM Activer le stub GDB du ARM9 sur le port PORT_NUM.\n" " --arm7gdb=PORT_NUM Activer le stub GDB du ARM7 sur le port PORT_NUM.\n" " \n" " --help Afficher ce message d'aide.\n" #: ../src/gtk-glade/main.c:149 msgid "Firmware language must be set to a value from 0 to 5.\n" msgstr "La langue du firmware doit tre une valeur entre 0 et 5.\n" #: ../src/gtk-glade/main.c:161 msgid "ARM9 GDB stub port must be in the range 1 to 65535\n" msgstr "Le numro de port du stub GDB du ARM9 doit tre entre 1 et 65535\n" #: ../src/gtk-glade/main.c:173 msgid "ARM7 GDB stub port must be in the range 1 to 65535\n" msgstr "Le numro de port du stub GDB du ARM7 doit tre entre 1 et 65535\n" #: ../src/gtk-glade/main.c:185 #, c-format msgid "NDS file (\"%s\") already set\n" msgstr "Fichier NDS (\"%s\") dj configur\n" #: ../src/gtk-glade/main.c:198 #, fuzzy, c-format msgid "USAGE: %s [options] [nds-file]\n" msgstr "UTILISATION: %s [OPTIONS] [fichier-nds]\n" #: ../src/gtk-glade/main.c:199 #, c-format msgid "USAGE: %s --help - for help\n" msgstr "UTILISATION: %s --help - pour l'aide\n" #: ../src/gtk-glade/main.c:332 #, c-format msgid "State %d (empty)" msgstr "tat %d (vide)" #: ../src/gtk-glade/main.c:459 #, c-format msgid "Failed to create ARM9 gdbstub on port %d\n" msgstr "" #: ../src/gtk-glade/main.c:470 #, c-format msgid "Failed to create ARM7 gdbstub on port %d\n" msgstr "" #: ../src/gtk-glade/main.c:479 #, c-format msgid "Error trying to initialize SDL: %s\n" msgstr "" #: ../src/gtk-glade/main.c:551 #, c-format msgid "Failed to initialise openGL 3D emulation; removing 3D support\n" msgstr "" #: ../src/gtk-glade/main.c:557 #, c-format msgid "Failed to setup openGL 3D emulation; removing 3D support\n" msgstr "" #: ../src/gtk-glade/main.c:584 #, c-format msgid "Error trying to start FPS limiter timer: %s\n" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "_Config." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "DeSmuMe" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Debug : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "Down : " msgstr "Bas: " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "FrameSkip" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "IO regs" msgstr "Registres d'E/S" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick Config" msgstr "Configuration de la manette de jeu" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Joystick controls" msgstr "Manette de jeu" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Key definition" msgstr "Valeur de la touche" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboard Config" msgstr "Configuration du clavier" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "Keyboard controls" msgstr "Clavier" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "L : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Layers" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Left : " msgstr "Gaucher: " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Load State" msgstr "Chargement d'un tat" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "mulateur de Nintendo DS bas sur le travail de Yopyop" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Appuyez sur un bouton..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Appuyez sur une touche..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Droite: " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "cran droite" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Rotation de l'cran 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Rotation de l'cran 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Rotation de l'cran 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Rotation de l'cran 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Sauvegarder l'tat" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Taille" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "tat 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "tat 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "tat 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "tat 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "tat 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "tat 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "tat 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "tat 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "tat 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "tat 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256kB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "Tools" msgstr "Outils" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "True Gap" msgstr "Espace entre les crans" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "Up : " msgstr "Haut: " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "View Memory" msgstr "Afficher la mmoire" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Palette" msgstr "Afficher la palette de couleur" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Tiles" msgstr "Afficher les tuiles" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "X : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "Y : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "_Emulation" msgstr "_mul." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_File" msgstr "_Fichier" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_PrintScreen" msgstr "_Capture d'cran" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_Saves" msgstr "_Sauv." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "http://desmume.sf.net" msgstr "" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:88 msgid "translator-credits" msgstr "fr: Pascal Giard" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "16 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16c" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "256c" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "32 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "8 bit" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10 msgid "BMP" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "Go!" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "" "cpu : ARM9\n" "cpu : ARM7" msgstr "" desmume-0.9.9/po/sv.po0000644000175000017500000002220012140261635015324 0ustar guillaumeguillaume# Swedish translation for desmume. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the desmume package. # Daniel Nylander , 2007. # msgid "" msgstr "" "Project-Id-Version: desmume\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-05-12 01:00+0200\n" "PO-Revision-Date: 2007-05-12 01:08+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:1 msgid "0" msgstr "0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:2 msgid "1" msgstr "1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:3 msgid "1x" msgstr "1x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:4 msgid "2" msgstr "2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:5 msgid "2x" msgstr "2x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:6 msgid "3" msgstr "3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:7 msgid "3D operation detected" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:8 msgid "3D rom" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:9 msgid "3x" msgstr "3x" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:10 msgid "4" msgstr "4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:11 msgid "5" msgstr "5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:12 msgid "6" msgstr "6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:13 msgid "7" msgstr "7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:14 msgid "8" msgstr "8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:15 msgid "9" msgstr "9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:16 msgid "?" msgstr "?" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:17 msgid "A : " msgstr "A : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:18 msgid "Audio On" msgstr "Ljud på" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:19 msgid "Axis :" msgstr "Axel :" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:20 msgid "B : " msgstr "B : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:21 msgid "BG0" msgstr "BG0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:22 msgid "BG1" msgstr "BG1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:23 msgid "BG2" msgstr "BG2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:24 msgid "BG3" msgstr "BG3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:25 msgid "Boost : " msgstr "Boost : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:26 msgid "Config" msgstr "Konfiguration" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:27 msgid "DeSmuME" msgstr "DeSmuME" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:28 msgid "DeSmuMe" msgstr "DeSmuMe" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:29 msgid "Debug : " msgstr "Felsökning : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:30 msgid "Down : " msgstr "Ner : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:31 msgid "FrameSkip" msgstr "Hoppa över bildrutor" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:32 msgid "IO regs" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:33 msgid "Joystick Config" msgstr "Styrspakskonfiguration" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:34 msgid "Joystick controls" msgstr "Styrspakskontroller" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:35 msgid "Key definition" msgstr "Tangentdefinition" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:36 msgid "Keyboad Config" msgstr "Tangentbordskonfiguration" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:37 msgid "Keyboard controls" msgstr "Tangentbordskontroller" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:38 msgid "L : " msgstr "V : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:39 msgid "Layers" msgstr "Lager" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:40 msgid "Left : " msgstr "Vänster : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:41 msgid "Load State" msgstr "Läs in" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:42 msgid "Nintendo DS emulator based on work by Yopyop" msgstr "Nintendo DS-emulator baserad på Yopyops arbete" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:43 msgid "OBJ" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:44 msgid "Press a button..." msgstr "Tryck på en knapp..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:45 msgid "Press a key..." msgstr "Tryck på en tangent..." #: ../src/gtk-glade/glade/DeSmuMe.glade.h:46 msgid "R : " msgstr "H : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:47 msgid "Reset" msgstr "Nollställ" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:48 msgid "Right : " msgstr "Höger : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:49 msgid "Right Screen" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:50 msgid "Rotate Screen 0" msgstr "Rotera skärmen 0" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:51 msgid "Rotate Screen 180" msgstr "Rotera skärmen 180" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:52 msgid "Rotate Screen 270" msgstr "Rotera skärmen 270" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:53 msgid "Rotate Screen 90" msgstr "Rotera skärmen 90" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:54 msgid "Save State" msgstr "Spara" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:55 msgid "Select : " msgstr "Välj : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:56 msgid "Size" msgstr "Storlek" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:57 msgid "Start : " msgstr "Start : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:58 msgid "State 1" msgstr "Plats 1" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:59 msgid "State 10" msgstr "Plats 10" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:60 msgid "State 2" msgstr "Plats 2" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:61 msgid "State 3" msgstr "Plats 3" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:62 msgid "State 4" msgstr "Plats 4" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:63 msgid "State 5" msgstr "Plats 5" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:64 msgid "State 6" msgstr "Plats 6" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:65 msgid "State 7" msgstr "Plats 7" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:66 msgid "State 8" msgstr "Plats 8" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:67 msgid "State 9" msgstr "Plats 9" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:68 msgid "TYPE: Auto (1B)" msgstr "TYP: Auto (1B)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:69 msgid "TYPE: EEPROM1 (4KB)" msgstr "TYP: EEPROM1 (4KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:70 msgid "TYPE: EEPROM2 (512KB)" msgstr "TYP: EEPROM2 (512KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:71 msgid "TYPE: EEPROM2 (64KB)" msgstr "TYP: EEPROM2 (64KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:72 msgid "TYPE: FLASH (256KB)" msgstr "TYP: FLASH (256KB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:73 msgid "TYPE: FRAM (2MB)" msgstr "TYP: FRAM (2MB)" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:74 msgid "Tools" msgstr "Verktyg" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:75 msgid "True Gap" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:76 msgid "Up : " msgstr "Upp : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:77 msgid "View Memory" msgstr "Visa minne" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:78 msgid "View Palette" msgstr "Visa palett" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:79 msgid "View Tiles" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:80 msgid "X : " msgstr "X : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:81 msgid "Y : " msgstr "Y : " #: ../src/gtk-glade/glade/DeSmuMe.glade.h:82 msgid "_Emulation" msgstr "_Emulering" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:83 msgid "_File" msgstr "_Arkiv" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:84 msgid "_PrintScreen" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:85 msgid "_Saves" msgstr "_Sparningar" #: ../src/gtk-glade/glade/DeSmuMe.glade.h:86 msgid "http://desmume.sf.net" msgstr "http://desmume.sf.net" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../src/gtk-glade/glade/DeSmuMe.glade.h:88 msgid "translator-credits" msgstr "Daniel Nylander " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1 msgid " GoTo: " msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2 msgid " Palette : " msgstr " Palett : " #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3 msgid "0x00000000" msgstr "0x00000000" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4 msgid "16 bit" msgstr "16 bitar" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5 msgid "16c" msgstr "16 färger" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6 msgid "256c" msgstr "256 färger" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7 msgid "32 bit" msgstr "32 bitar" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8 msgid "8 bit" msgstr "8 bitar" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:9 msgid "" "ARM9 cpu\n" "ARM7 cpu" msgstr "" "ARM9-processor\n" "ARM7-processor" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11 msgid "BMP" msgstr "BMP" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12 msgid "Go!" msgstr "Kör!" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:13 msgid "IO registers" msgstr "IO-register" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:14 msgid "Palette Viewer" msgstr "Palettvisare" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:15 msgid "Tile viewer" msgstr "" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:16 msgid "" "cpu : ARM7\n" "cpu : ARM9" msgstr "" "processor : ARM7\n" "processor : ARM9" #: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:18 msgid "memory viewer" msgstr "minnesvisare" desmume-0.9.9/po/zh_CN.po0000644000175000017500000000741012140261635015703 0ustar guillaumeguillaume# French translation for the desmume windows UI. # Copyright (C) 2009 The DeSmuME Team. # F.E.Nebula, 2009. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-07-17 01:38-0400\n" "PO-Revision-Date: 2009-06-24 11:00+0800\n" "Last-Translator: F.E.Nebula \n" "Language-Team: DeSmuME Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" #: File menu #, c-format msgid "File" msgstr "文件" msgid "Open ROM..." msgstr "打开ROM..." msgid "Recent ROM" msgstr "最近的ROM" msgid "None" msgstr "空" msgid "Clear" msgstr "清空" msgid "ROM info" msgstr "ROM信息" msgid "Save state as..." msgstr "即时存档为..." msgid "Load state as..." msgstr "即时读档为..." msgid "Save state" msgstr "即时存档" msgid "Load state" msgstr "即时读档" msgid "Import backup memory" msgstr "导入后备内存" msgid "Save screenshot as..." msgstr "另存屏幕截图为" msgid "Quick screenshot" msgstr "快速截图" msgid "Record AVI" msgstr "录制AVI" msgid "Stop AVI" msgstr "停止录制AVI" msgid "Quit" msgstr "退出" #: Emulation menu msgid "Emulation" msgstr "模拟" msgid "Pause" msgstr "暂停" msgid "Reset" msgstr "复位" msgid "Shut up" msgstr "静音" msgid "GBA slot" msgstr "GBA插槽" msgid "Cheats" msgstr "金手指" msgid "List" msgstr "列表" msgid "Search" msgstr "搜索" #: View menu msgid "View" msgstr "查看" msgid "Rotation" msgstr "旋转" msgid "Window size" msgstr "窗口大小" msgid "Screen separation" msgstr "分割窗口" msgid "None\t(0 px)" msgstr "无\t(0 px)" msgid "Narrow border\t(5 px)" msgstr "窄线\t(5 px)" msgid "DS\t(64 px)" msgstr "DS实际宽度\t(64 px)" msgid "Force maintain ratio" msgstr "强制保持比例" msgid "Default size" msgstr "默认大小" msgid "Display frame counter" msgstr "显示帧计数器" msgid "Display FPS" msgstr "显示FPS" msgid "Display input" msgstr "显示输入" msgid "Display lag counter" msgstr "显示标志计数器" #: Config menu msgid "Config" msgstr "设置" msgid "Save type" msgstr "存档类型" msgid "Autodetect" msgstr "自动选择" msgid "EEPROM 4kbit" msgstr "" msgid "EEPROM 64kbit" msgstr "" msgid "EEPROM 512kbit" msgstr "" msgid "FRAM 256kbit" msgstr "" msgid "FLASH 2mbit" msgstr "" msgid "FLASH 4mbit" msgstr "" msgid "3D settings" msgstr "3D设置" msgid "Control config" msgstr "控制器设置" msgid "Hotkey config" msgstr "热键设置" msgid "Sound settings" msgstr "声音设置" msgid "Wifi settings" msgstr "Wifi设置" msgid "Firmware settings" msgstr "固件设置" msgid "Emulation settings" msgstr "模拟选项设置" msgid "Frameskip" msgstr "跳帧" msgid "Limit framerate" msgstr "限制帧率" msgid "Auto" msgstr "自动" msgid "Language" msgstr "语言" #: Tools menu msgid "Disassembler" msgstr "反汇编" msgid "View memory" msgstr "查看内存" msgid "View registers" msgstr "查看寄存器" msgid "View palettes" msgstr "查看调色板" msgid "View tiles" msgstr "查看Tile" msgid "View maps" msgstr "查看映射" msgid "View OAMs" msgstr "产看OAM" msgid "View matrices" msgstr "查看矩阵" msgid "View lights" msgstr "查看光照" msgid "View layers" msgstr "查看图层" msgid "Main BG 0" msgstr "" msgid "Main BG 1" msgstr "" msgid "Main BG 2" msgstr "" msgid "Main BG 3" msgstr "" msgid "Sub BG 0" msgstr "" msgid "Sub BG 1" msgstr "" msgid "Sub BG 2" msgstr "" msgid "Sub BG 3" msgstr "" #: Help menu msgid "Help" msgstr "帮助" msgid "Website" msgstr "主页" msgid "Forums" msgstr "论坛" msgid "Submit a bug report" msgstr "提交BUG报告" msgid "About" msgstr "关于" desmume-0.9.9/po/Makefile.in.in0000644000175000017500000001604612140304533017014 0ustar guillaumeguillaume# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/po/POTFILES.in0000644000175000017500000000034712140261635016121 0ustar guillaumeguillaume[encoding: UTF-8] src/gtk-glade/callbacks.cpp src/gtk-glade/gdk_3Demu.cpp src/gtk-glade/glade-xml.cpp src/gtk-glade/keyval_names.cpp src/gtk-glade/main.cpp src/gtk-glade/glade/DeSmuMe.glade src/gtk-glade/glade/DeSmuMe_Dtools.glade desmume-0.9.9/autogen.sh0000755000175000017500000000056612140261635015732 0ustar guillaumeguillaume#!/bin/sh # intltoolize is optionnal as it's only required for the gtk-glade UI. if test ! "x$(which intltoolize)" = "x"; then echo "Running intltoolize" intltoolize --copy --force --automake else if test ! "x$(which gintltoolize)" = "x"; then echo "Running gintltoolize" gintltoolize --copy --force --automake fi fi autoreconf --install --force --verbose desmume-0.9.9/README0000644000175000017500000000742712140261635014614 0ustar guillaumeguillaume DeSmuME _________________________________________ Copyright (C) 2006 yopyop Copyright (C) 2006-2012 DeSmuME team Last Updated: March 31, 2012 Contents: 1) About ................................................................... 14 2) Credits ................................................................. 59 3) Contact Information ..................................................... 72 4) License ................................................................. 82 1) About ______________________________________________________________________ DeSmuME is software that allows you to emulate a Nintendo DS system. Think of it as a Swiss-Army knife for Nintendo DS emulation, giving you access to many powerful tools for testing DS features, from viewing ROM properties to managing Action Replay cheats. And best of all, this software is completely free and open-source. For information on how to install or operate DeSmuME for your operating system, please see the README file that should be present with your installation. Port-specific README files: * README.LIN for the Linux port * README.WIN for the Windows port * README.MAC for the Macintosh port Note that each DeSmuME port may have a different feature set from another port. You may see more feature parity between ports over time as we continue developing DeSmuME. You can find our documentation on our online Wiki page. The major pages of interest are: * Official Documentation: http://wiki.desmume.org/index.php?title=Main_Page This is the main Wiki page that contains all of our official documentation. * Manuals: http://wiki.desmume.org/index.php?title=Manual The manuals contain detailed information about how to operate DeSmuME for each port. * FAQ: http://wiki.desmume.org/index.php?title=Faq The Frequently Asked Questions (FAQ) page has a lot of useful general information about DeSmuME. Do note that some of the information may be platform specific, and may not directly apply to your version of DeSmuME. * Build Instructions: http://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source This page contains detailed port-specific instructions about how to make your own build of DeSmuME directly from the source code. 2) Credits ____________________________________________________________________ See the AUTHORS file for list of DeSmuME team members. Special thanks go to: * yopyop (original author of DeSmuME), for releasing the source code of this great emulator. * Martin Korth (author of GBATEK), for his well-written Gameboy Advance and Nintendo DS documentation. 3) Contact Information ________________________________________________________ Official Website: http://desmume.org Public Forum: http://forums.desmume.org Developer Chat: irc://irc.freenode.net/desmume Bug Reports: http://sourceforge.net/tracker/?group_id=164579&atid=832291 Please don't ask for ROMs, BIOS files, or any other copyrighted stuff. 4) License ____________________________________________________________________ This file 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 file 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 software. If not, see . * See the GNU General Public License details in COPYING. desmume-0.9.9/compile0000755000175000017500000000717312140261635015310 0ustar guillaumeguillaume#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2005-05-14.22 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; esac ofile= cfile= eat= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we strip `-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` # Create the lock directory. # Note: use `[/.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: desmume-0.9.9/AUTHORS0000644000175000017500000000120312140261635014766 0ustar guillaumeguillaumeOriginal author --------------- yopyop Current team ------------ Guillaume Duhamel Normmatt Bernat Muoz (shash) Riccardo Magliocchetti Max Tabachenko (CrazyMax) zeromus rogerman Luigi__ Contributors ------------ Allustar amponzi Anthony Molinaro ape Damien Nozay (damdoum) delfare Romain Vallet snkmad Theo Berkau thoduv Tim Seidel (Mighty Max) Pascal Giard (evilynux) Ben Jaques (masscat) Jeff Bland Bernat Muoz (shash) matusz nitsuja gocha pa__ adelikat hi-coder WinterMute pengvado dormito ldesnogue Thanks to our super testers for this release ------------ nash679 pokefan999 dottorleo desmume-0.9.9/config.sub0000755000175000017500000010532712140304537015714 0ustar guillaumeguillaume#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-04-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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 for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: desmume-0.9.9/COPYING0000644000175000017500000004325412140261635014765 0ustar guillaumeguillaume GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. desmume-0.9.9/autopackage/0000755000175000017500000000000012140305317016202 5ustar guillaumeguillaumedesmume-0.9.9/autopackage/default.apspec.in0000644000175000017500000000152012140260631021425 0ustar guillaumeguillaume# -*-shell-script-*- [Meta] RootName: @desmume.sf.net/desmume:$SOFTWAREVERSION DisplayName: DeSmuME Nintendo DS Emulator ShortName: desmume Maintainer: Guillaume Duhamel Packager: Guillaume Duhamel Summary: DeSmuME is a Nintendo DS emulator. URL: http://desmume.sf.net/ License: GNU General Public License, Version 2 SoftwareVersion: @VERSION@ AutopackageTarget: 1.0 [Description] This is a Nintendo DS emulator. [BuildPrepare] prepareBuild [BuildUnprepare] unprepareBuild [Imports] echo '*' | import [Prepare] # Dependency checking require @gtk.org/gtk 2.4 [Install] # Put your installation script here installExe bin/desmume installExe bin/desmume-cli installExe bin/desmume-glade [Uninstall] # Usually just the following line is enough to uninstall everything uninstallFromLog desmume-0.9.9/README.WIN0000644000175000017500000023753612140261635015256 0ustar guillaumeguillaumeManual From DeSmuME Jump to: navigation, search Contents [hide] * 1 DeSmuME Platform Specific Manuals * 2 DeSmuME Common command line arguments o 2.1 --load-slot=NUM [gtk,win] o 2.2 --play-movie=PATH_TO_PLAY_MOVIE [gtk,win] o 2.3 --record-movie=PATH_TO_RECORD_MOVIE [gtk,win] o 2.4 --start-paused=START_PAUSED [gtk,win] o 2.5 --cflash-image=PATH_TO_DISK_IMAGE [gtk,win] o 2.6 --cflash-path=PATH_TO_DISK_DIRECTORY [gtk,win] o 2.7 --bios-arm9=BIOS_ARM9_PATH [gtk,win] o 2.8 --bios-arm7=BIOS_ARM9_PATH [gtk,win] o 2.9 --bios-swi=BIOS_SWI [gtk,win] o 2.10 --num-cores=NUM [win] o 2.11 --scanline-filter-a=NUM [win] o 2.12 --scanline-filter-b=NUM [win] o 2.13 --arm9gdb=PORT_NUM [gtk,win] o 2.14 --arm7gdb=PORT_NUM [gtk,win] o 2.15 -h, --help [gtk,win] o 2.16 --opengl-2d [gtk] o 2.17 --soft-convert [gtk] o 2.18 --3d-engine=ENGINE [gtk] o 2.19 --disable-sound [gtk] o 2.20 --disable-limiter [gtk] o 2.21 --save-type=TYPE [gtk] o 2.22 --fwlang=LANG [gtk] o 2.23 --timeout=SECONDS [gtk] o 2.24 --display=DISPLAY [gtk] o 2.25 -v, --version [gtk] [edit] DeSmuME Platform Specific Manuals DeSmuME places responsibility on the developers of each port to expose emulation features in a way that is tuned to the needs of that platform. As a consequence, some ports are able to move well ahead of the others. Conversely, some ports are far behind some others. As a consequence, some behaviours and menu structures are different in each port. Therefore, the decision was made to create separate manuals for each port as well: when a specific port is changed, only the manual for that specific port needs to be altered. DeSmuME Manual for the Windows port DeSmuME Manual for the Linux GTK+ port DeSmuME Manual for the Linux Glade port DeSmuME Manual for the Linux command line port DeSmuME Manual for the Macintosh port [edit] DeSmuME Common command line arguments The GTK+ and windows ports share common command line arguments. We are trying slowly to move over to a common command line handling engine. The commandline arguments for these platforms are described here: [edit] --load-slot=NUM [gtk,win] Loads savegame from slot NUM [edit] --play-movie=PATH_TO_PLAY_MOVIE [gtk,win] Specifies a dsm format movie to play [edit] --record-movie=PATH_TO_RECORD_MOVIE [gtk,win] Specifies a path to a new dsm format movie [edit] --start-paused=START_PAUSED [gtk,win] Indicates that emulation should start paused [edit] --cflash-image=PATH_TO_DISK_IMAGE [gtk,win] Requests cflash in gbaslot with fat image at this path [edit] --cflash-path=PATH_TO_DISK_DIRECTORY [gtk,win] Requests cflash in gbaslot with filesystem rooted at this path [edit] --bios-arm9=BIOS_ARM9_PATH [gtk,win] Specifies a path to an arm9 bios which will be used [edit] --bios-arm7=BIOS_ARM9_PATH [gtk,win] Specifies a path to an arm7 bios which will be used [edit] --bios-swi=BIOS_SWI [gtk,win] Set to 1 to enable the emulation of SWI via the provided bios files, which I hope you have provided with the above options. (default 0) [edit] --num-cores=NUM [win] Overrides the emulator's autodetection for number of processors. Presently, any system with more than one core (this may inadvertantly include singlecore systems with hyperthreading, but I can't test it) will operate with somewhat reduced OSD functionality, with lower quality and no asynchronous composition. In the future, other optimizations will require higher numbers of cores (optimizations for quad-core are planned, but it won't be too impressive) [edit] --scanline-filter-a=NUM [win] Intensity of fadeout for scanlines filter (edge) (default 2) [edit] --scanline-filter-b=NUM [win] Intensity of fadeout for scanlines filter (corner) (default 4) [edit] --arm9gdb=PORT_NUM [gtk,win] Enable the ARM9 GDB stub on the given port [edit] --arm7gdb=PORT_NUM [gtk,win] Enable the ARM7 GDB stub on the given port [edit] -h, --help [gtk,win] Show summary of options. [edit] --opengl-2d [gtk] Enables using OpenGL for screen rendering [edit] --soft-convert [gtk] Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. [edit] --3d-engine=ENGINE [gtk] Select available 3d emulation: 0 = 3d disabled 1 = internal desmume software rasterizer (default) 2 = osmesa or gtkglext opengl (if available, depending on compilation options, see desmume --help) [edit] --disable-sound [gtk] Disables the sound emulation [edit] --disable-limiter [gtk] Disables the 60 fps limiter [edit] --save-type=TYPE [gtk] Select savetype from the following: 0 = Autodetect 1 = EEPROM 4kbit 2 = EEPROM 64kbit 3 = EEPROM 512kbit 4 = FRAM 256kbit 5 = FLASH 2mbit 6 = FLASH 4mbit [edit] --fwlang=LANG [gtk] Set the language in the firmware, LANG as follows: 0 = Japanese 1 = English 2 = French 3 = German 4 = Italian 5 = Spanish [edit] --timeout=SECONDS [gtk] Quit desmume after the specified seconds for testing purpose. [edit] --display=DISPLAY [gtk] X display to use. [edit] -v, --version [gtk] Show version of program. Retrieved from http://wiki.desmume.org/index.php?title=Manual This page was last modified on 22 November 2009, at 18:17. ==================================================================== DeSmuME Manual for the Windows port From DeSmuME Jump to: navigation, search NOTE: This refers to the 0.9.5 revision of desmume, and may or may not accurately reflect any other revision. Contents [hide] * 1 Quick Getting Started Guide o 1.1 Menu Layout + 1.1.1 File Menu # 1.1.1.1 File | Open ROM # 1.1.1.2 File | Recent ROM # 1.1.1.3 File | ROM Info # 1.1.1.4 File | Close ROM # 1.1.1.5 File | Save State As... # 1.1.1.6 File | Load State As... # 1.1.1.7 File | Save State # 1.1.1.8 File | Load State # 1.1.1.9 File | Import Backup Memory # 1.1.1.10 File | Export Backup Memory # 1.1.1.11 File | Save Screenshot As... # 1.1.1.12 File | Quick Screenshot # 1.1.1.13 File | Record AVI # 1.1.1.14 File | Stop AVI # 1.1.1.15 File | Record WAV # 1.1.1.16 File | Record Movie # 1.1.1.17 File | Play Movie # 1.1.1.18 File | Stop Movie # 1.1.1.19 File | Lua Scripting | New Lua Script Window # 1.1.1.20 File | Lua Scripting | Close All Script Windows # 1.1.1.21 File | Quit + 1.1.2 Emulation Menu # 1.1.2.1 Emulation | Pause # 1.1.2.2 Emulation | Reset # 1.1.2.3 Emulation | Shut Up # 1.1.2.4 Emulation | GBA Slot # 1.1.2.5 Emulation | Cheats # 1.1.2.6 Emulation | Cheats | List # 1.1.2.7 Emulation | Cheats | Search # 1.1.2.8 Emulation | Cheats | Disable + 1.1.3 View Menu # 1.1.3.1 View | LCDs layout # 1.1.3.2 View | Rotation # 1.1.3.3 View | Window size # 1.1.3.4 View | Window size | Always On Top # 1.1.3.5 View | Screen Separation # 1.1.3.6 View | Screen Separation | White,Gray,Black # 1.1.3.7 View | Screen Separation | Editable via border dragging # 1.1.3.8 View | Render # 1.1.3.9 View | Force Maintain Ratio # 1.1.3.10 View | Display Frame Counter # 1.1.3.11 View | Display FPS # 1.1.3.12 View | Display Input # 1.1.3.13 View | Display Graphical Input # 1.1.3.14 View | Display Lag Counter # 1.1.3.15 View | Display Microphone # 1.1.3.16 View | HUD Editing Mode + 1.1.4 Config Menu # 1.1.4.1 Config | Save Type # 1.1.4.2 Config | 3D Settings # 1.1.4.3 Config | Control Config # 1.1.4.4 Config | Control Config | Allow Left+Rt/Up+Dn # 1.1.4.5 Config | Hotkey Config # 1.1.4.6 Config | Sound Settings # 1.1.4.7 Config | WIFI Settings # 1.1.4.8 Config | Firmware Settings # 1.1.4.9 Config | Emulation Settings # 1.1.4.10 Config | Microphone Settings # 1.1.4.11 Config | Path Settings # 1.1.4.12 Config | Frame Skip # 1.1.4.13 Config | Language # 1.1.4.14 Config | Background Pause # 1.1.4.15 Config | Enable State Rewinding + 1.1.5 Tools Menu # 1.1.5.1 Tools | Disassembler # 1.1.5.2 Tools | View Memory # 1.1.5.3 Tools | View Registers # 1.1.5.4 Tools | View Palette # 1.1.5.5 Tools | View Tiles # 1.1.5.6 Tools | View Maps # 1.1.5.7 Tools | View OAM # 1.1.5.8 Tools | View Matrices # 1.1.5.9 Tools | View Lights # 1.1.5.10 Tools | View Sound State # 1.1.5.11 View | RAM Watch # 1.1.5.12 View | RAM Search # 1.1.5.13 Tools | View Layers + 1.1.6 Help Menu # 1.1.6.1 Help | Website # 1.1.6.2 Help | Forums # 1.1.6.3 Help | Submit a bug report # 1.1.6.4 Help | About [edit] Quick Getting Started Guide When you start the emulator for the first time, you probably just want to play a certain game. You can do this by going to 'File' in the menu, and selecting 'Open Rom'. This will open up an explorer window, within which you can browse to the rom (nds file) that you wish to play. Once the game has finished loading (and this should only take a few seconds at most), your game will automatically start running. But if you want, you can also compile from source. See the article Installing DeSmuME from source on Windows for details. [edit] Menu Layout The rest of this manual will be spend on explaining all the other options in the menu. [edit] File Menu [edit] File | Open ROM This option is for loading games. A game is typically called a rom file. Just use the explorer window to browse to the file, and click on open. The game should just load and start. The desmume windows port is also able to load some compressed formats, like zip, rar, and 7z. Just as long as there is a valid game (rom) file in the compressed archive ending with an .nds extension, it should load fine. [edit] File | Recent ROM This menu option contains a list of the roms that you have most recently loaded. You can quickly access a game that way, without having browse to the right directory with the 'Open Rom' option. [edit] File | ROM Info This option offers some information about the internals of the rom file, like name, code, manufacturer, and size. This should not concern the casual gamer, but may come in handy for developers. [edit] File | Close ROM Just ends the current game and leaves the emulator more or less how it was when you first launched it. [edit] File | Save State As... Imagine you have gotten to a certian point in a game, and you need to do something else. The emulator let's you save the current state of the game, so that you can continue the game later at precisely the same point somewhere in the future. Please note that the use of SAVESTATES is discouraged, as these are likely to break between emulator versions. Instead use SAVE FILES. These are likely to survive between emulator versions. This means that you will have to use save points within the game. SAVE FILES are stored in .dsv files. [edit] File | Load State As... Once you have saved a game's position, or 'state', you can load it again with this option. [edit] File | Save State This option works fairly similair to the 'Save As' option, altough it let's you save numbers instead os specifying a chosen name. Also, All the states saved via this option end up with a pre-determined name of 'game (rom) name'.dsx. So if the game is called MyGame, the first savefile will be called MyGame.ds0, the second one MyGame.ds1, etc. [edit] File | Load State This option let's you load the states that you saved via the 'File | Save State' option [edit] File | Import Backup Memory Backup Memory is the data the game uses to remember its own state. It is stored on the cart in a normal game. Desmume uses the .dsv extension and file format; other formats which can be imported are .duc and raw .sav, as well as no$gba savefiles (also using the .sav extension). People use pro action replays to capture duc files from their card and post it online without using emulators. These are frequently found on gamefaqs.com. See the faq for details on how to use this function, where it has been documented better. [edit] File | Export Backup Memory This lets you export the game's state for use in other Nintendo DS Emulators. It will write a 'raw' sav file or a no$gba savefile. [edit] File | Save Screenshot As... This lets you take a screenshot of the current view of the emulator, and specify it's name to save as a bitmap (.bmp) file. [edit] File | Quick Screenshot This option also dumps a screencapture, but it has a pre-determined filename and location. The name will be based on the name of the rom and somehow sequentially numbered, and placed in the directory specified in the Path Settings. [edit] File | Record AVI This option lets you capture what's going on in the emulator, and save it in an avi file. [edit] File | Stop AVI The 'Record AVI' option continues to record the game, untill you press the 'Stop Avi' option. [edit] File | Record WAV This option lets you capture the sound played in the emulator, and save it in a wav file. In contrast to the other option, this records, as faithfully as possible, the exact emulated audio output (which is not necessarily what you hear), although it will use the interpolation you have specified in the sound config. [edit] File | Record Movie This option lets you record the gameplay in TAS format, see http://tasvideos.org for details on TAS (tool-assisted speedruns). [edit] File | Play Movie This option lets you playback a pre-recorded TAS movie. [edit] File | Stop Movie This options lets you stop a movie which is playing or recording. [edit] File | Lua Scripting | New Lua Script Window Launches a lua scripting dashboard. Reference the FAQ for more information on lua in emulators. [edit] File | Lua Scripting | Close All Script Windows Closes all the lua dashboards. [edit] File | Quit Choosing this option exits the emulator. [edit] Emulation Menu [edit] Emulation | Pause This option will pause the emulation, freezing it at the current moment of execution. Selecting it again will resume the execution of the ROM at the exact moment where you paused it. [edit] Emulation | Reset This option will reset the ROM that is currently loaded to the very start of the ROM, just as if you chose 'File | Open Rom' again. [edit] Emulation | Shut Up This option turns off all the currently-running sounds, effectively killing streams and decoded music and voiceovers. Sequenced music and sound effects will continue to play, and when you enter a new area in the game or someone else speaks, the sounds will play again. Use this to Shut Up an annoying sound. [edit] Emulation | GBA Slot This menu option pop-ups a new window, which lets you specirfy what to do with the GBA slot of the Nintendo DS. It has the following choices : NONE, Compact Flash, Rumble Pack, GBA Game, Guitar Grip. Rumble pack allows some games to use vibration. Memory extension... Extends memory, as introduced by the NDS Opera browser. And some DS games can have bonuses, unlockable by GBA cart. For example in Megaman ZX you can fight some Megaman Zero Bosses when correct cartridge is inserted. This is also commonly used by pokemon players for finding some pokemons from older GBA games. There are some GBA slot extensions which are not yet emulated by desmume. Compact Flash is is used for homebrew software emulation, for example that uses DLDI (Dynamically Linked Device Interface). As usual, see the FAQ for more up-to-date information on that. [edit] Emulation | Cheats This option pulls down a drop-down menu, and presents the options list and search. Be aware though, that cheats are sort of half baked right now. If you are not having luck, wait for some news on an improved cheat system. Also, it is impossible yet to use "commercial" codes, such as Action Replay and Codebreaker, so what you'll have to do is manually search for, and alter the memory positions to your advantage. They are called 'raw' or 'internal' cheats. There's an excellent article in the wiki on Using Cheats in DeSmuMe . In post-0.9.2 development builds, there is also the support for Action Replay cheat codes. [edit] Emulation | Cheats | List Choosing 'list' will list all the currently known cheats. Please refer to the article Using Cheats in DeSmuMe for further details on how to use the cheat mechanism in desmume. [edit] Emulation | Cheats | Search Choosing 'search' will let you search for cheats. Please refer to the article Using Cheats in DeSmuMe for further details on how to use the cheat mechanism in desmume. [edit] Emulation | Cheats | Disable Disables the cheat engine, and all active cheats. [edit] View Menu [edit] View | LCDs layout This powerful menu controls how the NDS screens will be arranged into the window. Vertical and Horizontal will choose to stack them in the specified manner (vertical being traditional and default and horizontal being wide-screen). One LCD shows just one screen--whichever one is "first" (top) as described below. "Top First" means that the top screen is First and will be displayed on top. "Bottom first" means that the bottom screen is First and will be displayed on top (effectively switching the usual ordering of the screens for this game). "Main screen first" selects the main graphics engine (the one with 3d on it) to consider as first. This option will help you track the action and discard the useless status screen in many games. "Sub screen first" is added for the sake of completeness and you may occasionally find it helpful. Please note that these last two options may not work well in the case of dual screen 3d games, as the screens are always toggling around. [edit] View | Rotation This option will let you rotate the screen a pre-determined amount of degrees clockwise in order to adjust the angle of the display. Some programs require that you normally turn the DS on its side. You can set it up in that manner using this. The options are 0 (no rotation), 90, 180, and 270. [edit] View | Window size This option will let you enlarge the windows a pre-determined size. The resize options are: 1x, 1.5x, 2x, 3x, and 4x the default size. You can also adjust the window size by resizing the window as usual in Windows apps. [edit] View | Window size | Always On Top As featured in media players and IM programs and other emulators, etc., this will prevent other apps from displaying on top of desmume. [edit] View | Screen Separation This option controls how far the two windows should be apart of each other, in other words: how big the border between them should be. Valid choices are: None (which is the default), narrow border (which is slightly larger), DS (which is about the same amount of room there is on a real Nintendo DS). [edit] View | Screen Separation | White,Gray,Black Changes the colour of the gap. Savvy users may discover that they can edit this in the ini file to be any color they want. [edit] View | Screen Separation | Editable via border dragging When enabled, you can pick any gap size you want by dragging the bottom edge (not a corner) of the main window. [edit] View | Render These options will apply different resizing filters to the emulator screen display. [edit] View | Force Maintain Ratio Here you can choose, when re-sizing the windows, if you wan to maintain the ratio of the windows. Sometimes when the window size is changed it doesn't look correct on the screen. This option forces the window to maintain a correct ratio so it looks correct. [edit] View | Display Frame Counter Selecting this option will display the emulation frame number. This way you can tell how long you have been playing the game. It is also useful for timestamping emulation events (for example, you can tell if you made it out of a level faster than last time) [edit] View | Display FPS Selecting this option causes the 'frames-per-second' (or 'fps', for short) to be displayed. It also displays an additional '3D' counter, which tells how frequently the game is updating its 3d graphics. But unlike the fps counter, the 3d counter has nothing to do with the power of your system. If it is low, then the game is running slow on a retail cart, and so it runs slow in an emulator. The last number in parentheses is the arm9 load average, which indicates how hard the emulated CPU is working. This has nothing to do with the power of your system either. [edit] View | Display Input Selecting this option displays the emulated input that the emulator is recognizing and sending to the game software. [edit] View | Display Graphical Input Same as Display Input but it is a super-spiffy graphical version. [edit] View | Display Lag Counter This option displays the lag counter, which records frames where the game does not poll input. [edit] View | Display Microphone This option is somewhat less exciting than it sounds, but it displays some numbers which may help you diagnose whether your microphone is hooked up correctly. [edit] View | HUD Editing Mode This option will let you drag around hud elements to pick their position. [edit] Config Menu [edit] Config | Save Type This option lets you specify the save type of a particular game. The default is 'automatic'. However, this is not fail-safe in all cases, so you might need to manually select one of the other savetypes. You may also need to set this before important a savefile from some other source, as they do not always contain sufficient information to guess the correct size. [edit] Config | 3D Settings This option lets you select the method that is used to draw the screen. You can choose between OpenGL (hardware accelerated) or SoftRasterizer (desmume's custom-crafted software renderer). Note that however hardware accelerated it may be, oftentimes SoftRasterizer will run faster. Furthermore, you have three toggles for SoftRasterizer: * Unrealistically High-Precision Color Interpolation - this affects how material colors get handled when polygons are clipped. * Enable Edge Marking / Enable Fog - Using these you can prohibit emulation of these hardware features to gain a minor speedup. Desmume 0.9.4 had an option called "Alternate Flush Mode" which fixed some games with flickering graphics, but this was removed in 0.9.5. [edit] Config | Control Config This option lets you configure keyboard keys or a joystick. The joystick support is implemented using a DirectInput control interface. Here are the default control mappings (they may be subject to change): Up arrow - Up Left arrow - Left Down arrow - Down Right arrow - Right x - A button z - B button s - X button a - Y button q - Left Trigger w - Right Trigger Enter - Start button Right Shift - Select button Backspace - Lid fold/unfold [edit] Config | Control Config | Allow Left+Rt/Up+Dn It is nearly impossible on an actual console to press left and right at the same time. You may accidentally (or on purpose!) be glitching games by sending input they did not expect if you enable this option. Most casual users can emulate the hardware better by leaving this unchecked. [edit] Config | Hotkey Config This menu option lets you define keys, that can be used to quickly select other options without having to go through the entire menu structure. Some examples are a hotkey for 'pause', or a hotkey for loading a specific savestate. Here are the default hotkey mappings (they may be subject to change): n - Frame advance Space - Pause/Unpause p - Load current state 1,2,3,4,5,6,7,8,9,0 - Select current state F1-F10 - Load relevant state Shift+F1-F10 - Save relevant state [edit] Config | Sound Settings This option lets you configure the way sound is generated. The sync/async modes and sync methods give you different output: * Dual sync/async: the traditional mode, which generates more sound when the game slows down. Gives clear sound in most cases but can cause streamed sounds to be garbled sometimes. * Sync: always generates the same amount of sound, and uses one of the three available methods to compensate for too low or too high framerates. This mode shouldn't make streamed sounds garbled. o Sync method 'N': created by Nitsuja. Basically stretches the sound. Sounds like No$GBA (without the crackling). o Sync method 'Z': created by Zeromus. Stretches the sound to compensate for slowdowns, and resamples it to compensate for too high framerates. That resampling causes latency and can behave weird sometimes. o Sync method 'P': taken from SPU2-X, an SPU2 plugin for PCSX2. Stretches the sound intelligently, giving clear sound in most cases, but also latency. The sound core setting allows you to choose between the DirectX sound core and the dummy one which produces no sound. The WAV write core has been removed since the new "Record WAV" option made it useless. The buffer size setting should be kept to its original value. However, if your sound isn't clear even at 60 fps, you can try increasing it. The interpolation setting allows you to choose between three interpolation methods: * None: Fast, but may sound bad. * Linear: typical, sounds good * Cosine: maybe slower than linear, but doesn't sound much better Note that the DS has no interpolation method. While sometimes interpolation can make a noticeable improvement, it can also be unnoticeable or distort some sounds. The ADPCM caching has been removed. It was needed due to a bug in ADPCM decoding which has been fixed. If you are still using 0.9.4, then enabling this can speed up some games while breaking the sound in others. [edit] Config | WIFI Settings WIFI support is currently under heavy development, but it is not useful yet. Therefore, you may find this option missing, or simply 'greyed-out' for now. Even if you can fiddle with it, it won't do anything useful. [edit] Config | Firmware Settings This option provides you with the same set of options that a real Nintendo DS firmware does. The most important here is the language, because multi-lingual games will often look at how this option is set. [edit] Config | Emulation Settings These options let you boot from the extracted BIOS and Firmware of a real Nintendo DS. unless you have extracted/downloaded the firmware or bios from a Nintendo DS that you actually own yourself, these settings have no value for you as desmume does not generally require them to run correctly. Occasionally, however, a game may require them in order to work. [edit] Config | Microphone Settings You can choose one of four modes. The first will attempt to use the windows default recording device (it is up to you to make your microphone take this role) and feed its input to the emulator. This works, but not perfectly, and it suffers from some unresolved conceptual issues, similar in nature to the emulator audio synchronization problem. The remainder of the options are triggered when using the mic hotkey. You can "Use internal noise sample" which works for many games that want you to blow on the mic; you can "Use rand() whitenoise" which will work for games that require blowing, but which don't work with the internal noise sample (note that this is NONDETERMINISTIC and not tas-safe); and finally you can supply your own microphone sample, which may be noise, or your nintendog's name, or any other thing. It has even been tested with bangai-o spirits level loading. This must be an 8bit mono pcm wav file. [edit] Config | Path Settings Use this dialog to configure the default paths for roms, savestates, screenshots, etc. Some people like everything in one directory and some people like using 50 directories; you can have it your way. [edit] Config | Frame Skip The first option, "Limit framerate" engages the throttler and prohibits the emulator from running more than 60fps. With this disabled, a fast computer may run the game doubly or triply fast. The fixed skip options allow you to specify how many frames should be skipped, constantly. It is generally safe to choose 1 or 2 if you don't mind a slightly choppier game, in order to get a speedup. You may get accustomed to the degraded game performance and not notice. Note, however, that frameskipping can sometimes entirely fail in dual-screen 3d games or games that use capture. The auto skip options will try engaging the frameskipping when the emulator is running slow, to keep the game from slowing down, but render all the frames when possible to maintain 60fps. This can make a game look sort of like a modern console 3d game which slows down when the action gets intense or too much of the world is visible. Note that you can use the fast-forward hotkey to engage a special mode which disables the throttler and skips some large number of frames in order to run the game as quickly as possible. This may help you speed through cutscenes or other slow grinding in games and is easier to use than constantly fiddling with these menu options. [edit] Config | Language This lets you set the language the emulator displays its menus and options in. This won't change everything in the emulator, as due to the way it is coded, some things aren't translateable through this system, and it may very well be the case that your desired translation is incomplete. [edit] Config | Background Pause Selecting this option will pause the emulation whenever you put desmume in the background, or the window loses focus. [edit] Config | Enable State Rewinding This is a bit of an experimental option which will suck up a ton of your cpu power taking secret savestates every 0.25 seconds or so. With this enabled, the use of a rewind hotkey will permit you to rewind time a little bit in case you die. [edit] Tools Menu [edit] Tools | Disassembler This option displays the ARM9 and ARM7 disassembler. Be aware though, that the windows are drawn exactly on top of each other, so that you have to move (drag n drop) the first windows before the second window shows. [edit] Tools | View Memory This tool displays the ARM7 and ARM9 memory. Be aware though, that the windows are drawn exactly on top of each other, so that you have to move (drag n drop) the first windows before the second window shows. The "View mode" radio buttons allow you to choose how the memory will be shown: * 8-bit : shows the memory as bytes * 16-bit : shows the memory as words * 32-bit : shows the memory as dwords The "View address" textbox and button allow you to jump to a different address: * Enter an hexadecimal address without 0x prefix, with up to 8 digits * Click "Go" to jump to the entered address The "View dump" buttons allow you to dump the current view: * Text dump : dumps the view to a text file, in an human-readable form * Raw dump : dumps the memory directly to a binary file which can be read with an hex editor Note that if you dump memory to a file already containing (a) dump(s), the new dump will be appended to the existing one(s). The scrollbar... well, you surely know how a scrollbar works. The viewers additionally allow to edit the memory. For it, click on the value you want to edit, then type the new value. The new value is applied only once you've entirely entered it. [edit] Tools | View Registers This option lets you view the ARM7 and ARM9 I/O registers. [edit] Tools | View Palette This option lets you view the palette in detail. [edit] Tools | View Tiles This option lets you view the tiles in detail. [edit] Tools | View Maps This option lets you view the maps in detail. [edit] Tools | View OAM This option lets you view the OAM layer in detail. [edit] Tools | View Matrices This option lets you view the matrices in detail. [edit] Tools | View Lights This option lets you view the lights in detail. [edit] Tools | View Sound State This option displays the sound output. [edit] View | RAM Watch This option will pop-up a new window, with extensive and advanced features to watch the emulated RAM memory. [edit] View | RAM Search This option will pop-up a new window, with extensive and advanced features to search through the emulated RAM memory. [edit] Tools | View Layers This option lets you toggle BG layer visibility one by one. You can also toggle the rendering for an entire GPU engine, which can help your framerate in games where one screen is pointless. [edit] Help Menu [edit] Help | Website This option directs your browser to the desmume homepage. [edit] Help | Forums This option directs your browser to the desmume forums. [edit] Help | Submit a bug report This option directs your browser to the SourceForge bugtracker for desmume. [edit] Help | About This option displays the authors of the emulator. Retrieved from "http://wiki.desmume.org/index.php?title=DeSmuME_Manual_for_the_Windows_port" This page was last modified on 22 November 2009, at 22:09. ==================================================================== Faq From DeSmuME Jump to: navigation, search DesMuMe FAQ This FAQ holds a list of many commonly asked questions about DeSmuME. If the FAQ is unable to answer any questions you have, then please make sure that you also consult the manual. If this doesn't help, either, post your question on the forums. Contents [hide] * 1 Release 0.9.4 Topics o 1.1 Using old DeSmuME save files in 0.9.4 o 1.2 What is this NOSSE and dev stuff? / Why does desmume.exe crash when it loads? / Which EXE do I use? * 2 Savegames and Savestates o 2.1 Why does this game fail to save? / I get the error "Data could not be accessed. Turn off the power and reinsert the DS card." or "Unable to write data. Please turn off the power and reinsert the game card." o 2.2 Why was the save file format and extension changed from .sav to .dsv ? o 2.3 Can I use my save states across versions? o 2.4 Can I convert an ideas or no$gba nocash .sav savefile to DeSmuME .dsv? o 2.5 How do I make Pokemon saves? o 2.6 Why can't Pokemon save after beating the elite 4? * 3 Wi-Fi and WFC o 3.1 Does DeSmuME support wifi? o 3.2 Why do I get an assert in wifi.cpp which keeps me from playing a game? o 3.3 If DeSmuME doesn't support wifi, then why does it make my firewall alert since 0.9.2? o 3.4 Why did my build come with winpcap.dll? / Why do I get crashes when I run DeSmuME on vista which mention something about winpcap? o 3.5 What is WFC / Nintendo WiFi Connection? * 4 Troubleshooting and Errors o 4.1 Help! My desmume window disappeared! Maybe I can hear sound and it is in the taskbar but I can't see the window o 4.2 Does Scribblenauts work? o 4.3 How do I use external BIOS files or firmware? o 4.4 Why does my touch screen not work? Oh yes you did read my mind, I was using external firmware o 4.5 I have a gameplay related question o 4.6 Why doesn't my DeSmuME play this game? o 4.7 Why doesn't my game boot or progress into the main game engine? o 4.8 Why does the emulator take a long time to start up and/or devastate my system or unarchiver when I run it? o 4.9 Why doesn't OpenGL 3D work in Linux? o 4.10 Why doesn't OpenGL 3D work in windows? o 4.11 My display is incorrect or corrupted or something is missing o 4.12 My display has flickering graphics in a certain game o 4.13 Why does music and FMV sound bad/distorted sometimes? * 5 Performance o 5.1 Why is the emulator slow? o 5.2 Does DeSmuME make use of multiple CPU's or multiple cores? o 5.3 In 0.9.4, what does the number/percentage in the DeSmuME title bar mean o 5.4 In 0.9.5, what does the percentage in the FPS display mean o 5.5 Why are there Two/Numbers in the FPS display? * 6 Using The Emulator o 6.1 What are the minimum hardware requirements for DeSmuME ? o 6.2 What are the recommended hardware requirements for DeSmuME? o 6.3 It is hard to zoom in on a widescreen display due to the unusual aspect ratio of the DS o 6.4 But will you please add screen splitting / window tearing apart / fullscreen modes? o 6.5 How do I enter 'cheat codes' in DeSmuME? o 6.6 I entered a 'cheat code', and now the emulator freezes. o 6.7 Does DeSmuME support the microphone? o 6.8 Does the 'GBA slot' option let me play GBA games? o 6.9 How do I "Close the DS"? o 6.10 How do I use the stylus (pen) to 'touch' the screen? o 6.11 How can I touch two points on the screen at once, as required by Hotel Dusk? * 7 General Questions o 7.1 What does DeSmuME emulate and on what systems? o 7.2 What does DeSmuME mean? o 7.3 Under what license is DeSmuME distributed ? o 7.4 Can I freely copy DeSmuME ? o 7.5 Where can I report bugs? o 7.6 Can I attach files to bug reports I did not create myself ? o 7.7 What is 'TAS' ? o 7.8 What hardware features are emulated? o 7.9 Does the GDB stub still work? o 7.10 How do I enable the GDB stub on the Windows port ? o 7.11 Does compact flash works? o 7.12 Where/what is IRC? o 7.13 Where is the manual? o 7.14 Where is release 0.9.3? o 7.15 What is DLDI? o 7.16 How can I post a save file or AVI capture on the DeSmuME forum? o 7.17 How can I record an AVI with a gap between the screens? o 7.18 How can I post a large log or other text file on the DeSmuME IRC chat room? o 7.19 What are the origins of DeSmuME? * 8 SVN and Compiling o 8.1 Why doesn't the DeSmuME team release pre-build SVN binaries ? o 8.2 How do I get the latest svn code and build DeSmuME myself? o 8.3 What is 'SVN' ? o 8.4 What compilers are supported for building DeSmuME from source? o 8.5 I'm Compiling using MSVC Express On Windows, and I get the error : "ml.exe" not found. * 9 Development and Technical Questions o 9.1 I have a patch, modification or other code addition o 9.2 I'm a developer, and would like to contribute to the codebase. What can I do? o 9.3 Im not a developer, but would like to help out anyway. What can I do? o 9.4 What is this Lua stuff I see? o 9.5 How do I easily capture the ASM code for troubleshooting purposes? o 9.6 Where can I find technical details on the Nintendo DS and GBA? * 10 Mac Users o 10.1 Why can't I find a Mac binary? o 10.2 Why does my Mac binary say something about being unsupported? o 10.3 Why doesn't a menu option or tool exist in my Linux or Mac build? [edit] Release 0.9.4 Topics [edit] Using old DeSmuME save files in 0.9.4 DeSmuME will first try to load a dsv file. If the dsv is missing, it will try to load a sav and then it will immediately dump the dsv. The conversion process is supposed to be seamless. [edit] What is this NOSSE and dev stuff? / Why does desmume.exe crash when it loads? / Which EXE do I use? Use dev if you are a developer and want the gdb stub. Use nosse if the regular exe crashes for you because you are on an old computer. desmume.exe uses some SSE2 optimizations for 3D matrix calculations which have been disabled in desmume_nosse.exe. Any modern Intel CPU (AMD or intel) will support SSE2. [edit] Savegames and Savestates [edit] Why does this game fail to save? / I get the error "Data could not be accessed. Turn off the power and reinsert the DS card." or "Unable to write data. Please turn off the power and reinsert the game card." Until version 0.9.4 DeSmuME's save size autodetection was poor. With 0.9.4, autodetection should work almost all the time. In fact, here is the entire list of games we currently know of that fail to autodetect correctly: * Spider-Man 3 (should be autodetect_size=1, detected as 3) * Over The Hedge (should be autodetect_size=1, detected as 3; same failure mechanism) If you find any other game for which automatic savetype detection does not work, please let the developers know by posting on the forum or submitting a bug. If you want to fix it yourself, you may need to manually specify the correct save type for your game. Consult the manual for details on how to do this for your platform. You may also consult http://www.advanscene.com/ to easily identify the save type for your game. [edit] Why was the save file format and extension changed from .sav to .dsv ? Because it is better now. These raw save files that everyone uses aren't good enough and were causing problems with autodetection. See our bug tracker or forum for more details; the dsv format has been documented in the svn source tree as dsv.txt and if you don't like the degree of interoperability with other emulators, then go tell the other emulators to support our format. [edit] Can I use my save states across versions? Maybe, maybe not. Due to constant internal changes in DeSmuME, it is possible that a save state created with one version may not work with another version of DeSmuME. Savestate compatibility is preserved wherever possible, but it is not always possible. Please note that for easily confused gamers, the use of SAVESTATES is discouraged, as these are likely to break between emulator versions. Instead use SAVE FILES. These are likely to survive between emulator versions. This means that you will have to use save points within the game. SAVE FILES are stored in .dsv files. Also, see this article for further details : Savefile or savestate [edit] Can I convert an ideas or no$gba nocash .sav savefile to DeSmuME .dsv? 1. Convert the save file using http://shunyweb.info/convert.php ; the target format should be "Acekard RPG | EZFlash V | RAW Format [Autodetection] (.sav)" 2. Load the game. Let it get to the main menu 3. Select the correct backup size*, as specified by advanscene.com (which is not always right, by the way) 4. Use File > Import Backup Memory and pick the converted save file 5. Reset the game * Step 3 is not always necessary, if you are smart, however, it will never hurt to do it. [edit] How do I make Pokemon saves? Update to 0.9.4, which ensures the save type is detected automatically and correctly. [edit] Why can't Pokemon save after beating the elite 4? Your save file is 9KB. It should be 513KB. Your save file is broken due to you never having established the right savefile size. That means you made it all the way through the game without saving and then testing it by loading (which would not have worked, if you had tried it). See the above discussion for why that was a very bad idea. In 0.9.5+ or post-0.9.4 svn or 0.9.4+ rr builds you may see an option in the savetypes menu called FORCE AS CURRENT which, when used after picking the correct pokemon savefile size (4mbit) will hopefully permit subsequent saves to create a correct savefile. In order to do that youll have to load your savestate first. If you have been using 0.9.4, since savestate compatibility between versions is not warranted, and definitely won't work between 0.9.4 and 0.9.5, you'll have to use Gocha's 0.9.4+ build which is located at http://tasvideos.org/forum/viewtopic.php?p=210670 which will be able to load an 0.9.4 savestate. These instructions were not explicit enough for one user. In an effort to tailor this information to the intellectual capacity of the audience for this question, I will paste the instructions which apparently were simple enough for him to follow: go to the faq. follow the link to gocha's build. download gocha's build. load the savestate. set the size (4Mbit). use force as current. save the game. exit the emulator and verify that you can load the game from the savefile. if you can, then load it and play through to complete the game. [edit] Wi-Fi and WFC [edit] Does DeSmuME support wifi? Wifi is not supported. It is currently under slow and incomplete development. Therefore, you may find this option missing, or simply 'greyed-out' for now. Also, since WIFI support does not work yet, don't ask any questions about it's functioning because it still is unfinished and does not work yet. Furthermore, current development activities focus mainly on the Windows build. [edit] Why do I get an assert in wifi.cpp which keeps me from playing a game? This was a glitch in 0.9.2 release which was fixed in 0.9.4. [edit] If DeSmuME doesn't support wifi, then why does it make my firewall alert since 0.9.2? Your firewall is stupid, or winsock is stupid, (I am not sure which yet) for alerting just when winsock gets initialized. The emulator hasnt actually tried to connect to the internet yet. How could it? There isn't any wifi. All we are doing is some network initialization code. For those of you who are still not satisfied, then I will admit that there is actually some wifi code--but it doesn't actually do anything yet! Except alert your firewall. Sorry. Also, maybe that is actually a good, unobtrusive time for firewalls to alert. But I am not sorry for calling them stupid. They are hyperactive crybabies. [edit] Why did my build come with winpcap.dll? / Why do I get crashes when I run DeSmuME on vista which mention something about winpcap? Because you are running an unofficial build, from dubious origins, made by unknown people. The DeSmuME team cannot support builds it did not create itself. Therefore, you are advised to stop using unofficial builds, as you can expect no support from the DeSmuME team or on the DeSmuME forums. Only use builds you downloaded from the DeSmuME website. [edit] What is WFC / Nintendo WiFi Connection? See the article Nintendo wifi config utility for more information. [edit] Troubleshooting and Errors [edit] Help! My desmume window disappeared! Maybe I can hear sound and it is in the taskbar but I can't see the window Delete your ini file. This is caused by exiting the app while you have executed win+d show desktop mode. Desmume tries to remember the window position, but windows implements show desktop by setting the window position to something like x=-32000 and so that gets saved. There is supposed to be some code to handle that case, but I guess it is not working well. This is a problem in many windows apps and this solution will usually fix it. If you don't want to lose all the other settings in your ini file, poke around in it and find the offending items which should look like this: [Video] Window Size=0 Window width=0 Window height=0 WindowPosX=-32000 WindowPosY=-32000 Delete the -32000 items [edit] Does Scribblenauts work? It works in 0.9.4 but you must use external bios files and "emulate swi's with bios images". Speaking of work, it has come to my attention that several people worked for some years making this game. If that means anything to you people. [edit] How do I use external BIOS files or firmware? Config > emulation settings and supply the path. Do not ask us for BIOS files as we don't have them. It is only my psychic skills which enable me to know that this fixes Scribblenauts. Since the menu option doesn't exist in the OS X port, it is impossible to play scribblenauts on it. Like to MAC/OSX port, the Linux port(s) don't allow you to use external BIOS or Firmware files either. [edit] Why does my touch screen not work? Oh yes you did read my mind, I was using external firmware It's a bug. It is not a high priority since nobody yet has proven that they actually need the external firmware. If there was a way around it, I wouldve just told you. [edit] I have a gameplay related question Please check a site like http://www.gamefaqs.com, and don't post gameplay related questions on the forum or IRC *unless* you believe there is a bug in the emulation of DeSmuME. [edit] Why doesn't my DeSmuME play this game? Go to desmume.org and make sure you are using the latest version. The latest version is 0.9.4. Hint: DeSmuME 0.8 and 0.3.4 are very old, being numbers smaller than the latest version. Older versions will not be supported, under any circumstances. [edit] Why doesn't my game boot or progress into the main game engine? DeSmuME is not perfect yet. Some games may fail due to wifi emulation. You might find ways to patch the games to work better on emulators by searching on the internet, but that is not something you should seek help with on the DeSmuME forums. If it really doesn't boot up, you can submit a bug report for the game on the sourceforge bugtracker. [edit] Why does the emulator take a long time to start up and/or devastate my system or unarchiver when I run it? This is a problem with the DeSmuME 0.9.2 that some people impolitely distribute themselves. Redownload 0.9.2 from sourceforge.net or get a newer version. It isn't a virus or anything, it is a bug in the application that can just bring a system to its knees. It tries to allocate 1GB of virtual memory. This also crashes or freezes some virus scanners (I've seen it on AVG). [edit] Why doesn't OpenGL 3D work in Linux? Blame NVIDIA and ATI for putting out shoddy and/or closed source drivers. Then switch to software rasterizer. [edit] Why doesn't OpenGL 3D work in windows? You are probably using an ATI video card. ATI driver support of OpenGL is known to be poor. NVIDIA cards have a much more robust support of OpenGL, so getting one of those will help. Alternatively, you can switch to software rasterizer. [edit] My display is incorrect or corrupted or something is missing Try switching the 3D Renderer from OpenGL or SoftRasterizer, or vice versa, to see if that resolves the bug. In Windows, the default hotkey to do this quickly is numpad minus. [edit] My display has flickering graphics in a certain game In the 0.9.4 Windows port, you can choose 'Alternate Flush Mode' in the 'Config | 3D Settings' menu. This fixes some games with flickering graphics. This option is no longer necessary in 0.9.5. If you still have flickering graphics, find the discussion about frameskipping in this doc (try turning it off.) [edit] Why does music and FMV sound bad/distorted sometimes? Most DS music is sequenced music, loaded from the cart entirely when the level loads. This works mostly fine, but bonus points for you if your ears are good enough to spot the bugs. Your music that doesn't work well at all is probably streaming music, which loads from the cart on the fly and goes straight to the speakers, and possibly decoded along the way. This includes FMVs. This is much harder to emulate as it requires correct timing, which is not one of DeSmuME's strengths right now. At any rate, in 0.9.5 support for a synchronized SPU was added for the windows builds which can be optionally enabled to make these streaming sounds work correctly. Synchronizing audio is a hard problem to solve, and we're not finished solving it. The synchronous SPU comes with some other issues, which is why it is optional. Also available, if you are using the windows build, is a command from the menu Emulation > Shut Up to make the offending music go away. [edit] Performance [edit] Why is the emulator slow? Because nobody pays us to work on it full time and it runs fast enough for us to be happy. Well, almost. New releases may always be a step backwards in some (or many) cases from earlier releases in terms of speed. There is a delicate balance between compatibility and speed and sometimes one advances further than the other. At any rate, we have introduced a few speed hacks and toggles which you may find helpful: * (0.9.4) If you are in Windows, make sure you're not using the NOSSE build. That one is slower. * (0.9.5) If you are in Windows, try using the SSE2 build. It may be a little faster. * (0.9.5) If you are in linux, try making a build with SSE and SSE2 extensions enabled because the code is ready to handle it. Someone should provide details on how to do this. * If you are using someone else's unofficial "SVN" build, it probably is not fully optimized, since we make our Windows releases using some profiler-guided optimization, which helps by several FPS. For all I know, they are also carriers of viruses, and lately they tend to crash on Vista. * If you can handle it, turn off the sound. * Use frame skip. Even frameskipping by 1 will help and many games will stay playable. Frameskipping is continually tweaked in each release to get more bang for the buck, but beware that dual screen 3d games still may not work well under frameskip. If screens seem stuck, pick a different frameskip value. * (0.9.4+) In the sound options, set interpolation to none which should help a little bit. * (0.9.4 only) Turn on the sound option "ADPCM Caching"; this is new and experimental, and will break some things, but it should offer a substantial speedup in some cases. * (0.9.5+) Use dual/asynch SPU mode -- even if you turn off the sound. Try alternate synch methods if you must use synch spu mode. * (0.9.4+) There is now the option of disabling an entire screen. (Tools > View Layers > Main GPU, etc) Consider disabling a screen which is useless in the game you are playing. * Try the software rasterizer. In many cases, especially games which make only light use of the 3d hardware, this will actually run faster, by as many as 10 FPS. But it might also run slower, again, by as many as 10 FPS. * (0.9.5+) If you are using the software rasterizer, disable edge marking and fog if you feel like they aren't needed. If the game isn't using those features then this won't help. * Buying a newer, faster computer is somewhat more expensive, but it has other side benefits. * A faster CPU is more helpful than a bleeding edge graphics card. DeSmuME is more CPU intensive than it is GPU intensive. It just needs a graphics card that is glitch-free, and currently the NVIDIA cards have a better track record. A newer graphics card has a slim possibility of increasing speed. * The cheapest way to get 60fps is to buy the cart. You may find that this is not enough, and you need to buy a console as well. Here are some steps that have worked well for me in the past: o Look for neighbors that are mowing their own lawns. Ask them if they would like for you to do it instead. o Borrow your daddy's lawn mower and mow the neighbor's lawn. o After this, they will generally give you cash. As you repeat the above steps, this cash can accumulate to large values. o Once the accumulated cash is sufficient, it can be taken to a merchant where it can be exchanged for games and consoles. * My lawn needs mowing. It wont make your game run any faster if you mow it for me, but I am less likely to get evicted, which would be bad for my productivity. [edit] Does DeSmuME make use of multiple CPU's or multiple cores? Currently, the Windows port has two particular multicore optimizations (in 0.9.5+): first, the display logic runs in its own thread independent from the emulator. This is used to make the OSD run frame-rate independent from emulation. This thread performs color conversion, filtering, and directdraw presentation. The net result is a speedup by a few FPS. This codepath is disabled on single core systems, and may be disabled forcefully by the user with the --num-cores=1 command line argument. Second, the software rasterizer will run in a SLI mode using as many cores as you have specified (or have been detected) up to four. Still, DeSmuMe benefits MUCH more from a single CPU with a higher GHz than from multiple cores or from multiple CPUs. [edit] In 0.9.4, what does the number/percentage in the DeSmuME title bar mean * For the Windows port, the percentage is the emulated ARM9 CPU load average. The CPU in an actual Nintendo DS is an ARM9 CPU. The percentage shows us how busy the emulated CPU is. This number isnt really for you. You are far too curious. But go ahead and brag about how emulated games run at 99% on your system, it makes us laugh. * For the Linux GTK and Glade ports, it's frames per second (fps). [edit] In 0.9.5, what does the percentage in the FPS display mean See above, it was moved here to save 915 million people from asking what it means in the title bar. [edit] Why are there Two/Numbers in the FPS display? The first is your actual FPS which is how fast the emu is running on your system. If it is less than 60 then you need speed hacks or more a more powerful CPU. The second is the 3d FPS, which is a rough gauge of how fast the game is supposed to be running. If you are seeing 60/15 then the game will feel slow because it is sloppily coded but theres NOTHING YOU CAN DO ABOUT IT short of turning off speed throttling and playing at 100fps. [edit] Using The Emulator [edit] What are the minimum hardware requirements for DeSmuME ? From a purely technical viewpoint, there are no minimum requirements. However, for 'real-world' playable speeds, you would need at least the following : * Windows OS: Windows XP or Vista * Linux OS: Any recent Linux distribution with a 2.6 kernel. * 2 GHz Processor * 512 MB Available System Memory * Available Hard Drive Space: A few MB for the emulator * 128 MB 3D Video Card (Nvidia GeForce 6800 or better), ATI cards are not recommended. * Optional: Sound Card, if you want sound support * Optional: Microphone, if you wish to make use the Windows Microphone feature [edit] What are the recommended hardware requirements for DeSmuME? From a purely technical viewpoint, there are no recommended requirements. However, for 'real-world' playable speeds, the following gives you good performance: * Windows OS: Windows XP or Vista * Linux OS: Any recent Linux distribution with a 2.6 kernel. * 3 GHz Processor * 1 GB Available System Memory * Available Hard Drive Space: A few MB for DeSmuME, 100MB or so for a bunch of savestates and savefiles. * 512 MB 3D Video Card (Nvidia GeForce), ATI cards are not recommended. * Sound Card. * Microphone. In general, the more GHz, the better. The faster memory, the better. DeSmuME 0.9.4 won't benefit from multiple cores. DeSmuME is at the moment, unfortunately, slower than no$gba. [edit] It is hard to zoom in on a widescreen display due to the unusual aspect ratio of the DS In fact it is hard to zoom in on a 4:3 screen, too. In 0.9.5, you can configure the screens to be side-by-side, so maybe this will make you happy. Additionally you can choose to display only one screen. I don't think anyone wants to add tear-apart windows, though. [edit] But will you please add screen splitting / window tearing apart / fullscreen modes? You think youre the first person to have thought of this? The answer is no. Of all the things in the world to code, we hate this the most. [edit] How do I enter 'cheat codes' in DeSmuME? As of 0.9.4, there are two types of cheat codes: Action Replay and 'raw' or 'internal' cheats. The 'raw' or 'internal' cheats include cheat-finding facilities where you may manually search for and alter the memory positions which work to your advantage. There's an excellent article on 'raw' or 'internal' cheats in the wiki on Using Cheats in DeSmuMe . For Action Replay Cheats, You can find codes for the NTSC games at http://us.codejunkies.com/Departments/DS-and-GBA.aspx and for the PAL at http://uk.codejunkies.com/Departments/DS-and-GBA.aspx. [edit] I entered a 'cheat code', and now the emulator freezes. Most likely it's a problem from the (Action Replay) cheat code you used. Using codes modify the game and can make it crash/freeze if it comes to an unexpected situation. It just depends on the code you use and what it's used for in the game. Find the .dct file in your emulator's folder that matches the game's filename, and then erase it to solve the 'freezing' problem. [edit] Does DeSmuME support the microphone? Yes, but only on the Windows and GNU/Linux ports. You do need to have an actual microphone attached to your PC, though. In 0.9.2 the microphone in Windows really only works for noise, but this was fixed in 0.9.4; it was fixed even further in 0.9.5. Linux support will exist in 0.9.5+ -- please note that it requires libasound. When in windows, if it seems that the microphone is not working, bear in mind that it has no idea what kind of how many microphones you have. You will need to use the windows control panel to specify the correct microphone as the default audio input device, and then make sure in the recording level properties (volume control) that it is selected and at an appropriate volume. [edit] Does the 'GBA slot' option let me play GBA games? No. A 'real' DS can use the gba slot to play gba games, but DeSmuME does not emulate this. But a 'real' DS can also use the gba slot to access gba roms and sram so that ds games can import savefiles, and that part is emulated by DeSmuME. (please note that in 0.9.4 this is reportedly buggy for some games, including pokemon; this is supposed to have been fixed in 0.9.5) If you are looking for a Game Boy Advance (GBA) emulator, perhaps you can try mednafen or VisualBoy Advance. [edit] How do I "Close the DS"? This can be done using the 'lid' command or BACKSPACE key (this can be changed in the control configuration). [edit] How do I use the stylus (pen) to 'touch' the screen? You can use your mouse to emulate the stylus. Move the mouse cursor to the desired position, and then press the left mouse button in order to 'touch' the screen at the position the mouse cursor is located. Yes, we have really been asked this question before. [edit] How can I touch two points on the screen at once, as required by Hotel Dusk? One user got past this by first switching on one of the switches, then pausing the game, and sort of switching on an imaginary switch in the middle of the two switches while manipulating the frame advance hotkey. See, gbatek says that when two points are touched, that the hardware appears as if the average of the two points is actually pressed. But the game expects you to touch them at not-exactly-the-same-time. [edit] General Questions [edit] What does DeSmuME emulate and on what systems? DeSmuME attempts to emulate, as faithfully as possible, the Nintendo DS and Nintendo DS Lite handheld game consoles (NDS). It currently runs on Windows, Linux, and mac OSX. DSi is not supported. [edit] What does DeSmuME mean? DeSmuME is a Nintendo DS emulator and the name is a play of words - DS Emu + ME (like FlashMe - firmware hack and PassMe mod-chip for DS) The name DeSmuME derives from the popular use of ME in Nintendo DS products by homebrew developers. So DeSmuME would equal DSemuMe. Other popular uses of ME include: * LoadMe - a generic patcher for commercial DS roms that works with any GBA Flash Card * PassMe - "mod-chip" using which takes authentication from an original DS card an allows execution of unauthenticated DS rom code - from the GBA cartridge slot / GBA flash card. * FlashMe - a hacked firmware for DS that allows you to start code in DS mode from a flash card in the GBA slot. * WifiMe - are a set of a custom drivers and software by FireFly for RALink based wireless network cards enabling to boot homebrew code on DS via Nintendo Wireless Multiboot method. Its name is derived from emu which is short for emulator, DS and me. It's possibly supposed to mean "DS emulator for me". [edit] Under what license is DeSmuME distributed ? DeSmuME is distributed under the GNU General Public License, or GPL: http://www.gnu.org/licenses/gpl-2.0.html [edit] Can I freely copy DeSmuME ? Yes you can, as long as you adhere to the license as specified in the GNU GPL. [edit] Where can I report bugs? In the official bug tracker. Feel free to post to the bug tracker as long as you are willing to take ownership of testing that bug and letting the developers know when it is resolved to your satisfaction. Just don't submit a bug report and run. You may also request features around the same location, too, but in the other trackers. [edit] Can I attach files to bug reports I did not create myself ? SourceForge likes for folks to only respond on items they submit. If you see a ticket that represents something you are encountering, SourceForge doesn't necessarily want you commenting on that. The reasoning for this given by SourceForge is that they feel it is best to open your own ticket, which helps appreciate the extent of issues in many cases. The authors of DeSmuME may or may not agree with this point of view from SourceForge. [edit] What is 'TAS' ? TAS lets you record the gameplay in TAS format, see http://tasvideos.org for details on TAS (tool-assisted speedruns). [edit] What hardware features are emulated? * All known 2D graphics features are correct. Mosaics work but are imperfect. There may be small issues with colors as the correct color bit depths are not used at all points in the pipeline. * All 3D features are emulated, except the following: wireframes and antialising. In 0.9.5, support for fog is added, as well as edge marking which mostly-works but is not perfect. In 0.9.5 the box test was significantly improved (dare I say perfected?) which fixed a number of games. The OpenGL engine is near its limit and renders some things incorrectly. Eventually the software rasterizer will support more features and be far more precise in the basic features. Both engines have trouble with some shadows, but software rasterizer is better. Software rasterizer has some noticeable texturing issues right now, especially in 2d games. Software rasterizer supports more correct lighting interpolation than opengl ever will (e.g. glitches at the edge of the screen while scrolling.) In software rasterizer, there are issues similar to 2d with incorrect bit depth being used in the pipeline. There are unfavorable edge conditions in each renderer; in OpenGL, textures tend to get overdrawn; in software rasterizer, edges of textures tend to be jittery (like the real DS) One last thing -- if buttons and labels and menus rendering on the 3d screen are obscured (for example, a button but no label is on it) then you may need to use the software rasterizer. Or you may need to use OpenGL instead. Each renderer has strengths and weaknesses, which is why both are provided. * All sound features are emulated. The microphone support is new and the manual should be consulted, where you will find out, among other things, that it is only supported in windows right now. * Wifi is not supported. It is currently under slow and incomplete development. Therefore, you may find this option missing, or simply 'greyed-out' for now. Also, since WIFI support does not work yet, please don't ask any questions regarding it, because it still is unfinished and does not work yet. * We are unaware of any outstanding issues in the core system hardware (CPU, DMA, MMU) but there are certainly still some. The instruction and memory timings are quite incorrect; however, this seems not to hurt most titles. * DLDI - Dynamically Linked Driver Interface, commonly known as DLDI, is a driver framework that allows NDS and GBA homebrew to easily read and write to any number of different devices, just by substituting a driver file. The MPCF driver (GBA MoviePlayer CF-version) is the only one that is supported, so you will need to install it into your application before using it in desmume. You will find that a directory or fat image must be mounted via the commandline or UI for the "gbaslot" configuration. Right now, our codebase really only has libfat support for SLOT-2 devices and CF devices so more thorough support for other DLDI drivers is unlikely at this time. * RTC (real-time clock) works; If it didn't, then the time in your games stays at 00:00:00, and your random number values always come up the same. [edit] Does the GDB stub still work? It seems as if it works in 0.9.4, tested with the Insight GDB variant on windows with a recent devKitPro. This support has been compiled into the dev+ build. [edit] How do I enable the GDB stub on the Windows port ? Add #define GDB_STUB to src/windows/userconfig/userconfig.h which you have created according to the instructions in src/windows/defaultconfig/userconfig.h ; sorry for this confusing system, but that's how it is for now. [edit] Does compact flash works? In 0.9.2+ it works, somewhat buggily, at least for directory scanning (i.e. not fat16 image) in windows via the gba slot. There is a bug that breaks it in linux, which has been fixed for 0.9.5+ along with some other work on that system. [edit] Where/what is IRC? IRC is an on-line communication system. data you need: * server: irc.freenode.net * port: 6667 * channel: #desmume what to use: * mIRC - Windows * ChatZilla - FireFox add-on * xchat - X * plenty other, see wikipedia Language: * Most of the people on the channel speak, or try to speak the English language. [edit] Where is the manual? A manual for DeSmuME is over at http://wiki.desmume.org/index.php?title=Manual. It may not have the information that other entries in this FAQ promised that it would. [edit] Where is release 0.9.3? Who cares? 0.9.4 is out now. DeSmuME 0.9.3 does not exist. It was sneaked out of our staging area. It has bugs, which is why we hadn't released it yet. So we decided not to release it at all. Any release claiming to be 0.9.3 won't be supported. [edit] What is DLDI? DLDI is a patching system for homebrew ROMs using libfat which makes DS homebrew much easier to write and much more user friendly. As you may know, there are many various flash cartridges for DS. These 'flashcarts' use different hardware, so to make a program run on all cards, youd have to write support for each and every card into the program. But no-one needs support for any other cards than their own. So a libfat developer, chism, developed DLDI. The program itself knows nothing about the hardware. However, when a DLDI patch is applied, libfat can use this patch to know how to write to the flashcart. So, if one user has an M3 flashcart, and downloads a program, they could patch it with the M3 DLDI patch and the program would work with it. Then, another user with a Supercart could download it, apply the Supercard DLDI patch, and it would work on their flashcart, too. The same patch should let the flashcart work with any libfat based program. [edit] How can I post a save file or AVI capture on the DeSmuME forum? After you created it, you can upload it to a free external service provider like MediaFire (http://www.mediafire.com/), and then put the provided links to the page in the message you post on the forum. [edit] How can I record an AVI with a gap between the screens? Learn how to use virtualdub and avisynth. Then use the following avisynth script which we have developed for this purpose: ####configuration#### gap = 64 #color = $aaaaaa #color = $000000 color = $ffffff ################## A = AviSource("c:\ds.avi", pixel_type="RGB32") B = AviSource("c:\ds.avi", pixel_type="RGB32") C = blankclip(fps=A.FrameRate, width=256, height=192+gap+192, color=color, length=A.FrameCount) A = A.crop(0,0,256,192) B = B.crop(0,192,256,192) D = overlay(C,A) D = overlay(D,B,0,192+gap) return AudioDub(D,A) We really don't want to put any smarts into the desmume avi dumper, preferring to do it with avisynth instead. It is a slippery slope, as there are about 50 things that people want avi dumpers to do and theyre better off learning how to do it outside the emu with other tools. To that end, if you have any particular needs regarding this do not hesitate to post in our forum and maybe we'll help you make a new avisynth script. [edit] How can I post a large log or other text file on the DeSmuME IRC chat room? Make use of an external text storage site, such as 'pastebin' (http://pastebin.com/), and post the url to it on the IRC channel. [edit] What are the origins of DeSmuME? DeSmuME is a freeware emulator for the Nintendo DS originally created by YopYop156. The original website was http://yopyop156.ifrance.com Due to change in French laws regarding emulation YopYop decided to stop development of DeSmuME. However, he released the source under the GPL, and other programmers have picked it up and kept it under active development. Yopyop said: Its release under GPL. I have just removed the new 3D engine because its too much bugged. Hopefully it will be helpful for some of you. The latest statement heard from yopyop was: DeSmuME project is over. You may dont know but there are a new law in France that could put me in big trouble. With DeSmuME, I have closed the doors of game company but I can not offer to pay for it. The worst thing is that I have found the bad coded instructions. For those how have download the sources you have to look in sbc, rsbc instructions the Carry flag updating is wrong. Sorry for the home brew programmers. For the illegality the demonstration seemed to me convincing thus without proof clarify I prefer to stick to this decision. It is also the fact that few people seem interested by the project. Put besides some people who sent demonstrations to me which did not go, I received only malls to wonder to make function such or such plays or to ask me why moved is in French . Thus I will not do something of useless and illegal. For the site it would not obstruct me if there were not the bond on the left which does nothing but add to confusion on the goal of the project. And for the sources it is the same problem as for the project. good week end yopyop edit the law relates to the royalties and the rights close, not? [edit] SVN and Compiling [edit] Why doesn't the DeSmuME team release pre-build SVN binaries ? Because the DeSmuME team doesn't have trusted people to make the builds, and don't want to get involved on builds that could include whatever the author wants. Every newbie coder could do a version that, after 10 minutes of gameplay, for example, starts corrupting stuff from the hard disk. Also, anyone incapable of building it's own builds, probably isn't very helpful for submitting bug reports or helping the development team on SVN releases, so there isn't much point on them getting a SVN build. [edit] How do I get the latest svn code and build DeSmuME myself? Please check out the instructions related to your platform, over at Installing DeSmuME from source [edit] What is 'SVN' ? svn is a developers tool. It's used to let multiple developers work on the same codebase without conflicts. If youre an end-user, don't worry about it. And if you're a developer, see the question on how to get the latest svn code and build DeSmuME yourself. See wikipedia for more info [edit] What compilers are supported for building DeSmuME from source? * At the moment, for Windows Microsoft Visual C++ 2005 and 2008 are the only supported compilers. Dev-C++ is not supported. Microsoft's Visual C++ Express is free to install and use, so there's no reason not to use it. * For Linux, any recent version of GCC and toolchain should work. [edit] I'm Compiling using MSVC Express On Windows, and I get the error : "ml.exe" not found. ml.exe was not included in earlier downloads of MSVC++ 2008 Express Edition. Uninstall, redownload and install again. 'ml.exe' shoud be located in the "Microsoft Visual Studio 9.0\VC\bin" directory. [edit] Development and Technical Questions [edit] I have a patch, modification or other code addition Please add them to the appropriate sourceforge tracker. Patches go to the 'Patches' tracker : http://sourceforge.net/tracker/?group_id=164579&atid=832293 [edit] I'm a developer, and would like to contribute to the codebase. What can I do? To start you off in the right direction, the best thing you can do is join the developer team on IRC and discuss your intentions with the developers. [edit] Im not a developer, but would like to help out anyway. What can I do? The most helpful thing you can do is use DeSmuME, learn its ins and outs, and learn how to compile svn builds. Then monitor it for regressions and report bugs. You can patrol the bug tracker for bugs which could use elucidation or which, based on your awareness of how the emulator is changing, might be fixed without us having specifically addressed the bug. Basically, be a super user. And hang out on irc. Also, adding to or perfecting the documentation in the wiki is useful. You could also watch for and answer questions placed on the DeSmuME forum. [edit] What is this Lua stuff I see? It is sort of a macro language for interacting with the running game software. Here is an example of it working with an NES game in another emulator, and youtubing for "fceux lua" should suffice to explain it if you don't get the picture from this url: http://www.youtube.com/watch?v=1XNTjVScm_8 [edit] How do I easily capture the ASM code for troubleshooting purposes? Savestate during the problem or just before your problem occurs, and #define WANTASMLISTING in armcpu.cpp. Recompile. Then redirect stdout to a file. I know it isn't easy but its what we have for now. A newer, and possibly better way, is to search for LOG_ARM9 in ndssystem.cpp and uncomment it. You will also need to trigger the condition for logging by setting dolog=true. Beware that this is very verbose, and can dump around 100MBytes of logs per frame. [edit] Where can I find technical details on the Nintendo DS and GBA? http://nocash.emubase.de/gbatek.htm [edit] Mac Users [edit] Why can't I find a Mac binary? Maybe we haven't made it yet. There aren't a lot of people willing to compile Mac software. Just to be sure, go to https://sourceforge.net/project/showfiles.php?group_id=164579&package_id=186413 [edit] Why does my Mac binary say something about being unsupported? You have probably downloaded the i386 version of DeSmuME for MAC, and are running on the PPC platform (or the other way around). Please verify if you're running on Intel (i386) hardware, or on PPC (G4, G5) hardware, and download the appropriate binary. [edit] Why doesn't a menu option or tool exist in my Linux or Mac build? Because making portable tools and platform harnesses are not our cup of tea and so a developer puts a feature into whichever ports he cares about. This policy is never going to change, although some features might migrate to other platforms over time. Better check the manual. Retrieved from "http://wiki.desmume.org/index.php?title=Faq" This page was last modified on 21 November 2009, at 21:55. desmume-0.9.9/NEWS0000644000175000017500000000000012140261635014407 0ustar guillaumeguillaumedesmume-0.9.9/README.MAC0000644000175000017500000003046012140261635015204 0ustar guillaumeguillaume DeSmuME _________________________________________ Copyright (C) 2006 yopyop Copyright (C) 2006-2013 DeSmuME team Last Updated: April 16, 2013 Contents: 1) System Requirements ..................................................... 15 2) Quick Start Guide for Using DeSmuME for OS X ............................ 36 3) Additional Documentation ............................................... 137 4) Contact Information .................................................... 167 5) License ................................................................ 269 1) System Requirements ________________________________________________________ DeSmuME is a very demanding app, especially for CPU usage. Before you begin, make sure that your Mac meets the listed system requirements. If your Mac meets only the minimum requirements, then you should expect to run most simple 2D-only games with some frameskip, but you will be unable to run complex 2D games or any 3D-heavy games. However, if your Mac meets the recommended requirements, then you should expect to run almost every game, including very complex 3D-heavy games, with minimal to no frameskip. Operating System: OS X v10.5 (Leopard) or later CPU: Can run on any PowerPC G4, G5, or Intel processor 2.1 GHz Intel Core 2 Duo (minimum) 3.0 GHz Intel Core 2 Duo or faster (recommended) RAM: 512 MB (minimum) 2 GB (recommended) 2) Quick Start Guide for Using DeSmuME for OS X _______________________________ Installing DeSmuME is as easy as copying DeSmuME.app to your Applications folder (or other folder of your choice). Double-click the app to start DeSmuME. Note that DeSmuME for OS X may have a different feature set than DeSmuME for Windows and DeSmuME for Linux. As of this writing, some features that are present in DeSmuME for Windows are not present in DeSmuME for OS X. The rest of this section will be a guide to help you quickly get started using DeSmuME for OS X. Loading a ROM and Starting the Emulator: Simply double-click the desired ROM from the Finder to play the game. By default, DeSmuME will load the ROM and start emulation. Also, there are additional ROM loading options that you can change in DeSmuME > Preferences if you need them. Using the DS Controller: Each DS controller button can be mapped to a button of your choice on your keyboard, gamepad, or joystick. You can view the mappings by clicking on Input in DeSmuME > Preferences. To change a mapping, click on the DS control that you want to change, then press the button on your input device to map it. By default, the DS controller is mapped to the following keys on your keyboard: Up - Up Arrow Down - Down Arrow Left - Left Arrow Right - Right Arrow A Button - X B Button - Z X Button - S Y Button - A L Trigger - Q R Trigger - W Start - Return Select - Tab Lid - Delete (Backspace) Microphone - ` (Accent) In addition, the following emulator functions are mapped to your keyboard by default: Execute/Pause - Forward Delete Reset - Page Down Set Speed to Half - - (Dash) Set Speed to Double - = Using the DS Touch Pad: Touch pad input is emulated using the left mouse button by default. Simply click in the touch pad area of the DS display window to use the DS touch pad. Rotating the DS Display: Some games require that the DS display be at a certain rotation in order to look correct. Rotation options can be found by choosing View > Display Rotation. You can also use the toolbar buttons Rotate Left and Rotate Right to rotate the display by 90 degrees counterclockwise or clockwise, respectively. Freezing and Restoring the Emulation State: Save states are a powerful feature that allows you to freeze the emulation state and restore it later. However, note that save states are only a temporary means of saving -- more permanent saves must be done using the in-game save (or ROM save). - To freeze the emulation state, choose File > Save State File. - To restore the emulation state, choose File > Open State File. You can also freeze/restore emulation states without having to manage the Open/Save dialogs. There are ten available save state "slots" that you can use to quickly freeze/restore the emulation state. - To quick freeze the emulation state, choose File > Save State Slot > Slot #. The default hotkey for this is (Shift-#). - To quick restore the emulation state, choose File > Load State Slot > Slot #. The default hotkey for this is (#). Improving Emulation Performance: There are many settings you can change in order to improve DeSmuME's emulation performance. All of the settings listed below affect performance the most. Use the settings as shown for the best possible performance. All of these settings may be found in DeSmuME > Preferences. - WARNING: Changing any Emulation setting may cause emulation glitches in certain ROMs. Do not change these settings unless you are willing to accept reduced ROM compatibility. Display: Video Output: Use Vertical Sync - Off Video Filter - None 3D Rendering: 3D Rendering Engine - SoftRasterizer Rendering Threads - Automatic Emulation: Advanced Bus Level Timing - Off (May cause glitches) Rigourous 3D Rendering Timing - On (May cause graphical glitches) 3D Rendering Engine - Dynamic Recompiler (May reduce ROM compatibility) Dynamic Recompiler Block Size - 100 (May cause glitches) Use External BIOS Images - Off (May reduce ROM compatibility) 3) Additional Documentation ___________________________________________________ The quick start guide in this Read Me is by no means a complete reference to everything that DeSmuME can do! If you need any additional information about DeSmuME, then you can reference our online Wiki pages for up-to-date information. * Official Documentation: http://wiki.desmume.org/index.php?title=Main_Page This is the main Wiki page that contains all of our official documentation. * FAQ: http://wiki.desmume.org/index.php?title=Faq The Frequently Asked Questions (FAQ) page has a lot of useful general information about DeSmuME. Do note that some of the information may be platform specific, and may not directly apply to the OS X version of DeSmuME. * DeSmuME Manual for OS X: http://wiki.desmume.org/index.php?title=DeSmuME_Manual_for_the_Macintosh_port This page contains complete and detailed information about how to operate DeSmuME for OS X. * DeSmuME Build Instructions for OS X: http://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source_on_OS_X This page contains complete and detailed instructions about how to make your own build of DeSmuME for OS X directly from the source code. 4) Contact Information ________________________________________________________ Thank you for you interest in DeSmuME! If you want to tell us how useful DeSmuME is in your life, your love (or hate) of certain NDS games, your passion for NDS homebrew development, or anything else related to DeSmuME or NDS emulation, then there are various ways for you to contact us! However, keep in mind that there are a few of rules that you need to follow: - Do not ask us to provide ROMs, BIOS files, or any other copyrighted stuff. We don't want to have to deal with any legal issues that could get us in trouble, or worse, completely shut down. - When contacting us, please use the appropriate means to do it. For example, if you simply want to tell us how much you love or hate us, then use the comments on the official webpage. Another example: If you want to post on the forum, be sure to keep the topic focused on DeSmuME; questions that ask for things like us providing you the latest Pokemon cheats are not DeSmuME related, and we will instead refer you to a Pokemon cheaters forum. Finally, our developer chat channel is intended for furthering the development work of DeSmuME; questions about how to use DeSmuME should not come here, but instead go to the Support forum. In short, use the appropriate contact method. That's why the different methods exist! * Official Website: http://desmume.org Our official website has the latest news on DeSmuME releases, and also has a lot of other useful information about DeSmuME. You can comment on different posts telling us how you feel about DeSmuME. Is DeSmuME the best thing in your life? Is it making you cry? Or is it a bunch of blah? Let us know here! * Public Forum: http://forums.desmume.org If you have a question about DeSmuME, then this is the place to ask it. But before you ask it, be aware that your question may have already been answered before, so try the following things first: - Read the manual and the FAQ. A lot of questions people have are usually already answered in our documentation. - Do a forum search about your question. If you still need to ask a question, choose Help > Submit a Support Request in the DeSmuME application. Follow the onscreen instructions on the Support Request Form. * Live Developer Chat Channel: irc://irc.freenode.net/desmume We have a live developer chatline on Freenode IRC at #desmume. This channel is meant for discussing the development of DeSmuME, and shows the real work that goes on behind the scenes. If you are interested in doing any sort of software programming, software testing, documentation, or graphics work, then please join our chat channel! We would love for you to join us! * Bug Reports: If you believe that you have found a bug, you may submit a bug report by choosing Help > Submit a Bug Report in the DeSmuME application. Follow the onscreen instructions on the Bug Report Form. When you click Go To Bug Report Webpage, you will be taken to our bug tracker on SourceForge. Do note that you will need a SourceForge account in order to submit a bug report. Bug submissions are very welcome and encouraged. However, when you submit a bug to us, you MUST provide the following information, or else your bug submission may be rejected: - DeSmuME app version - Your operating system and OS version - Your Mac model identifier - The name of the running ROM when the bug was observed (or "None", if no ROM was running) - The serial code of the running ROM when the bug was observed (or "None", if no ROM was running) - A description of the exact behavior you observed - A description of the behavior you expected All of this information will be prepared for you if you use the Bug Report Form from Help > Submit a Bug Report. When you write your description, make sure that they are as detailed as possible. The better your descriptions are, the faster we can test and fix bugs. For example, if you observed a bug in the game Golden Sun: Dark Dawn, then the bug report could look something like this: App Version: v0.9.9 Operating System: OS X v10.8.3 (12D78) Mac Model Identifier: iMac11,2 ROM Name: GOLDENSUN_DD ROM Serial: NTR-BO5E-USA Observed Behavior: I tried to load a save state using the File > Load State > Slot 3 menu option, but the game froze. If I reset, I can get the game working again. Expected Behavior: The game should continue running from the point where I made the save state. We will try to get your bug tested as soon as possible, but any fixes may take longer, depending on the complexity of the bug. Also, some bugs may require us to ask you for certain files, such as your ROM saves, save states, or console logs. For the above example, we would probably ask you for your save states to help us track down the bug. 5) License ____________________________________________________________________ This file 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 file 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 software. If not, see . * See the GNU General Public License details in COPYING. desmume-0.9.9/configure0000755000175000017500000111102312140304536015626 0ustar guillaumeguillaume#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for desmume 0.9.9. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='desmume' PACKAGE_TARNAME='desmume' PACKAGE_VERSION='0.9.9' PACKAGE_STRING='desmume 0.9.9' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS USE_MAINTAINER_MODE MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE HAVE_GDB_STUB_FALSE HAVE_GDB_STUB_TRUE PO_DIR UI_DIR X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF HAVE_JIT_FALSE HAVE_JIT_TRUE MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES CATOBJEXT CATALOGS MSGFMT_OPTS GETTEXT_PACKAGE HAVE_WX_FALSE HAVE_WX_TRUE WX_RESCOMP WX_VERSION WX_LIBS_STATIC WX_LIBS WX_CXXFLAGS_ONLY WX_CFLAGS_ONLY WX_CXXFLAGS WX_CFLAGS WX_CPPFLAGS WX_CONFIG_PATH HAVE_LIBSOUNDTOUCH_FALSE HAVE_LIBSOUNDTOUCH_TRUE LIBSOUNDTOUCH_LIBS LIBSOUNDTOUCH_CFLAGS HAVE_LIBAGG_FALSE HAVE_LIBAGG_TRUE LIBAGG_LIBS LIBAGG_CFLAGS HAVE_ALSA_FALSE HAVE_ALSA_TRUE ALSA_LIBS ALSA_CFLAGS HAVE_LUA_FALSE HAVE_LUA_TRUE LUA_LIBS LUA_CFLAGS UPDATEDESKTOP GTKGLEXT_LIBS GTKGLEXT_CFLAGS GLADEUI_UNINSTALLED_DIR LIBGLADE_LIBS LIBGLADE_CFLAGS GTHREAD_LIBS GTHREAD_CFLAGS GTK_LIBS GTK_CFLAGS GLIB_LIBS GLIB_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG HAVE_OPENAL_FALSE HAVE_OPENAL_TRUE HAVE_LIBOSMESA_FALSE HAVE_LIBOSMESA_TRUE OSMESA_LIBS HAVE_GL_FALSE HAVE_GL_TRUE SDL_LIBS SDL_CFLAGS SDLCONFIG DATADIRNAME ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE intltool__v_merge_options_0 intltool__v_merge_options_ INTLTOOL_V_MERGE_OPTIONS INTLTOOL__v_MERGE_0 INTLTOOL__v_MERGE_ INTLTOOL_V_MERGE AM_DEFAULT_VERBOSITY INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC RANLIB am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM desmume_arch host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_nls enable_osmesa enable_hud enable_openal enable_glade enable_wxwidgets enable_wifi with_x enable_gdb_stub enable_hardcore enable_debug enable_gpu_debug enable_div_debug enable_sqrt_debug enable_dma_debug enable_maintainer_mode ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GLIB_CFLAGS GLIB_LIBS GTK_CFLAGS GTK_LIBS GTHREAD_CFLAGS GTHREAD_LIBS LIBGLADE_CFLAGS LIBGLADE_LIBS GTKGLEXT_CFLAGS GTKGLEXT_LIBS LUA_CFLAGS LUA_LIBS ALSA_CFLAGS ALSA_LIBS LIBAGG_CFLAGS LIBAGG_LIBS LIBSOUNDTOUCH_CFLAGS LIBSOUNDTOUCH_LIBS XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures desmume 0.9.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/desmume] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of desmume 0.9.9:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-nls do not use Native Language Support --enable-osmesa use off-screen mesa --enable-hud Enable HUD rendering, requires libagg --enable-openal enable experimental OpenAL microphone input --enable-glade enable glade frontend --enable-wxwidgets Enable cross platform wx widgets frontend --enable-wifi enable experimental wifi comm support --enable-gdb-stub enable gdb stub --enable-hardcore turn on -W -Wall -Werror --enable-debug enable debug information --enable-gpu-debug enable gpu debug information --enable-div-debug enable div debug information --enable-sqrt-debug enable sqrt debug information --enable-dma-debug enable dma debug information --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-x use the X Window System Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GTHREAD_CFLAGS C compiler flags for GTHREAD, overriding pkg-config GTHREAD_LIBS linker flags for GTHREAD, overriding pkg-config LIBGLADE_CFLAGS C compiler flags for LIBGLADE, overriding pkg-config LIBGLADE_LIBS linker flags for LIBGLADE, overriding pkg-config GTKGLEXT_CFLAGS C compiler flags for GTKGLEXT, overriding pkg-config GTKGLEXT_LIBS linker flags for GTKGLEXT, overriding pkg-config LUA_CFLAGS C compiler flags for LUA, overriding pkg-config LUA_LIBS linker flags for LUA, overriding pkg-config ALSA_CFLAGS C compiler flags for ALSA, overriding pkg-config ALSA_LIBS linker flags for ALSA, overriding pkg-config LIBAGG_CFLAGS C compiler flags for LIBAGG, overriding pkg-config LIBAGG_LIBS linker flags for LIBAGG, overriding pkg-config LIBSOUNDTOUCH_CFLAGS C compiler flags for LIBSOUNDTOUCH, overriding pkg-config LIBSOUNDTOUCH_LIBS linker flags for LIBSOUNDTOUCH, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF desmume configure 0.9.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by desmume $as_me 0.9.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac case $host in *linux*) desmume_arch=linux;; *mingw*) desmume_arch=windows;; *darwin*) desmume_arch=linux;; *bsd*) desmume_arch=linux;; esac am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='desmume' VERSION='0.9.9' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac # took this from geany, hope it works REVISION="r0" SVN=`which svn 2>/dev/null` if test -d ".svn" -a "x${SVN}" != "x" -a -x "${SVN}" ; then REVISION=r`$SVN info|grep 'Last Changed Rev'|cut -d' ' -f4` fi cat >>confdefs.h <<_ACEOF #define SVN_REV "$REVISION" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= " >&5 $as_echo_n "checking for intltool >= ... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzopen in -lz" >&5 $as_echo_n "checking for gzopen in -lz... " >&6; } if ${ac_cv_lib_z_gzopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzopen (); int main () { return gzopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzopen=yes else ac_cv_lib_z_gzopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzopen" >&5 $as_echo "$ac_cv_lib_z_gzopen" >&6; } if test "x$ac_cv_lib_z_gzopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBZ 1 _ACEOF LIBS="-lz $LIBS" else as_fn_error $? "zlib was not found, we can't go further. Please install it or specify the location where it's installed." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for zzip_open in -lzzip" >&5 $as_echo_n "checking for zzip_open in -lzzip... " >&6; } if ${ac_cv_lib_zzip_zzip_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lzzip $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char zzip_open (); int main () { return zzip_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_zzip_zzip_open=yes else ac_cv_lib_zzip_zzip_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zzip_zzip_open" >&5 $as_echo "$ac_cv_lib_zzip_zzip_open" >&6; } if test "x$ac_cv_lib_zzip_zzip_open" = xyes; then : LIBS="-lzzip $LIBS" $as_echo "#define HAVE_LIBZZIP 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether zzip use void * as second parameter" >&5 $as_echo_n "checking whether zzip use void * as second parameter... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { void * v; zzip_read(NULL, v, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "#define ZZIP_OLD_READ 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi for ac_prog in sdl-config sdl11-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SDLCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $SDLCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDLCONFIG="$SDLCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SDLCONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi SDLCONFIG=$ac_cv_path_SDLCONFIG if test -n "$SDLCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDLCONFIG" >&5 $as_echo "$SDLCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$SDLCONFIG" && break done if test ! "x$SDLCONFIG" = "x" ; then SDL_CFLAGS=`$SDLCONFIG --cflags` SDL_LIBS=`$SDLCONFIG --libs` else as_fn_error $? "sdl is required to build desmume" "$LINENO" 5 fi for ac_header in GL/gl.h do : ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" if test "x$ac_cv_header_GL_gl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GL_H 1 _ACEOF for ac_header in GL/glu.h do : ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default" if test "x$ac_cv_header_GL_glu_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GLU_H 1 _ACEOF have_gl_h=yes LIBS="$LIBS -lGLU" else have_gl_h=no fi done else have_gl_h=no fi done if test "have_gl_h" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building without GL support because of missing headers." >&5 $as_echo "$as_me: WARNING: Building without GL support because of missing headers." >&2;} fi if test "${have_gl_h}" = "yes"; then HAVE_GL_TRUE= HAVE_GL_FALSE='#' else HAVE_GL_TRUE='#' HAVE_GL_FALSE= fi # Check whether --enable-osmesa was given. if test "${enable_osmesa+set}" = set; then : enableval=$enable_osmesa; osmesa=$enableval else osmesa=yes fi if test "x$osmesa" = "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ldl" >&5 $as_echo_n "checking for main in -ldl... " >&6; } if ${ac_cv_lib_dl_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_main=yes else ac_cv_lib_dl_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_main" >&5 $as_echo "$ac_cv_lib_dl_main" >&6; } if test "x$ac_cv_lib_dl_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lGL" >&5 $as_echo_n "checking for main in -lGL... " >&6; } if ${ac_cv_lib_GL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GL_main=yes else ac_cv_lib_GL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_main" >&5 $as_echo "$ac_cv_lib_GL_main" >&6; } if test "x$ac_cv_lib_GL_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGL 1 _ACEOF LIBS="-lGL $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lOSMesa" >&5 $as_echo_n "checking for main in -lOSMesa... " >&6; } if ${ac_cv_lib_OSMesa_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lOSMesa $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_OSMesa_main=yes else ac_cv_lib_OSMesa_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OSMesa_main" >&5 $as_echo "$ac_cv_lib_OSMesa_main" >&6; } if test "x$ac_cv_lib_OSMesa_main" = xyes; then : useosmesa=yes $as_echo "#define HAVE_LIBOSMESA 1" >>confdefs.h OSMESA_LIBS="-lOSMesa" fi fi if test "${useosmesa}" = "yes"; then HAVE_LIBOSMESA_TRUE= HAVE_LIBOSMESA_FALSE='#' else HAVE_LIBOSMESA_TRUE='#' HAVE_LIBOSMESA_FALSE= fi # Check whether --enable-hud was given. if test "${enable_hud+set}" = set; then : enableval=$enable_hud; libagg=yes fi HAVE_OPENAL=no # Check whether --enable-openal was given. if test "${enable_openal+set}" = set; then : enableval=$enable_openal; openal=yes fi if test "x$openal" = "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lopenal" >&5 $as_echo_n "checking for main in -lopenal... " >&6; } if ${ac_cv_lib_openal_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lopenal $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_openal_main=yes else ac_cv_lib_openal_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openal_main" >&5 $as_echo "$ac_cv_lib_openal_main" >&6; } if test "x$ac_cv_lib_openal_main" = xyes; then : HAVE_OPENAL=yes LIBS="$LIBS -lopenal" fi fi if test "${HAVE_OPENAL}" = "yes"; then HAVE_OPENAL_TRUE= HAVE_OPENAL_FALSE='#' else HAVE_OPENAL_TRUE='#' HAVE_OPENAL_FALSE= fi FOUND_GLIB=no HAVE_ALSA=no GLIB_VER=2.8 GTK_VER=2.14 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_VER\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_VER") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_VER" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_VER\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_VER") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_VER" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= $GLIB_VER" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= $GLIB_VER" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 FOUND_GLIB=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } FOUND_GLIB=no else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } FOUND_GLIB=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= \$GTK_VER\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= $GTK_VER") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= $GTK_VER" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= \$GTK_VER\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= $GTK_VER") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= $GTK_VER" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= $GTK_VER" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= $GTK_VER" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 HAVE_GTK=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GTK=no else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GTK=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTHREAD" >&5 $as_echo_n "checking for GTHREAD... " >&6; } if test -n "$GTHREAD_CFLAGS"; then pkg_cv_GTHREAD_CFLAGS="$GTHREAD_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gthread-2.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""gthread-2.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTHREAD_CFLAGS=`$PKG_CONFIG --cflags ""gthread-2.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTHREAD_LIBS"; then pkg_cv_GTHREAD_LIBS="$GTHREAD_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gthread-2.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""gthread-2.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTHREAD_LIBS=`$PKG_CONFIG --libs ""gthread-2.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTHREAD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs ""gthread-2.0"" 2>&1` else GTHREAD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs ""gthread-2.0"" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTHREAD_PKG_ERRORS" >&5 HAVE_GTHREAD=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GTHREAD=no else GTHREAD_CFLAGS=$pkg_cv_GTHREAD_CFLAGS GTHREAD_LIBS=$pkg_cv_GTHREAD_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GTHREAD=yes fi # Check whether --enable-glade was given. if test "${enable_glade+set}" = set; then : enableval=$enable_glade; glade=$enableval else glade=no fi if test "x$glade" = "xyes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGLADE" >&5 $as_echo_n "checking for LIBGLADE... " >&6; } if test -n "$LIBGLADE_CFLAGS"; then pkg_cv_LIBGLADE_CFLAGS="$LIBGLADE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"libglade-2.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""libglade-2.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGLADE_CFLAGS=`$PKG_CONFIG --cflags ""libglade-2.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBGLADE_LIBS"; then pkg_cv_LIBGLADE_LIBS="$LIBGLADE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"libglade-2.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""libglade-2.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGLADE_LIBS=`$PKG_CONFIG --libs ""libglade-2.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBGLADE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs ""libglade-2.0"" 2>&1` else LIBGLADE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs ""libglade-2.0"" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBGLADE_PKG_ERRORS" >&5 HAVE_LIBGLADE=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBGLADE=no else LIBGLADE_CFLAGS=$pkg_cv_LIBGLADE_CFLAGS LIBGLADE_LIBS=$pkg_cv_LIBGLADE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBGLADE=yes fi cat >>confdefs.h <<_ACEOF #define GLADEUI_UNINSTALLED_DIR "`pwd`/src/gtk-glade/glade/" _ACEOF pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKGLEXT" >&5 $as_echo_n "checking for GTKGLEXT... " >&6; } if test -n "$GTKGLEXT_CFLAGS"; then pkg_cv_GTKGLEXT_CFLAGS="$GTKGLEXT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gtkglext-1.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""gtkglext-1.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKGLEXT_CFLAGS=`$PKG_CONFIG --cflags ""gtkglext-1.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKGLEXT_LIBS"; then pkg_cv_GTKGLEXT_LIBS="$GTKGLEXT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gtkglext-1.0\"\""; } >&5 ($PKG_CONFIG --exists --print-errors ""gtkglext-1.0"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKGLEXT_LIBS=`$PKG_CONFIG --libs ""gtkglext-1.0"" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKGLEXT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs ""gtkglext-1.0"" 2>&1` else GTKGLEXT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs ""gtkglext-1.0"" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKGLEXT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (\"gtkglext-1.0\") were not met: $GTKGLEXT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTKGLEXT_CFLAGS and GTKGLEXT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTKGLEXT_CFLAGS and GTKGLEXT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTKGLEXT_CFLAGS=$pkg_cv_GTKGLEXT_CFLAGS GTKGLEXT_LIBS=$pkg_cv_GTKGLEXT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GTKGLEXT_AVAILABLE 1" >>confdefs.h fi fi # Extract the first word of "update-desktop-database", so it can be a program name with args. set dummy update-desktop-database; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_UPDATEDESKTOP+:} false; then : $as_echo_n "(cached) " >&6 else case $UPDATEDESKTOP in [\\/]* | ?:[\\/]*) ac_cv_path_UPDATEDESKTOP="$UPDATEDESKTOP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_UPDATEDESKTOP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi UPDATEDESKTOP=$ac_cv_path_UPDATEDESKTOP if test -n "$UPDATEDESKTOP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UPDATEDESKTOP" >&5 $as_echo "$UPDATEDESKTOP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Need check for both lua and lua5.1 to run on debian, see mysql bug #29945 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua >= 5.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua >= 5.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua >= 5.1" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua >= 5.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 HAVE_LUA=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LUA=no else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LUA=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua5.1 >= 5.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua5.1 >= 5.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua5.1 >= 5.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua5.1 >= 5.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua5.1 >= 5.1" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua5.1 >= 5.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 HAVE_LUA=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LUA=no else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LUA=yes fi if test "${HAVE_LUA}x" = "yes"; then HAVE_LUA_TRUE= HAVE_LUA_FALSE='#' else HAVE_LUA_TRUE='#' HAVE_LUA_FALSE= fi if test ! "x$HAVE_OPENAL" = "xyes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA" >&5 $as_echo_n "checking for ALSA... " >&6; } if test -n "$ALSA_CFLAGS"; then pkg_cv_ALSA_CFLAGS="$ALSA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ALSA_CFLAGS=`$PKG_CONFIG --cflags "alsa >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$ALSA_LIBS"; then pkg_cv_ALSA_LIBS="$ALSA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ALSA_LIBS=`$PKG_CONFIG --libs "alsa >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ALSA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "alsa >= 1.0" 2>&1` else ALSA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "alsa >= 1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ALSA_PKG_ERRORS" >&5 HAVE_ALSA=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_ALSA=no else ALSA_CFLAGS=$pkg_cv_ALSA_CFLAGS ALSA_LIBS=$pkg_cv_ALSA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_ALSA=yes fi fi if test "${HAVE_ALSA}" = "yes"; then HAVE_ALSA_TRUE= HAVE_ALSA_FALSE='#' else HAVE_ALSA_TRUE='#' HAVE_ALSA_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBAGG" >&5 $as_echo_n "checking for LIBAGG... " >&6; } if test -n "$LIBAGG_CFLAGS"; then pkg_cv_LIBAGG_CFLAGS="$LIBAGG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libagg >= 2.5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libagg >= 2.5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBAGG_CFLAGS=`$PKG_CONFIG --cflags "libagg >= 2.5.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBAGG_LIBS"; then pkg_cv_LIBAGG_LIBS="$LIBAGG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libagg >= 2.5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libagg >= 2.5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBAGG_LIBS=`$PKG_CONFIG --libs "libagg >= 2.5.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBAGG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libagg >= 2.5.0" 2>&1` else LIBAGG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libagg >= 2.5.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBAGG_PKG_ERRORS" >&5 FOUND_LIBAGG=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } FOUND_LIBAGG=no else LIBAGG_CFLAGS=$pkg_cv_LIBAGG_CFLAGS LIBAGG_LIBS=$pkg_cv_LIBAGG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } FOUND_LIBAGG=yes fi if test "x$libagg" = "xyes" -a "${FOUND_LIBAGG}" = "yes"; then HAVE_LIBAGG_TRUE= HAVE_LIBAGG_FALSE='#' else HAVE_LIBAGG_TRUE='#' HAVE_LIBAGG_FALSE= fi if test "x$libagg" = "xyes" ; then if test "x$FOUND_LIBAGG" = "xyes" ; then $as_echo "#define HAVE_LIBAGG 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: HUD rendering enabled, but libagg not found" >&5 $as_echo "$as_me: WARNING: HUD rendering enabled, but libagg not found" >&2;} fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBSOUNDTOUCH" >&5 $as_echo_n "checking for LIBSOUNDTOUCH... " >&6; } if test -n "$LIBSOUNDTOUCH_CFLAGS"; then pkg_cv_LIBSOUNDTOUCH_CFLAGS="$LIBSOUNDTOUCH_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch >= 1.5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "soundtouch >= 1.5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch >= 1.5.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBSOUNDTOUCH_LIBS"; then pkg_cv_LIBSOUNDTOUCH_LIBS="$LIBSOUNDTOUCH_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch >= 1.5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "soundtouch >= 1.5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch >= 1.5.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBSOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "soundtouch >= 1.5.0" 2>&1` else LIBSOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "soundtouch >= 1.5.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBSOUNDTOUCH_PKG_ERRORS" >&5 HAVE_LIBSOUNDTOUCH=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBSOUNDTOUCH=no else LIBSOUNDTOUCH_CFLAGS=$pkg_cv_LIBSOUNDTOUCH_CFLAGS LIBSOUNDTOUCH_LIBS=$pkg_cv_LIBSOUNDTOUCH_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBSOUNDTOUCH=yes fi if test "${HAVE_LIBSOUNDTOUCH}" = "yes"; then HAVE_LIBSOUNDTOUCH_TRUE= HAVE_LIBSOUNDTOUCH_FALSE='#' else HAVE_LIBSOUNDTOUCH_TRUE='#' HAVE_LIBSOUNDTOUCH_FALSE= fi if test "x$HAVE_LIBSOUNDTOUCH" = "xyes"; then $as_echo "#define HAVE_LIBSOUNDTOUCH 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SoundTouch library not found, pcsx2 resampler will be disabled" >&5 $as_echo "$as_me: WARNING: SoundTouch library not found, pcsx2 resampler will be disabled" >&2;} fi if test "x$HAVE_ALSA" = "xno"; then if test "x$HAVE_OPENAL" = "xno"; then $as_echo "#define FAKE_MIC 1" >>confdefs.h fi fi # Check whether --enable-wxwidgets was given. if test "${enable_wxwidgets+set}" = set; then : enableval=$enable_wxwidgets; wxwidgets=$enableval else wxwidgets=no fi if test "x$wxwidgets" = "xyes" ; then if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi if test -x "$WX_CONFIG_NAME" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5 $as_echo_n "checking for wx-config... " >&6; } WX_CONFIG_PATH="$WX_CONFIG_NAME" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. set dummy $WX_CONFIG_NAME; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WX_CONFIG_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy=""$WX_LOOKUP_PATH:$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" ;; esac fi WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH if test -n "$WX_CONFIG_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=2.4.0 if test -z "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version ()... " >&6; } fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args " WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $wx_requested_major_version; then wx_ver_ok=yes else if test $wx_config_major_version -eq $wx_requested_major_version; then if test $wx_config_minor_version -gt $wx_requested_minor_version; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $wx_requested_minor_version; then if test $wx_config_micro_version -ge $wx_requested_micro_version; then wx_ver_ok=yes fi fi fi fi fi fi if test -n "$wx_ver_ok"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5 $as_echo "yes (version $WX_VERSION)" >&6; } WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5 $as_echo_n "checking for wxWidgets static library... " >&6; } WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi wxwin=yes else if test "x$WX_VERSION" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5 $as_echo "no (version $WX_VERSION is not new enough)" >&6; } fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi if test "x$wxwin" = "xyes"; then $as_echo "#define WANT_WX 1" >>confdefs.h fi fi if test "x$wxwidgets" = "xyes"; then HAVE_WX_TRUE= HAVE_WX_FALSE='#' else HAVE_WX_TRUE='#' HAVE_WX_FALSE= fi PO_DIR="po" PO_MAKEFILE="po/Makefile.in" UI_DIR="cli $UI_DIR" if test "x$HAVE_GTK" = "xyes"; then UI_DIR="gtk $UI_DIR" fi if test "x$wxwin" = "xyes"; then UI_DIR="wx $UI_DIR" fi if test "x$HAVE_LIBGLADE" = "xyes"; then UI_DIR="gtk-glade $UI_DIR" GETTEXT_PACKAGE=desmume cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF ALL_LINGUAS="fr nb pt_BR sv zh_CN zh_TW" for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if ${gt_cv_func_ngettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if ${gt_cv_func_dgettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if ${ac_cv_lib_intl_bindtextdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dcgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES fi case $host_cpu in x86|x86_64|i386|i486|i586|i686) HAVE_JIT=yes $as_echo "#define HAVE_JIT 1" >>confdefs.h ;; esac if test "x$HAVE_JIT" = "xyes"; then HAVE_JIT_TRUE= HAVE_JIT_FALSE='#' else HAVE_JIT_TRUE='#' HAVE_JIT_FALSE= fi # Check whether --enable-wifi was given. if test "${enable_wifi+set}" = set; then : enableval=$enable_wifi; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpcap" >&5 $as_echo_n "checking for main in -lpcap... " >&6; } if ${ac_cv_lib_pcap_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pcap_main=yes else ac_cv_lib_pcap_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcap_main" >&5 $as_echo "$ac_cv_lib_pcap_main" >&6; } if test "x$ac_cv_lib_pcap_main" = xyes; then : $as_echo "#define EXPERIMENTAL_WIFI_COMM 1" >>confdefs.h LIBS="$LIBS -lpcap" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pcap library not found, wifi will not work" >&5 $as_echo "$as_me: WARNING: pcap library not found, wifi will not work" >&2;} fi fi case $host in *mingw*) LIBS="$LIBS -ldxguid -ldxerr8 -ldsound -lopengl32 -lws2_32 -mwindows" UI_DIR="windows" ;; *darwin*) $as_echo "#define HAVE_OPENAL 1" >>confdefs.h LIBS="$LIBS -framework OpenGL -framework OpenAL" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/OpenAL.framework/Headers" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi ;; esac # Check whether --enable-gdb-stub was given. if test "${enable_gdb_stub+set}" = set; then : enableval=$enable_gdb_stub; $as_echo "#define GDB_STUB 1" >>confdefs.h wantgdbstub=yes fi if test "${wantgdbstub}" = "yes"; then HAVE_GDB_STUB_TRUE= HAVE_GDB_STUB_FALSE='#' else HAVE_GDB_STUB_TRUE='#' HAVE_GDB_STUB_FALSE= fi # for developer use, enable lots of compile warnings, # but don't require this generally, because some system's # header files (BSD) can't handle it # # NB: must add -Werror after AC_PROG_CC, etc., so do this last # Check whether --enable-hardcore was given. if test "${enable_hardcore+set}" = set; then : enableval=$enable_hardcore; case "${enableval}" in yes) ENABLE_HARDCORE=1 ;; no) ENABLE_HARDCORE=0 ;; *) as_fn_error $? "bad value ${enableval} for --enable-hardcore" "$LINENO" 5 ;; esac else ENABLE_HARDCORE=0 fi if test "x$ENABLE_HARDCORE" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: enable hardcore compile warnings" >&5 $as_echo "$as_me: WARNING: enable hardcore compile warnings" >&2;} if test "x$CXX" = "x"; then CPPFLAGS="$CPPFLAGS -Wmissing-prototypes" fi CPPFLAGS="$CPPFLAGS -Wall -Wextra -D_FORTIFY_SOURCE=2 -Wno-missing-field-initializers -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-unused-parameter -Wmissing-declarations -Wundef -Wmissing-noreturn -Wredundant-decls -Wformat-nonliteral -Wformat-security -Winit-self -Wno-reorder" fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; $as_echo "#define DEBUG 1" >>confdefs.h fi # Check whether --enable-gpu-debug was given. if test "${enable_gpu_debug+set}" = set; then : enableval=$enable_gpu_debug; $as_echo "#define GPUDEBUG 1" >>confdefs.h fi # Check whether --enable-div-debug was given. if test "${enable_div_debug+set}" = set; then : enableval=$enable_div_debug; $as_echo "#define DIVDEBUG 1" >>confdefs.h fi # Check whether --enable-sqrt-debug was given. if test "${enable_sqrt_debug+set}" = set; then : enableval=$enable_sqrt_debug; $as_echo "#define SQRTDEBUG 1" >>confdefs.h fi # Check whether --enable-dma-debug was given. if test "${enable_dma_debug+set}" = set; then : enableval=$enable_dma_debug; $as_echo "#define DMADEBUG 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_files="$ac_config_files Makefile ${PO_MAKEFILE} src/Makefile src/cli/Makefile src/cli/doc/Makefile src/gtk/Makefile src/gtk/doc/Makefile src/gtk-glade/Makefile src/gtk-glade/doc/Makefile src/wx/Makefile src/gdbstub/Makefile autopackage/default.apspec" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${HAVE_GL_TRUE}" && test -z "${HAVE_GL_FALSE}"; then as_fn_error $? "conditional \"HAVE_GL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBOSMESA_TRUE}" && test -z "${HAVE_LIBOSMESA_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBOSMESA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_OPENAL_TRUE}" && test -z "${HAVE_OPENAL_FALSE}"; then as_fn_error $? "conditional \"HAVE_OPENAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LUA_TRUE}" && test -z "${HAVE_LUA_FALSE}"; then as_fn_error $? "conditional \"HAVE_LUA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ALSA_TRUE}" && test -z "${HAVE_ALSA_FALSE}"; then as_fn_error $? "conditional \"HAVE_ALSA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBAGG_TRUE}" && test -z "${HAVE_LIBAGG_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBAGG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBSOUNDTOUCH_TRUE}" && test -z "${HAVE_LIBSOUNDTOUCH_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBSOUNDTOUCH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_WX_TRUE}" && test -z "${HAVE_WX_FALSE}"; then as_fn_error $? "conditional \"HAVE_WX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_JIT_TRUE}" && test -z "${HAVE_JIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_JIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GDB_STUB_TRUE}" && test -z "${HAVE_GDB_STUB_FALSE}"; then as_fn_error $? "conditional \"HAVE_GDB_STUB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by desmume $as_me 0.9.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ desmume config.status 0.9.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "${PO_MAKEFILE}") CONFIG_FILES="$CONFIG_FILES ${PO_MAKEFILE}" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/cli/Makefile") CONFIG_FILES="$CONFIG_FILES src/cli/Makefile" ;; "src/cli/doc/Makefile") CONFIG_FILES="$CONFIG_FILES src/cli/doc/Makefile" ;; "src/gtk/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk/Makefile" ;; "src/gtk/doc/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk/doc/Makefile" ;; "src/gtk-glade/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk-glade/Makefile" ;; "src/gtk-glade/doc/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk-glade/doc/Makefile" ;; "src/wx/Makefile") CONFIG_FILES="$CONFIG_FILES src/wx/Makefile" ;; "src/gdbstub/Makefile") CONFIG_FILES="$CONFIG_FILES src/gdbstub/Makefile" ;; "autopackage/default.apspec") CONFIG_FILES="$CONFIG_FILES autopackage/default.apspec" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi desmume-0.9.9/configure.ac0000644000175000017500000002561612140304266016220 0ustar guillaumeguillaumednl --- Package name is first argument to AC_INIT dnl --- Release version is second argument to AC_INIT AC_INIT(desmume, [0.9.9]) dnl -- find host architecture for some os specific libraries AC_CANONICAL_HOST case $host in *linux*) desmume_arch=linux;; *mingw*) desmume_arch=windows;; *darwin*) desmume_arch=linux;; *bsd*) desmume_arch=linux;; esac AC_SUBST(desmume_arch) AM_INIT_AUTOMAKE([1.10]) dnl -- make sure we have a c++ compiler AC_PROG_CXX dnl -- use ranlib for libraries AC_PROG_RANLIB dnl -- check for endianess AC_C_BIGENDIAN # took this from geany, hope it works REVISION="r0" SVN=`which svn 2>/dev/null` if test -d ".svn" -a "x${SVN}" != "x" -a -x "${SVN}" ; then REVISION=r`$SVN info|grep 'Last Changed Rev'|cut -d' ' -f4` fi AC_DEFINE_UNQUOTED([SVN_REV], "$REVISION", [subversion revision number]) dnl - Check for intltool/gettext macros IT_PROG_INTLTOOL dnl - Check for zlib AC_CHECK_LIB(z, gzopen, [], [AC_MSG_ERROR([zlib was not found, we can't go further. Please install it or specify the location where it's installed.])]) dnl - Check for zziplib AC_CHECK_LIB(zzip, zzip_open, [ LIBS="-lzzip $LIBS" AC_DEFINE([HAVE_LIBZZIP]) AC_MSG_CHECKING([[whether zzip use void * as second parameter]]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ void * v; zzip_read(NULL, v, 0);]])], AC_MSG_RESULT(yes), AC_DEFINE([ZZIP_OLD_READ]) AC_MSG_RESULT(no)) ]) dnl - Check for SDL AC_PATH_PROGS(SDLCONFIG, [sdl-config sdl11-config]) if test ! "x$SDLCONFIG" = "x" ; then SDL_CFLAGS=`$SDLCONFIG --cflags` SDL_LIBS=`$SDLCONFIG --libs` AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) else AC_MSG_ERROR([sdl is required to build desmume]) fi dnl - Check for the OpenGL includes AC_CHECK_HEADERS([GL/gl.h], [AC_CHECK_HEADERS([GL/glu.h], [have_gl_h=yes LIBS="$LIBS -lGLU"], [have_gl_h=no])], [have_gl_h=no]) if test "have_gl_h" = "no" ; then AC_MSG_WARN([Building without GL support because of missing headers.]) fi AM_CONDITIONAL([HAVE_GL], [test "${have_gl_h}" = "yes"]) dnl - if --enable-osmesa is used, check for it AC_ARG_ENABLE([osmesa], [AC_HELP_STRING([--enable-osmesa], [use off-screen mesa])], [osmesa=$enableval], [osmesa=yes]) if test "x$osmesa" = "xyes" ; then AC_CHECK_LIB(dl, main) AC_CHECK_LIB([GL], main) AC_CHECK_LIB(OSMesa, main,[ useosmesa=yes AC_DEFINE(HAVE_LIBOSMESA) OSMESA_LIBS="-lOSMesa" AC_SUBST(OSMESA_LIBS) ]) fi AM_CONDITIONAL([HAVE_LIBOSMESA], [test "${useosmesa}" = "yes"]) dnl - make the usage of libagg for HUD rendering configurable AC_ARG_ENABLE([hud], [AC_HELP_STRING([--enable-hud], [Enable HUD rendering, requires libagg])], [libagg=yes]) HAVE_OPENAL=no dnl - openal support AC_ARG_ENABLE(openal, [AC_HELP_STRING(--enable-openal, enable experimental OpenAL microphone input)], [openal=yes]) if test "x$openal" = "xyes" ; then AC_CHECK_LIB([openal], [main],[ HAVE_OPENAL=yes LIBS="$LIBS -lopenal" ]) fi AM_CONDITIONAL([HAVE_OPENAL], [test "${HAVE_OPENAL}" = "yes"]) dnl - Check for GTK and/or libglade FOUND_GLIB=no HAVE_ALSA=no GLIB_VER=2.8 GTK_VER=2.14 PKG_CHECK_MODULES(GLIB, glib-2.0 >= $GLIB_VER, FOUND_GLIB=yes, FOUND_GLIB=no) PKG_CHECK_MODULES(GTK, gtk+-2.0 >= $GTK_VER, HAVE_GTK=yes, HAVE_GTK=no) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) PKG_CHECK_MODULES(GTHREAD, "gthread-2.0", HAVE_GTHREAD=yes, HAVE_GTHREAD=no) AC_SUBST(GTHREAD_CFLAGS) AC_SUBST(GTHREAD_LIBS) AC_ARG_ENABLE([glade], [AC_HELP_STRING([--enable-glade], [enable glade frontend])], [glade=$enableval], [glade=no]) if test "x$glade" = "xyes" ; then PKG_CHECK_MODULES(LIBGLADE, "libglade-2.0", HAVE_LIBGLADE=yes, HAVE_LIBGLADE=no) AC_SUBST(LIBGLADE_CFLAGS) AC_SUBST(LIBGLADE_LIBS) dnl uninstalled glade ui dir AC_DEFINE_UNQUOTED(GLADEUI_UNINSTALLED_DIR,"`pwd`/src/gtk-glade/glade/",[path to glade ui dir]) AC_SUBST(GLADEUI_UNINSTALLED_DIR) PKG_CHECK_MODULES(GTKGLEXT, "gtkglext-1.0", AC_DEFINE([GTKGLEXT_AVAILABLE], [1]) []) AC_SUBST(GTKGLEXT_CFLAGS) AC_SUBST(GTKGLEXT_LIBS) fi AC_PATH_PROG(UPDATEDESKTOP, [update-desktop-database]) # Need check for both lua and lua5.1 to run on debian, see mysql bug #29945 PKG_CHECK_MODULES(LUA, lua >= 5.1, HAVE_LUA=yes, HAVE_LUA=no) PKG_CHECK_MODULES(LUA, lua5.1 >= 5.1, HAVE_LUA=yes, HAVE_LUA=no) AC_SUBST(LUA_CFLAGS) AC_SUBST(LUA_LIBS) dnl -- force lua disabled AM_CONDITIONAL([HAVE_LUA], [test "${HAVE_LUA}x" = "yes"]) if test ! "x$HAVE_OPENAL" = "xyes" ; then PKG_CHECK_MODULES(ALSA, alsa >= 1.0, HAVE_ALSA=yes, HAVE_ALSA=no) AC_SUBST(ALSA_CFLAGS) AC_SUBST(ALSA_LIBS) fi AM_CONDITIONAL([HAVE_ALSA], [test "${HAVE_ALSA}" = "yes"]) PKG_CHECK_MODULES(LIBAGG, libagg >= 2.5.0, FOUND_LIBAGG=yes, FOUND_LIBAGG=no) AM_CONDITIONAL([HAVE_LIBAGG], [test "x$libagg" = "xyes" -a "${FOUND_LIBAGG}" = "yes"]) if test "x$libagg" = "xyes" ; then if test "x$FOUND_LIBAGG" = "xyes" ; then AC_SUBST(LIBAGG_CFLAGS) AC_SUBST(LIBAGG_LIBS) AC_DEFINE([HAVE_LIBAGG]) else AC_MSG_WARN([HUD rendering enabled, but libagg not found]) fi fi PKG_CHECK_MODULES(LIBSOUNDTOUCH, soundtouch >= 1.5.0, HAVE_LIBSOUNDTOUCH=yes, HAVE_LIBSOUNDTOUCH=no) AC_SUBST(LIBSOUNDTOUCH_CFLAGS) AC_SUBST(LIBSOUNDTOUCH_LIBS) AM_CONDITIONAL([HAVE_LIBSOUNDTOUCH], [test "${HAVE_LIBSOUNDTOUCH}" = "yes"]) if test "x$HAVE_LIBSOUNDTOUCH" = "xyes"; then AC_DEFINE([HAVE_LIBSOUNDTOUCH]) else AC_MSG_WARN([SoundTouch library not found, pcsx2 resampler will be disabled]) fi if test "x$HAVE_ALSA" = "xno"; then if test "x$HAVE_OPENAL" = "xno"; then AC_DEFINE([FAKE_MIC]) fi fi dnl - Check for wxWidgets dnl - if --enable-wxwidgets is used, check for it AC_ARG_ENABLE([wxwidgets], [AC_HELP_STRING([--enable-wxwidgets], [Enable cross platform wx widgets frontend])], [wxwidgets=$enableval], [wxwidgets=no]) if test "x$wxwidgets" = "xyes" ; then m4_include(wxwin.m4) AM_PATH_WXCONFIG([2.4.0], wxwin=yes) if test "x$wxwin" = "xyes"; then AC_SUBST(WX_CPPFLAGS) AC_SUBST(WX_LIBS) AC_DEFINE([WANT_WX]) fi fi AM_CONDITIONAL([HAVE_WX], [test "x$wxwidgets" = "xyes"]) dnl - Determine which UIs to build and if po/ should be included PO_DIR="po" PO_MAKEFILE="po/Makefile.in" UI_DIR="cli $UI_DIR" if test "x$HAVE_GTK" = "xyes"; then UI_DIR="gtk $UI_DIR" fi if test "x$wxwin" = "xyes"; then UI_DIR="wx $UI_DIR" fi if test "x$HAVE_LIBGLADE" = "xyes"; then UI_DIR="gtk-glade $UI_DIR" dnl -- localization for gtk-glade UI GETTEXT_PACKAGE=desmume AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Define to the gettext package name]) AC_SUBST(GETTEXT_PACKAGE) ALL_LINGUAS="fr nb pt_BR sv zh_CN zh_TW" AM_GLIB_GNU_GETTEXT fi dnl - jit support case $host_cpu in x86|x86_64|i386|i486|i586|i686) HAVE_JIT=yes AC_DEFINE(HAVE_JIT) ;; esac AM_CONDITIONAL([HAVE_JIT], [test "x$HAVE_JIT" = "xyes"]) dnl - wifi support AC_ARG_ENABLE(wifi, [AC_HELP_STRING(--enable-wifi, enable experimental wifi comm support)], [ AC_CHECK_LIB(pcap, main,[ AC_DEFINE(EXPERIMENTAL_WIFI_COMM) LIBS="$LIBS -lpcap"], [AC_MSG_WARN([pcap library not found, wifi will not work])]) ]) dnl Set compiler library flags per host architecture case $host in *mingw*) LIBS="$LIBS -ldxguid -ldxerr8 -ldsound -lopengl32 -lws2_32 -mwindows" UI_DIR="windows" ;; *darwin*) dnl - openal is required on mac os x and we are not able to figure out if it's installed or not AC_DEFINE(HAVE_OPENAL) LIBS="$LIBS -framework OpenGL -framework OpenAL" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/OpenAL.framework/Headers" AC_SUBST(CPPFLAGS) dnl - extra hackery needed for X includes AC_PATH_XTRA ;; esac AC_SUBST(UI_DIR) AC_SUBST(PO_DIR) dnl - Gdb stub AC_ARG_ENABLE(gdb-stub, [AC_HELP_STRING(--enable-gdb-stub, enable gdb stub)], [ AC_DEFINE(GDB_STUB) wantgdbstub=yes ]) AM_CONDITIONAL([HAVE_GDB_STUB], [test "${wantgdbstub}" = "yes"]) dnl - Compiler warnings # for developer use, enable lots of compile warnings, # but don't require this generally, because some system's # header files (BSD) can't handle it # # NB: must add -Werror after AC_PROG_CC, etc., so do this last AC_ARG_ENABLE(hardcore, [AC_HELP_STRING(--enable-hardcore, turn on -W -Wall -Werror)], [case "${enableval}" in yes) ENABLE_HARDCORE=1 ;; no) ENABLE_HARDCORE=0 ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-hardcore) ;; esac], [ENABLE_HARDCORE=0]) if test "x[$]ENABLE_HARDCORE" = "x1"; then AC_MSG_WARN(enable hardcore compile warnings) if test "x$CXX" = "x"; then dnl - only valid for C with newer gcc's CPPFLAGS="[$]CPPFLAGS -Wmissing-prototypes" fi dnl - -Wshadow CPPFLAGS="[$]CPPFLAGS -Wall -Wextra -D_FORTIFY_SOURCE=2 -Wno-missing-field-initializers -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-unused-parameter -Wmissing-declarations -Wundef -Wmissing-noreturn -Wredundant-decls -Wformat-nonliteral -Wformat-security -Winit-self -Wno-reorder" fi dnl - Enable debug mode AC_ARG_ENABLE(debug, AC_HELP_STRING(--enable-debug, enable debug information), AC_DEFINE(DEBUG)) AC_ARG_ENABLE(gpu-debug, AC_HELP_STRING(--enable-gpu-debug, enable gpu debug information), AC_DEFINE(GPUDEBUG)) AC_ARG_ENABLE(div-debug, AC_HELP_STRING(--enable-div-debug, enable div debug information), AC_DEFINE(DIVDEBUG)) AC_ARG_ENABLE(sqrt-debug, AC_HELP_STRING(--enable-sqrt-debug, enable sqrt debug information), AC_DEFINE(SQRTDEBUG)) AC_ARG_ENABLE(dma-debug, AC_HELP_STRING(--enable-dma-debug, enable dma debug information), AC_DEFINE(DMADEBUG)) dnl - Enable memory profiling (disabled) dnl - AC_ARG_ENABLE(memory-profiling, dnl - AC_HELP_STRING(--enable-memory-profiling, enable memory profiling information), dnl - AC_DEFINE(PROFILE_MEMORY_ACCESS)) dnl -- set maintainer mode AM_MAINTAINER_MODE AC_SUBST(USE_MAINTAINER_MODE) dnl --- Finally, output all the makefiles AC_CONFIG_FILES([Makefile ${PO_MAKEFILE} src/Makefile src/cli/Makefile src/cli/doc/Makefile src/gtk/Makefile src/gtk/doc/Makefile src/gtk-glade/Makefile src/gtk-glade/doc/Makefile src/wx/Makefile src/gdbstub/Makefile autopackage/default.apspec ]) AC_OUTPUT desmume-0.9.9/TODO0000644000175000017500000000000012140261635014400 0ustar guillaumeguillaumedesmume-0.9.9/src/0000755000175000017500000000000012140305320014477 5ustar guillaumeguillaumedesmume-0.9.9/src/debug.cpp0000644000175000017500000003050412140261633016303 0ustar guillaumeguillaume/* Copyright (C) 2006 Guillaume Duhamel Copyright (C) 2006-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "debug.h" #include #include #include #include "MMU.h" #include "armcpu.h" #include "instructions.h" #include "cp15.h" #include "NDSSystem.h" #include "utils/xstring.h" #include "movie.h" #ifdef HAVE_LUA #include "lua-engine.h" #endif armcpu_t* TDebugEventData::cpu() { return procnum==0?&NDS_ARM9:&NDS_ARM7; } TDebugEventData DebugEventData; u32 debugFlag; //DEBUG CONFIGURATION const bool debug_acl = false; const bool debug_cacheMiss = false; static bool acl_check_access(u32 adr, u32 access) { //non-user modes get separate access handling, so check that here if(NDS_ARM9.CPSR.bits.mode != USR) access |= 1; if (cp15.isAccessAllowed(adr,access)==FALSE) { HandleDebugEvent(DEBUG_EVENT_ACL_EXCEPTION); } return true; } void HandleDebugEvent_ACL_Exception() { printf("ACL EXCEPTION!\n"); if(DebugEventData.memAccessType == MMU_AT_CODE) armcpu_exception(DebugEventData.cpu(),EXCEPTION_PREFETCH_ABORT); else if(DebugEventData.memAccessType == MMU_AT_DATA) armcpu_exception(DebugEventData.cpu(),EXCEPTION_DATA_ABORT); } static bool CheckRange(u32 adr, u32 min, u32 len) { return (adr>=min && adr static bool debugStatsSort(int num1, int num2) { if(which==0) { if(combinedHits[proc].arm[num2] == combinedHits[proc].arm[num1]) return false; if(combinedHits[proc].arm[num1] == 0xFFFFFFFF) return false; if(combinedHits[proc].arm[num2] == 0xFFFFFFFF) return true; return combinedHits[proc].arm[num2] < combinedHits[proc].arm[num1]; } else { if(combinedHits[proc].thumb[num2] == combinedHits[proc].thumb[num1]) return false; if(combinedHits[proc].thumb[num1] == 0xFFFFFFFF) return false; if(combinedHits[proc].thumb[num2] == 0xFFFFFFFF) return true; return combinedHits[proc].thumb[num2] < combinedHits[proc].thumb[num1]; } } void DebugStatistics::print() { //consolidate opcodes with the same names for(int i=0;i<2;i++) { combinedHits[i] = DEBUG_statistics.instructionHits[i]; for(int j=0;j<4096;j++) { if(combinedHits[i].arm[j] == 0xFFFFFFFF) continue; std::string name = arm_instruction_names[j]; for(int k=j+1;k<4096;k++) { if(combinedHits[i].arm[k] == 0xFFFFFFFF) continue; if(name == arm_instruction_names[k]) { //printf("combining %s with %d and %d\n",name.c_str(),combinedHits[i].arm[j],combinedHits[i].arm[k]); combinedHits[i].arm[j] += combinedHits[i].arm[k]; combinedHits[i].arm[k] = 0xFFFFFFFF; } } } for(int j=0;j<1024;j++) { if(combinedHits[i].thumb[j] == 0xFFFFFFFF) continue; std::string name = thumb_instruction_names[j]; for(int k=j+1;k<1024;k++) { if(combinedHits[i].thumb[k] == 0xFFFFFFFF) continue; if(name == thumb_instruction_names[k]) { //printf("combining %s with %d and %d\n",name.c_str(),combinedHits[i].arm[j],combinedHits[i].arm[k]); combinedHits[i].thumb[j] += combinedHits[i].thumb[k]; combinedHits[i].thumb[k] = 0xFFFFFFFF; } } } } InstructionHits sorts[2]; for(int i=0;i<2;i++) { for(int j=0;j<4096;j++) sorts[i].arm[j] = j; for(int j=0;j<1024;j++) sorts[i].thumb[j] = j; } std::sort(sorts[0].arm, sorts[0].arm+4096, debugStatsSort<0,0>); std::sort(sorts[0].thumb, sorts[0].thumb+1024, debugStatsSort<0,1>); std::sort(sorts[1].arm, sorts[1].arm+4096, debugStatsSort<1,0>); std::sort(sorts[1].thumb, sorts[1].thumb+1024, debugStatsSort<1,1>); for(int i=0;i<2;i++) { printf("Top arm instructions for ARM%d:\n",7+i*2); for(int j=0;j<10;j++) { int val = sorts[i].arm[j]; printf("%08d: %s\n", combinedHits[i].arm[val], arm_instruction_names[val]); } printf("Top thumb instructions for ARM%d:\n",7+i*2); for(int j=0;j<10;j++) { int val = sorts[i].thumb[j]; printf("%08d: %s\n", combinedHits[i].thumb[val], thumb_instruction_names[val]); } } } void DebugStatistics::printSequencerExecutionCounters() { for(int i=0;i<21;i++) printf("%06d ",sequencerExecutionCounters[i]); printf("\n"); } void DEBUG_reset() { //for now, just enable all debugging in developer builds #ifdef DEVELOPER debugFlag = 1; #endif DEBUG_Notify = DebugNotify(); DEBUG_statistics = DebugStatistics(); printf("DEBUG_reset: %08X\n",&DebugStatistics::print); //force a reference to this function } static void DEBUG_dumpMemory_fill(EMUFILE *fp, u32 size) { static std::vector buf; buf.resize(size); memset(&buf[0],0,size); fp->fwrite(&buf[0],size); } void DEBUG_dumpMemory(EMUFILE* fp) { fp->fseek(0x000000,SEEK_SET); fp->fwrite(MMU.MAIN_MEM,0x800000); //arm9 main mem (8192K) fp->fseek(0x900000,SEEK_SET); fp->fwrite(MMU.ARM9_DTCM,0x4000); //arm9 DTCM (16K) fp->fseek(0xA00000,SEEK_SET); fp->fwrite(MMU.ARM9_ITCM,0x8000); //arm9 ITCM (32K) fp->fseek(0xB00000,SEEK_SET); fp->fwrite(MMU.ARM9_LCD,0xA4000); //LCD mem 656K fp->fseek(0xC00000,SEEK_SET); fp->fwrite(MMU.ARM9_VMEM,0x800); //OAM fp->fseek(0xD00000,SEEK_SET); fp->fwrite(MMU.ARM7_ERAM,0x10000); //arm7 WRAM (64K) fp->fseek(0xE00000,SEEK_SET); fp->fwrite(MMU.ARM7_WIRAM,0x10000); //arm7 wifi RAM ? fp->fseek(0xF00000,SEEK_SET); fp->fwrite(MMU.SWIRAM,0x8000); //arm9/arm7 shared WRAM (32KB) } //---------------------------------------------------- std::vector Logger::channels; static void defaultCallback(const Logger& logger, const char * message) { logger.getOutput() << message; } Logger::Logger() { out = &std::cout; callback = defaultCallback; flags = 0; } Logger::~Logger() { for(int i=0;i<(int)channels.size();i++) delete channels[i]; } void Logger::vprintf(const char * format, va_list l, const char * file, unsigned int line) { char buffer[1024]; char * cur = buffer; if (flags & Logger::FILE) cur += sprintf(cur, "%s:", file); if (flags & Logger::LINE) cur += sprintf(cur, "%d:", line); if (flags) cur += sprintf(cur, " "); ::vsnprintf(cur, 1024, format, l); callback(*this, buffer); } void Logger::setOutput(std::ostream * o) { out = o; } void Logger::setCallback(void (*cback)(const Logger& logger, const char * message)) { callback = cback; } void Logger::setFlag(unsigned int flag) { this->flags = flag; } void Logger::fixSize(unsigned int channel) { while(channel >= channels.size()) { channels.push_back(new Logger()); } } std::ostream& Logger::getOutput() const { return *out; } void Logger::log(unsigned int channel, const char * file, unsigned int line, const char * format, ...) { fixSize(channel); va_list l; va_start(l, format); channels[channel]->vprintf(format, l, file, line); va_end(l); } void Logger::log(unsigned int channel, const char * file, unsigned int line, std::ostream& os) { fixSize(channel); channels[channel]->setOutput(&os); } void Logger::log(unsigned int channel, const char * file, unsigned int line, unsigned int flag) { fixSize(channel); channels[channel]->setFlag(flag); } void Logger::log(unsigned int channel, const char * file, unsigned int line, void (*callback)(const Logger& logger, const char * message)) { fixSize(channel); channels[channel]->setCallback(callback); } void IdeasLog(armcpu_t* cpu) { u32 adr = cpu->R[0]; for(;;) { u8 c = _MMU_read08(cpu->proc_ID, MMU_AT_DEBUG, adr); adr++; if(!c) break; printf("%c",c); } //don't emit a newline. that is a pain in the butt. } void NocashMessage(armcpu_t* cpu, int offset) { u32 adr = cpu->instruct_adr + offset; std::string todo; for(;;) { u8 c = _MMU_read08(cpu->proc_ID, MMU_AT_DEBUG, adr); adr++; if(!c) break; todo.push_back(c); } //r0,r1,r2,...,r15 show register content (displayed as 32bit Hex number) //sp,lr,pc alias for r13,r14,r15 //scanline show current scanline number //frame show total number of frames since coldboot //totalclks show total number of clock cycles since coldboot //lastclks show number of cycles since previous lastclks (or zeroclks) //zeroclks resets the 'lastclks' counter //this is very inefficiently coded! char tmp[100]; todo = mass_replace(todo,"%sp%","%r13%"); todo = mass_replace(todo,"%lr%","%r14%"); todo = mass_replace(todo,"%pc%","%r15%"); sprintf(tmp,"%08X",cpu->R[0]); todo = mass_replace(todo,"%r0%",tmp); sprintf(tmp,"%08X",cpu->R[1]); todo = mass_replace(todo,"%r1%",tmp); sprintf(tmp,"%08X",cpu->R[2]); todo = mass_replace(todo,"%r2%",tmp); sprintf(tmp,"%08X",cpu->R[3]); todo = mass_replace(todo,"%r3%",tmp); sprintf(tmp,"%08X",cpu->R[4]); todo = mass_replace(todo,"%r4%",tmp); sprintf(tmp,"%08X",cpu->R[5]); todo = mass_replace(todo,"%r5%",tmp); sprintf(tmp,"%08X",cpu->R[6]); todo = mass_replace(todo,"%r6%",tmp); sprintf(tmp,"%08X",cpu->R[7]); todo = mass_replace(todo,"%r7%",tmp); sprintf(tmp,"%08X",cpu->R[8]); todo = mass_replace(todo,"%r8%",tmp); sprintf(tmp,"%08X",cpu->R[9]); todo = mass_replace(todo,"%r9%",tmp); sprintf(tmp,"%08X",cpu->R[10]); todo = mass_replace(todo,"%r10%",tmp); sprintf(tmp,"%08X",cpu->R[11]); todo = mass_replace(todo,"%r11%",tmp); sprintf(tmp,"%08X",cpu->R[12]); todo = mass_replace(todo,"%r12%",tmp); sprintf(tmp,"%08X",cpu->R[13]); todo = mass_replace(todo,"%r13%",tmp); sprintf(tmp,"%08X",cpu->R[14]); todo = mass_replace(todo,"%r14%",tmp); sprintf(tmp,"%08X",cpu->R[15]); todo = mass_replace(todo,"%r15%",tmp); sprintf(tmp,"%d",nds.VCount); todo = mass_replace(todo,"%scanline%",tmp); sprintf(tmp,"%d",currFrameCounter); todo = mass_replace(todo,"%frame%",tmp); sprintf(tmp,"%lld",nds_timer); todo = mass_replace(todo,"%totalclks%",tmp); printf("%s",todo.c_str()); } //------- DebugNotify DEBUG_Notify; //enable bits arent being used right now. //if you want exhaustive logging, move the print before the early return (or comment the early return) //the intent of this system is to provide a compact dialog box showing which debug notifies have been //triggered in this frame (with a glowing LED!) and which debug notifies have been triggered EVER //which can be cleared, like a clip indicator in an audio tool. //obviously all this isnt implemented yet. void DebugNotify::NextFrame() { #ifdef DEVELOPER pingBits.reset(); #endif } void DebugNotify::ReadBeyondEndOfCart(u32 addr, u32 romsize) { #ifdef DEVELOPER if(!ping(DEBUG_NOTIFY_READ_BEYOND_END_OF_CART)) return; INFO("Reading beyond end of cart! ... %08X >= %08X\n",addr,romsize); #endif } bool DebugNotify::ping(EDEBUG_NOTIFY which) { bool wasPinged = pingBits[(int)which]; pingBits[(int)which] = true; return !wasPinged; } desmume-0.9.9/src/ctrlssdl.cpp0000644000175000017500000003607112140261633017054 0ustar guillaumeguillaume/* Copyright (C) 2007 Pascal Giard Copyright (C) 2007-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "ctrlssdl.h" #include "saves.h" #include "SPU.h" #include "commandline.h" #include "NDSSystem.h" #include "GPU_osd.h" #ifdef FAKE_MIC #include "mic.h" #endif u16 keyboard_cfg[NB_KEYS]; u16 joypad_cfg[NB_KEYS]; u16 nbr_joy; mouse_status mouse; static SDL_Joystick **open_joysticks = NULL; /* Keypad key names */ const char *key_names[NB_KEYS] = { "A", "B", "Select", "Start", "Right", "Left", "Up", "Down", "R", "L", "X", "Y", "Debug", "Boost" }; /* Joypad Key Codes -- 4-digit Hexadecimal number * 1st digit: device ID (0 is first joypad, 1 is second, etc.) * 2nd digit: 0 - Axis, 1 - Hat/POV/D-Pad, 2 - Button * 3rd & 4th digit: (depends on input type) * Negative Axis - 2 * axis index * Positive Axis - 2 * axis index + 1 * Hat Right - 4 * hat index * Hat Left - 4 * hat index + 1 * Hat Up - 4 * hat index + 2 * Hat Down - 4 * hat index + 3 * Button - button index */ /* Default joypad configuration */ const u16 default_joypad_cfg[NB_KEYS] = { 0x0201, // A 0x0200, // B 0x0205, // select 0x0208, // start 0x0001, // Right 0x0000, // Left 0x0002, // Up 0x0003, // Down 0x0207, // R 0x0206, // L 0x0204, // X 0x0203, // Y 0xFFFF, // DEBUG 0xFFFF // BOOST }; /* Load default joystick and keyboard configurations */ void load_default_config(const u16 kbCfg[]) { memcpy(keyboard_cfg, kbCfg, sizeof(keyboard_cfg)); memcpy(joypad_cfg, default_joypad_cfg, sizeof(joypad_cfg)); } /* Set all buttons at once */ static void set_joy_keys(const u16 joyCfg[]) { memcpy(joypad_cfg, joyCfg, sizeof(joypad_cfg)); } /* Initialize joysticks */ BOOL init_joy( void) { int i; BOOL joy_init_good = TRUE; //user asked for no joystick if(_commandline_linux_nojoy) { printf("skipping joystick init\n"); return TRUE; } set_joy_keys(default_joypad_cfg); if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) { fprintf(stderr, "Error trying to initialize joystick support: %s\n", SDL_GetError()); return FALSE; } nbr_joy = SDL_NumJoysticks(); if ( nbr_joy > 0) { printf("Found %d joysticks\n", nbr_joy); open_joysticks = (SDL_Joystick**)calloc( sizeof ( SDL_Joystick *), nbr_joy); if ( open_joysticks != NULL) { for (i = 0; i < nbr_joy; i++) { SDL_Joystick * joy = SDL_JoystickOpen(i); printf("Joystick %d %s\n", i, SDL_JoystickName(i)); printf("Axes: %d\n", SDL_JoystickNumAxes(joy)); printf("Buttons: %d\n", SDL_JoystickNumButtons(joy)); printf("Trackballs: %d\n", SDL_JoystickNumBalls(joy)); printf("Hats: %d\n\n", SDL_JoystickNumHats(joy)); } } else { joy_init_good = FALSE; } } return joy_init_good; } /* Unload joysticks */ void uninit_joy( void) { int i; if ( open_joysticks != NULL) { for (i = 0; i < SDL_NumJoysticks(); i++) { SDL_JoystickClose( open_joysticks[i]); } free( open_joysticks); } open_joysticks = NULL; SDL_QuitSubSystem(SDL_INIT_JOYSTICK); } /* Return keypad vector with given key set to 1 */ u16 lookup_joy_key (u16 keyval) { int i; u16 Key = 0; for(i = 0; i < NB_KEYS; i++) if(keyval == joypad_cfg[i]) { Key = KEYMASK_(i); break; } return Key; } /* Return keypad vector with given key set to 1 */ u16 lookup_key (u16 keyval) { int i; u16 Key = 0; for(i = 0; i < NB_KEYS; i++) if(keyval == keyboard_cfg[i]) { Key = KEYMASK_(i); break; } return Key; } /* Get pressed joystick key */ u16 get_joy_key(int index) { BOOL done = FALSE; SDL_Event event; u16 key = joypad_cfg[index]; /* Enable joystick events if needed */ if( SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE ) SDL_JoystickEventState(SDL_ENABLE); while(SDL_WaitEvent(&event) && !done) { switch(event.type) { case SDL_JOYBUTTONDOWN: printf( "Device: %d; Button: %d\n", event.jbutton.which, event.jbutton.button ); key = ((event.jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event.jbutton.button & 255); done = TRUE; break; case SDL_JOYAXISMOTION: /* Dead zone of 50% */ if( (abs(event.jaxis.value) >> 14) != 0 ) { key = ((event.jaxis.which & 15) << 12) | JOY_AXIS << 8 | ((event.jaxis.axis & 127) << 1); if (event.jaxis.value > 0) { printf( "Device: %d; Axis: %d (+)\n", event.jaxis.which, event.jaxis.axis ); key |= 1; } else printf( "Device: %d; Axis: %d (-)\n", event.jaxis.which, event.jaxis.axis ); done = TRUE; } break; case SDL_JOYHATMOTION: /* Diagonal positions will be treated as two separate keys being activated, rather than a single diagonal key. */ /* JOY_HAT_* are sequential integers, rather than a bitmask */ if (event.jhat.value != SDL_HAT_CENTERED) { key = ((event.jhat.which & 15) << 12) | JOY_HAT << 8 | ((event.jhat.hat & 63) << 2); /* Can't just use a switch here because SDL_HAT_* make up a bitmask. We only want one of these when assigning keys. */ if ((event.jhat.value & SDL_HAT_UP) != 0) { key |= JOY_HAT_UP; printf( "Device: %d; Hat: %d (Up)\n", event.jhat.which, event.jhat.hat ); } else if ((event.jhat.value & SDL_HAT_RIGHT) != 0) { key |= JOY_HAT_RIGHT; printf( "Device: %d; Hat: %d (Right)\n", event.jhat.which, event.jhat.hat ); } else if ((event.jhat.value & SDL_HAT_DOWN) != 0) { key |= JOY_HAT_DOWN; printf( "Device: %d; Hat: %d (Down)\n", event.jhat.which, event.jhat.hat ); } else if ((event.jhat.value & SDL_HAT_LEFT) != 0) { key |= JOY_HAT_LEFT; printf( "Device: %d; Hat: %d (Left)\n", event.jhat.which, event.jhat.hat ); } done = TRUE; } break; } } if( SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE ) SDL_JoystickEventState(SDL_IGNORE); return key; } /* Get and set a new joystick key */ u16 get_set_joy_key(int index) { joypad_cfg[index] = get_joy_key(index); return joypad_cfg[index]; } static signed long screen_to_touch_range( signed long scr, float size_ratio) { return (signed long)((float)scr * size_ratio); } /* Set mouse coordinates */ static void set_mouse_coord(signed long x,signed long y) { if(x<0) x = 0; else if(x>255) x = 255; if(y<0) y = 0; else if(y>192) y = 192; mouse.x = x; mouse.y = y; } /* Update NDS keypad */ void update_keypad(u16 keys) { NDS_beginProcessingInput(); UserButtons& input = NDS_getProcessingUserInput().buttons; input.G = (keys>>12)&1; input.E = (keys>>8)&1; input.W = (keys>>9)&1; input.X = (keys>>10)&1; input.Y = (keys>>11)&1; input.A = (keys>>0)&1; input.B = (keys>>1)&1; input.S = (keys>>3)&1; input.T = (keys>>2)&1; input.U = (keys>>6)&1; input.D = (keys>>7)&1; input.L = (keys>>5)&1; input.R = (keys>>4)&1; input.F = 0; NDS_endProcessingInput(); } /* Retrieve current NDS keypad */ u16 get_keypad( void) { u16 keypad; keypad = ~MMU.ARM7_REG[0x136]; keypad = (keypad & 0x3) << 10; #ifdef WORDS_BIGENDIAN keypad |= ~(MMU.ARM9_REG[0x130] | (MMU.ARM9_REG[0x131] << 8)) & 0x3FF; #else keypad |= ~((u16 *)MMU.ARM9_REG)[0x130>>1] & 0x3FF; #endif return keypad; } /* * The internal joystick events processing function */ static int do_process_joystick_events( u16 *keypad, SDL_Event *event) { int processed = 1; u16 key_code; u16 key; u16 key_o; u16 key_u; u16 key_r; u16 key_d; u16 key_l; switch ( event->type) { /* Joystick axis motion Note: button constants have a 1bit offset. */ case SDL_JOYAXISMOTION: key_code = ((event->jaxis.which & 15) << 12) | JOY_AXIS << 8 | ((event->jaxis.axis & 127) << 1); if( (abs(event->jaxis.value) >> 14) != 0 ) { if (event->jaxis.value > 0) key_code |= 1; key = lookup_joy_key( key_code ); key_o = lookup_joy_key( key_code ^ 1 ); if (key != 0) ADD_KEY( *keypad, key ); if (key_o != 0) RM_KEY( *keypad, key_o ); } else { // Axis is zeroed key = lookup_joy_key( key_code ); key_o = lookup_joy_key( key_code ^ 1 ); if (key != 0) RM_KEY( *keypad, key ); if (key_o != 0) RM_KEY( *keypad, key_o ); } break; case SDL_JOYHATMOTION: /* Diagonal positions will be treated as two separate keys being activated, rather than a single diagonal key. */ /* JOY_HAT_* are sequential integers, rather than a bitmask */ key_code = ((event->jhat.which & 15) << 12) | JOY_HAT << 8 | ((event->jhat.hat & 63) << 2); key_u = lookup_joy_key( key_code | JOY_HAT_UP ); key_r = lookup_joy_key( key_code | JOY_HAT_RIGHT ); key_d = lookup_joy_key( key_code | JOY_HAT_DOWN ); key_l = lookup_joy_key( key_code | JOY_HAT_LEFT ); if ((key_u != 0) && ((event->jhat.value & SDL_HAT_UP) != 0)) ADD_KEY( *keypad, key_u ); else if (key_u != 0) RM_KEY( *keypad, key_u ); if ((key_r != 0) && ((event->jhat.value & SDL_HAT_RIGHT) != 0)) ADD_KEY( *keypad, key_r ); else if (key_r != 0) RM_KEY( *keypad, key_r ); if ((key_d != 0) && ((event->jhat.value & SDL_HAT_DOWN) != 0)) ADD_KEY( *keypad, key_d ); else if (key_d != 0) RM_KEY( *keypad, key_d ); if ((key_l != 0) && ((event->jhat.value & SDL_HAT_LEFT) != 0)) ADD_KEY( *keypad, key_l ); else if (key_l != 0) RM_KEY( *keypad, key_l ); break; /* Joystick button pressed */ /* FIXME: Add support for BOOST */ case SDL_JOYBUTTONDOWN: key_code = ((event->jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event->jbutton.button & 255); key = lookup_joy_key( key_code ); if (key != 0) ADD_KEY( *keypad, key ); break; /* Joystick button released */ case SDL_JOYBUTTONUP: key_code = ((event->jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event->jbutton.button & 255); key = lookup_joy_key( key_code ); if (key != 0) RM_KEY( *keypad, key ); break; default: processed = 0; break; } return processed; } /* * Process only the joystick events */ void process_joystick_events( u16 *keypad) { SDL_Event event; /* IMPORTANT: Reenable joystick events iif needed. */ if(SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE) SDL_JoystickEventState(SDL_ENABLE); /* There's an event waiting to be processed? */ while (SDL_PollEvent(&event)) { do_process_joystick_events( keypad, &event); } } u16 shift_pressed; void process_ctrls_event( SDL_Event& event, struct ctrls_event_config *cfg) { u16 key; if ( !do_process_joystick_events( &cfg->keypad, &event)) { switch (event.type) { case SDL_VIDEORESIZE: cfg->resize_cb( event.resize.w, event.resize.h, cfg->screen_texture); break; case SDL_ACTIVEEVENT: if (cfg->auto_pause && (event.active.state & SDL_APPINPUTFOCUS )) { if (event.active.gain) { cfg->focused = 1; SPU_Pause(0); osd->addLine("Auto pause disabled"); } else { cfg->focused = 0; SPU_Pause(1); } } break; case SDL_KEYDOWN: switch(event.key.keysym.sym){ case SDLK_LSHIFT: shift_pressed |= 1; break; case SDLK_RSHIFT: shift_pressed |= 2; break; default: key = lookup_key(event.key.keysym.sym); ADD_KEY( cfg->keypad, key ); break; } break; case SDL_KEYUP: switch(event.key.keysym.sym){ case SDLK_ESCAPE: cfg->sdl_quit = 1; break; #ifdef FAKE_MIC case SDLK_m: cfg->fake_mic = !cfg->fake_mic; Mic_DoNoise(cfg->fake_mic); if (cfg->fake_mic) osd->addLine("Fake mic enabled"); else osd->addLine("Fake mic disabled"); break; #endif case SDLK_o: cfg->boost = !cfg->boost; if (cfg->boost) osd->addLine("Boost mode enabled"); else osd->addLine("Boost mode disabled"); break; case SDLK_LSHIFT: shift_pressed &= ~1; break; case SDLK_RSHIFT: shift_pressed &= ~2; break; case SDLK_F1: case SDLK_F2: case SDLK_F3: case SDLK_F4: case SDLK_F5: case SDLK_F6: case SDLK_F7: case SDLK_F8: case SDLK_F9: case SDLK_F10: int prevexec; prevexec = execute; execute = FALSE; SPU_Pause(1); if(!shift_pressed){ loadstate_slot(event.key.keysym.sym - SDLK_F1 + 1); }else{ savestate_slot(event.key.keysym.sym - SDLK_F1 + 1); } execute = prevexec; SPU_Pause(!execute); break; default: key = lookup_key(event.key.keysym.sym); RM_KEY( cfg->keypad, key ); break; } break; case SDL_MOUSEBUTTONDOWN: if(event.button.button==1) mouse.down = TRUE; case SDL_MOUSEMOTION: if(!mouse.down) break; else { signed long scaled_x = screen_to_touch_range( event.button.x, cfg->nds_screen_size_ratio); signed long scaled_y = screen_to_touch_range( event.button.y, cfg->nds_screen_size_ratio); if( scaled_y >= 192) set_mouse_coord( scaled_x, scaled_y - 192); } break; case SDL_MOUSEBUTTONUP: if(mouse.down) mouse.click = TRUE; mouse.down = FALSE; break; case SDL_QUIT: cfg->sdl_quit = 1; break; default: break; } } } desmume-0.9.9/src/texcache.cpp0000644000175000017500000004664512140261633017016 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include #include #include "texcache.h" #include "bits.h" #include "common.h" #include "debug.h" #include "gfx3d.h" #include "NDSSystem.h" using std::min; using std::max; //only dump this from ogl renderer. for now, softrasterizer creates things in an incompatible pixel format //#define DEBUG_DUMP_TEXTURE #define CONVERT(color,alpha) ((TEXFORMAT == TexFormat_32bpp)?(RGB15TO32(color,alpha)):RGB15TO6665(color,alpha)) //This class represents a number of regions of memory which should be viewed as contiguous class MemSpan { public: static const int MAXSIZE = 17; //max size for textures: 1024*1024*2 bytes / 128*1024 banks + 1 for wraparound MemSpan() : numItems(0), size(0) {} int numItems; struct Item { u32 start; u32 len; u8* ptr; u32 ofs; //offset within the memspan } items[MAXSIZE]; int size; //this MemSpan shall be considered the first argument to a standard memcmp //the length shall be as specified in this MemSpan, unless you specify otherwise int memcmp(void* buf2, int size=-1) { if(size==-1) size = this->size; size = min(this->size,size); for(int i=0;isize; size = min(this->size,size); u8* bufptr = (u8*)buf; int done = 0; for(int i=0;isize; size = min(this->size,size); u16* bufptr = (u16*)buf; int done = 0; for(int i=0;i>17)&3; //slots will wrap around curr.len = min(len,0x20000-curr.start); curr.ofs = currofs; len -= curr.len; ofs += curr.len; currofs += curr.len; u8* ptr = MMU.texInfo.textureSlotAddr[slot]; //TODO - dont alert if the masterbrightnesses are max or min if(ptr == MMU.blank_memory) { PROGINFO("Tried to reference unmapped texture memory: slot %d\n",slot); } curr.ptr = ptr + curr.start; } return ret; } //creates a MemSpan in texture palette memory static MemSpan MemSpan_TexPalette(u32 ofs, u32 len) { MemSpan ret; ret.size = len; u32 currofs = 0; while(len) { MemSpan::Item &curr = ret.items[ret.numItems++]; curr.start = ofs&0x3FFF; u32 slot = (ofs>>14)&7; //this masks to 8 slots, but there are really only 6 if(slot>5) { PROGINFO("Texture palette overruns texture memory. Wrapping at palette slot 0.\n"); slot -= 5; } curr.len = min(len,0x4000-curr.start); curr.ofs = currofs; len -= curr.len; ofs += curr.len; //if(len != 0) //here is an actual test case of bank spanning currofs += curr.len; u8* ptr = MMU.texInfo.texPalSlot[slot]; //TODO - dont alert if the masterbrightnesses are max or min if(ptr == MMU.blank_memory) { PROGINFO("Tried to reference unmapped texture palette memory: 16k slot #%d\n",slot); } curr.ptr = ptr + curr.start; } return ret; } #if defined (DEBUG_DUMP_TEXTURE) && defined (WIN32) #define DO_DEBUG_DUMP_TEXTURE static void DebugDumpTexture(TexCacheItem* item) { static int ctr=0; char fname[100]; sprintf(fname,"c:\\dump\\%d.bmp", ctr); ctr++; NDS_WriteBMP_32bppBuffer(item->sizeX,item->sizeY,item->decoded,fname); } #endif class TexCache { public: TexCache() : cache_size(0) {} TTexCacheItemMultimap index; //this ought to be enough for anyone //static const u32 kMaxCacheSize = 64*1024*1024; //changed by zeromus on 15-dec. I couldnt find any games that were getting anywhere NEAR 64 static const u32 kMaxCacheSize = 16*1024*1024; //metal slug burns through sprites so fast, it can test it pretty quickly though //this is not really precise, it is off by a constant factor u32 cache_size; void list_remove(TexCacheItem* item) { index.erase(item->iterator); cache_size -= item->decode_len; } void list_push_front(TexCacheItem* item) { item->iterator = index.insert(std::make_pair(item->texformat,item)); cache_size += item->decode_len; } template TexCacheItem* scan(u32 format, u32 texpal) { //for each texformat, number of palette entries static const int palSizes[] = {0, 32, 4, 16, 256, 0, 8, 0}; //for each texformat, multiplier from numtexels to numbytes (fixed point 30.2) static const int texSizes[] = {0, 4, 1, 2, 4, 1, 4, 8}; //used to hold a copy of the palette specified for this texture u16 pal[256]; u32 textureMode = (unsigned short)((format>>26)&0x07); u32 sizeX=(8 << ((format>>20)&0x07)); u32 sizeY=(8 << ((format>>23)&0x07)); u32 imageSize = sizeX*sizeY; u8 *adr; u32 paletteAddress; switch (textureMode) { case TEXMODE_I2: paletteAddress = texpal<<3; break; case TEXMODE_A3I5: //a3i5 case TEXMODE_I4: //i4 case TEXMODE_I8: //i8 case TEXMODE_A5I3: //a5i3 case TEXMODE_16BPP: //16bpp case TEXMODE_4X4: //4x4 default: paletteAddress = texpal<<4; break; } //analyze the texture memory mapping and the specifications of this texture int palSize = palSizes[textureMode]; int texSize = (imageSize*texSizes[textureMode])>>2; //shifted because the texSizes multiplier is fixed point MemSpan ms = MemSpan_TexMem((format&0xFFFF)<<3,texSize); MemSpan mspal = MemSpan_TexPalette(paletteAddress,palSize*2); //determine the location for 4x4 index data u32 indexBase; if((format & 0xc000) == 0x8000) indexBase = 0x30000; else indexBase = 0x20000; u32 indexOffset = (format&0x3FFF)<<2; int indexSize = 0; MemSpan msIndex; if(textureMode == TEXMODE_4X4) { indexSize = imageSize>>3; msIndex = MemSpan_TexMem(indexOffset+indexBase,indexSize); } //dump the palette to a temp buffer, so that we don't have to worry about memory mapping. //this isnt such a problem with texture memory, because we read sequentially from it. //however, we read randomly from palette memory, so the mapping is more costly. #ifdef WORDS_BIGENDIAN mspal.dump16(pal); #else mspal.dump(pal); #endif //TODO - as a special optimization, keep the last item returned and check it first for(std::pair iters = index.equal_range(format); iters.first != iters.second; ++iters.first) { TexCacheItem* curr = iters.first->second; //conditions where we reject matches: //when the teximage or texpal params dont match //(this is our key for identifying textures in the cache) //NEW: due to using format as a key we dont need to check this anymore //if(curr->texformat != format) continue; if(curr->texpal != texpal) continue; //we're being asked for a different format than what we had cached. //TODO - this could be done at the entire cache level instead of checking repeatedly if(curr->cacheFormat != TEXFORMAT) goto REJECT; //the texture matches params, but isnt suspected invalid. accept it. if (!curr->suspectedInvalid) return curr; //we suspect the texture may be invalid. we need to do a byte-for-byte comparison to re-establish that it is valid: //when the palettes dont match: //note that we are considering 4x4 textures to have a palette size of 0. //they really have a potentially HUGE palette, too big for us to handle like a normal palette, //so they go through a different system if(mspal.size != 0 && memcmp(curr->dump.palette,pal,mspal.size)) goto REJECT; //when the texture data doesn't match if(ms.memcmp(&curr->dump.texture[0],curr->dump.textureSize)) goto REJECT; //if the texture is 4x4 then the index data must match if(textureMode == TEXMODE_4X4) { if(msIndex.memcmp(curr->dump.texture + curr->dump.textureSize,curr->dump.indexSize)) goto REJECT; } //we found a match. just return it //REMINDER to make it primary/newest when we have smarter code //list_remove(curr); //list_push_front(curr); curr->suspectedInvalid = false; return curr; REJECT: //we found a cached item for the current address, but the data is stale. //for a variety of complicated reasons, we need to throw it out right this instant. list_remove(curr); delete curr; break; } //item was not found. recruit an existing one (the oldest), or create a new one //evict(); //reduce the size of the cache if necessary //TODO - as a peculiarity of the texcache, eviction must happen after the entire 3d frame runs //to support separate cache and read passes TexCacheItem* newitem = new TexCacheItem(); newitem->suspectedInvalid = false; newitem->texformat = format; newitem->cacheFormat = TEXFORMAT; newitem->texpal = texpal; newitem->sizeX=sizeX; newitem->sizeY=sizeY; newitem->invSizeX=1.0f/((float)(sizeX)); newitem->invSizeY=1.0f/((float)(sizeY)); newitem->decode_len = sizeX*sizeY*4; newitem->mode = textureMode; newitem->decoded = new u8[newitem->decode_len]; list_push_front(newitem); //printf("allocating: up to %d with %d items\n",cache_size,index.size()); u32 *dwdst = (u32*)newitem->decoded; //dump palette data for cache keying if(palSize) { memcpy(newitem->dump.palette, pal, palSize*2); } //dump texture and 4x4 index data for cache keying const int texsize = newitem->dump.textureSize = ms.size; const int indexsize = newitem->dump.indexSize = msIndex.size; newitem->dump.texture = new u8[texsize+indexsize]; ms.dump(&newitem->dump.texture[0],newitem->dump.maxTextureSize); //dump texture if(textureMode == TEXMODE_4X4) msIndex.dump(newitem->dump.texture+newitem->dump.textureSize,newitem->dump.indexSize); //dump 4x4 //============================================================================ //Texture conversion //============================================================================ const u32 opaqueColor = TEXFORMAT==TexFormat_32bpp?255:31; u32 palZeroTransparent = (1-((format>>29)&1))*opaqueColor; switch (newitem->mode) { case TEXMODE_A3I5: { for(int j=0;j>5; if(TEXFORMAT == TexFormat_15bpp) *dwdst++ = RGB15TO6665(c,material_3bit_to_5bit[alpha]); else *dwdst++ = RGB15TO32(c,material_3bit_to_8bit[alpha]); adr++; } } break; } case TEXMODE_I2: { for(int j=0;j>2)&0x3; c = pal[bits]; *dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor); bits = ((*adr)>>4)&0x3; c = pal[bits]; *dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor); bits = ((*adr)>>6)&0x3; c = pal[bits]; *dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor); adr++; } } break; } case TEXMODE_I4: { for(int j=0;j>4); c = pal[bits]; *dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor); adr++; } } break; } case TEXMODE_I8: { for(int j=0;j>14)&0x7] + ((paletteAddress + (offset)*2)&0x3FFF) ) ) u16* slot1; u32* map = (u32*)ms.items[0].ptr; u32 limit = ms.items[0].len<<2; u32 d = 0; if ( (format & 0xc000) == 0x8000) // texel are in slot 2 slot1=(u16*)&MMU.texInfo.textureSlotAddr[1][((format & 0x3FFF)<<2)+0x010000]; else slot1=(u16*)&MMU.texInfo.textureSlotAddr[1][(format & 0x3FFF)<<2]; u16 yTmpSize = (sizeY>>2); u16 xTmpSize = (sizeX>>2); //this is flagged whenever a 4x4 overruns its slot. //i am guessing we just generate black in that case bool dead = false; for (int y = 0; y < yTmpSize; y ++) { u32 tmpPos[4]={(y<<2)*sizeX,((y<<2)+1)*sizeX, ((y<<2)+2)*sizeX,((y<<2)+3)*sizeX}; for (int x = 0; x < xTmpSize; x ++, d++) { if(d >= limit) dead = true; if(dead) { for (int sy = 0; sy < 4; sy++) { u32 currentPos = (x<<2) + tmpPos[sy]; dwdst[currentPos] = dwdst[currentPos+1] = dwdst[currentPos+2] = dwdst[currentPos+3] = 0; } continue; } u32 currBlock = map[d]; u16 pal1 = slot1[d]; u16 pal1offset = (pal1 & 0x3FFF)<<1; u8 mode = pal1>>14; u32 tmp_col[4]; tmp_col[0]=RGB16TO32(PAL4X4(pal1offset),255); tmp_col[1]=RGB16TO32(PAL4X4(pal1offset+1),255); switch (mode) { case 0: tmp_col[2]=RGB16TO32(PAL4X4(pal1offset+2),255); tmp_col[3]=RGB16TO32(0x7FFF,0); break; case 1: tmp_col[2]=(((tmp_col[0]&0xFF)+(tmp_col[1]&0xff))>>1)| (((tmp_col[0]&(0xFF<<8))+(tmp_col[1]&(0xFF<<8)))>>1)| (((tmp_col[0]&(0xFF<<16))+(tmp_col[1]&(0xFF<<16)))>>1)| (0xff<<24); tmp_col[3]=RGB16TO32(0x7FFF,0); break; case 2: tmp_col[2]=RGB16TO32(PAL4X4(pal1offset+2),255); tmp_col[3]=RGB16TO32(PAL4X4(pal1offset+3),255); break; case 3: { u32 red1, red2; u32 green1, green2; u32 blue1, blue2; u16 tmp1, tmp2; red1=tmp_col[0]&0xff; green1=(tmp_col[0]>>8)&0xff; blue1=(tmp_col[0]>>16)&0xff; red2=tmp_col[1]&0xff; green2=(tmp_col[1]>>8)&0xff; blue2=(tmp_col[1]>>16)&0xff; tmp1=((red1*5+red2*3)>>6)| (((green1*5+green2*3)>>6)<<5)| (((blue1*5+blue2*3)>>6)<<10); tmp2=((red2*5+red1*3)>>6)| (((green2*5+green1*3)>>6)<<5)| (((blue2*5+blue1*3)>>6)<<10); tmp_col[2]=RGB16TO32(tmp1,255); tmp_col[3]=RGB16TO32(tmp2,255); break; } } if(TEXFORMAT==TexFormat_15bpp) { for(int i=0;i<4;i++) { tmp_col[i] >>= 2; tmp_col[i] &= 0x3F3F3F3F; u32 a = tmp_col[i]>>24; tmp_col[i] &= 0x00FFFFFF; tmp_col[i] |= (a>>1)<<24; } } //TODO - this could be more precise for 32bpp mode (run it through the color separation table) //set all 16 texels for (int sy = 0; sy < 4; sy++) { // Texture offset u32 currentPos = (x<<2) + tmpPos[sy]; u8 currRow = (u8)((currBlock>>(sy<<3))&0xFF); dwdst[currentPos] = tmp_col[currRow&3]; dwdst[currentPos+1] = tmp_col[(currRow>>2)&3]; dwdst[currentPos+2] = tmp_col[(currRow>>4)&3]; dwdst[currentPos+3] = tmp_col[(currRow>>6)&3]; } } } break; } case TEXMODE_A5I3: { for(int j=0;j>3); if(TEXFORMAT == TexFormat_15bpp) *dwdst++ = RGB15TO6665(c,alpha); else *dwdst++ = RGB15TO32(c,material_5bit_to_8bit[alpha]); adr++; } } break; } case TEXMODE_16BPP: { for(int j=0;j>1; for(int x = 0; x < len; ++x) { u16 c = map[x]; int alpha = ((c&0x8000)?opaqueColor:0); *dwdst++ = CONVERT(c&0x7FFF,alpha); } } break; } } //switch(texture format) #ifdef DO_DEBUG_DUMP_TEXTURE DebugDumpTexture(newitem); #endif return newitem; } //scan() void invalidate() { for(TTexCacheItemMultimap::iterator it(index.begin()); it != index.end(); ++it) it->second->suspectedInvalid = true; } void evict(u32 target = kMaxCacheSize) { //debug print //printf("%d %d/%d\n",index.size(),cache_size/1024,target/1024); //dont do anything unless we're over the target if(cache_size target) { if(index.size()==0) break; //just in case.. doesnt seem possible, cache_size wouldve been 0 TexCacheItem* item = index.begin()->second; list_remove(item); //printf("evicting! totalsize:%d\n",cache_size); delete item; } } } texCache; void TexCache_Reset() { texCache.evict(0); } void TexCache_Invalidate() { //note that this gets called whether texdata or texpalette gets reconfigured. texCache.invalidate(); } TexCacheItem* TexCache_SetTexture(TexCache_TexFormat TEXFORMAT, u32 format, u32 texpal) { switch(TEXFORMAT) { case TexFormat_32bpp: return texCache.scan(format,texpal); case TexFormat_15bpp: return texCache.scan(format,texpal); default: assert(false); return NULL; } } //call this periodically to keep the tex cache clean void TexCache_EvictFrame() { texCache.evict(); } desmume-0.9.9/src/cheatSystem.h0000644000175000017500000001046112140261633017153 0ustar guillaumeguillaume/* Copyright (C) 2009-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include "common.h" #include #define CHEAT_VERSION_MAJOR 2 #define CHEAT_VERSION_MINOR 0 #define MAX_CHEAT_LIST 100 #define MAX_XX_CODE 1024 #define CHEAT_FILE_MIN_FGETS_BUFFER 32768 #define CHEAT_DB_GAME_TITLE_SIZE 256 struct CHEATS_LIST { CHEATS_LIST() { memset(this,0,sizeof(*this)); type = 0xFF; } u8 type; // 0 - internal cheat system // 1 - Action Replay // 2 - Codebreakers BOOL enabled; // TODO u8 freezeType; // 0 - normal freeze // 1 - can decrease // 2 - can increase u32 code[MAX_XX_CODE][2]; char description[1024]; int num; u8 size; }; class CHEATS { private: std::vector list; u8 filename[MAX_PATH]; u32 currentGet; void clear(); void ARparser(CHEATS_LIST& cheat); char *clearCode(char *s); public: CHEATS() : currentGet(0) { memset(filename, 0, sizeof(filename)); } ~CHEATS() {} void init(char *path); BOOL add(u8 size, u32 address, u32 val, char *description, BOOL enabled); BOOL update(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos); BOOL add_AR(char *code, char *description, BOOL enabled); BOOL update_AR(char *code, char *description, BOOL enabled, u32 pos); BOOL add_AR_Direct(CHEATS_LIST cheat); BOOL add_CB(char *code, char *description, BOOL enabled); BOOL update_CB(char *code, char *description, BOOL enabled, u32 pos); BOOL remove(u32 pos); void getListReset(); BOOL getList(CHEATS_LIST *cheat); CHEATS_LIST* getListPtr(); BOOL get(CHEATS_LIST *cheat, u32 pos); CHEATS_LIST* getItemByIndex(const u32 pos); u32 getSize(); void setDescription(const char *description, u32 pos); BOOL save(); BOOL load(); void process(); void getXXcodeString(CHEATS_LIST cheat, char *res_buf); static BOOL XXCodeFromString(CHEATS_LIST *cheatItem, const std::string codeString); static BOOL XXCodeFromString(CHEATS_LIST *cheatItem, const char *codeString); }; class CHEATSEARCH { private: u8 *statMem; u8 *mem; u32 amount; u32 lastRecord; u32 _type; u32 _size; u32 _sign; public: CHEATSEARCH() : statMem(0), mem(0), amount(0), lastRecord(0), _type(0), _size(0), _sign(0) {} ~CHEATSEARCH() { close(); } BOOL start(u8 type, u8 size, u8 sign); BOOL close(); u32 search(u32 val); u32 search(u8 comp); u32 getAmount(); BOOL getList(u32 *address, u32 *curVal); void getListReset(); }; enum CHEATS_DB_TYPE { CHEATS_DB_R4 = 0 }; #pragma pack(push) #pragma pack(1) typedef struct FAT_R4 { u8 serial[4]; u32 CRC; u64 addr; } FAT_R4; #pragma pack(pop) class CHEATSEXPORT { private: CHEATS_DB_TYPE type; bool encrypted; FILE *fp; u32 fsize; u32 dataSize; u32 encOffset; FAT_R4 fat; bool search(); bool getCodes(); void R4decrypt(u8 *buf, u32 len, u32 n); u32 numCheats; CHEATS_LIST *cheats; u8 error; // 0 - no errors // 1 - open failed/file not found // 2 - file format is wrong (no valid header ID) // 3 - cheat not found in database // 4 - export error from database public: CHEATSEXPORT() : fp(NULL), fsize(0), dataSize(0), encOffset(0), type(CHEATS_DB_R4), encrypted(false), numCheats(0), cheats(0), CRC(0), error(0) { memset(date, 0, sizeof(date)); gametitle = (u8 *)malloc(CHEAT_DB_GAME_TITLE_SIZE); memset(gametitle, 0, CHEAT_DB_GAME_TITLE_SIZE); } ~CHEATSEXPORT() { free(gametitle); gametitle = NULL; } u8 *gametitle; u8 date[17]; u32 CRC; bool load(char *path); void close(); CHEATS_LIST *getCheats(); u32 getCheatsNum(); u8 getErrorCode() { return error; } }; extern CHEATS *cheats; extern CHEATSEARCH *cheatSearch; desmume-0.9.9/src/bits.h0000644000175000017500000000226612140261633015627 0ustar guillaumeguillaume#ifndef BITS_H #define BITS_H #define BIT(n) (1<<(n)) #define BIT_N(i,n) (((i)>>(n))&1) #define BIT0(i) ((i)&1) #define BIT1(i) BIT_N(i,1) #define BIT2(i) BIT_N(i,2) #define BIT3(i) BIT_N(i,3) #define BIT4(i) BIT_N(i,4) #define BIT5(i) BIT_N(i,5) #define BIT6(i) BIT_N(i,6) #define BIT7(i) BIT_N(i,7) #define BIT8(i) BIT_N(i,8) #define BIT9(i) BIT_N(i,9) #define BIT10(i) BIT_N(i,10) #define BIT11(i) BIT_N(i,11) #define BIT12(i) BIT_N(i,12) #define BIT13(i) BIT_N(i,13) #define BIT14(i) BIT_N(i,14) #define BIT15(i) BIT_N(i,15) #define BIT16(i) BIT_N(i,16) #define BIT17(i) BIT_N(i,17) #define BIT18(i) BIT_N(i,18) #define BIT19(i) BIT_N(i,19) #define BIT20(i) BIT_N(i,20) #define BIT21(i) BIT_N(i,21) #define BIT22(i) BIT_N(i,22) #define BIT23(i) BIT_N(i,23) #define BIT24(i) BIT_N(i,24) #define BIT25(i) BIT_N(i,25) #define BIT26(i) BIT_N(i,26) #define BIT27(i) BIT_N(i,27) #define BIT28(i) BIT_N(i,28) #define BIT29(i) BIT_N(i,29) #define BIT30(i) BIT_N(i,30) #define BIT31(i) ((i)>>31) #define CONDITION(i) (i)>>28 #define REG_POS(i,n) (((i)>>n)&0xF) #endif desmume-0.9.9/src/slot1.h0000644000175000017500000000437012140261633015726 0ustar guillaumeguillaume/* Copyright (C) 2010-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef __SLOT1_H__ #define __SLOT1_H__ #include #include "common.h" #include "types.h" #include "debug.h" class EMUFILE; struct SLOT1INTERFACE { // The name of the plugin, this name will appear in the plugins list const char * name; //called once when the plugin starts up BOOL (*init)(void); //called when the emulator resets void (*reset)(void); //called when the plugin shuts down void (*close)(void); //called when the user configurating plugin void (*config)(void); //called when the emulator write to addon void (*write08)(u8 PROCNUM, u32 adr, u8 val); void (*write16)(u8 PROCNUM, u32 adr, u16 val); void (*write32)(u8 PROCNUM, u32 adr, u32 val); //called when the emulator read from addon u8 (*read08)(u8 PROCNUM, u32 adr); u16 (*read16)(u8 PROCNUM, u32 adr); u32 (*read32)(u8 PROCNUM, u32 adr); //called when the user get info about addon pak (description) void (*info)(char *info); }; enum NDS_SLOT1_TYPE { NDS_SLOT1_NONE, NDS_SLOT1_RETAIL, NDS_SLOT1_R4, NDS_SLOT1_RETAIL_NAND, // used in Made in Ore/WarioWare D.I.Y. NDS_SLOT1_COUNT // use for counter addons - MUST TO BE LAST!!! }; extern SLOT1INTERFACE slot1_device; // current slot1 device extern SLOT1INTERFACE slot1List[NDS_SLOT1_COUNT]; BOOL slot1Init(); void slot1Close(); void slot1Reset(); BOOL slot1Change(NDS_SLOT1_TYPE type); // change current adddon void slot1SetFatDir(const std::string& dir); std::string slot1GetFatDir(); NDS_SLOT1_TYPE slot1GetCurrentType(); EMUFILE* slot1GetFatImage(); #endif //__SLOT1_H__ desmume-0.9.9/src/wifi.cpp0000644000175000017500000017423012140261633016160 0ustar guillaumeguillaume/* Copyright (C) 2007 Tim Seidel Copyright (C) 2008-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include "wifi.h" #include "armcpu.h" #include "NDSSystem.h" #include "debug.h" #include "bits.h" #ifdef _WINDOWS #include #include #define socket_t SOCKET #define sockaddr_t SOCKADDR #ifndef WXPORT #include "windriver.h" #endif #define PCAP_DEVICE_NAME description #else #include #include #include #include #include #define socket_t int #define sockaddr_t struct sockaddr #define closesocket close #define PCAP_DEVICE_NAME name #endif #ifndef INVALID_SOCKET #define INVALID_SOCKET (socket_t)-1 #endif #define BASEPORT 7000 const u8 BroadcastMAC[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; bool bWFCUserWarned = false; #ifdef EXPERIMENTAL_WIFI_COMM socket_t wifi_socket = INVALID_SOCKET; sockaddr_t sendAddr; #ifndef WIN32 #include "pcap/pcap.h" #endif pcap_t *wifi_bridge = NULL; #endif //sometimes this isnt defined #ifndef PCAP_OPENFLAG_PROMISCUOUS #define PCAP_OPENFLAG_PROMISCUOUS 1 #endif wifimac_t wifiMac; SoftAP_t SoftAP; int wifi_lastmode; /******************************************************************************* WIFI TODO - emulate transmission delays for Beacon and Extra transfers - emulate delays when receiving as well (may need some queuing system) - take transfer rate and preamble into account - figure out RFSTATUS and RFPINS *******************************************************************************/ /******************************************************************************* Firmware info needed for if no firmware image is available see: http://www.akkit.org/info/dswifi.htm#WifiInit written in bytes, to avoid endianess issues *******************************************************************************/ u8 FW_Mac[6] = { 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56 }; const u8 FW_WIFIInit[32] = { 0x02,0x00, 0x17,0x00, 0x26,0x00, 0x18,0x18, 0x48,0x00, 0x40,0x48, 0x58,0x00, 0x42,0x00, 0x40,0x01, 0x64,0x80, 0xE0,0xE0, 0x43,0x24, 0x0E,0x00, 0x32,0x00, 0xF4,0x01, 0x01,0x01 }; const u8 FW_BBInit[105] = { 0x6D, 0x9E, 0x40, 0x05, 0x1B, 0x6C, 0x48, 0x80, 0x38, 0x00, 0x35, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x04, 0x01, 0xd8, 0xff, 0xff, 0xc7, 0xbb, 0x01, 0xb6, 0x7f, 0x5a, 0x01, 0x3f, 0x01, 0x3f, 0x36, 0x36, 0x00, 0x78, 0x28, 0x55, 0x08, 0x28, 0x16, 0x00, 0x01, 0x0e, 0x20, 0x02, 0x98, 0x98, 0x1f, 0x0a, 0x08, 0x04, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfa, 0xfa, 0xf8, 0xf8, 0xf6, 0xa5, 0x12, 0x14, 0x12, 0x41, 0x23, 0x03, 0x04, 0x70, 0x35, 0x0E, 0x16, 0x16, 0x00, 0x00, 0x06, 0x01, 0xff, 0xfe, 0xff, 0xff, 0x00, 0x0e, 0x13, 0x00, 0x00, 0x28, 0x1c }; const u8 FW_RFInit[36] = { 0x07, 0xC0, 0x00, 0x03, 0x9C, 0x12, 0x28, 0x17, 0x14, 0xba, 0xe8, 0x1a, 0x6f, 0x45, 0x1d, 0xfa, 0xff, 0x23, 0x30, 0x1d, 0x24, 0x01, 0x00, 0x28, 0x00, 0x00, 0x2c, 0x03, 0x9c, 0x06, 0x22, 0x00, 0x08, 0x6f, 0xff, 0x0d }; const u8 FW_RFChannel[6*14] = { 0x28, 0x17, 0x14, /* Channel 1 */ 0xba, 0xe8, 0x1a, 0x37, 0x17, 0x14, /* Channel 2 */ 0x46, 0x17, 0x19, 0x45, 0x17, 0x14, /* Channel 3 */ 0xd1, 0x45, 0x1b, 0x54, 0x17, 0x14, /* Channel 4 */ 0x5d, 0x74, 0x19, 0x62, 0x17, 0x14, /* Channel 5 */ 0xe9, 0xa2, 0x1b, 0x71, 0x17, 0x14, /* Channel 6 */ 0x74, 0xd1, 0x19, 0x80, 0x17, 0x14, /* Channel 7 */ 0x00, 0x00, 0x18, 0x8e, 0x17, 0x14, /* Channel 8 */ 0x8c, 0x2e, 0x1a, 0x9d, 0x17, 0x14, /* Channel 9 */ 0x17, 0x5d, 0x18, 0xab, 0x17, 0x14, /* Channel 10 */ 0xa3, 0x8b, 0x1a, 0xba, 0x17, 0x14, /* Channel 11 */ 0x2f, 0xba, 0x18, 0xc8, 0x17, 0x14, /* Channel 12 */ 0xba, 0xe8, 0x1a, 0xd7, 0x17, 0x14, /* Channel 13 */ 0x46, 0x17, 0x19, 0xfa, 0x17, 0x14, /* Channel 14 */ 0x2f, 0xba, 0x18 }; const u8 FW_BBChannel[14] = { 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, /* channel 1- 6 */ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, /* channel 7-10 */ 0xb5, 0xb5, /* channel 11-12 */ 0xb6, 0xb6 /* channel 13-14 */ }; FW_WFCProfile FW_WFCProfile1 = {"SoftAP", "", "", "", "", "", {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, "", 0, 0, 0, {0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0} }; FW_WFCProfile FW_WFCProfile2 = {"", "", "", "", "", "", {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, "", 0, 0, 0xFF, {0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0} }; FW_WFCProfile FW_WFCProfile3 = {"", "", "", "", "", "", {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, "", 0, 0, 0xFF, {0, 0, 0, 0, 0, 0, 0}, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0} }; /******************************************************************************* Communication interface *******************************************************************************/ struct WifiComInterface { bool (*Init)(); void (*DeInit)(); void (*Reset)(); void (*SendPacket)(u8* packet, u32 len); void (*msTrigger)(); }; #ifdef EXPERIMENTAL_WIFI_COMM bool SoftAP_Init(); void SoftAP_DeInit(); void SoftAP_Reset(); void SoftAP_SendPacket(u8 *packet, u32 len); void SoftAP_msTrigger(); WifiComInterface CI_SoftAP = { SoftAP_Init, SoftAP_DeInit, SoftAP_Reset, SoftAP_SendPacket, SoftAP_msTrigger }; bool Adhoc_Init(); void Adhoc_DeInit(); void Adhoc_Reset(); void Adhoc_SendPacket(u8* packet, u32 len); void Adhoc_msTrigger(); WifiComInterface CI_Adhoc = { Adhoc_Init, Adhoc_DeInit, Adhoc_Reset, Adhoc_SendPacket, Adhoc_msTrigger }; #endif WifiComInterface* wifiComs[] = { #ifdef EXPERIMENTAL_WIFI_COMM &CI_Adhoc, &CI_SoftAP, #endif NULL }; WifiComInterface* wifiCom; /******************************************************************************* Logging *******************************************************************************/ // 0: disable logging // 1: lowest logging, shows most important messages such as errors // 2: low logging, shows things such as warnings // 3: medium logging, for debugging, shows lots of stuff // 4: high logging, for debugging, shows almost everything, may slow down // 5: highest logging, for debugging, shows everything, may slow down a lot #define WIFI_LOGGING_LEVEL 3 #define WIFI_LOG_USE_LOGC 0 #if (WIFI_LOGGING_LEVEL >= 1) #if WIFI_LOG_USE_LOGC #define WIFI_LOG(level, ...) if(level <= WIFI_LOGGING_LEVEL) LOGC(8, "WIFI: "__VA_ARGS__); #else #define WIFI_LOG(level, ...) if(level <= WIFI_LOGGING_LEVEL) printf("WIFI: "__VA_ARGS__); #endif #else #define WIFI_LOG(level, ...) {} #endif /******************************************************************************* Hax *******************************************************************************/ // TODO: find the right value // GBAtek says it is 10s, however that value seems too small // (MP host sends floods of data frames, clients can't keep up) // 100 would make more sense since CMDCOUNT is set to 166 // that would be 16.6ms ~= 1 frame // however this is guessed, like a lot of the wifi here #define WIFI_CMDCOUNT_SLICE 100 /******************************************************************************* Helpers *******************************************************************************/ INLINE u32 WIFI_alignedLen(u32 len) { return ((len + 3) & ~3); } // Fast MAC compares INLINE bool WIFI_compareMAC(u8* a, u8* b) { return ((*(u32*)&a[0]) == (*(u32*)&b[0])) && ((*(u16*)&a[4]) == (*(u16*)&b[4])); } INLINE bool WIFI_isBroadcastMAC(u8* a) { return (a[0] & 0x01); //return ((*(u32*)&a[0]) == 0xFFFFFFFF) && ((*(u16*)&a[4]) == 0xFFFF); } /******************************************************************************* CRC32 (http://www.codeproject.com/KB/recipes/crc32_large.aspx) *******************************************************************************/ u32 WIFI_CRC32Table[256]; static u32 reflect(u32 ref, char ch) { u32 value = 0; for(int i = 1; i < (ch + 1); i++) { if (ref & 1) value |= 1 << (ch - i); ref >>= 1; } return value; } static u32 WIFI_calcCRC32(u8 *data, int len) { u32 crc = 0xFFFFFFFF; while(len--) crc = (crc >> 8) ^ WIFI_CRC32Table[(crc & 0xFF) ^ *data++]; return (crc ^ 0xFFFFFFFF); } static void WIFI_initCRC32Table() { static bool initialized = false; if(initialized) return; initialized = true; u32 polynomial = 0x04C11DB7; for(int i = 0; i < 0x100; i++) { WIFI_CRC32Table[i] = reflect(i, 8) << 24; for(int j = 0; j < 8; j++) WIFI_CRC32Table[i] = (WIFI_CRC32Table[i] << 1) ^ (WIFI_CRC32Table[i] & (1 << 31) ? polynomial : 0); WIFI_CRC32Table[i] = reflect(WIFI_CRC32Table[i], 32); } } /******************************************************************************* RF-Chip *******************************************************************************/ static void WIFI_resetRF(rffilter_t *rf) { /* reinitialize RF chip with the default values refer RF2958 docs */ /* CFG1 */ rf->CFG1.bits.IF_VGA_REG_EN = 1; rf->CFG1.bits.IF_VCO_REG_EN = 1; rf->CFG1.bits.RF_VCO_REG_EN = 1; rf->CFG1.bits.HYBERNATE = 0; rf->CFG1.bits.REF_SEL = 0; /* IFPLL1 */ rf->IFPLL1.bits.DAC = 3; rf->IFPLL1.bits.P1 = 0; rf->IFPLL1.bits.LD_EN1 = 0; rf->IFPLL1.bits.AUTOCAL_EN1 = 0; rf->IFPLL1.bits.PDP1 = 1; rf->IFPLL1.bits.CPL1 = 0; rf->IFPLL1.bits.LPF1 = 0; rf->IFPLL1.bits.VTC_EN1 = 1; rf->IFPLL1.bits.KV_EN1 = 0; rf->IFPLL1.bits.PLL_EN1 = 0; /* IFPLL2 */ rf->IFPLL2.bits.IF_N = 0x22; /* IFPLL3 */ rf->IFPLL3.bits.KV_DEF1 = 8; rf->IFPLL3.bits.CT_DEF1 = 7; rf->IFPLL3.bits.DN1 = 0x1FF; /* RFPLL1 */ rf->RFPLL1.bits.DAC = 3; rf->RFPLL1.bits.P = 0; rf->RFPLL1.bits.LD_EN = 0; rf->RFPLL1.bits.AUTOCAL_EN = 0; rf->RFPLL1.bits.PDP = 1; rf->RFPLL1.bits.CPL = 0; rf->RFPLL1.bits.LPF = 0; rf->RFPLL1.bits.VTC_EN = 0; rf->RFPLL1.bits.KV_EN = 0; rf->RFPLL1.bits.PLL_EN = 0; /* RFPLL2 */ rf->RFPLL2.bits.NUM2 = 0; rf->RFPLL2.bits.N2 = 0x5E; /* RFPLL3 */ rf->RFPLL3.bits.NUM2 = 0; /* RFPLL4 */ rf->RFPLL4.bits.KV_DEF = 8; rf->RFPLL4.bits.CT_DEF = 7; rf->RFPLL4.bits.DN = 0x145; /* CAL1 */ rf->CAL1.bits.LD_WINDOW = 2; rf->CAL1.bits.M_CT_VALUE = 8; rf->CAL1.bits.TLOCK = 7; rf->CAL1.bits.TVCO = 0x0F; /* TXRX1 */ rf->TXRX1.bits.TXBYPASS = 0; rf->TXRX1.bits.INTBIASEN = 0; rf->TXRX1.bits.TXENMODE = 0; rf->TXRX1.bits.TXDIFFMODE = 0; rf->TXRX1.bits.TXLPFBW = 2; rf->TXRX1.bits.RXLPFBW = 2; rf->TXRX1.bits.TXVGC = 0; rf->TXRX1.bits.PCONTROL = 0; rf->TXRX1.bits.RXDCFBBYPS = 0; /* PCNT1 */ rf->PCNT1.bits.TX_DELAY = 0; rf->PCNT1.bits.PC_OFFSET = 0; rf->PCNT1.bits.P_DESIRED = 0; rf->PCNT1.bits.MID_BIAS = 0; /* PCNT2 */ rf->PCNT2.bits.MIN_POWER = 0; rf->PCNT2.bits.MID_POWER = 0; rf->PCNT2.bits.MAX_POWER = 0; /* VCOT1 */ rf->VCOT1.bits.AUX1 = 0; rf->VCOT1.bits.AUX = 0; } void WIFI_setRF_CNT(u16 val) { if (!wifiMac.rfIOStatus.bits.busy) wifiMac.rfIOCnt.val = val; } void WIFI_setRF_DATA(u16 val, u8 part) { if (!wifiMac.rfIOStatus.bits.busy) { rfIOData_t *rfreg = (rfIOData_t *)&wifiMac.RF; switch (wifiMac.rfIOCnt.bits.readOperation) { case 1: /* read from RF chip */ /* low part of data is ignored on reads */ /* on high part, the address is read, and the data at this is written back */ if (part==1) { wifiMac.rfIOData.array16[part] = val; if (wifiMac.rfIOData.bits.address > (sizeof(wifiMac.RF) / 4)) return; /* out of bound */ /* get content of the addressed register */ wifiMac.rfIOData.bits.content = rfreg[wifiMac.rfIOData.bits.address].bits.content; } break; case 0: /* write to RF chip */ wifiMac.rfIOData.array16[part] = val; if (wifiMac.rfIOData.bits.address > (sizeof(wifiMac.RF) / 4)) return; /* out of bound */ /* the actual transfer is done on high part write */ if (part==1) { switch (wifiMac.rfIOData.bits.address) { case 5: /* write to upper part of the frequency filter */ case 6: /* write to lower part of the frequency filter */ { u32 channelFreqN; rfreg[wifiMac.rfIOData.bits.address].bits.content = wifiMac.rfIOData.bits.content; /* get the complete rfpll.n */ channelFreqN = (u32)wifiMac.RF.RFPLL3.bits.NUM2 + ((u32)wifiMac.RF.RFPLL2.bits.NUM2 << 18) + ((u32)wifiMac.RF.RFPLL2.bits.N2 << 24); /* frequency setting is out of range */ if (channelFreqN<0x00A2E8BA) return; /* substract base frequency (channel 1) */ channelFreqN -= 0x00A2E8BA; } return; case 13: /* special purpose register: TEST1, on write, the RF chip resets */ WIFI_resetRF(&wifiMac.RF); return; } /* set content of the addressed register */ rfreg[wifiMac.rfIOData.bits.address].bits.content = wifiMac.rfIOData.bits.content; } break; } } } u16 WIFI_getRF_DATA(u8 part) { if (!wifiMac.rfIOStatus.bits.busy) return wifiMac.rfIOData.array16[part]; else /* data is not (yet) available */ return 0; } u16 WIFI_getRF_STATUS() { return wifiMac.rfIOStatus.val; } /******************************************************************************* BB-Chip *******************************************************************************/ void WIFI_setBB_CNT(u16 val) { wifiMac.bbIOCnt.val = val; if(wifiMac.bbIOCnt.bits.mode == 1) wifiMac.BB.data[wifiMac.bbIOCnt.bits.address] = WIFI_IOREG(REG_WIFI_BBWRITE); } u8 WIFI_getBB_DATA() { if((!wifiMac.bbIOCnt.bits.enable) || (wifiMac.bbIOCnt.bits.mode != 2)) return 0; return wifiMac.BB.data[wifiMac.bbIOCnt.bits.address]; } /******************************************************************************* wifimac IO: a lot of the wifi regs are action registers, that are mirrored without action, so the default IO via MMU.c does not seem to be very suitable all registers are 16 bit *******************************************************************************/ static void WIFI_TXStart(u32 slot); static void WIFI_triggerIRQMask(u16 mask) { u16 oResult,nResult; oResult = wifiMac.IE & wifiMac.IF; wifiMac.IF = wifiMac.IF | (mask & ~0x0400); nResult = wifiMac.IE & wifiMac.IF; if (!oResult && nResult) { NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_ARM7_WIFI); /* cascade it via arm7 wifi irq */ } } static void WIFI_triggerIRQ(u8 irq) { switch (irq) { case WIFI_IRQ_TXSTART: break; case WIFI_IRQ_TIMEPREBEACON: if (wifiMac.TXPower & 0x0001) { //wifiMac.rfStatus = 1; //wifiMac.rfPins = 0x0084; } break; case WIFI_IRQ_TIMEBEACON: wifiMac.BeaconCount1 = wifiMac.BeaconInterval; if (wifiMac.ucmpEnable) { wifiMac.BeaconCount2 = 0xFFFF; wifiMac.TXCnt &= 0xFFF2; WIFI_TXStart(WIFI_TXSLOT_BEACON); if (wifiMac.ListenCount == 0) wifiMac.ListenCount = wifiMac.ListenInterval; wifiMac.ListenCount--; } break; case WIFI_IRQ_TIMEPOSTBEACON: if (wifiMac.TXPower & 0x0002) { //wifiMac.rfStatus = 9; //wifiMac.rfPins = 0x0004; } break; case WIFI_IRQ_UNK: WIFI_LOG(3, "IRQ 12 triggered.\n"); break; } WIFI_triggerIRQMask(1<DeInit(); } void WIFI_Reset() { #ifdef EXPERIMENTAL_WIFI_COMM //memset(&wifiMac, 0, sizeof(wifimac_t)); WIFI_resetRF(&wifiMac.RF); memset(wifiMac.IOPorts, 0, sizeof(wifiMac.IOPorts)); wifiMac.randomSeed = 1; wifiMac.crystalEnabled = FALSE; wifiMac.powerOn = FALSE; wifiMac.powerOnPending = FALSE; wifiMac.GlobalUsecTimer = wifiMac.usec = wifiMac.ucmp = 0ULL; //wifiMac.rfStatus = 0x0000; //wifiMac.rfPins = 0x0004; wifiMac.rfStatus = 0x0009; wifiMac.rfPins = 0x00C6; memset(wifiMac.TXSlots, 0, sizeof(wifiMac.TXSlots)); wifiMac.TXCurSlot = -1; wifiMac.TXCnt = wifiMac.TXStat = wifiMac.TXSeqNo = wifiMac.TXBusy = 0; while (!wifiMac.RXPacketQueue.empty()) wifiMac.RXPacketQueue.pop(); if((u32)CommonSettings.wifi.mode >= ARRAY_SIZE(wifiComs)) CommonSettings.wifi.mode = 0; if (wifiCom && (wifi_lastmode != CommonSettings.wifi.mode)) wifiCom->DeInit(); wifiCom = wifiComs[CommonSettings.wifi.mode]; if (wifiCom && (wifi_lastmode != CommonSettings.wifi.mode)) wifiCom->Init(); else if (wifiCom) wifiCom->Reset(); wifi_lastmode = CommonSettings.wifi.mode; bWFCUserWarned = false; #endif } INLINE u16 WIFI_GetRXFlags(u8* packet) { u16 ret = 0x0010; u16 frameCtl = *(u16*)&packet[0]; u32 bssid_offset = 10; frameCtl &= 0xE7FF; switch(frameCtl & 0x000C) { case 0x0000: // Management frame { bssid_offset = 16; if ((frameCtl & 0x00F0) == 0x0080) ret |= 0x0001; } break; case 0x0004: // Control frame ret |= 0x0005; break; case 0x0008: // Data frame { switch (frameCtl & 0x0300) { case 0x0000: bssid_offset = 16; break; case 0x0100: bssid_offset = 4; break; case 0x0200: bssid_offset = 10; break; } if (frameCtl == 0x0228) ret |= 0x000C; else if (frameCtl == 0x0218) ret |= 0x000D; else if (frameCtl == 0x0118) ret |= 0x000E; else ret |= 0x0008; } break; } if (frameCtl & 0x0400) ret |= 0x0100; if (WIFI_compareMAC(&packet[bssid_offset], &wifiMac.bss.bytes[0])) ret |= 0x8000; return ret; } INLINE void WIFI_MakeRXHeader(u8* buf, u16 flags, u16 xferRate, u16 len, u8 maxRSSI, u8 minRSSI) { *(u16*)&buf[0] = flags; // Unknown, seems to always be 0x0040 // except with from-DS-to-STA data+cfpoll frames (0228) *(u16*)&buf[2] = ((flags & 0xF) == 0xC) ? 0x0000 : 0x0040; // random (probably left unchanged) //*(u16*)&buf[4] = 0x0000; *(u16*)&buf[6] = xferRate; *(u16*)&buf[8] = len; // idk about those, really buf[10] = 0x20;//maxRSSI; buf[11] = 0xA0;//minRSSI; } static void WIFI_RXPutWord(u16 val) { /* abort when RX data queuing is not enabled */ if (!(wifiMac.RXCnt & 0x8000)) return; /* write the data to cursor position */ wifiMac.RAM[wifiMac.RXWriteCursor & 0xFFF] = val; /* move cursor by one */ wifiMac.RXWriteCursor++; /* wrap around */ if(wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1)) wifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1); wifiMac.RXTXAddr = wifiMac.RXWriteCursor; } #ifdef EXPERIMENTAL_WIFI_COMM static void WIFI_RXQueuePacket(u8* packet, u32 len) { if (!(wifiMac.RXCnt & 0x8000)) return; Wifi_RXPacket pkt; pkt.Data = packet; pkt.RemHWords = (len - 11) >> 1; pkt.CurOffset = 12; pkt.NotStarted = true; wifiMac.RXPacketQueue.push(pkt); } #endif template static void WIFI_IncrementRXStat() { u16 bitmasks[] = { 0x0001, 0, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0, 0x0100, 0, 0x0200, 0x0400, 0x0800, 0x1000}; u16 bitmask = bitmasks[stat]; wifiMac.RXStat[stat]++; if (wifiMac.RXStatIncIE & bitmask) { wifiMac.RXStatIncIF |= bitmask; WIFI_triggerIRQ(WIFI_IRQ_RXINC); } if (wifiMac.RXStat[stat] & 0x80) { if (wifiMac.RXStatOvfIE & bitmask) { wifiMac.RXStatOvfIF |= bitmask; WIFI_triggerIRQ(WIFI_IRQ_RXOVF); } } } // TODO: find out if this is correct at all // this was mostly guessed, like most of the MP reply functionality static void WIFI_DoAutoReply(u8* cmd) { cmd += 12; u16 frameCtl = *(u16*)&cmd[0] & 0xE7FF; if (frameCtl == 0x0228) { // if the packet we got is a multiplayer command (data+cf-poll), // check if it was destined to us u16 slaveflags = *(u16*)&cmd[24 + 2]; if (!(slaveflags & (1 << wifiMac.pid))) return; // if it was destined to us, (try to) send a reply u16 regval = WIFI_IOREG(REG_WIFI_TXBUF_REPLY1); wifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal = regval; regval &= 0x0FFF; wifiMac.RAM[regval + 6 + 1] = *(u16*)&cmd[24]; WIFI_TXStart(WIFI_TXSLOT_MPREPLY); } /*else if (frameCtl == 0x0118) { // broadcast MP ACK // this packet appears to be sent automatically // PS: nope. Enabling this code causes NSMB to break the connection even quicker. // Probably it should send the ACK itself whenever it wants to... u8 ack[32]; *(u16*)&ack[0] = 0x0218; *(u16*)&ack[2] = 0x0000; *(u16*)&ack[4] = 0x0903; *(u16*)&ack[6] = 0x00BF; *(u16*)&ack[8] = 0x0300; memcpy(&ack[10], &wifiMac.mac.bytes[0], 6); memcpy(&ack[16], &wifiMac.mac.bytes[0], 6); *(u16*)&ack[22] = wifiMac.TXSeqNo << 4; wifiMac.TXSeqNo++; *(u16*)&ack[24] = 0x0555; // lol random *(u16*)&ack[26] = 0x0000; *(u32*)&ack[28] = 0x00000000; wifiCom->SendPacket(ack, 32); }*/ } static void WIFI_TXStart(u32 slot) { WIFI_LOG(4, "TX slot %i trying to send a packet: TXCnt = %04X, TXBufLoc = %04X\n", slot, wifiMac.TXCnt, wifiMac.TXSlots[slot].RegVal); u16 reg = wifiMac.TXSlots[slot].RegVal; if (BIT15(reg)) { u16 address = reg & 0x0FFF; if (address > 0x1000-6) { WIFI_LOG(1, "TX slot %i trying to send a packet overflowing from the TX buffer (address %04X). Attempt ignored.\n", slot, (address << 1)); return; } u16 txLen = wifiMac.RAM[address+5] & 0x3FFF; if (txLen == 0) // zero length { WIFI_LOG(1, "TX slot %i trying to send a packet with length field set to zero. Attempt ignored.\n", slot); return; } u32 timemask = ((wifiMac.RAM[address+4] & 0xFF) == 20) ? 7 : 15; wifiMac.TXSlots[slot].CurAddr = address + 6; wifiMac.TXSlots[slot].RemHWords = (txLen + 1) >> 1; wifiMac.TXSlots[slot].RemPreamble = (BIT2(WIFI_IOREG(REG_WIFI_PREAMBLE)) && (timemask == 7)) ? 96 : 192; wifiMac.TXSlots[slot].TimeMask = timemask; wifiMac.TXSlots[slot].NotStarted = true; if (wifiMac.TXCurSlot < 0) wifiMac.TXCurSlot = slot; wifiMac.TXBusy |= (1 << slot); //wifiMac.rfStatus = 3; //wifiMac.rfPins = 0x0046; } } static void WIFI_PreTXAdjustments(u32 slot) { u16 reg = wifiMac.TXSlots[slot].RegVal; u16 address = reg & 0x0FFF; u16 txLen = wifiMac.RAM[address+5] & 0x3FFF; // Set sequence number if required if ((!BIT13(reg)) || (slot == WIFI_TXSLOT_BEACON)) { wifiMac.RAM[address + 6 + 11] = wifiMac.TXSeqNo << 4; wifiMac.TXSeqNo++; // TODO: find out when this happens (if it actually happens at all) // real-life NSMB multiplayer traffic capture shows no such behavior //if (slot == WIFI_TXSLOT_MPCMD) wifiMac.TXSeqNo++; } // Set timestamp (for beacons only) if (slot == WIFI_TXSLOT_BEACON) { *(u64*)&wifiMac.RAM[address + 6 + 12] = wifiMac.usec; //((u8*)wifiMac.RAM)[((address+6+12)<<1) + WIFI_IOREG(0x84)] = 0x01; } // TODO: check if this is correct // this sometimes happens in real world, but not always /*if (slot == WIFI_TXSLOT_MPREPLY) { wifiMac.RAM[address + 6 + 12] |= 0x8000; }*/ // Calculate and set FCS u32 crc32 = WIFI_calcCRC32((u8*)&wifiMac.RAM[address + 6], txLen - 4); *(u32*)&wifiMac.RAM[address + 6 + ((txLen-4) >> 1)] = crc32; } void WIFI_write16(u32 address, u16 val) { BOOL action = FALSE; if (!nds.power2.wifi) return; u32 page = address & 0x7000; // 0x2000 - 0x3FFF: unused if ((page >= 0x2000) && (page < 0x4000)) return; WIFI_LOG(5, "Write at address %08X, %04X\n", address, val); /*if (address == 0x04804008 && val == 0x0200) { printf("WIFI: Write at address %08X, %04X, pc=%08X\n", address, val, NDS_ARM7.instruct_adr); emu_halt(); }*/ // 0x4000 - 0x5FFF: wifi RAM if ((page >= 0x4000) && (page < 0x6000)) { /* access to the circular buffer */ address &= 0x1FFF; /*if (address >= 0x958 && address < (0x95A)) //address < (0x958+0x2A)) printf("PACKET[%04X] = %04X %08X %08X\n", NDS_ARM7.R[12], val, NDS_ARM7.R[14], NDS_ARM7.R[5]);*/ wifiMac.RAM[address >> 1] = val; return; } // anything else: I/O ports // only the first mirror (0x0000 - 0x0FFF) causes a special action if (page == 0x0000) action = TRUE; address &= 0x0FFF; switch (address) { case REG_WIFI_ID: break; case REG_WIFI_MODE: { u16 oldval = wifiMac.macMode; if (!BIT0(oldval) && BIT0(val)) { WIFI_IOREG(0x034) = 0x0002; wifiMac.rfPins = 0x0046; wifiMac.rfStatus = 0x0009; WIFI_IOREG(0x27C) = 0x0005; } if (BIT0(oldval) && !BIT0(val)) { WIFI_IOREG(0x27C) = 0x000A; } if (BIT13(val)) { WIFI_IOREG(REG_WIFI_WRITECSRLATCH) = 0x0000; WIFI_IOREG(0x0C0) = 0x0000; WIFI_IOREG(0x0C4) = 0x0000; WIFI_IOREG(REG_WIFI_MAYBE_RATE) = 0x0000; WIFI_IOREG(0x278) = 0x000F; } if (BIT14(val)) { wifiMac.wepMode = 0x0000; wifiMac.TXStatCnt = 0x0000; WIFI_IOREG(REG_WIFI_0A) = 0x0000; wifiMac.mac.words[0] = 0x0000; wifiMac.mac.words[1] = 0x0000; wifiMac.mac.words[2] = 0x0000; wifiMac.bss.words[0] = 0x0000; wifiMac.bss.words[1] = 0x0000; wifiMac.bss.words[2] = 0x0000; wifiMac.pid = 0x0000; wifiMac.aid = 0x0000; WIFI_IOREG(REG_WIFI_RETRYLIMIT) = 0x0707; WIFI_IOREG(0x02E) = 0x0000; WIFI_IOREG(REG_WIFI_RXRANGEBEGIN) = 0x4000; WIFI_IOREG(REG_WIFI_RXRANGEEND) = 0x4800; wifiMac.RXRangeBegin = 0x0000; // 0x4000 wifiMac.RXRangeEnd = 0x0800; // 0x4800 WIFI_IOREG(0x084) = 0x0000; WIFI_IOREG(REG_WIFI_PREAMBLE) = 0x0001; WIFI_IOREG(REG_WIFI_RXFILTER) = 0x0401; WIFI_IOREG(0x0D4) = 0x0001; WIFI_IOREG(REG_WIFI_RXFILTER2) = 0x0008; WIFI_IOREG(0x0EC) = 0x3F03; WIFI_IOREG(0x194) = 0x0000; WIFI_IOREG(0x198) = 0x0000; WIFI_IOREG(0x1A2) = 0x0001; WIFI_IOREG(0x224) = 0x0003; WIFI_IOREG(0x230) = 0x0047; } wifiMac.macMode = val & 0xAFFF; } break; case REG_WIFI_WEP: wifiMac.wepMode = val; break; case REG_WIFI_TXSTATCNT: wifiMac.TXStatCnt = val; //printf("txstatcnt=%04X\n", val); break; case REG_WIFI_IE: wifiMac.IE = val; //printf("wifi ie write %04X\n", val); break; case REG_WIFI_IF: wifiMac.IF &= ~val; /* clear flagging bits */ break; case REG_WIFI_MAC0: case REG_WIFI_MAC1: case REG_WIFI_MAC2: wifiMac.mac.words[(address - REG_WIFI_MAC0) >> 1] = val; break; case REG_WIFI_BSS0: case REG_WIFI_BSS1: case REG_WIFI_BSS2: wifiMac.bss.words[(address - REG_WIFI_BSS0) >> 1] = val; break; case REG_WIFI_RETRYLIMIT: wifiMac.retryLimit = val; break; case REG_WIFI_WEPCNT: wifiMac.WEP_enable = (val & 0x8000) != 0; break; case REG_WIFI_POWERSTATE: wifiMac.powerOn = ((val & 0x0002)?TRUE:FALSE); if(wifiMac.powerOn) WIFI_triggerIRQ(WIFI_IRQ_RFWAKEUP); break; case REG_WIFI_POWERFORCE: if((val & 0x8000) && (!wifiMac.powerOnPending)) { /* BOOL newPower = ((val & 0x0001)?FALSE:TRUE); if(newPower != wifiMac.powerOn) { if(!newPower) wifiMac.powerOn = FALSE; else wifiMac.powerOnPending = TRUE; }*/ wifiMac.powerOn = ((val & 0x0001) ? FALSE : TRUE); } break; case REG_WIFI_POWERACK: if((val == 0x0000) && wifiMac.powerOnPending) { wifiMac.powerOn = TRUE; wifiMac.powerOnPending = FALSE; } break; case REG_WIFI_POWER_TX: wifiMac.TXPower = val & 0x0007; break; case REG_WIFI_RXCNT: wifiMac.RXCnt = val & 0xFF0E; if (BIT0(val)) { wifiMac.RXWriteCursor = WIFI_IOREG(REG_WIFI_WRITECSRLATCH); WIFI_IOREG(REG_WIFI_RXHWWRITECSR) = wifiMac.RXWriteCursor; //printf("latch RX cursor: %04X @ %08X\n", wifiMac.RXWriteCursor, NDS_ARM7.instruct_adr); } if (BIT7(val)) { WIFI_LOG(2, "TXBUF_REPLY=%04X\n", WIFI_IOREG(REG_WIFI_TXBUF_REPLY1)); wifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal = WIFI_IOREG(REG_WIFI_TXBUF_REPLY1); WIFI_IOREG(REG_WIFI_TXBUF_REPLY1) = 0x0000; } if (!BIT15(val)) { while (!wifiMac.RXPacketQueue.empty()) wifiMac.RXPacketQueue.pop(); } break; case REG_WIFI_RXRANGEBEGIN: wifiMac.RXRangeBegin = val & 0x1FFE; if(wifiMac.RXWriteCursor < (wifiMac.RXRangeBegin >> 1)) wifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1); break; case REG_WIFI_RXRANGEEND: wifiMac.RXRangeEnd = val & 0x1FFE; if(wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1)) wifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1); break; case REG_WIFI_CIRCBUFRADR: wifiMac.CircBufReadAddress = (val & 0x1FFE); break; case REG_WIFI_RXREADCSR: wifiMac.RXReadCursor = val; break; case REG_WIFI_CIRCBUFWADR: wifiMac.CircBufWriteAddress = val; break; case REG_WIFI_CIRCBUFWRITE: /* set value into the circ buffer, and move cursor to the next hword on action */ //printf("wifi: circbuf fifo write at %04X, %04X (action=%i)\n", (wifiMac.CircBufWriteAddress & 0x1FFF), val, action); wifiMac.RAM[(wifiMac.CircBufWriteAddress >> 1) & 0xFFF] = val; if (action) { /* move to next hword */ wifiMac.CircBufWriteAddress+=2; if (wifiMac.CircBufWriteAddress == wifiMac.CircBufWrEnd) { /* on end of buffer, add skip hwords to it */ wifiMac.CircBufWrEnd += wifiMac.CircBufWrSkip * 2; } } break; case REG_WIFI_CIRCBUFWR_SKIP: wifiMac.CircBufWrSkip = val; break; case REG_WIFI_TXBUF_BEACON: wifiMac.TXSlots[WIFI_TXSLOT_BEACON].RegVal = val; if (BIT15(val)) WIFI_LOG(3, "Beacon transmission enabled to send the packet at %08X every %i milliseconds.\n", 0x04804000 + ((val & 0x0FFF) << 1), wifiMac.BeaconInterval); break; case REG_WIFI_TXBUF_CMD: wifiMac.TXSlots[WIFI_TXSLOT_MPCMD].RegVal = val; break; case REG_WIFI_TXBUF_LOC1: //printf("-------- TXBUF_LOC1 = %04X %08X --------\n", val, NDS_ARM7.instruct_adr); wifiMac.TXSlots[WIFI_TXSLOT_LOC1].RegVal = val; break; case REG_WIFI_TXBUF_LOC2: //printf("-------- TXBUF_LOC2 = %04X %08X --------\n", val, NDS_ARM7.instruct_adr); wifiMac.TXSlots[WIFI_TXSLOT_LOC2].RegVal = val; break; case REG_WIFI_TXBUF_LOC3: //printf("-------- TXBUF_LOC3 = %04X %08X --------\n", val, NDS_ARM7.instruct_adr); wifiMac.TXSlots[WIFI_TXSLOT_LOC3].RegVal = val; break; case REG_WIFI_TXRESET: WIFI_LOG(4, "Write to TXRESET: %04X\n", val); break; case REG_WIFI_TXREQ_RESET: wifiMac.TXCnt &= ~val; break; case REG_WIFI_TXREQ_SET: //printf("--- TXREQ=%04X ---\n", val); wifiMac.TXCnt |= val; if (BIT0(val)) WIFI_TXStart(WIFI_TXSLOT_LOC1); if (BIT1(val)) WIFI_TXStart(WIFI_TXSLOT_MPCMD); if (BIT2(val)) WIFI_TXStart(WIFI_TXSLOT_LOC2); if (BIT3(val)) WIFI_TXStart(WIFI_TXSLOT_LOC3); if (val & 0xFFF0) WIFI_LOG(2, "Unknown TXREQ bits set: %04X\n", val); break; case REG_WIFI_RFCNT: WIFI_setRF_CNT(val); break; case REG_WIFI_RFBUSY: /* CHECKME: read only? */ break; case REG_WIFI_RFDATA1: WIFI_setRF_DATA(val,0); break; case REG_WIFI_RFDATA2: WIFI_setRF_DATA(val,1); break; case REG_WIFI_USCOUNTERCNT: wifiMac.usecEnable = BIT0(val); break; case REG_WIFI_USCOMPARECNT: wifiMac.ucmpEnable = BIT0(val); break; case REG_WIFI_USCOUNTER0: wifiMac.usec = (wifiMac.usec & 0xFFFFFFFFFFFF0000ULL) | (u64)val; break; case REG_WIFI_USCOUNTER1: wifiMac.usec = (wifiMac.usec & 0xFFFFFFFF0000FFFFULL) | (u64)val << 16; break; case REG_WIFI_USCOUNTER2: wifiMac.usec = (wifiMac.usec & 0xFFFF0000FFFFFFFFULL) | (u64)val << 32; break; case REG_WIFI_USCOUNTER3: wifiMac.usec = (wifiMac.usec & 0x0000FFFFFFFFFFFFULL) | (u64)val << 48; break; case REG_WIFI_USCOMPARE0: wifiMac.ucmp = (wifiMac.ucmp & 0xFFFFFFFFFFFF0000ULL) | (u64)(val & 0xFFFE); // in NSMB multiplayer, Luigi sets USCOMPARE to the USCOUNTER of Mario, and sets bit0 // possibly bit0 writes USCOMPARE into USCOUNTER? // it seems to also trigger IRQ14 // in NSMB, Luigi sends packets on the first attempt only if we trigger IRQ14 here if (BIT0(val)) { //printf("OBSCURE BIT SET @ %08X\n", NDS_ARM7.instruct_adr); wifiMac.usec = wifiMac.ucmp; WIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON); } break; case REG_WIFI_USCOMPARE1: wifiMac.ucmp = (wifiMac.ucmp & 0xFFFFFFFF0000FFFFULL) | (u64)val << 16; break; case REG_WIFI_USCOMPARE2: wifiMac.ucmp = (wifiMac.ucmp & 0xFFFF0000FFFFFFFFULL) | (u64)val << 32; break; case REG_WIFI_USCOMPARE3: wifiMac.ucmp = (wifiMac.ucmp & 0x0000FFFFFFFFFFFFULL) | (u64)val << 48; break; case REG_WIFI_BEACONPERIOD: wifiMac.BeaconInterval = val & 0x03FF; break; case REG_WIFI_BEACONCOUNT1: wifiMac.BeaconCount1 = val; break; case REG_WIFI_BEACONCOUNT2: wifiMac.BeaconCount2 = val; break; case REG_WIFI_BBCNT: WIFI_setBB_CNT(val); break; case REG_WIFI_RXBUF_COUNT: wifiMac.RXBufCount = val & 0x0FFF; break; case REG_WIFI_EXTRACOUNTCNT: wifiMac.eCountEnable = BIT0(val); break; case REG_WIFI_EXTRACOUNT: WIFI_LOG(3, "EXTRACOUNT=%i (%i s)\n", val, val*WIFI_CMDCOUNT_SLICE); wifiMac.eCount = (u32)val * WIFI_CMDCOUNT_SLICE; break; case REG_WIFI_LISTENINT: wifiMac.ListenInterval = val & 0x00FF; break; case REG_WIFI_LISTENCOUNT: wifiMac.ListenCount = val & 0x00FF; break; case REG_WIFI_POWER_US: wifiMac.crystalEnabled = !BIT0(val); break; case REG_WIFI_IF_SET: WIFI_triggerIRQMask(val); break; case REG_WIFI_CIRCBUFRD_END: wifiMac.CircBufRdEnd = (val & 0x1FFE); break; case REG_WIFI_CIRCBUFRD_SKIP: wifiMac.CircBufRdSkip = val & 0xFFF; break; case REG_WIFI_AID_LOW: //printf("AID_LOW = %04X @ %08X %08X\n", val, NDS_ARM7.instruct_adr, NDS_ARM7.R[14]); wifiMac.pid = val & 0x0F; break; case REG_WIFI_AID_HIGH: //printf("AID_HIGH = %04X @ %08X %08X\n", val, NDS_ARM7.instruct_adr, NDS_ARM7.R[14]); wifiMac.aid = val & 0x07FF; break; case 0xD0: //printf("wifi: rxfilter=%04X\n", val); break; case 0x0E0: //printf("wifi: rxfilter2=%04X\n", val); break; case 0x84: //printf("TXBUF_TIM = %04X\n", val); break; case 0x94: printf("!!!!! TXBUF_REPLY = %04X !!!!!\n", val); break; case REG_WIFI_RXSTAT_INC_IE: wifiMac.RXStatIncIE = val; break; case REG_WIFI_RXSTAT_OVF_IE: wifiMac.RXStatOvfIE = val; break; case 0x1A8: case 0x1AC: case 0x1B0: case 0x1B2: case 0x1B4: case 0x1B6: case 0x1B8: case 0x1BA: case 0x1BC: case 0x1BE: WIFI_LOG(2, "Write to RXSTAT register: %03X = %04X\n", address, val); break; case 0x194: printf("TX_HDR_CNT = %04X\n", val); break; default: break; } WIFI_IOREG(address) = val; } u16 WIFI_read16(u32 address) { BOOL action = FALSE; if (!nds.power2.wifi) return 0; u32 page = address & 0x7000; // 0x2000 - 0x3FFF: unused if ((page >= 0x2000) && (page < 0x4000)) return 0xFFFF; WIFI_LOG(5, "Read at address %08X\n", address); // 0x4000 - 0x5FFF: wifi RAM if ((page >= 0x4000) && (page < 0x6000)) { return wifiMac.RAM[(address & 0x1FFF) >> 1]; } // anything else: I/O ports // only the first mirror causes a special action if (page == 0x0000) action = TRUE; address &= 0x0FFF; switch (address) { case REG_WIFI_ID: return WIFI_CHIPID; case REG_WIFI_MODE: return wifiMac.macMode; case REG_WIFI_WEP: return wifiMac.wepMode; case REG_WIFI_IE: return wifiMac.IE; case REG_WIFI_IF: return wifiMac.IF; case REG_WIFI_POWERSTATE: return ((wifiMac.powerOn ? 0x0000 : 0x0200) | (wifiMac.powerOnPending ? 0x0102 : 0x0000)); case REG_WIFI_RFDATA1: return WIFI_getRF_DATA(0); case REG_WIFI_RFDATA2: return WIFI_getRF_DATA(1); case REG_WIFI_RFBUSY: case REG_WIFI_BBBUSY: return 0; /* we are never busy :p */ case REG_WIFI_BBREAD: return WIFI_getBB_DATA(); case REG_WIFI_RANDOM: // probably not right, but it's better than using the unsaved and shared rand(). // at the very least, rand() shouldn't be used when movieMode is active. { u16 returnValue = wifiMac.randomSeed; wifiMac.randomSeed = (wifiMac.randomSeed & 1) ^ (((wifiMac.randomSeed << 1) & 0x7FE) | ((wifiMac.randomSeed >> 10) & 0x1)); return returnValue; } return 0; case REG_WIFI_MAC0: case REG_WIFI_MAC1: case REG_WIFI_MAC2: return wifiMac.mac.words[(address - REG_WIFI_MAC0) >> 1]; case REG_WIFI_BSS0: case REG_WIFI_BSS1: case REG_WIFI_BSS2: return wifiMac.bss.words[(address - REG_WIFI_BSS0) >> 1]; case REG_WIFI_RXCNT: return wifiMac.RXCnt; case REG_WIFI_CIRCBUFREAD: { u16 val = wifiMac.RAM[wifiMac.CircBufReadAddress >> 1]; if (action) { wifiMac.CircBufReadAddress += 2; if (wifiMac.CircBufReadAddress >= wifiMac.RXRangeEnd) { wifiMac.CircBufReadAddress = wifiMac.RXRangeBegin; } else { /* skip does not fire after a reset */ if (wifiMac.CircBufReadAddress == wifiMac.CircBufRdEnd) { wifiMac.CircBufReadAddress += wifiMac.CircBufRdSkip * 2; wifiMac.CircBufReadAddress &= 0x1FFE; if (wifiMac.CircBufReadAddress + wifiMac.RXRangeBegin == wifiMac.RXRangeEnd) wifiMac.CircBufReadAddress = 0; } } if (wifiMac.RXBufCount > 0) { if (wifiMac.RXBufCount == 1) { WIFI_triggerIRQ(WIFI_IRQ_RXCOUNTEXP); } wifiMac.RXBufCount--; } } return val; } case REG_WIFI_CIRCBUFRADR: return wifiMac.CircBufReadAddress; case REG_WIFI_RXBUF_COUNT: return wifiMac.RXBufCount; case REG_WIFI_TXREQ_READ: return wifiMac.TXCnt | 0x10; case REG_WIFI_TXBUSY: return wifiMac.TXBusy; case REG_WIFI_TXSTAT: return wifiMac.TXStat; case REG_WIFI_TXBUF_CMD: return wifiMac.TXSlots[WIFI_TXSLOT_MPCMD].RegVal; case REG_WIFI_TXBUF_REPLY2: return wifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal; case REG_WIFI_TXBUF_LOC1: return wifiMac.TXSlots[WIFI_TXSLOT_LOC1].RegVal; case REG_WIFI_TXBUF_LOC2: return wifiMac.TXSlots[WIFI_TXSLOT_LOC2].RegVal; case REG_WIFI_TXBUF_LOC3: return wifiMac.TXSlots[WIFI_TXSLOT_LOC3].RegVal; case REG_WIFI_TXBUF_BEACON: return wifiMac.TXSlots[WIFI_TXSLOT_BEACON].RegVal; case REG_WIFI_EXTRACOUNTCNT: return wifiMac.eCountEnable?1:0; case REG_WIFI_EXTRACOUNT: return (u16)((wifiMac.eCount + (WIFI_CMDCOUNT_SLICE-1)) / WIFI_CMDCOUNT_SLICE); case REG_WIFI_USCOUNTER0: return (u16)wifiMac.usec; case REG_WIFI_USCOUNTER1: return (u16)(wifiMac.usec >> 16); case REG_WIFI_USCOUNTER2: return (u16)(wifiMac.usec >> 32); case REG_WIFI_USCOUNTER3: return (u16)(wifiMac.usec >> 48); case REG_WIFI_USCOMPARE0: return (u16)wifiMac.ucmp; case REG_WIFI_USCOMPARE1: return (u16)(wifiMac.ucmp >> 16); case REG_WIFI_USCOMPARE2: return (u16)(wifiMac.ucmp >> 32); case REG_WIFI_USCOMPARE3: return (u16)(wifiMac.ucmp >> 48); case REG_WIFI_BEACONCOUNT1: return wifiMac.BeaconCount1; case REG_WIFI_BEACONCOUNT2: return wifiMac.BeaconCount2; case REG_WIFI_LISTENCOUNT: return wifiMac.ListenCount; case REG_WIFI_POWER_US: return wifiMac.crystalEnabled?0:1; case REG_WIFI_CIRCBUFRD_END: return wifiMac.CircBufRdEnd; case REG_WIFI_CIRCBUFRD_SKIP: return wifiMac.CircBufRdSkip; case REG_WIFI_AID_LOW: return wifiMac.pid; case REG_WIFI_AID_HIGH: return wifiMac.aid; // RFSTATUS, RFPINS // TODO: figure out how to emulate those correctly // without breaking Nintendo's games case REG_WIFI_RFSTATUS: return wifiMac.rfStatus; //return 9; case REG_WIFI_RFPINS: return wifiMac.rfPins; //return 0x00C6; case REG_WIFI_RXSTAT_INC_IF: { u16 ret = wifiMac.RXStatIncIF; wifiMac.RXStatIncIF = 0; return ret; } case REG_WIFI_RXSTAT_OVF_IF: { u16 ret = wifiMac.RXStatOvfIF; wifiMac.RXStatOvfIF = 0; return ret; } case REG_WIFI_RXSTAT_INC_IE: return wifiMac.RXStatIncIE; case REG_WIFI_RXSTAT_OVF_IE: return wifiMac.RXStatOvfIE; case 0x1B0: case 0x1B2: case 0x1B4: case 0x1B6: case 0x1B8: case 0x1BA: case 0x1BC: case 0x1BE: { u16 ret = *(u16*)&wifiMac.RXStat[address & 0xF]; *(u16*)&wifiMac.RXStat[address & 0xF] = 0; return ret; } case REG_WIFI_RXTXADDR: return wifiMac.RXTXAddr; case 0x84: WIFI_LOG(2, "Read to TXBUF_TIM @ %08X %08X\n", NDS_ARM7.instruct_adr, NDS_ARM7.R[14]); break; default: // printf("wifi: read unhandled reg %03X\n", address); break; } return WIFI_IOREG(address); } void WIFI_usTrigger() { wifiMac.GlobalUsecTimer++; if (wifiMac.crystalEnabled) { /* a usec has passed */ if (wifiMac.usecEnable) wifiMac.usec++; // Note: the extra counter is decremented every 10 microseconds. // To avoid a modulo every microsecond, we multiply the counter // value by 10 and decrement it every microsecond :) if (wifiMac.eCountEnable) { if (wifiMac.eCount > 0) { wifiMac.eCount--; if (wifiMac.eCount == 0) WIFI_TXStart(WIFI_TXSLOT_MPCMD); } } // The beacon counters are in milliseconds // GBATek says they're decremented every 1024 usecs if (!(wifiMac.usec & 1023)) { wifiMac.BeaconCount1--; if (wifiMac.BeaconCount1 == (WIFI_IOREG(REG_WIFI_PREBEACONCOUNT) >> 10)) WIFI_triggerIRQ(WIFI_IRQ_TIMEPREBEACON); else if (wifiMac.BeaconCount1 == 0) WIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON); if (wifiMac.BeaconCount2 > 0) { wifiMac.BeaconCount2--; if (wifiMac.BeaconCount2 == 0) WIFI_triggerIRQ(WIFI_IRQ_TIMEPOSTBEACON); } } } if ((wifiMac.ucmpEnable) && (wifiMac.ucmp == wifiMac.usec)) WIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON); if (wifiMac.TXCurSlot >= 0) { Wifi_TXSlot& slot = wifiMac.TXSlots[wifiMac.TXCurSlot]; if (slot.RemPreamble > 0) slot.RemPreamble--; else if ((wifiMac.GlobalUsecTimer & slot.TimeMask) == 0) { if (slot.NotStarted) { WIFI_PreTXAdjustments(wifiMac.TXCurSlot); WIFI_triggerIRQ(WIFI_IRQ_TXSTART); if (wifiCom) wifiCom->SendPacket((u8*)&wifiMac.RAM[slot.CurAddr], slot.RemHWords << 1); slot.NotStarted = false; } slot.RemHWords--; slot.CurAddr++; wifiMac.RXTXAddr = slot.CurAddr; if (slot.RemHWords == 0) { if (wifiMac.TXCurSlot == WIFI_TXSLOT_MPCMD) { WIFI_triggerIRQ(WIFI_IRQ_UNK); if (BIT13(wifiMac.TXStatCnt)) { WIFI_triggerIRQ(WIFI_IRQ_TXEND); wifiMac.TXStat = 0x0B01; } else if (BIT14(wifiMac.TXStatCnt)) { WIFI_triggerIRQ(WIFI_IRQ_TXEND); wifiMac.TXStat = 0x0801; } slot.RegVal &= 0x7FFF; } else if (wifiMac.TXCurSlot == WIFI_TXSLOT_BEACON) { if (BIT15(wifiMac.TXStatCnt)) { WIFI_triggerIRQ(WIFI_IRQ_TXEND); wifiMac.TXStat = 0x0301; } } else if (wifiMac.TXCurSlot == WIFI_TXSLOT_MPREPLY) { WIFI_triggerIRQ(WIFI_IRQ_TXEND); slot.RegVal &= 0x7FFF; WIFI_IOREG(REG_WIFI_TXBUF_REPLY1) = 0; } else { WIFI_triggerIRQ(WIFI_IRQ_TXEND); wifiMac.TXStat = 0x0001 | (wifiMac.TXCurSlot == 0 ? 0 : ((wifiMac.TXCurSlot - 1) << 12)); if (BIT12(slot.RegVal)) wifiMac.TXStat |= 0x0700; slot.RegVal &= 0x7FFF; } u16 addr = slot.RegVal & 0x0FFF; wifiMac.RAM[addr] = 0x0001; wifiMac.RAM[addr+4] &= 0x00FF; wifiMac.TXBusy &= ~(1 << wifiMac.TXCurSlot); int nextslot = -1; for (int i = WIFI_TXSLOT_NUM-1; i >= 0; i--) { if (BIT_N(wifiMac.TXBusy, i)) { nextslot = i; break; } } if (nextslot < 0) { //wifiMac.rfStatus = 9; //wifiMac.rfPins = 0x00C6; wifiMac.TXCurSlot = -1; } else { wifiMac.TXCurSlot = nextslot; } } } } else if (!wifiMac.RXPacketQueue.empty()) { if ((wifiMac.GlobalUsecTimer & 7) == 0) { Wifi_RXPacket& pkt = wifiMac.RXPacketQueue.front(); if (pkt.NotStarted) { WIFI_RXPutWord(*(u16*)&pkt.Data[0]); WIFI_RXPutWord(*(u16*)&pkt.Data[2]); WIFI_RXPutWord(*(u16*)&pkt.Data[4]); WIFI_RXPutWord(*(u16*)&pkt.Data[6]); WIFI_RXPutWord(*(u16*)&pkt.Data[8]); WIFI_RXPutWord(*(u16*)&pkt.Data[10]); WIFI_triggerIRQ(WIFI_IRQ_RXSTART); pkt.NotStarted = false; //wifiMac.rfStatus = 1; wifiMac.rfPins = 0x00C7; } WIFI_RXPutWord(*(u16*)&pkt.Data[pkt.CurOffset]); pkt.CurOffset += 2; pkt.RemHWords--; if (pkt.RemHWords == 0) { wifiMac.RXWriteCursor = ((wifiMac.RXWriteCursor + 1) & (~1)); if (wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1)) wifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1); WIFI_IOREG(REG_WIFI_RXHWWRITECSR) = wifiMac.RXWriteCursor; wifiMac.RXNum++; WIFI_triggerIRQ(WIFI_IRQ_RXEND); WIFI_IncrementRXStat<7>(); WIFI_DoAutoReply(pkt.Data); delete[] pkt.Data; wifiMac.RXPacketQueue.pop(); wifiMac.rfStatus = 9; wifiMac.rfPins = 0x00C6; } } } if ((wifiMac.GlobalUsecTimer & 1023) == 0) if (wifiCom) wifiCom->msTrigger(); } /******************************************************************************* Ad-hoc communication interface *******************************************************************************/ #ifdef EXPERIMENTAL_WIFI_COMM #define ADHOC_MAGIC "NDSWIFI\0" #define ADHOC_PROTOCOL_VERSION 0x0100 // v1.0 typedef struct _Adhoc_FrameHeader { char magic[8]; // "NDSWIFI\0" (null terminated string) u16 version; // Ad-hoc protocol version (for example 0x0502 = v5.2) u16 packetLen; // Length of the packet } Adhoc_FrameHeader; bool Adhoc_Init() { BOOL opt_true = TRUE; int res; if (!driver->WIFI_SocketsAvailable()) { WIFI_LOG(1, "Ad-hoc: failed to initialize sockets.\n"); wifi_socket = INVALID_SOCKET; return false; } // Create an UDP socket wifi_socket = socket(AF_INET, SOCK_DGRAM, 0); if (wifi_socket < 0) { WIFI_LOG(1, "Ad-hoc: Failed to create socket.\n"); return false; } // Enable the socket to be bound to an address/port that is already in use // This enables us to communicate with another DeSmuME instance running on the same computer. res = setsockopt(wifi_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(BOOL)); // Bind the socket to any address on port 7000 sockaddr_t saddr; saddr.sa_family = AF_INET; *(u32*)&saddr.sa_data[2] = htonl(INADDR_ANY); *(u16*)&saddr.sa_data[0] = htons(BASEPORT); res = bind(wifi_socket, &saddr, sizeof(sockaddr_t)); if (res < 0) { WIFI_LOG(1, "Ad-hoc: failed to bind the socket.\n"); closesocket(wifi_socket); wifi_socket = INVALID_SOCKET; return false; } // Enable broadcast mode // Not doing so results in failure when sendto'ing to broadcast address res = setsockopt(wifi_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(BOOL)); if (res < 0) { WIFI_LOG(1, "Ad-hoc: failed to enable broadcast mode.\n"); closesocket(wifi_socket); wifi_socket = INVALID_SOCKET; return false; } // Prepare an address structure for sending packets sendAddr.sa_family = AF_INET; *(u32*)&sendAddr.sa_data[2] = htonl(INADDR_BROADCAST); *(u16*)&sendAddr.sa_data[0] = htons(BASEPORT); Adhoc_Reset(); WIFI_LOG(1, "Ad-hoc: initialization successful.\n"); return true; } void Adhoc_DeInit() { if (wifi_socket >= 0) closesocket(wifi_socket); } void Adhoc_Reset() { driver->WIFI_GetUniqueMAC(FW_Mac); NDS_PatchFirmwareMAC(); printf("WIFI: ADHOC: MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", FW_Mac[0], FW_Mac[1], FW_Mac[2], FW_Mac[3], FW_Mac[4], FW_Mac[5]); } void Adhoc_SendPacket(u8* packet, u32 len) { if (wifi_socket < 0) return; WIFI_LOG(3, "Ad-hoc: sending a packet of %i bytes, frame control: %04X\n", len, *(u16*)&packet[0]); u32 frameLen = sizeof(Adhoc_FrameHeader) + len; u8* frame = new u8[frameLen]; u8* ptr = frame; Adhoc_FrameHeader header; strncpy(header.magic, ADHOC_MAGIC, 8); header.version = ADHOC_PROTOCOL_VERSION; header.packetLen = len; memcpy(ptr, &header, sizeof(Adhoc_FrameHeader)); ptr += sizeof(Adhoc_FrameHeader); memcpy(ptr, packet, len); int nbytes = sendto(wifi_socket, (const char*)frame, frameLen, 0, &sendAddr, sizeof(sockaddr_t)); WIFI_LOG(4, "Ad-hoc: sent %i/%i bytes of packet.\n", nbytes, frameLen); delete[] frame; } void Adhoc_msTrigger() { if (wifi_socket < 0) return; // Check every millisecond if we received a packet fd_set fd; struct timeval tv; FD_ZERO(&fd); FD_SET(wifi_socket, &fd); tv.tv_sec = 0; tv.tv_usec = 0; if (select(1, &fd, 0, 0, &tv)) { sockaddr_t fromAddr; socklen_t fromLen = sizeof(sockaddr_t); u8 buf[1536]; u8* ptr; u16 packetLen; int nbytes = recvfrom(wifi_socket, (char*)buf, 1536, 0, &fromAddr, &fromLen); // No packet arrived (or there was an error) if (nbytes <= 0) return; ptr = buf; Adhoc_FrameHeader header = *(Adhoc_FrameHeader*)ptr; // Check the magic string in header if (strncmp(header.magic, ADHOC_MAGIC, 8)) return; // Check the ad-hoc protocol version if (header.version != ADHOC_PROTOCOL_VERSION) return; packetLen = header.packetLen - 4; ptr += sizeof(Adhoc_FrameHeader); // If the packet is for us, send it to the wifi core if (!WIFI_compareMAC(&ptr[10], &wifiMac.mac.bytes[0])) { if (WIFI_isBroadcastMAC(&ptr[16]) || WIFI_compareMAC(&ptr[16], &wifiMac.bss.bytes[0]) || WIFI_isBroadcastMAC(&wifiMac.bss.bytes[0])) { /* WIFI_LOG(3, "Ad-hoc: received a packet of %i bytes from %i.%i.%i.%i (port %i).\n", nbytes, (u8)fromAddr.sa_data[2], (u8)fromAddr.sa_data[3], (u8)fromAddr.sa_data[4], (u8)fromAddr.sa_data[5], ntohs(*(u16*)&fromAddr.sa_data[0]));*/ WIFI_LOG(3, "Ad-hoc: received a packet of %i bytes, frame control: %04X\n", packetLen, *(u16*)&ptr[0]); WIFI_LOG(4, "Storing packet at %08X.\n", 0x04804000 + (wifiMac.RXWriteCursor<<1)); u8* packet = new u8[12 + packetLen]; WIFI_MakeRXHeader(packet, WIFI_GetRXFlags(ptr), 20, packetLen, 0, 0); memcpy(&packet[12], ptr, packetLen); WIFI_RXQueuePacket(packet, 12+packetLen); } } } } /******************************************************************************* SoftAP (fake wifi access point) *******************************************************************************/ // Note on the CRC32 field in received packets: // The wifi hardware doesn't store the CRC32 in memory when receiving a packet // so the RX header length field is indeed header+body // Hence the CRC32 has been removed from those templates. // If you wanna change SoftAP's MAC address, change this // Warning, don't mistake this for an array, it isn't #define SOFTAP_MACADDR 0x00, 0xF0, 0x1A, 0x2B, 0x3C, 0x4D const u8 SoftAP_MACAddr[6] = {SOFTAP_MACADDR}; const u8 SoftAP_Beacon[] = { /* 802.11 header */ 0x80, 0x00, // Frame control 0x00, 0x00, // Duration ID 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp (modified later) 0x80, 0x00, // Beacon interval 0x21, 0x00, // Capablilty information 0x01, 0x02, 0x82, 0x84, // Supported rates 0x03, 0x01, 0x06, // Current channel 0x05, 0x04, 0x02, 0x01, 0x00, 0x00, // TIM (no idea what the hell it is) 0x00, 0x06, 'S', 'o', 'f', 't', 'A', 'P', // SSID }; const u8 SoftAP_ProbeResponse[] = { /* 802.11 header */ 0x50, 0x00, // Frame control 0x00, 0x00, // Duration ID 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp (modified later) 0x80, 0x00, // Beacon interval 0x21, 0x00, // Capablilty information 0x01, 0x02, 0x82, 0x84, // Supported rates 0x03, 0x01, 0x06, // Current channel 0x00, 0x06, 'S', 'o', 'f', 't', 'A', 'P', // SSID }; const u8 SoftAP_AuthFrame[] = { /* 802.11 header */ 0xB0, 0x00, // Frame control 0x00, 0x00, // Duration ID 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x00, 0x00, // Authentication algorithm 0x02, 0x00, // Authentication sequence 0x00, 0x00, // Status }; const u8 SoftAP_AssocResponse[] = { /* 802.11 header */ 0x10, 0x00, // Frame control 0x00, 0x00, // Duration ID 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x21, 0x00, // Capability information 0x00, 0x00, // Status 0x01, 0xC0, // Assocation ID 0x01, 0x02, 0x82, 0x84, // Supported rates }; // Deauthentication frame - sent if the user chose not to connect to WFC const u8 SoftAP_DeauthFrame[] = { /* 802.11 header */ 0xC0, 0x00, // Frame control 0x00, 0x00, // Duration ID 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56, // Receiver SOFTAP_MACADDR, // Sender SOFTAP_MACADDR, // BSSID 0x00, 0x00, // Sequence control /* Frame body */ 0x01, 0x00, // Reason code (is "unspecified" ok?) }; //todo - make a class to wrap this //todo - zeromus - inspect memory leak safety of all this static pcap_if_t * WIFI_index_device(pcap_if_t *alldevs, int index) { pcap_if_t *curr = alldevs; for(int i = 0; i < index; i++) { if (curr->next == NULL) { CommonSettings.wifi.infraBridgeAdapter = i; break; } curr = curr->next; } WIFI_LOG(2, "SoftAP: using %s as device.\n", curr->PCAP_DEVICE_NAME); return curr; } bool SoftAP_Init() { if (!driver->WIFI_PCapAvailable()) { WIFI_LOG(1, "SoftAP: PCap library not available on your system.\n"); wifi_bridge = NULL; return false; } char errbuf[PCAP_ERRBUF_SIZE]; pcap_if_t *alldevs; int ret = 0; ret = driver->PCAP_findalldevs(&alldevs, errbuf); if (ret == -1 || alldevs == NULL) { WIFI_LOG(1, "SoftAP: PCap: failed to find any network adapter: %s\n", errbuf); return false; } pcap_if_t* dev = WIFI_index_device(alldevs,CommonSettings.wifi.infraBridgeAdapter); wifi_bridge = driver->PCAP_open(dev->name, PACKET_SIZE, PCAP_OPENFLAG_PROMISCUOUS, 1, errbuf); if(wifi_bridge == NULL) { WIFI_LOG(1, "SoftAP: PCap: failed to open %s: %s\n", dev->PCAP_DEVICE_NAME, errbuf); return false; } driver->PCAP_freealldevs(alldevs); // Set non-blocking mode if (driver->PCAP_setnonblock(wifi_bridge, 1, errbuf) == -1) { WIFI_LOG(1, "SoftAP: PCap: failed to set non-blocking mode: %s\n", errbuf); driver->PCAP_close(wifi_bridge); wifi_bridge = NULL; return false; } SoftAP_Reset(); return true; } void SoftAP_DeInit() { if(wifi_bridge != NULL) driver->PCAP_close(wifi_bridge); } void SoftAP_Reset() { SoftAP.status = APStatus_Disconnected; SoftAP.seqNum = 0; } static bool SoftAP_IsDNSRequestToWFC(u16 ethertype, u8* body) { // Check the various headers... if (ntohs(ethertype) != 0x0800) return false; // EtherType: IP if (body[0] != 0x45) return false; // Version: 4, header len: 5 if (body[9] != 0x11) return false; // Protocol: UDP if (ntohs(*(u16*)&body[22]) != 53) return false; // Dest. port: 53 (DNS) if (htons(ntohs(*(u16*)&body[28+2])) & 0x8000) return false; // must be a query // Analyze each question u16 numquestions = ntohs(*(u16*)&body[28+4]); u32 curoffset = 28+12; for (u16 curquestion = 0; curquestion < numquestions; curquestion++) { // Assemble the requested domain name u8 bitlength = 0; char domainname[256] = ""; while ((bitlength = body[curoffset++]) != 0) { strncat(domainname, (const char*)&body[curoffset], bitlength); curoffset += bitlength; if (body[curoffset] != 0) strcat(domainname, "."); } // if the domain name contains nintendowifi.net // it is most likely a WFC server // (note, conntest.nintendowifi.net just contains a dummy HTML page and // is used for connection tests, I think we can let this one slide) if ((strstr(domainname, "nintendowifi.net") != NULL) && (strcmp(domainname, "conntest.nintendowifi.net") != 0)) return true; // Skip the type and class - we don't care about that curoffset += 4; } return false; } static void SoftAP_Deauthenticate() { u32 packetLen = sizeof(SoftAP_DeauthFrame); u8* packet = new u8[12 + packetLen]; memcpy(&packet[12], SoftAP_DeauthFrame, packetLen); memcpy(&packet[12 + 4], FW_Mac, 6); // Receiver MAC *(u16*)&packet[12 + 22] = SoftAP.seqNum << 4; // Sequence number SoftAP.seqNum++; u16 rxflags = 0x0010; if (WIFI_compareMAC(wifiMac.bss.bytes, &packet[12 + 16])) rxflags |= 0x8000; WIFI_MakeRXHeader(packet, rxflags, 20, packetLen, 0, 0); WIFI_RXQueuePacket(packet, 12 + packetLen); SoftAP.status = APStatus_Disconnected; } void SoftAP_SendPacket(u8 *packet, u32 len) { u16 frameCtl = *(u16*)&packet[0]; WIFI_LOG(3, "SoftAP: Received a packet of length %i bytes. Frame control = %04X\n", len, frameCtl); //use this to log wifi messages easily /*static int ctr=0; char buf[100]; sprintf(buf,"wifi%04d.txt",ctr); FILE* outf = fopen(buf,"wb"); fwrite(packet,1,len,outf); fclose(outf); ctr++;*/ switch((frameCtl >> 2) & 0x3) { case 0x0: // Management frame { u32 packetLen; u8* rpacket; switch((frameCtl >> 4) & 0xF) { case 0x4: // Probe request { packetLen = sizeof(SoftAP_ProbeResponse); rpacket = new u8[12 + packetLen]; memcpy(&rpacket[12], SoftAP_ProbeResponse, packetLen); // Add the timestamp *(u64*)&rpacket[12 + 24] = wifiMac.GlobalUsecTimer; } break; case 0xB: // Authentication { packetLen = sizeof(SoftAP_AuthFrame); rpacket = new u8[12 + packetLen]; memcpy(&rpacket[12], SoftAP_AuthFrame, packetLen); SoftAP.status = APStatus_Authenticated; } break; case 0x0: // Association request { if (SoftAP.status != APStatus_Authenticated) return; packetLen = sizeof(SoftAP_AssocResponse); rpacket = new u8[12 + packetLen]; memcpy(&rpacket[12], SoftAP_AssocResponse, packetLen); SoftAP.status = APStatus_Associated; WIFI_LOG(1, "SoftAP connected!\n"); } break; case 0xA: // Disassociation SoftAP.status = APStatus_Authenticated; return; case 0xC: // Deauthentication SoftAP.status = APStatus_Disconnected; WIFI_LOG(1, "SoftAP disconnected\n"); return; default: WIFI_LOG(2, "SoftAP: unknown management frame type %04X\n", (frameCtl >> 4) & 0xF); return; } memcpy(&rpacket[12 + 4], FW_Mac, 6); // Receiver MAC *(u16*)&rpacket[12 + 22] = SoftAP.seqNum << 4; // Sequence number SoftAP.seqNum++; u16 rxflags = 0x0010; if (WIFI_compareMAC(wifiMac.bss.bytes, &rpacket[12 + 16])) rxflags |= 0x8000; WIFI_MakeRXHeader(rpacket, rxflags, 20, packetLen, 0, 0); // make the RX header WIFI_RXQueuePacket(rpacket, 12 + packetLen); } break; case 0x2: // Data frame { // If it has a LLC/SLIP header, send it over the Ethernet if (((*(u16*)&packet[24]) == 0xAAAA) && ((*(u16*)&packet[26]) == 0x0003) && ((*(u16*)&packet[28]) == 0x0000)) { if (SoftAP.status != APStatus_Associated) return; if (SoftAP_IsDNSRequestToWFC(*(u16*)&packet[30], &packet[32])) { SoftAP_Deauthenticate(); return; } u32 epacketLen = ((len - 30 - 4) + 14); u8 epacket[2048]; //printf("----- SENDING ETHERNET PACKET: len=%i, ethertype=%04X -----\n", // len, *(u16*)&packet[30]); memcpy(&epacket[0], &packet[16], 6); memcpy(&epacket[6], &packet[10], 6); *(u16*)&epacket[12] = *(u16*)&packet[30]; memcpy(&epacket[14], &packet[32], epacketLen - 14); if(wifi_bridge != NULL) driver->PCAP_sendpacket(wifi_bridge, epacket, epacketLen); } else { WIFI_LOG(1, "SoftAP: received non-Ethernet data frame. wtf?\n"); } } break; } } INLINE void SoftAP_SendBeacon() { u32 packetLen = sizeof(SoftAP_Beacon); u8* packet = new u8[12 + packetLen]; memcpy(&packet[12], SoftAP_Beacon, packetLen); // Copy the beacon template *(u16*)&packet[12 + 22] = SoftAP.seqNum << 4; // Sequence number SoftAP.seqNum++; *(u64*)&packet[12 + 24] = wifiMac.GlobalUsecTimer; // Timestamp u16 rxflags = 0x0011; if (WIFI_compareMAC(wifiMac.bss.bytes, &packet[12 + 16])) rxflags |= 0x8000; WIFI_MakeRXHeader(packet, rxflags, 20, packetLen, 0, 0); WIFI_RXQueuePacket(packet, 12 + packetLen); } static void SoftAP_RXHandler(u_char* user, const struct pcap_pkthdr* h, const u_char* _data) { // safety checks if ((_data == NULL) || (h == NULL)) return; u8* data = (u8*)_data; // reject the packet if it wasn't for us if (!(WIFI_isBroadcastMAC(&data[0]) || WIFI_compareMAC(&data[0], wifiMac.mac.bytes))) return; // reject the packet if we just sent it if (WIFI_compareMAC(&data[6], wifiMac.mac.bytes)) return; // The packet was for us. Let's process it then. int wpacketLen = WIFI_alignedLen(26 + 6 + (h->len-14)); u8* wpacket = new u8[12 + wpacketLen]; u16 rxflags = 0x0018; if (WIFI_compareMAC(wifiMac.bss.bytes, (u8*)SoftAP_MACAddr)) rxflags |= 0x8000; // Make a valid 802.11 frame WIFI_MakeRXHeader(wpacket, rxflags, 20, wpacketLen, 0, 0); *(u16*)&wpacket[12+0] = 0x0208; *(u16*)&wpacket[12+2] = 0x0000; memcpy(&wpacket[12+4], &data[0], 6); memcpy(&wpacket[12+10], SoftAP_MACAddr, 6); memcpy(&wpacket[12+16], &data[6], 6); *(u16*)&wpacket[12+22] = SoftAP.seqNum << 4; *(u16*)&wpacket[12+24] = 0xAAAA; *(u16*)&wpacket[12+26] = 0x0003; *(u16*)&wpacket[12+28] = 0x0000; *(u16*)&wpacket[12+30] = *(u16*)&data[12]; memcpy(&wpacket[12+32], &data[14], h->len-14); SoftAP.seqNum++; WIFI_RXQueuePacket(wpacket, 12 + wpacketLen); } void SoftAP_msTrigger() { //zero sez: every 1/10 second? does it have to be precise? this is so costly.. // Okay for 128 ms then if((wifiMac.GlobalUsecTimer & 131071) == 0) SoftAP_SendBeacon(); // EXTREMELY EXPERIMENTAL packet receiving code // Can now receive 64 packets per millisecond. Completely arbitrary limit. Todo: tweak if needed. // But due to using non-blocking mode, this shouldn't be as slow as it used to be. if (wifi_bridge != NULL) driver->PCAP_dispatch(wifi_bridge, 64, SoftAP_RXHandler, NULL); } #endif desmume-0.9.9/src/MMU_timing.h0000644000175000017500000003436012140261633016673 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2007 shash Copyright (C) 2007-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ // this file is split from MMU.h for the purpose of avoiding ridiculous recompile times // when changing it, because practically everything includes MMU.h. #ifndef MMUTIMING_H #define MMUTIMING_H #include #include "MMU.h" #include "cp15.h" #include "readwrite.h" #include "debug.h" #include "NDSSystem.h" //////////////////////////////////////////////////////////////// // MEMORY TIMING ACCURACY CONFIGURATION // // the more of these are enabled, // the more accurate memory access timing _should_ become. // they should be listed roughly in order of most to least important. // it's reasonable to disable some of these as a speed hack. // obviously, these defines don't cover all the variables or features needed, // and in particular, DMA or code+data access bus contention is still missing. //disable this to prevent the advanced timing logic from ever running at all #define ENABLE_ADVANCED_TIMING #ifdef ENABLE_ADVANCED_TIMING // makes non-sequential accesses slower than sequential ones. #define ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS //(SOMETIMES THIS IS A BIG SPEED HIT!) // enables emulation of code fetch waits. #define ACCOUNT_FOR_CODE_FETCH_CYCLES // makes access to DTCM (arm9 only) fast. #define ACCOUNT_FOR_DATA_TCM_SPEED // enables simulation of cache hits and cache misses. #define ENABLE_CACHE_CONTROLLER_EMULATION #endif //ENABLE_ADVANCED_TIMING // //////////////////////////////////////////////////////////////// FORCEINLINE bool USE_TIMING() { #ifdef ENABLE_ADVANCED_TIMING return CommonSettings.advanced_timing; #else return false; #endif } enum MMU_ACCESS_DIRECTION { MMU_AD_READ, MMU_AD_WRITE }; // note that we don't actually emulate the cache contents here, // only enough to guess what would be a cache hit or a cache miss. // this doesn't really get used unless ENABLE_CACHE_CONTROLLER_EMULATION is defined. template class CacheController { public: template FORCEINLINE bool Cached(u32 addr) { u32 blockMasked = addr & BLOCKMASK; if(blockMasked == m_cacheCache) return true; else return this->CachedInternal(addr, blockMasked); } void Reset() { for(int blockIndex = 0; blockIndex < NUMBLOCKS; blockIndex++) m_blocks[blockIndex].Reset(); m_cacheCache = ~0; } CacheController() { Reset(); } void savestate(EMUFILE* os, int version) { write32le(m_cacheCache, os); for(int i = 0; i < NUMBLOCKS; i++) { for(int j = 0; j < ASSOCIATIVITY; j++) write32le(m_blocks[i].tag[j],os); write32le(m_blocks[i].nextWay,os); } } bool loadstate(EMUFILE* is, int version) { read32le(&m_cacheCache, is); for(int i = 0; i < NUMBLOCKS; i++) { for(int j = 0; j < ASSOCIATIVITY; j++) read32le(&m_blocks[i].tag[j],is); read32le(&m_blocks[i].nextWay,is); } return true; } private: template bool CachedInternal(u32 addr, u32 blockMasked) { u32 blockIndex = blockMasked >> BLOCKSIZESHIFT; CacheBlock& block = m_blocks[blockIndex]; addr &= TAGMASK; for(int way = 0; way < ASSOCIATIVITY; way++) if(addr == block.tag[way]) { // found it, already allocated m_cacheCache = blockMasked; return true; } if(DIR == MMU_AD_READ) { // TODO: support other allocation orders? block.tag[block.nextWay++] = addr; block.nextWay %= ASSOCIATIVITY; m_cacheCache = blockMasked; } return false; } enum { SIZE = 1 << SIZESHIFT }; enum { ASSOCIATIVITY = 1 << ASSOCIATIVESHIFT }; enum { BLOCKSIZE = 1 << BLOCKSIZESHIFT }; enum { TAGSHIFT = SIZESHIFT - ASSOCIATIVESHIFT }; enum { TAGMASK = (u32)(~0 << TAGSHIFT) }; enum { BLOCKMASK = ((u32)~0 >> (32 - TAGSHIFT)) & (u32)(~0 << BLOCKSIZESHIFT) }; enum { WORDSIZE = sizeof(u32) }; enum { WORDSPERBLOCK = (1 << BLOCKSIZESHIFT) / WORDSIZE }; enum { DATAPERWORD = WORDSIZE * ASSOCIATIVITY }; enum { DATAPERBLOCK = DATAPERWORD * WORDSPERBLOCK }; enum { NUMBLOCKS = SIZE / DATAPERBLOCK }; struct CacheBlock { u32 tag [ASSOCIATIVITY]; u32 nextWay; void Reset() { nextWay = 0; for(int way = 0; way < ASSOCIATIVITY; way++) tag[way] = 0; } }; u32 m_cacheCache; // optimization CacheBlock m_blocks [NUMBLOCKS]; }; template FORCEINLINE u32 _MMU_accesstime(u32 addr, bool sequential); template class FetchAccessUnit { public: template FORCEINLINE u32 Fetch(u32 address) { #ifdef ACCOUNT_FOR_CODE_FETCH_CYCLES const bool prohibit = TIMING; #else const bool prohibit = false; #endif if(AT == MMU_AT_CODE && !prohibit) { return 1; } u32 time = _MMU_accesstime(address, #ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS (TIMING? (address == (m_lastAddress + (READSIZE>>3))) :true ) #else true #endif ); #ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS m_lastAddress = address; #endif return time; } void Reset() { m_lastAddress = ~0; } FetchAccessUnit() { this->Reset(); } void savestate(EMUFILE* os, int version) { write32le(m_lastAddress,os); } bool loadstate(EMUFILE* is, int version) { read32le(&m_lastAddress,is); return true; } private: u32 m_lastAddress; }; struct MMU_struct_timing { // technically part of the cp15, but I didn't want the dereferencing penalty. // these template values correspond with the value of armcp15->cacheType. CacheController<13,2,5> arm9codeCache; // 8192 bytes, 4-way associative, 32-byte blocks CacheController<12,2,5> arm9dataCache; // 4096 bytes, 4-way associative, 32-byte blocks // technically part of armcpu_t, but that struct isn't templated on PROCNUM FetchAccessUnit<0,MMU_AT_CODE> arm9codeFetch; FetchAccessUnit<0,MMU_AT_DATA> arm9dataFetch; FetchAccessUnit<1,MMU_AT_CODE> arm7codeFetch; FetchAccessUnit<1,MMU_AT_DATA> arm7dataFetch; template FORCEINLINE FetchAccessUnit& armCodeFetch(); template FORCEINLINE FetchAccessUnit& armDataFetch(); }; template<> FORCEINLINE FetchAccessUnit<0,MMU_AT_CODE>& MMU_struct_timing::armCodeFetch<0>() { return this->arm9codeFetch; } template<> FORCEINLINE FetchAccessUnit<1,MMU_AT_CODE>& MMU_struct_timing::armCodeFetch<1>() { return this->arm7codeFetch; } template<> FORCEINLINE FetchAccessUnit<0,MMU_AT_DATA>& MMU_struct_timing::armDataFetch<0>() { return this->arm9dataFetch; } template<> FORCEINLINE FetchAccessUnit<1,MMU_AT_DATA>& MMU_struct_timing::armDataFetch<1>() { return this->arm7dataFetch; } extern MMU_struct_timing MMU_timing; // calculates the time a single memory access takes, // in units of cycles of the current processor. // this function replaces what used to be MMU_WAIT16 and MMU_WAIT32. // this may have side effects, so don't call it more than necessary. template FORCEINLINE u32 _MMU_accesstime(u32 addr, bool sequential) { static const int MC = 1; // cached or tcm memory speed static const int M32 = (PROCNUM==ARMCPU_ARM9) ? 2 : 1; // access through 32-bit bus static const int M16 = M32 * ((READSIZE>16) ? 2 : 1); // access through 16-bit bus static const int MSLW = M16 * 8; // this needs tuning if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE && addr < 0x02000000) return MC; // ITCM #ifdef ACCOUNT_FOR_DATA_TCM_SPEED if(TIMING && PROCNUM==ARMCPU_ARM9 && AT==MMU_AT_DATA && (addr&(~0x3FFF)) == MMU.DTCMRegion) return MC; // DTCM #endif // for now, assume the cache is always enabled for all of main memory if(AT != MMU_AT_DMA && TIMING && PROCNUM==ARMCPU_ARM9 && (addr & 0x0F000000) == 0x02000000) { #ifdef ENABLE_CACHE_CONTROLLER_EMULATION bool cached = false; if(AT==MMU_AT_CODE) cached = MMU_timing.arm9codeCache.Cached(addr); if(AT==MMU_AT_DATA) cached = MMU_timing.arm9dataCache.Cached(addr); if(cached) return MC; u32 c; if(sequential && AT==MMU_AT_DATA) c = M16; // bonus for sequential data access else if(DIRECTION == MMU_AD_READ) c = M16 * 5; else c = M16 * 2; // should be 4, but write buffer isn't emulated yet. if(DIRECTION == MMU_AD_READ) { // cache miss while reading means it has to fill a whole cache line // by reading 32 bytes... c += 8 * M32*2; } if(CheckDebugEvent(DEBUG_EVENT_CACHE_MISS)) { DebugEventData.addr = addr; DebugEventData.size = READSIZE; HandleDebugEvent(DEBUG_EVENT_CACHE_MISS); } return c; #elif defined(ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS) // this is the closest approximation I could find // to the with-cache-controller timing // that doesn't do any actual caching logic. return sequential ? MC : M16; #endif } static const TWaitState MMU_WAIT[16*16] = { // ITCM, ITCM, MAIN, SWI, REG, VMEM, LCD, OAM, ROM, ROM, RAM, U, U, U, U, BIOS #define X MC, MC, M16, M32, M32, M16, M16, M32, MSLW, MSLW, MSLW, M32,M32,M32,M32, M32, // duplicate it 16 times (this was somehow faster than using a mask of 0xF) X X X X X X X X X X X X X X X X #undef X }; u32 c = MMU_WAIT[(addr >> 24)]; #ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS if(TIMING && !sequential) { //if(c != MC || PROCNUM==ARMCPU_ARM7) // check not needed anymore because ITCM/DTCM return earlier { c += (PROCNUM==ARMCPU_ARM9) ? 3*2 : 1; } } #endif return c; } // calculates the cycle time of a single memory access in the MEM stage. // to be used to calculate the memCycles argument for MMU_aluMemCycles. // this may have side effects, so don't call it more than necessary. template FORCEINLINE u32 MMU_memAccessCycles(u32 addr) { if(TIMING) return MMU_timing.armDataFetch().template Fetch((addr)&(~((READSIZE>>3)-1))); else return MMU_timing.armDataFetch().template Fetch((addr)&(~((READSIZE>>3)-1))); } template FORCEINLINE u32 MMU_memAccessCycles(u32 addr) { if(USE_TIMING()) return MMU_memAccessCycles(addr); else return MMU_memAccessCycles(addr); } // calculates the cycle time of a single code fetch in the FETCH stage // to be used to calculate the fetchCycles argument for MMU_fetchExecuteCycles. // this may have side effects, so don't call it more than necessary. template FORCEINLINE u32 MMU_codeFetchCycles(u32 addr) { if(USE_TIMING()) return MMU_timing.armCodeFetch().template Fetch((addr)&(~((READSIZE>>3)-1))); else return MMU_timing.armCodeFetch().template Fetch((addr)&(~((READSIZE>>3)-1))); } // calculates the cycle contribution of ALU + MEM stages (= EXECUTE) // given ALU cycle time and the summation of multiple memory access cycle times. // this function might belong more in armcpu, but I don't think it matters. template FORCEINLINE u32 MMU_aluMemCycles(u32 aluCycles, u32 memCycles) { if(PROCNUM==ARMCPU_ARM9) { // ALU and MEM are different stages of the 5-stage pipeline. // we approximate the pipeline throughput using max, // since simply adding the cycles of each instruction together // fails to take into account the parallelism of the arm pipeline // and would make the emulated system unnaturally slow. return std::max(aluCycles, memCycles); } else { // ALU and MEM are part of the same stage of the 3-stage pipeline, // thus they occur in sequence and we can simply add the counts together. return aluCycles + memCycles; } } // calculates the cycle contribution of ALU + MEM stages (= EXECUTE) // given ALU cycle time and the description of a single memory access. // this may have side effects, so don't call it more than necessary. template FORCEINLINE u32 MMU_aluMemAccessCycles(u32 aluCycles, u32 addr) { u32 memCycles; if(USE_TIMING()) memCycles = MMU_memAccessCycles(addr); else memCycles = MMU_memAccessCycles(addr); return MMU_aluMemCycles(aluCycles, memCycles); } // calculates the cycle contribution of FETCH + EXECUTE stages // given executeCycles = the combined ALU+MEM cycles // and fetchCycles = the cycle time of the FETCH stage // this function might belong more in armcpu, but I don't think it matters. template FORCEINLINE u32 MMU_fetchExecuteCycles(u32 executeCycles, u32 fetchCycles) { #ifdef ACCOUNT_FOR_CODE_FETCH_CYCLES const bool allow = true; #else const bool allow = false; #endif if(USE_TIMING() && allow) { // execute and fetch are different stages of the pipeline for both arm7 and arm9. // again, we approximate the pipeline throughput using max. return std::max(executeCycles, fetchCycles); // TODO: add an option to support conflict between MEM and FETCH cycles // if they're both using the same data bus. // in the case of a conflict this should be: // return std::max(aluCycles, memCycles + fetchCycles); } return executeCycles; } #endif //MMUTIMING_H desmume-0.9.9/src/ROMReader.cpp0000644000175000017500000001160112140261633016772 0ustar guillaumeguillaume/* Copyright 2007 Guillaume Duhamel Copyright 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "ROMReader.h" #include #include #include #ifdef HAVE_LIBZZIP #include #endif #ifdef WIN32 #define stat(...) _stat(__VA_ARGS__) #define S_IFMT _S_IFMT #define S_IFREG _S_IFREG #endif ROMReader_struct * ROMReaderInit(char ** filename) { #ifdef HAVE_LIBZ if(!strcasecmp(".gz", *filename + (strlen(*filename) - 3))) { (*filename)[strlen(*filename) - 3] = '\0'; return &GZIPROMReader; } #endif #ifdef HAVE_LIBZZIP if (!strcasecmp(".zip", *filename + (strlen(*filename) - 4))) { (*filename)[strlen(*filename) - 4] = '\0'; return &ZIPROMReader; } #endif return &STDROMReader; } void * STDROMReaderInit(const char * filename); void STDROMReaderDeInit(void *); u32 STDROMReaderSize(void *); int STDROMReaderSeek(void *, int, int); int STDROMReaderRead(void *, void *, u32); ROMReader_struct STDROMReader = { ROMREADER_STD, "Standard ROM Reader", STDROMReaderInit, STDROMReaderDeInit, STDROMReaderSize, STDROMReaderSeek, STDROMReaderRead }; void * STDROMReaderInit(const char * filename) { #ifdef WIN32 struct _stat sb; #else struct stat sb; #endif if (stat(filename, &sb) == -1) return 0; if ((sb.st_mode & S_IFMT) != S_IFREG) return 0; return (void *) fopen(filename, "rb"); } void STDROMReaderDeInit(void * file) { if (!file) return ; fclose((FILE*)file); } u32 STDROMReaderSize(void * file) { u32 size; if (!file) return 0 ; fseek((FILE*)file, 0, SEEK_END); size = ftell((FILE*)file); fseek((FILE*)file, 0, SEEK_SET); return size; } int STDROMReaderSeek(void * file, int offset, int whence) { if (!file) return 0 ; return fseek((FILE*)file, offset, whence); } int STDROMReaderRead(void * file, void * buffer, u32 size) { if (!file) return 0 ; return fread(buffer, 1, size, (FILE*)file); } #ifdef HAVE_LIBZ void * GZIPROMReaderInit(const char * filename); void GZIPROMReaderDeInit(void *); u32 GZIPROMReaderSize(void *); int GZIPROMReaderSeek(void *, int, int); int GZIPROMReaderRead(void *, void *, u32); ROMReader_struct GZIPROMReader = { ROMREADER_GZIP, "Gzip ROM Reader", GZIPROMReaderInit, GZIPROMReaderDeInit, GZIPROMReaderSize, GZIPROMReaderSeek, GZIPROMReaderRead }; void * GZIPROMReaderInit(const char * filename) { return (void*)gzopen(filename, "rb"); } void GZIPROMReaderDeInit(void * file) { gzclose((gzFile)file); } u32 GZIPROMReaderSize(void * file) { char useless[1024]; u32 size = 0; /* FIXME this function should first save the current * position and restore it after size calculation */ gzrewind((gzFile)file); while (gzeof ((gzFile)file) == 0) size += gzread((gzFile)file, useless, 1024); gzrewind((gzFile)file); return size; } int GZIPROMReaderSeek(void * file, int offset, int whence) { return gzseek((gzFile)file, offset, whence); } int GZIPROMReaderRead(void * file, void * buffer, u32 size) { return gzread((gzFile)file, buffer, size); } #endif #ifdef HAVE_LIBZZIP void * ZIPROMReaderInit(const char * filename); void ZIPROMReaderDeInit(void *); u32 ZIPROMReaderSize(void *); int ZIPROMReaderSeek(void *, int, int); int ZIPROMReaderRead(void *, void *, u32); ROMReader_struct ZIPROMReader = { ROMREADER_ZIP, "Zip ROM Reader", ZIPROMReaderInit, ZIPROMReaderDeInit, ZIPROMReaderSize, ZIPROMReaderSeek, ZIPROMReaderRead }; void * ZIPROMReaderInit(const char * filename) { ZZIP_DIR * dir = zzip_opendir(filename); ZZIP_DIRENT * dirent = zzip_readdir(dir); if (dir != NULL) { char tmp1[1024]; char tmp2[1024]; memset(tmp1,0,sizeof(tmp1)); memset(tmp2,0,sizeof(tmp2)); strncpy(tmp1, filename, strlen(filename) - 4); sprintf(tmp2, "%s/%s", tmp1, dirent->d_name); return zzip_fopen(tmp2, "rb"); } return NULL; } void ZIPROMReaderDeInit(void * file) { zzip_close((ZZIP_FILE*)file); } u32 ZIPROMReaderSize(void * file) { u32 size; zzip_seek((ZZIP_FILE*)file, 0, SEEK_END); size = zzip_tell((ZZIP_FILE*)file); zzip_seek((ZZIP_FILE*)file, 0, SEEK_SET); return size; } int ZIPROMReaderSeek(void * file, int offset, int whence) { return zzip_seek((ZZIP_FILE*)file, offset, whence); } int ZIPROMReaderRead(void * file, void * buffer, u32 size) { #ifdef ZZIP_OLD_READ return zzip_read((ZZIP_FILE*)file, (char *) buffer, size); #else return zzip_read((ZZIP_FILE*)file, buffer, size); #endif } #endif desmume-0.9.9/src/types.h0000644000175000017500000002665012140261633016035 0ustar guillaumeguillaume/* Copyright (C) 2005 Guillaume Duhamel Copyright (C) 2008-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef TYPES_HPP #define TYPES_HPP //analyze microsoft compilers #ifdef _MSC_VER #define _WINDOWS //todo - everyone will want to support this eventually, i suppose #include "config.h" #endif //enforce a constraint: gdb stub requires developer #if defined(GDB_STUB) && !defined(DEVELOPER) #define DEVELOPER #endif #ifdef DEVELOPER #define IF_DEVELOPER(X) X #else #define IF_DEVELOPER(X) #endif #ifdef _WINDOWS //#define HAVE_WX //not useful yet.... #define HAVE_LIBAGG #define ENABLE_SSE #define ENABLE_SSE2 #ifdef DEVELOPER #define HAVE_LUA #endif #define HAVE_JIT #endif #ifdef __GNUC__ #ifdef __SSE__ #define ENABLE_SSE #endif #ifdef __SSE2__ #define ENABLE_SSE2 #endif #endif #ifdef NOSSE #undef ENABLE_SSE #endif #ifdef NOSSE2 #undef ENABLE_SSE2 #endif #ifdef _MSC_VER #define strcasecmp(x,y) _stricmp(x,y) #define strncasecmp(x, y, l) strnicmp(x, y, l) #define snprintf _snprintf #else #define WINAPI #endif #ifdef __GNUC__ #include #ifndef PATH_MAX #define MAX_PATH 1024 #else #define MAX_PATH PATH_MAX #endif #endif #if defined(_MSC_VER) || defined(__INTEL_COMPILER) #define DS_ALIGN(X) __declspec(align(X)) #elif defined(__GNUC__) #define DS_ALIGN(X) __attribute__ ((aligned (X))) #else #define DS_ALIGN(X) #endif #define CACHE_ALIGN DS_ALIGN(32) //use this for example when you want a byte value to be better-aligned #define FAST_ALIGN DS_ALIGN(4) #ifdef __MINGW32__ #define FASTCALL __attribute__((fastcall)) #define ASMJIT_CALL_CONV kX86FuncConvGccFastCall #elif defined (__i386__) && !defined(__clang__) #define FASTCALL __attribute__((regparm(3))) #define ASMJIT_CALL_CONV kX86FuncConvGccRegParm3 #elif defined(_MSC_VER) || defined(__INTEL_COMPILER) #define FASTCALL #define ASMJIT_CALL_CONV kX86FuncConvDefault #else #define FASTCALL #define ASMJIT_CALL_CONV kX86FuncConvDefault #endif #ifdef _MSC_VER #define _CDECL_ __cdecl #else #define _CDECL_ #endif #ifndef INLINE #if defined(_MSC_VER) || defined(__INTEL_COMPILER) #define INLINE _inline #else #define INLINE inline #endif #endif #ifndef FORCEINLINE #if defined(_MSC_VER) || defined(__INTEL_COMPILER) #define FORCEINLINE __forceinline #define MSC_FORCEINLINE __forceinline #else #define FORCEINLINE inline __attribute__((always_inline)) #define MSC_FORCEINLINE #endif #endif #ifndef NOINLINE #ifdef __GNUC__ #define NOINLINE __attribute__((noinline)) #else #define NOINLINE #endif #endif #if defined(__LP64__) typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; typedef signed char s8; typedef signed short s16; typedef signed int s32; typedef signed long long s64; #else typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; #if defined(_MSC_VER) || defined(__INTEL_COMPILER) typedef unsigned __int64 u64; #else typedef unsigned long long u64; #endif typedef signed char s8; typedef signed short s16; typedef signed int s32; #if defined(_MSC_VER) || defined(__INTEL_COMPILER) typedef __int64 s64; #else typedef signed long long s64; #endif #endif typedef u8 uint8; typedef u16 uint16; #ifndef OBJ_C typedef u32 uint32; #else #define uint32 u32 //uint32 is defined in Leopard somewhere, avoid conflicts #endif /*---------- GPU3D fixed-points types -----------*/ typedef s32 f32; #define inttof32(n) ((n) << 12) #define f32toint(n) ((n) >> 12) #define floattof32(n) ((int32)((n) * (1 << 12))) #define f32tofloat(n) (((float)(n)) / (float)(1<<12)) typedef s16 t16; #define f32tot16(n) ((t16)(n >> 8)) #define inttot16(n) ((n) << 4) #define t16toint(n) ((n) >> 4) #define floattot16(n) ((t16)((n) * (1 << 4))) #define t16ofloat(n) (((float)(n)) / (float)(1<<4)) typedef s16 v16; #define inttov16(n) ((n) << 12) #define f32tov16(n) (n) #define floattov16(n) ((v16)((n) * (1 << 12))) #define v16toint(n) ((n) >> 12) #define v16tofloat(n) (((float)(n)) / (float)(1<<12)) typedef s16 v10; #define inttov10(n) ((n) << 9) #define f32tov10(n) ((v10)(n >> 3)) #define v10toint(n) ((n) >> 9) #define floattov10(n) ((v10)((n) * (1 << 9))) #define v10tofloat(n) (((float)(n)) / (float)(1<<9)) /*----------------------*/ #ifndef OBJ_C typedef int BOOL; #else //apple also defines BOOL typedef int desmume_BOOL; #define BOOL desmume_BOOL #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifdef __BIG_ENDIAN__ #ifndef WORDS_BIGENDIAN #define WORDS_BIGENDIAN #endif #endif #ifdef WORDS_BIGENDIAN # define LOCAL_BE #else # define LOCAL_LE #endif /* little endian (ds' endianess) to local endianess convert macros */ #ifdef LOCAL_BE /* local arch is big endian */ # define LE_TO_LOCAL_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff)) # define LE_TO_LOCAL_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff)) # define LE_TO_LOCAL_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff00)|(((x)>>40)&0xff00)|(((x)>>56)&0xff)) # define LOCAL_TO_LE_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff)) # define LOCAL_TO_LE_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff)) # define LOCAL_TO_LE_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff00)|(((x)>>40)&0xff00)|(((x)>>56)&0xff)) #else /* local arch is little endian */ # define LE_TO_LOCAL_16(x) (x) # define LE_TO_LOCAL_32(x) (x) # define LE_TO_LOCAL_64(x) (x) # define LOCAL_TO_LE_16(x) (x) # define LOCAL_TO_LE_32(x) (x) # define LOCAL_TO_LE_64(x) (x) #endif // kilobytes and megabytes macro #define MB(x) ((x)*1024*1024) #define KB(x) ((x)*1024) #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define CPU_STR(c) ((c==ARM9)?"ARM9":"ARM7") typedef enum { ARM9 = 0, ARM7 = 1 } cpu_id_t; ///endian-flips count bytes. count should be even and nonzero. inline void FlipByteOrder(u8 *src, u32 count) { u8 *start=src; u8 *end=src+count-1; if((count&1) || !count) return; /* This shouldn't happen. */ while(count--) { u8 tmp; tmp=*end; *end=*start; *start=tmp; end--; start++; } } inline u64 double_to_u64(double d) { union { u64 a; double b; } fuxor; fuxor.b = d; return fuxor.a; } inline double u64_to_double(u64 u) { union { u64 a; double b; } fuxor; fuxor.a = u; return fuxor.b; } inline u32 float_to_u32(float f) { union { u32 a; float b; } fuxor; fuxor.b = f; return fuxor.a; } inline float u32_to_float(u32 u) { union { u32 a; float b; } fuxor; fuxor.a = u; return fuxor.b; } ///stores a 32bit value into the provided byte array in guaranteed little endian form inline void en32lsb(u8 *buf, u32 morp) { buf[0]=(u8)(morp); buf[1]=(u8)(morp>>8); buf[2]=(u8)(morp>>16); buf[3]=(u8)(morp>>24); } inline void en16lsb(u8* buf, u16 morp) { buf[0]=(u8)morp; buf[1]=(u8)(morp>>8); } ///unpacks a 64bit little endian value from the provided byte array into host byte order inline u64 de64lsb(u8 *morp) { return morp[0]|(morp[1]<<8)|(morp[2]<<16)|(morp[3]<<24)|((u64)morp[4]<<32)|((u64)morp[5]<<40)|((u64)morp[6]<<48)|((u64)morp[7]<<56); } ///unpacks a 32bit little endian value from the provided byte array into host byte order inline u32 de32lsb(u8 *morp) { return morp[0]|(morp[1]<<8)|(morp[2]<<16)|(morp[3]<<24); } ///unpacks a 16bit little endian value from the provided byte array into host byte order inline u16 de16lsb(u8 *morp) { return morp[0]|(morp[1]<<8); } #ifndef ARRAY_SIZE //taken from winnt.h extern "C++" // templates cannot be declared to have 'C' linkage template char (*BLAHBLAHBLAH( UNALIGNED T (&)[N] ))[N]; #define ARRAY_SIZE(A) (sizeof(*BLAHBLAHBLAH(A))) #endif //fairly standard for loop macros #define MACRODO1(TRICK,TODO) { const int X = TRICK; TODO; } #define MACRODO2(X,TODO) { MACRODO1((X),TODO) MACRODO1(((X)+1),TODO) } #define MACRODO4(X,TODO) { MACRODO2((X),TODO) MACRODO2(((X)+2),TODO) } #define MACRODO8(X,TODO) { MACRODO4((X),TODO) MACRODO4(((X)+4),TODO) } #define MACRODO16(X,TODO) { MACRODO8((X),TODO) MACRODO8(((X)+8),TODO) } #define MACRODO32(X,TODO) { MACRODO16((X),TODO) MACRODO16(((X)+16),TODO) } #define MACRODO64(X,TODO) { MACRODO32((X),TODO) MACRODO32(((X)+32),TODO) } #define MACRODO128(X,TODO) { MACRODO64((X),TODO) MACRODO64(((X)+64),TODO) } #define MACRODO256(X,TODO) { MACRODO128((X),TODO) MACRODO128(((X)+128),TODO) } //this one lets you loop any number of times (as long as N<256) #define MACRODO_N(N,TODO) {\ if((N)&0x100) MACRODO256(0,TODO); \ if((N)&0x080) MACRODO128((N)&(0x100),TODO); \ if((N)&0x040) MACRODO64((N)&(0x100|0x080),TODO); \ if((N)&0x020) MACRODO32((N)&(0x100|0x080|0x040),TODO); \ if((N)&0x010) MACRODO16((N)&(0x100|0x080|0x040|0x020),TODO); \ if((N)&0x008) MACRODO8((N)&(0x100|0x080|0x040|0x020|0x010),TODO); \ if((N)&0x004) MACRODO4((N)&(0x100|0x080|0x040|0x020|0x010|0x008),TODO); \ if((N)&0x002) MACRODO2((N)&(0x100|0x080|0x040|0x020|0x010|0x008|0x004),TODO); \ if((N)&0x001) MACRODO1((N)&(0x100|0x080|0x040|0x020|0x010|0x008|0x004|0x002),TODO); \ } //--------------------------- //Binary constant generator macro By Tom Torfs - donated to the public domain //turn a numeric literal into a hex constant //(avoids problems with leading zeroes) //8-bit constants max value 0x11111111, always fits in unsigned long #define HEX__(n) 0x##n##LU //8-bit conversion function #define B8__(x) ((x&0x0000000FLU)?1:0) \ +((x&0x000000F0LU)?2:0) \ +((x&0x00000F00LU)?4:0) \ +((x&0x0000F000LU)?8:0) \ +((x&0x000F0000LU)?16:0) \ +((x&0x00F00000LU)?32:0) \ +((x&0x0F000000LU)?64:0) \ +((x&0xF0000000LU)?128:0) //for upto 8-bit binary constants #define B8(d) ((unsigned char)B8__(HEX__(d))) // for upto 16-bit binary constants, MSB first #define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)<<8) \ + B8(dlsb)) // for upto 32-bit binary constants, MSB first */ #define B32(dmsb,db2,db3,dlsb) (((unsigned long)B8(dmsb)<<24) \ + ((unsigned long)B8(db2)<<16) \ + ((unsigned long)B8(db3)<<8) \ + B8(dlsb)) //Sample usage: //B8(01010101) = 85 //B16(10101010,01010101) = 43605 //B32(10000000,11111111,10101010,01010101) = 2164238933 //--------------------------- #ifndef CTASSERT #define CTASSERT(x) typedef char __assert ## y[(x) ? 1 : -1] #endif static const char hexValid[23] = {"0123456789ABCDEFabcdef"}; template inline void reconstruct(T* t) { t->~T(); new(t) T(); } //-------------fixed point speedup macros #ifdef _WIN32 #include #endif FORCEINLINE s64 fx32_mul(const s32 a, const s32 b) { #ifdef _WIN32 return __emul(a,b); #else return ((s64)a)*((s64)b); #endif } FORCEINLINE s32 fx32_shiftdown(const s64 a) { #ifdef _WIN32 return (s32)__ll_rshift(a,12); #else return (s32)(a>>12); #endif } FORCEINLINE s64 fx32_shiftup(const s32 a) { #ifdef _WIN32 return __ll_lshift(a,12); #else return ((s64)a)<<12; #endif } #endif desmume-0.9.9/src/wx/0000755000175000017500000000000012140305320015135 5ustar guillaumeguillaumedesmume-0.9.9/src/wx/wxdesmume.desktop0000644000175000017500000000033512140261617020561 0ustar guillaumeguillaume[Desktop Entry] Version=1.0 Type=Application Name=DeSmuME (WxWidgets) Comment=Nintento DS emulator TryExec=wxdesmume Exec=wxdesmume Icon=DeSmuME Categories=GNOME;GTK;Game;Emulator; MimeType=application/x-nintendo-ds-rom; desmume-0.9.9/src/wx/Makefile.am0000644000175000017500000000237512140261617017212 0ustar guillaumeguillaumeinclude $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += -DHAVE_WX=1 -DHAVE_X11=1 $(WX_CPPFLAGS) $(SDL_CFLAGS) $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) Applicationsdir = $(datadir)/applications Applications_DATA = wxdesmume.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = DeSmuME.xpm EXTRA_DIST = wxdesmume.desktop DeSmuME.xpm bin_PROGRAMS = wxdesmume wxdesmume_SOURCES = \ ../sndsdl.cpp \ ../driver.h ../driver.cpp \ ../wxdlg/wxdlg3dViewer.h ../wxdlg/wxdlg3dViewer.cpp \ ../wxdlg/wxcontrolsconfigdialog.h ../wxdlg/wxcontrolsconfigdialog.cpp \ PadSimple/pluginspecs_pad.h \ PadSimple/PadSimple.h PadSimple/PadSimple.cpp \ PadSimple/GUI/ConfigDlg.h PadSimple/GUI/ConfigDlg.cpp \ InputCommon/X11InputBase.h InputCommon/X11InputBase.cpp \ InputCommon/XInput.h InputCommon/XInput.cpp \ InputCommon/InputCommon.h InputCommon/InputCommon.cpp \ InputCommon/Event.hpp \ InputCommon/EventHandler.h InputCommon/EventHandler.cpp \ InputCommon/Configuration.cpp \ InputCommon/SDL.h InputCommon/SDL.cpp \ LuaWindow.h \ StringUtil.h StringUtil.cpp \ wxMain.cpp wxdesmume_LDADD = ../libdesmume.a \ $(SDL_LIBS) $(GTHREAD_LIBS) $(GLIB_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) $(WX_LIBS) $(LIBSOUNDTOUCH_LIBS) -lX11 if HAVE_GDB_STUB wxdesmume_LDADD += ../gdbstub/libgdbstub.a endif desmume-0.9.9/src/wx/PadSimple/0000755000175000017500000000000012140305320017013 5ustar guillaumeguillaumedesmume-0.9.9/src/wx/PadSimple/GUI/0000755000175000017500000000000012140305320017437 5ustar guillaumeguillaumedesmume-0.9.9/src/wx/PadSimple/GUI/ConfigDlg.cpp0000644000175000017500000005306212140261617022017 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include #include "common.h" #include "ConfigDlg.h" #include "../PadSimple.h" #ifdef _WIN32 #include "XInput.h" #include "../../InputCommon/DirectInputBase.h" // Core DInput m_dinput; #endif BEGIN_EVENT_TABLE(PADConfigDialogSimple,wxDialog) EVT_SHOW(PADConfigDialogSimple::OnShow) EVT_CLOSE(PADConfigDialogSimple::OnClose) EVT_BUTTON(ID_CLOSE,PADConfigDialogSimple::OnCloseClick) EVT_BUTTON(ID_PAD_ABOUT,PADConfigDialogSimple::DllAbout) EVT_CHECKBOX(ID_X360PAD,PADConfigDialogSimple::ControllerSettingsChanged) EVT_CHOICE(ID_X360PAD_CHOICE,PADConfigDialogSimple::ControllerSettingsChanged) EVT_CHECKBOX(ID_RUMBLE,PADConfigDialogSimple::ControllerSettingsChanged) EVT_CHECKBOX(ID_DISABLE,PADConfigDialogSimple::ControllerSettingsChanged) // Input recording #ifdef RERECORDING EVT_CHECKBOX(ID_RECORDING,PADConfigDialogSimple::ControllerSettingsChanged) EVT_CHECKBOX(ID_PLAYBACK,PADConfigDialogSimple::ControllerSettingsChanged) EVT_BUTTON(ID_SAVE_RECORDING,PADConfigDialogSimple::ControllerSettingsChanged) #endif EVT_BUTTON(CTL_A, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_B, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_X, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_Y, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_Z, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_START, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_L, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_R, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_L_SEMI, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_R_SEMI, PADConfigDialogSimple::OnButtonClick) EVT_SLIDER(ID_TRIGGER_SEMIVALUE, PADConfigDialogSimple::ControllerSettingsChanged) EVT_BUTTON(CTL_MAINUP, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_MAINDOWN, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_MAINLEFT, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_MAINRIGHT, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_MAIN_SEMI, PADConfigDialogSimple::OnButtonClick) EVT_SLIDER(ID_MAIN_SEMIVALUE, PADConfigDialogSimple::ControllerSettingsChanged) EVT_BUTTON(CTL_SUBUP, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_SUBDOWN, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_SUBLEFT, PADConfigDialogSimple::OnButtonClick) EVT_SLIDER(ID_SUB_SEMIVALUE, PADConfigDialogSimple::ControllerSettingsChanged) EVT_BUTTON(CTL_SUBRIGHT, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_SUB_SEMI, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_DPADUP, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_DPADDOWN, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_DPADLEFT, PADConfigDialogSimple::OnButtonClick) EVT_BUTTON(CTL_DPADRIGHT, PADConfigDialogSimple::OnButtonClick) END_EVENT_TABLE() PADConfigDialogSimple::PADConfigDialogSimple(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style) : wxDialog(parent, id, title, position, size, style) { ClickedButton = NULL; CreateGUIControls(); Fit(); // Connect keydown to the window wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, wxKeyEventHandler(PADConfigDialogSimple::OnKeyDown), (wxObject*)NULL, this); Show(); } PADConfigDialogSimple::~PADConfigDialogSimple() { } // Create input button controls // ------------------- inline void AddControl(wxPanel *pan, wxButton **button, wxStaticBoxSizer *sizer, const char *name, int ctl, int controller) { wxBoxSizer *hButton = new wxBoxSizer(wxHORIZONTAL); char keyStr[10] = {0}; // Add the label hButton->Add(new wxStaticText(pan, 0, wxString::FromAscii(name), wxDefaultPosition, wxDefaultSize), 0, wxALIGN_CENTER_VERTICAL|wxALL); // Give it the mapped key name #ifdef _WIN32 DInput::DIKToString(pad[controller].keyForControl[ctl], keyStr); #elif defined(HAVE_X11) && HAVE_X11 InputCommon::XKeyToString(pad[controller].keyForControl[ctl], keyStr); #endif // Add the button to its sizer *button = new wxButton(pan, ctl, wxString::FromAscii(keyStr), wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS); hButton->Add(*button, 0, wxALIGN_RIGHT|wxALL); sizer->Add(hButton, 0, wxALIGN_RIGHT|wxALL); } // Create input slider controls // ------------------- inline void PADConfigDialogSimple::AddSlider(wxPanel *pan, wxSlider **slider, wxStaticBoxSizer *sizer, const char *name, int ctl, int controller) { wxBoxSizer *hSlider = new wxBoxSizer(wxHORIZONTAL); int semivalue, maxvalue; std::stringstream ss; // Add the label hSlider->Add(new wxStaticText(pan, 0, wxString::FromAscii(name), wxDefaultPosition, wxDefaultSize), 0, wxALIGN_CENTER_VERTICAL|wxALL); // Do everything else switch (ctl) { case ID_TRIGGER_SEMIVALUE: semivalue = pad[controller].Trigger_semivalue; maxvalue = TRIGGER_FULL; // Add the slider to its sizer *slider = new wxSlider(pan, ctl, semivalue, 0, maxvalue, wxDefaultPosition, wxSize(100,-1)); (**slider).SetPageSize(32); hSlider->Add(*slider, 0, wxALIGN_RIGHT|wxALL); sizer->Add(hSlider, 0, wxALIGN_RIGHT|wxALL); // Add numeric value label to sizer ss << pad[controller].Trigger_semivalue; m_Trigger_SemiValue_Label[controller] = new wxStaticText(pan, 0, wxString::FromAscii( ss.str().c_str() ), wxDefaultPosition, wxSize(25, -1)); hSlider->Add(m_Trigger_SemiValue_Label[controller], 0, wxALIGN_CENTER_VERTICAL|wxALL); break; case ID_MAIN_SEMIVALUE: semivalue = pad[controller].Main_stick_semivalue; maxvalue = STICK_FULL; // Add the slider to its sizer *slider = new wxSlider(pan, ctl, semivalue, 0, maxvalue, wxDefaultPosition, wxSize(100, -1)); (**slider).SetPageSize(10); hSlider->Add(*slider, 0, wxALIGN_RIGHT|wxALL); sizer->Add(hSlider, 0, wxALIGN_RIGHT|wxALL); // Add numeric value label to sizer ss << pad[controller].Main_stick_semivalue; m_Stick_SemiValue_Label[controller] = new wxStaticText(pan, 0, wxString::FromAscii( ss.str().c_str() ), wxDefaultPosition, wxSize(25, -1)); hSlider->Add(m_Stick_SemiValue_Label[controller], 0, wxALIGN_CENTER_VERTICAL|wxALL); break; case ID_SUB_SEMIVALUE: semivalue = pad[controller].Sub_stick_semivalue; maxvalue = STICK_FULL; // Add the slider to its sizer *slider = new wxSlider(pan, ctl, semivalue, 0, maxvalue, wxDefaultPosition, wxSize(100,-1)); (**slider).SetPageSize(10); hSlider->Add(*slider, 0, wxALIGN_RIGHT|wxALL); sizer->Add(hSlider, 0, wxALIGN_RIGHT|wxALL); // Add numeric value label to sizer ss << pad[controller].Sub_stick_semivalue; m_CStick_SemiValue_Label[controller] = new wxStaticText(pan, 0, wxString::FromAscii( ss.str().c_str() ), wxDefaultPosition, wxSize(25, -1)); hSlider->Add(m_CStick_SemiValue_Label[controller], 0, wxALIGN_CENTER_VERTICAL|wxALL); break; } } void PADConfigDialogSimple::CreateGUIControls() { // Notebook m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize); // Controller pages m_Controller[0] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE1, wxDefaultPosition, wxDefaultSize); m_Notebook->AddPage(m_Controller[0], wxT("Controller 1")); m_Controller[1] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE2, wxDefaultPosition, wxDefaultSize); m_Notebook->AddPage(m_Controller[1], wxT("Controller 2")); m_Controller[2] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE3, wxDefaultPosition, wxDefaultSize); m_Notebook->AddPage(m_Controller[2], wxT("Controller 3")); m_Controller[3] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE4, wxDefaultPosition, wxDefaultSize); m_Notebook->AddPage(m_Controller[3], wxT("Controller 4")); // Standard buttons m_Close = new wxButton(this, ID_CLOSE, wxT("Close"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_About = new wxButton(this, ID_PAD_ABOUT, wxT("About"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); // Put notebook and standard buttons in sizers wxBoxSizer* sSButtons; sSButtons = new wxBoxSizer(wxHORIZONTAL); sSButtons->Add(m_About,0,wxALL, 5); sSButtons->Add(0, 0, 1, wxEXPAND, 5); sSButtons->Add(m_Close, 0, wxALL, 5); wxBoxSizer* sMain; sMain = new wxBoxSizer(wxVERTICAL); sMain->Add(m_Notebook, 1, wxEXPAND|wxALL, 5); sMain->Add(sSButtons, 0, wxEXPAND, 5); this->SetSizer(sMain); this->Layout(); #ifdef _WIN32 // Add connected XPads for (int x = 0; x < 4; x++) { XINPUT_STATE xstate; DWORD xresult = XInputGetState(x, &xstate); if (xresult == ERROR_SUCCESS) { arrayStringFor_X360Pad.Add(wxString::Format(wxT("%i"), x+1)); } } #endif for(int i = 0; i < 4; i++) { // -------------------------------------------------------------------- // Settings // ----------------------------- // Main horizontal container sDevice[i] = new wxBoxSizer(wxHORIZONTAL); sbDevice[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Controller Settings")); m_Disable[i] = new wxCheckBox(m_Controller[i], ID_DISABLE, wxT("Disable when Dolphin is not in focus"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); sbDevice[i]->Add(m_Disable[i], 0, wxEXPAND|wxALL, 1); #ifdef _WIN32 m_SizeXInput[i] = new wxStaticBoxSizer(wxHORIZONTAL, m_Controller[i], wxT("XInput Pad")); m_X360Pad[i] = new wxCheckBox(m_Controller[i], ID_X360PAD, wxT("Enable X360Pad"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_X360PadC[i] = new wxChoice(m_Controller[i], ID_X360PAD_CHOICE, wxDefaultPosition, wxDefaultSize, arrayStringFor_X360Pad, 0, wxDefaultValidator); m_Rumble[i] = new wxCheckBox(m_Controller[i], ID_RUMBLE, wxT("Enable rumble"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_SizeXInput[i]->Add(m_X360Pad[i], 0, wxEXPAND | wxALL, 1); m_SizeXInput[i]->Add(m_X360PadC[i], 0, wxEXPAND | wxALL, 1); m_SizeXInput[i]->Add(m_Rumble[i], 0, wxEXPAND | wxALL, 1); #endif // Set values m_Disable[i]->SetValue(pad[i].bDisable); #ifdef _WIN32 // Check if any XInput pad was found if (arrayStringFor_X360Pad.IsEmpty()) { m_X360Pad[i]->SetLabel(wxT("Enable X360Pad - No pad connected")); m_X360Pad[i]->SetValue(false); m_X360Pad[i]->Enable(false); pad[i].bEnableXPad = false; m_X360PadC[i]->Hide(); m_Rumble[i]->Hide(); } else { m_X360Pad[i]->SetValue(pad[i].bEnableXPad); m_X360PadC[i]->SetSelection(pad[i].XPadPlayer); m_X360PadC[i]->Enable(m_X360Pad[i]->IsChecked()); m_Rumble[i]->SetValue(pad[i].bRumble); m_Rumble[i]->Enable(m_X360Pad[i]->IsChecked()); } #endif // Sizers sDevice[i]->Add(sbDevice[i], 0, wxEXPAND | wxALL, 1); //sDevice[i]->AddStretchSpacer(); #ifdef _WIN32 sDevice[i]->Add(m_SizeXInput[i], 0, wxEXPAND | wxALL, 1); #endif // ----------------------------------- // Rerecording // --------- #ifdef RERECORDING // Create controls m_SizeRecording[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Input Recording")); m_CheckRecording[i] = new wxCheckBox(m_Controller[i], ID_RECORDING, wxT("Record input")); m_CheckPlayback[i] = new wxCheckBox(m_Controller[i], ID_PLAYBACK, wxT("Play back input")); m_BtnSaveRecording[i] = new wxButton(m_Controller[i], ID_SAVE_RECORDING, wxT("Save recording"), wxDefaultPosition, wxDefaultSize); // Tool tips m_CheckRecording[i]->SetToolTip(wxT("Your recording will be saved to pad-record.bin in the Dolphin dir when you stop the game")); m_CheckPlayback[i]->SetToolTip(wxT("Play back the pad-record.bin file from the Dolphin dir")); m_BtnSaveRecording[i]->SetToolTip(wxT( "This will save the current recording to pad-record.bin. Your recording will\n" "also be automatically saved every 60 * 10 frames. And when you shut down the\n" "game.")); // Sizers m_SizeRecording[i]->Add(m_CheckRecording[i], 0, wxEXPAND | wxALL, 1); m_SizeRecording[i]->Add(m_CheckPlayback[i], 0, wxEXPAND | wxALL, 1); m_SizeRecording[i]->Add(m_BtnSaveRecording[i], 0, wxEXPAND | wxALL, 1); // Only enable these options for pad 0 m_CheckRecording[i]->Enable(false); m_CheckRecording[0]->Enable(true); m_CheckPlayback[i]->Enable(false); m_CheckPlayback[0]->Enable(true); m_BtnSaveRecording[i]->Enable(false); m_BtnSaveRecording[0]->Enable(true); // Don't allow saving when we are not recording m_BtnSaveRecording[i]->Enable(g_EmulatorRunning && pad[0].bRecording); sDevice[i]->Add(m_SizeRecording[i], 0, wxEXPAND | wxALL, 1); // Set values m_CheckRecording[0]->SetValue(pad[0].bRecording); m_CheckPlayback[0]->SetValue(pad[0].bPlayback); //DEBUG_LOG(CONSOLE, "m_CheckRecording: %i\n", pad[0].bRecording, pad[0].bPlayback); #endif // -------------------------------------------------------------------- // Buttons // ----------------------------- sButtons[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Buttons")); AddControl(m_Controller[i], &(m_ButtonA[i]), sButtons[i], "A: ", CTL_A, i); AddControl(m_Controller[i], &(m_ButtonB[i]), sButtons[i], "B: ", CTL_B, i); AddControl(m_Controller[i], &(m_ButtonX[i]), sButtons[i], "X: ", CTL_X, i); AddControl(m_Controller[i], &(m_ButtonY[i]), sButtons[i], "Y: ", CTL_Y, i); AddControl(m_Controller[i], &(m_ButtonZ[i]), sButtons[i], "Z: ", CTL_Z, i); AddControl(m_Controller[i], &(m_ButtonStart[i]), sButtons[i], "Start: ", CTL_START, i); sTriggers[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Triggers")); AddControl(m_Controller[i], &(m_ButtonL[i]), sTriggers[i], "L: ", CTL_L, i); AddControl(m_Controller[i], &(m_ButtonR[i]), sTriggers[i], "R: ", CTL_R, i); AddControl(m_Controller[i], &(m_ButtonL_Semi[i]), sTriggers[i], "Semi-L: ", CTL_L_SEMI, i); AddControl(m_Controller[i], &(m_ButtonR_Semi[i]), sTriggers[i], "Semi-R: ", CTL_R_SEMI, i); AddSlider(m_Controller[i], &(m_Trigger_SemiValue[i]), sTriggers[i], "Semi: ", ID_TRIGGER_SEMIVALUE, i); sStick[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Main Stick")); AddControl(m_Controller[i], &(m_StickUp[i]), sStick[i], "Up: ", CTL_MAINUP, i); AddControl(m_Controller[i], &(m_StickDown[i]), sStick[i], "Down: ", CTL_MAINDOWN, i); AddControl(m_Controller[i], &(m_StickLeft[i]), sStick[i], "Left: ", CTL_MAINLEFT, i); AddControl(m_Controller[i], &(m_StickRight[i]), sStick[i], "Right: ", CTL_MAINRIGHT, i); AddControl(m_Controller[i], &(m_Stick_Semi[i]), sStick[i], "Semi-press: ", CTL_MAIN_SEMI, i); AddSlider(m_Controller[i], &(m_Stick_SemiValue[i]), sStick[i], "Semi: ", ID_MAIN_SEMIVALUE, i); sDPad[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("D-Pad")); AddControl(m_Controller[i], &(m_DPadUp[i]), sDPad[i], "Up: ", CTL_DPADUP, i); AddControl(m_Controller[i], &(m_DPadDown[i]), sDPad[i], "Down: ", CTL_DPADDOWN, i); AddControl(m_Controller[i], &(m_DPadLeft[i]), sDPad[i], "Left: ", CTL_DPADLEFT, i); AddControl(m_Controller[i], &(m_DPadRight[i]), sDPad[i], "Right: ", CTL_DPADRIGHT, i); sCStick[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("C-Stick")); AddControl(m_Controller[i], &(m_CStickUp[i]), sCStick[i], "Up: ", CTL_SUBUP, i); AddControl(m_Controller[i], &(m_CStickDown[i]), sCStick[i], "Down: ", CTL_SUBDOWN, i); AddControl(m_Controller[i], &(m_CStickLeft[i]), sCStick[i], "Left: ", CTL_SUBLEFT, i); AddControl(m_Controller[i], &(m_CStickRight[i]), sCStick[i], "Right: ", CTL_SUBRIGHT, i); AddControl(m_Controller[i], &(m_CStick_Semi[i]), sCStick[i], "Semi-press: ", CTL_SUB_SEMI, i); AddSlider(m_Controller[i], &(m_CStick_SemiValue[i]), sCStick[i], "Semi: ", ID_SUB_SEMIVALUE, i); // -------------------------------------------------------------------- // Sizers // ----------------------------- sPage[i] = new wxGridBagSizer(0, 0); sPage[i]->SetFlexibleDirection(wxBOTH); sPage[i]->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); sPage[i]->Add(sDevice[i], wxGBPosition(0, 0), wxGBSpan(1, 5), wxEXPAND|wxALL, 1); sPage[i]->Add(sButtons[i], wxGBPosition(1, 0), wxGBSpan(2, 1), wxALL, 1); sPage[i]->Add(sTriggers[i], wxGBPosition(1, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 1); sPage[i]->Add(sStick[i], wxGBPosition(1, 2), wxGBSpan(2, 1), wxALL, 1); sPage[i]->Add(sDPad[i], wxGBPosition(1, 3), wxGBSpan(2, 1), wxALL, 1); sPage[i]->Add(sCStick[i], wxGBPosition(1, 4), wxGBSpan(2, 1), wxALL, 1); m_Controller[i]->SetSizer(sPage[i]); sPage[i]->Layout(); } } void PADConfigDialogSimple::OnClose(wxCloseEvent& event) { #ifdef _WIN32 m_dinput.Free(); #endif EndModal(0); } void PADConfigDialogSimple::OnCloseClick(wxCommandEvent& event) { SaveConfig(); Destroy(); } void PADConfigDialogSimple::OnShow(wxShowEvent& event) { #ifdef _WIN32 m_dinput.Init((HWND)this->GetParent()); #endif } void PADConfigDialogSimple::OnKeyDown(wxKeyEvent& event) { char keyStr[10] = {0}; if(ClickedButton) { // Get the selected notebook page int page = m_Notebook->GetSelection(); #ifdef _WIN32 m_dinput.Read(); if (m_dinput.diks[DIK_ESCAPE]) { pad[page].keyForControl[ClickedButton->GetId()] = 0x00; ClickedButton->SetLabel(wxString::FromAscii("")); } else { for(int i = 0; i < 255; i++) { if(m_dinput.diks[i]) { // Save the mapped key pad[page].keyForControl[ClickedButton->GetId()] = i; // Get the key name DInput::DIKToString(i, keyStr); ClickedButton->SetLabel(wxString::FromAscii(keyStr)); break; } } } #elif defined(HAVE_X11) && HAVE_X11 if (event.GetKeyCode() == (XK_Escape & 0xFF)) { pad[page].keyForControl[ClickedButton->GetId()] = InputCommon::wxCharCodeWXToX(0x00); ClickedButton->SetLabel(wxString::FromAscii("")); } else { pad[page].keyForControl[ClickedButton->GetId()] = InputCommon::wxCharCodeWXToX(event.GetKeyCode()); InputCommon::XKeyToString(pad[page].keyForControl[ClickedButton->GetId()], keyStr); ClickedButton->SetLabel(wxString::FromAscii(keyStr)); } #endif ClickedButton->Disconnect(); } // Reset ClickedButton = NULL; //event.Skip(); } // We have clicked a button void PADConfigDialogSimple::OnButtonClick(wxCommandEvent& event) { // Check if the Space key was set, to solve the problem that the Space key calls this function #ifdef _WIN32 if (m_dinput.diks[DIK_SPACE]) { m_dinput.diks[DIK_SPACE] = 0; return; } #endif // If we come here again before any key was set if(ClickedButton) ClickedButton->SetLabel(oldLabel); // Save the old button label so we can reapply it if necessary ClickedButton = (wxButton *)event.GetEventObject(); oldLabel = ClickedButton->GetLabel(); ClickedButton->SetLabel(_("Press Key/Esc")); ClickedButton->SetWindowStyle(wxWANTS_CHARS); } void PADConfigDialogSimple::ControllerSettingsChanged(wxCommandEvent& event) { int page = m_Notebook->GetSelection(); std::stringstream ss; switch (event.GetId()) { // General settings case ID_DISABLE: pad[page].bDisable = m_Disable[page]->GetValue(); break; // XInput case ID_X360PAD: pad[page].bEnableXPad = event.IsChecked(); m_Rumble[page]->Enable(event.IsChecked()); m_X360PadC[page]->Enable(event.IsChecked()); break; case ID_X360PAD_CHOICE: pad[page].XPadPlayer = event.GetSelection(); break; case ID_RUMBLE: pad[page].bRumble = m_Rumble[page]->GetValue(); break; // Semi-press adjustment case ID_TRIGGER_SEMIVALUE: pad[page].Trigger_semivalue = m_Trigger_SemiValue[page]->GetValue(); ss << pad[page].Trigger_semivalue; (*m_Trigger_SemiValue_Label[page]).SetLabel(wxString::FromAscii( ss.str().c_str() )); break; case ID_MAIN_SEMIVALUE: pad[page].Main_stick_semivalue = m_Stick_SemiValue[page]->GetValue(); ss << pad[page].Main_stick_semivalue; (*m_Stick_SemiValue_Label[page]).SetLabel(wxString::FromAscii( ss.str().c_str() )); break; case ID_SUB_SEMIVALUE: pad[page].Sub_stick_semivalue = m_CStick_SemiValue[page]->GetValue(); ss << pad[page].Sub_stick_semivalue; (*m_CStick_SemiValue_Label[page]).SetLabel(wxString::FromAscii( ss.str().c_str() )); break; // Input recording #ifdef RERECORDING case ID_RECORDING: pad[page].bRecording = m_CheckRecording[page]->GetValue(); // Turn off the other option pad[page].bPlayback = false; m_CheckPlayback[page]->SetValue(false); break; case ID_PLAYBACK: pad[page].bPlayback = m_CheckPlayback[page]->GetValue(); // Turn off the other option pad[page].bRecording = false; m_CheckRecording[page]->SetValue(false); break; case ID_SAVE_RECORDING: // Double check again that we are still running a game if (g_EmulatorRunning) SaveRecord(); break; #endif } } void PADConfigDialogSimple::DllAbout(wxCommandEvent& event) { wxString message; #ifdef _WIN32 message = _("A simple keyboard and XInput plugin for dolphin."); #else message = _("A simple keyboard plugin for dolphin."); #endif wxMessageBox(_T("Dolphin PadSimple Plugin\nBy ector and F|RES\n\n" + message), _T("Dolphin PadSimple"), wxOK, this); } desmume-0.9.9/src/wx/PadSimple/GUI/ConfigDlg.h0000644000175000017500000001003612140261617021456 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #ifndef __CONFIGDLG_H__ #define __CONFIGDLG_H__ #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_X11) && HAVE_X11 #include "InputCommon/X11InputBase.h" #endif class PADConfigDialogSimple : public wxDialog { public: PADConfigDialogSimple(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Pad Configuration"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE); virtual ~PADConfigDialogSimple(); private: DECLARE_EVENT_TABLE(); wxNotebook *m_Notebook; wxPanel *m_Controller[4]; wxButton *m_About; wxButton *m_Close; wxStaticBoxSizer *sbDevice[4], *m_SizeXInput[4], *m_SizeRecording[4]; wxBoxSizer *sDevice[4]; wxGridBagSizer *sPage[4]; wxStaticBoxSizer *sButtons[4]; wxStaticBoxSizer *sTriggers[4]; wxStaticBoxSizer *sStick[4]; wxStaticBoxSizer *sCStick[4]; wxStaticBoxSizer *sDPad[4]; wxArrayString arrayStringFor_X360Pad; wxCheckBox *m_X360Pad[4]; wxChoice *m_X360PadC[4]; wxCheckBox *m_Disable[4]; wxCheckBox *m_Rumble[4]; // Recording wxCheckBox *m_CheckRecording[4]; wxCheckBox *m_CheckPlayback[4]; wxButton *m_BtnSaveRecording[4]; wxButton *m_ButtonA[4]; wxButton *m_ButtonB[4]; wxButton *m_ButtonX[4]; wxButton *m_ButtonY[4]; wxButton *m_ButtonZ[4]; wxButton *m_ButtonStart[4]; wxButton *m_ButtonL[4]; wxButton *m_ButtonR[4]; wxButton *m_ButtonL_Semi[4]; wxButton *m_ButtonR_Semi[4]; wxSlider *m_Trigger_SemiValue[4]; wxStaticText *m_Trigger_SemiValue_Label[4]; wxButton *m_StickUp[4]; wxButton *m_StickDown[4]; wxButton *m_StickLeft[4]; wxButton *m_StickRight[4]; wxButton *m_Stick_Semi[4]; wxSlider *m_Stick_SemiValue[4]; wxStaticText *m_Stick_SemiValue_Label[4]; wxButton *m_CStickUp[4]; wxButton *m_CStickDown[4]; wxButton *m_CStickLeft[4]; wxButton *m_CStickRight[4]; wxButton *m_CStick_Semi[4]; wxSlider *m_CStick_SemiValue[4]; wxStaticText *m_CStick_SemiValue_Label[4]; wxButton *m_DPadUp[4]; wxButton *m_DPadDown[4]; wxButton *m_DPadLeft[4]; wxButton *m_DPadRight[4]; enum { ////GUI Enum Control ID Start ID_CLOSE = 1000, ID_NOTEBOOK, ID_CONTROLLERPAGE1, ID_CONTROLLERPAGE2, ID_CONTROLLERPAGE3, ID_CONTROLLERPAGE4, // XInput pad ID_X360PAD_CHOICE, ID_X360PAD, ID_RUMBLE, // Semi-press values ID_TRIGGER_SEMIVALUE, ID_MAIN_SEMIVALUE, ID_SUB_SEMIVALUE, // Input recording ID_RECORDING, ID_PLAYBACK, ID_SAVE_RECORDING, // General settings ID_DISABLE, ID_PAD_ABOUT, }; void OnClose(wxCloseEvent& event); void CreateGUIControls(); void OnCloseClick(wxCommandEvent& event); void OnKeyDown(wxKeyEvent& event); void ControllerSettingsChanged(wxCommandEvent& event); void OnButtonClick(wxCommandEvent& event); void DllAbout(wxCommandEvent& event); void OnShow(wxShowEvent& event); void AddSlider(wxPanel *pan, wxSlider **slider, wxStaticBoxSizer *sizer, const char *name, int ctl, int controller); wxButton *ClickedButton; wxString oldLabel; }; #endif desmume-0.9.9/src/wx/PadSimple/PadSimple.h0000644000175000017500000000540612140261617021061 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #ifndef __PADSIMPLE_H__ #define __PADSIMPLE_H__ //#include "Setup.h" // Common #include "types.h" // Constants for full-press sticks and triggers const int BUTTON_FULL = 255; const int STICK_FULL = 100; const int STICK_HALF_DEFAULT = 50; const int TRIGGER_FULL = 255; const int TRIGGER_HALF_DEFAULT = 128; const int TRIGGER_THRESHOLD = 230; // Controls enum { CTL_A = 0, CTL_B, CTL_X, CTL_Y, CTL_Z, CTL_START, CTL_L, CTL_R, CTL_L_SEMI, CTL_R_SEMI, CTL_MAINUP, CTL_MAINDOWN, CTL_MAINLEFT, CTL_MAINRIGHT, CTL_MAIN_SEMI, CTL_SUBUP, CTL_SUBDOWN, CTL_SUBLEFT, CTL_SUBRIGHT, CTL_SUB_SEMI, CTL_DPADUP, CTL_DPADDOWN, CTL_DPADLEFT, CTL_DPADRIGHT, CTL_MIC, NUMCONTROLS, }; // Control names static const char* controlNames[] = { "A_button", "B_button", "X_button", "Y_button", "Z_trigger", "Start", "L_button", "R_button", "L_button_semi", "R_button_semi", "Main_stick_up", "Main_stick_down", "Main_stick_left", "Main_stick_right", "Main_stick_semi", "Sub_stick_up", "Sub_stick_down", "Sub_stick_left", "Sub_stick_right", "Sub_stick_semi", "D-Pad_up", "D-Pad_down", "D-Pad_left", "D-Pad_right", "Mic-button", }; struct SPads { bool bEnableXPad; // Use an XPad in addition to the keyboard? bool bDisable; // Disabled when dolphin isn't in focus bool bRumble; // Rumble for xpad u32 RumbleStrength; // Rumble strength bool bRecording; // Record input? bool bPlayback; // Playback input? s32 XPadPlayer; // Player# of the xpad u32 keyForControl[NUMCONTROLS]; // Keyboard mapping u32 Trigger_semivalue; // Semi-press value for triggers u32 Main_stick_semivalue; // Semi-press value for main stick u32 Sub_stick_semivalue; // Semi-press value for sub-stick }; extern SPads pad[]; //extern bool g_EmulatorRunning; void LoadConfig(); void SaveConfig(); bool IsFocus(); // Input Recording void SaveRecord(); #endif desmume-0.9.9/src/wx/PadSimple/pluginspecs_pad.h0000644000175000017500000000562212140261617022363 0ustar guillaumeguillaume//__________________________________________________________________________________________________ // Common pad plugin spec, version #1.0 maintained by F|RES // #ifndef _PAD_H_INCLUDED__ #define _PAD_H_INCLUDED__ #include "types.h" //#include "PluginSpecs.h" //#include "ExportProlog.h" #define PAD_ERR_NONE 0 #define PAD_ERR_NO_CONTROLLER -1 #define PAD_ERR_NOT_READY -2 #define PAD_ERR_TRANSFER -3 #define PAD_USE_ORIGIN 0x0080 #define PAD_BUTTON_LEFT 0x0001 #define PAD_BUTTON_RIGHT 0x0002 #define PAD_BUTTON_DOWN 0x0004 #define PAD_BUTTON_UP 0x0008 #define PAD_TRIGGER_Z 0x0010 #define PAD_TRIGGER_R 0x0020 #define PAD_TRIGGER_L 0x0040 #define PAD_BUTTON_A 0x0100 #define PAD_BUTTON_B 0x0200 #define PAD_BUTTON_X 0x0400 #define PAD_BUTTON_Y 0x0800 #define PAD_BUTTON_START 0x1000 #ifndef WIN32 // todo- find better fixoring for that typedef void *HWND; #endif typedef void (*TLog)(const char* _pMessage); typedef struct { HWND hWnd; TLog pLog; int padNumber; } SPADInitialize; typedef struct { unsigned short button; // Or-ed PAD_BUTTON_* and PAD_TRIGGER_* bits unsigned char stickX; // 0 <= stickX <= 255 unsigned char stickY; // 0 <= stickY <= 255 unsigned char substickX; // 0 <= substickX <= 255 unsigned char substickY; // 0 <= substickY <= 255 unsigned char triggerLeft; // 0 <= triggerLeft <= 255 unsigned char triggerRight; // 0 <= triggerRight <= 255 unsigned char analogA; // 0 <= analogA <= 255 unsigned char analogB; // 0 <= analogB <= 255 bool MicButton; // HAX signed char err; // one of PAD_ERR_* number } SPADStatus; #define EXPORT #define CALL // I N T E R F A C E // __________________________________________________________________________________________________ // Function: // Purpose: // input: // output: // EXPORT void CALL PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus); // __________________________________________________________________________________________________ // Function: Send keyboard input to the plugin // Purpose: // input: The key and if it's pressed or released // output: None // EXPORT void CALL PAD_Input(u16 _Key, u8 _UpDown); // __________________________________________________________________________________________________ // Function: PAD_Rumble // Purpose: Pad rumble! // input: PAD number, Command type (Stop=0, Rumble=1, Stop Hard=2) and strength of Rumble // output: none // EXPORT void CALL PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength); //#include "ExportEpilog.h" #endif desmume-0.9.9/src/wx/PadSimple/PadSimple.cpp0000644000175000017500000006563612140261617021427 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ // Include #include #include #include "common.h" //#include "LogManager.h" #include "pluginspecs_pad.h" #include "PadSimple.h" #include //#include "StringUtil.h" //#include "FileUtil.h" //#include "ChunkFile.h" #if defined(HAVE_WX) #include "GUI/ConfigDlg.h" PADConfigDialogSimple* m_ConfigFrame = NULL; #endif #ifdef _WIN32 #include "XInput.h" #include "../InputCommon/DirectInputBase.h" // Core DInput dinput; //#elif defined(USE_SDL) && USE_SDL //#include #elif defined(HAVE_X11) && HAVE_X11 #include #include #include #include Display* GXdsp; bool KeyStatus[NUMCONTROLS]; #elif defined(HAVE_COCOA) && HAVE_COCOA #include bool KeyStatus[NUMCONTROLS]; #endif // Declarations SPads pad[4]; SPADInitialize g_PADInitialize; // Standard crap to make wxWidgets happy #ifdef _WIN32 //HINSTANCE g_hInstance; #if defined(HAVE_WX) class wxDLLApp : public wxApp { bool OnInit() { return true; } }; IMPLEMENT_APP_NO_MAIN(wxDLLApp) WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); #endif BOOL APIENTRY aMain(HINSTANCE hinstDLL, // DLL module handle DWORD dwReason, // reason called LPVOID lpvReserved) // reserved { switch (dwReason) { case DLL_PROCESS_ATTACH: { #if defined(HAVE_WX) wxSetInstance((HINSTANCE)hinstDLL); int argc = 0; char **argv = NULL; wxEntryStart(argc, argv); if (!wxTheApp || !wxTheApp->CallOnInit()) return FALSE; #endif } break; case DLL_PROCESS_DETACH: #if defined(HAVE_WX) wxEntryCleanup(); #endif break; default: break; } //g_hInstance = hinstDLL; return TRUE; } #endif #if 0 #if defined(HAVE_WX) wxWindow* GetParentedWxWindow(HWND Parent) { #ifdef _WIN32 // wxSetInstance((HINSTANCE)g_hInstance); #endif wxWindow *win = new wxWindow(); #ifdef _WIN32 win->SetHWND((WXHWND)Parent); win->AdoptAttributesFromHWND(); #endif return win; } #endif #endif // Input Recording // Enable these to record or play back //#define RECORD_REPLAY //#define RECORD_STORE #if 0 // Pre defined maxium storage limit #define RECORD_SIZE (1024 * 128) PLUGIN_GLOBALS* globals = NULL; SPADStatus recordBuffer[RECORD_SIZE]; int count = 0; bool g_EmulatorRunning = false; //****************************************************************************** // Supporting functions //****************************************************************************** void RecordInput(const SPADStatus& _rPADStatus) { if (count >= RECORD_SIZE) return; recordBuffer[count++] = _rPADStatus; // Logging //u8 TmpData[sizeof(SPADStatus)]; //memcpy(TmpData, &recordBuffer[count - 1], sizeof(SPADStatus)); //Console::Print("RecordInput(%i): %s\n", count, ArrayToString(TmpData, sizeof(SPADStatus), 0, 30).c_str()); // Auto save every ten seconds if (count % (60 * 10) == 0) SaveRecord(); } const SPADStatus& PlayRecord() { // Logging //Console::Print("PlayRecord(%i)\n", count); if (count >= RECORD_SIZE) { // Todo: Make the recording size unlimited? //PanicAlert("The recording reached its end"); return(recordBuffer[0]); } return(recordBuffer[count++]); } void LoadRecord() { FILE* pStream = fopen("pad-record.bin", "rb"); if (pStream != NULL) { fread(recordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream); fclose(pStream); } else { PanicAlert("SimplePad: Could not open pad-record.bin"); } //Console::Print("LoadRecord()"); } void SaveRecord() { // Open the file in a way that clears all old data FILE* pStream = fopen("pad-record.bin", "wb"); if (pStream != NULL) { fwrite(recordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream); fclose(pStream); } else { PanicAlert("SimplePad: Could not save pad-record.bin"); } //PanicAlert("SaveRecord()"); //Console::Print("SaveRecord()"); } #endif // Check if Dolphin is in focus bool IsFocus() { #ifdef _WIN32 HWND Parent = GetParent(g_PADInitialize.hWnd); HWND TopLevel = GetParent(Parent); // Support both rendering to main window and not if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == g_PADInitialize.hWnd) return true; else return false; #else return true; #endif } #ifdef _WIN32 // Implement circular deadzone void ScaleStickValues(unsigned char* outx, unsigned char* outy, short inx, short iny) { const float kDeadZone = 0.1f; float x = ((float)inx + 0.5f) / 32767.5f; float y = ((float)iny + 0.5f) / 32767.5f; if ((x == 0.0f) && (y == 0.0f)) // to be safe { *outx = 0; *outy = 0; return; } float magnitude = sqrtf(x * x + y * y); float nx = x / magnitude; float ny = y / magnitude; if (magnitude < kDeadZone){magnitude = kDeadZone;} magnitude = (magnitude - kDeadZone) / (1.0f - kDeadZone); magnitude *= magnitude; // another power may be more appropriate nx *= magnitude; ny *= magnitude; int ix = (int)(nx * 100); int iy = (int)(ny * 100); *outx = 0x80 + ix; *outy = 0x80 + iy; } #endif // for same displacement should be sqrt(2)/2 (in theory) // 3/4 = 0.75 is a little faster than sqrt(2)/2 = 0.7071... // In SMS, 17/20 = 0.85 is perfect; in WW, 7/10 = 0.70 is closer. #define DIAGONAL_SCALE 0.70710678 static void EmulateAnalogStick(unsigned char *stickX, unsigned char *stickY, bool buttonUp, bool buttonDown, bool buttonLeft, bool buttonRight, int magnitude) { int mainY = 0; int mainX = 0; if (buttonUp) mainY = magnitude; else if (buttonDown) mainY = -magnitude; if (buttonLeft) mainX = -magnitude; else if (buttonRight) mainX = magnitude; // only update if there is some action // this allows analog stick to still work // disable for now, enable later if any platform supports both methods of input //if ((mainX != 0) && (mainY != 0)) { if (true) { if ((mainX == 0) || (mainY == 0)) { *stickX += mainX; *stickY += mainY; } else { *stickX += mainX*DIAGONAL_SCALE; *stickY += mainY*DIAGONAL_SCALE; } } } //****************************************************************************** // Input //****************************************************************************** #ifdef _WIN32 void DInput_Read(int _numPAD, SPADStatus* _pPADStatus) { dinput.Read(); // for (int i = 0; i < 200; i++) // if(dinput.diks[i]) // printf("DInput_Read"); // Analog stick values based on semi-press keys int mainstickvalue = (dinput.diks[pad[_numPAD].keyForControl[CTL_MAIN_SEMI]] & 0xFF) ? pad[_numPAD].Main_stick_semivalue : STICK_FULL; int substickvalue = (dinput.diks[pad[_numPAD].keyForControl[CTL_SUB_SEMI]] & 0xFF) ? pad[_numPAD].Sub_stick_semivalue : STICK_FULL; // Buttons (A/B/X/Y/Z/Start) if (dinput.diks[pad[_numPAD].keyForControl[CTL_A]] & 0xFF) { _pPADStatus->button |= PAD_BUTTON_A; _pPADStatus->analogA = BUTTON_FULL; } if (dinput.diks[pad[_numPAD].keyForControl[CTL_B]] & 0xFF) { _pPADStatus->button |= PAD_BUTTON_B; _pPADStatus->analogB = BUTTON_FULL; } if (dinput.diks[pad[_numPAD].keyForControl[CTL_X]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_X;} if (dinput.diks[pad[_numPAD].keyForControl[CTL_Y]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_Y;} if (dinput.diks[pad[_numPAD].keyForControl[CTL_Z]] & 0xFF){_pPADStatus->button |= PAD_TRIGGER_Z;} if (dinput.diks[pad[_numPAD].keyForControl[CTL_START]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_START;} // Triggers (L/R) if (dinput.diks[pad[_numPAD].keyForControl[CTL_L]] & 0xFF) { _pPADStatus->button |= PAD_TRIGGER_L; _pPADStatus->triggerLeft = TRIGGER_FULL; } if (dinput.diks[pad[_numPAD].keyForControl[CTL_R]] & 0xFF) { _pPADStatus->button |= PAD_TRIGGER_R; _pPADStatus->triggerRight = TRIGGER_FULL; } if (dinput.diks[pad[_numPAD].keyForControl[CTL_L_SEMI]] & 0xFF) { _pPADStatus->triggerLeft = pad[_numPAD].Trigger_semivalue; if (pad[_numPAD].Trigger_semivalue > TRIGGER_THRESHOLD) _pPADStatus->button |= PAD_TRIGGER_L; } if (dinput.diks[pad[_numPAD].keyForControl[CTL_R_SEMI]] & 0xFF) { _pPADStatus->triggerRight = pad[_numPAD].Trigger_semivalue; if (pad[_numPAD].Trigger_semivalue > TRIGGER_THRESHOLD) _pPADStatus->button |= PAD_TRIGGER_R; } // Main stick EmulateAnalogStick( &_pPADStatus->stickX, &_pPADStatus->stickY, !!dinput.diks[pad[_numPAD].keyForControl[CTL_MAINUP]], !!dinput.diks[pad[_numPAD].keyForControl[CTL_MAINDOWN]], !!dinput.diks[pad[_numPAD].keyForControl[CTL_MAINLEFT]], !!dinput.diks[pad[_numPAD].keyForControl[CTL_MAINRIGHT]], mainstickvalue ); // Sub-stick (C-stick) EmulateAnalogStick( &_pPADStatus->substickX, &_pPADStatus->substickY, !!dinput.diks[pad[_numPAD].keyForControl[CTL_SUBUP]], !!dinput.diks[pad[_numPAD].keyForControl[CTL_SUBDOWN]], !!dinput.diks[pad[_numPAD].keyForControl[CTL_SUBLEFT]], !!dinput.diks[pad[_numPAD].keyForControl[CTL_SUBRIGHT]], substickvalue ); // D-pad if (dinput.diks[pad[_numPAD].keyForControl[CTL_DPADUP]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_UP;} if (dinput.diks[pad[_numPAD].keyForControl[CTL_DPADDOWN]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_DOWN;} if (dinput.diks[pad[_numPAD].keyForControl[CTL_DPADLEFT]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_LEFT;} if (dinput.diks[pad[_numPAD].keyForControl[CTL_DPADRIGHT]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_RIGHT;} // Mic key _pPADStatus->MicButton = (dinput.diks[pad[_numPAD].keyForControl[CTL_MIC]] & 0xFF) ? true : false; } bool XInput_Read(int XPadPlayer, SPADStatus* _pPADStatus) { const int base = 0x80; XINPUT_STATE xstate; DWORD xresult = XInputGetState(XPadPlayer, &xstate); // Let's .. yes, let's use XINPUT! if (xresult == ERROR_SUCCESS) { const XINPUT_GAMEPAD& xpad = xstate.Gamepad; if ((_pPADStatus->stickX == base) && (_pPADStatus->stickY == base)) { ScaleStickValues( &_pPADStatus->stickX, &_pPADStatus->stickY, xpad.sThumbLX, xpad.sThumbLY); } if ((_pPADStatus->substickX == base) && (_pPADStatus->substickY == base)) { ScaleStickValues( &_pPADStatus->substickX, &_pPADStatus->substickY, xpad.sThumbRX, xpad.sThumbRY); } if (xpad.wButtons & XINPUT_GAMEPAD_DPAD_UP) {_pPADStatus->button |= PAD_BUTTON_UP;} if (xpad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) {_pPADStatus->button |= PAD_BUTTON_DOWN;} if (xpad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) {_pPADStatus->button |= PAD_BUTTON_LEFT;} if (xpad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) {_pPADStatus->button |= PAD_BUTTON_RIGHT;} _pPADStatus->triggerLeft = xpad.bLeftTrigger; _pPADStatus->triggerRight = xpad.bRightTrigger; if (xpad.bLeftTrigger > TRIGGER_THRESHOLD) {_pPADStatus->button |= PAD_TRIGGER_L;} if (xpad.bRightTrigger > TRIGGER_THRESHOLD) {_pPADStatus->button |= PAD_TRIGGER_R;} if (xpad.wButtons & XINPUT_GAMEPAD_START) {_pPADStatus->button |= PAD_BUTTON_START;} if (xpad.wButtons & XINPUT_GAMEPAD_A) {_pPADStatus->button |= PAD_BUTTON_A;} if (xpad.wButtons & XINPUT_GAMEPAD_B) {_pPADStatus->button |= PAD_BUTTON_X;} if (xpad.wButtons & XINPUT_GAMEPAD_X) {_pPADStatus->button |= PAD_BUTTON_B;} if (xpad.wButtons & XINPUT_GAMEPAD_Y) {_pPADStatus->button |= PAD_BUTTON_Y;} if (xpad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER){_pPADStatus->button |= PAD_TRIGGER_Z;} //_pPADStatus->MicButton = (xpad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? true : false; return true; } else { return false; } } #endif #if (defined(HAVE_X11) && HAVE_X11) || (defined(HAVE_COCOA) && HAVE_COCOA) #if defined(HAVE_X11) && HAVE_X11 // The graphics plugin in the PCSX2 design leaves a lot of the window processing to the pad plugin, weirdly enough. static void X11_Read(int _numPAD, SPADStatus* _pPADStatus) { #ifndef __APPLE__ // Do all the stuff we need to do once per frame here if (_numPAD != 0) return; // This code is from Zerofrog's pcsx2 pad plugin XEvent E; //int keyPress=0, keyRelease=0; KeySym key; // keyboard input int num_events; for (num_events = XPending(GXdsp);num_events > 0;num_events--) { XNextEvent(GXdsp, &E); switch (E.type) { case KeyPress: //_KeyPress(pad, XLookupKeysym((XKeyEvent *)&E, 0)); //break; key = XLookupKeysym((XKeyEvent*)&E, 0); if((key >= XK_F1 && key <= XK_F9) || key == XK_Shift_L || key == XK_Shift_R || key == XK_Control_L || key == XK_Control_R) { XPutBackEvent(GXdsp, &E); break; } int i; for (i = 0; i < NUMCONTROLS; i++) { if (key == pad[_numPAD].keyForControl[i]) { KeyStatus[i] = true; break; } } break; case KeyRelease: key = XLookupKeysym((XKeyEvent*)&E, 0); if((key >= XK_F1 && key <= XK_F9) || key == XK_Shift_L || key == XK_Shift_R || key == XK_Control_L || key == XK_Control_R) { XPutBackEvent(GXdsp, &E); break; } //_KeyRelease(pad, XLookupKeysym((XKeyEvent *)&E, 0)); for (i = 0; i < NUMCONTROLS; i++) { if (key == pad[_numPAD].keyForControl[i]) { KeyStatus[i] = false; break; } } break; } } #endif // __APPLE__ #elif defined(HAVE_COCOA) && HAVE_COCOA void cocoa_Read(int _numPAD, SPADStatus* _pPADStatus) { // Do all the stuff we need to do once per frame here if (_numPAD != 0) return; //get event from main thread NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSConnection *conn; NSDistantObject *proxy; conn = [NSConnection connectionWithRegisteredName:@"DolphinCocoaEvent" host:nil]; //if (!conn) { //printf("error creating cnx event client\n"); //} proxy = [conn rootProxy]; //if (!proxy) { // printf("error prox client\n"); //} long cocoaKey = (long)[proxy keyCode]; int i; if ((long)[proxy type] == 10) { for (i = 0; i < NUMCONTROLS; i++) { if (cocoaKey == pad[_numPAD].keyForControl[i]) { KeyStatus[i] = true; break; } } } else { for (i = 0; i < NUMCONTROLS; i++) { if (cocoaKey == pad[_numPAD].keyForControl[i]) { KeyStatus[i] = false; break; } } } #endif // Analog stick values based on semi-press keys int mainstickvalue = (KeyStatus[CTL_MAIN_SEMI]) ? pad[_numPAD].Main_stick_semivalue : STICK_FULL; int substickvalue = (KeyStatus[CTL_SUB_SEMI]) ? pad[_numPAD].Sub_stick_semivalue : STICK_FULL; // Buttons (A/B/X/Y/Z/Start) if (KeyStatus[CTL_A]) { _pPADStatus->button |= PAD_BUTTON_A; _pPADStatus->analogA = BUTTON_FULL; } if (KeyStatus[CTL_B]) { _pPADStatus->button |= PAD_BUTTON_B; _pPADStatus->analogB = BUTTON_FULL; } if (KeyStatus[CTL_X]){_pPADStatus->button |= PAD_BUTTON_X;} if (KeyStatus[CTL_Y]){_pPADStatus->button |= PAD_BUTTON_Y;} if (KeyStatus[CTL_Z]){_pPADStatus->button |= PAD_TRIGGER_Z;} if (KeyStatus[CTL_START]){_pPADStatus->button |= PAD_BUTTON_START;} // Triggers (L/R) if (KeyStatus[CTL_L]){_pPADStatus->triggerLeft = TRIGGER_FULL;} if (KeyStatus[CTL_R]){_pPADStatus->triggerRight = TRIGGER_FULL;} if (KeyStatus[CTL_L_SEMI]){_pPADStatus->triggerLeft = pad[_numPAD].Trigger_semivalue;} if (KeyStatus[CTL_R_SEMI]){_pPADStatus->triggerRight = pad[_numPAD].Trigger_semivalue;} // Main stick EmulateAnalogStick( &_pPADStatus->stickX, &_pPADStatus->stickY, KeyStatus[CTL_MAINUP], KeyStatus[CTL_MAINDOWN], KeyStatus[CTL_MAINLEFT], KeyStatus[CTL_MAINRIGHT], mainstickvalue ); EmulateAnalogStick( &_pPADStatus->substickX, &_pPADStatus->substickY, KeyStatus[CTL_SUBUP], KeyStatus[CTL_SUBDOWN], KeyStatus[CTL_SUBLEFT], KeyStatus[CTL_SUBRIGHT], substickvalue ); // D-pad if (KeyStatus[CTL_DPADUP]) {_pPADStatus->button |= PAD_BUTTON_UP;} if (KeyStatus[CTL_DPADDOWN]) {_pPADStatus->button |= PAD_BUTTON_DOWN;} if (KeyStatus[CTL_DPADLEFT]) {_pPADStatus->button |= PAD_BUTTON_LEFT;} if (KeyStatus[CTL_DPADRIGHT]){_pPADStatus->button |= PAD_BUTTON_RIGHT;} // Mic key _pPADStatus->MicButton = KeyStatus[CTL_MIC]; #if defined(HAVE_X11) && HAVE_X11 } #elif defined(HAVE_COCOA) && HAVE_COCOA [pool release]; } #endif #endif //****************************************************************************** // Plugin specification functions //****************************************************************************** #if 0 void GetDllInfo(PLUGIN_INFO* _PluginInfo) { _PluginInfo->Version = 0x0100; _PluginInfo->Type = PLUGIN_TYPE_PAD; #ifdef DEBUGFAST sprintf(_PluginInfo->Name, "Dolphin KB/X360pad (DebugFast)"); #else #ifndef _DEBUG sprintf(_PluginInfo->Name, "Dolphin KB/X360pad"); #else sprintf(_PluginInfo->Name, "Dolphin KB/X360pad (Debug)"); #endif #endif } void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals) { globals = _pPluginGlobals; LogManager::SetInstance((LogManager *)globals->logManager); } void DllConfig(HWND _hParent) { // Load configuration LoadConfig(); // Show wxDialog #if defined(HAVE_WX) && HAVE_WX if (!m_ConfigFrame) m_ConfigFrame = new PADConfigDialogSimple(GetParentedWxWindow(_hParent)); else if (!m_ConfigFrame->GetParent()->IsShown()) m_ConfigFrame->Close(true); // Only allow one open at a time if (!m_ConfigFrame->IsShown()) m_ConfigFrame->ShowModal(); else m_ConfigFrame->Hide(); #endif // Save configuration SaveConfig(); } void DllDebugger(HWND _hParent, bool Show) {} #endif void Initialize(void *init) { // We are now running a game // g_EmulatorRunning = true; // Load configuration LoadConfig(); #ifdef RERECORDING /* Check if we are starting the pad to record the input, and an old file exists. In that case ask if we really want to start the recording and eventually overwrite the file */ if (pad[0].bRecording && File::Exists("pad-record.bin")) { if (!AskYesNo("An old version of '%s' aleady exists in your Dolphin directory. You can" " now make a copy of it before you start a new recording and overwrite the file." " Select Yes to continue and overwrite the file. Select No to turn off the input" " recording and continue without recording anything.", "pad-record.bin")) { // Turn off recording and continue pad[0].bRecording = false; } } // Load recorded input if we are to play it back, otherwise begin with a blank recording if (pad[0].bPlayback) LoadRecord(); #endif g_PADInitialize = *(SPADInitialize*)init; #ifdef _WIN32 dinput.Init((HWND)g_PADInitialize.hWnd); #elif defined(HAVE_X11) && HAVE_X11 GXdsp = (Display*)g_PADInitialize.hWnd; #elif defined(HAVE_COCOA) && HAVE_COCOA #endif } #if 0 void DoState(unsigned char **ptr, int mode) { #ifdef RERECORDING // Load or save the counter PointerWrap p(ptr, mode); p.Do(count); //Console::Print("count: %i\n", count); // Update the frame counter for the sake of the status bar if (mode == PointerWrap::MODE_READ) { #ifdef _WIN32 // This only works when rendering to the main window, I think PostMessage(GetParent(g_PADInitialize.hWnd), WM_USER, INPUT_FRAME_COUNTER, count); #endif } #endif } static void Shutdown() { // Save the recording and reset the counter #ifdef RERECORDING // Save recording if (pad[0].bRecording) SaveRecord(); // Reset the counter count = 0; #endif // We have stopped the game //g_EmulatorRunning = false; #ifdef _WIN32 dinput.Free(); // Kill xpad rumble XINPUT_VIBRATION vib; vib.wLeftMotorSpeed = 0; vib.wRightMotorSpeed = 0; for (int i = 0; i < 4; i++) if (pad[i].bRumble) XInputSetState(pad[i].XPadPlayer, &vib); #endif SaveConfig(); } #endif // Set buttons status from wxWidgets in the main application void PAD_Input(u16 _Key, u8 _UpDown) {} void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) { // Check if all is okay if (_pPADStatus == NULL) return; // Play back input instead of accepting any user input #ifdef RERECORDING if (pad[0].bPlayback) { *_pPADStatus = PlayRecord(); return; } #endif const int base = 0x80; // Clear pad memset(_pPADStatus, 0, sizeof(SPADStatus)); _pPADStatus->stickY = base; _pPADStatus->stickX = base; _pPADStatus->substickX = base; _pPADStatus->substickY = base; _pPADStatus->button |= PAD_USE_ORIGIN; #ifdef _WIN32 // Only update pad on focus, don't do this when recording if (pad[_numPAD].bDisable && !pad[0].bRecording && !IsFocus()) return; // Dolphin doesn't really care about the pad error codes anyways... _pPADStatus->err = PAD_ERR_NONE; // Read XInput if (pad[_numPAD].bEnableXPad) XInput_Read(pad[_numPAD].XPadPlayer, _pPADStatus); // Read Direct Input DInput_Read(_numPAD, _pPADStatus); #elif defined(HAVE_X11) && HAVE_X11 _pPADStatus->err = PAD_ERR_NONE; X11_Read(_numPAD, _pPADStatus); #elif defined(HAVE_COCOA) && HAVE_COCOA _pPADStatus->err = PAD_ERR_NONE; cocoa_Read(_numPAD, _pPADStatus); #endif #ifdef RERECORDING // Record input if (pad[0].bRecording) RecordInput(*_pPADStatus); #endif } // Rough approximation of GC behaviour - needs improvement. void PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength) { #ifdef _WIN32 if (pad[_numPAD].bEnableXPad) { static int a = 0; if ((_uType == 0) || (_uType == 2)) { a = 0; } else if (_uType == 1) { a = _uStrength > 2 ? pad[_numPAD].RumbleStrength : 0; } a = int ((float)a * 0.96f); if (!pad[_numPAD].bRumble) { a = 0; } XINPUT_VIBRATION vib; vib.wLeftMotorSpeed = a; //_uStrength*100; vib.wRightMotorSpeed = a; //_uStrength*100; XInputSetState(pad[_numPAD].XPadPlayer, &vib); } #endif } //****************************************************************************** // Load and save the configuration //****************************************************************************** void LoadConfig() { // Initialize first pad to standard controls #ifdef _WIN32 const int defaultKeyForControl[NUMCONTROLS] = { DIK_X, // A DIK_Z, // B DIK_C, // X DIK_S, // Y DIK_D, // Z DIK_RETURN, // Start DIK_Q, // L DIK_W, // R 0x00, // L semi-press 0x00, // R semi-press DIK_UP, // Main stick up DIK_DOWN, // Main stick down DIK_LEFT, // Main stick left DIK_RIGHT, // Main stick right DIK_LSHIFT, // Main stick semi-press DIK_I, // C-stick up DIK_K, // C-stick down DIK_J, // C-stick left DIK_L, // C-stick right DIK_LCONTROL, // C-stick semi-press DIK_T, // D-pad up DIK_G, // D-pad down DIK_F, // D-pad left DIK_H, // D-pad right DIK_M, // Mic }; #elif defined(HAVE_X11) && HAVE_X11 const int defaultKeyForControl[NUMCONTROLS] = { XK_x, // A XK_z, // B XK_c, // X XK_s, // Y XK_d, // Z XK_Return, // Start XK_q, // L XK_w, // R 0x00, // L semi-press 0x00, // R semi-press XK_Up, // Main stick up XK_Down, // Main stick down XK_Left, // Main stick left XK_Right, // Main stick right XK_Shift_L, // Main stick semi-press XK_i, // C-stick up XK_k, // C-stick down XK_j, // C-stick left XK_l, // C-stick right XK_Control_L, // C-stick semi-press XK_t, // D-pad up XK_g, // D-pad down XK_f, // D-pad left XK_h, // D-pad right XK_m, // Mic }; #elif defined(HAVE_COCOA) && HAVE_COCOA // Reference for Cocoa key codes: // http://boredzo.org/blog/archives/2007-05-22/virtual-key-codes const int defaultKeyForControl[NUMCONTROLS] = { 7, // A (x) 6, // B (z) 8, // X (c) 1, // Y (s) 2, // Z (d) 36, // Start (return) 12, // L (q) 13, // R (w) -1, // L semi-press (none) -1, // R semi-press (none) 126, // Main stick up (up) 125, // Main stick down (down) 123, // Main stick left (left) 124, // Main stick right (right) 56, // Main stick semi-press (left shift) 34, // C-stick up (i) 40, // C-stick down (k) 38, // C-stick left (j) 37, // C-stick right (l) 59, // C-stick semi-press (left control) 17, // D-pad up (t) 5, // D-pad down (g) 3, // D-pad left (f) 4, // D-pad right (h) 46, // Mic (m) }; #endif wxConfigBase *config = wxConfigBase::Get(); for(int i = 0; i < 4; i++) { config->SetPath(wxString::Format(_T("/PAD%i"), i+1)); config->Read(_T("UseXPad"), &pad[i].bEnableXPad, i==0); config->Read(_T("DisableOnBackground"), &pad[i].bDisable, false); config->Read(_T("Rumble"), &pad[i].bRumble, true); config->Read(_T("RumbleStrength"), (long *)&pad[i].RumbleStrength, 8000); config->Read(_T("XPad#"), &pad[i].XPadPlayer); config->Read(_T("Trigger_semivalue"), (long *)&pad[i].Trigger_semivalue, TRIGGER_HALF_DEFAULT); config->Read(_T("Main_stick_semivalue"), (long *)&pad[i].Main_stick_semivalue, STICK_HALF_DEFAULT); config->Read(_T("Sub_stick_semivalue"), (long *)&pad[i].Sub_stick_semivalue, STICK_HALF_DEFAULT); #ifdef RERECORDING config->Read(_T("Recording"), &pad[0].bRecording, false); config->Read(_T("Playback"), &pad[0].bPlayback, false); #endif for (int x = 0; x < NUMCONTROLS; x++) { config->Read(wxString(controlNames[x],wxConvUTF8), (long *)&pad[i].keyForControl[x], (i==0) ? defaultKeyForControl[x] : 0); #if defined(HAVE_X11) && HAVE_X11 // In linux we have a problem assigning the upper case of the // keys because they're not being recognized pad[i].keyForControl[x] = tolower(pad[i].keyForControl[x]); #endif } } } void SaveConfig() { wxConfigBase *config = wxConfigBase::Get(); for(int i = 0; i < 4; i++) { config->SetPath(wxString::Format(_T("/PAD%i"), i+1)); config->Write(_T("UseXPad"), pad[i].bEnableXPad); config->Write(_T("DisableOnBackground"), pad[i].bDisable); config->Write(_T("Rumble"), pad[i].bRumble); config->Write(_T("RumbleStrength"), (long)pad[i].RumbleStrength); config->Write(_T("XPad#"), pad[i].XPadPlayer); config->Write(_T("Trigger_semivalue"), (long)pad[i].Trigger_semivalue); config->Write(_T("Main_stick_semivalue"), (long)pad[i].Main_stick_semivalue); config->Write(_T("Sub_stick_semivalue"), (long)pad[i].Sub_stick_semivalue); #ifdef RERECORDING config->Write(_T("Recording"), pad[0].bRecording); config->Write(_T("Playback"), pad[0].bPlayback); #endif for (int x = 0; x < NUMCONTROLS; x++) { config->Write(wxString(controlNames[x],wxConvUTF8), (long)pad[i].keyForControl[x]); } } } desmume-0.9.9/src/wx/InputCommon/0000755000175000017500000000000012140305320017405 5ustar guillaumeguillaumedesmume-0.9.9/src/wx/InputCommon/EventHandler.cpp0000644000175000017500000003421412140261607022505 0ustar guillaumeguillaume#include "EventHandler.h" #include #include #if defined(HAVE_WX) #include #endif EventHandler *EventHandler::m_Instance = 0; EventHandler::EventHandler() { memset(keys, 0, sizeof(keys)); memset(mouse, 0, sizeof(mouse)); memset(joys, 0, sizeof(joys)); } EventHandler::~EventHandler() { } EventHandler *EventHandler::GetInstance() { // fprintf(stderr, "handler instance %p\n", m_Instance); if (! m_Instance) m_Instance = new EventHandler(); return m_Instance; } void EventHandler::Destroy() { if (m_Instance) delete m_Instance; // fprintf(stderr, "deleting instance %p\n", m_Instance); m_Instance = 0; } bool EventHandler::RegisterEventListener(listenFuncPtr func, Keys key) { if (key.inputType == KeyboardInput) { // fprintf(stderr, "Registering %d:%d %p %p \n", key.keyCode, key.mods, func, this); if (key.keyCode == sf::Key::Count || key.mods >= NUMMODS || key.keyCode >= NUMKEYS) return false; if (keys[key.keyCode][key.mods] && keys[key.keyCode][key.mods] != func) return false ; keys[key.keyCode][key.mods] = func; } else if (key.inputType == MouseInput) { if (mouse[key.mouseButton]) return false; mouse[key.mouseButton] = func; } return true; } bool EventHandler::RemoveEventListener(Keys key) { if (key.inputType == KeyboardInput) { if ((key.keyCode == sf::Key::Count || key.keyCode >= NUMKEYS || key.mods >= NUMMODS) && ! keys[key.keyCode][key.mods]) return false; keys[key.keyCode][key.mods] = NULL; } else if (key.inputType == MouseInput) { if (! mouse[key.mouseButton]) return false; mouse[key.mouseButton] = NULL; } return true; } void EventHandler::Update() { for (unsigned int i = 0; i < eventQueue.size();i++) { sf::Event ev = eventQueue.front(); eventQueue.pop(); fprintf(stderr, "Updating event type %d code %d mod %d func %p %p\n", ev.Type, ev.Key.Code, ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control, keys[ev.Key.Code][ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control], this); if(keys[ev.Key.Code][ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control]) keys[ev.Key.Code][ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control](ev); } } bool EventHandler::addEvent(sf::Event *ev) { eventQueue.push(*ev); fprintf(stderr, "Got event type %d code %d %p\n", ev->Type, ev->Key.Code, this); return true; } bool EventHandler::TestEvent (Keys k, sf::Event e) { //Mouse event if (k.inputType==MouseInput && k.eventType==e.Type && k.mouseButton==e.MouseButton.Button) { return (true); } //Keyboard event if (k.inputType==KeyboardInput && k.eventType==e.Type && k.keyCode==e.Key.Code) { return (true); } return (false); } #if defined(HAVE_WX) // Taken from wxw source code sf::Key::Code EventHandler::wxCharCodeToSF(int id) { sf::Key::Code sfKey; switch (id) { // case WXK_CANCEL: sfKey = sf::Key::Cancel; break; // case WXK_BACK: sfKey = sf::Key::BackSpace; break; case WXK_TAB: sfKey = sf::Key::Tab; break; // case WXK_CLEAR: sfKey = sf::Key::Clear; break; case WXK_RETURN: sfKey = sf::Key::Return; break; case WXK_SHIFT: sfKey = sf::Key::LShift; break; case WXK_CONTROL: sfKey = sf::Key::LControl; break; case WXK_ALT: sfKey = sf::Key::LAlt; break; // case WXK_CAPITAL: sfKey = sf::Key::Caps_Lock; break; case WXK_MENU : sfKey = sf::Key::Menu; break; case WXK_PAUSE: sfKey = sf::Key::Pause; break; case WXK_ESCAPE: sfKey = sf::Key::Escape; break; case WXK_SPACE: sfKey = sf::Key::Space; break; case WXK_PAGEUP: sfKey = sf::Key::PageUp; break; case WXK_PAGEDOWN: sfKey = sf::Key::PageDown; break; case WXK_END: sfKey = sf::Key::End; break; case WXK_HOME : sfKey = sf::Key::Home; break; case WXK_LEFT : sfKey = sf::Key::Left; break; case WXK_UP: sfKey = sf::Key::Up; break; case WXK_RIGHT: sfKey = sf::Key::Right; break; case WXK_DOWN : sfKey = sf::Key::Down; break; // case WXK_SELECT: sfKey = sf::Key::Select; break; // case WXK_PRINT: sfKey = sf::Key::Print; break; // case WXK_EXECUTE: sfKey = sf::Key::Execute; break; case WXK_INSERT: sfKey = sf::Key::Insert; break; case WXK_DELETE: sfKey = sf::Key::Delete; break; // case WXK_HELP : sfKey = sf::Key::Help; break; case WXK_NUMPAD0: sfKey = sf::Key::Numpad0; break; case WXK_NUMPAD_INSERT: sfKey = sf::Key::Insert; break; case WXK_NUMPAD1: sfKey = sf::Key::Numpad1; break; case WXK_NUMPAD_END: sfKey = sf::Key::End; break; case WXK_NUMPAD2: sfKey = sf::Key::Numpad2; break; case WXK_NUMPAD_DOWN: sfKey = sf::Key::Down; break; case WXK_NUMPAD3: sfKey = sf::Key::Numpad3; break; case WXK_NUMPAD_PAGEDOWN: sfKey = sf::Key::PageDown; break; case WXK_NUMPAD4: sfKey = sf::Key::Numpad4; break; case WXK_NUMPAD_LEFT: sfKey = sf::Key::Left; break; case WXK_NUMPAD5: sfKey = sf::Key::Numpad5; break; case WXK_NUMPAD6: sfKey = sf::Key::Numpad6; break; case WXK_NUMPAD_RIGHT: sfKey = sf::Key::Right; break; case WXK_NUMPAD7: sfKey = sf::Key::Numpad7; break; case WXK_NUMPAD_HOME: sfKey = sf::Key::Home; break; case WXK_NUMPAD8: sfKey = sf::Key::Numpad8; break; case WXK_NUMPAD_UP: sfKey = sf::Key::Up; break; case WXK_NUMPAD9: sfKey = sf::Key::Numpad9; break; case WXK_NUMPAD_PAGEUP: sfKey = sf::Key::PageUp; break; // case WXK_NUMPAD_DECIMAL: sfKey = sf::Key::Decimal; break; case WXK_NUMPAD_DELETE: sfKey = sf::Key::Delete; break; case WXK_NUMPAD_MULTIPLY: sfKey = sf::Key::Multiply; break; case WXK_NUMPAD_ADD: sfKey = sf::Key::Add; break; case WXK_NUMPAD_SUBTRACT: sfKey = sf::Key::Subtract; break; case WXK_NUMPAD_DIVIDE: sfKey = sf::Key::Divide; break; case WXK_NUMPAD_ENTER: sfKey = sf::Key::Return; break; // case WXK_NUMPAD_SEPARATOR:sfKey = sf::Key::Separator; break; case WXK_F1: sfKey = sf::Key::F1; break; case WXK_F2: sfKey = sf::Key::F2; break; case WXK_F3: sfKey = sf::Key::F3; break; case WXK_F4: sfKey = sf::Key::F4; break; case WXK_F5: sfKey = sf::Key::F5; break; case WXK_F6: sfKey = sf::Key::F6; break; case WXK_F7: sfKey = sf::Key::F7; break; case WXK_F8: sfKey = sf::Key::F8; break; case WXK_F9: sfKey = sf::Key::F9; break; case WXK_F10: sfKey = sf::Key::F10; break; case WXK_F11: sfKey = sf::Key::F11; break; case WXK_F12: sfKey = sf::Key::F12; break; case WXK_F13: sfKey = sf::Key::F13; break; case WXK_F14: sfKey = sf::Key::F14; break; case WXK_F15: sfKey = sf::Key::F15; break; // case WXK_NUMLOCK: sfKey = sf::Key::Num_Lock; break; // case WXK_SCROLL: sfKey = sf::Key::Scroll_Lock; break; default: // To lower (will tolower work on windows?) if (id >= 'A' && id <= 'Z') id = id - 'A' + 'a'; if ((id >= 'a' && id <= 'z') || (id >= '0' && id <= '9')) sfKey = (sf::Key::Code)id; else sfKey = sf::Key::Count; // Invalid key } return sfKey; } #endif void EventHandler::SFKeyToString(sf::Key::Code keycode, char *keyStr) { switch (keycode) { /* case sf::Key::A = 'a': sprintf(keyStr, "UP"); break; case sf::Key::B = 'b': sprintf(keyStr, "UP"); break; case sf::Key::C = 'c': sprintf(keyStr, "UP"); break; case sf::Key::D = 'd': sprintf(keyStr, "UP"); break; case sf::Key::E = 'e': sprintf(keyStr, "UP"); break; case sf::Key::F = 'f': sprintf(keyStr, "UP"); break; case sf::Key::G = 'g': sprintf(keyStr, "UP"); break; case sf::Key::H = 'h': sprintf(keyStr, "UP"); break; case sf::Key::I = 'i': sprintf(keyStr, "UP"); break; case sf::Key::J = 'j': sprintf(keyStr, "UP"); break; case sf::Key::K = 'k': sprintf(keyStr, "UP"); break; case sf::Key::L = 'l': sprintf(keyStr, "UP"); break; case sf::Key::M = 'm': sprintf(keyStr, "UP"); break; case sf::Key::N = 'n': sprintf(keyStr, "UP"); break; case sf::Key::O = 'o': sprintf(keyStr, "UP"); break; case sf::Key::P = 'p': sprintf(keyStr, "UP"); break; case sf::Key::Q = 'q': sprintf(keyStr, "UP"); break; case sf::Key::R = 'r': sprintf(keyStr, "UP"); break; case sf::Key::S = 's': sprintf(keyStr, "UP"); break; case sf::Key::T = 't': sprintf(keyStr, "UP"); break; case sf::Key::U = 'u': sprintf(keyStr, "UP"); break; case sf::Key::V = 'v': sprintf(keyStr, "UP"); break; case sf::Key::W = 'w': sprintf(keyStr, "UP"); break; case sf::Key::X = 'x': sprintf(keyStr, "UP"); break; case sf::Key::Y = 'y': sprintf(keyStr, "UP"); break; case sf::Key::Z = 'z': sprintf(keyStr, "UP"); break; case sf::Key::Num0 = '0': sprintf(keyStr, "UP"); break; case sf::Key::Num1 = '1': sprintf(keyStr, "UP"); break; case sf::Key::Num2 = '2': sprintf(keyStr, "UP"); break; case sf::Key::Num3 = '3': sprintf(keyStr, "UP"); break; case sf::Key::Num4 = '4': sprintf(keyStr, "UP"); break; case sf::Key::Num5 = '5': sprintf(keyStr, "UP"); break; case sf::Key::Num6 = '6': sprintf(keyStr, "UP"); break; case sf::Key::Num7 = '7': sprintf(keyStr, "UP"); break; case sf::Key::Num8 = '8': sprintf(keyStr, "UP"); break; case sf::Key::Num9 = '9': sprintf(keyStr, "UP"); break;*/ case sf::Key::Escape: sprintf(keyStr, "Escape"); break; case sf::Key::LControl: sprintf(keyStr, "LControl"); break; case sf::Key::LShift: sprintf(keyStr, "LShift"); break; case sf::Key::LAlt: sprintf(keyStr, "LAlt"); break; case sf::Key::LSystem: sprintf(keyStr, "LSystem"); break; case sf::Key::RControl: sprintf(keyStr, "RControl"); break; case sf::Key::RShift: sprintf(keyStr, "RShift"); break; case sf::Key::RAlt: sprintf(keyStr, "RAlt"); break; case sf::Key::RSystem: sprintf(keyStr, "RSystem"); break; case sf::Key::Menu: sprintf(keyStr, "Menu"); break; case sf::Key::LBracket: sprintf(keyStr, "LBracket"); break; case sf::Key::RBracket: sprintf(keyStr, "RBracket"); break; case sf::Key::SemiColon: sprintf(keyStr, ";"); break; case sf::Key::Comma: sprintf(keyStr, ","); break; case sf::Key::Period: sprintf(keyStr, "."); break; case sf::Key::Quote: sprintf(keyStr, "\'"); break; case sf::Key::Slash: sprintf(keyStr, "/"); break; case sf::Key::BackSlash: sprintf(keyStr, "\\"); break; case sf::Key::Tilde: sprintf(keyStr, "~"); break; case sf::Key::Equal: sprintf(keyStr, "="); break; case sf::Key::Dash: sprintf(keyStr, "-"); break; case sf::Key::Space: sprintf(keyStr, "Space"); break; case sf::Key::Return: sprintf(keyStr, "Return"); break; case sf::Key::Back: sprintf(keyStr, "Back"); break; case sf::Key::Tab: sprintf(keyStr, "Tab"); break; case sf::Key::PageUp: sprintf(keyStr, "Page Up"); break; case sf::Key::PageDown: sprintf(keyStr, "Page Down"); break; case sf::Key::End: sprintf(keyStr, "End"); break; case sf::Key::Home: sprintf(keyStr, "Home"); break; case sf::Key::Insert: sprintf(keyStr, "Insert"); break; case sf::Key::Delete: sprintf(keyStr, "Delete"); break; case sf::Key::Add: sprintf(keyStr, "+"); break; case sf::Key::Subtract: sprintf(keyStr, "-"); break; case sf::Key::Multiply: sprintf(keyStr, "*"); break; case sf::Key::Divide: sprintf(keyStr, "/"); break; case sf::Key::Left: sprintf(keyStr, "Left"); break; case sf::Key::Right: sprintf(keyStr, "Right"); break; case sf::Key::Up: sprintf(keyStr, "Up"); break; case sf::Key::Down: sprintf(keyStr, "Down"); break; case sf::Key::Numpad0: sprintf(keyStr, "NP 0"); break; case sf::Key::Numpad1: sprintf(keyStr, "NP 1"); break; case sf::Key::Numpad2: sprintf(keyStr, "NP 2"); break; case sf::Key::Numpad3: sprintf(keyStr, "NP 3"); break; case sf::Key::Numpad4: sprintf(keyStr, "NP 4"); break; case sf::Key::Numpad5: sprintf(keyStr, "NP 5"); break; case sf::Key::Numpad6: sprintf(keyStr, "NP 6"); break; case sf::Key::Numpad7: sprintf(keyStr, "NP 7"); break; case sf::Key::Numpad8: sprintf(keyStr, "NP 8"); break; case sf::Key::Numpad9: sprintf(keyStr, "NP 9"); break; case sf::Key::F1: sprintf(keyStr, "F1"); break; case sf::Key::F2: sprintf(keyStr, "F2"); break; case sf::Key::F3: sprintf(keyStr, "F3"); break; case sf::Key::F4: sprintf(keyStr, "F4"); break; case sf::Key::F5: sprintf(keyStr, "F5"); break; case sf::Key::F6: sprintf(keyStr, "F6"); break; case sf::Key::F7: sprintf(keyStr, "F7"); break; case sf::Key::F8: sprintf(keyStr, "F8"); break; case sf::Key::F9: sprintf(keyStr, "F9"); break; case sf::Key::F10: sprintf(keyStr, "F10"); break; case sf::Key::F11: sprintf(keyStr, "F11"); break; case sf::Key::F12: sprintf(keyStr, "F12"); break; case sf::Key::F13: sprintf(keyStr, "F13"); break; case sf::Key::F14: sprintf(keyStr, "F14"); break; case sf::Key::F15: sprintf(keyStr, "F15"); break; case sf::Key::Pause: sprintf(keyStr, "Pause"); break; default: if (keycode > sf::Key::Escape) sprintf(keyStr, "Invalid Key"); else sprintf(keyStr, "%c", toupper(keycode)); break; } } class EventHandlerCleaner { public: ~EventHandlerCleaner() { //EventHandler::Destroy(); } } EventHandlerCleanerInst; desmume-0.9.9/src/wx/InputCommon/XInput.h0000644000175000017500000000175312140261607021024 0ustar guillaumeguillaume // // Licensetype: GNU General Public License (GPL) // // 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, version 2.0. // // 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 2.0 for more details. // // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ // #ifdef _WIN32 // Includes // ---------- #include namespace XInput { // Declarations // ---------- void Init(); int GetXI(int Controller, int Button); bool IsConnected(int Controller); } // XInput #endif desmume-0.9.9/src/wx/InputCommon/X11InputBase.cpp0000644000175000017500000001520112140261607022305 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include "X11InputBase.h" #include #include #include namespace InputCommon { #if defined(HAVE_WX) && HAVE_WX // Taken from wxw source code KeySym wxCharCodeWXToX(int id) { KeySym keySym; switch (id) { case WXK_CANCEL: keySym = XK_Cancel; break; case WXK_BACK: keySym = XK_BackSpace; break; case WXK_TAB: keySym = XK_Tab; break; case WXK_CLEAR: keySym = XK_Clear; break; case WXK_RETURN: keySym = XK_Return; break; case WXK_SHIFT: keySym = XK_Shift_L; break; case WXK_CONTROL: keySym = XK_Control_L; break; case WXK_ALT: keySym = XK_Meta_L; break; case WXK_CAPITAL: keySym = XK_Caps_Lock; break; case WXK_MENU : keySym = XK_Menu; break; case WXK_PAUSE: keySym = XK_Pause; break; case WXK_ESCAPE: keySym = XK_Escape; break; case WXK_SPACE: keySym = ' '; break; case WXK_PAGEUP: keySym = XK_Prior; break; case WXK_PAGEDOWN: keySym = XK_Next; break; case WXK_END: keySym = XK_End; break; case WXK_HOME : keySym = XK_Home; break; case WXK_LEFT : keySym = XK_Left; break; case WXK_UP: keySym = XK_Up; break; case WXK_RIGHT: keySym = XK_Right; break; case WXK_DOWN : keySym = XK_Down; break; case WXK_SELECT: keySym = XK_Select; break; case WXK_PRINT: keySym = XK_Print; break; case WXK_EXECUTE: keySym = XK_Execute; break; case WXK_INSERT: keySym = XK_Insert; break; case WXK_DELETE: keySym = XK_Delete; break; case WXK_HELP : keySym = XK_Help; break; case WXK_NUMPAD0: keySym = XK_KP_0; break; case WXK_NUMPAD_INSERT: keySym = XK_KP_Insert; break; case WXK_NUMPAD1: keySym = XK_KP_1; break; case WXK_NUMPAD_END: keySym = XK_KP_End; break; case WXK_NUMPAD2: keySym = XK_KP_2; break; case WXK_NUMPAD_DOWN: keySym = XK_KP_Down; break; case WXK_NUMPAD3: keySym = XK_KP_3; break; case WXK_NUMPAD_PAGEDOWN: keySym = XK_KP_Page_Down; break; case WXK_NUMPAD4: keySym = XK_KP_4; break; case WXK_NUMPAD_LEFT: keySym = XK_KP_Left; break; case WXK_NUMPAD5: keySym = XK_KP_5; break; case WXK_NUMPAD6: keySym = XK_KP_6; break; case WXK_NUMPAD_RIGHT: keySym = XK_KP_Right; break; case WXK_NUMPAD7: keySym = XK_KP_7; break; case WXK_NUMPAD_HOME: keySym = XK_KP_Home; break; case WXK_NUMPAD8: keySym = XK_KP_8; break; case WXK_NUMPAD_UP: keySym = XK_KP_Up; break; case WXK_NUMPAD9: keySym = XK_KP_9; break; case WXK_NUMPAD_PAGEUP: keySym = XK_KP_Page_Up; break; case WXK_NUMPAD_DECIMAL: keySym = XK_KP_Decimal; break; case WXK_NUMPAD_DELETE: keySym = XK_KP_Delete; break; case WXK_NUMPAD_MULTIPLY: keySym = XK_KP_Multiply; break; case WXK_NUMPAD_ADD: keySym = XK_KP_Add; break; case WXK_NUMPAD_SUBTRACT: keySym = XK_KP_Subtract; break; case WXK_NUMPAD_DIVIDE: keySym = XK_KP_Divide; break; case WXK_NUMPAD_ENTER: keySym = XK_KP_Enter; break; case WXK_NUMPAD_SEPARATOR: keySym = XK_KP_Separator; break; case WXK_F1: keySym = XK_F1; break; case WXK_F2: keySym = XK_F2; break; case WXK_F3: keySym = XK_F3; break; case WXK_F4: keySym = XK_F4; break; case WXK_F5: keySym = XK_F5; break; case WXK_F6: keySym = XK_F6; break; case WXK_F7: keySym = XK_F7; break; case WXK_F8: keySym = XK_F8; break; case WXK_F9: keySym = XK_F9; break; case WXK_F10: keySym = XK_F10; break; case WXK_F11: keySym = XK_F11; break; case WXK_F12: keySym = XK_F12; break; case WXK_F13: keySym = XK_F13; break; case WXK_F14: keySym = XK_F14; break; case WXK_F15: keySym = XK_F15; break; case WXK_F16: keySym = XK_F16; break; case WXK_F17: keySym = XK_F17; break; case WXK_F18: keySym = XK_F18; break; case WXK_F19: keySym = XK_F19; break; case WXK_F20: keySym = XK_F20; break; case WXK_F21: keySym = XK_F21; break; case WXK_F22: keySym = XK_F22; break; case WXK_F23: keySym = XK_F23; break; case WXK_F24: keySym = XK_F24; break; case WXK_NUMLOCK: keySym = XK_Num_Lock; break; case WXK_SCROLL: keySym = XK_Scroll_Lock; break; default: keySym = id <= 255 ? (KeySym)id : 0; } return keySym; } #else KeySym wxCharCodeWXToX(int id) { return NULL; } #endif void XKeyToString(unsigned int keycode, char *keyStr) { switch (keycode) { case XK_Left: sprintf(keyStr, "LEFT"); break; case XK_Up: sprintf(keyStr, "UP"); break; case XK_Right: sprintf(keyStr, "RIGHT"); break; case XK_Down: sprintf(keyStr, "DOWN"); break; case XK_Return: sprintf(keyStr, "RETURN"); break; case XK_KP_Enter: sprintf(keyStr, "KP ENTER"); break; case XK_KP_Left: sprintf(keyStr, "KP LEFT"); break; case XK_KP_Up: sprintf(keyStr, "KP UP"); break; case XK_KP_Right: sprintf(keyStr, "KP RIGHT"); break; case XK_KP_Down: sprintf(keyStr, "KP DOWN"); break; case XK_Shift_L: sprintf(keyStr, "LShift"); break; case XK_Control_L: sprintf(keyStr, "LControl"); break; default: sprintf(keyStr, "%c", toupper(keycode)); } } } desmume-0.9.9/src/wx/InputCommon/XInput.cpp0000644000175000017500000000612412140261607021354 0ustar guillaumeguillaume // // Licensetype: GNU General Public License (GPL) // // 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, version 2.0. // // 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 2.0 for more details. // // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ // // File description /* ------------------- Function: This file will get the status of the analog triggers of any connected XInput device. This code was made with the help of SimpleController.cpp in the June 2008 Microsoft DirectX SDK Samples. ///////////////////////////////////////////////////// */ #ifdef _WIN32 // Includes // ------------------- #include #include // XInput API #include "SDL.h" // Local namespace XInput { // Declarations // ------------------- #define MAX_CONTROLLERS 4 // XInput handles up to 4 controllers struct CONTROLER_STATE { XINPUT_STATE state; bool bConnected; }; CONTROLER_STATE g_Controllers[MAX_CONTROLLERS]; // Init // ------------------- /* Function: Calculate the number of connected XInput devices Todo: Implement this to figure out if there are multiple XInput controllers connected, we currently only try to connect to XInput device 0 */ void Init() { // Init state //ZeroMemory( g_Controllers, sizeof( CONTROLER_STATE ) * MAX_CONTROLLERS ); // Declaration DWORD dwResult; // Calculate the number of connected XInput devices for( DWORD i = 0; i < MAX_CONTROLLERS; i++ ) { // Simply get the state of the controller from XInput. dwResult = XInputGetState( i, &g_Controllers[i].state ); if( dwResult == ERROR_SUCCESS ) g_Controllers[i].bConnected = true; else g_Controllers[i].bConnected = false; } } // Get the trigger status // ------------------- int GetXI(int Controller, int Button) { // Update the internal status DWORD dwResult; dwResult = XInputGetState( Controller, &g_Controllers[Controller].state ); if( dwResult != ERROR_SUCCESS ) return -1; switch(Button) { case InputCommon::XI_TRIGGER_L: return g_Controllers[0].state.Gamepad.bLeftTrigger; case InputCommon::XI_TRIGGER_R: return g_Controllers[0].state.Gamepad.bRightTrigger; default: return 0; } } // Check if a certain controller is connected // ------------------- bool IsConnected(int Controller) { DWORD dwResult = XInputGetState( Controller, &g_Controllers[Controller].state ); // Update the connected status if( dwResult == ERROR_SUCCESS ) return true; else return false; } } // XInput #endifdesmume-0.9.9/src/wx/InputCommon/SDL.cpp0000644000175000017500000002642512140261607020555 0ustar guillaumeguillaume // Project description // ------------------- // Name: SDL Input // Description: Common SDL Input Functions // // Author: Falcon4ever (nJoy@falcon4ever.com, www.multigesture.net), JPeterson etc // Copyright (C) 2003 Dolphin Project. // // // Licensetype: GNU General Public License (GPL) // // 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, version 2.0. // // 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 2.0 for more details. // // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ // // Include // ------------------- #define _SDL_MAIN_ // Avoid certain declarations in SDL.h #include "SDL.h" // Local #include "XInput.h" // Definitions // ------------------- int g_LastPad = 0; namespace InputCommon { // Definitions // ------------------- // Search attached devices. Populate joyinfo for all attached physical devices. // ----------------------- bool SearchDevices(std::vector &_joyinfo, int &_NumPads, int &_NumGoodPads) { if (!SDL_WasInit(0)) #if SDL_VERSION_ATLEAST(1, 3, 0) if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0) #else if (SDL_Init(SDL_INIT_JOYSTICK) < 0) #endif { //PanicAlert("Could not initialize SDL: %s", SDL_GetError()); return false; } // Get device status int numjoy = SDL_NumJoysticks(); for (int i = 0; i < numjoy; i++ ) { CONTROLLER_INFO Tmp; Tmp.joy = SDL_JoystickOpen(i); Tmp.ID = i; Tmp.NumAxes = SDL_JoystickNumAxes(Tmp.joy); Tmp.NumButtons = SDL_JoystickNumButtons(Tmp.joy); Tmp.NumBalls = SDL_JoystickNumBalls(Tmp.joy); Tmp.NumHats = SDL_JoystickNumHats(Tmp.joy); Tmp.Name = SDL_JoystickName(i); // Check if the device is okay if ( Tmp.NumAxes == 0 && Tmp.NumBalls == 0 && Tmp.NumButtons == 0 && Tmp.NumHats == 0 ) { Tmp.Good = false; } else { _NumGoodPads++; Tmp.Good = true; } _joyinfo.push_back(Tmp); // We have now read the values we need so we close the device if (SDL_JoystickOpened(i)) SDL_JoystickClose(_joyinfo[i].joy); } _NumPads = (int)_joyinfo.size(); return true; } // Supporting functions // ---------------- // Read current joystick status /* ---------------- The value PadMapping[].buttons[] is the number of the assigned joypad button, PadState[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */ // Read buttons status. Called from GetJoyState(). // ---------------------- static void ReadButton(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int button, int NumButtons) { int ctl_button = _PadMapping.buttons[button]; if (ctl_button < NumButtons) { _PadState.buttons[button] = SDL_JoystickGetButton(_PadState.joy, ctl_button); } } // Request joystick state. // ---------------------- /* Called from: PAD_GetStatus() Input: The virtual device 0, 1, 2 or 3 Function: Updates the PadState struct with the current pad status. The input value "controller" is for a virtual controller 0 to 3. */ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int Controller, int NumButtons) { // Update the gamepad status SDL_JoystickUpdate(); // Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here. _PadState.axis[CTL_MAIN_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_X]); _PadState.axis[CTL_MAIN_Y] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_Y]); _PadState.axis[CTL_SUB_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_SUB_X]); _PadState.axis[CTL_SUB_Y] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_SUB_Y]); // Update the analog trigger axis values #ifdef _WIN32 if (_PadMapping.triggertype == CTL_TRIGGER_SDL) { #endif // If we are using SDL analog triggers the buttons have to be mapped as 1000 or up, otherwise they are not used if(_PadMapping.buttons[CTL_L_SHOULDER] >= 1000) _PadState.axis[CTL_L_SHOULDER] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.buttons[CTL_L_SHOULDER] - 1000); else _PadState.axis[CTL_L_SHOULDER] = 0; if(_PadMapping.buttons[CTL_R_SHOULDER] >= 1000) _PadState.axis[CTL_R_SHOULDER] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.buttons[CTL_R_SHOULDER] - 1000); else _PadState.axis[CTL_R_SHOULDER] = 0; #ifdef _WIN32 } else { // XInput triggers for Xbox360 pads _PadState.axis[CTL_L_SHOULDER] = XInput::GetXI(0, _PadMapping.buttons[CTL_L_SHOULDER] - 1000); _PadState.axis[CTL_R_SHOULDER] = XInput::GetXI(0, _PadMapping.buttons[CTL_R_SHOULDER] - 1000); } #endif // Update button states to on or off ReadButton(_PadState, _PadMapping, CTL_L_SHOULDER, NumButtons); ReadButton(_PadState, _PadMapping, CTL_R_SHOULDER, NumButtons); ReadButton(_PadState, _PadMapping, CTL_A_BUTTON, NumButtons); ReadButton(_PadState, _PadMapping, CTL_B_BUTTON, NumButtons); ReadButton(_PadState, _PadMapping, CTL_X_BUTTON, NumButtons); ReadButton(_PadState, _PadMapping, CTL_Y_BUTTON, NumButtons); ReadButton(_PadState, _PadMapping, CTL_Z_TRIGGER, NumButtons); ReadButton(_PadState, _PadMapping, CTL_START, NumButtons); // Update Halfpress state, this one is not in the standard _PadState.buttons array if (_PadMapping.halfpress < NumButtons && _PadMapping.halfpress >= 0) _PadState.halfpress = SDL_JoystickGetButton(_PadState.joy, _PadMapping.halfpress); else _PadState.halfpress = 0; // Check if we have an analog or digital joypad if (_PadMapping.controllertype == CTL_DPAD_HAT) { _PadState.dpad = SDL_JoystickGetHat(_PadState.joy, _PadMapping.dpad); } else { // Only do this if the assigned button is in range (to allow for the current way of saving keyboard // keys in the same array) if(_PadMapping.dpad2[CTL_D_PAD_UP] <= NumButtons) _PadState.dpad2[CTL_D_PAD_UP] = SDL_JoystickGetButton(_PadState.joy, _PadMapping.dpad2[CTL_D_PAD_UP]); if(_PadMapping.dpad2[CTL_D_PAD_DOWN] <= NumButtons) _PadState.dpad2[CTL_D_PAD_DOWN] = SDL_JoystickGetButton(_PadState.joy, _PadMapping.dpad2[CTL_D_PAD_DOWN]); if(_PadMapping.dpad2[CTL_D_PAD_LEFT] <= NumButtons) _PadState.dpad2[CTL_D_PAD_LEFT] = SDL_JoystickGetButton(_PadState.joy, _PadMapping.dpad2[CTL_D_PAD_LEFT]); if(_PadMapping.dpad2[CTL_D_PAD_RIGHT] <= NumButtons) _PadState.dpad2[CTL_D_PAD_RIGHT] = SDL_JoystickGetButton(_PadState.joy, _PadMapping.dpad2[CTL_D_PAD_RIGHT]); } #ifdef SHOW_PAD_STATUS // Show the status of all connected pads //ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); //if ((g_LastPad == 0 && Controller == 0) || Controller < g_LastPad) Console->ClearScreen(); g_LastPad = Controller; NOTICE_LOG(CONSOLE, "Pad | Number:%i Enabled:%i Handle:%i\n" "Main Stick | X:%03i Y:%03i\n" "C Stick | X:%03i Y:%03i\n" "Trigger | Type:%s DigitalL:%i DigitalR:%i AnalogL:%03i AnalogR:%03i HalfPress:%i\n" "Buttons | A:%i X:%i\n" "D-Pad | Type:%s Hat:%i U:%i D:%i\n" "======================================================\n", Controller, _PadMapping.enabled, _PadState.joy, _PadState.axis[InputCommon::CTL_MAIN_X], _PadState.axis[InputCommon::CTL_MAIN_Y], _PadState.axis[InputCommon::CTL_SUB_X], _PadState.axis[InputCommon::CTL_SUB_Y], (_PadMapping.triggertype ? "CTL_TRIGGER_XINPUT" : "CTL_TRIGGER_SDL"), _PadState.buttons[InputCommon::CTL_L_SHOULDER], _PadState.buttons[InputCommon::CTL_R_SHOULDER], _PadState.axis[InputCommon::CTL_L_SHOULDER], _PadState.axis[InputCommon::CTL_R_SHOULDER], _PadState.halfpress, _PadState.buttons[InputCommon::CTL_A_BUTTON], _PadState.buttons[InputCommon::CTL_X_BUTTON], (_PadMapping.controllertype ? "CTL_DPAD_CUSTOM" : "CTL_DPAD_HAT"), _PadState.dpad, _PadState.dpad2[InputCommon::CTL_D_PAD_UP], _PadState.dpad2[InputCommon::CTL_D_PAD_DOWN] ); #endif } // Configure button mapping // ---------- // Avoid extreme axis values // --------------------- /* Function: We have to avoid very big values to becuse some triggers are -0x8000 in the unpressed state (and then go from -0x8000 to 0x8000 as they are fully pressed) */ static bool AvoidValues(int value, bool NoTriggerFilter) { // Avoid detecting very small or very big (for triggers) values if( (value > -0x2000 && value < 0x2000) // Small values || ((value < -0x6000 || value > 0x6000) && !NoTriggerFilter)) // Big values return true; // Avoid else return false; // Keep } // Detect a pressed button // --------------------- void GetButton(SDL_Joystick *joy, int ControllerID, int buttons, int axes, int hats, int &KeyboardKey, int &value, int &type, int &pressed, bool &Succeed, bool &Stop, bool LeftRight, bool Axis, bool XInput, bool Button, bool Hat, bool NoTriggerFilter) { // It needs the wxWidgets excape keycode static const int WXK_ESCAPE = 27; // Update the internal status SDL_JoystickUpdate(); // For the triggers we accept both a digital or an analog button if(Axis) { for(int i = 0; i < axes; i++) { value = SDL_JoystickGetAxis(joy, i); if(AvoidValues(value, NoTriggerFilter)) continue; // Avoid values pressed = i + (LeftRight ? 1000 : 0); // Identify the analog triggers type = InputCommon::CTL_AXIS; Succeed = true; } } // Check for a hat if(Hat) { for(int i = 0; i < hats; i++) { value = SDL_JoystickGetHat(joy, i); if(value) { pressed = i; type = InputCommon::CTL_HAT; Succeed = true; } } } // Check for a button if(Button) { for(int i = 0; i < buttons; i++) { // Some kind of bug in SDL 1.3 would give button 9 and 10 (nonexistent) the value 48 on the 360 pad if (SDL_JoystickGetButton(joy, i) > 1) continue; if(SDL_JoystickGetButton(joy, i)) { pressed = i; type = InputCommon::CTL_BUTTON; Succeed = true; } } } // Check for a XInput trigger #ifdef _WIN32 if(XInput) { for(int i = 0; i <= InputCommon::XI_TRIGGER_R; i++) { if(XInput::GetXI(0, i)) { pressed = i + 1000; type = InputCommon::CTL_AXIS; Succeed = true; } } } #endif // Check for keyboard action if (KeyboardKey) { if(Button) { // Todo: Add a separate keyboard vector to remove this restriction if(KeyboardKey >= buttons) { pressed = KeyboardKey; type = InputCommon::CTL_BUTTON; Succeed = true; KeyboardKey = 0; if(pressed == WXK_ESCAPE) pressed = -1; // Check for the escape key } // Else show the error message else { pressed = KeyboardKey; KeyboardKey = -1; Stop = true; } } // Only accept the escape key else if (KeyboardKey == WXK_ESCAPE) { Succeed = true; KeyboardKey = 0; pressed = -1; } } } /////////////////////////////////////////////////////////// Configure button mapping } // InputCommon desmume-0.9.9/src/wx/InputCommon/Event.hpp0000644000175000017500000001002312140261607021204 0ustar guillaumeguillaume// SFML - Simple and Fast Multimedia Library // Copyright (C) 2007-2008 Laurent Gomila (laurent.gom@gmail.com) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it freely, // subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; // you must not claim that you wrote the original software. // If you use this software in a product, an acknowledgment // in the product documentation would be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, // and must not be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source distribution. #ifndef SFML_EVENT_HPP #define SFML_EVENT_HPP namespace sf { namespace Key { enum Code { A = 'a', B = 'b', C = 'c', D = 'd', E = 'e', F = 'f', G = 'g', H = 'h', I = 'i', J = 'j', K = 'k', L = 'l', M = 'm', N = 'n', O = 'o', P = 'p', Q = 'q', R = 'r', S = 's', T = 't', U = 'u', V = 'v', W = 'w', X = 'x', Y = 'y', Z = 'z', Num0 = '0', Num1 = '1', Num2 = '2', Num3 = '3', Num4 = '4', Num5 = '5', Num6 = '6', Num7 = '7', Num8 = '8', Num9 = '9', Escape = 256, LControl, LShift, LAlt, LSystem, RControl, RShift, RAlt, RSystem, Menu, LBracket, RBracket, SemiColon, Comma, Period, Quote, Slash, BackSlash, Tilde, Equal, Dash, Space, Return, Back, Tab, PageUp, PageDown, End, Home, Insert, Delete, Add, Subtract, Multiply, Divide, Left, Right, Up, Down, Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, Pause, Count // For internal use }; } namespace Mouse { enum Button { Left, Right, Middle, XButton1, XButton2, Count // For internal use }; } namespace Joy { enum Axis { AxisX, AxisY, AxisZ, AxisR, AxisU, AxisV, AxisPOV, Count // For internal use }; } class Event { public : struct KeyEvent { Key::Code Code; bool Alt; bool Control; bool Shift; }; struct TextEvent { // I'm not sure we need this... unsigned short Unicode; }; struct MouseMoveEvent { int X; int Y; }; struct MouseButtonEvent { Mouse::Button Button; int X; int Y; }; struct MouseWheelEvent { int Delta; }; struct JoyMoveEvent { unsigned int JoystickId; Joy::Axis Axis; float Position; }; struct JoyButtonEvent { unsigned int JoystickId; unsigned int Button; }; struct SizeEvent { unsigned int Width; unsigned int Height; }; enum EventType { Closed, Resized, LostFocus, GainedFocus, TextEntered, KeyPressed, KeyReleased, MouseWheelMoved, MouseButtonPressed, MouseButtonReleased, MouseMoved, MouseEntered, MouseLeft, JoyButtonPressed, JoyButtonReleased, JoyMoved }; // Member data EventType Type; union { KeyEvent Key; TextEvent Text; MouseMoveEvent MouseMove; MouseButtonEvent MouseButton; MouseWheelEvent MouseWheel; JoyMoveEvent JoyMove; JoyButtonEvent JoyButton; SizeEvent Size; }; }; } // namespace sf #endif // SFML_EVENT_HPP desmume-0.9.9/src/wx/InputCommon/SDL.h0000644000175000017500000001464612140261607020224 0ustar guillaumeguillaume // Project description // ------------------- // Name: SDL Input // Description: Common SDL Input Functions // // Author: Falcon4ever (nJoy@falcon4ever.com, www.multigesture.net), JPeterson etc // Copyright (C) 2003 Dolphin Project. // // // Licensetype: GNU General Public License (GPL) // // 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, version 2.0. // // 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 2.0 for more details. // // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ // #ifndef _SDL_h #define _SDL_h // Include // ------------------- #include // System #include #include #ifdef _WIN32 #include // Externals #include #if SDL_VERSION_ATLEAST(1, 3, 0) #include #endif #else #include #include #if SDL_VERSION_ATLEAST(1, 3, 0) #include #endif #endif #include "common.h" // Common namespace InputCommon { // Settings // ---------- // Show a status window with the detected axes, buttons and so on //#define SHOW_PAD_STATUS // Structures /* ------------------- CONTROLLER_STATE buttons (PadState) = 0 or 1 CONTROLLER_MAPPING buttons (joystick) = 0 or 1, 2, 3, 4, a certain joypad button Please remember: The axis limit is hardcoded here, if you allow more axises (for example for analog A and B buttons) you must first incrase the size of the axis array size here */ struct CONTROLLER_STATE // GC PAD INFO/STATE { int buttons[8]; // Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons int dpad; // Automatic SDL D-Pad (8 directions + neutral) int dpad2[4]; // D-pad using buttons int axis[6]; // 2 x 2 Axes (Main & Sub) int halfpress; // Halfpress... you know, like not fully pressed ;)... SDL_Joystick *joy; // SDL joystick device }; struct CONTROLLER_MAPPING // GC PAD MAPPING { int buttons[8]; // (See above) int dpad; // (See above) int dpad2[4]; // (See above) int axis[6]; // (See above) int halfpress; // (See above) int deadzone; // Deadzone... what else? int ID; // SDL joystick device ID int controllertype; // Hat: Hat or custom buttons int triggertype; // Triggers range std::string SRadius, SDiagonal, SRadiusC, SDiagonalC; bool bRadiusOnOff, bSquareToCircle, bRadiusOnOffC, bSquareToCircleC; bool rumble; bool enable; int eventnum; // Linux Event Number, Can't be found dynamically yet }; struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO { int NumAxes; // Amount of Axes int NumButtons; // Amount of Buttons int NumBalls; // Amount of Balls int NumHats; // Amount of Hats (POV) std::string Name; // Joypad/stickname int ID; // SDL joystick device ID bool Good; // Pad is good (it has at least one button or axis) SDL_Joystick *joy; // SDL joystick device }; enum { // CTL_L_SHOULDER and CTL_R_SHOULDER = 0 and 1 CTL_MAIN_X = 2, CTL_MAIN_Y, CTL_SUB_X, CTL_SUB_Y }; enum { CTL_L_SHOULDER = 0, CTL_R_SHOULDER, CTL_A_BUTTON, CTL_B_BUTTON, CTL_X_BUTTON, CTL_Y_BUTTON, CTL_Z_TRIGGER, CTL_START }; // DPad Type enum { CTL_DPAD_HAT = 0, // Automatically use the first hat that SDL finds CTL_DPAD_CUSTOM // Custom directional pad settings }; // Trigger Type enum { CTL_TRIGGER_SDL = 0, // CTL_TRIGGER_XINPUT // The XBox 360 pad }; enum { CTL_D_PAD_UP = 0, CTL_D_PAD_DOWN, CTL_D_PAD_LEFT, CTL_D_PAD_RIGHT }; // Button type for the configuration enum { CTL_AXIS = 0, CTL_HAT, CTL_BUTTON, CTL_KEY }; // XInput buttons enum { XI_TRIGGER_L = 0, XI_TRIGGER_R }; union PadAxis { int keyForControls[6]; struct { int Lx; int Ly; int Rx; int Ry; int Tl; // Trigger int Tr; // Trigger }; }; struct PadWiimote { int keyForControls[16]; // Order is A, B, 1, 2, +, -, Home // L, R, U, D, RollL, RollR, PitchU, PitchD, Shake }; struct PadNunchuck { int keyForControls[7]; // Order is Z, C, L, R, U, D, Shake }; struct PadClassicController { int keyForControls[23]; // Order is A, B, X, Y, +, -, Home // Tl, Zl, Zr, Tr, Dl, Dr, Du, Dd // Ll, Lr, Lu, Ld, Rl, Rr, Ru, Rd }; struct PadGH3Controller { int keyForControls[14]; // Order is Green, Red, Yellow, Blue, Orange, // +, -, Whammy, // Al, Ar, Au, Ad, // StrumUp, StrumDown }; struct CONTROLLER_STATE_NEW // GC PAD INFO/STATE { PadAxis Axis; // 6 Axes (Main, Sub, Triggers) SDL_Joystick *joy; // SDL joystick device }; struct CONTROLLER_MAPPING_NEW // GC PAD MAPPING { PadAxis Axis; // (See above) PadWiimote Wm; PadNunchuck Nc; PadClassicController Cc; PadGH3Controller GH3c; bool enabled; // Pad attached? bool Rumble; int RumbleStrength; int DeadZoneL; // Analog 1 Deadzone int DeadZoneR; // Analog 2 Deadzone int ID; // SDL joystick device ID int controllertype; // D-Pad type: Hat or custom buttons int triggertype; // SDL or XInput trigger std::string SDiagonal; bool bSquareToCircle; bool bCircle2Square; }; // Declarations // --------- // General functions bool SearchDevices(std::vector &_joyinfo, int &NumPads, int &NumGoodPads); void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int controller, int NumButtons); void GetButton(SDL_Joystick*, int,int,int,int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool); // Value conversion float Deg2Rad(float Deg); float Rad2Deg(float Rad); int Pad_Convert(int _val); float SquareDistance(float deg); bool IsDeadZone(float DeadZone, int x, int y); void Square2Circle(int &_x, int &_y, int _pad, std::string SDiagonal, bool Circle2Square = false); void RadiusAdjustment(int &_x, int &_y, int _pad, std::string SRadius); // Input configuration std::string VKToString(int keycode); #ifndef _SDL_MAIN_ extern int g_LastPad; #endif } // InputCommon #endif // _SDL_h desmume-0.9.9/src/wx/InputCommon/X11InputBase.h0000644000175000017500000000201412140261607021750 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #ifndef XINPUTBASE_H #define XINPUTBASE_H #include #include #if 0 #include "config.h" #endif #if defined(HAVE_WX) && HAVE_WX #include #endif namespace InputCommon { KeySym wxCharCodeWXToX(int id); void XKeyToString(unsigned int keycode, char *keyStr); } #endif desmume-0.9.9/src/wx/InputCommon/EventHandler.h0000644000175000017500000000254712140261607022156 0ustar guillaumeguillaume#ifndef EVENTHANDER_H #define EVENTHANDER_H 1 #include "common.h" #include #include "Event.hpp" #define NUMKEYS 300 #define NUMMODS 8 typedef bool (*listenFuncPtr) (sf::Event); enum InputType { KeyboardInput, MouseInput, JoystickInput }; enum Modifiers { UseAlt = 1, UseShift = 2, UseCtrl = 4 }; struct Keys { InputType inputType; sf::Event::EventType eventType; sf::Key::Code keyCode; int mods; sf::Mouse::Button mouseButton; }; class EventHandler { private: listenFuncPtr keys[NUMKEYS][NUMMODS]; listenFuncPtr mouse[sf::Mouse::Count+1]; listenFuncPtr joys[sf::Joy::Count+1]; std::queue eventQueue; static EventHandler *m_Instance; protected: EventHandler(const EventHandler&); EventHandler& operator= (const EventHandler&); EventHandler(); ~EventHandler(); public: bool RegisterEventListener(listenFuncPtr func, Keys key); bool RemoveEventListener(Keys key); void Update(); static EventHandler *GetInstance(); static void Destroy(); bool addEvent(sf::Event *e); static bool TestEvent (Keys k, sf::Event e); #if defined(HAVE_WX) static sf::Key::Code wxCharCodeToSF(int id); #endif static void SFKeyToString(sf::Key::Code keycode, char *keyStr); }; #endif desmume-0.9.9/src/wx/InputCommon/Configuration.cpp0000644000175000017500000002000512140261607022726 0ustar guillaumeguillaume // Project description // ------------------- // Name: Input Configuration and Calibration // Description: Common SDL Input Functions // // Author: Falcon4ever (nJoy@falcon4ever.com, www.multigesture.net), JPeterson etc // Copyright (C) 2003 Dolphin Project. // // // Licensetype: GNU General Public License (GPL) // // 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, version 2.0. // // 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 2.0 for more details. // // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ // // Include // ------------------- #if defined HAVE_WX && HAVE_WX #include #endif #ifdef _WIN32 #define NOMINMAX #include #endif #include "SDL.h" // Local namespace InputCommon { // Degree to radian and back // ------------- float Deg2Rad(float Deg) { return Deg * (float)M_PI / 180.0f; } float Rad2Deg(float Rad) { return Rad * 180.0f / (float)M_PI; } // Check if the pad is within the dead zone, we assume the range is 0x8000 // ---------------- static float CoordinatesToRadius(int x, int y) { return sqrt(pow((float)x, 2) + pow((float)y, 2)); } bool IsDeadZone(float DeadZone, int x, int y) { // Get the distance from the center float Distance = CoordinatesToRadius(x, y) / 32767.0f; //Console::Print("%f\n", Distance); // Check if it's within the dead zone if (Distance <= DeadZone) return true; else return false; } // Scale down stick values from 0x8000 to 0x80 /* ---------------- The value returned by SDL_JoystickGetAxis is a signed integer s16 (-32768 to 32767). The value used for the gamecube controller is an unsigned char u8 (0 to 255) with neutral at 0x80 (128), so that it's equivalent to a signed -128 to 127. */ // --------------------- int Pad_Convert(int _val) { /* If the limits on PadState[].axis[] actually is a u16 then we don't need this but if it's not actually limited to that we need to apply these limits */ if(_val > 32767) _val = 32767; // upper limit if(_val < -32768) _val = -32768; // lower limit // Convert the range (-0x8000 to 0x7fff) to (0 to 0xffff) _val = 0x8000 +_val; // Convert the range (0 to 0xffff) to (0 to 0xff) _val = _val >> 8; //Console::Print("0x%04x %06i\n\n", _val, _val); return _val; } // Adjust the radius // ---------------- void RadiusAdjustment(int &_x, int &_y, int _pad, std::string SRadius) { // Get the radius setting int Tmp = atoi (SRadius.substr(0, SRadius.length() - 1).c_str()); float RadiusSetting = Tmp / 100.0f; // Get current angle float Deg = Rad2Deg(atan2((float)_y, (float)_x)); // Get the current radius float Radius = sqrt((float)(_x*_x + _y*_y)); // Adjust radius Radius = Radius * RadiusSetting; // Produce new coordinates float x = Radius * cos(Deg2Rad(Deg)); float y = Radius * sin(Deg2Rad(Deg)); // Update values _x = (int)x, _y = (int)y; } /* Convert the stick raidus from a square or rounded box to a circular radius. I don't know what input values the actual GC controller produce for the GC, it may be a square, a circle or something in between. But one thing that is certain is that PC pads differ in their output (as shown in the list below), so it may be beneficiary to convert whatever radius they produce to the radius the GC games expect. This is the first implementation of this that convert a square radius to a circual radius. Use the advanced settings to enable and calibrate it. Observed diagonals: Perfect circle: 71% = sin(45) Logitech Dual Action: 100% PS2 Dual Shock 2 (Original) with Super Dual Box Pro: 90% XBox 360 Wireless: 85% GameCube Controller (Third Party) with EMS Trio Linker Plus II: 60% */ // --------------------- /* Calculate the distance from the outer edges of the box to the outer edges of the circle inside the box at any angle from 0 to 360. The returned value is 1 + Distance, for example at most sqrt(2) in the corners and at least 1.0 at the horizontal and vertical angles. */ static float Square2CircleDistance(float deg) { // See if we have to adjust the angle deg = abs(deg); if( (deg > 45 && deg < 135) ) deg = deg - 90; // Calculate distance from center float val = abs(cos(Deg2Rad(deg))); float Distance = 1 / val; //m_frame->m_pStatusBar2->SetLabel(wxString::Format("Deg:%f Val:%f Dist:%f", deg, val, dist)); return Distance; } // Produce a perfect circle from an original square or rounded box void Square2Circle(int &_x, int &_y, int _pad, std::string SDiagonal, bool Circle2Square) { // Do we need to do this check? if(_x > 32767) _x = 32767; if(_y > 32767) _y = 32767; // upper limit if(_x < -32768) _x = -32768; if(_y < -32768) _y = -32768; // lower limit // ==================================== // Convert to circle // ----------- // Get the manually configured diagonal distance int Tmp = atoi (SDiagonal.substr(0, SDiagonal.length() - 1).c_str()); float Diagonal = Tmp / 100.0f; // First make a perfect square in case we don't have one already float OrigDist = sqrt( pow((float)_y, 2) + pow((float)_x, 2) ); // Get current distance float deg = Rad2Deg(atan2((float)_y, (float)_x)); // Get current angle /* Calculate the actual distance between the maxium diagonal values, and the outer edges of the square. A diagonal of 85% means a maximum distance of 0.85 * sqrt(2) ~1.2 in the diagonals. */ float corner_circle_dist = ( Diagonal / sin(Deg2Rad(45.0f)) ); float SquareDist = Square2CircleDistance(deg); // The original-to-square distance adjustment float adj_ratio1; // The circle-to-square distance adjustment float adj_ratio2 = SquareDist; // The resulting distance float result_dist; // Calculate the corner-to-square adjustment ratio if(corner_circle_dist < SquareDist) adj_ratio1 = SquareDist / corner_circle_dist; else adj_ratio1 = 1; // Calculate the resulting distance if(Circle2Square) result_dist = OrigDist * adj_ratio1; else result_dist = OrigDist * adj_ratio1 / adj_ratio2; // Calculate x and y and return it float x = result_dist * cos(Deg2Rad(deg)); float y = result_dist * sin(Deg2Rad(deg)); // Update coordinates _x = (int)floor(x); _y = (int)floor(y); // Boundaries if (_x < -32768) _x = -32768; if (_x > 32767) _x = 32767; if (_y < -32768) _y = -32768; if (_y > 32767) _y = 32767; // Debugging //Console::Print("%f %f %i", corner_circle_dist, Diagonal, Tmp)); } // Windows Virtual Key Codes Names // --------------------- #ifdef _WIN32 std::string VKToString(int keycode) { #ifdef _WIN32 // Default value char KeyStr[64] = {0}; std::string KeyString; // TODO: Switch to unicode GetKeyNameText? if (keycode < 256) // Keyboard GetKeyNameTextA(MapVirtualKey(keycode, MAPVK_VK_TO_VSC) << 16, KeyStr, 64); else // Pad sprintf(KeyStr, "PAD: %d", keycode - 0x1000); switch(keycode) { // Give it some help with a few keys case VK_END: return "END"; case VK_INSERT: return "INS"; case VK_DELETE: return "DEL"; case VK_PRIOR: return "PGUP"; case VK_NEXT: return "PGDN"; case VK_UP: return "UP"; case VK_DOWN: return "DOWN"; case VK_LEFT: return "LEFT"; case VK_RIGHT: return "RIGHT"; case VK_LSHIFT: return "LEFT SHIFT"; case VK_LCONTROL: return "LEFT CTRL"; case VK_RCONTROL: return "RIGHT CTRL"; case VK_LMENU: return "LEFT ALT"; default: return KeyString = KeyStr; } #else // An equivalent name translation can probably be used on other systems to? return ""; #endif } #endif } desmume-0.9.9/src/wx/InputCommon/InputCommon.h0000644000175000017500000000021312140261607022033 0ustar guillaumeguillaume#include "EventHandler.h" //extern EventHandler *eventHandler; namespace InputCommon { void Init(); void Shutdown(); } desmume-0.9.9/src/wx/InputCommon/InputCommon.cpp0000644000175000017500000000045212140261607022373 0ustar guillaumeguillaume#include "EventHandler.h" #include "InputCommon.h" //EventHandler *eventHandler = NULL; namespace InputCommon { void Init() { // init the event handler //EventHandler::GetInstance(); } void Shutdown() { //if (eventHandler) // delete eventHandler; } } desmume-0.9.9/src/wx/StringUtil.h0000644000175000017500000000552112140261617017427 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #ifndef _STRINGUTIL_H_ #define _STRINGUTIL_H_ #include #include #include #include "common.h" std::string StringFromFormat(const char* format, ...); void ToStringFromFormat(std::string* out, const char* format, ...); // WARNING - only call once with a set of args! void StringFromFormatV(std::string* out, const char* format, va_list args); // Cheap! bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list args); // Good std::string ArrayToString(const u8 *data, u32 size, u32 offset = 0, int line_len = 20, bool Spaces = true); template inline void CharArrayFromFormat(char (& out)[Count], const char* format, ...) { va_list args; va_start(args, format); CharArrayFromFormatV(out, Count, format, args); va_end(args); } std::string StripSpaces(const std::string &s); std::string StripQuotes(const std::string &s); std::string StripNewline(const std::string &s); // Thousand separator. Turns 12345678 into 12,345,678 std::string ThS(int a, bool b = true, int Spaces = 0); std::string StringFromInt(int value); std::string StringFromBool(bool value); bool TryParseInt(const char* str, int* outVal); bool TryParseBool(const char* str, bool* output); bool TryParseUInt(const std::string& str, u32* output); // TODO: kill this bool AsciiToHex(const char* _szValue, u32& result); u32 Ascii2Hex(std::string _Text); std::string Hex2Ascii(u32 _Text); std::string TabsToSpaces(int tab_size, const std::string &in); void SplitString(const std::string& str, const std::string& delim, std::vector& output); int ChooseStringFrom(const char* str, const char* * items); // "C:\Windows\winhelp.exe" to "C:\Windows\", "winhelp", "exe" bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension); // "C:\Windows\winhelp.exe" to "winhelp.exe" std::string PathToFilename(std::string Path); void BuildCompleteFilename(std::string& _CompleteFilename, const std::string& _Path, const std::string& _Filename); void NormalizeDirSep(std::string* str); #endif // _STRINGUTIL_H_ desmume-0.9.9/src/wx/wxMain.cpp0000644000175000017500000006377112140261617017134 0ustar guillaumeguillaume/* wxMain.cpp - this file is part of DeSmuME * * Copyright (C) 2003-2009 Dolphin Project * Copyright (C) 2009-2011 DeSmuME Team * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "wxMain.h" #include "NDSSystem.h" #include "GPU_osd.h" #include #include "gfx3d.h" #include "version.h" #include "addons.h" #include "saves.h" #include "movie.h" #include "sndsdl.h" #include "render3D.h" #include "rasterize.h" #include "OGLRender.h" #include "firmware.h" #ifdef HAVE_LIBAGG #include "aggdraw.h" #endif #include "DeSmuME.xpm" #ifndef WIN32 #define lstrlen(a) strlen((a)) #endif #include #include "LuaWindow.h" #include "PadSimple/GUI/ConfigDlg.h" #include "PadSimple/pluginspecs_pad.h" #include "wxdlg/wxcontrolsconfigdialog.h" #ifndef WX_PRECOMP #include #endif #ifdef GDB_STUB #include "gdbstub.h" #endif #include #include /*************** VARS ******************/ #define SCREEN_SIZE (256*192*3) #define GAP_DEFAULT 64 #define GAP_MAX 90 static int nds_gap_size; static SPADInitialize PADInitialize; static bool Touch = false; #if defined(WIN32) || defined(HAVE_LIBSOUNDTOUCH) #define HAVE_SPUMODE_SYNCP #endif enum audiodriver_enum { AUDIODRIVER_SDL = 0, AUDIODRIVER_DISABLE }; enum spumode_enum { SPUMODE_DUALASYNC = 0, SPUMODE_SYNCN, SPUMODE_SYNCZ, #ifdef HAVE_SPUMODE_SYNCP SPUMODE_SYNCP #endif }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDSDL, NULL }; GPU3DInterface *core3DList[] = { &gpu3DRasterize, #if !defined(WIN32) && !defined(__APPLE__) &gpu3Dgl, #endif &gpu3DNull, NULL }; volatile bool execute = false; /*************** wx OnInit ******************/ bool Desmume::OnInit() { if ( !wxApp::OnInit() ) return false; #ifdef WIN32 extern void OpenConsole(); OpenConsole(); #endif SetAppName(_T("desmume")); wxString iniFileName = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()) + _T("/desmume.ini"); wxConfigBase *pConfig = new wxFileConfig(wxEmptyString,wxEmptyString,iniFileName,wxEmptyString,wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_RELATIVE_PATH); wxConfigBase::Set(pConfig); wxString emu_version(EMU_DESMUME_NAME_AND_VERSION(), wxConvUTF8); DesmumeFrame *frame = new DesmumeFrame(emu_version); frame->NDSInitialize(); frame->Show(true); PADInitialize.padNumber = 1; #ifndef WIN32 extern void Initialize(void *init); Initialize(&PADInitialize); #endif return true; } /*************** DesmumeFrame class functions for functionality/events ******************/ void DesmumeFrame::NDSInitialize() { NDS_FillDefaultFirmwareConfigData( &fw_config); #ifdef HAVE_LIBAGG Desmume_InitOnce(); aggDraw.hud->attach((u8*)GPU_screen, 256, 384, 1024);//TODO #endif //TODO addon_type = NDS_ADDON_NONE; addonsChangePak(addon_type); #ifdef GDB_STUB arm9_memio = &arm9_base_memory_iface; arm7_memio = &arm7_base_memory_iface; NDS_Init( arm9_memio, &arm9_ctrl_iface, arm7_memio, &arm7_ctrl_iface); #else NDS_Init(); #endif SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); NDS_3D_ChangeCore(0); NDS_CreateDummyFirmware( &fw_config); } void DesmumeFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { execute = false; SPU_Pause(1); NDS_DeInit(); Close(true); } void DesmumeFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { wxMessageBox( wxString::Format(wxT("Desmume on %s"),wxGetOsDescription().c_str()), wxT("About Desmume"), wxOK | wxICON_INFORMATION, this); } void DesmumeFrame::applyInput() { bool up,down,left,right,x,y,a,b,l,r,start,select; up = down = left = right = x = y = a = b = l = r = start = select = false; SPADStatus s; memset(&s,0,sizeof(s)); //TODO !!!!!!!!!!!!!!!!!!!!!! FIXME!!!!!!!!!!1 #ifndef _MSC_VER // PAD_GetStatus(0, &s); #endif if(s.button & PAD_BUTTON_LEFT) left = true; if(s.button & PAD_BUTTON_RIGHT) right = true; if(s.button & PAD_BUTTON_UP) up = true; if(s.button & PAD_BUTTON_DOWN) down = true; if(s.button & PAD_BUTTON_A) a = true; if(s.button & PAD_BUTTON_B) b = true; if(s.button & PAD_BUTTON_X) x = true; if(s.button & PAD_BUTTON_Y) y = true; if(s.button & PAD_TRIGGER_L) l = true; if(s.button & PAD_TRIGGER_R) r = true; if(s.button & PAD_BUTTON_START) start = true; u16 pad1 = (0 | ((a ? 0 : 0x80) >> 7) | ((b ? 0 : 0x80) >> 6) | ((select? 0 : 0x80) >> 5) | ((start ? 0 : 0x80) >> 4) | ((right ? 0 : 0x80) >> 3) | ((left ? 0 : 0x80) >> 2) | ((up ? 0 : 0x80) >> 1) | ((down ? 0 : 0x80) ) | ((r ? 0 : 0x80) << 1) | ((l ? 0 : 0x80) << 2)) ; ((u16 *)MMU.ARM9_REG)[0x130>>1] = (u16)pad1; ((u16 *)MMU.ARM7_REG)[0x130>>1] = (u16)pad1; bool debug = false; bool lidClosed = false; u16 padExt = (((u16 *)MMU.ARM7_REG)[0x136>>1] & 0x0070) | ((x ? 0 : 0x80) >> 7) | ((y ? 0 : 0x80) >> 6) | ((debug ? 0 : 0x80) >> 4) | ((lidClosed) << 7) | 0x0034; ((u16 *)MMU.ARM7_REG)[0x136>>1] = (u16)padExt; } void DesmumeFrame::LoadRom(wxCommandEvent& event) { execute = false; SPU_Pause(1); wxFileDialog dialog(this,_T("Load Rom"),wxGetHomeDir(),_T(""),_T("*.nds"),wxFD_OPEN, wxDefaultPosition, wxDefaultSize); if(dialog.ShowModal() == wxID_OK) { history->AddFileToHistory(dialog.GetPath()); NDS_LoadROM(dialog.GetPath().mb_str(), dialog.GetPath().mb_str()); execute = true; SPU_Pause(0); } } bool DesmumeFrame::DetransformTouchCoords(int& X, int& Y) { int dtX, dtY; // TODO: descaling (when scaling is supported) // De-rotate coordinates switch (nds_screen_rotation_angle) { case 0: dtX = X; dtY = Y - 191 - nds_gap_size; break; case 90: dtX = Y; dtY = 191 - X; break; case 180: dtX = 255 - X; dtY = 191 - Y; break; case 270: dtX = 255 - Y; dtY = X - 191 - nds_gap_size; break; } // Atleast one of the coordinates is out of range if ((dtX < 0) || (dtX > 255) || (dtY < 0) || (dtY > 191)) { X = wxClip(dtX, 0, 255); Y = wxClip(dtY, 0, 191); return false; } else { X = dtX; Y = dtY; return true; } } void DesmumeFrame::OnTouchEvent(wxMouseEvent& evt) { wxPoint pt = evt.GetPosition(); bool inside = DetransformTouchCoords(pt.x, pt.y); if (evt.LeftDown() && inside) { Touch = true; NDS_setTouchPos((u16)pt.x, (u16)pt.y); } else if(evt.LeftUp() && Touch) { Touch = false; NDS_releaseTouch(); } else if (Touch) { NDS_setTouchPos((u16)pt.x, (u16)pt.y); } } void DesmumeFrame::gpu_screen_to_rgb(u8 *rgb1, u8 *rgb2) { u16 gpu_pixel; u8 pixel[3]; u8 *rgb = rgb1; const int rot = nds_screen_rotation_angle; int done = false; int offset = 0; loop: for (int i = 0; i < 256; i++) { for (int j = 0; j < 192; j++) { gpu_pixel = *((u16 *) & GPU_screen[(i + (j + offset) * 256) << 1]); pixel[0] = ((gpu_pixel >> 0) & 0x1f) << 3; pixel[1] = ((gpu_pixel >> 5) & 0x1f) << 3; pixel[2] = ((gpu_pixel >> 10) & 0x1f) << 3; switch (rot) { case 0: memcpy(rgb+((i+j*256)*3),pixel,3); break; case 90: memcpy(rgb+SCREEN_SIZE-((j+(255-i)*192)*3)-3,pixel,3); break; case 180: memcpy(rgb+SCREEN_SIZE-((i+j*256)*3)-3,pixel,3); break; case 270: memcpy(rgb+((j+(255-i)*192)*3),pixel,3); break; } } } if (done == false) { offset = 192; rgb = rgb2; done = true; goto loop; } } void DesmumeFrame::onPaint(wxPaintEvent &event) { u8 rgb1[SCREEN_SIZE], rgb2[SCREEN_SIZE]; wxPaintDC dc(this); int w, h; if (nds_screen_rotation_angle == 90 || nds_screen_rotation_angle == 270) { w = 192; h = 256; } else { w = 256; h = 192; } gpu_screen_to_rgb(rgb1, rgb2); wxBitmap m_bitmap1(wxImage(w, h, rgb1, true)); wxBitmap m_bitmap2(wxImage(w, h, rgb2, true)); switch (nds_screen_rotation_angle) { case 0: dc.DrawBitmap(m_bitmap1, 0, 0, true); dc.DrawBitmap(m_bitmap2, 0, 192+nds_gap_size, true); break; case 90: dc.DrawBitmap(m_bitmap2, 0, 0, true); dc.DrawBitmap(m_bitmap1, 192+nds_gap_size, 0, true); break; case 180: dc.DrawBitmap(m_bitmap2, 0, 0, true); dc.DrawBitmap(m_bitmap1, 0, 192+nds_gap_size, true); break; case 270: dc.DrawBitmap(m_bitmap1, 0, 0, true); dc.DrawBitmap(m_bitmap2, 192+nds_gap_size, 0, true); break; } } void DesmumeFrame::onIdle(wxIdleEvent &event) { Refresh(false); event.RequestMore(); if (execute) { applyInput(); NDS_exec(); SPU_Emulate_user(); osd->update(); DrawHUD(); osd->clear(); } } void DesmumeFrame::pause(wxCommandEvent& event) { if (gameInfo.romdata == NULL) return; if (execute) { execute=false; SPU_Pause(1); } else { execute=true; SPU_Pause(0); } } void DesmumeFrame::frameCounter(wxCommandEvent& event) { CommonSettings.hud.FrameCounterDisplay ^= true; osd->clear(); } void DesmumeFrame::FPS(wxCommandEvent& event) { CommonSettings.hud.FpsDisplay ^= true; osd->clear(); } void DesmumeFrame::displayInput(wxCommandEvent& event) { CommonSettings.hud.ShowInputDisplay ^= true; osd->clear(); } void DesmumeFrame::displayGraphicalInput(wxCommandEvent& event) { CommonSettings.hud.ShowGraphicalInputDisplay ^= true; osd->clear(); } void DesmumeFrame::displayLagCounter(wxCommandEvent& event) { CommonSettings.hud.ShowLagFrameCounter ^= true; osd->clear(); } void DesmumeFrame::displayMicrophone(wxCommandEvent& event) { CommonSettings.hud.ShowMicrophone ^= true; osd->clear(); } #ifdef HAVE_LIBAGG void DesmumeFrame::setHUDFont(wxCommandEvent &event) { wxArrayString fontchoices; for(int i = 0; i < font_Nums;i++) { fontchoices.Add(fonts_list[i].name); } wxSingleChoiceDialog fontDialog(this, _T("Please select a font for use on the HUD:\n"), _T("Configure HUD font"), fontchoices); fontDialog.SetSelection(fontchoices.GetCount() - 1); if(fontDialog.ShowModal() == wxID_OK) { aggDraw.hud->setFont(fonts_list[fontDialog.GetSelection()].name); } } #endif void DesmumeFrame::mainG(int n) { if(CommonSettings.dispLayers[0][n]) GPU_remove(MainScreen.gpu, n); else GPU_addBack(MainScreen.gpu, n); } void DesmumeFrame::subG(int n) { if(CommonSettings.dispLayers[1][n]) GPU_remove(SubScreen.gpu, n); else GPU_addBack(SubScreen.gpu, n); } void DesmumeFrame::_3dView(wxCommandEvent& event) { driver->VIEW3D_Init(); driver->view3d->Launch(); } void DesmumeFrame::saveStateAs(wxCommandEvent& event) { wxFileDialog dialog(this,_T("Save State As"),wxGetHomeDir(),_T(""),_T("*.dst"),wxFD_SAVE, wxDefaultPosition, wxDefaultSize); if(dialog.ShowModal() == wxID_OK) savestate_save (dialog.GetPath().mb_str()); } void DesmumeFrame::loadStateFrom(wxCommandEvent& event) { wxFileDialog dialog(this,_T("Load State From"),wxGetHomeDir(),_T(""),_T("*.dst"),wxFD_OPEN, wxDefaultPosition, wxDefaultSize); if(dialog.ShowModal() == wxID_OK) savestate_load (dialog.GetPath().mb_str()); } void DesmumeFrame::closeRom(wxCommandEvent& event) { NDS_FreeROM(); execute = false; SPU_Pause(1); #ifdef HAVE_LIBAGG Hud.resetTransient(); #endif NDS_Reset(); } void DesmumeFrame::importBackupMemory(wxCommandEvent& event) { wxFileDialog dialog(this,_T("Import Backup Memory"),wxGetHomeDir(),_T(""),_T("*.duc, *.sav"),wxFD_OPEN, wxDefaultPosition, wxDefaultSize); if(dialog.ShowModal() == wxID_OK) if (!NDS_ImportSave(dialog.GetPath().mb_str())) wxMessageBox(wxString::Format(_T("Save was not successfully imported")),_T("Error"),wxOK | wxICON_ERROR,this); } void DesmumeFrame::exportBackupMemory(wxCommandEvent& event) { wxFileDialog dialog(this,_T("Export Backup Memory"),wxGetHomeDir(),_T(""),_T("*.duc, *.sav"),wxFD_SAVE, wxDefaultPosition, wxDefaultSize); if(dialog.ShowModal() == wxID_OK) if (!NDS_ExportSave(dialog.GetPath().mb_str())) wxMessageBox(wxString::Format(_T("Save was not successfully exported")),_T("Error"),wxOK | wxICON_ERROR,this); } void DesmumeFrame::saveScreenshotAs(wxCommandEvent& event) { wxFileDialog dialog(this,_T("Save Screenshot As"),wxGetHomeDir(),_T(""),_T("*.png"),wxFD_SAVE, wxDefaultPosition, wxDefaultSize); if(dialog.ShowModal() == wxID_OK) NDS_WritePNG(dialog.GetPath().mb_str()); } void DesmumeFrame::quickScreenshot(wxCommandEvent& event) { NDS_WritePNG(wxStandardPaths::Get().GetExecutablePath().mb_str());//TODO GetExecutablePath is wrong } void DesmumeFrame::OnOpenLuaWindow(wxCommandEvent& WXUNUSED (event)) { #ifdef WIN32 new wxLuaWindow(this, wxDefaultPosition, wxSize(600, 390)); #endif } void DesmumeFrame::OnOpenControllerConfiguration(wxCommandEvent& WXUNUSED (event)) { //#ifndef _MSC_VER // new PADConfigDialogSimple(this); (new wxControlsConfigDialog(this))->ShowModal(); //#endif } void DesmumeFrame::Menu_SaveStates(wxCommandEvent &event){savestate_slot(event.GetId() - wSaveState01);} void DesmumeFrame::Menu_LoadStates(wxCommandEvent &event){loadstate_slot(event.GetId() - wLoadState01);} void DesmumeFrame::OnRotation(wxCommandEvent &event) { ChangeRotation((event.GetId() - wRot0)*90, true); } void DesmumeFrame::ChangeRotation(int rot, bool skip) { wxSize sizeMin, sizeMax; if (skip && rot == nds_screen_rotation_angle) return; SetMinSize(wxSize(-1,-1)); SetMaxSize(wxSize(-1,-1)); if (rot == 90 || rot == 270) { SetClientSize(384 + nds_gap_size, 256); sizeMax = sizeMin = ClientToWindowSize(wxSize(384,256)); sizeMax.IncBy(GAP_MAX,0); } else { SetClientSize(256, 384 + nds_gap_size); sizeMax = sizeMin = ClientToWindowSize(wxSize(256,384)); sizeMax.IncBy(0,GAP_MAX); } SetMinSize(sizeMin); SetMaxSize(sizeMax); nds_screen_rotation_angle = rot; } void DesmumeFrame::onResize(wxSizeEvent &event) { int w, h; GetClientSize(&w,&h); if (nds_screen_rotation_angle == 90 || nds_screen_rotation_angle == 270) { if (w>=384) nds_gap_size = w-384; } else { if (h>=384) nds_gap_size = h-384; } event.Skip(); } #ifdef WIN32 /* * The thread handling functions needed by the GDB stub code. */ void * createThread_gdb( void (APIENTRY *thread_function)( void *data), void *thread_data) { void *new_thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)thread_function, thread_data, 0, NULL); return new_thread; } void joinThread_gdb( void *thread_handle) { } #endif bool DesmumeFrame::LoadSettings() { wxConfigBase::Get()->Read(_T("/Screen/Gap"),&nds_gap_size,0); wxConfigBase::Get()->Read(_T("/Screen/Rotation"),&nds_screen_rotation_angle,0); wxConfigBase::Get()->SetPath(_T("/History")); history->Load(*wxConfigBase::Get()); return true; } bool DesmumeFrame::SaveSettings() { wxConfigBase::Get()->Write(_T("/Screen/Gap"),nds_gap_size); wxConfigBase::Get()->Write(_T("/Screen/Rotation"),nds_screen_rotation_angle); wxConfigBase::Get()->SetPath(_T("/History")); history->Save(*wxConfigBase::Get()); return true; } void DesmumeFrame::OnClose(wxCloseEvent &event) { SaveSettings(); event.Skip(); } void DesmumeFrame::OnOpenRecent(wxCommandEvent &event) { int ret; size_t id = event.GetId()-wxID_FILE1; execute = false; SPU_Pause(1); ret = NDS_LoadROM(history->GetHistoryFile(id).mb_str(), history->GetHistoryFile(id).mb_str()); if (ret > 0) { execute = true; SPU_Pause(0); } else history->RemoveFileFromHistory(id); } void DesmumeFrame::ClearHistory(wxCommandEvent &event) { while (history->GetCount()) { history->RemoveFileFromHistory(0); } } void DesmumeFrame::Modify_AudioDriver(wxCommandEvent &event) { const int selection = event.GetId() - wAUDIODRIVER_SDL; switch (selection) { case AUDIODRIVER_DISABLE: SPU_ChangeSoundCore(0, 0); osd->addLine("Audio disabled"); break; default: case AUDIODRIVER_SDL: SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); osd->addLine("Audio enabled (SDL driver)"); break; } } void DesmumeFrame::Modify_SPUMode(wxCommandEvent &event) { const int selection = event.GetId() - wSPUMODE_DUALASYNC; uint syncMode, syncMethod; switch (selection) { case SPUMODE_SYNCN: case SPUMODE_SYNCZ: #ifdef HAVE_SPUMODE_SYNCP case SPUMODE_SYNCP: #endif syncMode = 1; syncMethod = selection - 1; break; // Default to DualASync mode on invalid selection default: case SPUMODE_DUALASYNC: syncMode = 0; syncMethod = 0; break; } SPU_SetSynchMode(syncMode, syncMethod); } /*************** DesmumeFrame class "loadmenu" functions and the frame ******************/ DesmumeFrame::DesmumeFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title) { history = new wxFileHistory; wxMenuBar *menuBar = new wxMenuBar(); LoadSettings(); SetIcon(wxICON(DeSmuME)); loadmenuBar(menuBar); SetMenuBar(menuBar); ChangeRotation(nds_screen_rotation_angle, false); } void DesmumeFrame::loadfileMenu(wxMenu *fileMenu) { wxMenu *recentMenu = new wxMenu; wxMenu *saves(MakeStatesSubMenu(wSaveState01)); wxMenu *loads(MakeStatesSubMenu(wLoadState01)); fileMenu->Append(wxID_OPEN, _T("Load R&om\tAlt-R")); fileMenu->AppendSubMenu(recentMenu, _T("Recent files")); fileMenu->Append(wCloseRom, _T("Close Rom")); fileMenu->AppendSeparator(); fileMenu->Append(wSaveStateAs, _T("Save State As...")); fileMenu->Append(wLoadStateFrom, _T("Load State From...")); fileMenu->AppendSubMenu(saves, _T("Save State")); fileMenu->AppendSubMenu(loads, _T("Load State")); fileMenu->AppendSeparator(); fileMenu->Append(wImportBackupMemory, _T("Import Backup Memory...")); fileMenu->Append(wExportBackupMemory, _T("Export Backup Memory...")); fileMenu->AppendSeparator(); fileMenu->Append(wSaveScreenshotAs, _T("Save Screenshot As")); fileMenu->Append(wQuickScreenshot, _T("Quick Screenshot")); fileMenu->AppendSeparator(); fileMenu->Append(wPlayMovie, _T("Play Movie")); fileMenu->Append(wRecordMovie, _T("Record Movie")); fileMenu->Append(wStopMovie, _T("Stop Movie")); fileMenu->AppendSeparator(); fileMenu->Append(wLuaWindow, _T("New Lua Script Window...")); fileMenu->AppendSeparator(); fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt-X"), _T("Quit this program")); recentMenu->Append(wClearHistory, wxT("Clear recent list")); history->UseMenu(recentMenu); history->AddFilesToMenu(); } void DesmumeFrame::loademulationMenu(wxMenu *emulationMenu) { wxMenu *audiodriverMenu = new wxMenu; wxMenu *spumodeMenu = new wxMenu; emulationMenu->Append(wPause, _T("&Pause\tAlt-P"), _T("Pause Emulation")); emulationMenu->Append(wReset, _T("&Reset\tAlt-R"), _T("Reset Emulation")); emulationMenu->AppendSeparator(); emulationMenu->AppendSubMenu(audiodriverMenu, _T("&Audio Driver")); audiodriverMenu->AppendRadioItem(wAUDIODRIVER_SDL, _T("&SDL")); audiodriverMenu->AppendRadioItem(wAUDIODRIVER_DISABLE, _T("&Disable Sound")); emulationMenu->AppendSubMenu(spumodeMenu, _T("&SPU Mode")); spumodeMenu->AppendRadioItem(wSPUMODE_DUALASYNC, _T("&Dual Asynchronous")); spumodeMenu->AppendRadioItem(wSPUMODE_SYNCN, _T("Synchronous (&N)")); spumodeMenu->AppendRadioItem(wSPUMODE_SYNCZ, _T("Synchronous (&Z)")); #ifdef HAVE_SPUMODE_SYNCP spumodeMenu->AppendRadioItem(wSPUMODE_SYNCP, _T("Synchronous (&P)")); #endif } void DesmumeFrame::loadrotateMenu(wxMenu *rotateMenu) { rotateMenu->AppendRadioItem(wRot0, _T("0")); rotateMenu->AppendRadioItem(wRot90, _T("90")); rotateMenu->AppendRadioItem(wRot180, _T("180")); rotateMenu->AppendRadioItem(wRot270, _T("270")); rotateMenu->Check(wRot0+(nds_screen_rotation_angle/90), true); } void DesmumeFrame::loadviewMenu(wxMenu *viewMenu) { wxMenu *rotateMenu = new wxMenu; viewMenu->AppendSubMenu(rotateMenu, _T("Rotate")); viewMenu->AppendSeparator(); viewMenu->Append(wSetHUDFont, _T("&Set HUD Font")); viewMenu->AppendCheckItem(wFrameCounter, _T("&Display Frame Counter")); viewMenu->AppendCheckItem(wFPS, _T("&Display FPS")); viewMenu->AppendCheckItem(wDisplayInput, _T("&Display Input")); viewMenu->AppendCheckItem(wDisplayGraphicalInput, _T("&Display Graphical Input")); viewMenu->AppendCheckItem(wDisplayLagCounter, _T("&Display Lag Counter")); viewMenu->AppendCheckItem(wDisplayMicrophone, _T("&Display Microphone")); loadrotateMenu(rotateMenu); } void DesmumeFrame::loadtoolsMenu(wxMenu *toolsMenu) { wxMenu *layersMenu = new wxMenu; toolsMenu->Append(w3dView, _T("&3d Viewer")); toolsMenu->AppendSeparator(); toolsMenu->AppendSubMenu(layersMenu, _T("View Layers")); loadlayersMenu(layersMenu); } void DesmumeFrame::loadlayersMenu(wxMenu *layersMenu) { layersMenu->AppendCheckItem(wMainGPU, _T("Main GPU")); layersMenu->Check(wMainGPU, true); layersMenu->AppendCheckItem(wMainBG0, _T("Main BG 0")); layersMenu->Check(wMainBG0, true); layersMenu->AppendCheckItem(wMainBG1, _T("Main BG 1")); layersMenu->Check(wMainBG1, true); layersMenu->AppendCheckItem(wMainBG2, _T("Main BG 2")); layersMenu->Check(wMainBG2, true); layersMenu->AppendCheckItem(wMainBG3, _T("Main BG 3")); layersMenu->Check(wMainBG3, true); layersMenu->AppendSeparator(); layersMenu->AppendCheckItem(wSubGPU, _T("Sub GPU")); layersMenu->Check(wSubGPU, true); layersMenu->AppendCheckItem(wSubBG0, _T("Sub BG 0")); layersMenu->Check(wSubBG0, true); layersMenu->AppendCheckItem(wSubBG1, _T("Sub BG 1")); layersMenu->Check(wSubBG1, true); layersMenu->AppendCheckItem(wSubBG2, _T("Sub BG 2")); layersMenu->Check(wSubBG2, true); layersMenu->AppendCheckItem(wSubBG3, _T("Sub BG 3")); layersMenu->Check(wSubBG3, true); } void DesmumeFrame::loadconfigMenu(wxMenu *configMenu) { configMenu->Append(wConfigureControls, _T("Controls")); } void DesmumeFrame::loadhelpMenu(wxMenu *helpMenu) { helpMenu->Append(wWebsite, _T("&Website")); helpMenu->Append(wForums, _T("&Forums")); helpMenu->Append(wSubmitABugReport, _T("&Submit A Bug Report")); helpMenu->Append(wxID_ABOUT); } void DesmumeFrame::loadmenuBar(wxMenuBar *menuBar) { wxMenu *fileMenu = new wxMenu; wxMenu *emulationMenu = new wxMenu; wxMenu *viewMenu = new wxMenu; wxMenu *configMenu = new wxMenu; wxMenu *toolsMenu = new wxMenu; wxMenu *helpMenu = new wxMenu; menuBar->Append(fileMenu, _T("&File")); menuBar->Append(emulationMenu, _T("&Emulation")); menuBar->Append(viewMenu, _T("&View")); menuBar->Append(configMenu, _T("&Config")); menuBar->Append(toolsMenu, _T("&Tools")); menuBar->Append(helpMenu, _T("&Help")); loadfileMenu(fileMenu); loademulationMenu(emulationMenu); loadconfigMenu(configMenu); loadtoolsMenu(toolsMenu); loadhelpMenu(helpMenu); loadviewMenu(viewMenu); } /*************** wx Event Table ******************/ BEGIN_EVENT_TABLE(DesmumeFrame, wxFrame) EVT_PAINT(DesmumeFrame::onPaint) EVT_IDLE(DesmumeFrame::onIdle) EVT_SIZE(DesmumeFrame::onResize) EVT_LEFT_DOWN(DesmumeFrame::OnTouchEvent) EVT_LEFT_UP(DesmumeFrame::OnTouchEvent) EVT_LEFT_DCLICK(DesmumeFrame::OnTouchEvent) EVT_MOTION(DesmumeFrame::OnTouchEvent) EVT_CLOSE(DesmumeFrame::OnClose) EVT_MENU(wxID_EXIT, DesmumeFrame::OnQuit) EVT_MENU(wxID_OPEN, DesmumeFrame::LoadRom) EVT_MENU(wxID_ABOUT,DesmumeFrame::OnAbout) EVT_MENU(wPause,DesmumeFrame::pause) EVT_MENU(wReset,DesmumeFrame::reset) EVT_MENU(wClearHistory,DesmumeFrame::ClearHistory) EVT_MENU_RANGE(wAUDIODRIVER_SDL,wAUDIODRIVER_DISABLE,DesmumeFrame::Modify_AudioDriver) EVT_MENU_RANGE(wSPUMODE_DUALASYNC,wSPUMODE_SYNCZ,DesmumeFrame::Modify_SPUMode) #ifdef HAVE_SPUMODE_SYNCP EVT_MENU(wSPUMODE_SYNCP,DesmumeFrame::Modify_SPUMode) #endif EVT_MENU(wFrameCounter,DesmumeFrame::frameCounter) EVT_MENU(wFPS,DesmumeFrame::FPS) EVT_MENU(wDisplayInput,DesmumeFrame::displayInput) EVT_MENU(wDisplayGraphicalInput,DesmumeFrame::displayGraphicalInput) EVT_MENU(wDisplayLagCounter,DesmumeFrame::displayLagCounter) EVT_MENU(wDisplayMicrophone,DesmumeFrame::displayMicrophone) #ifdef HAVE_LIBAGG EVT_MENU(wSetHUDFont,DesmumeFrame::setHUDFont) #endif EVT_MENU(wMainGPU,DesmumeFrame::mainGPU) EVT_MENU(wMainBG0,DesmumeFrame::mainBG0) EVT_MENU(wMainBG1,DesmumeFrame::mainBG1) EVT_MENU(wMainBG2,DesmumeFrame::mainBG2) EVT_MENU(wMainBG3,DesmumeFrame::mainBG3) EVT_MENU(wSubGPU,DesmumeFrame::subGPU) EVT_MENU(wSubBG0,DesmumeFrame::subBG0) EVT_MENU(wSubBG1,DesmumeFrame::subBG1) EVT_MENU(wSubBG2,DesmumeFrame::subBG2) EVT_MENU(wSubBG3,DesmumeFrame::subBG3) EVT_MENU(wWebsite,DesmumeFrame::website) EVT_MENU(wForums,DesmumeFrame::forums) EVT_MENU(wSubmitABugReport,DesmumeFrame::submitABugReport) EVT_MENU(wSaveStateAs,DesmumeFrame::saveStateAs) EVT_MENU(wLoadStateFrom,DesmumeFrame::loadStateFrom) EVT_MENU_RANGE(wSaveState01,wSaveState01+9,DesmumeFrame::Menu_SaveStates) EVT_MENU_RANGE(wLoadState01,wLoadState01+9,DesmumeFrame::Menu_LoadStates) EVT_MENU(wCloseRom,DesmumeFrame::closeRom) EVT_MENU(wImportBackupMemory,DesmumeFrame::importBackupMemory) EVT_MENU(wExportBackupMemory,DesmumeFrame::exportBackupMemory) EVT_MENU_RANGE(wRot0,wRot270,DesmumeFrame::OnRotation) EVT_MENU(wSaveScreenshotAs,DesmumeFrame::saveScreenshotAs) EVT_MENU(wQuickScreenshot,DesmumeFrame::quickScreenshot) EVT_MENU(wPlayMovie,DesmumeFrame::playMovie) EVT_MENU(wStopMovie,DesmumeFrame::stopMovie) EVT_MENU(wRecordMovie,DesmumeFrame::recordMovie) EVT_MENU(w3dView,DesmumeFrame::_3dView) EVT_MENU(wLuaWindow,DesmumeFrame::OnOpenLuaWindow) EVT_MENU(wConfigureControls,DesmumeFrame::OnOpenControllerConfiguration) EVT_MENU_RANGE(wxID_FILE1,wxID_FILE9,DesmumeFrame::OnOpenRecent) END_EVENT_TABLE() IMPLEMENT_APP(Desmume) desmume-0.9.9/src/wx/DeSmuME.xpm0000644000175000017500000000263512140261617017142 0ustar guillaumeguillaume/* XPM */ static const char * DeSmuME_xpm[] = { "32 32 15 1", " c None", ". c #000000", "+ c #F6F6FB", "@ c #ECECF6", "# c #E2E2F1", "$ c #D8D8EC", "% c #CFCFE7", "& c #C5C5E2", "* c #BBBBDE", "= c #B1B1D9", "- c #A8A8D4", "; c #9E9ECF", "> c #9494CA", ", c #8A8AC5", "' c #8080C0", " .................... ", " .................... ", ".....++..+++++..+++++.. ", ".....++..++.....++..... ", "..@@@@@..@@@@@..@@@@@.. ", "..@@.@@..@@........@@.. ", "..##.##..##.##..##.##.. ", "..##.##..##.##..##.##.. ", "..$$.$$..$$.$$..$$.$$.. ", "..$$.$$..$$.$$..$$.$$.. ", "..%%.%%..%%.%%..%%.%%.. ", "..%%.%%..%%.%%..%%.%%.. ", "..&&&&&..&&&&&..&&&&&.. ", "....................... ", ".......********.**.**.. ", " ..==.==.==.==.==.. ", " ..==.==.==.==.==.. ", " ..--.--.--.--.--.. ", " ..--.--.--.--.--.. ", " ..;;.;;.;;.;;;;;.. ", " ..................... ", " ..................... ", " ..>>>>>>>>.>>>>>.. ", " ..>>.>>.>>.>>..... ", " ..,,.,,.,,.,,,,,.. ", " ..,,.,,.,,.,,..... ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.'''''.. ", " .................. ", " .................. "}; desmume-0.9.9/src/wx/LuaWindow.h0000644000175000017500000000431312140261617017232 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #ifndef __LUAWINDOW_H__ #define __LUAWINDOW_H__ #include #include #include #include #include #include #include #include #include #include #include #include class wxLuaWindow : public wxFrame { public: wxLuaWindow(wxFrame* parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); void PrintMessage(const char *text); void OnStop(); virtual ~wxLuaWindow(); protected: static int luaCount; int luaID; bool bScriptRunning; wxString currentScript; // Event Table DECLARE_EVENT_TABLE(); // --- GUI Controls --- wxPanel *m_Tab_Log; wxButton *m_Button_Close, *m_Button_LoadScript, *m_Button_Run, *m_Button_Stop; wxTextCtrl *m_TextCtrl_Log; // GUI IDs enum { ID_TAB_LOG, ID_BUTTON_CLOSE, ID_BUTTON_LOAD, ID_BUTTON_RUN, ID_BUTTON_STOP, ID_TEXTCTRL_LOG }; void InitGUIControls(); // --- Wx Events Handlers --- // $ Window void OnEvent_Window_Resize(wxSizeEvent& event); void OnEvent_Window_Close(wxCloseEvent& event); // $ Buttons void OnEvent_ButtonClose_Press(wxCommandEvent& event); void OnEvent_ScriptLoad_Press(wxCommandEvent& event); void OnEvent_ScriptRun_Press(wxCommandEvent& event); void OnEvent_ScriptStop_Press(wxCommandEvent& event); }; #endif desmume-0.9.9/src/wx/Makefile.in0000644000175000017500000013102212140304540017204 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk bin_PROGRAMS = wxdesmume$(EXEEXT) @HAVE_GDB_STUB_TRUE@am__append_1 = ../gdbstub/libgdbstub.a subdir = src/wx ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" \ "$(DESTDIR)$(pixmapdir)" PROGRAMS = $(bin_PROGRAMS) am_wxdesmume_OBJECTS = sndsdl.$(OBJEXT) driver.$(OBJEXT) \ wxdlg3dViewer.$(OBJEXT) wxcontrolsconfigdialog.$(OBJEXT) \ PadSimple.$(OBJEXT) ConfigDlg.$(OBJEXT) X11InputBase.$(OBJEXT) \ XInput.$(OBJEXT) InputCommon.$(OBJEXT) EventHandler.$(OBJEXT) \ Configuration.$(OBJEXT) SDL.$(OBJEXT) StringUtil.$(OBJEXT) \ wxMain.$(OBJEXT) wxdesmume_OBJECTS = $(am_wxdesmume_OBJECTS) am__DEPENDENCIES_1 = wxdesmume_DEPENDENCIES = ../libdesmume.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(wxdesmume_SOURCES) DIST_SOURCES = $(wxdesmume_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(Applications_DATA) $(pixmap_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src -DHAVE_WX=1 -DHAVE_X11=1 \ $(WX_CPPFLAGS) $(SDL_CFLAGS) $(LIBAGG_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) AM_LDFLAGS = Applicationsdir = $(datadir)/applications Applications_DATA = wxdesmume.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = DeSmuME.xpm EXTRA_DIST = wxdesmume.desktop DeSmuME.xpm wxdesmume_SOURCES = \ ../sndsdl.cpp \ ../driver.h ../driver.cpp \ ../wxdlg/wxdlg3dViewer.h ../wxdlg/wxdlg3dViewer.cpp \ ../wxdlg/wxcontrolsconfigdialog.h ../wxdlg/wxcontrolsconfigdialog.cpp \ PadSimple/pluginspecs_pad.h \ PadSimple/PadSimple.h PadSimple/PadSimple.cpp \ PadSimple/GUI/ConfigDlg.h PadSimple/GUI/ConfigDlg.cpp \ InputCommon/X11InputBase.h InputCommon/X11InputBase.cpp \ InputCommon/XInput.h InputCommon/XInput.cpp \ InputCommon/InputCommon.h InputCommon/InputCommon.cpp \ InputCommon/Event.hpp \ InputCommon/EventHandler.h InputCommon/EventHandler.cpp \ InputCommon/Configuration.cpp \ InputCommon/SDL.h InputCommon/SDL.cpp \ LuaWindow.h \ StringUtil.h StringUtil.cpp \ wxMain.cpp wxdesmume_LDADD = ../libdesmume.a $(SDL_LIBS) $(GTHREAD_LIBS) \ $(GLIB_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) $(WX_LIBS) \ $(LIBSOUNDTOUCH_LIBS) -lX11 $(am__append_1) all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/wx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/wx/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) wxdesmume$(EXEEXT): $(wxdesmume_OBJECTS) $(wxdesmume_DEPENDENCIES) $(EXTRA_wxdesmume_DEPENDENCIES) @rm -f wxdesmume$(EXEEXT) $(CXXLINK) $(wxdesmume_OBJECTS) $(wxdesmume_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConfigDlg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Configuration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EventHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InputCommon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PadSimple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StringUtil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/X11InputBase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XInput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sndsdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxMain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcontrolsconfigdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxdlg3dViewer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` sndsdl.o: ../sndsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sndsdl.o -MD -MP -MF $(DEPDIR)/sndsdl.Tpo -c -o sndsdl.o `test -f '../sndsdl.cpp' || echo '$(srcdir)/'`../sndsdl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/sndsdl.Tpo $(DEPDIR)/sndsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../sndsdl.cpp' object='sndsdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sndsdl.o `test -f '../sndsdl.cpp' || echo '$(srcdir)/'`../sndsdl.cpp sndsdl.obj: ../sndsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sndsdl.obj -MD -MP -MF $(DEPDIR)/sndsdl.Tpo -c -o sndsdl.obj `if test -f '../sndsdl.cpp'; then $(CYGPATH_W) '../sndsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../sndsdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/sndsdl.Tpo $(DEPDIR)/sndsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../sndsdl.cpp' object='sndsdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sndsdl.obj `if test -f '../sndsdl.cpp'; then $(CYGPATH_W) '../sndsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../sndsdl.cpp'; fi` driver.o: ../driver.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT driver.o -MD -MP -MF $(DEPDIR)/driver.Tpo -c -o driver.o `test -f '../driver.cpp' || echo '$(srcdir)/'`../driver.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/driver.Tpo $(DEPDIR)/driver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../driver.cpp' object='driver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o driver.o `test -f '../driver.cpp' || echo '$(srcdir)/'`../driver.cpp driver.obj: ../driver.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT driver.obj -MD -MP -MF $(DEPDIR)/driver.Tpo -c -o driver.obj `if test -f '../driver.cpp'; then $(CYGPATH_W) '../driver.cpp'; else $(CYGPATH_W) '$(srcdir)/../driver.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/driver.Tpo $(DEPDIR)/driver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../driver.cpp' object='driver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o driver.obj `if test -f '../driver.cpp'; then $(CYGPATH_W) '../driver.cpp'; else $(CYGPATH_W) '$(srcdir)/../driver.cpp'; fi` wxdlg3dViewer.o: ../wxdlg/wxdlg3dViewer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT wxdlg3dViewer.o -MD -MP -MF $(DEPDIR)/wxdlg3dViewer.Tpo -c -o wxdlg3dViewer.o `test -f '../wxdlg/wxdlg3dViewer.cpp' || echo '$(srcdir)/'`../wxdlg/wxdlg3dViewer.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/wxdlg3dViewer.Tpo $(DEPDIR)/wxdlg3dViewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../wxdlg/wxdlg3dViewer.cpp' object='wxdlg3dViewer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o wxdlg3dViewer.o `test -f '../wxdlg/wxdlg3dViewer.cpp' || echo '$(srcdir)/'`../wxdlg/wxdlg3dViewer.cpp wxdlg3dViewer.obj: ../wxdlg/wxdlg3dViewer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT wxdlg3dViewer.obj -MD -MP -MF $(DEPDIR)/wxdlg3dViewer.Tpo -c -o wxdlg3dViewer.obj `if test -f '../wxdlg/wxdlg3dViewer.cpp'; then $(CYGPATH_W) '../wxdlg/wxdlg3dViewer.cpp'; else $(CYGPATH_W) '$(srcdir)/../wxdlg/wxdlg3dViewer.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/wxdlg3dViewer.Tpo $(DEPDIR)/wxdlg3dViewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../wxdlg/wxdlg3dViewer.cpp' object='wxdlg3dViewer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o wxdlg3dViewer.obj `if test -f '../wxdlg/wxdlg3dViewer.cpp'; then $(CYGPATH_W) '../wxdlg/wxdlg3dViewer.cpp'; else $(CYGPATH_W) '$(srcdir)/../wxdlg/wxdlg3dViewer.cpp'; fi` wxcontrolsconfigdialog.o: ../wxdlg/wxcontrolsconfigdialog.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT wxcontrolsconfigdialog.o -MD -MP -MF $(DEPDIR)/wxcontrolsconfigdialog.Tpo -c -o wxcontrolsconfigdialog.o `test -f '../wxdlg/wxcontrolsconfigdialog.cpp' || echo '$(srcdir)/'`../wxdlg/wxcontrolsconfigdialog.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/wxcontrolsconfigdialog.Tpo $(DEPDIR)/wxcontrolsconfigdialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../wxdlg/wxcontrolsconfigdialog.cpp' object='wxcontrolsconfigdialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o wxcontrolsconfigdialog.o `test -f '../wxdlg/wxcontrolsconfigdialog.cpp' || echo '$(srcdir)/'`../wxdlg/wxcontrolsconfigdialog.cpp wxcontrolsconfigdialog.obj: ../wxdlg/wxcontrolsconfigdialog.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT wxcontrolsconfigdialog.obj -MD -MP -MF $(DEPDIR)/wxcontrolsconfigdialog.Tpo -c -o wxcontrolsconfigdialog.obj `if test -f '../wxdlg/wxcontrolsconfigdialog.cpp'; then $(CYGPATH_W) '../wxdlg/wxcontrolsconfigdialog.cpp'; else $(CYGPATH_W) '$(srcdir)/../wxdlg/wxcontrolsconfigdialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/wxcontrolsconfigdialog.Tpo $(DEPDIR)/wxcontrolsconfigdialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../wxdlg/wxcontrolsconfigdialog.cpp' object='wxcontrolsconfigdialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o wxcontrolsconfigdialog.obj `if test -f '../wxdlg/wxcontrolsconfigdialog.cpp'; then $(CYGPATH_W) '../wxdlg/wxcontrolsconfigdialog.cpp'; else $(CYGPATH_W) '$(srcdir)/../wxdlg/wxcontrolsconfigdialog.cpp'; fi` PadSimple.o: PadSimple/PadSimple.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PadSimple.o -MD -MP -MF $(DEPDIR)/PadSimple.Tpo -c -o PadSimple.o `test -f 'PadSimple/PadSimple.cpp' || echo '$(srcdir)/'`PadSimple/PadSimple.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PadSimple.Tpo $(DEPDIR)/PadSimple.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PadSimple/PadSimple.cpp' object='PadSimple.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PadSimple.o `test -f 'PadSimple/PadSimple.cpp' || echo '$(srcdir)/'`PadSimple/PadSimple.cpp PadSimple.obj: PadSimple/PadSimple.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PadSimple.obj -MD -MP -MF $(DEPDIR)/PadSimple.Tpo -c -o PadSimple.obj `if test -f 'PadSimple/PadSimple.cpp'; then $(CYGPATH_W) 'PadSimple/PadSimple.cpp'; else $(CYGPATH_W) '$(srcdir)/PadSimple/PadSimple.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PadSimple.Tpo $(DEPDIR)/PadSimple.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PadSimple/PadSimple.cpp' object='PadSimple.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PadSimple.obj `if test -f 'PadSimple/PadSimple.cpp'; then $(CYGPATH_W) 'PadSimple/PadSimple.cpp'; else $(CYGPATH_W) '$(srcdir)/PadSimple/PadSimple.cpp'; fi` ConfigDlg.o: PadSimple/GUI/ConfigDlg.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ConfigDlg.o -MD -MP -MF $(DEPDIR)/ConfigDlg.Tpo -c -o ConfigDlg.o `test -f 'PadSimple/GUI/ConfigDlg.cpp' || echo '$(srcdir)/'`PadSimple/GUI/ConfigDlg.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ConfigDlg.Tpo $(DEPDIR)/ConfigDlg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PadSimple/GUI/ConfigDlg.cpp' object='ConfigDlg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ConfigDlg.o `test -f 'PadSimple/GUI/ConfigDlg.cpp' || echo '$(srcdir)/'`PadSimple/GUI/ConfigDlg.cpp ConfigDlg.obj: PadSimple/GUI/ConfigDlg.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ConfigDlg.obj -MD -MP -MF $(DEPDIR)/ConfigDlg.Tpo -c -o ConfigDlg.obj `if test -f 'PadSimple/GUI/ConfigDlg.cpp'; then $(CYGPATH_W) 'PadSimple/GUI/ConfigDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/PadSimple/GUI/ConfigDlg.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ConfigDlg.Tpo $(DEPDIR)/ConfigDlg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='PadSimple/GUI/ConfigDlg.cpp' object='ConfigDlg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ConfigDlg.obj `if test -f 'PadSimple/GUI/ConfigDlg.cpp'; then $(CYGPATH_W) 'PadSimple/GUI/ConfigDlg.cpp'; else $(CYGPATH_W) '$(srcdir)/PadSimple/GUI/ConfigDlg.cpp'; fi` X11InputBase.o: InputCommon/X11InputBase.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT X11InputBase.o -MD -MP -MF $(DEPDIR)/X11InputBase.Tpo -c -o X11InputBase.o `test -f 'InputCommon/X11InputBase.cpp' || echo '$(srcdir)/'`InputCommon/X11InputBase.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/X11InputBase.Tpo $(DEPDIR)/X11InputBase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/X11InputBase.cpp' object='X11InputBase.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o X11InputBase.o `test -f 'InputCommon/X11InputBase.cpp' || echo '$(srcdir)/'`InputCommon/X11InputBase.cpp X11InputBase.obj: InputCommon/X11InputBase.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT X11InputBase.obj -MD -MP -MF $(DEPDIR)/X11InputBase.Tpo -c -o X11InputBase.obj `if test -f 'InputCommon/X11InputBase.cpp'; then $(CYGPATH_W) 'InputCommon/X11InputBase.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/X11InputBase.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/X11InputBase.Tpo $(DEPDIR)/X11InputBase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/X11InputBase.cpp' object='X11InputBase.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o X11InputBase.obj `if test -f 'InputCommon/X11InputBase.cpp'; then $(CYGPATH_W) 'InputCommon/X11InputBase.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/X11InputBase.cpp'; fi` XInput.o: InputCommon/XInput.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT XInput.o -MD -MP -MF $(DEPDIR)/XInput.Tpo -c -o XInput.o `test -f 'InputCommon/XInput.cpp' || echo '$(srcdir)/'`InputCommon/XInput.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/XInput.Tpo $(DEPDIR)/XInput.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/XInput.cpp' object='XInput.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o XInput.o `test -f 'InputCommon/XInput.cpp' || echo '$(srcdir)/'`InputCommon/XInput.cpp XInput.obj: InputCommon/XInput.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT XInput.obj -MD -MP -MF $(DEPDIR)/XInput.Tpo -c -o XInput.obj `if test -f 'InputCommon/XInput.cpp'; then $(CYGPATH_W) 'InputCommon/XInput.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/XInput.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/XInput.Tpo $(DEPDIR)/XInput.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/XInput.cpp' object='XInput.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o XInput.obj `if test -f 'InputCommon/XInput.cpp'; then $(CYGPATH_W) 'InputCommon/XInput.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/XInput.cpp'; fi` InputCommon.o: InputCommon/InputCommon.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT InputCommon.o -MD -MP -MF $(DEPDIR)/InputCommon.Tpo -c -o InputCommon.o `test -f 'InputCommon/InputCommon.cpp' || echo '$(srcdir)/'`InputCommon/InputCommon.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/InputCommon.Tpo $(DEPDIR)/InputCommon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/InputCommon.cpp' object='InputCommon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o InputCommon.o `test -f 'InputCommon/InputCommon.cpp' || echo '$(srcdir)/'`InputCommon/InputCommon.cpp InputCommon.obj: InputCommon/InputCommon.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT InputCommon.obj -MD -MP -MF $(DEPDIR)/InputCommon.Tpo -c -o InputCommon.obj `if test -f 'InputCommon/InputCommon.cpp'; then $(CYGPATH_W) 'InputCommon/InputCommon.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/InputCommon.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/InputCommon.Tpo $(DEPDIR)/InputCommon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/InputCommon.cpp' object='InputCommon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o InputCommon.obj `if test -f 'InputCommon/InputCommon.cpp'; then $(CYGPATH_W) 'InputCommon/InputCommon.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/InputCommon.cpp'; fi` EventHandler.o: InputCommon/EventHandler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT EventHandler.o -MD -MP -MF $(DEPDIR)/EventHandler.Tpo -c -o EventHandler.o `test -f 'InputCommon/EventHandler.cpp' || echo '$(srcdir)/'`InputCommon/EventHandler.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/EventHandler.Tpo $(DEPDIR)/EventHandler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/EventHandler.cpp' object='EventHandler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o EventHandler.o `test -f 'InputCommon/EventHandler.cpp' || echo '$(srcdir)/'`InputCommon/EventHandler.cpp EventHandler.obj: InputCommon/EventHandler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT EventHandler.obj -MD -MP -MF $(DEPDIR)/EventHandler.Tpo -c -o EventHandler.obj `if test -f 'InputCommon/EventHandler.cpp'; then $(CYGPATH_W) 'InputCommon/EventHandler.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/EventHandler.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/EventHandler.Tpo $(DEPDIR)/EventHandler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/EventHandler.cpp' object='EventHandler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o EventHandler.obj `if test -f 'InputCommon/EventHandler.cpp'; then $(CYGPATH_W) 'InputCommon/EventHandler.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/EventHandler.cpp'; fi` Configuration.o: InputCommon/Configuration.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Configuration.o -MD -MP -MF $(DEPDIR)/Configuration.Tpo -c -o Configuration.o `test -f 'InputCommon/Configuration.cpp' || echo '$(srcdir)/'`InputCommon/Configuration.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/Configuration.Tpo $(DEPDIR)/Configuration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/Configuration.cpp' object='Configuration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Configuration.o `test -f 'InputCommon/Configuration.cpp' || echo '$(srcdir)/'`InputCommon/Configuration.cpp Configuration.obj: InputCommon/Configuration.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Configuration.obj -MD -MP -MF $(DEPDIR)/Configuration.Tpo -c -o Configuration.obj `if test -f 'InputCommon/Configuration.cpp'; then $(CYGPATH_W) 'InputCommon/Configuration.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/Configuration.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/Configuration.Tpo $(DEPDIR)/Configuration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/Configuration.cpp' object='Configuration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Configuration.obj `if test -f 'InputCommon/Configuration.cpp'; then $(CYGPATH_W) 'InputCommon/Configuration.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/Configuration.cpp'; fi` SDL.o: InputCommon/SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SDL.o -MD -MP -MF $(DEPDIR)/SDL.Tpo -c -o SDL.o `test -f 'InputCommon/SDL.cpp' || echo '$(srcdir)/'`InputCommon/SDL.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SDL.Tpo $(DEPDIR)/SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/SDL.cpp' object='SDL.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SDL.o `test -f 'InputCommon/SDL.cpp' || echo '$(srcdir)/'`InputCommon/SDL.cpp SDL.obj: InputCommon/SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SDL.obj -MD -MP -MF $(DEPDIR)/SDL.Tpo -c -o SDL.obj `if test -f 'InputCommon/SDL.cpp'; then $(CYGPATH_W) 'InputCommon/SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/SDL.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SDL.Tpo $(DEPDIR)/SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InputCommon/SDL.cpp' object='SDL.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SDL.obj `if test -f 'InputCommon/SDL.cpp'; then $(CYGPATH_W) 'InputCommon/SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/InputCommon/SDL.cpp'; fi` install-ApplicationsDATA: $(Applications_DATA) @$(NORMAL_INSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(Applicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(Applicationsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(Applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(Applicationsdir)" || exit $$?; \ done uninstall-ApplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(Applicationsdir)'; $(am__uninstall_files_from_dir) install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \ done uninstall-pixmapDATA: @$(NORMAL_UNINSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" "$(DESTDIR)$(pixmapdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-ApplicationsDATA install-pixmapDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-ApplicationsDATA uninstall-binPROGRAMS \ uninstall-pixmapDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-ApplicationsDATA \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-pixmapDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-ApplicationsDATA uninstall-am uninstall-binPROGRAMS \ uninstall-pixmapDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/wx/StringUtil.cpp0000644000175000017500000002625512140261617017771 0ustar guillaumeguillaume// Copyright (C) 2003 Dolphin Project. // 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, version 2.0. // 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 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include #include #include #include "StringUtil.h" // faster than sscanf bool AsciiToHex(const char* _szValue, u32& result) { u32 value = 0; size_t finish = strlen(_szValue); if (finish > 8) finish = 8; // Max 32-bit values are supported. for (size_t count = 0; count < finish; count++) { value <<= 4; switch (_szValue[count]) { case '0': break; case '1': value += 1; break; case '2': value += 2; break; case '3': value += 3; break; case '4': value += 4; break; case '5': value += 5; break; case '6': value += 6; break; case '7': value += 7; break; case '8': value += 8; break; case '9': value += 9; break; case 'A': case 'a': value += 10; break; case 'B': case 'b': value += 11; break; case 'C': case 'c': value += 12; break; case 'D': case 'd': value += 13; break; case 'E': case 'e': value += 14; break; case 'F': case 'f': value += 15; break; default: return false; break; } } result = value; return (true); } // Convert AB to it's ascii table entry numbers 0x4142 u32 Ascii2Hex(std::string _Text) { // Reset the return value zero u32 Result = 0; // Max 32-bit values are supported size_t Length = _Text.length(); if (Length > 4) Length = 4; for (int i = 0; i < (int)Length; i++) { // Add up the values, for example RSPE becomes, 0x52000000, then 0x52530000 and so on Result += _Text.c_str()[i] << ((Length - 1 - i) * 8); } // Return the value return Result; } // Convert it back again std::string Hex2Ascii(u32 _Text) { // Create temporary storate char Result[5]; // need space for the final \0 // Go through the four characters sprintf(Result, "%c%c%c%c", _Text >> 24, _Text >> 16, _Text >> 8, _Text); // Return the string std::string StrResult = Result; return StrResult; } bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list args) { int writtenCount = vsnprintf(out, outsize, format, args); if (writtenCount > 0 && writtenCount < outsize) { out[writtenCount] = '\0'; return true; } else { out[outsize - 1] = '\0'; return false; } } // Expensive! void ToStringFromFormat(std::string* out, const char* format, ...) { int writtenCount = -1; int newSize = (int)strlen(format) + 4; char *buf = 0; va_list args; while (writtenCount < 0) { delete [] buf; buf = new char[newSize + 1]; va_start(args, format); writtenCount = vsnprintf(buf, newSize, format, args); va_end(args); if (writtenCount >= (int)newSize) { writtenCount = -1; } // ARGH! vsnprintf does no longer return -1 on truncation in newer libc! // WORKAROUND! let's fake the old behaviour (even though it's less efficient). // TODO: figure out why the fix causes an invalid read in strlen called from vsnprintf :( // if (writtenCount >= (int)newSize) // writtenCount = -1; newSize *= 2; } buf[writtenCount] = '\0'; *out = buf; delete[] buf; } std::string StringFromFormat(const char* format, ...) { int writtenCount = -1; int newSize = (int)strlen(format) + 4; char *buf = 0; va_list args; while (writtenCount < 0) { delete [] buf; buf = new char[newSize + 1]; va_start(args, format); writtenCount = vsnprintf(buf, newSize, format, args); va_end(args); if (writtenCount >= (int)newSize) { writtenCount = -1; } // ARGH! vsnprintf does no longer return -1 on truncation in newer libc! // WORKAROUND! let's fake the old behaviour (even though it's less efficient). // TODO: figure out why the fix causes an invalid read in strlen called from vsnprintf :( // if (writtenCount >= (int)newSize) // writtenCount = -1; newSize *= 2; } buf[writtenCount] = '\0'; std::string temp = buf; delete[] buf; return temp; } // For Debugging. Read out an u8 array. std::string ArrayToString(const u8 *data, u32 size, u32 offset, int line_len, bool Spaces) { std::string Tmp, Spc; if (Spaces) Spc = " "; else Spc = ""; for (u32 i = 0; i < size; i++) { Tmp += StringFromFormat("%02x%s", data[i + offset], Spc.c_str()); if(i > 1 && (i + 1) % line_len == 0) Tmp.append("\n"); // break long lines } return Tmp; } // Turns " hej " into "hej". Also handles tabs. std::string StripSpaces(const std::string &str) { std::string s = str; int i; for (i = 0; i < (int)s.size(); i++) { if ((s[i] != ' ') && (s[i] != 9)) { break; } } s = s.substr(i); for (i = (int)s.size() - 1; i > 0; i--) { if ((s[i] != ' ') && (s[i] != 9)) { break; } } return s.substr(0, i + 1); } // "\"hello\"" is turned to "hello" // This one assumes that the string has already been space stripped in both // ends, as done by StripSpaces above, for example. std::string StripQuotes(const std::string& s) { if ((s[0] == '\"') && (s[s.size() - 1] == '\"')) return s.substr(1, s.size() - 2); else return s; } // "\"hello\"" is turned to "hello" // This one assumes that the string has already been space stripped in both // ends, as done by StripSpaces above, for example. std::string StripNewline(const std::string& s) { if (!s.size()) return s; else if (s[s.size() - 1] == '\n') return s.substr(0, s.size() - 1); else return s; } bool TryParseInt(const char* str, int* outVal) { const char* s = str; int value = 0; bool negativ = false; if (*s == '-') { negativ = true; s++; } while (*s) { char c = *s++; if ((c < '0') || (c > '9')) { return false; } value = value * 10 + (c - '0'); } if (negativ) value = -value; *outVal = value; return true; } bool TryParseBool(const char* str, bool* output) { if ((str[0] == '1') || !strcmp(str, "true") || !strcmp(str, "True") || !strcmp(str, "TRUE")) { *output = true; return true; } else if (str[0] == '0' || !strcmp(str, "false") || !strcmp(str, "False") || !strcmp(str, "FALSE")) { *output = false; return true; } return false; } std::string StringFromInt(int value) { char temp[16]; sprintf(temp, "%i", value); return std::string(temp); } std::string StringFromBool(bool value) { return value ? "True" : "False"; } #ifdef _WIN32 bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension) { char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; if (_splitpath_s(full_path.c_str(), drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT) == 0) { if (_pPath) { *_pPath = std::string(drive) + std::string(dir); } if (_pFilename != 0) { *_pFilename = fname; } if (_pExtension != 0) { *_pExtension = ext; } return true; } return false; } #else bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension) { size_t last_slash = full_path.rfind('/'); if (last_slash == std::string::npos) { return false; // FIXME return the filename } size_t last_dot = full_path.rfind('.'); if ((last_dot == std::string::npos) || (last_dot < last_slash)) { return false; // FIXME why missing . is critical? } if (_pPath) { *_pPath = full_path.substr(0, last_slash + 1); } if (_pFilename) { *_pFilename = full_path.substr(last_slash + 1, last_dot - (last_slash + 1)); } if (_pExtension) { *_pExtension = full_path.substr(last_dot + 1); _pExtension->insert(0, "."); } else if (_pFilename) { *_pFilename += full_path.substr(last_dot); } return true; } #endif #define DIR_SEP "/" #define DIR_SEP_CHR '/' void BuildCompleteFilename(std::string& _CompleteFilename, const std::string& _Path, const std::string& _Filename) { _CompleteFilename = _Path; // check for seperator if (_CompleteFilename[_CompleteFilename.size() - 1] != DIR_SEP_CHR) { #ifdef _WIN32 if (_CompleteFilename[_CompleteFilename.size() - 1] != '\\') #endif _CompleteFilename += DIR_SEP_CHR; } // add the filename _CompleteFilename += _Filename; } void SplitString(const std::string& str, const std::string& delim, std::vector& output) { output.clear(); size_t offset = 0; size_t delimIndex = 0; delimIndex = str.find(delim, offset); while (delimIndex != std::string::npos) { output.push_back(str.substr(offset, delimIndex - offset)); offset += delimIndex - offset + delim.length(); delimIndex = str.find(delim, offset); } output.push_back(str.substr(offset)); } bool TryParseUInt(const std::string& str, u32* output) { if (!strcmp(str.substr(0, 2).c_str(), "0x") || !strcmp(str.substr(0, 2).c_str(), "0X")) return sscanf(str.c_str() + 2, "%x", output) > 0; else return sscanf(str.c_str(), "%d", output) > 0; } int ChooseStringFrom(const char* str, const char* * items) { int i = 0; while (items[i] != 0) { if (!strcmp(str, items[i])) return i; i++; } return -1; } // Thousand separator. Turns 12345678 into 12,345,678 std::string ThS(int Integer, bool Unsigned, int Spaces) { // Create storage space char cbuf[20]; // Determine treatment of signed or unsigned if(Unsigned) sprintf(cbuf, "%u", Integer); else sprintf(cbuf, "%i", Integer); std::string Sbuf = cbuf; for (u32 i = 0; i < Sbuf.length(); ++i) { if((i & 3) == 3) { Sbuf.insert(Sbuf.length() - i, ","); } } // Spaces std::string Spc = ""; for (int i = 0; i < (int)(Spaces - Sbuf.length()); i++) Spc += " "; return Spc + Sbuf; } void NormalizeDirSep(std::string* str) { #ifdef _WIN32 int i; while ((i = (int)str->find_first_of('\\')) >= 0) { str->replace(i, 1, DIR_SEP); } #endif } std::string TabsToSpaces(int tab_size, const std::string &in) { std::string out; int len = 0; // First, compute the size of the new string. for (unsigned i = 0; i < in.size(); i++) { if (in[i] == '\t') len += tab_size; else len += 1; } out.resize(len); int out_ctr = 0; for (unsigned i = 0; i < in.size(); i++) { if (in[i] == '\t') { for (int j = 0; j < tab_size; j++) out[out_ctr++] = ' '; } else { out[out_ctr++] = in[i]; } } return out; } std::string PathToFilename(std::string Path) { std::string Name, Ending; SplitPath(Path, 0, &Name, &Ending); return Name + Ending; } desmume-0.9.9/src/cp15.h0000644000175000017500000001062112140261633015430 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef __CP15_H__ #define __CP15_H__ #include "armcpu.h" #include "emufile.h" #define CP15_ACCESS_WRITE 0 #define CP15_ACCESS_READ 2 #define CP15_ACCESS_EXECUTE 4 #define CP15_ACCESS_WRITEUSR CP15_ACCESS_WRITE #define CP15_ACCESS_WRITESYS 1 #define CP15_ACCESS_READUSR CP15_ACCESS_READ #define CP15_ACCESS_READSYS 3 #define CP15_ACCESS_EXECUSR CP15_ACCESS_EXECUTE #define CP15_ACCESS_EXECSYS 5 struct armcp15_t { public: u32 IDCode; u32 cacheType; u32 TCMSize; u32 ctrl; u32 DCConfig; u32 ICConfig; u32 writeBuffCtrl; u32 und; u32 DaccessPerm; u32 IaccessPerm; u32 protectBaseSize0; u32 protectBaseSize1; u32 protectBaseSize2; u32 protectBaseSize3; u32 protectBaseSize4; u32 protectBaseSize5; u32 protectBaseSize6; u32 protectBaseSize7; u32 cacheOp; u32 DcacheLock; u32 IcacheLock; u32 ITCMRegion; u32 DTCMRegion; u32 processID; u32 RAM_TAG; u32 testState; u32 cacheDbg; /* calculated bitmasks for the regions to decide rights uppon */ /* calculation is done in the MCR instead of on mem access for performance */ u32 regionWriteMask_USR[8] ; u32 regionWriteMask_SYS[8] ; u32 regionReadMask_USR[8] ; u32 regionReadMask_SYS[8] ; u32 regionExecuteMask_USR[8] ; u32 regionExecuteMask_SYS[8] ; u32 regionWriteSet_USR[8] ; u32 regionWriteSet_SYS[8] ; u32 regionReadSet_USR[8] ; u32 regionReadSet_SYS[8] ; u32 regionExecuteSet_USR[8] ; u32 regionExecuteSet_SYS[8] ; armcpu_t *cpu; void setSingleRegionAccess(u32 dAccess,u32 iAccess,unsigned char num, u32 mask,u32 set); void maskPrecalc(); public: armcp15_t() : IDCode(0), cacheType(0), TCMSize(0), ctrl(0), DCConfig(0), ICConfig(0), writeBuffCtrl(0), und(0), DaccessPerm(0), IaccessPerm(0), protectBaseSize0(0), protectBaseSize1(0), protectBaseSize2(0), protectBaseSize3(0), protectBaseSize4(0), protectBaseSize5(0), protectBaseSize6(0), protectBaseSize7(0), cacheOp(0), DcacheLock(0), IcacheLock(0), ITCMRegion(0), DTCMRegion(0), processID(0), RAM_TAG(0), testState(0), cacheDbg(0), cpu(NULL) { memset(®ionWriteMask_USR[0], 0, sizeof(regionWriteMask_USR)); memset(®ionWriteMask_SYS[0], 0, sizeof(regionWriteMask_SYS)); memset(®ionReadMask_USR[0], 0, sizeof(regionReadMask_USR)); memset(®ionReadMask_SYS[0], 0, sizeof(regionReadMask_SYS)); memset(®ionExecuteMask_USR[0], 0, sizeof(regionExecuteMask_USR)); memset(®ionExecuteMask_SYS[0], 0, sizeof(regionExecuteMask_SYS)); memset(®ionWriteSet_USR[0], 0, sizeof(regionWriteSet_USR)); memset(®ionWriteSet_SYS[0], 0, sizeof(regionWriteSet_SYS)); memset(®ionReadSet_USR[0], 0, sizeof(regionReadSet_USR)); memset(®ionReadSet_SYS[0], 0, sizeof(regionReadSet_SYS)); memset(®ionExecuteSet_USR[0], 0, sizeof(regionExecuteSet_USR)); memset(®ionExecuteSet_SYS[0], 0, sizeof(regionExecuteSet_SYS)); } bool reset(armcpu_t * c); BOOL dataProcess(u8 CRd, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2); BOOL load(u8 CRd, u8 adr); BOOL store(u8 CRd, u8 adr); BOOL moveCP2ARM(u32 * R, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2); BOOL moveARM2CP(u32 val, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2); BOOL isAccessAllowed(u32 address,u32 access); // savestate void saveone(EMUFILE* os); bool loadone(EMUFILE* is); }; extern armcp15_t cp15; void maskPrecalc(); #endif /* __CP15_H__*/ desmume-0.9.9/src/arm_jit.h0000644000175000017500000000502112140261633016303 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2011 Loren Merritt Copyright (C) 2012 DeSmuME team This file 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 3 of the License, or (at your option) any later version. This file 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 the this software. If not, see . */ #ifndef ARM_JIT #define ARM_JIT #include "types.h" #ifndef _MSC_VER #include #endif typedef u32 (FASTCALL* ArmOpCompiled)(); void arm_jit_reset(bool enable); void arm_jit_close(); void arm_jit_sync(); template u32 arm_jit_compile(); #if defined(_WINDOWS) || defined(DESMUME_COCOA) #define MAPPED_JIT_FUNCS #endif #ifdef MAPPED_JIT_FUNCS struct JIT_struct { // only include the memory types that code can execute from uintptr_t MAIN_MEM[16*1024*1024/2]; uintptr_t SWIRAM[0x8000/2]; uintptr_t ARM9_ITCM[0x8000/2]; uintptr_t ARM9_LCDC[0xA4000/2]; uintptr_t ARM9_BIOS[0x8000/2]; uintptr_t ARM7_BIOS[0x4000/2]; uintptr_t ARM7_ERAM[0x10000/2]; uintptr_t ARM7_WIRAM[0x10000/2]; uintptr_t ARM7_WRAM[0x40000/2]; static uintptr_t *JIT_MEM[2][0x4000]; }; extern CACHE_ALIGN JIT_struct JIT; #define JIT_COMPILED_FUNC(adr, PROCNUM) JIT.JIT_MEM[PROCNUM][((adr)&0x0FFFC000)>>14][((adr)&0x00003FFE)>>1] #define JIT_COMPILED_FUNC_PREMASKED(adr, PROCNUM, ofs) JIT.JIT_MEM[PROCNUM][(adr)>>14][(((adr)&0x00003FFE)>>1)+ofs] #define JIT_COMPILED_FUNC_KNOWNBANK(adr, bank, mask, ofs) JIT.bank[(((adr)&(mask))>>1)+ofs] #define JIT_MAPPED(adr, PROCNUM) JIT.JIT_MEM[PROCNUM][(adr)>>14] #else // actually an array of function pointers, but they fit in 32bit address space, so might as well save memory extern uintptr_t compiled_funcs[]; // there isn't anything mapped between 07000000 and 0EFFFFFF, so we can mask off bit 27 and get away with a smaller array #define JIT_COMPILED_FUNC(adr, PROCNUM) compiled_funcs[((adr) & 0x07FFFFFE) >> 1] #define JIT_COMPILED_FUNC_PREMASKED(adr, PROCNUM, ofs) JIT_COMPILED_FUNC(adr, PROCNUM) #define JIT_COMPILED_FUNC_KNOWNBANK(adr, bank, mask, ofs) JIT_COMPILED_FUNC(adr, PROCNUM) #define JIT_MAPPED(adr, PROCNUM) true #endif #endif desmume-0.9.9/src/GPU_osd_stub.cpp0000644000175000017500000000170412140261633017552 0ustar guillaumeguillaume/* Copyright (C) 2010 DeSmumE team This file 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 file 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 the this software. If not, see . */ #include "types.h" #include "GPU_osd.h" OSDCLASS *osd; OSDCLASS::OSDCLASS(u8 core) {} OSDCLASS::~OSDCLASS() {} void OSDCLASS::update() {} void OSDCLASS::clear() {} void OSDCLASS::setLineColor(u8 r, u8 b, u8 g) {} void OSDCLASS::addLine(const char *fmt, ...) {} void DrawHUD() {} desmume-0.9.9/src/version.h0000644000175000017500000000157512140261633016355 0ustar guillaumeguillaume/* Copyright (C) 2009-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include "types.h" u32 EMU_DESMUME_VERSION_NUMERIC(); const char* EMU_DESMUME_VERSION_STRING(); const char* EMU_DESMUME_NAME_AND_VERSION(); const char* EMU_DESMUME_COMPILER_DETAIL(); desmume-0.9.9/src/OGLRender.h0000644000175000017500000006140712140261633016451 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef OGLRENDER_H #define OGLRENDER_H #include #include #include #include "render3D.h" #include "types.h" #ifndef OGLRENDER_3_2_H #if defined(_WIN32) && !defined(WXPORT) #define WIN32_LEAN_AND_MEAN #include #include #include #define OGLEXT(procPtr, func) procPtr func = NULL; #define INITOGLEXT(procPtr, func) func = (procPtr)wglGetProcAddress(#func); #define EXTERNOGLEXT(procPtr, func) extern procPtr func; #elif defined(__APPLE__) #include #include // Ignore dynamic linking on Apple OS #define OGLEXT(procPtr, func) #define INITOGLEXT(procPtr, func) #define EXTERNOGLEXT(procPtr, func) // We're not exactly committing to OpenGL 3.2 Core Profile just yet, so redefine APPLE // extensions as a temporary measure. #if defined(GL_APPLE_vertex_array_object) && !defined(GL_ARB_vertex_array_object) #define glGenVertexArrays(n, ids) glGenVertexArraysAPPLE(n, ids) #define glBindVertexArray(id) glBindVertexArrayAPPLE(id) #define glDeleteVertexArrays(n, ids) glDeleteVertexArraysAPPLE(n, ids) #endif #else #include #include #include /* This is a workaround needed to compile against nvidia GL headers */ #ifndef GL_ALPHA_BLEND_EQUATION_ATI #undef GL_VERSION_1_3 #endif #define OGLEXT(procPtr, func) procPtr func = NULL; #define INITOGLEXT(procPtr, func) func = (procPtr)glXGetProcAddress((const GLubyte *) #func); #define EXTERNOGLEXT(procPtr, func) extern procPtr func; #endif // Check minimum OpenGL header version #if !defined(GL_VERSION_2_1) #if defined(GL_VERSION_2_0) #warning Using OpenGL v2.0 headers with v2.1 overrides. Some features will be disabled. #if !defined(GL_ARB_framebuffer_object) // Overrides for GL_EXT_framebuffer_blit #if !defined(GL_EXT_framebuffer_blit) #define GL_READ_FRAMEBUFFER_EXT GL_FRAMEBUFFER_EXT #define GL_DRAW_FRAMEBUFFER_EXT GL_FRAMEBUFFER_EXT #define glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter) #endif // Overrides for GL_EXT_framebuffer_multisample #if !defined(GL_EXT_framebuffer_multisample) #define GL_MAX_SAMPLES_EXT 0 #define glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height) #endif // Overrides for GL_ARB_pixel_buffer_object #if !defined(GL_PIXEL_PACK_BUFFER) && defined(GL_PIXEL_PACK_BUFFER_ARB) #define GL_PIXEL_PACK_BUFFER GL_PIXEL_PACK_BUFFER_ARB #endif #endif #else #error OpenGL requires v2.1 headers or later. #endif #endif // Textures #if !defined(GLX_H) EXTERNOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3 EXTERNOGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB) #endif // Blending EXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4 EXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0 EXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT) EXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT) // Shaders EXTERNOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0 EXTERNOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0 EXTERNOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0 EXTERNOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0 EXTERNOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0 EXTERNOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0 EXTERNOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0 EXTERNOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0 EXTERNOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0 EXTERNOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0 EXTERNOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0 EXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 // Generic vertex attributes EXTERNOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0 EXTERNOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0 EXTERNOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0 EXTERNOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0 // VAO EXTERNOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) EXTERNOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) EXTERNOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // VBO and PBO EXTERNOGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB) EXTERNOGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB) EXTERNOGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB) EXTERNOGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB) EXTERNOGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB) EXTERNOGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB) EXTERNOGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB) EXTERNOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5 EXTERNOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5 EXTERNOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5 EXTERNOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5 EXTERNOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5 EXTERNOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5 EXTERNOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5 // FBO EXTERNOGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT) EXTERNOGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT) EXTERNOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT) EXTERNOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT) EXTERNOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT) EXTERNOGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT) EXTERNOGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT) // Multisampled FBO EXTERNOGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT) EXTERNOGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT) EXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT) EXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT) EXTERNOGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT) #else // OGLRENDER_3_2_H // Basic Functions EXTERNOGLEXT(PFNGLGETSTRINGIPROC, glGetStringi) // Core in v3.0 // Textures #if !defined(GLX_H) EXTERNOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3 #endif // Blending EXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4 EXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0 // Shaders EXTERNOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0 EXTERNOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0 EXTERNOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0 EXTERNOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0 EXTERNOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0 EXTERNOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0 EXTERNOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0 EXTERNOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0 EXTERNOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0 EXTERNOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0 EXTERNOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0 EXTERNOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0 EXTERNOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0 EXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 // Generic vertex attributes EXTERNOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0 EXTERNOGLEXT(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation) // Core in v3.0 EXTERNOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0 EXTERNOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0 EXTERNOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0 // VAO EXTERNOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) // Core in v3.0 EXTERNOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) // Core in v3.0 EXTERNOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // Core in v3.0 // VBO and PBO EXTERNOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5 EXTERNOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5 EXTERNOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5 EXTERNOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5 EXTERNOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5 EXTERNOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5 EXTERNOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5 // FBO EXTERNOGLEXT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) // Core in v3.0 EXTERNOGLEXT(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) // Core in v3.0 EXTERNOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer) // Core in v3.0 EXTERNOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) // Core in v3.0 EXTERNOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus) // Core in v3.0 EXTERNOGLEXT(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) // Core in v3.0 EXTERNOGLEXT(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer) // Core in v3.0 EXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 // Multisampled FBO EXTERNOGLEXT(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers) // Core in v3.0 EXTERNOGLEXT(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer) // Core in v3.0 EXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage) // Core in v3.0 EXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample) // Core in v3.0 EXTERNOGLEXT(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers) // Core in v3.0 #endif // OGLRENDER_3_2_H // Define the minimum required OpenGL version for the driver to support #define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR 1 #define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR 2 #define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION 0 #define OGLRENDER_MAX_MULTISAMPLES 16 #define OGLRENDER_VERT_INDEX_BUFFER_COUNT 131072 enum OGLVertexAttributeID { OGLVertexAttributeID_Position = 0, OGLVertexAttributeID_TexCoord0 = 8, OGLVertexAttributeID_Color = 3, }; enum OGLTextureUnitID { // Main textures will always be on texture unit 0. OGLTextureUnitID_ToonTable = 1, OGLTextureUnitID_ClearImage }; enum OGLErrorCode { OGLERROR_NOERR = RENDER3DERROR_NOERR, OGLERROR_FEATURE_UNSUPPORTED, OGLERROR_VBO_UNSUPPORTED, OGLERROR_PBO_UNSUPPORTED, OGLERROR_SHADER_UNSUPPORTED, OGLERROR_VAO_UNSUPPORTED, OGLERROR_FBO_UNSUPPORTED, OGLERROR_MULTISAMPLED_FBO_UNSUPPORTED, OGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR, OGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR, OGLERROR_SHADER_CREATE_ERROR, OGLERROR_FBO_CREATE_ERROR }; struct OGLRenderRef { // OpenGL Feature Support GLint stateTexMirroredRepeat; // VBO GLuint vboVertexID; GLuint iboIndexID; // PBO GLuint pboRenderDataID[2]; // FBO GLuint texClearImageColorID; GLuint texClearImageDepthStencilID; GLuint fboClearImageID; GLuint rboFinalOutputColorID; GLuint rboFinalOutputDepthStencilID; GLuint fboFinalOutputID; // Multisampled FBO GLuint rboMultisampleColorID; GLuint rboMultisampleDepthStencilID; GLuint fboMultisampleRenderID; GLuint selectedRenderingFBO; // Shader states GLuint vertexShaderID; GLuint fragmentShaderID; GLuint shaderProgram; GLint uniformPolyID; GLint uniformPolyAlpha; GLint uniformTexScale; GLint uniformHasTexture; GLint uniformPolygonMode; GLint uniformToonShadingMode; GLint uniformWBuffer; GLint uniformEnableAlphaTest; GLint uniformAlphaTestRef; GLuint texToonTableID; // VAO GLuint vaoMainStatesID; // Textures std::queue freeTextureIDs; // Client-side Buffers GLfloat *color4fBuffer; DS_ALIGN(16) GLushort vertIndexBuffer[OGLRENDER_VERT_INDEX_BUFFER_COUNT]; }; struct GFX3D_State; struct VERTLIST; struct POLYLIST; struct INDEXLIST; struct POLY; class TexCacheItem; class OpenGLRenderer; extern GPU3DInterface gpu3Dgl; extern GPU3DInterface gpu3DglOld; extern GPU3DInterface gpu3Dgl_3_2; //This is called by OGLRender whenever it initializes. //Platforms, please be sure to set this up. //return true if you successfully init. extern bool (*oglrender_init)(); //This is called by OGLRender before it uses opengl. //return true if youre OK with using opengl extern bool (*oglrender_beginOpenGL)(); //This is called by OGLRender after it is done using opengl. extern void (*oglrender_endOpenGL)(); // These functions need to be assigned by ports that support using an // OpenGL 3.2 Core Profile context. The OGLRender_3_2.cpp file includes // the corresponding functions to assign to each function pointer. // // If any of these functions are unassigned, then one of the legacy OpenGL // renderers will be used instead. extern void (*OGLLoadEntryPoints_3_2_Func)(); extern void (*OGLCreateRenderer_3_2_Func)(OpenGLRenderer **rendererPtr); // Lookup Tables extern CACHE_ALIGN GLfloat material_8bit_to_float[256]; extern CACHE_ALIGN GLuint dsDepthToD24S8_LUT[32768]; extern const GLfloat divide5bitBy31_LUT[32]; FORCEINLINE u32 BGRA8888_32_To_RGBA6665_32(const u32 srcPix); FORCEINLINE u32 BGRA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix); bool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor, unsigned int checkVersionRevision); class OpenGLRenderer : public Render3D { private: // Driver's OpenGL Version unsigned int versionMajor; unsigned int versionMinor; unsigned int versionRevision; protected: // OpenGL-specific References OGLRenderRef *ref; // OpenGL Feature Support bool isVBOSupported; bool isPBOSupported; bool isFBOSupported; bool isMultisampledFBOSupported; bool isShaderSupported; bool isVAOSupported; // Textures TexCacheItem *currTexture; u16 currentToonTable16[32]; bool toonTableNeedsUpdate; DS_ALIGN(16) u32 GPU_screen3D[2][256 * 192 * sizeof(u32)]; bool gpuScreen3DHasNewData[2]; unsigned int doubleBufferIndex; u8 clearImageStencilValue; // OpenGL-specific methods virtual Render3DError CreateVBOs() = 0; virtual void DestroyVBOs() = 0; virtual Render3DError CreatePBOs() = 0; virtual void DestroyPBOs() = 0; virtual Render3DError CreateFBOs() = 0; virtual void DestroyFBOs() = 0; virtual Render3DError CreateMultisampledFBO() = 0; virtual void DestroyMultisampledFBO() = 0; virtual Render3DError CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram) = 0; virtual void DestroyShaders() = 0; virtual Render3DError CreateVAOs() = 0; virtual void DestroyVAOs() = 0; virtual Render3DError InitTextures() = 0; virtual Render3DError InitFinalRenderStates(const std::set *oglExtensionSet) = 0; virtual Render3DError InitTables() = 0; virtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram) = 0; virtual Render3DError SetupShaderIO() = 0; virtual Render3DError CreateToonTable() = 0; virtual Render3DError DestroyToonTable() = 0; virtual Render3DError UploadToonTable(const GLushort *toonTableBuffer) = 0; virtual Render3DError CreateClearImage() = 0; virtual Render3DError DestroyClearImage() = 0; virtual Render3DError UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer) = 0; virtual void GetExtensionSet(std::set *oglExtensionSet) = 0; virtual Render3DError ExpandFreeTextures() = 0; virtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount) = 0; virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount) = 0; virtual Render3DError DisableVertexAttributes() = 0; virtual Render3DError SelectRenderingFramebuffer() = 0; virtual Render3DError DownsampleFBO() = 0; virtual Render3DError ReadBackPixels() = 0; // Base rendering methods virtual Render3DError BeginRender(const GFX3D_State *renderState) = 0; virtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) = 0; virtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) = 0; virtual Render3DError PostRender() = 0; virtual Render3DError EndRender(const u64 frameCount) = 0; virtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll) = 0; virtual Render3DError UpdateToonTable(const u16 *toonTableBuffer) = 0; virtual Render3DError ClearUsingImage() const = 0; virtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const = 0; virtual Render3DError SetupPolygon(const POLY *thePoly) = 0; virtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing) = 0; virtual Render3DError SetupViewport(const POLY *thePoly) = 0; public: OpenGLRenderer(); virtual ~OpenGLRenderer() {}; virtual Render3DError InitExtensions() = 0; virtual Render3DError Reset() = 0; virtual Render3DError RenderFinish() = 0; virtual Render3DError DeleteTexture(const TexCacheItem *item) = 0; bool IsExtensionPresent(const std::set *oglExtensionSet, const std::string extensionName) const; bool ValidateShaderCompile(GLuint theShader) const; bool ValidateShaderProgramLink(GLuint theProgram) const; void GetVersion(unsigned int *major, unsigned int *minor, unsigned int *revision) const; void SetVersion(unsigned int major, unsigned int minor, unsigned int revision); void ConvertFramebuffer(const u32 *__restrict srcBuffer, u32 *dstBuffer); }; class OpenGLRenderer_1_2 : public OpenGLRenderer { protected: // OpenGL-specific methods virtual Render3DError CreateVBOs(); virtual void DestroyVBOs(); virtual Render3DError CreatePBOs(); virtual void DestroyPBOs(); virtual Render3DError CreateFBOs(); virtual void DestroyFBOs(); virtual Render3DError CreateMultisampledFBO(); virtual void DestroyMultisampledFBO(); virtual Render3DError CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram); virtual void DestroyShaders(); virtual Render3DError CreateVAOs(); virtual void DestroyVAOs(); virtual Render3DError InitTextures(); virtual Render3DError InitFinalRenderStates(const std::set *oglExtensionSet); virtual Render3DError InitTables(); virtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram); virtual Render3DError SetupShaderIO(); virtual Render3DError CreateToonTable(); virtual Render3DError DestroyToonTable(); virtual Render3DError UploadToonTable(const GLushort *toonTableBuffer); virtual Render3DError CreateClearImage(); virtual Render3DError DestroyClearImage(); virtual Render3DError UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer); virtual void GetExtensionSet(std::set *oglExtensionSet); virtual Render3DError ExpandFreeTextures(); virtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount); virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount); virtual Render3DError DisableVertexAttributes(); virtual Render3DError SelectRenderingFramebuffer(); virtual Render3DError DownsampleFBO(); virtual Render3DError ReadBackPixels(); // Base rendering methods virtual Render3DError BeginRender(const GFX3D_State *renderState); virtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError PostRender(); virtual Render3DError EndRender(const u64 frameCount); virtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll); virtual Render3DError UpdateToonTable(const u16 *toonTableBuffer); virtual Render3DError ClearUsingImage() const; virtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const; virtual Render3DError SetupPolygon(const POLY *thePoly); virtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing); virtual Render3DError SetupViewport(const POLY *thePoly); public: OpenGLRenderer_1_2(); ~OpenGLRenderer_1_2(); virtual Render3DError InitExtensions(); virtual Render3DError Reset(); virtual Render3DError RenderFinish(); virtual Render3DError DeleteTexture(const TexCacheItem *item); }; class OpenGLRenderer_1_3 : public OpenGLRenderer_1_2 { protected: virtual Render3DError CreateToonTable(); virtual Render3DError DestroyToonTable(); virtual Render3DError UploadToonTable(const GLushort *toonTableBuffer); virtual Render3DError CreateClearImage(); virtual Render3DError DestroyClearImage(); virtual Render3DError UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer); }; class OpenGLRenderer_1_4 : public OpenGLRenderer_1_3 { protected: virtual Render3DError InitFinalRenderStates(const std::set *oglExtensionSet); }; class OpenGLRenderer_1_5 : public OpenGLRenderer_1_4 { protected: virtual Render3DError CreateVBOs(); virtual void DestroyVBOs(); virtual Render3DError CreatePBOs(); virtual void DestroyPBOs(); virtual Render3DError CreateVAOs(); virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount); virtual Render3DError DisableVertexAttributes(); virtual Render3DError ReadBackPixels(); public: ~OpenGLRenderer_1_5(); virtual Render3DError RenderFinish(); }; class OpenGLRenderer_2_0 : public OpenGLRenderer_1_5 { protected: virtual Render3DError InitExtensions(); virtual Render3DError InitFinalRenderStates(const std::set *oglExtensionSet); virtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount); virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount); virtual Render3DError DisableVertexAttributes(); virtual Render3DError BeginRender(const GFX3D_State *renderState); virtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError SetupPolygon(const POLY *thePoly); virtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing); }; class OpenGLRenderer_2_1 : public OpenGLRenderer_2_0 { protected: virtual Render3DError ReadBackPixels(); public: virtual Render3DError RenderFinish(); }; #endif desmume-0.9.9/src/wxdlg/0000755000175000017500000000000012140305320015624 5ustar guillaumeguillaumedesmume-0.9.9/src/wxdlg/wxcontrolsconfigdialog.cpp0000644000175000017500000006664412140261502023143 0ustar guillaumeguillaume///////////////////////////////////////////////////////////////////////////// // Name: wxcontrolsconfigdialog.cpp // Purpose: // Author: // Modified by: // Created: 09/07/2010 15:27:00 // RCS-ID: // Copyright: // Licence: ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif ////@begin includes ////@end includes #include "wxcontrolsconfigdialog.h" ////@begin XPM images ////@end XPM images /* * wxControlsConfigDialog type definition */ IMPLEMENT_DYNAMIC_CLASS( wxControlsConfigDialog, wxDialog ) /* * wxControlsConfigDialog event table definition */ BEGIN_EVENT_TABLE( wxControlsConfigDialog, wxDialog ) ////@begin wxControlsConfigDialog event table entries EVT_BUTTON( ID_K_L_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_R_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_X_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_Y_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_A_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_B_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_START_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_SELECT_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_UP_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_DOWN_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_LEFT_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_RIGHT_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_BUTTON( ID_K_LID_C, wxControlsConfigDialog::OnChangeKeyboardMapping ) EVT_CHOICE( ID_JOYSTICKIDX, wxControlsConfigDialog::OnJoystickidxSelected ) EVT_BUTTON( ID_J_L_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_BUTTON( ID_J_R_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_BUTTON( ID_J_X_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_BUTTON( ID_J_Y_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_BUTTON( ID_J_A_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_BUTTON( ID_J_B_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_BUTTON( ID_J_START_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_BUTTON( ID_J_SELECT_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_BUTTON( ID_J_LID_C, wxControlsConfigDialog::OnChangeJoystickMapping ) EVT_RADIOBUTTON( ID_DPAD_OPT1, wxControlsConfigDialog::OnChangeDPadMode ) EVT_RADIOBUTTON( ID_DPAD_OPT2, wxControlsConfigDialog::OnChangeDPadMode ) EVT_RADIOBUTTON( ID_DPAD_OPT3, wxControlsConfigDialog::OnChangeDPadMode ) EVT_BUTTON( wxID_DEFAULT, wxControlsConfigDialog::OnDefaultClick ) EVT_BUTTON( wxID_OK, wxControlsConfigDialog::OnOkClick ) EVT_BUTTON( wxID_CANCEL, wxControlsConfigDialog::OnCancelClick ) EVT_BUTTON( wxID_APPLY, wxControlsConfigDialog::OnApplyClick ) ////@end wxControlsConfigDialog event table entries END_EVENT_TABLE() /* * wxControlsConfigDialog constructors */ wxControlsConfigDialog::wxControlsConfigDialog() { Init(); } wxControlsConfigDialog::wxControlsConfigDialog( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) { Init(); Create(parent, id, caption, pos, size, style); } /* * wxControlsConfigDialog creator */ bool wxControlsConfigDialog::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) { ////@begin wxControlsConfigDialog creation SetExtraStyle(wxWS_EX_BLOCK_EVENTS); wxDialog::Create( parent, id, caption, pos, size, style ); CreateControls(); if (GetSizer()) { GetSizer()->SetSizeHints(this); } Centre(); ////@end wxControlsConfigDialog creation return true; } /* * wxControlsConfigDialog destructor */ wxControlsConfigDialog::~wxControlsConfigDialog() { ////@begin wxControlsConfigDialog destruction ////@end wxControlsConfigDialog destruction } /* * Member initialisation */ void wxControlsConfigDialog::Init() { ////@begin wxControlsConfigDialog member initialisation ////@end wxControlsConfigDialog member initialisation } /* * Control creation for wxControlsConfigDialog */ void wxControlsConfigDialog::CreateControls() { ////@begin wxControlsConfigDialog content construction wxControlsConfigDialog* itemDialog1 = this; wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL); itemDialog1->SetSizer(itemBoxSizer2); wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxHORIZONTAL); itemBoxSizer2->Add(itemBoxSizer3, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 0); wxStaticBox* itemStaticBoxSizer4Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Keyboard")); wxStaticBoxSizer* itemStaticBoxSizer4 = new wxStaticBoxSizer(itemStaticBoxSizer4Static, wxVERTICAL); itemBoxSizer3->Add(itemStaticBoxSizer4, 0, wxALIGN_TOP|wxALL, 5); wxFlexGridSizer* itemFlexGridSizer5 = new wxFlexGridSizer(0, 3, 0, 0); itemStaticBoxSizer4->Add(itemFlexGridSizer5, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxRIGHT|wxBOTTOM, 5); wxStaticText* itemStaticText6 = new wxStaticText( itemDialog1, wxID_STATIC, _("L:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText6, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl7 = new wxTextCtrl( itemDialog1, ID_K_L_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton8 = new wxButton( itemDialog1, ID_K_L_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText9 = new wxStaticText( itemDialog1, wxID_STATIC, _("R:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText9, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl10 = new wxTextCtrl( itemDialog1, ID_K_R_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl10, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton11 = new wxButton( itemDialog1, ID_K_R_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton11, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText12 = new wxStaticText( itemDialog1, wxID_STATIC, _("X:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText12, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl13 = new wxTextCtrl( itemDialog1, ID_K_X_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton14 = new wxButton( itemDialog1, ID_K_X_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText15 = new wxStaticText( itemDialog1, wxID_STATIC, _("Y:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText15, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl16 = new wxTextCtrl( itemDialog1, ID_K_Y_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton17 = new wxButton( itemDialog1, ID_K_Y_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText18 = new wxStaticText( itemDialog1, wxID_STATIC, _("A:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText18, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl19 = new wxTextCtrl( itemDialog1, ID_K_A_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl19, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton20 = new wxButton( itemDialog1, ID_K_A_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton20, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText21 = new wxStaticText( itemDialog1, wxID_STATIC, _("B:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText21, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl22 = new wxTextCtrl( itemDialog1, ID_K_B_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl22, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton23 = new wxButton( itemDialog1, ID_K_B_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton23, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText24 = new wxStaticText( itemDialog1, wxID_STATIC, _("Start:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText24, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl25 = new wxTextCtrl( itemDialog1, ID_K_START_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl25, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton26 = new wxButton( itemDialog1, ID_K_START_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton26, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText27 = new wxStaticText( itemDialog1, wxID_STATIC, _("Select:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText27, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl28 = new wxTextCtrl( itemDialog1, ID_K_SELECT_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl28, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton29 = new wxButton( itemDialog1, ID_K_SELECT_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton29, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText30 = new wxStaticText( itemDialog1, wxID_STATIC, _("Up:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText30, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl31 = new wxTextCtrl( itemDialog1, ID_K_UP_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl31, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton32 = new wxButton( itemDialog1, ID_K_UP_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton32, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText33 = new wxStaticText( itemDialog1, wxID_STATIC, _("Down:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText33, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl34 = new wxTextCtrl( itemDialog1, ID_K_DOWN_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl34, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton35 = new wxButton( itemDialog1, ID_K_DOWN_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton35, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText36 = new wxStaticText( itemDialog1, wxID_STATIC, _("Left:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText36, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl37 = new wxTextCtrl( itemDialog1, ID_K_LEFT_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl37, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton38 = new wxButton( itemDialog1, ID_K_LEFT_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton38, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText39 = new wxStaticText( itemDialog1, wxID_STATIC, _("Right:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText39, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl40 = new wxTextCtrl( itemDialog1, ID_K_RIGHT_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl40, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton41 = new wxButton( itemDialog1, ID_K_RIGHT_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton41, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText42 = new wxStaticText( itemDialog1, wxID_STATIC, _("Close/open lid:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemStaticText42, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl43 = new wxTextCtrl( itemDialog1, ID_K_LID_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer5->Add(itemTextCtrl43, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton44 = new wxButton( itemDialog1, ID_K_LID_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer5->Add(itemButton44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticBox* itemStaticBoxSizer45Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Joystick")); wxStaticBoxSizer* itemStaticBoxSizer45 = new wxStaticBoxSizer(itemStaticBoxSizer45Static, wxVERTICAL); itemBoxSizer3->Add(itemStaticBoxSizer45, 0, wxALIGN_TOP|wxALL, 5); wxArrayString itemChoice46Strings; wxChoice* itemChoice46 = new wxChoice( itemDialog1, ID_JOYSTICKIDX, wxDefaultPosition, wxSize(250, -1), itemChoice46Strings, 0 ); itemStaticBoxSizer45->Add(itemChoice46, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5); wxFlexGridSizer* itemFlexGridSizer47 = new wxFlexGridSizer(0, 3, 0, 0); itemStaticBoxSizer45->Add(itemFlexGridSizer47, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxRIGHT|wxBOTTOM, 5); wxStaticText* itemStaticText48 = new wxStaticText( itemDialog1, wxID_STATIC, _("L:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText48, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl49 = new wxTextCtrl( itemDialog1, ID_J_L_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl49, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton50 = new wxButton( itemDialog1, ID_J_L_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton50, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText51 = new wxStaticText( itemDialog1, wxID_STATIC, _("R:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText51, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl52 = new wxTextCtrl( itemDialog1, ID_J_R_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl52, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton53 = new wxButton( itemDialog1, ID_J_R_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton53, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText54 = new wxStaticText( itemDialog1, wxID_STATIC, _("X:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText54, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl55 = new wxTextCtrl( itemDialog1, ID_J_X_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl55, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton56 = new wxButton( itemDialog1, ID_J_X_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton56, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText57 = new wxStaticText( itemDialog1, wxID_STATIC, _("Y:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText57, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl58 = new wxTextCtrl( itemDialog1, ID_J_Y_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl58, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton59 = new wxButton( itemDialog1, ID_J_Y_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton59, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText60 = new wxStaticText( itemDialog1, wxID_STATIC, _("A:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText60, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl61 = new wxTextCtrl( itemDialog1, ID_J_A_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl61, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton62 = new wxButton( itemDialog1, ID_J_A_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton62, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText63 = new wxStaticText( itemDialog1, wxID_STATIC, _("B:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText63, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl64 = new wxTextCtrl( itemDialog1, ID_J_B_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl64, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton65 = new wxButton( itemDialog1, ID_J_B_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton65, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText66 = new wxStaticText( itemDialog1, wxID_STATIC, _("Start:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText66, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl67 = new wxTextCtrl( itemDialog1, ID_J_START_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl67, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton68 = new wxButton( itemDialog1, ID_J_START_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton68, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText69 = new wxStaticText( itemDialog1, wxID_STATIC, _("Select:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText69, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl70 = new wxTextCtrl( itemDialog1, ID_J_SELECT_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl70, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton71 = new wxButton( itemDialog1, ID_J_SELECT_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton71, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticText* itemStaticText72 = new wxStaticText( itemDialog1, wxID_STATIC, _("Close/open lid:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemStaticText72, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); wxTextCtrl* itemTextCtrl73 = new wxTextCtrl( itemDialog1, ID_J_LID_S, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); itemFlexGridSizer47->Add(itemTextCtrl73, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxButton* itemButton74 = new wxButton( itemDialog1, ID_J_LID_C, _("Change"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer47->Add(itemButton74, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); wxStaticBox* itemStaticBoxSizer75Static = new wxStaticBox(itemDialog1, wxID_ANY, _("D-Pad")); wxStaticBoxSizer* itemStaticBoxSizer75 = new wxStaticBoxSizer(itemStaticBoxSizer75Static, wxHORIZONTAL); itemStaticBoxSizer45->Add(itemStaticBoxSizer75, 0, wxALIGN_LEFT|wxALL, 5); wxRadioButton* itemRadioButton76 = new wxRadioButton( itemDialog1, ID_DPAD_OPT1, _("POV hat"), wxDefaultPosition, wxDefaultSize, 0 ); itemRadioButton76->SetValue(false); itemStaticBoxSizer75->Add(itemRadioButton76, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); wxRadioButton* itemRadioButton77 = new wxRadioButton( itemDialog1, ID_DPAD_OPT2, _("X/Y axis"), wxDefaultPosition, wxDefaultSize, 0 ); itemRadioButton77->SetValue(false); itemStaticBoxSizer75->Add(itemRadioButton77, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); wxRadioButton* itemRadioButton78 = new wxRadioButton( itemDialog1, ID_DPAD_OPT3, _("Both"), wxDefaultPosition, wxDefaultSize, 0 ); itemRadioButton78->SetValue(false); itemStaticBoxSizer75->Add(itemRadioButton78, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); wxBoxSizer* itemBoxSizer79 = new wxBoxSizer(wxHORIZONTAL); itemBoxSizer2->Add(itemBoxSizer79, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT|wxBOTTOM, 5); wxButton* itemButton80 = new wxButton( itemDialog1, wxID_DEFAULT, _("Default"), wxDefaultPosition, wxDefaultSize, 0 ); itemBoxSizer79->Add(itemButton80, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxTOP|wxBOTTOM, 5); itemBoxSizer79->Add(5, 5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); wxButton* itemButton82 = new wxButton( itemDialog1, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); itemButton82->SetDefault(); itemBoxSizer79->Add(itemButton82, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5); wxButton* itemButton83 = new wxButton( itemDialog1, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); itemBoxSizer79->Add(itemButton83, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5); wxButton* itemButton84 = new wxButton( itemDialog1, wxID_APPLY, _("&Apply"), wxDefaultPosition, wxDefaultSize, 0 ); itemButton84->Enable(false); itemBoxSizer79->Add(itemButton84, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5); ////@end wxControlsConfigDialog content construction } /* * Should we show tooltips? */ bool wxControlsConfigDialog::ShowToolTips() { return true; } /* * Get bitmap resources */ wxBitmap wxControlsConfigDialog::GetBitmapResource( const wxString& name ) { // Bitmap retrieval ////@begin wxControlsConfigDialog bitmap retrieval wxUnusedVar(name); return wxNullBitmap; ////@end wxControlsConfigDialog bitmap retrieval } /* * Get icon resources */ wxIcon wxControlsConfigDialog::GetIconResource( const wxString& name ) { // Icon retrieval ////@begin wxControlsConfigDialog icon retrieval wxUnusedVar(name); return wxNullIcon; ////@end wxControlsConfigDialog icon retrieval } /* * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_K_L_C */ void wxControlsConfigDialog::OnChangeKeyboardMapping( wxCommandEvent& event ) { ////@begin wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_K_L_C in wxControlsConfigDialog. // Before editing this code, remove the block markers. event.Skip(); ////@end wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_K_L_C in wxControlsConfigDialog. } /* * wxEVT_COMMAND_CHOICE_SELECTED event handler for ID_JOYSTICKIDX */ void wxControlsConfigDialog::OnJoystickidxSelected( wxCommandEvent& event ) { ////@begin wxEVT_COMMAND_CHOICE_SELECTED event handler for ID_JOYSTICKIDX in wxControlsConfigDialog. // Before editing this code, remove the block markers. event.Skip(); ////@end wxEVT_COMMAND_CHOICE_SELECTED event handler for ID_JOYSTICKIDX in wxControlsConfigDialog. } /* * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_J_L_C */ void wxControlsConfigDialog::OnChangeJoystickMapping( wxCommandEvent& event ) { ////@begin wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_J_L_C in wxControlsConfigDialog. // Before editing this code, remove the block markers. event.Skip(); ////@end wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_J_L_C in wxControlsConfigDialog. } /* * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_DPAD_OPT1 */ void wxControlsConfigDialog::OnChangeDPadMode( wxCommandEvent& event ) { ////@begin wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_DPAD_OPT1 in wxControlsConfigDialog. // Before editing this code, remove the block markers. event.Skip(); ////@end wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_DPAD_OPT1 in wxControlsConfigDialog. } /* * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_DEFAULT */ void wxControlsConfigDialog::OnDefaultClick( wxCommandEvent& event ) { ////@begin wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_DEFAULT in wxControlsConfigDialog. // Before editing this code, remove the block markers. event.Skip(); ////@end wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_DEFAULT in wxControlsConfigDialog. } /* * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK */ void wxControlsConfigDialog::OnOkClick( wxCommandEvent& event ) { ////@begin wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK in wxControlsConfigDialog. // Before editing this code, remove the block markers. event.Skip(); ////@end wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK in wxControlsConfigDialog. } /* * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL */ void wxControlsConfigDialog::OnCancelClick( wxCommandEvent& event ) { Destroy(); } /* * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_APPLY */ void wxControlsConfigDialog::OnApplyClick( wxCommandEvent& event ) { ////@begin wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_APPLY in wxControlsConfigDialog. // Before editing this code, remove the block markers. event.Skip(); ////@end wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_APPLY in wxControlsConfigDialog. } desmume-0.9.9/src/wxdlg/wxdlg3dViewer.h0000644000175000017500000001363412140261502020545 0ustar guillaumeguillaume///////////////////////////////////////////////////////////////////////////// // Name: wxdlg3dviewer.h // Purpose: // Author: // Modified by: // Created: 12/12/2009 15:45:31 // RCS-ID: // Copyright: // Licence: ///////////////////////////////////////////////////////////////////////////// // Generated by DialogBlocks (unregistered), 12/12/2009 15:45:31 #ifndef _WXDLG3DVIEWER_H_ #define _WXDLG3DVIEWER_H_ /*! * Includes */ ////@begin includes #include "wx/statline.h" #include "wx/listctrl.h" #include "wx/treectrl.h" ////@end includes class IListCtrlCallbacks { public: virtual wxString OnGetItemText(const wxListCtrl* list, long item, long column) const = 0; }; /*! * Forward declarations */ ////@begin forward declarations class wxWindow; class wxDesmumeListCtrl; class wxTreeCtrl; ////@end forward declarations /*! * Control identifiers */ ////@begin control identifiers #define ID_X 10000 #define ID_CheckMaterialInterpolate 10004 #define ID_CHECKBOX1 10008 #define ID_PanelTexture 10001 #define ID_PanelViewport 10002 #define ID_RADIOBUTTON 10005 #define ID_RADIOBUTTON1 10006 #define ID_RADIOBUTTON2 10007 #define ID_ListPolys 10009 #define ID_Tree 10003 #define SYMBOL_WXDLG3DVIEWER_STYLE wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxDIALOG_NO_PARENT|wxCLOSE_BOX|wxTAB_TRAVERSAL #define SYMBOL_WXDLG3DVIEWER_TITLE _("3D Viewer") #define SYMBOL_WXDLG3DVIEWER_IDNAME ID_X #define SYMBOL_WXDLG3DVIEWER_SIZE wxSize(399, 300) #define SYMBOL_WXDLG3DVIEWER_POSITION wxDefaultPosition #define SYMBOL_WXDESMUMELISTCTRL_STYLE wxLC_REPORT|wxLC_VIRTUAL #define SYMBOL_WXDESMUMELISTCTRL_IDNAME ID_ListPolys #define SYMBOL_WXDESMUMELISTCTRL_SIZE wxDefaultSize #define SYMBOL_WXDESMUMELISTCTRL_POSITION wxDefaultPosition ////@end control identifiers /*! * wxdlg3dViewer class declaration */ class wxdlg3dViewer: public wxDialog, public IListCtrlCallbacks { DECLARE_DYNAMIC_CLASS( wxdlg3dViewer ) DECLARE_EVENT_TABLE() public: /// Constructors wxdlg3dViewer(); wxdlg3dViewer( wxWindow* parent, wxWindowID id = SYMBOL_WXDLG3DVIEWER_IDNAME, const wxString& caption = SYMBOL_WXDLG3DVIEWER_TITLE, const wxPoint& pos = SYMBOL_WXDLG3DVIEWER_POSITION, const wxSize& size = SYMBOL_WXDLG3DVIEWER_SIZE, long style = SYMBOL_WXDLG3DVIEWER_STYLE ); /// Creation bool Create( wxWindow* parent, wxWindowID id = SYMBOL_WXDLG3DVIEWER_IDNAME, const wxString& caption = SYMBOL_WXDLG3DVIEWER_TITLE, const wxPoint& pos = SYMBOL_WXDLG3DVIEWER_POSITION, const wxSize& size = SYMBOL_WXDLG3DVIEWER_SIZE, long style = SYMBOL_WXDLG3DVIEWER_STYLE ); /// Destructor ~wxdlg3dViewer(); /// Initialises member variables void Init(); /// Creates the controls and sizers void CreateControls(); virtual wxString OnGetItemText(const wxListCtrl* list, long item, long column) const { return wxT(""); } virtual void RepaintPanel() {} virtual void _OnPaintPanel( wxPaintEvent& event ) {}; ////@begin wxdlg3dViewer event handler declarations /// wxEVT_CLOSE_WINDOW event handler for ID_X virtual void OnCloseWindow( wxCloseEvent& event ); /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CheckMaterialInterpolate virtual void OnMaterialInterpolateClick( wxCommandEvent& event ); /// wxEVT_PAINT event handler for ID_PanelTexture virtual void OnPaintPanelTexture( wxPaintEvent& event ); /// wxEVT_ERASE_BACKGROUND event handler for ID_PanelTexture virtual void OnDoNotEraseBackground( wxEraseEvent& event ); /// wxEVT_PAINT event handler for ID_PanelViewport virtual void OnPanelPaint( wxPaintEvent& event ); /// wxEVT_COMMAND_LIST_ITEM_SELECTED event handler for ID_ListPolys virtual void OnListPolysSelected( wxListEvent& event ); ////@end wxdlg3dViewer event handler declarations ////@begin wxdlg3dViewer member function declarations /// Retrieves bitmap resources wxBitmap GetBitmapResource( const wxString& name ); /// Retrieves icon resources wxIcon GetIconResource( const wxString& name ); ////@end wxdlg3dViewer member function declarations /// Should we show tooltips? static bool ShowToolTips(); ////@begin wxdlg3dViewer member variables wxCheckBox* checkMaterialInterpolate; wxWindow* panelTexture; wxWindow* panelViewport; wxStaticText* labelFrameCounter; wxStaticText* labelUserPolycount; wxStaticText* labelFinalPolycount; wxDesmumeListCtrl* listPolys; wxTreeCtrl* tree; ////@end wxdlg3dViewer member variables }; /*! * wxDesmumeListCtrl class declaration */ class wxDesmumeListCtrl: public wxListCtrl { DECLARE_DYNAMIC_CLASS( wxDesmumeListCtrl ) DECLARE_EVENT_TABLE() public: IListCtrlCallbacks* callbacks; virtual wxString OnGetItemText(long item, long column) const { return callbacks->OnGetItemText(this,item,column); } /// Constructors wxDesmumeListCtrl(); wxDesmumeListCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxLC_ICON, const wxValidator& validator = wxDefaultValidator); /// Creation bool Create(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxLC_ICON, const wxValidator& validator = wxDefaultValidator); /// Destructor ~wxDesmumeListCtrl(); /// Initialises member variables void Init(); /// Creates the controls and sizers void CreateControls(); ////@begin wxDesmumeListCtrl event handler declarations ////@end wxDesmumeListCtrl event handler declarations ////@begin wxDesmumeListCtrl member function declarations ////@end wxDesmumeListCtrl member function declarations ////@begin wxDesmumeListCtrl member variables ////@end wxDesmumeListCtrl member variables }; #endif // _X_H_ desmume-0.9.9/src/wxdlg/wxcontrolsconfigdialog.h0000644000175000017500000001206012140261502022567 0ustar guillaumeguillaume///////////////////////////////////////////////////////////////////////////// // Name: wxcontrolsconfigdialog.h // Purpose: // Author: // Modified by: // Created: 09/07/2010 15:27:00 // RCS-ID: // Copyright: // Licence: ///////////////////////////////////////////////////////////////////////////// #ifndef _WXCONTROLSCONFIGDIALOG_H_ #define _WXCONTROLSCONFIGDIALOG_H_ /*! * Includes */ ////@begin includes ////@end includes /*! * Forward declarations */ ////@begin forward declarations ////@end forward declarations /*! * Control identifiers */ ////@begin control identifiers #define ID_WXCONTROLSCONFIGDIALOG 10010 #define ID_K_L_S 10011 #define ID_K_L_C 10012 #define ID_K_R_S 10013 #define ID_K_R_C 10014 #define ID_K_X_S 10015 #define ID_K_X_C 10016 #define ID_K_Y_S 10017 #define ID_K_Y_C 10018 #define ID_K_A_S 10019 #define ID_K_A_C 10020 #define ID_K_B_S 10021 #define ID_K_B_C 10022 #define ID_K_START_S 10023 #define ID_K_START_C 10024 #define ID_K_SELECT_S 10025 #define ID_K_SELECT_C 10026 #define ID_K_UP_S 10027 #define ID_K_UP_C 10028 #define ID_K_DOWN_S 10029 #define ID_K_DOWN_C 10030 #define ID_K_LEFT_S 10031 #define ID_K_LEFT_C 10032 #define ID_K_RIGHT_S 10033 #define ID_K_RIGHT_C 10034 #define ID_K_LID_S 10035 #define ID_K_LID_C 10036 #define ID_JOYSTICKIDX 10058 #define ID_J_L_S 10037 #define ID_J_L_C 10038 #define ID_J_R_S 10039 #define ID_J_R_C 10040 #define ID_J_X_S 10041 #define ID_J_X_C 10042 #define ID_J_Y_S 10043 #define ID_J_Y_C 10044 #define ID_J_A_S 10045 #define ID_J_A_C 10046 #define ID_J_B_S 10047 #define ID_J_B_C 10048 #define ID_J_START_S 10049 #define ID_J_START_C 10050 #define ID_J_SELECT_S 10051 #define ID_J_SELECT_C 10052 #define ID_J_LID_S 10053 #define ID_J_LID_C 10054 #define ID_DPAD_OPT1 10055 #define ID_DPAD_OPT2 10056 #define ID_DPAD_OPT3 10057 #define SYMBOL_WXCONTROLSCONFIGDIALOG_STYLE wxCAPTION|wxSYSTEM_MENU|wxCLOSE_BOX|wxTAB_TRAVERSAL #define SYMBOL_WXCONTROLSCONFIGDIALOG_TITLE _("Controls configuration") #define SYMBOL_WXCONTROLSCONFIGDIALOG_IDNAME ID_WXCONTROLSCONFIGDIALOG #define SYMBOL_WXCONTROLSCONFIGDIALOG_SIZE wxSize(400, 300) #define SYMBOL_WXCONTROLSCONFIGDIALOG_POSITION wxDefaultPosition ////@end control identifiers /*! * wxControlsConfigDialog class declaration */ class wxControlsConfigDialog: public wxDialog { DECLARE_DYNAMIC_CLASS( wxControlsConfigDialog ) DECLARE_EVENT_TABLE() public: /// Constructors wxControlsConfigDialog(); wxControlsConfigDialog( wxWindow* parent, wxWindowID id = SYMBOL_WXCONTROLSCONFIGDIALOG_IDNAME, const wxString& caption = SYMBOL_WXCONTROLSCONFIGDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXCONTROLSCONFIGDIALOG_POSITION, const wxSize& size = SYMBOL_WXCONTROLSCONFIGDIALOG_SIZE, long style = SYMBOL_WXCONTROLSCONFIGDIALOG_STYLE ); /// Creation bool Create( wxWindow* parent, wxWindowID id = SYMBOL_WXCONTROLSCONFIGDIALOG_IDNAME, const wxString& caption = SYMBOL_WXCONTROLSCONFIGDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXCONTROLSCONFIGDIALOG_POSITION, const wxSize& size = SYMBOL_WXCONTROLSCONFIGDIALOG_SIZE, long style = SYMBOL_WXCONTROLSCONFIGDIALOG_STYLE ); /// Destructor ~wxControlsConfigDialog(); /// Initialises member variables void Init(); /// Creates the controls and sizers void CreateControls(); ////@begin wxControlsConfigDialog event handler declarations /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_K_L_C virtual void OnChangeKeyboardMapping( wxCommandEvent& event ); /// wxEVT_COMMAND_CHOICE_SELECTED event handler for ID_JOYSTICKIDX virtual void OnJoystickidxSelected( wxCommandEvent& event ); /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_J_L_C virtual void OnChangeJoystickMapping( wxCommandEvent& event ); /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_DPAD_OPT1 virtual void OnChangeDPadMode( wxCommandEvent& event ); /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_DEFAULT virtual void OnDefaultClick( wxCommandEvent& event ); /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK virtual void OnOkClick( wxCommandEvent& event ); /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL virtual void OnCancelClick( wxCommandEvent& event ); /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_APPLY virtual void OnApplyClick( wxCommandEvent& event ); ////@end wxControlsConfigDialog event handler declarations ////@begin wxControlsConfigDialog member function declarations /// Retrieves bitmap resources wxBitmap GetBitmapResource( const wxString& name ); /// Retrieves icon resources wxIcon GetIconResource( const wxString& name ); ////@end wxControlsConfigDialog member function declarations /// Should we show tooltips? static bool ShowToolTips(); ////@begin wxControlsConfigDialog member variables ////@end wxControlsConfigDialog member variables }; #endif // _WXCONTROLSCONFIGDIALOG_H_ desmume-0.9.9/src/wxdlg/wxdlg3dViewer.cpp0000644000175000017500000003106012140261502021071 0ustar guillaumeguillaume///////////////////////////////////////////////////////////////////////////// // Name: wxdlg3dViewer.h.cpp // Purpose: // Author: // Modified by: // Created: 12/12/2009 15:45:31 // RCS-ID: // Copyright: // Licence: ///////////////////////////////////////////////////////////////////////////// #include "types.h" #ifdef HAVE_WX // Generated by DialogBlocks (unregistered), 12/12/2009 15:45:31 // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif ////@begin includes #include "wx/imaglist.h" ////@end includes #include "wxdlg3dViewer.h" ////@begin XPM images ////@end XPM images /* * wxdlg3dViewer type definition */ IMPLEMENT_DYNAMIC_CLASS( wxdlg3dViewer, wxDialog ) /* * wxdlg3dViewer event table definition */ BEGIN_EVENT_TABLE( wxdlg3dViewer, wxDialog ) ////@begin wxdlg3dViewer event table entries EVT_CLOSE( wxdlg3dViewer::OnCloseWindow ) EVT_CHECKBOX( ID_CheckMaterialInterpolate, wxdlg3dViewer::OnMaterialInterpolateClick ) EVT_LIST_ITEM_SELECTED( ID_ListPolys, wxdlg3dViewer::OnListPolysSelected ) ////@end wxdlg3dViewer event table entries END_EVENT_TABLE() /* * wxdlg3dViewer constructors */ wxdlg3dViewer::wxdlg3dViewer() { Init(); } wxdlg3dViewer::wxdlg3dViewer( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) { Init(); Create(parent, id, caption, pos, size, style); listPolys->callbacks = this; listPolys->InsertColumn(0,wxT("polys")); } /* * x creator */ bool wxdlg3dViewer::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) { ////@begin wxdlg3dViewer creation SetExtraStyle(wxWS_EX_BLOCK_EVENTS); wxDialog::Create( parent, id, caption, pos, size, style ); CreateControls(); if (GetSizer()) { GetSizer()->SetSizeHints(this); } Centre(); ////@end wxdlg3dViewer creation return true; } /* * wxdlg3dViewer destructor */ wxdlg3dViewer::~wxdlg3dViewer() { ////@begin wxdlg3dViewer destruction ////@end wxdlg3dViewer destruction } /* * Member initialisation */ void wxdlg3dViewer::Init() { ////@begin wxdlg3dViewer member initialisation checkMaterialInterpolate = NULL; panelTexture = NULL; panelViewport = NULL; labelFrameCounter = NULL; labelUserPolycount = NULL; labelFinalPolycount = NULL; listPolys = NULL; tree = NULL; ////@end wxdlg3dViewer member initialisation } /* * Control creation for x */ void wxdlg3dViewer::CreateControls() { ////@begin wxdlg3dViewer content construction wxdlg3dViewer* itemDialog1 = this; wxFlexGridSizer* itemFlexGridSizer2 = new wxFlexGridSizer(1, 0, 0, 0); itemFlexGridSizer2->AddGrowableCol(0); itemFlexGridSizer2->AddGrowableCol(1); itemFlexGridSizer2->AddGrowableCol(2); itemFlexGridSizer2->AddGrowableCol(3); itemFlexGridSizer2->AddGrowableCol(4); itemDialog1->SetSizer(itemFlexGridSizer2); wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL); itemFlexGridSizer2->Add(itemBoxSizer3, 0, wxGROW|wxALIGN_TOP|wxALL, 5); wxStaticBox* itemStaticBoxSizer4Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Display optionsss")); wxStaticBoxSizer* itemStaticBoxSizer4 = new wxStaticBoxSizer(itemStaticBoxSizer4Static, wxVERTICAL); itemBoxSizer3->Add(itemStaticBoxSizer4, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); checkMaterialInterpolate = new wxCheckBox( itemDialog1, ID_CheckMaterialInterpolate, _("Material clip interpolation"), wxDefaultPosition, wxDefaultSize, 0 ); checkMaterialInterpolate->SetValue(false); itemStaticBoxSizer4->Add(checkMaterialInterpolate, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); wxCheckBox* itemCheckBox6 = new wxCheckBox( itemDialog1, ID_CHECKBOX1, _("Something else"), wxDefaultPosition, wxDefaultSize, 0 ); itemCheckBox6->SetValue(false); itemStaticBoxSizer4->Add(itemCheckBox6, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); wxFlexGridSizer* itemFlexGridSizer8 = new wxFlexGridSizer(0, 2, 0, 0); itemBoxSizer3->Add(itemFlexGridSizer8, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); panelTexture = new wxWindow( itemDialog1, ID_PanelTexture, wxDefaultPosition, wxSize(64, 64), wxSIMPLE_BORDER ); itemFlexGridSizer8->Add(panelTexture, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5); wxStaticText* itemStaticText10 = new wxStaticText( itemDialog1, wxID_STATIC, _("3dviewer is unstable.\ndont use it."), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer8->Add(itemStaticText10, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5); panelViewport = new wxWindow( itemDialog1, ID_PanelViewport, wxDefaultPosition, wxSize(256, 192), wxSIMPLE_BORDER ); itemFlexGridSizer2->Add(panelViewport, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5); wxFlexGridSizer* itemFlexGridSizer12 = new wxFlexGridSizer(3, 1, 0, 0); itemFlexGridSizer12->AddGrowableRow(1); itemFlexGridSizer2->Add(itemFlexGridSizer12, 1, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5); wxStaticBox* itemStaticBoxSizer13Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Choose One")); wxStaticBoxSizer* itemStaticBoxSizer13 = new wxStaticBoxSizer(itemStaticBoxSizer13Static, wxVERTICAL); itemFlexGridSizer12->Add(itemStaticBoxSizer13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM|wxALL, 5); wxRadioButton* itemRadioButton14 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON, _("Final Polylist"), wxDefaultPosition, wxDefaultSize, 0 ); itemRadioButton14->SetValue(true); itemStaticBoxSizer13->Add(itemRadioButton14, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); wxRadioButton* itemRadioButton15 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON1, _("User Polylist"), wxDefaultPosition, wxDefaultSize, 0 ); itemRadioButton15->SetValue(false); itemRadioButton15->Enable(false); itemStaticBoxSizer13->Add(itemRadioButton15, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); wxRadioButton* itemRadioButton16 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON2, _("Display List"), wxDefaultPosition, wxDefaultSize, 0 ); itemRadioButton16->SetValue(false); itemRadioButton16->Enable(false); itemStaticBoxSizer13->Add(itemRadioButton16, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); itemFlexGridSizer12->Add(5, 5, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5); wxStaticBox* itemStaticBoxSizer18Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Statistics")); wxStaticBoxSizer* itemStaticBoxSizer18 = new wxStaticBoxSizer(itemStaticBoxSizer18Static, wxVERTICAL); itemFlexGridSizer12->Add(itemStaticBoxSizer18, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5); labelFrameCounter = new wxStaticText( itemDialog1, wxID_STATIC, _("Frame: 9999999"), wxDefaultPosition, wxDefaultSize, 0 ); itemStaticBoxSizer18->Add(labelFrameCounter, 0, wxALIGN_LEFT|wxALL, 1); labelUserPolycount = new wxStaticText( itemDialog1, wxID_STATIC, _("User Polys: 999999"), wxDefaultPosition, wxDefaultSize, 0 ); itemStaticBoxSizer18->Add(labelUserPolycount, 0, wxALIGN_LEFT|wxALL, 1); labelFinalPolycount = new wxStaticText( itemDialog1, wxID_STATIC, _("Final Polys: "), wxDefaultPosition, wxDefaultSize, 0 ); itemStaticBoxSizer18->Add(labelFinalPolycount, 0, wxALIGN_LEFT|wxALL, 1); wxStaticLine* itemStaticLine22 = new wxStaticLine( itemDialog1, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); itemFlexGridSizer2->Add(itemStaticLine22, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5); listPolys = new wxDesmumeListCtrl( itemDialog1, ID_ListPolys, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_VIRTUAL ); itemFlexGridSizer2->Add(listPolys, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5); tree = new wxTreeCtrl( itemDialog1, ID_Tree, wxDefaultPosition, wxSize(99, 99), wxTR_HAS_BUTTONS |wxTR_HIDE_ROOT|wxTR_ROW_LINES|wxTR_SINGLE ); itemFlexGridSizer2->Add(tree, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5); // Connect events and objects panelTexture->Connect(ID_PanelTexture, wxEVT_PAINT, wxPaintEventHandler(wxdlg3dViewer::OnPaintPanelTexture), NULL, this); panelTexture->Connect(ID_PanelTexture, wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(wxdlg3dViewer::OnDoNotEraseBackground), NULL, this); panelViewport->Connect(ID_PanelViewport, wxEVT_PAINT, wxPaintEventHandler(wxdlg3dViewer::OnPanelPaint), NULL, this); panelViewport->Connect(ID_PanelViewport, wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(wxdlg3dViewer::OnDoNotEraseBackground), NULL, this); ////@end wxdlg3dViewer content construction } /* * Should we show tooltips? */ bool wxdlg3dViewer::ShowToolTips() { return true; } /* * Get bitmap resources */ wxBitmap wxdlg3dViewer::GetBitmapResource( const wxString& name ) { // Bitmap retrieval ////@begin wxdlg3dViewer bitmap retrieval wxUnusedVar(name); return wxNullBitmap; ////@end wxdlg3dViewer bitmap retrieval } /* * Get icon resources */ wxIcon wxdlg3dViewer::GetIconResource( const wxString& name ) { // Icon retrieval ////@begin wxdlg3dViewer icon retrieval wxUnusedVar(name); return wxNullIcon; ////@end wxdlg3dViewer icon retrieval } /* * wxEVT_CLOSE_WINDOW event handler for ID_X */ void wxdlg3dViewer::OnCloseWindow( wxCloseEvent& event ) { event.Skip(); Destroy(); } /* * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_MATERIALINTERPOLATE */ void wxdlg3dViewer::OnMaterialInterpolateClick( wxCommandEvent& event ) { RepaintPanel(); } /* * wxEVT_PAINT event handler for ID_PANEL */ void wxdlg3dViewer::OnPanelPaint( wxPaintEvent& event ) { _OnPaintPanel(event); } /* * wxEVT_ERASE_BACKGROUND event handler for ID_PANEL */ void wxdlg3dViewer::OnDoNotEraseBackground( wxEraseEvent& event ) { //blank to block background clearing } /* * wxDesmumeListCtrl type definition */ IMPLEMENT_DYNAMIC_CLASS( wxDesmumeListCtrl, wxListCtrl ) /* * wxDesmumeListCtrl event table definition */ BEGIN_EVENT_TABLE( wxDesmumeListCtrl, wxListCtrl ) ////@begin wxDesmumeListCtrl event table entries ////@end wxDesmumeListCtrl event table entries END_EVENT_TABLE() /* * wxDesmumeListCtrl constructors */ wxDesmumeListCtrl::wxDesmumeListCtrl() { Init(); } wxDesmumeListCtrl::wxDesmumeListCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) { Init(); Create(parent, id, pos, size, style, validator); } /* * wxDesmumeListCtrl creator */ bool wxDesmumeListCtrl::Create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) { ////@begin wxDesmumeListCtrl creation wxListCtrl::Create(parent, id, pos, size, style, validator); CreateControls(); ////@end wxDesmumeListCtrl creation return true; } /* * wxDesmumeListCtrl destructor */ wxDesmumeListCtrl::~wxDesmumeListCtrl() { ////@begin wxDesmumeListCtrl destruction ////@end wxDesmumeListCtrl destruction } /* * Member initialisation */ void wxDesmumeListCtrl::Init() { ////@begin wxDesmumeListCtrl member initialisation ////@end wxDesmumeListCtrl member initialisation } /* * Control creation for wxDesmumeListCtrl */ void wxDesmumeListCtrl::CreateControls() { ////@begin wxDesmumeListCtrl content construction ////@end wxDesmumeListCtrl content construction } /* * wxEVT_COMMAND_LIST_ITEM_SELECTED event handler for ID_LISTPOLYS */ void wxdlg3dViewer::OnListPolysSelected( wxListEvent& event ) { ////@begin wxEVT_COMMAND_LIST_ITEM_SELECTED event handler for ID_LISTPOLYS in wxdlg3dViewer. // Before editing this code, remove the block markers. event.Skip(); ////@end wxEVT_COMMAND_LIST_ITEM_SELECTED event handler for ID_LISTPOLYS in wxdlg3dViewer. } /* * wxEVT_PAINT event handler for ID_PanelTexture */ void wxdlg3dViewer::OnPaintPanelTexture( wxPaintEvent& event ) { ////@begin wxEVT_PAINT event handler for ID_PanelTexture in wxdlg3dViewer. // Before editing this code, remove the block markers. wxPaintDC dc(wxDynamicCast(event.GetEventObject(), wxWindow)); ////@end wxEVT_PAINT event handler for ID_PanelTexture in wxdlg3dViewer. } #endif //HAVE_WX desmume-0.9.9/src/rtc.h0000644000175000017500000000165412140261633015456 0ustar guillaumeguillaume/* Copyright 2006 yopyop Copyright 2008 CrazyMax Copyright 2008-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _RTC_H_ #define _RTC_H_ #include #include #include "types.h" #include "utils/datetime.h" DateTime rtcGetTime(void); extern void rtcInit(); extern u16 rtcRead(); extern void rtcWrite(u16 val); #endif desmume-0.9.9/src/armcpu.cpp0000644000175000017500000004467012140261633016515 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2009-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include #include #include "types.h" #include "instructions.h" #include "cp15.h" #include "bios.h" #include "debug.h" #include "Disassembler.h" #include "NDSSystem.h" #include "MMU_timing.h" #ifdef HAVE_LUA #include "lua-engine.h" #endif #ifdef HAVE_JIT #include "arm_jit.h" #endif template static u32 armcpu_prefetch(); FORCEINLINE u32 armcpu_prefetch(armcpu_t *armcpu) { if(armcpu->proc_ID==0) return armcpu_prefetch<0>(); else return armcpu_prefetch<1>(); } armcpu_t NDS_ARM7; armcpu_t NDS_ARM9; #define SWAP(a, b, c) do \ { \ c=a; \ a=b; \ b=c; \ } \ while(0) #ifdef GDB_STUB #define STALLED_CYCLE_COUNT 10 static void stall_cpu( void *instance) { armcpu_t *armcpu = (armcpu_t *)instance; printf("UNSTALL\n"); armcpu->stalled = 1; } static void unstall_cpu( void *instance) { armcpu_t *armcpu = (armcpu_t *)instance; printf("UNSTALL\n"); armcpu->stalled = 0; } static void install_post_exec_fn( void *instance, void (*ex_fn)( void *, u32 adr, int thumb), void *fn_data) { armcpu_t *armcpu = (armcpu_t *)instance; armcpu->post_ex_fn = ex_fn; armcpu->post_ex_fn_data = fn_data; } static void remove_post_exec_fn( void *instance) { armcpu_t *armcpu = (armcpu_t *)instance; armcpu->post_ex_fn = NULL; } #endif #ifdef GDB_STUB static u32 read_cpu_reg( void *instance, u32 reg_num) { armcpu_t *armcpu = (armcpu_t *)instance; if ( reg_num <= 14) { return armcpu->R[reg_num]; } else if ( reg_num == 15) { return armcpu->instruct_adr; } else if ( reg_num == 16) { //CPSR return armcpu->CPSR.val; } } static void set_cpu_reg( void *instance, u32 reg_num, u32 value) { armcpu_t *armcpu = (armcpu_t *)instance; if ( reg_num <= 14) { armcpu->R[reg_num] = value; } else if ( reg_num == 15) { armcpu->next_instruction = value; } else if ( reg_num == 16) { /* FIXME: setting the CPSR */ } } #endif #ifdef GDB_STUB int armcpu_new( armcpu_t *armcpu, u32 id, struct armcpu_memory_iface *mem_if, struct armcpu_ctrl_iface **ctrl_iface_ret) #else int armcpu_new( armcpu_t *armcpu, u32 id) #endif { armcpu->proc_ID = id; #ifdef GDB_STUB armcpu->mem_if = mem_if; /* populate the control interface */ armcpu->ctrl_iface.stall = stall_cpu; armcpu->ctrl_iface.unstall = unstall_cpu; armcpu->ctrl_iface.read_reg = read_cpu_reg; armcpu->ctrl_iface.set_reg = set_cpu_reg; armcpu->ctrl_iface.install_post_ex_fn = install_post_exec_fn; armcpu->ctrl_iface.remove_post_ex_fn = remove_post_exec_fn; armcpu->ctrl_iface.data = armcpu; *ctrl_iface_ret = &armcpu->ctrl_iface; armcpu->post_ex_fn = NULL; #endif armcpu->stalled = 0; armcpu_init(armcpu, 0); return 0; } //call this whenever CPSR is changed (other than CNVZQ or T flags); interrupts may need to be unleashed void armcpu_t::changeCPSR() { //but all it does is give them a chance to unleash by forcing an immediate reschedule //TODO - we could actually set CPSR through here and look for a change in the I bit //that would be a little optimization as well as a safety measure if we prevented setting CPSR directly NDS_Reschedule(); } void armcpu_init(armcpu_t *armcpu, u32 adr) { #if defined(_M_X64) || defined(__x86_64__) memcpy(&armcpu->cond_table[0], &arm_cond_table[0], sizeof(arm_cond_table)); #endif armcpu->LDTBit = (armcpu->proc_ID==0); //Si ARM9 utiliser le syte v5 pour le load armcpu->intVector = 0xFFFF0000 * (armcpu->proc_ID==0); armcpu->waitIRQ = FALSE; armcpu->halt_IE_and_IF = FALSE; armcpu->intrWaitARM_state = 0; //#ifdef GDB_STUB // armcpu->irq_flag = 0; //#endif for(int i = 0; i < 16; ++i) armcpu->R[i] = 0; armcpu->CPSR.val = armcpu->SPSR.val = SYS; armcpu->R13_usr = armcpu->R14_usr = 0; armcpu->R13_svc = armcpu->R14_svc = 0; armcpu->R13_abt = armcpu->R14_abt = 0; armcpu->R13_und = armcpu->R14_und = 0; armcpu->R13_irq = armcpu->R14_irq = 0; armcpu->R8_fiq = armcpu->R9_fiq = armcpu->R10_fiq = armcpu->R11_fiq = armcpu->R12_fiq = armcpu->R13_fiq = armcpu->R14_fiq = 0; armcpu->SPSR_svc.val = armcpu->SPSR_abt.val = armcpu->SPSR_und.val = armcpu->SPSR_irq.val = armcpu->SPSR_fiq.val = 0; //#ifdef GDB_STUB // armcpu->instruct_adr = adr; // armcpu->R[15] = adr + 8; //#else //armcpu->R[15] = adr; //#endif armcpu->next_instruction = adr; //#ifndef GDB_STUB armcpu_prefetch(armcpu); //#endif } u32 armcpu_switchMode(armcpu_t *armcpu, u8 mode) { u32 oldmode = armcpu->CPSR.bits.mode; switch(oldmode) { case USR : case SYS : armcpu->R13_usr = armcpu->R[13]; armcpu->R14_usr = armcpu->R[14]; break; case FIQ : { u32 tmp; SWAP(armcpu->R[8], armcpu->R8_fiq, tmp); SWAP(armcpu->R[9], armcpu->R9_fiq, tmp); SWAP(armcpu->R[10], armcpu->R10_fiq, tmp); SWAP(armcpu->R[11], armcpu->R11_fiq, tmp); SWAP(armcpu->R[12], armcpu->R12_fiq, tmp); armcpu->R13_fiq = armcpu->R[13]; armcpu->R14_fiq = armcpu->R[14]; armcpu->SPSR_fiq = armcpu->SPSR; break; } case IRQ : armcpu->R13_irq = armcpu->R[13]; armcpu->R14_irq = armcpu->R[14]; armcpu->SPSR_irq = armcpu->SPSR; break; case SVC : armcpu->R13_svc = armcpu->R[13]; armcpu->R14_svc = armcpu->R[14]; armcpu->SPSR_svc = armcpu->SPSR; break; case ABT : armcpu->R13_abt = armcpu->R[13]; armcpu->R14_abt = armcpu->R[14]; armcpu->SPSR_abt = armcpu->SPSR; break; case UND : armcpu->R13_und = armcpu->R[13]; armcpu->R14_und = armcpu->R[14]; armcpu->SPSR_und = armcpu->SPSR; break; default : break; } switch(mode) { case USR : case SYS : armcpu->R[13] = armcpu->R13_usr; armcpu->R[14] = armcpu->R14_usr; //SPSR = CPSR; break; case FIQ : { u32 tmp; SWAP(armcpu->R[8], armcpu->R8_fiq, tmp); SWAP(armcpu->R[9], armcpu->R9_fiq, tmp); SWAP(armcpu->R[10], armcpu->R10_fiq, tmp); SWAP(armcpu->R[11], armcpu->R11_fiq, tmp); SWAP(armcpu->R[12], armcpu->R12_fiq, tmp); armcpu->R[13] = armcpu->R13_fiq; armcpu->R[14] = armcpu->R14_fiq; armcpu->SPSR = armcpu->SPSR_fiq; break; } case IRQ : armcpu->R[13] = armcpu->R13_irq; armcpu->R[14] = armcpu->R14_irq; armcpu->SPSR = armcpu->SPSR_irq; break; case SVC : armcpu->R[13] = armcpu->R13_svc; armcpu->R[14] = armcpu->R14_svc; armcpu->SPSR = armcpu->SPSR_svc; break; case ABT : armcpu->R[13] = armcpu->R13_abt; armcpu->R[14] = armcpu->R14_abt; armcpu->SPSR = armcpu->SPSR_abt; break; case UND : armcpu->R[13] = armcpu->R13_und; armcpu->R[14] = armcpu->R14_und; armcpu->SPSR = armcpu->SPSR_und; break; default : printf("switchMode: WRONG mode %02X\n",mode); break; } armcpu->CPSR.bits.mode = mode & 0x1F; armcpu->changeCPSR(); return oldmode; } u32 armcpu_Wait4IRQ(armcpu_t *cpu) { cpu->waitIRQ = TRUE; cpu->halt_IE_and_IF = TRUE; return 1; } template FORCEINLINE static u32 armcpu_prefetch() { armcpu_t* const armcpu = &ARMPROC; //#ifdef GDB_STUB // u32 temp_instruction; //#endif u32 curInstruction = armcpu->next_instruction; if(armcpu->CPSR.bits.T == 0) { //#ifdef GDB_STUB // temp_instruction = // armcpu->mem_if->prefetch32( armcpu->mem_if->data, // armcpu->next_instruction); // // if ( !armcpu->stalled) { // armcpu->instruction = temp_instruction; // armcpu->instruct_adr = armcpu->next_instruction; // armcpu->next_instruction += 4; // armcpu->R[15] = armcpu->next_instruction + 4; // } //#else curInstruction &= 0xFFFFFFFC; //please don't change this to 0x0FFFFFFC -- the NDS will happily run on 0xF******* addresses all day long //please note that we must setup R[15] before reading the instruction since there is a protection //which prevents PC > 0x3FFF from reading the bios region armcpu->instruct_adr = curInstruction; armcpu->next_instruction = curInstruction + 4; armcpu->R[15] = curInstruction + 8; armcpu->instruction = _MMU_read32(curInstruction); //#endif return MMU_codeFetchCycles(curInstruction); } //#ifdef GDB_STUB // temp_instruction = // armcpu->mem_if->prefetch16( armcpu->mem_if->data, // armcpu->next_instruction); // // if ( !armcpu->stalled) { // armcpu->instruction = temp_instruction; // armcpu->instruct_adr = armcpu->next_instruction; // armcpu->next_instruction = armcpu->next_instruction + 2; // armcpu->R[15] = armcpu->next_instruction + 2; // } //#else curInstruction &= 0xFFFFFFFE; //please don't change this to 0x0FFFFFFE -- the NDS will happily run on 0xF******* addresses all day long //please note that we must setup R[15] before reading the instruction since there is a protection //which prevents PC > 0x3FFF from reading the bios region armcpu->instruct_adr = curInstruction; armcpu->next_instruction = curInstruction + 2; armcpu->R[15] = curInstruction + 4; armcpu->instruction = _MMU_read16(curInstruction); //#endif if(PROCNUM==0) { // arm9 fetches 2 instructions at a time in thumb mode if(!(curInstruction == armcpu->instruct_adr + 2 && (curInstruction & 2))) return MMU_codeFetchCycles(curInstruction); else return 0; } return MMU_codeFetchCycles(curInstruction); } #if 0 /* not used */ static BOOL FASTCALL test_EQ(Status_Reg CPSR) { return ( CPSR.bits.Z); } static BOOL FASTCALL test_NE(Status_Reg CPSR) { return (!CPSR.bits.Z); } static BOOL FASTCALL test_CS(Status_Reg CPSR) { return ( CPSR.bits.C); } static BOOL FASTCALL test_CC(Status_Reg CPSR) { return (!CPSR.bits.C); } static BOOL FASTCALL test_MI(Status_Reg CPSR) { return ( CPSR.bits.N); } static BOOL FASTCALL test_PL(Status_Reg CPSR) { return (!CPSR.bits.N); } static BOOL FASTCALL test_VS(Status_Reg CPSR) { return ( CPSR.bits.V); } static BOOL FASTCALL test_VC(Status_Reg CPSR) { return (!CPSR.bits.V); } static BOOL FASTCALL test_HI(Status_Reg CPSR) { return (CPSR.bits.C) && (!CPSR.bits.Z); } static BOOL FASTCALL test_LS(Status_Reg CPSR) { return (CPSR.bits.Z) || (!CPSR.bits.C); } static BOOL FASTCALL test_GE(Status_Reg CPSR) { return (CPSR.bits.N==CPSR.bits.V); } static BOOL FASTCALL test_LT(Status_Reg CPSR) { return (CPSR.bits.N!=CPSR.bits.V); } static BOOL FASTCALL test_GT(Status_Reg CPSR) { return (!CPSR.bits.Z) && (CPSR.bits.N==CPSR.bits.V); } static BOOL FASTCALL test_LE(Status_Reg CPSR) { return ( CPSR.bits.Z) || (CPSR.bits.N!=CPSR.bits.V); } static BOOL FASTCALL test_AL(Status_Reg CPSR) { return 1; } static BOOL (FASTCALL* test_conditions[])(Status_Reg CPSR)= { test_EQ , test_NE , test_CS , test_CC , test_MI , test_PL , test_VS , test_VC , test_HI , test_LS , test_GE , test_LT , test_GT , test_LE , test_AL }; #define TEST_COND2(cond, CPSR) \ (cond<15&&test_conditions[cond](CPSR)) #endif //TODO - merge with armcpu_irqException? //http://www.ethernut.de/en/documents/arm-exceptions.html //http://docs.google.com/viewer?a=v&q=cache:V4ht1YkxprMJ:www.cs.nctu.edu.tw/~wjtsai/EmbeddedSystemDesign/Ch3-1.pdf+arm+exception+handling&hl=en&gl=us&pid=bl&srcid=ADGEEShx9VTHbUhWdDOrTVRzLkcCsVfJiijncNDkkgkrlJkLa7D0LCpO8fQ_hhU3DTcgZh9rcZWWQq4TYhhCovJ625h41M0ZUX3WGasyzWQFxYzDCB-VS6bsUmpoJnRxAc-bdkD0qmsu&sig=AHIEtbR9VHvDOCRmZFQDUVwy53iJDjoSPQ void armcpu_exception(armcpu_t *cpu, u32 number) { Mode cpumode = USR; switch(number) { case EXCEPTION_RESET: cpumode = SVC; break; case EXCEPTION_UNDEFINED_INSTRUCTION: cpumode = UND; break; case EXCEPTION_SWI: cpumode = SVC; break; case EXCEPTION_PREFETCH_ABORT: cpumode = ABT; break; case EXCEPTION_DATA_ABORT: cpumode = ABT; break; case EXCEPTION_RESERVED_0x14: emu_halt(); break; case EXCEPTION_IRQ: cpumode = IRQ; break; case EXCEPTION_FAST_IRQ: cpumode = FIQ; break; } Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, cpumode); //enter new mode cpu->R[14] = cpu->next_instruction; cpu->SPSR = tmp; //save old CPSR as new SPSR cpu->CPSR.bits.T = 0; //handle as ARM32 code cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + number; cpu->next_instruction = cpu->R[15]; printf("armcpu_exception!\n"); //extern bool dolog; //dolog=true; //HOW DOES THIS WORTK WITHOUT A PREFETCH, LIKE IRQ BELOW? //I REALLY WISH WE DIDNT PREFETCH BEFORE EXECUTING } BOOL armcpu_irqException(armcpu_t *armcpu) { Status_Reg tmp; //TODO - remove GDB specific code //#ifdef GDB_STUB // armcpu->irq_flag = 0; //#endif tmp = armcpu->CPSR; armcpu_switchMode(armcpu, IRQ); //TODO - remove GDB specific code //#ifdef GDB_STUB // armcpu->R[14] = armcpu->next_instruction + 4; //#else armcpu->R[14] = armcpu->instruct_adr + 4; //#endif armcpu->SPSR = tmp; armcpu->CPSR.bits.T = 0; armcpu->CPSR.bits.I = 1; armcpu->next_instruction = armcpu->intVector + 0x18; armcpu->waitIRQ = 0; //must retain invariant of having next instruction to be executed prefetched //(yucky) armcpu_prefetch(armcpu); return TRUE; } //TODO - remove GDB specific code //BOOL //armcpu_flagIrq( armcpu_t *armcpu) { // if(armcpu->CPSR.bits.I) return FALSE; // // armcpu->waitIRQ = 0; // //#ifdef GDB_STUB // armcpu->irq_flag = 1; //#endif // // return TRUE; //} u32 TRAPUNDEF(armcpu_t* cpu) { INFO("ARM%c: Undefined instruction: 0x%08X (%s) PC=0x%08X\n", cpu->proc_ID?'7':'9', cpu->instruction, decodeIntruction(false, cpu->instruction), cpu->instruct_adr); if (((cpu->intVector != 0) ^ (cpu->proc_ID == ARMCPU_ARM9))) { armcpu_exception(&NDS_ARM9,EXCEPTION_UNDEFINED_INSTRUCTION); return 4; } else { emu_halt(); return 4; } } //BOOL //armcpu_flagIrq( armcpu_t *armcpu) { // if(armcpu->CPSR.bits.I) return FALSE; // // armcpu->waitIRQ = 0; // //#ifdef GDB_STUB // armcpu->irq_flag = 1; //#endif // // return TRUE; //} template u32 armcpu_exec() { // Usually, fetching and executing are processed parallelly. // So this function stores the cycles of each process to // the variables below, and returns appropriate cycle count. u32 cFetch = 0; u32 cExecute = 0; //this assert is annoying. but sometimes it is handy. //assert(ARMPROC.instruct_adr!=0x00000000); //#ifdef DEVELOPER #if 0 if ((((ARMPROC.instruct_adr & 0x0F000000) == 0x0F000000) && (PROCNUM == 0)) || (((ARMPROC.instruct_adr & 0x0F000000) == 0x00000000) && (PROCNUM == 1))) { switch (ARMPROC.instruct_adr & 0xFFFF) { case 0x00000000: printf("BIOS%c: Reset!!!\n", PROCNUM?'7':'9'); emu_halt(); break; case 0x00000004: printf("BIOS%c: Undefined instruction\n", PROCNUM?'7':'9'); //emu_halt(); break; case 0x00000008: //printf("BIOS%c: SWI\n", PROCNUM?'7':'9'); break; case 0x0000000C: printf("BIOS%c: Prefetch Abort!!!\n", PROCNUM?'7':'9'); //emu_halt(); break; case 0x00000010: //printf("BIOS%c: Data Abort!!!\n", PROCNUM?'7':'9'); //emu_halt(); break; case 0x00000014: printf("BIOS%c: Reserved!!!\n", PROCNUM?'7':'9'); break; case 0x00000018: //printf("BIOS%c: IRQ\n", PROCNUM?'7':'9'); break; case 0x0000001C: printf("BIOS%c: Fast IRQ\n", PROCNUM?'7':'9'); break; } } #endif #if 0 //#ifdef GDB_STUB if (ARMPROC.stalled) { return STALLED_CYCLE_COUNT; } /* check for interrupts */ if (ARMPROC.irq_flag) { armcpu_irqException(&ARMPROC); } cFetch = armcpu_prefetch(&ARMPROC); if (ARMPROC.stalled) { return MMU_fetchExecuteCycles(cExecute, cFetch); } #endif //cFetch = armcpu_prefetch(&ARMPROC); //printf("%d: %08X\n",PROCNUM,ARMPROC.instruct_adr); if(ARMPROC.CPSR.bits.T == 0) { if( CONDITION(ARMPROC.instruction) == 0x0E //fast path for unconditional instructions || (TEST_COND(CONDITION(ARMPROC.instruction), CODE(ARMPROC.instruction), ARMPROC.CPSR)) //handles any condition ) { #ifdef HAVE_LUA CallRegisteredLuaMemHook(ARMPROC.instruct_adr, 4, ARMPROC.instruction, LUAMEMHOOK_EXEC); // should report even if condition=false? #endif #ifdef DEVELOPER DEBUG_statistics.instructionHits[PROCNUM].arm[INSTRUCTION_INDEX(ARMPROC.instruction)]++; #endif cExecute = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(ARMPROC.instruction)](ARMPROC.instruction); } else cExecute = 1; // If condition=false: 1S cycle #ifdef GDB_STUB if ( ARMPROC.post_ex_fn != NULL) { /* call the external post execute function */ ARMPROC.post_ex_fn(ARMPROC.post_ex_fn_data, ARMPROC.instruct_adr, 0); } ARMPROC.mem_if->prefetch32( ARMPROC.mem_if->data, ARMPROC.next_instruction); #endif cFetch = armcpu_prefetch(); return MMU_fetchExecuteCycles(cExecute, cFetch); } #ifdef HAVE_LUA CallRegisteredLuaMemHook(ARMPROC.instruct_adr, 2, ARMPROC.instruction, LUAMEMHOOK_EXEC); #endif #ifdef DEVELOPER DEBUG_statistics.instructionHits[PROCNUM].thumb[ARMPROC.instruction>>6]++; #endif cExecute = thumb_instructions_set[PROCNUM][ARMPROC.instruction>>6](ARMPROC.instruction); #ifdef GDB_STUB if ( ARMPROC.post_ex_fn != NULL) { /* call the external post execute function */ ARMPROC.post_ex_fn( ARMPROC.post_ex_fn_data, ARMPROC.instruct_adr, 1); } ARMPROC.mem_if->prefetch32( ARMPROC.mem_if->data, ARMPROC.next_instruction); #endif cFetch = armcpu_prefetch(); return MMU_fetchExecuteCycles(cExecute, cFetch); } //these templates needed to be instantiated manually template u32 armcpu_exec<0>(); template u32 armcpu_exec<1>(); #ifdef HAVE_JIT void arm_jit_sync() { NDS_ARM7.next_instruction = NDS_ARM7.instruct_adr; NDS_ARM9.next_instruction = NDS_ARM9.instruct_adr; armcpu_prefetch<0>(); armcpu_prefetch<1>(); } template u32 armcpu_exec() { if (jit) { ArmOpCompiled f = (ArmOpCompiled)JIT_COMPILED_FUNC(ARMPROC.instruct_adr, PROCNUM); return f ? f() : arm_jit_compile(); } return armcpu_exec(); } template u32 armcpu_exec<0,false>(); template u32 armcpu_exec<0,true>(); template u32 armcpu_exec<1,false>(); template u32 armcpu_exec<1,true>(); #endif desmume-0.9.9/src/ctrlssdl.h0000644000175000017500000000524512140261633016520 0ustar guillaumeguillaume/* Copyright (C) 2007 Pascal Giard Copyright (C) 2007-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef CTRLSSDL_H #define CTRLSSDL_H #ifdef HAVE_GL_GL_H #include #endif #include #include #include #include #include "MMU.h" #include "types.h" #define ADD_KEY(keypad,key) ( (keypad) |= (key) ) #define RM_KEY(keypad,key) ( (keypad) &= ~(key) ) #define KEYMASK_(k) (1 << (k)) #define JOY_AXIS 0 #define JOY_HAT 1 #define JOY_BUTTON 2 #define JOY_HAT_RIGHT 0 #define JOY_HAT_LEFT 1 #define JOY_HAT_UP 2 #define JOY_HAT_DOWN 3 #define NB_KEYS 14 #define KEY_NONE 0 #define KEY_A 1 #define KEY_B 2 #define KEY_SELECT 3 #define KEY_START 4 #define KEY_RIGHT 5 #define KEY_LEFT 6 #define KEY_UP 7 #define KEY_DOWN 8 #define KEY_R 9 #define KEY_L 10 #define KEY_X 11 #define KEY_Y 12 #define KEY_DEBUG 13 #define KEY_BOOST 14 /* Keypad key names */ extern const char *key_names[NB_KEYS]; /* Current keyboard configuration */ extern u16 keyboard_cfg[NB_KEYS]; /* Current joypad configuration */ extern u16 joypad_cfg[NB_KEYS]; /* Number of detected joypads */ extern u16 nbr_joy; #ifndef GTK_UI struct mouse_status { signed long x; signed long y; BOOL click; BOOL down; }; extern mouse_status mouse; #endif // !GTK_UI struct ctrls_event_config { unsigned short keypad; float nds_screen_size_ratio; int auto_pause; int focused; int sdl_quit; int boost; int fake_mic; #ifdef HAVE_GL_GL_H GLuint *screen_texture; void (*resize_cb)(u16 width, u16 height, GLuint *screen_texture); #else void *screen_texture; void (*resize_cb)(u16 width, u16 height, void *screen_texture); #endif }; void load_default_config(const u16 kbCfg[]); BOOL init_joy( void); void uninit_joy( void); u16 get_joy_key(int index); u16 get_set_joy_key(int index); void update_keypad(u16 keys); u16 get_keypad( void); u16 lookup_key (u16 keyval); u16 lookup_joy_key (u16 keyval); void process_ctrls_event( SDL_Event& event, struct ctrls_event_config *cfg); void process_joystick_events( u16 *keypad); #endif /* CTRLSSDL_H */ desmume-0.9.9/src/Makefile.am0000644000175000017500000001447512140304052016547 0ustar guillaumeguillaumeinclude $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += $(SDL_CFLAGS) $(GTHREAD_CFLAGS) $(X_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) EXTRA_DIST = build.bat instruction_tabdef.inc thumb_tabdef.inc fs-linux.cpp fs-windows.cpp cocoa if HAVE_GDB_STUB SUBDIRS = . gdbstub $(UI_DIR) else SUBDIRS = . $(UI_DIR) endif DIST_SUBDIRS = . gdbstub cli gtk gtk-glade wx noinst_LIBRARIES = libdesmume.a libdesmume_a_SOURCES = \ armcpu.cpp armcpu.h \ arm_instructions.cpp \ agg2d.h agg2d.inl \ bios.cpp bios.h bits.h cp15.cpp cp15.h \ commandline.h commandline.cpp \ common.cpp common.h \ debug.cpp debug.h \ Disassembler.cpp Disassembler.h \ emufile.h emufile.cpp emufile_types.h FIFO.cpp FIFO.h \ firmware.cpp firmware.h GPU.cpp GPU.h \ fs.h \ GPU_osd.h \ instructions.h \ mem.h mc.cpp mc.h \ path.cpp path.h \ readwrite.cpp readwrite.h \ wifi.cpp wifi.h \ mic.h \ MMU.cpp MMU.h MMU_timing.h NDSSystem.cpp NDSSystem.h registers.h \ OGLRender.h \ ROMReader.cpp ROMReader.h \ render3D.cpp render3D.h \ rtc.cpp rtc.h \ saves.cpp saves.h \ slot1.cpp slot1.h \ SPU.cpp SPU.h \ matrix.cpp matrix.h \ gfx3d.cpp gfx3d.h \ thumb_instructions.cpp types.h \ shaders.h \ movie.cpp movie.h \ PACKED.h PACKED_END.h \ utils/datetime.cpp utils/datetime.h \ utils/ConvertUTF.c utils/ConvertUTF.h utils/guid.cpp utils/guid.h \ utils/emufat.cpp utils/emufat.h utils/emufat_types.h \ utils/md5.cpp utils/md5.h utils/valuearray.h utils/xstring.cpp utils/xstring.h \ utils/decrypt/crc.cpp utils/decrypt/crc.h utils/decrypt/decrypt.cpp \ utils/decrypt/decrypt.h utils/decrypt/header.cpp utils/decrypt/header.h \ utils/task.cpp utils/task.h \ utils/vfat.h utils/vfat.cpp \ utils/dlditool.cpp \ utils/libfat/bit_ops.h \ utils/libfat/cache.cpp \ utils/libfat/cache.h \ utils/libfat/common.h \ utils/libfat/directory.cpp \ utils/libfat/directory.h \ utils/libfat/disc.cpp \ utils/libfat/disc.h \ utils/libfat/disc_io.h \ utils/libfat/fat.h \ utils/libfat/fatdir.cpp \ utils/libfat/fatdir.h \ utils/libfat/fatfile.cpp \ utils/libfat/fatfile.h \ utils/libfat/filetime.cpp \ utils/libfat/filetime.h \ utils/libfat/file_allocation_table.cpp \ utils/libfat/file_allocation_table.h \ utils/libfat/libfat.cpp \ utils/libfat/libfat_pc.h \ utils/libfat/libfat_public_api.cpp \ utils/libfat/libfat_public_api.h \ utils/libfat/lock.cpp \ utils/libfat/lock.h \ utils/libfat/mem_allocate.h \ utils/libfat/partition.cpp \ utils/libfat/partition.h \ utils/tinyxml/tinystr.cpp \ utils/tinyxml/tinystr.h \ utils/tinyxml/tinyxml.cpp \ utils/tinyxml/tinyxml.h \ utils/tinyxml/tinyxmlerror.cpp \ utils/tinyxml/tinyxmlparser.cpp \ addons.cpp addons.h \ addons/slot2_mpcf.cpp addons/slot2_paddle.cpp addons/slot2_gbagame.cpp addons/slot2_none.cpp addons/slot2_rumblepak.cpp addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp addons/slot2_piano.cpp addons/slot1_none.cpp addons/slot1_r4.cpp addons/slot1_retail.cpp addons/slot1_retail_nand.cpp \ cheatSystem.cpp cheatSystem.h \ texcache.cpp texcache.h rasterize.cpp rasterize.h \ metaspu/metaspu.cpp metaspu/metaspu.h \ filter/2xsai.cpp filter/bilinear.cpp filter/epx.cpp filter/filter.h \ filter/hq2x.cpp filter/hq2x.h filter/hq4x.cpp filter/hq4x.dat filter/hq4x.h \ filter/interp.h filter/lq2x.cpp filter/lq2x.h filter/scanline.cpp \ filter/videofilter.cpp filter/videofilter.h \ version.cpp version.h \ desmume_config.cpp desmume_config.h if HAVE_JIT libdesmume_a_SOURCES += \ arm_jit.cpp arm_jit.h instruction_attributes.h \ utils/AsmJit/AsmJit.h \ utils/AsmJit/Config.h \ utils/AsmJit/core.h \ utils/AsmJit/x86.h \ utils/AsmJit/core/apibegin.h \ utils/AsmJit/core/apiend.h \ utils/AsmJit/core/assembler.cpp \ utils/AsmJit/core/assembler.h \ utils/AsmJit/core/assert.cpp \ utils/AsmJit/core/assert.h \ utils/AsmJit/core/buffer.cpp \ utils/AsmJit/core/buffer.h \ utils/AsmJit/core/build.h \ utils/AsmJit/core/compiler.cpp \ utils/AsmJit/core/compiler.h \ utils/AsmJit/core/compilercontext.cpp \ utils/AsmJit/core/compilercontext.h \ utils/AsmJit/core/compilerfunc.cpp \ utils/AsmJit/core/compilerfunc.h \ utils/AsmJit/core/compileritem.cpp \ utils/AsmJit/core/compileritem.h \ utils/AsmJit/core/context.cpp \ utils/AsmJit/core/context.h \ utils/AsmJit/core/cpuinfo.cpp \ utils/AsmJit/core/cpuinfo.h \ utils/AsmJit/core/defs.cpp \ utils/AsmJit/core/defs.h \ utils/AsmJit/core/func.cpp \ utils/AsmJit/core/func.h \ utils/AsmJit/core/intutil.h \ utils/AsmJit/core/lock.h \ utils/AsmJit/core/logger.cpp \ utils/AsmJit/core/logger.h \ utils/AsmJit/core/memorymanager.cpp \ utils/AsmJit/core/memorymanager.h \ utils/AsmJit/core/memorymarker.cpp \ utils/AsmJit/core/memorymarker.h \ utils/AsmJit/core/operand.cpp \ utils/AsmJit/core/operand.h \ utils/AsmJit/core/podvector.h \ utils/AsmJit/core/stringbuilder.cpp \ utils/AsmJit/core/stringbuilder.h \ utils/AsmJit/core/stringutil.cpp \ utils/AsmJit/core/stringutil.h \ utils/AsmJit/core/virtualmemory.cpp \ utils/AsmJit/core/virtualmemory.h \ utils/AsmJit/core/zonememory.cpp \ utils/AsmJit/core/zonememory.h \ utils/AsmJit/x86/x86assembler.cpp \ utils/AsmJit/x86/x86assembler.h \ utils/AsmJit/x86/x86compiler.cpp \ utils/AsmJit/x86/x86compiler.h \ utils/AsmJit/x86/x86compilercontext.cpp \ utils/AsmJit/x86/x86compilercontext.h \ utils/AsmJit/x86/x86compilerfunc.cpp \ utils/AsmJit/x86/x86compilerfunc.h \ utils/AsmJit/x86/x86compileritem.cpp \ utils/AsmJit/x86/x86compileritem.h \ utils/AsmJit/x86/x86cpuinfo.cpp \ utils/AsmJit/x86/x86cpuinfo.h \ utils/AsmJit/x86/x86defs.cpp \ utils/AsmJit/x86/x86defs.h \ utils/AsmJit/x86/x86func.cpp \ utils/AsmJit/x86/x86func.h \ utils/AsmJit/x86/x86operand.cpp \ utils/AsmJit/x86/x86operand.h \ utils/AsmJit/x86/x86util.cpp \ utils/AsmJit/x86/x86util.h endif if HAVE_GL libdesmume_a_SOURCES += OGLRender.cpp endif if HAVE_OPENAL libdesmume_a_SOURCES += mic_openal.cpp else if HAVE_ALSA libdesmume_a_SOURCES += mic_alsa.cpp else libdesmume_a_SOURCES += mic.cpp endif endif if HAVE_LIBSOUNDTOUCH libdesmume_a_SOURCES += metaspu/SndOut.cpp metaspu/SndOut.h metaspu/Timestretcher.cpp endif if HAVE_LIBAGG libdesmume_a_SOURCES += aggdraw.cpp aggdraw.h GPU_osd.cpp else libdesmume_a_SOURCES += GPU_osd_stub.cpp endif if HAVE_LUA AM_CPPFLAGS += $(LUA_CFLAGS) libdesmume_a_SOURCES += lua-engine.cpp endif if HAVE_GDB_STUB libdesmume_a_SOURCES += gdbstub.h endif libdesmume_a_LIBADD = fs-$(desmume_arch).$(OBJEXT) desmume-0.9.9/src/firmware.h0000644000175000017500000000471012140261633016476 0ustar guillaumeguillaume/* Copyright (C) 2009-2011 DeSmuME Team This file 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 file 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 the this software. If not, see . */ #ifndef _FIRMWARE_H_ #define _FIRMWARE_H_ #include "common.h" // the count of bytes copied from the firmware into memory #define NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT 0x70 #define FW_CONFIG_FILE_EXT "dfc" class CFIRMWARE { private: u8 *tmp_data9; u8 *tmp_data7; u32 size9, size7; u32 keyBuf[0x412]; u32 keyCode[3]; bool getKeyBuf(); void crypt64BitUp(u32 *ptr); void crypt64BitDown(u32 *ptr); void applyKeycode(u32 modulo); bool initKeycode(u32 idCode, int level, u32 modulo); u16 getBootCodeCRC16(); u32 decrypt(const u8 *in, u8* &out); u32 decompress(const u8 *in, u8* &out); public: CFIRMWARE(): size9(0), size7(0), ARM9bootAddr(0), ARM7bootAddr(0), patched(0) {}; bool load(); static std::string GetExternalFilePath(); struct HEADER { u16 part3_rom_gui9_addr; // 000h u16 part4_rom_wifi7_addr; // 002h u16 part34_gui_wifi_crc16; // 004h u16 part12_boot_crc16; // 006h u8 fw_identifier[4]; // 008h u16 part1_rom_boot9_addr; // 00Ch u16 part1_ram_boot9_addr; // 00Eh u16 part2_rom_boot7_addr; // 010h u16 part2_ram_boot7_addr; // 012h u16 shift_amounts; // 014h u16 part5_data_gfx_addr; // 016h u8 fw_timestamp[5]; // 018h u8 console_type; // 01Dh u16 unused1; // 01Eh u16 user_settings_offset; // 020h u16 unknown1; // 022h u16 unknown2; // 024h u16 part5_crc16; // 026h u16 unused2; // 028h - FFh filled } header; u32 ARM9bootAddr; u32 ARM7bootAddr; bool patched; }; int copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data); int NDS_CreateDummyFirmware( struct NDS_fw_config_data *user_settings); void NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config); void NDS_PatchFirmwareMAC(); #endif desmume-0.9.9/src/version.cpp0000644000175000017500000001063512140261633016705 0ustar guillaumeguillaume/* Copyright (C) 2009-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "types.h" #include "version.h" // Helper macros to convert numerics to strings #if defined(_MSC_VER) //re: http://72.14.203.104/search?q=cache:HG-okth5NGkJ:mail.python.org/pipermail/python-checkins/2002-November/030704.html+_msc_ver+compiler+version+string&hl=en&gl=us&ct=clnk&cd=5 #define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) #define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X #define _Py_STRINGIZE2(X) #X #define TOSTRING(X) _Py_STRINGIZE(X) // Alias _Py_STRINGIZE so that we have a common macro name #else #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #endif //todo - everyone will want to support this eventually, i suppose #if (defined(_WINDOWS) && !defined(WXPORT)) || defined(DESMUME_COCOA) #include "svnrev.h" #else #ifdef SVN_REV #define SVN_REV_STR SVN_REV #else #define SVN_REV_STR "" #endif #endif #define DESMUME_NAME "DeSmuME" #if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_WIN64) #define DESMUME_PLATFORM_STRING " x64" #elif defined(__i386__) || defined(_M_IX86) || defined(_WIN32) #define DESMUME_PLATFORM_STRING " x86" #elif defined(__arm__) #define DESMUME_PLATFORM_STRING " ARM" #elif defined(__thumb__) #define DESMUME_PLATFORM_STRING " ARM-Thumb" #elif defined(__ppc64__) #define DESMUME_PLATFORM_STRING " PPC64" #elif defined(__ppc__) || defined(_M_PPC) #define DESMUME_PLATFORM_STRING " PPC" #else #define DESMUME_PLATFORM_STRING "" #endif #ifndef ENABLE_SSE2 #ifndef ENABLE_SSE #define DESMUME_CPUEXT_STRING " NOSSE" #else #define DESMUME_CPUEXT_STRING " NOSSE2" #endif #else #define DESMUME_CPUEXT_STRING "" #endif #ifdef DEVELOPER #define DESMUME_FEATURE_STRING " dev+" #else #define DESMUME_FEATURE_STRING "" #endif #ifdef DEBUG #define DESMUME_SUBVERSION_STRING " debug" #elif defined(PUBLIC_RELEASE) #define DESMUME_SUBVERSION_STRING "" #else #define DESMUME_SUBVERSION_STRING " svn" SVN_REV_STR #endif #ifdef __INTEL_COMPILER #define DESMUME_COMPILER " (Intel)" #define DESMUME_COMPILER_DETAIL " (Intel v" TOSTRING(__INTEL_COMPILER) ")" #elif defined(_MSC_VER) #define DESMUME_COMPILER " (MSVC)" #define DESMUME_COMPILER_DETAIL " (MSVC v" TOSTRING(_MSC_VER) ")" #elif defined(__clang__) #define DESMUME_COMPILER " (LLVM-Clang)" #define DESMUME_COMPILER_DETAIL " (LLVM-Clang v" TOSTRING(__clang_major__) "." TOSTRING(__clang_minor__) "." TOSTRING(__clang_patchlevel__) ")" #elif defined(__llvm__) #define DESMUME_COMPILER " (LLVM)" #define DESMUME_COMPILER_DETAIL " (LLVM)" #elif defined(__GNUC__) // Always make GCC the last check, since other compilers, such as Clang, may define __GNUC__ internally. #define DESMUME_COMPILER " (GCC)" #if defined(__GNUC_PATCHLEVEL__) #define DESMUME_COMPILER_DETAIL " (GCC v" TOSTRING(__GNUC__) "." TOSTRING(__GNUC_MINOR__) "." TOSTRING(__GNUC_PATCHLEVEL__) ")" #else #define DESMUME_COMPILER_DETAIL " (GCC v" TOSTRING(__GNUC__) "." TOSTRING(__GNUC_MINOR__) ")" #endif #else #define DESMUME_COMPILER "" #define DESMUME_COMPILER_DETAIL "" #endif #if defined(HAVE_JIT) && !defined(PUBLIC_RELEASE) #define DESMUME_JIT "-JIT" #else #define DESMUME_JIT "" #endif #define DESMUME_VERSION_NUMERIC 90900 #define DESMUME_VERSION_STRING " " "0.9.9" DESMUME_SUBVERSION_STRING DESMUME_FEATURE_STRING DESMUME_PLATFORM_STRING DESMUME_JIT DESMUME_CPUEXT_STRING #define DESMUME_NAME_AND_VERSION DESMUME_NAME DESMUME_VERSION_STRING u32 EMU_DESMUME_VERSION_NUMERIC() { return DESMUME_VERSION_NUMERIC; } const char* EMU_DESMUME_VERSION_STRING() { return DESMUME_VERSION_STRING; } const char* EMU_DESMUME_NAME_AND_VERSION() { return DESMUME_NAME_AND_VERSION; } const char* EMU_DESMUME_COMPILER_DETAIL() { return DESMUME_COMPILER_DETAIL; } desmume-0.9.9/src/sndsdl.h0000644000175000017500000000137412140261633016154 0ustar guillaumeguillaume/* Copyright 2005-2006 Theo Berkau This file 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 file 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 the this software. If not, see . */ #ifndef SNDSDL_H #define SNDSDL_H #define SNDCORE_SDL 2 extern SoundInterface_struct SNDSDL; #endif desmume-0.9.9/src/rtc.cpp0000644000175000017500000002061012140261633016002 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2008 CrazyMax Copyright (C) 2008-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ // TODO: interrupt handler #include "rtc.h" #include "common.h" #include "debug.h" #include "armcpu.h" #include #include "saves.h" #ifdef WIN32 #include "windows/main.h" #endif #include "movie.h" typedef struct { // RTC registers u8 regStatus1; u8 regStatus2; u8 regAdjustment; u8 regFree; // BUS u8 _prevSCK; u8 _prevCS; u8 _prevSIO; u8 _SCK; u8 _CS; u8 _SIO; u8 _DD; u16 _REG; // command & data u8 cmd; u8 cmdStat; u8 bitsCount; u8 data[8]; u8 cmdBitsSize[8]; } _RTC; _RTC rtc; SFORMAT SF_RTC[]={ { "R000", 1, 1, &rtc.regStatus1}, { "R010", 1, 1, &rtc.regStatus2}, { "R020", 1, 1, &rtc.regAdjustment}, { "R030", 1, 1, &rtc.regFree}, { "R040", 1, 1, &rtc._prevSCK}, { "R050", 1, 1, &rtc._prevCS}, { "R060", 1, 1, &rtc._prevSIO}, { "R070", 1, 1, &rtc._SCK}, { "R080", 1, 1, &rtc._CS}, { "R090", 1, 1, &rtc._SIO}, { "R100", 1, 1, &rtc._DD}, { "R110", 2, 1, &rtc._REG}, { "R120", 1, 1, &rtc.cmd}, { "R130", 1, 1, &rtc.cmdStat}, { "R140", 1, 1, &rtc.bitsCount}, { "R150", 1, 8, &rtc.data[0]}, { "R160", 1, 8, &rtc.cmdBitsSize[0]}, { 0 } }; static const u8 kDefaultCmdBitsSize[8] = {8, 8, 56, 24, 0, 24, 8, 8}; static inline u8 toBCD(u8 x) { return ((x / 10) << 4) | (x % 10); } bool moviemode=false; DateTime rtcGetTime(void) { DateTime tm; if(movieMode == MOVIEMODE_INACTIVE) { return DateTime::get_Now(); } else { //now, you might think it is silly to go through all these conniptions //when we could just assume that there are 60fps and base the seconds on frameCounter/60 //but, we were imagining that one day we might need more precision const u32 arm9rate_unitsperframe = 560190<<1; const u32 arm9rate_unitspersecond = (u32)(arm9rate_unitsperframe * 59.8261); u64 totalcycles = (u64)arm9rate_unitsperframe * currFrameCounter; u64 totalseconds=totalcycles/arm9rate_unitspersecond; DateTime timer = currMovieData.rtcStart; return timer.AddSeconds(totalseconds); } } static void rtcRecv() { //INFO("RTC Read command 0x%02X\n", (rtc.cmd >> 1)); memset(&rtc.data[0], 0, sizeof(rtc.data)); switch (rtc.cmd >> 1) { case 0: // status register 1 //INFO("RTC: read regstatus1 (0x%02X)\n", rtc.regStatus1); rtc.regStatus1 &= 0x0F; rtc.data[0] = rtc.regStatus1; //rtc.regStatus1 &= 0x7F; break; case 1: // status register 2 //INFO("RTC: read regstatus2 (0x%02X)\n", rtc.regStatus1); rtc.data[0] = rtc.regStatus2; break; case 2: // date & time { //INFO("RTC: read date & time\n"); DateTime tm = rtcGetTime(); rtc.data[0] = toBCD(tm.get_Year() % 100); rtc.data[1] = toBCD(tm.get_Month()); rtc.data[2] = toBCD(tm.get_Day()); //zero 24-apr-2010 - this is nonsense. //but it is so wrong, someone mustve thought they knew what they were doing, so i am leaving it... //rtc.data[3] = (tm.tm_wday + 6) & 7; //if (rtc.data[3] == 7) rtc.data[3] = 6; //do this instead (gbatek seems to say monday=0 but i don't think that is right) //0=sunday is necessary to make animal crossing behave //maybe it means "custom assignment" can be specified by the game rtc.data[3] = tm.get_DayOfWeek(); int hour = tm.get_Hour(); if (!(rtc.regStatus1 & 0x02)) hour %= 12; rtc.data[4] = ((hour < 12) ? 0x00 : 0x40) | toBCD(hour); rtc.data[5] = toBCD(tm.get_Minute()); rtc.data[6] = toBCD(tm.get_Second()); break; } case 3: // time { //INFO("RTC: read time\n"); DateTime tm = rtcGetTime(); int hour = tm.get_Hour(); if (!(rtc.regStatus1 & 0x02)) hour %= 12; rtc.data[0] = ((hour < 12) ? 0x00 : 0x40) | toBCD(hour); rtc.data[1] = toBCD(tm.get_Minute()); rtc.data[2] = toBCD(tm.get_Second()); break; } case 4: // freq/alarm 1 /*if (cmdBitsSize[0x04] == 8) INFO("RTC: read INT1 freq\n"); else INFO("RTC: read INT1 alarm1\n");*/ //NDS_makeARM7Int(7); break; case 5: // alarm 2 //INFO("RTC: read alarm 2\n"); break; case 6: // clock adjust //INFO("RTC: read clock adjust\n"); rtc.data[0] = rtc.regAdjustment; break; case 7: // free register //INFO("RTC: read free register\n"); rtc.data[0] = rtc.regFree; break; } } static void rtcSend() { //INFO("RTC write command 0x%02X\n", (rtc.cmd >> 1)); switch (rtc.cmd >> 1) { case 0: // status register 1 //INFO("RTC: write regstatus1 0x%02X\n", rtc.data[0]); // rtc.regStatus1 &= 0xF1; // rtc.regStatus1 |= (rtc.data[0] | 0x0E); rtc.regStatus1 = rtc.data[0]; break; case 1: // status register 2 //INFO("RTC: write regstatus2 0x%02X\n", rtc.data[0]); rtc.regStatus2 = rtc.data[0]; break; case 2: // date & time //INFO("RTC: write date & time : %02X %02X %02X %02X %02X %02X %02X\n", rtc.data[0], rtc.data[1], rtc.data[2], rtc.data[3], rtc.data[4], rtc.data[5], rtc.data[6]); break; case 3: // time //INFO("RTC: write time : %02X %02X %02X\n", rtc.data[0], rtc.data[1], rtc.data[2]); break; case 4: // freq/alarm 1 /*if (cmdBitsSize[0x04] == 8) INFO("RTC: write INT1 freq 0x%02X\n", rtc.data[0]); else INFO("RTC: write INT1 alarm1 0x%02X\n", rtc.data[0]);*/ break; case 5: // alarm 2 //INFO("RTC: write alarm 2\n"); break; case 6: // clock adjust //INFO("RTC: write clock adjust\n"); rtc.regAdjustment = rtc.data[0]; break; case 7: // free register //INFO("RTC: write free register\n"); rtc.regFree = rtc.data[0]; break; } } void rtcInit() { memset(&rtc, 0, sizeof(rtc)); memcpy(&rtc.cmdBitsSize[0],kDefaultCmdBitsSize,8); rtc.regStatus1 |= 0x02; } u16 rtcRead() { //INFO("MMU Read RTC 0x%02X (%03i)\n", rtc._REG, rtc.bitsCount); return (rtc._REG); } void rtcWrite(u16 val) { //INFO("MMU Write RTC 0x%02X (%03i)\n", val, rtc.bitsCount); rtc._DD = (val & 0x10) >> 4; rtc._SIO = rtc._DD?(val & 0x01):rtc._prevSIO; rtc._SCK = (val & 0x20)?((val & 0x02) >> 1):rtc._prevSCK; rtc._CS = (val & 0x40)?((val & 0x04) >> 2):rtc._prevCS; switch (rtc.cmdStat) { case 0: if ( (!rtc._prevCS) && (rtc._prevSCK) && (rtc._CS) && (rtc._SCK) ) { rtc.cmdStat = 1; rtc.bitsCount = 0; rtc.cmd = 0; } break; case 1: if (!rtc._CS) { rtc.cmdStat = 0; break; } if (rtc._SCK && rtc._DD) break; if (!rtc._SCK && !rtc._DD) break; rtc.cmd |= (rtc._SIO << rtc.bitsCount ); rtc.bitsCount ++; if (rtc.bitsCount == 8) { //INFO("RTC command 0x%02X\n", rtc.cmd); // Little-endian command if((rtc.cmd & 0x0F) == 0x06) { u8 tmp = rtc.cmd; rtc.cmd = ((tmp & 0x80) >> 7) | ((tmp & 0x40) >> 5) | ((tmp & 0x20) >> 3) | ((tmp & 0x10) >> 1); } // Big-endian command else { rtc.cmd &= 0x0F; } if((rtc._prevSCK) && (!rtc._SCK)) { rtc.bitsCount = 0; if ((rtc.cmd >> 1) == 0x04) { if ((rtc.regStatus2 & 0x0F) == 0x04) rtc.cmdBitsSize[rtc.cmd >> 1] = 24; else rtc.cmdBitsSize[rtc.cmd >> 1] = 8; } if (rtc.cmd & 0x01) { rtc.cmdStat = 4; rtcRecv(); } else { rtc.cmdStat = 3; } } } break; case 3: // write: if( (rtc._prevSCK) && (!rtc._SCK) ) { if(rtc._SIO) rtc.data[rtc.bitsCount >> 3] |= (1 << (rtc.bitsCount & 0x07)); rtc.bitsCount++; if (rtc.bitsCount == rtc.cmdBitsSize[rtc.cmd >> 1]) { rtcSend(); rtc.cmdStat = 0; } } break; case 4: // read: if( (rtc._prevSCK) && (!rtc._SCK) ) { rtc._REG = val; if((rtc.data[(rtc.bitsCount >> 3)] >> (rtc.bitsCount & 0x07)) & 0x01) rtc._REG |= 0x01; else rtc._REG &= ~0x01; rtc.bitsCount++; if (rtc.bitsCount == rtc.cmdBitsSize[rtc.cmd >> 1] || (!(val & 0x04))) rtc.cmdStat = 0; } break; } rtc._prevSIO = rtc._SIO; rtc._prevSCK = rtc._SCK; rtc._prevCS = rtc._CS; } desmume-0.9.9/src/matrix.h0000644000175000017500000002373112140261633016172 0ustar guillaumeguillaume/* Copyright (C) 2006-2007 shash Copyright (C) 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef MATRIX_H #define MATRIX_H #include #include #include "types.h" #include "mem.h" #ifdef ENABLE_SSE #include #endif #ifdef ENABLE_SSE2 #include #endif struct MatrixStack { MatrixStack(int size, int type); s32 *matrix; s32 position; s32 size; u8 type; }; void MatrixInit (float *matrix); void MatrixInit (s32 *matrix); //In order to conditionally use these asm optimized functions in visual studio //without having to make new build types to exclude the assembly files. //a bit sloppy, but there aint much to it float MatrixGetMultipliedIndex (int index, float *matrix, float *rightMatrix); s32 MatrixGetMultipliedIndex (int index, s32 *matrix, s32 *rightMatrix); void MatrixSet (s32 *matrix, int x, int y, s32 value); void MatrixCopy (s32 * matrixDST, const s32 * matrixSRC); int MatrixCompare (const s32 * matrixDST, const float * matrixSRC); void MatrixIdentity (s32 *matrix); void MatrixStackInit (MatrixStack *stack); void MatrixStackSetMaxSize (MatrixStack *stack, int size); void MatrixStackPushMatrix (MatrixStack *stack, const s32 *ptr); void MatrixStackPopMatrix (s32 *mtxCurr, MatrixStack *stack, int size); s32* MatrixStackGetPos (MatrixStack *stack, int pos); s32* MatrixStackGet (MatrixStack *stack); void MatrixStackLoadMatrix (MatrixStack *stack, int pos, const s32 *ptr); void Vector2Copy(float *dst, const float *src); void Vector2Add(float *dst, const float *src); void Vector2Subtract(float *dst, const float *src); float Vector2Dot(const float *a, const float *b); float Vector2Cross(const float *a, const float *b); float Vector3Dot(const float *a, const float *b); void Vector3Cross(float* dst, const float *a, const float *b); float Vector3Length(const float *a); void Vector3Add(float *dst, const float *src); void Vector3Subtract(float *dst, const float *src); void Vector3Scale(float *dst, const float scale); void Vector3Copy(float *dst, const float *src); void Vector3Normalize(float *dst); void Vector4Copy(float *dst, const float *src); //these functions are an unreliable, inaccurate floor. //it should only be used for positive numbers //this isnt as fast as it could be if we used a visual c++ intrinsic, but those appear not to be universally available FORCEINLINE u32 u32floor(float f) { #ifdef ENABLE_SSE2 return (u32)_mm_cvtt_ss2si(_mm_set_ss(f)); #else return (u32)f; #endif } FORCEINLINE u32 u32floor(double d) { #ifdef ENABLE_SSE2 return (u32)_mm_cvttsd_si32(_mm_set_sd(d)); #else return (u32)d; #endif } //same as above but works for negative values too. //be sure that the results are the same thing as floorf! FORCEINLINE s32 s32floor(float f) { #ifdef ENABLE_SSE2 return _mm_cvtss_si32( _mm_add_ss(_mm_set_ss(-0.5f),_mm_add_ss(_mm_set_ss(f), _mm_set_ss(f))) ) >> 1; #else return (s32)floorf(f); #endif } FORCEINLINE s32 s32floor(double d) { return s32floor((float)d); } //switched SSE2 functions //------------- #ifdef ENABLE_SSE2 template FORCEINLINE void memset_u16_le(void* dst, u16 val) { u32 u32val; //just for the endian safety T1WriteWord((u8*)&u32val,0,val); T1WriteWord((u8*)&u32val,2,val); ////const __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val); #if defined(__GNUC__) || defined(__INTEL_COMPILER) const __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val); MACRODO_N(NUM/8,_mm_store_si128((__m128i*)((u8*)dst+(X)*16), temp)); #else __m128 temp; temp.m128_i32[0] = u32val; //MACRODO_N(NUM/8,_mm_store_si128((__m128i*)((u8*)dst+(X)*16), temp)); MACRODO_N(NUM/8,_mm_store_ps1((float*)((u8*)dst+(X)*16), temp)); #endif } #else //no sse2 template static FORCEINLINE void memset_u16_le(void* dst, u16 val) { for(int i=0;i FORCEINLINE void vector_fix2float(float* matrix, const float divisor) { CTASSERT(NUM_ROWS==3 || NUM_ROWS==4); const __m128 val = _mm_set_ps1(divisor); _mm_store_ps(matrix,_mm_div_ps(_mm_load_ps(matrix),val)); _mm_store_ps(matrix+4,_mm_div_ps(_mm_load_ps(matrix+4),val)); _mm_store_ps(matrix+8,_mm_div_ps(_mm_load_ps(matrix+8),val)); if(NUM_ROWS==4) _mm_store_ps(matrix+12,_mm_div_ps(_mm_load_ps(matrix+12),val)); } //WARNING: I do not think this is as fast as a memset, for some reason. //at least in vc2005 with sse enabled. better figure out why before using it template static FORCEINLINE void memset_u8(void* _dst, u8 val) { memset(_dst,val,NUM); //const u8* dst = (u8*)_dst; //u32 u32val = (val<<24)|(val<<16)|(val<<8)|val; //const __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val); //MACRODO_N(NUM/16,_mm_store_si128((__m128i*)(dst+(X)*16), temp)); } #else //no sse void MatrixMultVec4x4 (const float *matrix, float *vecPtr); void MatrixMultVec3x3(const float * matrix, float * vecPtr); void MatrixMultiply(float * matrix, const float * rightMatrix); void MatrixTranslate(float *matrix, const float *ptr); void MatrixScale(float * matrix, const float * ptr); FORCEINLINE void MatrixMultVec4x4_M2(const float *matrix, float *vecPtr) { //there are hardly any gains from merging these manually MatrixMultVec4x4(matrix+16,vecPtr); MatrixMultVec4x4(matrix,vecPtr); } template FORCEINLINE void vector_fix2float(float* matrix, const float divisor) { for(int i=0;i static FORCEINLINE void memset_u8(void* dst, u8 val) { memset(dst,val,NUM); } #endif //switched SSE functions void MatrixMultVec4x4 (const s32 *matrix, s32 *vecPtr); void MatrixMultVec4x4_M2(const s32 *matrix, s32 *vecPtr); void MatrixMultiply(s32* matrix, const s32* rightMatrix); void MatrixScale(s32 *matrix, const s32 *ptr); void MatrixTranslate(s32 *matrix, const s32 *ptr); #endif desmume-0.9.9/src/SPU.cpp0000644000175000017500000014123212140261633015665 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006 Theo Berkau Copyright (C) 2008-2012 DeSmuME team Ideas borrowed from Stephane Dallongeville's SCSP core This file 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 file 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 the this software. If not, see . */ #define _USE_MATH_DEFINES #include #ifndef M_PI #define M_PI 3.1415926535897932386 #endif #include #include #include #include #include "debug.h" #include "MMU.h" #include "SPU.h" #include "mem.h" #include "readwrite.h" #include "armcpu.h" #include "NDSSystem.h" #include "matrix.h" static inline s16 read16(u32 addr) { return (s16)_MMU_read16(addr); } static inline u8 read08(u32 addr) { return _MMU_read08(addr); } static inline s8 read_s8(u32 addr) { return (s8)_MMU_read08(addr); } #define K_ADPCM_LOOPING_RECOVERY_INDEX 99999 #define COSINE_INTERPOLATION_RESOLUTION 8192 //#ifdef FASTBUILD #undef FORCEINLINE #define FORCEINLINE //#endif //static ISynchronizingAudioBuffer* synchronizer = metaspu_construct(ESynchMethod_Z); static ISynchronizingAudioBuffer* synchronizer = metaspu_construct(ESynchMethod_N); SPU_struct *SPU_core = 0; SPU_struct *SPU_user = 0; int SPU_currentCoreNum = SNDCORE_DUMMY; static int volume = 100; static size_t buffersize = 0; static ESynchMode synchmode = ESynchMode_DualSynchAsynch; static ESynchMethod synchmethod = ESynchMethod_N; static int SNDCoreId=-1; static SoundInterface_struct *SNDCore=NULL; extern SoundInterface_struct *SNDCoreList[]; //const int shift = (FORMAT == 0 ? 2 : 1); static const int format_shift[] = { 2, 1, 3, 0 }; static const s8 indextbl[8] = { -1, -1, -1, -1, 2, 4, 6, 8 }; static const u16 adpcmtbl[89] = { 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x0010, 0x0011, 0x0013, 0x0015, 0x0017, 0x0019, 0x001C, 0x001F, 0x0022, 0x0025, 0x0029, 0x002D, 0x0032, 0x0037, 0x003C, 0x0042, 0x0049, 0x0050, 0x0058, 0x0061, 0x006B, 0x0076, 0x0082, 0x008F, 0x009D, 0x00AD, 0x00BE, 0x00D1, 0x00E6, 0x00FD, 0x0117, 0x0133, 0x0151, 0x0173, 0x0198, 0x01C1, 0x01EE, 0x0220, 0x0256, 0x0292, 0x02D4, 0x031C, 0x036C, 0x03C3, 0x0424, 0x048E, 0x0502, 0x0583, 0x0610, 0x06AB, 0x0756, 0x0812, 0x08E0, 0x09C3, 0x0ABD, 0x0BD0, 0x0CFF, 0x0E4C, 0x0FBA, 0x114C, 0x1307, 0x14EE, 0x1706, 0x1954, 0x1BDC, 0x1EA5, 0x21B6, 0x2515, 0x28CA, 0x2CDF, 0x315B, 0x364B, 0x3BB9, 0x41B2, 0x4844, 0x4F7E, 0x5771, 0x602F, 0x69CE, 0x7462, 0x7FFF }; static const s16 wavedutytbl[8][8] = { { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF }, { -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF } }; static s32 precalcdifftbl[89][16]; static u8 precalcindextbl[89][8]; static double cos_lut[COSINE_INTERPOLATION_RESOLUTION]; static const double ARM7_CLOCK = 33513982; static const double samples_per_hline = (DESMUME_SAMPLE_RATE / 59.8261f) / 263.0f; static double samples = 0; template static FORCEINLINE T MinMax(T val, T min, T max) { if (val < min) return min; else if (val > max) return max; return val; } //--------------external spu interface--------------- int SPU_ChangeSoundCore(int coreid, int buffersize) { int i; ::buffersize = buffersize; delete SPU_user; SPU_user = NULL; // Make sure the old core is freed if (SNDCore) SNDCore->DeInit(); // So which core do we want? if (coreid == SNDCORE_DEFAULT) coreid = 0; // Assume we want the first one SPU_currentCoreNum = coreid; // Go through core list and find the id for (i = 0; SNDCoreList[i] != NULL; i++) { if (SNDCoreList[i]->id == coreid) { // Set to current core SNDCore = SNDCoreList[i]; break; } } SNDCoreId = coreid; //If the user picked the dummy core, disable the user spu if(SNDCore == &SNDDummy) return 0; //If the core wasnt found in the list for some reason, disable the user spu if (SNDCore == NULL) return -1; // Since it failed, instead of it being fatal, disable the user spu if (SNDCore->Init(buffersize * 2) == -1) { SNDCore = 0; return -1; } SNDCore->SetVolume(volume); SPU_SetSynchMode(synchmode,synchmethod); return 0; } SoundInterface_struct *SPU_SoundCore() { return SNDCore; } void SPU_ReInit() { SPU_Init(SNDCoreId, buffersize); } int SPU_Init(int coreid, int buffersize) { int i, j; // Build the cosine interpolation LUT for(unsigned int i = 0; i < COSINE_INTERPOLATION_RESOLUTION; i++) cos_lut[i] = (1.0 - cos(((double)i/(double)COSINE_INTERPOLATION_RESOLUTION) * M_PI)) * 0.5; SPU_core = new SPU_struct((int)ceil(samples_per_hline)); SPU_Reset(); //create adpcm decode accelerator lookups for(i = 0; i < 16; i++) { for(j = 0; j < 89; j++) { precalcdifftbl[j][i] = (((i & 0x7) * 2 + 1) * adpcmtbl[j] / 8); if(i & 0x8) precalcdifftbl[j][i] = -precalcdifftbl[j][i]; } } for(i = 0; i < 8; i++) { for(j = 0; j < 89; j++) { precalcindextbl[j][i] = MinMax((j + indextbl[i]), 0, 88); } } return SPU_ChangeSoundCore(coreid, buffersize); } void SPU_Pause(int pause) { if (SNDCore == NULL) return; if(pause) SNDCore->MuteAudio(); else SNDCore->UnMuteAudio(); } void SPU_CloneUser() { if(SPU_user) { memcpy(SPU_user->channels,SPU_core->channels,sizeof(SPU_core->channels)); SPU_user->regs = SPU_core->regs; } } void SPU_SetSynchMode(int mode, int method) { synchmode = (ESynchMode)mode; if(synchmethod != (ESynchMethod)method) { synchmethod = (ESynchMethod)method; delete synchronizer; //grr does this need to be locked? spu might need a lock method // or maybe not, maybe the platform-specific code that calls this function can deal with it. synchronizer = metaspu_construct(synchmethod); } delete SPU_user; SPU_user = NULL; if(synchmode == ESynchMode_DualSynchAsynch) { SPU_user = new SPU_struct(buffersize); SPU_CloneUser(); } } void SPU_ClearOutputBuffer() { if(SNDCore && SNDCore->ClearBuffer) SNDCore->ClearBuffer(); } void SPU_SetVolume(int volume) { ::volume = volume; if (SNDCore) SNDCore->SetVolume(volume); } void SPU_Reset(void) { int i; SPU_core->reset(); if(SPU_user) { if(SNDCore) { SNDCore->DeInit(); SNDCore->Init(SPU_user->bufsize*2); SNDCore->SetVolume(volume); } SPU_user->reset(); } //zero - 09-apr-2010: this concerns me, regarding savestate synch. //After 0.9.6, lets experiment with removing it and just properly zapping the spu instead // Reset Registers for (i = 0x400; i < 0x51D; i++) T1WriteByte(MMU.ARM7_REG, i, 0); samples = 0; } //------------------------------------------ void SPU_struct::reset() { memset(sndbuf,0,bufsize*2*4); memset(outbuf,0,bufsize*2*2); memset((void *)channels, 0, sizeof(channel_struct) * 16); reconstruct(®s); for(int i = 0; i < 16; i++) { channels[i].num = i; } } SPU_struct::SPU_struct(int buffersize) : bufpos(0) , buflength(0) , sndbuf(0) , outbuf(0) , bufsize(buffersize) { sndbuf = new s32[buffersize*2]; outbuf = new s16[buffersize*2]; reset(); } SPU_struct::~SPU_struct() { if(sndbuf) delete[] sndbuf; if(outbuf) delete[] outbuf; } void SPU_DeInit(void) { if(SNDCore) SNDCore->DeInit(); SNDCore = 0; delete SPU_core; SPU_core=0; delete SPU_user; SPU_user=0; } ////////////////////////////////////////////////////////////////////////////// void SPU_struct::ShutUp() { for(int i=0;i<16;i++) channels[i].status = CHANSTAT_STOPPED; } static FORCEINLINE void adjust_channel_timer(channel_struct *chan) { chan->sampinc = (((double)ARM7_CLOCK) / (DESMUME_SAMPLE_RATE * 2)) / (double)(0x10000 - chan->timer); } void SPU_struct::KeyProbe(int chan_num) { channel_struct &thischan = channels[chan_num]; if(thischan.status == CHANSTAT_STOPPED) { if(thischan.keyon && regs.masteren) KeyOn(chan_num); } else if(thischan.status == CHANSTAT_PLAY) { if(!thischan.keyon || !regs.masteren) KeyOff(chan_num); } } void SPU_struct::KeyOff(int channel) { //printf("keyoff%d\n",channel); channel_struct &thischan = channels[channel]; thischan.status = CHANSTAT_STOPPED; } void SPU_struct::KeyOn(int channel) { channel_struct &thischan = channels[channel]; thischan.status = CHANSTAT_PLAY; thischan.totlength = thischan.length + thischan.loopstart; adjust_channel_timer(&thischan); //printf("keyon %d totlength:%d\n",channel,thischan.totlength); //LOG("Channel %d key on: vol = %d, datashift = %d, hold = %d, pan = %d, waveduty = %d, repeat = %d, format = %d, source address = %07X," // "timer = %04X, loop start = %04X, length = %06X, MMU.ARM7_REG[0x501] = %02X\n", channel, chan->vol, chan->datashift, chan->hold, // chan->pan, chan->waveduty, chan->repeat, chan->format, chan->addr, chan->timer, chan->loopstart, chan->length, T1ReadByte(MMU.ARM7_REG, 0x501)); switch(thischan.format) { case 0: // 8-bit // thischan.loopstart = thischan.loopstart << 2; // thischan.length = (thischan.length << 2) + thischan.loopstart; thischan.sampcnt = -3; break; case 1: // 16-bit // thischan.loopstart = thischan.loopstart << 1; // thischan.length = (thischan.length << 1) + thischan.loopstart; thischan.sampcnt = -3; break; case 2: // ADPCM { thischan.pcm16b = (s16)read16(thischan.addr); thischan.pcm16b_last = thischan.pcm16b; thischan.index = read08(thischan.addr + 2) & 0x7F;; thischan.lastsampcnt = 7; thischan.sampcnt = -3; thischan.loop_index = K_ADPCM_LOOPING_RECOVERY_INDEX; // thischan.loopstart = thischan.loopstart << 3; // thischan.length = (thischan.length << 3) + thischan.loopstart; break; } case 3: // PSG { thischan.sampcnt = -1; thischan.x = 0x7FFF; break; } default: break; } thischan.double_totlength_shifted = (double)(thischan.totlength << format_shift[thischan.format]); if(thischan.format != 3) { if(thischan.double_totlength_shifted == 0) { printf("INFO: Stopping channel %d due to zero length\n",channel); thischan.status = CHANSTAT_STOPPED; } } } ////////////////////////////////////////////////////////////////////////////// #define SETBYTE(which,oldval,newval) oldval = (oldval & (~(0xFF<<(which*8)))) | ((newval)<<(which*8)) #define GETBYTE(which,val) ((val>>(which*8))&0xFF) u8 SPU_ReadByte(u32 addr) { addr &= 0xFFF; return SPU_core->ReadByte(addr); } u16 SPU_ReadWord(u32 addr) { addr &= 0xFFF; return SPU_core->ReadWord(addr); } u32 SPU_ReadLong(u32 addr) { addr &= 0xFFF; return SPU_core->ReadLong(addr); } u16 SPU_struct::ReadWord(u32 addr) { return ReadByte(addr)|(ReadByte(addr+1)<<8); } u32 SPU_struct::ReadLong(u32 addr) { return ReadByte(addr)|(ReadByte(addr+1)<<8)|(ReadByte(addr+2)<<16)|(ReadByte(addr+3)<<24); } u8 SPU_struct::ReadByte(u32 addr) { switch(addr) { //SOUNDCNT case 0x500: return regs.mastervol; case 0x501: return (regs.ctl_left)|(regs.ctl_right<<2)|(regs.ctl_ch1bypass<<4)|(regs.ctl_ch3bypass<<5)|(regs.masteren<<7); case 0x502: return 0; case 0x503: return 0; //SOUNDBIAS case 0x504: return regs.soundbias&0xFF; case 0x505: return (regs.soundbias>>8)&0xFF; case 0x506: return 0; case 0x507: return 0; //SNDCAP0CNT/SNDCAP1CNT case 0x508: case 0x509: { u32 which = addr-0x508; return regs.cap[which].add | (regs.cap[which].source<<1) | (regs.cap[which].oneshot<<2) | (regs.cap[which].bits8<<3) //| (regs.cap[which].active<<7); //? which is right? need test | (regs.cap[which].runtime.running<<7); } //SNDCAP0DAD case 0x510: return GETBYTE(0,regs.cap[0].dad); case 0x511: return GETBYTE(1,regs.cap[0].dad); case 0x512: return GETBYTE(2,regs.cap[0].dad); case 0x513: return GETBYTE(3,regs.cap[0].dad); //SNDCAP0LEN case 0x514: return GETBYTE(0,regs.cap[0].len); case 0x515: return GETBYTE(1,regs.cap[0].len); case 0x516: return 0; //not used case 0x517: return 0; //not used //SNDCAP1DAD case 0x518: return GETBYTE(0,regs.cap[1].dad); case 0x519: return GETBYTE(1,regs.cap[1].dad); case 0x51A: return GETBYTE(2,regs.cap[1].dad); case 0x51B: return GETBYTE(3,regs.cap[1].dad); //SNDCAP1LEN case 0x51C: return GETBYTE(0,regs.cap[1].len); case 0x51D: return GETBYTE(1,regs.cap[1].len); case 0x51E: return 0; //not used case 0x51F: return 0; //not used default: { //individual channel regs u32 chan_num = (addr >> 4) & 0xF; if(chan_num>0xF) return 0; channel_struct &thischan=channels[chan_num]; switch(addr & 0xF) { case 0x0: return thischan.vol; case 0x1: { u8 ret = thischan.datashift; if(ret==4) ret=3; ret |= thischan.hold<<7; return ret; } case 0x2: return thischan.pan; case 0x3: return thischan.waveduty|(thischan.repeat<<3)|(thischan.format<<5)|((thischan.status == CHANSTAT_PLAY)?0x80:0); case 0x4: return 0; //return GETBYTE(0,thischan.addr); //not readable case 0x5: return 0; //return GETBYTE(1,thischan.addr); //not readable case 0x6: return 0; //return GETBYTE(2,thischan.addr); //not readable case 0x7: return 0; //return GETBYTE(3,thischan.addr); //not readable case 0x8: return GETBYTE(0,thischan.timer); case 0x9: return GETBYTE(1,thischan.timer); case 0xA: return GETBYTE(0,thischan.loopstart); case 0xB: return GETBYTE(1,thischan.loopstart); case 0xC: return 0; //return GETBYTE(0,thischan.length); //not readable case 0xD: return 0; //return GETBYTE(1,thischan.length); //not readable case 0xE: return 0; //return GETBYTE(2,thischan.length); //not readable case 0xF: return 0; //return GETBYTE(3,thischan.length); //not readable default: return 0; //impossible } //switch on individual channel regs } //default case } //switch on address } SPUFifo::SPUFifo() { reset(); } void SPUFifo::reset() { head = tail = size = 0; } void SPUFifo::enqueue(s16 val) { if(size==16) return; buffer[tail] = val; tail++; tail &= 15; size++; } s16 SPUFifo::dequeue() { if(size==0) return 0; head++; head &= 15; s16 ret = buffer[head]; size--; return ret; } void SPUFifo::save(EMUFILE* fp) { u32 version = 1; write32le(version,fp); write32le(head,fp); write32le(tail,fp); write32le(size,fp); for(int i=0;i<16;i++) write16le(buffer[i],fp); } bool SPUFifo::load(EMUFILE* fp) { u32 version; if(read32le(&version,fp) != 1) return false; read32le(&head,fp); read32le(&tail,fp); read32le(&size,fp); for(int i=0;i<16;i++) read16le(&buffer[i],fp); return true; } void SPU_struct::ProbeCapture(int which) { //VERY UNTESTED -- HOW MUCH OF THIS RESETS, AND WHEN? if(!regs.cap[which].active) { regs.cap[which].runtime.running = 0; return; } REGS::CAP &cap = regs.cap[which]; cap.runtime.running = 1; cap.runtime.curdad = cap.dad; u32 len = cap.len; if(len==0) len=1; cap.runtime.maxdad = cap.dad + len*4; cap.runtime.sampcnt = 0; cap.runtime.fifo.reset(); } void SPU_struct::WriteByte(u32 addr, u8 val) { switch(addr) { //SOUNDCNT case 0x500: regs.mastervol = val&0x7F; break; case 0x501: regs.ctl_left = (val>>0)&3; regs.ctl_right = (val>>2)&3; regs.ctl_ch1bypass = (val>>4)&1; regs.ctl_ch3bypass = (val>>5)&1; regs.masteren = (val>>7)&1; for(int i=0;i<16;i++) KeyProbe(i); break; case 0x502: break; //not used case 0x503: break; //not used //SOUNDBIAS case 0x504: SETBYTE(0,regs.soundbias, val); break; case 0x505: SETBYTE(1,regs.soundbias, val&3); break; case 0x506: break; //these dont answer anyway case 0x507: break; //these dont answer anyway //SNDCAP0CNT/SNDCAP1CNT case 0x508: case 0x509: { u32 which = addr-0x508; regs.cap[which].add = BIT0(val); regs.cap[which].source = BIT1(val); regs.cap[which].oneshot = BIT2(val); regs.cap[which].bits8 = BIT3(val); regs.cap[which].active = BIT7(val); ProbeCapture(which); break; } //SNDCAP0DAD case 0x510: SETBYTE(0,regs.cap[0].dad,val); break; case 0x511: SETBYTE(1,regs.cap[0].dad,val); break; case 0x512: SETBYTE(2,regs.cap[0].dad,val); break; case 0x513: SETBYTE(3,regs.cap[0].dad,val&7); break; //SNDCAP0LEN case 0x514: SETBYTE(0,regs.cap[0].len,val); break; case 0x515: SETBYTE(1,regs.cap[0].len,val); break; case 0x516: break; //not used case 0x517: break; //not used //SNDCAP1DAD case 0x518: SETBYTE(0,regs.cap[1].dad,val); break; case 0x519: SETBYTE(1,regs.cap[1].dad,val); break; case 0x51A: SETBYTE(2,regs.cap[1].dad,val); break; case 0x51B: SETBYTE(3,regs.cap[1].dad,val&7); break; //SNDCAP1LEN case 0x51C: SETBYTE(0,regs.cap[1].len,val); break; case 0x51D: SETBYTE(1,regs.cap[1].len,val); break; case 0x51E: break; //not used case 0x51F: break; //not used default: { //individual channel regs u32 chan_num = (addr >> 4) & 0xF; if(chan_num>0xF) break; channel_struct &thischan=channels[chan_num]; switch(addr & 0xF) { case 0x0: thischan.vol = val & 0x7F; break; case 0x1: thischan.datashift = val & 0x3; if (thischan.datashift == 3) thischan.datashift = 4; thischan.hold = (val >> 7) & 0x1; break; case 0x2: thischan.pan = val & 0x7F; break; case 0x3: thischan.waveduty = val & 0x7; thischan.repeat = (val >> 3) & 0x3; thischan.format = (val >> 5) & 0x3; thischan.keyon = BIT7(val); KeyProbe(chan_num); break; case 0x4: SETBYTE(0,thischan.addr,val); break; case 0x5: SETBYTE(1,thischan.addr,val); break; case 0x6: SETBYTE(2,thischan.addr,val); break; case 0x7: SETBYTE(3,thischan.addr,val&0x7); break; //only 27 bits of this register are used case 0x8: SETBYTE(0,thischan.timer,val); adjust_channel_timer(&thischan); break; case 0x9: SETBYTE(1,thischan.timer,val); adjust_channel_timer(&thischan); break; case 0xA: SETBYTE(0,thischan.loopstart,val); break; case 0xB: SETBYTE(1,thischan.loopstart,val); break; case 0xC: SETBYTE(0,thischan.length,val); break; case 0xD: SETBYTE(1,thischan.length,val); break; case 0xE: SETBYTE(2,thischan.length,val & 0x3F); break; //only 22 bits of this register are used case 0xF: SETBYTE(3,thischan.length,0); break; } //switch on individual channel regs } //default case } //switch on address } void SPU_WriteByte(u32 addr, u8 val) { //printf("%08X: chan:%02X reg:%02X val:%02X\n",addr,(addr>>4)&0xF,addr&0xF,val); addr &= 0xFFF; SPU_core->WriteByte(addr,val); if(SPU_user) SPU_user->WriteByte(addr,val); } ////////////////////////////////////////////////////////////////////////////// void SPU_struct::WriteWord(u32 addr, u16 val) { WriteByte(addr,val&0xFF); WriteByte(addr+1,(val>>8)&0xFF); } void SPU_WriteWord(u32 addr, u16 val) { //printf("%08X: chan:%02X reg:%02X val:%04X\n",addr,(addr>>4)&0xF,addr&0xF,val); addr &= 0xFFF; SPU_core->WriteWord(addr,val); if(SPU_user) SPU_user->WriteWord(addr,val); } ////////////////////////////////////////////////////////////////////////////// void SPU_struct::WriteLong(u32 addr, u32 val) { WriteByte(addr,val&0xFF); WriteByte(addr+1,(val>>8)&0xFF); WriteByte(addr+2,(val>>16)&0xFF); WriteByte(addr+3,(val>>24)&0xFF); } void SPU_WriteLong(u32 addr, u32 val) { //printf("%08X: chan:%02X reg:%02X val:%08X\n",addr,(addr>>4)&0xF,addr&0xF,val); addr &= 0xFFF; SPU_core->WriteLong(addr,val); if(SPU_user) SPU_user->WriteLong(addr,val); } ////////////////////////////////////////////////////////////////////////////// template static FORCEINLINE s32 Interpolate(s32 a, s32 b, double ratio) { double sampleA = (double)a; double sampleB = (double)b; ratio = ratio - sputrunc(ratio); switch (INTERPOLATE_MODE) { case SPUInterpolation_Cosine: // Cosine Interpolation Formula: // ratio2 = (1 - cos(ratio * M_PI)) / 2 // sampleI = sampleA * (1 - ratio2) + sampleB * ratio2 return s32floor((cos_lut[(unsigned int)(ratio * (double)COSINE_INTERPOLATION_RESOLUTION)] * (sampleB - sampleA)) + sampleA); break; case SPUInterpolation_Linear: // Linear Interpolation Formula: // sampleI = sampleA * (1 - ratio) + sampleB * ratio return s32floor((ratio * (sampleB - sampleA)) + sampleA); break; default: break; } return a; } ////////////////////////////////////////////////////////////////////////////// template static FORCEINLINE void Fetch8BitData(channel_struct *chan, s32 *data) { if (chan->sampcnt < 0) { *data = 0; return; } u32 loc = sputrunc(chan->sampcnt); if(INTERPOLATE_MODE != SPUInterpolation_None) { s32 a = (s32)(read_s8(chan->addr + loc) << 8); if(loc < (chan->totlength << 2) - 1) { s32 b = (s32)(read_s8(chan->addr + loc + 1) << 8); a = Interpolate(a, b, chan->sampcnt); } *data = a; } else *data = (s32)read_s8(chan->addr + loc)<< 8; } template static FORCEINLINE void Fetch16BitData(const channel_struct * const chan, s32 *data) { if (chan->sampcnt < 0) { *data = 0; return; } if(INTERPOLATE_MODE != SPUInterpolation_None) { u32 loc = sputrunc(chan->sampcnt); s32 a = (s32)read16(loc*2 + chan->addr), b; if(loc < (chan->totlength << 1) - 1) { b = (s32)read16(loc*2 + chan->addr + 2); a = Interpolate(a, b, chan->sampcnt); } *data = a; } else *data = read16(chan->addr + sputrunc(chan->sampcnt)*2); } template static FORCEINLINE void FetchADPCMData(channel_struct * const chan, s32 * const data) { if (chan->sampcnt < 8) { *data = 0; return; } // No sense decoding, just return the last sample if (chan->lastsampcnt != sputrunc(chan->sampcnt)){ const u32 endExclusive = sputrunc(chan->sampcnt+1); for (u32 i = chan->lastsampcnt+1; i < endExclusive; i++) { const u32 shift = (i&1)<<2; const u32 data4bit = ((u32)read08(chan->addr + (i>>1))) >> shift; const s32 diff = precalcdifftbl[chan->index][data4bit & 0xF]; chan->index = precalcindextbl[chan->index][data4bit & 0x7]; chan->pcm16b_last = chan->pcm16b; chan->pcm16b = MinMax(chan->pcm16b+diff, -0x8000, 0x7FFF); if(i == (chan->loopstart<<3)) { if(chan->loop_index != K_ADPCM_LOOPING_RECOVERY_INDEX) printf("over-snagging\n"); chan->loop_pcm16b = chan->pcm16b; chan->loop_index = chan->index; } } chan->lastsampcnt = sputrunc(chan->sampcnt); } if(INTERPOLATE_MODE != SPUInterpolation_None) *data = Interpolate((s32)chan->pcm16b_last,(s32)chan->pcm16b,chan->sampcnt); else *data = (s32)chan->pcm16b; } static FORCEINLINE void FetchPSGData(channel_struct *chan, s32 *data) { if (chan->sampcnt < 0) { *data = 0; return; } if(chan->num < 8) { *data = 0; } else if(chan->num < 14) { *data = (s32)wavedutytbl[chan->waveduty][(sputrunc(chan->sampcnt)) & 0x7]; } else { if(chan->lastsampcnt == sputrunc(chan->sampcnt)) { *data = (s32)chan->psgnoise_last; return; } u32 max = sputrunc(chan->sampcnt); for(u32 i = chan->lastsampcnt; i < max; i++) { if(chan->x & 0x1) { chan->x = (chan->x >> 1) ^ 0x6000; chan->psgnoise_last = -0x7FFF; } else { chan->x >>= 1; chan->psgnoise_last = 0x7FFF; } } chan->lastsampcnt = sputrunc(chan->sampcnt); *data = (s32)chan->psgnoise_last; } } ////////////////////////////////////////////////////////////////////////////// static FORCEINLINE void MixL(SPU_struct* SPU, channel_struct *chan, s32 data) { data = spumuldiv7(data, chan->vol) >> chan->datashift; SPU->sndbuf[SPU->bufpos<<1] += data; } static FORCEINLINE void MixR(SPU_struct* SPU, channel_struct *chan, s32 data) { data = spumuldiv7(data, chan->vol) >> chan->datashift; SPU->sndbuf[(SPU->bufpos<<1)+1] += data; } static FORCEINLINE void MixLR(SPU_struct* SPU, channel_struct *chan, s32 data) { data = spumuldiv7(data, chan->vol) >> chan->datashift; SPU->sndbuf[SPU->bufpos<<1] += spumuldiv7(data, 127 - chan->pan); SPU->sndbuf[(SPU->bufpos<<1)+1] += spumuldiv7(data, chan->pan); } ////////////////////////////////////////////////////////////////////////////// template static FORCEINLINE void TestForLoop(SPU_struct *SPU, channel_struct *chan) { const int shift = (FORMAT == 0 ? 2 : 1); chan->sampcnt += chan->sampinc; if (chan->sampcnt > chan->double_totlength_shifted) { // Do we loop? Or are we done? if (chan->repeat == 1) { while (chan->sampcnt > chan->double_totlength_shifted) chan->sampcnt -= chan->double_totlength_shifted - (double)(chan->loopstart << shift); //chan->sampcnt = (double)(chan->loopstart << shift); } else { SPU->KeyOff(chan->num); SPU->bufpos = SPU->buflength; } } } static FORCEINLINE void TestForLoop2(SPU_struct *SPU, channel_struct *chan) { chan->sampcnt += chan->sampinc; if (chan->sampcnt > chan->double_totlength_shifted) { // Do we loop? Or are we done? if (chan->repeat == 1) { while (chan->sampcnt > chan->double_totlength_shifted) chan->sampcnt -= chan->double_totlength_shifted - (double)(chan->loopstart << 3); if(chan->loop_index == K_ADPCM_LOOPING_RECOVERY_INDEX) { chan->pcm16b = (s16)read16(chan->addr); chan->index = read08(chan->addr+2) & 0x7F; chan->lastsampcnt = 7; } else { chan->pcm16b = chan->loop_pcm16b; chan->index = chan->loop_index; chan->lastsampcnt = (chan->loopstart << 3); } } else { chan->status = CHANSTAT_STOPPED; SPU->KeyOff(chan->num); SPU->bufpos = SPU->buflength; } } } template FORCEINLINE static void SPU_Mix(SPU_struct* SPU, channel_struct *chan, s32 data) { switch(CHANNELS) { case 0: MixL(SPU, chan, data); break; case 1: MixLR(SPU, chan, data); break; case 2: MixR(SPU, chan, data); break; } SPU->lastdata = data; } //WORK template FORCEINLINE static void ____SPU_ChanUpdate(SPU_struct* const SPU, channel_struct* const chan) { for (; SPU->bufpos < SPU->buflength; SPU->bufpos++) { if(CHANNELS != -1) { s32 data; switch(FORMAT) { case 0: Fetch8BitData(chan, &data); break; case 1: Fetch16BitData(chan, &data); break; case 2: FetchADPCMData(chan, &data); break; case 3: FetchPSGData(chan, &data); break; } SPU_Mix(SPU, chan, data); } switch(FORMAT) { case 0: case 1: TestForLoop(SPU, chan); break; case 2: TestForLoop2(SPU, chan); break; case 3: chan->sampcnt += chan->sampinc; break; } } } template FORCEINLINE static void ___SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan) { if(!actuallyMix) ____SPU_ChanUpdate(SPU,chan); else if (chan->pan == 0) ____SPU_ChanUpdate(SPU,chan); else if (chan->pan == 127) ____SPU_ChanUpdate(SPU,chan); else ____SPU_ChanUpdate(SPU,chan); } template FORCEINLINE static void __SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan) { switch(chan->format) { case 0: ___SPU_ChanUpdate<0,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break; case 1: ___SPU_ChanUpdate<1,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break; case 2: ___SPU_ChanUpdate<2,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break; case 3: ___SPU_ChanUpdate<3,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break; default: assert(false); } } FORCEINLINE static void _SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan) { switch(CommonSettings.spuInterpolationMode) { case SPUInterpolation_None: __SPU_ChanUpdate(actuallyMix, SPU, chan); break; case SPUInterpolation_Linear: __SPU_ChanUpdate(actuallyMix, SPU, chan); break; case SPUInterpolation_Cosine: __SPU_ChanUpdate(actuallyMix, SPU, chan); break; default: assert(false); } } //ENTERNEW static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length) { //the advanced spu function correctly handles all sound control mixing options, as well as capture //this code is not entirely optimal, as it relies on sort of manhandling the core mixing functions //in order to get the results it needs. //THIS IS MAX HACKS!!!! //AND NEEDS TO BE REWRITTEN ALONG WITH THE DEEPEST PARTS OF THE SPU //ONCE WE KNOW THAT IT WORKS //BIAS gets ignored since our spu is still not bit perfect, //and it doesnt matter for purposes of capture //-----------DEBUG CODE bool skipcap = false; //----------------- s32 samp0[2]; //believe it or not, we are going to do this one sample at a time. //like i said, it is slower. for(int samp=0;sampsndbuf[0] = 0; SPU->sndbuf[1] = 0; SPU->buflength = 1; s32 capmix[2] = {0,0}; s32 mix[2] = {0,0}; s32 chanout[16]; s32 submix[32]; //generate each channel, and helpfully mix it at the same time for(int i=0;i<16;i++) { channel_struct *chan = &SPU->channels[i]; if (chan->status == CHANSTAT_PLAY) { SPU->bufpos = 0; bool bypass = false; if(i==1 && SPU->regs.ctl_ch1bypass) bypass=true; if(i==3 && SPU->regs.ctl_ch3bypass) bypass=true; //output to mixer unless we are bypassed. //dont output to mixer if the user muted us bool outputToMix = true; if(CommonSettings.spu_muteChannels[i]) outputToMix = false; if(bypass) outputToMix = false; bool outputToCap = outputToMix; if(CommonSettings.spu_captureMuted && !bypass) outputToCap = true; //channels 1 and 3 should probably always generate their audio //internally at least, just in case they get used by the spu output bool domix = outputToCap || outputToMix || i==1 || i==3; //clear the output buffer since this is where _SPU_ChanUpdate wants to accumulate things SPU->sndbuf[0] = SPU->sndbuf[1] = 0; //get channel's next output sample. _SPU_ChanUpdate(domix, SPU, chan); chanout[i] = SPU->lastdata >> chan->datashift; //save the panned results submix[i*2] = SPU->sndbuf[0]; submix[i*2+1] = SPU->sndbuf[1]; //send sample to our capture mix if(outputToCap) { capmix[0] += submix[i*2]; capmix[1] += submix[i*2+1]; } //send sample to our main mixer if(outputToMix) { mix[0] += submix[i*2]; mix[1] += submix[i*2+1]; } } else { chanout[i] = 0; submix[i*2] = 0; submix[i*2+1] = 0; } } //foreach channel s32 mixout[2] = {mix[0],mix[1]}; s32 capmixout[2] = {capmix[0],capmix[1]}; s32 sndout[2]; s32 capout[2]; //create SPU output switch(SPU->regs.ctl_left) { case SPU_struct::REGS::LOM_LEFT_MIXER: sndout[0] = mixout[0]; break; case SPU_struct::REGS::LOM_CH1: sndout[0] = submix[1*2+0]; break; case SPU_struct::REGS::LOM_CH3: sndout[0] = submix[3*2+0]; break; case SPU_struct::REGS::LOM_CH1_PLUS_CH3: sndout[0] = submix[1*2+0] + submix[3*2+0]; break; } switch(SPU->regs.ctl_right) { case SPU_struct::REGS::ROM_RIGHT_MIXER: sndout[1] = mixout[1]; break; case SPU_struct::REGS::ROM_CH1: sndout[1] = submix[1*2+1]; break; case SPU_struct::REGS::ROM_CH3: sndout[1] = submix[3*2+1]; break; case SPU_struct::REGS::ROM_CH1_PLUS_CH3: sndout[1] = submix[1*2+1] + submix[3*2+1]; break; } //generate capture output ("capture bugs" from gbatek are not emulated) if(SPU->regs.cap[0].source==0) capout[0] = capmixout[0]; //cap0 = L-mix else if(SPU->regs.cap[0].add) capout[0] = chanout[0] + chanout[1]; //cap0 = ch0+ch1 else capout[0] = chanout[0]; //cap0 = ch0 if(SPU->regs.cap[1].source==0) capout[1] = capmixout[1]; //cap1 = R-mix else if(SPU->regs.cap[1].add) capout[1] = chanout[2] + chanout[3]; //cap1 = ch2+ch3 else capout[1] = chanout[2]; //cap1 = ch2 capout[0] = MinMax(capout[0],-0x8000,0x7FFF); capout[1] = MinMax(capout[1],-0x8000,0x7FFF); //write the output sample where it is supposed to go if(samp==0) { samp0[0] = sndout[0]; samp0[1] = sndout[1]; } else { SPU->sndbuf[samp*2+0] = sndout[0]; SPU->sndbuf[samp*2+1] = sndout[1]; } for(int capchan=0;capchan<2;capchan++) { if(SPU->regs.cap[capchan].runtime.running) { SPU_struct::REGS::CAP& cap = SPU->regs.cap[capchan]; u32 last = sputrunc(cap.runtime.sampcnt); cap.runtime.sampcnt += SPU->channels[1+2*capchan].sampinc; u32 curr = sputrunc(cap.runtime.sampcnt); for(u32 j=last;j>8; if(skipcap) _MMU_write08<1,MMU_AT_DMA>(cap.runtime.curdad,0); else _MMU_write08<1,MMU_AT_DMA>(cap.runtime.curdad,sample8); cap.runtime.curdad++; multiplier = 4; } else { s16 sample16 = sample; if(skipcap) _MMU_write16<1,MMU_AT_DMA>(cap.runtime.curdad,0); else _MMU_write16<1,MMU_AT_DMA>(cap.runtime.curdad,sample16); cap.runtime.curdad+=2; multiplier = 2; } if(cap.runtime.curdad>=cap.runtime.maxdad) { cap.runtime.curdad = cap.dad; cap.runtime.sampcnt -= cap.len*multiplier; } } //sampinc loop } //if capchan running } //capchan loop } //main sample loop SPU->sndbuf[0] = samp0[0]; SPU->sndbuf[1] = samp0[1]; } //ENTER static void SPU_MixAudio(bool actuallyMix, SPU_struct *SPU, int length) { if(actuallyMix) { memset(SPU->sndbuf, 0, length*4*2); memset(SPU->outbuf, 0, length*2*2); } //we used to use master enable here, and do nothing if audio is disabled. //now, master enable is emulated better.. //but for a speed optimization we will still do it if(!SPU->regs.masteren) return; bool advanced = CommonSettings.spu_advanced ; //branch here so that slow computers don't have to take the advanced (slower) codepath. //it remainds to be seen exactly how much slower it is //if it isnt much slower then we should refactor everything to be simpler, once it is working if(advanced && SPU == SPU_core) { SPU_MixAudio_Advanced(actuallyMix, SPU, length); } else { //non-advanced mode for(int i=0;i<16;i++) { channel_struct *chan = &SPU->channels[i]; if (chan->status != CHANSTAT_PLAY) continue; SPU->bufpos = 0; SPU->buflength = length; // Mix audio _SPU_ChanUpdate(!CommonSettings.spu_muteChannels[i] && actuallyMix, SPU, chan); } } //we used to bail out if speakers were disabled. //this is technically wrong. sound may still be captured, or something. //in all likelihood, any game doing this probably master disabled the SPU also //so, optimization of this case is probably not necessary. //later, we'll just silence the output bool speakers = T1ReadWord(MMU.ARM7_REG, 0x304) & 0x01; u8 vol = SPU->regs.mastervol; // convert from 32-bit->16-bit if(actuallyMix && speakers) for (int i = 0; i < length*2; i++) { // Apply Master Volume SPU->sndbuf[i] = spumuldiv7(SPU->sndbuf[i], vol); s16 outsample = MinMax(SPU->sndbuf[i],-0x8000,0x7FFF); SPU->outbuf[i] = outsample; } } ////////////////////////////////////////////////////////////////////////////// //emulates one hline of the cpu core. //this will produce a variable number of samples, calculated to keep a 44100hz output //in sync with the emulator framerate int spu_core_samples = 0; void SPU_Emulate_core() { bool needToMix = true; SoundInterface_struct *soundProcessor = SPU_SoundCore(); samples += samples_per_hline; spu_core_samples = (int)(samples); samples -= spu_core_samples; // We don't need to mix audio for Dual Synch/Asynch mode since we do this // later in SPU_Emulate_user(). Disable mixing here to speed up processing. // However, recording still needs to mix the audio, so make sure we're also // not recording before we disable mixing. if ( synchmode == ESynchMode_DualSynchAsynch && !(driver->AVI_IsRecording() || driver->WAV_IsRecording()) ) { needToMix = false; } SPU_MixAudio(needToMix, SPU_core, spu_core_samples); if (soundProcessor == NULL) { return; } if (soundProcessor->FetchSamples != NULL) { soundProcessor->FetchSamples(SPU_core->outbuf, spu_core_samples, synchmode, synchronizer); } else { SPU_DefaultFetchSamples(SPU_core->outbuf, spu_core_samples, synchmode, synchronizer); } } void SPU_Emulate_user(bool mix) { static s16 *postProcessBuffer = NULL; static size_t postProcessBufferSize = 0; size_t freeSampleCount = 0; size_t processedSampleCount = 0; SoundInterface_struct *soundProcessor = SPU_SoundCore(); if (soundProcessor == NULL) { return; } // Check to see how many free samples are available. // If there are some, fill up the output buffer. freeSampleCount = soundProcessor->GetAudioSpace(); if (freeSampleCount == 0) { return; } //printf("mix %i samples\n", audiosize); if (freeSampleCount > buffersize) { freeSampleCount = buffersize; } // If needed, resize the post-process buffer to guarantee that // we can store all the sound data. if (postProcessBufferSize < freeSampleCount * 2 * sizeof(s16)) { postProcessBufferSize = freeSampleCount * 2 * sizeof(s16); postProcessBuffer = (s16 *)realloc(postProcessBuffer, postProcessBufferSize); } if (soundProcessor->PostProcessSamples != NULL) { processedSampleCount = soundProcessor->PostProcessSamples(postProcessBuffer, freeSampleCount, synchmode, synchronizer); } else { processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, freeSampleCount, synchmode, synchronizer); } soundProcessor->UpdateAudio(postProcessBuffer, processedSampleCount); WAV_WavSoundUpdate(postProcessBuffer, processedSampleCount, WAVMODE_USER); } void SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { if (synchMode == ESynchMode_Synchronous) { theSynchronizer->enqueue_samples(sampleBuffer, sampleCount); } } size_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { size_t processedSampleCount = 0; switch (synchMode) { case ESynchMode_DualSynchAsynch: if(SPU_user != NULL) { SPU_MixAudio(true, SPU_user, requestedSampleCount); memcpy(postProcessBuffer, SPU_user->outbuf, requestedSampleCount * 2 * sizeof(s16)); processedSampleCount = requestedSampleCount; } break; case ESynchMode_Synchronous: processedSampleCount = theSynchronizer->output_samples(postProcessBuffer, requestedSampleCount); break; default: break; } return processedSampleCount; } ////////////////////////////////////////////////////////////////////////////// // Dummy Sound Interface ////////////////////////////////////////////////////////////////////////////// int SNDDummyInit(int buffersize); void SNDDummyDeInit(); void SNDDummyUpdateAudio(s16 *buffer, u32 num_samples); u32 SNDDummyGetAudioSpace(); void SNDDummyMuteAudio(); void SNDDummyUnMuteAudio(); void SNDDummySetVolume(int volume); void SNDDummyClearBuffer(); void SNDDummyFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t SNDDummyPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); SoundInterface_struct SNDDummy = { SNDCORE_DUMMY, "Dummy Sound Interface", SNDDummyInit, SNDDummyDeInit, SNDDummyUpdateAudio, SNDDummyGetAudioSpace, SNDDummyMuteAudio, SNDDummyUnMuteAudio, SNDDummySetVolume, SNDDummyClearBuffer, SNDDummyFetchSamples, SNDDummyPostProcessSamples }; int SNDDummyInit(int buffersize) { return 0; } void SNDDummyDeInit() {} void SNDDummyUpdateAudio(s16 *buffer, u32 num_samples) { } u32 SNDDummyGetAudioSpace() { return DESMUME_SAMPLE_RATE/60 + 5; } void SNDDummyMuteAudio() {} void SNDDummyUnMuteAudio() {} void SNDDummySetVolume(int volume) {} void SNDDummyClearBuffer() {} void SNDDummyFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) {} size_t SNDDummyPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { return 0; } //---------wav writer------------ typedef struct { char id[4]; u32 size; } chunk_struct; typedef struct { chunk_struct riff; char rifftype[4]; } waveheader_struct; typedef struct { chunk_struct chunk; u16 compress; u16 numchan; u32 rate; u32 bytespersec; u16 blockalign; u16 bitspersample; } fmt_struct; WavWriter::WavWriter() : spufp(NULL) { } bool WavWriter::open(const std::string & fname) { waveheader_struct waveheader; fmt_struct fmt; chunk_struct data; size_t elems_written = 0; if ((spufp = fopen(fname.c_str(), "wb")) == NULL) return false; // Do wave header memcpy(waveheader.riff.id, "RIFF", 4); waveheader.riff.size = 0; // we'll fix this after the file is closed memcpy(waveheader.rifftype, "WAVE", 4); elems_written += fwrite((void *)&waveheader, 1, sizeof(waveheader_struct), spufp); // fmt chunk memcpy(fmt.chunk.id, "fmt ", 4); fmt.chunk.size = 16; // we'll fix this at the end fmt.compress = 1; // PCM fmt.numchan = 2; // Stereo fmt.rate = DESMUME_SAMPLE_RATE; fmt.bitspersample = 16; fmt.blockalign = fmt.bitspersample / 8 * fmt.numchan; fmt.bytespersec = fmt.rate * fmt.blockalign; elems_written += fwrite((void *)&fmt, 1, sizeof(fmt_struct), spufp); // data chunk memcpy(data.id, "data", 4); data.size = 0; // we'll fix this at the end elems_written += fwrite((void *)&data, 1, sizeof(chunk_struct), spufp); return true; } void WavWriter::close() { if(!spufp) return; size_t elems_written = 0; long length = ftell(spufp); // Let's fix the riff chunk size and the data chunk size fseek(spufp, sizeof(waveheader_struct)-0x8, SEEK_SET); length -= 0x8; elems_written += fwrite((void *)&length, 1, 4, spufp); fseek(spufp, sizeof(waveheader_struct)+sizeof(fmt_struct)+0x4, SEEK_SET); length -= sizeof(waveheader_struct)+sizeof(fmt_struct); elems_written += fwrite((void *)&length, 1, 4, spufp); fclose(spufp); spufp = NULL; } void WavWriter::update(void* soundData, int numSamples) { if(!spufp) return; //TODO - big endian for the s16 samples?? size_t elems_written = fwrite(soundData, numSamples*2, 2, spufp); } bool WavWriter::isRecording() const { return spufp != NULL; } static WavWriter wavWriter; void WAV_End() { wavWriter.close(); } bool WAV_Begin(const char* fname, WAVMode mode) { WAV_End(); if(!wavWriter.open(fname)) return false; if(mode == WAVMODE_ANY) mode = WAVMODE_CORE; wavWriter.mode = mode; driver->USR_InfoMessage("WAV recording started."); return true; } bool WAV_IsRecording(WAVMode mode) { if(wavWriter.mode == mode || mode == WAVMODE_ANY) return wavWriter.isRecording(); return false; } void WAV_WavSoundUpdate(void* soundData, int numSamples, WAVMode mode) { if(wavWriter.mode == mode || mode == WAVMODE_ANY) wavWriter.update(soundData, numSamples); } ////////////////////////////////////////////////////////////////////////////// void spu_savestate(EMUFILE* os) { //version write32le(6,os); SPU_struct *spu = SPU_core; for(int j=0;j<16;j++) { channel_struct &chan = spu->channels[j]; write32le(chan.num,os); write8le(chan.vol,os); write8le(chan.datashift,os); write8le(chan.hold,os); write8le(chan.pan,os); write8le(chan.waveduty,os); write8le(chan.repeat,os); write8le(chan.format,os); write8le(chan.status,os); write32le(chan.addr,os); write16le(chan.timer,os); write16le(chan.loopstart,os); write32le(chan.length,os); write64le(double_to_u64(chan.sampcnt),os); write64le(double_to_u64(chan.sampinc),os); write32le(chan.lastsampcnt,os); write16le(chan.pcm16b,os); write16le(chan.pcm16b_last,os); write32le(chan.index,os); write16le(chan.x,os); write16le(chan.psgnoise_last,os); write8le(chan.keyon,os); } write64le(double_to_u64(samples),os); write8le(spu->regs.mastervol,os); write8le(spu->regs.ctl_left,os); write8le(spu->regs.ctl_right,os); write8le(spu->regs.ctl_ch1bypass,os); write8le(spu->regs.ctl_ch3bypass,os); write8le(spu->regs.masteren,os); write16le(spu->regs.soundbias,os); for(int i=0;i<2;i++) { write8le(spu->regs.cap[i].add,os); write8le(spu->regs.cap[i].source,os); write8le(spu->regs.cap[i].oneshot,os); write8le(spu->regs.cap[i].bits8,os); write8le(spu->regs.cap[i].active,os); write32le(spu->regs.cap[i].dad,os); write16le(spu->regs.cap[i].len,os); write8le(spu->regs.cap[i].runtime.running,os); write32le(spu->regs.cap[i].runtime.curdad,os); write32le(spu->regs.cap[i].runtime.maxdad,os); write_double_le(spu->regs.cap[i].runtime.sampcnt,os); } for(int i=0;i<2;i++) spu->regs.cap[i].runtime.fifo.save(os); } bool spu_loadstate(EMUFILE* is, int size) { u64 temp64; //read version u32 version; if(read32le(&version,is) != 1) return false; SPU_struct *spu = SPU_core; reconstruct(&SPU_core->regs); for(int j=0;j<16;j++) { channel_struct &chan = spu->channels[j]; read32le(&chan.num,is); read8le(&chan.vol,is); read8le(&chan.datashift,is); read8le(&chan.hold,is); read8le(&chan.pan,is); read8le(&chan.waveduty,is); read8le(&chan.repeat,is); read8le(&chan.format,is); read8le(&chan.status,is); read32le(&chan.addr,is); read16le(&chan.timer,is); read16le(&chan.loopstart,is); read32le(&chan.length,is); chan.totlength = chan.length + chan.loopstart; chan.double_totlength_shifted = (double)(chan.totlength << format_shift[chan.format]); //printf("%f\n",chan.double_totlength_shifted); if(version >= 2) { read64le(&temp64,is); chan.sampcnt = u64_to_double(temp64); read64le(&temp64,is); chan.sampinc = u64_to_double(temp64); } else { read32le((u32*)&chan.sampcnt,is); read32le((u32*)&chan.sampinc,is); } read32le(&chan.lastsampcnt,is); read16le(&chan.pcm16b,is); read16le(&chan.pcm16b_last,is); read32le(&chan.index,is); read16le(&chan.x,is); read16le(&chan.psgnoise_last,is); if(version>=4) read8le(&chan.keyon,is); //hopefully trigger a recovery of the adpcm looping system chan.loop_index = K_ADPCM_LOOPING_RECOVERY_INDEX; } if(version>=2) { read64le(&temp64,is); samples = u64_to_double(temp64); } if(version>=4) { read8le(&spu->regs.mastervol,is); read8le(&spu->regs.ctl_left,is); read8le(&spu->regs.ctl_right,is); read8le(&spu->regs.ctl_ch1bypass,is); read8le(&spu->regs.ctl_ch3bypass,is); read8le(&spu->regs.masteren,is); read16le(&spu->regs.soundbias,is); } if(version>=5) { for(int i=0;i<2;i++) { read8le(&spu->regs.cap[i].add,is); read8le(&spu->regs.cap[i].source,is); read8le(&spu->regs.cap[i].oneshot,is); read8le(&spu->regs.cap[i].bits8,is); read8le(&spu->regs.cap[i].active,is); read32le(&spu->regs.cap[i].dad,is); read16le(&spu->regs.cap[i].len,is); read8le(&spu->regs.cap[i].runtime.running,is); read32le(&spu->regs.cap[i].runtime.curdad,is); read32le(&spu->regs.cap[i].runtime.maxdad,is); read_double_le(&spu->regs.cap[i].runtime.sampcnt,is); } } if(version>=6) for(int i=0;i<2;i++) spu->regs.cap[i].runtime.fifo.load(is); else for(int i=0;i<2;i++) spu->regs.cap[i].runtime.fifo.reset(); //older versions didnt store a mastervol; //we must reload this or else games will start silent if(version<4) { spu->regs.mastervol = T1ReadByte(MMU.ARM7_REG, 0x500) & 0x7F; spu->regs.masteren = BIT15(T1ReadWord(MMU.ARM7_REG, 0x500)); } //copy the core spu (the more accurate) to the user spu SPU_CloneUser(); return true; } desmume-0.9.9/src/movie.cpp0000644000175000017500000010775612140261633016352 0ustar guillaumeguillaume/* Copyright 2008-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #define WIN32_LEAN_AND_MEAN #include #include #include #include #include "utils/guid.h" #include "utils/xstring.h" #include "utils/datetime.h" #include "movie.h" #include "NDSSystem.h" #include "readwrite.h" #include "debug.h" #include "rtc.h" #include "common.h" #include "mic.h" #include "version.h" #include "GPU_osd.h" #include "path.h" #include "emufile.h" using namespace std; bool freshMovie = false; //True when a movie loads, false when movie is altered. Used to determine if a movie has been altered since opening bool autoMovieBackup = true; #define FCEU_PrintError LOG #define MOVIE_VERSION 1 #ifdef WIN32 #include ".\windows\main.h" #endif //----movie engine main state EMOVIEMODE movieMode = MOVIEMODE_INACTIVE; //this should not be set unless we are in MOVIEMODE_RECORD! EMUFILE* osRecordingMovie = 0; int currFrameCounter; uint32 cur_input_display = 0; int pauseframe = -1; bool movie_readonly = true; char curMovieFilename[512] = {0}; MovieData currMovieData; int currRerecordCount; bool movie_reset_command = false; //-------------- void MovieData::clearRecordRange(int start, int len) { for(int i=0;ipad != compareRec.pad) return false; //Check Stylus if (this->touch.padding != compareRec.touch.padding) return false; if (this->touch.touch != compareRec.touch.touch) return false; if (this->touch.x != compareRec.touch.x) return false; if (this->touch.y != compareRec.touch.y) return false; //Check comamnds //if new commands are ever recordable, they need to be added here if we go with this method if(this->command_reset() != compareRec.command_reset()) return false; if(this->command_microphone() != compareRec.command_microphone()) return false; if(this->command_lid() != compareRec.command_lid()) return false; return true; } const char MovieRecord::mnemonics[13] = {'R','L','D','U','T','S','B','A','Y','X','W','E','G'}; void MovieRecord::dumpPad(EMUFILE* fp, u16 pad) { //these are mnemonics for each joystick bit. //since we usually use the regular joypad, these will be more helpful. //but any character other than ' ' or '.' should count as a set bit //maybe other input types will need to be encoded another way.. for(int bit=0;bit<13;bit++) { int bitmask = (1<<(12-bit)); char mnemonic = mnemonics[bit]; //if the bit is set write the mnemonic if(pad & bitmask) fp->fputc(mnemonic); else //otherwise write an unset bit fp->fputc('.'); } } void MovieRecord::parsePad(EMUFILE* fp, u16& pad) { char buf[13]; fp->fread(buf,13); pad = 0; for(int i=0;i<13;i++) { pad <<= 1; pad |= ((buf[i]=='.'||buf[i]==' ')?0:1); } } void MovieRecord::parse(MovieData* md, EMUFILE* fp) { //by the time we get in here, the initial pipe has already been extracted //extract the commands commands = u32DecFromIstream(fp); fp->fgetc(); //eat the pipe parsePad(fp, pad); touch.x = u32DecFromIstream(fp); touch.y = u32DecFromIstream(fp); touch.touch = u32DecFromIstream(fp); fp->fgetc(); //eat the pipe //should be left at a newline } void MovieRecord::dump(MovieData* md, EMUFILE* fp, int index) { //dump the misc commands //*os << '|' << setw(1) << (int)commands; fp->fputc('|'); putdec(fp,commands); fp->fputc('|'); dumpPad(fp, pad); putdec(fp,touch.x); fp->fputc(' '); putdec(fp,touch.y); fp->fputc(' '); putdec(fp,touch.touch); fp->fputc('|'); //each frame is on a new line fp->fputc('\n'); } DateTime FCEUI_MovieGetRTCDefault() { // compatible with old desmume return DateTime(2009,1,1,0,0,0); } MovieData::MovieData() : version(MOVIE_VERSION) , emuVersion(EMU_DESMUME_VERSION_NUMERIC()) , romChecksum(0) , rerecordCount(0) , binaryFlag(false) , rtcStart(FCEUI_MovieGetRTCDefault()) { } void MovieData::truncateAt(int frame) { if((int)records.size() > frame) records.resize(frame); } void MovieData::installValue(std::string& key, std::string& val) { //todo - use another config system, or drive this from a little data structure. because this is gross if(key == "version") installInt(val,version); else if(key == "emuVersion") installInt(val,emuVersion); else if(key == "rerecordCount") installInt(val,rerecordCount); else if(key == "romFilename") romFilename = val; else if(key == "romChecksum") { // TODO: The current implementation of reading the checksum doesn't work correctly, and can // cause crashes when the MovieData object is deallocated. (This is caused by StringToBytes() // overrunning romChecksum into romSerial, making romSerial undefined.) Set romChecksum to // some dummy value for now to prevent crashing. This is okay, since romChecksum isn't actually // used in practice at this time. - rogerman, 2012/08/24 //StringToBytes(val,&romChecksum,MD5DATA::size); romChecksum = 0; } else if(key == "romSerial") romSerial = val; else if(key == "guid") guid = Desmume_Guid::fromString(val); else if(key == "rtcStart") { // sloppy format check and parse const char *validFormatStr = "####-##-##T##:##:##Z"; bool validFormat = true; for (int i = 0; validFormatStr[i] != '\0'; i++) { if (validFormatStr[i] != val[i] && !(validFormatStr[i] == '#' && isdigit(val[i]))) { validFormat = false; break; } } if (validFormat) { struct tm t; const char *s = val.data(); int year = atoi(&s[0]); int mon = atoi(&s[5]); int day = atoi(&s[8]); int hour = atoi(&s[11]); int min = atoi(&s[14]); int sec = atoi(&s[17]); rtcStart = DateTime(year,mon,day,hour,min,sec); } } else if(key == "rtcStartNew") { DateTime::TryParse(val.c_str(),rtcStart); } else if(key == "comment") comments.push_back(mbstowcs(val)); else if(key == "binary") installBool(val,binaryFlag); else if(key == "savestate") { int len = Base64StringToBytesLength(val); if(len == -1) len = HexStringToBytesLength(val); // wasn't base64, try hex if(len >= 1) { savestate.resize(len); StringToBytes(val,&savestate[0],len); // decodes either base64 or hex } } else if(key == "sram") { int len = Base64StringToBytesLength(val); if(len == -1) len = HexStringToBytesLength(val); // wasn't base64, try hex if(len >= 1) { sram.resize(len); StringToBytes(val,&sram[0],len); // decodes either base64 or hex } } } int MovieData::dump(EMUFILE* fp, bool binary) { int start = fp->ftell(); fp->fprintf("version %d\n", version); fp->fprintf("emuVersion %d\n", emuVersion); fp->fprintf("rerecordCount %d\n", rerecordCount); fp->fprintf("romFilename %s\n", romFilename.c_str()); fp->fprintf("romChecksum %s\n", u32ToHexString(gameInfo.crc).c_str()); fp->fprintf("romSerial %s\n", romSerial.c_str()); fp->fprintf("guid %s\n", guid.toString().c_str()); fp->fprintf("useExtBios %d\n", CommonSettings.UseExtBIOS?1:0); fp->fprintf("advancedTiming %d\n", CommonSettings.advanced_timing?1:0); if(CommonSettings.UseExtBIOS) fp->fprintf("swiFromBios %d\n", CommonSettings.SWIFromBIOS?1:0); fp->fprintf("useExtFirmware %d\n", CommonSettings.UseExtFirmware?1:0); if(CommonSettings.UseExtFirmware) { fp->fprintf("bootFromFirmware %d\n", CommonSettings.BootFromFirmware?1:0); } else { char temp_str[27]; int i; /* FIXME: harshly only use the lower byte of the UTF-16 character. * This would cause strange behaviour if the user could set UTF-16 but * they cannot yet. */ for (i = 0; i < CommonSettings.InternalFirmConf.nickname_len; i++) { temp_str[i] = CommonSettings.InternalFirmConf.nickname[i]; } temp_str[i] = '\0'; fp->fprintf("firmNickname %s\n", temp_str); for (i = 0; i < CommonSettings.InternalFirmConf.message_len; i++) { temp_str[i] = CommonSettings.InternalFirmConf.message[i]; } temp_str[i] = '\0'; fp->fprintf("firmMessage %s\n", temp_str); fp->fprintf("firmFavColour %d\n", CommonSettings.InternalFirmConf.fav_colour); fp->fprintf("firmBirthMonth %d\n", CommonSettings.InternalFirmConf.birth_month); fp->fprintf("firmBirthDay %d\n", CommonSettings.InternalFirmConf.birth_day); fp->fprintf("firmLanguage %d\n", CommonSettings.InternalFirmConf.language); } fp->fprintf("rtcStartNew %s\n", rtcStart.ToString().c_str()); for(uint32 i=0;ifprintf("comment %s\n", wcstombs(comments[i]).c_str()); if(binary) fp->fprintf("binary 1\n"); if(savestate.size() != 0) fp->fprintf("savestate %s\n", BytesToString(&savestate[0],savestate.size()).c_str()); if(sram.size() != 0) fp->fprintf("sram %s\n", BytesToString(&sram[0],sram.size()).c_str()); if(binary) { //put one | to start the binary dump fp->fputc('|'); for(int i=0;i<(int)records.size();i++) records[i].dumpBinary(this,fp,i); } else for(int i=0;i<(int)records.size();i++) records[i].dump(this,fp,i); int end = fp->ftell(); return end-start; } //yuck... another custom text parser. bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader) { //TODO - start with something different. like 'desmume movie version 1" int curr = fp->ftell(); //movie must start with "version 1" char buf[9]; curr = fp->ftell(); fp->fread(buf,9); fp->fseek(curr, SEEK_SET); // if(fp->fail()) return false; if(memcmp(buf,"version 1",9)) return false; std::string key,value; enum { NEWLINE, KEY, SEPARATOR, VALUE, RECORD, COMMENT } state = NEWLINE; bool bail = false; for(;;) { bool iswhitespace, isrecchar, isnewline; int c; if(size--<=0) goto bail; c = fp->fgetc(); if(c == -1) goto bail; iswhitespace = (c==' '||c=='\t'); isrecchar = (c=='|'); isnewline = (c==10||c==13); if(isrecchar && movieData.binaryFlag && !stopAfterHeader) { LoadFM2_binarychunk(movieData, fp, size); return true; } switch(state) { case NEWLINE: if(isnewline) goto done; if(iswhitespace) goto done; if(isrecchar) goto dorecord; //must be a key key = ""; value = ""; goto dokey; break; case RECORD: { dorecord: if (stopAfterHeader) return true; int currcount = movieData.records.size(); movieData.records.resize(currcount+1); int preparse = fp->ftell(); movieData.records[currcount].parse(&movieData, fp); int postparse = fp->ftell(); size -= (postparse-preparse); state = NEWLINE; break; } case KEY: dokey: //dookie state = KEY; if(iswhitespace) goto doseparator; if(isnewline) goto commit; key += c; break; case SEPARATOR: doseparator: state = SEPARATOR; if(isnewline) goto commit; if(!iswhitespace) goto dovalue; break; case VALUE: dovalue: state = VALUE; if(isnewline) goto commit; value += c; break; case COMMENT: default: break; } goto done; bail: bail = true; if(state == VALUE) goto commit; goto done; commit: movieData.installValue(key,value); state = NEWLINE; done: ; if(bail) break; } return true; } static void closeRecordingMovie() { if(osRecordingMovie) { delete osRecordingMovie; osRecordingMovie = 0; } } /// Stop movie playback. static void StopPlayback() { driver->USR_InfoMessage("Movie playback stopped."); movieMode = MOVIEMODE_INACTIVE; } /// Stop movie playback without closing the movie. static void FinishPlayback() { driver->USR_InfoMessage("Movie finished playing."); movieMode = MOVIEMODE_FINISHED; } /// Stop movie recording static void StopRecording() { driver->USR_InfoMessage("Movie recording stopped."); movieMode = MOVIEMODE_INACTIVE; closeRecordingMovie(); } void FCEUI_StopMovie() { if(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED) StopPlayback(); else if(movieMode == MOVIEMODE_RECORD) StopRecording(); curMovieFilename[0] = 0; freshMovie = false; } //begin playing an existing movie const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe) { //if(!tasedit && !FCEU_IsValidUI(FCEUI_PLAYMOVIE)) // return; // FIXME: name==null indicates to BROWSE to retrieve fname from user (or stdin if that's impossible), // when called from movie_play assert(fname); if(!fname) return "LoadMovie doesn't support browsing yet"; //mbg 6/10/08 - we used to call StopMovie here, but that cleared curMovieFilename and gave us crashes... if(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED) StopPlayback(); else if(movieMode == MOVIEMODE_RECORD) StopRecording(); //-------------- currMovieData = MovieData(); strcpy(curMovieFilename, fname); //FCEUFILE *fp = FCEU_fopen(fname,0,"rb",0); //if (!fp) return; //if(fp->isArchive() && !_read_only) { // FCEU_PrintError("Cannot open a movie in read+write from an archive."); // return; //} //LoadFM2(currMovieData, fp->stream, INT_MAX, false); bool loadedfm2 = false; bool opened = false; // { EMUFILE* fp = new EMUFILE_FILE(fname, "rb"); // if(fs.is_open()) // { loadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false); opened = true; // } // fs.close(); delete fp; // } if(!opened) { // for some reason fs.open doesn't work, it has to be a whole new fstream object // fstream fs (fname, std::ios_base::in); loadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false); // fs.close(); delete fp; } if(!loadedfm2) return "failed to load movie"; //TODO //fully reload the game to reinitialize everything before playing any movie //poweron(true); // reset firmware (some games can write to it) if (CommonSettings.UseExtFirmware == false) { NDS_CreateDummyFirmware(&CommonSettings.InternalFirmConf); } NDS_Reset(); ////WE NEED TO LOAD A SAVESTATE //if(currMovieData.savestate.size() != 0) //{ // bool success = MovieData::loadSavestateFrom(&currMovieData.savestate); // if(!success) return; //} lagframecounter=0; LagFrameFlag=0; lastLag=0; TotalLagFrames=0; currFrameCounter = 0; pauseframe = _pauseframe; movie_readonly = _read_only; movieMode = MOVIEMODE_PLAY; currRerecordCount = currMovieData.rerecordCount; MMU_new.backupDevice.movie_mode(); if(currMovieData.sram.size() != 0) { bool success = MovieData::loadSramFrom(&currMovieData.sram); if(!success) return "failed to load sram"; } freshMovie = true; ClearAutoHold(); if(movie_readonly) driver->USR_InfoMessage("Replay started Read-Only."); else driver->USR_InfoMessage("Replay started Read+Write."); return NULL; // success } static void openRecordingMovie(const char* fname) { //osRecordingMovie = FCEUD_UTF8_fstream(fname, "wb"); osRecordingMovie = new EMUFILE_FILE(fname, "wb"); /*if(!osRecordingMovie) FCEU_PrintError("Error opening movie output file: %s",fname);*/ strcpy(curMovieFilename, fname); } bool MovieData::loadSramFrom(std::vector* buf) { EMUFILE_MEMORY ms(buf); MMU_new.backupDevice.load_movie(&ms); return true; } //static bool FCEUSS_SaveSRAM(EMUFILE* outstream, const std::string& fname) //{ // //a temp memory stream. we'll dump some data here and then compress // //TODO - support dumping directly without compressing to save a buffer copy ////TODO ///* memorystream ms; // // //size it // FILE * fp = fopen( fname.c_str(), "r" ); // if(!fp) // return 0; // // fseek( fp, 0, SEEK_END ); // int size = ftell(fp); // fclose(fp); // // filebuf fb; // fb.open (fname.c_str(), ios::in | ios::binary);//ios::in // istream is(&fb); // // char *buffer = new char[size]; // // is.read(buffer, size); // // outstream->write((char*)buffer,size); // // fb.close(); //*/ // // // return true; //} //begin recording a new movie //TODO - BUG - the record-from-another-savestate doesnt work. void FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart) { //if(!FCEU_IsValidUI(FCEUI_RECORDMOVIE)) // return; assert(fname); FCEUI_StopMovie(); openRecordingMovie(fname); currFrameCounter = 0; //LagCounterReset(); currMovieData = MovieData(); currMovieData.guid.newGuid(); if(author != L"") currMovieData.comments.push_back(L"author " + author); currMovieData.romChecksum = gameInfo.crc; currMovieData.romSerial = gameInfo.ROMserial; currMovieData.romFilename = path.GetRomName(); currMovieData.rtcStart = rtcstart; // reset firmware (some games can write to it) if (CommonSettings.UseExtFirmware == false) { NDS_CreateDummyFirmware(&CommonSettings.InternalFirmConf); } NDS_Reset(); //todo ? //poweron(true); //else // MovieData::dumpSavestateTo(&currMovieData.savestate,Z_BEST_COMPRESSION); if(flag == 1) EMUFILE::readAllBytes(&currMovieData.sram, sramfname); //we are going to go ahead and dump the header. from now on we will only be appending frames currMovieData.dump(osRecordingMovie, false); currFrameCounter=0; lagframecounter=0; LagFrameFlag=0; lastLag=0; TotalLagFrames=0; movieMode = MOVIEMODE_RECORD; movie_readonly = false; currRerecordCount = 0; MMU_new.backupDevice.movie_mode(); if(currMovieData.sram.size() != 0) { bool success = MovieData::loadSramFrom(&currMovieData.sram); if(!success) return; } driver->USR_InfoMessage("Movie recording started."); } //the main interaction point between the emulator and the movie system. //either dumps the current joystick state or loads one state from the movie. //deprecated, should use the two functions it has been split into directly void FCEUMOV_AddInputState() { FCEUMOV_HandlePlayback(); FCEUMOV_HandleRecording(); } void FCEUMOV_HandlePlayback() { if(movieMode == MOVIEMODE_PLAY) { //stop when we run out of frames if(currFrameCounter == (int)currMovieData.records.size()) { FinishPlayback(); } else { UserInput& input = NDS_getProcessingUserInput(); MovieRecord* mr = &currMovieData.records[currFrameCounter]; if(mr->command_microphone()) input.mic.micButtonPressed = 1; else input.mic.micButtonPressed = 0; if(mr->command_reset()) NDS_Reset(); if(mr->command_lid()) input.buttons.F = true; else input.buttons.F = false; u16 pad = mr->pad; input.buttons.R = (((pad>>12)&1)!=0); input.buttons.L = (((pad>>11)&1)!=0); input.buttons.D = (((pad>>10)&1)!=0); input.buttons.U = (((pad>>9)&1)!=0); input.buttons.T = (((pad>>8)&1)!=0); input.buttons.S = (((pad>>7)&1)!=0); input.buttons.B = (((pad>>6)&1)!=0); input.buttons.A = (((pad>>5)&1)!=0); input.buttons.Y = (((pad>>4)&1)!=0); input.buttons.X = (((pad>>3)&1)!=0); input.buttons.W = (((pad>>2)&1)!=0); input.buttons.E = (((pad>>1)&1)!=0); input.buttons.G = (((pad>>0)&1)!=0); input.touch.touchX = mr->touch.x << 4; input.touch.touchY = mr->touch.y << 4; input.touch.isTouch = mr->touch.touch != 0; } //if we are on the last frame, then pause the emulator if the player requested it if(currFrameCounter == (int)currMovieData.records.size()-1) { /*if(FCEUD_PauseAfterPlayback()) { FCEUI_ToggleEmulationPause(); }*/ } //pause the movie at a specified frame //if(FCEUMOV_ShouldPause() && FCEUI_EmulationPaused()==0) //{ // FCEUI_ToggleEmulationPause(); // FCEU_DispMessage("Paused at specified movie frame"); //} // it's apparently un-threadsafe to do this here // (causes crazy flickering in other OSD elements, at least) // and it's also pretty annoying, // and the framecounter display already conveys this info as well. // so, I'm disabling this, at least for now. // osd->addFixed(180, 176, "%s", "Playback"); } } void FCEUMOV_HandleRecording() { if(movieMode == MOVIEMODE_RECORD) { const UserInput& input = NDS_getFinalUserInput(); MovieRecord mr; mr.commands = 0; if(input.mic.micButtonPressed == 1) mr.commands = MOVIECMD_MIC; mr.pad = nds.pad; if(input.buttons.F) mr.commands = MOVIECMD_LID; if(movie_reset_command) { mr.commands = MOVIECMD_RESET; movie_reset_command = false; } mr.touch.touch = input.touch.isTouch ? 1 : 0; mr.touch.x = input.touch.isTouch ? input.touch.touchX >> 4 : 0; mr.touch.y = input.touch.isTouch ? input.touch.touchY >> 4 : 0; assert(mr.touch.touch || (!mr.touch.x && !mr.touch.y)); //assert(nds.touchX == input.touch.touchX && nds.touchY == input.touch.touchY); //assert((mr.touch.x << 4) == nds.touchX && (mr.touch.y << 4) == nds.touchY); mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size()); currMovieData.records.push_back(mr); // it's apparently un-threadsafe to do this here // (causes crazy flickering in other OSD elements, at least) // and it's also pretty annoying, // and the framecounter display already conveys this info as well. // so, I'm disabling this, at least for now. // osd->addFixed(180, 176, "%s", "Recording"); } /*extern uint8 joy[4]; memcpy(&cur_input_display,joy,4);*/ } //TODO static void FCEUMOV_AddCommand(int cmd) { // do nothing if not recording a movie if(movieMode != MOVIEMODE_RECORD) return; //printf("%d\n",cmd); //MBG TODO BIG TODO TODO TODO //DoEncode((cmd>>3)&0x3,cmd&0x7,1); } //little endian 4-byte cookies static const int kMOVI = 0x49564F4D; static const int kNOMO = 0x4F4D4F4E; void mov_savestate(EMUFILE* fp) { //we are supposed to dump the movie data into the savestate //if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY) // return currMovieData.dump(os, true); //else return 0; if(movieMode != MOVIEMODE_INACTIVE) { write32le(kMOVI,fp); currMovieData.dump(fp, true); } else { write32le(kNOMO,fp); } } bool CheckTimelines(MovieData& stateMovie, MovieData& currMovie, int& errorFr) { bool isInTimeline = true; int length; //First check, make sure we are checking is for a post-movie savestate, we just want to adjust the length for now, we will handle this situation later in another function if (currFrameCounter <= stateMovie.getNumRecords()) length = currFrameCounter; //Note: currFrameCounter corresponds to the framecounter in the savestate else if (currFrameCounter > currMovie.getNumRecords()) //Now that we know the length of the records of the savestate we plan to load, let's match the length against the movie length = currMovie.getNumRecords(); //If length < currMovie records then this is a "future" event from the current movie, againt we will handle this situation later, we just want to find the right number of frames to compare else length = stateMovie.getNumRecords(); for (int x = 0; x < length; x++) { if (!stateMovie.records[x].Compare(currMovie.records[x])) { isInTimeline = false; errorFr = x; break; } } return isInTimeline; } static bool load_successful; bool mov_loadstate(EMUFILE* fp, int size) { load_successful = false; u32 cookie; if(read32le(&cookie,fp) != 1) return false; if(cookie == kNOMO) { if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY) FinishPlayback(); return true; } else if(cookie != kMOVI) return false; size -= 4; if (!movie_readonly && autoMovieBackup && freshMovie) //If auto-backup is on, movie has not been altered this session and the movie is in read+write mode { FCEUI_MakeBackupMovie(false); //Backup the movie before the contents get altered, but do not display messages } //a little rule: cant load states in read+write mode with a movie from an archive. //so we are going to switch it to readonly mode in that case // if(!movie_readonly // //*&& FCEU_isFileInArchive(curMovieFilename)*/ // ) { // FCEU_PrintError("Cannot loadstate in Read+Write with movie from archive. Movie is now Read-Only."); // movie_readonly = true; // } MovieData tempMovieData = MovieData(); //int curr = fp->ftell(); if(!LoadFM2(tempMovieData, fp, size, false)) { // is->seekg((uint32)curr+size); /* extern bool FCEU_state_loading_old_format; if(FCEU_state_loading_old_format) { if(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_RECORD) { FCEUI_StopMovie(); FCEU_PrintError("You have tried to use an old savestate while playing a movie. This is unsupported (since the old savestate has old-format movie data in it which can't be converted on the fly)"); } }*/ return false; } //---------------- //complex TAS logic for loadstate //fully conforms to the savestate logic documented in the Laws of TAS //http://tasvideos.org/LawsOfTAS/OnSavestates.html //---------------- /* Playback or Recording + Read-only * Check that GUID of movie and savestate-movie must match or else error o on error: a message informing that the savestate doesn't belong to this movie. This is a GUID mismatch error. Give user a choice to load it anyway. + failstate: if use declines, loadstate attempt canceled, movie can resume as if not attempted if user has backup savstates enabled else stop movie * Check that movie and savestate-movie are in same timeline. If not then this is a wrong timeline error. o on error: a message informing that the savestate doesn't belong to this movie + failstate: loadstate attempt canceled, movie can resume as if not attempted if user has backup savestates enabled else stop movie * Check that savestate-movie is not greater than movie. If not then this is a future event error and is not allowed in read-only o on error: message informing that the savestate is from a frame after the last frame of the movie + failstate - loadstate attempt cancelled, movie can resume if user has backup savesattes enabled, else stop movie * Check that savestate framcount <= savestate movie length. If not this is a post-movie savestate o on post-movie: See post-movie event section. * All error checks have passed, state will be loaded * Movie contained in the savestate will be discarded * Movie is now in Playback mode Playback, Recording + Read+write * Check that GUID of movie and savestate-movie must match or else error o on error: a message informing that the savestate doesn't belong to this movie. This is a GUID mismatch error. Give user a choice to load it anyway. + failstate: if use declines, loadstate attempt canceled, movie can resume as if not attempted (stop movie if resume fails)canceled, movie can resume if backup savestates enabled else stopmovie * Check that savestate framcount <= savestate movie length. If not this is a post-movie savestate o on post-movie: See post-movie event section. * savestate passed all error checks and will now be loaded in its entirety and replace movie (note: there will be no truncation yet) * current framecount will be set to savestate framecount * on the next frame of input, movie will be truncated to framecount o (note: savestate-movie can be a future event of the movie timeline, or a completely new timeline and it is still allowed) * Rerecord count of movie will be incremented * Movie is now in record mode Post-movie savestate event * Whan a savestate is loaded and is determined that the savestate-movie length is less than the savestate framecount then it is a post-movie savestate. These occur when a savestate was made during Movie Finished mode. * If read+write, the entire savestate movie will be loaded and replace current movie. * If read-only, the savestate movie will be discarded * Mode will be switched to Move Finished * Savestate will be loaded * Current framecount changes to savestate framecount * User will have control of input as if Movie inactive mode */ if(movieMode != MOVIEMODE_INACTIVE) { //handle moviefile mismatch if(tempMovieData.guid != currMovieData.guid) { //mbg 8/18/08 - this code can be used to turn the error message into an OK/CANCEL #if defined(WIN32) && !defined(WXPORT) std::string msg = "There is a mismatch between savestate's movie and current movie.\ncurrent: " + currMovieData.guid.toString() + "\nsavestate: " + tempMovieData.guid.toString() + "\n\nThis means that you have loaded a savestate belonging to a different movie than the one you are playing now.\n\nContinue loading this savestate anyway?"; int result = MessageBox(MainWindow->getHWnd(),msg.c_str(),"Error loading savestate",MB_OKCANCEL); if(result == IDCANCEL) return false; #else FCEU_PrintError("Mismatch between savestate's movie and current movie.\ncurrent: %s\nsavestate: %s\n",currMovieData.guid.toString().c_str(),tempMovieData.guid.toString().c_str()); return false; #endif } closeRecordingMovie(); if(!movie_readonly) { currMovieData = tempMovieData; currMovieData.rerecordCount = currRerecordCount; } if(currFrameCounter > (int)currMovieData.records.size()) { // if the frame counter is longer than our current movie, // switch to "finished" mode. // this is a mode that behaves like "inactive" // except it permits switching to play/record by loading an earlier savestate. // (and we continue to store the finished movie in savestates made while finished) osd->setLineColor(255,0,0); // let's make the text red too to hopefully catch the user's attention a bit. FinishPlayback(); osd->setLineColor(255,255,255); //FCEU_PrintError("Savestate is from a frame (%d) after the final frame in the movie (%d). This is not permitted.", currFrameCounter, currMovieData.records.size()-1); //return false; } else if(movie_readonly) { //------------------------------------------------------------- //this code would reload the movie from disk. allegedly it is helpful to hexers, but //it is way too slow with dsm format. so it is only here as a reminder, and in case someone //wants to play with it //------------------------------------------------------------- //{ // fstream fs (curMovieFilename); // if(!LoadFM2(tempMovieData, &fs, INT_MAX, false)) // { // FCEU_PrintError("Failed to reload DSM after loading savestate"); // } // fs.close(); // currMovieData = tempMovieData; //} //------------------------------------------------------------- movieMode = MOVIEMODE_PLAY; } else { // #ifdef _S9XLUA_H // if(!FCEU_LuaRerecordCountSkip()) currRerecordCount++; // #endif currMovieData.rerecordCount = currRerecordCount; currMovieData.truncateAt(currFrameCounter); openRecordingMovie(curMovieFilename); if(!osRecordingMovie) { osd->setLineColor(255, 0, 0); osd->addLine("Can't save movie file!"); } //printf("DUMPING MOVIE: %d FRAMES\n",currMovieData.records.size()); currMovieData.dump(osRecordingMovie, false); movieMode = MOVIEMODE_RECORD; } } load_successful = true; freshMovie = false; return true; } static void FCEUMOV_PreLoad(void) { load_successful=0; } static bool FCEUMOV_PostLoad(void) { if(movieMode == MOVIEMODE_INACTIVE) return true; else return load_successful; } bool FCEUI_MovieGetInfo(EMUFILE* fp, MOVIE_INFO& info, bool skipFrameCount) { //MovieData md; //if(!LoadFM2(md, fp, INT_MAX, skipFrameCount)) // return false; // //info.movie_version = md.version; //info.poweron = md.savestate.size()==0; //info.pal = md.palFlag; //info.nosynchack = true; //info.num_frames = md.records.size(); //info.md5_of_rom_used = md.romChecksum; //info.emu_version_used = md.emuVersion; //info.name_of_rom_used = md.romFilename; //info.rerecord_count = md.rerecordCount; //info.comments = md.comments; return true; } bool MovieRecord::parseBinary(MovieData* md, EMUFILE* fp) { commands=fp->fgetc(); fp->fread((char *) &pad, sizeof pad); fp->fread((char *) &touch.x, sizeof touch.x); fp->fread((char *) &touch.y, sizeof touch.y); fp->fread((char *) &touch.touch, sizeof touch.touch); return true; } void MovieRecord::dumpBinary(MovieData* md, EMUFILE* fp, int index) { fp->fputc(md->records[index].commands); fp->fwrite((char *) &md->records[index].pad, sizeof md->records[index].pad); fp->fwrite((char *) &md->records[index].touch.x, sizeof md->records[index].touch.x); fp->fwrite((char *) &md->records[index].touch.y, sizeof md->records[index].touch.y); fp->fwrite((char *) &md->records[index].touch.touch, sizeof md->records[index].touch.touch); } void LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size) { int recordsize = 1; //1 for the command recordsize = 6; assert(size%6==0); //find out how much remains in the file int curr = fp->ftell(); fp->fseek(0,SEEK_END); int end = fp->ftell(); int flen = end-curr; fp->fseek(curr,SEEK_SET); //the amount todo is the min of the limiting size we received and the remaining contents of the file int todo = std::min(size, flen); int numRecords = todo/recordsize; //printf("LOADED MOVIE: %d records; currFrameCounter: %d\n",numRecords,currFrameCounter); movieData.records.resize(numRecords); for(int i=0;i static bool CheckFileExists(const char* filename) { //This function simply checks to see if the given filename exists string checkFilename; if (filename) checkFilename = filename; //Check if this filename exists FILE* fp = fopen(checkFilename.c_str(), "rb"); if (!fp) { return false; } else { fclose(fp); return true; } } void FCEUI_MakeBackupMovie(bool dispMessage) { //This function generates backup movie files string currentFn; //Current movie fillename string backupFn; //Target backup filename string tempFn; //temp used in back filename creation stringstream stream; int x; //Temp variable for string manip bool exist = false; //Used to test if filename exists bool overflow = false; //Used for special situation when backup numbering exceeds limit currentFn = curMovieFilename; //Get current moviefilename backupFn = curMovieFilename; //Make backup filename the same as current moviefilename x = backupFn.find_last_of("."); //Find file extension backupFn = backupFn.substr(0,x); //Remove extension tempFn = backupFn; //Store the filename at this point for (unsigned int backNum=0;backNum<999;backNum++) //999 = arbituary limit to backup files { stream.str(""); //Clear stream if (backNum > 99) stream << "-" << backNum; //assign backNum to stream else if (backNum <= 99 && backNum >= 10) stream << "-0" << backNum; //Make it 010, etc if two digits else stream << "-00" << backNum; //Make it 001, etc if single digit backupFn.append(stream.str()); //add number to bak filename backupFn.append(".bak"); //add extension exist = CheckFileExists(backupFn.c_str()); //Check if file exists if (!exist) break; //Yeah yeah, I should use a do loop or something else { backupFn = tempFn; //Before we loop again, reset the filename if (backNum == 999) //If 999 exists, we have overflowed, let's handle that { backupFn.append("-001.bak"); //We are going to simply overwrite 001.bak overflow = true; //Flag that we have exceeded limit break; //Just in case } } } MovieData md = currMovieData; //Get current movie data EMUFILE* outf = new EMUFILE_FILE(backupFn.c_str(),"wb"); //FCEUD_UTF8_fstream(backupFn, "wb"); //open/create file md.dump(outf,false); //dump movie data delete outf; //clean up, delete file object //TODO, decide if fstream successfully opened the file and print error message if it doesn't if (dispMessage) //If we should inform the user { // if (overflow) // FCEUI_DispMessage("Backup overflow, overwriting %s",backupFn.c_str()); //Inform user of overflow // else // FCEUI_DispMessage("%s created",backupFn.c_str()); //Inform user of backup filename } } desmume-0.9.9/src/slot1.cpp0000644000175000017500000000515012140261633016256 0ustar guillaumeguillaume/* Copyright (C) 2010-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include "types.h" #include "slot1.h" #include "NDSSystem.h" #include "emufile.h" #include "utils/vfat.h" extern SLOT1INTERFACE slot1None; extern SLOT1INTERFACE slot1Retail; extern SLOT1INTERFACE slot1R4; extern SLOT1INTERFACE slot1Retail_NAND; static EMUFILE* fatImage = NULL; static std::string fatDir; SLOT1INTERFACE slot1List[NDS_SLOT1_COUNT] = { slot1None, slot1Retail, slot1R4, slot1Retail_NAND }; SLOT1INTERFACE slot1_device = slot1Retail; //default for frontends that dont even configure this NDS_SLOT1_TYPE slot1_device_type = NDS_SLOT1_RETAIL; static void scanDir() { if(fatDir == "") return; if (fatImage) { delete fatImage; fatImage = NULL; } VFAT vfat; if(vfat.build(fatDir.c_str(),16)) { fatImage = vfat.detach(); } } BOOL slot1Init() { if (slot1_device_type == NDS_SLOT1_R4) scanDir(); return slot1_device.init(); } void slot1Close() { slot1_device.close(); //be careful to do this second, maybe the device will write something more if (fatImage) { delete fatImage; fatImage = NULL; } } void slot1Reset() { slot1_device.reset(); } BOOL slot1Change(NDS_SLOT1_TYPE changeToType) { if(changeToType == slot1_device_type) return FALSE; //nothing to do if (changeToType > NDS_SLOT1_COUNT || changeToType < 0) return FALSE; slot1_device.close(); slot1_device_type = changeToType; slot1_device = slot1List[slot1_device_type]; if (changeToType == NDS_SLOT1_R4) scanDir(); printf("Slot 1: %s\n", slot1_device.name); printf("sending eject signal to SLOT-1\n"); NDS_TriggerCardEjectIRQ(); return slot1_device.init(); } void slot1SetFatDir(const std::string& dir) { //printf("FAT path %s\n", dir.c_str()); fatDir = dir; } std::string slot1GetFatDir() { return fatDir; } EMUFILE* slot1GetFatImage() { return fatImage; } NDS_SLOT1_TYPE slot1GetCurrentType() { return slot1_device_type; }desmume-0.9.9/src/mc.h0000644000175000017500000001566612140261633015275 0ustar guillaumeguillaume/* Copyright (C) 2006 thoduv Copyright (C) 2006 Theo Berkau Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef __FW_H__ #define __FW_H__ #include #include #include #include "types.h" #include "emufile.h" #include "common.h" #include "utils/tinyxml/tinyxml.h" #define MAX_SAVE_TYPES 13 #define MC_TYPE_AUTODETECT 0x0 #define MC_TYPE_EEPROM1 0x1 #define MC_TYPE_EEPROM2 0x2 #define MC_TYPE_FLASH 0x3 #define MC_TYPE_FRAM 0x4 #define MC_SIZE_4KBITS 0x000200 #define MC_SIZE_64KBITS 0x002000 #define MC_SIZE_256KBITS 0x008000 #define MC_SIZE_512KBITS 0x010000 #define MC_SIZE_1MBITS 0x020000 #define MC_SIZE_2MBITS 0x040000 #define MC_SIZE_4MBITS 0x080000 #define MC_SIZE_8MBITS 0x100000 #define MC_SIZE_16MBITS 0x200000 #define MC_SIZE_32MBITS 0x400000 #define MC_SIZE_64MBITS 0x800000 #define MC_SIZE_128MBITS 0x1000000 #define MC_SIZE_256MBITS 0x2000000 #define MC_SIZE_512MBITS 0x4000000 // ============================================= ADVANsCEne #define _ADVANsCEne_BASE_ID "DeSmuME database (ADVANsCEne)\0x1A" #define _ADVANsCEne_BASE_VERSION_MAJOR 1 #define _ADVANsCEne_BASE_VERSION_MINOR 0 #define _ADVANsCEne_BASE_NAME "ADVANsCEne Nintendo DS Collection" class ADVANsCEne { private: char database_path[MAX_PATH]; // DeSmuME save types u8 versionBase[2]; char version[4]; time_t createTime; u8 saveType; u32 crc32; bool loaded; // XML const char *datName; const char *datVersion; const char *urlVersion; const char *urlDat; bool getXMLConfig(const char *in_filaname); public: ADVANsCEne() : saveType(0xFF), crc32(0), loaded(false) { memset(database_path, 0, sizeof(database_path)); memset(versionBase, 0, sizeof(versionBase)); memset(version, 0, sizeof(version)); } void setDatabase(const char *path) { loaded = false; strcpy(database_path, path); } u32 convertDB(const char *in_filaname); u8 checkDB(const char *serial); u32 getSaveType() { return saveType; } u32 getCRC32() { return crc32; } bool isLoaded() { return loaded; } }; struct memory_chip_t { u8 com; //persistent command actually handled u32 addr; //current address for reading/writing u8 addr_shift; //shift for address (since addresses are transfered by 3 bytes units) u8 addr_size; //size of addr when writing/reading BOOL write_enable; //is write enabled ? u8 *data; //memory data u32 size; //memory size BOOL writeable_buffer; //is "data" writeable ? int type; //type of Memory char *filename; FILE *fp; u8 autodetectbuf[32768]; int autodetectsize; // needs only for firmware bool isFirmware; char userfile[MAX_PATH]; }; //the new backup system by zeromus class BackupDevice { public: BackupDevice(); //signals the save system that we are in our regular mode, loading up a rom. initializes for that case. void load_rom(const char* filename); //signals the save system that we are in MOVIE mode. doesnt load up a rom, and never saves it. initializes for that case. void movie_mode(); void reset(); void close_rom(); void forceManualBackupType(); void reset_hardware(); std::string getFilename() { return filename; } u8 searchFileSaveType(u32 size); bool save_state(EMUFILE* os); bool load_state(EMUFILE* is); //commands from mmu void reset_command(); u8 data_command(u8,int); std::vector data; //this info was saved before the last reset (used for savestate compatibility) struct SavedInfo { u32 addr_size; } savedInfo; //and these are used by old savestates void load_old_state(u32 addr_size, u8* data, u32 datasize); static u32 addr_size_for_old_save_size(int bupmem_size); static u32 addr_size_for_old_save_type(int bupmem_type); static u32 pad_up_size(u32 startSize); void raw_applyUserSettings(u32& size, bool manual = false); bool load_duc(const char* filename, u32 force_size = 0); bool load_no_gba(const char *fname, u32 force_size = 0); bool save_no_gba(const char* fname); bool load_raw(const char* filename, u32 force_size = 0); bool save_raw(const char* filename); bool load_movie(EMUFILE* is); u32 get_save_duc_size(const char* filename); u32 get_save_nogba_size(const char* filename); u32 get_save_raw_size(const char* filename); //call me once a second or so to lazy flush the save data //here's the reason for this system: we want to dump save files when theyre READ //so that we have a better idea earlier on how large they are. but it slows things down //way too much if we flush whenever we read. void lazy_flush(); void flush(); struct { u32 size,padSize,type,addr_size,mem_size; } info; bool isMovieMode; private: std::string filename; bool write_enable; //is write enabled? u32 com; //persistent command actually handled u32 addr_size, addr_counter; u32 addr; std::vector data_autodetect; enum STATE { DETECTING = 0, RUNNING = 1 } state; enum MOTION_INIT_STATE { MOTION_INIT_STATE_IDLE, MOTION_INIT_STATE_RECEIVED_4, MOTION_INIT_STATE_RECEIVED_4_B, MOTION_INIT_STATE_FE, MOTION_INIT_STATE_FD, MOTION_INIT_STATE_FB }; enum MOTION_FLAG { MOTION_FLAG_NONE=0, MOTION_FLAG_ENABLED=1, MOTION_FLAG_SENSORMODE=2 }; u8 motionInitState, motionFlag; void loadfile(); bool _loadfile(const char *fname); void ensure(u32 addr); bool flushPending, lazyFlushPending; private: void resize(u32 size); }; #define NDS_FW_SIZE_V1 (256 * 1024) /* size of fw memory on nds v1 */ #define NDS_FW_SIZE_V2 (512 * 1024) /* size of fw memory on nds v2 */ void mc_init(memory_chip_t *mc, int type); /* reset and init values for memory struct */ u8 *mc_alloc(memory_chip_t *mc, u32 size); /* alloc mc memory */ void mc_realloc(memory_chip_t *mc, int type, u32 size); /* realloc mc memory */ void mc_load_file(memory_chip_t *mc, const char* filename); /* load save file and setup fp */ void mc_free(memory_chip_t *mc); /* delete mc memory */ void fw_reset_com(memory_chip_t *mc); /* reset communication with mc */ u8 fw_transfer(memory_chip_t *mc, u8 data); void backup_setManualBackupType(int type); void backup_forceManualBackupType(); struct SAVE_TYPE { const char* descr; int media_type; int size; }; extern const SAVE_TYPE save_types[]; #endif /*__FW_H__*/ desmume-0.9.9/src/desmume_config.h0000644000175000017500000000177112140261633017652 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _DESMUME_GTK_CONFIG #define _DESMUME_GTK_CONFIG GKeyFile *desmume_config_read_file(const u16 *); void desmume_config_dispose(GKeyFile *); gboolean desmume_config_update_keys(GKeyFile*); gboolean desmume_config_update_joykeys(GKeyFile*); gboolean desmume_config_read_keys(GKeyFile*); gboolean desmume_config_read_joykeys(GKeyFile*); #endif desmume-0.9.9/src/Disassembler.h0000644000175000017500000000166712140261633017307 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef DISASSEMBLER_H #define DISASSEMBLER_H #include "types.h" typedef char* (* DisasmOpFunc)(u32 adr, u32 i, char * txt); extern const DisasmOpFunc des_arm_instructions_set[4096]; extern const DisasmOpFunc des_thumb_instructions_set[1024]; #endif desmume-0.9.9/src/utils/0000755000175000017500000000000012140305317015645 5ustar guillaumeguillaumedesmume-0.9.9/src/utils/ConvertUTF.h0000644000175000017500000001357712140261631020032 0ustar guillaumeguillaume/* * Copyright 2001-2004 Unicode, Inc. * * Disclaimer * * This source code is provided as is by Unicode, Inc. No claims are * made as to fitness for any particular purpose. No warranties of any * kind are expressed or implied. The recipient agrees to determine * applicability of information provided. If this file has been * purchased on magnetic or optical media from Unicode, Inc., the * sole remedy for any claim will be exchange of defective media * within 90 days of receipt. * * Limitations on Rights to Redistribute This Code * * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. */ /* --------------------------------------------------------------------- Conversions between UTF32, UTF-16, and UTF-8. Header file. Several funtions are included here, forming a complete set of conversions between the three formats. UTF-7 is not included here, but is handled in a separate source file. Each of these routines takes pointers to input buffers and output buffers. The input buffers are const. Each routine converts the text between *sourceStart and sourceEnd, putting the result into the buffer between *targetStart and targetEnd. Note: the end pointers are *after* the last item: e.g. *(sourceEnd - 1) is the last item. The return result indicates whether the conversion was successful, and if not, whether the problem was in the source or target buffers. (Only the first encountered problem is indicated.) After the conversion, *sourceStart and *targetStart are both updated to point to the end of last text successfully converted in the respective buffers. Input parameters: sourceStart - pointer to a pointer to the source buffer. The contents of this are modified on return so that it points at the next thing to be converted. targetStart - similarly, pointer to pointer to the target buffer. sourceEnd, targetEnd - respectively pointers to the ends of the two buffers, for overflow checking only. These conversion functions take a ConversionFlags argument. When this flag is set to strict, both irregular sequences and isolated surrogates will cause an error. When the flag is set to lenient, both irregular sequences and isolated surrogates are converted. Whether the flag is strict or lenient, all illegal sequences will cause an error return. This includes sequences such as: , , or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code must check for illegal sequences. When the flag is set to lenient, characters over 0x10FFFF are converted to the replacement character; otherwise (when the flag is set to strict) they constitute an error. Output parameters: The value "sourceIllegal" is returned from some routines if the input sequence is malformed. When "sourceIllegal" is returned, the source value will point to the illegal value that caused the problem. E.g., in UTF-8 when a sequence is malformed, it points to the start of the malformed sequence. Author: Mark E. Davis, 1994. Rev History: Rick McGowan, fixes & updates May 2001. Fixes & updates, Sept 2001. ------------------------------------------------------------------------ */ /* --------------------------------------------------------------------- The following 4 definitions are compiler-specific. The C standard does not guarantee that wchar_t has at least 16 bits, so wchar_t is no less portable than unsigned short! All should be unsigned values to avoid sign extension during bit mask & shift operations. ------------------------------------------------------------------------ */ #if defined(_MSC_VER) typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #else #include #endif typedef uint32_t UTF32; typedef uint16_t UTF16; typedef uint8_t UTF8; typedef uint8_t Boolean; /* 0 or 1 */ /* Some fundamental constants */ #define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD #define UNI_MAX_BMP (UTF32)0x0000FFFF #define UNI_MAX_UTF16 (UTF32)0x0010FFFF #define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF #define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF typedef enum { conversionOK, /* conversion successful */ sourceExhausted, /* partial character in source, but hit end */ targetExhausted, /* insuff. room in target for conversion */ sourceIllegal /* source sequence is illegal/malformed */ } ConversionResult; typedef enum { strictConversion = 0, lenientConversion } ConversionFlags; /* This is for C++ and does no harm in C */ #ifdef __cplusplus extern "C" { #endif ConversionResult ConvertUTF8toUTF16 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF16toUTF8 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF8toUTF32 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF32toUTF8 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF16toUTF32 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF32toUTF16 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); #ifdef __cplusplus } #endif /* --------------------------------------------------------------------- */ desmume-0.9.9/src/utils/task.cpp0000644000175000017500000001460712140261631017323 0ustar guillaumeguillaume/* Copyright (C) 2009-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "types.h" #include "task.h" #include #ifdef _WINDOWS #include #else #include #endif #ifdef _MSC_VER class Task::Impl { public: Impl(); ~Impl(); bool spinlock; void start(bool spinlock); void shutdown(); //execute some work void execute(const TWork &work, void* param); //wait for the work to complete void* finish(); static DWORD __stdcall s_taskProc(void *ptr); void taskProc(); void init(); //the work function that shall be executed TWork workFunc; void* workFuncParam; HANDLE incomingWork, workDone, hThread; volatile bool bIncomingWork, bWorkDone, bKill; bool bStarted; }; static void* killTask(void* task) { ((Task::Impl*)task)->bKill = true; return 0; } Task::Impl::~Impl() { shutdown(); } Task::Impl::Impl() : workFunc(NULL) , bIncomingWork(false) , bWorkDone(true) , bKill(false) , bStarted(false) , incomingWork(INVALID_HANDLE_VALUE) , workDone(INVALID_HANDLE_VALUE) , hThread(INVALID_HANDLE_VALUE) { } DWORD __stdcall Task::Impl::s_taskProc(void *ptr) { //just past the buck to the instance method ((Task::Impl*)ptr)->taskProc(); return 0; } void Task::Impl::taskProc() { for(;;) { if(bKill) break; //wait for a chunk of work if(spinlock) while(!bIncomingWork) Sleep(0); else WaitForSingleObject(incomingWork,INFINITE); bIncomingWork = false; //execute the work workFuncParam = workFunc(workFuncParam); //signal completion bWorkDone = true; if(!spinlock) SetEvent(workDone); } } void Task::Impl::start(bool spinlock) { bIncomingWork = false; bWorkDone = true; bKill = false; bStarted = true; this->spinlock = spinlock; incomingWork = CreateEvent(NULL,FALSE,FALSE,NULL); workDone = CreateEvent(NULL,FALSE,FALSE,NULL); hThread = CreateThread(NULL,0,Task::Impl::s_taskProc,(void*)this, 0, NULL); } void Task::Impl::shutdown() { if(!bStarted) return; bStarted = false; execute(killTask,this); finish(); CloseHandle(incomingWork); CloseHandle(workDone); CloseHandle(hThread); incomingWork = INVALID_HANDLE_VALUE; workDone = INVALID_HANDLE_VALUE; hThread = INVALID_HANDLE_VALUE; } void Task::Impl::execute(const TWork &work, void* param) { //setup the work this->workFunc = work; this->workFuncParam = param; bWorkDone = false; //signal it to start if(!spinlock) SetEvent(incomingWork); bIncomingWork = true; } void* Task::Impl::finish() { //just wait for the work to be done if(spinlock) { while(!bWorkDone) Sleep(0); } else { while(!bWorkDone) WaitForSingleObject(workDone, INFINITE); } return workFuncParam; } #else class Task::Impl { private: pthread_t _thread; bool _isThreadRunning; public: Impl(); ~Impl(); void start(bool spinlock); void execute(const TWork &work, void *param); void* finish(); void shutdown(); pthread_mutex_t mutex; pthread_cond_t condWork; TWork workFunc; void *workFuncParam; void *ret; bool exitThread; }; static void* taskProc(void *arg) { Task::Impl *ctx = (Task::Impl *)arg; do { pthread_mutex_lock(&ctx->mutex); while (ctx->workFunc == NULL && !ctx->exitThread) { pthread_cond_wait(&ctx->condWork, &ctx->mutex); } if (ctx->workFunc != NULL) { ctx->ret = ctx->workFunc(ctx->workFuncParam); } else { ctx->ret = NULL; } ctx->workFunc = NULL; pthread_cond_signal(&ctx->condWork); pthread_mutex_unlock(&ctx->mutex); } while(!ctx->exitThread); return NULL; } Task::Impl::Impl() { _isThreadRunning = false; workFunc = NULL; workFuncParam = NULL; ret = NULL; exitThread = false; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&condWork, NULL); } Task::Impl::~Impl() { shutdown(); pthread_mutex_destroy(&mutex); pthread_cond_destroy(&condWork); } void Task::Impl::start(bool spinlock) { pthread_mutex_lock(&this->mutex); if (this->_isThreadRunning) { pthread_mutex_unlock(&this->mutex); return; } this->workFunc = NULL; this->workFuncParam = NULL; this->ret = NULL; this->exitThread = false; pthread_create(&this->_thread, NULL, &taskProc, this); this->_isThreadRunning = true; pthread_mutex_unlock(&this->mutex); } void Task::Impl::execute(const TWork &work, void *param) { pthread_mutex_lock(&this->mutex); if (work == NULL || !this->_isThreadRunning) { pthread_mutex_unlock(&this->mutex); return; } this->workFunc = work; this->workFuncParam = param; pthread_cond_signal(&this->condWork); pthread_mutex_unlock(&this->mutex); } void* Task::Impl::finish() { void *returnValue = NULL; pthread_mutex_lock(&this->mutex); if (!this->_isThreadRunning) { pthread_mutex_unlock(&this->mutex); return returnValue; } while (this->workFunc != NULL) { pthread_cond_wait(&this->condWork, &this->mutex); } returnValue = this->ret; pthread_mutex_unlock(&this->mutex); return returnValue; } void Task::Impl::shutdown() { pthread_mutex_lock(&this->mutex); if (!this->_isThreadRunning) { pthread_mutex_unlock(&this->mutex); return; } this->workFunc = NULL; this->exitThread = true; pthread_cond_signal(&this->condWork); pthread_mutex_unlock(&this->mutex); pthread_join(this->_thread, NULL); pthread_mutex_lock(&this->mutex); this->_isThreadRunning = false; pthread_mutex_unlock(&this->mutex); } #endif void Task::start(bool spinlock) { impl->start(spinlock); } void Task::shutdown() { impl->shutdown(); } Task::Task() : impl(new Task::Impl()) {} Task::~Task() { delete impl; } void Task::execute(const TWork &work, void* param) { impl->execute(work,param); } void* Task::finish() { return impl->finish(); } desmume-0.9.9/src/utils/emufat_types.h0000644000175000017500000000014112140261631020517 0ustar guillaumeguillaume#ifndef EMUFAT_TYPES_H #define EMUFAT_TYPES_H #include "types.h" #endif //EMUFAT_TYPES_H desmume-0.9.9/src/utils/md5.cpp0000644000175000017500000001552112140261631017042 0ustar guillaumeguillaume/// \file /// \brief RFC 1321 compliant MD5 implementation, /// RFC 1321 compliant MD5 implementation, /// by Christophe Devine ; /// this program is licensed under the GPL. //Modified October 3, 2003, to remove testing code, and add include of "types.h". //Added simple MD5 to ASCII string conversion function. // -Xodnizel #include #include "../types.h" #include "md5.h" typedef u8 uint8; typedef u16 uint16; typedef u32 uint32; #define GET_UINT32(n,b,i) \ { \ (n) = ( (uint32) (b)[(i) + 3] << 24 ) \ | ( (uint32) (b)[(i) + 2] << 16 ) \ | ( (uint32) (b)[(i) + 1] << 8 ) \ | ( (uint32) (b)[(i) ] ); \ } #define PUT_UINT32(n,b,i) \ { \ (b)[(i) ] = (uint8) ( (n) ); \ (b)[(i) + 1] = (uint8) ( (n) >> 8 ); \ (b)[(i) + 2] = (uint8) ( (n) >> 16 ); \ (b)[(i) + 3] = (uint8) ( (n) >> 24 ); \ } void md5_starts( struct md5_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; } static void md5_process( struct md5_context *ctx, uint8 data[64] ) { uint32 A, B, C, D, X[16]; GET_UINT32( X[0], data, 0 ); GET_UINT32( X[1], data, 4 ); GET_UINT32( X[2], data, 8 ); GET_UINT32( X[3], data, 12 ); GET_UINT32( X[4], data, 16 ); GET_UINT32( X[5], data, 20 ); GET_UINT32( X[6], data, 24 ); GET_UINT32( X[7], data, 28 ); GET_UINT32( X[8], data, 32 ); GET_UINT32( X[9], data, 36 ); GET_UINT32( X[10], data, 40 ); GET_UINT32( X[11], data, 44 ); GET_UINT32( X[12], data, 48 ); GET_UINT32( X[13], data, 52 ); GET_UINT32( X[14], data, 56 ); GET_UINT32( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define P(a,b,c,d,k,s,t) \ { \ a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; #define F(x,y,z) (z ^ (x & (y ^ z))) P( A, B, C, D, 0, 7, 0xD76AA478 ); P( D, A, B, C, 1, 12, 0xE8C7B756 ); P( C, D, A, B, 2, 17, 0x242070DB ); P( B, C, D, A, 3, 22, 0xC1BDCEEE ); P( A, B, C, D, 4, 7, 0xF57C0FAF ); P( D, A, B, C, 5, 12, 0x4787C62A ); P( C, D, A, B, 6, 17, 0xA8304613 ); P( B, C, D, A, 7, 22, 0xFD469501 ); P( A, B, C, D, 8, 7, 0x698098D8 ); P( D, A, B, C, 9, 12, 0x8B44F7AF ); P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); P( B, C, D, A, 11, 22, 0x895CD7BE ); P( A, B, C, D, 12, 7, 0x6B901122 ); P( D, A, B, C, 13, 12, 0xFD987193 ); P( C, D, A, B, 14, 17, 0xA679438E ); P( B, C, D, A, 15, 22, 0x49B40821 ); #undef F #define F(x,y,z) (y ^ (z & (x ^ y))) P( A, B, C, D, 1, 5, 0xF61E2562 ); P( D, A, B, C, 6, 9, 0xC040B340 ); P( C, D, A, B, 11, 14, 0x265E5A51 ); P( B, C, D, A, 0, 20, 0xE9B6C7AA ); P( A, B, C, D, 5, 5, 0xD62F105D ); P( D, A, B, C, 10, 9, 0x02441453 ); P( C, D, A, B, 15, 14, 0xD8A1E681 ); P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); P( A, B, C, D, 9, 5, 0x21E1CDE6 ); P( D, A, B, C, 14, 9, 0xC33707D6 ); P( C, D, A, B, 3, 14, 0xF4D50D87 ); P( B, C, D, A, 8, 20, 0x455A14ED ); P( A, B, C, D, 13, 5, 0xA9E3E905 ); P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); P( C, D, A, B, 7, 14, 0x676F02D9 ); P( B, C, D, A, 12, 20, 0x8D2A4C8A ); #undef F #define F(x,y,z) (x ^ y ^ z) P( A, B, C, D, 5, 4, 0xFFFA3942 ); P( D, A, B, C, 8, 11, 0x8771F681 ); P( C, D, A, B, 11, 16, 0x6D9D6122 ); P( B, C, D, A, 14, 23, 0xFDE5380C ); P( A, B, C, D, 1, 4, 0xA4BEEA44 ); P( D, A, B, C, 4, 11, 0x4BDECFA9 ); P( C, D, A, B, 7, 16, 0xF6BB4B60 ); P( B, C, D, A, 10, 23, 0xBEBFBC70 ); P( A, B, C, D, 13, 4, 0x289B7EC6 ); P( D, A, B, C, 0, 11, 0xEAA127FA ); P( C, D, A, B, 3, 16, 0xD4EF3085 ); P( B, C, D, A, 6, 23, 0x04881D05 ); P( A, B, C, D, 9, 4, 0xD9D4D039 ); P( D, A, B, C, 12, 11, 0xE6DB99E5 ); P( C, D, A, B, 15, 16, 0x1FA27CF8 ); P( B, C, D, A, 2, 23, 0xC4AC5665 ); #undef F #define F(x,y,z) (y ^ (x | ~z)) P( A, B, C, D, 0, 6, 0xF4292244 ); P( D, A, B, C, 7, 10, 0x432AFF97 ); P( C, D, A, B, 14, 15, 0xAB9423A7 ); P( B, C, D, A, 5, 21, 0xFC93A039 ); P( A, B, C, D, 12, 6, 0x655B59C3 ); P( D, A, B, C, 3, 10, 0x8F0CCC92 ); P( C, D, A, B, 10, 15, 0xFFEFF47D ); P( B, C, D, A, 1, 21, 0x85845DD1 ); P( A, B, C, D, 8, 6, 0x6FA87E4F ); P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); P( C, D, A, B, 6, 15, 0xA3014314 ); P( B, C, D, A, 13, 21, 0x4E0811A1 ); P( A, B, C, D, 4, 6, 0xF7537E82 ); P( D, A, B, C, 11, 10, 0xBD3AF235 ); P( C, D, A, B, 2, 15, 0x2AD7D2BB ); P( B, C, D, A, 9, 21, 0xEB86D391 ); #undef F ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; } void md5_update( struct md5_context *ctx, uint8 *input, uint32 length ) { uint32 left, fill; if( ! length ) return; left = ( ctx->total[0] >> 3 ) & 0x3F; fill = 64 - left; ctx->total[0] += length << 3; ctx->total[1] += length >> 29; ctx->total[0] &= 0xFFFFFFFF; ctx->total[1] += ctx->total[0] < ( length << 3 ); if( left && length >= fill ) { memcpy( (void *) (ctx->buffer + left), (void *) input, fill ); md5_process( ctx, ctx->buffer ); length -= fill; input += fill; left = 0; } while( length >= 64 ) { md5_process( ctx, input ); length -= 64; input += 64; } if( length ) { memcpy( (void *) (ctx->buffer + left), (void *) input, length ); } } static uint8 md5_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; void md5_finish( struct md5_context *ctx, uint8 digest[16] ) { uint32 last, padn; uint8 msglen[8]; PUT_UINT32( ctx->total[0], msglen, 0 ); PUT_UINT32( ctx->total[1], msglen, 4 ); last = ( ctx->total[0] >> 3 ) & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); md5_update( ctx, md5_padding, padn ); md5_update( ctx, msglen, 8 ); PUT_UINT32( ctx->state[0], digest, 0 ); PUT_UINT32( ctx->state[1], digest, 4 ); PUT_UINT32( ctx->state[2], digest, 8 ); PUT_UINT32( ctx->state[3], digest, 12 ); } /* Uses a static buffer, so beware of how it's used. */ char *md5_asciistr(MD5DATA& md5) { uint8* digest = md5.data; static char str[33]; static char trans[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; int x; for(x=0;x<16;x++) { str[x*2]=trans[digest[x]>>4]; str[x*2+1]=trans[digest[x]&0x0F]; } return(str); } desmume-0.9.9/src/utils/emufat.h0000644000175000017500000006443612140261631017314 0ustar guillaumeguillaume/* Copyright 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ //based on Arduino SdFat Library ( http://code.google.com/p/sdfatlib/ ) //Copyright (C) 2009 by William Greiman //based on mkdosfs - utility to create FAT/MS-DOS filesystems //Copyright (C) 1991 Linus Torvalds //Copyright (C) 1992-1993 Remy Card //Copyright (C) 1993-1994 David Hudson //Copyright (C) 1998 H. Peter Anvin //Copyright (C) 1998-2005 Roman Hodek //based on libfat //Copyright (c) 2006 Michael "Chishm" Chisholm #ifndef EMUFAT_H #define EMUFAT_H #include "emufat_types.h" #include "emufile.h" #include #define BOOTCODE_SIZE 448 #define BOOTCODE_FAT32_SIZE 420 // use the gnu style oflag in open() /** open() oflag for reading */ static const u8 EO_READ = 0X01; /** open() oflag - same as O_READ */ static const u8 EO_RDONLY = EO_READ; /** open() oflag for write */ static const u8 EO_WRITE = 0X02; /** open() oflag - same as O_WRITE */ static const u8 EO_WRONLY = EO_WRITE; /** open() oflag for reading and writing */ static const u8 EO_RDWR = (EO_READ | EO_WRITE); /** open() oflag mask for access modes */ static const u8 EO_ACCMODE = (EO_READ | EO_WRITE); /** The file offset shall be set to the end of the file prior to each write. */ static const u8 EO_APPEND = 0X04; /** synchronous writes - call sync() after each write */ static const u8 EO_SYNC = 0X08; /** create the file if nonexistent */ static const u8 EO_CREAT = 0X10; /** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */ static const u8 EO_EXCL = 0X20; /** truncate the file to zero length */ static const u8 EO_TRUNC = 0X40; //Value for byte 510 of boot block or MBR static const u8 BOOTSIG0 = 0X55; //Value for byte 511 of boot block or MBR static const u8 BOOTSIG1 = 0XAA; static void (*dateTime_)(u16* date, u16* time) = NULL; #include "PACKED.h" //A partition table entry for a MBR formatted storage device. //The MBR partition table has four entries. struct __PACKED TPartitionRecord { //Boot Indicator . Indicates whether the volume is the active //partition. Legal values include: 0X00. Do not use for booting. //0X80 Active partition. u8 boot; //Head part of Cylinder-head-sector address of the first block in //the partition. Legal values are 0-255. Only used in old PC BIOS. u8 beginHead; struct { //Sector part of Cylinder-head-sector address of the first block in //the partition. Legal values are 1-63. Only used in old PC BIOS. u32 beginSector : 6; //High bits cylinder for first block in partition. u32 beginCylinderHigh : 2; }; //Combine beginCylinderLow with beginCylinderHigh. Legal values //are 0-1023. Only used in old PC BIOS. u8 beginCylinderLow; //Partition type. See defines that begin with PART_TYPE_ for //some Microsoft partition types. u8 type; //head part of cylinder-head-sector address of the last sector in the //partition. Legal values are 0-255. Only used in old PC BIOS. u8 endHead; struct { //Sector part of cylinder-head-sector address of the last sector in //the partition. Legal values are 1-63. Only used in old PC BIOS. u32 endSector : 6; // High bits of end cylinder u32 endCylinderHigh : 2; }; //Combine endCylinderLow with endCylinderHigh. Legal values //are 0-1023. Only used in old PC BIOS. u8 endCylinderLow; //Logical block address of the first block in the partition. u32 firstSector; //Length of the partition, in blocks. u32 totalSectors; }; //Master Boot Record: //The first block of a storage device that is formatted with a MBR. struct __PACKED TMasterBootRecord { //Code Area for master boot program. u8 codeArea[440]; //Optional WindowsNT disk signature. May contain more boot code. u32 diskSignature; //Usually zero but may be more boot code. u16 usuallyZero; //Partition tables. TPartitionRecord part[4]; //First MBR signature byte. Must be 0X55 u8 mbrSig0; //Second MBR signature byte. Must be 0XAA u8 mbrSig1; }; struct __PACKED msdos_volume_info { u8 drive_number; /* BIOS drive number */ u8 RESERVED; /* Unused */ u8 ext_boot_sign; /* 0x29 if fields below exist (DOS 3.3+) */ u32 volume_id; /* Volume ID number */ u8 volume_label[11];/* Volume label */ u8 fs_type[8]; /* Typically FAT12 or FAT16 */ }; //Boot sector for a FAT16 or FAT32 volume. struct __PACKED TFat32BootSector { //X86 jmp to boot program u8 jmpToBootCode[3]; //informational only - don't depend on it u8 oemName[8]; //Count of bytes per sector. This value may take on only the //following values: 512, 1024, 2048 or 4096 u16 bytesPerSector; //Number of sectors per allocation unit. This value must be a //power of 2 that is greater than 0. The legal values are //1, 2, 4, 8, 16, 32, 64, and 128. u8 sectorsPerCluster; //cluster_size //Number of sectors before the first FAT. //This value must not be zero. u16 reservedSectorCount; //The count of FAT data structures on the volume. This field should //always contain the value 2 for any FAT volume of any type. u8 fatCount; //For FAT12 and FAT16 volumes, this field contains the count of //32-byte directory entries in the root directory. For FAT32 volumes, //this field must be set to 0. For FAT12 and FAT16 volumes, this //value should always specify a count that when multiplied by 32 //results in a multiple of bytesPerSector. FAT16 volumes should //use the value 512. u16 rootDirEntryCount; //dir_entries //This field is the old 16-bit total count of sectors on the volume. //This count includes the count of all sectors in all four regions //of the volume. This field can be 0; if it is 0, then totalSectors32 //must be non-zero. For FAT32 volumes, this field must be 0. For //FAT12 and FAT16 volumes, this field contains the sector count, and //totalSectors32 is 0 if the total sector count fits //(is less than 0x10000). u16 totalSectors16; //This dates back to the old MS-DOS 1.x media determination and is //no longer usually used for anything. 0xF8 is the standard value //for fixed (non-removable) media. For removable media, 0xF0 is //frequently used. Legal values are 0xF0 or 0xF8-0xFF. u8 mediaType; //Count of sectors occupied by one FAT on FAT12/FAT16 volumes. //On FAT32 volumes this field must be 0, and sectorsPerFat32 //contains the FAT size count. u16 sectorsPerFat16; //Sectors per track for interrupt 0x13. Not used otherwise. u16 sectorsPerTrack; //Number of heads for interrupt 0x13. Not used otherwise. u16 headCount; //Count of hidden sectors preceding the partition that contains this //FAT volume. This field is generally only relevant for media //visible on interrupt 0x13. u32 hiddenSectors; //This field is the new 32-bit total count of sectors on the volume. //This count includes the count of all sectors in all four regions //of the volume. This field can be 0; if it is 0, then //totalSectors16 must be non-zero. u32 totalSectors32; union { struct __PACKED { msdos_volume_info vi; u8 boot_code[BOOTCODE_SIZE]; } oldfat; struct __PACKED { //Count of sectors occupied by one FAT on FAT32 volumes. u32 sectorsPerFat32; //fat32_length; /* sectors/FAT */ //This field is only defined for FAT32 media and does not exist on //FAT12 and FAT16 media. //Bits 0-3 -- Zero-based number of active FAT. // Only valid if mirroring is disabled. //Bits 4-6 -- Reserved. //Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. // -- 1 means only one FAT is active; it is the one referenced in bits 0-3. //Bits 8-15 -- Reserved. u16 fat32Flags;// flags; /* bit 8: fat mirroring, low 4: active fat */ //FAT32 version. High byte is major revision number. //Low byte is minor revision number. Only 0.0 define. u16 fat32Version;//version[2]; /* major, minor filesystem version */ //Cluster number of the first cluster of the root directory for FAT32. //This usually 2 but not required to be 2. u32 fat32RootCluster; //root_cluster; /* first cluster in root directory */ //Sector number of FSINFO structure in the reserved area of the //FAT32 volume. Usually 1. u16 fat32FSInfo;// info_sector; /* filesystem info sector */ //If non-zero, indicates the sector number in the reserved area //of the volume of a copy of the boot record. Usually 6. //No value other than 6 is recommended. u16 fat32BackBootBlock; //backup_boot; /* backup boot sector */ //Reserved for future expansion. Code that formats FAT32 volumes //should always set all of the bytes of this field to 0. u8 fat32Reserved[12]; //reserved2[6]; /* Unused */ msdos_volume_info vi; u8 boot_code[BOOTCODE_FAT32_SIZE]; } fat32; }; u8 boot_sign[2]; }; #include "PACKED_END.h" // End Of Chain values for FAT entries //FAT16 end of chain value used by Microsoft. static const u16 FAT16EOC = 0XFFFF; //Minimum value for FAT16 EOC. Use to test for EOC. static const u16 FAT16EOC_MIN = 0XFFF8; //FAT32 end of chain value used by Microsoft. static const u32 FAT32EOC = 0X0FFFFFFF; //Minimum value for FAT32 EOC. Use to test for EOC. static const u32 FAT32EOC_MIN = 0X0FFFFFF8; //Mask a for FAT32 entry. Entries are 28 bits. static const u32 FAT32MASK = 0X0FFFFFFF; //------------------------------------------------------------------------------ //\struct directoryEntry //\brief FAT short directory entry //Short means short 8.3 name, not the entry size. // //Date Format. A FAT directory entry date stamp is a 16-bit field that is //basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the //format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the //16-bit word): // //Bits 9-15: Count of years from 1980, valid value range 0-127 //inclusive (1980-2107). // //Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive. //Bits 0-4: Day of month, valid value range 1-31 inclusive. //Time Format. A FAT directory entry time stamp is a 16-bit field that has //a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the //16-bit word, bit 15 is the MSB of the 16-bit word). // //Bits 11-15: Hours, valid value range 0-23 inclusive. // //Bits 5-10: Minutes, valid value range 0-59 inclusive. // //Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds). // //The valid time range is from Midnight 00:00:00 to 23:59:58. struct TDirectoryEntry { //Short 8.3 name. //The first eight bytes contain the file name with blank fill. //The last three bytes contain the file extension with blank fill. u8 name[11]; //Entry attributes. //The upper two bits of the attribute byte are reserved and should //always be set to 0 when a file is created and never modified or //looked at after that. See defines that begin with DIR_ATT_. u8 attributes; //Reserved for use by Windows NT. Set value to 0 when a file is //created and never modify or look at it after that. u8 reservedNT; //The granularity of the seconds part of creationTime is 2 seconds //so this field is a count of tenths of a second and its valid //value range is 0-199 inclusive. (WHG note - seems to be hundredths) u8 creationTimeTenths; //Time file was created. u16 creationTime; //Date file was created. u16 creationDate; //Last access date. Note that there is no last access time, only //a date. This is the date of last read or write. In the case of //a write, this should be set to the same date as lastWriteDate. u16 lastAccessDate; //High word of this entry's first cluster number (always 0 for a //FAT12 or FAT16 volume). u16 firstClusterHigh; //Time of last write. File creation is considered a write. u16 lastWriteTime; // Date of last write. File creation is considered a write. u16 lastWriteDate; // Low word of this entry's first cluster number. u16 firstClusterLow; //32-bit unsigned holding this file's size in bytes. u32 fileSize; }; //escape for name[0] = 0xE5 static const u8 DIR_NAME_0XE5 = 0x05; //name[0] value for entry that is free after being "deleted" static const u8 DIR_NAME_DELETED = 0xE5; //name[0] value for entry that is free and no allocated entries follow static const u8 DIR_NAME_FREE = 0x00; //file is read-only static const u8 DIR_ATT_READ_ONLY = 0x01; //File should hidden in directory listings static const u8 DIR_ATT_HIDDEN = 0x02; //Entry is for a system file static const u8 DIR_ATT_SYSTEM = 0x04; //Directory entry contains the volume label static const u8 DIR_ATT_VOLUME_ID = 0x08; //Entry is for a directory static const u8 DIR_ATT_DIRECTORY = 0x10; //Old DOS archive bit for backup support static const u8 DIR_ATT_ARCHIVE = 0x20; //Test value for long name entry. Test is //(d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. static const u8 DIR_ATT_LONG_NAME = 0x0F; //Test mask for long name entry static const u8 DIR_ATT_LONG_NAME_MASK = 0x3F; //defined attribute bits static const u8 DIR_ATT_DEFINED_BITS = 0x3F; //Directory entry is part of a long name static inline u8 DIR_IS_LONG_NAME(const TDirectoryEntry* dir) { return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; } //Mask for file/subdirectory tests static const u8 DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); //Directory entry is for a file static inline u8 DIR_IS_FILE(const TDirectoryEntry* dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; } //Directory entry is for a subdirectory static inline u8 DIR_IS_SUBDIR(const TDirectoryEntry* dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; } //Directory entry is for a file or subdirectory static inline u8 DIR_IS_FILE_OR_SUBDIR(const TDirectoryEntry* dir) { return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; } // flags for timestamp /** set the file's last access date */ static const u8 T_ACCESS = 1; /** set the file's creation date and time */ static const u8 T_CREATE = 2; /** Set the file's write date and time */ static const u8 T_WRITE = 4; // values for type_ /** This SdFile has not been opened. */ static const u8 FAT_FILE_TYPE_CLOSED = 0; /** SdFile for a file */ static const u8 FAT_FILE_TYPE_NORMAL = 1; /** SdFile for a FAT16 root directory */ static const u8 FAT_FILE_TYPE_ROOT16 = 2; /** SdFile for a FAT32 root directory */ static const u8 FAT_FILE_TYPE_ROOT32 = 3; /** SdFile for a subdirectory */ static const u8 FAT_FILE_TYPE_SUBDIR = 4; /** Test value for directory type */ static const u8 FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16; /** date field for FAT directory entry */ static inline u16 FAT_DATE(u16 year, u8 month, u8 day) { return (year - 1980) << 9 | month << 5 | day; } /** year part of FAT directory date field */ static inline u16 FAT_YEAR(u16 fatDate) { return 1980 + (fatDate >> 9); } /** month part of FAT directory date field */ static inline u8 FAT_MONTH(u16 fatDate) { return (fatDate >> 5) & 0XF; } /** day part of FAT directory date field */ static inline u8 FAT_DAY(u16 fatDate) { return fatDate & 0X1F; } /** time field for FAT directory entry */ static inline u16 FAT_TIME(u8 hour, u8 minute, u8 second) { return hour << 11 | minute << 5 | second >> 1; } /** hour part of FAT directory time field */ static inline u8 FAT_HOUR(u16 fatTime) { return fatTime >> 11; } /** minute part of FAT directory time field */ static inline u8 FAT_MINUTE(u16 fatTime) { return(fatTime >> 5) & 0X3F; } /** second part of FAT directory time field */ static inline u8 FAT_SECOND(u16 fatTime) { return 2*(fatTime & 0X1F); } /** Default date for file timestamps is 1 Jan 2000 */ static const u16 FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1; /** Default time for file timestamp is 1 am */ static const u16 FAT_DEFAULT_TIME = (1 << 11); //------------------------------------------------------ class EmuFat; class EmuFatVolume; class EmuFatFile; union cache_t { /** Used to access cached file data blocks. */ u8 data[512]; /** Used to access cached FAT16 entries. */ u16 fat16[256]; /** Used to access cached FAT32 entries. */ u32 fat32[128]; /** Used to access cached directory entries. */ TDirectoryEntry dir[16]; /** Used to access a cached MasterBoot Record. */ TMasterBootRecord mbr; /** Used to access to a cached FAT boot sector. */ TFat32BootSector fbs; }; class EmuFatFile { public: /** Create an instance of EmuFatFile. */ EmuFatFile() : type_(FAT_FILE_TYPE_CLOSED) {} bool writeError; void clearUnbufferedRead(void) { flags_ &= ~F_FILE_UNBUFFERED_READ; } void setUnbufferedRead(void) { if (isFile()) flags_ |= F_FILE_UNBUFFERED_READ; } u8 unbufferedRead(void) const { return flags_ & F_FILE_UNBUFFERED_READ; } u8 close(void); u8 contiguousRange(u32* bgnBlock, u32* endBlock); u8 createContiguous(EmuFatFile* dirFile, const char* fileName, u32 size); /** \return The current cluster number for a file or directory. */ u32 curCluster(void) const {return curCluster_;} /** \return The current position for a file or directory. */ u32 curPosition(void) const {return curPosition_;} u8 rmDir(void); u8 rmRfStar(void); s16 read(void) { u8 b; return read(&b, 1) == 1 ? b : -1; } s32 read(void* buf, u32 nbyte); s8 readDir(TDirectoryEntry* dir); s32 write(const void* buf, u32 nbyte); u8 openRoot(EmuFatVolume* vol); u8 timestamp(u8 flag, u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second); u8 sync(void); u8 makeDir(EmuFatFile* dir, const char* dirName); u8 open(EmuFatFile* dirFile, u16 index, u8 oflag); u8 open(EmuFatFile* dirFile, const char* fileName, u8 oflag); u8 remove(EmuFatFile* dirFile, const char* fileName); u8 remove(void); u8 dirEntry(TDirectoryEntry* dir); u8 seekCur(u32 pos) { return seekSet(curPosition_ + pos); } /** * Set the files current position to end of file. Useful to position * a file for append. See seekSet(). */ u8 seekEnd(void) {return seekSet(fileSize_);} u8 seekSet(u32 pos); u8 type(void) const {return type_;} u8 truncate(u32 size); u32 dirBlock(void) const {return dirBlock_;} /** \return Index of this file's directory in the block dirBlock. */ u8 dirIndex(void) const {return dirIndex_;} static void dirName(const TDirectoryEntry& dir, char* name); /** \return The total number of bytes in a file or directory. */ u32 fileSize(void) const {return fileSize_;} /** \return The first cluster number for a file or directory. */ u32 firstCluster(void) const {return firstCluster_;} /** \return True if this is a SdFile for a directory else false. */ u8 isDir(void) const {return type_ >= FAT_FILE_TYPE_MIN_DIR;} /** \return True if this is a SdFile for a file else false. */ u8 isFile(void) const {return type_ == FAT_FILE_TYPE_NORMAL;} /** \return True if this is a SdFile for an open file/directory else false. */ u8 isOpen(void) const {return type_ != FAT_FILE_TYPE_CLOSED;} /** \return True if this is a SdFile for a subdirectory else false. */ u8 isSubDir(void) const {return type_ == FAT_FILE_TYPE_SUBDIR;} /** \return True if this is a SdFile for the root directory. */ u8 isRoot(void) const { return type_ == FAT_FILE_TYPE_ROOT16 || type_ == FAT_FILE_TYPE_ROOT32; } /** Set the file's current position to zero. */ void rewind(void) { curPosition_ = curCluster_ = 0; } private: // bits defined in flags_ // should be 0XF static const u8 F_OFLAG = (EO_ACCMODE | EO_APPEND | EO_SYNC); // available bits static const u8 F_UNUSED = 0x30; // use unbuffered SD read static const u8 F_FILE_UNBUFFERED_READ = 0X40; // sync of directory entry required static const u8 F_FILE_DIR_DIRTY = 0x80; // make sure F_OFLAG is ok void ctassert() { CTASSERT(!((F_UNUSED | F_FILE_UNBUFFERED_READ | F_FILE_DIR_DIRTY) & F_OFLAG)); } // private data u8 flags_; // See above for definition of flags_ bits u8 type_; // type of file see above for values u32 curCluster_; // cluster for current file position u32 curPosition_; // current file position in bytes from beginning u32 dirBlock_; // SD block that contains directory entry for file u8 dirIndex_; // index of entry in dirBlock 0 <= dirIndex_ <= 0XF u32 fileSize_; // file size in bytes u32 firstCluster_; // first cluster of file EmuFatVolume* vol_; // volume where file is located // private functions u8 addCluster(void); u8 addDirCluster(void); TDirectoryEntry* cacheDirEntry(u8 action); static u8 make83Name(const char* str, u8* name); u8 openCachedEntry(u8 cacheIndex, u8 oflags); TDirectoryEntry* readDirCache(void); }; class EmuFatVolume { public: EmuFatVolume() :allocSearchStart_(2), fatType_(0) {} //Initialize a FAT volume. Try partition one first then try super floppy format. //dev The Sd2Card where the volume is located. //return The value one, true, is returned for success and //the value zero, false, is returned for failure. Reasons for //failure include not finding a valid partition, not finding a valid //FAT file system or an I/O error. bool init(EmuFat* dev) { return init(dev, 1) ? true : init(dev, 0);} bool init(EmuFat* dev, u8 part); bool format(u32 sectors); bool formatNew(u32 sectors); // inline functions that return volume info //The volume's cluster size in blocks. u8 blocksPerCluster(void) const {return blocksPerCluster_;} //The number of blocks in one FAT. u32 blocksPerFat(void) const {return blocksPerFat_;} //The total number of clusters in the volume. // u32 clusterCount(void) const {return clusterCount_;} //The shift count required to multiply by blocksPerCluster. // u8 clusterSizeShift(void) const {return clusterSizeShift_;} //The logical block number for the start of file data. // u32 dataStartBlock(void) const {return dataStartBlock_;} //The number of FAT structures on the volume. // u8 fatCount(void) const {return fatCount_;} //The logical block number for the start of the first FAT. // u32 fatStartBlock(void) const {return fatStartBlock_;} //The FAT type of the volume. Values are 12, 16 or 32. // u8 fatType(void) const {return fatType_;} //The number of entries in the root directory for FAT16 volumes. // u32 rootDirEntryCount(void) const {return rootDirEntryCount_;} //The logical block number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes. // u32 rootDirStart(void) const {return rootDirStart_;} EmuFat* dev_; private: friend class EmuFatFile; u32 allocSearchStart_; // start cluster for alloc search u8 blocksPerCluster_; // cluster size in blocks u32 blocksPerFat_; // FAT size in blocks u32 clusterCount_; // clusters in one FAT u8 clusterSizeShift_; // shift to convert cluster count to block count u32 dataStartBlock_; // first data block number u8 fatCount_; // number of FATs on volume u32 fatStartBlock_; // start block for first FAT u8 fatType_; // volume type (12, 16, OR 32) u16 rootDirEntryCount_; // number of entries in FAT16 root dir u32 rootDirStart_; // root start block for FAT16, cluster for FAT32 u8 allocContiguous(u32 count, u32* curCluster); u8 blockOfCluster(u32 position) const { return (position >> 9) & (blocksPerCluster_ - 1);} u32 clusterStartBlock(u32 cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} u32 blockNumber(u32 cluster, u32 position) const { return clusterStartBlock(cluster) + blockOfCluster(position);} u8 fatGet(u32 cluster, u32* value) const; u8 fatPut(u32 cluster, u32 value); u8 fatPutEOC(u32 cluster) { return fatPut(cluster, 0x0FFFFFFF); } u8 chainSize(u32 beginCluster, u32* size) const; u8 freeChain(u32 cluster); u8 isEOC(u32 cluster) const { return cluster >= (fatType_ == 16 ? FAT16EOC_MIN : FAT32EOC_MIN); } u8 readData(u32 block, u16 offset, u16 count, u8* dst); u8 writeBlock(u32 block, const u8* dst); }; class EmuFat { public: EmuFat(const char* fname, bool readonly=false); EmuFat(); EmuFat(EMUFILE* fileNotToDelete); virtual ~EmuFat(); private: EMUFILE* m_pFile; bool m_readonly, m_owns; friend class EmuFatVolume; friend class EmuFatFile; // value for action argument in cacheRawBlock to indicate read from cache static const u8 CACHE_FOR_READ = 0; // value for action argument in cacheRawBlock to indicate cache dirty static const u8 CACHE_FOR_WRITE = 1; struct Cache { Cache() : cacheBlockNumber_(0xFFFFFFFF) , cacheDirty_(0) // cacheFlush() will write block if true , cacheMirrorBlock_(0) // mirror block for second FAT {} cache_t cacheBuffer_; // 512 byte cache for device blocks u32 cacheBlockNumber_; // Logical number of block in the cache u8 cacheDirty_; // cacheFlush() will write block if true u32 cacheMirrorBlock_; // block number for mirror FAT } cache_; u8 cacheRawBlock(u32 blockNumber, u8 action); void cacheSetDirty() {cache_.cacheDirty_ |= CACHE_FOR_WRITE;} u8 cacheZeroBlock(u32 blockNumber); u8 cacheFlush(); void cacheReset(); //IO functions: u8 readBlock(u32 block, u8* dst); u8 writeBlock(u32 blockNumber, const u8* src); u8 readData(u32 block, u16 offset, u16 count, u8* dst); void truncate(u32 size); }; #endif //EMUFAT_H desmume-0.9.9/src/utils/guid.h0000644000175000017500000000176012140261631016752 0ustar guillaumeguillaume/* Copyright (C) 2008-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _guid_h_ #define _guid_h_ #include #include #include "../types.h" #include "valuearray.h" struct Desmume_Guid : public ValueArray { void newGuid(); std::string toString(); static Desmume_Guid fromString(std::string str); static uint8 hexToByte(char** ptrptr); void scan(std::string& str); }; #endif desmume-0.9.9/src/utils/task.h0000644000175000017500000000230012140261631016753 0ustar guillaumeguillaume/* Copyright (C) 2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _TASK_H_ #define _TASK_H_ //Sort of like a single-thread thread pool. //You hand it a worker function and then call finish() to synch with its completion class Task { public: Task(); ~Task(); typedef void * (*TWork)(void *); // initialize task runner void start(bool spinlock); //execute some work void execute(const TWork &work, void* param); //wait for the work to complete void* finish(); // does the opposite of start void shutdown(); class Impl; Impl *impl; }; #endif desmume-0.9.9/src/utils/datetime.h0000644000175000017500000004665112140261631017626 0ustar guillaumeguillaume/* Copyright (C) 2010 DeSmuME team This file is based on System.DateTime.cs and System.TimeSpan.cs from mono-2.6.7 This file 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 file 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 the this software. If not, see . */ // // System.DateTime.cs // // author: // Marcel Narings (marcel@narings.nl) // Martin Baulig (martin@gnome.org) // Atsushi Enomoto (atsushi@ximian.com) // // (C) 2001 Marcel Narings // Copyright (C) 2004-2006 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // System.TimeSpan.cs // // Authors: // Duco Fijma (duco@lorentz.xs4all.nl) // Andreas Nahr (ClassDevelopment@A-SoftTech.com) // Sebastien Pouliot // // (C) 2001 Duco Fijma // (C) 2004 Andreas Nahr // Copyright (C) 2004 Novell (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #ifndef _DATETIME_H_ #define _DATETIME_H_ #include #include #include #include #include #include "../types.h" enum DayOfWeek { DayOfWeek_Sunday=0, DayOfWeek_Monday=1, DayOfWeek_Tuesday=2, DayOfWeek_Wednesday=3, DayOfWeek_Thursday=4, DayOfWeek_Friday=5, DayOfWeek_Saturday=6 }; class TimeSpan { friend class DateTime; public: static const TimeSpan& get_MaxValue() { static TimeSpan val(0x7FFFFFFFFFFFFFFFLL); return val; } static const TimeSpan& get_MinValue() { static TimeSpan val(0x8000000000000000LL); return val; } static const TimeSpan& get_Zero() { static TimeSpan val(0); return val; } static const s64 TicksPerDay = 864000000000LL; static const s64 TicksPerHour = 36000000000LL; static const s64 TicksPerMillisecond = 10000LL; static const s64 TicksPerMinute = 600000000LL; static const s64 TicksPerSecond = 10000000LL; TimeSpan () { } TimeSpan (s64 ticks) : _ticks(ticks) { } TimeSpan (int hours, int minutes, int seconds) { _ticks = CalculateTicks (0, hours, minutes, seconds, 0); } TimeSpan (int days, int hours, int minutes, int seconds) { _ticks = CalculateTicks (days, hours, minutes, seconds, 0); } TimeSpan (int days, int hours, int minutes, int seconds, int milliseconds) { _ticks = CalculateTicks (days, hours, minutes, seconds, milliseconds); } int get_Days() const { return (int) (_ticks / TicksPerDay); } int get_Hours() const { return (int) (_ticks % TicksPerDay / TicksPerHour); } int get_Milliseconds() const { return (int) (_ticks % TicksPerSecond / TicksPerMillisecond); } int get_Minutes() const { return (int) (_ticks % TicksPerHour / TicksPerMinute); } int get_Seconds() const { return (int) (_ticks % TicksPerMinute / TicksPerSecond); } s64 get_Ticks() const { return _ticks; } double get_TotalDays() const { return (double) _ticks / TicksPerDay; } double get_TotalHours() const { return (double) _ticks / TicksPerHour; } double get_TotalMilliseconds() const { return (double) _ticks / TicksPerMillisecond; } double get_TotalMinutes() const { return (double) _ticks / TicksPerMinute; } double get_TotalSeconds() const { return (double) _ticks / TicksPerSecond; } TimeSpan Add (const TimeSpan &ts) { return TimeSpan (_ticks + ts._ticks); //removed: //catch (OverflowException) throw new OverflowException (Locale.GetText ("Resulting timespan is too big.")); } static int Compare (const TimeSpan& t1, const TimeSpan& t2) { if (t1._ticks < t2._ticks) return -1; if (t1._ticks > t2._ticks) return 1; return 0; } int CompareTo (const TimeSpan& value) { return Compare (*this, value); } TimeSpan Duration () { return TimeSpan(_ticks<0?-_ticks:_ticks); //removed: //catch (OverflowException) throw new OverflowException (Locale.GetText ("This TimeSpan value is MinValue so you cannot get the duration.")); } static TimeSpan FromDays (double value) { return From (value, TicksPerDay); } static TimeSpan FromHours (double value) { return From (value, TicksPerHour); } static TimeSpan FromMinutes (double value) { return From (value, TicksPerMinute); } static TimeSpan FromSeconds (double value) { return From (value, TicksPerSecond); } static TimeSpan FromMilliseconds (double value) { return From (value, TicksPerMillisecond); } static TimeSpan FromTicks (s64 value) { return TimeSpan (value); } TimeSpan Negate () { //removed error handling //if (_ticks == MinValue()._ticks) throw new OverflowException (Locale.GetText ( "This TimeSpan value is MinValue and cannot be negated.")); return TimeSpan (-_ticks); } TimeSpan Subtract (const TimeSpan& ts) { //removed error handling //try { checked { return TimeSpan (_ticks - ts._ticks); // } //} //catch (OverflowException) { // throw new OverflowException (Locale.GetText ("Resulting timespan is too big.")); //} } TimeSpan operator + (const TimeSpan& t2) const { TimeSpan temp = *this; temp.Add (t2); return temp; } bool operator == (const TimeSpan& t2) const { return _ticks == t2._ticks; } bool operator > (const TimeSpan& t2) const { return _ticks > t2._ticks; } bool operator >= (const TimeSpan& t2) const { return _ticks >= t2._ticks; } bool operator != (const TimeSpan& t2) const { return _ticks != t2._ticks; } bool operator < (const TimeSpan& t2) const { return _ticks < t2._ticks; } bool operator <= (const TimeSpan& t2) const { return _ticks <= t2._ticks; } TimeSpan operator - (const TimeSpan& t2) const { TimeSpan temp = *this; return temp.Subtract (t2); } TimeSpan operator - () { return Negate (); } private: s64 _ticks; static s64 CalculateTicks (int days, int hours, int minutes, int seconds, int milliseconds) { // there's no overflow checks for hours, minutes, ... // so big hours/minutes values can overflow at some point and change expected values int hrssec = (hours * 3600); // break point at (Int32.MaxValue - 596523) int minsec = (minutes * 60); s64 t = ((s64)(hrssec + minsec + seconds) * 1000L + (s64)milliseconds); t *= 10000; bool overflow = false; // days is problematic because it can overflow but that overflow can be // "legal" (i.e. temporary) (e.g. if other parameters are negative) or // illegal (e.g. sign change). if (days > 0) { s64 td = TicksPerDay * days; if (t < 0) { s64 ticks = t; t += td; // positive days -> total ticks should be lower overflow = (ticks > t); } else { t += td; // positive + positive != negative result overflow = (t < 0); } } else if (days < 0) { s64 td = TicksPerDay * days; if (t <= 0) { t += td; // negative + negative != positive result overflow = (t > 0); } else { s64 ticks = t; t += td; // negative days -> total ticks should be lower overflow = (t > ticks); } } //removed: //if (overflow) throw ArgumentOutOfRangeException ("The timespan is too big or too small."); return t; } static TimeSpan From (double value, s64 tickMultiplicator) { //a bunch of error handling removed //if (Double.IsNaN (value)) throw new ArgumentException (Locale.GetText ("Value cannot be NaN."), "value"); //if (Double.IsNegativeInfinity (value) || Double.IsPositiveInfinity (value) || // (value < MinValue.Ticks) || (value > MaxValue.Ticks)) // throw new OverflowException (Locale.GetText ("Outside range [MinValue,MaxValue]")); //try { value = (value * (tickMultiplicator / TicksPerMillisecond)); // checked { // long val = (long) Math.Round(value); // return new TimeSpan (val * TicksPerMillisecond); // } //} //catch (OverflowException) { // throw new OverflowException (Locale.GetText ("Resulting timespan is too big.")); //} //} } }; class DateTime { private: TimeSpan ticks; static inline double round(const double x) { return floor(x + 0.5); } static const int dp400 = 146097; static const int dp100 = 36524; static const int dp4 = 1461; // w32 file time starts counting from 1/1/1601 00:00 GMT // which is the constant ticks from the .NET epoch static const s64 w32file_epoch = 504911232000000000LL; //private const long MAX_VALUE_TICKS = 3155378975400000000L; // -- Microsoft .NET has this value. static const s64 MAX_VALUE_TICKS = 3155378975999999999LL; // // The UnixEpoch, it begins on Jan 1, 1970 at 0:0:0, expressed // in Ticks // static const s64 UnixEpoch = 621355968000000000LL; static const int daysmonth[13]; static const int daysmonthleap[13]; static const char* monthnames[13]; void init (int year, int month, int day, int hour, int minute, int second, int millisecond) { //removed error handling /* if ( year < 1 || year > 9999 || month < 1 || month >12 || day < 1 || day > DaysInMonth(year, month) || hour < 0 || hour > 23 || minute < 0 || minute > 59 || second < 0 || second > 59 || millisecond < 0 || millisecond > 999) throw new ArgumentOutOfRangeException ("Parameters describe an " + "unrepresentable DateTime.");*/ ticks = TimeSpan (AbsoluteDays(year,month,day), hour, minute, second, millisecond); } static int AbsoluteDays (int year, int month, int day) { const int* days; int temp = 0, m=1 ; days = (IsLeapYear(year) ? daysmonthleap : daysmonth); while (m < month) temp += days[m++]; return ((day-1) + temp + (365* (year-1)) + ((year-1)/4) - ((year-1)/100) + ((year-1)/400)); } enum Which { Which_Day, Which_DayYear, Which_Month, Which_Year }; int FromTicks(Which what) const { int num400, num100, num4, numyears; int M =1; const int* days = daysmonth; int totaldays = ticks.get_Days(); num400 = (totaldays / dp400); totaldays -= num400 * dp400; num100 = (totaldays / dp100); if (num100 == 4) // leap num100 = 3; totaldays -= (num100 * dp100); num4 = totaldays / dp4; totaldays -= (num4 * dp4); numyears = totaldays / 365 ; if (numyears == 4) //leap numyears =3 ; if (what == Which_Year ) return num400*400 + num100*100 + num4*4 + numyears + 1; totaldays -= (numyears * 365) ; if (what == Which_DayYear ) return totaldays + 1; if ((numyears==3) && ((num100 == 3) || !(num4 == 24)) ) //31 dec leapyear days = daysmonthleap; while (totaldays >= days[M]) totaldays -= days[M++]; if (what == Which_Month ) return M; return totaldays +1; } public: DateTime() : ticks(0) { } static const char* GetNameOfMonth(int month) { return monthnames[month]; } DateTime (s64 ticks) { this->ticks = TimeSpan (ticks); //removed error handling //if (ticks < get_MinValue().get_Ticks() || ticks > get_MaxValue().get_Ticks()) { // string msg = Locale.GetText ("Value {0} is outside the valid range [{1},{2}].", // ticks, MinValue.Ticks, MaxValue.Ticks); // throw new ArgumentOutOfRangeException ("ticks", msg); //} } static const DateTime& get_MaxValue() { static DateTime val(false, TimeSpan (MAX_VALUE_TICKS)); return val; } static const DateTime& get_MinValue() { static DateTime val(false, TimeSpan (0)); return val; } DateTime (int year, int month, int day) { init(year,month,day,0,0,0,0); } DateTime (int year, int month, int day, int hour, int minute, int second) { init(year, month, day, hour, minute, second, 0); } DateTime (int year, int month, int day, int hour, int minute, int second, int millisecond) { init(year,month,day,hour,minute,second,millisecond); } DateTime (bool check, const TimeSpan& value) { //removed error handling //if (check && (value.Ticks < MinValue.Ticks || value.Ticks > MaxValue.Ticks)) // throw new ArgumentOutOfRangeException (); ticks = value; } DateTime get_Date () const { return DateTime (get_Year(), get_Month(), get_Day()); } int get_Month () const { return FromTicks(Which_Month); } int get_Day() const { return FromTicks(Which_Day); } DayOfWeek get_DayOfWeek () const { return ( (DayOfWeek) ((ticks.get_Days()+1) % 7) ); } int get_DayOfYear () const { return FromTicks(Which_DayYear); } TimeSpan get_TimeOfDay () const { return TimeSpan(ticks.get_Ticks() % TimeSpan::TicksPerDay ); } int get_Hour () const { return ticks.get_Hours(); } int get_Minute () const { return ticks.get_Minutes(); } int get_Second () const { return ticks.get_Seconds(); } int get_Millisecond () const { return ticks.get_Milliseconds(); } //internal static extern s64 GetTimeMonotonic (); //internal static extern s64 GetNow (); static DateTime get_Now () { time_t timer; time(&timer); struct tm *tm = localtime(&timer); return DateTime(tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec); } s64 get_Ticks()const { return ticks.get_Ticks(); } static DateTime get_Today () { DateTime now = get_Now(); DateTime today = DateTime (now.get_Year(), now.get_Month(), now.get_Day()); return today; } int get_Year () const { return FromTicks(Which_Year); } DateTime Add (const TimeSpan& value) const { DateTime ret = AddTicks (value.get_Ticks()); return ret; } DateTime AddDays (double value) const { return AddMilliseconds (round(value * 86400000)); } DateTime AddTicks (const s64 value) const { //removed error handling //if ((value + ticks.Ticks) > MAX_VALUE_TICKS || (value + ticks.Ticks) < 0) { // throw new ArgumentOutOfRangeException(); //} return DateTime (value + ticks.get_Ticks()); } DateTime AddHours (double value) const { return AddMilliseconds (value * 3600000); } DateTime AddMilliseconds (double value) const { //removed error handling /* if ((value * TimeSpan.TicksPerMillisecond) > long.MaxValue || (value * TimeSpan.TicksPerMillisecond) < long.MinValue) { throw new ArgumentOutOfRangeException(); } */ s64 msticks = (s64) round(value * TimeSpan::TicksPerMillisecond); return AddTicks (msticks); } DateTime AddMinutes (double value) const { return AddMilliseconds (value * 60000); } DateTime AddMonths (int months) const { int day, month, year, maxday ; DateTime temp; day = get_Day(); month = get_Month() + (months % 12); year = get_Year() + months/12 ; if (month < 1) { month = 12 + month ; year -- ; } else if (month>12) { month = month -12; year ++; } maxday = DaysInMonth(year, month); if (day > maxday) day = maxday; temp = (year, month, day); return temp.Add (get_TimeOfDay()); } DateTime AddSeconds (double value) const { return AddMilliseconds (value * 1000); } DateTime AddYears (int value) const { return AddMonths (value * 12); } static int Compare (const DateTime& t1, const DateTime& t2) { if (t1.ticks < t2.ticks) return -1; else if (t1.ticks > t2.ticks) return 1; else return 0; } static int DaysInMonth (int year, int month) { const int* days ; //removed error handling //if (month < 1 || month >12)throw new ArgumentOutOfRangeException (); //if (year < 1 || year > 9999)throw new ArgumentOutOfRangeException (); days = (IsLeapYear(year) ? daysmonthleap : daysmonth); return days[month]; } static bool IsLeapYear (int year) { //removed error handling /* if (year < 1 || year > 9999) throw new ArgumentOutOfRangeException ();*/ return ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ; } TimeSpan Subtract (const DateTime& value) const { return TimeSpan (ticks.get_Ticks()) - value.ticks; } DateTime Subtract(const TimeSpan& value) const { TimeSpan newticks; newticks = (TimeSpan (ticks.get_Ticks())) - value; DateTime ret = DateTime (true,newticks); return ret; } DateTime operator +(const TimeSpan& t) const { return DateTime (true, ticks + t); } bool operator ==(const DateTime& d2) const { return (ticks == d2.ticks); } bool operator >(const DateTime& t2) const { return (ticks > t2.ticks); } bool operator >=(const DateTime &t2) const { return (ticks >= t2.ticks); } bool operator !=(const DateTime& d2) const { return (ticks != d2.ticks); } bool operator <(const DateTime& t2) const { return (ticks < t2.ticks ); } bool operator <=(const DateTime& t2) const { return (ticks <= t2.ticks); } TimeSpan operator -(const DateTime& d2) const { return TimeSpan((ticks - d2.ticks).get_Ticks()); } DateTime operator -(const TimeSpan& t) const { return DateTime (true, ticks - t); } //try to have a canonical format here. this was comment was typed at 2010-oct-04 02:16:44:000 std::string ToString() const { char tmp[32]; sprintf(tmp,"%04d-%s-%02d %02d:%02d:%02d:%03d",get_Year(),monthnames[get_Month()],get_Day(),get_Hour(),get_Minute(),get_Second(),get_Millisecond()); return tmp; } static bool TryParse(const char* str, DateTime& out) { int year,mon=-1,day,hour,min,sec,ms; char strmon[4]; int done = sscanf(str,"%04d-%3s-%02d %02d:%02d:%02d:%03d",&year,strmon,&day,&hour,&min,&sec,&ms); if(done != 7) return false; for(int i=1;i<12;i++) if(!strncasecmp(monthnames[i],strmon,3)) { mon=i; break; } if(mon==-1) return false; out = DateTime(year,mon,day,hour,min,sec); return true; } static DateTime Parse(const char* str) { DateTime ret; TryParse(str,ret); return ret; } }; #endif //_DATETIME_H_ desmume-0.9.9/src/utils/dlditool.cpp0000644000175000017500000010010712140261631020162 0ustar guillaumeguillaume/* dlditool - Dynamically Linked Disk Interface patch tool Copyright (C) 2006 Michael Chisholm (Chishm) Send all queries to chishm@hotmail.com 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * v1.24d - 2010-06-14 - zeromus * Modified for inclusion in desmume * v1.24 - 2007-08-02 - SmileyDude * Now using EXIT_SUCCESS and EXIT_FAILURE at the suggestion of MachinShin. * Defined EXIT_NO_DLDI_SECTION for when there is no DLDI section in a file. * Added cast to strcmp() call to appease the compiler. * v1.23 - 2007-01-23 - Chishm * Fixed bug when DLDI section doesn't exist * addr_t is now a signed int * v1.22 - 2007-01-12 - WinterMute * add search paths for dldi files * v1.21 - 2007-01-12 - Chishm * Improved error messages * v1.20 - 2007-01-11 - Chishm * Changed offset calculation method * v1.10 - 2007-01-07 - Chishm * Removed assumptions about endianess of computer * Word size shouldn't matter now either, except that an int type must be at least 32 bits long * Added *.sc.nds and *.gba.nds file extensions * Improved command line argument parsing * v1.01 - 2006-12-30 - Chishm * Minor bugfix parsing 3 arguments * v1.00 - 2006-12-25 - Chishm * Original release */ #define VERSION "v1.24" #include #include #include #include #include #include #ifndef _MSC_VER #include #include #include #else typedef int int32_t; #define MAXPATHLEN 1024 #endif #include namespace DLDI { //#ifndef bool // typedef enum {false = 0, true = !0} bool; //#endif typedef int32_t addr_t; typedef unsigned char data_t; #define FEATURE_MEDIUM_CANREAD 0x00000001 #define FEATURE_MEDIUM_CANWRITE 0x00000002 #define FEATURE_SLOT_GBA 0x00000010 #define FEATURE_SLOT_NDS 0x00000020 #define MAGIC_TOKEN 0xBF8DA5ED #define FIX_ALL 0x01 #define FIX_GLUE 0x02 #define FIX_GOT 0x04 #define FIX_BSS 0x08 #define DLDI_VERSION 1 #define EXIT_NO_DLDI_SECTION 2 enum DldiOffsets { DO_magicString = 0x00, // "\xED\xA5\x8D\xBF Chishm" DO_magicToken = 0x00, // 0xBF8DA5ED DO_magicShortString = 0x04, // " Chishm" DO_version = 0x0C, DO_driverSize = 0x0D, DO_fixSections = 0x0E, DO_allocatedSpace = 0x0F, DO_friendlyName = 0x10, DO_text_start = 0x40, // Data start DO_data_end = 0x44, // Data end DO_glue_start = 0x48, // Interworking glue start -- Needs address fixing DO_glue_end = 0x4C, // Interworking glue end DO_got_start = 0x50, // GOT start -- Needs address fixing DO_got_end = 0x54, // GOT end DO_bss_start = 0x58, // bss start -- Needs setting to zero DO_bss_end = 0x5C, // bss end // IO_INTERFACE data DO_ioType = 0x60, DO_features = 0x64, DO_startup = 0x68, DO_isInserted = 0x6C, DO_readSectors = 0x70, DO_writeSectors = 0x74, DO_clearStatus = 0x78, DO_shutdown = 0x7C, DO_code = 0x80 }; const data_t dldiMagicString[] = "\xED\xA5\x8D\xBF Chishm"; const char dldiFileExtension[] = ".dldi"; void printUsage (char* programName) { printf ("Usage:\n"); printf ("%s \n", programName); printf (" the dldi patch file to apply\n"); printf (" the application binary to apply the patch to\n"); return; } addr_t readAddr (data_t *mem, addr_t offset) { return (addr_t)( (mem[offset + 0] << 0) | (mem[offset + 1] << 8) | (mem[offset + 2] << 16) | (mem[offset + 3] << 24) ); } void writeAddr (data_t *mem, addr_t offset, addr_t value) { mem[offset + 0] = (data_t)(value >> 0); mem[offset + 1] = (data_t)(value >> 8); mem[offset + 2] = (data_t)(value >> 16); mem[offset + 3] = (data_t)(value >> 24); } int stringCaseInsensitiveCompare (const char *str1, const char *str2) { while (tolower(*str1) == tolower(*str2)) { if (*str1 == '\0') { return 0; } str1++; str2++; } return (tolower(*str1) - tolower(*str2)); } bool stringEndsWith (const char *str, const char *end) { const char* strEnd; if (strlen (str) < strlen(end)) { return false; } strEnd = &str[strlen (str) - strlen(end)]; return (stringCaseInsensitiveCompare (strEnd, end) == 0); } bool stringStartsWith (const char *str, const char *start) { return (strstr (str, start) == str); } addr_t quickFind (const data_t* data, const data_t* search, size_t dataLen, size_t searchLen) { const int32_t* dataChunk = (const int32_t*) data; int searchChunk = ((const int32_t*)search)[0]; addr_t i; addr_t dataChunkEnd = (addr_t)(dataLen / sizeof(int32_t)); for ( i = 0; i < dataChunkEnd; i++) { if (dataChunk[i] == searchChunk) { if ((i*sizeof(int32_t) + searchLen) > dataLen) { return -1; } if (memcmp (&data[i*sizeof(int32_t)], search, searchLen) == 0) { return i*sizeof(int32_t); } } } return -1; } FILE *openDLDIFile(const char *argv0, char *dldiFileName ) { FILE *dldiFile; char *dldiPATH; char appPath[MAXPATHLEN]; char appName[MAXPATHLEN]; char appPathName[MAXPATHLEN]; char *ptr, *lastSlash; struct stat buf; // add .dldi extension to filename if (!stringEndsWith (dldiFileName, dldiFileExtension)) { strcat (dldiFileName, dldiFileExtension); } printf ("Trying \"%s\"\n", dldiFileName); // try opening from current directory dldiFile = fopen(dldiFileName,"rb"); if ( NULL != dldiFile ) return dldiFile; // check if the filename has a path component // check both slash varieties, win32 understands both // if we have a directory separator don't bother with search paths if ( NULL != strstr(dldiFileName,"\\") ) return NULL; if ( NULL != strstr(dldiFileName,"/") ) return NULL; // check for DLDIPATH in environment dldiPATH = getenv("DLDIPATH"); if ( NULL != dldiPATH ) { strcpy(appPath,dldiPATH); if ( appPath[strlen(appPath)] != '\\' && appPath[strlen(appPath)] != '/' ) strcat(appPath,"/"); strcat ( appPath, dldiFileName ); printf ("Trying \"%s\"\n", appPath); dldiFile = fopen(appPath,"rb"); if ( NULL != dldiFile ) return dldiFile; } lastSlash = NULL; ptr = (char *)argv0; while ( *(ptr++) != 0 ) { if ( *ptr == '\\' || * ptr == '/' ) lastSlash = ptr; } if ( NULL != lastSlash ) { *(lastSlash++) = '\0'; strcpy(appPath, argv0); strcpy(appName, lastSlash); strcat(appPath, "/"); } else { strcpy(appPath, ""); strcpy(appName, argv0); } // finally try in the application path // if argv0 contains a directory separator we have a path component if ( NULL == strstr(appPath,"\\") && NULL == strstr(appPath,"/") ) { // no path in argv0 so search system path char *sysPATH = getenv("PATH"); char *nextPATH; char *thisPATH = sysPATH; printf("Searching system path\n%s\n",sysPATH); while(1) { nextPATH = strstr(thisPATH, ":" ); // find next PATH separator if ( NULL != nextPATH ) *(nextPATH++) = '\0'; // terminate string, point to next component strcpy(appPath,thisPATH); strcat(appPath,"/"); strcpy(appPathName,appPath); strcat(appPathName,appName); // add application name if ( stat(appPathName,&buf) == 0 ) // if it exists we found the path break; thisPATH = nextPATH; strcpy(appPath,""); // empty path if ( thisPATH == NULL) break; } } strcat(appPath,"dldi/"); // add dldi folder strcat(appPath,dldiFileName); // add dldi filename to path printf ("Trying \"%s\"\n", appPath); return fopen(appPath,"rb"); // no more places to check, just return this handle } //int main(int argc, char* argv[]) //{ // // char *dldiFileName = NULL; // char *appFileName = NULL; // // addr_t memOffset; // Offset of DLDI after the file is loaded into memory // addr_t patchOffset; // Position of patch destination in the file // addr_t relocationOffset; // Value added to all offsets within the patch to fix it properly // addr_t ddmemOffset; // Original offset used in the DLDI file // addr_t ddmemStart; // Start of range that offsets can be in the DLDI file // addr_t ddmemEnd; // End of range that offsets can be in the DLDI file // addr_t ddmemSize; // Size of range that offsets can be in the DLDI file // // addr_t addrIter; // // FILE* dldiFile; // FILE* appFile; // // data_t *pDH; // data_t *pAH; // // data_t *appFileData = NULL; // size_t appFileSize = 0; // data_t *dldiFileData = NULL; // size_t dldiFileSize = 0; // // int i; // // printf ("Dynamically Linked Disk Interface patch tool " VERSION " by Michael Chisholm (Chishm)\n\n"); // // for (i = 1; i < argc; i++) { // if (dldiFileName == NULL) { // dldiFileName = (char*) malloc (strlen (argv[i]) + 1 + sizeof(dldiFileExtension)); // if (!dldiFileName) { // return EXIT_FAILURE; // } // strcpy (dldiFileName, argv[i]); // } else if (appFileName == NULL) { // appFileName = (char*) malloc (strlen (argv[i]) + 1); // if (!appFileName) { // return EXIT_FAILURE; // } // strcpy (appFileName, argv[i]); // } else { // printUsage (argv[0]); // return EXIT_FAILURE; // } // } // // if ((dldiFileName == NULL) || (appFileName == NULL)) { // printUsage (argv[0]); // return EXIT_FAILURE; // } // // if (!(dldiFile = openDLDIFile(argv[0],dldiFileName))) { // printf ("Cannot open \"%s\" - %s\n", dldiFileName, strerror(errno)); // return EXIT_FAILURE; // } // // if (!(appFile = fopen (appFileName, "rb+"))) { // printf ("Cannot open \"%s\" - %s\n", appFileName, strerror(errno)); // return EXIT_FAILURE; // } // // // Load the app file and the DLDI patch file // fseek (appFile, 0, SEEK_END); // appFileSize = ftell(appFile); // appFileData = (data_t*) malloc (appFileSize); // fseek (appFile, 0, SEEK_SET); // // fseek (dldiFile, 0, SEEK_END); // dldiFileSize = ftell(dldiFile); // dldiFileData = (data_t*) malloc (dldiFileSize); // fseek (dldiFile, 0, SEEK_SET); // // if (!appFileData || !dldiFileData) { // fclose (appFile); // fclose (dldiFile); // if (appFileData) free (appFileData); // if (dldiFileData) free (dldiFileData); // printf ("Out of memory\n"); // return EXIT_FAILURE; // } // // fread (appFileData, 1, appFileSize, appFile); // fread (dldiFileData, 1, dldiFileSize, dldiFile); // fclose (dldiFile); // // // Find the DSDI reserved space in the file // patchOffset = quickFind (appFileData, dldiMagicString, appFileSize, sizeof(dldiMagicString)/sizeof(char)); // // if (patchOffset < 0) { // printf ("%s does not have a DLDI section\n", appFileName); // return EXIT_NO_DLDI_SECTION; // } // // pDH = dldiFileData; // pAH = &appFileData[patchOffset]; // // // Make sure the DLDI file is valid and usable // if (strcmp ((char*)dldiMagicString, (char*)&pDH[DO_magicString]) != 0) { // printf ("Invalid DLDI file\n"); // return EXIT_FAILURE; // } // if (pDH[DO_version] != DLDI_VERSION) { // printf ("Incorrect DLDI file version. Expected %d, found %d.\n", DLDI_VERSION, pDH[DO_version]); // return EXIT_FAILURE; // } // if (pDH[DO_driverSize] > pAH[DO_allocatedSpace]) { // printf ("Not enough space for patch. Available %d bytes, need %d bytes\n", ( 1 << pAH[DO_allocatedSpace]), ( 1 << pDH[DO_driverSize]) ); // return EXIT_FAILURE; // } // // memOffset = readAddr (pAH, DO_text_start); // if (memOffset == 0) { // memOffset = readAddr (pAH, DO_startup) - DO_code; // } // ddmemOffset = readAddr (pDH, DO_text_start); // relocationOffset = memOffset - ddmemOffset; // // printf ("Old driver: %s\n", &pAH[DO_friendlyName]); // printf ("New driver: %s\n", &pDH[DO_friendlyName]); // printf ("\n"); // printf ("Position in file: 0x%08X\n", patchOffset); // printf ("Position in memory: 0x%08X\n", memOffset); // printf ("Patch base address: 0x%08X\n", ddmemOffset); // printf ("Relocation offset: 0x%08X\n", relocationOffset); // printf ("\n"); // // ddmemStart = readAddr (pDH, DO_text_start); // ddmemSize = (1 << pDH[DO_driverSize]); // ddmemEnd = ddmemStart + ddmemSize; // // // Remember how much space is actually reserved // pDH[DO_allocatedSpace] = pAH[DO_allocatedSpace]; // // Copy the DLDI patch into the application // memcpy (pAH, pDH, dldiFileSize); // // // Fix the section pointers in the header // writeAddr (pAH, DO_text_start, readAddr (pAH, DO_text_start) + relocationOffset); // writeAddr (pAH, DO_data_end, readAddr (pAH, DO_data_end) + relocationOffset); // writeAddr (pAH, DO_glue_start, readAddr (pAH, DO_glue_start) + relocationOffset); // writeAddr (pAH, DO_glue_end, readAddr (pAH, DO_glue_end) + relocationOffset); // writeAddr (pAH, DO_got_start, readAddr (pAH, DO_got_start) + relocationOffset); // writeAddr (pAH, DO_got_end, readAddr (pAH, DO_got_end) + relocationOffset); // writeAddr (pAH, DO_bss_start, readAddr (pAH, DO_bss_start) + relocationOffset); // writeAddr (pAH, DO_bss_end, readAddr (pAH, DO_bss_end) + relocationOffset); // // Fix the function pointers in the header // writeAddr (pAH, DO_startup, readAddr (pAH, DO_startup) + relocationOffset); // writeAddr (pAH, DO_isInserted, readAddr (pAH, DO_isInserted) + relocationOffset); // writeAddr (pAH, DO_readSectors, readAddr (pAH, DO_readSectors) + relocationOffset); // writeAddr (pAH, DO_writeSectors, readAddr (pAH, DO_writeSectors) + relocationOffset); // writeAddr (pAH, DO_clearStatus, readAddr (pAH, DO_clearStatus) + relocationOffset); // writeAddr (pAH, DO_shutdown, readAddr (pAH, DO_shutdown) + relocationOffset); // // if (pDH[DO_fixSections] & FIX_ALL) { // // Search through and fix pointers within the data section of the file // for (addrIter = (readAddr(pDH, DO_text_start) - ddmemStart); addrIter < (readAddr(pDH, DO_data_end) - ddmemStart); addrIter++) { // if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { // writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); // } // } // } // // if (pDH[DO_fixSections] & FIX_GLUE) { // // Search through and fix pointers within the glue section of the file // for (addrIter = (readAddr(pDH, DO_glue_start) - ddmemStart); addrIter < (readAddr(pDH, DO_glue_end) - ddmemStart); addrIter++) { // if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { // writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); // } // } // } // // if (pDH[DO_fixSections] & FIX_GOT) { // // Search through and fix pointers within the Global Offset Table section of the file // for (addrIter = (readAddr(pDH, DO_got_start) - ddmemStart); addrIter < (readAddr(pDH, DO_got_end) - ddmemStart); addrIter++) { // if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { // writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); // } // } // } // // if (pDH[DO_fixSections] & FIX_BSS) { // // Initialise the BSS to 0 // memset (&pAH[readAddr(pDH, DO_bss_start) - ddmemStart] , 0, readAddr(pDH, DO_bss_end) - readAddr(pDH, DO_bss_start)); // } // // // Write the patch back to the file // fseek (appFile, patchOffset, SEEK_SET); // fwrite (pAH, 1, ddmemSize, appFile); // fclose (appFile); // // free (appFileData); // free (dldiFileData); // // printf ("Patched successfully\n"); // // return EXIT_SUCCESS; //} // Source File: mpcf.dldi // Time: 6/14/2010 9:38 PM // Orig. Offset: 0 / 0x00000000 // Length: 1876 / 0x00000754 (bytes) data_t mpcf_dldi[1876] = { 0xED, 0xA5, 0x8D, 0xBF, 0x20, 0x43, 0x68, 0x69, 0x73, 0x68, 0x6D, 0x00, 0x01, 0x0B, 0x0C, 0x00, 0x47, 0x42, 0x41, 0x20, 0x4D, 0x6F, 0x76, 0x69, 0x65, 0x20, 0x50, 0x6C, 0x61, 0x79, 0x65, 0x72, 0x20, 0x28, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x20, 0x46, 0x6C, 0x61, 0x73, 0x68, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xBF, 0x54, 0x07, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0x50, 0x07, 0x80, 0xBF, 0x50, 0x07, 0x80, 0xBF, 0x54, 0x07, 0x80, 0xBF, 0x70, 0x07, 0x80, 0xBF, 0x4D, 0x50, 0x43, 0x46, 0x13, 0x00, 0x00, 0x00, 0x3C, 0x01, 0x80, 0xBF, 0x98, 0x01, 0x80, 0xBF, 0x78, 0x02, 0x80, 0xBF, 0xC8, 0x04, 0x80, 0xBF, 0xC8, 0x01, 0x80, 0xBF, 0x10, 0x07, 0x80, 0xBF, 0x0D, 0xC0, 0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x04, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x10, 0x40, 0x2D, 0xE9, 0x2C, 0x40, 0x9F, 0xE5, 0x00, 0x30, 0xD4, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x24, 0x20, 0x9F, 0xE5, 0x05, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x52, 0xE3, 0x1C, 0x00, 0x9F, 0xE5, 0x0F, 0xE0, 0xA0, 0x11, 0x12, 0xFF, 0x2F, 0x11, 0x01, 0x30, 0xA0, 0xE3, 0x00, 0x30, 0xC4, 0xE5, 0x10, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x54, 0x07, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x48, 0x07, 0x80, 0xBF, 0x04, 0xE0, 0x2D, 0xE5, 0x40, 0x30, 0x9F, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x04, 0xD0, 0x4D, 0xE2, 0x38, 0x00, 0x9F, 0xE5, 0x38, 0x10, 0x9F, 0xE5, 0x0F, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x30, 0x00, 0x9F, 0xE5, 0x00, 0x30, 0x90, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x28, 0x30, 0x9F, 0xE5, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x53, 0xE3, 0x0F, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x04, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x48, 0x07, 0x80, 0xBF, 0x58, 0x07, 0x80, 0xBF, 0x4C, 0x07, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x09, 0x14, 0xA0, 0xE3, 0x06, 0x18, 0x81, 0xE2, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x30, 0xE0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0xB0, 0x30, 0xC1, 0xE1, 0xB0, 0x20, 0xD1, 0xE1, 0x04, 0xE0, 0x2D, 0xE5, 0xAA, 0xCC, 0xA0, 0xE3, 0x55, 0xEC, 0xE0, 0xE3, 0x03, 0x00, 0x52, 0xE1, 0xAA, 0xE0, 0x4E, 0xE2, 0x55, 0xC0, 0x8C, 0xE2, 0x00, 0x00, 0xA0, 0xE3, 0x03, 0x00, 0x00, 0x1A, 0xB0, 0xE0, 0xC1, 0xE1, 0xB0, 0x30, 0xD1, 0xE1, 0x0C, 0x00, 0x53, 0xE0, 0x01, 0x00, 0xA0, 0x13, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x26, 0x35, 0xA0, 0xE3, 0x03, 0x37, 0x83, 0xE2, 0x50, 0x20, 0xA0, 0xE3, 0xB0, 0x20, 0xC3, 0xE1, 0xB0, 0x00, 0xD3, 0xE1, 0x00, 0x08, 0xA0, 0xE1, 0x20, 0x08, 0xA0, 0xE1, 0xFF, 0x00, 0x00, 0xE2, 0x50, 0x00, 0x50, 0xE3, 0x00, 0x00, 0xA0, 0x13, 0x01, 0x00, 0xA0, 0x03, 0x1E, 0xFF, 0x2F, 0xE1, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x80, 0x00, 0x12, 0xE3, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x50, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, 0x80, 0x00, 0x12, 0xE3, 0x01, 0x00, 0x80, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, 0x26, 0x15, 0xA0, 0xE3, 0x03, 0x17, 0x81, 0xE2, 0xB0, 0x30, 0xD1, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x01, 0x00, 0xA0, 0x13, 0x1E, 0xFF, 0x2F, 0x11, 0x26, 0x27, 0xA0, 0xE3, 0x96, 0x2C, 0x82, 0xE2, 0x03, 0x00, 0xA0, 0xE1, 0x80, 0x20, 0x82, 0xE2, 0x01, 0x00, 0x00, 0xEA, 0x02, 0x00, 0x50, 0xE1, 0x0A, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD1, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x01, 0x00, 0x80, 0xE2, 0xF9, 0xFF, 0xFF, 0x0A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x50, 0xE1, 0x00, 0x00, 0xA0, 0xC3, 0x01, 0x00, 0xA0, 0xD3, 0x1E, 0xFF, 0x2F, 0xE1, 0x03, 0x00, 0xA0, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x4B, 0x2D, 0xE9, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0xC0, 0xD3, 0xE1, 0x80, 0x00, 0x1C, 0xE3, 0x10, 0xD0, 0x4D, 0xE2, 0x01, 0x90, 0xA0, 0xE1, 0x02, 0xE0, 0xA0, 0xE1, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0xC0, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x5C, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, 0x80, 0x00, 0x12, 0xE3, 0x01, 0xC0, 0x8C, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, 0x26, 0xC5, 0xA0, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x26, 0x17, 0xA0, 0x03, 0x96, 0x1C, 0x81, 0x02, 0x03, 0x20, 0xA0, 0x01, 0x80, 0x10, 0x81, 0x02, 0x02, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x67, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x00, 0x13, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF9, 0xFF, 0xFF, 0x0A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, 0x5E, 0x00, 0x00, 0xCA, 0xFF, 0x00, 0x59, 0xE3, 0x00, 0x30, 0xA0, 0x83, 0x0C, 0x30, 0x8D, 0x85, 0x5E, 0x00, 0x00, 0x9A, 0x00, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x09, 0x54, 0xA0, 0xE3, 0x04, 0x30, 0x8D, 0xE5, 0x0C, 0x30, 0x9D, 0xE5, 0x20, 0x4C, 0xA0, 0xE1, 0x0E, 0xB0, 0xA0, 0xE1, 0x05, 0x60, 0xA0, 0xE1, 0x20, 0x74, 0xA0, 0xE1, 0x05, 0x20, 0xA0, 0xE1, 0x20, 0x18, 0xA0, 0xE1, 0x05, 0xC0, 0xA0, 0xE1, 0x05, 0x00, 0xA0, 0xE1, 0x05, 0xE0, 0xA0, 0xE1, 0x01, 0x57, 0x85, 0xE2, 0xB0, 0x30, 0xC5, 0xE1, 0x04, 0x30, 0x9D, 0xE5, 0x0F, 0x40, 0x04, 0xE2, 0x06, 0x68, 0x86, 0xE2, 0xB0, 0x30, 0xC6, 0xE1, 0xFF, 0x70, 0x07, 0xE2, 0x02, 0x27, 0x82, 0xE2, 0xFF, 0x10, 0x01, 0xE2, 0x0A, 0x08, 0x80, 0xE2, 0xE0, 0x40, 0x84, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0x0E, 0xE8, 0x8E, 0xE2, 0x20, 0x30, 0xA0, 0xE3, 0xB0, 0x70, 0xC2, 0xE1, 0xB0, 0x10, 0xC0, 0xE1, 0xB0, 0x40, 0xCC, 0xE1, 0xB0, 0x30, 0xCE, 0xE1, 0x0B, 0x80, 0xA0, 0xE1, 0x01, 0x90, 0x59, 0xE2, 0x3E, 0x00, 0x00, 0x3A, 0x26, 0x25, 0xA0, 0xE3, 0x03, 0x27, 0x82, 0xE2, 0xB0, 0x30, 0xD2, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x26, 0x17, 0xA0, 0x13, 0x96, 0x1C, 0x81, 0x12, 0x02, 0x00, 0xA0, 0x11, 0x80, 0x10, 0x81, 0x12, 0x00, 0x20, 0xA0, 0x13, 0x02, 0x00, 0x00, 0x1A, 0x0D, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x26, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF6, 0xFF, 0xFF, 0x1A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, 0x1A, 0x00, 0x00, 0xCA, 0x01, 0x00, 0x18, 0xE3, 0x0B, 0x10, 0xA0, 0x01, 0xFF, 0x20, 0xA0, 0x03, 0x09, 0x04, 0xA0, 0x03, 0x0E, 0x00, 0x00, 0x0A, 0x08, 0x10, 0xA0, 0xE1, 0xFF, 0x00, 0xA0, 0xE3, 0x09, 0xC4, 0xA0, 0xE3, 0xB0, 0x30, 0xDC, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0x01, 0x00, 0x40, 0xE2, 0x43, 0x24, 0xA0, 0xE1, 0x01, 0x00, 0x70, 0xE3, 0x01, 0x20, 0xC1, 0xE5, 0x00, 0x30, 0xC1, 0xE5, 0x02, 0x10, 0x81, 0xE2, 0xF5, 0xFF, 0xFF, 0x1A, 0x02, 0x8C, 0x88, 0xE2, 0xCD, 0xFF, 0xFF, 0xEA, 0x01, 0x20, 0x42, 0xE2, 0xB0, 0x30, 0xD0, 0xE1, 0x01, 0x00, 0x72, 0xE3, 0xB2, 0x30, 0xC1, 0xE0, 0xFA, 0xFF, 0xFF, 0x1A, 0x02, 0xBC, 0x8B, 0xE2, 0xC6, 0xFF, 0xFF, 0xEA, 0x00, 0x00, 0xA0, 0xE3, 0x10, 0xD0, 0x8D, 0xE2, 0xF0, 0x4B, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x09, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0x0C, 0x30, 0x8D, 0xE5, 0x9C, 0xFF, 0xFF, 0xEA, 0x01, 0x00, 0xA0, 0xE3, 0xF6, 0xFF, 0xFF, 0xEA, 0xF0, 0x4B, 0x2D, 0xE9, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0xC0, 0xD3, 0xE1, 0x80, 0x00, 0x1C, 0xE3, 0x10, 0xD0, 0x4D, 0xE2, 0x01, 0x90, 0xA0, 0xE1, 0x02, 0xE0, 0xA0, 0xE1, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0xC0, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x5C, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, 0x80, 0x00, 0x12, 0xE3, 0x01, 0xC0, 0x8C, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, 0x26, 0xC5, 0xA0, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x26, 0x17, 0xA0, 0x03, 0x96, 0x1C, 0x81, 0x02, 0x03, 0x20, 0xA0, 0x01, 0x80, 0x10, 0x81, 0x02, 0x02, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x65, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x00, 0x13, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF9, 0xFF, 0xFF, 0x0A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, 0x5C, 0x00, 0x00, 0xCA, 0xFF, 0x00, 0x59, 0xE3, 0x00, 0x30, 0xA0, 0x83, 0x0C, 0x30, 0x8D, 0x85, 0x5C, 0x00, 0x00, 0x9A, 0x00, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x09, 0x54, 0xA0, 0xE3, 0x04, 0x30, 0x8D, 0xE5, 0x0C, 0x30, 0x9D, 0xE5, 0x20, 0x4C, 0xA0, 0xE1, 0x0E, 0xB0, 0xA0, 0xE1, 0x05, 0x60, 0xA0, 0xE1, 0x20, 0x74, 0xA0, 0xE1, 0x05, 0x20, 0xA0, 0xE1, 0x20, 0x18, 0xA0, 0xE1, 0x05, 0xC0, 0xA0, 0xE1, 0x05, 0x00, 0xA0, 0xE1, 0x05, 0xE0, 0xA0, 0xE1, 0x01, 0x57, 0x85, 0xE2, 0xB0, 0x30, 0xC5, 0xE1, 0x04, 0x30, 0x9D, 0xE5, 0x0F, 0x40, 0x04, 0xE2, 0x06, 0x68, 0x86, 0xE2, 0xB0, 0x30, 0xC6, 0xE1, 0xFF, 0x70, 0x07, 0xE2, 0x02, 0x27, 0x82, 0xE2, 0xFF, 0x10, 0x01, 0xE2, 0x0A, 0x08, 0x80, 0xE2, 0xE0, 0x40, 0x84, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0x0E, 0xE8, 0x8E, 0xE2, 0x30, 0x30, 0xA0, 0xE3, 0xB0, 0x70, 0xC2, 0xE1, 0xB0, 0x10, 0xC0, 0xE1, 0xB0, 0x40, 0xCC, 0xE1, 0xB0, 0x30, 0xCE, 0xE1, 0x0B, 0x80, 0xA0, 0xE1, 0x01, 0x90, 0x59, 0xE2, 0x3C, 0x00, 0x00, 0x3A, 0x26, 0x25, 0xA0, 0xE3, 0x03, 0x27, 0x82, 0xE2, 0xB0, 0x30, 0xD2, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x26, 0x17, 0xA0, 0x13, 0x96, 0x1C, 0x81, 0x12, 0x02, 0x00, 0xA0, 0x11, 0x80, 0x10, 0x81, 0x12, 0x00, 0x20, 0xA0, 0x13, 0x02, 0x00, 0x00, 0x1A, 0x0D, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x24, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF6, 0xFF, 0xFF, 0x1A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, 0x18, 0x00, 0x00, 0xCA, 0x01, 0x00, 0x18, 0xE3, 0x0B, 0x10, 0xA0, 0x01, 0xFF, 0x20, 0xA0, 0x03, 0x09, 0x04, 0xA0, 0x03, 0x0C, 0x00, 0x00, 0x0A, 0x08, 0x10, 0xA0, 0xE1, 0xFF, 0x00, 0xA0, 0xE3, 0x09, 0xC4, 0xA0, 0xE3, 0x00, 0x30, 0xD1, 0xE5, 0x01, 0x20, 0xD1, 0xE5, 0x01, 0x00, 0x40, 0xE2, 0x02, 0x34, 0x83, 0xE1, 0x01, 0x00, 0x70, 0xE3, 0xB0, 0x30, 0xCC, 0xE1, 0x02, 0x10, 0x81, 0xE2, 0xF7, 0xFF, 0xFF, 0x1A, 0x02, 0x8C, 0x88, 0xE2, 0xCF, 0xFF, 0xFF, 0xEA, 0x01, 0x20, 0x42, 0xE2, 0xB2, 0x30, 0xD1, 0xE0, 0x01, 0x00, 0x72, 0xE3, 0xB0, 0x30, 0xC0, 0xE1, 0xFA, 0xFF, 0xFF, 0x1A, 0x02, 0xBC, 0x8B, 0xE2, 0xC8, 0xFF, 0xFF, 0xEA, 0x00, 0x00, 0xA0, 0xE3, 0x10, 0xD0, 0x8D, 0xE2, 0xF0, 0x4B, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x09, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0x0C, 0x30, 0x8D, 0xE5, 0x9E, 0xFF, 0xFF, 0xEA, 0x01, 0x00, 0xA0, 0xE3, 0xF6, 0xFF, 0xFF, 0xEA, 0x04, 0xE0, 0x2D, 0xE5, 0x04, 0xD0, 0x4D, 0xE2, 0xAA, 0xFE, 0xFF, 0xEB, 0x04, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x0D, 0xC0, 0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x04, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xDC, 0x00, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; //unsigned char mpcf_dldi[1876] bool tryPatch(void* data, size_t size) { // Find the DSDI reserved space in the file addr_t patchOffset = quickFind ((data_t*)data, dldiMagicString, size, sizeof(dldiMagicString)/sizeof(char)); //no DLDI section if (patchOffset < 0) return false; data_t *pDH = mpcf_dldi; data_t *pAH = (data_t*)data + patchOffset; if (pDH[DO_driverSize] > pAH[DO_allocatedSpace]) { printf ("Not enough space for patch. Available %d bytes, need %d bytes\n", ( 1 << pAH[DO_allocatedSpace]), ( 1 << pDH[DO_driverSize]) ); return false; } if(memcmp(&pAH[DO_friendlyName],"Default (No interface)",22)) { printf("Would have been a candidate for auto-patch DLDI, but there was already a patch installed."); return false; } //----should be able to patch OK----- addr_t memOffset; // Offset of DLDI after the file is loaded into memory addr_t relocationOffset; // Value added to all offsets within the patch to fix it properly addr_t ddmemOffset; // Original offset used in the DLDI file addr_t ddmemStart; // Start of range that offsets can be in the DLDI file addr_t ddmemEnd; // End of range that offsets can be in the DLDI file addr_t ddmemSize; // Size of range that offsets can be in the DLDI file addr_t addrIter; memOffset = readAddr (pAH, DO_text_start); if (memOffset == 0) { memOffset = readAddr (pAH, DO_startup) - DO_code; } ddmemOffset = readAddr (pDH, DO_text_start); relocationOffset = memOffset - ddmemOffset; printf ("AUTO-PATCHING DLDI to MPCF! Lucky you!\n\n"); printf ("Old driver: %s\n", &pAH[DO_friendlyName]); printf ("New driver: %s\n", &pDH[DO_friendlyName]); printf ("\n"); printf ("Position in file: 0x%08X\n", patchOffset); printf ("Position in memory: 0x%08X\n", memOffset); printf ("Patch base address: 0x%08X\n", ddmemOffset); printf ("Relocation offset: 0x%08X\n", relocationOffset); printf ("\n"); ddmemStart = readAddr (pDH, DO_text_start); ddmemSize = (1 << pDH[DO_driverSize]); ddmemEnd = ddmemStart + ddmemSize; // Remember how much space is actually reserved pDH[DO_allocatedSpace] = pAH[DO_allocatedSpace]; // Copy the DLDI patch into the application memcpy (pAH, pDH, sizeof(mpcf_dldi)); // Fix the section pointers in the header writeAddr (pAH, DO_text_start, readAddr (pAH, DO_text_start) + relocationOffset); writeAddr (pAH, DO_data_end, readAddr (pAH, DO_data_end) + relocationOffset); writeAddr (pAH, DO_glue_start, readAddr (pAH, DO_glue_start) + relocationOffset); writeAddr (pAH, DO_glue_end, readAddr (pAH, DO_glue_end) + relocationOffset); writeAddr (pAH, DO_got_start, readAddr (pAH, DO_got_start) + relocationOffset); writeAddr (pAH, DO_got_end, readAddr (pAH, DO_got_end) + relocationOffset); writeAddr (pAH, DO_bss_start, readAddr (pAH, DO_bss_start) + relocationOffset); writeAddr (pAH, DO_bss_end, readAddr (pAH, DO_bss_end) + relocationOffset); // Fix the function pointers in the header writeAddr (pAH, DO_startup, readAddr (pAH, DO_startup) + relocationOffset); writeAddr (pAH, DO_isInserted, readAddr (pAH, DO_isInserted) + relocationOffset); writeAddr (pAH, DO_readSectors, readAddr (pAH, DO_readSectors) + relocationOffset); writeAddr (pAH, DO_writeSectors, readAddr (pAH, DO_writeSectors) + relocationOffset); writeAddr (pAH, DO_clearStatus, readAddr (pAH, DO_clearStatus) + relocationOffset); writeAddr (pAH, DO_shutdown, readAddr (pAH, DO_shutdown) + relocationOffset); if (pDH[DO_fixSections] & FIX_ALL) { // Search through and fix pointers within the data section of the file for (addrIter = (readAddr(pDH, DO_text_start) - ddmemStart); addrIter < (readAddr(pDH, DO_data_end) - ddmemStart); addrIter++) { if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); } } } if (pDH[DO_fixSections] & FIX_GLUE) { // Search through and fix pointers within the glue section of the file for (addrIter = (readAddr(pDH, DO_glue_start) - ddmemStart); addrIter < (readAddr(pDH, DO_glue_end) - ddmemStart); addrIter++) { if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); } } } if (pDH[DO_fixSections] & FIX_GOT) { // Search through and fix pointers within the Global Offset Table section of the file for (addrIter = (readAddr(pDH, DO_got_start) - ddmemStart); addrIter < (readAddr(pDH, DO_got_end) - ddmemStart); addrIter++) { if ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) { writeAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset); } } } if (pDH[DO_fixSections] & FIX_BSS) { // Initialise the BSS to 0 memset (&pAH[readAddr(pDH, DO_bss_start) - ddmemStart] , 0, readAddr(pDH, DO_bss_end) - readAddr(pDH, DO_bss_start)); } return true; } } //namespace DLDI desmume-0.9.9/src/utils/decrypt/0000755000175000017500000000000012140305317017317 5ustar guillaumeguillaumedesmume-0.9.9/src/utils/decrypt/crc.h0000644000175000017500000001325612140261631020246 0ustar guillaumeguillaume//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/include/crc.h?revision=2447 /* crc.h - this file is part of DeSmuME * * Copyright (C) 2005-2006 Rafael Vuijk * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Cyclic Redundancy Code (CRC) functions by Rafael Vuijk (aka DarkFader) */ #ifndef __CRC_H #define __CRC_H //#include "little.h" // FixCrc is not yet big endian compatible /* * Data */ extern unsigned short ccitt16tab[]; extern unsigned short crc16tab[]; extern unsigned long crc32tab[]; /* * Defines */ #define CRC_TEMPLATE template /* * CalcCcitt * Does not perform final inversion. */ #define CalcCcitt_ CalcCcitt #define CalcCcitt16 CalcCcitt CRC_TEMPLATE inline CrcType CalcCcitt(unsigned char *data, unsigned int length, CrcType crc = (CrcType)0) { for (unsigned int i=0; i> 8) ^ data[i]]; } return crc; } /* * CalcCrc * Does not perform final inversion. */ #define CalcCrc_ CalcCrc #define CalcCrc16 CalcCrc #define CalcCrc32 CalcCrc CRC_TEMPLATE inline CrcType CalcCrc(unsigned char *data, unsigned int length, CrcType crc = (CrcType)~0) { for (unsigned int i=0; i> 8) ^ crcTable[(crc ^ data[i]) & 0xFF]; } return crc; } /* * FCalcCrc * Does not perform final inversion. */ #define FCalcCrc_ FCalcCrc #define FCalcCrc16 FCalcCrc #define FCalcCrc32 FCalcCrc CRC_TEMPLATE inline CrcType FCalcCrc(FILE *f, unsigned int offset, unsigned int length, CrcType crc = (CrcType)~0) { fseek(f, offset, SEEK_SET); for (unsigned int i=0; i> 8) ^ crcTable[(crc ^ fgetc(f)) & 0xFF]; } return crc; } /* * RevCrc * Reverse table lookup. */ #define RevCrc_ RevCrc CRC_TEMPLATE inline unsigned char RevCrc(unsigned char x, CrcType *value = 0) { for (int y=0; y<256; y++) { if ((crcTable[y] >> (8*sizeof(CrcType)-8)) == x) { if (value) *value = crcTable[y]; return y; } } return 0; } /* * FixCrc */ #define FixCrc_ FixCrc #define FixCrc16 FixCrc #define FixCrc32 FixCrc CRC_TEMPLATE void FixCrc ( unsigned char *data, // data to be patched unsigned int patch_offset, unsigned char *patch_data, unsigned int patch_length, // patch data unsigned int fix_offset = 0, // position to write the fix. by default, it is immediately after the patched data CrcType initial_crc = (CrcType)~0 // useful when manually calculating leading data ) { if (!fix_offset) fix_offset = patch_offset + patch_length; // calculate CRC after leading data initial_crc = CalcCrc_(data, patch_offset, initial_crc); // calculate CRC before fix unsigned char buf[2*sizeof(CrcType)]; CrcType crc_before_fix = CalcCrc_(data + patch_offset, fix_offset - patch_offset); *(CrcType *)(buf + 0) = crc_before_fix; // patch memcpy(data + patch_offset, patch_data, patch_length); // calculate CRC after unfixed CrcType crc_after_unfix = CalcCrc_(data + patch_offset, fix_offset - patch_offset + sizeof(CrcType)); *(CrcType *)(buf + sizeof(CrcType)) = crc_after_unfix; // fix it for (int i=sizeof(CrcType); i>=1; i--) { CrcType value; unsigned char index = RevCrc_(buf[i + sizeof(CrcType) - 1], &value); *(CrcType *)(buf + i) ^= value; buf[i - 1] ^= index; } memcpy(data + fix_offset, buf, sizeof(CrcType)); } /* * FFixCrc */ #define FFixCrc_ FFixCrc #define FFixCrc16 FFixCrc #define FFixCrc32 FFixCrc CRC_TEMPLATE void FFixCrc ( FILE *f, // file to be patched unsigned int patch_offset, unsigned char *patch_data, unsigned int patch_length, // patch data unsigned int fix_offset = 0, // position to write the fix. by default, it is immediately after the patched data CrcType initial_crc = (CrcType)~0 // useful when manually calculating leading data ) { if (!fix_offset) fix_offset = patch_offset + patch_length; // calculate CRC after leading data initial_crc = FCalcCrc_(f, 0, patch_offset, initial_crc); // calculate CRC before fix unsigned char buf[2*sizeof(CrcType)]; CrcType crc_before_fix = FCalcCrc_(f, patch_offset, fix_offset - patch_offset); *(CrcType *)(buf + 0) = crc_before_fix; // patch fseek(f, patch_offset, SEEK_SET); fwrite(patch_data, 1, patch_length, f); // calculate CRC after unfixed CrcType crc_after_unfix = FCalcCrc_(f, patch_offset, fix_offset - patch_offset + sizeof(CrcType)); *(CrcType *)(buf + sizeof(CrcType)) = crc_after_unfix; // fix it for (int i=sizeof(CrcType); i>=1; i--) { CrcType value=0; unsigned char index = RevCrc_(buf[i + sizeof(CrcType) - 1], &value); *(CrcType *)(buf + i) ^= value; buf[i - 1] ^= index; } fseek(f, fix_offset, SEEK_SET); fwrite(buf, sizeof(CrcType), 1, f); } #endif // __CRC_H desmume-0.9.9/src/utils/decrypt/crc.cpp0000644000175000017500000002074212140261631020577 0ustar guillaumeguillaume//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/crc.cpp?revision=1587 /* crc.cpp - this file is part of DeSmuME * * Copyright (C) 2005-2006 Rafael Vuijk * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Cyclic Redundancy Code (CRC) functions by Rafael Vuijk (aka DarkFader) */ unsigned short ccitt16tab[] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; unsigned short crc16tab[] = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 }; unsigned long crc32tab[] = { 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL, 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L, 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL, 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L, 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L, 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L, 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL, 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L, 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L, 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL, 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L, 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL, 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL, 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L, 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L, 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L, 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL, 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL, 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L, 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L, 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL, 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L, 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L, 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL, 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L, 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL, 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L, 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L, 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L, 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L, 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL, 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L, 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L, 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L, 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L, 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L, 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL, 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL, 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL, 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L, 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L, 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L, 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL, 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L, 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL, 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L, 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL, 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L, 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L, 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L, 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL, 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L, 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL }; desmume-0.9.9/src/utils/decrypt/header.cpp0000644000175000017500000005277712140261631021275 0ustar guillaumeguillaume//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/header.cpp?revision=3063 /* header.cpp - this file is part of DeSmuME * * Copyright (C) 2005-2006 Rafael Vuijk * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "header.h" //#include "ndstool.h" //#include "banner.h" //#include "sha1.h" //#include "crc.h" //#include "bigint.h" //#include "arm7_sha1_homebrew.h" //#include "arm7_sha1_nintendo.h" //#include "encryption.h" // ///* // * Data // */ //unsigned char publicKeyNintendo[] = //{ // 0x9E, 0xC1, 0xCC, 0xC0, 0x4A, 0x6B, 0xD0, 0xA0, 0x6D, 0x62, 0xED, 0x5F, 0x15, 0x67, 0x87, 0x12, // 0xE6, 0xF4, 0x77, 0x1F, 0xD8, 0x5C, 0x81, 0xCE, 0x0C, 0xD0, 0x22, 0x31, 0xF5, 0x89, 0x08, 0xF5, // 0xBE, 0x04, 0xCB, 0xC1, 0x4F, 0x63, 0xD9, 0x5A, 0x98, 0xFF, 0xEB, 0x36, 0x0F, 0x9C, 0x5D, 0xAD, // 0x15, 0xB9, 0x99, 0xFB, 0xC6, 0x86, 0x2C, 0x0A, 0x0C, 0xFC, 0xE6, 0x86, 0x03, 0x60, 0xD4, 0x87, // 0x28, 0xD5, 0x66, 0x42, 0x9C, 0xF7, 0x04, 0x14, 0x4E, 0x6F, 0x73, 0x20, 0xC3, 0x3E, 0x3F, 0xF5, // 0x82, 0x2E, 0x78, 0x18, 0xD6, 0xCD, 0xD5, 0xC2, 0xDC, 0xAA, 0x1D, 0x34, 0x91, 0xEC, 0x99, 0xC9, // 0xF7, 0xBF, 0xBF, 0xA0, 0x0E, 0x1E, 0xF0, 0x25, 0xF8, 0x66, 0x17, 0x54, 0x34, 0x28, 0x2D, 0x28, // 0xA3, 0xAE, 0xF0, 0xA9, 0xFA, 0x3A, 0x70, 0x56, 0xD2, 0x34, 0xA9, 0xC5, 0x9E, 0x5D, 0xF5, 0xE1, //}; // ///* // * CalcHeaderCRC // */ //unsigned short CalcHeaderCRC(Header &header) //{ // return CalcCrc16((unsigned char *)&header, 0x15E); //} // ///* // * CalcLogoCRC // */ //unsigned short CalcLogoCRC(Header &header) //{ // return CalcCrc16((unsigned char *)&header + 0xC0, 156); //} // /* * DetectRomType */ int DetectRomType(const Header& header, char* romdata) { unsigned int * data = (unsigned int*)(romdata + 0x4000); //this is attempting to check for an utterly invalid nds header if(header.unitcode < 0 && header.unitcode > 3) return ROMTYPE_INVALID; if (header.arm9_rom_offset < 0x4000) return ROMTYPE_HOMEBREW; if (data[0] == 0x00000000 && data[1] == 0x00000000) return ROMTYPE_MULTIBOOT; if (data[0] == 0xE7FFDEFF && data[1] == 0xE7FFDEFF) return ROMTYPE_NDSDUMPED; for (int i=0x200; i<0x4000; i++) if (romdata[i]) return ROMTYPE_MASKROM; // found something odd ;) return ROMTYPE_ENCRSECURE; } ///* // * CalcSecureAreaCRC // */ //unsigned short CalcSecureAreaCRC(bool encrypt) //{ // fseek(fNDS, 0x4000, SEEK_SET); // unsigned char data[0x4000]; // fread(data, 1, 0x4000, fNDS); // if (encrypt) encrypt_arm9(*(u32 *)header.gamecode, data); // return CalcCrc16(data, 0x4000); //} // ///* // * CalcSecurityDataCRC // */ //unsigned short CalcSecurityDataCRC() //{ // fseek(fNDS, 0x1000, SEEK_SET); // unsigned char data[0x2000]; // fread(data, 1, 0x2000, fNDS); // return CalcCrc16(data, 0x2000); //} // ///* // * CalcSegment3CRC // */ //unsigned short CalcSegment3CRC() //{ // fseek(fNDS, 0x3000, SEEK_SET); // unsigned char data[0x1000]; // fread(data, 1, 0x1000, fNDS); // for (int i=0; i<0x1000; i+=2) // swap bytes // { // unsigned char t = data[i+1]; data[i+1] = data[i]; data[i] = t; // } // return CalcCcitt16(data, 0x1000); // why would they use CRC16-CCITT ? //} // ///* // * FixHeaderCRC // */ //void FixHeaderCRC(char *ndsfilename) //{ // fNDS = fopen(ndsfilename, "r+b"); // if (!fNDS) { fprintf(stderr, "Cannot open file '%s'.\n", ndsfilename); exit(1); } // fread(&header, 512, 1, fNDS); // header.header_crc = CalcHeaderCRC(header); // fseek(fNDS, 0, SEEK_SET); // fwrite(&header, 512, 1, fNDS); // fclose(fNDS); //} // ///* // * ShowHeaderInfo // */ //void ShowHeaderInfo(Header &header, int romType, unsigned int length = 0x200) //{ // printf("0x00\t%-25s\t", "Game title"); // // for (unsigned int i=0; i= 2) // { // printf("{ DS Download Play(TM) / Wireless MultiBoot header information:\n"); // ShowHeaderInfo(*(Header *)(buf + 0x20), romType, 0x160); // printf("}\n"); // } // } // else // { // fseek(fNDS, 0, SEEK_SET); // fread(buf, 1, sizeof(buf), fNDS); // sha1_hash(buf, 0x160, &m_sha1); // } // sha1_end(header_sha1, &m_sha1); //} // ///* // * Arm9Sha1Multiboot // */ //void Arm9Sha1Multiboot(FILE *fNDS, unsigned char *arm9_sha1) //{ // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // fseek(fNDS, header.arm9_rom_offset, SEEK_SET); // unsigned int len = header.arm9_size; // unsigned char *buf = new unsigned char [len]; // fread(buf, 1, len, fNDS); // //printf("%u\n", len); // sha1_hash(buf, len, &m_sha1); // delete [] buf; // sha1_end(arm9_sha1, &m_sha1); //} // ///* // * Arm9Sha1ClearedOutArea // */ //void Arm9Sha1ClearedOutArea(FILE *fNDS, unsigned char *arm9_sha1) //{ // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // fseek(fNDS, header.arm9_rom_offset, SEEK_SET); // unsigned int len = header.arm9_size; // unsigned char *buf = new unsigned char [len]; // // int len1 = (0x5000 - header.arm9_rom_offset); // e.g. 0x5000 - 0x4000 = 0x1000 // int len3 = header.arm9_size - (0x7000 - header.arm9_rom_offset); // e.g. 0x10000 - (0x7000 - 0x4000) = 0xD000 // int len2 = header.arm9_size - len1 - len3; // e.g. 0x10000 - 0x1000 - 0xD000 = 0x2000 // if (len1 > 0) fread(buf, 1, len1, fNDS); // if (len2 > 0) { memset(buf + len1, 0, len2); fseek(fNDS, len2, SEEK_CUR); } // gets cleared for security? // if (len3 > 0) fread(buf + len1 + len2, 1, len3, fNDS); //// printf("%X %X %X\n", len1, len2, len3); // //// memset(buf, 0, 0x800); // clear "secure area" too // // sha1_hash(buf, len, &m_sha1); // delete [] buf; // sha1_end(arm9_sha1, &m_sha1); //} // ///* // * Arm7Sha1 // */ //void Arm7Sha1(FILE *fNDS, unsigned char *arm7_sha1) //{ // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // fseek(fNDS, header.arm7_rom_offset, SEEK_SET); // unsigned int len = header.arm7_size; // unsigned char *buf = new unsigned char [len]; // fread(buf, 1, len, fNDS); // //printf("%u\n", len); // sha1_hash(buf, len, &m_sha1); // delete [] buf; // sha1_end(arm7_sha1, &m_sha1); //} // ///* // * CompareSha1WithList // */ //int CompareSha1WithList(unsigned char *arm7_sha1, const unsigned char *text, unsigned int textSize) //{ // while (1) // { // //printf("\n"); // for (int i=0; i '9') ? ((*text - 'A') & 7) + 10 : *text - '0'); // text++; // } // //printf("%02X", b); // if (b != arm7_sha1[i]) break; else if (i == 19) return 0; // } // while (*text && (*text >= ' ')) text++; // line end // while (*text && (*text < ' ')) text++; // new line // } //} // ///* // * HashAndCompareWithList // * -1=error, 0=match, 1=no match // */ //int HashAndCompareWithList(char *filename, unsigned char sha1[]) //{ // FILE *f = fopen(filename, "rb"); // if (!f) return -1; // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // unsigned char buf[1024]; // unsigned int r; // do // { // r = fread(buf, 1, 1024, f); // sha1_hash(buf, r, &m_sha1); // } while (r > 0); // fclose(f); // sha1_end(sha1, &m_sha1); // if (CompareSha1WithList(sha1, arm7_sha1_homebrew, arm7_sha1_homebrew_size)) return 1; // not yet in list // return 0; //} // ///* // * strsepc // */ //char *strsepc(char **s, char d) //{ // char *r = *s; // for (char *p = *s; ; p++) // { // if (*p == 0) { *s = p; break; } // if (*p == d) { *s = p+1; *p = 0; break; } // } // return r; //} // ///* // * RomListInfo // */ //void RomListInfo(unsigned int crc32_match) //{ // if (!romlistfilename) return; // FILE *fRomList = fopen(romlistfilename, "rt"); // if (!fRomList) { fprintf(stderr, "Cannot open file '%s'.\n", romlistfilename); exit(1); } // char s[1024]; // while (fgets(s, 1024, fRomList)) // empty, title, title, title, title, filename, CRC32 // { // char *p = s; // if (strlen(strsepc(&p, '\xAC')) == 0) // { // char *title = strsepc(&p, '\xAC'); // unsigned int index = strtoul(title, 0, 10); // title += 7; // char *b1 = strchr(title, '('); // char *b2 = b1 ? strchr(b1+1, ')') : 0; // char *b3 = b2 ? strchr(b2+1, '(') : 0; // char *b4 = b3 ? strchr(b3+1, ')') : 0; // char *group = 0; // if (b1 + 2 == b2) if (b3 && b4) { *b3 = 0; *b4 = 0; group = b3+1; } // remove release group name // strsepc(&p, '\xAC'); strsepc(&p, '\xAC'); // strsepc(&p, '\xAC'); strsepc(&p, '\xAC'); // unsigned long crc32 = strtoul(strsepc(&p, '\xAC'), 0, 16); // if (crc32 == crc32_match) // { // printf("Release index: \t%u\n", index); // printf("Release title: \t%s\n", title); // printf("Release group: \t%s\n", group ? group : ""); // } // //for (int i=0; i<10; i++) printf("%d %s\n", i, strsepc(&p, '\xAC')); // } // } //} // ///* // * ShowVerboseInfo // */ //void ShowVerboseInfo(FILE *fNDS, Header &header, int romType) //{ // // calculate SHA1 of ARM7 binary // unsigned char arm7_sha1[SHA1_DIGEST_SIZE]; // Arm7Sha1(fNDS, arm7_sha1); // // // find signature data // unsigned_int signature_id = 0; // fseek(fNDS, header.application_end_offset, SEEK_SET); // fread(&signature_id, sizeof(signature_id), 1, fNDS); // if (signature_id != 0x00016361) // { // fseek(fNDS, header.application_end_offset - 136, SEEK_SET); // try again // fread(&signature_id, sizeof(signature_id), 1, fNDS); // } // if (signature_id == 0x00016361) // { // printf("\n"); // // unsigned char signature[128]; // fread(signature, 1, sizeof(signature), fNDS); // // unsigned char sha_parts[3*SHA1_DIGEST_SIZE + 4]; // fread(sha_parts + 3*SHA1_DIGEST_SIZE, 4, 1, fNDS); // some number // // //printf("%08X\n", *(unsigned int *)(sha_parts + 3*SHA1_DIGEST_SIZE)); // // unsigned char header_sha1[SHA1_DIGEST_SIZE]; // HeaderSha1(fNDS, header_sha1, romType); // memcpy(sha_parts + 0*SHA1_DIGEST_SIZE, header_sha1, SHA1_DIGEST_SIZE); // // unsigned char arm9_sha1[SHA1_DIGEST_SIZE]; // if (romType == ROMTYPE_MULTIBOOT) // { // Arm9Sha1Multiboot(fNDS, arm9_sha1); // } // else // { // Arm9Sha1ClearedOutArea(fNDS, arm9_sha1); // } // memcpy(sha_parts + 1*SHA1_DIGEST_SIZE, arm9_sha1, SHA1_DIGEST_SIZE); // // memcpy(sha_parts + 2*SHA1_DIGEST_SIZE, arm7_sha1, SHA1_DIGEST_SIZE); // // unsigned char sha_final[SHA1_DIGEST_SIZE]; // { // sha1_ctx m_sha1; // sha1_begin(&m_sha1); // unsigned int len = sizeof(sha_parts); // unsigned char *buf = sha_parts; // sha1_hash(buf, len, &m_sha1); // sha1_end(sha_final, &m_sha1); // } // // // calculate SHA1 from signature // unsigned char sha1_from_sig[SHA1_DIGEST_SIZE]; // { // BigInt _signature; // _signature.Set(signature, sizeof(signature)); // //printf("signature: "); _signature.print(); // // BigInt _publicKey; // _publicKey.Set(publicKeyNintendo, sizeof(publicKeyNintendo)); // //printf("public key: "); _publicKey.print(); // // BigInt big_sha1; // big_sha1.PowMod(_signature, _publicKey); // //printf("big_sha1: "); big_sha1.print(); // big_sha1.Get(sha1_from_sig, sizeof(sha1_from_sig)); // } // // bool ok = (memcmp(sha_final, sha1_from_sig, SHA1_DIGEST_SIZE) == 0); // printf("DS Download Play(TM) / Wireless MultiBoot signature: %s\n", ok ? "OK" : "INVALID"); // if (!ok) // { // printf("header hash: \t"); for (int i=0; i 0) // { // crc32 = CalcCrc32(buf, r, crc32); // } // crc32 = ~crc32; // delete [] buf; // // printf("\nFile CRC32: \t%08X\n", (unsigned int)crc32); // RomListInfo(crc32); // } // // // ROM dumper 1.0 bad data // { // unsigned char buf[0x200]; // fseek(fNDS, 0x7E00, SEEK_SET); // fread(buf, 1, 0x200, fNDS); // unsigned long crc32 = ~CalcCrc32(buf, 0x200); // printf("\nSMT dumper v1.0 corruption check: \t%s\n", (crc32 == 0x7E8B456F) ? "CORRUPTED" : "OK"); // } // // // Verify ARM7 SHA1 hash against known default binaries // int bKnownArm7 = 0; // { // printf("\nARM7 binary hash : \t"); for (int i=0; i= 0x04000000)) // { // printf("\nWARNING! ARM7 RAM address does not point to shared memory!\n"); // } // // // check ARM7 entry address // if ((header.arm7_entry_address < header.arm7_ram_address) || // (header.arm7_entry_address > header.arm7_ram_address + header.arm7_size)) // { // printf("\nWARNING! ARM7 entry address points outside of ARM7 binary!\n"); // } //} // ///* // * ShowInfo // */ //void ShowInfo(char *ndsfilename) //{ // fNDS = fopen(ndsfilename, "rb"); // if (!fNDS) { fprintf(stderr, "Cannot open file '%s'.\n", ndsfilename); exit(1); } // fread(&header, 512, 1, fNDS); // // int romType = DetectRomType(); // // printf("Header information:\n"); // ShowHeaderInfo(header, romType); // // // banner info // if (header.banner_offset) // { // Banner banner; // fseek(fNDS, header.banner_offset, SEEK_SET); // if (fread(&banner, 1, sizeof(banner), fNDS)) // { // unsigned short banner_crc = CalcBannerCRC(banner); // printf("\n"); // printf("Banner CRC: \t0x%04X (%s)\n", (int)banner.crc, (banner_crc == banner.crc) ? "OK" : "INVALID"); // // for (int language=1; language<=1; language++) // { // int line = 1; // bool nextline = true; // for (int i=0; i<128; i++) // { // unsigned short c = banner.title[language][i]; // if (c >= 128) c = '_'; // if (c == 0x00) { printf("\n"); break; } // if (c == 0x0A) // { // nextline = true; // } // else // { // if (nextline) // { // if (line != 1) printf("\n"); // printf("%s banner text, line %d:", bannerLanguages[language], line); // for (unsigned int i=0; i<11 - strlen(bannerLanguages[language]); i++) putchar(' '); // printf("\t"); // nextline = false; // line++; // } // putchar(c); // } // } // } // } // } // // // ARM9 footer // fseek(fNDS, header.arm9_rom_offset + header.arm9_size, SEEK_SET); // unsigned_int nitrocode; // if (fread(&nitrocode, sizeof(nitrocode), 1, fNDS) && (nitrocode == 0xDEC00621)) // { // printf("\n"); // printf("ARM9 footer found.\n"); // unsigned_int x; // fread(&x, sizeof(x), 1, fNDS); // fread(&x, sizeof(x), 1, fNDS); // } // // // show security CRCs // if (romType >= ROMTYPE_NDSDUMPED) // { // printf("\n"); // unsigned short securitydata_crc = CalcSecurityDataCRC(); // printf("Security data CRC (0x1000-0x2FFF) 0x%04X\n", (int)securitydata_crc); // unsigned short segment3_crc = CalcSegment3CRC(); // printf("Segment3 CRC (0x3000-0x3FFF) 0x%04X (%s)\n", (int)segment3_crc, (segment3_crc == 0x0254) ? "OK" : "INVALID"); // } // // // more information // if (verbose >= 1) // { // ShowVerboseInfo(fNDS, header, romType); // } // // fclose(fNDS); //} desmume-0.9.9/src/utils/decrypt/decrypt.cpp0000644000175000017500000006422612140261631021507 0ustar guillaumeguillaume//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/encryption.cpp?revision=1565 /* decrypt.cpp - this file is part of DeSmuME * * Copyright (C) 2006 Rafael Vuijk * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "../../types.h" #include "crc.h" #include "header.h" #include "decrypt.h" const unsigned char encr_data[] = { 0x99,0xD5,0x20,0x5F,0x57,0x44,0xF5,0xB9,0x6E,0x19,0xA4,0xD9,0x9E,0x6A,0x5A,0x94, 0xD8,0xAE,0xF1,0xEB,0x41,0x75,0xE2,0x3A,0x93,0x82,0xD0,0x32,0x33,0xEE,0x31,0xD5, 0xCC,0x57,0x61,0x9A,0x37,0x06,0xA2,0x1B,0x79,0x39,0x72,0xF5,0x55,0xAE,0xF6,0xBE, 0x5F,0x1B,0x69,0xFB,0xE5,0x9D,0xF1,0xE9,0xCE,0x2C,0xD9,0xA1,0x5E,0x32,0x05,0xE6, 0xFE,0xD3,0xFE,0xCF,0xD4,0x62,0x04,0x0D,0x8B,0xF5,0xEC,0xB7,0x2B,0x60,0x79,0xBB, 0x12,0x95,0x31,0x0D,0x6E,0x3F,0xDA,0x2B,0x88,0x84,0xF0,0xF1,0x3D,0x12,0x7E,0x25, 0x45,0x22,0xF1,0xBB,0x24,0x06,0x1A,0x06,0x11,0xAD,0xDF,0x28,0x8B,0x64,0x81,0x34, 0x2B,0xEB,0x33,0x29,0x99,0xAA,0xF2,0xBD,0x9C,0x14,0x95,0x9D,0x9F,0xF7,0xF5,0x8C, 0x72,0x97,0xA1,0x29,0x9D,0xD1,0x5F,0xCF,0x66,0x4D,0x07,0x1A,0xDE,0xD3,0x4A,0x4B, 0x85,0xC9,0xA7,0xA3,0x17,0x95,0x05,0x3A,0x3D,0x49,0x0A,0xBF,0x0A,0x89,0x8B,0xA2, 0x4A,0x82,0x49,0xDD,0x27,0x90,0xF1,0x0B,0xE9,0xEB,0x1C,0x6A,0x83,0x76,0x45,0x05, 0xBA,0x81,0x70,0x61,0x17,0x3F,0x4B,0xDE,0xAE,0xCF,0xAB,0x39,0x57,0xF2,0x3A,0x56, 0x48,0x11,0xAD,0x8A,0x40,0xE1,0x45,0x3F,0xFA,0x9B,0x02,0x54,0xCA,0xA6,0x93,0xFB, 0xEF,0x4D,0xFE,0x6F,0xA3,0xD8,0x87,0x9C,0x08,0xBA,0xD5,0x48,0x6A,0x8D,0x2D,0xFD, 0x6E,0x15,0xF8,0x74,0xBD,0xBE,0x52,0x8B,0x18,0x22,0x8A,0x9E,0xFB,0x74,0x37,0x07, 0x1B,0x36,0x6C,0x4A,0x19,0xBA,0x42,0x62,0xB9,0x79,0x91,0x10,0x7B,0x67,0x65,0x96, 0xFE,0x02,0x23,0xE8,0xEE,0x99,0x8C,0x77,0x3E,0x5C,0x86,0x64,0x4D,0x6D,0x78,0x86, 0xA5,0x4F,0x65,0xE2,0x1E,0xB2,0xDF,0x5A,0x0A,0xD0,0x7E,0x08,0x14,0xB0,0x71,0xAC, 0xBD,0xDB,0x83,0x1C,0xB9,0xD7,0xA1,0x62,0xCD,0xC6,0x63,0x7C,0x52,0x69,0xC3,0xE6, 0xBF,0x75,0xCE,0x12,0x44,0x5D,0x21,0x04,0xFA,0xFB,0xD3,0x3C,0x38,0x11,0x63,0xD4, 0x95,0x85,0x41,0x49,0x46,0x09,0xF2,0x08,0x43,0x11,0xDC,0x1F,0x76,0xC0,0x15,0x6D, 0x1F,0x3C,0x63,0x70,0xEA,0x87,0x80,0x6C,0xC3,0xBD,0x63,0x8B,0xC2,0x37,0x21,0x37, 0xDC,0xEE,0x09,0x23,0x2E,0x37,0x6A,0x4D,0x73,0x90,0xF7,0x50,0x30,0xAC,0x1C,0x92, 0x04,0x10,0x23,0x91,0x4F,0xD2,0x07,0xAA,0x68,0x3E,0x4F,0x9A,0xC9,0x64,0x60,0x6A, 0xC8,0x14,0x21,0xF3,0xD6,0x22,0x41,0x12,0x44,0x24,0xCF,0xE6,0x8A,0x56,0xDD,0x0D, 0x53,0x4D,0xE1,0x85,0x1E,0x8C,0x52,0x5A,0x9C,0x19,0x84,0xC2,0x03,0x57,0xF1,0x6F, 0xE3,0x00,0xBE,0x58,0xF6,0x4C,0xED,0xD5,0x21,0x64,0x9C,0x1F,0xBE,0x55,0x03,0x3C, 0x4A,0xDC,0xFF,0xAA,0xC9,0xDA,0xE0,0x5D,0x5E,0xBF,0xE6,0xDE,0xF5,0xD8,0xB1,0xF8, 0xFF,0x36,0xB3,0xB9,0x62,0x67,0x95,0xDB,0x31,0x5F,0x37,0xED,0x4C,0x70,0x67,0x99, 0x90,0xB5,0x18,0x31,0x6C,0x3D,0x99,0x99,0xE4,0x42,0xDA,0xD3,0x25,0x42,0x13,0xA0, 0xAE,0xD7,0x70,0x6C,0xB1,0x55,0xCF,0xC7,0xD7,0x46,0xD5,0x43,0x61,0x17,0x3D,0x44, 0x28,0xE9,0x33,0x85,0xD5,0xD0,0xA2,0x93,0xAA,0x25,0x12,0x1F,0xFB,0xC5,0x0B,0x46, 0xF5,0x97,0x76,0x56,0x45,0xA6,0xBE,0x87,0xB1,0x94,0x6B,0xE8,0xB1,0xFE,0x33,0x99, 0xAE,0x1F,0x3E,0x6C,0x39,0x71,0x1D,0x09,0x00,0x90,0x37,0xE4,0x10,0x3E,0x75,0x74, 0xFF,0x8C,0x83,0x3B,0xB0,0xF1,0xB0,0xF9,0x01,0x05,0x47,0x42,0x95,0xF1,0xD6,0xAC, 0x7E,0x38,0xE6,0x9E,0x95,0x74,0x26,0x3F,0xB4,0x68,0x50,0x18,0xD0,0x43,0x30,0xB4, 0x4C,0x4B,0xE3,0x68,0xBF,0xE5,0x4D,0xB6,0x95,0x8B,0x0A,0xA0,0x74,0x25,0x32,0x77, 0xCF,0xA1,0xF7,0x2C,0xD8,0x71,0x13,0x5A,0xAB,0xEA,0xC9,0x51,0xE8,0x0D,0xEE,0xEF, 0xE9,0x93,0x7E,0x19,0xA7,0x1E,0x43,0x38,0x81,0x16,0x2C,0xA1,0x48,0xE3,0x73,0xCC, 0x29,0x21,0x6C,0xD3,0x5D,0xCE,0xA0,0xD9,0x61,0x71,0x43,0xA0,0x15,0x13,0xB5,0x64, 0x92,0xCF,0x2A,0x19,0xDC,0xAD,0xB7,0xA5,0x9F,0x86,0x65,0xF8,0x1A,0x9F,0xE7,0xFB, 0xF7,0xFD,0xB8,0x13,0x6C,0x27,0xDB,0x6F,0xDF,0x35,0x1C,0xF7,0x8D,0x2C,0x5B,0x9B, 0x12,0xAB,0x38,0x64,0x06,0xCC,0xDE,0x31,0xE8,0x4E,0x75,0x11,0x64,0xE3,0xFA,0xEA, 0xEB,0x34,0x54,0xC2,0xAD,0x3F,0x34,0xEB,0x93,0x2C,0x7D,0x26,0x36,0x9D,0x56,0xF3, 0x5A,0xE1,0xF6,0xB3,0x98,0x63,0x4A,0x9E,0x32,0x83,0xE4,0x9A,0x84,0x60,0x7D,0x90, 0x2E,0x13,0x0E,0xEE,0x93,0x4B,0x36,0xA2,0x85,0xEC,0x16,0x38,0xE8,0x88,0x06,0x02, 0xBF,0xF0,0xA0,0x3A,0xED,0xD7,0x6A,0x9A,0x73,0xE1,0x57,0xCF,0xF8,0x44,0xB8,0xDC, 0x2E,0x23,0x59,0xD1,0xDF,0x95,0x52,0x71,0x99,0x61,0xA0,0x4B,0xD5,0x7F,0x6E,0x78, 0xBA,0xA9,0xC5,0x30,0xD3,0x40,0x86,0x32,0x9D,0x32,0x0C,0x9C,0x37,0xB7,0x02,0x2F, 0xBA,0x54,0x98,0xA9,0xC4,0x13,0x04,0xC9,0x8D,0xBE,0xC8,0xE7,0x5D,0x97,0x50,0x2E, 0x93,0xD6,0x22,0x59,0x0C,0x27,0xBC,0x22,0x92,0xE0,0xA7,0x20,0x0F,0x93,0x6F,0x7F, 0x4C,0x9F,0xD3,0xB5,0xA6,0x2A,0x0B,0x74,0x67,0x49,0x7D,0x10,0x26,0xCB,0xD1,0xC5, 0x86,0x71,0xE7,0x8C,0xA0,0x9C,0xE9,0x5B,0xB2,0x1A,0xF6,0x01,0xEE,0x8C,0x9E,0x5E, 0x83,0xF2,0x1A,0xDB,0xE6,0xE5,0xEA,0x84,0x59,0x76,0xD2,0x7C,0xF6,0x8D,0xA5,0x49, 0x36,0x48,0xC2,0x16,0x52,0xBB,0x83,0xA3,0x74,0xB9,0x07,0x0C,0x3B,0xFF,0x61,0x28, 0xE1,0x61,0xE9,0xE4,0xEF,0x6E,0x15,0xAA,0x4E,0xBA,0xE8,0x5D,0x05,0x96,0xBB,0x32, 0x56,0xB0,0xFB,0x72,0x52,0x0F,0x0E,0xC8,0x42,0x25,0x65,0x76,0x89,0xAF,0xF2,0xDE, 0x10,0x27,0xF0,0x01,0x4B,0x74,0xA7,0x97,0x07,0xD5,0x26,0x54,0x54,0x09,0x1F,0x82, 0x0A,0x86,0x7D,0x30,0x39,0x0E,0xB3,0x26,0x9B,0x0B,0x57,0xBB,0x36,0x06,0x31,0xAF, 0xFD,0x79,0xFC,0xD9,0x30,0x10,0x2B,0x0C,0xB3,0xE1,0x9B,0xD7,0x7B,0xDC,0x5F,0xEF, 0xD2,0xF8,0x13,0x45,0x4D,0x47,0x75,0xBD,0x46,0x96,0x3C,0x7E,0x75,0xF3,0x3E,0xB5, 0x67,0xC5,0x9A,0x3B,0xB0,0x5B,0x29,0x6B,0xDE,0x80,0x5B,0xC8,0x15,0x05,0xB1,0x31, 0xB6,0xCE,0x49,0xDD,0xAD,0x84,0xB5,0xAE,0x60,0xDC,0x67,0x31,0x34,0x30,0xFE,0x4E, 0xBD,0x80,0x2F,0xA6,0xBF,0x63,0x39,0x21,0x86,0xD9,0x35,0x7F,0x16,0x68,0x22,0x05, 0x54,0xE9,0x90,0x26,0x8C,0x07,0x6C,0x51,0xA4,0x31,0x55,0xD7,0x09,0x07,0xA8,0x3E, 0x2E,0x53,0x66,0xC1,0xF8,0xF2,0x7B,0xC4,0xF2,0x58,0xCF,0xF1,0x87,0xC5,0xA2,0xE7, 0x27,0x8F,0x30,0x87,0x58,0xA0,0x64,0x62,0x23,0x18,0xB9,0x88,0x7C,0xFA,0xCE,0xC4, 0x98,0xAE,0xAD,0x17,0xCC,0x4A,0x5B,0xF3,0xE9,0x48,0xD5,0x56,0xD3,0x0D,0xF2,0xC8, 0x92,0x73,0x8C,0xDB,0xD7,0x2F,0x56,0xAC,0x81,0xF9,0x92,0x69,0x4D,0xC6,0x32,0xF6, 0xE6,0xC0,0x8D,0x21,0xE2,0x76,0x80,0x61,0x11,0xBC,0xDC,0x6C,0x93,0xAF,0x19,0x69, 0x9B,0xD0,0xBF,0xB9,0x31,0x9F,0x02,0x67,0xA3,0x51,0xEE,0x83,0x06,0x22,0x7B,0x0C, 0xAB,0x49,0x42,0x40,0xB8,0xD5,0x01,0x7D,0xCE,0x5E,0xF7,0x55,0x53,0x39,0xC5,0x99, 0x46,0xD8,0x87,0x9F,0xBA,0xF7,0x64,0xB4,0xE3,0x9A,0xFA,0xA1,0x6D,0x90,0x68,0x10, 0x30,0xCA,0x8A,0x54,0xA7,0x9F,0x60,0xC3,0x19,0xF5,0x6B,0x0D,0x7A,0x51,0x98,0xE6, 0x98,0x43,0x51,0xB4,0xD6,0x35,0xE9,0x4F,0xC3,0xDF,0x0F,0x7B,0xD6,0x2F,0x5C,0xBD, 0x3A,0x15,0x61,0x19,0xF1,0x4B,0xCB,0xAA,0xDC,0x6D,0x64,0xC9,0xD3,0xC6,0x1E,0x56, 0xEF,0x38,0x4C,0x50,0x71,0x86,0x75,0xCC,0x0D,0x0D,0x4E,0xE9,0x28,0xF6,0x06,0x5D, 0x70,0x1B,0xAA,0xD3,0x45,0xCF,0xA8,0x39,0xAC,0x95,0xA6,0x2E,0xB4,0xE4,0x22,0xD4, 0x74,0xA8,0x37,0x5F,0x48,0x7A,0x04,0xCC,0xA5,0x4C,0x40,0xD8,0x28,0xB4,0x28,0x08, 0x0D,0x1C,0x72,0x52,0x41,0xF0,0x7D,0x47,0x19,0x3A,0x53,0x4E,0x58,0x84,0x62,0x6B, 0x93,0xB5,0x8A,0x81,0x21,0x4E,0x0D,0xDC,0xB4,0x3F,0xA2,0xC6,0xFC,0xC9,0x2B,0x40, 0xDA,0x38,0x04,0xE9,0x5E,0x5A,0x86,0x6B,0x0C,0x22,0x25,0x85,0x68,0x11,0x8D,0x7C, 0x92,0x1D,0x95,0x55,0x4D,0xAB,0x8E,0xBB,0xDA,0xA6,0xE6,0xB7,0x51,0xB6,0x32,0x5A, 0x05,0x41,0xDD,0x05,0x2A,0x0A,0x56,0x50,0x91,0x17,0x47,0xCC,0xC9,0xE6,0x7E,0xB5, 0x61,0x4A,0xDB,0x73,0x67,0x51,0xC8,0x33,0xF5,0xDA,0x6E,0x74,0x2E,0x54,0xC3,0x37, 0x0D,0x6D,0xAF,0x08,0xE8,0x15,0x8A,0x5F,0xE2,0x59,0x21,0xCD,0xA8,0xDE,0x0C,0x06, 0x5A,0x77,0x6B,0x5F,0xDB,0x18,0x65,0x3E,0xC8,0x50,0xDE,0x78,0xE0,0xB8,0x82,0xB3, 0x5D,0x4E,0x72,0x32,0x07,0x4F,0xC1,0x34,0x23,0xBA,0x96,0xB7,0x67,0x4E,0xA4,0x28, 0x1E,0x34,0x62,0xEB,0x2D,0x6A,0x70,0xE9,0x2F,0x42,0xC4,0x70,0x4E,0x5A,0x31,0x9C, 0xF9,0x5B,0x47,0x28,0xAA,0xDA,0x71,0x6F,0x38,0x1F,0xB3,0x78,0xC4,0x92,0x6B,0x1C, 0x9E,0xF6,0x35,0x9A,0xB7,0x4D,0x0E,0xBF,0xCC,0x18,0x29,0x41,0x03,0x48,0x35,0x5D, 0x55,0xD0,0x2B,0xC6,0x29,0xAF,0x5C,0x60,0x74,0x69,0x8E,0x5E,0x9B,0x7C,0xD4,0xBD, 0x7B,0x44,0x64,0x7D,0x3F,0x92,0x5D,0x69,0xB6,0x1F,0x00,0x4B,0xD4,0x83,0x35,0xCF, 0x7E,0x64,0x4E,0x17,0xAE,0x8D,0xD5,0x2E,0x9A,0x28,0x12,0x4E,0x2E,0x2B,0x49,0x08, 0x5C,0xAE,0xC6,0x46,0x85,0xAE,0x41,0x61,0x1E,0x6F,0x82,0xD2,0x51,0x37,0x16,0x1F, 0x0B,0xF6,0x59,0xA4,0x9A,0xCA,0x5A,0xAF,0x0D,0xD4,0x33,0x8B,0x20,0x63,0xF1,0x84, 0x80,0x5C,0xCB,0xCF,0x08,0xB4,0xB9,0xD3,0x16,0x05,0xBD,0x62,0x83,0x31,0x9B,0x56, 0x51,0x98,0x9F,0xBA,0xB2,0x5B,0xAA,0xB2,0x22,0x6B,0x2C,0xB5,0xD4,0x48,0xFA,0x63, 0x2B,0x5F,0x58,0xFA,0x61,0xFA,0x64,0x09,0xBB,0x38,0xE0,0xB8,0x9D,0x92,0x60,0xA8, 0x0D,0x67,0x6F,0x0E,0x37,0xF5,0x0D,0x01,0x9F,0xC2,0x77,0xD4,0xFE,0xEC,0xF1,0x73, 0x30,0x39,0xE0,0x7D,0xF5,0x61,0x98,0xE4,0x2C,0x28,0x55,0x04,0x56,0x55,0xDB,0x2F, 0x6B,0xEC,0xE5,0x58,0x06,0xB6,0x64,0x80,0x6A,0x2A,0x1A,0x4E,0x5B,0x0F,0xD8,0xC4, 0x0A,0x2E,0x52,0x19,0xD9,0x62,0xF5,0x30,0x48,0xBE,0x8C,0x7B,0x4F,0x38,0x9B,0xA2, 0xC3,0xAF,0xC9,0xD3,0xC7,0xC1,0x62,0x41,0x86,0xB9,0x61,0x21,0x57,0x6F,0x99,0x4F, 0xC1,0xBA,0xCE,0x7B,0xB5,0x3B,0x4D,0x5E,0x8A,0x8B,0x44,0x57,0x5F,0x13,0x5F,0x70, 0x6D,0x5B,0x29,0x47,0xDC,0x38,0xE2,0xEC,0x04,0x55,0x65,0x12,0x2A,0xE8,0x17,0x43, 0xE1,0x8E,0xDD,0x2A,0xB3,0xE2,0x94,0xF7,0x09,0x6E,0x5C,0xE6,0xEB,0x8A,0xF8,0x6D, 0x89,0x49,0x54,0x48,0xF5,0x2F,0xAD,0xBF,0xEA,0x94,0x4B,0xCA,0xFC,0x39,0x87,0x82, 0x5F,0x8A,0x01,0xF2,0x75,0xF2,0xE6,0x71,0xD6,0xD8,0x42,0xDE,0xF1,0x2D,0x1D,0x28, 0xA6,0x88,0x7E,0xA3,0xA0,0x47,0x1D,0x30,0xD9,0xA3,0x71,0xDF,0x49,0x1C,0xCB,0x01, 0xF8,0x36,0xB1,0xF2,0xF0,0x22,0x58,0x5D,0x45,0x6B,0xBD,0xA0,0xBB,0xB2,0x88,0x42, 0xC7,0x8C,0x28,0xCE,0x93,0xE8,0x90,0x63,0x08,0x90,0x7C,0x89,0x3C,0xF5,0x7D,0xB7, 0x04,0x2D,0x4F,0x55,0x51,0x16,0xFD,0x7E,0x79,0xE8,0xBE,0xC1,0xF2,0x12,0xD4,0xF8, 0xB4,0x84,0x05,0x23,0xA0,0xCC,0xD2,0x2B,0xFD,0xE1,0xAB,0xAD,0x0D,0xD1,0x55,0x6C, 0x23,0x41,0x94,0x4D,0x77,0x37,0x4F,0x05,0x28,0x0C,0xBF,0x17,0xB3,0x12,0x67,0x6C, 0x8C,0xC3,0x5A,0xF7,0x41,0x84,0x2A,0x6D,0xD0,0x94,0x12,0x27,0x2C,0xB4,0xED,0x9C, 0x4D,0xEC,0x47,0x82,0x97,0xD5,0x67,0xB9,0x1B,0x9D,0xC0,0x55,0x07,0x7E,0xE5,0x8E, 0xE2,0xA8,0xE7,0x3E,0x12,0xE4,0x0E,0x3A,0x2A,0x45,0x55,0x34,0xA2,0xF9,0x2D,0x5A, 0x1B,0xAB,0x52,0x7C,0x83,0x10,0x5F,0x55,0xD2,0xF1,0x5A,0x43,0x2B,0xC6,0xA7,0xA4, 0x89,0x15,0x95,0xE8,0xB4,0x4B,0x9D,0xF8,0x75,0xE3,0x9F,0x60,0x78,0x5B,0xD6,0xE6, 0x0D,0x44,0xE6,0x21,0x06,0xBD,0x47,0x22,0x53,0xA4,0x00,0xAD,0x8D,0x43,0x13,0x85, 0x39,0xF7,0xAA,0xFC,0x38,0xAF,0x7B,0xED,0xFC,0xE4,0x2B,0x54,0x50,0x98,0x4C,0xFC, 0x85,0x80,0xF7,0xDF,0x3C,0x80,0x22,0xE1,0x94,0xDA,0xDE,0x24,0xC6,0xB0,0x7A,0x39, 0x38,0xDC,0x0F,0xA1,0xA7,0xF4,0xF9,0x6F,0x63,0x18,0x57,0x8B,0x84,0x41,0x2A,0x2E, 0xD4,0x53,0xF2,0xD9,0x00,0x0F,0xD0,0xDD,0x99,0x6E,0x19,0xA6,0x0A,0xD0,0xEC,0x5B, 0x58,0x24,0xAB,0xC0,0xCB,0x06,0x65,0xEC,0x1A,0x13,0x38,0x94,0x0A,0x67,0x03,0x2F, 0x3F,0xF7,0xE3,0x77,0x44,0x77,0x33,0xC6,0x14,0x39,0xD0,0xE3,0xC0,0xA2,0x08,0x79, 0xBB,0x40,0x99,0x57,0x41,0x0B,0x01,0x90,0xCD,0xE1,0xCC,0x48,0x67,0xDB,0xB3,0xAF, 0x88,0x74,0xF3,0x4C,0x82,0x8F,0x72,0xB1,0xB5,0x23,0x29,0xC4,0x12,0x6C,0x19,0xFC, 0x8E,0x46,0xA4,0x9C,0xC4,0x25,0x65,0x87,0xD3,0x6D,0xBE,0x8A,0x93,0x11,0x03,0x38, 0xED,0x83,0x2B,0xF3,0x46,0xA4,0x93,0xEA,0x3B,0x53,0x85,0x1D,0xCE,0xD4,0xF1,0x08, 0x83,0x27,0xED,0xFC,0x9B,0x1A,0x18,0xBC,0xF9,0x8B,0xAE,0xDC,0x24,0xAB,0x50,0x38, 0xE9,0x72,0x4B,0x10,0x22,0x17,0x7B,0x46,0x5D,0xAB,0x59,0x64,0xF3,0x40,0xAE,0xF8, 0xBB,0xE5,0xC8,0xF9,0x26,0x03,0x4E,0x55,0x7D,0xEB,0xEB,0xFE,0xF7,0x39,0xE6,0xE0, 0x0A,0x11,0xBE,0x2E,0x28,0xFF,0x98,0xED,0xC0,0xC9,0x42,0x56,0x42,0xC3,0xFD,0x00, 0xF6,0xAF,0x87,0xA2,0x5B,0x01,0x3F,0x32,0x92,0x47,0x95,0x9A,0x72,0xA5,0x32,0x3D, 0xAE,0x6B,0xD0,0x9B,0x07,0xD2,0x49,0x92,0xE3,0x78,0x4A,0xFA,0xA1,0x06,0x7D,0xF2, 0x41,0xCF,0x77,0x74,0x04,0x14,0xB2,0x0C,0x86,0x84,0x64,0x16,0xD5,0xBB,0x51,0xA1, 0xE5,0x6F,0xF1,0xD1,0xF2,0xE2,0xF7,0x5F,0x58,0x20,0x4D,0xB8,0x57,0xC7,0xCF,0xDD, 0xC5,0xD8,0xBE,0x76,0x3D,0xF6,0x5F,0x7E,0xE7,0x2A,0x8B,0x88,0x24,0x1B,0x38,0x3F, 0x0E,0x41,0x23,0x77,0xF5,0xF0,0x4B,0xD4,0x0C,0x1F,0xFA,0xA4,0x0B,0x80,0x5F,0xCF, 0x45,0xF6,0xE0,0xDA,0x2F,0x34,0x59,0x53,0xFB,0x20,0x3C,0x52,0x62,0x5E,0x35,0xB5, 0x62,0xFE,0x8B,0x60,0x63,0xE3,0x86,0x5A,0x15,0x1A,0x6E,0xD1,0x47,0x45,0xBC,0x32, 0xB4,0xEB,0x67,0x38,0xAB,0xE4,0x6E,0x33,0x3A,0xB5,0xED,0xA3,0xAD,0x67,0xE0,0x4E, 0x41,0x95,0xEE,0x62,0x62,0x71,0x26,0x1D,0x31,0xEF,0x62,0x30,0xAF,0xD7,0x82,0xAC, 0xC2,0xDC,0x05,0x04,0xF5,0x97,0x07,0xBF,0x11,0x59,0x23,0x07,0xC0,0x64,0x02,0xE8, 0x97,0xE5,0x3E,0xAF,0x18,0xAC,0x59,0xA6,0x8B,0x4A,0x33,0x90,0x1C,0x6E,0x7C,0x9C, 0x20,0x7E,0x4C,0x3C,0x3E,0x61,0x64,0xBB,0xC5,0x6B,0x7C,0x7E,0x3E,0x9F,0xC5,0x4C, 0x9F,0xEA,0x73,0xF5,0xD7,0x89,0xC0,0x4C,0xF4,0xFB,0xF4,0x2D,0xEC,0x14,0x1B,0x51, 0xD5,0xC1,0x12,0xC8,0x10,0xDF,0x0B,0x4A,0x8B,0x9C,0xBC,0x93,0x45,0x6A,0x3E,0x3E, 0x7D,0xC1,0xA9,0xBA,0xCD,0xC1,0xB4,0x07,0xE4,0xE1,0x68,0x86,0x43,0xB2,0x6D,0x38, 0xF3,0xFB,0x0C,0x5C,0x66,0x37,0x71,0xDE,0x56,0xEF,0x6E,0xA0,0x10,0x40,0x65,0xA7, 0x98,0xF7,0xD0,0xBE,0x0E,0xC8,0x37,0x36,0xEC,0x10,0xCA,0x7C,0x9C,0xAB,0x84,0x1E, 0x05,0x17,0x76,0x02,0x1C,0x4F,0x52,0xAA,0x5F,0xC1,0xC6,0xA0,0x56,0xB9,0xD8,0x04, 0x84,0x44,0x4D,0xA7,0x59,0xD8,0xDE,0x60,0xE6,0x38,0x0E,0x05,0x8F,0x03,0xE1,0x3B, 0x6D,0x81,0x04,0x33,0x6F,0x30,0x0B,0xCE,0x69,0x05,0x21,0x33,0xFB,0x26,0xBB,0x89, 0x7D,0xB6,0xAE,0x87,0x7E,0x51,0x07,0xE0,0xAC,0xF7,0x96,0x0A,0x6B,0xF9,0xC4,0x5C, 0x1D,0xE4,0x44,0x47,0xB8,0x5E,0xFA,0xE3,0x78,0x84,0x55,0x42,0x4B,0x48,0x5E,0xF7, 0x7D,0x47,0x35,0x86,0x1D,0x2B,0x43,0x05,0x03,0xEC,0x8A,0xB8,0x1E,0x06,0x3C,0x76, 0x0C,0x48,0x1A,0x43,0xA7,0xB7,0x8A,0xED,0x1E,0x13,0xC6,0x43,0xEE,0x10,0xEF,0xDB, 0xEC,0xFB,0x3C,0x83,0xB2,0x95,0x44,0xEF,0xD8,0x54,0x51,0x4E,0x2D,0x11,0x44,0x1D, 0xFB,0x36,0x59,0x1E,0x7A,0x34,0xC1,0xC3,0xCA,0x57,0x00,0x61,0xEA,0x67,0xA5,0x16, 0x9B,0x55,0xD0,0x55,0xE1,0x7F,0xD9,0x36,0xD2,0x40,0x76,0xAE,0xDC,0x01,0xCE,0xB0, 0x7A,0x83,0xD5,0xCB,0x20,0x98,0xEC,0x6B,0xC1,0x72,0x92,0x34,0xF3,0x82,0x57,0x37, 0x62,0x8A,0x32,0x36,0x0C,0x90,0x43,0xAE,0xAE,0x5C,0x9B,0x78,0x8E,0x13,0x65,0x02, 0xFD,0x68,0x71,0xC1,0xFE,0xB0,0x31,0xA0,0x24,0x82,0xB0,0xC3,0xB1,0x79,0x69,0xA7, 0xF5,0xD2,0xEB,0xD0,0x82,0xC0,0x32,0xDC,0x9E,0xC7,0x26,0x3C,0x6D,0x8D,0x98,0xC1, 0xBB,0x22,0xD4,0xD0,0x0F,0x33,0xEC,0x3E,0xB9,0xCC,0xE1,0xDC,0x6A,0x4C,0x77,0x36, 0x14,0x1C,0xF9,0xBF,0x81,0x9F,0x28,0x5F,0x71,0x85,0x32,0x29,0x90,0x75,0x48,0xC4, 0xB3,0x4A,0xCE,0xD8,0x44,0x8F,0x14,0x2F,0xFD,0x40,0x57,0xEF,0xAA,0x08,0x75,0xD9, 0x46,0xD1,0xD6,0x6E,0x32,0x55,0x1F,0xC3,0x18,0xFE,0x84,0x1F,0xFC,0x84,0xD5,0xFF, 0x71,0x5E,0x1B,0x48,0xC3,0x86,0x95,0x0E,0x28,0x08,0x27,0xD3,0x38,0x83,0x71,0x7B, 0x4C,0x80,0x63,0x54,0x9A,0x56,0xB0,0xAC,0xCF,0x80,0xCA,0x31,0x09,0xEF,0xFE,0xF3, 0xBE,0xAF,0x24,0x7E,0xA6,0xFE,0x53,0x3F,0xC2,0x8D,0x4A,0x33,0x68,0xD1,0x22,0xA6, 0x66,0xAD,0x7B,0xEA,0xDE,0xB6,0x43,0xB0,0xA1,0x25,0x95,0x00,0xA3,0x3F,0x75,0x46, 0x14,0x11,0x44,0xEC,0xD7,0x95,0xBC,0x92,0xF0,0x4F,0xA9,0x16,0x53,0x62,0x97,0x60, 0x2A,0x0F,0x41,0xF1,0x71,0x24,0xBE,0xEE,0x94,0x7F,0x08,0xCD,0x60,0x93,0xB3,0x85, 0x5B,0x07,0x00,0x3F,0xD8,0x0F,0x28,0x83,0x9A,0xD1,0x69,0x9F,0xD1,0xDA,0x2E,0xC3, 0x90,0x01,0xA2,0xB9,0x6B,0x4E,0x2A,0x66,0x9D,0xDA,0xAE,0xA6,0xEA,0x2A,0xD3,0x68, 0x2F,0x0C,0x0C,0x9C,0xD2,0x8C,0x4A,0xED,0xE2,0x9E,0x57,0x65,0x9D,0x09,0x87,0xA3, 0xB4,0xC4,0x32,0x5D,0xC9,0xD4,0x32,0x2B,0xB1,0xE0,0x71,0x1E,0x64,0x4D,0xE6,0x90, 0x71,0xE3,0x1E,0x40,0xED,0x7D,0xF3,0x84,0x0E,0xED,0xC8,0x78,0x76,0xAE,0xC0,0x71, 0x27,0x72,0xBB,0x05,0xEA,0x02,0x64,0xFB,0xF3,0x48,0x6B,0xB5,0x42,0x93,0x3F,0xED, 0x9F,0x13,0x53,0xD2,0xF7,0xFE,0x2A,0xEC,0x1D,0x47,0x25,0xDB,0x3C,0x91,0x86,0xC6, 0x8E,0xF0,0x11,0xFD,0x23,0x74,0x36,0xF7,0xA4,0xF5,0x9E,0x7A,0x7E,0x53,0x50,0x44, 0xD4,0x47,0xCA,0xD3,0xEB,0x38,0x6D,0xE6,0xD9,0x71,0x94,0x7F,0x4A,0xC6,0x69,0x4B, 0x11,0xF4,0x52,0xEA,0x22,0xFE,0x8A,0xB0,0x36,0x67,0x8B,0x59,0xE8,0xE6,0x80,0x2A, 0xEB,0x65,0x04,0x13,0xEE,0xEC,0xDC,0x9E,0x5F,0xB1,0xEC,0x05,0x6A,0x59,0xE6,0x9F, 0x5E,0x59,0x6B,0x89,0xBF,0xF7,0x1A,0xCA,0x44,0xF9,0x5B,0x6A,0x71,0x85,0x03,0xE4, 0x29,0x62,0xE0,0x70,0x6F,0x41,0xC4,0xCF,0xB2,0xB1,0xCC,0xE3,0x7E,0xA6,0x07,0xA8, 0x87,0xE7,0x7F,0x84,0x93,0xDB,0x52,0x4B,0x6C,0xEC,0x7E,0xDD,0xD4,0x24,0x48,0x10, 0x69,0x9F,0x04,0x60,0x74,0xE6,0x48,0x18,0xF3,0xE4,0x2C,0xB9,0x4F,0x2E,0x50,0x7A, 0xDF,0xD4,0x54,0x69,0x2B,0x8B,0xA7,0xF3,0xCE,0xFF,0x1F,0xF3,0x3E,0x26,0x01,0x39, 0x17,0x95,0x84,0x89,0xB0,0xF0,0x4C,0x4B,0x82,0x91,0x9F,0xC4,0x4B,0xAC,0x9D,0xA5, 0x74,0xAF,0x17,0x25,0xC9,0xCA,0x32,0xD3,0xBC,0x89,0x8A,0x84,0x89,0xCC,0x0D,0xAE, 0x7C,0xA2,0xDB,0x9C,0x6A,0x78,0x91,0xEE,0xEA,0x76,0x5D,0x4E,0x87,0x60,0xF5,0x69, 0x15,0x67,0xD4,0x02,0xCF,0xAF,0x48,0x36,0x07,0xEA,0xBF,0x6F,0x66,0x2D,0x06,0x8F, 0xC4,0x9A,0xFE,0xF9,0xF6,0x90,0x87,0x75,0xB8,0xF7,0xAD,0x0F,0x76,0x10,0x5A,0x3D, 0x59,0xB0,0x2E,0xB3,0xC7,0x35,0x2C,0xCC,0x70,0x56,0x2B,0xCB,0xE3,0x37,0x96,0xC5, 0x2F,0x46,0x1B,0x8A,0x22,0x46,0xC7,0x88,0xA7,0x26,0x32,0x98,0x61,0xDF,0x86,0x22, 0x8A,0xF4,0x1C,0x2F,0x87,0xA1,0x09,0xAA,0xCC,0xA9,0xAE,0xD3,0xBD,0x00,0x45,0x1C, 0x9A,0x54,0x87,0x86,0x52,0x87,0xEF,0xFF,0x1E,0x8F,0xA1,0x8F,0xC1,0x89,0x5C,0x35, 0x1B,0xDA,0x2D,0x3A,0x2C,0x16,0xB2,0xC2,0xF1,0x56,0xE2,0x78,0xC1,0x6B,0x63,0x97, 0xC5,0x56,0x8F,0xC9,0x32,0x7F,0x2C,0xAA,0xAF,0xA6,0xA8,0xAC,0x20,0x91,0x22,0x88, 0xDE,0xE4,0x60,0x8B,0xF9,0x4B,0x42,0x25,0x1A,0xE3,0x7F,0x9C,0x2C,0x19,0x89,0x3A, 0x7E,0x05,0xD4,0x36,0xCC,0x69,0x58,0xC2,0xC1,0x32,0x8B,0x2F,0x90,0x85,0xEB,0x7A, 0x39,0x50,0xA5,0xA1,0x27,0x92,0xC5,0x66,0xB0,0x20,0x4F,0x58,0x7E,0x55,0x83,0x43, 0x2B,0x45,0xE2,0x9C,0xE4,0xD8,0x12,0x90,0x2C,0x16,0x83,0x56,0x16,0x79,0x03,0xB3, 0xAD,0x2D,0x61,0x18,0x1A,0x13,0x1F,0x37,0xE2,0xE1,0x9C,0x73,0x7B,0x80,0xD5,0xFD, 0x2D,0x51,0x87,0xFC,0x7B,0xAA,0xD7,0x1F,0x2C,0x7A,0x8E,0xAF,0xF4,0x8D,0xBB,0xCD, 0x95,0x11,0x7C,0x72,0x0B,0xEE,0x6F,0xE2,0xB9,0xAF,0xDE,0x37,0x83,0xDE,0x8C,0x8D, 0x62,0x05,0x67,0xB7,0x96,0xC6,0x8D,0x56,0xB6,0x0D,0xD7,0x62,0xBA,0xD6,0x46,0x36, 0xBD,0x8E,0xC8,0xE6,0xEA,0x2A,0x6C,0x10,0x14,0xFF,0x6B,0x5B,0xFA,0x82,0x3C,0x46, 0xB1,0x30,0x43,0x46,0x51,0x8A,0x7D,0x9B,0x92,0x3E,0x83,0x79,0x5B,0x55,0x5D,0xB2, 0x6C,0x5E,0xCE,0x90,0x62,0x8E,0x53,0x98,0xC9,0x0D,0x6D,0xE5,0x2D,0x57,0xCD,0xC5, 0x81,0x57,0xBA,0xE1,0xE8,0xB8,0x8F,0x72,0xE5,0x4F,0x13,0xDC,0xEA,0x9D,0x71,0x15, 0x10,0xB2,0x11,0x88,0xD5,0x09,0xD4,0x7F,0x5B,0x65,0x7F,0x2C,0x3B,0x38,0x4C,0x11, 0x68,0x50,0x8D,0xFB,0x9E,0xB0,0x59,0xBF,0x94,0x80,0x89,0x4A,0xC5,0x1A,0x18,0x12, 0x89,0x53,0xD1,0x4A,0x10,0x29,0xE8,0x8C,0x1C,0xEC,0xB6,0xEA,0x46,0xC7,0x17,0x8B, 0x25,0x15,0x31,0xA8,0xA2,0x6B,0x43,0xB1,0x9D,0xE2,0xDB,0x0B,0x87,0x9B,0xB0,0x11, 0x04,0x0E,0x71,0xD2,0x29,0x77,0x89,0x82,0x0A,0x66,0x41,0x7F,0x1D,0x0B,0x48,0xFF, 0x72,0xBB,0x24,0xFD,0xC2,0x48,0xA1,0x9B,0xFE,0x7B,0x7F,0xCE,0x88,0xDB,0x86,0xD9, 0x85,0x3B,0x1C,0xB0,0xDC,0xA8,0x33,0x07,0xBF,0x51,0x2E,0xE3,0x0E,0x9A,0x00,0x97, 0x1E,0x06,0xC0,0x97,0x43,0x9D,0xD8,0xB6,0x45,0xC4,0x86,0x67,0x5F,0x00,0xF8,0x88, 0x9A,0xA4,0x52,0x9E,0xC7,0xAA,0x8A,0x83,0x75,0xEC,0xC5,0x18,0xAE,0xCE,0xC3,0x2F, 0x1A,0x2B,0xF9,0x18,0xFF,0xAE,0x1A,0xF5,0x53,0x0B,0xB5,0x33,0x51,0xA7,0xFD,0xE8, 0xA8,0xE1,0xA2,0x64,0xB6,0x22,0x17,0x43,0x80,0xCC,0x0A,0xD8,0xAE,0x3B,0xBA,0x40, 0xD7,0xD9,0x92,0x4A,0x89,0xDF,0x04,0x10,0xEE,0x9B,0x18,0x2B,0x6A,0x77,0x69,0x8A, 0x68,0xF4,0xF9,0xB9,0xA2,0x21,0x15,0x6E,0xE6,0x1E,0x3B,0x03,0x62,0x30,0x9B,0x60, 0x41,0x7E,0x25,0x9B,0x9E,0x8F,0xC5,0x52,0x10,0x08,0xF8,0xC2,0x69,0xA1,0x21,0x11, 0x88,0x37,0x5E,0x79,0x35,0x66,0xFF,0x10,0x42,0x18,0x6E,0xED,0x97,0xB6,0x6B,0x1C, 0x4E,0x36,0xE5,0x6D,0x7D,0xB4,0xE4,0xBF,0x20,0xB9,0xE0,0x05,0x3A,0x69,0xD5,0xB8, 0xE3,0xD5,0xDC,0xE0,0xB9,0xAC,0x53,0x3E,0x07,0xA4,0x57,0xAD,0x77,0xFF,0x48,0x18, 0x76,0x2A,0xAC,0x49,0x2A,0x8E,0x47,0x75,0x6D,0x9F,0x67,0x63,0x30,0x35,0x8C,0x39, 0x05,0x39,0xD5,0x6F,0x64,0x3A,0x5B,0xAD,0xCA,0x0B,0xBB,0x82,0x52,0x99,0x45,0xB1, 0x93,0x36,0x36,0x99,0xAF,0x13,0x20,0x44,0x36,0xD8,0x02,0x44,0x09,0x39,0x92,0x85, 0xFF,0x4A,0x4A,0x97,0x87,0xA6,0x63,0xD7,0xC7,0xB5,0xB5,0x24,0xED,0x0F,0xB4,0x6F, 0x0C,0x58,0x52,0x14,0xD9,0xA6,0x7B,0xD3,0x79,0xBC,0x38,0x58,0xA1,0xBD,0x3B,0x84, 0x06,0xD8,0x1A,0x06,0xFD,0x6B,0xA8,0xEA,0x4B,0x69,0x28,0x04,0x37,0xAD,0x82,0x99, 0xFB,0x0E,0x1B,0x85,0xBD,0xA8,0x5D,0x73,0xCD,0xDC,0x58,0x75,0x0A,0xBE,0x63,0x6C, 0x48,0xE7,0x4C,0xE4,0x30,0x2B,0x04,0x60,0xB9,0x15,0xD8,0xDA,0x86,0x81,0x75,0x8F, 0x96,0xD4,0x8D,0x1C,0x5D,0x70,0x85,0x7C,0x1C,0x67,0x7B,0xD5,0x08,0x67,0xA6,0xCE, 0x4B,0x0A,0x66,0x70,0xB7,0xE5,0x63,0xD4,0x5B,0x8A,0x82,0xEA,0x10,0x67,0xCA,0xE2, 0xF4,0xEF,0x17,0x85,0x2F,0x2A,0x5F,0x8A,0x97,0x82,0xF8,0x6A,0xD6,0x34,0x10,0xEA, 0xEB,0xC9,0x5C,0x3C,0xE1,0x49,0xF8,0x46,0xEB,0xDE,0xBD,0xF6,0xA9,0x92,0xF1,0xAA, 0xA6,0xA0,0x18,0xB0,0x3A,0xD3,0x0F,0x1F,0xF3,0x6F,0xFF,0x31,0x45,0x43,0x44,0xD3, 0x50,0x9A,0xF7,0x88,0x09,0x96,0xC1,0xCE,0x76,0xCC,0xF2,0x2C,0x2C,0xBA,0xAD,0x82, 0x77,0x8F,0x18,0x84,0xC0,0xD2,0x07,0x9C,0x36,0x90,0x83,0x4E,0x0B,0xA5,0x4F,0x43, 0x3E,0x04,0xAB,0x78,0x4F,0xD6,0xFB,0x09,0x01,0x24,0x90,0xDA,0x6F,0x3C,0x3A,0x61, 0x0D,0x7F,0x69,0x4A,0xEB,0x2B,0x30,0x02,0xB4,0xDB,0xE0,0x84,0xA9,0xEC,0xD7,0x35, 0xBF,0x37,0x7D,0x85,0x58,0xCE,0xA9,0x4E,0xE4,0x80,0xC7,0xA8,0xD3,0x30,0x67,0x48, 0xEB,0x29,0xAF,0x2F,0x74,0x6A,0xB4,0xA7,0x3F,0x0F,0x3F,0x92,0xAF,0xF3,0xCA,0xAC, 0xAF,0x4B,0xD9,0x94,0xC0,0x43,0xCA,0x81,0x0D,0x2F,0x48,0xA1,0xB0,0x27,0xD5,0xD2, 0xEF,0x4B,0x05,0x85,0xA3,0xDE,0x4D,0x93,0x30,0x3C,0xF0,0xBB,0x4A,0x8F,0x30,0x27, 0x4C,0xEB,0xE3,0x3E,0x64,0xED,0x9A,0x2F,0x3B,0xF1,0x82,0xF0,0xBA,0xF4,0xCF,0x7F, 0x40,0xCB,0xB0,0xE1,0x7F,0xBC,0xAA,0x57,0xD3,0xC9,0x74,0xF2,0xFA,0x43,0x0D,0x22, 0xD0,0xF4,0x77,0x4E,0x93,0xD7,0x85,0x70,0x1F,0x99,0xBF,0xB6,0xDE,0x35,0xF1,0x30, 0xA7,0x5E,0x71,0xF0,0x6B,0x01,0x2D,0x7B,0x64,0xF0,0x33,0x53,0x0A,0x39,0x88,0xF3, 0x6B,0x3A,0xA6,0x6B,0x35,0xD2,0x2F,0x43,0xCD,0x02,0xFD,0xB5,0xE9,0xBC,0x5B,0xAA, 0xD8,0xA4,0x19,0x7E,0x0E,0x5D,0x94,0x81,0x9E,0x6F,0x77,0xAD,0xD6,0x0E,0x74,0x93, 0x96,0xE7,0xC4,0x18,0x5F,0xAD,0xF5,0x19, }; u32 card_hash[0x412]; int cardheader_devicetype = 0; u32 global3_x00, global3_x04; // RTC value u32 global3_rand1; u32 global3_rand3; static u32 lookup(u32 *magic, u32 v) { u32 a = (v >> 24) & 0xFF; u32 b = (v >> 16) & 0xFF; u32 c = (v >> 8) & 0xFF; u32 d = (v >> 0) & 0xFF; a = magic[a+18+0]; b = magic[b+18+256]; c = magic[c+18+512]; d = magic[d+18+768]; return d + (c ^ (b + a)); } static void encrypt(u32 *magic, u32 *arg1, u32 *arg2) { u32 a,b,c; a = *arg1; b = *arg2; for (int i=0; i<16; i++) { c = magic[i] ^ a; a = b ^ lookup(magic, c); b = c; } *arg2 = a ^ magic[16]; *arg1 = b ^ magic[17]; } static void decrypt(u32 *magic, u32 *arg1, u32 *arg2) { u32 a,b,c; a = *arg1; b = *arg2; for (int i=17; i>1; i--) { c = magic[i] ^ a; a = b ^ lookup(magic, c); b = c; } *arg1 = b ^ magic[0]; *arg2 = a ^ magic[1]; } static void encrypt(u32 *magic, u64 &cmd) { encrypt(magic, (u32 *)&cmd + 1, (u32 *)&cmd + 0); } static void decrypt(u32 *magic, u64 &cmd) { decrypt(magic, (u32 *)&cmd + 1, (u32 *)&cmd + 0); } static void update_hashtable(u32* magic, u8 arg1[8]) { for (int j=0;j<18;j++) { u32 r3=0; for (int i=0;i<4;i++) { r3 <<= 8; r3 |= arg1[(j*4 + i) & 7]; } magic[j] ^= r3; } u32 tmp1 = 0; u32 tmp2 = 0; for (int i=0; i<18; i+=2) { encrypt(magic,&tmp1,&tmp2); magic[i+0] = tmp1; magic[i+1] = tmp2; } for (int i=0; i<0x400; i+=2) { encrypt(magic,&tmp1,&tmp2); magic[i+18+0] = tmp1; magic[i+18+1] = tmp2; } } u32 arg2[3]; static void init2(u32 *magic, u32 a[3]) { encrypt(magic, a+2, a+1); encrypt(magic, a+1, a+0); update_hashtable(magic, (u8*)a); } static void init1(u32 cardheader_gamecode) { memcpy(card_hash, &encr_data, 4*(1024 + 18)); arg2[0] = *(u32 *)&cardheader_gamecode; arg2[1] = (*(u32 *)&cardheader_gamecode) >> 1; arg2[2] = (*(u32 *)&cardheader_gamecode) << 1; init2(card_hash, arg2); init2(card_hash, arg2); } static void init0(u32 cardheader_gamecode) { init1(cardheader_gamecode); encrypt(card_hash, (u32*)&global3_x04, (u32*)&global3_x00); global3_rand1 = global3_x00 ^ global3_x04; // more RTC global3_rand3 = global3_x04 ^ 0x0380FEB2; encrypt(card_hash, (u32*)&global3_rand3, (u32*)&global3_rand1); } // ARM9 decryption check values #define MAGIC30 0x72636E65 #define MAGIC34 0x6A624F79 /* * decrypt_arm9 */ static void decrypt_arm9(u32 cardheader_gamecode, unsigned char *data) { u32 *p = (u32*)data; init1(cardheader_gamecode); decrypt(card_hash, p+1, p); arg2[1] <<= 1; arg2[2] >>= 1; init2(card_hash, arg2); decrypt(card_hash, p+1, p); if (p[0] != MAGIC30 || p[1] != MAGIC34) { fprintf(stderr, "Decryption failed!\n"); exit(1); } *p++ = 0xE7FFDEFF; *p++ = 0xE7FFDEFF; u32 size = 0x800 - 8; while (size > 0) { decrypt(card_hash, p+1, p); p += 2; size -= 8; } } bool DecryptSecureArea(u8 *romdata, long romlen) { //this looks like it will only work on little endian hosts Header* header = (Header*)romdata; int romType = DetectRomType(*header,(char*)romdata); /*bool do_decrypt = (endecrypt_option == 'd'); bool do_encrypt = (endecrypt_option == 'e') || (endecrypt_option == 'E'); unsigned int rounds_offsets = (endecrypt_option == 'E') ? 0x2000 : 0x1600; unsigned int sbox_offsets = (endecrypt_option == 'E') ? 0x2400 : 0x2800;*/ #if 0 unsigned int rounds_offsets = 0x1600; unsigned int sbox_offsets = 0x2800; #endif if(romType == ROMTYPE_INVALID) return false; // check if ROM is already encrypted if (romType == ROMTYPE_NDSDUMPED) { printf("Already decrypted.\n"); } else if (romType >= ROMTYPE_ENCRSECURE) // includes ROMTYPE_MASKROM { unsigned char data[0x4000]; memcpy(data,romdata+0x4000,0x4000); decrypt_arm9(*(u32 *)header->gamecode, data); // clear data after header //fseek(fNDS, 0x200, SEEK_SET); //for (unsigned int i=0x200; i<0x4000; i++) fputc(0, fNDS); memset(romdata+0x200,0,(0x4000-0x200)); // write secure 0x800 //fseek(fNDS, 0x4000, SEEK_SET); //fwrite(data, 1, 0x800, fNDS); memcpy(romdata+0x4000,data,0x800); // write header //(already poked directly) //fseek(fNDS, 0, SEEK_SET); //fwrite(&header, 512, 1, fNDS); printf("Decrypted.\n"); } else { printf("File doesn't appear to have a secure area.\n"); } return true; } desmume-0.9.9/src/utils/decrypt/header.h0000644000175000017500000000707712140261631020733 0ustar guillaumeguillaume//taken from ndstool //http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/include/header.h?revision=2447 /* header.h - this file is part of DeSmuME * * Copyright (C) 2005-2006 Rafael Vuijk * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef _HEADER_H_ #define _HEADER_H_ #include "../../types.h" #include "../../PACKED.h" struct __PACKED Header { char title[0xC]; char gamecode[0x4]; char makercode[2]; unsigned char unitcode; // product code. 0 = Nintendo DS unsigned char devicetype; // device code. 0 = normal unsigned char devicecap; // device size. (1<. */ #include #include #include #include #include #include #include "../types.h" #include "../debug.h" #include "../fs.h" #include "emufat.h" #include "vfat.h" #include "libfat/libfat_public_api.h" enum EListCallbackArg { EListCallbackArg_Item, EListCallbackArg_Pop }; typedef void (*ListCallback)(FsEntry* fs, EListCallbackArg); // List all files and subdirectories recursively static void list_files(const char *filepath, ListCallback list_callback) { char DirSpec[255+1], SubDir[255+1]; FsEntry entry; void * hFind; char *fname; u32 dwError; strncpy(DirSpec, filepath, ARRAY_SIZE(DirSpec)); DirSpec[255] = 0 ; // hard limit the string here hFind = FsReadFirst(DirSpec, &entry); if (hFind == NULL) return; do { fname = (strlen(entry.cAlternateFileName)>0) ? entry.cAlternateFileName : entry.cFileName; list_callback(&entry,EListCallbackArg_Item); printf("cflash added %s\n",entry.cFileName); if ((entry.flags & FS_IS_DIR) && (strcmp(fname, ".")) && (strcmp(fname, ".."))) { if (strlen(fname)+strlen(filepath)+2 < 256) { sprintf(SubDir, "%s%c%s", filepath, FS_SEPARATOR, fname); list_files(SubDir, list_callback); list_callback(&entry, EListCallbackArg_Pop); } } } while (FsReadNext(hFind, &entry) != 0); dwError = FsError(); FsClose(hFind); if (dwError != FS_ERR_NO_MORE_FILES) return; } static u64 dataSectors = 0; void count_ListCallback(FsEntry* fs, EListCallbackArg arg) { if(arg == EListCallbackArg_Pop) return; u32 sectors = 1; if(fs->flags & FS_IS_DIR) { } else sectors += (fs->fileSize+511)/512 + 1; dataSectors += sectors; } static std::string currPath; static std::stack pathStack; static std::stack virtPathStack; static std::string currVirtPath; void build_ListCallback(FsEntry* fs, EListCallbackArg arg) { char* fname = (strlen(fs->cAlternateFileName)>0) ? fs->cAlternateFileName : fs->cFileName; //we use cFileName always because it is a LFN and we are making sure that we always make a fat32 image fname = fs->cFileName; if(arg == EListCallbackArg_Pop) { currPath = pathStack.top(); pathStack.pop(); currVirtPath = virtPathStack.top(); virtPathStack.pop(); return; } if(fs->flags & FS_IS_DIR) { if(!strcmp(fname,".")) return; if(!strcmp(fname,"..")) return; pathStack.push(currPath); virtPathStack.push(currVirtPath); currVirtPath = currVirtPath + "/" + fname; bool ok = LIBFAT::MkDir(currVirtPath.c_str()); if(!ok) printf("ERROR adding dir %s via libfat\n",currVirtPath.c_str()); currPath = currPath + std::string(1,FS_SEPARATOR) + fname; return; } else { std::string path = currPath + std::string(1,FS_SEPARATOR) + fname; FILE* inf = fopen(path.c_str(),"rb"); if(inf) { fseek(inf,0,SEEK_END); long len = ftell(inf); fseek(inf,0,SEEK_SET); u8 *buf = new u8[len]; fread(buf,1,len,inf); fclose(inf); std::string path = currVirtPath + "/" + fname; printf("adding path %s for libfat\n",path.c_str()); bool ok = LIBFAT::WriteFile(path.c_str(),buf,len); if(!ok) printf("ERROR adding file to fat\n"); delete[] buf; } else printf("ERROR opening file for fat\n"); } } bool VFAT::build(const char* path, int extra_MB) { dataSectors = 0; currVirtPath = ""; currPath = path; list_files(path, count_ListCallback); dataSectors += 8; //a few for reserved sectors, etc. dataSectors += extra_MB*1024*1024/512; //add extra write space //dataSectors += 16*1024*1024/512; //add 16MB worth of write space. this is probably enough for anyone, but maybe it should be configurable. //we could always suggest to users to add a big file to their directory to overwrite (that would cause the image to get padded) //this seems to be the minimum size that will turn into a solid fat32 if(dataSectors<36*1024*1024/512) dataSectors = 36*1024*1024/512; if(dataSectors>=(0x80000000>>9)) { printf("error allocating memory for fat (%d KBytes)\n",(dataSectors*512)/1024); printf("total fat sizes > 2GB are never going to work\n"); } delete file; try { file = new EMUFILE_MEMORY(dataSectors*512); } catch(std::bad_alloc) { printf("error allocating memory for fat (%d KBytes)\n",(dataSectors*512)/1024); printf("(out of memory)\n"); return false; } //debug.. //file = new EMUFILE_FILE("c:\\temp.ima","rb+"); //format the disk { EmuFat fat(file); EmuFatVolume vol; u8 ok = vol.init(&fat); vol.formatNew(dataSectors); //ensure we are working in memory, just in case we were testing with a disk file. //libfat will need to go straight to memory (for now; we could easily change it to work with the disk) file = file->memwrap(); } EMUFILE_MEMORY* memf = (EMUFILE_MEMORY*)file; //setup libfat and write all the files through it LIBFAT::Init(memf->buf(),memf->size()); list_files(path, build_ListCallback); LIBFAT::Shutdown(); return true; } VFAT::VFAT() : file(NULL) { } VFAT::~VFAT() { delete file; } EMUFILE* VFAT::detach() { EMUFILE* ret = file; file = NULL; return ret; }desmume-0.9.9/src/utils/ConvertUTF.c0000644000175000017500000004517312140261631020022 0ustar guillaumeguillaume/* * Copyright 2001-2004 Unicode, Inc. * * Disclaimer * * This source code is provided as is by Unicode, Inc. No claims are * made as to fitness for any particular purpose. No warranties of any * kind are expressed or implied. The recipient agrees to determine * applicability of information provided. If this file has been * purchased on magnetic or optical media from Unicode, Inc., the * sole remedy for any claim will be exchange of defective media * within 90 days of receipt. * * Limitations on Rights to Redistribute This Code * * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. */ /* --------------------------------------------------------------------- Conversions between UTF32, UTF-16, and UTF-8. Source code file. Author: Mark E. Davis, 1994. Rev History: Rick McGowan, fixes & updates May 2001. Sept 2001: fixed const & error conditions per mods suggested by S. Parent & A. Lillich. June 2002: Tim Dodd added detection and handling of incomplete source sequences, enhanced error detection, added casts to eliminate compiler warnings. July 2003: slight mods to back out aggressive FFFE detection. Jan 2004: updated switches in from-UTF8 conversions. Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions. See the header file "ConvertUTF.h" for complete documentation. ------------------------------------------------------------------------ */ #include "ConvertUTF.h" #ifdef CVTUTF_DEBUG #include #endif static const int halfShift = 10; /* used for shifting by 10 bits */ static const UTF32 halfBase = 0x0010000UL; static const UTF32 halfMask = 0x3FFUL; #define UNI_SUR_HIGH_START (UTF32)0xD800 #define UNI_SUR_HIGH_END (UTF32)0xDBFF #define UNI_SUR_LOW_START (UTF32)0xDC00 #define UNI_SUR_LOW_END (UTF32)0xDFFF #define false 0 #define true 1 /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF32toUTF16 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF32* source = *sourceStart; UTF16* target = *targetStart; while (source < sourceEnd) { UTF32 ch; if (target >= targetEnd) { result = targetExhausted; break; } ch = *source++; if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = (UTF16)ch; /* normal case */ } } else if (ch > UNI_MAX_LEGAL_UTF32) { if (flags == strictConversion) { result = sourceIllegal; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { /* target is a character in range 0xFFFF - 0x10FFFF. */ if (target + 1 >= targetEnd) { --source; /* Back up source pointer! */ result = targetExhausted; break; } ch -= halfBase; *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF16toUTF32 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF16* source = *sourceStart; UTF32* target = *targetStart; UTF32 ch, ch2; while (source < sourceEnd) { const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ ch = *source++; /* If we have a surrogate pair, convert to UTF32 first. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { /* If the 16 bits following the high surrogate are in the source buffer... */ if (source < sourceEnd) { ch2 = *source; /* If it's a low surrogate, convert to UTF32. */ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + (ch2 - UNI_SUR_LOW_START) + halfBase; ++source; } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } else { /* We don't have the 16 bits following the high surrogate. */ --source; /* return to the high surrogate */ result = sourceExhausted; break; } } else if (flags == strictConversion) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } if (target >= targetEnd) { source = oldSource; /* Back up source pointer! */ result = targetExhausted; break; } *target++ = ch; } *sourceStart = source; *targetStart = target; #ifdef CVTUTF_DEBUG if (result == sourceIllegal) { fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); fflush(stderr); } #endif return result; } /* --------------------------------------------------------------------- */ /* * Index into the table below with the first byte of a UTF-8 sequence to * get the number of trailing bytes that are supposed to follow it. * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is * left as-is for anyone who may want to do such conversion, which was * allowed in earlier algorithms. */ static const char trailingBytesForUTF8[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; /* * Magic values subtracted from a buffer value during UTF8 conversion. * This table contains as many values as there might be trailing bytes * in a UTF-8 sequence. */ static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; /* * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed * into the first byte, depending on how many bytes follow. There are * as many entries in this table as there are UTF-8 sequence types. * (I.e., one byte sequence, two byte... etc.). Remember that sequencs * for *legal* UTF-8 will be 4 or fewer bytes total. */ static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; /* --------------------------------------------------------------------- */ /* The interface converts a whole buffer to avoid function-call overhead. * Constants have been gathered. Loops & conditionals have been removed as * much as possible for efficiency, in favor of drop-through switches. * (See "Note A" at the bottom of the file for equivalent code.) * If your compiler supports it, the "isLegalUTF8" call can be turned * into an inline function. */ /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF16toUTF8 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF16* source = *sourceStart; UTF8* target = *targetStart; while (source < sourceEnd) { UTF32 ch; unsigned short bytesToWrite = 0; const UTF32 byteMask = 0xBF; const UTF32 byteMark = 0x80; const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ ch = *source++; /* If we have a surrogate pair, convert to UTF32 first. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { /* If the 16 bits following the high surrogate are in the source buffer... */ if (source < sourceEnd) { UTF32 ch2 = *source; /* If it's a low surrogate, convert to UTF32. */ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + (ch2 - UNI_SUR_LOW_START) + halfBase; ++source; } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } else { /* We don't have the 16 bits following the high surrogate. */ --source; /* return to the high surrogate */ result = sourceExhausted; break; } } else if (flags == strictConversion) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } /* Figure out how many bytes the result will require */ if (ch < (UTF32)0x80) { bytesToWrite = 1; } else if (ch < (UTF32)0x800) { bytesToWrite = 2; } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; } else { bytesToWrite = 3; ch = UNI_REPLACEMENT_CHAR; } target += bytesToWrite; if (target > targetEnd) { source = oldSource; /* Back up source pointer! */ target -= bytesToWrite; result = targetExhausted; break; } switch (bytesToWrite) { /* note: everything falls through. */ case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); } target += bytesToWrite; } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ /* * Utility routine to tell whether a sequence of bytes is legal UTF-8. * This must be called with the length pre-determined by the first byte. * If not calling this from ConvertUTF8to*, then the length can be set by: * length = trailingBytesForUTF8[*source]+1; * and the sequence is illegal right away if there aren't that many bytes * available. * If presented with a length > 4, this returns false. The Unicode * definition of UTF-8 goes up to 4-byte sequences. */ static Boolean isLegalUTF8(const UTF8 *source, int length) { UTF8 a; const UTF8 *srcptr = source+length; switch (length) { default: return false; /* Everything else falls through when "true"... */ case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; case 2: if ((a = (*--srcptr)) > 0xBF) return false; switch (*source) { /* no fall-through in this inner switch */ case 0xE0: if (a < 0xA0) return false; break; case 0xED: if (a > 0x9F) return false; break; case 0xF0: if (a < 0x90) return false; break; case 0xF4: if (a > 0x8F) return false; break; default: if (a < 0x80) return false; } case 1: if (*source >= 0x80 && *source < 0xC2) return false; } if (*source > 0xF4) return false; return true; } /* --------------------------------------------------------------------- */ /* * Exported function to return whether a UTF-8 sequence is legal or not. * This is not used here; it's just exported. */ Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { int length = trailingBytesForUTF8[*source]+1; if (source+length > sourceEnd) { return false; } return isLegalUTF8(source, length); } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF8toUTF16 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF8* source = *sourceStart; UTF16* target = *targetStart; while (source < sourceEnd) { UTF32 ch = 0; unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; if (source + extraBytesToRead >= sourceEnd) { result = sourceExhausted; break; } /* Do this check whether lenient or strict */ if (! isLegalUTF8(source, extraBytesToRead+1)) { result = sourceIllegal; break; } /* * The cases all fall through. See "Note A" below. */ switch (extraBytesToRead) { case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ case 3: ch += *source++; ch <<= 6; case 2: ch += *source++; ch <<= 6; case 1: ch += *source++; ch <<= 6; case 0: ch += *source++; } ch -= offsetsFromUTF8[extraBytesToRead]; if (target >= targetEnd) { source -= (extraBytesToRead+1); /* Back up source pointer! */ result = targetExhausted; break; } if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { source -= (extraBytesToRead+1); /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = (UTF16)ch; /* normal case */ } } else if (ch > UNI_MAX_UTF16) { if (flags == strictConversion) { result = sourceIllegal; source -= (extraBytesToRead+1); /* return to the start */ break; /* Bail out; shouldn't continue */ } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { /* target is a character in range 0xFFFF - 0x10FFFF. */ if (target + 1 >= targetEnd) { source -= (extraBytesToRead+1); /* Back up source pointer! */ result = targetExhausted; break; } ch -= halfBase; *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF32toUTF8 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF32* source = *sourceStart; UTF8* target = *targetStart; while (source < sourceEnd) { UTF32 ch; unsigned short bytesToWrite = 0; const UTF32 byteMask = 0xBF; const UTF32 byteMark = 0x80; ch = *source++; if (flags == strictConversion ) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } /* * Figure out how many bytes the result will require. Turn any * illegally large UTF32 things (> Plane 17) into replacement chars. */ if (ch < (UTF32)0x80) { bytesToWrite = 1; } else if (ch < (UTF32)0x800) { bytesToWrite = 2; } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; } else { bytesToWrite = 3; ch = UNI_REPLACEMENT_CHAR; result = sourceIllegal; } target += bytesToWrite; if (target > targetEnd) { --source; /* Back up source pointer! */ target -= bytesToWrite; result = targetExhausted; break; } switch (bytesToWrite) { /* note: everything falls through. */ case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); } target += bytesToWrite; } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF8toUTF32 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF8* source = *sourceStart; UTF32* target = *targetStart; while (source < sourceEnd) { UTF32 ch = 0; unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; if (source + extraBytesToRead >= sourceEnd) { result = sourceExhausted; break; } /* Do this check whether lenient or strict */ if (! isLegalUTF8(source, extraBytesToRead+1)) { result = sourceIllegal; break; } /* * The cases all fall through. See "Note A" below. */ switch (extraBytesToRead) { case 5: ch += *source++; ch <<= 6; case 4: ch += *source++; ch <<= 6; case 3: ch += *source++; ch <<= 6; case 2: ch += *source++; ch <<= 6; case 1: ch += *source++; ch <<= 6; case 0: ch += *source++; } ch -= offsetsFromUTF8[extraBytesToRead]; if (target >= targetEnd) { source -= (extraBytesToRead+1); /* Back up the source pointer! */ result = targetExhausted; break; } if (ch <= UNI_MAX_LEGAL_UTF32) { /* * UTF-16 surrogate values are illegal in UTF-32, and anything * over Plane 17 (> 0x10FFFF) is illegal. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { source -= (extraBytesToRead+1); /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = ch; } } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ result = sourceIllegal; *target++ = UNI_REPLACEMENT_CHAR; } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- Note A. The fall-through switches in UTF-8 reading code save a temp variable, some decrements & conditionals. The switches are equivalent to the following loop: { int tmpBytesToRead = extraBytesToRead+1; do { ch += *source++; --tmpBytesToRead; if (tmpBytesToRead) ch <<= 6; } while (tmpBytesToRead > 0); } In UTF-8 writing code, the switches on "bytesToWrite" are similarly unrolled loops. --------------------------------------------------------------------- */ desmume-0.9.9/src/utils/guid.cpp0000644000175000017500000000337412140261631017310 0ustar guillaumeguillaume/* Copyright (C) 2008-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include "guid.h" #include "../types.h" void Desmume_Guid::newGuid() { for(int i=0;i='A') a=a-'A'+10; else a-='0'; if(b>='A') b=b-'A'+10; else b-='0'; return ((unsigned char)a<<4)|(unsigned char)b; } void Desmume_Guid::scan(std::string& str) { char* endptr = (char*)str.c_str(); en32lsb(data,strtoul(endptr,&endptr,16)); en16lsb(data+4,(u16)strtoul(endptr+1,&endptr,16)); en16lsb(data+6,(u16)strtoul(endptr+1,&endptr,16)); en16lsb(data+8,(u16)strtoul(endptr+1,&endptr,16)); endptr++; for(int i=0;i<6;i++) data[10+i] = hexToByte(&endptr); } desmume-0.9.9/src/utils/libfat/0000755000175000017500000000000012140305317017106 5ustar guillaumeguillaumedesmume-0.9.9/src/utils/libfat/cache.h0000644000175000017500000001151612140261630020325 0ustar guillaumeguillaume/* cache.h The cache is not visible to the user. It should be flushed when any file is closed or changes are made to the filesystem. This cache implements a least-used-page replacement policy. This will distribute sectors evenly over the pages, so if less than the maximum pages are used at once, they should all eventually remain in the cache. This also has the benefit of throwing out old sectors, so as not to keep too many stale pages around. Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _CACHE_H #define _CACHE_H #include "common.h" #include "disc.h" #define PAGE_SECTORS 64 #define CACHE_PAGE_SIZE (BYTES_PER_READ * PAGE_SECTORS) typedef struct { sec_t sector; unsigned int count; unsigned int last_access; bool dirty; uint8_t* cache; } CACHE_ENTRY; typedef struct { const DISC_INTERFACE* disc; sec_t endOfPartition; unsigned int numberOfPages; unsigned int sectorsPerPage; CACHE_ENTRY* cacheEntries; } CACHE; /* Read data from a sector in the cache If the sector is not in the cache, it will be swapped in offset is the position to start reading from size is the amount of data to read Precondition: offset + size <= BYTES_PER_READ */ bool _FAT_cache_readPartialSector (CACHE* cache, void* buffer, sec_t sector, unsigned int offset, size_t size); bool _FAT_cache_readLittleEndianValue (CACHE* cache, uint32_t *value, sec_t sector, unsigned int offset, int num_bytes); /* Write data to a sector in the cache If the sector is not in the cache, it will be swapped in. When the sector is swapped out, the data will be written to the disc offset is the position to start writing to size is the amount of data to write Precondition: offset + size <= BYTES_PER_READ */ bool _FAT_cache_writePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size); bool _FAT_cache_writeLittleEndianValue (CACHE* cache, const uint32_t value, sec_t sector, unsigned int offset, int num_bytes); /* Write data to a sector in the cache, zeroing the sector first If the sector is not in the cache, it will be swapped in. When the sector is swapped out, the data will be written to the disc offset is the position to start writing to size is the amount of data to write Precondition: offset + size <= BYTES_PER_READ */ bool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size); /* Read several sectors from the cache */ bool _FAT_cache_readSectors (CACHE* cache, sec_t sector, sec_t numSectors, void* buffer); /* Read a full sector from the cache */ static inline bool _FAT_cache_readSector (CACHE* cache, void* buffer, sec_t sector) { return _FAT_cache_readPartialSector (cache, buffer, sector, 0, BYTES_PER_READ); } /* Write a full sector to the cache */ static inline bool _FAT_cache_writeSector (CACHE* cache, const void* buffer, sec_t sector) { return _FAT_cache_writePartialSector (cache, buffer, sector, 0, BYTES_PER_READ); } bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer); /* Write any dirty sectors back to disc and clear out the contents of the cache */ bool _FAT_cache_flush (CACHE* cache); /* Clear out the contents of the cache without writing any dirty sectors first */ void _FAT_cache_invalidate (CACHE* cache); CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition); void _FAT_cache_destructor (CACHE* cache); #endif // _CACHE_H desmume-0.9.9/src/utils/libfat/libfat_public_api.h0000644000175000017500000000043012140261630022703 0ustar guillaumeguillaume#ifndef _LIBFAT_PUBLIC_API_H_ #define _LIBFAT_PUBLIC_API_H_ namespace LIBFAT { void Init(void* buffer, int size_bytes); void Shutdown(); bool MkDir(const char *path); bool WriteFile(const char *path, const void* data, int len); }; #endif //_LIBFAT_PUBLIC_API_H_ desmume-0.9.9/src/utils/libfat/libfat_pc.h0000644000175000017500000000572012140261630021205 0ustar guillaumeguillaume#ifndef _LIBFAT_PC_H #define _LIBFAT_PC_H #ifdef LIBFAT_PC #include "../../types.h" #ifdef _MSC_VER #define ENOTSUP 0 #define EOVERFLOW 0 #include #include #define strcasecmp(x,y) _stricmp(x,y) #define strncasecmp(x, y, l) strnicmp(x, y, l) typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; typedef int32_t ssize_t; #include #define S_IRUSR S_IREAD #define S_IRGRP S_IREAD #define S_IROTH S_IREAD #define S_IWUSR S_IWRITE #define S_IWGRP S_IWRITE #define S_IWOTH S_IWRITE //struct stat { // u32 st_dev; // u32 st_ino; // u32 st_mode; // u32 st_nlink; // u32 st_uid; // u32 st_gid; // u32 st_rdev; // s64 st_size; // time_t st_atime; // time_t st_mtime; // time_t st_ctime; // s32 st_blksize; // s32 st_blocks; // u32 st_attr; //}; #else // (!_MSC_VER) #include #endif //_MSC_VER struct _reent { intptr_t _errno; }; #ifdef __APPLE__ typedef __darwin_mode_t mode_t; #elif defined(_MSC_VER) typedef uint32_t mode_t; #else #include #endif struct DIR_ITER { void* dirStruct; }; struct devoptab_t { const char *name; int structSize; intptr_t (*open_r)(struct _reent *r, void *fileStruct, const char *path, int flags, int mode); intptr_t (*close_r)(struct _reent *r, intptr_t fd); ssize_t (*write_r)(struct _reent *r, intptr_t fd, const char *ptr, size_t len); ssize_t (*read_r)(struct _reent *r, intptr_t fd, char *ptr, size_t len); off_t (*seek_r)(struct _reent *r, intptr_t fd, off_t pos, int dir); int (*fstat_r)(struct _reent *r, intptr_t fd, struct stat *st); int (*stat_r)(struct _reent *r, const char *file, struct stat *st); int (*link_r)(struct _reent *r, const char *existing, const char *newLink); int (*unlink_r)(struct _reent *r, const char *name); int (*chdir_r)(struct _reent *r, const char *name); int (*rename_r) (struct _reent *r, const char *oldName, const char *newName); int (*mkdir_r) (struct _reent *r, const char *path, int mode); int dirStateSize; DIR_ITER* (*diropen_r)(struct _reent *r, DIR_ITER *dirState, const char *path); int (*dirreset_r)(struct _reent *r, DIR_ITER *dirState); int (*dirnext_r)(struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat); int (*dirclose_r)(struct _reent *r, DIR_ITER *dirState); #ifndef LIBFAT_PC int (*statvfs_r)(struct _reent *r, const char *path, struct statvfs *buf); #endif int (*ftruncate_r)(struct _reent *r, intptr_t fd, off_t len); int (*fsync_r)(struct _reent *r, intptr_t fd); void *deviceData; int (*chmod_r)(struct _reent *r, const char *path, mode_t mode); int (*fchmod_r)(struct _reent *r, int fd, mode_t mode); }; devoptab_t* GetDeviceOpTab(const char* name); #define _ATTR_WEAK_ #endif //LIBFAT_PC #endif //_LIBFAT_PC_H desmume-0.9.9/src/utils/libfat/fatfile.h0000644000175000017500000000733012140261630020673 0ustar guillaumeguillaume/* fatfile.h Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FATFILE_H #define _FATFILE_H #include "common.h" #include "partition.h" #include "directory.h" #ifndef LIBFAT_PC #include #include #endif #define FILE_MAX_SIZE ((uint32_t)0xFFFFFFFF) // 4GiB - 1B typedef struct { u32 cluster; sec_t sector; s32 byte; } FILE_POSITION; struct _FILE_STRUCT; struct _FILE_STRUCT { uint32_t filesize; uint32_t startCluster; uint32_t currentPosition; FILE_POSITION rwPosition; FILE_POSITION appendPosition; DIR_ENTRY_POSITION dirEntryStart; // Points to the start of the LFN entries of a file, or the alias for no LFN DIR_ENTRY_POSITION dirEntryEnd; // Always points to the file's alias entry PARTITION* partition; struct _FILE_STRUCT* prevOpenFile; // The previous entry in a double-linked list of open files struct _FILE_STRUCT* nextOpenFile; // The next entry in a double-linked list of open files bool read; bool write; bool append; bool inUse; bool modified; }; typedef struct _FILE_STRUCT FILE_STRUCT; intptr_t _FAT_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode); intptr_t _FAT_close_r (struct _reent *r, intptr_t fd); ssize_t _FAT_write_r (struct _reent *r,intptr_t fd, const char *ptr, size_t len); ssize_t _FAT_read_r (struct _reent *r, intptr_t fd, char *ptr, size_t len); off_t _FAT_seek_r (struct _reent *r, intptr_t fd, off_t pos, int dir); int _FAT_fstat_r (struct _reent *r, intptr_t fd, struct stat *st); int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st); int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink); int _FAT_unlink_r (struct _reent *r, const char *name); int _FAT_chdir_r (struct _reent *r, const char *name); int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName); int _FAT_ftruncate_r (struct _reent *r, intptr_t fd, off_t len); int _FAT_fsync_r (struct _reent *r, intptr_t fd); /* Synchronizes the file data to disc. Does no locking of its own -- lock the partition before calling. Returns 0 on success, an error code on failure. */ extern int _FAT_syncToDisc (FILE_STRUCT* file); #endif // _FATFILE_H desmume-0.9.9/src/utils/libfat/mem_allocate.h0000644000175000017500000000357712140261630021714 0ustar guillaumeguillaume/* mem_allocate.h Memory allocation and destruction calls Replace these calls with custom allocators if malloc is unavailable Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _MEM_ALLOCATE_H #define _MEM_ALLOCATE_H #include static inline void* _FAT_mem_allocate (size_t size) { return malloc (size); } static inline void* _FAT_mem_align (size_t size) { #ifdef __wii__ return memalign (32, size); #else return malloc (size); #endif } static inline void _FAT_mem_free (void* mem) { free (mem); } #endif // _MEM_ALLOCATE_H desmume-0.9.9/src/utils/libfat/directory.h0000644000175000017500000001410712140261630021265 0ustar guillaumeguillaume/* directory.h Reading, writing and manipulation of the directory structure on a FAT partition Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _DIRECTORY_H #define _DIRECTORY_H #include #include "common.h" #include "partition.h" #define DIR_ENTRY_DATA_SIZE 0x20 #define MAX_LFN_LENGTH 256 #define MAX_FILENAME_LENGTH 768 // 256 UCS-2 characters encoded into UTF-8 can use up to 768 UTF-8 chars #define MAX_ALIAS_LENGTH 13 #define LFN_ENTRY_LENGTH 13 #define ALIAS_ENTRY_LENGTH 11 #define MAX_ALIAS_EXT_LENGTH 3 #define MAX_ALIAS_PRI_LENGTH 8 #define MAX_NUMERIC_TAIL 999999 #define FAT16_ROOT_DIR_CLUSTER 0 #define DIR_SEPARATOR '/' // File attributes #define ATTRIB_ARCH 0x20 // Archive #define ATTRIB_DIR 0x10 // Directory #define ATTRIB_LFN 0x0F // Long file name #define ATTRIB_VOL 0x08 // Volume #define ATTRIB_SYS 0x04 // System #define ATTRIB_HID 0x02 // Hidden #define ATTRIB_RO 0x01 // Read only typedef enum {FT_DIRECTORY, FT_FILE} FILE_TYPE; typedef struct { uint32_t cluster; sec_t sector; int32_t offset; } DIR_ENTRY_POSITION; typedef struct { uint8_t entryData[DIR_ENTRY_DATA_SIZE]; DIR_ENTRY_POSITION dataStart; // Points to the start of the LFN entries of a file, or the alias for no LFN DIR_ENTRY_POSITION dataEnd; // Always points to the file/directory's alias entry char filename[MAX_FILENAME_LENGTH]; } DIR_ENTRY; // Directory entry offsets enum DIR_ENTRY_offset { DIR_ENTRY_name = 0x00, DIR_ENTRY_extension = 0x08, DIR_ENTRY_attributes = 0x0B, DIR_ENTRY_reserved = 0x0C, DIR_ENTRY_cTime_ms = 0x0D, DIR_ENTRY_cTime = 0x0E, DIR_ENTRY_cDate = 0x10, DIR_ENTRY_aDate = 0x12, DIR_ENTRY_clusterHigh = 0x14, DIR_ENTRY_mTime = 0x16, DIR_ENTRY_mDate = 0x18, DIR_ENTRY_cluster = 0x1A, DIR_ENTRY_fileSize = 0x1C }; /* Returns true if the file specified by entry is a directory */ static inline bool _FAT_directory_isDirectory (DIR_ENTRY* entry) { return ((entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) != 0); } static inline bool _FAT_directory_isWritable (DIR_ENTRY* entry) { return ((entry->entryData[DIR_ENTRY_attributes] & ATTRIB_RO) == 0); } static inline bool _FAT_directory_isDot (DIR_ENTRY* entry) { return ((entry->filename[0] == '.') && ((entry->filename[1] == '\0') || ((entry->filename[1] == '.') && entry->filename[2] == '\0'))); } /* Reads the first directory entry from the directory starting at dirCluster Places result in entry entry will be destroyed even if no directory entry is found Returns true on success, false on failure */ bool _FAT_directory_getFirstEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster); /* Reads the next directory entry after the one already pointed to by entry Places result in entry entry will be destroyed even if no directory entry is found Returns true on success, false on failure */ bool _FAT_directory_getNextEntry (PARTITION* partition, DIR_ENTRY* entry); /* Gets the directory entry corrsponding to the supplied path entry will be destroyed even if no directory entry is found pathEnd specifies the end of the path string, for cutting strings short if needed specify NULL to use the full length of path pathEnd is only a suggestion, and the path string will be searched up until the next PATH_SEPARATOR after pathEND. Returns true on success, false on failure */ bool _FAT_directory_entryFromPath (PARTITION* partition, DIR_ENTRY* entry, const char* path, const char* pathEnd); /* Changes the current directory to the one specified by path Returns true on success, false on failure */ bool _FAT_directory_chdir (PARTITION* partition, const char* path); /* Removes the directory entry specified by entry Assumes that entry is valid Returns true on success, false on failure */ bool _FAT_directory_removeEntry (PARTITION* partition, DIR_ENTRY* entry); /* Add a directory entry to the directory specified by dirCluster The fileData, dataStart and dataEnd elements of the DIR_ENTRY struct are updated with the new directory entry position and alias. Returns true on success, false on failure */ bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster); /* Get the start cluster of a file from it's entry data */ uint32_t _FAT_directory_entryGetCluster (PARTITION* partition, const uint8_t* entryData); /* Fill in the file name and entry data of DIR_ENTRY* entry. Assumes that the entry's dataStart and dataEnd are correct Returns true on success, false on failure */ bool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry); /* Fill in a stat struct based on a file entry */ void _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st); /* Get volume label */ bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label); #endif // _DIRECTORY_H desmume-0.9.9/src/utils/libfat/filetime.cpp0000644000175000017500000000635312140261630021416 0ustar guillaumeguillaume/* filetime.c Conversion of file time and date values to various other types Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "filetime.h" #include "common.h" #define MAX_HOUR 23 #define MAX_MINUTE 59 #define MAX_SECOND 59 #define MAX_MONTH 11 #define MIN_MONTH 0 #define MAX_DAY 31 #define MIN_DAY 1 uint16_t _FAT_filetime_getTimeFromRTC (void) { #ifdef USE_RTC_TIME struct tm timeParts; time_t epochTime; if (time(&epochTime) == (time_t)-1) { return 0; } localtime_r(&epochTime, &timeParts); // Check that the values are all in range. // If they are not, return 0 (no timestamp) if ((timeParts.tm_hour < 0) || (timeParts.tm_hour > MAX_HOUR)) return 0; if ((timeParts.tm_min < 0) || (timeParts.tm_min > MAX_MINUTE)) return 0; if ((timeParts.tm_sec < 0) || (timeParts.tm_sec > MAX_SECOND)) return 0; return ( ((timeParts.tm_hour & 0x1F) << 11) | ((timeParts.tm_min & 0x3F) << 5) | ((timeParts.tm_sec >> 1) & 0x1F) ); #else return 0; #endif } uint16_t _FAT_filetime_getDateFromRTC (void) { #ifdef USE_RTC_TIME struct tm timeParts; time_t epochTime; if (time(&epochTime) == (time_t)-1) { return 0; } localtime_r(&epochTime, &timeParts); if ((timeParts.tm_mon < MIN_MONTH) || (timeParts.tm_mon > MAX_MONTH)) return 0; if ((timeParts.tm_mday < MIN_DAY) || (timeParts.tm_mday > MAX_DAY)) return 0; return ( (((timeParts.tm_year - 80) & 0x7F) <<9) | // Adjust for MS-FAT base year (1980 vs 1900 for tm_year) (((timeParts.tm_mon + 1) & 0xF) << 5) | (timeParts.tm_mday & 0x1F) ); #else return 0; #endif } time_t _FAT_filetime_to_time_t (uint16_t t, uint16_t d) { struct tm timeParts; timeParts.tm_hour = t >> 11; timeParts.tm_min = (t >> 5) & 0x3F; timeParts.tm_sec = (t & 0x1F) << 1; timeParts.tm_mday = d & 0x1F; timeParts.tm_mon = ((d >> 5) & 0x0F) - 1; timeParts.tm_year = (d >> 9) + 80; timeParts.tm_isdst = 0; return mktime(&timeParts); } desmume-0.9.9/src/utils/libfat/fat.h0000644000175000017500000000721112140261630020031 0ustar guillaumeguillaume/* fat.h Simple functionality for startup, mounting and unmounting of FAT-based devices. Copyright (c) 2006 - 2009 Michael "Chishm" Chisholm Dave "WinterMute" Murphy Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LIBFAT_H #define _LIBFAT_H #ifdef __cplusplus extern "C" { #endif // When compiling for NDS, make sure NDS is defined #ifndef NDS #if defined ARM9 || defined ARM7 #define NDS #endif #endif #ifndef _MSC_VER #include #endif #if defined(__gamecube__) || defined (__wii__) # include #else # ifdef NDS # include "nds/disc_io.h" # else # include "disc_io.h" # endif #endif /* Initialise any inserted block-devices. Add the fat device driver to the devoptab, making it available for standard file functions. cacheSize: The number of pages to allocate for each inserted block-device setAsDefaultDevice: if true, make this the default device driver for file operations */ extern bool fatInit (uint32_t cacheSize, bool setAsDefaultDevice); /* Calls fatInit with setAsDefaultDevice = true and cacheSize optimised for the host system. */ extern bool fatInitDefault (void); /* Mount the device pointed to by interface, and set up a devoptab entry for it as "name:". You can then access the filesystem using "name:/". This will mount the active partition or the first valid partition on the disc, and will use a cache size optimized for the host system. */ extern bool fatMountSimple (const char* name, const DISC_INTERFACE* interface); /* Mount the device pointed to by interface, and set up a devoptab entry for it as "name:". You can then access the filesystem using "name:/". If startSector = 0, it will mount the active partition of the first valid partition on the disc. Otherwise it will try to mount the partition starting at startSector. cacheSize specifies the number of pages to allocate for the cache. This will not startup the disc, so you need to call interface->startup(); first. */ extern bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage); /* Unmount the partition specified by name. If there are open files, it will attempt to synchronise them to disc. */ extern void fatUnmount (const char* name); /* Get Volume Label */ extern void fatGetVolumeLabel (const char* name, char *label); #ifdef __cplusplus } #endif #endif // _LIBFAT_H desmume-0.9.9/src/utils/libfat/libfat_public_api.cpp0000644000175000017500000000501612140261630023243 0ustar guillaumeguillaume#include #include #include "libfat_public_api.h" #include "common.h" #include "disc_io.h" #include "fatfile.h" struct Instance { void* buffer; int size_bytes; devoptab_t* devops; }; Instance sInstance; Instance* gInstance = NULL; bool MEDIUM_STARTUP(void) { return true; } bool MEDIUM_ISINSERTED(void) { return true; } bool MEDIUM_io(bool write, sec_t sector, sec_t numSectors, void* buffer) { int todo = (int)numSectors*512; int loc = (int)sector*512; int have = gInstance->size_bytes - loc; if(todo>have) return false; if(write) memcpy((u8*)gInstance->buffer + loc,buffer,todo); else memcpy(buffer,(u8*)gInstance->buffer + loc,todo); return true; } bool MEDIUM_READSECTORS(sec_t sector, sec_t numSectors, void* buffer) { return MEDIUM_io(false,sector,numSectors,buffer); } bool MEDIUM_WRITESECTORS(sec_t sector, sec_t numSectors, const void* buffer) { return MEDIUM_io(true,sector,numSectors,(void*)buffer); } bool MEDIUM_CLEARSTATUS(void) { return true; } bool MEDIUM_SHUTDOWN(void) { return true; } DISC_INTERFACE_STRUCT discio = { 0, //unsigned long ioType ; FEATURE_MEDIUM_CANWRITE | FEATURE_MEDIUM_CANREAD, //unsigned long features ; MEDIUM_STARTUP, // FN_MEDIUM_STARTUP startup ; MEDIUM_ISINSERTED, //FN_MEDIUM_ISINSERTED isInserted ; MEDIUM_READSECTORS, //FN_MEDIUM_READSECTORS readSectors ; MEDIUM_WRITESECTORS, //FN_MEDIUM_WRITESECTORS writeSectors ; MEDIUM_CLEARSTATUS, //FN_MEDIUM_CLEARSTATUS clearStatus ; MEDIUM_SHUTDOWN, //FN_MEDIUM_SHUTDOWN shutdown ; } ; //not declared in any libfat headers...? bool fatMountSimple (const char* name, const DISC_INTERFACE* interface); void fatUnmountDirect (devoptab_t *devops); namespace LIBFAT { void Init(void* buffer, int size_bytes) { gInstance = &sInstance; gInstance->buffer = buffer; gInstance->size_bytes = size_bytes; fatMountSimple("fat",&discio); gInstance->devops = GetDeviceOpTab(NULL); int zzz=9; } bool MkDir(const char *path) { _reent r; return gInstance->devops->mkdir_r(&r,path,0) == 0; } bool WriteFile(const char *path, const void* data, int len) { _reent r; FILE_STRUCT file; intptr_t fd = gInstance->devops->open_r(&r,&file,path,O_CREAT | O_RDWR,0); if(fd != -1) { ssize_t ret = gInstance->devops->write_r(&r, fd, (char*)data, len); gInstance->devops->close_r(&r, fd); if(ret == len) return true; } return false; } void Shutdown() { fatUnmountDirect(gInstance->devops); gInstance = NULL; } } desmume-0.9.9/src/utils/libfat/partition.h0000644000175000017500000000642612140261630021277 0ustar guillaumeguillaume/* partition.h Functions for mounting and dismounting partitions on various block devices. Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _PARTITION_H #define _PARTITION_H #include "common.h" #include "cache.h" #include "lock.h" // Device name extern const char* DEVICE_NAME; // Filesystem type typedef enum {FS_UNKNOWN, FS_FAT12, FS_FAT16, FS_FAT32} FS_TYPE; typedef struct { sec_t fatStart; uint32_t sectorsPerFat; uint32_t lastCluster; uint32_t firstFree; } FAT; typedef struct { const DISC_INTERFACE* disc; CACHE* cache; // Info about the partition FS_TYPE filesysType; uint64_t totalSize; sec_t rootDirStart; uint32_t rootDirCluster; uint32_t numberOfSectors; sec_t dataStart; uint32_t bytesPerSector; uint32_t sectorsPerCluster; uint32_t bytesPerCluster; FAT fat; // Values that may change after construction uint32_t cwdCluster; // Current working directory cluster int openFileCount; struct _FILE_STRUCT* firstOpenFile; // The start of a linked list of files mutex_t lock; // A lock for partition operations bool readOnly; // If this is set, then do not try writing to the disc char label[12]; // Volume label } PARTITION; /* Mount the supplied device and return a pointer to the struct necessary to use it */ PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t SectorsPerPage, sec_t startSector); /* Dismount the device and free all structures used. Will also attempt to synchronise all open files to disc. */ void _FAT_partition_destructor (PARTITION* partition); /* Return the partition specified in a path, as taken from the devoptab. */ PARTITION* _FAT_partition_getPartitionFromPath (const char* path); #endif // _PARTITION_H desmume-0.9.9/src/utils/libfat/bit_ops.h0000644000175000017500000000473512140261630020726 0ustar guillaumeguillaume/* bit_ops.h Functions for dealing with conversion of data between types Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _BIT_OPS_H #define _BIT_OPS_H #ifndef _MSC_VER #include #endif /*----------------------------------------------------------------- Functions to deal with little endian values stored in uint8_t arrays -----------------------------------------------------------------*/ static inline uint16_t u8array_to_u16 (const uint8_t* item, int offset) { return ( item[offset] | (item[offset + 1] << 8)); } static inline uint32_t u8array_to_u32 (const uint8_t* item, int offset) { return ( item[offset] | (item[offset + 1] << 8) | (item[offset + 2] << 16) | (item[offset + 3] << 24)); } static inline void u16_to_u8array (uint8_t* item, int offset, uint16_t value) { item[offset] = (uint8_t) value; item[offset + 1] = (uint8_t)(value >> 8); } static inline void u32_to_u8array (uint8_t* item, int offset, uint32_t value) { item[offset] = (uint8_t) value; item[offset + 1] = (uint8_t)(value >> 8); item[offset + 2] = (uint8_t)(value >> 16); item[offset + 3] = (uint8_t)(value >> 24); } #endif // _BIT_OPS_H desmume-0.9.9/src/utils/libfat/partition.cpp0000644000175000017500000002350312140261630021625 0ustar guillaumeguillaume/* partition.c Functions for mounting and dismounting partitions on various block devices. Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "partition.h" #include "bit_ops.h" #include "file_allocation_table.h" #include "directory.h" #include "mem_allocate.h" #include "fatfile.h" #include #include #ifndef LIBFAT_PC #include #endif /* This device name, as known by devkitPro toolchains */ const char* DEVICE_NAME = "fat"; /* Data offsets */ // BIOS Parameter Block offsets enum BPB { BPB_jmpBoot = 0x00, BPB_OEMName = 0x03, // BIOS Parameter Block BPB_bytesPerSector = 0x0B, BPB_sectorsPerCluster = 0x0D, BPB_reservedSectors = 0x0E, BPB_numFATs = 0x10, BPB_rootEntries = 0x11, BPB_numSectorsSmall = 0x13, BPB_mediaDesc = 0x15, BPB_sectorsPerFAT = 0x16, BPB_sectorsPerTrk = 0x18, BPB_numHeads = 0x1A, BPB_numHiddenSectors = 0x1C, BPB_numSectors = 0x20, // Ext BIOS Parameter Block for FAT16 BPB_FAT16_driveNumber = 0x24, BPB_FAT16_reserved1 = 0x25, BPB_FAT16_extBootSig = 0x26, BPB_FAT16_volumeID = 0x27, BPB_FAT16_volumeLabel = 0x2B, BPB_FAT16_fileSysType = 0x36, // Bootcode BPB_FAT16_bootCode = 0x3E, // FAT32 extended block BPB_FAT32_sectorsPerFAT32 = 0x24, BPB_FAT32_extFlags = 0x28, BPB_FAT32_fsVer = 0x2A, BPB_FAT32_rootClus = 0x2C, BPB_FAT32_fsInfo = 0x30, BPB_FAT32_bkBootSec = 0x32, // Ext BIOS Parameter Block for FAT32 BPB_FAT32_driveNumber = 0x40, BPB_FAT32_reserved1 = 0x41, BPB_FAT32_extBootSig = 0x42, BPB_FAT32_volumeID = 0x43, BPB_FAT32_volumeLabel = 0x47, BPB_FAT32_fileSysType = 0x52, // Bootcode BPB_FAT32_bootCode = 0x5A, BPB_bootSig_55 = 0x1FE, BPB_bootSig_AA = 0x1FF }; static const char FAT_SIG[3] = {'F', 'A', 'T'}; sec_t FindFirstValidPartition(const DISC_INTERFACE* disc) { uint8_t part_table[16*4]; uint8_t *ptr; int i; uint8_t sectorBuffer[BYTES_PER_READ] = {0}; // Read first sector of disc if (!_FAT_disc_readSectors (disc, 0, 1, sectorBuffer)) { return 0; } memcpy(part_table,sectorBuffer+0x1BE,16*4); ptr = part_table; for(i=0;i<4;i++,ptr+=16) { sec_t part_lba = u8array_to_u32(ptr, 0x8); if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) || !memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { return part_lba; } if(ptr[4]==0) continue; if(ptr[4]==0x0F) { sec_t part_lba2=part_lba; sec_t next_lba2=0; int n; for(n=0;n<8;n++) // max 8 logic partitions { if(!_FAT_disc_readSectors (disc, part_lba+next_lba2, 1, sectorBuffer)) return 0; part_lba2 = part_lba + next_lba2 + u8array_to_u32(sectorBuffer, 0x1C6) ; next_lba2 = u8array_to_u32(sectorBuffer, 0x1D6); if(!_FAT_disc_readSectors (disc, part_lba2, 1, sectorBuffer)) return 0; if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) || !memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { return part_lba2; } if(next_lba2==0) break; } } else { if(!_FAT_disc_readSectors (disc, part_lba, 1, sectorBuffer)) return 0; if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) || !memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { return part_lba; } } } return 0; } PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t sectorsPerPage, sec_t startSector) { PARTITION* partition; uint8_t sectorBuffer[BYTES_PER_READ] = {0}; // Read first sector of disc if (!_FAT_disc_readSectors (disc, startSector, 1, sectorBuffer)) { return NULL; } // Make sure it is a valid MBR or boot sector if ( (sectorBuffer[BPB_bootSig_55] != 0x55) || (sectorBuffer[BPB_bootSig_AA] != 0xAA)) { return NULL; } if (startSector != 0) { // We're told where to start the partition, so just accept it } else if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { // Check if there is a FAT string, which indicates this is a boot sector startSector = 0; } else if (!memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { // Check for FAT32 startSector = 0; } else { startSector = FindFirstValidPartition(disc); if (!_FAT_disc_readSectors (disc, startSector, 1, sectorBuffer)) { return NULL; } } // Now verify that this is indeed a FAT partition if (memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) && memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) { return NULL; } partition = (PARTITION*) _FAT_mem_allocate (sizeof(PARTITION)); if (partition == NULL) { return NULL; } // Init the partition lock _FAT_lock_init(&partition->lock); if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG))) strncpy(partition->label, (char*)(sectorBuffer + BPB_FAT16_volumeLabel), 11); else strncpy(partition->label, (char*)(sectorBuffer + BPB_FAT32_volumeLabel), 11); partition->label[11] = '\0'; // Set partition's disc interface partition->disc = disc; // Store required information about the file system partition->fat.sectorsPerFat = u8array_to_u16(sectorBuffer, BPB_sectorsPerFAT); if (partition->fat.sectorsPerFat == 0) { partition->fat.sectorsPerFat = u8array_to_u32( sectorBuffer, BPB_FAT32_sectorsPerFAT32); } partition->numberOfSectors = u8array_to_u16( sectorBuffer, BPB_numSectorsSmall); if (partition->numberOfSectors == 0) { partition->numberOfSectors = u8array_to_u32( sectorBuffer, BPB_numSectors); } partition->bytesPerSector = BYTES_PER_READ; // Sector size is redefined to be 512 bytes partition->sectorsPerCluster = sectorBuffer[BPB_sectorsPerCluster] * u8array_to_u16(sectorBuffer, BPB_bytesPerSector) / BYTES_PER_READ; partition->bytesPerCluster = partition->bytesPerSector * partition->sectorsPerCluster; partition->fat.fatStart = startSector + u8array_to_u16(sectorBuffer, BPB_reservedSectors); partition->rootDirStart = partition->fat.fatStart + (sectorBuffer[BPB_numFATs] * partition->fat.sectorsPerFat); partition->dataStart = partition->rootDirStart + (( u8array_to_u16(sectorBuffer, BPB_rootEntries) * DIR_ENTRY_DATA_SIZE) / partition->bytesPerSector); partition->totalSize = ((uint64_t)partition->numberOfSectors - (partition->dataStart - startSector)) * (uint64_t)partition->bytesPerSector; // Store info about FAT uint32_t clusterCount = (partition->numberOfSectors - (uint32_t)(partition->dataStart - startSector)) / partition->sectorsPerCluster; partition->fat.lastCluster = clusterCount + CLUSTER_FIRST - 1; partition->fat.firstFree = CLUSTER_FIRST; if (clusterCount < CLUSTERS_PER_FAT12) { partition->filesysType = FS_FAT12; // FAT12 volume } else if (clusterCount < CLUSTERS_PER_FAT16) { partition->filesysType = FS_FAT16; // FAT16 volume } else { partition->filesysType = FS_FAT32; // FAT32 volume } if (partition->filesysType != FS_FAT32) { partition->rootDirCluster = FAT16_ROOT_DIR_CLUSTER; } else { // Set up for the FAT32 way partition->rootDirCluster = u8array_to_u32(sectorBuffer, BPB_FAT32_rootClus); // Check if FAT mirroring is enabled if (!(sectorBuffer[BPB_FAT32_extFlags] & 0x80)) { // Use the active FAT partition->fat.fatStart = partition->fat.fatStart + ( partition->fat.sectorsPerFat * (sectorBuffer[BPB_FAT32_extFlags] & 0x0F)); } } // Create a cache to use partition->cache = _FAT_cache_constructor (cacheSize, sectorsPerPage, partition->disc, startSector+partition->numberOfSectors); // Set current directory to the root partition->cwdCluster = partition->rootDirCluster; // Check if this disc is writable, and set the readOnly property appropriately partition->readOnly = !(_FAT_disc_features(disc) & FEATURE_MEDIUM_CANWRITE); // There are currently no open files on this partition partition->openFileCount = 0; partition->firstOpenFile = NULL; return partition; } void _FAT_partition_destructor (PARTITION* partition) { FILE_STRUCT* nextFile; _FAT_lock(&partition->lock); // Synchronize open files nextFile = partition->firstOpenFile; while (nextFile) { _FAT_syncToDisc (nextFile); nextFile = nextFile->nextOpenFile; } // Free memory used by the cache, writing it to disc at the same time _FAT_cache_destructor (partition->cache); // Unlock the partition and destroy the lock _FAT_unlock(&partition->lock); _FAT_lock_deinit(&partition->lock); // Free memory used by the partition _FAT_mem_free (partition); } PARTITION* _FAT_partition_getPartitionFromPath (const char* path) { const devoptab_t *devops; devops = GetDeviceOpTab (path); if (!devops) { return NULL; } return (PARTITION*)devops->deviceData; } desmume-0.9.9/src/utils/libfat/cache.cpp0000644000175000017500000002444012140261630020660 0ustar guillaumeguillaume/* cache.c The cache is not visible to the user. It should be flushed when any file is closed or changes are made to the filesystem. This cache implements a least-used-page replacement policy. This will distribute sectors evenly over the pages, so if less than the maximum pages are used at once, they should all eventually remain in the cache. This also has the benefit of throwing out old sectors, so as not to keep too many stale pages around. Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "common.h" #include "cache.h" #include "disc.h" #include "mem_allocate.h" #include "bit_ops.h" #include "file_allocation_table.h" #define CACHE_FREE UINT_MAX CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition) { CACHE* cache; unsigned int i; CACHE_ENTRY* cacheEntries; if (numberOfPages < 2) { numberOfPages = 2; } if (sectorsPerPage < 8) { sectorsPerPage = 8; } cache = (CACHE*) _FAT_mem_allocate (sizeof(CACHE)); if (cache == NULL) { return NULL; } cache->disc = discInterface; cache->endOfPartition = endOfPartition; cache->numberOfPages = numberOfPages; cache->sectorsPerPage = sectorsPerPage; cacheEntries = (CACHE_ENTRY*) _FAT_mem_allocate ( sizeof(CACHE_ENTRY) * numberOfPages); if (cacheEntries == NULL) { _FAT_mem_free (cache); return NULL; } for (i = 0; i < numberOfPages; i++) { cacheEntries[i].sector = CACHE_FREE; cacheEntries[i].count = 0; cacheEntries[i].last_access = 0; cacheEntries[i].dirty = false; cacheEntries[i].cache = (uint8_t*) _FAT_mem_align ( sectorsPerPage * BYTES_PER_READ ); } cache->cacheEntries = cacheEntries; return cache; } void _FAT_cache_destructor (CACHE* cache) { unsigned int i; // Clear out cache before destroying it _FAT_cache_flush(cache); // Free memory in reverse allocation order for (i = 0; i < cache->numberOfPages; i++) { _FAT_mem_free (cache->cacheEntries[i].cache); } _FAT_mem_free (cache->cacheEntries); _FAT_mem_free (cache); } static u32 accessCounter = 0; static u32 accessTime(){ accessCounter++; return accessCounter; } static CACHE_ENTRY* _FAT_cache_getPage(CACHE *cache,sec_t sector) { unsigned int i; CACHE_ENTRY* cacheEntries = cache->cacheEntries; unsigned int numberOfPages = cache->numberOfPages; unsigned int sectorsPerPage = cache->sectorsPerPage; bool foundFree = false; unsigned int oldUsed = 0; unsigned int oldAccess = UINT_MAX; for(i=0;i=cacheEntries[i].sector && sector<(cacheEntries[i].sector + cacheEntries[i].count)) { cacheEntries[i].last_access = accessTime(); return &(cacheEntries[i]); } if(foundFree==false && (cacheEntries[i].sector==CACHE_FREE || cacheEntries[i].last_accessdisc,cacheEntries[oldUsed].sector,cacheEntries[oldUsed].count,cacheEntries[oldUsed].cache)) return NULL; cacheEntries[oldUsed].dirty = false; } sector = (sector/sectorsPerPage)*sectorsPerPage; // align base sector to page size sec_t next_page = sector + sectorsPerPage; if(next_page > cache->endOfPartition) next_page = cache->endOfPartition; if(!_FAT_disc_readSectors(cache->disc,sector,next_page-sector,cacheEntries[oldUsed].cache)) return NULL; cacheEntries[oldUsed].sector = sector; cacheEntries[oldUsed].count = next_page-sector; cacheEntries[oldUsed].last_access = accessTime(); return &(cacheEntries[oldUsed]); } bool _FAT_cache_readSectors(CACHE *cache,sec_t sector,sec_t numSectors,void *buffer) { sec_t sec; sec_t secs_to_read; CACHE_ENTRY *entry; uint8_t *dest = (uint8_t *)buffer; while(numSectors>0) { entry = _FAT_cache_getPage(cache,sector); if(entry==NULL) return false; sec = sector - entry->sector; secs_to_read = entry->count - sec; if(secs_to_read>numSectors) secs_to_read = numSectors; memcpy(dest,entry->cache + (sec*BYTES_PER_READ),(secs_to_read*BYTES_PER_READ)); dest += (secs_to_read*BYTES_PER_READ); sector += secs_to_read; numSectors -= secs_to_read; } return true; } /* Reads some data from a cache page, determined by the sector number */ bool _FAT_cache_readPartialSector (CACHE* cache, void* buffer, sec_t sector, unsigned int offset, size_t size) { sec_t sec; CACHE_ENTRY *entry; if (offset + size > BYTES_PER_READ) return false; entry = _FAT_cache_getPage(cache,sector); if(entry==NULL) return false; sec = sector - entry->sector; memcpy(buffer,entry->cache + ((sec*BYTES_PER_READ) + offset),size); return true; } bool _FAT_cache_readLittleEndianValue (CACHE* cache, uint32_t *value, sec_t sector, unsigned int offset, int num_bytes) { uint8_t buf[4]; if (!_FAT_cache_readPartialSector(cache, buf, sector, offset, num_bytes)) return false; switch(num_bytes) { case 1: *value = buf[0]; break; case 2: *value = u8array_to_u16(buf,0); break; case 4: *value = u8array_to_u32(buf,0); break; default: return false; } return true; } /* Writes some data to a cache page, making sure it is loaded into memory first. */ bool _FAT_cache_writePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size) { sec_t sec; CACHE_ENTRY *entry; if (offset + size > BYTES_PER_READ) return false; entry = _FAT_cache_getPage(cache,sector); if(entry==NULL) return false; sec = sector - entry->sector; memcpy(entry->cache + ((sec*BYTES_PER_READ) + offset),buffer,size); entry->dirty = true; return true; } bool _FAT_cache_writeLittleEndianValue (CACHE* cache, const uint32_t value, sec_t sector, unsigned int offset, int size) { uint8_t buf[4] = {0, 0, 0, 0}; switch(size) { case 1: buf[0] = value; break; case 2: u16_to_u8array(buf, 0, value); break; case 4: u32_to_u8array(buf, 0, value); break; default: return false; } return _FAT_cache_writePartialSector(cache, buf, sector, offset, size); } /* Writes some data to a cache page, zeroing out the page first */ bool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size) { sec_t sec; CACHE_ENTRY *entry; if (offset + size > BYTES_PER_READ) return false; entry = _FAT_cache_getPage(cache,sector); if(entry==NULL) return false; sec = sector - entry->sector; memset(entry->cache + (sec*BYTES_PER_READ),0,BYTES_PER_READ); memcpy(entry->cache + ((sec*BYTES_PER_READ) + offset),buffer,size); entry->dirty = true; return true; } static CACHE_ENTRY* _FAT_cache_findPage(CACHE *cache, sec_t sector, sec_t count) { unsigned int i; CACHE_ENTRY* cacheEntries = cache->cacheEntries; unsigned int numberOfPages = cache->numberOfPages; CACHE_ENTRY *entry = NULL; sec_t lowest = UINT_MAX; for(i=0;i cacheEntries[i].sector) { intersect = sector - cacheEntries[i].sector < cacheEntries[i].count; } else { intersect = cacheEntries[i].sector - sector < count; } if ( intersect && (cacheEntries[i].sector < lowest)) { lowest = cacheEntries[i].sector; entry = &cacheEntries[i]; } } } return entry; } bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer) { sec_t sec; sec_t secs_to_write; CACHE_ENTRY* entry; const uint8_t *src = (const uint8_t *)buffer; while(numSectors>0) { entry = _FAT_cache_findPage(cache,sector,numSectors); if(entry!=NULL) { if ( entry->sector > sector) { secs_to_write = entry->sector - sector; _FAT_disc_writeSectors(cache->disc,sector,secs_to_write,src); src += (secs_to_write*BYTES_PER_READ); sector += secs_to_write; numSectors -= secs_to_write; } sec = sector - entry->sector; secs_to_write = entry->count - sec; if(secs_to_write>numSectors) secs_to_write = numSectors; memcpy(entry->cache + (sec*BYTES_PER_READ),src,(secs_to_write*BYTES_PER_READ)); src += (secs_to_write*BYTES_PER_READ); sector += secs_to_write; numSectors -= secs_to_write; entry->dirty = true; } else { _FAT_disc_writeSectors(cache->disc,sector,numSectors,src); numSectors=0; } } return true; } /* Flushes all dirty pages to disc, clearing the dirty flag. */ bool _FAT_cache_flush (CACHE* cache) { unsigned int i; for (i = 0; i < cache->numberOfPages; i++) { if (cache->cacheEntries[i].dirty) { if (!_FAT_disc_writeSectors (cache->disc, cache->cacheEntries[i].sector, cache->cacheEntries[i].count, cache->cacheEntries[i].cache)) { return false; } } cache->cacheEntries[i].dirty = false; } return true; } void _FAT_cache_invalidate (CACHE* cache) { unsigned int i; _FAT_cache_flush(cache); for (i = 0; i < cache->numberOfPages; i++) { cache->cacheEntries[i].sector = CACHE_FREE; cache->cacheEntries[i].last_access = 0; cache->cacheEntries[i].count = 0; cache->cacheEntries[i].dirty = false; } } desmume-0.9.9/src/utils/libfat/disc_io.h0000644000175000017500000000473712140261630020702 0ustar guillaumeguillaume/* disc_io.h Interface template for low level disc functions. Copyright (c) 2006 Michael "Chishm" Chisholm Based on code originally written by MightyMax Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef NDS_DISC_IO_INCLUDE #define NDS_DISC_IO_INCLUDE #define FEATURE_MEDIUM_CANREAD 0x00000001 #define FEATURE_MEDIUM_CANWRITE 0x00000002 #define FEATURE_SLOT_GBA 0x00000010 #define FEATURE_SLOT_NDS 0x00000020 typedef uint32_t sec_t; typedef bool (* FN_MEDIUM_STARTUP)(void) ; typedef bool (* FN_MEDIUM_ISINSERTED)(void) ; typedef bool (* FN_MEDIUM_READSECTORS)(sec_t sector, sec_t numSectors, void* buffer) ; typedef bool (* FN_MEDIUM_WRITESECTORS)(sec_t sector, sec_t numSectors, const void* buffer) ; typedef bool (* FN_MEDIUM_CLEARSTATUS)(void) ; typedef bool (* FN_MEDIUM_SHUTDOWN)(void) ; struct DISC_INTERFACE_STRUCT { unsigned long ioType ; unsigned long features ; FN_MEDIUM_STARTUP startup ; FN_MEDIUM_ISINSERTED isInserted ; FN_MEDIUM_READSECTORS readSectors ; FN_MEDIUM_WRITESECTORS writeSectors ; FN_MEDIUM_CLEARSTATUS clearStatus ; FN_MEDIUM_SHUTDOWN shutdown ; } ; typedef struct DISC_INTERFACE_STRUCT DISC_INTERFACE ; #endif // define NDS_DISC_IO_INCLUDE desmume-0.9.9/src/utils/libfat/file_allocation_table.h0000644000175000017500000000546112140261630023557 0ustar guillaumeguillaume/* file_allocation_table.h Reading, writing and manipulation of the FAT structure on a FAT partition Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FAT_H #define _FAT_H #include "common.h" #include "partition.h" #define CLUSTER_EOF_16 0xFFFF #define CLUSTER_EOF 0x0FFFFFFF #define CLUSTER_FREE 0x00000000 #define CLUSTER_ROOT 0x00000000 #define CLUSTER_FIRST 0x00000002 #define CLUSTER_ERROR 0xFFFFFFFF #define CLUSTERS_PER_FAT12 4085 #define CLUSTERS_PER_FAT16 65525 uint32_t _FAT_fat_nextCluster(PARTITION* partition, uint32_t cluster); uint32_t _FAT_fat_linkFreeCluster(PARTITION* partition, uint32_t cluster); uint32_t _FAT_fat_linkFreeClusterCleared (PARTITION* partition, uint32_t cluster); bool _FAT_fat_clearLinks (PARTITION* partition, uint32_t cluster); uint32_t _FAT_fat_trimChain (PARTITION* partition, uint32_t startCluster, unsigned int chainLength); uint32_t _FAT_fat_lastCluster (PARTITION* partition, uint32_t cluster); unsigned int _FAT_fat_freeClusterCount (PARTITION* partition); static inline sec_t _FAT_fat_clusterToSector (PARTITION* partition, uint32_t cluster) { return (cluster >= CLUSTER_FIRST) ? ((cluster - CLUSTER_FIRST) * (sec_t)partition->sectorsPerCluster) + partition->dataStart : partition->rootDirStart; } static inline bool _FAT_fat_isValidCluster (PARTITION* partition, uint32_t cluster) { return (cluster >= CLUSTER_FIRST) && (cluster <= partition->fat.lastCluster /* This will catch CLUSTER_ERROR */); } #endif // _FAT_H desmume-0.9.9/src/utils/libfat/disc.cpp0000644000175000017500000000634712140261630020545 0ustar guillaumeguillaume/* disc.c Interface to the low level disc functions. Used by the higher level file system code. Copyright (c) 2008 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "disc.h" /* The list of interfaces consists of a series of name/interface pairs. The interface is returned via a simple function. This allows for platforms where the interface has to be "assembled" before it can be used, like DLDI on the NDS. For cases where a simple struct is available, wrapper functions are used. The list is terminated by a NULL/NULL entry. */ /* ====================== Wii ====================== */ #if defined (__wii__) #include #include #include static const DISC_INTERFACE* get_io_wiisd (void) { return &__io_wiisd; } static const DISC_INTERFACE* get_io_usbstorage (void) { return &__io_usbstorage; } static const DISC_INTERFACE* get_io_gcsda (void) { return &__io_gcsda; } static const DISC_INTERFACE* get_io_gcsdb (void) { return &__io_gcsdb; } const INTERFACE_ID _FAT_disc_interfaces[] = { {"sd", get_io_wiisd}, {"usb", get_io_usbstorage}, {"carda", get_io_gcsda}, {"cardb", get_io_gcsdb}, {NULL, NULL} }; /* ==================== Gamecube ==================== */ #elif defined (__gamecube__) #include static const DISC_INTERFACE* get_io_gcsda (void) { return &__io_gcsda; } static const DISC_INTERFACE* get_io_gcsdb (void) { return &__io_gcsdb; } const INTERFACE_ID _FAT_disc_interfaces[] = { {"carda", get_io_gcsda}, {"cardb", get_io_gcsdb}, {NULL, NULL} }; /* ====================== NDS ====================== */ #elif defined (NDS) #include const INTERFACE_ID _FAT_disc_interfaces[] = { {"fat", dldiGetInternal}, {NULL, NULL} }; /* ====================== GBA ====================== */ #elif defined (GBA) #include const INTERFACE_ID _FAT_disc_interfaces[] = { {"fat", discGetInterface}, {NULL, NULL} }; #endif desmume-0.9.9/src/utils/libfat/disc.h0000644000175000017500000000715412140261630020207 0ustar guillaumeguillaume/* disc.h Interface to the low level disc functions. Used by the higher level file system code. Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _DISC_H #define _DISC_H #include "common.h" /* A list of all default devices to try at startup, terminated by a {NULL,NULL} entry. */ typedef struct { const char* name; const DISC_INTERFACE* (*getInterface)(void); } INTERFACE_ID; extern const INTERFACE_ID _FAT_disc_interfaces[]; /* Check if a disc is inserted Return true if a disc is inserted and ready, false otherwise */ static inline bool _FAT_disc_isInserted (const DISC_INTERFACE* disc) { return disc->isInserted(); } /* Read numSectors sectors from a disc, starting at sector. numSectors is between 1 and LIMIT_SECTORS if LIMIT_SECTORS is defined, else it is at least 1 sector is 0 or greater buffer is a pointer to the memory to fill */ static inline bool _FAT_disc_readSectors (const DISC_INTERFACE* disc, sec_t sector, sec_t numSectors, void* buffer) { return disc->readSectors (sector, numSectors, buffer); } /* Write numSectors sectors to a disc, starting at sector. numSectors is between 1 and LIMIT_SECTORS if LIMIT_SECTORS is defined, else it is at least 1 sector is 0 or greater buffer is a pointer to the memory to read from */ static inline bool _FAT_disc_writeSectors (const DISC_INTERFACE* disc, sec_t sector, sec_t numSectors, const void* buffer) { return disc->writeSectors (sector, numSectors, buffer); } /* Reset the card back to a ready state */ static inline bool _FAT_disc_clearStatus (const DISC_INTERFACE* disc) { return disc->clearStatus(); } /* Initialise the disc to a state ready for data reading or writing */ static inline bool _FAT_disc_startup (const DISC_INTERFACE* disc) { return disc->startup(); } /* Put the disc in a state ready for power down. Complete any pending writes and disable the disc if necessary */ static inline bool _FAT_disc_shutdown (const DISC_INTERFACE* disc) { return disc->shutdown(); } /* Return a 32 bit value unique to each type of interface */ static inline uint32_t _FAT_disc_hostType (const DISC_INTERFACE* disc) { return disc->ioType; } /* Return a 32 bit value that specifies the capabilities of the disc */ static inline uint32_t _FAT_disc_features (const DISC_INTERFACE* disc) { return disc->features; } #endif // _DISC_H desmume-0.9.9/src/utils/libfat/directory.cpp0000644000175000017500000010456012140261630021623 0ustar guillaumeguillaume/* directory.c Reading, writing and manipulation of the directory structure on a FAT partition Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "directory.h" #include "common.h" #include "partition.h" #include "file_allocation_table.h" #include "bit_ops.h" #include "filetime.h" #ifdef __APPLE__ #include #ifndef MAC_OS_X_VERSION_10_7 // In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here. static size_t strnlen(const char *s, size_t n) { const char *p = (const char *)memchr(s, 0, n); return(p ? p-s : n); } #endif #endif // __APPLE__ // Directory entry codes #define DIR_ENTRY_LAST 0x00 #define DIR_ENTRY_FREE 0xE5 #define LAST_LFN_POS (19*13) #define LAST_LFN_POS_CORRECTION (MAX_LFN_LENGTH-15) typedef unsigned short ucs2_t; // Long file name directory entry enum LFN_offset { LFN_offset_ordinal = 0x00, // Position within LFN LFN_offset_char0 = 0x01, LFN_offset_char1 = 0x03, LFN_offset_char2 = 0x05, LFN_offset_char3 = 0x07, LFN_offset_char4 = 0x09, LFN_offset_flag = 0x0B, // Should be equal to ATTRIB_LFN LFN_offset_reserved1 = 0x0C, // Always 0x00 LFN_offset_checkSum = 0x0D, // Checksum of short file name (alias) LFN_offset_char5 = 0x0E, LFN_offset_char6 = 0x10, LFN_offset_char7 = 0x12, LFN_offset_char8 = 0x14, LFN_offset_char9 = 0x16, LFN_offset_char10 = 0x18, LFN_offset_reserved2 = 0x1A, // Always 0x0000 LFN_offset_char11 = 0x1C, LFN_offset_char12 = 0x1E }; static const int LFN_offset_table[13]={0x01,0x03,0x05,0x07,0x09,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E}; #define LFN_END 0x40 #define LFN_DEL 0x80 static const char ILLEGAL_ALIAS_CHARACTERS[] = "\\/:;*?\"<>|&+,=[] "; static const char ILLEGAL_LFN_CHARACTERS[] = "\\/:*?\"<>|"; /* Returns number of UCS-2 characters needed to encode an LFN Returns -1 if it is an invalid LFN */ #define ABOVE_UCS_RANGE 0xF0 static int _FAT_directory_lfnLength (const char* name) { unsigned int i; size_t nameLength; int ucsLength; const char* tempName = name; nameLength = strnlen(name, MAX_FILENAME_LENGTH); // Make sure the name is short enough to be valid if ( nameLength >= MAX_FILENAME_LENGTH) { return -1; } // Make sure it doesn't contain any invalid characters if (strpbrk (name, ILLEGAL_LFN_CHARACTERS) != NULL) { return -1; } // Make sure the name doesn't contain any control codes or codes not representable in UCS-2 for (i = 0; i < nameLength; i++) { if (name[i] < 0x20 || name[i] >= ABOVE_UCS_RANGE) { return -1; } } // Convert to UCS-2 and get the resulting length ucsLength = mbsrtowcs(NULL, &tempName, MAX_LFN_LENGTH, NULL); if (ucsLength < 0 || ucsLength >= MAX_LFN_LENGTH) { return -1; } // Otherwise it is valid return ucsLength; } /* Convert a multibyte encoded string into a NUL-terminated UCS-2 string, storing at most len characters return number of characters stored */ static size_t _FAT_directory_mbstoucs2 (ucs2_t* dst, const char* src, size_t len) { mbstate_t ps = {0}; wchar_t tempChar; int bytes; size_t count = 0; while (count < len-1 && src != '\0') { bytes = mbrtowc (&tempChar, src, MB_CUR_MAX, &ps); if (bytes > 0) { *dst = (ucs2_t)tempChar; src += bytes; dst++; count++; } else if (bytes == 0) { break; } else { return -1; } } *dst = '\0'; return count; } /* Convert a UCS-2 string into a NUL-terminated multibyte string, storing at most len chars return number of chars stored, or (size_t)-1 on error */ static size_t _FAT_directory_ucs2tombs (char* dst, const ucs2_t* src, size_t len) { mbstate_t ps = {0}; size_t count = 0; int bytes; char* buff = (char*)alloca(MB_CUR_MAX); int i; while (count < len - 1 && *src != '\0') { bytes = wcrtomb (buff, *src, &ps); if (bytes < 0) { return -1; } if (count + bytes < len && bytes > 0) { for (i = 0; i < bytes; i++) { *dst++ = buff[i]; } src++; count += bytes; } else { break; } } *dst = L'\0'; return count; } /* Case-independent comparison of two multibyte encoded strings */ static int _FAT_directory_mbsncasecmp (const char* s1, const char* s2, size_t len1) { wchar_t wc1, wc2; mbstate_t ps1 = {0}; mbstate_t ps2 = {0}; size_t b1 = 0; size_t b2 = 0; if (len1 == 0) { return 0; } do { s1 += b1; s2 += b2; b1 = mbrtowc(&wc1, s1, MB_CUR_MAX, &ps1); b2 = mbrtowc(&wc2, s2, MB_CUR_MAX, &ps2); if ((int)b1 < 0 || (int)b2 < 0) { break; } len1 -= b1; } while (len1 > 0 && towlower(wc1) == towlower(wc2) && wc1 != 0); return towlower(wc1) - towlower(wc2); } static bool _FAT_directory_entryGetAlias (const u8* entryData, char* destName) { int i=0; int j=0; destName[0] = '\0'; if (entryData[0] != DIR_ENTRY_FREE) { if (entryData[0] == '.') { destName[0] = '.'; if (entryData[1] == '.') { destName[1] = '.'; destName[2] = '\0'; } else { destName[1] = '\0'; } } else { // Copy the filename from the dirEntry to the string for (i = 0; (i < 8) && (entryData[DIR_ENTRY_name + i] != ' '); i++) { destName[i] = entryData[DIR_ENTRY_name + i]; } // Copy the extension from the dirEntry to the string if (entryData[DIR_ENTRY_extension] != ' ') { destName[i++] = '.'; for ( j = 0; (j < 3) && (entryData[DIR_ENTRY_extension + j] != ' '); j++) { destName[i++] = entryData[DIR_ENTRY_extension + j]; } } destName[i] = '\0'; } } return (destName[0] != '\0'); } uint32_t _FAT_directory_entryGetCluster (PARTITION* partition, const uint8_t* entryData) { if (partition->filesysType == FS_FAT32) { // Only use high 16 bits of start cluster when we are certain they are correctly defined return u8array_to_u16(entryData,DIR_ENTRY_cluster) | (u8array_to_u16(entryData, DIR_ENTRY_clusterHigh) << 16); } else { return u8array_to_u16(entryData,DIR_ENTRY_cluster); } } static bool _FAT_directory_incrementDirEntryPosition (PARTITION* partition, DIR_ENTRY_POSITION* entryPosition, bool extendDirectory) { DIR_ENTRY_POSITION position = *entryPosition; uint32_t tempCluster; // Increment offset, wrapping at the end of a sector ++ position.offset; if (position.offset == BYTES_PER_READ / DIR_ENTRY_DATA_SIZE) { position.offset = 0; // Increment sector when wrapping ++ position.sector; // But wrap at the end of a cluster if ((position.sector == partition->sectorsPerCluster) && (position.cluster != FAT16_ROOT_DIR_CLUSTER)) { position.sector = 0; // Move onto the next cluster, making sure there is another cluster to go to tempCluster = _FAT_fat_nextCluster(partition, position.cluster); if (tempCluster == CLUSTER_EOF) { if (extendDirectory) { tempCluster = _FAT_fat_linkFreeClusterCleared (partition, position.cluster); if (!_FAT_fat_isValidCluster(partition, tempCluster)) { return false; // This will only happen if the disc is full } } else { return false; // Got to the end of the directory, not extending it } } position.cluster = tempCluster; } else if ((position.cluster == FAT16_ROOT_DIR_CLUSTER) && (position.sector == (partition->dataStart - partition->rootDirStart))) { return false; // Got to end of root directory, can't extend it } } *entryPosition = position; return true; } bool _FAT_directory_getNextEntry (PARTITION* partition, DIR_ENTRY* entry) { DIR_ENTRY_POSITION entryStart; DIR_ENTRY_POSITION entryEnd; uint8_t entryData[0x20]; ucs2_t lfn[MAX_LFN_LENGTH]; bool notFound, found; int lfnPos; uint8_t lfnChkSum, chkSum; bool lfnExists; int i; lfnChkSum = 0; entryStart = entry->dataEnd; // Make sure we are using the correct root directory, in case of FAT32 if (entryStart.cluster == FAT16_ROOT_DIR_CLUSTER) { entryStart.cluster = partition->rootDirCluster; } entryEnd = entryStart; lfnExists = false; found = false; notFound = false; while (!found && !notFound) { if (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) { notFound = true; } _FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector, entryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); if (entryData[DIR_ENTRY_attributes] == ATTRIB_LFN) { // It's an LFN if (entryData[LFN_offset_ordinal] & LFN_DEL) { lfnExists = false; } else if (entryData[LFN_offset_ordinal] & LFN_END) { // Last part of LFN, make sure it isn't deleted using previous if(Thanks MoonLight) entryStart = entryEnd; // This is the start of a directory entry lfnExists = true; lfnPos = (entryData[LFN_offset_ordinal] & ~LFN_END) * 13; if (lfnPos > MAX_LFN_LENGTH - 1) { lfnPos = MAX_LFN_LENGTH - 1; } lfn[lfnPos] = '\0'; // Set end of lfn to null character lfnChkSum = entryData[LFN_offset_checkSum]; } if (lfnChkSum != entryData[LFN_offset_checkSum]) { lfnExists = false; } if (lfnExists) { lfnPos = ((entryData[LFN_offset_ordinal] & ~LFN_END) - 1) * 13; if (lfnPos > LAST_LFN_POS) { // Force it within the buffer. Will corrupt the filename but prevent buffer overflows lfnPos = LAST_LFN_POS; } for (i = 0; i < 13; i++) { lfn[lfnPos + i] = entryData[LFN_offset_table[i]] | (entryData[LFN_offset_table[i]+1] << 8); } } } else if (entryData[DIR_ENTRY_attributes] & ATTRIB_VOL) { // This is a volume name, don't bother with it } else if (entryData[0] == DIR_ENTRY_LAST) { notFound = true; } else if ((entryData[0] != DIR_ENTRY_FREE) && (entryData[0] > 0x20) && !(entryData[DIR_ENTRY_attributes] & ATTRIB_VOL)) { if (lfnExists) { // Calculate file checksum chkSum = 0; for (i=0; i < 11; i++) { // NOTE: The operation is an unsigned char rotate right chkSum = ((chkSum & 1) ? 0x80 : 0) + (chkSum >> 1) + entryData[i]; } if (chkSum != lfnChkSum) { lfnExists = false; entry->filename[0] = '\0'; } } if (lfnExists) { if (_FAT_directory_ucs2tombs (entry->filename, lfn, MAX_FILENAME_LENGTH) == (size_t)-1) { // Failed to convert the file name to UTF-8. Maybe the wrong locale is set? return false; } } else { entryStart = entryEnd; _FAT_directory_entryGetAlias (entryData, entry->filename); } found = true; } } // If no file is found, return false if (notFound) { return false; } else { // Fill in the directory entry struct entry->dataStart = entryStart; entry->dataEnd = entryEnd; memcpy (entry->entryData, entryData, DIR_ENTRY_DATA_SIZE); return true; } } bool _FAT_directory_getFirstEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster) { entry->dataStart.cluster = dirCluster; entry->dataStart.sector = 0; entry->dataStart.offset = -1; // Start before the beginning of the directory entry->dataEnd = entry->dataStart; return _FAT_directory_getNextEntry (partition, entry); } bool _FAT_directory_getRootEntry (PARTITION* partition, DIR_ENTRY* entry) { entry->dataStart.cluster = 0; entry->dataStart.sector = 0; entry->dataStart.offset = 0; entry->dataEnd = entry->dataStart; memset (entry->filename, '\0', MAX_FILENAME_LENGTH); entry->filename[0] = '.'; memset (entry->entryData, 0, DIR_ENTRY_DATA_SIZE); memset (entry->entryData, ' ', 11); entry->entryData[0] = '.'; entry->entryData[DIR_ENTRY_attributes] = ATTRIB_DIR; u16_to_u8array (entry->entryData, DIR_ENTRY_cluster, partition->rootDirCluster); u16_to_u8array (entry->entryData, DIR_ENTRY_clusterHigh, partition->rootDirCluster >> 16); return true; } bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label) { DIR_ENTRY entry; DIR_ENTRY_POSITION entryEnd; uint8_t entryData[DIR_ENTRY_DATA_SIZE]; int i; bool end; _FAT_directory_getRootEntry(partition, &entry); entryEnd = entry.dataEnd; // Make sure we are using the correct root directory, in case of FAT32 if (entryEnd.cluster == FAT16_ROOT_DIR_CLUSTER) { entryEnd.cluster = partition->rootDirCluster; } label[0]='\0'; label[11]='\0'; end = false; //this entry should be among the first 3 entries in the root directory table, if not, then system can have trouble displaying the right volume label while(!end) { if (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) { end = true; } if(!_FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector, entryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE)) { //error reading return false; } if (entryData[DIR_ENTRY_attributes] == ATTRIB_VOL && entryData[0] != DIR_ENTRY_FREE) { for (i = 0; i < 11; i++) { label[i] = entryData[DIR_ENTRY_name + i]; } return true; } else if (entryData[0] == DIR_ENTRY_LAST) { end = true; } } return false; } bool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry) { DIR_ENTRY_POSITION entryStart = entry->dataStart; DIR_ENTRY_POSITION entryEnd = entry->dataEnd; bool entryStillValid; bool finished; ucs2_t lfn[MAX_LFN_LENGTH]; int i; int lfnPos; uint8_t entryData[DIR_ENTRY_DATA_SIZE]; memset (entry->filename, '\0', MAX_FILENAME_LENGTH); // Create an empty directory entry to overwrite the old ones with for ( entryStillValid = true, finished = false; entryStillValid && !finished; entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &entryStart, false)) { _FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector, entryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); if ((entryStart.cluster == entryEnd.cluster) && (entryStart.sector == entryEnd.sector) && (entryStart.offset == entryEnd.offset)) { // Copy the entry data and stop, since this is the last section of the directory entry memcpy (entry->entryData, entryData, DIR_ENTRY_DATA_SIZE); finished = true; } else { // Copy the long file name data lfnPos = ((entryData[LFN_offset_ordinal] & ~LFN_END) - 1) * 13; if (lfnPos > LAST_LFN_POS) { lfnPos = LAST_LFN_POS_CORRECTION; } for (i = 0; i < 13; i++) { lfn[lfnPos + i] = entryData[LFN_offset_table[i]] | (entryData[LFN_offset_table[i]+1] << 8); } } } if (!entryStillValid) { return false; } if ((entryStart.cluster == entryEnd.cluster) && (entryStart.sector == entryEnd.sector) && (entryStart.offset == entryEnd.offset)) { // Since the entry doesn't have a long file name, extract the short filename if (!_FAT_directory_entryGetAlias (entry->entryData, entry->filename)) { return false; } } else { // Encode the long file name into a multibyte string if (_FAT_directory_ucs2tombs (entry->filename, lfn, MAX_FILENAME_LENGTH) == (size_t)-1) { return false; } } return true; } bool _FAT_directory_entryFromPath (PARTITION* partition, DIR_ENTRY* entry, const char* path, const char* pathEnd) { size_t dirnameLength; const char* pathPosition; const char* nextPathPosition; uint32_t dirCluster; bool foundFile; char alias[MAX_ALIAS_LENGTH]; bool found, notFound; pathPosition = path; found = false; notFound = false; if (pathEnd == NULL) { // Set pathEnd to the end of the path string pathEnd = strchr (path, '\0'); } if (pathPosition[0] == DIR_SEPARATOR) { // Start at root directory dirCluster = partition->rootDirCluster; // Consume separator(s) while (pathPosition[0] == DIR_SEPARATOR) { pathPosition++; } // If the path is only specifying a directory in the form of "/" return it if (pathPosition >= pathEnd) { _FAT_directory_getRootEntry (partition, entry); found = true; } } else { // Start in current working directory dirCluster = partition->cwdCluster; } // If the path is only specifying a directory in the form "." // and this is the root directory, return it if ((dirCluster == partition->rootDirCluster) && (strcmp(".", pathPosition) == 0)) { _FAT_directory_getRootEntry (partition, entry); found = true; } while (!found && !notFound) { // Get the name of the next required subdirectory within the path nextPathPosition = strchr (pathPosition, DIR_SEPARATOR); if (nextPathPosition != NULL) { dirnameLength = nextPathPosition - pathPosition; } else { dirnameLength = strlen(pathPosition); } if (dirnameLength > MAX_FILENAME_LENGTH) { // The path is too long to bother with return false; } // Look for the directory within the path foundFile = _FAT_directory_getFirstEntry (partition, entry, dirCluster); while (foundFile && !found && !notFound) { // It hasn't already found the file // Check if the filename matches if ((dirnameLength == strnlen(entry->filename, MAX_FILENAME_LENGTH)) && (_FAT_directory_mbsncasecmp(pathPosition, entry->filename, dirnameLength) == 0)) { found = true; } // Check if the alias matches _FAT_directory_entryGetAlias (entry->entryData, alias); if ((dirnameLength == strnlen(alias, MAX_ALIAS_LENGTH)) && (strncasecmp(pathPosition, alias, dirnameLength) == 0)) { found = true; } if (found && !(entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) && (nextPathPosition != NULL)) { // Make sure that we aren't trying to follow a file instead of a directory in the path found = false; } if (!found) { foundFile = _FAT_directory_getNextEntry (partition, entry); } } if (!foundFile) { // Check that the search didn't get to the end of the directory notFound = true; found = false; } else if ((nextPathPosition == NULL) || (nextPathPosition >= pathEnd)) { // Check that we reached the end of the path found = true; } else if (entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) { dirCluster = _FAT_directory_entryGetCluster (partition, entry->entryData); pathPosition = nextPathPosition; // Consume separator(s) while (pathPosition[0] == DIR_SEPARATOR) { pathPosition++; } // The requested directory was found if (pathPosition >= pathEnd) { found = true; } else { found = false; } } } if (found && !notFound) { if (partition->filesysType == FS_FAT32 && (entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) && _FAT_directory_entryGetCluster (partition, entry->entryData) == CLUSTER_ROOT) { // On FAT32 it should specify an actual cluster for the root entry, // not cluster 0 as on FAT16 _FAT_directory_getRootEntry (partition, entry); } return true; } else { return false; } } bool _FAT_directory_removeEntry (PARTITION* partition, DIR_ENTRY* entry) { DIR_ENTRY_POSITION entryStart = entry->dataStart; DIR_ENTRY_POSITION entryEnd = entry->dataEnd; bool entryStillValid; bool finished; uint8_t entryData[DIR_ENTRY_DATA_SIZE]; // Create an empty directory entry to overwrite the old ones with for ( entryStillValid = true, finished = false; entryStillValid && !finished; entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &entryStart, false)) { _FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector, entryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); entryData[0] = DIR_ENTRY_FREE; _FAT_cache_writePartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector, entryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); if ((entryStart.cluster == entryEnd.cluster) && (entryStart.sector == entryEnd.sector) && (entryStart.offset == entryEnd.offset)) { finished = true; } } if (!entryStillValid) { return false; } return true; } static bool _FAT_directory_findEntryGap (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster, size_t size) { DIR_ENTRY_POSITION gapStart; DIR_ENTRY_POSITION gapEnd; uint8_t entryData[DIR_ENTRY_DATA_SIZE]; size_t dirEntryRemain; bool endOfDirectory, entryStillValid; // Scan Dir for free entry gapEnd.offset = 0; gapEnd.sector = 0; gapEnd.cluster = dirCluster; gapStart = gapEnd; entryStillValid = true; dirEntryRemain = size; endOfDirectory = false; while (entryStillValid && !endOfDirectory && (dirEntryRemain > 0)) { _FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, gapEnd.cluster) + gapEnd.sector, gapEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); if (entryData[0] == DIR_ENTRY_LAST) { gapStart = gapEnd; -- dirEntryRemain; endOfDirectory = true; } else if (entryData[0] == DIR_ENTRY_FREE) { if (dirEntryRemain == size) { gapStart = gapEnd; } -- dirEntryRemain; } else { dirEntryRemain = size; } if (!endOfDirectory && (dirEntryRemain > 0)) { entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &gapEnd, true); } } // Make sure the scanning didn't fail if (!entryStillValid) { return false; } // Save the start entry, since we know it is valid entry->dataStart = gapStart; if (endOfDirectory) { memset (entryData, DIR_ENTRY_LAST, DIR_ENTRY_DATA_SIZE); dirEntryRemain += 1; // Increase by one to take account of End Of Directory Marker while ((dirEntryRemain > 0) && entryStillValid) { // Get the gapEnd before incrementing it, so the second to last one is saved entry->dataEnd = gapEnd; // Increment gapEnd, moving onto the next entry entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &gapEnd, true); -- dirEntryRemain; // Fill the entry with blanks _FAT_cache_writePartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, gapEnd.cluster) + gapEnd.sector, gapEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); } if (!entryStillValid) { return false; } } else { entry->dataEnd = gapEnd; } return true; } static bool _FAT_directory_entryExists (PARTITION* partition, const char* name, uint32_t dirCluster) { DIR_ENTRY tempEntry; bool foundFile; char alias[MAX_ALIAS_LENGTH]; size_t dirnameLength; dirnameLength = strnlen(name, MAX_FILENAME_LENGTH); if (dirnameLength >= MAX_FILENAME_LENGTH) { return false; } // Make sure the entry doesn't already exist foundFile = _FAT_directory_getFirstEntry (partition, &tempEntry, dirCluster); while (foundFile) { // It hasn't already found the file // Check if the filename matches if ((dirnameLength == strnlen(tempEntry.filename, MAX_FILENAME_LENGTH)) && (_FAT_directory_mbsncasecmp(name, tempEntry.filename, dirnameLength) == 0)) { return true; } // Check if the alias matches _FAT_directory_entryGetAlias (tempEntry.entryData, alias); if ((strncasecmp(name, alias, MAX_ALIAS_LENGTH) == 0)) { return true; } foundFile = _FAT_directory_getNextEntry (partition, &tempEntry); } return false; } /* Creates an alias for a long file name. If the alias is not an exact match for the filename, it returns the number of characters in the alias. If the two names match, it returns 0. If there was an error, it returns -1. */ static int _FAT_directory_createAlias (char* alias, const char* lfn) { bool lossyConversion = false; // Set when the alias had to be modified to be valid int lfnPos = 0; int aliasPos = 0; wchar_t lfnChar; int oemChar; mbstate_t ps = {0}; int bytesUsed = 0; const char* lfnExt; int aliasExtLen; // Strip leading periods while (lfn[lfnPos] == '.') { lfnPos ++; lossyConversion = true; } // Primary portion of alias while (aliasPos < 8 && lfn[lfnPos] != '.' && lfn[lfnPos] != '\0') { bytesUsed = mbrtowc(&lfnChar, lfn + lfnPos, MAX_FILENAME_LENGTH - lfnPos, &ps); if (bytesUsed < 0) { return -1; } oemChar = wctob(towupper((wint_t)lfnChar)); if (wctob((wint_t)lfnChar) != oemChar) { // Case of letter was changed lossyConversion = true; } if (oemChar == ' ') { // Skip spaces in filename lossyConversion = true; lfnPos += bytesUsed; continue; } if (oemChar == EOF) { oemChar = '_'; // Replace unconvertable characters with underscores lossyConversion = true; } if (strchr (ILLEGAL_ALIAS_CHARACTERS, oemChar) != NULL) { // Invalid Alias character oemChar = '_'; // Replace illegal characters with underscores lossyConversion = true; } alias[aliasPos] = (char)oemChar; aliasPos++; lfnPos += bytesUsed; } if (lfn[lfnPos] != '.' && lfn[lfnPos] != '\0') { // Name was more than 8 characters long lossyConversion = true; } // Alias extension lfnExt = strrchr (lfn, '.'); if (lfnExt != NULL && lfnExt != strchr (lfn, '.')) { // More than one period in name lossyConversion = true; } if (lfnExt != NULL && lfnExt[1] != '\0') { lfnExt++; alias[aliasPos] = '.'; aliasPos++; memset (&ps, 0, sizeof(ps)); for (aliasExtLen = 0; aliasExtLen < MAX_ALIAS_EXT_LENGTH && *lfnExt != '\0'; aliasExtLen++) { bytesUsed = mbrtowc(&lfnChar, lfnExt, MAX_FILENAME_LENGTH - lfnPos, &ps); if (bytesUsed < 0) { return -1; } oemChar = wctob(towupper((wint_t)lfnChar)); if (wctob((wint_t)lfnChar) != oemChar) { // Case of letter was changed lossyConversion = true; } if (oemChar == ' ') { // Skip spaces in alias lossyConversion = true; lfnExt += bytesUsed; continue; } if (oemChar == EOF) { oemChar = '_'; // Replace unconvertable characters with underscores lossyConversion = true; } if (strchr (ILLEGAL_ALIAS_CHARACTERS, oemChar) != NULL) { // Invalid Alias character oemChar = '_'; // Replace illegal characters with underscores lossyConversion = true; } alias[aliasPos] = (char)oemChar; aliasPos++; lfnExt += bytesUsed; } if (*lfnExt != '\0') { // Extension was more than 3 characters long lossyConversion = true; } } alias[aliasPos] = '\0'; if (lossyConversion) { return aliasPos; } else { return 0; } } bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster) { size_t entrySize; uint8_t lfnEntry[DIR_ENTRY_DATA_SIZE]; int i,j; // Must be signed for use when decrementing in for loop char *tmpCharPtr; DIR_ENTRY_POSITION curEntryPos; bool entryStillValid; uint8_t aliasCheckSum = 0; char alias [MAX_ALIAS_LENGTH]; int aliasLen; int lfnLen; // Make sure the filename is not 0 length if (strnlen (entry->filename, MAX_FILENAME_LENGTH) < 1) { return false; } // Make sure the filename is at least a valid LFN lfnLen = _FAT_directory_lfnLength (entry->filename); if (lfnLen < 0) { return false; } // Remove trailing spaces for (i = strlen (entry->filename) - 1; (i > 0) && (entry->filename[i] == ' '); --i) { entry->filename[i] = '\0'; } // Remove leading spaces for (i = 0; (i < (int)strlen (entry->filename)) && (entry->filename[i] == ' '); ++i) ; if (i > 0) { memmove (entry->filename, entry->filename + i, strlen (entry->filename + i)); } // Remove junk in filename i = strlen (entry->filename); memset (entry->filename + i, '\0', MAX_FILENAME_LENGTH - i); // Make sure the entry doesn't already exist if (_FAT_directory_entryExists (partition, entry->filename, dirCluster)) { return false; } // Clear out alias, so we can generate a new one memset (entry->entryData, ' ', 11); if ( strncmp(entry->filename, ".", MAX_FILENAME_LENGTH) == 0) { // "." entry entry->entryData[0] = '.'; entrySize = 1; } else if ( strncmp(entry->filename, "..", MAX_FILENAME_LENGTH) == 0) { // ".." entry entry->entryData[0] = '.'; entry->entryData[1] = '.'; entrySize = 1; } else { // Normal file name aliasLen = _FAT_directory_createAlias (alias, entry->filename); if (aliasLen < 0) { return false; } else if (aliasLen == 0) { // It's a normal short filename entrySize = 1; } else { // It's a long filename with an alias entrySize = ((lfnLen + LFN_ENTRY_LENGTH - 1) / LFN_ENTRY_LENGTH) + 1; // Generate full alias for all cases except when the alias is simply an upper case version of the LFN // and there isn't already a file with that name if (strncasecmp (alias, entry->filename, MAX_ALIAS_LENGTH) != 0 || _FAT_directory_entryExists (partition, alias, dirCluster)) { // expand primary part to 8 characters long by padding the end with underscores i = MAX_ALIAS_PRI_LENGTH - 1; // Move extension to last 3 characters while (alias[i] != '.' && i > 0) i--; if (i > 0) { j = MAX_ALIAS_LENGTH - MAX_ALIAS_EXT_LENGTH - 2; // 1 char for '.', one for NUL, 3 for extension memmove (alias + j, alias + i, strlen(alias) - i); // Pad primary component memset (alias + i, '_', j - i); alias[MAX_ALIAS_LENGTH-1]=0; } // Generate numeric tail for (i = 1; i <= MAX_NUMERIC_TAIL; i++) { j = i; tmpCharPtr = alias + MAX_ALIAS_PRI_LENGTH - 1; while (j > 0) { *tmpCharPtr = '0' + (j % 10); // ASCII numeric value tmpCharPtr--; j /= 10; } *tmpCharPtr = '~'; if (!_FAT_directory_entryExists (partition, alias, dirCluster)) { break; } } if (i > MAX_NUMERIC_TAIL) { // Couldn't get a valid alias return false; } } } // Copy alias or short file name into directory entry data for (i = 0, j = 0; (j < 8) && (alias[i] != '.') && (alias[i] != '\0'); i++, j++) { entry->entryData[j] = alias[i]; } while (j < 8) { entry->entryData[j] = ' '; ++ j; } if (alias[i] == '.') { // Copy extension ++ i; while ((alias[i] != '\0') && (j < 11)) { entry->entryData[j] = alias[i]; ++ i; ++ j; } } while (j < 11) { entry->entryData[j] = ' '; ++ j; } // Generate alias checksum for (i=0; i < ALIAS_ENTRY_LENGTH; i++) { // NOTE: The operation is an unsigned char rotate right aliasCheckSum = ((aliasCheckSum & 1) ? 0x80 : 0) + (aliasCheckSum >> 1) + entry->entryData[i]; } } // Find or create space for the entry if (_FAT_directory_findEntryGap (partition, entry, dirCluster, entrySize) == false) { return false; } // Write out directory entry curEntryPos = entry->dataStart; { // lfn is only pushed onto the stack here, reducing overall stack usage ucs2_t lfn[MAX_LFN_LENGTH] = {0}; _FAT_directory_mbstoucs2 (lfn, entry->filename, MAX_LFN_LENGTH); for (entryStillValid = true, i = entrySize; entryStillValid && i > 0; entryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &curEntryPos, false), -- i ) { if (i > 1) { // Long filename entry lfnEntry[LFN_offset_ordinal] = (i - 1) | ((size_t)i == entrySize ? LFN_END : 0); for (j = 0; j < 13; j++) { if (lfn [(i - 2) * 13 + j] == '\0') { if ((j > 1) && (lfn [(i - 2) * 13 + (j-1)] == '\0')) { u16_to_u8array (lfnEntry, LFN_offset_table[j], 0xffff); // Padding } else { u16_to_u8array (lfnEntry, LFN_offset_table[j], 0x0000); // Terminating null character } } else { u16_to_u8array (lfnEntry, LFN_offset_table[j], lfn [(i - 2) * 13 + j]); } } lfnEntry[LFN_offset_checkSum] = aliasCheckSum; lfnEntry[LFN_offset_flag] = ATTRIB_LFN; lfnEntry[LFN_offset_reserved1] = 0; u16_to_u8array (lfnEntry, LFN_offset_reserved2, 0); _FAT_cache_writePartialSector (partition->cache, lfnEntry, _FAT_fat_clusterToSector(partition, curEntryPos.cluster) + curEntryPos.sector, curEntryPos.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); } else { // Alias & file data _FAT_cache_writePartialSector (partition->cache, entry->entryData, _FAT_fat_clusterToSector(partition, curEntryPos.cluster) + curEntryPos.sector, curEntryPos.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); } } } return true; } bool _FAT_directory_chdir (PARTITION* partition, const char* path) { DIR_ENTRY entry; if (!_FAT_directory_entryFromPath (partition, &entry, path, NULL)) { return false; } if (!(entry.entryData[DIR_ENTRY_attributes] & ATTRIB_DIR)) { return false; } partition->cwdCluster = _FAT_directory_entryGetCluster (partition, entry.entryData); return true; } void _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st) { // Fill in the stat struct // Some of the values are faked for the sake of compatibility st->st_dev = _FAT_disc_hostType(partition->disc); // The device is the 32bit ioType value st->st_ino = (ino_t)(_FAT_directory_entryGetCluster(partition, entry->entryData)); // The file serial number is the start cluster st->st_mode = (_FAT_directory_isDirectory(entry) ? S_IFDIR : S_IFREG) | (S_IRUSR | S_IRGRP | S_IROTH) | (_FAT_directory_isWritable (entry) ? (S_IWUSR | S_IWGRP | S_IWOTH) : 0); // Mode bits based on dirEntry ATTRIB byte st->st_nlink = 1; // Always one hard link on a FAT file st->st_uid = 1; // Faked for FAT st->st_gid = 2; // Faked for FAT st->st_rdev = st->st_dev; st->st_size = u8array_to_u32 (entry->entryData, DIR_ENTRY_fileSize); // File size st->st_atime = _FAT_filetime_to_time_t ( 0, u8array_to_u16 (entry->entryData, DIR_ENTRY_aDate) ); #ifndef LIBFAT_PC st->st_spare1 = 0; #endif st->st_mtime = _FAT_filetime_to_time_t ( u8array_to_u16 (entry->entryData, DIR_ENTRY_mTime), u8array_to_u16 (entry->entryData, DIR_ENTRY_mDate) ); #ifndef LIBFAT_PC st->st_spare2 = 0; #endif st->st_ctime = _FAT_filetime_to_time_t ( u8array_to_u16 (entry->entryData, DIR_ENTRY_cTime), u8array_to_u16 (entry->entryData, DIR_ENTRY_cDate) ); #ifndef LIBFAT_PC st->st_spare3 = 0; st->st_blksize = BYTES_PER_READ; // Prefered file I/O block size st->st_blocks = (st->st_size + BYTES_PER_READ - 1) / BYTES_PER_READ; // File size in blocks st->st_spare4[0] = 0; st->st_spare4[1] = 0; #endif } desmume-0.9.9/src/utils/libfat/fatfile.cpp0000644000175000017500000010125512140261630021227 0ustar guillaumeguillaume/* fatfile.c Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2009-10-23 oggzee: fixes for cluster aligned file size (write, truncate, seek) */ #include "fatfile.h" #include #include #include #include #ifndef _MSC_VER #include #endif #include "cache.h" #include "file_allocation_table.h" #include "bit_ops.h" #include "filetime.h" #include "lock.h" intptr_t _FAT_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode) { PARTITION* partition = NULL; bool fileExists; DIR_ENTRY dirEntry; const char* pathEnd; uint32_t dirCluster; FILE_STRUCT* file = (FILE_STRUCT*) fileStruct; partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } // Determine which mode the file is openned for if ((flags & 0x03) == O_RDONLY) { // Open the file for read-only access file->read = true; file->write = false; file->append = false; } else if ((flags & 0x03) == O_WRONLY) { // Open file for write only access file->read = false; file->write = true; file->append = false; } else if ((flags & 0x03) == O_RDWR) { // Open file for read/write access file->read = true; file->write = true; file->append = false; } else { r->_errno = EACCES; return -1; } // Make sure we aren't trying to write to a read-only disc if (file->write && partition->readOnly) { r->_errno = EROFS; return -1; } // Search for the file on the disc _FAT_lock(&partition->lock); fileExists = _FAT_directory_entryFromPath (partition, &dirEntry, path, NULL); // The file shouldn't exist if we are trying to create it if ((flags & O_CREAT) && (flags & O_EXCL) && fileExists) { _FAT_unlock(&partition->lock); r->_errno = EEXIST; return -1; } // It should not be a directory if we're openning a file, if (fileExists && _FAT_directory_isDirectory(&dirEntry)) { _FAT_unlock(&partition->lock); r->_errno = EISDIR; return -1; } // We haven't modified the file yet file->modified = false; // If the file doesn't exist, create it if we're allowed to if (!fileExists) { if (flags & O_CREAT) { if (partition->readOnly) { // We can't write to a read-only partition _FAT_unlock(&partition->lock); r->_errno = EROFS; return -1; } // Create the file // Get the directory it has to go in pathEnd = strrchr (path, DIR_SEPARATOR); if (pathEnd == NULL) { // No path was specified dirCluster = partition->cwdCluster; pathEnd = path; } else { // Path was specified -- get the right dirCluster // Recycling dirEntry, since it needs to be recreated anyway if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, pathEnd) || !_FAT_directory_isDirectory(&dirEntry)) { _FAT_unlock(&partition->lock); r->_errno = ENOTDIR; return -1; } dirCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData); // Move the pathEnd past the last DIR_SEPARATOR pathEnd += 1; } // Create the entry data strncpy (dirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1); memset (dirEntry.entryData, 0, DIR_ENTRY_DATA_SIZE); // Set the creation time and date dirEntry.entryData[DIR_ENTRY_cTime_ms] = 0; u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cTime, _FAT_filetime_getTimeFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cDate, _FAT_filetime_getDateFromRTC()); if (!_FAT_directory_addEntry (partition, &dirEntry, dirCluster)) { _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } // File entry is modified file->modified = true; } else { // file doesn't exist, and we aren't creating it _FAT_unlock(&partition->lock); r->_errno = ENOENT; return -1; } } file->filesize = u8array_to_u32 (dirEntry.entryData, DIR_ENTRY_fileSize); /* Allow LARGEFILEs with undefined results // Make sure that the file size can fit in the available space if (!(flags & O_LARGEFILE) && (file->filesize >= (1<<31))) { r->_errno = EFBIG; return -1; } */ // Make sure we aren't trying to write to a read-only file if (file->write && !_FAT_directory_isWritable(&dirEntry)) { _FAT_unlock(&partition->lock); r->_errno = EROFS; return -1; } // Associate this file with a particular partition file->partition = partition; file->startCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData); // Truncate the file if requested if ((flags & O_TRUNC) && file->write && (file->startCluster != 0)) { _FAT_fat_clearLinks (partition, file->startCluster); file->startCluster = CLUSTER_FREE; file->filesize = 0; // File is modified since we just cut it all off file->modified = true; } // Remember the position of this file's directory entry file->dirEntryStart = dirEntry.dataStart; // Points to the start of the LFN entries of a file, or the alias for no LFN file->dirEntryEnd = dirEntry.dataEnd; // Reset read/write pointer file->currentPosition = 0; file->rwPosition.cluster = file->startCluster; file->rwPosition.sector = 0; file->rwPosition.byte = 0; if (flags & O_APPEND) { file->append = true; // Set append pointer to the end of the file file->appendPosition.cluster = _FAT_fat_lastCluster (partition, file->startCluster); file->appendPosition.sector = (file->filesize % partition->bytesPerCluster) / BYTES_PER_READ; file->appendPosition.byte = file->filesize % BYTES_PER_READ; // Check if the end of the file is on the end of a cluster if ( (file->filesize > 0) && ((file->filesize % partition->bytesPerCluster)==0) ){ // Set flag to allocate a new cluster file->appendPosition.sector = partition->sectorsPerCluster; file->appendPosition.byte = 0; } } else { file->append = false; // Use something sane for the append pointer, so the whole file struct contains known values file->appendPosition = file->rwPosition; } file->inUse = true; // Insert this file into the double-linked list of open files partition->openFileCount += 1; if (partition->firstOpenFile) { file->nextOpenFile = partition->firstOpenFile; partition->firstOpenFile->prevOpenFile = file; } else { file->nextOpenFile = NULL; } file->prevOpenFile = NULL; partition->firstOpenFile = file; _FAT_unlock(&partition->lock); return (intptr_t) file; } /* Synchronizes the file data to disc. Does no locking of its own -- lock the partition before calling. Returns 0 on success, an error code on failure. */ int _FAT_syncToDisc (FILE_STRUCT* file) { uint8_t dirEntryData[DIR_ENTRY_DATA_SIZE]; if (!file || !file->inUse) { return EBADF; } if (file->write && file->modified) { // Load the old entry _FAT_cache_readPartialSector (file->partition->cache, dirEntryData, _FAT_fat_clusterToSector(file->partition, file->dirEntryEnd.cluster) + file->dirEntryEnd.sector, file->dirEntryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); // Write new data to the directory entry // File size u32_to_u8array (dirEntryData, DIR_ENTRY_fileSize, file->filesize); // Start cluster u16_to_u8array (dirEntryData, DIR_ENTRY_cluster, file->startCluster); u16_to_u8array (dirEntryData, DIR_ENTRY_clusterHigh, file->startCluster >> 16); // Modification time and date u16_to_u8array (dirEntryData, DIR_ENTRY_mTime, _FAT_filetime_getTimeFromRTC()); u16_to_u8array (dirEntryData, DIR_ENTRY_mDate, _FAT_filetime_getDateFromRTC()); // Access date u16_to_u8array (dirEntryData, DIR_ENTRY_aDate, _FAT_filetime_getDateFromRTC()); // Set archive attribute dirEntryData[DIR_ENTRY_attributes] |= ATTRIB_ARCH; // Write the new entry _FAT_cache_writePartialSector (file->partition->cache, dirEntryData, _FAT_fat_clusterToSector(file->partition, file->dirEntryEnd.cluster) + file->dirEntryEnd.sector, file->dirEntryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); // Flush any sectors in the disc cache if (!_FAT_cache_flush(file->partition->cache)) { return EIO; } } file->modified = false; return 0; } intptr_t _FAT_close_r (struct _reent *r, intptr_t fd) { FILE_STRUCT* file = (FILE_STRUCT*) fd; intptr_t ret = 0; if (!file->inUse) { r->_errno = EBADF; return -1; } _FAT_lock(&file->partition->lock); if (file->write) { ret = _FAT_syncToDisc (file); if (ret != 0) { r->_errno = ret; ret = -1; } } file->inUse = false; // Remove this file from the double-linked list of open files file->partition->openFileCount -= 1; if (file->nextOpenFile) { file->nextOpenFile->prevOpenFile = file->prevOpenFile; } if (file->prevOpenFile) { file->prevOpenFile->nextOpenFile = file->nextOpenFile; } else { file->partition->firstOpenFile = file->nextOpenFile; } _FAT_unlock(&file->partition->lock); return ret; } ssize_t _FAT_read_r (struct _reent *r, intptr_t fd, char *ptr, size_t len) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; CACHE* cache; FILE_POSITION position; uint32_t tempNextCluster; unsigned int tempVar; size_t remain; bool flagNoError = true; // Short circuit cases where len is 0 (or less) if (len <= 0) { return 0; } // Make sure we can actually read from the file if ((file == NULL) || !file->inUse || !file->read) { r->_errno = EBADF; return -1; } partition = file->partition; _FAT_lock(&partition->lock); // Don't try to read if the read pointer is past the end of file if (file->currentPosition >= file->filesize || file->startCluster == CLUSTER_FREE) { r->_errno = EOVERFLOW; _FAT_unlock(&partition->lock); return 0; } // Don't read past end of file if (len + file->currentPosition > file->filesize) { r->_errno = EOVERFLOW; len = file->filesize - file->currentPosition; } remain = len; position = file->rwPosition; cache = file->partition->cache; // Align to sector tempVar = BYTES_PER_READ - position.byte; if (tempVar > remain) { tempVar = remain; } if ((tempVar < BYTES_PER_READ) && flagNoError) { _FAT_cache_readPartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, tempVar); remain -= tempVar; ptr += tempVar; position.byte += tempVar; if (position.byte >= BYTES_PER_READ) { position.byte = 0; position.sector++; } } // align to cluster // tempVar is number of sectors to read if (remain > (partition->sectorsPerCluster - position.sector) * BYTES_PER_READ) { tempVar = partition->sectorsPerCluster - position.sector; } else { tempVar = remain / BYTES_PER_READ; } if ((tempVar > 0) && flagNoError) { if (! _FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, tempVar, ptr)) { flagNoError = false; r->_errno = EIO; } else { ptr += tempVar * BYTES_PER_READ; remain -= tempVar * BYTES_PER_READ; position.sector += tempVar; } } // Move onto next cluster // It should get to here without reading anything if a cluster is due to be allocated if ((position.sector >= partition->sectorsPerCluster) && flagNoError) { tempNextCluster = _FAT_fat_nextCluster(partition, position.cluster); if ((remain == 0) && (tempNextCluster == CLUSTER_EOF)) { position.sector = partition->sectorsPerCluster; } else if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { r->_errno = EIO; flagNoError = false; } else { position.sector = 0; position.cluster = tempNextCluster; } } // Read in whole clusters, contiguous blocks at a time while ((remain >= partition->bytesPerCluster) && flagNoError) { uint32_t chunkEnd; uint32_t nextChunkStart = position.cluster; size_t chunkSize = 0; do { chunkEnd = nextChunkStart; nextChunkStart = _FAT_fat_nextCluster (partition, chunkEnd); chunkSize += partition->bytesPerCluster; } while ((nextChunkStart == chunkEnd + 1) && #ifdef LIMIT_SECTORS (chunkSize + partition->bytesPerCluster <= LIMIT_SECTORS * BYTES_PER_READ) && #endif (chunkSize + partition->bytesPerCluster <= remain)); if (!_FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster), chunkSize / BYTES_PER_READ, ptr)) { flagNoError = false; r->_errno = EIO; break; } ptr += chunkSize; remain -= chunkSize; // Advance to next cluster if ((remain == 0) && (nextChunkStart == CLUSTER_EOF)) { position.sector = partition->sectorsPerCluster; position.cluster = chunkEnd; } else if (!_FAT_fat_isValidCluster(partition, nextChunkStart)) { r->_errno = EIO; flagNoError = false; } else { position.sector = 0; position.cluster = nextChunkStart; } } // Read remaining sectors tempVar = remain / BYTES_PER_READ; // Number of sectors left if ((tempVar > 0) && flagNoError) { if (!_FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster), tempVar, ptr)) { flagNoError = false; r->_errno = EIO; } else { ptr += tempVar * BYTES_PER_READ; remain -= tempVar * BYTES_PER_READ; position.sector += tempVar; } } // Last remaining sector // Check if anything is left if ((remain > 0) && flagNoError) { _FAT_cache_readPartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain); position.byte += remain; remain = 0; } // Length read is the wanted length minus the stuff not read len = len - remain; // Update file information file->rwPosition = position; file->currentPosition += len; _FAT_unlock(&partition->lock); return len; } // if current position is on the cluster border and more data has to be written // then get next cluster or allocate next cluster // this solves the over-allocation problems when file size is aligned to cluster size // return true on succes, false on error static bool _FAT_check_position_for_next_cluster(struct _reent *r, FILE_POSITION *position, PARTITION* partition, size_t remain, bool *flagNoError) { uint32_t tempNextCluster; // do nothing if no more data to write if (remain == 0) return true; if (flagNoError && *flagNoError == false) return false; if ((remain < 0) || (position->sector > partition->sectorsPerCluster)) { // invalid arguments - internal error r->_errno = EINVAL; goto err; } if (position->sector == partition->sectorsPerCluster) { // need to advance to next cluster tempNextCluster = _FAT_fat_nextCluster(partition, position->cluster); if ((tempNextCluster == CLUSTER_EOF) || (tempNextCluster == CLUSTER_FREE)) { // Ran out of clusters so get a new one tempNextCluster = _FAT_fat_linkFreeCluster(partition, position->cluster); } if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort r->_errno = ENOSPC; goto err; } position->sector = 0; position->cluster = tempNextCluster; } return true; err: if (flagNoError) *flagNoError = false; return false; } /* Extend a file so that the size is the same as the rwPosition */ static bool _FAT_file_extend_r (struct _reent *r, FILE_STRUCT* file) { PARTITION* partition = file->partition; CACHE* cache = file->partition->cache; FILE_POSITION position; uint8_t zeroBuffer [BYTES_PER_READ] = {0}; uint32_t remain; uint32_t tempNextCluster; unsigned int sector; position.byte = file->filesize % BYTES_PER_READ; position.sector = (file->filesize % partition->bytesPerCluster) / BYTES_PER_READ; // It is assumed that there is always a startCluster // This will be true when _FAT_file_extend_r is called from _FAT_write_r position.cluster = _FAT_fat_lastCluster (partition, file->startCluster); remain = file->currentPosition - file->filesize; if ((remain > 0) && (file->filesize > 0) && (position.sector == 0) && (position.byte == 0)) { // Get a new cluster on the edge of a cluster boundary tempNextCluster = _FAT_fat_linkFreeCluster(partition, position.cluster); if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort r->_errno = ENOSPC; return false; } position.cluster = tempNextCluster; position.sector = 0; } if (remain + position.byte < BYTES_PER_READ) { // Only need to clear to the end of the sector _FAT_cache_writePartialSector (cache, zeroBuffer, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, remain); position.byte += remain; } else { if (position.byte > 0) { _FAT_cache_writePartialSector (cache, zeroBuffer, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, BYTES_PER_READ - position.byte); remain -= (BYTES_PER_READ - position.byte); position.byte = 0; position.sector ++; } while (remain >= BYTES_PER_READ) { if (position.sector >= partition->sectorsPerCluster) { position.sector = 0; // Ran out of clusters so get a new one tempNextCluster = _FAT_fat_linkFreeCluster(partition, position.cluster); if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort r->_errno = ENOSPC; return false; } position.cluster = tempNextCluster; } sector = _FAT_fat_clusterToSector (partition, position.cluster) + position.sector; _FAT_cache_writeSectors (cache, sector, 1, zeroBuffer); remain -= BYTES_PER_READ; position.sector ++; } if (!_FAT_check_position_for_next_cluster(r, &position, partition, remain, NULL)) { // error already marked return false; } if (remain > 0) { _FAT_cache_writePartialSector (cache, zeroBuffer, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain); position.byte = remain; } } file->rwPosition = position; file->filesize = file->currentPosition; return true; } ssize_t _FAT_write_r (struct _reent *r, intptr_t fd, const char *ptr, size_t len) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; CACHE* cache; FILE_POSITION position; uint32_t tempNextCluster; unsigned int tempVar; size_t remain; bool flagNoError = true; bool flagAppending = false; // Make sure we can actually write to the file if ((file == NULL) || !file->inUse || !file->write) { r->_errno = EBADF; return -1; } partition = file->partition; cache = file->partition->cache; _FAT_lock(&partition->lock); // Only write up to the maximum file size, taking into account wrap-around of ints if (len + file->filesize > FILE_MAX_SIZE || len + file->filesize < file->filesize) { len = FILE_MAX_SIZE - file->filesize; } // Short circuit cases where len is 0 (or less) if (len <= 0) { _FAT_unlock(&partition->lock); return 0; } remain = len; // Get a new cluster for the start of the file if required if (file->startCluster == CLUSTER_FREE) { tempNextCluster = _FAT_fat_linkFreeCluster (partition, CLUSTER_FREE); if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort immediately _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } file->startCluster = tempNextCluster; // Appending starts at the begining for a 0 byte file file->appendPosition.cluster = file->startCluster; file->appendPosition.sector = 0; file->appendPosition.byte = 0; file->rwPosition.cluster = file->startCluster; file->rwPosition.sector = 0; file->rwPosition.byte = 0; } if (file->append) { position = file->appendPosition; flagAppending = true; } else { // If the write pointer is past the end of the file, extend the file to that size if (file->currentPosition > file->filesize) { if (!_FAT_file_extend_r (r, file)) { _FAT_unlock(&partition->lock); return -1; } } // Write at current read pointer position = file->rwPosition; // If it is writing past the current end of file, set appending flag if (len + file->currentPosition > file->filesize) { flagAppending = true; } } // Move onto next cluster if needed _FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError); // Align to sector tempVar = BYTES_PER_READ - position.byte; if (tempVar > remain) { tempVar = remain; } if ((tempVar < BYTES_PER_READ) && flagNoError) { // Write partial sector to disk _FAT_cache_writePartialSector (cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, tempVar); remain -= tempVar; ptr += tempVar; position.byte += tempVar; // Move onto next sector if (position.byte >= BYTES_PER_READ) { position.byte = 0; position.sector ++; } } // Align to cluster // tempVar is number of sectors to write if (remain > (partition->sectorsPerCluster - position.sector) * BYTES_PER_READ) { tempVar = partition->sectorsPerCluster - position.sector; } else { tempVar = remain / BYTES_PER_READ; } if ((tempVar > 0 && tempVar < partition->sectorsPerCluster) && flagNoError) { if (!_FAT_cache_writeSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, tempVar, ptr)) { flagNoError = false; r->_errno = EIO; } else { ptr += tempVar * BYTES_PER_READ; remain -= tempVar * BYTES_PER_READ; position.sector += tempVar; } } // Write whole clusters while ((remain >= partition->bytesPerCluster) && flagNoError) { // allocate next cluster _FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError); if (!flagNoError) break; // set indexes to the current position uint32_t chunkEnd = position.cluster; uint32_t nextChunkStart = position.cluster; size_t chunkSize = partition->bytesPerCluster; FILE_POSITION next_position = position; // group consecutive clusters while (flagNoError && #ifdef LIMIT_SECTORS (chunkSize + partition->bytesPerCluster <= LIMIT_SECTORS * BYTES_PER_READ) && #endif (chunkSize + partition->bytesPerCluster < remain)) { // pretend to use up all sectors in next_position next_position.sector = partition->sectorsPerCluster; // get or allocate next cluster _FAT_check_position_for_next_cluster(r, &next_position, partition, remain - chunkSize, &flagNoError); if (!flagNoError) break; // exit loop on error nextChunkStart = next_position.cluster; if (nextChunkStart != chunkEnd + 1) break; // exit loop if not consecutive chunkEnd = nextChunkStart; chunkSize += partition->bytesPerCluster; } if ( !_FAT_cache_writeSectors (cache, _FAT_fat_clusterToSector(partition, position.cluster), chunkSize / BYTES_PER_READ, ptr)) { flagNoError = false; r->_errno = EIO; break; } ptr += chunkSize; remain -= chunkSize; if ((chunkEnd != nextChunkStart) && _FAT_fat_isValidCluster(partition, nextChunkStart)) { // new cluster is already allocated (because it was not consecutive) position.cluster = nextChunkStart; position.sector = 0; } else { // Allocate a new cluster when next writing the file position.cluster = chunkEnd; position.sector = partition->sectorsPerCluster; } } // allocate next cluster if needed _FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError); // Write remaining sectors tempVar = remain / BYTES_PER_READ; // Number of sectors left if ((tempVar > 0) && flagNoError) { if (!_FAT_cache_writeSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster), tempVar, ptr)) { flagNoError = false; r->_errno = EIO; } else { ptr += tempVar * BYTES_PER_READ; remain -= tempVar * BYTES_PER_READ; position.sector += tempVar; } } // Last remaining sector if ((remain > 0) && flagNoError) { if (flagAppending) { _FAT_cache_eraseWritePartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain); } else { _FAT_cache_writePartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain); } position.byte += remain; remain = 0; } // Amount written is the originally requested amount minus stuff remaining len = len - remain; // Update file information file->modified = true; if (file->append) { // Appending doesn't affect the read pointer file->appendPosition = position; file->filesize += len; } else { // Writing also shifts the read pointer file->rwPosition = position; file->currentPosition += len; if (file->filesize < file->currentPosition) { file->filesize = file->currentPosition; } } _FAT_unlock(&partition->lock); return len; } off_t _FAT_seek_r (struct _reent *r, intptr_t fd, off_t pos, int dir) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; uint32_t cluster, nextCluster; int clusCount; off_t newPosition; uint32_t position; if ((file == NULL) || (file->inUse == false)) { // invalid file r->_errno = EBADF; return -1; } partition = file->partition; _FAT_lock(&partition->lock); switch (dir) { case SEEK_SET: newPosition = pos; break; case SEEK_CUR: newPosition = (off_t)file->currentPosition + pos; break; case SEEK_END: newPosition = (off_t)file->filesize + pos; break; default: _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } if ((pos > 0) && (newPosition < 0)) { _FAT_unlock(&partition->lock); r->_errno = EOVERFLOW; return -1; } // newPosition can only be larger than the FILE_MAX_SIZE on platforms where // off_t is larger than 32 bits. if (newPosition < 0 || ((sizeof(newPosition) > 4) && newPosition > (off_t)FILE_MAX_SIZE)) { _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } position = (uint32_t)newPosition; // Only change the read/write position if it is within the bounds of the current filesize, // or at the very edge of the file if (position <= file->filesize && file->startCluster != CLUSTER_FREE) { // Calculate where the correct cluster is // how many clusters from start of file clusCount = position / partition->bytesPerCluster; cluster = file->startCluster; if (position >= file->currentPosition) { // start from current cluster int currentCount = file->currentPosition / partition->bytesPerCluster; if (file->rwPosition.sector == partition->sectorsPerCluster) { currentCount--; } clusCount -= currentCount; cluster = file->rwPosition.cluster; } // Calculate the sector and byte of the current position, // and store them file->rwPosition.sector = (position % partition->bytesPerCluster) / BYTES_PER_READ; file->rwPosition.byte = position % BYTES_PER_READ; nextCluster = _FAT_fat_nextCluster (partition, cluster); while ((clusCount > 0) && (nextCluster != CLUSTER_FREE) && (nextCluster != CLUSTER_EOF)) { clusCount--; cluster = nextCluster; nextCluster = _FAT_fat_nextCluster (partition, cluster); } // Check if ran out of clusters and it needs to allocate a new one if (clusCount > 0) { if ((clusCount == 1) && (file->filesize == position) && (file->rwPosition.sector == 0)) { // Set flag to allocate a new cluster file->rwPosition.sector = partition->sectorsPerCluster; file->rwPosition.byte = 0; } else { _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } } file->rwPosition.cluster = cluster; } // Save position file->currentPosition = position; _FAT_unlock(&partition->lock); return position; } int _FAT_fstat_r (struct _reent *r, intptr_t fd, struct stat *st) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; DIR_ENTRY fileEntry; if ((file == NULL) || (file->inUse == false)) { // invalid file r->_errno = EBADF; return -1; } partition = file->partition; _FAT_lock(&partition->lock); // Get the file's entry data fileEntry.dataStart = file->dirEntryStart; fileEntry.dataEnd = file->dirEntryEnd; if (!_FAT_directory_entryFromPosition (partition, &fileEntry)) { _FAT_unlock(&partition->lock); r->_errno = EIO; return -1; } // Fill in the stat struct _FAT_directory_entryStat (partition, &fileEntry, st); // Fix stats that have changed since the file was openned st->st_ino = (ino_t)(file->startCluster); // The file serial number is the start cluster st->st_size = file->filesize; // File size _FAT_unlock(&partition->lock); return 0; } int _FAT_ftruncate_r (struct _reent *r, intptr_t fd, off_t len) { FILE_STRUCT* file = (FILE_STRUCT*) fd; PARTITION* partition; int ret=0; uint32_t newSize = (uint32_t)len; if (len < 0) { // Trying to truncate to a negative size r->_errno = EINVAL; return -1; } if ((sizeof(len) > 4) && len > (off_t)FILE_MAX_SIZE) { // Trying to extend the file beyond what FAT supports r->_errno = EFBIG; return -1; } if (!file || !file->inUse) { // invalid file r->_errno = EBADF; return -1; } if (!file->write) { // Read-only file r->_errno = EINVAL; return -1; } partition = file->partition; _FAT_lock(&partition->lock); if (newSize > file->filesize) { // Expanding the file FILE_POSITION savedPosition; uint32_t savedOffset; // Get a new cluster for the start of the file if required if (file->startCluster == CLUSTER_FREE) { uint32_t tempNextCluster = _FAT_fat_linkFreeCluster (partition, CLUSTER_FREE); if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) { // Couldn't get a cluster, so abort immediately _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } file->startCluster = tempNextCluster; file->rwPosition.cluster = file->startCluster; file->rwPosition.sector = 0; file->rwPosition.byte = 0; } // Save the read/write pointer savedPosition = file->rwPosition; savedOffset = file->currentPosition; // Set the position to the new size file->currentPosition = newSize; // Extend the file to the new position if (!_FAT_file_extend_r (r, file)) { ret = -1; } // Set the append position to the new rwPointer if (file->append) { file->appendPosition = file->rwPosition; } // Restore the old rwPointer; file->rwPosition = savedPosition; file->currentPosition = savedOffset; } else if (newSize < file->filesize){ // Shrinking the file if (len == 0) { // Cutting the file down to nothing, clear all clusters used _FAT_fat_clearLinks (partition, file->startCluster); file->startCluster = CLUSTER_FREE; file->appendPosition.cluster = CLUSTER_FREE; file->appendPosition.sector = 0; file->appendPosition.byte = 0; } else { // Trimming the file down to the required size unsigned int chainLength; uint32_t lastCluster; // Drop the unneeded end of the cluster chain. // If the end falls on a cluster boundary, drop that cluster too, // then set a flag to allocate a cluster as needed chainLength = ((newSize-1) / partition->bytesPerCluster) + 1; lastCluster = _FAT_fat_trimChain (partition, file->startCluster, chainLength); if (file->append) { file->appendPosition.byte = newSize % BYTES_PER_READ; // Does the end of the file fall on the edge of a cluster? if (newSize % partition->bytesPerCluster == 0) { // Set a flag to allocate a new cluster file->appendPosition.sector = partition->sectorsPerCluster; } else { file->appendPosition.sector = (newSize % partition->bytesPerCluster) / BYTES_PER_READ; } file->appendPosition.cluster = lastCluster; } } } else { // Truncating to same length, so don't do anything } file->filesize = newSize; file->modified = true; _FAT_unlock(&partition->lock); return ret; } int _FAT_fsync_r (struct _reent *r, intptr_t fd) { FILE_STRUCT* file = (FILE_STRUCT*) fd; int ret = 0; if (!file->inUse) { r->_errno = EBADF; return -1; } _FAT_lock(&file->partition->lock); ret = _FAT_syncToDisc (file); if (ret != 0) { r->_errno = ret; ret = -1; } _FAT_unlock(&file->partition->lock); return ret; } desmume-0.9.9/src/utils/libfat/filetime.h0000644000175000017500000000333212140261630021055 0ustar guillaumeguillaume/* filetime.h Conversion of file time and date values to various other types Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FILETIME_H #define _FILETIME_H #include "common.h" #include uint16_t _FAT_filetime_getTimeFromRTC (void); uint16_t _FAT_filetime_getDateFromRTC (void); time_t _FAT_filetime_to_time_t (uint16_t t, uint16_t d); #endif // _FILETIME_H desmume-0.9.9/src/utils/libfat/lock.cpp0000644000175000017500000000054112140261630020541 0ustar guillaumeguillaume#include "common.h" #ifndef USE_LWP_LOCK #ifndef mutex_t typedef int mutex_t; #endif void _ATTR_WEAK_ _FAT_lock_init(mutex_t *mutex) { return; } void _ATTR_WEAK_ _FAT_lock_deinit(mutex_t *mutex) { return; } void _ATTR_WEAK_ _FAT_lock(mutex_t *mutex) { return; } void _ATTR_WEAK_ _FAT_unlock(mutex_t *mutex) { return; } #endif // USE_LWP_LOCK desmume-0.9.9/src/utils/libfat/file_allocation_table.cpp0000644000175000017500000002635012140261630024112 0ustar guillaumeguillaume/* file_allocation_table.c Reading, writing and manipulation of the FAT structure on a FAT partition Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "file_allocation_table.h" #include "partition.h" #include /* Gets the cluster linked from input cluster */ uint32_t _FAT_fat_nextCluster(PARTITION* partition, uint32_t cluster) { uint32_t nextCluster = CLUSTER_FREE; sec_t sector; int offset; if (cluster == CLUSTER_FREE) { return CLUSTER_FREE; } switch (partition->filesysType) { case FS_UNKNOWN: return CLUSTER_ERROR; break; case FS_FAT12: { u32 nextCluster_h; sector = partition->fat.fatStart + (((cluster * 3) / 2) / BYTES_PER_READ); offset = ((cluster * 3) / 2) % BYTES_PER_READ; _FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u8)); offset++; if (offset >= BYTES_PER_READ) { offset = 0; sector++; } nextCluster_h = 0; _FAT_cache_readLittleEndianValue (partition->cache, &nextCluster_h, sector, offset, sizeof(u8)); nextCluster |= (nextCluster_h << 8); if (cluster & 0x01) { nextCluster = nextCluster >> 4; } else { nextCluster &= 0x0FFF; } if (nextCluster >= 0x0FF7) { nextCluster = CLUSTER_EOF; } break; } case FS_FAT16: sector = partition->fat.fatStart + ((cluster << 1) / BYTES_PER_READ); offset = (cluster % (BYTES_PER_READ >> 1)) << 1; _FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u16)); if (nextCluster >= 0xFFF7) { nextCluster = CLUSTER_EOF; } break; case FS_FAT32: sector = partition->fat.fatStart + ((cluster << 2) / BYTES_PER_READ); offset = (cluster % (BYTES_PER_READ >> 2)) << 2; _FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u32)); if (nextCluster >= 0x0FFFFFF7) { nextCluster = CLUSTER_EOF; } break; default: return CLUSTER_ERROR; break; } return nextCluster; } /* writes value into the correct offset within a partition's FAT, based on the cluster number. */ static bool _FAT_fat_writeFatEntry (PARTITION* partition, uint32_t cluster, uint32_t value) { sec_t sector; int offset; uint32_t oldValue; if ((cluster < CLUSTER_FIRST) || (cluster > partition->fat.lastCluster /* This will catch CLUSTER_ERROR */)) { return false; } switch (partition->filesysType) { case FS_UNKNOWN: return false; break; case FS_FAT12: sector = partition->fat.fatStart + (((cluster * 3) / 2) / BYTES_PER_READ); offset = ((cluster * 3) / 2) % BYTES_PER_READ; if (cluster & 0x01) { _FAT_cache_readLittleEndianValue (partition->cache, &oldValue, sector, offset, sizeof(u8)); value = (value << 4) | (oldValue & 0x0F); _FAT_cache_writeLittleEndianValue (partition->cache, value & 0xFF, sector, offset, sizeof(u8)); offset++; if (offset >= BYTES_PER_READ) { offset = 0; sector++; } _FAT_cache_writeLittleEndianValue (partition->cache, (value >> 8) & 0xFF, sector, offset, sizeof(u8)); } else { _FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u8)); offset++; if (offset >= BYTES_PER_READ) { offset = 0; sector++; } _FAT_cache_readLittleEndianValue (partition->cache, &oldValue, sector, offset, sizeof(u8)); value = ((value >> 8) & 0x0F) | (oldValue & 0xF0); _FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u8)); } break; case FS_FAT16: sector = partition->fat.fatStart + ((cluster << 1) / BYTES_PER_READ); offset = (cluster % (BYTES_PER_READ >> 1)) << 1; _FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u16)); break; case FS_FAT32: sector = partition->fat.fatStart + ((cluster << 2) / BYTES_PER_READ); offset = (cluster % (BYTES_PER_READ >> 2)) << 2; _FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u32)); break; default: return false; break; } return true; } /*----------------------------------------------------------------- gets the first available free cluster, sets it to end of file, links the input cluster to it then returns the cluster number If an error occurs, return CLUSTER_ERROR -----------------------------------------------------------------*/ uint32_t _FAT_fat_linkFreeCluster(PARTITION* partition, uint32_t cluster) { uint32_t firstFree; uint32_t curLink; uint32_t lastCluster; bool loopedAroundFAT = false; lastCluster = partition->fat.lastCluster; if (cluster > lastCluster) { return CLUSTER_ERROR; } // Check if the cluster already has a link, and return it if so curLink = _FAT_fat_nextCluster(partition, cluster); if ((curLink >= CLUSTER_FIRST) && (curLink <= lastCluster)) { return curLink; // Return the current link - don't allocate a new one } // Get a free cluster firstFree = partition->fat.firstFree; // Start at first valid cluster if (firstFree < CLUSTER_FIRST) { firstFree = CLUSTER_FIRST; } // Search until a free cluster is found while (_FAT_fat_nextCluster(partition, firstFree) != CLUSTER_FREE) { firstFree++; if (firstFree > lastCluster) { if (loopedAroundFAT) { // If couldn't get a free cluster then return an error partition->fat.firstFree = firstFree; return CLUSTER_ERROR; } else { // Try looping back to the beginning of the FAT // This was suggested by loopy firstFree = CLUSTER_FIRST; loopedAroundFAT = true; } } } partition->fat.firstFree = firstFree; if ((cluster >= CLUSTER_FIRST) && (cluster < lastCluster)) { // Update the linked from FAT entry _FAT_fat_writeFatEntry (partition, cluster, firstFree); } // Create the linked to FAT entry _FAT_fat_writeFatEntry (partition, firstFree, CLUSTER_EOF); return firstFree; } /*----------------------------------------------------------------- gets the first available free cluster, sets it to end of file, links the input cluster to it, clears the new cluster to 0 valued bytes, then returns the cluster number If an error occurs, return CLUSTER_ERROR -----------------------------------------------------------------*/ uint32_t _FAT_fat_linkFreeClusterCleared (PARTITION* partition, uint32_t cluster) { uint32_t newCluster; uint32_t i; uint8_t emptySector[BYTES_PER_READ]; // Link the cluster newCluster = _FAT_fat_linkFreeCluster(partition, cluster); if (newCluster == CLUSTER_FREE || newCluster == CLUSTER_ERROR) { return CLUSTER_ERROR; } // Clear all the sectors within the cluster memset (emptySector, 0, BYTES_PER_READ); for (i = 0; i < partition->sectorsPerCluster; i++) { _FAT_cache_writeSectors (partition->cache, _FAT_fat_clusterToSector (partition, newCluster) + i, 1, emptySector); } return newCluster; } /*----------------------------------------------------------------- _FAT_fat_clearLinks frees any cluster used by a file -----------------------------------------------------------------*/ bool _FAT_fat_clearLinks (PARTITION* partition, uint32_t cluster) { uint32_t nextCluster; if ((cluster < CLUSTER_FIRST) || (cluster > partition->fat.lastCluster /* This will catch CLUSTER_ERROR */)) return false; // If this clears up more space in the FAT before the current free pointer, move it backwards if (cluster < partition->fat.firstFree) { partition->fat.firstFree = cluster; } while ((cluster != CLUSTER_EOF) && (cluster != CLUSTER_FREE) && (cluster != CLUSTER_ERROR)) { // Store next cluster before erasing the link nextCluster = _FAT_fat_nextCluster (partition, cluster); // Erase the link _FAT_fat_writeFatEntry (partition, cluster, CLUSTER_FREE); // Move onto next cluster cluster = nextCluster; } return true; } /*----------------------------------------------------------------- _FAT_fat_trimChain Drop all clusters past the chainLength. If chainLength is 0, all clusters are dropped. If chainLength is 1, the first cluster is kept and the rest are dropped, and so on. Return the last cluster left in the chain. -----------------------------------------------------------------*/ uint32_t _FAT_fat_trimChain (PARTITION* partition, uint32_t startCluster, unsigned int chainLength) { uint32_t nextCluster; if (chainLength == 0) { // Drop the entire chain _FAT_fat_clearLinks (partition, startCluster); return CLUSTER_FREE; } else { // Find the last cluster in the chain, and the one after it chainLength--; nextCluster = _FAT_fat_nextCluster (partition, startCluster); while ((chainLength > 0) && (nextCluster != CLUSTER_FREE) && (nextCluster != CLUSTER_EOF)) { chainLength--; startCluster = nextCluster; nextCluster = _FAT_fat_nextCluster (partition, startCluster); } // Drop all clusters after the last in the chain if (nextCluster != CLUSTER_FREE && nextCluster != CLUSTER_EOF) { _FAT_fat_clearLinks (partition, nextCluster); } // Mark the last cluster in the chain as the end of the file _FAT_fat_writeFatEntry (partition, startCluster, CLUSTER_EOF); return startCluster; } } /*----------------------------------------------------------------- _FAT_fat_lastCluster Trace the cluster links until the last one is found -----------------------------------------------------------------*/ uint32_t _FAT_fat_lastCluster (PARTITION* partition, uint32_t cluster) { while ((_FAT_fat_nextCluster(partition, cluster) != CLUSTER_FREE) && (_FAT_fat_nextCluster(partition, cluster) != CLUSTER_EOF)) { cluster = _FAT_fat_nextCluster(partition, cluster); } return cluster; } /*----------------------------------------------------------------- _FAT_fat_freeClusterCount Return the number of free clusters available -----------------------------------------------------------------*/ unsigned int _FAT_fat_freeClusterCount (PARTITION* partition) { unsigned int count = 0; uint32_t curCluster; for (curCluster = CLUSTER_FIRST; curCluster <= partition->fat.lastCluster; curCluster++) { if (_FAT_fat_nextCluster(partition, curCluster) == CLUSTER_FREE) { count++; } } return count; } desmume-0.9.9/src/utils/libfat/libfat.cpp0000644000175000017500000001605212140261630021056 0ustar guillaumeguillaume/* libfat.c Simple functionality for startup, mounting and unmounting of FAT-based devices. Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "common.h" #include "partition.h" #include "fatfile.h" #include "fatdir.h" #include "lock.h" #include "mem_allocate.h" #include "disc.h" #ifndef LIBFAT_PC #include #include #endif static const devoptab_t dotab_fat = { "fat", sizeof (FILE_STRUCT), _FAT_open_r, _FAT_close_r, _FAT_write_r, _FAT_read_r, _FAT_seek_r, _FAT_fstat_r, _FAT_stat_r, _FAT_link_r, _FAT_unlink_r, _FAT_chdir_r, _FAT_rename_r, _FAT_mkdir_r, sizeof (DIR_STATE_STRUCT), _FAT_diropen_r, _FAT_dirreset_r, _FAT_dirnext_r, _FAT_dirclose_r, #ifndef LIBFAT_PC _FAT_statvfs_r, #endif _FAT_ftruncate_r, _FAT_fsync_r, NULL, /* Device data */ NULL, NULL }; #ifdef LIBFAT_PC static devoptab_t* _sole_device = NULL; devoptab_t* GetDeviceOpTab(const char* name) { return _sole_device; } #endif bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage) { PARTITION* partition; devoptab_t* devops; //char* nameCopy; if(!name || strlen(name) > 8 || !interface) return false; if(!interface->startup()) return false; if(!interface->isInserted()) return false; //char devname[10]; //sprintf(devname, "%s:", name); //if(FindDevice(devname) >= 0) // return true; devops = (devoptab_t*)_FAT_mem_allocate (sizeof(devoptab_t) + strlen(name) + 1); if (!devops) { return false; } #ifdef LIBFAT_PC _sole_device = devops; #endif // Use the space allocated at the end of the devoptab struct for storing the name //nameCopy = (char*)(devops+1); // Initialize the file system partition = _FAT_partition_constructor (interface, cacheSize, SectorsPerPage, startSector); if (!partition) { _FAT_mem_free (devops); return false; } // Add an entry for this device to the devoptab table memcpy (devops, &dotab_fat, sizeof(dotab_fat)); //strcpy (nameCopy, name); //devops->name = nameCopy; devops->deviceData = partition; //AddDevice (devops); return true; } bool fatMountSimple (const char* name, const DISC_INTERFACE* interface) { return fatMount (name, interface, 0, DEFAULT_CACHE_PAGES, DEFAULT_SECTORS_PAGE); } void fatUnmountDirect (devoptab_t *devops) { PARTITION* partition = (PARTITION*)devops->deviceData; _FAT_partition_destructor (partition); _FAT_mem_free (devops); _sole_device = NULL; } //void fatUnmount (const char* name) { // devoptab_t *devops; // PARTITION* partition; // // if(!name) // return; // // devops = (devoptab_t*)GetDeviceOpTab (name); // if (!devops) { // return; // } // // // Perform a quick check to make sure we're dealing with a libfat controlled device // //if (devops->open_r != dotab_fat.open_r) { // // return; // //} // // if (RemoveDevice (name) == -1) { // return; // } // // partition = (PARTITION*)devops->deviceData; // _FAT_partition_destructor (partition); // _FAT_mem_free (devops); //} //bool fatInit (uint32_t cacheSize, bool setAsDefaultDevice) { // int i; // int defaultDevice = -1; // const DISC_INTERFACE *disc; // // for (i = 0; // _FAT_disc_interfaces[i].name != NULL && _FAT_disc_interfaces[i].getInterface != NULL; // i++) // { // disc = _FAT_disc_interfaces[i].getInterface(); // if (fatMount (_FAT_disc_interfaces[i].name, disc, 0, cacheSize, DEFAULT_SECTORS_PAGE)) { // // The first device to successfully mount is set as the default // if (defaultDevice < 0) { // defaultDevice = i; // } // } // } // // if (defaultDevice < 0) { // // None of our devices mounted // return false; // } // // if (setAsDefaultDevice) { // char filePath[MAXPATHLEN * 2]; // strcpy (filePath, _FAT_disc_interfaces[defaultDevice].name); // strcat (filePath, ":/"); //#ifdef ARGV_MAGIC // if ( __system_argv->argvMagic == ARGV_MAGIC && __system_argv->argc >= 1 && strrchr( __system_argv->argv[0], '/' )!=NULL ) { // // Check the app's path against each of our mounted devices, to see // // if we can support it. If so, change to that path. // for (i = 0; // _FAT_disc_interfaces[i].name != NULL && _FAT_disc_interfaces[i].getInterface != NULL; // i++) // { // if ( !strncasecmp( __system_argv->argv[0], _FAT_disc_interfaces[i].name, // strlen(_FAT_disc_interfaces[i].name))) // { // char *lastSlash; // strcpy(filePath, __system_argv->argv[0]); // lastSlash = strrchr( filePath, '/' ); // // if ( NULL != lastSlash) { // if ( *(lastSlash - 1) == ':') lastSlash++; // *lastSlash = 0; // } // } // } // } //#endif // chdir (filePath); // } // // return true; //} //bool fatInitDefault (void) { // return fatInit (DEFAULT_CACHE_PAGES, true); //} //void fatGetVolumeLabel (const char* name, char *label) { // devoptab_t *devops; // PARTITION* partition; // char *buf; // int namelen,i; // // if(!name || !label) // return; // // namelen = strlen(name); // buf=(char*)_FAT_mem_allocate(sizeof(char)*namelen+2); // strcpy(buf,name); // // if (name[namelen-1] == '/') { // buf[namelen-1]='\0'; // namelen--; // } // // if (name[namelen-1] != ':') { // buf[namelen]=':'; // buf[namelen+1]='\0'; // } // // devops = (devoptab_t*)GetDeviceOpTab(buf); // // for(i=0;buf[i]!='\0' && buf[i]!=':';i++); // if (!devops || strncasecmp(buf,devops->name,i)) { // _FAT_mem_free(buf); // return; // } // // _FAT_mem_free(buf); // // // Perform a quick check to make sure we're dealing with a libfat controlled device // if (devops->open_r != dotab_fat.open_r) { // return; // } // // partition = (PARTITION*)devops->deviceData; // // if(!_FAT_directory_getVolumeLabel(partition, label)) { // strncpy(label,partition->label,11); // label[11]='\0'; // } // if(!strncmp(label, "NO NAME", 7)) label[0]='\0'; //} desmume-0.9.9/src/utils/libfat/lock.h0000644000175000017500000000406112140261630020207 0ustar guillaumeguillaume/* lock.h Copyright (c) 2008 Sven Peter Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LOCK_H #define _LOCK_H #include "common.h" #ifdef USE_LWP_LOCK static inline void _FAT_lock_init(mutex_t *mutex) { LWP_MutexInit(mutex, false); } static inline void _FAT_lock_deinit(mutex_t *mutex) { LWP_MutexDestroy(*mutex); } static inline void _FAT_lock(mutex_t *mutex) { LWP_MutexLock(*mutex); } static inline void _FAT_unlock(mutex_t *mutex) { LWP_MutexUnlock(*mutex); } #else // We still need a blank lock type #ifndef mutex_t typedef int mutex_t; #endif void _FAT_lock_init(mutex_t *mutex); void _FAT_lock_deinit(mutex_t *mutex); void _FAT_lock(mutex_t *mutex); void _FAT_unlock(mutex_t *mutex); #endif // USE_LWP_LOCK #endif // _LOCK_H desmume-0.9.9/src/utils/libfat/common.h0000644000175000017500000000537712140261630020562 0ustar guillaumeguillaume/* common.h Common definitions and included files for the FATlib Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _COMMON_H #define _COMMON_H #define BYTES_PER_READ 512 #include #ifndef _MSC_VER #include #endif // When compiling for NDS, make sure NDS is defined #ifndef NDS #if defined ARM9 || defined ARM7 #define NDS #endif #endif // Platform specific includes #if defined(__gamecube__) || defined (__wii__) #include #include #include #elif defined(NDS) #include #include #include #elif defined(GBA) #include #include #endif // Platform specific options #if defined (__wii__) #define DEFAULT_CACHE_PAGES 4 #define DEFAULT_SECTORS_PAGE 64 #define USE_LWP_LOCK #define USE_RTC_TIME #elif defined (__gamecube__) #define DEFAULT_CACHE_PAGES 4 #define DEFAULT_SECTORS_PAGE 64 #define USE_LWP_LOCK #define USE_RTC_TIME #elif defined (NDS) #define DEFAULT_CACHE_PAGES 4 #define DEFAULT_SECTORS_PAGE 8 #define USE_RTC_TIME #elif defined (GBA) #define DEFAULT_CACHE_PAGES 2 #define DEFAULT_SECTORS_PAGE 8 #define LIMIT_SECTORS 128 #else #define LIBFAT_PC 1 //any particular reason for this? #define DEFAULT_CACHE_PAGES 4 #define DEFAULT_SECTORS_PAGE 8 #endif #include "libfat_pc.h" #include "fat.h" #endif // _COMMON_H desmume-0.9.9/src/utils/libfat/fatdir.cpp0000644000175000017500000004271712140261630021075 0ustar guillaumeguillaume/* fatdir.c Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #ifndef _MSC_VER #include #include #endif #include "fatdir.h" #include "cache.h" #include "file_allocation_table.h" #include "partition.h" #include "directory.h" #include "bit_ops.h" #include "filetime.h" #include "lock.h" int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st) { PARTITION* partition = NULL; DIR_ENTRY dirEntry; // Get the partition this file is on partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } _FAT_lock(&partition->lock); // Search for the file on the disc if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, NULL)) { _FAT_unlock(&partition->lock); r->_errno = ENOENT; return -1; } // Fill in the stat struct _FAT_directory_entryStat (partition, &dirEntry, st); _FAT_unlock(&partition->lock); return 0; } int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink) { r->_errno = ENOTSUP; return -1; } int _FAT_unlink_r (struct _reent *r, const char *path) { PARTITION* partition = NULL; DIR_ENTRY dirEntry; DIR_ENTRY dirContents; uint32_t cluster; bool nextEntry; bool errorOccured = false; // Get the partition this directory is on partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Make sure we aren't trying to write to a read-only disc if (partition->readOnly) { r->_errno = EROFS; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } _FAT_lock(&partition->lock); // Search for the file on the disc if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, NULL)) { _FAT_unlock(&partition->lock); r->_errno = ENOENT; return -1; } cluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData); // If this is a directory, make sure it is empty if (_FAT_directory_isDirectory (&dirEntry)) { nextEntry = _FAT_directory_getFirstEntry (partition, &dirContents, cluster); while (nextEntry) { if (!_FAT_directory_isDot (&dirContents)) { // The directory had something in it that isn't a reference to itself or it's parent _FAT_unlock(&partition->lock); r->_errno = EPERM; return -1; } nextEntry = _FAT_directory_getNextEntry (partition, &dirContents); } } if (_FAT_fat_isValidCluster(partition, cluster)) { // Remove the cluster chain for this file if (!_FAT_fat_clearLinks (partition, cluster)) { r->_errno = EIO; errorOccured = true; } } // Remove the directory entry for this file if (!_FAT_directory_removeEntry (partition, &dirEntry)) { r->_errno = EIO; errorOccured = true; } // Flush any sectors in the disc cache if (!_FAT_cache_flush(partition->cache)) { r->_errno = EIO; errorOccured = true; } _FAT_unlock(&partition->lock); if (errorOccured) { return -1; } else { return 0; } } int _FAT_chdir_r (struct _reent *r, const char *path) { PARTITION* partition = NULL; // Get the partition this directory is on partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } _FAT_lock(&partition->lock); // Try changing directory if (_FAT_directory_chdir (partition, path)) { // Successful _FAT_unlock(&partition->lock); return 0; } else { // Failed _FAT_unlock(&partition->lock); r->_errno = ENOTDIR; return -1; } } int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName) { PARTITION* partition = NULL; DIR_ENTRY oldDirEntry; DIR_ENTRY newDirEntry; const char *pathEnd; uint32_t dirCluster; // Get the partition this directory is on partition = _FAT_partition_getPartitionFromPath (oldName); if (partition == NULL) { r->_errno = ENODEV; return -1; } _FAT_lock(&partition->lock); // Make sure the same partition is used for the old and new names if (partition != _FAT_partition_getPartitionFromPath (newName)) { _FAT_unlock(&partition->lock); r->_errno = EXDEV; return -1; } // Make sure we aren't trying to write to a read-only disc if (partition->readOnly) { _FAT_unlock(&partition->lock); r->_errno = EROFS; return -1; } // Move the path pointer to the start of the actual path if (strchr (oldName, ':') != NULL) { oldName = strchr (oldName, ':') + 1; } if (strchr (oldName, ':') != NULL) { _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } if (strchr (newName, ':') != NULL) { newName = strchr (newName, ':') + 1; } if (strchr (newName, ':') != NULL) { _FAT_unlock(&partition->lock); r->_errno = EINVAL; return -1; } // Search for the file on the disc if (!_FAT_directory_entryFromPath (partition, &oldDirEntry, oldName, NULL)) { _FAT_unlock(&partition->lock); r->_errno = ENOENT; return -1; } // Make sure there is no existing file / directory with the new name if (_FAT_directory_entryFromPath (partition, &newDirEntry, newName, NULL)) { _FAT_unlock(&partition->lock); r->_errno = EEXIST; return -1; } // Create the new file entry // Get the directory it has to go in pathEnd = strrchr (newName, DIR_SEPARATOR); if (pathEnd == NULL) { // No path was specified dirCluster = partition->cwdCluster; pathEnd = newName; } else { // Path was specified -- get the right dirCluster // Recycling newDirEntry, since it needs to be recreated anyway if (!_FAT_directory_entryFromPath (partition, &newDirEntry, newName, pathEnd) || !_FAT_directory_isDirectory(&newDirEntry)) { _FAT_unlock(&partition->lock); r->_errno = ENOTDIR; return -1; } dirCluster = _FAT_directory_entryGetCluster (partition, newDirEntry.entryData); // Move the pathEnd past the last DIR_SEPARATOR pathEnd += 1; } // Copy the entry data memcpy (&newDirEntry, &oldDirEntry, sizeof(DIR_ENTRY)); // Set the new name strncpy (newDirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1); // Write the new entry if (!_FAT_directory_addEntry (partition, &newDirEntry, dirCluster)) { _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } // Remove the old entry if (!_FAT_directory_removeEntry (partition, &oldDirEntry)) { _FAT_unlock(&partition->lock); r->_errno = EIO; return -1; } // Flush any sectors in the disc cache if (!_FAT_cache_flush (partition->cache)) { _FAT_unlock(&partition->lock); r->_errno = EIO; return -1; } _FAT_unlock(&partition->lock); return 0; } int _FAT_mkdir_r (struct _reent *r, const char *path, int mode) { PARTITION* partition = NULL; bool fileExists; DIR_ENTRY dirEntry; const char* pathEnd; uint32_t parentCluster, dirCluster; uint8_t newEntryData[DIR_ENTRY_DATA_SIZE]; partition = _FAT_partition_getPartitionFromPath (path); if (partition == NULL) { r->_errno = ENODEV; return -1; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return -1; } _FAT_lock(&partition->lock); // Search for the file/directory on the disc fileExists = _FAT_directory_entryFromPath (partition, &dirEntry, path, NULL); // Make sure it doesn't exist if (fileExists) { _FAT_unlock(&partition->lock); r->_errno = EEXIST; return -1; } if (partition->readOnly) { // We can't write to a read-only partition _FAT_unlock(&partition->lock); r->_errno = EROFS; return -1; } // Get the directory it has to go in pathEnd = strrchr (path, DIR_SEPARATOR); if (pathEnd == NULL) { // No path was specified parentCluster = partition->cwdCluster; pathEnd = path; } else { // Path was specified -- get the right parentCluster // Recycling dirEntry, since it needs to be recreated anyway if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, pathEnd) || !_FAT_directory_isDirectory(&dirEntry)) { _FAT_unlock(&partition->lock); r->_errno = ENOTDIR; return -1; } parentCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData); // Move the pathEnd past the last DIR_SEPARATOR pathEnd += 1; } // Create the entry data strncpy (dirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1); memset (dirEntry.entryData, 0, DIR_ENTRY_DATA_SIZE); // Set the creation time and date dirEntry.entryData[DIR_ENTRY_cTime_ms] = 0; u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cTime, _FAT_filetime_getTimeFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cDate, _FAT_filetime_getDateFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_mTime, _FAT_filetime_getTimeFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_mDate, _FAT_filetime_getDateFromRTC()); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_aDate, _FAT_filetime_getDateFromRTC()); // Set the directory attribute dirEntry.entryData[DIR_ENTRY_attributes] = ATTRIB_DIR; // Get a cluster for the new directory dirCluster = _FAT_fat_linkFreeClusterCleared (partition, CLUSTER_FREE); if (!_FAT_fat_isValidCluster(partition, dirCluster)) { // No space left on disc for the cluster _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } u16_to_u8array (dirEntry.entryData, DIR_ENTRY_cluster, dirCluster); u16_to_u8array (dirEntry.entryData, DIR_ENTRY_clusterHigh, dirCluster >> 16); // Write the new directory's entry to it's parent if (!_FAT_directory_addEntry (partition, &dirEntry, parentCluster)) { _FAT_unlock(&partition->lock); r->_errno = ENOSPC; return -1; } // Create the dot entry within the directory memset (newEntryData, 0, DIR_ENTRY_DATA_SIZE); memset (newEntryData, ' ', 11); newEntryData[DIR_ENTRY_name] = '.'; newEntryData[DIR_ENTRY_attributes] = ATTRIB_DIR; u16_to_u8array (newEntryData, DIR_ENTRY_cluster, dirCluster); u16_to_u8array (newEntryData, DIR_ENTRY_clusterHigh, dirCluster >> 16); // Write it to the directory, erasing that sector in the process _FAT_cache_eraseWritePartialSector ( partition->cache, newEntryData, _FAT_fat_clusterToSector (partition, dirCluster), 0, DIR_ENTRY_DATA_SIZE); // Create the double dot entry within the directory // if ParentDir == Rootdir then ".."" always link to Cluster 0 if(parentCluster == partition->rootDirCluster) parentCluster = FAT16_ROOT_DIR_CLUSTER; newEntryData[DIR_ENTRY_name + 1] = '.'; u16_to_u8array (newEntryData, DIR_ENTRY_cluster, parentCluster); u16_to_u8array (newEntryData, DIR_ENTRY_clusterHigh, parentCluster >> 16); // Write it to the directory _FAT_cache_writePartialSector ( partition->cache, newEntryData, _FAT_fat_clusterToSector (partition, dirCluster), DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE); // Flush any sectors in the disc cache if (!_FAT_cache_flush(partition->cache)) { _FAT_unlock(&partition->lock); r->_errno = EIO; return -1; } _FAT_unlock(&partition->lock); return 0; } // //int _FAT_statvfs_r (struct _reent *r, const char *path, struct statvfs *buf) //{ // PARTITION* partition = NULL; // unsigned int freeClusterCount; // // // Get the partition of the requested path // partition = _FAT_partition_getPartitionFromPath (path); // if (partition == NULL) { // r->_errno = ENODEV; // return -1; // } // // _FAT_lock(&partition->lock); // // freeClusterCount = _FAT_fat_freeClusterCount (partition); // // // FAT clusters = POSIX blocks // buf->f_bsize = partition->bytesPerCluster; // File system block size. // buf->f_frsize = partition->bytesPerCluster; // Fundamental file system block size. // // buf->f_blocks = partition->fat.lastCluster - CLUSTER_FIRST + 1; // Total number of blocks on file system in units of f_frsize. // buf->f_bfree = freeClusterCount; // Total number of free blocks. // buf->f_bavail = freeClusterCount; // Number of free blocks available to non-privileged process. // // // Treat requests for info on inodes as clusters // buf->f_files = partition->fat.lastCluster - CLUSTER_FIRST + 1; // Total number of file serial numbers. // buf->f_ffree = freeClusterCount; // Total number of free file serial numbers. // buf->f_favail = freeClusterCount; // Number of file serial numbers available to non-privileged process. // // // File system ID. 32bit ioType value // buf->f_fsid = _FAT_disc_hostType(partition->disc); // // // Bit mask of f_flag values. // buf->f_flag = ST_NOSUID /* No support for ST_ISUID and ST_ISGID file mode bits */ // | (partition->readOnly ? ST_RDONLY /* Read only file system */ : 0 ) ; // // Maximum filename length. // buf->f_namemax = MAX_FILENAME_LENGTH; // // _FAT_unlock(&partition->lock); // return 0; //} DIR_ITER* _FAT_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path) { DIR_ENTRY dirEntry; DIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct); bool fileExists; state->partition = _FAT_partition_getPartitionFromPath (path); if (state->partition == NULL) { r->_errno = ENODEV; return NULL; } // Move the path pointer to the start of the actual path if (strchr (path, ':') != NULL) { path = strchr (path, ':') + 1; } if (strchr (path, ':') != NULL) { r->_errno = EINVAL; return NULL; } _FAT_lock(&state->partition->lock); // Get the start cluster of the directory fileExists = _FAT_directory_entryFromPath (state->partition, &dirEntry, path, NULL); if (!fileExists) { _FAT_unlock(&state->partition->lock); r->_errno = ENOENT; return NULL; } // Make sure it is a directory if (! _FAT_directory_isDirectory (&dirEntry)) { _FAT_unlock(&state->partition->lock); r->_errno = ENOTDIR; return NULL; } // Save the start cluster for use when resetting the directory data state->startCluster = _FAT_directory_entryGetCluster (state->partition, dirEntry.entryData); // Get the first entry for use with a call to dirnext state->validEntry = _FAT_directory_getFirstEntry (state->partition, &(state->currentEntry), state->startCluster); // We are now using this entry state->inUse = true; _FAT_unlock(&state->partition->lock); return (DIR_ITER*) state; } int _FAT_dirreset_r (struct _reent *r, DIR_ITER *dirState) { DIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct); _FAT_lock(&state->partition->lock); // Make sure we are still using this entry if (!state->inUse) { _FAT_unlock(&state->partition->lock); r->_errno = EBADF; return -1; } // Get the first entry for use with a call to dirnext state->validEntry = _FAT_directory_getFirstEntry (state->partition, &(state->currentEntry), state->startCluster); _FAT_unlock(&state->partition->lock); return 0; } int _FAT_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat) { DIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct); _FAT_lock(&state->partition->lock); // Make sure we are still using this entry if (!state->inUse) { _FAT_unlock(&state->partition->lock); r->_errno = EBADF; return -1; } // Make sure there is another file to report on if (! state->validEntry) { _FAT_unlock(&state->partition->lock); r->_errno = ENOENT; return -1; } // Get the filename strncpy (filename, state->currentEntry.filename, MAX_FILENAME_LENGTH); // Get the stats, if requested if (filestat != NULL) { _FAT_directory_entryStat (state->partition, &(state->currentEntry), filestat); } // Look for the next entry for use next time state->validEntry = _FAT_directory_getNextEntry (state->partition, &(state->currentEntry)); _FAT_unlock(&state->partition->lock); return 0; } int _FAT_dirclose_r (struct _reent *r, DIR_ITER *dirState) { DIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct); // We are no longer using this entry _FAT_lock(&state->partition->lock); state->inUse = false; _FAT_unlock(&state->partition->lock); return 0; } desmume-0.9.9/src/utils/libfat/fatdir.h0000644000175000017500000000535112140261630020533 0ustar guillaumeguillaume/* fatdir.h Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FATDIR_H #define _FATDIR_H #include #include "common.h" #include "directory.h" #ifndef LIBFAT_PC #include #include #include #endif typedef struct { PARTITION* partition; DIR_ENTRY currentEntry; uint32_t startCluster; bool inUse; bool validEntry; } DIR_STATE_STRUCT; extern int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st); extern int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink); extern int _FAT_unlink_r (struct _reent *r, const char *name); extern int _FAT_chdir_r (struct _reent *r, const char *name); extern int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName); extern int _FAT_mkdir_r (struct _reent *r, const char *path, int mode); extern int _FAT_statvfs_r (struct _reent *r, const char *path, struct statvfs *buf); /* Directory iterator functions */ extern DIR_ITER* _FAT_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path); extern int _FAT_dirreset_r (struct _reent *r, DIR_ITER *dirState); extern int _FAT_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat); extern int _FAT_dirclose_r (struct _reent *r, DIR_ITER *dirState); #endif // _FATDIR_H desmume-0.9.9/src/utils/AsmJit/0000755000175000017500000000000012140305317017034 5ustar guillaumeguillaumedesmume-0.9.9/src/utils/AsmJit/AsmJit.h0000644000175000017500000003140212140261627020401 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_ASMJIT_H #define _ASMJIT_ASMJIT_H //! @mainpage //! //! @brief AsmJit is a complete x86/x64 JIT Assembler for C++ language. //! //! It supports FPU, MMX, 3dNow, SSE, SSE2, SSE3 and SSE4 intrinsics, powerful //! compiler that helps to write portable functions for 32-bit (x86) and 64-bit //! (x64) architectures. AsmJit can be used to create functions at runtime that //! can be called from existing (but also generated) C/C++ code. //! //! AsmJit is a cross-platform library that supports various compilers and //! operating systems. Currently only limitation is x86 (32-bit) or x64 (64-bit) //! processor. Currently tested operating systems are Windows (32-bit and 64-bit), //! Linux (32-bit and 64-bit) and MacOSX (32-bit and 64-bit). //! //! @section AsmJit_Main_Introduction Introduction //! //! AsmJit library contains two main classes for code generation with different //! goals. First main code generation class is called @c AsmJit::Assembler and //! contains low level API that can be used to generate JIT binary code. It //! directly emits binary stream that represents encoded x86/x64 assembler //! opcodes. Together with operands and labels it can be used to generate //! complete code. For details look to @ref AsmJit_Core and @ref AsmJit_Compiler //! sections. //! //! There is also class named @c AsmJit::Compiler that allows to develop //! cross-platform assembler code without worring about function calling //! conventions and registers allocation. It can be also used to write 32-bit //! and 64-bit portable code. Compiler is recommended class to use for code //! generation. //! //! Everything in AsmJit library is in @c AsmJit namespace. //! //! @section AsmJit_Main_CodeGeneration Code Generation //! //! - @ref AsmJit_Core "Assembler core" - Operands, intrinsics and low-level assembler. //! - @ref AsmJit_Compiler "Compiler" - High level code generation. //! - @ref AsmJit_CpuInfo "Cpu Information" - Get information about host processor. //! - @ref AsmJit_Logging "Logging" - Logging and error handling. //! - @ref AsmJit_MemoryManagement "Memory Management" - Virtual memory management. //! //! @section AsmJit_Main_Configuration Configuration, Definitions and Utilities //! //! - @ref AsmJit_Config "Configuration" - Macros used to configure AsmJit. //! //! @section AsmJit_Main_HomePage AsmJit Homepage //! //! - http://code.google.com/p/asmjit/ //! //! @section AsmJit_Main_ResourcesX86 External X86/X64 Assembler Resources //! - http://www.agner.org/optimize/ //! - http://www.mark.masmcode.com/ (Assembler Tips) //! - http://avisynth.org/mediawiki/Filter_SDK/Assembler_optimizing (Optimizing) //! - http://www.ragestorm.net/distorm/ (Disassembling) //! //! @section AsmJit_Main_Terminology Terminology //! //! - Non-volatile (preserved) register - Register that can't be changed //! by callee (callee must save and restore it if it want to use it inside). //! //! - Volatile (non-preserved) register - The opossite. Register that can //! be freely used by callee. The caller must free all registers before calling //! other function. //! @defgroup AsmJit_Core Assembler core (operands, intrinsics and low-level assembler). //! //! Contains classes related to @c AsmJit::Assembler that're directly used //! to generate machine code stream. It's one of oldest and fastest method //! to generate machine code using AsmJit library. //! //! - See @c AsmJit::Assembler class for low level code generation //! documentation. //! - See @c AsmJit::Operand for AsmJit operand's overview. //! //! @section AsmJit_Core_Registers Registers //! //! There are static objects that represents X86 and X64 registers. They can //! be used directly (like @c eax, @c mm, @c xmm, ...) or created through //! these functions: //! //! - @c AsmJit::mk_gpb() - make general purpose byte register //! - @c AsmJit::mk_gpw() - make general purpose word register //! - @c AsmJit::mk_gpd() - make general purpose dword register //! - @c AsmJit::mk_gpq() - make general purpose qword register //! - @c AsmJit::mk_mm() - make mmx register //! - @c AsmJit::mk_xmm() - make sse register //! - @c AsmJit::st() - make x87 register //! //! @section AsmJit_Core_Addressing Addressing //! //! X86 and x64 architectures contains several addressing modes and most ones //! are possible with AsmJit library. Memory represents are represented by //! @c AsmJit::Mem class. These functions are used to make operands that //! represents memory addresses: //! //! - @c AsmJit::ptr() //! - @c AsmJit::byte_ptr() //! - @c AsmJit::word_ptr() //! - @c AsmJit::dword_ptr() //! - @c AsmJit::qword_ptr() //! - @c AsmJit::tword_ptr() //! - @c AsmJit::dqword_ptr() //! - @c AsmJit::mmword_ptr() //! - @c AsmJit::xmmword_ptr() //! - @c AsmJit::sysint_ptr() //! //! Most useful function to make pointer should be @c AsmJit::ptr(). It creates //! pointer to the target with unspecified size. Unspecified size works in all //! intrinsics where are used registers (this means that size is specified by //! register operand or by instruction itself). For example @c AsmJit::ptr() //! can't be used with @c AsmJit::Assembler::inc() instruction. In this case //! size must be specified and it's also reason to make difference between //! pointer sizes. //! //! Supported are simple address forms (register + displacement) and complex //! address forms (register + (register << shift) + displacement). //! //! @section AsmJit_Core_Immediates Immediates //! //! Immediate values are constants thats passed directly after instruction //! opcode. To create such value use @c AsmJit::imm() or @c AsmJit::uimm() //! methods to create signed or unsigned immediate value. //! //! @sa @c AsmJit::Compiler. //! @defgroup AsmJit_Compiler Compiler (high-level code generation). //! //! Contains classes related to @c AsmJit::Compiler that can be used //! to generate code using high-level constructs. //! //! - See @c Compiler class for high level code generation //! documentation - calling conventions, function declaration //! and variables management. //! @defgroup AsmJit_Config Configuration. //! //! Contains macros that can be redefined to fit into any project. //! @defgroup AsmJit_CpuInfo CPU information. //! //! X86 or x64 cpuid instruction allows to get information about processor //! vendor and it's features. It's always used to detect features like MMX, //! SSE and other newer ones. //! //! AsmJit library supports low level cpuid call implemented internally as //! C++ function using inline assembler or intrinsics and also higher level //! CPU features detection. The low level function (also used by higher level //! one) is @c AsmJit::cpuid(). //! //! AsmJit library also contains higher level function @c AsmJit::getCpuInfo() //! that returns features detected by the library. The detection process is //! done only once and it's cached for all next calls. @c AsmJit::CpuInfo //! structure not contains only information through @c AsmJit::cpuid(), but //! there is also small multiplatform code to detect number of processors //! (or cores) through operating system API. //! //! It's recommended to use @c AsmJit::cpuInfo to detect and check for //! host processor features. //! //! Example how to use AsmJit::cpuid(): //! //! @code //! // All functions and structures are in AsmJit namesapce. //! using namespace AsmJit; //! //! // Here will be retrieved result of cpuid call. //! CpuId out; //! //! // Use cpuid function to do the job. //! cpuid(0 /* eax */, &out /* eax, ebx, ecx, edx */); //! //! // Id eax argument to cpuid is 0, ebx, ecx and edx registers //! // are filled with cpu vendor. //! char vendor[13]; //! memcpy(i->vendor, &out.ebx, 4); //! memcpy(i->vendor + 4, &out.edx, 4); //! memcpy(i->vendor + 8, &out.ecx, 4); //! vendor[12] = '\0'; //! //! // Print vendor //! puts(vendor); //! @endcode //! //! If you want to use AsmJit::cpuid() function instead of higher level //! @c AsmJit::getCpuInfo(), please read processor manuals provided by Intel, //! AMD or other manufacturers for cpuid instruction details. //! //! Example of using @c AsmJit::getCpuInfo(): //! //! @code //! // All functions and structures are in AsmJit namesapce. //! using namespace AsmJit; //! //! // Call to cpuInfo return CpuInfo structure that shouldn't be modified. //! // Make it const by default. //! const CpuInfo *i = getCpuInfo(); //! //! // Now you are able to get specific features. //! //! // Processor has SSE2 //! if (i->features & kX86FeatureSse2) //! { //! // your code... //! } //! // Processor has MMX //! else if (i->features & kX86Feature_MMX) //! { //! // your code... //! } //! // Processor is old, no SSE2 or MMX support. //! else //! { //! // your code... //! } //! @endcode //! //! Better example is in AsmJit/Test/testcpu.cpp file. //! //! @sa AsmJit::cpuid, @c AsmJit::cpuInfo. //! @defgroup AsmJit_Logging Logging and error handling. //! //! Contains classes related to loging assembler output. Currently logging //! is implemented in @c AsmJit::Logger class.You can override //! @c AsmJit::Logger::log() to log messages into your stream. There is also //! @c FILE based logger implemented in @c AsmJit::FileLogger class. //! //! To log your assembler output to FILE stream use this code: //! //! @code //! // Create assembler //! Assembler a; //! //! // Create and set file based logger //! FileLogger logger(stderr); //! a.setLogger(&logger); //! @endcode //! //! You can see that logging goes through @c Assembler. If you are using //! @c Compiler and you want to log messages in correct assembler order, //! you should look at @ref Compiler::comment() method. It allows you to //! insert text message into items stream so the @c Compiler is able to //! send messages to @ref Assembler in correct order. //! //! @sa @c AsmJit::Logger, @c AsmJit::FileLogger. //! @defgroup AsmJit_MemoryManagement Virtual memory management. //! //! Using @c AsmJit::Assembler or @c AsmJit::Compiler to generate machine //! code is not final step. Each generated code needs to run in memory //! that is not protected against code execution. To alloc this code it's //! needed to use operating system functions provided to enable execution //! code in specified memory block or to allocate memory that is not //! protected. The solution is always to use @c See AsmJit::Assembler::make() //! and @c AsmJit::Compiler::make() functions that can allocate memory and //! relocate code for you. But AsmJit also contains classes for manual memory //! management thats internally used by AsmJit but can be used by programmers //! too. //! //! Memory management contains low level and high level classes related to //! allocating and freeing virtual memory. Low level class is //! @c AsmJit::VirtualMemory that can allocate and free full pages of //! virtual memory provided by operating system. Higher level class is //! @c AsmJit::MemoryManager that is able to manage complete allocation and //! free mechanism. It internally uses larger chunks of memory to make //! allocation fast and effective. //! //! Using @c AsmJit::VirtualMemory::alloc() is cross-platform way how to //! allocate this kind of memory without worrying about operating system //! and it's API. Each memory block that is no longer needed should be //! freed by @c AsmJit::VirtualMemory::free() method. If you want better //! comfort and malloc()/free() interface, look at the //! @c AsmJit::MemoryManager class. //! //! @sa @c AsmJit::VirtualMemory, @ AsmJit::MemoryManager. //! @addtogroup AsmJit_Config //! @{ //! @def ASMJIT_WINDOWS //! @brief Macro that is declared if AsmJit is compiled for Windows. //! @def ASMJIT_POSIX //! @brief Macro that is declared if AsmJit is compiled for unix like //! operating system. //! @def ASMJIT_API //! @brief Attribute that's added to classes that can be exported if AsmJit //! is compiled as a dll library. //! @def ASMJIT_MALLOC //! @brief Function to call to allocate dynamic memory. //! @def ASMJIT_REALLOC //! @brief Function to call to reallocate dynamic memory. //! @def ASMJIT_FREE //! @brief Function to call to free dynamic memory. //! @def ASMJIT_ASSERT //! @brief Assertion macro. Default implementation calls //! @c AsmJit::assertionFailure() function. //! @} //! @namespace AsmJit //! @brief Main AsmJit library namespace. //! //! There are not other namespaces used in AsmJit library. // ---------------------------------------------------------------------------- // [Dependencies - Core] // ---------------------------------------------------------------------------- #include "core.h" // ---------------------------------------------------------------------------- // [Dependencies - X86 / X64] // ---------------------------------------------------------------------------- #if defined(ASMJIT_X86) || defined(ASMJIT_X64) #include "x86.h" #endif // ASMJIT_X86 || ASMJIT_X64 // [Guard] #endif // _ASMJIT_ASMJIT_H desmume-0.9.9/src/utils/AsmJit/x86.h0000644000175000017500000000104312140261627017635 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_H #define _ASMJIT_X86_H // [Dependencies - AsmJit] #include "core.h" #include "x86/x86assembler.h" #include "x86/x86compiler.h" #include "x86/x86compilercontext.h" #include "x86/x86compilerfunc.h" #include "x86/x86compileritem.h" #include "x86/x86cpuinfo.h" #include "x86/x86defs.h" #include "x86/x86func.h" #include "x86/x86operand.h" #include "x86/x86util.h" // [Guard] #endif // _ASMJIT_X86_H desmume-0.9.9/src/utils/AsmJit/x86/0000755000175000017500000000000012140305317017461 5ustar guillaumeguillaumedesmume-0.9.9/src/utils/AsmJit/x86/x86operand.h0000644000175000017500000021737512140261626021653 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86OPERAND_H #define _ASMJIT_X86_X86OPERAND_H // [Dependencies - AsmJit] #include "../core/defs.h" #include "../core/operand.h" #include "../x86/x86defs.h" namespace AsmJit { // ============================================================================ // [Forward Declarations] // ============================================================================ struct GpReg; struct GpVar; struct Mem; struct MmReg; struct MmVar; struct Var; struct X87Reg; struct X87Var; struct XmmReg; struct XmmVar; struct SegmentReg; //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::MmData] // ============================================================================ //! @brief Structure used for MMX specific data (64-bit). //! //! This structure can be used to load / store data from / to MMX register. union MmData { // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Set all eight signed 8-bit integers. inline void setSB( int8_t x0, int8_t x1, int8_t x2, int8_t x3, int8_t x4, int8_t x5, int8_t x6, int8_t x7) { sb[0] = x0; sb[1] = x1; sb[2] = x2; sb[3] = x3; sb[4] = x4; sb[5] = x5; sb[6] = x6; sb[7] = x7; } //! @brief Set all eight unsigned 8-bit integers. inline void setUB( uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7) { ub[0] = x0; ub[1] = x1; ub[2] = x2; ub[3] = x3; ub[4] = x4; ub[5] = x5; ub[6] = x6; ub[7] = x7; } //! @brief Set all four signed 16-bit integers. inline void setSW( int16_t x0, int16_t x1, int16_t x2, int16_t x3) { sw[0] = x0; sw[1] = x1; sw[2] = x2; sw[3] = x3; } //! @brief Set all four unsigned 16-bit integers. inline void setUW( uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3) { uw[0] = x0; uw[1] = x1; uw[2] = x2; uw[3] = x3; } //! @brief Set all two signed 32-bit integers. inline void setSD( int32_t x0, int32_t x1) { sd[0] = x0; sd[1] = x1; } //! @brief Set all two unsigned 32-bit integers. inline void setUD( uint32_t x0, uint32_t x1) { ud[0] = x0; ud[1] = x1; } //! @brief Set signed 64-bit integer. inline void setSQ( int64_t x0) { sq[0] = x0; } //! @brief Set unsigned 64-bit integer. inline void setUQ( uint64_t x0) { uq[0] = x0; } //! @brief Set all two SP-FP values. inline void setSF( float x0, float x1) { sf[0] = x0; sf[1] = x1; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Array of eight signed 8-bit integers. int8_t sb[8]; //! @brief Array of eight unsigned 8-bit integers. uint8_t ub[8]; //! @brief Array of four signed 16-bit integers. int16_t sw[4]; //! @brief Array of four unsigned 16-bit integers. uint16_t uw[4]; //! @brief Array of two signed 32-bit integers. int32_t sd[2]; //! @brief Array of two unsigned 32-bit integers. uint32_t ud[2]; //! @brief Array of one signed 64-bit integer. int64_t sq[1]; //! @brief Array of one unsigned 64-bit integer. uint64_t uq[1]; //! @brief Array of two SP-FP values. float sf[2]; }; // ============================================================================ // [AsmJit::XmmData] // ============================================================================ //! @brief Structure used for SSE specific data (128-bit). //! //! This structure can be used to load / store data from / to SSE register. //! //! @note Always align SSE data to 16-bytes. union XmmData { // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Set all sixteen signed 8-bit integers. inline void setSB( int8_t x0, int8_t x1, int8_t x2 , int8_t x3 , int8_t x4 , int8_t x5 , int8_t x6 , int8_t x7 , int8_t x8, int8_t x9, int8_t x10, int8_t x11, int8_t x12, int8_t x13, int8_t x14, int8_t x15) { sb[0] = x0; sb[1] = x1; sb[ 2] = x2 ; sb[3 ] = x3 ; sb[4 ] = x4 ; sb[5 ] = x5 ; sb[6 ] = x6 ; sb[7 ] = x7 ; sb[8] = x8; sb[9] = x9; sb[10] = x10; sb[11] = x11; sb[12] = x12; sb[13] = x13; sb[14] = x14; sb[15] = x15; } //! @brief Set all sixteen unsigned 8-bit integers. inline void setUB( uint8_t x0, uint8_t x1, uint8_t x2 , uint8_t x3 , uint8_t x4 , uint8_t x5 , uint8_t x6 , uint8_t x7 , uint8_t x8, uint8_t x9, uint8_t x10, uint8_t x11, uint8_t x12, uint8_t x13, uint8_t x14, uint8_t x15) { ub[0] = x0; ub[1] = x1; ub[ 2] = x2 ; ub[3 ] = x3 ; ub[4 ] = x4 ; ub[5 ] = x5 ; ub[6 ] = x6 ; ub[7 ] = x7 ; ub[8] = x8; ub[9] = x9; ub[10] = x10; ub[11] = x11; ub[12] = x12; ub[13] = x13; ub[14] = x14; ub[15] = x15; } //! @brief Set all eight signed 16-bit integers. inline void setSW( int16_t x0, int16_t x1, int16_t x2, int16_t x3, int16_t x4, int16_t x5, int16_t x6, int16_t x7) { sw[0] = x0; sw[1] = x1; sw[2] = x2; sw[3] = x3; sw[4] = x4; sw[5] = x5; sw[6] = x6; sw[7] = x7; } //! @brief Set all eight unsigned 16-bit integers. inline void setUW( uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3, uint16_t x4, uint16_t x5, uint16_t x6, uint16_t x7) { uw[0] = x0; uw[1] = x1; uw[2] = x2; uw[3] = x3; uw[4] = x4; uw[5] = x5; uw[6] = x6; uw[7] = x7; } //! @brief Set all four signed 32-bit integers. inline void setSD( int32_t x0, int32_t x1, int32_t x2, int32_t x3) { sd[0] = x0; sd[1] = x1; sd[2] = x2; sd[3] = x3; } //! @brief Set all four unsigned 32-bit integers. inline void setUD( uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3) { ud[0] = x0; ud[1] = x1; ud[2] = x2; ud[3] = x3; } //! @brief Set all two signed 64-bit integers. inline void setSQ( int64_t x0, int64_t x1) { sq[0] = x0; sq[1] = x1; } //! @brief Set all two unsigned 64-bit integers. inline void setUQ( uint64_t x0, uint64_t x1) { uq[0] = x0; uq[1] = x1; } //! @brief Set all four SP-FP floats. inline void setSF( float x0, float x1, float x2, float x3) { sf[0] = x0; sf[1] = x1; sf[2] = x2; sf[3] = x3; } //! @brief Set all two DP-FP floats. inline void setDF( double x0, double x1) { df[0] = x0; df[1] = x1; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Array of sixteen signed 8-bit integers. int8_t sb[16]; //! @brief Array of sixteen unsigned 8-bit integers. uint8_t ub[16]; //! @brief Array of eight signed 16-bit integers. int16_t sw[8]; //! @brief Array of eight unsigned 16-bit integers. uint16_t uw[8]; //! @brief Array of four signed 32-bit integers. int32_t sd[4]; //! @brief Array of four unsigned 32-bit integers. uint32_t ud[4]; //! @brief Array of two signed 64-bit integers. int64_t sq[2]; //! @brief Array of two unsigned 64-bit integers. uint64_t uq[2]; //! @brief Array of four 32-bit single precision floating points. float sf[4]; //! @brief Array of two 64-bit double precision floating points. double df[2]; }; // ============================================================================ // [AsmJit::GpReg] // ============================================================================ //! @brief General purpose register. //! //! This class is for all general purpose registers (64, 32, 16 and 8-bit). struct GpReg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized general purpose register. inline GpReg() : Reg(kInvalidValue, 0) {} //! @brief Create a reference to @a other general purpose register. inline GpReg(const GpReg& other) : Reg(other) {} #if !defined(ASMJIT_NODOC) inline GpReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline GpReg(const _Initialize&, uint32_t code) : Reg(code, static_cast(1U << ((code & kRegTypeMask) >> 12))) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline GpReg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline GpReg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [GpReg Specific] // -------------------------------------------------------------------------- //! @brief Get whether the general purpose register is BYTE (8-bit) type. inline bool isGpb() const { return (_reg.code & kRegTypeMask) <= kX86RegTypeGpbHi; } //! @brief Get whether the general purpose register is LO-BYTE (8-bit) type. inline bool isGpbLo() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpbLo; } //! @brief Get whether the general purpose register is HI-BYTE (8-bit) type. inline bool isGpbHi() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpbHi; } //! @brief Get whether the general purpose register is WORD (16-bit) type. inline bool isGpw() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpw; } //! @brief Get whether the general purpose register is DWORD (32-bit) type. //! //! This is default type for 32-bit platforms. inline bool isGpd() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpd; } //! @brief Get whether the general purpose register is QWORD (64-bit) type. //! //! This is default type for 64-bit platforms. inline bool isGpq() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpq; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline GpReg& operator=(const GpReg& other) { _copy(other); return *this; } inline bool operator==(const GpReg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const GpReg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::X87Reg] // ============================================================================ //! @brief 80-bit x87 floating point register. //! //! To create instance of x87 register, use @c st() function. struct X87Reg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized x87 register. inline X87Reg() : Reg(kInvalidValue, 10) {} //! @brief Create a reference to @a other x87 register. inline X87Reg(const X87Reg& other) : Reg(other) {} #if !defined(ASMJIT_NODOC) inline X87Reg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline X87Reg(const _Initialize&, uint32_t code) : Reg(code | kX86RegTypeX87, 10) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline X87Reg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline X87Reg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline X87Reg& operator=(const X87Reg& other) { _copy(other); return *this; } inline bool operator==(const X87Reg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const X87Reg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::MmReg] // ============================================================================ //! @brief 64-bit MMX register. struct MmReg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized MM register. inline MmReg() : Reg(kInvalidValue, 8) {} //! @brief Create a reference to @a other MM register. inline MmReg(const MmReg& other) : Reg(other) {} #if !defined(ASMJIT_NODOC) inline MmReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline MmReg(const _Initialize&, uint32_t code) : Reg(code, 8) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline MmReg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline MmReg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline MmReg& operator=(const MmReg& other) { _copy(other); return *this; } inline bool operator==(const MmReg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const MmReg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::XmmReg] // ============================================================================ //! @brief 128-bit SSE register. struct XmmReg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized XMM register. inline XmmReg() : Reg(kInvalidValue, 16) {} //! @brief Create a reference to @a other XMM register. inline XmmReg(const _Initialize&, uint32_t code) : Reg(code, 16) {} #if !defined(ASMJIT_NODOC) inline XmmReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline XmmReg(const XmmReg& other) : Reg(other) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline XmmReg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline XmmReg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline XmmReg& operator=(const XmmReg& other) { _copy(other); return *this; } inline bool operator==(const XmmReg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const XmmReg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::SegmentReg] // ============================================================================ //! @brief Segment register. struct SegmentReg : public Reg { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create non-initialized segment register. inline SegmentReg() : Reg(kInvalidValue, 2) {} //! @brief Create a reference to @a other segment register. inline SegmentReg(const _Initialize&, uint32_t code) : Reg(code, 2) {} #if !defined(ASMJIT_NODOC) inline SegmentReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {} inline SegmentReg(const SegmentReg& other) : Reg(other) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Set register code to @a code. inline SegmentReg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline SegmentReg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline SegmentReg& operator=(const SegmentReg& other) { _copy(other); return *this; } inline bool operator==(const SegmentReg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const SegmentReg& other) const { return getRegCode() != other.getRegCode(); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::Registers - no_reg] // ============================================================================ //! @brief No register, can be used only in @c Mem operand. ASMJIT_VAR const GpReg no_reg; // ============================================================================ // [AsmJit::Registers - 8-bit] // ============================================================================ //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg al; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg cl; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg dl; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg bl; #if defined(ASMJIT_X64) //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg spl; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg bpl; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg sil; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg dil; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r8b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r9b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r10b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r11b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r12b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r13b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r14b; //! @brief 8-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r15b; #endif // ASMJIT_X64 //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg ah; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg ch; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg dh; //! @brief 8-bit General purpose register. ASMJIT_VAR const GpReg bh; // ============================================================================ // [AsmJit::Registers - 16-bit] // ============================================================================ //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg ax; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg cx; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg dx; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg bx; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg sp; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg bp; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg si; //! @brief 16-bit General purpose register. ASMJIT_VAR const GpReg di; #if defined(ASMJIT_X64) //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r8w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r9w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r10w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r11w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r12w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r13w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r14w; //! @brief 16-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r15w; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - 32-bit] // ============================================================================ //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg eax; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg ecx; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg edx; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg ebx; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg esp; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg ebp; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg esi; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg edi; #if defined(ASMJIT_X64) //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r8d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r9d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r10d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r11d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r12d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r13d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r14d; //! @brief 32-bit General purpose register. ASMJIT_VAR const GpReg r15d; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - 64-bit] // ============================================================================ #if defined(ASMJIT_X64) //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rax; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rcx; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rdx; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rbx; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rsp; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rbp; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rsi; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg rdi; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r8; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r9; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r10; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r11; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r12; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r13; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r14; //! @brief 64-bit General purpose register (64-bit mode only). ASMJIT_VAR const GpReg r15; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - Native (AsmJit extension)] // ============================================================================ //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zax; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zcx; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zdx; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zbx; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zsp; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zbp; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zsi; //! @brief 32-bit or 64-bit General purpose register. ASMJIT_VAR const GpReg zdi; // ============================================================================ // [AsmJit::Registers - MM] // ============================================================================ //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm0; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm1; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm2; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm3; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm4; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm5; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm6; //! @brief 64-bit MM register. ASMJIT_VAR const MmReg mm7; // ============================================================================ // [AsmJit::Registers - XMM] // ============================================================================ //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm0; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm1; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm2; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm3; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm4; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm5; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm6; //! @brief 128-bit XMM register. ASMJIT_VAR const XmmReg xmm7; #if defined(ASMJIT_X64) //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm8; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm9; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm10; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm11; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm12; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm13; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm14; //! @brief 128-bit XMM register (64-bit mode only). ASMJIT_VAR const XmmReg xmm15; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - Segment] // ============================================================================ //! @brief CS segment register. ASMJIT_VAR const SegmentReg cs; //! @brief SS segment register. ASMJIT_VAR const SegmentReg ss; //! @brief DS segment register. ASMJIT_VAR const SegmentReg ds; //! @brief ES segment register. ASMJIT_VAR const SegmentReg es; //! @brief FS segment register. ASMJIT_VAR const SegmentReg fs; //! @brief GS segment register. ASMJIT_VAR const SegmentReg gs; // ============================================================================ // [AsmJit::Registers - Register From Index] // ============================================================================ //! @brief Get general purpose register of byte size. static inline GpReg gpb_lo(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpbLo)); } //! @brief Get general purpose register of byte size. static inline GpReg gpb_hi(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpbHi)); } //! @brief Get general purpose register of word size. static inline GpReg gpw(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpw)); } //! @brief Get general purpose register of dword size. static inline GpReg gpd(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpd)); } #if defined(ASMJIT_X64) //! @brief Get general purpose register of qword size (64-bit only). static inline GpReg gpq(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpq)); } #endif //! @brief Get general purpose dword/qword register (depending to architecture). static inline GpReg gpz(uint32_t index) { return GpReg(_Initialize(), static_cast(index | kX86RegTypeGpz)); } //! @brief Get MMX (MM) register . static inline MmReg mm(uint32_t index) { return MmReg(_Initialize(), static_cast(index | kX86RegTypeMm)); } //! @brief Get SSE (XMM) register. static inline XmmReg xmm(uint32_t index) { return XmmReg(_Initialize(), static_cast(index | kX86RegTypeXmm)); } //! @brief Get x87 register with index @a i. static inline X87Reg st(uint32_t i) { ASMJIT_ASSERT(i < 8); return X87Reg(_Initialize(), static_cast(i)); } // ============================================================================ // [AsmJit::Mem] // ============================================================================ //! @brief Memory operand. struct Mem : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline Mem() : Operand(_DontInitialize()) { _mem.op = kOperandMem; _mem.size = 0; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; _mem.sizePrefix = 0; _mem.shift = 0; _mem.id = kInvalidValue; _mem.base = kInvalidValue; _mem.index = kInvalidValue; _mem.target = NULL; _mem.displacement = 0; } inline Mem(const Label& label, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemLabel; _mem.segment = kX86SegNone; _mem.sizePrefix = 0; _mem.shift = 0; _mem.id = kInvalidValue; _mem.base = reinterpret_cast(label)._base.id; _mem.index = kInvalidValue; _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const GpReg& base, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; #if defined(ASMJIT_X86) _mem.sizePrefix = base.getSize() != 4; #else _mem.sizePrefix = base.getSize() != 8; #endif _mem.shift = 0; _mem.id = kInvalidValue; _mem.base = base.getRegCode() & kRegIndexMask; _mem.index = kInvalidValue; _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const GpVar& base, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; #if defined(ASMJIT_X86) _mem.sizePrefix = (reinterpret_cast(base)._var.size) != 4; #else _mem.sizePrefix = (reinterpret_cast(base)._var.size) != 8; #endif _mem.shift = 0; _mem.id = kInvalidValue; _mem.base = reinterpret_cast(base).getId(); _mem.index = kInvalidValue; _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const GpReg& base, const GpReg& index, uint32_t shift, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { ASMJIT_ASSERT(shift <= 3); _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; #if defined(ASMJIT_X86) _mem.sizePrefix = (base.getSize() | index.getSize()) != 4; #else _mem.sizePrefix = (base.getSize() | index.getSize()) != 8; #endif _mem.shift = (uint8_t)shift; _mem.id = kInvalidValue; _mem.base = base.getRegIndex(); _mem.index = index.getRegIndex(); _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const GpVar& base, const GpVar& index, uint32_t shift, sysint_t displacement, uint32_t size = 0) : Operand(_DontInitialize()) { ASMJIT_ASSERT(shift <= 3); _mem.op = kOperandMem; _mem.size = (uint8_t)size; _mem.type = kOperandMemNative; _mem.segment = kX86SegNone; #if defined(ASMJIT_X86) _mem.sizePrefix = (reinterpret_cast(base )._var.size | reinterpret_cast(index)._var.size ) != 4; #else _mem.sizePrefix = (reinterpret_cast(base )._var.size | reinterpret_cast(index)._var.size ) != 8; #endif _mem.shift = (uint8_t)shift; _mem.id = kInvalidValue; _mem.base = reinterpret_cast(base).getId(); _mem.index = reinterpret_cast(index).getId(); _mem.target = NULL; _mem.displacement = displacement; } inline Mem(const Mem& other) : Operand(other) { } inline Mem(const _DontInitialize& dontInitialize) : Operand(dontInitialize) { } // -------------------------------------------------------------------------- // [Mem Specific] // -------------------------------------------------------------------------- //! @brief Get type of memory operand, see @c kOperandMemType. inline uint32_t getMemType() const { return _mem.type; } //! @brief Get memory operand segment, see @c kX86Seg. inline uint32_t getSegment() const { return _mem.segment; } //! @brief Set memory operand segment, see @c kX86Seg. inline Mem& setSegment(uint32_t seg) { _mem.segment = static_cast(seg); return *this; } //! @brief Set memory operand segment, see @c kX86Seg. inline Mem& setSegment(const SegmentReg& seg) { _mem.segment = static_cast(seg.getRegIndex()); return *this; } //! @brief Get whether the memory operand has segment override prefix. inline bool hasSegment() const { return _mem.segment >= kX86SegCount; } //! @brief Get whether the memory operand has base register. inline bool hasBase() const { return _mem.base != kInvalidValue; } //! @brief Get whether the memory operand has index. inline bool hasIndex() const { return _mem.index != kInvalidValue; } //! @brief Get whether the memory operand has shift used. inline bool hasShift() const { return _mem.shift != 0; } //! @brief Get memory operand base register or @c kInvalidValue. inline uint32_t getBase() const { return _mem.base; } //! @brief Get memory operand index register or @c kInvalidValue. inline uint32_t getIndex() const { return _mem.index; } //! @brief Get memory operand index scale (0, 1, 2 or 3). inline uint32_t getShift() const { return _mem.shift; } //! @brief Get whether to use size-override prefix. //! //! @note This is useful only for MOV and LEA type of instructions. inline bool getSizePrefix() const { return _mem.sizePrefix; } //! @brief Set whether to use size-override prefix. inline Mem& setSizePrefix(bool b) { _mem.sizePrefix = b; return *this; } //! @brief Get absolute target address. //! //! @note You should always check if operand contains address by @c getMemType(). inline void* getTarget() const { return _mem.target; } //! @brief Set absolute target address. inline Mem& setTarget(void* target) { _mem.target = target; return *this; } //! @brief Set memory operand size. inline Mem& setSize(uint32_t size) { _mem.size = size; return *this; } //! @brief Get memory operand relative displacement. inline sysint_t getDisplacement() const { return _mem.displacement; } //! @brief Set memory operand relative displacement. inline Mem& setDisplacement(sysint_t displacement) { _mem.displacement = displacement; return *this; } //! @brief Adjust memory operand relative displacement by @a displacement. inline Mem& adjust(sysint_t displacement) { _mem.displacement += displacement; return *this; } //! @brief Get new memory operand adjusted by @a displacement. inline Mem adjusted(sysint_t displacement) const { Mem result(*this); result.adjust(displacement); return result; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline Mem& operator=(const Mem& other) { _copy(other); return *this; } inline bool operator==(const Mem& other) const { return _bin.u32[0] == other._bin.u32[0] && _bin.u32[1] == other._bin.u32[1] && _bin.u32[2] == other._bin.u32[2] && _bin.u32[3] == other._bin.u32[3] && _bin.uptr[0] == other._bin.uptr[0] && _bin.uptr[1] == other._bin.uptr[1]; } inline bool operator!=(const Mem& other) const { return !(*this == other); } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::Var] // ============================================================================ ASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size); ASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size, sysint_t disp); ASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size, const GpVar& index, uint32_t shift, sysint_t disp); //! @brief Base class for all variables. struct Var : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline Var(const _DontInitialize& dontInitialize) : Operand(dontInitialize) { } #endif // ASMJIT_NODOC inline Var() : Operand(_DontInitialize()) { _var.op = kOperandVar; _var.size = 0; _var.regCode = kInvalidValue; _var.varType = kInvalidValue; _var.id = kInvalidValue; } inline Var(const Var& other) : Operand(other) { } // -------------------------------------------------------------------------- // [Type] // -------------------------------------------------------------------------- inline uint32_t getVarType() const { return _var.varType; } inline bool isGpVar() const { return _var.varType <= kX86VarTypeGpq; } inline bool isX87Var() const { return _var.varType >= kX86VarTypeX87 && _var.varType <= kX86VarTypeX87SD; } inline bool isMmVar() const { return _var.varType == kX86VarTypeMm; } inline bool isXmmVar() const { return _var.varType >= kX86VarTypeXmm && _var.varType <= kX86VarTypeXmmPD; } // -------------------------------------------------------------------------- // [Memory Cast] // -------------------------------------------------------------------------- //! @brief Cast this variable to memory operand. //! //! @note Size of operand depends on native variable type, you can use other //! variants if you want specific one. inline Mem m() const { return _BaseVarMem(*this, kInvalidValue); } //! @overload. inline Mem m(sysint_t disp) const { return _BaseVarMem(*this, kInvalidValue, disp); } //! @overload. inline Mem m(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, kInvalidValue, index, shift, disp); } //! @brief Cast this variable to 8-bit memory operand. inline Mem m8() const { return _BaseVarMem(*this, 1); } //! @overload. inline Mem m8(sysint_t disp) const { return _BaseVarMem(*this, 1, disp); } //! @overload. inline Mem m8(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 1, index, shift, disp); } //! @brief Cast this variable to 16-bit memory operand. inline Mem m16() const { return _BaseVarMem(*this, 2); } //! @overload. inline Mem m16(sysint_t disp) const { return _BaseVarMem(*this, 2, disp); } //! @overload. inline Mem m16(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 2, index, shift, disp); } //! @brief Cast this variable to 32-bit memory operand. inline Mem m32() const { return _BaseVarMem(*this, 4); } //! @overload. inline Mem m32(sysint_t disp) const { return _BaseVarMem(*this, 4, disp); } //! @overload. inline Mem m32(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 4, index, shift, disp); } //! @brief Cast this variable to 64-bit memory operand. inline Mem m64() const { return _BaseVarMem(*this, 8); } //! @overload. inline Mem m64(sysint_t disp) const { return _BaseVarMem(*this, 8, disp); } //! @overload. inline Mem m64(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 8, index, shift, disp); } //! @brief Cast this variable to 80-bit memory operand (long double). inline Mem m80() const { return _BaseVarMem(*this, 10); } //! @overload. inline Mem m80(sysint_t disp) const { return _BaseVarMem(*this, 10, disp); } //! @overload. inline Mem m80(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 10, index, shift, disp); } //! @brief Cast this variable to 128-bit memory operand. inline Mem m128() const { return _BaseVarMem(*this, 16); } //! @overload. inline Mem m128(sysint_t disp) const { return _BaseVarMem(*this, 16, disp); } //! @overload. inline Mem m128(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const { return _BaseVarMem(*this, 16, index, shift, disp); } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline Var& operator=(const Var& other) { _copy(other); return *this; } inline bool operator==(const Var& other) const { return _base.id == other._base.id && _var.regCode == other._var.regCode; } inline bool operator!=(const Var& other) const { return _base.id != other._base.id || _var.regCode != other._var.regCode; } #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Private] // -------------------------------------------------------------------------- protected: inline Var(const Var& other, uint32_t regCode, uint32_t size) : Operand(_DontInitialize()) { _var.op = kOperandVar; _var.size = (uint8_t)size; _var.id = other._base.id; _var.regCode = regCode; _var.varType = other._var.varType; } }; // ============================================================================ // [AsmJit::X87Var] // ============================================================================ //! @brief X87 Variable operand. struct X87Var : public Var { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline X87Var(const _DontInitialize& dontInitialize) : Var(dontInitialize) { } inline X87Var() : Var(_DontInitialize()) { _var.op = kOperandVar; _var.size = 12; _var.id = kInvalidValue; _var.regCode = kX86RegTypeX87; _var.varType = kX86VarTypeX87; } inline X87Var(const X87Var& other) : Var(other) {} // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline X87Var& operator=(const X87Var& other) { _copy(other); return *this; } inline bool operator==(const X87Var& other) const { return _base.id == other._base.id; } inline bool operator!=(const X87Var& other) const { return _base.id != other._base.id; } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::GpVar] // ============================================================================ //! @brief GP variable operand. struct GpVar : public Var { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new uninitialized @c GpVar instance (internal constructor). inline GpVar(const _DontInitialize& dontInitialize) : Var(dontInitialize) { } //! @brief Create new uninitialized @c GpVar instance. inline GpVar() : Var(_DontInitialize()) { _var.op = kOperandVar; _var.size = sizeof(sysint_t); _var.id = kInvalidValue; _var.regCode = kX86RegTypeGpz; _var.varType = kX86VarTypeGpz; } //! @brief Create new @c GpVar instance using @a other. //! //! Note this will not create a different variable, use @c Compiler::newGpVar() //! if you want to do so. This is only copy-constructor that allows to store //! the same variable in different places. inline GpVar(const GpVar& other) : Var(other) {} // -------------------------------------------------------------------------- // [GpVar Specific] // -------------------------------------------------------------------------- //! @brief Get whether this variable is general purpose BYTE register. inline bool isGpb() const { return (_var.regCode & kRegTypeMask) <= kX86RegTypeGpbHi; } //! @brief Get whether this variable is general purpose BYTE.LO register. inline bool isGpbLo() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpbLo; } //! @brief Get whether this variable is general purpose BYTE.HI register. inline bool isGpbHi() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpbHi; } //! @brief Get whether this variable is general purpose WORD register. inline bool isGpw() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpw; } //! @brief Get whether this variable is general purpose DWORD register. inline bool isGpd() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpd; } //! @brief Get whether this variable is general purpose QWORD (only 64-bit) register. inline bool isGpq() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpq; } // -------------------------------------------------------------------------- // [GpVar Cast] // -------------------------------------------------------------------------- //! @brief Cast this variable to 8-bit (LO) part of variable inline GpVar r8() const { return GpVar(*this, kX86RegTypeGpbLo, 1); } //! @brief Cast this variable to 8-bit (LO) part of variable inline GpVar r8Lo() const { return GpVar(*this, kX86RegTypeGpbLo, 1); } //! @brief Cast this variable to 8-bit (HI) part of variable inline GpVar r8Hi() const { return GpVar(*this, kX86RegTypeGpbHi, 1); } //! @brief Cast this variable to 16-bit part of variable inline GpVar r16() const { return GpVar(*this, kX86RegTypeGpw, 2); } //! @brief Cast this variable to 32-bit part of variable inline GpVar r32() const { return GpVar(*this, kX86RegTypeGpd, 4); } #if defined(ASMJIT_X64) //! @brief Cast this variable to 64-bit part of variable inline GpVar r64() const { return GpVar(*this, kX86RegTypeGpq, 8); } #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline GpVar& operator=(const GpVar& other) { _copy(other); return *this; } inline bool operator==(const GpVar& other) const { return _base.id == other._base.id && _var.regCode == other._var.regCode; } inline bool operator!=(const GpVar& other) const { return _base.id != other._base.id || _var.regCode != other._var.regCode; } #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Private] // -------------------------------------------------------------------------- protected: inline GpVar(const GpVar& other, uint32_t regCode, uint32_t size) : Var(other, regCode, size) { } }; // ============================================================================ // [AsmJit::MmVar] // ============================================================================ //! @brief MM variable operand. struct MmVar : public Var { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new uninitialized @c MmVar instance (internal constructor). inline MmVar(const _DontInitialize& dontInitialize) : Var(dontInitialize) { } //! @brief Create new uninitialized @c MmVar instance. inline MmVar() : Var(_DontInitialize()) { _var.op = kOperandVar; _var.size = 8; _var.id = kInvalidValue; _var.regCode = kX86RegTypeMm; _var.varType = kX86VarTypeMm; } //! @brief Create new @c MmVar instance using @a other. //! //! Note this will not create a different variable, use @c Compiler::newMmVar() //! if you want to do so. This is only copy-constructor that allows to store //! the same variable in different places. inline MmVar(const MmVar& other) : Var(other) {} // -------------------------------------------------------------------------- // [MmVar Cast] // -------------------------------------------------------------------------- // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline MmVar& operator=(const MmVar& other) { _copy(other); return *this; } inline bool operator==(const MmVar& other) const { return _base.id == other._base.id; } inline bool operator!=(const MmVar& other) const { return _base.id != other._base.id; } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::XmmVar] // ============================================================================ //! @brief XMM Variable operand. struct XmmVar : public Var { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline XmmVar(const _DontInitialize& dontInitialize) : Var(dontInitialize) { } inline XmmVar() : Var(_DontInitialize()) { _var.op = kOperandVar; _var.size = 16; _var.id = kInvalidValue; _var.regCode = kX86RegTypeXmm; _var.varType = kX86VarTypeXmm; } inline XmmVar(const XmmVar& other) : Var(other) {} // -------------------------------------------------------------------------- // [XmmVar Access] // -------------------------------------------------------------------------- // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline XmmVar& operator=(const XmmVar& other) { _copy(other); return *this; } inline bool operator==(const XmmVar& other) const { return _base.id == other._base.id; } inline bool operator!=(const XmmVar& other) const { return _base.id != other._base.id; } #endif // ASMJIT_NODOC }; // ============================================================================ // [AsmJit::Mem - [label + displacement]] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const Label& label, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - [label + index << shift + displacement]] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, sizeof(sysint_t)); } //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - segment[target + displacement] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr_abs(void* target, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeQWord); } //! @brief Create a tword pointer operand (used for 80-bit floating points). static inline Mem tword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - segment[target + index << shift + displacement] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, sizeof(sysint_t)); } //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - ptr[base + displacement]] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const GpReg& base, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, sizeof(sysint_t)); } //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const GpVar& base, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Mem - ptr[base + (index << shift) + displacement]] // ============================================================================ //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, sizeof(sysint_t)); } //! @brief Create a custom pointer operand. ASMJIT_API Mem ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0, uint32_t size = 0); //! @brief Create a byte pointer operand. static inline Mem byte_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeByte); } //! @brief Create a word pointer operand. static inline Mem word_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeWord); } //! @brief Create a dword pointer operand. static inline Mem dword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDWord); } //! @brief Create a qword pointer operand. static inline Mem qword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); } //! @brief Create a tword pointer operand. static inline Mem tword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeTWord); } //! @brief Create a dqword pointer operand. static inline Mem dqword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); } //! @brief Create a mmword pointer operand. static inline Mem mmword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); } //! @brief Create a xmmword pointer operand. static inline Mem xmmword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); } //! @brief Create an intptr_t pointer operand. static inline Mem sysint_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, sizeof(sysint_t)); } // ============================================================================ // [AsmJit::Macros] // ============================================================================ //! @brief Create Shuffle Constant for MMX/SSE shuffle instrutions. //! @param z First component position, number at interval [0, 3] inclusive. //! @param x Second component position, number at interval [0, 3] inclusive. //! @param y Third component position, number at interval [0, 3] inclusive. //! @param w Fourth component position, number at interval [0, 3] inclusive. //! //! Shuffle constants can be used to make immediate value for these intrinsics: //! - @ref X86Assembler::pshufw() //! - @ref X86Assembler::pshufd() //! - @ref X86Assembler::pshufhw() //! - @ref X86Assembler::pshuflw() //! - @ref X86Assembler::shufps() static inline uint8_t mm_shuffle(uint8_t z, uint8_t y, uint8_t x, uint8_t w) { return (z << 6) | (y << 4) | (x << 2) | w; } //! @} } // AsmJit namespace // [Guard] #endif // _ASMJIT_X86_X86OPERAND_H desmume-0.9.9/src/utils/AsmJit/x86/x86func.h0000644000175000017500000002235212140261626021143 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86FUNC_H #define _ASMJIT_X86_X86FUNC_H // [Dependencies - AsmJit] #include "../core/defs.h" #include "../core/func.h" #include "../x86/x86defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::TypeId] // ============================================================================ ASMJIT_DECLARE_TYPE_CORE(kX86VarTypeIntPtr); ASMJIT_DECLARE_TYPE_ID(void, kVarTypeInvalid); ASMJIT_DECLARE_TYPE_ID(Void, kVarTypeInvalid); ASMJIT_DECLARE_TYPE_ID(int8_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(uint8_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(int16_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(uint16_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(int32_t, kX86VarTypeGpd); ASMJIT_DECLARE_TYPE_ID(uint32_t, kX86VarTypeGpd); #if defined(ASMJIT_X64) ASMJIT_DECLARE_TYPE_ID(int64_t, kX86VarTypeGpq); ASMJIT_DECLARE_TYPE_ID(uint64_t, kX86VarTypeGpq); #endif // ASMJIT_X64 ASMJIT_DECLARE_TYPE_ID(float, kX86VarTypeFloat); ASMJIT_DECLARE_TYPE_ID(double, kX86VarTypeDouble); // ============================================================================ // [AsmJit::X86FuncDecl] // ============================================================================ //! @brief X86 function, including calling convention, arguments and their //! register indices or stack positions. struct X86FuncDecl : public FuncDecl { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref FunctionX86 instance. inline X86FuncDecl() { reset(); } // -------------------------------------------------------------------------- // [Accessors - Core] // -------------------------------------------------------------------------- //! @brief Get stack size needed for function arguments passed on the stack. inline uint32_t getArgumentsStackSize() const { return _argumentsStackSize; } //! @brief Get bit-mask of GP registers used to pass function arguments. inline uint32_t getGpArgumentsMask() const { return _gpArgumentsMask; } //! @brief Get bit-mask of MM registers used to pass function arguments. inline uint32_t getMmArgumentsMask() const { return _mmArgumentsMask; } //! @brief Get bit-mask of XMM registers used to pass function arguments. inline uint32_t getXmmArgumentsMask() const { return _xmmArgumentsMask; } // -------------------------------------------------------------------------- // [Accessors - Convention] // -------------------------------------------------------------------------- //! @brief Get function calling convention, see @c kX86FuncConv. inline uint32_t getConvention() const { return _convention; } //! @brief Get whether the callee pops the stack. inline uint32_t getCalleePopsStack() const { return _calleePopsStack; } //! @brief Get direction of arguments passed on the stack. //! //! Direction should be always @c kFuncArgsRTL. //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline uint32_t getArgumentsDirection() const { return _argumentsDirection; } //! @brief Get registers used to pass first integer parameters by current //! calling convention. //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline const uint8_t* getGpList() const { return _gpList; } //! @brief Get registers used to pass first SP-FP or DP-FPparameters by //! current calling convention. //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline const uint8_t* getXmmList() const { return _xmmList; } //! @brief Get bit-mask of GP registers which might be used for arguments. inline uint32_t getGpListMask() const { return _gpListMask; } //! @brief Get bit-mask of MM registers which might be used for arguments. inline uint32_t getMmListMask() const { return _mmListMask; } //! @brief Get bit-mask of XMM registers which might be used for arguments. inline uint32_t getXmmListMask() const { return _xmmListMask; } //! @brief Get bit-mask of general purpose registers that's preserved //! (non-volatile). //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline uint32_t getGpPreservedMask() const { return _gpPreservedMask; } //! @brief Get bit-mask of MM registers that's preserved (non-volatile). //! //! @note No standardized calling function is not preserving MM registers. //! This member is here for extension writers who need for some reason custom //! calling convention that can be called through code generated by AsmJit //! (or other runtime code generator). inline uint32_t getMmPreservedMask() const { return _mmPreservedMask; } //! @brief Get bit-mask of XMM registers that's preserved (non-volatile). //! //! @note This is related to used calling convention, it's not affected by //! number of function arguments or their types. inline uint32_t getXmmPreservedMask() const { return _xmmPreservedMask; } // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Find argument ID by the register code. ASMJIT_API uint32_t findArgumentByRegCode(uint32_t regCode) const; // -------------------------------------------------------------------------- // [SetPrototype] // -------------------------------------------------------------------------- //! @brief Set function prototype. //! //! This will set function calling convention and setup arguments variables. //! //! @note This function will allocate variables, it can be called only once. ASMJIT_API void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount); // -------------------------------------------------------------------------- // [Reset] // -------------------------------------------------------------------------- ASMJIT_API void reset(); // -------------------------------------------------------------------------- // [Members - Core] // -------------------------------------------------------------------------- //! @brief Count of bytes consumed by arguments on the stack. uint16_t _argumentsStackSize; //! @brief Bitmask for GP registers used as passed function arguments. uint16_t _gpArgumentsMask; //! @brief Bitmask for MM registers used as passed function arguments. uint16_t _mmArgumentsMask; //! @brief Bitmask for XMM registers used as passed function arguments. uint16_t _xmmArgumentsMask; // -------------------------------------------------------------------------- // [Membes - Convention] // // This section doesn't depend on function arguments or return type. It // depends only on function calling convention and it's filled according to // that value. // -------------------------------------------------------------------------- //! @brief Calling convention. uint8_t _convention; //! @brief Whether a callee pops stack. uint8_t _calleePopsStack; //! @brief Direction for arguments passed on the stack, see @c kFuncArgsDirection. uint8_t _argumentsDirection; //! @brief Reserved for future use #1 (alignment). uint8_t _reserved1; //! @brief List of register IDs used for GP arguments (order is important). //! //! @note All registers in _gpList are also specified in @ref _gpListMask. //! Unused fields are filled by @ref kRegIndexInvalid. uint8_t _gpList[16]; //! @brief List of register IDs used for XMM arguments (order is important). //! //! @note All registers in _gpList are also specified in @ref _xmmListMask. //! Unused fields are filled by @ref kRegIndexInvalid. uint8_t _xmmList[16]; //! @brief Bitmask for GP registers which might be used by arguments. //! //! @note All registers in _gpListMask are also specified in @ref _gpList. uint16_t _gpListMask; //! @brief Bitmask for MM registers which might be used by arguments. uint16_t _mmListMask; //! @brief Bitmask for XMM registers which might be used by arguments. //! //! @note All registers in _xmmListMask are also specified in @ref _xmmList. uint16_t _xmmListMask; //! @brief Bitmask for GP registers preserved across the function call. //! //! @note Preserved register mask is complement to @ref _gpListMask. uint16_t _gpPreservedMask; //! @brief Bitmask for MM registers preserved across the function call. //! //! @note Preserved register mask is complement to @ref _mmListMask. uint16_t _mmPreservedMask; //! @brief Bitmask for XMM registers preserved across the function call. //! //! @note Preserved register mask is complement to @ref _xmmListMask. uint16_t _xmmPreservedMask; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86FUNC_H desmume-0.9.9/src/utils/AsmJit/x86/x86util.h0000644000175000017500000000735012140261626021166 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86UTIL_H #define _ASMJIT_X86_X86UTIL_H // [Dependencies - AsmJit] #include "../x86/x86defs.h" #include "../x86/x86operand.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86Util] // ============================================================================ //! @brief Map condition code to "jcc" group of instructions. ASMJIT_VAR const uint32_t _x86UtilJccFromCond[20]; //! @brief Map condition code to "cmovcc" group of instructions. ASMJIT_VAR const uint32_t _x86UtilMovccFromCond[20]; //! @brief Map condition code to "setcc" group of instructions. ASMJIT_VAR const uint32_t _x86UtilSetccFromCond[20]; //! @brief Map condition code to reversed condition code. ASMJIT_VAR const uint32_t _x86UtilReversedCond[20]; struct X86Util { // -------------------------------------------------------------------------- // [Condition Codes] // -------------------------------------------------------------------------- //! @brief Get the equivalent of negated condition code. static inline uint32_t getNegatedCond(uint32_t cond) { return static_cast(cond ^ static_cast(cond < kX86CondNone)); } //! @brief Corresponds to transposing the operands of a comparison. static inline uint32_t getReversedCond(uint32_t cond) { ASMJIT_ASSERT(static_cast(cond) < ASMJIT_ARRAY_SIZE(_x86UtilReversedCond)); return _x86UtilReversedCond[cond]; } //! @brief Translate condition code @a cc to jcc instruction code. //! @sa @c kX86InstCode, @c kX86InstJ. static inline uint32_t getJccInstFromCond(uint32_t cond) { ASMJIT_ASSERT(static_cast(cond) < ASMJIT_ARRAY_SIZE(_x86UtilJccFromCond)); return _x86UtilJccFromCond[cond]; } //! @brief Translate condition code @a cc to cmovcc instruction code. //! @sa @c kX86InstCode, @c kX86InstCMov. static inline uint32_t getCMovccInstFromCond(uint32_t cond) { ASMJIT_ASSERT(static_cast(cond) < ASMJIT_ARRAY_SIZE(_x86UtilMovccFromCond)); return _x86UtilMovccFromCond[cond]; } //! @brief Translate condition code @a cc to setcc instruction code. //! @sa @c kX86InstCode, @c kX86InstSet. static inline uint32_t getSetccInstFromCond(uint32_t cond) { ASMJIT_ASSERT(static_cast(cond) < ASMJIT_ARRAY_SIZE(_x86UtilSetccFromCond)); return _x86UtilSetccFromCond[cond]; } // -------------------------------------------------------------------------- // [Variables] // -------------------------------------------------------------------------- static inline uint32_t getVarClassFromVarType(uint32_t varType) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return x86VarInfo[varType].getClass(); } static inline uint32_t getVarSizeFromVarType(uint32_t varType) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return x86VarInfo[varType].getSize(); } static inline uint32_t getRegCodeFromVarType(uint32_t varType, uint32_t regIndex) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return x86VarInfo[varType].getCode() | regIndex; } static inline bool isVarTypeInt(uint32_t varType) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return (x86VarInfo[varType].getClass() & kX86VarClassGp) != 0; } static inline bool isVarTypeFloat(uint32_t varType) { ASMJIT_ASSERT(varType < kX86VarTypeCount); return (x86VarInfo[varType].getFlags() & (kX86VarFlagSP | kX86VarFlagDP)) != 0; } }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86UTIL_H desmume-0.9.9/src/utils/AsmJit/x86/x86cpuinfo.cpp0000644000175000017500000002335012140261626022205 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../x86/x86cpuinfo.h" #include "../x86/x86defs.h" // 2009-02-05: Thanks to Mike Tajmajer for VC7.1 compiler support. It shouldn't // affect x64 compilation, because x64 compiler starts with VS2005 (VC8.0). #if defined(_MSC_VER) # if _MSC_VER >= 1400 # include # endif // _MSC_VER >= 1400 (>= VS2005) #endif // _MSC_VER // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::X86CpuVendor] // ============================================================================ struct X86CpuVendor { uint32_t id; char text[12]; }; static const X86CpuVendor x86CpuVendor[] = { { kCpuIntel , { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' } }, { kCpuAmd , { 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' } }, { kCpuAmd , { 'A', 'M', 'D', 'i', 's', 'b', 'e', 't', 't', 'e', 'r', '!' } }, { kCpuNSM , { 'G', 'e', 'o', 'd', 'e', ' ', 'b', 'y', ' ', 'N', 'S', 'C' } }, { kCpuNSM , { 'C', 'y', 'r', 'i', 'x', 'I', 'n', 's', 't', 'e', 'a', 'd' } }, { kCpuTransmeta, { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'T', 'M', 'x', '8', '6' } }, { kCpuTransmeta, { 'T', 'r', 'a', 'n', 's', 'm', 'e', 't', 'a', 'C', 'P', 'U' } }, { kCpuVia , { 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 } }, { kCpuVia , { 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' } } }; static inline bool x86CpuVendorEq(const X86CpuVendor& info, const char* vendorString) { const uint32_t* a = reinterpret_cast(info.text); const uint32_t* b = reinterpret_cast(vendorString); return (a[0] == b[0]) & (a[1] == b[1]) & (a[2] == b[2]) ; } // ============================================================================ // [AsmJit::x86CpuSimplifyBrandString] // ============================================================================ static inline void x86CpuSimplifyBrandString(char* s) { // Always clear the current character in the buffer. This ensures that there // is no garbage after the string NULL terminator. char* d = s; char prev = 0; char curr = s[0]; s[0] = '\0'; for (;;) { if (curr == 0) break; if (curr == ' ') { if (prev == '@') goto _Skip; if (s[1] == ' ' || s[1] == '@') goto _Skip; } d[0] = curr; d++; prev = curr; _Skip: curr = *++s; s[0] = '\0'; } d[0] = '\0'; } // ============================================================================ // [AsmJit::x86CpuId] // ============================================================================ // This is messy, I know. cpuid is implemented as intrinsic in VS2005, but // we should support other compilers as well. Main problem is that MS compilers // in 64-bit mode not allows to use inline assembler, so we need intrinsic and // we need also asm version. // x86CpuId() and detectCpuInfo() for x86 and x64 platforms begins here. #if defined(ASMJIT_X86) || defined(ASMJIT_X64) void x86CpuId(uint32_t in, X86CpuId* out) { #if defined(_MSC_VER) // 2009-02-05: Thanks to Mike Tajmajer for supporting VC7.1 compiler. // ASMJIT_X64 is here only for readibility, only VS2005 can compile 64-bit code. # if _MSC_VER >= 1400 || defined(ASMJIT_X64) // Done by intrinsics. __cpuid(reinterpret_cast(out->i), in); # else // _MSC_VER < 1400 uint32_t cpuid_in = in; uint32_t* cpuid_out = out->i; __asm { mov eax, cpuid_in mov edi, cpuid_out cpuid mov dword ptr[edi + 0], eax mov dword ptr[edi + 4], ebx mov dword ptr[edi + 8], ecx mov dword ptr[edi + 12], edx } # endif // _MSC_VER < 1400 #elif defined(__GNUC__) // Note, need to preserve ebx/rbx register! # if defined(ASMJIT_X86) # define __myCpuId(a, b, c, d, inp) \ asm ("mov %%ebx, %%edi\n" \ "cpuid\n" \ "xchg %%edi, %%ebx\n" \ : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) # else # define __myCpuId(a, b, c, d, inp) \ asm ("mov %%rbx, %%rdi\n" \ "cpuid\n" \ "xchg %%rdi, %%rbx\n" \ : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) # endif __myCpuId(out->eax, out->ebx, out->ecx, out->edx, in); #endif // Compiler #ifdef. } // ============================================================================ // [AsmJit::x86CpuDetect] // ============================================================================ void x86CpuDetect(X86CpuInfo* out) { uint32_t i; X86CpuId regs; // Clear everything except the '_size' member. memset(reinterpret_cast(out) + sizeof(uint32_t), 0, sizeof(CpuInfo) - sizeof(uint32_t)); // Fill safe defaults. memcpy(out->_vendorString, "Unknown", 8); out->_numberOfProcessors = CpuInfo::detectNumberOfProcessors(); // Get vendor string/id. x86CpuId(0, ®s); memcpy(out->_vendorString, ®s.ebx, 4); memcpy(out->_vendorString + 4, ®s.edx, 4); memcpy(out->_vendorString + 8, ®s.ecx, 4); for (i = 0; i < 3; i++) { if (x86CpuVendorEq(x86CpuVendor[i], out->_vendorString)) { out->_vendorId = x86CpuVendor[i].id; break; } } // Get feature flags in ecx/edx, and family/model in eax. x86CpuId(1, ®s); // Fill family and model fields. out->_family = (regs.eax >> 8) & 0x0F; out->_model = (regs.eax >> 4) & 0x0F; out->_stepping = (regs.eax ) & 0x0F; // Use extended family and model fields. if (out->_family == 0x0F) { out->_family += ((regs.eax >> 20) & 0xFF); out->_model += ((regs.eax >> 16) & 0x0F) << 4; } out->_processorType = ((regs.eax >> 12) & 0x03); out->_brandIndex = ((regs.ebx ) & 0xFF); out->_flushCacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8; out->_maxLogicalProcessors = ((regs.ebx >> 16) & 0xFF); out->_apicPhysicalId = ((regs.ebx >> 24) & 0xFF); if (regs.ecx & 0x00000001U) out->_features |= kX86FeatureSse3; if (regs.ecx & 0x00000002U) out->_features |= kX86FeaturePclMulDQ; if (regs.ecx & 0x00000008U) out->_features |= kX86FeatureMonitorMWait; if (regs.ecx & 0x00000200U) out->_features |= kX86FeatureSsse3; if (regs.ecx & 0x00002000U) out->_features |= kX86FeatureCmpXchg16B; if (regs.ecx & 0x00080000U) out->_features |= kX86FeatureSse41; if (regs.ecx & 0x00100000U) out->_features |= kX86FeatureSse42; if (regs.ecx & 0x00400000U) out->_features |= kX86FeatureMovBE; if (regs.ecx & 0x00800000U) out->_features |= kX86FeaturePopCnt; if (regs.ecx & 0x10000000U) out->_features |= kX86FeatureAvx; if (regs.edx & 0x00000010U) out->_features |= kX86FeatureRdtsc; if (regs.edx & 0x00000100U) out->_features |= kX86FeatureCmpXchg8B; if (regs.edx & 0x00008000U) out->_features |= kX86FeatureCMov; if (regs.edx & 0x00800000U) out->_features |= kX86FeatureMmx; if (regs.edx & 0x01000000U) out->_features |= kX86FeatureFXSR; if (regs.edx & 0x02000000U) out->_features |= kX86FeatureSse | kX86FeatureMmxExt; if (regs.edx & 0x04000000U) out->_features |= kX86FeatureSse | kX86FeatureSse2; if (regs.edx & 0x10000000U) out->_features |= kX86FeatureMultiThreading; if (out->_vendorId == kCpuAmd && (regs.edx & 0x10000000U)) { // AMD sets Multithreading to ON if it has more cores. if (out->_numberOfProcessors == 1) out->_numberOfProcessors = 2; } // This comment comes from V8 and I think that its important: // // Opteron Rev E has i bug in which on very rare occasions i locked // instruction doesn't act as i read-acquire barrier if followed by i // non-locked read-modify-write instruction. Rev F has this bug in // pre-release versions, but not in versions released to customers, // so we test only for Rev E, which is family 15, model 32..63 inclusive. if (out->_vendorId == kCpuAmd && out->_family == 15 && out->_model >= 32 && out->_model <= 63) { out->_bugs |= kX86BugAmdLockMB; } // Calling cpuid with 0x80000000 as the in argument // gets the number of valid extended IDs. x86CpuId(0x80000000, ®s); uint32_t exIds = regs.eax; if (exIds > 0x80000004) exIds = 0x80000004; uint32_t* brand = reinterpret_cast(out->_brandString); for (i = 0x80000001; i <= exIds; i++) { x86CpuId(i, ®s); switch (i) { case 0x80000001: if (regs.ecx & 0x00000001U) out->_features |= kX86FeatureLahfSahf; if (regs.ecx & 0x00000020U) out->_features |= kX86FeatureLzCnt; if (regs.ecx & 0x00000040U) out->_features |= kX86FeatureSse4A; if (regs.ecx & 0x00000080U) out->_features |= kX86FeatureMSse; if (regs.ecx & 0x00000100U) out->_features |= kX86FeaturePrefetch; if (regs.edx & 0x00100000U) out->_features |= kX86FeatureExecuteDisableBit; if (regs.edx & 0x00200000U) out->_features |= kX86FeatureFFXSR; if (regs.edx & 0x00400000U) out->_features |= kX86FeatureMmxExt; if (regs.edx & 0x08000000U) out->_features |= kX86FeatureRdtscP; if (regs.edx & 0x20000000U) out->_features |= kX86Feature64Bit; if (regs.edx & 0x40000000U) out->_features |= kX86Feature3dNowExt | kX86FeatureMmxExt; if (regs.edx & 0x80000000U) out->_features |= kX86Feature3dNow; break; case 0x80000002: case 0x80000003: case 0x80000004: *brand++ = regs.eax; *brand++ = regs.ebx; *brand++ = regs.ecx; *brand++ = regs.edx; break; default: // Additional features can be detected in the future. break; } } // Simplify the brand string (remove unnecessary spaces to make it printable). x86CpuSimplifyBrandString(out->_brandString); } #endif } // AsmJit // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86compilerfunc.h0000644000175000017500000003407212140261626022700 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86COMPILERFUNC_H #define _ASMJIT_X86_X86COMPILERFUNC_H // [Dependencies - AsmJit] #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" #include "../x86/x86compileritem.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86CompilerFuncDecl] // ============================================================================ //! @brief @ref X86Compiler specific function declaration item. struct X86CompilerFuncDecl : public CompilerFuncDecl { ASMJIT_NO_COPY(X86CompilerFuncDecl) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerFuncDecl instance. ASMJIT_API X86CompilerFuncDecl(X86Compiler* x86Compiler); //! @brief Destroy the @ref X86CompilerFuncDecl instance. ASMJIT_API virtual ~X86CompilerFuncDecl(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get function end item as @ref X86CompilerFuncEnd. inline X86CompilerFuncEnd* getEnd() const { return reinterpret_cast(_end); } //! @brief Get function declaration as @ref X86FuncDecl. inline X86FuncDecl* getDecl() const { return reinterpret_cast(_decl); } //! @brief Get function arguments as variables as @ref X86CompilerVar. inline X86CompilerVar** getVars() const { return reinterpret_cast(_vars); } //! @brief Get function argument at @a index. inline X86CompilerVar* getVar(uint32_t index) const { ASMJIT_ASSERT(index < _x86Decl.getArgumentsCount()); return reinterpret_cast(_vars)[index]; } //! @brief Get whether it's assumed that stack is aligned to 16 bytes. inline bool isAssumed16ByteAlignment() const { return hasFuncFlag(kX86FuncFlagAssume16ByteAlignment); } //! @brief Get whether it's required to align stack to 16 bytes by function. inline bool isPerformed16ByteAlignment() const { return hasFuncFlag(kX86FuncFlagPerform16ByteAlignment); } //! @brief Get whether the ESP is adjusted. inline bool isEspAdjusted() const { return hasFuncFlag(kX86FuncFlagIsEspAdjusted); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; // -------------------------------------------------------------------------- // [Prototype] // -------------------------------------------------------------------------- ASMJIT_API virtual void setPrototype( uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount); // -------------------------------------------------------------------------- // [Helpers] // -------------------------------------------------------------------------- //! @internal //! //! @brief Get required stack offset needed to subtract/add Esp/Rsp in //! prolog/epilog. inline int32_t _getRequiredStackOffset() const { return _funcCallStackSize + _memStackSize16 + _peMovStackSize + _peAdjustStackSize; } //! @brief Create variables from FunctionPrototype declaration. This is just //! parsing what FunctionPrototype generated for current function calling //! convention and arguments. ASMJIT_API void _createVariables(); //! @brief Prepare variables (ids, names, scope, registers). ASMJIT_API void _prepareVariables(CompilerItem* first); //! @brief Allocate variables (setting correct state, changing masks, etc). ASMJIT_API void _allocVariables(CompilerContext& cc); ASMJIT_API void _preparePrologEpilog(CompilerContext& cc); ASMJIT_API void _dumpFunction(CompilerContext& cc); ASMJIT_API void _emitProlog(CompilerContext& cc); ASMJIT_API void _emitEpilog(CompilerContext& cc); // -------------------------------------------------------------------------- // [Function-Call] // -------------------------------------------------------------------------- //! @brief Reserve stack for calling other function and mark function as //! callee. ASMJIT_API void reserveStackForFunctionCall(int32_t size); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief X86 function decl. X86FuncDecl _x86Decl; //! @brief Modified and preserved GP registers mask. uint32_t _gpModifiedAndPreserved; //! @brief Modified and preserved MM registers mask. uint32_t _mmModifiedAndPreserved; //! @brief Modified and preserved XMM registers mask. uint32_t _xmmModifiedAndPreserved; //! @brief Id of MovDQWord instruction (@c kX86InstMovDQA or @c kX86InstMovDQU). //! //! The value is based on stack alignment. If it's guaranteed that stack //! is aligned to 16-bytes then @c kX86InstMovDQA instruction is used, otherwise //! the @c kX86InstMovDQU instruction is used for 16-byte mov. uint32_t _movDqInstCode; //! @brief Prolog / epilog stack size for PUSH/POP sequences. int32_t _pePushPopStackSize; //! @brief Prolog / epilog stack size for MOV sequences. int32_t _peMovStackSize; //! @brief Prolog / epilog stack adjust size (to make it 16-byte aligned). int32_t _peAdjustStackSize; //! @brief Memory stack size (for all variables and temporary memory). int32_t _memStackSize; //! @brief Like @c _memStackSize, but aligned to 16-bytes. int32_t _memStackSize16; }; // ============================================================================ // [AsmJit::X86CompilerFuncEnd] // ============================================================================ //! @brief @ref X86Compiler function end item. struct X86CompilerFuncEnd : public CompilerFuncEnd { ASMJIT_NO_COPY(X86CompilerFuncEnd) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerFuncEnd instance. ASMJIT_API X86CompilerFuncEnd(X86Compiler* x86Compiler, X86CompilerFuncDecl* func); //! @brief Destroy the @ref X86CompilerFuncEnd instance. ASMJIT_API virtual ~X86CompilerFuncEnd(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get related function as @ref X86CompilerFuncDecl. inline X86CompilerFuncDecl* getFunc() const { return reinterpret_cast(_func); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); }; // ============================================================================ // [AsmJit::X86CompilerFuncRet] // ============================================================================ //! @brief Function return. struct X86CompilerFuncRet : public CompilerFuncRet { ASMJIT_NO_COPY(X86CompilerFuncRet) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerFuncRet instance. ASMJIT_API X86CompilerFuncRet(X86Compiler* c, X86CompilerFuncDecl* func, const Operand* first, const Operand* second); //! @brief Destroy the @ref X86CompilerFuncRet instance. ASMJIT_API virtual ~X86CompilerFuncRet(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @Brief Get related function as @ref X86CompilerFuncDecl. inline X86CompilerFuncDecl* getFunc() const { return reinterpret_cast(_func); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; }; // ============================================================================ // [AsmJit::X86CompilerFuncCall] // ============================================================================ //! @brief Compiler function call item. struct X86CompilerFuncCall : public CompilerFuncCall { ASMJIT_NO_COPY(X86CompilerFuncCall) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerFuncCall instance. ASMJIT_API X86CompilerFuncCall(X86Compiler* x86Compiler, X86CompilerFuncDecl* caller, const Operand* target); //! @brief Destroy the @ref X86CompilerFuncCall instance. ASMJIT_API virtual ~X86CompilerFuncCall(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get caller as @ref X86CompilerFuncDecl. inline X86CompilerFuncDecl* getCaller() const { return reinterpret_cast(_caller); } //! @brief Get function prototype. inline const X86FuncDecl* getDecl() const { return reinterpret_cast(_decl); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v); // -------------------------------------------------------------------------- // [Prototype] // -------------------------------------------------------------------------- ASMJIT_API virtual void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount); //! @brief Set function prototype. inline void setPrototype(uint32_t convention, const FuncPrototype& func) { setPrototype(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); } //! @brief Set return value. ASMJIT_API bool setReturn(const Operand& first, const Operand& second = Operand()); //! @brief Set function argument @a i to @a var. ASMJIT_API bool setArgument(uint32_t i, const Var& var); //! @brief Set function argument @a i to @a imm. ASMJIT_API bool setArgument(uint32_t i, const Imm& imm); // -------------------------------------------------------------------------- // [Internal] // -------------------------------------------------------------------------- ASMJIT_API uint32_t _findTemporaryGpRegister(CompilerContext& cc); ASMJIT_API uint32_t _findTemporaryXmmRegister(CompilerContext& cc); ASMJIT_API X86CompilerVar* _getOverlappingVariable(CompilerContext& cc, const FuncArg& argType) const; ASMJIT_API void _moveAllocatedVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType); ASMJIT_API void _moveSpilledVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType, uint32_t temporaryGpReg, uint32_t temporaryXmmReg); ASMJIT_API void _moveSrcVariableToRegister(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief X86 declaration. X86FuncDecl _x86Decl; //! @brief Mask of GP registers used as function arguments. uint32_t _gpParams; //! @brief Mask of MM registers used as function arguments. uint32_t _mmParams; //! @brief Mask of XMM registers used as function arguments. uint32_t _xmmParams; //! @brief Variables count. uint32_t _variablesCount; //! @brief Variables (extracted from operands). VarCallRecord* _variables; //! @brief Argument index to @c VarCallRecord. VarCallRecord* _argumentToVarRecord[kFuncArgsMax]; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86COMPILERFUNC_H desmume-0.9.9/src/utils/AsmJit/x86/x86assembler.h0000644000175000017500000073646212140261626022203 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86ASSEMBLER_H #define _ASMJIT_X86_X86ASSEMBLER_H // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../x86/x86defs.h" #include "../x86/x86operand.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86Assembler] // ============================================================================ //! @brief X86Assembler - low level x86/x64 code generation. //! //! @ref X86Assembler is the main class in AsmJit for generating low level //! x86/x64 binary stream. It creates internal buffer where opcodes are stored //! and contains methods that mimics x86/x64 assembler instructions. Code //! generation should be safe, because basic type-checks are done by the C++ //! compiler. It's nearly impossible to create invalid instruction (for example //! mov [eax], [eax] that will not be detected at compile time by //! C++ compiler. //! //! Each call to assembler intrinsics directly emits instruction to internal //! binary stream. Instruction emitting also contains runtime checks so it //! should be impossible to create an instruction that is not valid (except //! there is bug in AsmJit). //! //! @ref X86Assembler contains internal buffer where all emitted instructions //! are stored. Look at @ref Buffer for an implementation. To generate and //! allocate memory for function use @ref X86Assembler::make() method that will //! allocate memory using the provided memory manager (see @ref MemoryManager) //! and relocates the output code to the provided address. If you want to create //! your function manually, you should look at @ref VirtualMemory interface and //! use @ref X86Assembler::relocCode() method to relocate emitted code into //! provided memory location. You can also take the emitted buffer by @ref //! X86Assembler::take() to do something else with it. If you take buffer, you //! must free it manually by using @ref ASMJIT_FREE() macro. //! //! @section AsmJit_Assembler_CodeGeneration Code Generation //! //! To generate code is only needed to create instance of @c AsmJit::Assembler //! and to use intrinsics. See example how to do that: //! //! @code //! // Use AsmJit namespace. //! using namespace AsmJit; //! //! // Create Assembler instance. //! Assembler a; //! //! // Prolog. //! a.push(ebp); //! a.mov(ebp, esp); //! //! // Mov 1024 to EAX, EAX is also return value. //! a.mov(eax, imm(1024)); //! //! // Epilog. //! a.mov(esp, ebp); //! a.pop(ebp); //! //! // Return. //! a.ret(); //! @endcode //! //! You can see that syntax is very close to Intel one. Only difference is that //! you are calling functions that emits the binary code for you. All registers //! are in @c AsmJit namespace, so it's very comfortable to use it (look at //! first line). There is also used method @c AsmJit::imm() to create an //! immediate value. Use @c AsmJit::uimm() to create unsigned immediate value. //! //! There is also possibility to use memory addresses and immediates. To build //! memory address use @c ptr(), @c byte_ptr(), @c word_ptr(), @c dword_ptr() //! or other friend methods. In most cases you needs only @c ptr() method, but //! there are instructions where you must specify address size, //! //! for example (a is @c AsmJit::Assembler instance): //! //! @code //! a.mov(ptr(eax), imm(0)); // mov ptr [eax], 0 //! a.mov(ptr(eax), edx); // mov ptr [eax], edx //! @endcode //! //! But it's also possible to create complex addresses: //! //! @code //! // eax + ecx*x addresses //! a.mov(ptr(eax, ecx, kScaleNone), imm(0)); // mov ptr [eax + ecx], 0 //! a.mov(ptr(eax, ecx, kScale2Times), imm(0)); // mov ptr [eax + ecx * 2], 0 //! a.mov(ptr(eax, ecx, kScale4Times), imm(0)); // mov ptr [eax + ecx * 4], 0 //! a.mov(ptr(eax, ecx, kScale8Times), imm(0)); // mov ptr [eax + ecx * 8], 0 //! // eax + ecx*x + disp addresses //! a.mov(ptr(eax, ecx, kScaleNone, 4), imm(0)); // mov ptr [eax + ecx + 4], 0 //! a.mov(ptr(eax, ecx, kScale2Times, 8), imm(0)); // mov ptr [eax + ecx * 2 + 8], 0 //! a.mov(ptr(eax, ecx, kScale4Times, 12), imm(0)); // mov ptr [eax + ecx * 4 + 12], 0 //! a.mov(ptr(eax, ecx, kScale8Times, 16), imm(0)); // mov ptr [eax + ecx * 8 + 16], 0 //! @endcode //! //! All addresses shown are using @c AsmJit::ptr() to make memory operand. //! Some assembler instructions (single operand ones) needs to specify memory //! operand size. For example calling a.inc(ptr(eax)) can't be //! used. @c AsmJit::Assembler::inc(), @c AsmJit::Assembler::dec() and similar //! instructions can't be serialized without specifying how bytes they are //! operating on. See next code how assembler works: //! //! @code //! // [byte] address //! a.inc(byte_ptr(eax)); // inc byte ptr [eax] //! a.dec(byte_ptr(eax)); // dec byte ptr [eax] //! // [word] address //! a.inc(word_ptr(eax)); // inc word ptr [eax] //! a.dec(word_ptr(eax)); // dec word ptr [eax] //! // [dword] address //! a.inc(dword_ptr(eax)); // inc dword ptr [eax] //! a.dec(dword_ptr(eax)); // dec dword ptr [eax] //! @endcode //! //! @section AsmJit_Assembler_CallingJitCode Calling JIT Code //! //! While you are over from emitting instructions, you can make your function //! using @c AsmJit::Assembler::make() method. This method will use memory //! manager to allocate virtual memory and relocates generated code to it. For //! memory allocation is used global memory manager by default and memory is //! freeable, but of course this default behavior can be overridden specifying //! your memory manager and allocation type. If you want to do with code //! something else you can always override make() method and do what you want. //! //! You can get size of generated code by @c getCodeSize() or @c getOffset() //! methods. These methods returns you code size (or more precisely current code //! offset) in bytes. Use takeCode() to take internal buffer (all pointers in //! @c AsmJit::Assembler instance will be zeroed and current buffer returned) //! to use it. If you don't take it, @c AsmJit::Assembler destructor will //! free it automatically. To alloc and run code manually don't use //! @c malloc()'ed memory, but instead use @c AsmJit::VirtualMemory::alloc() //! to get memory for executing (specify @c canExecute to @c true) or //! @c AsmJit::MemoryManager that provides more effective and comfortable way //! to allocate virtual memory. //! //! See next example how to allocate memory where you can execute code created //! by @c AsmJit::Assembler: //! //! @code //! using namespace AsmJit; //! //! Assembler a; //! //! // ... your code generation //! //! // your function prototype //! typedef void (*MyFn)(); //! //! // make your function //! MyFn fn = asmjit_cast(a.make()); //! //! // call your function //! fn(); //! //! // If you don't need your function again, free it. //! MemoryManager::getGlobal()->free(fn); //! @endcode //! //! There is also low level alternative how to allocate virtual memory and //! relocate code to it: //! //! @code //! using namespace AsmJit; //! //! Assembler a; //! // Your code generation ... //! //! // Your function prototype. //! typedef void (*MyFn)(); //! //! // Alloc memory for your function. //! MyFn fn = asmjit_cast( //! MemoryManager::getGlobal()->alloc(a.getCodeSize()); //! //! // Relocate the code (will make the function). //! a.relocCode(fn); //! //! // Call the generated function. //! fn(); //! //! // If you don't need your function anymore, it should be freed. //! MemoryManager::getGlobal()->free(fn); //! @endcode //! //! @c note This was very primitive example how to call generated code. //! In real production code you will never alloc and free code for one run, //! you will usually use generated code many times. //! //! @section AsmJit_Assembler_Labels Labels //! //! While generating assembler code, you will usually need to create complex //! code with labels. Labels are fully supported and you can call @c jmp or //! @c je (and similar) instructions to initialized or yet uninitialized label. //! Each label expects to be bound into offset. To bind label to specific //! offset, use @c bind() method. //! //! See next example that contains complete code that creates simple memory //! copy function (in DWORD entities). //! //! @code //! // Example: Usage of Label (32-bit code). //! // //! // Create simple DWORD memory copy function: //! // ASMJIT_STDCALL void copy32(uint32_t* dst, const uint32_t* src, size_t count); //! using namespace AsmJit; //! //! // Assembler instance. //! Assembler a; //! //! // Constants. //! const int arg_offset = 8; // Arguments offset (STDCALL EBP). //! const int arg_size = 12; // Arguments size. //! //! // Labels. //! Label L_Loop = a.newLabel(); //! //! // Prolog. //! a.push(ebp); //! a.mov(ebp, esp); //! a.push(esi); //! a.push(edi); //! //! // Fetch arguments //! a.mov(esi, dword_ptr(ebp, arg_offset + 0)); // Get dst. //! a.mov(edi, dword_ptr(ebp, arg_offset + 4)); // Get src. //! a.mov(ecx, dword_ptr(ebp, arg_offset + 8)); // Get count. //! //! // Bind L_Loop label to here. //! a.bind(L_Loop); //! //! Copy 4 bytes. //! a.mov(eax, dword_ptr(esi)); //! a.mov(dword_ptr(edi), eax); //! //! // Increment pointers. //! a.add(esi, 4); //! a.add(edi, 4); //! //! // Repeat loop until (--ecx != 0). //! a.dec(ecx); //! a.jz(L_Loop); //! //! // Epilog. //! a.pop(edi); //! a.pop(esi); //! a.mov(esp, ebp); //! a.pop(ebp); //! //! // Return: STDCALL convention is to pop stack in called function. //! a.ret(arg_size); //! @endcode //! //! If you need more abstraction for generating assembler code and you want //! to hide calling conventions between 32-bit and 64-bit operating systems, //! look at @c Compiler class that is designed for higher level code //! generation. //! //! @section AsmJit_Assembler_AdvancedCodeGeneration Advanced Code Generation //! //! This section describes some advanced generation features of @c Assembler //! class which can be simply overlooked. The first thing that is very likely //! needed is generic register support. In previous example the named registers //! were used. AsmJit contains functions which can convert register index into //! operand and back. //! //! Let's define function which can be used to generate some abstract code: //! //! @code //! // Simple function that generates dword copy. //! void genCopyDWord( //! Assembler& a, //! const GpReg& dst, const GpReg& src, const GpReg& tmp) //! { //! a.mov(tmp, dword_ptr(src)); //! a.mov(dword_ptr(dst), tmp); //! } //! @endcode //! //! This function can be called like genCopyDWord(a, edi, esi, ebx) //! or by using existing @ref GpReg instances. This abstraction allows to join //! more code sections together without rewriting each to use specific registers. //! You need to take care only about implicit registers which may be used by //! several instructions (like mul, imul, div, idiv, shifting, etc...). //! //! Next, more advanced, but often needed technique is that you can build your //! own registers allocator. X86 architecture contains 8 general purpose registers, //! 8 MMX (MM) registers and 8 SSE (XMM) registers. The X64 (AMD64) architecture //! extends count of general purpose registers and SSE2 registers to 16. Use the //! @c kX86RegNumBase constant to get count of GP or XMM registers or @c kX86RegNumGp, //! @c kX86RegNumMm and @c kX86RegNumXmm constants individually. //! //! To build register from index (value from 0 inclusive to kRegNumXXX //! exclusive) use @ref gpd(), @ref gpq() or @ref gpz() functions. To create //! a 8 or 16-bit register use @ref gpw(), @ref gpb_lo() or @ref gpb_hi(). //! To create other registers there are similar methods like @ref mm(), @ref xmm() //! and @ref st(). //! //! So our function call to genCopyDWord can be also used like this: //! //! @code //! genCopyDWord(a, gpd(kX86RegIndexEdi), gpd(kX86RegIndexEsi), gpd(kX86RegIndexEbx)); //! @endcode //! //! kX86RegIndexXXX are constants defined by @ref kX86RegIndex enum. You can use your //! own register allocator (or register slot manager) to alloc / free registers //! so kX86RegIndexXXX values can be replaced by your variables (0 to kRegNumXXX-1). //! //! @sa @ref X86Compiler. struct X86Assembler : public Assembler { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API X86Assembler(Context* context = JitContext::getGlobal()); ASMJIT_API virtual ~X86Assembler(); // -------------------------------------------------------------------------- // [Buffer - Setters (X86-Extensions)] // -------------------------------------------------------------------------- //! @brief Set custom variable @a i at position @a pos. //! //! @note This function is used to patch existing code. ASMJIT_API void setVarAt(size_t pos, sysint_t i, uint8_t isUnsigned, uint32_t size); // -------------------------------------------------------------------------- // [Emit] // // These functions are not protected against buffer overrun. Each place of // code which calls these functions ensures that there is some space using // canEmit() method. Emitters are internally protected in AsmJit::Buffer, // but only in debug builds. // -------------------------------------------------------------------------- //! @brief Emit single @a opCode without operands. inline void _emitOpCode(uint32_t opCode) { // Instruction prefix. if (opCode & 0xFF000000) _emitByte(static_cast((opCode >> 24) & 0xFF)); // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte(static_cast((opCode >> 16) & 0xFF)); if (opCode & 0x0000FF00) _emitByte(static_cast((opCode >> 8) & 0xFF)); // Last opcode is always emitted (can be also 0x00). _emitByte(static_cast(opCode & 0xFF)); } //! @brief Emit MODR/M byte. inline void _emitMod(uint8_t m, uint8_t o, uint8_t r) { _emitByte(((m & 0x03) << 6) | ((o & 0x07) << 3) | (r & 0x07)); } //! @brief Emit SIB byte. inline void _emitSib(uint8_t s, uint8_t i, uint8_t b) { _emitByte(((s & 0x03) << 6) | ((i & 0x07) << 3) | (b & 0x07)); } //! @brief Emit REX prefix (64-bit mode only). inline void _emitRexR(uint8_t w, uint8_t opReg, uint8_t regCode, bool forceRexPrefix) { #if defined(ASMJIT_X64) uint32_t rex; // w - Default operand size(0=Default, 1=64-bit). // r - Register field (1=high bit extension of the ModR/M REG field). // x - Index field not used in RexR // b - Base field (1=high bit extension of the ModR/M or SIB Base field). rex = (static_cast(forceRexPrefix != 0)) << 6; // Rex prefix code. rex += (static_cast(w ) ) << 3; // Rex.W (w << 3). rex += (static_cast(opReg ) & 0x08 ) >> 1; // Rex.R (r << 2). rex += (static_cast(regCode) & 0x08 ) >> 3; // Rex.B (b << 0). if (rex) _emitByte(static_cast(rex | 0x40)); #else ASMJIT_UNUSED(w); ASMJIT_UNUSED(opReg); ASMJIT_UNUSED(regCode); ASMJIT_UNUSED(forceRexPrefix); #endif // ASMJIT_X64 } //! @brief Emit REX prefix (64-bit mode only). inline void _emitRexRM(uint8_t w, uint8_t opReg, const Operand& rm, bool forceRexPrefix) { #if defined(ASMJIT_X64) uint32_t rex; // w - Default operand size(0=Default, 1=64-bit). // r - Register field (1=high bit extension of the ModR/M REG field). // x - Index field (1=high bit extension of the SIB Index field). // b - Base field (1=high bit extension of the ModR/M or SIB Base field). rex = (static_cast(forceRexPrefix != 0)) << 6; // Rex prefix code. rex += (static_cast(w ) ) << 3; // Rex.W (w << 3). rex += (static_cast(opReg ) & 0x08 ) >> 1; // Rex.R (r << 2). uint32_t b = 0; uint32_t x = 0; if (rm.isReg()) { b = (static_cast(rm).getRegCode() & 0x08) != 0; } else if (rm.isMem()) { b = ((static_cast(rm).getBase() & 0x8) != 0) & (static_cast(rm).getBase() != kInvalidValue); x = ((static_cast(rm).getIndex() & 0x8) != 0) & (static_cast(rm).getIndex() != kInvalidValue); } rex += static_cast(x) << 1; // Rex.R (x << 1). rex += static_cast(b) ; // Rex.B (b << 0). if (rex) _emitByte(static_cast(rex | 0x40)); #else ASMJIT_UNUSED(w); ASMJIT_UNUSED(opReg); ASMJIT_UNUSED(rm); #endif // ASMJIT_X64 } //! @brief Emit Register / Register - calls _emitMod(3, opReg, r) inline void _emitModR(uint8_t opReg, uint8_t r) { _emitMod(3, opReg, r); } //! @brief Emit Register / Register - calls _emitMod(3, opReg, r.code()) inline void _emitModR(uint8_t opReg, const Reg& r) { _emitMod(3, opReg, r.getRegCode()); } //! @brief Emit register / memory address combination to buffer. //! //! This method can hangle addresses from simple to complex ones with //! index and displacement. ASMJIT_API void _emitModM(uint8_t opReg, const Mem& mem, sysint_t immSize); //! @brief Emit Reg<-Reg or Reg<-Reg|Mem ModRM (can be followed by SIB //! and displacement) to buffer. //! //! This function internally calls @c _emitModM() or _emitModR() that depends //! to @a op type. //! //! @note @a opReg is usually real register ID (see @c R) but some instructions //! have specific format and in that cases @a opReg is part of opcode. ASMJIT_API void _emitModRM(uint8_t opReg, const Operand& op, sysint_t immSize); //! @brief Emit CS (code segmend) prefix. //! //! Behavior of this function is to emit code prefix only if memory operand //! address uses code segment. Code segment is used through memory operand //! with attached @c AsmJit::Label. ASMJIT_API void _emitSegmentPrefix(const Operand& rm); //! @brief Emit instruction where register is inlined to opcode. ASMJIT_API void _emitX86Inl(uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t reg, bool forceRexPrefix); //! @brief Emit instruction with reg/memory operand. ASMJIT_API void _emitX86RM(uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t o, const Operand& op, sysint_t immSize, bool forceRexPrefix); //! @brief Emit FPU instruction with no operands. ASMJIT_API void _emitFpu(uint32_t opCode); //! @brief Emit FPU instruction with one operand @a sti (index of FPU register). ASMJIT_API void _emitFpuSTI(uint32_t opCode, uint32_t sti); //! @brief Emit FPU instruction with one operand @a opReg and memory operand @a mem. ASMJIT_API void _emitFpuMEM(uint32_t opCode, uint8_t opReg, const Mem& mem); //! @brief Emit MMX/SSE instruction. ASMJIT_API void _emitMmu(uint32_t opCode, uint8_t rexw, uint8_t opReg, const Operand& src, sysint_t immSize); //! @brief Emit displacement. ASMJIT_API LabelLink* _emitDisplacement(LabelData& l_data, sysint_t inlinedDisplacement, int size); //! @brief Emit relative relocation to absolute pointer @a target. It's needed //! to add what instruction is emitting this, because in x64 mode the relative //! displacement can be impossible to calculate and in this case the trampoline //! is used. ASMJIT_API void _emitJmpOrCallReloc(uint32_t instruction, void* target); // Helpers to decrease binary code size. These four emit methods are just // helpers thats used by assembler. They call emitX86() adding NULLs // to first, second and third operand, if needed. //! @brief Emit X86/FPU or MM/XMM instruction. ASMJIT_API void _emitInstruction(uint32_t code); //! @brief Emit X86/FPU or MM/XMM instruction. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0); //! @brief Emit X86/FPU or MM/XMM instruction. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1); //! @brief Emit X86/FPU or MM/XMM instruction. //! //! Operands @a o1, @a o2 or @a o3 can be @c NULL if they are not used. //! //! Hint: Use @c emitX86() helpers to emit instructions. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2); //! @brief Private method for emitting jcc. ASMJIT_API void _emitJcc(uint32_t code, const Label* label, uint32_t hint); //! @brief Private method for emitting short jcc. inline void _emitShortJcc(uint32_t code, const Label* label, uint32_t hint) { _emitOptions |= kX86EmitOptionShortJump; _emitJcc(code, label, hint); } // -------------------------------------------------------------------------- // [EmbedLabel] // -------------------------------------------------------------------------- //! @brief Embed absolute label pointer (4 or 8 bytes). ASMJIT_API void embedLabel(const Label& label); // -------------------------------------------------------------------------- // [Align] // -------------------------------------------------------------------------- //! @brief Align target buffer to @a m bytes. //! //! Typical usage of this is to align labels at start of the inner loops. //! //! Inserts @c nop() instructions or CPU optimized NOPs. ASMJIT_API void align(uint32_t m); // -------------------------------------------------------------------------- // [Label] // -------------------------------------------------------------------------- //! @brief Create and return new label. ASMJIT_API Label newLabel(); //! @brief Register labels (used by @c Compiler). ASMJIT_API void registerLabels(size_t count); //! @brief Bind label to the current offset. //! //! @note Label can be bound only once! ASMJIT_API void bind(const Label& label); // -------------------------------------------------------------------------- // [Reloc] // -------------------------------------------------------------------------- ASMJIT_API virtual size_t relocCode(void* dst, sysuint_t addressBase) const; // -------------------------------------------------------------------------- // [Make] // -------------------------------------------------------------------------- ASMJIT_API virtual void* make(); // -------------------------------------------------------------------------- // [Embed] // -------------------------------------------------------------------------- //! @brief Add 8-bit integer data to the instuction stream. inline void db(uint8_t x) { embed(&x, 1); } //! @brief Add 16-bit integer data to the instuction stream. inline void dw(uint16_t x) { embed(&x, 2); } //! @brief Add 32-bit integer data to the instuction stream. inline void dd(uint32_t x) { embed(&x, 4); } //! @brief Add 64-bit integer data to the instuction stream. inline void dq(uint64_t x) { embed(&x, 8); } //! @brief Add 8-bit integer data to the instuction stream. inline void dint8(int8_t x) { embed(&x, sizeof(int8_t)); } //! @brief Add 8-bit integer data to the instuction stream. inline void duint8(uint8_t x) { embed(&x, sizeof(uint8_t)); } //! @brief Add 16-bit integer data to the instuction stream. inline void dint16(int16_t x) { embed(&x, sizeof(int16_t)); } //! @brief Add 16-bit integer data to the instuction stream. inline void duint16(uint16_t x) { embed(&x, sizeof(uint16_t)); } //! @brief Add 32-bit integer data to the instuction stream. inline void dint32(int32_t x) { embed(&x, sizeof(int32_t)); } //! @brief Add 32-bit integer data to the instuction stream. inline void duint32(uint32_t x) { embed(&x, sizeof(uint32_t)); } //! @brief Add 64-bit integer data to the instuction stream. inline void dint64(int64_t x) { embed(&x, sizeof(int64_t)); } //! @brief Add 64-bit integer data to the instuction stream. inline void duint64(uint64_t x) { embed(&x, sizeof(uint64_t)); } //! @brief Add system-integer data to the instuction stream. inline void dintptr(intptr_t x) { embed(&x, sizeof(intptr_t)); } //! @brief Add system-integer data to the instuction stream. inline void duintptr(uintptr_t x) { embed(&x, sizeof(uintptr_t)); } //! @brief Add float data to the instuction stream. inline void dfloat(float x) { embed(&x, sizeof(float)); } //! @brief Add double data to the instuction stream. inline void ddouble(double x) { embed(&x, sizeof(double)); } //! @brief Add pointer data to the instuction stream. inline void dptr(void* x) { embed(&x, sizeof(void*)); } //! @brief Add MM data to the instuction stream. inline void dmm(const MmData& x) { embed(&x, sizeof(MmData)); } //! @brief Add XMM data to the instuction stream. inline void dxmm(const XmmData& x) { embed(&x, sizeof(XmmData)); } //! @brief Add data to the instuction stream. inline void data(const void* data, size_t size) { embed(data, size); } //! @brief Add data in a given structure instance to the instuction stream. template inline void dstruct(const T& x) { embed(&x, sizeof(T)); } // -------------------------------------------------------------------------- // [X86 Instructions] // -------------------------------------------------------------------------- //! @brief Add with Carry. inline void adc(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add. inline void add(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Logical And. inline void and_(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Bit Scan Forward. inline void bsf(const GpReg& dst, const GpReg& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsf, &dst, &src); } //! @brief Bit Scan Forward. inline void bsf(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsf, &dst, &src); } //! @brief Bit Scan Reverse. inline void bsr(const GpReg& dst, const GpReg& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsr, &dst, &src); } //! @brief Bit Scan Reverse. inline void bsr(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsr, &dst, &src); } //! @brief Byte swap (32-bit or 64-bit registers only) (i486). inline void bswap(const GpReg& dst) { ASMJIT_ASSERT(dst.getRegType() == kX86RegTypeGpd || dst.getRegType() == kX86RegTypeGpq); _emitInstruction(kX86InstBSwap, &dst); } //! @brief Bit test. inline void bt(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test and complement. inline void btc(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and reset. inline void btr(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and set. inline void bts(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Call Procedure. inline void call(const GpReg& dst) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpz)); _emitInstruction(kX86InstCall, &dst); } //! @brief Call Procedure. inline void call(const Mem& dst) { _emitInstruction(kX86InstCall, &dst); } //! @brief Call Procedure. inline void call(const Imm& dst) { _emitInstruction(kX86InstCall, &dst); } //! @brief Call Procedure. //! @overload inline void call(void* dst) { Imm imm((sysint_t)dst); _emitInstruction(kX86InstCall, &imm); } //! @brief Call Procedure. inline void call(const Label& label) { _emitInstruction(kX86InstCall, &label); } //! @brief Convert Byte to Word (Sign Extend). //! //! AX <- Sign Extend AL inline void cbw() { _emitInstruction(kX86InstCbw); } //! @brief Convert Word to DWord (Sign Extend). //! //! DX:AX <- Sign Extend AX inline void cwd() { _emitInstruction(kX86InstCwd); } //! @brief Convert Word to DWord (Sign Extend). //! //! EAX <- Sign Extend AX inline void cwde() { _emitInstruction(kX86InstCwde); } //! @brief Convert DWord to QWord (Sign Extend). //! //! EDX:EAX <- Sign Extend EAX inline void cdq() { _emitInstruction(kX86InstCdq); } #if defined(ASMJIT_X64) //! @brief Convert DWord to QWord (Sign Extend). //! //! RAX <- Sign Extend EAX inline void cdqe() { _emitInstruction(kX86InstCdqe); } #endif // ASMJIT_X64 //! @brief Clear Carry flag //! //! This instruction clears the CF flag in the EFLAGS register. inline void clc() { _emitInstruction(kX86InstClc); } //! @brief Clear Direction flag //! //! This instruction clears the DF flag in the EFLAGS register. inline void cld() { _emitInstruction(kX86InstCld); } //! @brief Complement Carry Flag. //! //! This instruction complements the CF flag in the EFLAGS register. //! (CF = NOT CF) inline void cmc() { _emitInstruction(kX86InstCmc); } //! @brief Conditional Move. inline void cmov(kX86Cond cc, const GpReg& dst, const GpReg& src) { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); } //! @brief Conditional Move. inline void cmov(kX86Cond cc, const GpReg& dst, const Mem& src) { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); } //! @brief Conditional Move. inline void cmova (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovA , &dst, &src); } //! @brief Conditional Move. inline void cmova (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovA , &dst, &src); } //! @brief Conditional Move. inline void cmovae (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); } //! @brief Conditional Move. inline void cmovae (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); } //! @brief Conditional Move. inline void cmovb (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovB , &dst, &src); } //! @brief Conditional Move. inline void cmovb (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovB , &dst, &src); } //! @brief Conditional Move. inline void cmovbe (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); } //! @brief Conditional Move. inline void cmovbe (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); } //! @brief Conditional Move. inline void cmovc (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovC , &dst, &src); } //! @brief Conditional Move. inline void cmovc (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovC , &dst, &src); } //! @brief Conditional Move. inline void cmove (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovE , &dst, &src); } //! @brief Conditional Move. inline void cmove (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovE , &dst, &src); } //! @brief Conditional Move. inline void cmovg (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovG , &dst, &src); } //! @brief Conditional Move. inline void cmovg (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovG , &dst, &src); } //! @brief Conditional Move. inline void cmovge (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); } //! @brief Conditional Move. inline void cmovge (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); } //! @brief Conditional Move. inline void cmovl (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovL , &dst, &src); } //! @brief Conditional Move. inline void cmovl (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovL , &dst, &src); } //! @brief Conditional Move. inline void cmovle (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); } //! @brief Conditional Move. inline void cmovle (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); } //! @brief Conditional Move. inline void cmovna (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); } //! @brief Conditional Move. inline void cmovna (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); } //! @brief Conditional Move. inline void cmovnae(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); } //! @brief Conditional Move. inline void cmovnae(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); } //! @brief Conditional Move. inline void cmovnb (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); } //! @brief Conditional Move. inline void cmovnb (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); } //! @brief Conditional Move. inline void cmovnbe(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); } //! @brief Conditional Move. inline void cmovnbe(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); } //! @brief Conditional Move. inline void cmovnc (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); } //! @brief Conditional Move. inline void cmovnc (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); } //! @brief Conditional Move. inline void cmovne (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); } //! @brief Conditional Move. inline void cmovne (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); } //! @brief Conditional Move. inline void cmovng (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); } //! @brief Conditional Move. inline void cmovng (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); } //! @brief Conditional Move. inline void cmovnge(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); } //! @brief Conditional Move. inline void cmovnge(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); } //! @brief Conditional Move. inline void cmovnl (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); } //! @brief Conditional Move. inline void cmovnl (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); } //! @brief Conditional Move. inline void cmovnle(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); } //! @brief Conditional Move. inline void cmovnle(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); } //! @brief Conditional Move. inline void cmovno (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); } //! @brief Conditional Move. inline void cmovno (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); } //! @brief Conditional Move. inline void cmovnp (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); } //! @brief Conditional Move. inline void cmovnp (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); } //! @brief Conditional Move. inline void cmovns (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); } //! @brief Conditional Move. inline void cmovns (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); } //! @brief Conditional Move. inline void cmovnz (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); } //! @brief Conditional Move. inline void cmovnz (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); } //! @brief Conditional Move. inline void cmovo (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovO , &dst, &src); } //! @brief Conditional Move. inline void cmovo (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovO , &dst, &src); } //! @brief Conditional Move. inline void cmovp (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovP , &dst, &src); } //! @brief Conditional Move. inline void cmovp (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovP , &dst, &src); } //! @brief Conditional Move. inline void cmovpe (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); } //! @brief Conditional Move. inline void cmovpe (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); } //! @brief Conditional Move. inline void cmovpo (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); } //! @brief Conditional Move. inline void cmovpo (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); } //! @brief Conditional Move. inline void cmovs (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovS , &dst, &src); } //! @brief Conditional Move. inline void cmovs (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovS , &dst, &src); } //! @brief Conditional Move. inline void cmovz (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovZ , &dst, &src); } //! @brief Conditional Move. inline void cmovz (const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCMovZ , &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare and Exchange (i486). inline void cmpxchg(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCmpXCHG, &dst, &src); } //! @brief Compare and Exchange (i486). inline void cmpxchg(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstCmpXCHG, &dst, &src); } //! @brief Compares the 64-bit value in EDX:EAX with the memory operand (Pentium). //! //! If the values are equal, then this instruction stores the 64-bit value //! in ECX:EBX into the memory operand and sets the zero flag. Otherwise, //! this instruction copies the 64-bit memory operand into the EDX:EAX //! registers and clears the zero flag. inline void cmpxchg8b(const Mem& dst) { _emitInstruction(kX86InstCmpXCHG8B, &dst); } #if defined(ASMJIT_X64) //! @brief Compares the 128-bit value in RDX:RAX with the memory operand (X64). //! //! If the values are equal, then this instruction stores the 128-bit value //! in RCX:RBX into the memory operand and sets the zero flag. Otherwise, //! this instruction copies the 128-bit memory operand into the RDX:RAX //! registers and clears the zero flag. inline void cmpxchg16b(const Mem& dst) { _emitInstruction(kX86InstCmpXCHG16B, &dst); } #endif // ASMJIT_X64 //! @brief CPU Identification (i486). inline void cpuid() { _emitInstruction(kX86InstCpuId); } #if defined(ASMJIT_X64) //! @brief Convert QWord to DQWord (Sign Extend). //! //! RDX:RAX <- Sign Extend RAX inline void cqo() { _emitInstruction(kX86InstCqo); } #endif // ASMJIT_X64 #if defined(ASMJIT_X86) //! @brief Decimal adjust AL after addition //! //! This instruction adjusts the sum of two packed BCD values to create //! a packed BCD result. //! //! @note This instruction is only available in 32-bit mode. inline void daa() { _emitInstruction(kX86InstDaa); } #endif // ASMJIT_X86 #if defined(ASMJIT_X86) //! @brief Decimal adjust AL after subtraction //! //! This instruction adjusts the result of the subtraction of two packed //! BCD values to create a packed BCD result. //! //! @note This instruction is only available in 32-bit mode. inline void das() { _emitInstruction(kX86InstDas); } #endif // ASMJIT_X86 //! @brief Decrement by 1. //! @note This instruction can be slower than sub(dst, 1) inline void dec(const GpReg& dst) { _emitInstruction(kX86InstDec, &dst); } //! @brief Decrement by 1. //! @note This instruction can be slower than sub(dst, 1) inline void dec(const Mem& dst) { _emitInstruction(kX86InstDec, &dst); } //! @brief Unsigned divide. //! //! This instruction divides (unsigned) the value in the AL, AX, or EAX //! register by the source operand and stores the result in the AX, //! DX:AX, or EDX:EAX registers. inline void div(const GpReg& src) { _emitInstruction(kX86InstDiv, &src); } //! @brief Unsigned divide. //! @overload inline void div(const Mem& src) { _emitInstruction(kX86InstDiv, &src); } //! @brief Make Stack Frame for Procedure Parameters. inline void enter(const Imm& imm16, const Imm& imm8) { _emitInstruction(kX86InstEnter, &imm16, &imm8); } //! @brief Signed divide. //! //! This instruction divides (signed) the value in the AL, AX, or EAX //! register by the source operand and stores the result in the AX, //! DX:AX, or EDX:EAX registers. inline void idiv(const GpReg& src) { _emitInstruction(kX86InstIDiv, &src); } //! @brief Signed divide. //! @overload inline void idiv(const Mem& src) { _emitInstruction(kX86InstIDiv, &src); } //! @brief Signed multiply. //! //! Source operand (in a general-purpose register or memory location) //! is multiplied by the value in the AL, AX, or EAX register (depending //! on the operand size) and the product is stored in the AX, DX:AX, or //! EDX:EAX registers, respectively. inline void imul(const GpReg& src) { _emitInstruction(kX86InstIMul, &src); } //! @overload inline void imul(const Mem& src) { _emitInstruction(kX86InstIMul, &src); } //! @brief Signed multiply. //! //! Destination operand (the first operand) is multiplied by the source //! operand (second operand). The destination operand is a general-purpose //! register and the source operand is an immediate value, a general-purpose //! register, or a memory location. The product is then stored in the //! destination operand location. inline void imul(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! @overload inline void imul(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! @overload inline void imul(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! //! source operand (which can be a general-purpose register or a memory //! location) is multiplied by the second source operand (an immediate //! value). The product is then stored in the destination operand //! (a general-purpose register). inline void imul(const GpReg& dst, const GpReg& src, const Imm& imm) { _emitInstruction(kX86InstIMul, &dst, &src, &imm); } //! @overload inline void imul(const GpReg& dst, const Mem& src, const Imm& imm) { _emitInstruction(kX86InstIMul, &dst, &src, &imm); } //! @brief Increment by 1. //! @note This instruction can be slower than add(dst, 1) inline void inc(const GpReg& dst) { _emitInstruction(kX86InstInc, &dst); } //! @brief Increment by 1. //! @note This instruction can be slower than add(dst, 1) inline void inc(const Mem& dst) { _emitInstruction(kX86InstInc, &dst); } //! @brief Interrupt 3 - trap to debugger. inline void int3() { _emitInstruction(kX86InstInt3); } //! @brief Jump to label @a label if condition @a cc is met. //! //! This instruction checks the state of one or more of the status flags in //! the EFLAGS register (CF, OF, PF, SF, and ZF) and, if the flags are in the //! specified state (condition), performs a jump to the target instruction //! specified by the destination operand. A condition code (cc) is associated //! with each instruction to indicate the condition being tested for. If the //! condition is not satisfied, the jump is not performed and execution //! continues with the instruction following the Jcc instruction. inline void j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(X86Util::getJccInstFromCond(cc), &label, hint); } //! @brief Jump to label @a label if condition is met. inline void ja (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJA , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jae (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJAE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJB , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJBE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJC , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void je (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jg (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJG , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jge (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJGE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJL , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jle (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJLE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jna (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNA , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNAE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNB , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNBE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNC , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jne (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jng (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNG , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNGE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNL , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNLE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jno (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNP , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jns (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNS , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNZ , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJP , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void js (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJS , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJZ , &label, hint); } //! @brief Short jump to label @a label if condition @a cc is met. //! @sa j() inline void short_j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone) { _emitOptions |= kX86EmitOptionShortJump; j(cc, label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_ja (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJA , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jae (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJAE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jb (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJB , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJBE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jc (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJC , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_je (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jg (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJG , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jge (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJGE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jl (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJL , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jle (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJLE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jna (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNA , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNAE, &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNB , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNBE, &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNC , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jne (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jng (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNG , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNGE, &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNL , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNLE, &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jno (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNO , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNP , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jns (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNS , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNZ , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jo (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJO , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jp (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJP , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJPE , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJPO , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_js (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJS , &label, hint); } //! @brief Short jump to label @a label if condition is met. inline void short_jz (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJZ , &label, hint); } //! @brief Jump. //! @overload inline void jmp(const GpReg& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(const Mem& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(const Imm& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(void* dst) { Imm imm((sysint_t)dst); _emitInstruction(kX86InstJmp, &imm); } //! @brief Jump. //! //! This instruction transfers program control to a different point //! in the instruction stream without recording return information. //! The destination (target) operand specifies the label of the //! instruction being jumped to. inline void jmp(const Label& label) { _emitInstruction(kX86InstJmp, &label); } //! @brief Short jump. //! @sa jmp() inline void short_jmp(const Label& label) { _emitOptions |= kX86EmitOptionShortJump; _emitInstruction(kX86InstJmp, &label); } //! @brief Load Effective Address //! //! This instruction computes the effective address of the second //! operand (the source operand) and stores it in the first operand //! (destination operand). The source operand is a memory address //! (offset part) specified with one of the processors addressing modes. //! The destination operand is a general-purpose register. inline void lea(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstLea, &dst, &src); } //! @brief High Level Procedure Exit. inline void leave() { _emitInstruction(kX86InstLeave); } //! @brief Move. //! //! This instruction copies the second operand (source operand) to the first //! operand (destination operand). The source operand can be an immediate //! value, general-purpose register, segment register, or memory location. //! The destination register can be a general-purpose register, segment //! register, or memory location. Both operands must be the same size, which //! can be a byte, a word, or a DWORD. //! //! @note To move MMX or SSE registers to/from GP registers or memory, use //! corresponding functions: @c movd(), @c movq(), etc. Passing MMX or SSE //! registers to @c mov() is illegal. inline void mov(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move from segment register. //! @overload. inline void mov(const GpReg& dst, const SegmentReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move from segment register. //! @overload. inline void mov(const Mem& dst, const SegmentReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move to segment register. //! @overload. inline void mov(const SegmentReg& dst, const GpReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move to segment register. //! @overload. inline void mov(const SegmentReg& dst, const Mem& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move byte, word, dword or qword from absolute address @a src to //! AL, AX, EAX or RAX register. inline void mov_ptr(const GpReg& dst, void* src) { ASMJIT_ASSERT(dst.getRegIndex() == 0); Imm imm((sysint_t)src); _emitInstruction(kX86InstMovPtr, &dst, &imm); } //! @brief Move byte, word, dword or qword from AL, AX, EAX or RAX register //! to absolute address @a dst. inline void mov_ptr(void* dst, const GpReg& src) { ASMJIT_ASSERT(src.getRegIndex() == 0); Imm imm((sysint_t)dst); _emitInstruction(kX86InstMovPtr, &imm, &src); } //! @brief Move with Sign-Extension. //! //! This instruction copies the contents of the source operand (register //! or memory location) to the destination operand (register) and sign //! extends the value to 16, 32 or 64-bits. //! //! @sa movsxd(). void movsx(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovSX, &dst, &src); } //! @brief Move with Sign-Extension. //! @overload void movsx(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSX, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move DWord to QWord with sign-extension. inline void movsxd(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovSXD, &dst, &src); } //! @brief Move DWord to QWord with sign-extension. //! @overload inline void movsxd(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSXD, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move with Zero-Extend. //! //! This instruction copies the contents of the source operand (register //! or memory location) to the destination operand (register) and zero //! extends the value to 16 or 32-bits. The size of the converted value //! depends on the operand-size attribute. inline void movzx(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovZX, &dst, &src); } //! @brief Move with Zero-Extend. //! @brief Overload inline void movzx(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstMovZX, &dst, &src); } //! @brief Unsigned multiply. //! //! Source operand (in a general-purpose register or memory location) //! is multiplied by the value in the AL, AX, or EAX register (depending //! on the operand size) and the product is stored in the AX, DX:AX, or //! EDX:EAX registers, respectively. inline void mul(const GpReg& src) { _emitInstruction(kX86InstMul, &src); } //! @brief Unsigned multiply. //! @overload inline void mul(const Mem& src) { _emitInstruction(kX86InstMul, &src); } //! @brief Two's Complement Negation. inline void neg(const GpReg& dst) { _emitInstruction(kX86InstNeg, &dst); } //! @brief Two's Complement Negation. inline void neg(const Mem& dst) { _emitInstruction(kX86InstNeg, &dst); } //! @brief No Operation. //! //! This instruction performs no operation. This instruction is a one-byte //! instruction that takes up space in the instruction stream but does not //! affect the machine context, except the EIP register. The NOP instruction //! is an alias mnemonic for the XCHG (E)AX, (E)AX instruction. inline void nop() { _emitInstruction(kX86InstNop); } //! @brief One's Complement Negation. inline void not_(const GpReg& dst) { _emitInstruction(kX86InstNot, &dst); } //! @brief One's Complement Negation. inline void not_(const Mem& dst) { _emitInstruction(kX86InstNot, &dst); } //! @brief Logical Inclusive OR. inline void or_(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Pop a Value from the Stack. //! //! This instruction loads the value from the top of the stack to the location //! specified with the destination operand and then increments the stack pointer. //! The destination operand can be a general purpose register, memory location, //! or segment register. inline void pop(const GpReg& dst) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpw) || dst.isRegType(kX86RegTypeGpz)); _emitInstruction(kX86InstPop, &dst); } //! @brief Pop a Segment Register from the Stack. //! //! @note There is no instruction to pop a cs segment register. inline void pop(const SegmentReg& dst) { ASMJIT_ASSERT(dst.getRegIndex() != kX86SegCs); _emitInstruction(kX86InstPop, &dst); } inline void pop(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == sizeof(sysint_t)); _emitInstruction(kX86InstPop, &dst); } #if defined(ASMJIT_X86) //! @brief Pop All General-Purpose Registers. //! //! Pop EDI, ESI, EBP, EBX, EDX, ECX, and EAX. inline void popad() { _emitInstruction(kX86InstPopAD); } #endif // ASMJIT_X86 //! @brief Pop Stack into EFLAGS Register (32-bit or 64-bit). inline void popf() { #if defined(ASMJIT_X86) popfd(); #else popfq(); #endif } #if defined(ASMJIT_X86) //! @brief Pop Stack into EFLAGS Register (32-bit). inline void popfd() { _emitInstruction(kX86InstPopFD); } #else //! @brief Pop Stack into EFLAGS Register (64-bit). inline void popfq() { _emitInstruction(kX86InstPopFQ); } #endif //! @brief Push WORD/DWORD/QWORD Onto the Stack. //! //! @note 32-bit architecture pushed DWORD while 64-bit //! pushes QWORD. 64-bit mode not provides instruction to //! push 32-bit register/memory. inline void push(const GpReg& src) { ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpw) || src.isRegType(kX86RegTypeGpz)); _emitInstruction(kX86InstPush, &src); } //! @brief Push Segment Register Onto the Stack. inline void push(const SegmentReg& src) { _emitInstruction(kX86InstPush, &src); } //! @brief Push WORD/DWORD/QWORD Onto the Stack. inline void push(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == sizeof(sysint_t)); _emitInstruction(kX86InstPush, &src); } //! @brief Push WORD/DWORD/QWORD Onto the Stack. inline void push(const Imm& src) { _emitInstruction(kX86InstPush, &src); } #if defined(ASMJIT_X86) //! @brief Push All General-Purpose Registers. //! //! Push EAX, ECX, EDX, EBX, original ESP, EBP, ESI, and EDI. inline void pushad() { _emitInstruction(kX86InstPushAD); } #endif // ASMJIT_X86 //! @brief Push EFLAGS Register (32-bit or 64-bit) onto the Stack. inline void pushf() { #if defined(ASMJIT_X86) pushfd(); #else pushfq(); #endif } #if defined(ASMJIT_X86) //! @brief Push EFLAGS Register (32-bit) onto the Stack. inline void pushfd() { _emitInstruction(kX86InstPushFD); } #else //! @brief Push EFLAGS Register (64-bit) onto the Stack. inline void pushfq() { _emitInstruction(kX86InstPushFQ); } #endif // ASMJIT_X86 //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rcl(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. inline void rcl(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rcl(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. inline void rcl(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void rcr(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. inline void rcr(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void rcr(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. inline void rcr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Read Time-Stamp Counter (Pentium). inline void rdtsc() { _emitInstruction(kX86InstRdtsc); } //! @brief Read Time-Stamp Counter and Processor ID (New). inline void rdtscp() { _emitInstruction(kX86InstRdtscP); } //! @brief Load ECX/RCX BYTEs from DS:[ESI/RSI] to AL. inline void rep_lodsb() { _emitInstruction(kX86InstRepLodSB); } //! @brief Load ECX/RCX DWORDs from DS:[ESI/RSI] to EAX. inline void rep_lodsd() { _emitInstruction(kX86InstRepLodSD); } #if defined(ASMJIT_X64) //! @brief Load ECX/RCX QWORDs from DS:[ESI/RSI] to RAX. inline void rep_lodsq() { _emitInstruction(kX86InstRepLodSQ); } #endif // ASMJIT_X64 //! @brief Load ECX/RCX WORDs from DS:[ESI/RSI] to AX. inline void rep_lodsw() { _emitInstruction(kX86InstRepLodSW); } //! @brief Move ECX/RCX BYTEs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsb() { _emitInstruction(kX86InstRepMovSB); } //! @brief Move ECX/RCX DWORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsd() { _emitInstruction(kX86InstRepMovSD); } #if defined(ASMJIT_X64) //! @brief Move ECX/RCX QWORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsq() { _emitInstruction(kX86InstRepMovSQ); } #endif // ASMJIT_X64 //! @brief Move ECX/RCX WORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsw() { _emitInstruction(kX86InstRepMovSW); } //! @brief Fill ECX/RCX BYTEs at ES:[EDI/RDI] with AL. inline void rep_stosb() { _emitInstruction(kX86InstRepStoSB); } //! @brief Fill ECX/RCX DWORDs at ES:[EDI/RDI] with EAX. inline void rep_stosd() { _emitInstruction(kX86InstRepStoSD); } #if defined(ASMJIT_X64) //! @brief Fill ECX/RCX QWORDs at ES:[EDI/RDI] with RAX. inline void rep_stosq() { _emitInstruction(kX86InstRepStoSQ); } #endif // ASMJIT_X64 //! @brief Fill ECX/RCX WORDs at ES:[EDI/RDI] with AX. inline void rep_stosw() { _emitInstruction(kX86InstRepStoSW); } //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsb() { _emitInstruction(kX86InstRepECmpSB); } //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsd() { _emitInstruction(kX86InstRepECmpSD); } #if defined(ASMJIT_X64) //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsq() { _emitInstruction(kX86InstRepECmpSQ); } #endif // ASMJIT_X64 //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsw() { _emitInstruction(kX86InstRepECmpSW); } //! @brief Find non-AL BYTE starting at ES:[EDI/RDI]. inline void repe_scasb() { _emitInstruction(kX86InstRepEScaSB); } //! @brief Find non-EAX DWORD starting at ES:[EDI/RDI]. inline void repe_scasd() { _emitInstruction(kX86InstRepEScaSD); } #if defined(ASMJIT_X64) //! @brief Find non-RAX QWORD starting at ES:[EDI/RDI]. inline void repe_scasq() { _emitInstruction(kX86InstRepEScaSQ); } #endif // ASMJIT_X64 //! @brief Find non-AX WORD starting at ES:[EDI/RDI]. inline void repe_scasw() { _emitInstruction(kX86InstRepEScaSW); } //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repne_cmpsb() { _emitInstruction(kX86InstRepNECmpSB); } //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repne_cmpsd() { _emitInstruction(kX86InstRepNECmpSD); } #if defined(ASMJIT_X64) //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repne_cmpsq() { _emitInstruction(kX86InstRepNECmpSQ); } #endif // ASMJIT_X64 //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repne_cmpsw() { _emitInstruction(kX86InstRepNECmpSW); } //! @brief Find AL, starting at ES:[EDI/RDI]. inline void repne_scasb() { _emitInstruction(kX86InstRepNEScaSB); } //! @brief Find EAX, starting at ES:[EDI/RDI]. inline void repne_scasd() { _emitInstruction(kX86InstRepNEScaSD); } #if defined(ASMJIT_X64) //! @brief Find RAX, starting at ES:[EDI/RDI]. inline void repne_scasq() { _emitInstruction(kX86InstRepNEScaSQ); } #endif // ASMJIT_X64 //! @brief Find AX, starting at ES:[EDI/RDI]. inline void repne_scasw() { _emitInstruction(kX86InstRepNEScaSW); } //! @brief Return from Procedure. inline void ret() { _emitInstruction(kX86InstRet); } //! @brief Return from Procedure. inline void ret(const Imm& imm16) { _emitInstruction(kX86InstRet, &imm16); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rol(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. inline void rol(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rol(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. inline void rol(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void ror(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. inline void ror(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void ror(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. inline void ror(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRor, &dst, &src); } #if defined(ASMJIT_X86) //! @brief Store AH into Flags. inline void sahf() { _emitInstruction(kX86InstSahf); } #endif // ASMJIT_X86 //! @brief Integer subtraction with borrow. inline void sbb(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void sal(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. inline void sal(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void sal(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. inline void sal(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void sar(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. inline void sar(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void sar(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. inline void sar(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Set Byte on Condition. inline void set(kX86Cond cc, const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst); } //! @brief Set Byte on Condition. inline void set(kX86Cond cc, const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst); } //! @brief Set Byte on Condition. inline void seta (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetA , &dst); } //! @brief Set Byte on Condition. inline void seta (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetA , &dst); } //! @brief Set Byte on Condition. inline void setae (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetAE , &dst); } //! @brief Set Byte on Condition. inline void setae (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetAE , &dst); } //! @brief Set Byte on Condition. inline void setb (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetB , &dst); } //! @brief Set Byte on Condition. inline void setb (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetB , &dst); } //! @brief Set Byte on Condition. inline void setbe (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetBE , &dst); } //! @brief Set Byte on Condition. inline void setbe (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetBE , &dst); } //! @brief Set Byte on Condition. inline void setc (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetC , &dst); } //! @brief Set Byte on Condition. inline void setc (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetC , &dst); } //! @brief Set Byte on Condition. inline void sete (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetE , &dst); } //! @brief Set Byte on Condition. inline void sete (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetE , &dst); } //! @brief Set Byte on Condition. inline void setg (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetG , &dst); } //! @brief Set Byte on Condition. inline void setg (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetG , &dst); } //! @brief Set Byte on Condition. inline void setge (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetGE , &dst); } //! @brief Set Byte on Condition. inline void setge (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetGE , &dst); } //! @brief Set Byte on Condition. inline void setl (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetL , &dst); } //! @brief Set Byte on Condition. inline void setl (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetL , &dst); } //! @brief Set Byte on Condition. inline void setle (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetLE , &dst); } //! @brief Set Byte on Condition. inline void setle (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetLE , &dst); } //! @brief Set Byte on Condition. inline void setna (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNA , &dst); } //! @brief Set Byte on Condition. inline void setna (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNA , &dst); } //! @brief Set Byte on Condition. inline void setnae(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNAE, &dst); } //! @brief Set Byte on Condition. inline void setnae(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNAE, &dst); } //! @brief Set Byte on Condition. inline void setnb (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNB , &dst); } //! @brief Set Byte on Condition. inline void setnb (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNB , &dst); } //! @brief Set Byte on Condition. inline void setnbe(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNBE, &dst); } //! @brief Set Byte on Condition. inline void setnbe(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNBE, &dst); } //! @brief Set Byte on Condition. inline void setnc (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNC , &dst); } //! @brief Set Byte on Condition. inline void setnc (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNC , &dst); } //! @brief Set Byte on Condition. inline void setne (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNE , &dst); } //! @brief Set Byte on Condition. inline void setne (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNE , &dst); } //! @brief Set Byte on Condition. inline void setng (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNG , &dst); } //! @brief Set Byte on Condition. inline void setng (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNG , &dst); } //! @brief Set Byte on Condition. inline void setnge(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNGE, &dst); } //! @brief Set Byte on Condition. inline void setnge(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNGE, &dst); } //! @brief Set Byte on Condition. inline void setnl (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNL , &dst); } //! @brief Set Byte on Condition. inline void setnl (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNL , &dst); } //! @brief Set Byte on Condition. inline void setnle(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNLE, &dst); } //! @brief Set Byte on Condition. inline void setnle(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNLE, &dst); } //! @brief Set Byte on Condition. inline void setno (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNO , &dst); } //! @brief Set Byte on Condition. inline void setno (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNO , &dst); } //! @brief Set Byte on Condition. inline void setnp (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNP , &dst); } //! @brief Set Byte on Condition. inline void setnp (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNP , &dst); } //! @brief Set Byte on Condition. inline void setns (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNS , &dst); } //! @brief Set Byte on Condition. inline void setns (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNS , &dst); } //! @brief Set Byte on Condition. inline void setnz (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNZ , &dst); } //! @brief Set Byte on Condition. inline void setnz (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNZ , &dst); } //! @brief Set Byte on Condition. inline void seto (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetO , &dst); } //! @brief Set Byte on Condition. inline void seto (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetO , &dst); } //! @brief Set Byte on Condition. inline void setp (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetP , &dst); } //! @brief Set Byte on Condition. inline void setp (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetP , &dst); } //! @brief Set Byte on Condition. inline void setpe (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPE , &dst); } //! @brief Set Byte on Condition. inline void setpe (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPE , &dst); } //! @brief Set Byte on Condition. inline void setpo (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPO , &dst); } //! @brief Set Byte on Condition. inline void setpo (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPO , &dst); } //! @brief Set Byte on Condition. inline void sets (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetS , &dst); } //! @brief Set Byte on Condition. inline void sets (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetS , &dst); } //! @brief Set Byte on Condition. inline void setz (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetZ , &dst); } //! @brief Set Byte on Condition. inline void setz (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetZ , &dst); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void shl(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. inline void shl(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void shl(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. inline void shl(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void shr(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. inline void shr(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void shr(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. inline void shr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Double Precision Shift Left. //! @note src2 register can be only @c cl register. inline void shld(const GpReg& dst, const GpReg& src1, const GpReg& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. inline void shld(const GpReg& dst, const GpReg& src1, const Imm& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. //! @note src2 register can be only @c cl register. inline void shld(const Mem& dst, const GpReg& src1, const GpReg& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. inline void shld(const Mem& dst, const GpReg& src1, const Imm& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. //! @note src2 register can be only @c cl register. inline void shrd(const GpReg& dst, const GpReg& src1, const GpReg& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. inline void shrd(const GpReg& dst, const GpReg& src1, const Imm& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. //! @note src2 register can be only @c cl register. inline void shrd(const Mem& dst, const GpReg& src1, const GpReg& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. inline void shrd(const Mem& dst, const GpReg& src1, const Imm& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Set Carry Flag to 1. inline void stc() { _emitInstruction(kX86InstStc); } //! @brief Set Direction Flag to 1. inline void std() { _emitInstruction(kX86InstStd); } //! @brief Subtract. inline void sub(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Logical Compare. inline void test(const GpReg& op1, const GpReg& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const GpReg& op1, const Imm& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const Mem& op1, const GpReg& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const Mem& op1, const Imm& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Undefined instruction - Raise invalid opcode exception. inline void ud2() { _emitInstruction(kX86InstUd2); } //! @brief Exchange and Add. inline void xadd(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstXadd, &dst, &src); } //! @brief Exchange and Add. inline void xadd(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstXadd, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstXchg, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstXchg, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstXchg, &src, &dst); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpReg& dst, const Imm& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstXor, &dst, &src); } // -------------------------------------------------------------------------- // [X87 Instructions (FPU)] // -------------------------------------------------------------------------- //! @brief Compute 2^x - 1 (FPU). inline void f2xm1() { _emitInstruction(kX86InstF2XM1); } //! @brief Absolute Value of st(0) (FPU). inline void fabs() { _emitInstruction(kX86InstFAbs); } //! @brief Add @a src to @a dst and store result in @a dst (FPU). //! //! @note One of dst or src must be st(0). inline void fadd(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFAdd, &dst, &src); } //! @brief Add @a src to st(0) and store result in st(0) (FPU). //! //! @note SP-FP or DP-FP determined by @a adr size. inline void fadd(const Mem& src) { _emitInstruction(kX86InstFAdd, &src); } //! @brief Add st(0) to @a dst and POP register stack (FPU). inline void faddp(const X87Reg& dst = st(1)) { _emitInstruction(kX86InstFAddP, &dst); } //! @brief Load Binary Coded Decimal (FPU). inline void fbld(const Mem& src) { _emitInstruction(kX86InstFBLd, &src); } //! @brief Store BCD Integer and Pop (FPU). inline void fbstp(const Mem& dst) { _emitInstruction(kX86InstFBStP, &dst); } //! @brief Change st(0) Sign (FPU). inline void fchs() { _emitInstruction(kX86InstFCHS); } //! @brief Clear Exceptions (FPU). //! //! Clear floating-point exception flags after checking for pending unmasked //! floating-point exceptions. //! //! Clears the floating-point exception flags (PE, UE, OE, ZE, DE, and IE), //! the exception summary status flag (ES), the stack fault flag (SF), and //! the busy flag (B) in the FPU status word. The FCLEX instruction checks //! for and handles any pending unmasked floating-point exceptions before //! clearing the exception flags. inline void fclex() { _emitInstruction(kX86InstFClex); } //! @brief FP Conditional Move (FPU). inline void fcmovb(const X87Reg& src) { _emitInstruction(kX86InstFCMovB, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovbe(const X87Reg& src) { _emitInstruction(kX86InstFCMovBE, &src); } //! @brief FP Conditional Move (FPU). inline void fcmove(const X87Reg& src) { _emitInstruction(kX86InstFCMovE, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovnb(const X87Reg& src) { _emitInstruction(kX86InstFCMovNB, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovnbe(const X87Reg& src) { _emitInstruction(kX86InstFCMovNBE, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovne(const X87Reg& src) { _emitInstruction(kX86InstFCMovNE, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovnu(const X87Reg& src) { _emitInstruction(kX86InstFCMovNU, &src); } //! @brief FP Conditional Move (FPU). inline void fcmovu(const X87Reg& src) { _emitInstruction(kX86InstFCMovU, &src); } //! @brief Compare st(0) with @a reg (FPU). inline void fcom(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFCom, ®); } //! @brief Compare st(0) with 4-byte or 8-byte FP at @a src (FPU). inline void fcom(const Mem& src) { _emitInstruction(kX86InstFCom, &src); } //! @brief Compare st(0) with @a reg and pop the stack (FPU). inline void fcomp(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFComP, ®); } //! @brief Compare st(0) with 4-byte or 8-byte FP at @a adr and pop the //! stack (FPU). inline void fcomp(const Mem& mem) { _emitInstruction(kX86InstFComP, &mem); } //! @brief Compare st(0) with st(1) and pop register stack twice (FPU). inline void fcompp() { _emitInstruction(kX86InstFComPP); } //! @brief Compare st(0) and @a reg and Set EFLAGS (FPU). inline void fcomi(const X87Reg& reg) { _emitInstruction(kX86InstFComI, ®); } //! @brief Compare st(0) and @a reg and Set EFLAGS and pop the stack (FPU). inline void fcomip(const X87Reg& reg) { _emitInstruction(kX86InstFComIP, ®); } //! @brief Cosine (FPU). //! //! This instruction calculates the cosine of the source operand in //! register st(0) and stores the result in st(0). inline void fcos() { _emitInstruction(kX86InstFCos); } //! @brief Decrement Stack-Top Pointer (FPU). //! //! Subtracts one from the TOP field of the FPU status word (decrements //! the top-ofstack pointer). If the TOP field contains a 0, it is set //! to 7. The effect of this instruction is to rotate the stack by one //! position. The contents of the FPU data registers and tag register //! are not affected. inline void fdecstp() { _emitInstruction(kX86InstFDecStP); } //! @brief Divide @a dst by @a src (FPU). //! //! @note One of @a dst or @a src register must be st(0). inline void fdiv(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFDiv, &dst, &src); } //! @brief Divide st(0) by 32-bit or 64-bit FP value (FPU). inline void fdiv(const Mem& src) { _emitInstruction(kX86InstFDiv, &src); } //! @brief Divide @a reg by st(0) (FPU). inline void fdivp(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFDivP, ®); } //! @brief Reverse Divide @a dst by @a src (FPU). //! //! @note One of @a dst or @a src register must be st(0). inline void fdivr(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFDivR, &dst, &src); } //! @brief Reverse Divide st(0) by 32-bit or 64-bit FP value (FPU). inline void fdivr(const Mem& src) { _emitInstruction(kX86InstFDivR, &src); } //! @brief Reverse Divide @a reg by st(0) (FPU). inline void fdivrp(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFDivRP, ®); } //! @brief Free Floating-Point Register (FPU). //! //! Sets the tag in the FPU tag register associated with register @a reg //! to empty (11B). The contents of @a reg and the FPU stack-top pointer //! (TOP) are not affected. inline void ffree(const X87Reg& reg) { _emitInstruction(kX86InstFFree, ®); } //! @brief Add 16-bit or 32-bit integer to st(0) (FPU). inline void fiadd(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIAdd, &src); } //! @brief Compare st(0) with 16-bit or 32-bit Integer (FPU). inline void ficom(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFICom, &src); } //! @brief Compare st(0) with 16-bit or 32-bit Integer and pop the stack (FPU). inline void ficomp(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIComP, &src); } //! @brief Divide st(0) by 32-bit or 16-bit integer (@a src) (FPU). inline void fidiv(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIDiv, &src); } //! @brief Reverse Divide st(0) by 32-bit or 16-bit integer (@a src) (FPU). inline void fidivr(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIDivR, &src); } //! @brief Load 16-bit, 32-bit or 64-bit Integer and push it to the stack (FPU). //! //! Converts the signed-integer source operand into double extended-precision //! floating point format and pushes the value onto the FPU register stack. //! The source operand can be a word, doubleword, or quadword integer. It is //! loaded without rounding errors. The sign of the source operand is //! preserved. inline void fild(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4 || src.getSize() == 8); _emitInstruction(kX86InstFILd, &src); } //! @brief Multiply st(0) by 16-bit or 32-bit integer and store it //! to st(0) (FPU). inline void fimul(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFIMul, &src); } //! @brief Increment Stack-Top Pointer (FPU). //! //! Adds one to the TOP field of the FPU status word (increments the //! top-of-stack pointer). If the TOP field contains a 7, it is set to 0. //! The effect of this instruction is to rotate the stack by one position. //! The contents of the FPU data registers and tag register are not affected. //! This operation is not equivalent to popping the stack, because the tag //! for the previous top-of-stack register is not marked empty. inline void fincstp() { _emitInstruction(kX86InstFIncStP); } //! @brief Initialize Floating-Point Unit (FPU). //! //! Initialize FPU after checking for pending unmasked floating-point //! exceptions. inline void finit() { _emitInstruction(kX86InstFInit); } //! @brief Subtract 16-bit or 32-bit integer from st(0) and store result to //! st(0) (FPU). inline void fisub(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFISub, &src); } //! @brief Reverse Subtract 16-bit or 32-bit integer from st(0) and //! store result to st(0) (FPU). inline void fisubr(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4); _emitInstruction(kX86InstFISubR, &src); } //! @brief Initialize Floating-Point Unit (FPU). //! //! Initialize FPU without checking for pending unmasked floating-point //! exceptions. inline void fninit() { _emitInstruction(kX86InstFNInit); } //! @brief Store st(0) as 16-bit or 32-bit Integer to @a dst (FPU). inline void fist(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == 4); _emitInstruction(kX86InstFISt, &dst); } //! @brief Store st(0) as 16-bit, 32-bit or 64-bit Integer to @a dst and pop //! stack (FPU). inline void fistp(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == 4 || dst.getSize() == 8); _emitInstruction(kX86InstFIStP, &dst); } //! @brief Push 32-bit, 64-bit or 80-bit Floating Point Value onto the FPU //! register stack (FPU). inline void fld(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8 || src.getSize() == 10); _emitInstruction(kX86InstFLd, &src); } //! @brief Push @a reg onto the FPU register stack (FPU). inline void fld(const X87Reg& reg) { _emitInstruction(kX86InstFLd, ®); } //! @brief Push +1.0 onto the FPU register stack (FPU). inline void fld1() { _emitInstruction(kX86InstFLd1); } //! @brief Push log2(10) onto the FPU register stack (FPU). inline void fldl2t() { _emitInstruction(kX86InstFLdL2T); } //! @brief Push log2(e) onto the FPU register stack (FPU). inline void fldl2e() { _emitInstruction(kX86InstFLdL2E); } //! @brief Push pi onto the FPU register stack (FPU). inline void fldpi() { _emitInstruction(kX86InstFLdPi); } //! @brief Push log10(2) onto the FPU register stack (FPU). inline void fldlg2() { _emitInstruction(kX86InstFLdLg2); } //! @brief Push ln(2) onto the FPU register stack (FPU). inline void fldln2() { _emitInstruction(kX86InstFLdLn2); } //! @brief Push +0.0 onto the FPU register stack (FPU). inline void fldz() { _emitInstruction(kX86InstFLdZ); } //! @brief Load x87 FPU Control Word (2 bytes) (FPU). inline void fldcw(const Mem& src) { _emitInstruction(kX86InstFLdCw, &src); } //! @brief Load x87 FPU Environment (14 or 28 bytes) (FPU). inline void fldenv(const Mem& src) { _emitInstruction(kX86InstFLdEnv, &src); } //! @brief Multiply @a dst by @a src and store result in @a dst (FPU). //! //! @note One of dst or src must be st(0). inline void fmul(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFMul, &dst, &src); } //! @brief Multiply st(0) by @a src and store result in st(0) (FPU). //! //! @note SP-FP or DP-FP determined by @a adr size. inline void fmul(const Mem& src) { _emitInstruction(kX86InstFMul, &src); } //! @brief Multiply st(0) by @a dst and POP register stack (FPU). inline void fmulp(const X87Reg& dst = st(1)) { _emitInstruction(kX86InstFMulP, &dst); } //! @brief Clear Exceptions (FPU). //! //! Clear floating-point exception flags without checking for pending //! unmasked floating-point exceptions. //! //! Clears the floating-point exception flags (PE, UE, OE, ZE, DE, and IE), //! the exception summary status flag (ES), the stack fault flag (SF), and //! the busy flag (B) in the FPU status word. The FCLEX instruction does //! not checks for and handles any pending unmasked floating-point exceptions //! before clearing the exception flags. inline void fnclex() { _emitInstruction(kX86InstFNClex); } //! @brief No Operation (FPU). inline void fnop() { _emitInstruction(kX86InstFNop); } //! @brief Save FPU State (FPU). //! //! Store FPU environment to m94byte or m108byte without //! checking for pending unmasked FP exceptions. //! Then re-initialize the FPU. inline void fnsave(const Mem& dst) { _emitInstruction(kX86InstFNSave, &dst); } //! @brief Store x87 FPU Environment (FPU). //! //! Store FPU environment to @a dst (14 or 28 Bytes) without checking for //! pending unmasked floating-point exceptions. Then mask all floating //! point exceptions. inline void fnstenv(const Mem& dst) { _emitInstruction(kX86InstFNStEnv, &dst); } //! @brief Store x87 FPU Control Word (FPU). //! //! Store FPU control word to @a dst (2 Bytes) without checking for pending //! unmasked floating-point exceptions. inline void fnstcw(const Mem& dst) { _emitInstruction(kX86InstFNStCw, &dst); } //! @brief Store x87 FPU Status Word (2 Bytes) (FPU). inline void fnstsw(const GpReg& dst) { ASMJIT_ASSERT(dst.isRegCode(kX86RegAx)); _emitInstruction(kX86InstFNStSw, &dst); } //! @brief Store x87 FPU Status Word (2 Bytes) (FPU). inline void fnstsw(const Mem& dst) { _emitInstruction(kX86InstFNStSw, &dst); } //! @brief Partial Arctangent (FPU). //! //! Replace st(1) with arctan(st(1)/st(0)) and pop the register stack. inline void fpatan() { _emitInstruction(kX86InstFPAtan); } //! @brief Partial Remainder (FPU). //! //! Replace st(0) with the remainder obtained from dividing st(0) by st(1). inline void fprem() { _emitInstruction(kX86InstFPRem); } //! @brief Partial Remainder (FPU). //! //! Replace st(0) with the IEEE remainder obtained from dividing st(0) by //! st(1). inline void fprem1() { _emitInstruction(kX86InstFPRem1); } //! @brief Partial Tangent (FPU). //! //! Replace st(0) with its tangent and push 1 onto the FPU stack. inline void fptan() { _emitInstruction(kX86InstFPTan); } //! @brief Round to Integer (FPU). //! //! Rount st(0) to an Integer. inline void frndint() { _emitInstruction(kX86InstFRndInt); } //! @brief Restore FPU State (FPU). //! //! Load FPU state from src (94 or 108 bytes). inline void frstor(const Mem& src) { _emitInstruction(kX86InstFRstor, &src); } //! @brief Save FPU State (FPU). //! //! Store FPU state to 94 or 108-bytes after checking for //! pending unmasked FP exceptions. Then reinitialize //! the FPU. inline void fsave(const Mem& dst) { _emitInstruction(kX86InstFSave, &dst); } //! @brief Scale (FPU). //! //! Scale st(0) by st(1). inline void fscale() { _emitInstruction(kX86InstFScale); } //! @brief Sine (FPU). //! //! This instruction calculates the sine of the source operand in //! register st(0) and stores the result in st(0). inline void fsin() { _emitInstruction(kX86InstFSin); } //! @brief Sine and Cosine (FPU). //! //! Compute the sine and cosine of st(0); replace st(0) with //! the sine, and push the cosine onto the register stack. inline void fsincos() { _emitInstruction(kX86InstFSinCos); } //! @brief Square Root (FPU). //! //! Calculates square root of st(0) and stores the result in st(0). inline void fsqrt() { _emitInstruction(kX86InstFSqrt); } //! @brief Store Floating Point Value (FPU). //! //! Store st(0) as 32-bit or 64-bit floating point value to @a dst. inline void fst(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 4 || dst.getSize() == 8); _emitInstruction(kX86InstFSt, &dst); } //! @brief Store Floating Point Value (FPU). //! //! Store st(0) to @a reg. inline void fst(const X87Reg& reg) { _emitInstruction(kX86InstFSt, ®); } //! @brief Store Floating Point Value and Pop Register Stack (FPU). //! //! Store st(0) as 32-bit or 64-bit floating point value to @a dst //! and pop register stack. inline void fstp(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 4 || dst.getSize() == 8 || dst.getSize() == 10); _emitInstruction(kX86InstFStP, &dst); } //! @brief Store Floating Point Value and Pop Register Stack (FPU). //! //! Store st(0) to @a reg and pop register stack. inline void fstp(const X87Reg& reg) { _emitInstruction(kX86InstFStP, ®); } //! @brief Store x87 FPU Control Word (FPU). //! //! Store FPU control word to @a dst (2 Bytes) after checking for pending //! unmasked floating-point exceptions. inline void fstcw(const Mem& dst) { _emitInstruction(kX86InstFStCw, &dst); } //! @brief Store x87 FPU Environment (FPU). //! //! Store FPU environment to @a dst (14 or 28 Bytes) after checking for //! pending unmasked floating-point exceptions. Then mask all floating //! point exceptions. inline void fstenv(const Mem& dst) { _emitInstruction(kX86InstFStEnv, &dst); } //! @brief Store x87 FPU Status Word (2 Bytes) (FPU). inline void fstsw(const GpReg& dst) { ASMJIT_ASSERT(dst.isRegCode(kX86RegAx)); _emitInstruction(kX86InstFStSw, &dst); } //! @brief Store x87 FPU Status Word (2 Bytes) (FPU). inline void fstsw(const Mem& dst) { _emitInstruction(kX86InstFStSw, &dst); } //! @brief Subtract @a src from @a dst and store result in @a dst (FPU). //! //! @note One of dst or src must be st(0). inline void fsub(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFSub, &dst, &src); } //! @brief Subtract @a src from st(0) and store result in st(0) (FPU). //! //! @note SP-FP or DP-FP determined by @a adr size. inline void fsub(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8); _emitInstruction(kX86InstFSub, &src); } //! @brief Subtract st(0) from @a dst and POP register stack (FPU). inline void fsubp(const X87Reg& dst = st(1)) { _emitInstruction(kX86InstFSubP, &dst); } //! @brief Reverse Subtract @a src from @a dst and store result in @a dst (FPU). //! //! @note One of dst or src must be st(0). inline void fsubr(const X87Reg& dst, const X87Reg& src) { ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0); _emitInstruction(kX86InstFSubR, &dst, &src); } //! @brief Reverse Subtract @a src from st(0) and store result in st(0) (FPU). //! //! @note SP-FP or DP-FP determined by @a adr size. inline void fsubr(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8); _emitInstruction(kX86InstFSubR, &src); } //! @brief Reverse Subtract st(0) from @a dst and POP register stack (FPU). inline void fsubrp(const X87Reg& dst = st(1)) { _emitInstruction(kX86InstFSubRP, &dst); } //! @brief Floating point test - Compare st(0) with 0.0. (FPU). inline void ftst() { _emitInstruction(kX86InstFTst); } //! @brief Unordered Compare st(0) with @a reg (FPU). inline void fucom(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFUCom, ®); } //! @brief Unordered Compare st(0) and @a reg, check for ordered values //! and Set EFLAGS (FPU). inline void fucomi(const X87Reg& reg) { _emitInstruction(kX86InstFUComI, ®); } //! @brief UnorderedCompare st(0) and @a reg, Check for ordered values //! and Set EFLAGS and pop the stack (FPU). inline void fucomip(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFUComIP, ®); } //! @brief Unordered Compare st(0) with @a reg and pop register stack (FPU). inline void fucomp(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFUComP, ®); } //! @brief Unordered compare st(0) with st(1) and pop register stack twice //! (FPU). inline void fucompp() { _emitInstruction(kX86InstFUComPP); } inline void fwait() { _emitInstruction(kX86InstFWait); } //! @brief Examine st(0) (FPU). //! //! Examines the contents of the ST(0) register and sets the condition code //! flags C0, C2, and C3 in the FPU status word to indicate the class of //! value or number in the register. inline void fxam() { _emitInstruction(kX86InstFXam); } //! @brief Exchange Register Contents (FPU). //! //! Exchange content of st(0) with @a reg. inline void fxch(const X87Reg& reg = st(1)) { _emitInstruction(kX86InstFXch, ®); } //! @brief Restore FP And MMX(tm) State And Streaming SIMD Extension State //! (FPU, MMX, SSE). //! //! Load FP and MMX(tm) technology and Streaming SIMD Extension state from //! src (512 bytes). inline void fxrstor(const Mem& src) { _emitInstruction(kX86InstFXRstor, &src); } //! @brief Store FP and MMX(tm) State and Streaming SIMD Extension State //! (FPU, MMX, SSE). //! //! Store FP and MMX(tm) technology state and Streaming SIMD Extension state //! to dst (512 bytes). inline void fxsave(const Mem& dst) { _emitInstruction(kX86InstFXSave, &dst); } //! @brief Extract Exponent and Significand (FPU). //! //! Separate value in st(0) into exponent and significand, store exponent //! in st(0), and push the significand onto the register stack. inline void fxtract() { _emitInstruction(kX86InstFXtract); } //! @brief Compute y * log2(x). //! //! Replace st(1) with (st(1) * log2st(0)) and pop the register stack. inline void fyl2x() { _emitInstruction(kX86InstFYL2X); } //! @brief Compute y * log_2(x+1). //! //! Replace st(1) with (st(1) * (log2st(0) + 1.0)) and pop the register stack. inline void fyl2xp1() { _emitInstruction(kX86InstFYL2XP1); } // -------------------------------------------------------------------------- // [MMX] // -------------------------------------------------------------------------- //! @brief Empty MMX state. inline void emms() { _emitInstruction(kX86InstEmms); } //! @brief Move DWord (MMX). inline void movd(const Mem& dst, const MmReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const GpReg& dst, const MmReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const MmReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move QWord (MMX). inline void movq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } //! @brief Move QWord (MMX). inline void movq(const Mem& dst, const MmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (MMX). inline void movq(const GpReg& dst, const MmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif //! @brief Move QWord (MMX). inline void movq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (MMX). inline void movq(const MmReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif //! @brief Pack with Signed Saturation (MMX). inline void packsswb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packsswb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packssdw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packssdw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (MMX). inline void packuswb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Pack with Unsigned Saturation (MMX). inline void packuswb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Packed BYTE Add (MMX). inline void paddb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed BYTE Add (MMX). inline void paddb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed WORD Add (MMX). inline void paddw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed WORD Add (MMX). inline void paddw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed DWORD Add (MMX). inline void paddd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed DWORD Add (MMX). inline void paddd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Logical AND (MMX). inline void pand(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND (MMX). inline void pand(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND Not (MMX). inline void pandn(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Logical AND Not (MMX). inline void pandn(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (MMX). inline void pcmpeqb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (MMX). inline void pcmpeqb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (MMX). inline void pcmpeqw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (MMX). inline void pcmpeqw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (MMX). inline void pcmpeqd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (MMX). inline void pcmpeqd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (MMX). inline void pcmpgtb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (MMX). inline void pcmpgtb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (MMX). inline void pcmpgtw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (MMX). inline void pcmpgtw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (MMX). inline void pcmpgtd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (MMX). inline void pcmpgtd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Multiply High (MMX). inline void pmulhw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High (MMX). inline void pmulhw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply Low (MMX). inline void pmullw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply Low (MMX). inline void pmullw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Bitwise Logical OR (MMX). inline void por(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Bitwise Logical OR (MMX). inline void por(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Packed Multiply and Add (MMX). inline void pmaddwd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Multiply and Add (MMX). inline void pmaddwd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhbw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhbw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhwd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhwd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhdq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhdq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklbw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklbw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklwd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklwd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckldq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckldq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Bitwise Exclusive OR (MMX). inline void pxor(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Bitwise Exclusive OR (MMX). inline void pxor(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPXor, &dst, &src); } // ------------------------------------------------------------------------- // [3dNow] // ------------------------------------------------------------------------- //! @brief Faster EMMS (3dNow!). //! //! @note Use only for early AMD processors where is only 3dNow! or SSE. If //! CPU contains SSE2, it's better to use @c emms() ( @c femms() is mapped //! to @c emms() ). inline void femms() { _emitInstruction(kX86InstFEmms); } //! @brief Packed SP-FP to Integer Convert (3dNow!). inline void pf2id(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPF2ID, &dst, &src); } //! @brief Packed SP-FP to Integer Convert (3dNow!). inline void pf2id(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPF2ID, &dst, &src); } //! @brief Packed SP-FP to Integer Word Convert (3dNow!). inline void pf2iw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPF2IW, &dst, &src); } //! @brief Packed SP-FP to Integer Word Convert (3dNow!). inline void pf2iw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPF2IW, &dst, &src); } //! @brief Packed SP-FP Accumulate (3dNow!). inline void pfacc(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFAcc, &dst, &src); } //! @brief Packed SP-FP Accumulate (3dNow!). inline void pfacc(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFAcc, &dst, &src); } //! @brief Packed SP-FP Addition (3dNow!). inline void pfadd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFAdd, &dst, &src); } //! @brief Packed SP-FP Addition (3dNow!). inline void pfadd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFAdd, &dst, &src); } //! @brief Packed SP-FP Compare - dst == src (3dNow!). inline void pfcmpeq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); } //! @brief Packed SP-FP Compare - dst == src (3dNow!). inline void pfcmpeq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); } //! @brief Packed SP-FP Compare - dst >= src (3dNow!). inline void pfcmpge(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFCmpGE, &dst, &src); } //! @brief Packed SP-FP Compare - dst >= src (3dNow!). inline void pfcmpge(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpGE, &dst, &src); } //! @brief Packed SP-FP Compare - dst > src (3dNow!). inline void pfcmpgt(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFCmpGT, &dst, &src); } //! @brief Packed SP-FP Compare - dst > src (3dNow!). inline void pfcmpgt(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpGT, &dst, &src); } //! @brief Packed SP-FP Maximum (3dNow!). inline void pfmax(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFMax, &dst, &src); } //! @brief Packed SP-FP Maximum (3dNow!). inline void pfmax(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFMax, &dst, &src); } //! @brief Packed SP-FP Minimum (3dNow!). inline void pfmin(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFMin, &dst, &src); } //! @brief Packed SP-FP Minimum (3dNow!). inline void pfmin(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFMin, &dst, &src); } //! @brief Packed SP-FP Multiply (3dNow!). inline void pfmul(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFMul, &dst, &src); } //! @brief Packed SP-FP Multiply (3dNow!). inline void pfmul(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFMul, &dst, &src); } //! @brief Packed SP-FP Negative Accumulate (3dNow!). inline void pfnacc(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFNAcc, &dst, &src); } //! @brief Packed SP-FP Negative Accumulate (3dNow!). inline void pfnacc(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFNAcc, &dst, &src); } //! @brief Packed SP-FP Mixed Accumulate (3dNow!). inline void pfpnacc(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFPNAcc, &dst, &src); } //! @brief Packed SP-FP Mixed Accumulate (3dNow!). inline void pfpnacc(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFPNAcc, &dst, &src); } //! @brief Packed SP-FP Reciprocal Approximation (3dNow!). inline void pfrcp(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRcp, &dst, &src); } //! @brief Packed SP-FP Reciprocal Approximation (3dNow!). inline void pfrcp(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRcp, &dst, &src); } //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!). inline void pfrcpit1(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!). inline void pfrcpit1(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!). inline void pfrcpit2(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); } //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!). inline void pfrcpit2(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!). inline void pfrsqit1(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!). inline void pfrsqit1(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!). inline void pfrsqrt(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFRSqrt, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!). inline void pfrsqrt(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFRSqrt, &dst, &src); } //! @brief Packed SP-FP Subtract (3dNow!). inline void pfsub(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFSub, &dst, &src); } //! @brief Packed SP-FP Subtract (3dNow!). inline void pfsub(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFSub, &dst, &src); } //! @brief Packed SP-FP Reverse Subtract (3dNow!). inline void pfsubr(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPFSubR, &dst, &src); } //! @brief Packed SP-FP Reverse Subtract (3dNow!). inline void pfsubr(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPFSubR, &dst, &src); } //! @brief Packed DWords to SP-FP (3dNow!). inline void pi2fd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPI2FD, &dst, &src); } //! @brief Packed DWords to SP-FP (3dNow!). inline void pi2fd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPI2FD, &dst, &src); } //! @brief Packed Words to SP-FP (3dNow!). inline void pi2fw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPI2FW, &dst, &src); } //! @brief Packed Words to SP-FP (3dNow!). inline void pi2fw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPI2FW, &dst, &src); } //! @brief Packed swap DWord (3dNow!) inline void pswapd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSwapD, &dst, &src); } //! @brief Packed swap DWord (3dNow!) inline void pswapd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSwapD, &dst, &src); } // -------------------------------------------------------------------------- // [SSE] // -------------------------------------------------------------------------- //! @brief Packed SP-FP Add (SSE). inline void addps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddPS, &dst, &src); } //! @brief Packed SP-FP Add (SSE). inline void addps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddPS, &dst, &src); } //! @brief Scalar SP-FP Add (SSE). inline void addss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddSS, &dst, &src); } //! @brief Scalar SP-FP Add (SSE). inline void addss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddSS, &dst, &src); } //! @brief Bit-wise Logical And Not For SP-FP (SSE). inline void andnps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAndnPS, &dst, &src); } //! @brief Bit-wise Logical And Not For SP-FP (SSE). inline void andnps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAndnPS, &dst, &src); } //! @brief Bit-wise Logical And For SP-FP (SSE). inline void andps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAndPS, &dst, &src); } //! @brief Bit-wise Logical And For SP-FP (SSE). inline void andps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAndPS, &dst, &src); } //! @brief Packed SP-FP Compare (SSE). inline void cmpps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); } //! @brief Packed SP-FP Compare (SSE). inline void cmpps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE). inline void cmpss(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE). inline void cmpss(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); } //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE). inline void comiss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstComISS, &dst, &src); } //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE). inline void comiss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstComISS, &dst, &src); } //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE). inline void cvtpi2ps(const XmmReg& dst, const MmReg& src) { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); } //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE). inline void cvtpi2ps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (SSE). inline void cvtps2pi(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (SSE). inline void cvtps2pi(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); } //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE). inline void cvtsi2ss(const XmmReg& dst, const GpReg& src) { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); } //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE). inline void cvtsi2ss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE). inline void cvtss2si(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE). inline void cvtss2si(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE). inline void cvttps2pi(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE). inline void cvttps2pi(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE). inline void cvttss2si(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE). inline void cvttss2si(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); } //! @brief Packed SP-FP Divide (SSE). inline void divps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstDivPS, &dst, &src); } //! @brief Packed SP-FP Divide (SSE). inline void divps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstDivPS, &dst, &src); } //! @brief Scalar SP-FP Divide (SSE). inline void divss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstDivSS, &dst, &src); } //! @brief Scalar SP-FP Divide (SSE). inline void divss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstDivSS, &dst, &src); } //! @brief Load Streaming SIMD Extension Control/Status (SSE). inline void ldmxcsr(const Mem& src) { _emitInstruction(kX86InstLdMXCSR, &src); } //! @brief Byte Mask Write (SSE). //! //! @note The default memory location is specified by DS:EDI. inline void maskmovq(const MmReg& data, const MmReg& mask) { _emitInstruction(kX86InstMaskMovQ, &data, &mask); } //! @brief Packed SP-FP Maximum (SSE). inline void maxps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMaxPS, &dst, &src); } //! @brief Packed SP-FP Maximum (SSE). inline void maxps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMaxPS, &dst, &src); } //! @brief Scalar SP-FP Maximum (SSE). inline void maxss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMaxSS, &dst, &src); } //! @brief Scalar SP-FP Maximum (SSE). inline void maxss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMaxSS, &dst, &src); } //! @brief Packed SP-FP Minimum (SSE). inline void minps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMinPS, &dst, &src); } //! @brief Packed SP-FP Minimum (SSE). inline void minps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMinPS, &dst, &src); } //! @brief Scalar SP-FP Minimum (SSE). inline void minss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMinSS, &dst, &src); } //! @brief Scalar SP-FP Minimum (SSE). inline void minss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMinSS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move DWord. inline void movd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const XmmReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move QWord (SSE). inline void movq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } //! @brief Move QWord (SSE). inline void movq(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (SSE). inline void movq(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move QWord (SSE). inline void movq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (SSE). inline void movq(const XmmReg& dst, const GpReg& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move 64 Bits Non Temporal (SSE). inline void movntq(const Mem& dst, const MmReg& src) { _emitInstruction(kX86InstMovNTQ, &dst, &src); } //! @brief High to Low Packed SP-FP (SSE). inline void movhlps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovHLPS, &dst, &src); } //! @brief Move High Packed SP-FP (SSE). inline void movhps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovHPS, &dst, &src); } //! @brief Move High Packed SP-FP (SSE). inline void movhps(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovHPS, &dst, &src); } //! @brief Move Low to High Packed SP-FP (SSE). inline void movlhps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovLHPS, &dst, &src); } //! @brief Move Low Packed SP-FP (SSE). inline void movlps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovLPS, &dst, &src); } //! @brief Move Low Packed SP-FP (SSE). inline void movlps(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovLPS, &dst, &src); } //! @brief Move Aligned Four Packed SP-FP Non Temporal (SSE). inline void movntps(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovNTPS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Packed SP-FP Multiply (SSE). inline void mulps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMulPS, &dst, &src); } //! @brief Packed SP-FP Multiply (SSE). inline void mulps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMulPS, &dst, &src); } //! @brief Scalar SP-FP Multiply (SSE). inline void mulss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMulSS, &dst, &src); } //! @brief Scalar SP-FP Multiply (SSE). inline void mulss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMulSS, &dst, &src); } //! @brief Bit-wise Logical OR for SP-FP Data (SSE). inline void orps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstOrPS, &dst, &src); } //! @brief Bit-wise Logical OR for SP-FP Data (SSE). inline void orps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstOrPS, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Extract Word (SSE). inline void pextrw(const GpReg& dst, const MmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Insert Word (SSE). inline void pinsrw(const MmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Insert Word (SSE). inline void pinsrw(const MmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Packed Signed Integer Word Maximum (SSE). inline void pmaxsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE). inline void pmaxsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE). inline void pmaxub(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE). inline void pmaxub(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE). inline void pminsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE). inline void pminsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE). inline void pminub(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE). inline void pminub(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Move Byte Mask To Integer (SSE). inline void pmovmskb(const GpReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMovMskB, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE). inline void pmulhuw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE). inline void pmulhuw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Sum of Absolute Differences (SSE). inline void psadbw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed Sum of Absolute Differences (SSE). inline void psadbw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed Shuffle word (SSE). inline void pshufw(const MmReg& dst, const MmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); } //! @brief Packed Shuffle word (SSE). inline void pshufw(const MmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); } //! @brief Packed SP-FP Reciprocal (SSE). inline void rcpps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstRcpPS, &dst, &src); } //! @brief Packed SP-FP Reciprocal (SSE). inline void rcpps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstRcpPS, &dst, &src); } //! @brief Scalar SP-FP Reciprocal (SSE). inline void rcpss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstRcpSS, &dst, &src); } //! @brief Scalar SP-FP Reciprocal (SSE). inline void rcpss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstRcpSS, &dst, &src); } //! @brief Prefetch (SSE). inline void prefetch(const Mem& mem, const Imm& hint) { _emitInstruction(kX86InstPrefetch, &mem, &hint); } //! @brief Compute Sum of Absolute Differences (SSE). inline void psadbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Compute Sum of Absolute Differences (SSE). inline void psadbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed SP-FP Square Root Reciprocal (SSE). inline void rsqrtps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Packed SP-FP Square Root Reciprocal (SSE). inline void rsqrtps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Scalar SP-FP Square Root Reciprocal (SSE). inline void rsqrtss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Scalar SP-FP Square Root Reciprocal (SSE). inline void rsqrtss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Store fence (SSE). inline void sfence() { _emitInstruction(kX86InstSFence); } //! @brief Shuffle SP-FP (SSE). inline void shufps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); } //! @brief Shuffle SP-FP (SSE). inline void shufps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); } //! @brief Packed SP-FP Square Root (SSE). inline void sqrtps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Packed SP-FP Square Root (SSE). inline void sqrtps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Scalar SP-FP Square Root (SSE). inline void sqrtss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Scalar SP-FP Square Root (SSE). inline void sqrtss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Store Streaming SIMD Extension Control/Status (SSE). inline void stmxcsr(const Mem& dst) { _emitInstruction(kX86InstStMXCSR, &dst); } //! @brief Packed SP-FP Subtract (SSE). inline void subps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSubPS, &dst, &src); } //! @brief Packed SP-FP Subtract (SSE). inline void subps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSubPS, &dst, &src); } //! @brief Scalar SP-FP Subtract (SSE). inline void subss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSubSS, &dst, &src); } //! @brief Scalar SP-FP Subtract (SSE). inline void subss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSubSS, &dst, &src); } //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE). inline void ucomiss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUComISS, &dst, &src); } //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE). inline void ucomiss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUComISS, &dst, &src); } //! @brief Unpack High Packed SP-FP Data (SSE). inline void unpckhps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUnpckHPS, &dst, &src); } //! @brief Unpack High Packed SP-FP Data (SSE). inline void unpckhps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUnpckHPS, &dst, &src); } //! @brief Unpack Low Packed SP-FP Data (SSE). inline void unpcklps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUnpckLPS, &dst, &src); } //! @brief Unpack Low Packed SP-FP Data (SSE). inline void unpcklps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUnpckLPS, &dst, &src); } //! @brief Bit-wise Logical Xor for SP-FP Data (SSE). inline void xorps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstXorPS, &dst, &src); } //! @brief Bit-wise Logical Xor for SP-FP Data (SSE). inline void xorps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstXorPS, &dst, &src); } // -------------------------------------------------------------------------- // [SSE2] // -------------------------------------------------------------------------- //! @brief Packed DP-FP Add (SSE2). inline void addpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddPD, &dst, &src); } //! @brief Packed DP-FP Add (SSE2). inline void addpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddPD, &dst, &src); } //! @brief Scalar DP-FP Add (SSE2). inline void addsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddSD, &dst, &src); } //! @brief Scalar DP-FP Add (SSE2). inline void addsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddSD, &dst, &src); } //! @brief Bit-wise Logical And Not For DP-FP (SSE2). inline void andnpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAndnPD, &dst, &src); } //! @brief Bit-wise Logical And Not For DP-FP (SSE2). inline void andnpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAndnPD, &dst, &src); } //! @brief Bit-wise Logical And For DP-FP (SSE2). inline void andpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAndPD, &dst, &src); } //! @brief Bit-wise Logical And For DP-FP (SSE2). inline void andpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAndPD, &dst, &src); } //! @brief Flush Cache Line (SSE2). inline void clflush(const Mem& mem) { _emitInstruction(kX86InstClFlush, &mem); } //! @brief Packed DP-FP Compare (SSE2). inline void cmppd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); } //! @brief Packed DP-FP Compare (SSE2). inline void cmppd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE2). inline void cmpsd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE2). inline void cmpsd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); } //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2). inline void comisd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstComISD, &dst, &src); } //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2). inline void comisd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstComISD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtdq2pd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtdq2pd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2). inline void cvtdq2ps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2). inline void cvtdq2ps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2dq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2dq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2pi(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2pi(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2). inline void cvtpd2ps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2). inline void cvtpd2ps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtpi2pd(const XmmReg& dst, const MmReg& src) { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtpi2pd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvtps2dq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvtps2dq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2). inline void cvtps2pd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2). inline void cvtps2pd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2). inline void cvtsd2si(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2). inline void cvtsd2si(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2). inline void cvtsd2ss(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2). inline void cvtsd2ss(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); } //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2). inline void cvtsi2sd(const XmmReg& dst, const GpReg& src) { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); } //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2). inline void cvtsi2sd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); } //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2). inline void cvtss2sd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); } //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2). inline void cvtss2sd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2pi(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2pi(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2dq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2dq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); } //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvttps2dq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); } //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvttps2dq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); } //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2). inline void cvttsd2si(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); } //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2). inline void cvttsd2si(const GpReg& dst, const Mem& src) { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); } //! @brief Packed DP-FP Divide (SSE2). inline void divpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstDivPD, &dst, &src); } //! @brief Packed DP-FP Divide (SSE2). inline void divpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstDivPD, &dst, &src); } //! @brief Scalar DP-FP Divide (SSE2). inline void divsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstDivSD, &dst, &src); } //! @brief Scalar DP-FP Divide (SSE2). inline void divsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstDivSD, &dst, &src); } //! @brief Load Fence (SSE2). inline void lfence() { _emitInstruction(kX86InstLFence); } //! @brief Store Selected Bytes of Double Quadword (SSE2). //! //! @note Target is DS:EDI. inline void maskmovdqu(const XmmReg& src, const XmmReg& mask) { _emitInstruction(kX86InstMaskMovDQU, &src, &mask); } //! @brief Return Maximum Packed Double-Precision FP Values (SSE2). inline void maxpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMaxPD, &dst, &src); } //! @brief Return Maximum Packed Double-Precision FP Values (SSE2). inline void maxpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMaxPD, &dst, &src); } //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2). inline void maxsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMaxSD, &dst, &src); } //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2). inline void maxsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMaxSD, &dst, &src); } //! @brief Memory Fence (SSE2). inline void mfence() { _emitInstruction(kX86InstMFence); } //! @brief Return Minimum Packed DP-FP Values (SSE2). inline void minpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMinPD, &dst, &src); } //! @brief Return Minimum Packed DP-FP Values (SSE2). inline void minpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMinPD, &dst, &src); } //! @brief Return Minimum Scalar DP-FP Value (SSE2). inline void minsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMinSD, &dst, &src); } //! @brief Return Minimum Scalar DP-FP Value (SSE2). inline void minsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMinSD, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Extract Packed SP-FP Sign Mask (SSE2). inline void movmskps(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovMskPS, &dst, &src); } //! @brief Extract Packed DP-FP Sign Mask (SSE2). inline void movmskpd(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovMskPD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Quadword from XMM to MMX Technology Register (SSE2). inline void movdq2q(const MmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDQ2Q, &dst, &src); } //! @brief Move Quadword from MMX Technology to XMM Register (SSE2). inline void movq2dq(const XmmReg& dst, const MmReg& src) { _emitInstruction(kX86InstMovQ2DQ, &dst, &src); } //! @brief Move High Packed Double-Precision FP Value (SSE2). inline void movhpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovHPD, &dst, &src); } //! @brief Move High Packed Double-Precision FP Value (SSE2). inline void movhpd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovHPD, &dst, &src); } //! @brief Move Low Packed Double-Precision FP Value (SSE2). inline void movlpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovLPD, &dst, &src); } //! @brief Move Low Packed Double-Precision FP Value (SSE2). inline void movlpd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovLPD, &dst, &src); } //! @brief Store Double Quadword Using Non-Temporal Hint (SSE2). inline void movntdq(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovNTDQ, &dst, &src); } //! @brief Store Store DWORD Using Non-Temporal Hint (SSE2). inline void movnti(const Mem& dst, const GpReg& src) { _emitInstruction(kX86InstMovNTI, &dst, &src); } //! @brief Store Packed Double-Precision FP Values Using Non-Temporal Hint (SSE2). inline void movntpd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovNTPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const Mem& dst, const XmmReg& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Packed DP-FP Multiply (SSE2). inline void mulpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMulPD, &dst, &src); } //! @brief Packed DP-FP Multiply (SSE2). inline void mulpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMulPD, &dst, &src); } //! @brief Scalar DP-FP Multiply (SSE2). inline void mulsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMulSD, &dst, &src); } //! @brief Scalar DP-FP Multiply (SSE2). inline void mulsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMulSD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void orpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstOrPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void orpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstOrPD, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packsswb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packsswb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packssdw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packssdw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE2). inline void packuswb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE2). inline void packuswb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Packed BYTE Add (SSE2). inline void paddb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed BYTE Add (SSE2). inline void paddb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed WORD Add (SSE2). inline void paddw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed WORD Add (SSE2). inline void paddw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed DWORD Add (SSE2). inline void paddd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed DWORD Add (SSE2). inline void paddd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Logical AND (SSE2). inline void pand(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND (SSE2). inline void pand(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND Not (SSE2). inline void pandn(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Logical AND Not (SSE2). inline void pandn(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Spin Loop Hint (SSE2). inline void pause() { _emitInstruction(kX86InstPause); } //! @brief Packed Average (SSE2). inline void pavgb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (SSE2). inline void pcmpeqb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (SSE2). inline void pcmpeqb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (SSE2). inline void pcmpeqw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (SSE2). inline void pcmpeqw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (SSE2). inline void pcmpeqd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (SSE2). inline void pcmpeqd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (SSE2). inline void pcmpgtb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (SSE2). inline void pcmpgtb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (SSE2). inline void pcmpgtw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (SSE2). inline void pcmpgtw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (SSE2). inline void pcmpgtd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (SSE2). inline void pcmpgtd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE2). inline void pmaxsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE2). inline void pmaxsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE2). inline void pmaxub(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE2). inline void pmaxub(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE2). inline void pminsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE2). inline void pminsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE2). inline void pminub(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE2). inline void pminub(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Move Byte Mask (SSE2). inline void pmovmskb(const GpReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovMskB, &dst, &src); } //! @brief Packed Multiply High (SSE2). inline void pmulhw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High (SSE2). inline void pmulhw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE2). inline void pmulhuw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE2). inline void pmulhuw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply Low (SSE2). inline void pmullw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply Low (SSE2). inline void pmullw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Bitwise Logical OR (SSE2). inline void por(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Bitwise Logical OR (SSE2). inline void por(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslldq(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSllDQ, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Multiply and Add (SSE2). inline void pmaddwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Multiply and Add (SSE2). inline void pmaddwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Shuffle Packed DWORDs (SSE2). inline void pshufd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); } //! @brief Shuffle Packed DWORDs (SSE2). inline void pshufd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); } //! @brief Shuffle Packed High Words (SSE2). inline void pshufhw(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); } //! @brief Shuffle Packed High Words (SSE2). inline void pshufhw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); } //! @brief Shuffle Packed Low Words (SSE2). inline void pshuflw(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); } //! @brief Shuffle Packed Low Words (SSE2). inline void pshuflw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief DQWord Shift Right Logical (MMX). inline void psrldq(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlDQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmReg& dst, const Imm& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhqdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhqdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpckldq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpckldq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklqdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklqdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); } //! @brief Bitwise Exclusive OR (SSE2). inline void pxor(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Bitwise Exclusive OR (SSE2). inline void pxor(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Shuffle DP-FP (SSE2). inline void shufpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); } //! @brief Shuffle DP-FP (SSE2). inline void shufpd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); } //! @brief Compute Square Roots of Packed DP-FP Values (SSE2). inline void sqrtpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtPD, &dst, &src); } //! @brief Compute Square Roots of Packed DP-FP Values (SSE2). inline void sqrtpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPD, &dst, &src); } //! @brief Compute Square Root of Scalar DP-FP Value (SSE2). inline void sqrtsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSqrtSD, &dst, &src); } //! @brief Compute Square Root of Scalar DP-FP Value (SSE2). inline void sqrtsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSD, &dst, &src); } //! @brief Packed DP-FP Subtract (SSE2). inline void subpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSubPD, &dst, &src); } //! @brief Packed DP-FP Subtract (SSE2). inline void subpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSubPD, &dst, &src); } //! @brief Scalar DP-FP Subtract (SSE2). inline void subsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstSubSD, &dst, &src); } //! @brief Scalar DP-FP Subtract (SSE2). inline void subsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstSubSD, &dst, &src); } //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2). inline void ucomisd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUComISD, &dst, &src); } //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2). inline void ucomisd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUComISD, &dst, &src); } //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2). inline void unpckhpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUnpckHPD, &dst, &src); } //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2). inline void unpckhpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUnpckHPD, &dst, &src); } //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2). inline void unpcklpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstUnpckLPD, &dst, &src); } //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2). inline void unpcklpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstUnpckLPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void xorpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstXorPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void xorpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstXorPD, &dst, &src); } // -------------------------------------------------------------------------- // [SSE3] // -------------------------------------------------------------------------- //! @brief Packed DP-FP Add/Subtract (SSE3). inline void addsubpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddSubPD, &dst, &src); } //! @brief Packed DP-FP Add/Subtract (SSE3). inline void addsubpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddSubPD, &dst, &src); } //! @brief Packed SP-FP Add/Subtract (SSE3). inline void addsubps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstAddSubPS, &dst, &src); } //! @brief Packed SP-FP Add/Subtract (SSE3). inline void addsubps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstAddSubPS, &dst, &src); } //! @brief Store Integer with Truncation (SSE3). inline void fisttp(const Mem& dst) { _emitInstruction(kX86InstFISttP, &dst); } //! @brief Packed DP-FP Horizontal Add (SSE3). inline void haddpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstHAddPD, &dst, &src); } //! @brief Packed DP-FP Horizontal Add (SSE3). inline void haddpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstHAddPD, &dst, &src); } //! @brief Packed SP-FP Horizontal Add (SSE3). inline void haddps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstHAddPS, &dst, &src); } //! @brief Packed SP-FP Horizontal Add (SSE3). inline void haddps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstHAddPS, &dst, &src); } //! @brief Packed DP-FP Horizontal Subtract (SSE3). inline void hsubpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstHSubPD, &dst, &src); } //! @brief Packed DP-FP Horizontal Subtract (SSE3). inline void hsubpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstHSubPD, &dst, &src); } //! @brief Packed SP-FP Horizontal Subtract (SSE3). inline void hsubps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstHSubPS, &dst, &src); } //! @brief Packed SP-FP Horizontal Subtract (SSE3). inline void hsubps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstHSubPS, &dst, &src); } //! @brief Load Unaligned Integer 128 Bits (SSE3). inline void lddqu(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstLdDQU, &dst, &src); } //! @brief Set Up Monitor Address (SSE3). inline void monitor() { _emitInstruction(kX86InstMonitor); } //! @brief Move One DP-FP and Duplicate (SSE3). inline void movddup(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovDDup, &dst, &src); } //! @brief Move One DP-FP and Duplicate (SSE3). inline void movddup(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovDDup, &dst, &src); } //! @brief Move Packed SP-FP High and Duplicate (SSE3). inline void movshdup(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSHDup, &dst, &src); } //! @brief Move Packed SP-FP High and Duplicate (SSE3). inline void movshdup(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSHDup, &dst, &src); } //! @brief Move Packed SP-FP Low and Duplicate (SSE3). inline void movsldup(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstMovSLDup, &dst, &src); } //! @brief Move Packed SP-FP Low and Duplicate (SSE3). inline void movsldup(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovSLDup, &dst, &src); } //! @brief Monitor Wait (SSE3). inline void mwait() { _emitInstruction(kX86InstMWait); } // -------------------------------------------------------------------------- // [SSSE3] // -------------------------------------------------------------------------- //! @brief Packed SIGN (SSSE3). inline void psignb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const MmReg& dst, const MmReg& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const MmReg& dst, const Mem& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const MmReg& dst, const MmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const MmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } // -------------------------------------------------------------------------- // [SSE4.1] // -------------------------------------------------------------------------- //! @brief Blend Packed DP-FP Values (SSE4.1). inline void blendpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); } //! @brief Blend Packed DP-FP Values (SSE4.1). inline void blendpd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); } //! @brief Blend Packed SP-FP Values (SSE4.1). inline void blendps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); } //! @brief Blend Packed SP-FP Values (SSE4.1). inline void blendps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); } //! @brief Variable Blend Packed DP-FP Values (SSE4.1). inline void blendvpd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstBlendVPD, &dst, &src); } //! @brief Variable Blend Packed DP-FP Values (SSE4.1). inline void blendvpd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstBlendVPD, &dst, &src); } //! @brief Variable Blend Packed SP-FP Values (SSE4.1). inline void blendvps(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstBlendVPS, &dst, &src); } //! @brief Variable Blend Packed SP-FP Values (SSE4.1). inline void blendvps(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstBlendVPS, &dst, &src); } //! @brief Dot Product of Packed DP-FP Values (SSE4.1). inline void dppd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); } //! @brief Dot Product of Packed DP-FP Values (SSE4.1). inline void dppd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); } //! @brief Dot Product of Packed SP-FP Values (SSE4.1). inline void dpps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); } //! @brief Dot Product of Packed SP-FP Values (SSE4.1). inline void dpps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); } //! @brief Extract Packed SP-FP Value (SSE4.1). inline void extractps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); } //! @brief Extract Packed SP-FP Value (SSE4.1). inline void extractps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); } //! @brief Load Double Quadword Non-Temporal Aligned Hint (SSE4.1). inline void movntdqa(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstMovNTDQA, &dst, &src); } //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1). inline void mpsadbw(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); } //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1). inline void mpsadbw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); } //! @brief Pack with Unsigned Saturation (SSE4.1). inline void packusdw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPackUSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE4.1). inline void packusdw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPackUSDW, &dst, &src); } //! @brief Variable Blend Packed Bytes (SSE4.1). inline void pblendvb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPBlendVB, &dst, &src); } //! @brief Variable Blend Packed Bytes (SSE4.1). inline void pblendvb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPBlendVB, &dst, &src); } //! @brief Blend Packed Words (SSE4.1). inline void pblendw(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); } //! @brief Blend Packed Words (SSE4.1). inline void pblendw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); } //! @brief Compare Packed Qword Data for Equal (SSE4.1). inline void pcmpeqq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); } //! @brief Compare Packed Qword Data for Equal (SSE4.1). inline void pcmpeqq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); } //! @brief Extract Byte (SSE4.1). inline void pextrb(const GpReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); } //! @brief Extract Byte (SSE4.1). inline void pextrb(const Mem& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrd(const GpReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrd(const Mem& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrq(const GpReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrq(const Mem& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); } //! @brief Extract Word (SSE4.1). inline void pextrw(const GpReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Extract Word (SSE4.1). inline void pextrw(const Mem& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Packed Horizontal Word Minimum (SSE4.1). inline void phminposuw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); } //! @brief Packed Horizontal Word Minimum (SSE4.1). inline void phminposuw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); } //! @brief Insert Byte (SSE4.1). inline void pinsrb(const XmmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); } //! @brief Insert Byte (SSE4.1). inline void pinsrb(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrd(const XmmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrq(const XmmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrq(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); } //! @brief Insert Word (SSE2). inline void pinsrw(const XmmReg& dst, const GpReg& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Insert Word (SSE2). inline void pinsrw(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Maximum of Packed Word Integers (SSE4.1). inline void pmaxuw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxUW, &dst, &src); } //! @brief Maximum of Packed Word Integers (SSE4.1). inline void pmaxuw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUW, &dst, &src); } //! @brief Maximum of Packed Signed Byte Integers (SSE4.1). inline void pmaxsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxSB, &dst, &src); } //! @brief Maximum of Packed Signed Byte Integers (SSE4.1). inline void pmaxsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSB, &dst, &src); } //! @brief Maximum of Packed Signed Dword Integers (SSE4.1). inline void pmaxsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxSD, &dst, &src); } //! @brief Maximum of Packed Signed Dword Integers (SSE4.1). inline void pmaxsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSD, &dst, &src); } //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1). inline void pmaxud(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMaxUD, &dst, &src); } //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1). inline void pmaxud(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUD, &dst, &src); } //! @brief Minimum of Packed Signed Byte Integers (SSE4.1). inline void pminsb(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinSB, &dst, &src); } //! @brief Minimum of Packed Signed Byte Integers (SSE4.1). inline void pminsb(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinSB, &dst, &src); } //! @brief Minimum of Packed Word Integers (SSE4.1). inline void pminuw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinUW, &dst, &src); } //! @brief Minimum of Packed Word Integers (SSE4.1). inline void pminuw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinUW, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminud(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinUD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminud(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinUD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminsd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMinSD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminsd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMinSD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXBW, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBW, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXBD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXWD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXWD, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxwq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxwq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbw(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXBW, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbw(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBW, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXBD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxwd(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXWD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxwd(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXWD, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxwq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxwq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxdq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxdq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); } //! @brief Multiply Packed Signed Dword Integers (SSE4.1). inline void pmuldq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulDQ, &dst, &src); } //! @brief Multiply Packed Signed Dword Integers (SSE4.1). inline void pmuldq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulDQ, &dst, &src); } //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1). inline void pmulld(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPMulLD, &dst, &src); } //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1). inline void pmulld(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPMulLD, &dst, &src); } //! @brief Logical Compare (SSE4.1). inline void ptest(const XmmReg& op1, const XmmReg& op2) { _emitInstruction(kX86InstPTest, &op1, &op2); } //! @brief Logical Compare (SSE4.1). inline void ptest(const XmmReg& op1, const Mem& op2) { _emitInstruction(kX86InstPTest, &op1, &op2); } //! Round Packed SP-FP Values @brief (SSE4.1). inline void roundps(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); } //! Round Packed SP-FP Values @brief (SSE4.1). inline void roundps(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); } //! @brief Round Scalar SP-FP Values (SSE4.1). inline void roundss(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); } //! @brief Round Scalar SP-FP Values (SSE4.1). inline void roundss(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); } //! @brief Round Packed DP-FP Values (SSE4.1). inline void roundpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); } //! @brief Round Packed DP-FP Values (SSE4.1). inline void roundpd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); } //! @brief Round Scalar DP-FP Values (SSE4.1). inline void roundsd(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); } //! @brief Round Scalar DP-FP Values (SSE4.1). inline void roundsd(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); } // -------------------------------------------------------------------------- // [SSE4.2] // -------------------------------------------------------------------------- //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2). inline void crc32(const GpReg& dst, const GpReg& src) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpd) || dst.isRegType(kX86RegTypeGpq)); _emitInstruction(kX86InstCrc32, &dst, &src); } //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2). inline void crc32(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpd) || dst.isRegType(kX86RegTypeGpq)); _emitInstruction(kX86InstCrc32, &dst, &src); } //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2). inline void pcmpestri(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2). inline void pcmpestri(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2). inline void pcmpestrm(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2). inline void pcmpestrm(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2). inline void pcmpistri(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2). inline void pcmpistri(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2). inline void pcmpistrm(const XmmReg& dst, const XmmReg& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2). inline void pcmpistrm(const XmmReg& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); } //! @brief Compare Packed Data for Greater Than (SSE4.2). inline void pcmpgtq(const XmmReg& dst, const XmmReg& src) { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); } //! @brief Compare Packed Data for Greater Than (SSE4.2). inline void pcmpgtq(const XmmReg& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); } //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2). inline void popcnt(const GpReg& dst, const GpReg& src) { ASMJIT_ASSERT(!dst.isGpb()); ASMJIT_ASSERT(src.getRegType() == dst.getRegType()); _emitInstruction(kX86InstPopCnt, &dst, &src); } //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2). inline void popcnt(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstPopCnt, &dst, &src); } // ------------------------------------------------------------------------- // [AMD only] // ------------------------------------------------------------------------- //! @brief Prefetch (3dNow - Amd). //! //! Loads the entire 64-byte aligned memory sequence containing the //! specified memory address into the L1 data cache. The position of //! the specified memory address within the 64-byte cache line is //! irrelevant. If a cache hit occurs, or if a memory fault is detected, //! no bus cycle is initiated and the instruction is treated as a NOP. inline void amd_prefetch(const Mem& mem) { _emitInstruction(kX86InstAmdPrefetch, &mem); } //! @brief Prefetch and set cache to modified (3dNow - Amd). //! //! The PREFETCHW instruction loads the prefetched line and sets the //! cache-line state to Modified, in anticipation of subsequent data //! writes to the line. The PREFETCH instruction, by contrast, typically //! sets the cache-line state to Exclusive (depending on the hardware //! implementation). inline void amd_prefetchw(const Mem& mem) { _emitInstruction(kX86InstAmdPrefetchW, &mem); } // ------------------------------------------------------------------------- // [Intel only] // ------------------------------------------------------------------------- //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom). inline void movbe(const GpReg& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstMovBE, &dst, &src); } //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom). inline void movbe(const Mem& dst, const GpReg& src) { ASMJIT_ASSERT(!src.isGpb()); _emitInstruction(kX86InstMovBE, &dst, &src); } // ------------------------------------------------------------------------- // [Emit Options] // ------------------------------------------------------------------------- //! @brief Assert LOCK# Signal Prefix. //! //! This instruction causes the processor's LOCK# signal to be asserted //! during execution of the accompanying instruction (turns the //! instruction into an atomic instruction). In a multiprocessor environment, //! the LOCK# signal insures that the processor has exclusive use of any shared //! memory while the signal is asserted. //! //! The LOCK prefix can be prepended only to the following instructions and //! to those forms of the instructions that use a memory operand: ADD, ADC, //! AND, BTC, BTR, BTS, CMPXCHG, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, //! and XCHG. An undefined opcode exception will be generated if the LOCK //! prefix is used with any other instruction. The XCHG instruction always //! asserts the LOCK# signal regardless of the presence or absence of the LOCK //! prefix. //! //! @sa @c kX86EmitOptionLock. inline void lock() { _emitOptions |= kX86EmitOptionLock; } //! @brief Force REX prefix to be emitted. //! //! This option should be used carefully, because there are unencodable //! combinations. If you want to access ah, bh, ch or dh registers then you //! can't emit REX prefix and it will cause an illegal instruction error. //! //! @note REX prefix is only valid for X64/AMD64 platform. //! //! @sa @c kX86EmitOptionRex. inline void rex() { _emitOptions |= kX86EmitOptionRex; } }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86ASSEMBLER_H desmume-0.9.9/src/utils/AsmJit/x86/x86compiler.h0000644000175000017500000076301012140261626022025 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86COMPILER_H #define _ASMJIT_X86_X86COMPILER_H // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/compiler.h" #include "../core/compilercontext.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../x86/x86assembler.h" #include "../x86/x86defs.h" #include "../x86/x86func.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" //! @internal //! //! @brief Mark methods not supported by @ref Compiler. These methods are //! usually used only in function prologs/epilogs or to manage stack. #define ASMJIT_NOT_SUPPORTED_BY_COMPILER 0 namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [Forward Declarations] // ============================================================================ struct X86Compiler; struct X86CompilerAlign; struct X86CompilerContext; struct X86CompilerFuncCall; struct X86CompilerFuncDecl; struct X86CompilerFuncEnd; struct X86CompilerInst; struct X86CompilerJmpInst; struct X86CompilerState; struct X86CompilerTarget; struct X86CompilerVar; // ============================================================================ // [AsmJit::X86CompilerVar] // ============================================================================ //! @brief @ref X86Compiler variable. struct X86CompilerVar : public CompilerVar { // -------------------------------------------------------------------------- // [AsVar] // -------------------------------------------------------------------------- inline GpVar asGpVar() const { GpVar var; var._var.id = _id; var._var.size = _size; var._var.regCode = x86VarInfo[_type].getCode(); var._var.varType = _type; return var; } inline MmVar asMmVar() const { MmVar var; var._var.id = _id; var._var.size = _size; var._var.regCode = x86VarInfo[_type].getCode(); var._var.varType = _type; return var; } inline XmmVar asXmmVar() const { XmmVar var; var._var.id = _id; var._var.size = _size; var._var.regCode = x86VarInfo[_type].getCode(); var._var.varType = _type; return var; } // -------------------------------------------------------------------------- // [Members - Scope] // -------------------------------------------------------------------------- //! @brief The first item where the variable is accessed. //! @note If this member is @c NULL then variable isn't used. CompilerItem* firstItem; //! @brief The last item where the variable is accessed. CompilerItem* lastItem; //! @brief Scope (NULL if variable is global). X86CompilerFuncDecl* funcScope; //! @brief The first call which is after the @c firstItem. X86CompilerFuncCall* funcCall; // -------------------------------------------------------------------------- // [Members - Home] // -------------------------------------------------------------------------- //! @brief Home register index or @c kRegIndexInvalid (used by register allocator). uint32_t homeRegisterIndex; //! @brief Preferred registers mask. uint32_t prefRegisterMask; //! @brief Home memory address offset. int32_t homeMemoryOffset; //! @brief Used by @c CompilerContext, do not touch (initially NULL). void* homeMemoryData; // -------------------------------------------------------------------------- // [Members - Actual] // -------------------------------------------------------------------------- //! @brief Actual register index (connected with actual @c X86CompilerState). uint32_t regIndex; //! @brief Actual working offset. This member is set before register allocator //! is called. If workOffset is same as CompilerContext::_currentOffset then //! this variable is probably used in next instruction and can't be spilled. uint32_t workOffset; //! @brief Next active variable in circular double-linked list. X86CompilerVar* nextActive; //! @brief Previous active variable in circular double-linked list. X86CompilerVar* prevActive; // -------------------------------------------------------------------------- // [Members - Flags] // -------------------------------------------------------------------------- //! @brief Variable state (connected with actual @c X86CompilerState). uint8_t state; //! @brief Whether variable was changed (connected with actual @c X86CompilerState). uint8_t changed; //! @brief Save on unuse (at end of the variable scope). uint8_t saveOnUnuse; // -------------------------------------------------------------------------- // [Members - Statistics] // -------------------------------------------------------------------------- //! @brief Register read access statistics. uint32_t regReadCount; //! @brief Register write access statistics. uint32_t regWriteCount; //! @brief Register read/write access statistics (related to a single instruction). uint32_t regRwCount; //! @brief Register GpbLo access statistics. uint32_t regGpbLoCount; //! @brief Register GpbHi access statistics. uint32_t regGpbHiCount; //! @brief Memory read statistics. uint32_t memReadCount; //! @brief Memory write statistics. uint32_t memWriteCount; //! @brief Memory read+write statistics. uint32_t memRwCount; // -------------------------------------------------------------------------- // [Members - Temporary] // -------------------------------------------------------------------------- //! @brief Temporary data that can be used in prepare/translate stage. //! //! Initial value is NULL and it's expected that after use it's set back to //! NULL. //! //! The temporary data is designed to be used by algorithms that need to //! set some state into variables, do something and then clean-up. See //! state switch and function call for details. union { void* tPtr; intptr_t tInt; }; }; // ============================================================================ // [AsmJit::X86CompilerState] // ============================================================================ //! @brief @ref X86Compiler state. struct X86CompilerState : CompilerState { enum { //! @brief Base for Gp registers. kStateRegGpBase = 0, //! @brief Base for Mm registers. kStateRegMmBase = 16, //! @brief Base for Xmm registers. kStateRegXmmBase = 24, //! @brief Count of all registers in @ref X86CompilerState. kStateRegCount = 16 + 8 + 16 }; // -------------------------------------------------------------------------- // [Clear] // -------------------------------------------------------------------------- inline void clear() { memset(this, 0, sizeof(*this)); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- union { //! @brief All allocated variables in one array. X86CompilerVar* regs[kStateRegCount]; struct { //! @brief Allocated GP registers. X86CompilerVar* gp[16]; //! @brief Allocated MM registers. X86CompilerVar* mm[8]; //! @brief Allocated XMM registers. X86CompilerVar* xmm[16]; }; }; //! @brief Used GP registers bit-mask. uint32_t usedGP; //! @brief Used MM registers bit-mask. uint32_t usedMM; //! @brief Used XMM registers bit-mask. uint32_t usedXMM; //! @brief Changed GP registers bit-mask. uint32_t changedGP; //! @brief Changed MM registers bit-mask. uint32_t changedMM; //! @brief Changed XMM registers bit-mask. uint32_t changedXMM; //! @brief Count of variables in @c memVarsData. uint32_t memVarsCount; //! @brief Variables stored in memory (@c kVarStateMem). //! //! When saving / restoring state it's important to keep registers which are //! still in memory. Register is always unused when it is going out-of-scope. //! All variables which are not here are unused (@c kVarStateUnused). X86CompilerVar* memVarsData[1]; }; // ============================================================================ // [AsmJit::VarMemBlock] // ============================================================================ struct VarMemBlock { int32_t offset; uint32_t size; VarMemBlock* nextUsed; VarMemBlock* nextFree; }; // ============================================================================ // [AsmJit::VarAllocRecord] // ============================================================================ //! @brief Variable alloc record (for each instruction that uses variables). //! //! Variable record contains pointer to variable data and register allocation //! flags. These flags are important to determine the best alloc instruction. struct VarAllocRecord { //! @brief Variable data (the structure owned by @c Compiler). X86CompilerVar* vdata; //! @brief Variable alloc flags, see @c kVarAllocFlags. uint32_t vflags; //! @brief Register mask (default is 0). uint32_t regMask; }; // ============================================================================ // [AsmJit::VarCallRecord] // ============================================================================ //! @brief Variable call-fn record (for each callable that uses variables). //! //! This record contains variables that are used to call a function (using //! @c X86CompilerFuncCall item). Each variable contains the registers where //! it must be and registers where the value will be returned. struct VarCallRecord { //! @brief Variable data (the structure owned by @c Compiler). X86CompilerVar* vdata; uint32_t flags; uint8_t inCount; uint8_t inDone; uint8_t outCount; uint8_t outDone; enum FLAGS { kFlagInGp = 0x0001, kFlagInMm = 0x0002, kFlagInXmm = 0x0004, kFlagInStack = 0x0008, kFlagOutEax = 0x0010, kFlagOutEdx = 0x0020, kFlagOutSt0 = 0x0040, kFlagOutSt1 = 0x0080, kFlagOutMm0 = 0x0100, kFlagOutXmm0 = 0x0400, kFlagOutXmm1 = 0x0800, kFlagInMemPtr = 0x1000, kFlagCallReg = 0x2000, kFlagCallMem = 0x4000, kFlagUnuseAfterUse = 0x8000 }; }; // ============================================================================ // [AsmJit::VarHintRecord] // ============================================================================ struct VarHintRecord { X86CompilerVar* vdata; uint32_t hint; }; // ============================================================================ // [AsmJit::ForwardJumpData] // ============================================================================ struct ForwardJumpData { X86CompilerJmpInst* inst; X86CompilerState* state; ForwardJumpData* next; }; // ============================================================================ // [AsmJit::CompilerUtil] // ============================================================================ //! @brief Static class that contains utility methods. struct CompilerUtil { ASMJIT_API static bool isStack16ByteAligned(); }; // ============================================================================ // [AsmJit::X86Compiler] // ============================================================================ //! @brief Compiler - high level code generation. //! //! This class is used to store instruction stream and allows to modify //! it on the fly. It uses different concept than @c AsmJit::Assembler class //! and in fact @c AsmJit::Assembler is only used as a backend. Compiler never //! emits machine code and each instruction you use is stored to instruction //! array instead. This allows to modify instruction stream later and for //! example to reorder instructions to make better performance. //! //! Using @c AsmJit::Compiler moves code generation to higher level. Higher //! level constructs allows to write more abstract and extensible code that //! is not possible with pure @c AsmJit::Assembler class. Because //! @c AsmJit::Compiler needs to create many objects and lifetime of these //! objects is small (same as @c AsmJit::Compiler lifetime itself) it uses //! very fast memory management model. This model allows to create object //! instances in nearly zero time (compared to @c malloc() or @c new() //! operators) so overhead by creating machine code by @c AsmJit::Compiler //! is minimized. //! //! @section AsmJit_Compiler_TheStory The Story //! //! Before telling you how Compiler works I'd like to write a story. I'd like //! to cover reasons why this class was created and why I'm recommending to use //! it. When I released the first version of AsmJit (0.1) it was a toy. The //! first function I wrote was function which is still available as testjit and //! which simply returns 1024. The reason why function works for both 32-bit/ //! 64-bit mode and for Windows/Unix specific calling conventions is luck, no //! arguments usage and no registers usage except returning value in EAX/RAX. //! //! Then I started a project called BlitJit which was targetted to generating //! JIT code for computer graphics. After writing some lines I decided that I //! can't join pieces of code together without abstraction, should be //! pixels source pointer in ESI/RSI or EDI/RDI or it's completelly //! irrellevant? What about destination pointer and SSE2 register for reading //! input pixels? The simple answer might be "just pick some one and use it". //! //! Another reason for abstraction is function calling-conventions. It's really //! not easy to write assembler code for 32-bit and 64-bit platform supporting //! three calling conventions (32-bit is similar between Windows and Unix, but //! 64-bit calling conventions are different). //! //! At this time I realized that I can't write code which uses named registers, //! I need to abstract it. In most cases you don't need specific register, you //! need to emit instruction that does something with 'virtual' register(s), //! memory, immediate or label. //! //! The first version of AsmJit with Compiler was 0.5 (or 0.6?, can't remember). //! There was support for 32-bit and 64-bit mode, function calling conventions, //! but when emitting instructions the developer needed to decide which //! registers are changed, which are only read or completely overwritten. This //! model helped a lot when generating code, especially when joining more //! code-sections together, but there was also small possibility for mistakes. //! Simply the first version of Compiler was great improvement over low-level //! Assembler class, but the API design wasn't perfect. //! //! The second version of Compiler, completelly rewritten and based on //! different goals, is part of AsmJit starting at version 1.0. This version //! was designed after the first one and it contains serious improvements over //! the old one. The first improvement is that you just use instructions with //! virtual registers - called variables. When using compiler there is no way //! to use native registers, there are variables instead. AsmJit is smarter //! than before and it knows which register is needed only for read (r), //! read/write (w) or overwrite (x). Supported are also instructions which //! are using some registers in implicit way (these registers are not part of //! instruction definition in string form). For example to use CPUID instruction //! you must give it four variables which will be automatically allocated to //! input/output registers (EAX, EBX, ECX, EDX). //! //! Another improvement is algorithm used by a register allocator. In first //! version the registers were allocated when creating instruction stream. In //! new version registers are allocated after calling @c Compiler::make(). This //! means that register allocator has information about scope of all variables //! and their usage statistics. The algorithm to allocate registers is very //! simple and it's always called as a 'linear scan register allocator'. When //! you get out of registers the all possible variables are scored and the worst //! is spilled. Of course algorithm ignores the variables used for current //! instruction. //! //! In addition, because registers are allocated after the code stream is //! generated, the state switches between jumps are handled by Compiler too. //! You don't need to worry about jumps, compiler always do this dirty work //! for you. //! //! The nearly last thing I'd like to present is calling other functions from //! the generated code. AsmJit uses a @c FunctionPrototype class to hold //! the function parameters, their position in stack (or register index) and //! function return value. This class is used internally, but it can be //! used to create your own function calling-convention. All standard function //! calling conventions are implemented. //! //! Please enjoy the new version of Compiler, it was created for writing a //! low-level code using high-level API, leaving developer to concentrate to //! real problems and not to solving a register puzzle. //! //! @section AsmJit_Compiler_CodeGeneration Code Generation //! //! First that is needed to know about compiler is that compiler never emits //! machine code. It's used as a middleware between @c AsmJit::Assembler and //! your code. There is also convenience method @c make() that allows to //! generate machine code directly without creating @c AsmJit::Assembler //! instance. //! //! Comparison of generating machine code through @c Assembler and directly //! by @c Compiler: //! //! @code //! // Assembler instance is low level code generation class that emits //! // machine code. //! X86Assembler a; //! //! // Compiler instance is high level code generation class that stores all //! // instructions in internal representation. //! X86Compiler c; //! //! // ... put your code here ... //! //! // Final step - generate code. AsmJit::Compiler::serialize() will serialize //! // all instructions into Assembler and this ensures generating real machine //! // code. //! c.serialize(a); //! //! // Your function //! void* fn = a.make(); //! @endcode //! //! Example how to generate machine code using only @c Compiler (preferred): //! //! @code //! // Compiler instance is enough. //! X86Compiler c; //! //! // ... put your code here ... //! //! // Your function //! void* fn = c.make(); //! @endcode //! //! You can see that there is @c AsmJit::Compiler::serialize() function that //! emits instructions into @c AsmJit::Assembler(). This layered architecture //! means that each class is used for something different and there is no code //! duplication. For convenience there is also @c AsmJit::Compiler::make() //! method that can create your function using @c AsmJit::Assembler, but //! internally (this is preffered bahavior when using @c AsmJit::Compiler). //! //! The @c make() method allocates memory using @c Context instance passed //! into the @c X86Compiler constructor. If code generator is used to create JIT //! function then virtual memory allocated by @c MemoryManager is used. To get //! global memory manager use @c MemoryManager::getGlobal(). //! //! @code //! // Compiler instance is enough. //! X86Compiler c; //! //! // ... put your code using Compiler instance ... //! //! // Your function //! void* fn = c.make(); //! //! // Free it if you don't want it anymore //! // (using global memory manager instance) //! MemoryManager::getGlobal()->free(fn); //! @endcode //! //! @section AsmJit_Compiler_Functions Functions //! //! To build functions with @c Compiler, see @c AsmJit::Compiler::newFunc() //! method. //! //! @section AsmJit_Compiler_Variables Variables //! //! Compiler is able to manage variables and function arguments. Internally //! there is no difference between function argument and variable declared //! inside. To get function argument you use @c getGpArg() method and to declare //! variable use @c newGpVar(), @c newMmVar() and @c newXmmVar() methods. The @c newXXX() //! methods accept also parameter describing the variable type. For example //! the @c newGpVar() method always creates variable which size matches the target //! architecture size (for 32-bit target the 32-bit variable is created, for //! 64-bit target the variable size is 64-bit). To override this behavior the //! variable type must be specified. //! //! @code //! // Compiler and function declaration - void f(int*); //! X86Compiler c; //! c.newFunc(kX86FuncConvDefault, BuildFunction1()); //! //! // Get argument variable (it's pointer). //! GpVar a1(c.getGpArg(0)); //! //! // Create your variables. //! GpVar x1(c.newGpVar(kX86VarTypeGpd)); //! GpVar x2(c.newGpVar(kX86VarTypeGpd)); //! //! // Init your variables. //! c.mov(x1, 1); //! c.mov(x2, 2); //! //! // ... your code ... //! c.add(x1, x2); //! // ... your code ... //! //! // Store result to a given pointer in first argument //! c.mov(dword_ptr(a1), x1); //! //! // End of function body. //! c.endFunc(); //! //! // Make the function. //! typedef void (*MyFn)(int*); //! MyFn fn = asmjit_cast(c.make()); //! @endcode //! //! This code snipped needs to be explained. You can see that there are more //! variable types that can be used by @c Compiler. Most useful variables can //! be allocated using general purpose registers (@c GpVar), MMX registers //! (@c MmVar) or SSE registers (@c XmmVar). //! //! X86/X64 variable types: //! //! - @c kX86VarTypeGpd - 32-bit general purpose register (EAX, EBX, ...). //! - @c kX86VarTypeGpq - 64-bit general purpose register (RAX, RBX, ...). //! - @c kX86VarTypeGpz - 32-bit or 64-bit general purpose register, depends //! to target architecture. Mapped to @c kX86VarTypeGpd or @c kX86VarTypeGpq. //! //! - @c kX86VarTypeX87 - 80-bit floating point stack register st(0 to 7). //! - @c kX86VarTypeX87SS - 32-bit floating point stack register st(0 to 7). //! - @c kX86VarTypeX87SD - 64-bit floating point stack register st(0 to 7). //! //! - @c VARIALBE_TYPE_MM - 64-bit MMX register. //! //! - @c kX86VarTypeXmm - 128-bit SSE register. //! - @c kX86VarTypeXmmSS - 128-bit SSE register which contains //! scalar 32-bit single precision floating point. //! - @c kX86VarTypeXmmSD - 128-bit SSE register which contains //! scalar 64-bit double precision floating point. //! - @c kX86VarTypeXmmPS - 128-bit SSE register which contains //! 4 packed 32-bit single precision floating points. //! - @c kX86VarTypeXmmPD - 128-bit SSE register which contains //! 2 packed 64-bit double precision floating points. //! //! Unified variable types: //! //! - @c kX86VarTypeInt32 - 32-bit general purpose register. //! - @c kX86VarTypeInt64 - 64-bit general purpose register. //! - @c kX86VarTypeIntPtr - 32-bit or 64-bit general purpose register / pointer. //! //! - @c kX86VarTypeFloat - 32-bit single precision floating point. //! - @c kX86VarTypeDouble - 64-bit double precision floating point. //! //! Variable states: //! //! - @c kVarStateUnused - State that is assigned to newly created //! variables or to not used variables (dereferenced to zero). //! - @c kVarStateReg - State that means that variable is currently //! allocated in register. //! - @c kVarStateMem - State that means that variable is currently //! only in memory location. //! //! When you create new variable, initial state is always @c kVarStateUnused, //! allocating it to register or spilling to memory changes this state to //! @c kVarStateReg or @c kVarStateMem, respectively. //! During variable lifetime it's usual that its state is changed multiple //! times. To generate better code, you can control allocating and spilling //! by using up to four types of methods that allows it (see next list). //! //! Explicit variable allocating / spilling methods: //! //! - @c Compiler::alloc() - Explicit method to alloc variable into //! register. You can use this before loops or code blocks. //! //! - @c Compiler::spill() - Explicit method to spill variable. If variable //! is in register and you call this method, it's moved to its home memory //! location. If variable is not in register no operation is performed. //! //! - @c Compiler::unuse() - Unuse variable (you can use this to end the //! variable scope or sub-scope). //! //! Please see AsmJit tutorials (testcompiler.cpp and testvariables.cpp) for //! more complete examples. //! //! @section AsmJit_Compiler_MemoryManagement Memory Management //! //! @c Compiler Memory management follows these rules: //! - Everything created by @c Compiler is always freed by @c Compiler. //! - To get decent performance, compiler always uses larger memory buffer //! for objects to allocate and when compiler instance is destroyed, this //! buffer is freed. Destructors of active objects are called when //! destroying compiler instance. Destructors of abadonded compiler //! objects are called immediately after abadonding them. //! - This type of memory management is called 'zone memory management'. //! //! This means that you can't use any @c Compiler object after destructing it, //! it also means that each object like @c Label, @c Var and others are created //! and managed by @c Compiler itself. These objects contain ID which is used //! internally by Compiler to store additional information about these objects. //! //! @section AsmJit_Compiler_StateManagement Control-Flow and State Management. //! //! The @c Compiler automatically manages state of the variables when using //! control flow instructions like jumps, conditional jumps and calls. There //! is minimal heuristics for choosing the method how state is saved or restored. //! //! Generally the state can be changed only when using jump or conditional jump //! instruction. When using non-conditional jump then state change is embedded //! into the instruction stream before the jump. When using conditional jump //! the @c Compiler decides whether to restore state before the jump or whether //! to use another block where state is restored. The last case is that no-code //! have to be emitted and there is no state change (this is of course ideal). //! //! Choosing whether to embed 'restore-state' section before conditional jump //! is quite simple. If jump is likely to be 'taken' then code is embedded, if //! jump is unlikely to be taken then the small code section for state-switch //! will be generated instead. //! //! Next example is the situation where the extended code block is used to //! do state-change: //! //! @code //! X86Compiler c; //! //! c.newFunc(kX86FuncConvDefault, FuncBuilder0()); //! c.getFunc()->setHint(kFuncHintNaked, true); //! //! // Labels. //! Label L0 = c.newLabel(); //! //! // Variables. //! GpVar var0 = c.newGpVar(); //! GpVar var1 = c.newGpVar(); //! //! // Cleanup. After these two lines, the var0 and var1 will be always stored //! // in registers. Our example is very small, but in larger code the var0 can //! // be spilled by xor(var1, var1). //! c.xor_(var0, var0); //! c.xor_(var1, var1); //! c.cmp(var0, var1); //! // State: //! // var0 - register. //! // var1 - register. //! //! // We manually spill these variables. //! c.spill(var0); //! c.spill(var1); //! // State: //! // var0 - memory. //! // var1 - memory. //! //! // Conditional jump to L0. It will be always taken, but compiler thinks that //! // it is unlikely taken so it will embed state change code somewhere. //! c.je(L0); //! //! // Do something. The variables var0 and var1 will be allocated again. //! c.add(var0, 1); //! c.add(var1, 2); //! // State: //! // var0 - register. //! // var1 - register. //! //! // Bind label here, the state is not changed. //! c.bind(L0); //! // State: //! // var0 - register. //! // var1 - register. //! //! // We need to use var0 and var1, because if compiler detects that variables //! // are out of scope then it optimizes the state-change. //! c.sub(var0, var1); //! // State: //! // var0 - register. //! // var1 - register. //! //! c.endFunc(); //! @endcode //! //! The output: //! //! @verbatim //! xor eax, eax ; xor var_0, var_0 //! xor ecx, ecx ; xor var_1, var_1 //! cmp eax, ecx ; cmp var_0, var_1 //! mov [esp - 24], eax ; spill var_0 //! mov [esp - 28], ecx ; spill var_1 //! je L0_Switch //! mov eax, [esp - 24] ; alloc var_0 //! add eax, 1 ; add var_0, 1 //! mov ecx, [esp - 28] ; alloc var_1 //! add ecx, 2 ; add var_1, 2 //! L0: //! sub eax, ecx ; sub var_0, var_1 //! ret //! //! ; state-switch begin //! L0_Switch0: //! mov eax, [esp - 24] ; alloc var_0 //! mov ecx, [esp - 28] ; alloc var_1 //! jmp short L0 //! ; state-switch end //! @endverbatim //! //! You can see that the state-switch section was generated (see L0_Switch0). //! The compiler is unable to restore state immediately when emitting the //! forward jump (the code is generated from first to last instruction and //! the target state is simply not known at this time). //! //! To tell @c Compiler that you want to embed state-switch code before jump //! it's needed to create backward jump (where also processor expects that it //! will be taken). To demonstrate the possibility to embed state-switch before //! jump we use slightly modified code: //! //! @code //! X86Compiler c; //! //! c.newFunc(kX86FuncConvDefault, FuncBuilder0()); //! c.getFunc()->setHint(kFuncHintNaked, true); //! //! // Labels. //! Label L0 = c.newLabel(); //! //! // Variables. //! GpVar var0 = c.newGpVar(); //! GpVar var1 = c.newGpVar(); //! //! // Cleanup. After these two lines, the var0 and var1 will be always stored //! // in registers. Our example is very small, but in larger code the var0 can //! // be spilled by xor(var1, var1). //! c.xor_(var0, var0); //! c.xor_(var1, var1); //! // State: //! // var0 - register. //! // var1 - register. //! //! // We manually spill these variables. //! c.spill(var0); //! c.spill(var1); //! // State: //! // var0 - memory. //! // var1 - memory. //! //! // Bind our label here. //! c.bind(L0); //! //! // Do something, the variables will be allocated again. //! c.add(var0, 1); //! c.add(var1, 2); //! // State: //! // var0 - register. //! // var1 - register. //! //! // Backward conditional jump to L0. The default behavior is that it is taken //! // so state-change code will be embedded here. //! c.je(L0); //! //! c.endFunc(); //! @endcode //! //! The output: //! //! @verbatim //! xor ecx, ecx ; xor var_0, var_0 //! xor edx, edx ; xor var_1, var_1 //! mov [esp - 24], ecx ; spill var_0 //! mov [esp - 28], edx ; spill var_1 //! L.2: //! mov ecx, [esp - 24] ; alloc var_0 //! add ecx, 1 ; add var_0, 1 //! mov edx, [esp - 28] ; alloc var_1 //! add edx, 2 ; add var_1, 2 //! //! ; state-switch begin //! mov [esp - 24], ecx ; spill var_0 //! mov [esp - 28], edx ; spill var_1 //! ; state-switch end //! //! je short L.2 //! ret //! @endverbatim //! //! Please notice where the state-switch section is located. The @c Compiler //! decided that jump is likely to be taken so the state change is embedded //! before the conditional jump. To change this behavior into the previous //! case it's needed to add a hint (@c kCondHintLikely or @c kCondHintUnlikely). //! //! Replacing the c.je(L0) by c.je(L0, kCondHintUnlikely) //! will generate code like this: //! //! @verbatim //! xor ecx, ecx ; xor var_0, var_0 //! xor edx, edx ; xor var_1, var_1 //! mov [esp - 24], ecx ; spill var_0 //! mov [esp - 28], edx ; spill var_1 //! L0: //! mov ecx, [esp - 24] ; alloc var_0 //! add ecx, 1 ; add var_0, a //! mov edx, [esp - 28] ; alloc var_1 //! add edx, 2 ; add var_1, 2 //! je L0_Switch, 2 //! ret //! //! ; state-switch begin //! L0_Switch: //! mov [esp - 24], ecx ; spill var_0 //! mov [esp - 28], edx ; spill var_1 //! jmp short L0 //! ; state-switch end //! @endverbatim //! //! This section provided information about how state-change works. The //! behavior is deterministic and it can be overridden. //! //! @section AsmJit_Compiler_AdvancedCodeGeneration Advanced Code Generation //! //! This section describes advanced method of code generation available to //! @c Compiler (but also to @c Assembler). When emitting code to instruction //! stream the methods like @c mov(), @c add(), @c sub() can be called directly //! (advantage is static-type control performed also by C++ compiler) or //! indirectly using @c emit() method. The @c emit() method needs only //! instruction code and operands. //! //! Example of code generating by standard type-safe API: //! //! @code //! X86Compiler c; //! GpVar var0 = c.newGpVar(); //! GpVar var1 = c.newGpVar(); //! //! ... //! //! c.mov(var0, imm(0)); //! c.add(var0, var1); //! c.sub(var0, var1); //! @endcode //! //! The code above can be rewritten as: //! //! @code //! X86Compiler c; //! GpVar var0 = c.newGpVar(); //! GpVar var1 = c.newGpVar(); //! //! ... //! //! c.emit(kX86InstMov, var0, imm(0)); //! c.emit(kX86InstAdd, var0, var1); //! c.emit(kX86InstSub, var0, var1); //! @endcode //! //! The advantage of first snippet is very friendly API and type-safe control //! that is controlled by the C++ compiler. The advantage of second snippet is //! availability to replace or generate instruction code in different places. //! See the next example how the @c emit() method can be used to generate //! abstract code. //! //! Use case: //! //! @code //! bool emitArithmetic(Compiler& c, XmmVar& var0, XmmVar& var1, const char* op) //! { //! uint code = kInstNone; //! //! if (strcmp(op, "ADD") == 0) //! code = kX86InstAddSS; //! else if (strcmp(op, "SUBTRACT") == 0) //! code = kX86InstSubSS; //! else if (strcmp(op, "MULTIPLY") == 0) //! code = kX86InstMulSS; //! else if (strcmp(op, "DIVIDE") == 0) //! code = kX86InstDivSS; //! else //! // Invalid parameter? //! return false; //! //! c.emit(code, var0, var1); //! } //! @endcode //! //! Other use cases are waiting for you! Be sure that instruction you are //! emitting is correct and encodable, because if not, Assembler will set //! error code to @c kErrorUnknownInstruction. //! //! @section AsmJit_Compiler_CompilerDetails Compiler Details //! //! This section is here for people interested in the compiling process. There //! are few steps that must be done for each compiled function (or your code). //! //! When your @c Compiler instance is ready, you can create function and add //! compiler-items using intrinsics or higher level methods implemented by the //! @c AsmJit::Compiler. When you are done (all instructions serialized) you //! should call @c AsmJit::Compiler::make() method which will analyze your code, //! allocate registers and memory for local variables and serialize all items //! to @c AsmJit::Assembler instance. Next steps shows what's done internally //! before code is serialized into @c AsmJit::Assembler //! (implemented in @c AsmJit::Compiler::serialize() method). //! //! 1. Compiler try to match function and end-function items (these items //! define function body and blocks). //! //! 2. For all items inside the function-body the virtual functions //! are called in this order: //! - CompilerItem::prepare() //! - CompilerItem::translate() //! - CompilerItem::emit() //! - CompilerItem::post() //! //! There is some extra work when emitting function prolog / epilog and //! register allocator. //! //! 3. Emit jump tables data. //! //! When everything here ends, @c AsmJit::Assembler contains binary stream //! that needs only relocation to be callable by C/C++ code. //! //! @section AsmJit_Compiler_Differences Summary of Differences between @c Assembler and @c Compiler //! //! - Instructions are not translated to machine code immediately, they are //! stored as emmitables, see @c AsmJit::CompilerItem. //! - Contains function builder and ability to call other functions. //! - Contains register allocator and variable management. //! - Contains a lot of helper methods to simplify the code generation not //! available/possible in @c AsmJit::Assembler. //! - Ability to pre-process or post-process the code which is being generated. struct X86Compiler : public Compiler { // Special X86 instructions: // - cpuid, // - cbw, cwd, cwde, cdq, cdqe, cqo // - cmpxchg // - cmpxchg8b, cmpxchg16b, // - daa, das, // - imul, mul, idiv, div, // - mov_ptr // - lahf, sahf // - maskmovq, maskmovdqu // - enter, leave // - ret // - monitor, mwait // - pop, popad, popfd, popfq, // - push, pushad, pushfd, pushfq // - rcl, rcr, rol, ror, sal, sar, shl, shr // - shld, shrd // - rdtsc. rdtscp // - lodsb, lodsd, lodsq, lodsw // - movsb, movsd, movsq, movsw // - stosb, stosd, stosq, stosw // - cmpsb, cmpsd, cmpsq, cmpsw // - scasb, scasd, scasq, scasw // // Special X87 instructions: // - fisttp // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a @ref X86Compiler instance. ASMJIT_API X86Compiler(Context* context = JitContext::getGlobal()); //! @brief Destroy the @ref X86Compiler instance. ASMJIT_API ~X86Compiler(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get current function as @ref X86CompilerFuncDecl. //! //! This method can be called within @c newFunc() and @c endFunc() //! block to get current function you are working with. It's recommended //! to store @c AsmJit::Function pointer returned by @c newFunc<> method, //! because this allows you in future implement function sections outside of //! function itself (yeah, this is possible!). inline X86CompilerFuncDecl* getFunc() const { return reinterpret_cast(_func); } // -------------------------------------------------------------------------- // [Function Builder] // -------------------------------------------------------------------------- //! @brief Create a new function. //! //! @param cconv Calling convention to use (see @c kX86FuncConv enum) //! @param params Function arguments prototype. //! //! This method is usually used as a first step when generating functions //! by @c Compiler. First parameter @a cconv specifies function calling //! convention to use. Second parameter @a params specifies function //! arguments. To create function arguments are used templates //! @c BuildFunction0<>, @c BuildFunction1<...>, @c BuildFunction2<...>, //! etc... //! //! Templates with BuildFunction prefix are used to generate argument IDs //! based on real C++ types. See next example how to generate function with //! two 32-bit integer arguments. //! //! @code //! // Building function using AsmJit::Compiler example. //! //! // Compiler instance //! X86Compiler c; //! //! // Begin of function (also emits function @c Prolog) //! c.newFunc( //! // Default calling convention (32-bit cdecl or 64-bit for host OS) //! kX86FuncConvDefault, //! // Using function builder to generate arguments list //! BuildFunction2()); //! //! // End of function (also emits function @c Epilog) //! c.endFunc(); //! @endcode //! //! You can see that building functions is really easy. Previous code snipped //! will generate code for function with two 32-bit integer arguments. You //! can access arguments by @c AsmJit::Function::argument() method. Arguments //! are indexed from 0 (like everything in C). //! //! @code //! // Accessing function arguments through AsmJit::Function example. //! //! // Compiler instance //! X86Compiler c; //! //! // Begin of function (also emits function @c Prolog) //! c.newFunc( //! // Default calling convention (32-bit cdecl or 64-bit for host OS) //! kX86FuncConvDefault, //! // Using function builder to generate arguments list //! BuildFunction2()); //! //! // Arguments are like other variables, you need to reference them by //! // variable operands: //! GpVar a0 = c.getGpArg(0); //! GpVar a1 = c.getGpArg(1); //! //! // Use them. //! c.add(a0, a1); //! //! // End of function (emits function epilog and return) //! c.endFunc(); //! @endcode //! //! Arguments are like variables. How to manipulate with variables is //! documented in @c AsmJit::Compiler, variables section. //! //! @note To get current function use @c currentFunction() method or save //! pointer to @c AsmJit::Function returned by @c AsmJit::Compiler::newFunc<> //! method. Recommended is to save the pointer. //! //! @sa @c BuildFunction0, @c BuildFunction1, @c BuildFunction2, ... inline X86CompilerFuncDecl* newFunc(uint32_t convention, const FuncPrototype& func) { return newFunc_(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); } //! @brief Create a new function (low level version). //! //! @param cconv Function calling convention (see @c AsmJit::kX86FuncConv). //! @param args Function arguments (see @c AsmJit::kX86VarType). //! @param count Arguments count. //! //! This method is internally called from @c newFunc() method and //! contains arguments thats used internally by @c AsmJit::Compiler. //! //! @note To get current function use @c currentFunction() method. ASMJIT_API X86CompilerFuncDecl* newFunc_(uint32_t convenion, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount); //! @brief End of current function scope and all variables. ASMJIT_API X86CompilerFuncDecl* endFunc(); // -------------------------------------------------------------------------- // [Emit] // -------------------------------------------------------------------------- //! @brief Emit instruction with no operand. ASMJIT_API void _emitInstruction(uint32_t code); //! @brief Emit instruction with one operand. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0); //! @brief Emit instruction with two operands. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1); //! @brief Emit instruction with three operands. ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2); //! @brief Emit instruction with four operands (Special instructions). ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3); //! @brief Emit instruction with five operands (Special instructions). ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3, const Operand* o4); //! @brief Private method for emitting jcc. ASMJIT_API void _emitJcc(uint32_t code, const Label* label, uint32_t hint); //! @brief Private method for emitting function call. ASMJIT_API X86CompilerFuncCall* _emitCall(const Operand* o0); //! @brief Private method for returning a value from the function. ASMJIT_API void _emitReturn(const Operand* first, const Operand* second); // -------------------------------------------------------------------------- // [Align] // -------------------------------------------------------------------------- //! @brief Align target buffer to @a m bytes. //! //! Typical usage of this is to align labels at start of the inner loops. //! //! Inserts @c nop() instructions or CPU optimized NOPs. ASMJIT_API void align(uint32_t m); // -------------------------------------------------------------------------- // [Label] // -------------------------------------------------------------------------- //! @brief Create and return new label. ASMJIT_API Label newLabel(); //! @brief Bind label to the current offset. //! //! @note Label can be bound only once! ASMJIT_API void bind(const Label& label); // -------------------------------------------------------------------------- // [Variables] // -------------------------------------------------------------------------- //! @brief Get compiler variable at @a id. inline X86CompilerVar* _getVar(uint32_t id) const { ASMJIT_ASSERT(id != kInvalidValue); return reinterpret_cast(_vars[id & kOperandIdValueMask]); } //! @internal //! //! @brief Create a new variable data. ASMJIT_API X86CompilerVar* _newVar(const char* name, uint32_t type, uint32_t size); //! @brief Create a new general-purpose variable. ASMJIT_API GpVar newGpVar(uint32_t varType = kX86VarTypeGpz, const char* name = NULL); //! @brief Get argument as general-purpose variable. ASMJIT_API GpVar getGpArg(uint32_t argIndex); //! @brief Create a new MM variable. ASMJIT_API MmVar newMmVar(uint32_t varType = kX86VarTypeMm, const char* name = NULL); //! @brief Get argument as MM variable. ASMJIT_API MmVar getMmArg(uint32_t argIndex); //! @brief Create a new XMM variable. ASMJIT_API XmmVar newXmmVar(uint32_t varType = kX86VarTypeXmm, const char* name = NULL); //! @brief Get argument as XMM variable. ASMJIT_API XmmVar getXmmArg(uint32_t argIndex); //! @internal //! //! @brief Serialize variable hint. ASMJIT_API void _vhint(Var& var, uint32_t hintId, uint32_t hintValue); //! @brief Alloc variable @a var. ASMJIT_API void alloc(Var& var); //! @brief Alloc variable @a var using @a regIndex as a register index. ASMJIT_API void alloc(Var& var, uint32_t regIndex); //! @brief Alloc variable @a var using @a reg as a demanded register. ASMJIT_API void alloc(Var& var, const Reg& reg); //! @brief Spill variable @a var. ASMJIT_API void spill(Var& var); //! @brief Save variable @a var if modified. ASMJIT_API void save(Var& var); //! @brief Unuse variable @a var. ASMJIT_API void unuse(Var& var); //! @brief Get memory home of variable @a var. ASMJIT_API void getMemoryHome(Var& var, GpVar* home, int* displacement = NULL); //! @brief Set memory home of variable @a var. //! //! Default memory home location is on stack (ESP/RSP), but when needed the //! bebahior can be changed by this method. //! //! It is an error to chaining memory home locations. For example the given //! code is invalid: //! //! @code //! X86Compiler c; //! //! ... //! GpVar v0 = c.newGpVar(); //! GpVar v1 = c.newGpVar(); //! GpVar v2 = c.newGpVar(); //! GpVar v3 = c.newGpVar(); //! //! c.setMemoryHome(v1, v0, 0); // Allowed, [v0] is memory home for v1. //! c.setMemoryHome(v2, v0, 4); // Allowed, [v0+4] is memory home for v2. //! c.setMemoryHome(v3, v2); // CHAINING, NOT ALLOWED! //! @endcode ASMJIT_API void setMemoryHome(Var& var, const GpVar& home, int displacement = 0); //! @brief Get priority of variable @a var. ASMJIT_API uint32_t getPriority(Var& var) const; //! @brief Set priority of variable @a var to @a priority. ASMJIT_API void setPriority(Var& var, uint32_t priority); //! @brief Get save-on-unuse @a var property. ASMJIT_API bool getSaveOnUnuse(Var& var) const; //! @brief Set save-on-unuse @a var property to @a value. ASMJIT_API void setSaveOnUnuse(Var& var, bool value); //! @brief Rename variable @a var to @a name. //! //! @note Only new name will appear in the logger. ASMJIT_API void rename(Var& var, const char* name); // -------------------------------------------------------------------------- // [State] // -------------------------------------------------------------------------- //! @internal //! //! @brief Create a new @ref X86CompilerState. ASMJIT_API X86CompilerState* _newState(uint32_t memVarsCount); // -------------------------------------------------------------------------- // [Make] // -------------------------------------------------------------------------- //! @brief Make is convenience method to make currently serialized code and //! return pointer to generated function. //! //! What you need is only to cast this pointer to your function type and call //! it. Note that if there was an error and calling @c getError() method doesn't //! return @c kErrorOk (zero) then this function always returns @c NULL and //! error value remains the same. ASMJIT_API virtual void* make(); //! @brief Method that will emit everything to @c Assembler instance @a a. ASMJIT_API virtual void serialize(Assembler& a); // -------------------------------------------------------------------------- // [Data] // -------------------------------------------------------------------------- //! @brief Get target from label @a id. inline X86CompilerTarget* _getTarget(uint32_t id) { ASMJIT_ASSERT((id & kOperandIdTypeMask) == kOperandIdTypeLabel); return reinterpret_cast(_targets[id & kOperandIdValueMask]); } // -------------------------------------------------------------------------- // [Embed] // -------------------------------------------------------------------------- //! @brief Add 8-bit integer data to the instuction stream. inline void db(uint8_t x) { embed(&x, 1); } //! @brief Add 16-bit integer data to the instuction stream. inline void dw(uint16_t x) { embed(&x, 2); } //! @brief Add 32-bit integer data to the instuction stream. inline void dd(uint32_t x) { embed(&x, 4); } //! @brief Add 64-bit integer data to the instuction stream. inline void dq(uint64_t x) { embed(&x, 8); } //! @brief Add 8-bit integer data to the instuction stream. inline void dint8(int8_t x) { embed(&x, sizeof(int8_t)); } //! @brief Add 8-bit integer data to the instuction stream. inline void duint8(uint8_t x) { embed(&x, sizeof(uint8_t)); } //! @brief Add 16-bit integer data to the instuction stream. inline void dint16(int16_t x) { embed(&x, sizeof(int16_t)); } //! @brief Add 16-bit integer data to the instuction stream. inline void duint16(uint16_t x) { embed(&x, sizeof(uint16_t)); } //! @brief Add 32-bit integer data to the instuction stream. inline void dint32(int32_t x) { embed(&x, sizeof(int32_t)); } //! @brief Add 32-bit integer data to the instuction stream. inline void duint32(uint32_t x) { embed(&x, sizeof(uint32_t)); } //! @brief Add 64-bit integer data to the instuction stream. inline void dint64(int64_t x) { embed(&x, sizeof(int64_t)); } //! @brief Add 64-bit integer data to the instuction stream. inline void duint64(uint64_t x) { embed(&x, sizeof(uint64_t)); } //! @brief Add system-integer data to the instuction stream. inline void dintptr(intptr_t x) { embed(&x, sizeof(intptr_t)); } //! @brief Add system-integer data to the instuction stream. inline void duintptr(uintptr_t x) { embed(&x, sizeof(uintptr_t)); } //! @brief Add float data to the instuction stream. inline void dfloat(float x) { embed(&x, sizeof(float)); } //! @brief Add double data to the instuction stream. inline void ddouble(double x) { embed(&x, sizeof(double)); } //! @brief Add pointer data to the instuction stream. inline void dptr(void* x) { embed(&x, sizeof(void*)); } //! @brief Add MM data to the instuction stream. inline void dmm(const MmData& x) { embed(&x, sizeof(MmData)); } //! @brief Add XMM data to the instuction stream. inline void dxmm(const XmmData& x) { embed(&x, sizeof(XmmData)); } //! @brief Add data to the instuction stream. inline void data(const void* data, size_t size) { embed(data, size); } //! @brief Add data in a given structure instance to the instuction stream. template inline void dstruct(const T& x) { embed(&x, sizeof(T)); } // -------------------------------------------------------------------------- // [Custom Instructions] // -------------------------------------------------------------------------- // These emitters are used by custom compiler code (register alloc / spill, // prolog / epilog generator, ...). inline void emit(uint32_t code) { _emitInstruction(code); } inline void emit(uint32_t code, const Operand& o0) { _emitInstruction(code, &o0); } inline void emit(uint32_t code, const Operand& o0, const Operand& o1) { _emitInstruction(code, &o0, &o1); } inline void emit(uint32_t code, const Operand& o0, const Operand& o1, const Operand& o2) { _emitInstruction(code, &o0, &o1, &o2); } // -------------------------------------------------------------------------- // [X86 Instructions] // -------------------------------------------------------------------------- //! @brief Add with Carry. inline void adc(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add with Carry. inline void adc(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAdc, &dst, &src); } //! @brief Add. inline void add(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Add. inline void add(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAdd, &dst, &src); } //! @brief Logical And. inline void and_(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Logical And. inline void and_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstAnd, &dst, &src); } //! @brief Bit Scan Forward. inline void bsf(const GpVar& dst, const GpVar& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsf, &dst, &src); } //! @brief Bit Scan Forward. inline void bsf(const GpVar& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsf, &dst, &src); } //! @brief Bit Scan Reverse. inline void bsr(const GpVar& dst, const GpVar& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsr, &dst, &src); } //! @brief Bit Scan Reverse. inline void bsr(const GpVar& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstBsr, &dst, &src); } //! @brief Byte swap (32-bit or 64-bit registers only) (i486). inline void bswap(const GpVar& dst) { // ASMJIT_ASSERT(dst.getRegType() == kX86RegGPD || dst.getRegType() == kX86RegGPQ); _emitInstruction(kX86InstBSwap, &dst); } //! @brief Bit test. inline void bt(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test. inline void bt(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBt, &dst, &src); } //! @brief Bit test and complement. inline void btc(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and complement. inline void btc(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBtc, &dst, &src); } //! @brief Bit test and reset. inline void btr(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and reset. inline void btr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBtr, &dst, &src); } //! @brief Bit test and set. inline void bts(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Bit test and set. inline void bts(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstBts, &dst, &src); } //! @brief Call Procedure. inline X86CompilerFuncCall* call(const GpVar& dst) { return _emitCall(&dst); } //! @brief Call Procedure. inline X86CompilerFuncCall* call(const Mem& dst) { return _emitCall(&dst); } //! @brief Call Procedure. inline X86CompilerFuncCall* call(const Imm& dst) { return _emitCall(&dst); } //! @brief Call Procedure. //! @overload inline X86CompilerFuncCall* call(void* dst) { Imm imm((sysint_t)dst); return _emitCall(&imm); } //! @brief Call Procedure. inline X86CompilerFuncCall* call(const Label& label) { return _emitCall(&label); } //! @brief Convert Byte to Word (Sign Extend). inline void cbw(const GpVar& dst) { _emitInstruction(kX86InstCbw, &dst); } //! @brief Convert Word to DWord (Sign Extend). inline void cwd(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCwd, &dst, &src); } //! @brief Convert Word to DWord (Sign Extend). inline void cwde(const GpVar& dst) { _emitInstruction(kX86InstCwde, &dst); } //! @brief Convert Word to DWord (Sign Extend). inline void cdq(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCdq, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Convert DWord to QWord (Sign Extend). inline void cdqe(const GpVar& dst) { _emitInstruction(kX86InstCdqe, &dst); } #endif // ASMJIT_X64 #if defined(ASMJIT_X64) //! @brief Convert QWord to DQWord (Sign Extend). inline void cqo(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCqo, &dst, &src); } #endif // ASMJIT_X64 //! @brief Clear Carry flag //! //! This instruction clears the CF flag in the EFLAGS register. inline void clc() { _emitInstruction(kX86InstClc); } //! @brief Clear Direction flag //! //! This instruction clears the DF flag in the EFLAGS register. inline void cld() { _emitInstruction(kX86InstCld); } //! @brief Complement Carry Flag. //! //! This instruction complements the CF flag in the EFLAGS register. //! (CF = NOT CF) inline void cmc() { _emitInstruction(kX86InstCmc); } //! @brief Conditional Move. inline void cmov(kX86Cond cc, const GpVar& dst, const GpVar& src) { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); } //! @brief Conditional Move. inline void cmov(kX86Cond cc, const GpVar& dst, const Mem& src) { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); } //! @brief Conditional Move. inline void cmova (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovA , &dst, &src); } //! @brief Conditional Move. inline void cmova (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovA , &dst, &src); } //! @brief Conditional Move. inline void cmovae (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); } //! @brief Conditional Move. inline void cmovae (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); } //! @brief Conditional Move. inline void cmovb (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovB , &dst, &src); } //! @brief Conditional Move. inline void cmovb (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovB , &dst, &src); } //! @brief Conditional Move. inline void cmovbe (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); } //! @brief Conditional Move. inline void cmovbe (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); } //! @brief Conditional Move. inline void cmovc (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovC , &dst, &src); } //! @brief Conditional Move. inline void cmovc (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovC , &dst, &src); } //! @brief Conditional Move. inline void cmove (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovE , &dst, &src); } //! @brief Conditional Move. inline void cmove (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovE , &dst, &src); } //! @brief Conditional Move. inline void cmovg (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovG , &dst, &src); } //! @brief Conditional Move. inline void cmovg (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovG , &dst, &src); } //! @brief Conditional Move. inline void cmovge (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); } //! @brief Conditional Move. inline void cmovge (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); } //! @brief Conditional Move. inline void cmovl (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovL , &dst, &src); } //! @brief Conditional Move. inline void cmovl (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovL , &dst, &src); } //! @brief Conditional Move. inline void cmovle (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); } //! @brief Conditional Move. inline void cmovle (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); } //! @brief Conditional Move. inline void cmovna (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); } //! @brief Conditional Move. inline void cmovna (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); } //! @brief Conditional Move. inline void cmovnae(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); } //! @brief Conditional Move. inline void cmovnae(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); } //! @brief Conditional Move. inline void cmovnb (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); } //! @brief Conditional Move. inline void cmovnb (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); } //! @brief Conditional Move. inline void cmovnbe(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); } //! @brief Conditional Move. inline void cmovnbe(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); } //! @brief Conditional Move. inline void cmovnc (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); } //! @brief Conditional Move. inline void cmovnc (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); } //! @brief Conditional Move. inline void cmovne (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); } //! @brief Conditional Move. inline void cmovne (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); } //! @brief Conditional Move. inline void cmovng (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); } //! @brief Conditional Move. inline void cmovng (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); } //! @brief Conditional Move. inline void cmovnge(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); } //! @brief Conditional Move. inline void cmovnge(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); } //! @brief Conditional Move. inline void cmovnl (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); } //! @brief Conditional Move. inline void cmovnl (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); } //! @brief Conditional Move. inline void cmovnle(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); } //! @brief Conditional Move. inline void cmovnle(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); } //! @brief Conditional Move. inline void cmovno (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); } //! @brief Conditional Move. inline void cmovno (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); } //! @brief Conditional Move. inline void cmovnp (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); } //! @brief Conditional Move. inline void cmovnp (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); } //! @brief Conditional Move. inline void cmovns (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); } //! @brief Conditional Move. inline void cmovns (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); } //! @brief Conditional Move. inline void cmovnz (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); } //! @brief Conditional Move. inline void cmovnz (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); } //! @brief Conditional Move. inline void cmovo (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovO , &dst, &src); } //! @brief Conditional Move. inline void cmovo (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovO , &dst, &src); } //! @brief Conditional Move. inline void cmovp (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovP , &dst, &src); } //! @brief Conditional Move. inline void cmovp (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovP , &dst, &src); } //! @brief Conditional Move. inline void cmovpe (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); } //! @brief Conditional Move. inline void cmovpe (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); } //! @brief Conditional Move. inline void cmovpo (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); } //! @brief Conditional Move. inline void cmovpo (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); } //! @brief Conditional Move. inline void cmovs (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovS , &dst, &src); } //! @brief Conditional Move. inline void cmovs (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovS , &dst, &src); } //! @brief Conditional Move. inline void cmovz (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovZ , &dst, &src); } //! @brief Conditional Move. inline void cmovz (const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCMovZ , &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare Two Operands. inline void cmp(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstCmp, &dst, &src); } //! @brief Compare and Exchange (i486). inline void cmpxchg(const GpVar cmp_1_eax, const GpVar& cmp_2, const GpVar& src) { ASMJIT_ASSERT(cmp_1_eax.getId() != src.getId()); _emitInstruction(kX86InstCmpXCHG, &cmp_1_eax, &cmp_2, &src); } //! @brief Compare and Exchange (i486). inline void cmpxchg(const GpVar cmp_1_eax, const Mem& cmp_2, const GpVar& src) { ASMJIT_ASSERT(cmp_1_eax.getId() != src.getId()); _emitInstruction(kX86InstCmpXCHG, &cmp_1_eax, &cmp_2, &src); } //! @brief Compares the 64-bit value in EDX:EAX with the memory operand (Pentium). //! //! If the values are equal, then this instruction stores the 64-bit value //! in ECX:EBX into the memory operand and sets the zero flag. Otherwise, //! this instruction copies the 64-bit memory operand into the EDX:EAX //! registers and clears the zero flag. inline void cmpxchg8b( const GpVar& cmp_edx, const GpVar& cmp_eax, const GpVar& cmp_ecx, const GpVar& cmp_ebx, const Mem& dst) { ASMJIT_ASSERT(cmp_edx.getId() != cmp_eax.getId() && cmp_eax.getId() != cmp_ecx.getId() && cmp_ecx.getId() != cmp_ebx.getId()); _emitInstruction(kX86InstCmpXCHG8B, &cmp_edx, &cmp_eax, &cmp_ecx, &cmp_ebx, &dst); } #if defined(ASMJIT_X64) //! @brief Compares the 128-bit value in RDX:RAX with the memory operand (X64). //! //! If the values are equal, then this instruction stores the 128-bit value //! in RCX:RBX into the memory operand and sets the zero flag. Otherwise, //! this instruction copies the 128-bit memory operand into the RDX:RAX //! registers and clears the zero flag. inline void cmpxchg16b( const GpVar& cmp_edx, const GpVar& cmp_eax, const GpVar& cmp_ecx, const GpVar& cmp_ebx, const Mem& dst) { ASMJIT_ASSERT(cmp_edx.getId() != cmp_eax.getId() && cmp_eax.getId() != cmp_ecx.getId() && cmp_ecx.getId() != cmp_ebx.getId()); _emitInstruction(kX86InstCmpXCHG16B, &cmp_edx, &cmp_eax, &cmp_ecx, &cmp_ebx, &dst); } #endif // ASMJIT_X64 //! @brief CPU Identification (i486). inline void cpuid( const GpVar& inout_eax, const GpVar& out_ebx, const GpVar& out_ecx, const GpVar& out_edx) { // Destination variables must be different. ASMJIT_ASSERT(inout_eax.getId() != out_ebx.getId() && out_ebx.getId() != out_ecx.getId() && out_ecx.getId() != out_edx.getId()); _emitInstruction(kX86InstCpuId, &inout_eax, &out_ebx, &out_ecx, &out_edx); } #if defined(ASMJIT_X86) inline void daa(const GpVar& dst) { _emitInstruction(kX86InstDaa, &dst); } #endif // ASMJIT_X86 #if defined(ASMJIT_X86) inline void das(const GpVar& dst) { _emitInstruction(kX86InstDas, &dst); } #endif // ASMJIT_X86 //! @brief Decrement by 1. //! @note This instruction can be slower than sub(dst, 1) inline void dec(const GpVar& dst) { _emitInstruction(kX86InstDec, &dst); } //! @brief Decrement by 1. //! @note This instruction can be slower than sub(dst, 1) inline void dec(const Mem& dst) { _emitInstruction(kX86InstDec, &dst); } //! @brief Unsigned divide. //! //! This instruction divides (unsigned) the value in the AL, AX, or EAX //! register by the source operand and stores the result in the AX, //! DX:AX, or EDX:EAX registers. inline void div(const GpVar& dst_rem, const GpVar& dst_quot, const GpVar& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId()); _emitInstruction(kX86InstDiv, &dst_rem, &dst_quot, &src); } //! @brief Unsigned divide. //! @overload inline void div(const GpVar& dst_rem, const GpVar& dst_quot, const Mem& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId()); _emitInstruction(kX86InstDiv, &dst_rem, &dst_quot, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Make Stack Frame for Procedure Parameters. inline void enter(const Imm& imm16, const Imm& imm8) { _emitInstruction(kX86InstEnter, &imm16, &imm8); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Signed divide. //! //! This instruction divides (signed) the value in the AL, AX, or EAX //! register by the source operand and stores the result in the AX, //! DX:AX, or EDX:EAX registers. inline void idiv(const GpVar& dst_rem, const GpVar& dst_quot, const GpVar& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId()); _emitInstruction(kX86InstIDiv, &dst_rem, &dst_quot, &src); } //! @brief Signed divide. //! @overload inline void idiv(const GpVar& dst_rem, const GpVar& dst_quot, const Mem& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId()); _emitInstruction(kX86InstIDiv, &dst_rem, &dst_quot, &src); } //! @brief Signed multiply. //! //! [dst_lo:dst_hi] = dst_hi * src. inline void imul(const GpVar& dst_hi, const GpVar& dst_lo, const GpVar& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId()); _emitInstruction(kX86InstIMul, &dst_hi, &dst_lo, &src); } //! @overload inline void imul(const GpVar& dst_hi, const GpVar& dst_lo, const Mem& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId()); _emitInstruction(kX86InstIMul, &dst_hi, &dst_lo, &src); } //! @brief Signed multiply. //! //! Destination operand (the first operand) is multiplied by the source //! operand (second operand). The destination operand is a general-purpose //! register and the source operand is an immediate value, a general-purpose //! register, or a memory location. The product is then stored in the //! destination operand location. inline void imul(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! @overload inline void imul(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! @overload inline void imul(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstIMul, &dst, &src); } //! @brief Signed multiply. //! //! source operand (which can be a general-purpose register or a memory //! location) is multiplied by the second source operand (an immediate //! value). The product is then stored in the destination operand //! (a general-purpose register). inline void imul(const GpVar& dst, const GpVar& src, const Imm& imm) { _emitInstruction(kX86InstIMul, &dst, &src, &imm); } //! @overload inline void imul(const GpVar& dst, const Mem& src, const Imm& imm) { _emitInstruction(kX86InstIMul, &dst, &src, &imm); } //! @brief Increment by 1. //! @note This instruction can be slower than add(dst, 1) inline void inc(const GpVar& dst) { _emitInstruction(kX86InstInc, &dst); } //! @brief Increment by 1. //! @note This instruction can be slower than add(dst, 1) inline void inc(const Mem& dst) { _emitInstruction(kX86InstInc, &dst); } //! @brief Interrupt 3 - trap to debugger. inline void int3() { _emitInstruction(kX86InstInt3); } //! @brief Jump to label @a label if condition @a cc is met. //! //! This instruction checks the state of one or more of the status flags in //! the EFLAGS register (CF, OF, PF, SF, and ZF) and, if the flags are in the //! specified state (condition), performs a jump to the target instruction //! specified by the destination operand. A condition code (cc) is associated //! with each instruction to indicate the condition being tested for. If the //! condition is not satisfied, the jump is not performed and execution //! continues with the instruction following the Jcc instruction. inline void j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(X86Util::getJccInstFromCond(cc), &label, hint); } //! @brief Jump to label @a label if condition is met. inline void ja (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJA , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jae (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJAE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJB , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJBE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJC , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void je (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jg (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJG , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jge (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJGE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJL , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jle (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJLE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jna (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNA , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNAE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNB , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNBE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNC , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jne (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jng (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNG , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNGE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNL , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNLE, &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jno (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNP , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jns (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNS , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNZ , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJP , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPE , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPO , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void js (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJS , &label, hint); } //! @brief Jump to label @a label if condition is met. inline void jz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJZ , &label, hint); } //! @brief Jump. //! @overload inline void jmp(const GpVar& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(const Mem& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(const Imm& dst) { _emitInstruction(kX86InstJmp, &dst); } //! @brief Jump. //! @overload inline void jmp(void* dst) { Imm imm((sysint_t)dst); _emitInstruction(kX86InstJmp, &imm); } //! @brief Jump. //! //! This instruction transfers program control to a different point //! in the instruction stream without recording return information. //! The destination (target) operand specifies the label of the //! instruction being jumped to. inline void jmp(const Label& label) { _emitInstruction(kX86InstJmp, &label); } //! @brief Load Effective Address //! //! This instruction computes the effective address of the second //! operand (the source operand) and stores it in the first operand //! (destination operand). The source operand is a memory address //! (offset part) specified with one of the processors addressing modes. //! The destination operand is a general-purpose register. inline void lea(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstLea, &dst, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief High Level Procedure Exit. inline void leave() { _emitInstruction(kX86InstLeave); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Move. //! //! This instruction copies the second operand (source operand) to the first //! operand (destination operand). The source operand can be an immediate //! value, general-purpose register, segment register, or memory location. //! The destination register can be a general-purpose register, segment //! register, or memory location. Both operands must be the same size, which //! can be a byte, a word, or a DWORD. //! //! @note To move MMX or SSE registers to/from GP registers or memory, use //! corresponding functions: @c movd(), @c movq(), etc. Passing MMX or SSE //! registers to @c mov() is illegal. inline void mov(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move. //! @overload inline void mov(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move from segment register. //! @overload. inline void mov(const GpVar& dst, const SegmentReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move from segment register. //! @overload. inline void mov(const Mem& dst, const SegmentReg& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move to segment register. //! @overload. inline void mov(const SegmentReg& dst, const GpVar& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move to segment register. //! @overload. inline void mov(const SegmentReg& dst, const Mem& src) { _emitInstruction(kX86InstMov, &dst, &src); } //! @brief Move byte, word, dword or qword from absolute address @a src to //! AL, AX, EAX or RAX register. inline void mov_ptr(const GpVar& dst, void* src) { Imm imm((sysint_t)src); _emitInstruction(kX86InstMovPtr, &dst, &imm); } //! @brief Move byte, word, dword or qword from AL, AX, EAX or RAX register //! to absolute address @a dst. inline void mov_ptr(void* dst, const GpVar& src) { Imm imm((sysint_t)dst); _emitInstruction(kX86InstMovPtr, &imm, &src); } //! @brief Move with Sign-Extension. //! //! This instruction copies the contents of the source operand (register //! or memory location) to the destination operand (register) and sign //! extends the value to 16, 32 or 64-bits. //! //! @sa movsxd(). void movsx(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovSX, &dst, &src); } //! @brief Move with Sign-Extension. //! @overload void movsx(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSX, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move DWord to QWord with sign-extension. inline void movsxd(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovSXD, &dst, &src); } //! @brief Move DWord to QWord with sign-extension. //! @overload inline void movsxd(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSXD, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move with Zero-Extend. //! //! This instruction copies the contents of the source operand (register //! or memory location) to the destination operand (register) and zero //! extends the value to 16 or 32-bits. The size of the converted value //! depends on the operand-size attribute. inline void movzx(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovZX, &dst, &src); } //! @brief Move with Zero-Extend. //! @brief Overload inline void movzx(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstMovZX, &dst, &src); } //! @brief Unsigned multiply. //! //! Source operand (in a general-purpose register or memory location) //! is multiplied by the value in the AL, AX, or EAX register (depending //! on the operand size) and the product is stored in the AX, DX:AX, or //! EDX:EAX registers, respectively. inline void mul(const GpVar& dst_hi, const GpVar& dst_lo, const GpVar& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId()); _emitInstruction(kX86InstMul, &dst_hi, &dst_lo, &src); } //! @brief Unsigned multiply. //! @overload inline void mul(const GpVar& dst_hi, const GpVar& dst_lo, const Mem& src) { // Destination variables must be different. ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId()); _emitInstruction(kX86InstMul, &dst_hi, &dst_lo, &src); } //! @brief Two's Complement Negation. inline void neg(const GpVar& dst) { _emitInstruction(kX86InstNeg, &dst); } //! @brief Two's Complement Negation. inline void neg(const Mem& dst) { _emitInstruction(kX86InstNeg, &dst); } //! @brief No Operation. //! //! This instruction performs no operation. This instruction is a one-byte //! instruction that takes up space in the instruction stream but does not //! affect the machine context, except the EIP register. The NOP instruction //! is an alias mnemonic for the XCHG (E)AX, (E)AX instruction. inline void nop() { _emitInstruction(kX86InstNop); } //! @brief One's Complement Negation. inline void not_(const GpVar& dst) { _emitInstruction(kX86InstNot, &dst); } //! @brief One's Complement Negation. inline void not_(const Mem& dst) { _emitInstruction(kX86InstNot, &dst); } //! @brief Logical Inclusive OR. inline void or_(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Logical Inclusive OR. inline void or_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstOr, &dst, &src); } //! @brief Pop a Value from the Stack. //! //! This instruction loads the value from the top of the stack to the location //! specified with the destination operand and then increments the stack pointer. //! The destination operand can be a general purpose register, memory location, //! or segment register. inline void pop(const GpVar& dst) { _emitInstruction(kX86InstPop, &dst); } inline void pop(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == sizeof(sysint_t)); _emitInstruction(kX86InstPop, &dst); } #if defined(ASMJIT_X86) //! @brief Pop All General-Purpose Registers. //! //! Pop EDI, ESI, EBP, EBX, EDX, ECX, and EAX. inline void popad() { _emitInstruction(kX86InstPopAD); } #endif // ASMJIT_X86 //! @brief Pop Stack into EFLAGS Register (32-bit or 64-bit). inline void popf() { #if defined(ASMJIT_X86) popfd(); #else popfq(); #endif } #if defined(ASMJIT_X86) //! @brief Pop Stack into EFLAGS Register (32-bit). inline void popfd() { _emitInstruction(kX86InstPopFD); } #else //! @brief Pop Stack into EFLAGS Register (64-bit). inline void popfq() { _emitInstruction(kX86InstPopFQ); } #endif //! @brief Push WORD/DWORD/QWORD Onto the Stack. //! //! @note 32-bit architecture pushed DWORD while 64-bit //! pushes QWORD. 64-bit mode not provides instruction to //! push 32-bit register/memory. inline void push(const GpVar& src) { _emitInstruction(kX86InstPush, &src); } //! @brief Push WORD/DWORD/QWORD Onto the Stack. inline void push(const Mem& src) { ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == sizeof(sysint_t)); _emitInstruction(kX86InstPush, &src); } //! @brief Push WORD/DWORD/QWORD Onto the Stack. inline void push(const Imm& src) { _emitInstruction(kX86InstPush, &src); } #if defined(ASMJIT_X86) //! @brief Push All General-Purpose Registers. //! //! Push EAX, ECX, EDX, EBX, original ESP, EBP, ESI, and EDI. inline void pushad() { _emitInstruction(kX86InstPushAD); } #endif // ASMJIT_X86 //! @brief Push EFLAGS Register (32-bit or 64-bit) onto the Stack. inline void pushf() { #if defined(ASMJIT_X86) pushfd(); #else pushfq(); #endif } #if defined(ASMJIT_X86) //! @brief Push EFLAGS Register (32-bit) onto the Stack. inline void pushfd() { _emitInstruction(kX86InstPushFD); } #else //! @brief Push EFLAGS Register (64-bit) onto the Stack. inline void pushfq() { _emitInstruction(kX86InstPushFQ); } #endif // ASMJIT_X86 //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rcl(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. inline void rcl(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rcl(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Left. inline void rcl(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRcl, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void rcr(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. inline void rcr(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void rcr(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Rotate Bits Right. inline void rcr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRcr, &dst, &src); } //! @brief Read Time-Stamp Counter (Pentium). inline void rdtsc(const GpVar& dst_edx, const GpVar& dst_eax) { // Destination registers must be different. ASMJIT_ASSERT(dst_edx.getId() != dst_eax.getId()); _emitInstruction(kX86InstRdtsc, &dst_edx, &dst_eax); } //! @brief Read Time-Stamp Counter and Processor ID (New). inline void rdtscp(const GpVar& dst_edx, const GpVar& dst_eax, const GpVar& dst_ecx) { // Destination registers must be different. ASMJIT_ASSERT(dst_edx.getId() != dst_eax.getId() && dst_eax.getId() != dst_ecx.getId()); _emitInstruction(kX86InstRdtscP, &dst_edx, &dst_eax, &dst_ecx); } //! @brief Load ECX/RCX BYTEs from DS:[ESI/RSI] to AL. inline void rep_lodsb(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepLodSB, &dst_val, &src_addr, &cnt_ecx); } //! @brief Load ECX/RCX DWORDs from DS:[ESI/RSI] to EAX. inline void rep_lodsd(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepLodSD, &dst_val, &src_addr, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Load ECX/RCX QWORDs from DS:[ESI/RSI] to RAX. inline void rep_lodsq(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepLodSQ, &dst_val, &src_addr, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Load ECX/RCX WORDs from DS:[ESI/RSI] to AX. inline void rep_lodsw(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepLodSW, &dst_val, &src_addr, &cnt_ecx); } //! @brief Move ECX/RCX BYTEs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsb(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepMovSB, &dst_addr, &src_addr, &cnt_ecx); } //! @brief Move ECX/RCX DWORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsd(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepMovSD, &dst_addr, &src_addr, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Move ECX/RCX QWORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsq(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepMovSQ, &dst_addr, &src_addr, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Move ECX/RCX WORDs from DS:[ESI/RSI] to ES:[EDI/RDI]. inline void rep_movsw(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepMovSW, &dst_addr, &src_addr, &cnt_ecx); } //! @brief Fill ECX/RCX BYTEs at ES:[EDI/RDI] with AL. inline void rep_stosb(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepStoSB, &dst_addr, &src_val, &cnt_ecx); } //! @brief Fill ECX/RCX DWORDs at ES:[EDI/RDI] with EAX. inline void rep_stosd(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepStoSD, &dst_addr, &src_val, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Fill ECX/RCX QWORDs at ES:[EDI/RDI] with RAX. inline void rep_stosq(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepStoSQ, &dst_addr, &src_val, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Fill ECX/RCX WORDs at ES:[EDI/RDI] with AX. inline void rep_stosw(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX. ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepStoSW, &dst_addr, &src_val, &cnt_ecx); } //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsb(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepECmpSB, &cmp1_addr, &cmp2_addr, &cnt_ecx); } //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsd(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepECmpSD, &cmp1_addr, &cmp2_addr, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsq(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepECmpSQ, &cmp1_addr, &cmp2_addr, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI]. inline void repe_cmpsw(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepECmpSW, &cmp1_addr, &cmp2_addr, &cnt_ecx); } //! @brief Find non-AL BYTE starting at ES:[EDI/RDI]. inline void repe_scasb(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AL, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepEScaSB, &cmp1_addr, &cmp2_val, &cnt_ecx); } //! @brief Find non-EAX DWORD starting at ES:[EDI/RDI]. inline void repe_scasd(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=EAX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepEScaSD, &cmp1_addr, &cmp2_val, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Find non-RAX QWORD starting at ES:[EDI/RDI]. inline void repe_scasq(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=RAX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepEScaSQ, &cmp1_addr, &cmp2_val, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Find non-AX WORD starting at ES:[EDI/RDI]. inline void repe_scasw(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepEScaSW, &cmp1_addr, &cmp2_val, &cnt_ecx); } //! @brief Find matching BYTEs in [RDI] and [RSI]. inline void repne_cmpsb(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNECmpSB, &cmp1_addr, &cmp2_addr, &cnt_ecx); } //! @brief Find matching DWORDs in [RDI] and [RSI]. inline void repne_cmpsd(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNECmpSD, &cmp1_addr, &cmp2_addr, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Find matching QWORDs in [RDI] and [RSI]. inline void repne_cmpsq(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNECmpSQ, &cmp1_addr, &cmp2_addr, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Find matching WORDs in [RDI] and [RSI]. inline void repne_cmpsw(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNECmpSW, &cmp1_addr, &cmp2_addr, &cnt_ecx); } //! @brief Find AL, starting at ES:[EDI/RDI]. inline void repne_scasb(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AL, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNEScaSB, &cmp1_addr, &cmp2_val, &cnt_ecx); } //! @brief Find EAX, starting at ES:[EDI/RDI]. inline void repne_scasd(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=EAX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNEScaSD, &cmp1_addr, &cmp2_val, &cnt_ecx); } #if defined(ASMJIT_X64) //! @brief Find RAX, starting at ES:[EDI/RDI]. inline void repne_scasq(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=RAX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNEScaSQ, &cmp1_addr, &cmp2_val, &cnt_ecx); } #endif // ASMJIT_X64 //! @brief Find AX, starting at ES:[EDI/RDI]. inline void repne_scasw(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx) { // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AX, cnt=ECX/RCX. ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId()); _emitInstruction(kX86InstRepNEScaSW, &cmp1_addr, &cmp2_val, &cnt_ecx); } //! @brief Return from Procedure. inline void ret() { _emitReturn(NULL, NULL); } //! @brief Return from Procedure. inline void ret(const GpVar& first) { _emitReturn(&first, NULL); } //! @brief Return from Procedure. inline void ret(const GpVar& first, const GpVar& second) { _emitReturn(&first, &second); } //! @brief Return from Procedure. inline void ret(const XmmVar& first) { _emitReturn(&first, NULL); } //! @brief Return from Procedure. inline void ret(const XmmVar& first, const XmmVar& second) { _emitReturn(&first, &second); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rol(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. inline void rol(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. //! @note @a src register can be only @c cl. inline void rol(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Left. inline void rol(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRol, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void ror(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. inline void ror(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. //! @note @a src register can be only @c cl. inline void ror(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstRor, &dst, &src); } //! @brief Rotate Bits Right. inline void ror(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstRor, &dst, &src); } #if defined(ASMJIT_X86) //! @brief Store @a var (allocated to AH/AX/EAX/RAX) into Flags. inline void sahf(const GpVar& var) { _emitInstruction(kX86InstSahf, &var); } #endif // ASMJIT_X86 //! @brief Integer subtraction with borrow. inline void sbb(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Integer subtraction with borrow. inline void sbb(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSbb, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void sal(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. inline void sal(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void sal(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Left. inline void sal(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSal, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void sar(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. inline void sar(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void sar(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Shift Bits Right. inline void sar(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSar, &dst, &src); } //! @brief Set Byte on Condition. inline void set(kX86Cond cc, const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst); } //! @brief Set Byte on Condition. inline void set(kX86Cond cc, const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst); } //! @brief Set Byte on Condition. inline void seta (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetA , &dst); } //! @brief Set Byte on Condition. inline void seta (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetA , &dst); } //! @brief Set Byte on Condition. inline void setae (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetAE , &dst); } //! @brief Set Byte on Condition. inline void setae (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetAE , &dst); } //! @brief Set Byte on Condition. inline void setb (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetB , &dst); } //! @brief Set Byte on Condition. inline void setb (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetB , &dst); } //! @brief Set Byte on Condition. inline void setbe (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetBE , &dst); } //! @brief Set Byte on Condition. inline void setbe (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetBE , &dst); } //! @brief Set Byte on Condition. inline void setc (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetC , &dst); } //! @brief Set Byte on Condition. inline void setc (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetC , &dst); } //! @brief Set Byte on Condition. inline void sete (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetE , &dst); } //! @brief Set Byte on Condition. inline void sete (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetE , &dst); } //! @brief Set Byte on Condition. inline void setg (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetG , &dst); } //! @brief Set Byte on Condition. inline void setg (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetG , &dst); } //! @brief Set Byte on Condition. inline void setge (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetGE , &dst); } //! @brief Set Byte on Condition. inline void setge (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetGE , &dst); } //! @brief Set Byte on Condition. inline void setl (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetL , &dst); } //! @brief Set Byte on Condition. inline void setl (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetL , &dst); } //! @brief Set Byte on Condition. inline void setle (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetLE , &dst); } //! @brief Set Byte on Condition. inline void setle (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetLE , &dst); } //! @brief Set Byte on Condition. inline void setna (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNA , &dst); } //! @brief Set Byte on Condition. inline void setna (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNA , &dst); } //! @brief Set Byte on Condition. inline void setnae(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNAE, &dst); } //! @brief Set Byte on Condition. inline void setnae(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNAE, &dst); } //! @brief Set Byte on Condition. inline void setnb (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNB , &dst); } //! @brief Set Byte on Condition. inline void setnb (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNB , &dst); } //! @brief Set Byte on Condition. inline void setnbe(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNBE, &dst); } //! @brief Set Byte on Condition. inline void setnbe(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNBE, &dst); } //! @brief Set Byte on Condition. inline void setnc (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNC , &dst); } //! @brief Set Byte on Condition. inline void setnc (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNC , &dst); } //! @brief Set Byte on Condition. inline void setne (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNE , &dst); } //! @brief Set Byte on Condition. inline void setne (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNE , &dst); } //! @brief Set Byte on Condition. inline void setng (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNG , &dst); } //! @brief Set Byte on Condition. inline void setng (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNG , &dst); } //! @brief Set Byte on Condition. inline void setnge(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNGE, &dst); } //! @brief Set Byte on Condition. inline void setnge(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNGE, &dst); } //! @brief Set Byte on Condition. inline void setnl (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNL , &dst); } //! @brief Set Byte on Condition. inline void setnl (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNL , &dst); } //! @brief Set Byte on Condition. inline void setnle(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNLE, &dst); } //! @brief Set Byte on Condition. inline void setnle(const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNLE, &dst); } //! @brief Set Byte on Condition. inline void setno (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNO , &dst); } //! @brief Set Byte on Condition. inline void setno (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNO , &dst); } //! @brief Set Byte on Condition. inline void setnp (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNP , &dst); } //! @brief Set Byte on Condition. inline void setnp (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNP , &dst); } //! @brief Set Byte on Condition. inline void setns (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNS , &dst); } //! @brief Set Byte on Condition. inline void setns (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNS , &dst); } //! @brief Set Byte on Condition. inline void setnz (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNZ , &dst); } //! @brief Set Byte on Condition. inline void setnz (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNZ , &dst); } //! @brief Set Byte on Condition. inline void seto (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetO , &dst); } //! @brief Set Byte on Condition. inline void seto (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetO , &dst); } //! @brief Set Byte on Condition. inline void setp (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetP , &dst); } //! @brief Set Byte on Condition. inline void setp (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetP , &dst); } //! @brief Set Byte on Condition. inline void setpe (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPE , &dst); } //! @brief Set Byte on Condition. inline void setpe (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPE , &dst); } //! @brief Set Byte on Condition. inline void setpo (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPO , &dst); } //! @brief Set Byte on Condition. inline void setpo (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPO , &dst); } //! @brief Set Byte on Condition. inline void sets (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetS , &dst); } //! @brief Set Byte on Condition. inline void sets (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetS , &dst); } //! @brief Set Byte on Condition. inline void setz (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetZ , &dst); } //! @brief Set Byte on Condition. inline void setz (const Mem& dst) { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetZ , &dst); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void shl(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. inline void shl(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. //! @note @a src register can be only @c cl. inline void shl(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Left. inline void shl(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstShl, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void shr(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. inline void shr(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. //! @note @a src register can be only @c cl. inline void shr(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Shift Bits Right. inline void shr(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstShr, &dst, &src); } //! @brief Double Precision Shift Left. //! @note src2 register can be only @c cl register. inline void shld(const GpVar& dst, const GpVar& src1, const GpVar& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. inline void shld(const GpVar& dst, const GpVar& src1, const Imm& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. //! @note src2 register can be only @c cl register. inline void shld(const Mem& dst, const GpVar& src1, const GpVar& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Left. inline void shld(const Mem& dst, const GpVar& src1, const Imm& src2) { _emitInstruction(kX86InstShld, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. //! @note src2 register can be only @c cl register. inline void shrd(const GpVar& dst, const GpVar& src1, const GpVar& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. inline void shrd(const GpVar& dst, const GpVar& src1, const Imm& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. //! @note src2 register can be only @c cl register. inline void shrd(const Mem& dst, const GpVar& src1, const GpVar& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Double Precision Shift Right. inline void shrd(const Mem& dst, const GpVar& src1, const Imm& src2) { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); } //! @brief Set Carry Flag to 1. inline void stc() { _emitInstruction(kX86InstStc); } //! @brief Set Direction Flag to 1. inline void std() { _emitInstruction(kX86InstStd); } //! @brief Subtract. inline void sub(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Subtract. inline void sub(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstSub, &dst, &src); } //! @brief Logical Compare. inline void test(const GpVar& op1, const GpVar& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const GpVar& op1, const Imm& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const Mem& op1, const GpVar& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Logical Compare. inline void test(const Mem& op1, const Imm& op2) { _emitInstruction(kX86InstTest, &op1, &op2); } //! @brief Undefined instruction - Raise invalid opcode exception. inline void ud2() { _emitInstruction(kX86InstUd2); } //! @brief Exchange and Add. inline void xadd(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstXadd, &dst, &src); } //! @brief Exchange and Add. inline void xadd(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstXadd, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstXchg, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstXchg, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xchg(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstXchg, &src, &dst); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const GpVar& dst, const Imm& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstXor, &dst, &src); } //! @brief Exchange Register/Memory with Register. inline void xor_(const Mem& dst, const Imm& src) { _emitInstruction(kX86InstXor, &dst, &src); } // -------------------------------------------------------------------------- // [MMX] // -------------------------------------------------------------------------- //! @brief Empty MMX state. inline void emms() { _emitInstruction(kX86InstEmms); } //! @brief Move DWord (MMX). inline void movd(const Mem& dst, const MmVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const GpVar& dst, const MmVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord (MMX). inline void movd(const MmVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move QWord (MMX). inline void movq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } //! @brief Move QWord (MMX). inline void movq(const Mem& dst, const MmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (MMX). inline void movq(const GpVar& dst, const MmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif //! @brief Move QWord (MMX). inline void movq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (MMX). inline void movq(const MmVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif //! @brief Pack with Signed Saturation (MMX). inline void packsswb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packsswb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packssdw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Signed Saturation (MMX). inline void packssdw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (MMX). inline void packuswb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Pack with Unsigned Saturation (MMX). inline void packuswb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Packed BYTE Add (MMX). inline void paddb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed BYTE Add (MMX). inline void paddb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed WORD Add (MMX). inline void paddw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed WORD Add (MMX). inline void paddw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed DWORD Add (MMX). inline void paddd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed DWORD Add (MMX). inline void paddd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add with Saturation (MMX). inline void paddsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (MMX). inline void paddusw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Logical AND (MMX). inline void pand(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND (MMX). inline void pand(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND Not (MMX). inline void pandn(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Logical AND Not (MMX). inline void pandn(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (MMX). inline void pcmpeqb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (MMX). inline void pcmpeqb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (MMX). inline void pcmpeqw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (MMX). inline void pcmpeqw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (MMX). inline void pcmpeqd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (MMX). inline void pcmpeqd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (MMX). inline void pcmpgtb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (MMX). inline void pcmpgtb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (MMX). inline void pcmpgtw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (MMX). inline void pcmpgtw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (MMX). inline void pcmpgtd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (MMX). inline void pcmpgtd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Multiply High (MMX). inline void pmulhw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High (MMX). inline void pmulhw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply Low (MMX). inline void pmullw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply Low (MMX). inline void pmullw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Bitwise Logical OR (MMX). inline void por(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Bitwise Logical OR (MMX). inline void por(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Packed Multiply and Add (MMX). inline void pmaddwd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Multiply and Add (MMX). inline void pmaddwd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void pslld(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllq(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (MMX). inline void psllw(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSraD, &dst, &src);} //! @brief Packed Shift Right Arithmetic (MMX). inline void psrad(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (MMX). inline void psraw(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrld(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlq(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (MMX). inline void psrlw(const MmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (MMX). inline void psubd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Saturation (MMX). inline void psubsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (MMX). inline void psubusw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhbw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhbw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhwd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhwd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhdq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckhdq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklbw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklbw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklwd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpcklwd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckldq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack High Packed Data (MMX). inline void punpckldq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Bitwise Exclusive OR (MMX). inline void pxor(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Bitwise Exclusive OR (MMX). inline void pxor(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPXor, &dst, &src); } // -------------------------------------------------------------------------- // [3dNow] // -------------------------------------------------------------------------- //! @brief Faster EMMS (3dNow!). //! //! @note Use only for early AMD processors where is only 3dNow! or SSE. If //! CPU contains SSE2, it's better to use @c emms() ( @c femms() is mapped //! to @c emms() ). inline void femms() { _emitInstruction(kX86InstFEmms); } //! @brief Packed SP-FP to Integer Convert (3dNow!). inline void pf2id(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPF2ID, &dst, &src); } //! @brief Packed SP-FP to Integer Convert (3dNow!). inline void pf2id(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPF2ID, &dst, &src); } //! @brief Packed SP-FP to Integer Word Convert (3dNow!). inline void pf2iw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPF2IW, &dst, &src); } //! @brief Packed SP-FP to Integer Word Convert (3dNow!). inline void pf2iw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPF2IW, &dst, &src); } //! @brief Packed SP-FP Accumulate (3dNow!). inline void pfacc(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFAcc, &dst, &src); } //! @brief Packed SP-FP Accumulate (3dNow!). inline void pfacc(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFAcc, &dst, &src); } //! @brief Packed SP-FP Addition (3dNow!). inline void pfadd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFAdd, &dst, &src); } //! @brief Packed SP-FP Addition (3dNow!). inline void pfadd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFAdd, &dst, &src); } //! @brief Packed SP-FP Compare - dst == src (3dNow!). inline void pfcmpeq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); } //! @brief Packed SP-FP Compare - dst == src (3dNow!). inline void pfcmpeq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); } //! @brief Packed SP-FP Compare - dst >= src (3dNow!). inline void pfcmpge(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFCmpGE, &dst, &src); } //! @brief Packed SP-FP Compare - dst >= src (3dNow!). inline void pfcmpge(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpGE, &dst, &src); } //! @brief Packed SP-FP Compare - dst > src (3dNow!). inline void pfcmpgt(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFCmpGT, &dst, &src); } //! @brief Packed SP-FP Compare - dst > src (3dNow!). inline void pfcmpgt(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFCmpGT, &dst, &src); } //! @brief Packed SP-FP Maximum (3dNow!). inline void pfmax(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFMax, &dst, &src); } //! @brief Packed SP-FP Maximum (3dNow!). inline void pfmax(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFMax, &dst, &src); } //! @brief Packed SP-FP Minimum (3dNow!). inline void pfmin(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFMin, &dst, &src); } //! @brief Packed SP-FP Minimum (3dNow!). inline void pfmin(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFMin, &dst, &src); } //! @brief Packed SP-FP Multiply (3dNow!). inline void pfmul(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFMul, &dst, &src); } //! @brief Packed SP-FP Multiply (3dNow!). inline void pfmul(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFMul, &dst, &src); } //! @brief Packed SP-FP Negative Accumulate (3dNow!). inline void pfnacc(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFNAcc, &dst, &src); } //! @brief Packed SP-FP Negative Accumulate (3dNow!). inline void pfnacc(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFNAcc, &dst, &src); } //! @brief Packed SP-FP Mixed Accumulate (3dNow!). inline void pfpnacc(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFPNAcc, &dst, &src); } //! @brief Packed SP-FP Mixed Accumulate (3dNow!). inline void pfpnacc(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFPNAcc, &dst, &src); } //! @brief Packed SP-FP Reciprocal Approximation (3dNow!). inline void pfrcp(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRcp, &dst, &src); } //! @brief Packed SP-FP Reciprocal Approximation (3dNow!). inline void pfrcp(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRcp, &dst, &src); } //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!). inline void pfrcpit1(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!). inline void pfrcpit1(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!). inline void pfrcpit2(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); } //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!). inline void pfrcpit2(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!). inline void pfrsqit1(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!). inline void pfrsqit1(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!). inline void pfrsqrt(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFRSqrt, &dst, &src); } //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!). inline void pfrsqrt(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFRSqrt, &dst, &src); } //! @brief Packed SP-FP Subtract (3dNow!). inline void pfsub(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFSub, &dst, &src); } //! @brief Packed SP-FP Subtract (3dNow!). inline void pfsub(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFSub, &dst, &src); } //! @brief Packed SP-FP Reverse Subtract (3dNow!). inline void pfsubr(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPFSubR, &dst, &src); } //! @brief Packed SP-FP Reverse Subtract (3dNow!). inline void pfsubr(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPFSubR, &dst, &src); } //! @brief Packed DWords to SP-FP (3dNow!). inline void pi2fd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPI2FD, &dst, &src); } //! @brief Packed DWords to SP-FP (3dNow!). inline void pi2fd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPI2FD, &dst, &src); } //! @brief Packed Words to SP-FP (3dNow!). inline void pi2fw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPI2FW, &dst, &src); } //! @brief Packed Words to SP-FP (3dNow!). inline void pi2fw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPI2FW, &dst, &src); } //! @brief Packed swap DWord (3dNow!) inline void pswapd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSwapD, &dst, &src); } //! @brief Packed swap DWord (3dNow!) inline void pswapd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSwapD, &dst, &src); } // -------------------------------------------------------------------------- // [SSE] // -------------------------------------------------------------------------- //! @brief Packed SP-FP Add (SSE). inline void addps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddPS, &dst, &src); } //! @brief Packed SP-FP Add (SSE). inline void addps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddPS, &dst, &src); } //! @brief Scalar SP-FP Add (SSE). inline void addss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddSS, &dst, &src); } //! @brief Scalar SP-FP Add (SSE). inline void addss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddSS, &dst, &src); } //! @brief Bit-wise Logical And Not For SP-FP (SSE). inline void andnps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAndnPS, &dst, &src); } //! @brief Bit-wise Logical And Not For SP-FP (SSE). inline void andnps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAndnPS, &dst, &src); } //! @brief Bit-wise Logical And For SP-FP (SSE). inline void andps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAndPS, &dst, &src); } //! @brief Bit-wise Logical And For SP-FP (SSE). inline void andps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAndPS, &dst, &src); } //! @brief Packed SP-FP Compare (SSE). inline void cmpps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); } //! @brief Packed SP-FP Compare (SSE). inline void cmpps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE). inline void cmpss(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE). inline void cmpss(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); } //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE). inline void comiss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstComISS, &dst, &src); } //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE). inline void comiss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstComISS, &dst, &src); } //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE). inline void cvtpi2ps(const XmmVar& dst, const MmVar& src) { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); } //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE). inline void cvtpi2ps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (SSE). inline void cvtps2pi(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (SSE). inline void cvtps2pi(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); } //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE). inline void cvtsi2ss(const XmmVar& dst, const GpVar& src) { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); } //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE). inline void cvtsi2ss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE). inline void cvtss2si(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE). inline void cvtss2si(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE). inline void cvttps2pi(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); } //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE). inline void cvttps2pi(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE). inline void cvttss2si(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); } //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE). inline void cvttss2si(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); } //! @brief Packed SP-FP Divide (SSE). inline void divps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstDivPS, &dst, &src); } //! @brief Packed SP-FP Divide (SSE). inline void divps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstDivPS, &dst, &src); } //! @brief Scalar SP-FP Divide (SSE). inline void divss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstDivSS, &dst, &src); } //! @brief Scalar SP-FP Divide (SSE). inline void divss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstDivSS, &dst, &src); } //! @brief Load Streaming SIMD Extension Control/Status (SSE). inline void ldmxcsr(const Mem& src) { _emitInstruction(kX86InstLdMXCSR, &src); } //! @brief Byte Mask Write (SSE). //! //! @note The default memory location is specified by DS:EDI. inline void maskmovq(const GpVar& dst_ptr, const MmVar& data, const MmVar& mask) { _emitInstruction(kX86InstMaskMovQ, &dst_ptr, &data, &mask); } //! @brief Packed SP-FP Maximum (SSE). inline void maxps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMaxPS, &dst, &src); } //! @brief Packed SP-FP Maximum (SSE). inline void maxps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMaxPS, &dst, &src); } //! @brief Scalar SP-FP Maximum (SSE). inline void maxss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMaxSS, &dst, &src); } //! @brief Scalar SP-FP Maximum (SSE). inline void maxss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMaxSS, &dst, &src); } //! @brief Packed SP-FP Minimum (SSE). inline void minps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMinPS, &dst, &src); } //! @brief Packed SP-FP Minimum (SSE). inline void minps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMinPS, &dst, &src); } //! @brief Scalar SP-FP Minimum (SSE). inline void minss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMinSS, &dst, &src); } //! @brief Scalar SP-FP Minimum (SSE). inline void minss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMinSS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move Aligned Packed SP-FP Values (SSE). inline void movaps(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovAPS, &dst, &src); } //! @brief Move DWord. inline void movd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move DWord. inline void movd(const XmmVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovD, &dst, &src); } //! @brief Move QWord (SSE). inline void movq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } //! @brief Move QWord (SSE). inline void movq(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (SSE). inline void movq(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move QWord (SSE). inline void movq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #if defined(ASMJIT_X64) //! @brief Move QWord (SSE). inline void movq(const XmmVar& dst, const GpVar& src) { _emitInstruction(kX86InstMovQ, &dst, &src); } #endif // ASMJIT_X64 //! @brief Move 64 Bits Non Temporal (SSE). inline void movntq(const Mem& dst, const MmVar& src) { _emitInstruction(kX86InstMovNTQ, &dst, &src); } //! @brief High to Low Packed SP-FP (SSE). inline void movhlps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovHLPS, &dst, &src); } //! @brief Move High Packed SP-FP (SSE). inline void movhps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovHPS, &dst, &src); } //! @brief Move High Packed SP-FP (SSE). inline void movhps(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovHPS, &dst, &src); } //! @brief Move Low to High Packed SP-FP (SSE). inline void movlhps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovLHPS, &dst, &src); } //! @brief Move Low Packed SP-FP (SSE). inline void movlps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovLPS, &dst, &src); } //! @brief Move Low Packed SP-FP (SSE). inline void movlps(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovLPS, &dst, &src); } //! @brief Move Aligned Four Packed SP-FP Non Temporal (SSE). inline void movntps(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovNTPS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Scalar SP-FP (SSE). inline void movss(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Move Unaligned Packed SP-FP Values (SSE). inline void movups(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovUPS, &dst, &src); } //! @brief Packed SP-FP Multiply (SSE). inline void mulps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMulPS, &dst, &src); } //! @brief Packed SP-FP Multiply (SSE). inline void mulps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMulPS, &dst, &src); } //! @brief Scalar SP-FP Multiply (SSE). inline void mulss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMulSS, &dst, &src); } //! @brief Scalar SP-FP Multiply (SSE). inline void mulss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMulSS, &dst, &src); } //! @brief Bit-wise Logical OR for SP-FP Data (SSE). inline void orps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstOrPS, &dst, &src); } //! @brief Bit-wise Logical OR for SP-FP Data (SSE). inline void orps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstOrPS, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Average (SSE). inline void pavgw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Extract Word (SSE). inline void pextrw(const GpVar& dst, const MmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Insert Word (SSE). inline void pinsrw(const MmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Insert Word (SSE). inline void pinsrw(const MmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Packed Signed Integer Word Maximum (SSE). inline void pmaxsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE). inline void pmaxsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE). inline void pmaxub(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE). inline void pmaxub(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE). inline void pminsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE). inline void pminsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE). inline void pminub(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE). inline void pminub(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Move Byte Mask To Integer (SSE). inline void pmovmskb(const GpVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMovMskB, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE). inline void pmulhuw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE). inline void pmulhuw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Sum of Absolute Differences (SSE). inline void psadbw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed Sum of Absolute Differences (SSE). inline void psadbw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed Shuffle word (SSE). inline void pshufw(const MmVar& dst, const MmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); } //! @brief Packed Shuffle word (SSE). inline void pshufw(const MmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); } //! @brief Packed SP-FP Reciprocal (SSE). inline void rcpps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstRcpPS, &dst, &src); } //! @brief Packed SP-FP Reciprocal (SSE). inline void rcpps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstRcpPS, &dst, &src); } //! @brief Scalar SP-FP Reciprocal (SSE). inline void rcpss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstRcpSS, &dst, &src); } //! @brief Scalar SP-FP Reciprocal (SSE). inline void rcpss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstRcpSS, &dst, &src); } //! @brief Prefetch (SSE). inline void prefetch(const Mem& mem, const Imm& hint) { _emitInstruction(kX86InstPrefetch, &mem, &hint); } //! @brief Compute Sum of Absolute Differences (SSE). inline void psadbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Compute Sum of Absolute Differences (SSE). inline void psadbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSADBW, &dst, &src); } //! @brief Packed SP-FP Square Root Reciprocal (SSE). inline void rsqrtps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Packed SP-FP Square Root Reciprocal (SSE). inline void rsqrtps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Scalar SP-FP Square Root Reciprocal (SSE). inline void rsqrtss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Scalar SP-FP Square Root Reciprocal (SSE). inline void rsqrtss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Store fence (SSE). inline void sfence() { _emitInstruction(kX86InstSFence); } //! @brief Shuffle SP-FP (SSE). inline void shufps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); } //! @brief Shuffle SP-FP (SSE). inline void shufps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); } //! @brief Packed SP-FP Square Root (SSE). inline void sqrtps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Packed SP-FP Square Root (SSE). inline void sqrtps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPS, &dst, &src); } //! @brief Scalar SP-FP Square Root (SSE). inline void sqrtss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Scalar SP-FP Square Root (SSE). inline void sqrtss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSS, &dst, &src); } //! @brief Store Streaming SIMD Extension Control/Status (SSE). inline void stmxcsr(const Mem& dst) { _emitInstruction(kX86InstStMXCSR, &dst); } //! @brief Packed SP-FP Subtract (SSE). inline void subps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSubPS, &dst, &src); } //! @brief Packed SP-FP Subtract (SSE). inline void subps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSubPS, &dst, &src); } //! @brief Scalar SP-FP Subtract (SSE). inline void subss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSubSS, &dst, &src); } //! @brief Scalar SP-FP Subtract (SSE). inline void subss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSubSS, &dst, &src); } //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE). inline void ucomiss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUComISS, &dst, &src); } //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE). inline void ucomiss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUComISS, &dst, &src); } //! @brief Unpack High Packed SP-FP Data (SSE). inline void unpckhps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUnpckHPS, &dst, &src); } //! @brief Unpack High Packed SP-FP Data (SSE). inline void unpckhps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUnpckHPS, &dst, &src); } //! @brief Unpack Low Packed SP-FP Data (SSE). inline void unpcklps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUnpckLPS, &dst, &src); } //! @brief Unpack Low Packed SP-FP Data (SSE). inline void unpcklps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUnpckLPS, &dst, &src); } //! @brief Bit-wise Logical Xor for SP-FP Data (SSE). inline void xorps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstXorPS, &dst, &src); } //! @brief Bit-wise Logical Xor for SP-FP Data (SSE). inline void xorps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstXorPS, &dst, &src); } // -------------------------------------------------------------------------- // [SSE2] // -------------------------------------------------------------------------- //! @brief Packed DP-FP Add (SSE2). inline void addpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddPD, &dst, &src); } //! @brief Packed DP-FP Add (SSE2). inline void addpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddPD, &dst, &src); } //! @brief Scalar DP-FP Add (SSE2). inline void addsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddSD, &dst, &src); } //! @brief Scalar DP-FP Add (SSE2). inline void addsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddSD, &dst, &src); } //! @brief Bit-wise Logical And Not For DP-FP (SSE2). inline void andnpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAndnPD, &dst, &src); } //! @brief Bit-wise Logical And Not For DP-FP (SSE2). inline void andnpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAndnPD, &dst, &src); } //! @brief Bit-wise Logical And For DP-FP (SSE2). inline void andpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAndPD, &dst, &src); } //! @brief Bit-wise Logical And For DP-FP (SSE2). inline void andpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAndPD, &dst, &src); } //! @brief Flush Cache Line (SSE2). inline void clflush(const Mem& mem) { _emitInstruction(kX86InstClFlush, &mem); } //! @brief Packed DP-FP Compare (SSE2). inline void cmppd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); } //! @brief Packed DP-FP Compare (SSE2). inline void cmppd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE2). inline void cmpsd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); } //! @brief Compare Scalar SP-FP Values (SSE2). inline void cmpsd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); } //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2). inline void comisd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstComISD, &dst, &src); } //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2). inline void comisd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstComISD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtdq2pd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtdq2pd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2). inline void cvtdq2ps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2). inline void cvtdq2ps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2dq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2dq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2pi(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvtpd2pi(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2). inline void cvtpd2ps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); } //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2). inline void cvtpd2ps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtpi2pd(const XmmVar& dst, const MmVar& src) { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); } //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2). inline void cvtpi2pd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvtps2dq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvtps2dq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2). inline void cvtps2pd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); } //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2). inline void cvtps2pd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2). inline void cvtsd2si(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2). inline void cvtsd2si(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2). inline void cvtsd2ss(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); } //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2). inline void cvtsd2ss(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); } //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2). inline void cvtsi2sd(const XmmVar& dst, const GpVar& src) { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); } //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2). inline void cvtsi2sd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); } //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2). inline void cvtss2sd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); } //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2). inline void cvtss2sd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2pi(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2pi(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2dq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); } //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2). inline void cvttpd2dq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); } //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvttps2dq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); } //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2). inline void cvttps2dq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); } //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2). inline void cvttsd2si(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); } //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2). inline void cvttsd2si(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); } //! @brief Packed DP-FP Divide (SSE2). inline void divpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstDivPD, &dst, &src); } //! @brief Packed DP-FP Divide (SSE2). inline void divpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstDivPD, &dst, &src); } //! @brief Scalar DP-FP Divide (SSE2). inline void divsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstDivSD, &dst, &src); } //! @brief Scalar DP-FP Divide (SSE2). inline void divsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstDivSD, &dst, &src); } //! @brief Load Fence (SSE2). inline void lfence() { _emitInstruction(kX86InstLFence); } //! @brief Store Selected Bytes of Double Quadword (SSE2). //! //! @note Target is DS:EDI. inline void maskmovdqu(const GpVar& dst_ptr, const XmmVar& src, const XmmVar& mask) { _emitInstruction(kX86InstMaskMovDQU, &dst_ptr, &src, &mask); } //! @brief Return Maximum Packed Double-Precision FP Values (SSE2). inline void maxpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMaxPD, &dst, &src); } //! @brief Return Maximum Packed Double-Precision FP Values (SSE2). inline void maxpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMaxPD, &dst, &src); } //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2). inline void maxsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMaxSD, &dst, &src); } //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2). inline void maxsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMaxSD, &dst, &src); } //! @brief Memory Fence (SSE2). inline void mfence() { _emitInstruction(kX86InstMFence); } //! @brief Return Minimum Packed DP-FP Values (SSE2). inline void minpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMinPD, &dst, &src); } //! @brief Return Minimum Packed DP-FP Values (SSE2). inline void minpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMinPD, &dst, &src); } //! @brief Return Minimum Scalar DP-FP Value (SSE2). inline void minsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMinSD, &dst, &src); } //! @brief Return Minimum Scalar DP-FP Value (SSE2). inline void minsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMinSD, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Aligned DQWord (SSE2). inline void movdqa(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQA, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Move Unaligned Double Quadword (SSE2). inline void movdqu(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQU, &dst, &src); } //! @brief Extract Packed SP-FP Sign Mask (SSE2). inline void movmskps(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovMskPS, &dst, &src); } //! @brief Extract Packed DP-FP Sign Mask (SSE2). inline void movmskpd(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovMskPD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Scalar Double-Precision FP Value (SSE2). inline void movsd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Aligned Packed Double-Precision FP Values (SSE2). inline void movapd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovAPD, &dst, &src); } //! @brief Move Quadword from XMM to MMX Technology Register (SSE2). inline void movdq2q(const MmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDQ2Q, &dst, &src); } //! @brief Move Quadword from MMX Technology to XMM Register (SSE2). inline void movq2dq(const XmmVar& dst, const MmVar& src) { _emitInstruction(kX86InstMovQ2DQ, &dst, &src); } //! @brief Move High Packed Double-Precision FP Value (SSE2). inline void movhpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovHPD, &dst, &src); } //! @brief Move High Packed Double-Precision FP Value (SSE2). inline void movhpd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovHPD, &dst, &src); } //! @brief Move Low Packed Double-Precision FP Value (SSE2). inline void movlpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovLPD, &dst, &src); } //! @brief Move Low Packed Double-Precision FP Value (SSE2). inline void movlpd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovLPD, &dst, &src); } //! @brief Store Double Quadword Using Non-Temporal Hint (SSE2). inline void movntdq(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovNTDQ, &dst, &src); } //! @brief Store Store DWORD Using Non-Temporal Hint (SSE2). inline void movnti(const Mem& dst, const GpVar& src) { _emitInstruction(kX86InstMovNTI, &dst, &src); } //! @brief Store Packed Double-Precision FP Values Using Non-Temporal Hint (SSE2). inline void movntpd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovNTPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2). inline void movupd(const Mem& dst, const XmmVar& src) { _emitInstruction(kX86InstMovUPD, &dst, &src); } //! @brief Packed DP-FP Multiply (SSE2). inline void mulpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMulPD, &dst, &src); } //! @brief Packed DP-FP Multiply (SSE2). inline void mulpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMulPD, &dst, &src); } //! @brief Scalar DP-FP Multiply (SSE2). inline void mulsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMulSD, &dst, &src); } //! @brief Scalar DP-FP Multiply (SSE2). inline void mulsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMulSD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void orpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstOrPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void orpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstOrPD, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packsswb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packsswb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackSSWB, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packssdw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Signed Saturation (SSE2). inline void packssdw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackSSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE2). inline void packuswb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE2). inline void packuswb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackUSWB, &dst, &src); } //! @brief Packed BYTE Add (SSE2). inline void paddb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed BYTE Add (SSE2). inline void paddb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddB, &dst, &src); } //! @brief Packed WORD Add (SSE2). inline void paddw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed WORD Add (SSE2). inline void paddw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddW, &dst, &src); } //! @brief Packed DWORD Add (SSE2). inline void paddd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed DWORD Add (SSE2). inline void paddd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddD, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed QWORD Add (SSE2). inline void paddq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddQ, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddSB, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add with Saturation (SSE2). inline void paddsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSB, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Packed Add Unsigned with Saturation (SSE2). inline void paddusw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAddUSW, &dst, &src); } //! @brief Logical AND (SSE2). inline void pand(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND (SSE2). inline void pand(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAnd, &dst, &src); } //! @brief Logical AND Not (SSE2). inline void pandn(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Logical AND Not (SSE2). inline void pandn(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAndN, &dst, &src); } //! @brief Spin Loop Hint (SSE2). inline void pause() { _emitInstruction(kX86InstPause); } //! @brief Packed Average (SSE2). inline void pavgb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAvgB, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Average (SSE2). inline void pavgw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAvgW, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (SSE2). inline void pcmpeqb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (BYTES) (SSE2). inline void pcmpeqb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqB, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (SSE2). inline void pcmpeqw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (WORDS) (SSE2). inline void pcmpeqw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqW, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (SSE2). inline void pcmpeqd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Equal (DWORDS) (SSE2). inline void pcmpeqd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqD, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (SSE2). inline void pcmpgtb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (BYTES) (SSE2). inline void pcmpgtb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtB, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (SSE2). inline void pcmpgtw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (WORDS) (SSE2). inline void pcmpgtw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtW, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (SSE2). inline void pcmpgtd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Packed Compare for Greater Than (DWORDS) (SSE2). inline void pcmpgtd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtD, &dst, &src); } //! @brief Extract Word (SSE2). inline void pextrw(const GpVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Extract Word (SSE2). inline void pextrw(const Mem& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); } //! @brief Packed Signed Integer Word Maximum (SSE2). inline void pmaxsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Signed Integer Word Maximum (SSE2). inline void pmaxsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE2). inline void pmaxub(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Maximum (SSE2). inline void pmaxub(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUB, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE2). inline void pminsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Signed Integer Word Minimum (SSE2). inline void pminsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinSW, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE2). inline void pminub(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Packed Unsigned Integer Byte Minimum (SSE2). inline void pminub(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinUB, &dst, &src); } //! @brief Move Byte Mask (SSE2). inline void pmovmskb(const GpVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovMskB, &dst, &src); } //! @brief Packed Multiply High (SSE2). inline void pmulhw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High (SSE2). inline void pmulhw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE2). inline void pmulhuw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply High Unsigned (SSE2). inline void pmulhuw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHUW, &dst, &src); } //! @brief Packed Multiply Low (SSE2). inline void pmullw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply Low (SSE2). inline void pmullw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulLW, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Packed Multiply to QWORD (SSE2). inline void pmuludq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulUDQ, &dst, &src); } //! @brief Bitwise Logical OR (SSE2). inline void por(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Bitwise Logical OR (SSE2). inline void por(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPOr, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslld(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllD, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllq(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllQ, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void psllw(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllW, &dst, &src); } //! @brief Packed Shift Left Logical (SSE2). inline void pslldq(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSllDQ, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psrad(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSraD, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Shift Right Arithmetic (SSE2). inline void psraw(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSraW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubB, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubW, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubD, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Subtract (SSE2). inline void psubq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubQ, &dst, &src); } //! @brief Packed Multiply and Add (SSE2). inline void pmaddwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Packed Multiply and Add (SSE2). inline void pmaddwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMAddWD, &dst, &src); } //! @brief Shuffle Packed DWORDs (SSE2). inline void pshufd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); } //! @brief Shuffle Packed DWORDs (SSE2). inline void pshufd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); } //! @brief Shuffle Packed High Words (SSE2). inline void pshufhw(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); } //! @brief Shuffle Packed High Words (SSE2). inline void pshufhw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); } //! @brief Shuffle Packed Low Words (SSE2). inline void pshuflw(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); } //! @brief Shuffle Packed Low Words (SSE2). inline void pshuflw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrld(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlD, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlq(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlQ, &dst, &src); } //! @brief DQWord Shift Right Logical (MMX). inline void psrldq(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlDQ, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Shift Right Logical (SSE2). inline void psrlw(const XmmVar& dst, const Imm& src) { _emitInstruction(kX86InstPSrlW, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubSB, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Saturation (SSE2). inline void psubsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSB, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Packed Subtract with Unsigned Saturation (SSE2). inline void psubusw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSubUSW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHBW, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHWD, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhqdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); } //! @brief Unpack High Data (SSE2). inline void punpckhqdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLBW, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLWD, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpckldq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpckldq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklqdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); } //! @brief Unpack Low Data (SSE2). inline void punpcklqdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); } //! @brief Bitwise Exclusive OR (SSE2). inline void pxor(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Bitwise Exclusive OR (SSE2). inline void pxor(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPXor, &dst, &src); } //! @brief Shuffle DP-FP (SSE2). inline void shufpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); } //! @brief Shuffle DP-FP (SSE2). inline void shufpd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); } //! @brief Compute Square Roots of Packed DP-FP Values (SSE2). inline void sqrtpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtPD, &dst, &src); } //! @brief Compute Square Roots of Packed DP-FP Values (SSE2). inline void sqrtpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtPD, &dst, &src); } //! @brief Compute Square Root of Scalar DP-FP Value (SSE2). inline void sqrtsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSqrtSD, &dst, &src); } //! @brief Compute Square Root of Scalar DP-FP Value (SSE2). inline void sqrtsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSqrtSD, &dst, &src); } //! @brief Packed DP-FP Subtract (SSE2). inline void subpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSubPD, &dst, &src); } //! @brief Packed DP-FP Subtract (SSE2). inline void subpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSubPD, &dst, &src); } //! @brief Scalar DP-FP Subtract (SSE2). inline void subsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstSubSD, &dst, &src); } //! @brief Scalar DP-FP Subtract (SSE2). inline void subsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstSubSD, &dst, &src); } //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2). inline void ucomisd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUComISD, &dst, &src); } //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2). inline void ucomisd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUComISD, &dst, &src); } //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2). inline void unpckhpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUnpckHPD, &dst, &src); } //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2). inline void unpckhpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUnpckHPD, &dst, &src); } //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2). inline void unpcklpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstUnpckLPD, &dst, &src); } //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2). inline void unpcklpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstUnpckLPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void xorpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstXorPD, &dst, &src); } //! @brief Bit-wise Logical OR for DP-FP Data (SSE2). inline void xorpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstXorPD, &dst, &src); } // -------------------------------------------------------------------------- // [SSE3] // -------------------------------------------------------------------------- //! @brief Packed DP-FP Add/Subtract (SSE3). inline void addsubpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddSubPD, &dst, &src); } //! @brief Packed DP-FP Add/Subtract (SSE3). inline void addsubpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddSubPD, &dst, &src); } //! @brief Packed SP-FP Add/Subtract (SSE3). inline void addsubps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstAddSubPS, &dst, &src); } //! @brief Packed SP-FP Add/Subtract (SSE3). inline void addsubps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstAddSubPS, &dst, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER // TODO: NOT IMPLEMENTED BY THE COMPILER. //! @brief Store Integer with Truncation (SSE3). inline void fisttp(const Mem& dst) { _emitInstruction(kX86InstFISttP, &dst); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Packed DP-FP Horizontal Add (SSE3). inline void haddpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstHAddPD, &dst, &src); } //! @brief Packed DP-FP Horizontal Add (SSE3). inline void haddpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstHAddPD, &dst, &src); } //! @brief Packed SP-FP Horizontal Add (SSE3). inline void haddps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstHAddPS, &dst, &src); } //! @brief Packed SP-FP Horizontal Add (SSE3). inline void haddps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstHAddPS, &dst, &src); } //! @brief Packed DP-FP Horizontal Subtract (SSE3). inline void hsubpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstHSubPD, &dst, &src); } //! @brief Packed DP-FP Horizontal Subtract (SSE3). inline void hsubpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstHSubPD, &dst, &src); } //! @brief Packed SP-FP Horizontal Subtract (SSE3). inline void hsubps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstHSubPS, &dst, &src); } //! @brief Packed SP-FP Horizontal Subtract (SSE3). inline void hsubps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstHSubPS, &dst, &src); } //! @brief Load Unaligned Integer 128 Bits (SSE3). inline void lddqu(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstLdDQU, &dst, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Set Up Monitor Address (SSE3). inline void monitor() { _emitInstruction(kX86InstMonitor); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Move One DP-FP and Duplicate (SSE3). inline void movddup(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovDDup, &dst, &src); } //! @brief Move One DP-FP and Duplicate (SSE3). inline void movddup(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovDDup, &dst, &src); } //! @brief Move Packed SP-FP High and Duplicate (SSE3). inline void movshdup(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSHDup, &dst, &src); } //! @brief Move Packed SP-FP High and Duplicate (SSE3). inline void movshdup(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSHDup, &dst, &src); } //! @brief Move Packed SP-FP Low and Duplicate (SSE3). inline void movsldup(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstMovSLDup, &dst, &src); } //! @brief Move Packed SP-FP Low and Duplicate (SSE3). inline void movsldup(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovSLDup, &dst, &src); } #if ASMJIT_NOT_SUPPORTED_BY_COMPILER //! @brief Monitor Wait (SSE3). inline void mwait() { _emitInstruction(kX86InstMWait); } #endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER // -------------------------------------------------------------------------- // [SSSE3] // -------------------------------------------------------------------------- //! @brief Packed SIGN (SSSE3). inline void psignb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignB, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignW, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed SIGN (SSSE3). inline void psignd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPSignD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddW, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add (SSSE3). inline void phaddd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddD, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Add and Saturate (SSSE3). inline void phaddsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHAddSW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubW, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract (SSSE3). inline void phsubd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubD, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Packed Horizontal Subtract and Saturate (SSSE3). inline void phsubsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHSubSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3). inline void pmaddubsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsB, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsW, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Absolute Value (SSSE3). inline void pabsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPAbsD, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Multiply High with Round and Scale (SSSE3). inline void pmulhrsw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulHRSW, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const MmVar& dst, const MmVar& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const MmVar& dst, const Mem& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void pshufb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPShufB, &dst, &src); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const MmVar& dst, const MmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const MmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } //! @brief Packed Shuffle Bytes (SSSE3). inline void palignr(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); } // -------------------------------------------------------------------------- // [SSE4.1] // -------------------------------------------------------------------------- //! @brief Blend Packed DP-FP Values (SSE4.1). inline void blendpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); } //! @brief Blend Packed DP-FP Values (SSE4.1). inline void blendpd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); } //! @brief Blend Packed SP-FP Values (SSE4.1). inline void blendps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); } //! @brief Blend Packed SP-FP Values (SSE4.1). inline void blendps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); } //! @brief Variable Blend Packed DP-FP Values (SSE4.1). inline void blendvpd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstBlendVPD, &dst, &src); } //! @brief Variable Blend Packed DP-FP Values (SSE4.1). inline void blendvpd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstBlendVPD, &dst, &src); } //! @brief Variable Blend Packed SP-FP Values (SSE4.1). inline void blendvps(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstBlendVPS, &dst, &src); } //! @brief Variable Blend Packed SP-FP Values (SSE4.1). inline void blendvps(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstBlendVPS, &dst, &src); } //! @brief Dot Product of Packed DP-FP Values (SSE4.1). inline void dppd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); } //! @brief Dot Product of Packed DP-FP Values (SSE4.1). inline void dppd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); } //! @brief Dot Product of Packed SP-FP Values (SSE4.1). inline void dpps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); } //! @brief Dot Product of Packed SP-FP Values (SSE4.1). inline void dpps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); } //! @brief Extract Packed SP-FP Value (SSE4.1). inline void extractps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); } //! @brief Extract Packed SP-FP Value (SSE4.1). inline void extractps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); } //! @brief Load Double Quadword Non-Temporal Aligned Hint (SSE4.1). inline void movntdqa(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstMovNTDQA, &dst, &src); } //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1). inline void mpsadbw(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); } //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1). inline void mpsadbw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); } //! @brief Pack with Unsigned Saturation (SSE4.1). inline void packusdw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPackUSDW, &dst, &src); } //! @brief Pack with Unsigned Saturation (SSE4.1). inline void packusdw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPackUSDW, &dst, &src); } //! @brief Variable Blend Packed Bytes (SSE4.1). inline void pblendvb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPBlendVB, &dst, &src); } //! @brief Variable Blend Packed Bytes (SSE4.1). inline void pblendvb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPBlendVB, &dst, &src); } //! @brief Blend Packed Words (SSE4.1). inline void pblendw(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); } //! @brief Blend Packed Words (SSE4.1). inline void pblendw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); } //! @brief Compare Packed Qword Data for Equal (SSE4.1). inline void pcmpeqq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); } //! @brief Compare Packed Qword Data for Equal (SSE4.1). inline void pcmpeqq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); } //! @brief Extract Byte (SSE4.1). inline void pextrb(const GpVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); } //! @brief Extract Byte (SSE4.1). inline void pextrb(const Mem& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrd(const GpVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrd(const Mem& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrq(const GpVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); } //! @brief Extract Dword (SSE4.1). inline void pextrq(const Mem& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); } //! @brief Packed Horizontal Word Minimum (SSE4.1). inline void phminposuw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); } //! @brief Packed Horizontal Word Minimum (SSE4.1). inline void phminposuw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); } //! @brief Insert Byte (SSE4.1). inline void pinsrb(const XmmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); } //! @brief Insert Byte (SSE4.1). inline void pinsrb(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrd(const XmmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrq(const XmmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); } //! @brief Insert Dword (SSE4.1). inline void pinsrq(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); } //! @brief Insert Word (SSE2). inline void pinsrw(const XmmVar& dst, const GpVar& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Insert Word (SSE2). inline void pinsrw(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); } //! @brief Maximum of Packed Word Integers (SSE4.1). inline void pmaxuw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxUW, &dst, &src); } //! @brief Maximum of Packed Word Integers (SSE4.1). inline void pmaxuw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUW, &dst, &src); } //! @brief Maximum of Packed Signed Byte Integers (SSE4.1). inline void pmaxsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxSB, &dst, &src); } //! @brief Maximum of Packed Signed Byte Integers (SSE4.1). inline void pmaxsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSB, &dst, &src); } //! @brief Maximum of Packed Signed Dword Integers (SSE4.1). inline void pmaxsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxSD, &dst, &src); } //! @brief Maximum of Packed Signed Dword Integers (SSE4.1). inline void pmaxsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxSD, &dst, &src); } //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1). inline void pmaxud(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMaxUD, &dst, &src); } //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1). inline void pmaxud(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMaxUD, &dst, &src); } //! @brief Minimum of Packed Signed Byte Integers (SSE4.1). inline void pminsb(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinSB, &dst, &src); } //! @brief Minimum of Packed Signed Byte Integers (SSE4.1). inline void pminsb(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinSB, &dst, &src); } //! @brief Minimum of Packed Word Integers (SSE4.1). inline void pminuw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinUW, &dst, &src); } //! @brief Minimum of Packed Word Integers (SSE4.1). inline void pminuw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinUW, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminud(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinUD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminud(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinUD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminsd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMinSD, &dst, &src); } //! @brief Minimum of Packed Dword Integers (SSE4.1). inline void pminsd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMinSD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXBW, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBW, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXBD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxbq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXWD, &dst, &src); } //! @brief Packed Move with Sign Extend (SSE4.1). inline void pmovsxwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXWD, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxwq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxwq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovsxdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbw(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXBW, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbw(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBW, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXBD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxbq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxwd(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXWD, &dst, &src); } //! @brief Packed Move with Zero Extend (SSE4.1). inline void pmovzxwd(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXWD, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxwq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxwq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxdq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); } //! @brief (SSE4.1). inline void pmovzxdq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); } //! @brief Multiply Packed Signed Dword Integers (SSE4.1). inline void pmuldq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulDQ, &dst, &src); } //! @brief Multiply Packed Signed Dword Integers (SSE4.1). inline void pmuldq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulDQ, &dst, &src); } //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1). inline void pmulld(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPMulLD, &dst, &src); } //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1). inline void pmulld(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPMulLD, &dst, &src); } //! @brief Logical Compare (SSE4.1). inline void ptest(const XmmVar& op1, const XmmVar& op2) { _emitInstruction(kX86InstPTest, &op1, &op2); } //! @brief Logical Compare (SSE4.1). inline void ptest(const XmmVar& op1, const Mem& op2) { _emitInstruction(kX86InstPTest, &op1, &op2); } //! Round Packed SP-FP Values @brief (SSE4.1). inline void roundps(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); } //! Round Packed SP-FP Values @brief (SSE4.1). inline void roundps(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); } //! @brief Round Scalar SP-FP Values (SSE4.1). inline void roundss(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); } //! @brief Round Scalar SP-FP Values (SSE4.1). inline void roundss(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); } //! @brief Round Packed DP-FP Values (SSE4.1). inline void roundpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); } //! @brief Round Packed DP-FP Values (SSE4.1). inline void roundpd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); } //! @brief Round Scalar DP-FP Values (SSE4.1). inline void roundsd(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); } //! @brief Round Scalar DP-FP Values (SSE4.1). inline void roundsd(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); } // -------------------------------------------------------------------------- // [SSE4.2] // -------------------------------------------------------------------------- //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2). inline void crc32(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCrc32, &dst, &src); } //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2). inline void crc32(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstCrc32, &dst, &src); } //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2). inline void pcmpestri(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2). inline void pcmpestri(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2). inline void pcmpestrm(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); } //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2). inline void pcmpestrm(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2). inline void pcmpistri(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2). inline void pcmpistri(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2). inline void pcmpistrm(const XmmVar& dst, const XmmVar& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); } //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2). inline void pcmpistrm(const XmmVar& dst, const Mem& src, const Imm& imm8) { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); } //! @brief Compare Packed Data for Greater Than (SSE4.2). inline void pcmpgtq(const XmmVar& dst, const XmmVar& src) { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); } //! @brief Compare Packed Data for Greater Than (SSE4.2). inline void pcmpgtq(const XmmVar& dst, const Mem& src) { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); } //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2). inline void popcnt(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstPopCnt, &dst, &src); } //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2). inline void popcnt(const GpVar& dst, const Mem& src) { _emitInstruction(kX86InstPopCnt, &dst, &src); } // -------------------------------------------------------------------------- // [AMD only] // -------------------------------------------------------------------------- //! @brief Prefetch (3dNow - Amd). //! //! Loads the entire 64-byte aligned memory sequence containing the //! specified memory address into the L1 data cache. The position of //! the specified memory address within the 64-byte cache line is //! irrelevant. If a cache hit occurs, or if a memory fault is detected, //! no bus cycle is initiated and the instruction is treated as a NOP. inline void amd_prefetch(const Mem& mem) { _emitInstruction(kX86InstAmdPrefetch, &mem); } //! @brief Prefetch and set cache to modified (3dNow - Amd). //! //! The PREFETCHW instruction loads the prefetched line and sets the //! cache-line state to Modified, in anticipation of subsequent data //! writes to the line. The PREFETCH instruction, by contrast, typically //! sets the cache-line state to Exclusive (depending on the hardware //! implementation). inline void amd_prefetchw(const Mem& mem) { _emitInstruction(kX86InstAmdPrefetchW, &mem); } // -------------------------------------------------------------------------- // [Intel only] // -------------------------------------------------------------------------- //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom). inline void movbe(const GpVar& dst, const Mem& src) { ASMJIT_ASSERT(!dst.isGpb()); _emitInstruction(kX86InstMovBE, &dst, &src); } //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom). inline void movbe(const Mem& dst, const GpVar& src) { ASMJIT_ASSERT(!src.isGpb()); _emitInstruction(kX86InstMovBE, &dst, &src); } // ------------------------------------------------------------------------- // [Emit Options] // ------------------------------------------------------------------------- //! @brief Assert LOCK# Signal Prefix. //! //! This instruction causes the processor's LOCK# signal to be asserted //! during execution of the accompanying instruction (turns the //! instruction into an atomic instruction). In a multiprocessor environment, //! the LOCK# signal insures that the processor has exclusive use of any shared //! memory while the signal is asserted. //! //! The LOCK prefix can be prepended only to the following instructions and //! to those forms of the instructions that use a memory operand: ADD, ADC, //! AND, BTC, BTR, BTS, CMPXCHG, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, //! and XCHG. An undefined opcode exception will be generated if the LOCK //! prefix is used with any other instruction. The XCHG instruction always //! asserts the LOCK# signal regardless of the presence or absence of the LOCK //! prefix. inline void lock() { _emitOptions |= kX86EmitOptionLock; } //! @brief Force REX prefix to be emitted. //! //! This option should be used carefully, because there are unencodable //! combinations. If you want to access ah, bh, ch or dh registers then you //! can't emit REX prefix and it will cause an illegal instruction error. //! //! @note REX prefix is only valid for X64/AMD64 platform. //! //! @sa @c kX86EmitOptionRex. inline void rex() { _emitOptions |= kX86EmitOptionRex; } }; //! @} } // AsmJit namespace #undef ASMJIT_NOT_SUPPORTED_BY_COMPILER // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86COMPILER_H desmume-0.9.9/src/utils/AsmJit/x86/x86operand.cpp0000644000175000017500000002675312140261626022204 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../x86/x86defs.h" #include "../x86/x86operand.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Registers - no_reg] // ============================================================================ const GpReg no_reg(_Initialize(), kInvalidValue); // ============================================================================ // [AsmJit::Registers - 8-bit] // ============================================================================ const GpReg al(_Initialize(), kX86RegAl); const GpReg cl(_Initialize(), kX86RegCl); const GpReg dl(_Initialize(), kX86RegDl); const GpReg bl(_Initialize(), kX86RegBl); #if defined(ASMJIT_X64) const GpReg spl(_Initialize(), kX86RegSpl); const GpReg bpl(_Initialize(), kX86RegBpl); const GpReg sil(_Initialize(), kX86RegSil); const GpReg dil(_Initialize(), kX86RegDil); const GpReg r8b(_Initialize(), kX86RegR8b); const GpReg r9b(_Initialize(), kX86RegR9b); const GpReg r10b(_Initialize(), kX86RegR10b); const GpReg r11b(_Initialize(), kX86RegR11b); const GpReg r12b(_Initialize(), kX86RegR12b); const GpReg r13b(_Initialize(), kX86RegR13b); const GpReg r14b(_Initialize(), kX86RegR14b); const GpReg r15b(_Initialize(), kX86RegR15b); #endif // ASMJIT_X64 const GpReg ah(_Initialize(), kX86RegAh); const GpReg ch(_Initialize(), kX86RegCh); const GpReg dh(_Initialize(), kX86RegDh); const GpReg bh(_Initialize(), kX86RegBh); // ============================================================================ // [AsmJit::Registers - 16-bit] // ============================================================================ const GpReg ax(_Initialize(), kX86RegAx); const GpReg cx(_Initialize(), kX86RegCx); const GpReg dx(_Initialize(), kX86RegDx); const GpReg bx(_Initialize(), kX86RegBx); const GpReg sp(_Initialize(), kX86RegSp); const GpReg bp(_Initialize(), kX86RegBp); const GpReg si(_Initialize(), kX86RegSi); const GpReg di(_Initialize(), kX86RegDi); #if defined(ASMJIT_X64) const GpReg r8w(_Initialize(), kX86RegR8w); const GpReg r9w(_Initialize(), kX86RegR9w); const GpReg r10w(_Initialize(), kX86RegR10w); const GpReg r11w(_Initialize(), kX86RegR11w); const GpReg r12w(_Initialize(), kX86RegR12w); const GpReg r13w(_Initialize(), kX86RegR13w); const GpReg r14w(_Initialize(), kX86RegR14w); const GpReg r15w(_Initialize(), kX86RegR15w); #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - 32-bit] // ============================================================================ const GpReg eax(_Initialize(), kX86RegEax); const GpReg ecx(_Initialize(), kX86RegEcx); const GpReg edx(_Initialize(), kX86RegEdx); const GpReg ebx(_Initialize(), kX86RegEbx); const GpReg esp(_Initialize(), kX86RegEsp); const GpReg ebp(_Initialize(), kX86RegEbp); const GpReg esi(_Initialize(), kX86RegEsi); const GpReg edi(_Initialize(), kX86RegEdi); #if defined(ASMJIT_X64) const GpReg r8d(_Initialize(), kX86RegR8d); const GpReg r9d(_Initialize(), kX86RegR9d); const GpReg r10d(_Initialize(), kX86RegR10d); const GpReg r11d(_Initialize(), kX86RegR11d); const GpReg r12d(_Initialize(), kX86RegR12d); const GpReg r13d(_Initialize(), kX86RegR13d); const GpReg r14d(_Initialize(), kX86RegR14d); const GpReg r15d(_Initialize(), kX86RegR15d); #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - 64-bit] // ============================================================================ #if defined(ASMJIT_X64) const GpReg rax(_Initialize(), kX86RegRax); const GpReg rcx(_Initialize(), kX86RegRcx); const GpReg rdx(_Initialize(), kX86RegRdx); const GpReg rbx(_Initialize(), kX86RegRbx); const GpReg rsp(_Initialize(), kX86RegRsp); const GpReg rbp(_Initialize(), kX86RegRbp); const GpReg rsi(_Initialize(), kX86RegRsi); const GpReg rdi(_Initialize(), kX86RegRdi); const GpReg r8(_Initialize(), kX86RegR8); const GpReg r9(_Initialize(), kX86RegR9); const GpReg r10(_Initialize(), kX86RegR10); const GpReg r11(_Initialize(), kX86RegR11); const GpReg r12(_Initialize(), kX86RegR12); const GpReg r13(_Initialize(), kX86RegR13); const GpReg r14(_Initialize(), kX86RegR14); const GpReg r15(_Initialize(), kX86RegR15); #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - Native (AsmJit extension)] // ============================================================================ const GpReg zax(_Initialize(), kX86RegZax); const GpReg zcx(_Initialize(), kX86RegZcx); const GpReg zdx(_Initialize(), kX86RegZdx); const GpReg zbx(_Initialize(), kX86RegZbx); const GpReg zsp(_Initialize(), kX86RegZsp); const GpReg zbp(_Initialize(), kX86RegZbp); const GpReg zsi(_Initialize(), kX86RegZsi); const GpReg zdi(_Initialize(), kX86RegZdi); // ============================================================================ // [AsmJit::Registers - MM] // ============================================================================ const MmReg mm0(_Initialize(), kX86RegMm0); const MmReg mm1(_Initialize(), kX86RegMm1); const MmReg mm2(_Initialize(), kX86RegMm2); const MmReg mm3(_Initialize(), kX86RegMm3); const MmReg mm4(_Initialize(), kX86RegMm4); const MmReg mm5(_Initialize(), kX86RegMm5); const MmReg mm6(_Initialize(), kX86RegMm6); const MmReg mm7(_Initialize(), kX86RegMm7); // ============================================================================ // [AsmJit::Registers - XMM] // ============================================================================ const XmmReg xmm0(_Initialize(), kX86RegXmm0); const XmmReg xmm1(_Initialize(), kX86RegXmm1); const XmmReg xmm2(_Initialize(), kX86RegXmm2); const XmmReg xmm3(_Initialize(), kX86RegXmm3); const XmmReg xmm4(_Initialize(), kX86RegXmm4); const XmmReg xmm5(_Initialize(), kX86RegXmm5); const XmmReg xmm6(_Initialize(), kX86RegXmm6); const XmmReg xmm7(_Initialize(), kX86RegXmm7); #if defined(ASMJIT_X64) const XmmReg xmm8(_Initialize(), kX86RegXmm8); const XmmReg xmm9(_Initialize(), kX86RegXmm9); const XmmReg xmm10(_Initialize(), kX86RegXmm10); const XmmReg xmm11(_Initialize(), kX86RegXmm11); const XmmReg xmm12(_Initialize(), kX86RegXmm12); const XmmReg xmm13(_Initialize(), kX86RegXmm13); const XmmReg xmm14(_Initialize(), kX86RegXmm14); const XmmReg xmm15(_Initialize(), kX86RegXmm15); #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::Registers - Segment] // ============================================================================ const SegmentReg cs(_Initialize(), kX86RegCs); const SegmentReg ss(_Initialize(), kX86RegSs); const SegmentReg ds(_Initialize(), kX86RegDs); const SegmentReg es(_Initialize(), kX86RegEs); const SegmentReg fs(_Initialize(), kX86RegFs); const SegmentReg gs(_Initialize(), kX86RegGs); // ============================================================================ // [AsmJit::Var] // ============================================================================ Mem _BaseVarMem(const Var& var, uint32_t size) { Mem m; //(_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = static_cast(size == kInvalidValue ? var.getSize() : size); m._mem.type = kOperandMemNative; m._mem.segment = kX86SegNone; m._mem.sizePrefix = 0; m._mem.shift = 0; m._mem.id = var.getId(); m._mem.base = kInvalidValue; m._mem.index = kInvalidValue; m._mem.target = NULL; m._mem.displacement = 0; return m; } Mem _BaseVarMem(const Var& var, uint32_t size, sysint_t disp) { Mem m; //(_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = static_cast(size == kInvalidValue ? var.getSize() : size); m._mem.type = kOperandMemNative; m._mem.segment = kX86SegNone; m._mem.sizePrefix = 0; m._mem.shift = 0; m._mem.id = var.getId(); m._mem.base = kInvalidValue; m._mem.index = kInvalidValue; m._mem.target = NULL; m._mem.displacement = disp; return m; } Mem _BaseVarMem(const Var& var, uint32_t size, const GpVar& index, uint32_t shift, sysint_t disp) { Mem m; //(_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = static_cast(size == kInvalidValue ? var.getSize() : size); m._mem.type = kOperandMemNative; m._mem.segment = kX86SegNone; m._mem.sizePrefix = 0; m._mem.shift = shift; m._mem.id = var.getId(); m._mem.base = kInvalidValue; m._mem.index = index.getId(); m._mem.target = NULL; m._mem.displacement = disp; return m; } // ============================================================================ // [AsmJit::Mem - ptr[]] // ============================================================================ Mem ptr(const Label& label, sysint_t disp, uint32_t size) { return Mem(label, disp, size); } Mem ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) { Mem m(label, disp, size); m._mem.index = index.getRegIndex(); m._mem.shift = shift; return m; } Mem ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) { Mem m(label, disp, size); m._mem.index = index.getId(); m._mem.shift = shift; return m; } // ============================================================================ // [AsmJit::Mem - ptr[] - Absolute Addressing] // ============================================================================ ASMJIT_API Mem ptr_abs(void* target, sysint_t disp, uint32_t size) { Mem m; m._mem.size = size; m._mem.type = kOperandMemAbsolute; m._mem.segment = kX86SegNone; m._mem.target = target; m._mem.displacement = disp; return m; } ASMJIT_API Mem ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) { Mem m;// (_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = size; m._mem.type = kOperandMemAbsolute; m._mem.segment = kX86SegNone; #if defined(ASMJIT_X86) m._mem.sizePrefix = index.getSize() != 4; #else m._mem.sizePrefix = index.getSize() != 8; #endif m._mem.shift = shift; m._mem.id = kInvalidValue; m._mem.base = kInvalidValue; m._mem.index = index.getRegIndex(); m._mem.target = target; m._mem.displacement = disp; return m; } ASMJIT_API Mem ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) { Mem m;// (_DontInitialize()); m._mem.op = kOperandMem; m._mem.size = size; m._mem.type = kOperandMemAbsolute; m._mem.segment = kX86SegNone; #if defined(ASMJIT_X86) m._mem.sizePrefix = index.getSize() != 4; #else m._mem.sizePrefix = index.getSize() != 8; #endif m._mem.shift = shift; m._mem.id = kInvalidValue; m._mem.base = kInvalidValue; m._mem.index = index.getId(); m._mem.target = target; m._mem.displacement = disp; return m; } // ============================================================================ // [AsmJit::Mem - ptr[base + displacement]] // ============================================================================ Mem ptr(const GpReg& base, sysint_t disp, uint32_t size) { return Mem(base, disp, size); } Mem ptr(const GpReg& base, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) { return Mem(base, index, shift, disp, size); } Mem ptr(const GpVar& base, sysint_t disp, uint32_t size) { return Mem(base, disp, size); } Mem ptr(const GpVar& base, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) { return Mem(base, index, shift, disp, size); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86defs.h0000644000175000017500000022313712140261626021135 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86DEFS_H #define _ASMJIT_X86_X86DEFS_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::kX86Feature] // ============================================================================ //! @brief X86 CPU features. enum kX86Feature { //! @brief Cpu has RDTSC instruction. kX86FeatureRdtsc = 1U << 0, //! @brief Cpu has RDTSCP instruction. kX86FeatureRdtscP = 1U << 1, //! @brief Cpu has CMOV instruction (conditional move) kX86FeatureCMov = 1U << 2, //! @brief Cpu has CMPXCHG8B instruction kX86FeatureCmpXchg8B = 1U << 3, //! @brief Cpu has CMPXCHG16B instruction (64-bit processors) kX86FeatureCmpXchg16B = 1U << 4, //! @brief Cpu has CLFUSH instruction kX86FeatureClFlush = 1U << 5, //! @brief Cpu has PREFETCH instruction kX86FeaturePrefetch = 1U << 6, //! @brief Cpu supports LAHF and SAHF instrictions. kX86FeatureLahfSahf = 1U << 7, //! @brief Cpu supports FXSAVE and FXRSTOR instructions. kX86FeatureFXSR = 1U << 8, //! @brief Cpu supports FXSAVE and FXRSTOR instruction optimizations (FFXSR). kX86FeatureFFXSR = 1U << 9, //! @brief Cpu has MMX. kX86FeatureMmx = 1U << 10, //! @brief Cpu has extended MMX. kX86FeatureMmxExt = 1U << 11, //! @brief Cpu has 3dNow! kX86Feature3dNow = 1U << 12, //! @brief Cpu has enchanced 3dNow! kX86Feature3dNowExt = 1U << 13, //! @brief Cpu has SSE. kX86FeatureSse = 1U << 14, //! @brief Cpu has SSE2. kX86FeatureSse2 = 1U << 15, //! @brief Cpu has SSE3. kX86FeatureSse3 = 1U << 16, //! @brief Cpu has Supplemental SSE3 (SSSE3). kX86FeatureSsse3 = 1U << 17, //! @brief Cpu has SSE4.A. kX86FeatureSse4A = 1U << 18, //! @brief Cpu has SSE4.1. kX86FeatureSse41 = 1U << 19, //! @brief Cpu has SSE4.2. kX86FeatureSse42 = 1U << 20, //! @brief Cpu has AVX. kX86FeatureAvx = 1U << 22, //! @brief Cpu has Misaligned SSE (MSSE). kX86FeatureMSse = 1U << 23, //! @brief Cpu supports MONITOR and MWAIT instructions. kX86FeatureMonitorMWait = 1U << 24, //! @brief Cpu supports MOVBE instruction. kX86FeatureMovBE = 1U << 25, //! @brief Cpu supports POPCNT instruction. kX86FeaturePopCnt = 1U << 26, //! @brief Cpu supports LZCNT instruction. kX86FeatureLzCnt = 1U << 27, //! @brief Cpu supports PCLMULDQ set of instructions. kX86FeaturePclMulDQ = 1U << 28, //! @brief Cpu supports multithreading. kX86FeatureMultiThreading = 1U << 29, //! @brief Cpu supports execute disable bit (execute protection). kX86FeatureExecuteDisableBit = 1U << 30, //! @brief 64-bit CPU. kX86Feature64Bit = 1U << 31 }; // ============================================================================ // [AsmJit::kX86Bug] // ============================================================================ //! @brief X86 CPU bugs. enum kX86Bug { //! @brief Whether the processor contains bug seen in some //! AMD-Opteron processors. kX86BugAmdLockMB = 1U << 0 }; // ============================================================================ // [AsmJit::kX86Property] // ============================================================================ //! @brief @ref X86Assembler and @ref X86Compiler properties. enum kX86Property { //! @brief Optimize align for current processor. //! //! Default: @c true. kX86PropertyOptimizedAlign = 0, //! @brief Emit hints added to jcc() instructions. //! //! Default: @c true. kX86PropertyJumpHints = 1 }; // ============================================================================ // [AsmJit::kX86Seg] // ============================================================================ //! @brief X86 segment codes. enum kX86Seg { // DO NOT MODIFY INDEX CODES - They are used by _emitSegmentPrefix() and // by logger in the following order: //! @brief ES segment. kX86SegEs = 0, //! @brief CS segment. kX86SegCs = 1, //! @brief SS segment. kX86SegSs = 2, //! @brief DS segment. kX86SegDs = 3, //! @brief FS segment. kX86SegFs = 4, //! @brief GS segment. kX86SegGs = 5, //! @brief Count of segments. kX86SegCount = 6, //! @brief No segment override prefix. kX86SegNone = 0xF }; // ============================================================================ // [AsmJit::kX86RegNum] // ============================================================================ //! @brief X86 registers count. //! //! Count of general purpose registers and XMM registers depends on current //! mode. If application is compiled for 32-bit platform then this number is 8, //! 64-bit platforms have 8 extra general purpose and XMM registers (16 total). enum kX86RegNum { //! @var kX86RegNumBase //! //! Count of general purpose registers and XMM registers depends on current //! bit-mode. If application is compiled for 32-bit platform then this number //! is 8, 64-bit platforms have 8 extra general purpose and XMM registers (16 //! total). #if defined(ASMJIT_X86) kX86RegNumBase = 8, #else kX86RegNumBase = 16, #endif // ASMJIT //! @brief Count of general purpose registers. //! //! 8 in 32-bit mode and 16 in 64-bit mode. kX86RegNumGp = kX86RegNumBase, //! @brief Count of FPU stack registers (always 8). kX86RegNumX87 = 8, //! @brief Count of MM registers (always 8). kX86RegNumMm = 8, //! @brief Count of XMM registers. //! //! 8 in 32-bit mode and 16 in 64-bit mode. kX86RegNumXmm = kX86RegNumBase, //! @brief Count of YMM registers. //! //! 8 in 32-bit mode and 16 in 64-bit mode. kX86RegNumYmm = kX86RegNumBase, //! @brief Count of segment registers, including no segment (AsmJit specific). //! //! @note There are 6 segment registers, but AsmJit uses 0 as no segment, and //! 1...6 as segment registers, this means that there are 7 segment registers //! in AsmJit API, but only 6 can be used through @c Assembler or @c Compiler //! API. kX86RegNumSeg = 7 }; //! @brief X86 register types. enum kX86RegType { // First byte contains register type (mask 0xFF00), Second byte contains // register index code. // -------------------------------------------------------------------------- // [GP Register Types] // -------------------------------------------------------------------------- //! @brief 8-bit general purpose register type (LO). kX86RegTypeGpbLo = 0x0100, //! @brief 8-bit general purpose register type (HI, only AH, BH, CH, DH). kX86RegTypeGpbHi = 0x0200, //! @brief 16-bit general purpose register type. kX86RegTypeGpw = 0x1000, //! @brief 32-bit general purpose register type. kX86RegTypeGpd = 0x2000, //! @brief 64-bit general purpose register type. kX86RegTypeGpq = 0x3000, //! @var kX86RegTypeGpz //! @brief 32-bit or 64-bit general purpose register type. #if defined(ASMJIT_X86) kX86RegTypeGpz = kX86RegTypeGpd, #else kX86RegTypeGpz = kX86RegTypeGpq, #endif //! @brief X87 (FPU) register type. kX86RegTypeX87 = 0x5000, //! @brief 64-bit MM register type. kX86RegTypeMm = 0x6000, //! @brief 128-bit XMM register type. kX86RegTypeXmm = 0x7000, //! @brief 256-bit YMM register type. kX86RegTypeYmm = 0x8000, //! @brief 16-bit segment register type. kX86RegTypeSeg = 0xD000 }; // ============================================================================ // [AsmJit::kX86RegIndex] // ============================================================================ //! @brief X86 register indices. //! //! These codes are real, don't miss with @c REG enum! and don't use these //! values if you are not writing AsmJit code. enum kX86RegIndex { //! @brief ID for AX/EAX/RAX registers. kX86RegIndexEax = 0, //! @brief ID for CX/ECX/RCX registers. kX86RegIndexEcx = 1, //! @brief ID for DX/EDX/RDX registers. kX86RegIndexEdx = 2, //! @brief ID for BX/EBX/RBX registers. kX86RegIndexEbx = 3, //! @brief ID for SP/ESP/RSP registers. kX86RegIndexEsp = 4, //! @brief ID for BP/EBP/RBP registers. kX86RegIndexEbp = 5, //! @brief ID for SI/ESI/RSI registers. kX86RegIndexEsi = 6, //! @brief ID for DI/EDI/RDI registers. kX86RegIndexEdi = 7, //! @brief ID for AX/EAX/RAX registers. kX86RegIndexRax = 0, //! @brief ID for CX/ECX/RCX registers. kX86RegIndexRcx = 1, //! @brief ID for DX/EDX/RDX registers. kX86RegIndexRdx = 2, //! @brief ID for BX/EBX/RBX registers. kX86RegIndexRbx = 3, //! @brief ID for SP/ESP/RSP registers. kX86RegIndexRsp = 4, //! @brief ID for BP/EBP/RBP registers. kX86RegIndexRbp = 5, //! @brief ID for SI/ESI/RSI registers. kX86RegIndexRsi = 6, //! @brief ID for DI/EDI/RDI registers. kX86RegIndexRdi = 7, //! @brief ID for r8 register (additional register introduced by 64-bit architecture). kX86RegIndexR8 = 8, //! @brief ID for R9 register (additional register introduced by 64-bit architecture). kX86RegIndexR9 = 9, //! @brief ID for R10 register (additional register introduced by 64-bit architecture). kX86RegIndexR10 = 10, //! @brief ID for R11 register (additional register introduced by 64-bit architecture). kX86RegIndexR11 = 11, //! @brief ID for R12 register (additional register introduced by 64-bit architecture). kX86RegIndexR12 = 12, //! @brief ID for R13 register (additional register introduced by 64-bit architecture). kX86RegIndexR13 = 13, //! @brief ID for R14 register (additional register introduced by 64-bit architecture). kX86RegIndexR14 = 14, //! @brief ID for R15 register (additional register introduced by 64-bit architecture). kX86RegIndexR15 = 15, //! @brief ID for mm0 register. kX86RegIndexMm0 = 0, //! @brief ID for mm1 register. kX86RegIndexMm1 = 1, //! @brief ID for mm2 register. kX86RegIndexMm2 = 2, //! @brief ID for mm3 register. kX86RegIndexMm3 = 3, //! @brief ID for mm4 register. kX86RegIndexMm4 = 4, //! @brief ID for mm5 register. kX86RegIndexMm5 = 5, //! @brief ID for mm6 register. kX86RegIndexMm6 = 6, //! @brief ID for mm7 register. kX86RegIndexMm7 = 7, //! @brief ID for xmm0 register. kX86RegIndexXmm0 = 0, //! @brief ID for xmm1 register. kX86RegIndexXmm1 = 1, //! @brief ID for xmm2 register. kX86RegIndexXmm2 = 2, //! @brief ID for xmm3 register. kX86RegIndexXmm3 = 3, //! @brief ID for xmm4 register. kX86RegIndexXmm4 = 4, //! @brief ID for xmm5 register. kX86RegIndexXmm5 = 5, //! @brief ID for xmm6 register. kX86RegIndexXmm6 = 6, //! @brief ID for xmm7 register. kX86RegIndexXmm7 = 7, //! @brief ID for xmm8 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm8 = 8, //! @brief ID for xmm9 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm9 = 9, //! @brief ID for xmm10 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm10 = 10, //! @brief ID for xmm11 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm11 = 11, //! @brief ID for xmm12 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm12 = 12, //! @brief ID for xmm13 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm13 = 13, //! @brief ID for xmm14 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm14 = 14, //! @brief ID for xmm15 register (additional register introduced by 64-bit architecture). kX86RegIndexXmm15 = 15, //! @brief ID for ES segment register. kX86RegIndexEs = 0, //! @brief ID for CS segment register. kX86RegIndexCs = 1, //! @brief ID for SS segment register. kX86RegIndexSs = 2, //! @brief ID for DS segment register. kX86RegIndexDs = 3, //! @brief ID for FS segment register. kX86RegIndexFs = 4, //! @brief ID for GS segment register. kX86RegIndexGs = 5 }; // ============================================================================ // [AsmJit::kX86RegCode] // ============================================================================ //! @brief X86 pseudo (not real X86) register codes used for generating opcodes. //! //! From this register code can be generated real x86 register ID, type of //! register and size of register. enum kX86RegCode { // -------------------------------------------------------------------------- // [8-bit Registers] // -------------------------------------------------------------------------- kX86RegAl = kX86RegTypeGpbLo, kX86RegCl, kX86RegDl, kX86RegBl, #if defined(ASMJIT_X64) kX86RegSpl, kX86RegBpl, kX86RegSil, kX86RegDil, #endif // ASMJIT_X64 #if defined(ASMJIT_X64) kX86RegR8b, kX86RegR9b, kX86RegR10b, kX86RegR11b, kX86RegR12b, kX86RegR13b, kX86RegR14b, kX86RegR15b, #endif // ASMJIT_X64 kX86RegAh = kX86RegTypeGpbHi, kX86RegCh, kX86RegDh, kX86RegBh, // -------------------------------------------------------------------------- // [16-bit Registers] // -------------------------------------------------------------------------- kX86RegAx = kX86RegTypeGpw, kX86RegCx, kX86RegDx, kX86RegBx, kX86RegSp, kX86RegBp, kX86RegSi, kX86RegDi, #if defined(ASMJIT_X64) kX86RegR8w, kX86RegR9w, kX86RegR10w, kX86RegR11w, kX86RegR12w, kX86RegR13w, kX86RegR14w, kX86RegR15w, #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [32-bit Registers] // -------------------------------------------------------------------------- kX86RegEax = kX86RegTypeGpd, kX86RegEcx, kX86RegEdx, kX86RegEbx, kX86RegEsp, kX86RegEbp, kX86RegEsi, kX86RegEdi, #if defined(ASMJIT_X64) kX86RegR8d, kX86RegR9d, kX86RegR10d, kX86RegR11d, kX86RegR12d, kX86RegR13d, kX86RegR14d, kX86RegR15d, #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [64-bit Registers] // -------------------------------------------------------------------------- #if defined(ASMJIT_X64) kX86RegRax = kX86RegTypeGpq, kX86RegRcx, kX86RegRdx, kX86RegRbx, kX86RegRsp, kX86RegRbp, kX86RegRsi, kX86RegRdi, kX86RegR8, kX86RegR9, kX86RegR10, kX86RegR11, kX86RegR12, kX86RegR13, kX86RegR14, kX86RegR15, #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [MM Registers] // -------------------------------------------------------------------------- kX86RegMm0 = kX86RegTypeMm, kX86RegMm1, kX86RegMm2, kX86RegMm3, kX86RegMm4, kX86RegMm5, kX86RegMm6, kX86RegMm7, // -------------------------------------------------------------------------- // [XMM Registers] // -------------------------------------------------------------------------- kX86RegXmm0 = kX86RegTypeXmm, kX86RegXmm1, kX86RegXmm2, kX86RegXmm3, kX86RegXmm4, kX86RegXmm5, kX86RegXmm6, kX86RegXmm7, #if defined(ASMJIT_X64) kX86RegXmm8, kX86RegXmm9, kX86RegXmm10, kX86RegXmm11, kX86RegXmm12, kX86RegXmm13, kX86RegXmm14, kX86RegXmm15, #endif // ASMJIT_X64 // -------------------------------------------------------------------------- // [Native registers (depends on 32-bit or 64-bit mode)] // -------------------------------------------------------------------------- kX86RegZax = kX86RegTypeGpz, kX86RegZcx, kX86RegZdx, kX86RegZbx, kX86RegZsp, kX86RegZbp, kX86RegZsi, kX86RegZdi, // -------------------------------------------------------------------------- // [Segment registers] // -------------------------------------------------------------------------- //! @brief ES segment register. kX86RegEs = kX86RegTypeSeg, //! @brief CS segment register. kX86RegCs, //! @brief SS segment register. kX86RegSs, //! @brief DS segment register. kX86RegDs, //! @brief FS segment register. kX86RegFs, //! @brief GS segment register. kX86RegGs }; // ============================================================================ // [AsmJit::kX86Cond] // ============================================================================ //! @brief X86 Condition codes. enum kX86Cond { // Condition codes from processor manuals. kX86CondA = 0x07, kX86CondAE = 0x03, kX86CondB = 0x02, kX86CondBE = 0x06, kX86CondC = 0x02, kX86CondE = 0x04, kX86CondG = 0x0F, kX86CondGE = 0x0D, kX86CondL = 0x0C, kX86CondLE = 0x0E, kX86CondNA = 0x06, kX86CondNAE = 0x02, kX86CondNB = 0x03, kX86CondNBE = 0x07, kX86CondNC = 0x03, kX86CondNE = 0x05, kX86CondNG = 0x0E, kX86CondNGE = 0x0C, kX86CondNL = 0x0D, kX86CondNLE = 0x0F, kX86CondNO = 0x01, kX86CondNP = 0x0B, kX86CondNS = 0x09, kX86CondNZ = 0x05, kX86CondO = 0x00, kX86CondP = 0x0A, kX86CondPE = 0x0A, kX86CondPO = 0x0B, kX86CondS = 0x08, kX86CondZ = 0x04, // Simplified condition codes. kX86CondOverflow = 0x00, kX86CondNotOverflow = 0x01, kX86CondBelow = 0x02, kX86CondAboveEqual = 0x03, kX86CondEqual = 0x04, kX86CondNotEqual = 0x05, kX86CondBelowEqual = 0x06, kX86CondAbove = 0x07, kX86CondSign = 0x08, kX86CondNotSign = 0x09, kX86CondParityEven = 0x0A, kX86CondParityOdd = 0x0B, kX86CondLess = 0x0C, kX86CondGreaterEqual = 0x0D, kX86CondLessEqual = 0x0E, kX86CondGreater = 0x0F, // Aliases. kX86CondZero = 0x04, kX86CondNotZero = 0x05, kX86CondNegative = 0x08, kX86CondPositive = 0x09, // X87 floating point only. kX86CondFpuUnordered = 0x10, kX86CondFpuNotUnordered = 0x11, //! @brief No condition code. kX86CondNone = 0x12 }; // ============================================================================ // [AsmJit::kX86CondPrefix] // ============================================================================ //! @brief X86 condition hint prefix code, see @ref kCondHint. enum kX86CondPrefix { //! @brief Condition is likely to be taken. kX86CondPrefixLikely = 0x3E, //! @brief Condition is unlikely to be taken. kX86CondPrefixUnlikely = 0x2E }; // ============================================================================ // [AsmJit::kX86PrefetchHint] // ============================================================================ //! @brief X86 Prefetch hints. enum kX86PrefetchHint { //! @brief Prefetch using NT hint. kX86PrefetchNta = 0, //! @brief Prefetch to L0 cache. kX86PrefetchT0 = 1, //! @brief Prefetch to L1 cache. kX86PrefetchT1 = 2, //! @brief Prefetch to L2 cache. kX86PrefetchT2 = 3 }; // ============================================================================ // [AsmJit::kX86FPSW] // ============================================================================ //! @brief X86 FPU status-word. enum kX86FPSW { kX86FPSW_Invalid = 0x0001, kX86FPSW_Denormalized = 0x0002, kX86FPSW_DivByZero = 0x0004, kX86FPSW_Overflow = 0x0008, kX86FPSW_Underflow = 0x0010, kX86FPSW_Precision = 0x0020, kX86FPSW_StackFault = 0x0040, kX86FPSW_Interrupt = 0x0080, kX86FPSW_C0 = 0x0100, kX86FPSW_C1 = 0x0200, kX86FPSW_C2 = 0x0400, kX86FPSW_Top = 0x3800, kX86FPSW_C3 = 0x4000, kX86FPSW_Busy = 0x8000 }; // ============================================================================ // [AsmJit::kX86FPCW] // ============================================================================ //! @brief X86 FPU control-word. enum kX86FPCW { // -------------------------------------------------------------------------- // [Exception-Mask] // -------------------------------------------------------------------------- kX86FPCW_EM_Mask = 0x003F, // Bits 0-5. kX86FPCW_EM_Invalid = 0x0001, kX86FPCW_EM_Denormal = 0x0002, kX86FPCW_EM_DivByZero = 0x0004, kX86FPCW_EM_Overflow = 0x0008, kX86FPCW_EM_Underflow = 0x0010, kX86FPCW_EM_Inexact = 0x0020, // -------------------------------------------------------------------------- // [Precision-Control] // -------------------------------------------------------------------------- kX86FPCW_PC_Mask = 0x0300, // Bits 8-9. kX86FPCW_PC_Float = 0x0000, kX86FPCW_PC_Reserved = 0x0100, kX86FPCW_PC_Double = 0x0200, kX86FPCW_PC_Extended = 0x0300, // -------------------------------------------------------------------------- // [Rounding-Control] // -------------------------------------------------------------------------- kX86FPCW_RC_Mask = 0x0C00, // Bits 10-11. kX86FPCW_RC_Nearest = 0x0000, kX86FPCW_RC_Down = 0x0400, kX86FPCW_RC_Up = 0x0800, kX86FPCW_RC_Truncate = 0x0C00, // -------------------------------------------------------------------------- // [Infinity-Control] // -------------------------------------------------------------------------- kX86FPCW_IC_Mask = 0x1000, // Bit 12. kX86FPCW_IC_Projective = 0x0000, kX86FPCW_IC_Affine = 0x1000 }; // ============================================================================ // [AsmJit::kX86EmitOption] // ============================================================================ //! @brief Emit options, mainly for internal purposes. enum kX86EmitOption { //! @brief Force REX prefix to be emitted. //! //! This option should be used carefully, because there are unencodable //! combinations. If you want to access ah, bh, ch or dh registers then you //! can't emit REX prefix and it will cause an illegal instruction error. kX86EmitOptionRex = 0x1, //! @brief Tell @c Assembler or @c Compiler to emit and validate lock prefix. //! //! If this option is used and instruction doesn't support LOCK prefix then //! invalid instruction error is generated. kX86EmitOptionLock = 0x2, //! @brief Emit short/near jump or conditional jump instead of far one to //! some bytes. //! //! @note This option could be dangerous in case that the short jump is not //! possible (displacement can't fit into signed 8-bit integer). AsmJit can //! automatically generate back short jumps, but always generates long forward //! jumps, because the information about the code size between the instruction //! and target is not known. kX86EmitOptionShortJump = 0x4, //! @brief Emit full immediate instead of BYTE in all cases. //! //! @note AsmJit is able to emit both forms of immediate value. In case that //! the instruction supports short form and immediate can fit into a signed //! 8-bit integer short for is preferred, but if for any reason the full form //! is required it can be overridden by using this option. kX86EmitOptionFullImmediate = 0x8 }; // ============================================================================ // [AsmJit::kX86InstCode] // ============================================================================ //! @brief X86 instruction codes. //! //! Note that these instruction codes are AsmJit specific. Each instruction is //! unique ID into AsmJit instruction table. Instruction codes are used together //! with AsmJit::Assembler and you can also use instruction codes to serialize //! instructions by @ref Assembler::_emitInstruction() or //! @ref Compiler::_emitInstruction() enum kX86InstCode { kX86InstAdc = 1, // X86/X64 kX86InstAdd, // X86/X64 kX86InstAddPD, // SSE2 kX86InstAddPS, // SSE kX86InstAddSD, // SSE2 kX86InstAddSS, // SSE kX86InstAddSubPD, // SSE3 kX86InstAddSubPS, // SSE3 kX86InstAmdPrefetch, // 3dNow! kX86InstAmdPrefetchW, // 3dNow! kX86InstAnd, // X86/X64 kX86InstAndnPD, // SSE2 kX86InstAndnPS, // SSE kX86InstAndPD, // SSE2 kX86InstAndPS, // SSE kX86InstBlendPD, // SSE4.1 kX86InstBlendPS, // SSE4.1 kX86InstBlendVPD, // SSE4.1 kX86InstBlendVPS, // SSE4.1 kX86InstBsf, // X86/X64 kX86InstBsr, // X86/X64 kX86InstBSwap, // X86/X64 (i486) kX86InstBt, // X86/X64 kX86InstBtc, // X86/X64 kX86InstBtr, // X86/X64 kX86InstBts, // X86/X64 kX86InstCall, // X86/X64 kX86InstCbw, // X86/X64 kX86InstCdq, // X86/X64 kX86InstCdqe, // X64 only kX86InstClc, // X86/X64 kX86InstCld, // X86/X64 kX86InstClFlush, // SSE2 kX86InstCmc, // X86/X64 kX86InstCMov, // Begin (cmovcc) (i586) kX86InstCMovA=kX86InstCMov,//X86/X64 (cmovcc) (i586) kX86InstCMovAE, // X86/X64 (cmovcc) (i586) kX86InstCMovB, // X86/X64 (cmovcc) (i586) kX86InstCMovBE, // X86/X64 (cmovcc) (i586) kX86InstCMovC, // X86/X64 (cmovcc) (i586) kX86InstCMovE, // X86/X64 (cmovcc) (i586) kX86InstCMovG, // X86/X64 (cmovcc) (i586) kX86InstCMovGE, // X86/X64 (cmovcc) (i586) kX86InstCMovL, // X86/X64 (cmovcc) (i586) kX86InstCMovLE, // X86/X64 (cmovcc) (i586) kX86InstCMovNA, // X86/X64 (cmovcc) (i586) kX86InstCMovNAE, // X86/X64 (cmovcc) (i586) kX86InstCMovNB, // X86/X64 (cmovcc) (i586) kX86InstCMovNBE, // X86/X64 (cmovcc) (i586) kX86InstCMovNC, // X86/X64 (cmovcc) (i586) kX86InstCMovNE, // X86/X64 (cmovcc) (i586) kX86InstCMovNG, // X86/X64 (cmovcc) (i586) kX86InstCMovNGE, // X86/X64 (cmovcc) (i586) kX86InstCMovNL, // X86/X64 (cmovcc) (i586) kX86InstCMovNLE, // X86/X64 (cmovcc) (i586) kX86InstCMovNO, // X86/X64 (cmovcc) (i586) kX86InstCMovNP, // X86/X64 (cmovcc) (i586) kX86InstCMovNS, // X86/X64 (cmovcc) (i586) kX86InstCMovNZ, // X86/X64 (cmovcc) (i586) kX86InstCMovO, // X86/X64 (cmovcc) (i586) kX86InstCMovP, // X86/X64 (cmovcc) (i586) kX86InstCMovPE, // X86/X64 (cmovcc) (i586) kX86InstCMovPO, // X86/X64 (cmovcc) (i586) kX86InstCMovS, // X86/X64 (cmovcc) (i586) kX86InstCMovZ, // X86/X64 (cmovcc) (i586) kX86InstCmp, // X86/X64 kX86InstCmpPD, // SSE2 kX86InstCmpPS, // SSE kX86InstCmpSD, // SSE2 kX86InstCmpSS, // SSE kX86InstCmpXCHG, // X86/X64 (i486) kX86InstCmpXCHG16B, // X64 only kX86InstCmpXCHG8B, // X86/X64 (i586) kX86InstComISD, // SSE2 kX86InstComISS, // SSE kX86InstCpuId, // X86/X64 (i486) kX86InstCqo, // X64 only kX86InstCrc32, // SSE4.2 kX86InstCvtDQ2PD, // SSE2 kX86InstCvtDQ2PS, // SSE2 kX86InstCvtPD2DQ, // SSE2 kX86InstCvtPD2PI, // SSE2 kX86InstCvtPD2PS, // SSE2 kX86InstCvtPI2PD, // SSE2 kX86InstCvtPI2PS, // SSE kX86InstCvtPS2DQ, // SSE2 kX86InstCvtPS2PD, // SSE2 kX86InstCvtPS2PI, // SSE kX86InstCvtSD2SI, // SSE2 kX86InstCvtSD2SS, // SSE2 kX86InstCvtSI2SD, // SSE2 kX86InstCvtSI2SS, // SSE kX86InstCvtSS2SD, // SSE2 kX86InstCvtSS2SI, // SSE kX86InstCvttPD2DQ, // SSE2 kX86InstCvttPD2PI, // SSE2 kX86InstCvttPS2DQ, // SSE2 kX86InstCvttPS2PI, // SSE kX86InstCvttSD2SI, // SSE2 kX86InstCvttSS2SI, // SSE kX86InstCwd, // X86/X64 kX86InstCwde, // X86/X64 kX86InstDaa, // X86 only kX86InstDas, // X86 only kX86InstDec, // X86/X64 kX86InstDiv, // X86/X64 kX86InstDivPD, // SSE2 kX86InstDivPS, // SSE kX86InstDivSD, // SSE2 kX86InstDivSS, // SSE kX86InstDpPD, // SSE4.1 kX86InstDpPS, // SSE4.1 kX86InstEmms, // MMX kX86InstEnter, // X86/X64 kX86InstExtractPS, // SSE4.1 kX86InstF2XM1, // X87 kX86InstFAbs, // X87 kX86InstFAdd, // X87 kX86InstFAddP, // X87 kX86InstFBLd, // X87 kX86InstFBStP, // X87 kX86InstFCHS, // X87 kX86InstFClex, // X87 kX86InstFCMovB, // X87 kX86InstFCMovBE, // X87 kX86InstFCMovE, // X87 kX86InstFCMovNB, // X87 kX86InstFCMovNBE, // X87 kX86InstFCMovNE, // X87 kX86InstFCMovNU, // X87 kX86InstFCMovU, // X87 kX86InstFCom, // X87 kX86InstFComI, // X87 kX86InstFComIP, // X87 kX86InstFComP, // X87 kX86InstFComPP, // X87 kX86InstFCos, // X87 kX86InstFDecStP, // X87 kX86InstFDiv, // X87 kX86InstFDivP, // X87 kX86InstFDivR, // X87 kX86InstFDivRP, // X87 kX86InstFEmms, // 3dNow! kX86InstFFree, // X87 kX86InstFIAdd, // X87 kX86InstFICom, // X87 kX86InstFIComP, // X87 kX86InstFIDiv, // X87 kX86InstFIDivR, // X87 kX86InstFILd, // X87 kX86InstFIMul, // X87 kX86InstFIncStP, // X87 kX86InstFInit, // X87 kX86InstFISt, // X87 kX86InstFIStP, // X87 kX86InstFISttP, // SSE3 kX86InstFISub, // X87 kX86InstFISubR, // X87 kX86InstFLd, // X87 kX86InstFLd1, // X87 kX86InstFLdCw, // X87 kX86InstFLdEnv, // X87 kX86InstFLdL2E, // X87 kX86InstFLdL2T, // X87 kX86InstFLdLg2, // X87 kX86InstFLdLn2, // X87 kX86InstFLdPi, // X87 kX86InstFLdZ, // X87 kX86InstFMul, // X87 kX86InstFMulP, // X87 kX86InstFNClex, // X87 kX86InstFNInit, // X87 kX86InstFNop, // X87 kX86InstFNSave, // X87 kX86InstFNStCw, // X87 kX86InstFNStEnv, // X87 kX86InstFNStSw, // X87 kX86InstFPAtan, // X87 kX86InstFPRem, // X87 kX86InstFPRem1, // X87 kX86InstFPTan, // X87 kX86InstFRndInt, // X87 kX86InstFRstor, // X87 kX86InstFSave, // X87 kX86InstFScale, // X87 kX86InstFSin, // X87 kX86InstFSinCos, // X87 kX86InstFSqrt, // X87 kX86InstFSt, // X87 kX86InstFStCw, // X87 kX86InstFStEnv, // X87 kX86InstFStP, // X87 kX86InstFStSw, // X87 kX86InstFSub, // X87 kX86InstFSubP, // X87 kX86InstFSubR, // X87 kX86InstFSubRP, // X87 kX86InstFTst, // X87 kX86InstFUCom, // X87 kX86InstFUComI, // X87 kX86InstFUComIP, // X87 kX86InstFUComP, // X87 kX86InstFUComPP, // X87 kX86InstFWait, // X87 kX86InstFXam, // X87 kX86InstFXch, // X87 kX86InstFXRstor, // X87 kX86InstFXSave, // X87 kX86InstFXtract, // X87 kX86InstFYL2X, // X87 kX86InstFYL2XP1, // X87 kX86InstHAddPD, // SSE3 kX86InstHAddPS, // SSE3 kX86InstHSubPD, // SSE3 kX86InstHSubPS, // SSE3 kX86InstIDiv, // X86/X64 kX86InstIMul, // X86/X64 kX86InstInc, // X86/X64 kX86InstInt3, // X86/X64 kX86InstJ, // Begin (jcc) kX86InstJA = kX86InstJ, // X86/X64 (jcc) kX86InstJAE, // X86/X64 (jcc) kX86InstJB, // X86/X64 (jcc) kX86InstJBE, // X86/X64 (jcc) kX86InstJC, // X86/X64 (jcc) kX86InstJE, // X86/X64 (jcc) kX86InstJG, // X86/X64 (jcc) kX86InstJGE, // X86/X64 (jcc) kX86InstJL, // X86/X64 (jcc) kX86InstJLE, // X86/X64 (jcc) kX86InstJNA, // X86/X64 (jcc) kX86InstJNAE, // X86/X64 (jcc) kX86InstJNB, // X86/X64 (jcc) kX86InstJNBE, // X86/X64 (jcc) kX86InstJNC, // X86/X64 (jcc) kX86InstJNE, // X86/X64 (jcc) kX86InstJNG, // X86/X64 (jcc) kX86InstJNGE, // X86/X64 (jcc) kX86InstJNL, // X86/X64 (jcc) kX86InstJNLE, // X86/X64 (jcc) kX86InstJNO, // X86/X64 (jcc) kX86InstJNP, // X86/X64 (jcc) kX86InstJNS, // X86/X64 (jcc) kX86InstJNZ, // X86/X64 (jcc) kX86InstJO, // X86/X64 (jcc) kX86InstJP, // X86/X64 (jcc) kX86InstJPE, // X86/X64 (jcc) kX86InstJPO, // X86/X64 (jcc) kX86InstJS, // X86/X64 (jcc) kX86InstJZ, // X86/X64 (jcc) kX86InstJmp, // X86/X64 (jmp) kX86InstLdDQU, // SSE3 kX86InstLdMXCSR, // SSE kX86InstLahf, // X86/X64 (CPUID NEEDED) kX86InstLea, // X86/X64 kX86InstLeave, // X86/X64 kX86InstLFence, // SSE2 kX86InstMaskMovDQU, // SSE2 kX86InstMaskMovQ, // MMX-Ext kX86InstMaxPD, // SSE2 kX86InstMaxPS, // SSE kX86InstMaxSD, // SSE2 kX86InstMaxSS, // SSE kX86InstMFence, // SSE2 kX86InstMinPD, // SSE2 kX86InstMinPS, // SSE kX86InstMinSD, // SSE2 kX86InstMinSS, // SSE kX86InstMonitor, // SSE3 kX86InstMov, // X86/X64 kX86InstMovAPD, // SSE2 kX86InstMovAPS, // SSE kX86InstMovBE, // SSE3 - Intel-Atom kX86InstMovD, // MMX/SSE2 kX86InstMovDDup, // SSE3 kX86InstMovDQ2Q, // SSE2 kX86InstMovDQA, // SSE2 kX86InstMovDQU, // SSE2 kX86InstMovHLPS, // SSE kX86InstMovHPD, // SSE2 kX86InstMovHPS, // SSE kX86InstMovLHPS, // SSE kX86InstMovLPD, // SSE2 kX86InstMovLPS, // SSE kX86InstMovMskPD, // SSE2 kX86InstMovMskPS, // SSE2 kX86InstMovNTDQ, // SSE2 kX86InstMovNTDQA, // SSE4.1 kX86InstMovNTI, // SSE2 kX86InstMovNTPD, // SSE2 kX86InstMovNTPS, // SSE kX86InstMovNTQ, // MMX-Ext kX86InstMovQ, // MMX/SSE/SSE2 kX86InstMovQ2DQ, // SSE2 kX86InstMovSD, // SSE2 kX86InstMovSHDup, // SSE3 kX86InstMovSLDup, // SSE3 kX86InstMovSS, // SSE kX86InstMovSX, // X86/X64 kX86InstMovSXD, // X86/X64 kX86InstMovUPD, // SSE2 kX86InstMovUPS, // SSE kX86InstMovZX, // X86/X64 kX86InstMovPtr, // X86/X64 kX86InstMPSADBW, // SSE4.1 kX86InstMul, // X86/X64 kX86InstMulPD, // SSE2 kX86InstMulPS, // SSE kX86InstMulSD, // SSE2 kX86InstMulSS, // SSE kX86InstMWait, // SSE3 kX86InstNeg, // X86/X64 kX86InstNop, // X86/X64 kX86InstNot, // X86/X64 kX86InstOr, // X86/X64 kX86InstOrPD, // SSE2 kX86InstOrPS, // SSE kX86InstPAbsB, // SSSE3 kX86InstPAbsD, // SSSE3 kX86InstPAbsW, // SSSE3 kX86InstPackSSDW, // MMX/SSE2 kX86InstPackSSWB, // MMX/SSE2 kX86InstPackUSDW, // SSE4.1 kX86InstPackUSWB, // MMX/SSE2 kX86InstPAddB, // MMX/SSE2 kX86InstPAddD, // MMX/SSE2 kX86InstPAddQ, // SSE2 kX86InstPAddSB, // MMX/SSE2 kX86InstPAddSW, // MMX/SSE2 kX86InstPAddUSB, // MMX/SSE2 kX86InstPAddUSW, // MMX/SSE2 kX86InstPAddW, // MMX/SSE2 kX86InstPAlignR, // SSSE3 kX86InstPAnd, // MMX/SSE2 kX86InstPAndN, // MMX/SSE2 kX86InstPause, // SSE2. kX86InstPAvgB, // MMX-Ext kX86InstPAvgW, // MMX-Ext kX86InstPBlendVB, // SSE4.1 kX86InstPBlendW, // SSE4.1 kX86InstPCmpEqB, // MMX/SSE2 kX86InstPCmpEqD, // MMX/SSE2 kX86InstPCmpEqQ, // SSE4.1 kX86InstPCmpEqW, // MMX/SSE2 kX86InstPCmpEStrI, // SSE4.2 kX86InstPCmpEStrM, // SSE4.2 kX86InstPCmpGtB, // MMX/SSE2 kX86InstPCmpGtD, // MMX/SSE2 kX86InstPCmpGtQ, // SSE4.2 kX86InstPCmpGtW, // MMX/SSE2 kX86InstPCmpIStrI, // SSE4.2 kX86InstPCmpIStrM, // SSE4.2 kX86InstPExtrB, // SSE4.1 kX86InstPExtrD, // SSE4.1 kX86InstPExtrQ, // SSE4.1 kX86InstPExtrW, // MMX-Ext/SSE2 kX86InstPF2ID, // 3dNow! kX86InstPF2IW, // Enhanced 3dNow! kX86InstPFAcc, // 3dNow! kX86InstPFAdd, // 3dNow! kX86InstPFCmpEQ, // 3dNow! kX86InstPFCmpGE, // 3dNow! kX86InstPFCmpGT, // 3dNow! kX86InstPFMax, // 3dNow! kX86InstPFMin, // 3dNow! kX86InstPFMul, // 3dNow! kX86InstPFNAcc, // Enhanced 3dNow! kX86InstPFPNAcc, // Enhanced 3dNow! kX86InstPFRcp, // 3dNow! kX86InstPFRcpIt1, // 3dNow! kX86InstPFRcpIt2, // 3dNow! kX86InstPFRSqIt1, // 3dNow! kX86InstPFRSqrt, // 3dNow! kX86InstPFSub, // 3dNow! kX86InstPFSubR, // 3dNow! kX86InstPHAddD, // SSSE3 kX86InstPHAddSW, // SSSE3 kX86InstPHAddW, // SSSE3 kX86InstPHMinPOSUW, // SSE4.1 kX86InstPHSubD, // SSSE3 kX86InstPHSubSW, // SSSE3 kX86InstPHSubW, // SSSE3 kX86InstPI2FD, // 3dNow! kX86InstPI2FW, // Enhanced 3dNow! kX86InstPInsRB, // SSE4.1 kX86InstPInsRD, // SSE4.1 kX86InstPInsRQ, // SSE4.1 kX86InstPInsRW, // MMX-Ext kX86InstPMAddUBSW, // SSSE3 kX86InstPMAddWD, // MMX/SSE2 kX86InstPMaxSB, // SSE4.1 kX86InstPMaxSD, // SSE4.1 kX86InstPMaxSW, // MMX-Ext kX86InstPMaxUB, // MMX-Ext kX86InstPMaxUD, // SSE4.1 kX86InstPMaxUW, // SSE4.1 kX86InstPMinSB, // SSE4.1 kX86InstPMinSD, // SSE4.1 kX86InstPMinSW, // MMX-Ext kX86InstPMinUB, // MMX-Ext kX86InstPMinUD, // SSE4.1 kX86InstPMinUW, // SSE4.1 kX86InstPMovMskB, // MMX-Ext kX86InstPMovSXBD, // SSE4.1 kX86InstPMovSXBQ, // SSE4.1 kX86InstPMovSXBW, // SSE4.1 kX86InstPMovSXDQ, // SSE4.1 kX86InstPMovSXWD, // SSE4.1 kX86InstPMovSXWQ, // SSE4.1 kX86InstPMovZXBD, // SSE4.1 kX86InstPMovZXBQ, // SSE4.1 kX86InstPMovZXBW, // SSE4.1 kX86InstPMovZXDQ, // SSE4.1 kX86InstPMovZXWD, // SSE4.1 kX86InstPMovZXWQ, // SSE4.1 kX86InstPMulDQ, // SSE4.1 kX86InstPMulHRSW, // SSSE3 kX86InstPMulHUW, // MMX-Ext kX86InstPMulHW, // MMX/SSE2 kX86InstPMulLD, // SSE4.1 kX86InstPMulLW, // MMX/SSE2 kX86InstPMulUDQ, // SSE2 kX86InstPop, // X86/X64 kX86InstPopAD, // X86 only kX86InstPopCnt, // SSE4.2 kX86InstPopFD, // X86 only kX86InstPopFQ, // X64 only kX86InstPOr, // MMX/SSE2 kX86InstPrefetch, // MMX-Ext kX86InstPSADBW, // MMX-Ext kX86InstPShufB, // SSSE3 kX86InstPShufD, // SSE2 kX86InstPShufW, // MMX-Ext kX86InstPShufHW, // SSE2 kX86InstPShufLW, // SSE2 kX86InstPSignB, // SSSE3 kX86InstPSignD, // SSSE3 kX86InstPSignW, // SSSE3 kX86InstPSllD, // MMX/SSE2 kX86InstPSllDQ, // SSE2 kX86InstPSllQ, // MMX/SSE2 kX86InstPSllW, // MMX/SSE2 kX86InstPSraD, // MMX/SSE2 kX86InstPSraW, // MMX/SSE2 kX86InstPSrlD, // MMX/SSE2 kX86InstPSrlDQ, // SSE2 kX86InstPSrlQ, // MMX/SSE2 kX86InstPSrlW, // MMX/SSE2 kX86InstPSubB, // MMX/SSE2 kX86InstPSubD, // MMX/SSE2 kX86InstPSubQ, // SSE2 kX86InstPSubSB, // MMX/SSE2 kX86InstPSubSW, // MMX/SSE2 kX86InstPSubUSB, // MMX/SSE2 kX86InstPSubUSW, // MMX/SSE2 kX86InstPSubW, // MMX/SSE2 kX86InstPSwapD, // Enhanced 3dNow! kX86InstPTest, // SSE4.1 kX86InstPunpckHBW, // MMX/SSE2 kX86InstPunpckHDQ, // MMX/SSE2 kX86InstPunpckHQDQ, // SSE2 kX86InstPunpckHWD, // MMX/SSE2 kX86InstPunpckLBW, // MMX/SSE2 kX86InstPunpckLDQ, // MMX/SSE2 kX86InstPunpckLQDQ, // SSE2 kX86InstPunpckLWD, // MMX/SSE2 kX86InstPush, // X86/X64 kX86InstPushAD, // X86 only kX86InstPushFD, // X86 only kX86InstPushFQ, // X64 only kX86InstPXor, // MMX/SSE2 kX86InstRcl, // X86/X64 kX86InstRcpPS, // SSE kX86InstRcpSS, // SSE kX86InstRcr, // X86/X64 kX86InstRdtsc, // X86/X64 kX86InstRdtscP, // X86/X64 kX86InstRepLodSB, // X86/X64 (REP) kX86InstRepLodSD, // X86/X64 (REP) kX86InstRepLodSQ, // X64 only (REP) kX86InstRepLodSW, // X86/X64 (REP) kX86InstRepMovSB, // X86/X64 (REP) kX86InstRepMovSD, // X86/X64 (REP) kX86InstRepMovSQ, // X64 only (REP) kX86InstRepMovSW, // X86/X64 (REP) kX86InstRepStoSB, // X86/X64 (REP) kX86InstRepStoSD, // X86/X64 (REP) kX86InstRepStoSQ, // X64 only (REP) kX86InstRepStoSW, // X86/X64 (REP) kX86InstRepECmpSB, // X86/X64 (REP) kX86InstRepECmpSD, // X86/X64 (REP) kX86InstRepECmpSQ, // X64 only (REP) kX86InstRepECmpSW, // X86/X64 (REP) kX86InstRepEScaSB, // X86/X64 (REP) kX86InstRepEScaSD, // X86/X64 (REP) kX86InstRepEScaSQ, // X64 only (REP) kX86InstRepEScaSW, // X86/X64 (REP) kX86InstRepNECmpSB, // X86/X64 (REP) kX86InstRepNECmpSD, // X86/X64 (REP) kX86InstRepNECmpSQ, // X64 only (REP) kX86InstRepNECmpSW, // X86/X64 (REP) kX86InstRepNEScaSB, // X86/X64 (REP) kX86InstRepNEScaSD, // X86/X64 (REP) kX86InstRepNEScaSQ, // X64 only (REP) kX86InstRepNEScaSW, // X86/X64 (REP) kX86InstRet, // X86/X64 kX86InstRol, // X86/X64 kX86InstRor, // X86/X64 kX86InstRoundPD, // SSE4.1 kX86InstRoundPS, // SSE4.1 kX86InstRoundSD, // SSE4.1 kX86InstRoundSS, // SSE4.1 kX86InstRSqrtPS, // SSE kX86InstRSqrtSS, // SSE kX86InstSahf, // X86/X64 (CPUID NEEDED) kX86InstSal, // X86/X64 kX86InstSar, // X86/X64 kX86InstSbb, // X86/X64 kX86InstSet, // Begin (setcc) kX86InstSetA=kX86InstSet,// X86/X64 (setcc) kX86InstSetAE, // X86/X64 (setcc) kX86InstSetB, // X86/X64 (setcc) kX86InstSetBE, // X86/X64 (setcc) kX86InstSetC, // X86/X64 (setcc) kX86InstSetE, // X86/X64 (setcc) kX86InstSetG, // X86/X64 (setcc) kX86InstSetGE, // X86/X64 (setcc) kX86InstSetL, // X86/X64 (setcc) kX86InstSetLE, // X86/X64 (setcc) kX86InstSetNA, // X86/X64 (setcc) kX86InstSetNAE, // X86/X64 (setcc) kX86InstSetNB, // X86/X64 (setcc) kX86InstSetNBE, // X86/X64 (setcc) kX86InstSetNC, // X86/X64 (setcc) kX86InstSetNE, // X86/X64 (setcc) kX86InstSetNG, // X86/X64 (setcc) kX86InstSetNGE, // X86/X64 (setcc) kX86InstSetNL, // X86/X64 (setcc) kX86InstSetNLE, // X86/X64 (setcc) kX86InstSetNO, // X86/X64 (setcc) kX86InstSetNP, // X86/X64 (setcc) kX86InstSetNS, // X86/X64 (setcc) kX86InstSetNZ, // X86/X64 (setcc) kX86InstSetO, // X86/X64 (setcc) kX86InstSetP, // X86/X64 (setcc) kX86InstSetPE, // X86/X64 (setcc) kX86InstSetPO, // X86/X64 (setcc) kX86InstSetS, // X86/X64 (setcc) kX86InstSetZ, // X86/X64 (setcc) kX86InstSFence, // MMX-Ext/SSE kX86InstShl, // X86/X64 kX86InstShld, // X86/X64 kX86InstShr, // X86/X64 kX86InstShrd, // X86/X64 kX86InstShufPD, // SSE2 kX86InstShufPS, // SSE kX86InstSqrtPD, // SSE2 kX86InstSqrtPS, // SSE kX86InstSqrtSD, // SSE2 kX86InstSqrtSS, // SSE kX86InstStc, // X86/X64 kX86InstStd, // X86/X64 kX86InstStMXCSR, // SSE kX86InstSub, // X86/X64 kX86InstSubPD, // SSE2 kX86InstSubPS, // SSE kX86InstSubSD, // SSE2 kX86InstSubSS, // SSE kX86InstTest, // X86/X64 kX86InstUComISD, // SSE2 kX86InstUComISS, // SSE kX86InstUd2, // X86/X64 kX86InstUnpckHPD, // SSE2 kX86InstUnpckHPS, // SSE kX86InstUnpckLPD, // SSE2 kX86InstUnpckLPS, // SSE kX86InstXadd, // X86/X64 (i486) kX86InstXchg, // X86/X64 (i386) kX86InstXor, // X86/X64 kX86InstXorPD, // SSE2 kX86InstXorPS, // SSE _kX86InstCount, _kX86InstJBegin = kX86InstJ, _kX86InstJEnd = kX86InstJmp }; // ============================================================================ // [AsmJit::kX86InstGroup] // ============================================================================ //! @brief X86 instruction groups. //! //! This should be only used by assembler, because it's @c AsmJit::Assembler //! specific grouping. Each group represents one 'case' in the Assembler's //! main emit method. enum kX86InstGroup { // Group categories. kX86InstGroupNone, kX86InstGroupEmit, kX86InstGroupArith, kX86InstGroupBSwap, kX86InstGroupBTest, kX86InstGroupCall, kX86InstGroupCrc32, kX86InstGroupEnter, kX86InstGroupIMul, kX86InstGroupIncDec, kX86InstGroupJcc, kX86InstGroupJmp, kX86InstGroupLea, kX86InstGroupMem, kX86InstGroupMov, kX86InstGroupMovPtr, kX86InstGroupMovSxMovZx, kX86InstGroupMovSxD, kX86InstGroupPush, kX86InstGroupPop, kX86InstGroupRegRm, kX86InstGroupRm, kX86InstGroupRmByte, kX86InstGroupRmReg, kX86InstGroupRep, kX86InstGroupRet, kX86InstGroupRot, kX86InstGroupShldShrd, kX86InstGroupTest, kX86InstGroupXchg, // Group for x87 FP instructions in format mem or st(i), st(i) (fadd, fsub, fdiv, ...) kX86InstGroupX87StM, // Group for x87 FP instructions in format st(i), st(i) kX86InstGroupX87StI, // Group for fld/fst/fstp instruction, internally uses @ref kX86InstGroupX87StM group. kX86InstGroupX87FldFst, // Group for x87 FP instructions that uses Word, DWord, QWord or TWord memory pointer. kX86InstGroupX87Mem, // Group for x87 FSTSW/FNSTSW instructions kX86InstGroupX87Status, // Group for movbe instruction kX86InstGroupMovBE, // Group for MMX/SSE instructions in format (X)MM|Reg|Mem <- (X)MM|Reg|Mem, // 0x66 prefix must be set manually in opcodes. // - Primary opcode is used for instructions in (X)MM <- (X)MM/Mem format, // - Secondary opcode is used for instructions in (X)MM/Mem <- (X)MM format. kX86InstGroupMmuMov, kX86InstGroupMmuMovD, kX86InstGroupMmuMovQ, // Group for pextrd, pextrq and pextrw instructions (it's special instruction // not similar to others) kX86InstGroupMmuExtract, // Group for prefetch instruction kX86InstGroupMmuPrefetch, // Group for MMX/SSE instructions in format (X)MM|Reg <- (X)MM|Reg|Mem|Imm, // 0x66 prefix is added for MMX instructions that used by SSE2 registers. // - Primary opcode is used for instructions in (X)MM|Reg <- (X)MM|Reg|Mem format, // - Secondary opcode is iused for instructions in (X)MM|Reg <- Imm format. kX86InstGroupMmuRmI, kX86InstGroupMmuRmImm8, // Group for 3dNow instructions kX86InstGroupMmuRm3dNow }; // ============================================================================ // [AsmJit::kX86InstFlags] // ============================================================================ //! @brief X86 instruction type flags. enum kX86InstFlags { //! @brief No flags. kX86InstFlagNone = 0x00, //! @brief Instruction is jump, conditional jump, call or ret. kX86InstFlagJump = 0x01, //! @brief Instruction will overwrite first operand - o[0]. kX86InstFlagMov = 0x02, //! @brief Instruction is X87 FPU. kX86InstFlagFpu = 0x04, //! @brief Instruction can be prepended using LOCK prefix //! (usable for multithreaded applications). kX86InstFlagLockable = 0x08, //! @brief Instruction is special, this is for @c Compiler. kX86InstFlagSpecial = 0x10, //! @brief Instruction always performs memory access. //! //! This flag is always combined with @c kX86InstFlagSpecial and signalizes //! that there is an implicit address which is accessed (usually EDI/RDI or //! ESI/EDI). kX86InstFlagSpecialMem = 0x20 }; // ============================================================================ // [AsmJit::kX86InstOp] // ============================================================================ //! @brief X86 instruction operand flags. enum kX86InstOp { // X86, MM, XMM kX86InstOpGb = 0x0001, kX86InstOpGw = 0x0002, kX86InstOpGd = 0x0004, kX86InstOpGq = 0x0008, kX86InstOpMm = 0x0010, kX86InstOpXmm = 0x0020, kX86InstOpMem = 0x0040, kX86InstOpImm = 0x0080, kX86InstOpGbMem = kX86InstOpGb | kX86InstOpMem, kX86InstOpGwMem = kX86InstOpGw | kX86InstOpMem, kX86InstOpGdMem = kX86InstOpGd | kX86InstOpMem, kX86InstOpGqMem = kX86InstOpGq | kX86InstOpMem, kX86InstOpGqdwb = kX86InstOpGq | kX86InstOpGd | kX86InstOpGw | kX86InstOpGb, kX86InstOpGqdw = kX86InstOpGq | kX86InstOpGd | kX86InstOpGw, kX86InstOpGqd = kX86InstOpGq | kX86InstOpGd, kX86InstOpGwb = kX86InstOpGw | kX86InstOpGb, kX86InstOpGqdwbMem = kX86InstOpGqdwb | kX86InstOpMem, kX86InstOpGqdwMem = kX86InstOpGqdw | kX86InstOpMem, kX86InstOpGqdMem = kX86InstOpGqd | kX86InstOpMem, kX86InstOpGwbMem = kX86InstOpGwb | kX86InstOpMem, // MMX/XMM. kX86InstOpMmMem = kX86InstOpMm | kX86InstOpMem, kX86InstOpXmmMem = kX86InstOpXmm | kX86InstOpMem, kX86InstOpMmXmm = kX86InstOpMm | kX86InstOpXmm, kX86InstOpMmXmmMem = kX86InstOpMmXmm | kX86InstOpMem, // X87. kX86InstOpStM2 = kX86InstOpMem | 0x0100, kX86InstOpStM4 = kX86InstOpMem | 0x0200, kX86InstOpStM8 = kX86InstOpMem | 0x0400, kX86InstOpStM10 = kX86InstOpMem | 0x0800, kX86InstOpStM2_4 = kX86InstOpStM2 | kX86InstOpStM4, kX86InstOpStM2_4_8 = kX86InstOpStM2_4 | kX86InstOpStM8, kX86InstOpStM4_8 = kX86InstOpStM4 | kX86InstOpStM8, kX86InstOpStM4_8_10 = kX86InstOpStM4_8 | kX86InstOpStM10, // Don't emit REX prefix. kX86InstOpNoRex = 0x2000 }; // ============================================================================ // [AsmJit::x86InstName] // ============================================================================ //! @internal //! //! @brief X86 instruction names. ASMJIT_VAR const char x86InstName[]; // ============================================================================ // [AsmJit::X86InstInfo] // ============================================================================ //! @brief X86 instruction information. struct X86InstInfo { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get instruction code, see @ref kX86InstCode. inline uint32_t getCode() const { return _code; } //! @brief Get instruction name string (null terminated string). inline const char* getName() const { return x86InstName + static_cast(_nameIndex); } //! @brief Get instruction name index (index to @ref x86InstName array). inline uint32_t getNameIndex() const { return _nameIndex; } //! @brief Get instruction group, see @ref kX86InstGroup. inline uint32_t getGroup() const { return _group; } //! @brief Get instruction flags, see @ref kX86InstFlags. inline uint32_t getFlags() const { return _group; } //! @brief Get whether the instruction is conditional or standard jump. inline bool isJump() const { return (_flags & kX86InstFlagJump) != 0; } //! @brief Get whether the instruction is MOV type. inline bool isMov() const { return (_flags & kX86InstFlagMov) != 0; } //! @brief Get whether the instruction is X87 FPU type. inline bool isFpu() const { return (_flags & kX86InstFlagFpu) != 0; } //! @brief Get whether the instruction can be prefixed by LOCK prefix. inline bool isLockable() const { return (_flags & kX86InstFlagLockable) != 0; } //! @brief Get whether the instruction is special type (this is used by //! @c Compiler to manage additional variables or functionality). inline bool isSpecial() const { return (_flags & kX86InstFlagSpecial) != 0; } //! @brief Get whether the instruction is special type and it performs //! memory access. inline bool isSpecialMem() const { return (_flags & kX86InstFlagSpecialMem) != 0; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Instruction code. uint16_t _code; //! @brief Instruction name index in x86InstName[] array. uint16_t _nameIndex; //! @brief Instruction group, used also by @c Compiler. uint8_t _group; //! @brief Instruction type flags. uint8_t _flags; //! @brief First and second operand flags (some groups depends on these settings, used also by @c Compiler). uint16_t _opFlags[2]; //! @brief If instruction has only memory operand, this is register opcode. uint16_t _opCodeR; //! @brief Primary and secondary opcodes. uint32_t _opCode[2]; }; // ============================================================================ // [AsmJit::x86InstInfo] // ============================================================================ ASMJIT_VAR const X86InstInfo x86InstInfo[]; // ============================================================================ // [AsmJit::kX86FuncConv] // ============================================================================ //! @brief X86 function calling conventions. //! //! Calling convention is scheme how function arguments are passed into //! function and how functions returns values. In assembler programming //! it's needed to always comply with function calling conventions, because //! even small inconsistency can cause undefined behavior or crash. //! //! List of calling conventions for 32-bit x86 mode: //! - @c kX86FuncConvCDecl - Calling convention for C runtime. //! - @c kX86FuncConvStdCall - Calling convention for WinAPI functions. //! - @c kX86FuncConvMsThisCall - Calling convention for C++ members under //! Windows (produced by MSVC and all MSVC compatible compilers). //! - @c kX86FuncConvMsFastCall - Fastest calling convention that can be used //! by MSVC compiler. //! - @c kX86FuncConv_BORNANDFASTCALL - Borland fastcall convention. //! - @c kX86FuncConvGccFastCall - GCC fastcall convention (2 register arguments). //! - @c kX86FuncConvGccRegParm1 - GCC regparm(1) convention. //! - @c kX86FuncConvGccRegParm2 - GCC regparm(2) convention. //! - @c kX86FuncConvGccRegParm3 - GCC regparm(3) convention. //! //! List of calling conventions for 64-bit x86 mode (x64): //! - @c kX86FuncConvX64W - Windows 64-bit calling convention (WIN64 ABI). //! - @c kX86FuncConvX64U - Unix 64-bit calling convention (AMD64 ABI). //! //! There is also @c kX86FuncConvDefault that is defined to fit best to your //! compiler. //! //! These types are used together with @c AsmJit::Compiler::newFunc() //! method. enum kX86FuncConv { // -------------------------------------------------------------------------- // [X64] // -------------------------------------------------------------------------- //! @brief X64 calling convention for Windows platform (WIN64 ABI). //! //! For first four arguments are used these registers: //! - 1. 32/64-bit integer or floating point argument - rcx/xmm0 //! - 2. 32/64-bit integer or floating point argument - rdx/xmm1 //! - 3. 32/64-bit integer or floating point argument - r8/xmm2 //! - 4. 32/64-bit integer or floating point argument - r9/xmm3 //! //! Note first four arguments here means arguments at positions from 1 to 4 //! (included). For example if second argument is not passed by register then //! rdx/xmm1 register is unused. //! //! All other arguments are pushed on the stack in right-to-left direction. //! Stack is aligned by 16 bytes. There is 32-byte shadow space on the stack //! that can be used to save up to four 64-bit registers (probably designed to //! be used to save first four arguments passed in registers). //! //! Arguments direction: //! - Right to Left (except for first 4 parameters that's in registers) //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - RAX register. //! - Floating points - XMM0 register. //! //! Stack is always aligned by 16 bytes. //! //! More information about this calling convention can be found on MSDN: //! http://msdn.microsoft.com/en-us/library/9b372w95.aspx . kX86FuncConvX64W = 1, //! @brief X64 calling convention for Unix platforms (AMD64 ABI). //! //! First six 32 or 64-bit integer arguments are passed in rdi, rsi, rdx, //! rcx, r8, r9 registers. First eight floating point or XMM arguments //! are passed in xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7 registers. //! This means that in registers can be transferred up to 14 arguments total. //! //! There is also RED ZONE below the stack pointer that can be used for //! temporary storage. The red zone is the space from [rsp-128] to [rsp-8]. //! //! Arguments direction: //! - Right to Left (Except for arguments passed in registers). //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - RAX register. //! - Floating points - XMM0 register. //! //! Stack is always aligned by 16 bytes. kX86FuncConvX64U = 2, // -------------------------------------------------------------------------- // [X86] // -------------------------------------------------------------------------- //! @brief Cdecl calling convention (used by C runtime). //! //! Compatible across MSVC and GCC. //! //! Arguments direction: //! - Right to Left //! //! Stack is cleaned by: //! - Caller. kX86FuncConvCDecl = 3, //! @brief Stdcall calling convention (used by WinAPI). //! //! Compatible across MSVC and GCC. //! //! Arguments direction: //! - Right to Left //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. kX86FuncConvStdCall = 4, //! @brief MSVC specific calling convention used by MSVC/Intel compilers //! for struct/class methods. //! //! This is MSVC (and Intel) only calling convention used in Windows //! world for C++ class methods. Implicit 'this' pointer is stored in //! ECX register instead of storing it on the stack. //! //! Arguments direction: //! - Right to Left (except this pointer in ECX) //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. //! //! C++ class methods that have variable count of arguments uses different //! calling convention called cdecl. //! //! @note This calling convention is always used by MSVC for class methods, //! it's implicit and there is no way how to override it. kX86FuncConvMsThisCall = 5, //! @brief MSVC specific fastcall. //! //! Two first parameters (evaluated from left-to-right) are in ECX:EDX //! registers, all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first two integer arguments in ECX:EDX) //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. //! //! @note This calling convention differs to GCC one in stack cleaning //! mechanism. kX86FuncConvMsFastCall = 6, //! @brief Borland specific fastcall with 2 parameters in registers. //! //! Two first parameters (evaluated from left-to-right) are in ECX:EDX //! registers, all others on the stack in left-to-right order. //! //! Arguments direction: //! - Left to Right (except to first two integer arguments in ECX:EDX) //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. //! //! @note Arguments on the stack are in left-to-right order that differs //! to other fastcall conventions used in different compilers. kX86FuncConvBorlandFastCall = 7, //! @brief GCC specific fastcall convention. //! //! Two first parameters (evaluated from left-to-right) are in ECX:EDX //! registers, all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first two integer arguments in ECX:EDX) //! //! Stack is cleaned by: //! - Callee. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. //! //! @note This calling convention should be compatible to //! @c kX86FuncConvMsFastCall. kX86FuncConvGccFastCall = 8, //! @brief GCC specific regparm(1) convention. //! //! The first parameter (evaluated from left-to-right) is in EAX register, //! all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first one integer argument in EAX) //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. kX86FuncConvGccRegParm1 = 9, //! @brief GCC specific regparm(2) convention. //! //! Two first parameters (evaluated from left-to-right) are in EAX:EDX //! registers, all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first two integer arguments in EAX:EDX) //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. kX86FuncConvGccRegParm2 = 10, //! @brief GCC specific fastcall with 3 parameters in registers. //! //! Three first parameters (evaluated from left-to-right) are in //! EAX:EDX:ECX registers, all others on the stack in right-to-left order. //! //! Arguments direction: //! - Right to Left (except to first three integer arguments in EAX:EDX:ECX) //! //! Stack is cleaned by: //! - Caller. //! //! Return value: //! - Integer types - EAX:EDX registers. //! - Floating points - st(0) register. kX86FuncConvGccRegParm3 = 11, // -------------------------------------------------------------------------- // [Detect] // -------------------------------------------------------------------------- //! @def kX86FuncConvDefault //! @brief Default calling convention for current platform / operating system. //! @def kX86FuncConvCompatFastCall //! @brief Compatibility for __fastcall calling convention. //! //! @note This enumeration is always set to a value which is compatible to //! current compilers __fastcall calling convention. In 64-bit mode the value //! is compatible to @ref kX86FuncConvX64W or @ref kX86FuncConvX64U. //! @def kX86FuncConvCompatStdCall //! @brief Compatibility for __stdcall calling convention. //! //! @note This enumeration is always set to a value which is compatible to //! current compilers __stdcall calling convention. In 64-bit mode the value //! is compatible to @ref kX86FuncConvX64W or @ref kX86FuncConvX64U. //! @def kX86FuncConvCompatCDecl //! @brief Default C calling convention based on current compiler's settings. #if defined(ASMJIT_X86) kX86FuncConvDefault = kX86FuncConvCDecl, # if defined(_MSC_VER) kX86FuncConvCompatFastCall = kX86FuncConvMsFastCall, # elif defined(__GNUC__) kX86FuncConvCompatFastCall = kX86FuncConvGccFastCall, # elif defined(__BORLANDC__) kX86FuncConvCompatFastCall = kX86FuncConvBorlandFastCall, # else # error "AsmJit::kX86FuncConvCompatFastCall not supported." # endif kX86FuncConvCompatStdCall = kX86FuncConvStdCall, kX86FuncConvCompatCDecl = kX86FuncConvCDecl #else # if defined(ASMJIT_WINDOWS) kX86FuncConvDefault = kX86FuncConvX64W, # else kX86FuncConvDefault = kX86FuncConvX64U, # endif kX86FuncConvCompatFastCall = kX86FuncConvDefault, kX86FuncConvCompatStdCall = kX86FuncConvDefault, kX86FuncConvCompatCDecl = kX86FuncConvDefault #endif // ASMJIT_X86 }; // ============================================================================ // [AsmJit::kX86FuncHint] // ============================================================================ //! @brief X86 function hints. enum kX86FuncHint { //! @brief Use push/pop sequences instead of mov sequences in function prolog //! and epilog. kX86FuncHintPushPop = 8, //! @brief Add emms instruction to the function epilog. kX86FuncHintEmms = 9, //! @brief Add sfence instruction to the function epilog. kX86FuncHintSFence = 10, //! @brief Add lfence instruction to the function epilog. kX86FuncHintLFence = 11, //! @brief Assume that stack is aligned to 16-bytes. kX86FuncHintAssume16ByteAlignment = 12, //! @brief Perform 16-byte stack alignmend by function. kX86FuncHintPerform16ByteAlignment = 13 }; // ============================================================================ // [AsmJit::kX86FuncFlags] // ============================================================================ //! @brief X86 function flags. enum kX86FuncFlags { //! @brief Whether to emit prolog / epilog sequence using push & pop //! instructions (the default). kX86FuncFlagPushPop = (1U << 8), //! @brief Whether to emit EMMS instruction in epilog (auto-detected). kX86FuncFlagEmitEmms = (1U << 9), //! @brief Whether to emit SFence instruction in epilog (auto-detected). //! //! @note @ref kX86FuncFlagEmitSFence and @ref kX86FuncFlagEmitLFence //! combination will result in emitting mfence. kX86FuncFlagEmitSFence = (1U << 10), //! @brief Whether to emit LFence instruction in epilog (auto-detected). //! //! @note @ref kX86FuncFlagEmitSFence and @ref kX86FuncFlagEmitLFence //! combination will result in emitting mfence. kX86FuncFlagEmitLFence = (1U << 11), //! @brief Whether the function stack is aligned by 16-bytes by OS. //! //! This is always true for 64-bit mode and for linux. kX86FuncFlagAssume16ByteAlignment = (1U << 12), //! @brief Whether the function stack (for variables) is aligned manually //! by function to 16-bytes. //! //! This makes sense only if @ref kX86FuncFlagAssume16ByteAlignment is //! false and MOVDQA instruction or other SSE/SSE2 instructions are used to //! work with variables stored on the stack. //! //! Value is determined automatically by these factors, expectations are: //! //! 1. There is 16-byte wide variable which address was used (alloc, spill, //! op). //! 2. Function can't be naked. kX86FuncFlagPerform16ByteAlignment = (1U << 13), //! @brief Whether the ESP register is adjusted by the stack size needed //! to save registers and function variables. //! //! Esp is adjusted by 'sub' instruction in prolog and by add function in //! epilog (only if function is not naked). kX86FuncFlagIsEspAdjusted = (1U << 14) }; // ============================================================================ // [AsmJit::kX86CompilerInst] // ============================================================================ //! @brief Instruction flags used by @ref X86CompilerInst item. enum kX86CompilerInstFlag { //! @brief Whether the instruction is special. kX86CompilerInstFlagIsSpecial = (1U << 0), //! @brief Whether the instruction is FPU. kX86CompilerInstFlagIsFpu = (1U << 1), //! @brief Whether the one of the operands is GPB.Lo register. kX86CompilerInstFlagIsGpbLoUsed = (1U << 2), //! @brief Whether the one of the operands is GPB.Hi register. kX86CompilerInstFlagIsGpbHiUsed = (1U << 3), //! @brief Whether the jmp/jcc is likely to be taken. kX86CompilerInstFlagIsTaken = (1U << 7) }; // ============================================================================ // [AsmJit::kX86VarClass] // ============================================================================ //! @brief X86 variable class. enum kX86VarClass { //! @brief No class (used internally). kX86VarClassNone = 0, //! @brief General purpose register. kX86VarClassGp = 1, //! @brief X87 floating point. kX86VarClassX87 = 2, //! @brief MMX register. kX86VarClassMm = 3, //! @brief XMM register. kX86VarClassXmm = 4, //! @brief Count of X86 variable classes. kX86VarClassCount = 5 }; // ============================================================================ // [AsmJit::kX86VarFlags] // ============================================================================ //! @brief X86 variable class. enum kX86VarFlags { //! @brief Variable contains single-precision floating-point(s). kX86VarFlagSP = 0x10, //! @brief Variable contains double-precision floating-point(s). kX86VarFlagDP = 0x20, //! @brief Variable is packed (for example float4x, double2x, ...). kX86VarFlagPacked = 0x40 }; // ============================================================================ // [AsmJit::kX86VarType] // ============================================================================ //! @brief X86 variable type. enum kX86VarType { // -------------------------------------------------------------------------- // [Platform Dependent] // -------------------------------------------------------------------------- //! @brief Variable is 32-bit general purpose register. kX86VarTypeGpd = 0, //! @brief Variable is 64-bit general purpose register. kX86VarTypeGpq = 1, //! @var kX86VarTypeGpz //! @brief Variable is system wide general purpose register (32-bit or 64-bit). #if defined(ASMJIT_X86) kX86VarTypeGpz = kX86VarTypeGpd, #else kX86VarTypeGpz = kX86VarTypeGpq, #endif //! @brief Variable is X87 (FPU). kX86VarTypeX87 = 2, //! @brief Variable is X87 (FPU) SP-FP number (float). kX86VarTypeX87SS = 3, //! @brief Variable is X87 (FPU) DP-FP number (double). kX86VarTypeX87SD = 4, //! @brief Variable is MM register / memory location. kX86VarTypeMm = 5, //! @brief Variable is XMM register / memory location. kX86VarTypeXmm = 6, //! @brief Variable is SSE scalar SP-FP number. kX86VarTypeXmmSS = 7, //! @brief Variable is SSE packed SP-FP number (4 floats). kX86VarTypeXmmPS = 8, //! @brief Variable is SSE2 scalar DP-FP number. kX86VarTypeXmmSD = 9, //! @brief Variable is SSE2 packed DP-FP number (2 doubles). kX86VarTypeXmmPD = 10, //! @brief Count of variable types. kX86VarTypeCount = 11, // -------------------------------------------------------------------------- // [Platform Independent] // -------------------------------------------------------------------------- //! @brief Variable is 32-bit integer. kX86VarTypeInt32 = kX86VarTypeGpd, //! @brief Variable is 64-bit integer. kX86VarTypeInt64 = kX86VarTypeGpq, //! @brief Variable is system dependent integer / pointer. kX86VarTypeIntPtr = kX86VarTypeGpz, #if defined(ASMJIT_X86) kX86VarTypeFloat = kX86VarTypeX87SS, kX86VarTypeDouble = kX86VarTypeX87SD #else kX86VarTypeFloat = kX86VarTypeXmmSS, kX86VarTypeDouble = kX86VarTypeXmmSD #endif }; // ============================================================================ // [AsmJit::X86VarInfo] // ============================================================================ //! @brief X86 variable information. struct X86VarInfo { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get register code base, see @ref kX86RegCode. inline uint32_t getCode() const { return _code; } //! @brief Get register size in bytes. inline uint32_t getSize() const { return _size; } //! @brief Get variable class, see @ref kX86VarClass. inline uint32_t getClass() const { return _class; } //! @brief Get variable flags, see @ref kX86VarFlags. inline uint32_t getFlags() const { return _flags; } //! @brief Get variable type name. inline const char* getName() const { return _name; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Register code base, see @ref kX86RegCode. uint32_t _code; //! @brief Register size in bytes. uint16_t _size; //! @brief Variable class, see @ref kX86VarClass. uint8_t _class; //! @brief Variable flags, see @ref kX86VarFlags. uint8_t _flags; //! @brief Variable type name. char _name[8]; }; // ============================================================================ // [AsmJit::x86VarInfo] // ============================================================================ ASMJIT_VAR const X86VarInfo x86VarInfo[]; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86DEFS_H desmume-0.9.9/src/utils/AsmJit/x86/x86cpuinfo.h0000644000175000017500000000767712140261626021670 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86CPUINFO_H #define _ASMJIT_X86_X86CPUINFO_H // [Dependencies - AsmJit] #include "../core/cpuinfo.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86CpuId] // ============================================================================ //! @brief X86 CpuId output. union X86CpuId { //! @brief EAX/EBX/ECX/EDX output. uint32_t i[4]; struct { //! @brief EAX output. uint32_t eax; //! @brief EBX output. uint32_t ebx; //! @brief ECX output. uint32_t ecx; //! @brief EDX output. uint32_t edx; }; }; // ============================================================================ // [AsmJit::X86CpuInfo] // ============================================================================ struct X86CpuInfo : public CpuInfo { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline X86CpuInfo(uint32_t size = sizeof(X86CpuInfo)) : CpuInfo(size) { } // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get processor type. inline uint32_t getProcessorType() const { return _processorType; } //! @brief Get brand index. inline uint32_t getBrandIndex() const { return _brandIndex; } //! @brief Get flush cache line size. inline uint32_t getFlushCacheLineSize() const { return _flushCacheLineSize; } //! @brief Get maximum logical processors count. inline uint32_t getMaxLogicalProcessors() const { return _maxLogicalProcessors; } //! @brief Get APIC physical ID. inline uint32_t getApicPhysicalId() const { return _apicPhysicalId; } // -------------------------------------------------------------------------- // [Statics] // -------------------------------------------------------------------------- //! @brief Get global instance of @ref X86CpuInfo. static inline const X86CpuInfo* getGlobal() { return static_cast(CpuInfo::getGlobal()); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Processor type. uint32_t _processorType; //! @brief Brand index. uint32_t _brandIndex; //! @brief Flush cache line size in bytes. uint32_t _flushCacheLineSize; //! @brief Maximum number of addressable IDs for logical processors. uint32_t _maxLogicalProcessors; //! @brief Initial APIC ID. uint32_t _apicPhysicalId; }; // ============================================================================ // [AsmJit::x86CpuId] // ============================================================================ #if defined(ASMJIT_X86) || defined(ASMJIT_X64) //! @brief Calls CPUID instruction with eax == @a in and stores output to @a out. //! //! @c cpuid() function has one input parameter that is passed to cpuid through //! eax register and results in four output values representing result of cpuid //! instruction (eax, ebx, ecx and edx registers). ASMJIT_API void x86CpuId(uint32_t in, X86CpuId* out); // ============================================================================ // [AsmJit::x86CpuDetect] // ============================================================================ //! @brief Detect CPU features to CpuInfo structure @a out. //! //! @sa @c CpuInfo. ASMJIT_API void x86CpuDetect(X86CpuInfo* out); #endif // ASMJIT_X86 || ASMJIT_X64 //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86CPUINFO_H desmume-0.9.9/src/utils/AsmJit/x86/x86compileritem.h0000644000175000017500000002411712140261626022702 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86COMPILERITEM_H #define _ASMJIT_X86_X86COMPILERITEM_H // [Dependencies - AsmJit] #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86CompilerAlign] // ============================================================================ //! @brief Compiler align item. struct X86CompilerAlign : public CompilerAlign { ASMJIT_NO_COPY(X86CompilerAlign) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerAlign instance. ASMJIT_API X86CompilerAlign(X86Compiler* x86Compiler, uint32_t size = 0); //! @brief Destroy the @ref CompilerAlign instance. ASMJIT_API virtual ~X86CompilerAlign(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void emit(Assembler& a); }; // ============================================================================ // [AsmJit::X86CompilerHint] // ============================================================================ //! @brief @ref X86Compiler variable hint item. struct X86CompilerHint : public CompilerHint { ASMJIT_NO_COPY(X86CompilerHint) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerHint instance. ASMJIT_API X86CompilerHint(X86Compiler* compiler, X86CompilerVar* var, uint32_t hintId, uint32_t hintValue); //! @brief Destroy the @ref X86CompilerHint instance. ASMJIT_API virtual ~X86CompilerHint(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get variable as @ref X86CompilerVar. inline X86CompilerVar* getVar() const { return reinterpret_cast(_var); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; }; // ============================================================================ // [AsmJit::X86CompilerTarget] // ============================================================================ //! @brief X86Compiler target item. struct X86CompilerTarget : public CompilerTarget { ASMJIT_NO_COPY(X86CompilerTarget) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerTarget instance. ASMJIT_API X86CompilerTarget(X86Compiler* x86Compiler, const Label& target); //! @brief Destroy the @ref X86CompilerTarget instance. ASMJIT_API virtual ~X86CompilerTarget(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get state as @ref X86CompilerState. inline X86CompilerState* getState() const { return reinterpret_cast(_state); } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); ASMJIT_API virtual void emit(Assembler& a); }; // ============================================================================ // [AsmJit::X86CompilerInst] // ============================================================================ //! @brief @ref X86Compiler instruction item. struct X86CompilerInst : public CompilerInst { ASMJIT_NO_COPY(X86CompilerInst) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerInst instance. ASMJIT_API X86CompilerInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount); //! @brief Destroy the @ref X86CompilerInst instance. ASMJIT_API virtual ~X86CompilerInst(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get whether the instruction is special. inline bool isSpecial() const { return (_instFlags & kX86CompilerInstFlagIsSpecial) != 0; } //! @brief Get whether the instruction is FPU. inline bool isFpu() const { return (_instFlags & kX86CompilerInstFlagIsFpu) != 0; } //! @brief Get whether the instruction is used with GpbLo register. inline bool isGpbLoUsed() const { return (_instFlags & kX86CompilerInstFlagIsGpbLoUsed) != 0; } //! @brief Get whether the instruction is used with GpbHi register. inline bool isGpbHiUsed() const { return (_instFlags & kX86CompilerInstFlagIsGpbHiUsed) != 0; } //! @brief Get memory operand. inline Mem* getMemOp() { return _memOp; } //! @brief Set memory operand. inline void setMemOp(Mem* memOp) { _memOp = memOp; } //! @brief Get operands array (3 operands total). inline VarAllocRecord* getVars() { return _vars; } //! @brief Get operands array (3 operands total). inline const VarAllocRecord* getVars() const { return _vars; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Memory operand or NULL. Mem* _memOp; //! @brief Variables (extracted from operands). VarAllocRecord* _vars; }; // ============================================================================ // [AsmJit::X86CompilerJmpInst] // ============================================================================ //! @brief @ref X86Compiler "jmp" instruction item. struct X86CompilerJmpInst : public X86CompilerInst { ASMJIT_NO_COPY(X86CompilerJmpInst) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API X86CompilerJmpInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount); ASMJIT_API virtual ~X86CompilerJmpInst(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- inline X86CompilerJmpInst* getJumpNext() const { return _jumpNext; } inline bool isTaken() const { return (_instFlags & kX86CompilerInstFlagIsTaken) != 0; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void prepare(CompilerContext& cc); ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [DoJump] // -------------------------------------------------------------------------- ASMJIT_API void doJump(CompilerContext& cc); // -------------------------------------------------------------------------- // [Jump] // -------------------------------------------------------------------------- ASMJIT_API virtual CompilerTarget* getJumpTarget() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Jump target. X86CompilerTarget* _jumpTarget; //! @brief Next jump to the same target in a single linked list. X86CompilerJmpInst *_jumpNext; //! @brief State associated with the jump. X86CompilerState* _state; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86COMPILERITEM_H desmume-0.9.9/src/utils/AsmJit/x86/x86compilercontext.h0000644000175000017500000002654612140261626023440 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_X86_X86COMPILERCONTEXT_H #define _ASMJIT_X86_X86COMPILERCONTEXT_H // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/podvector.h" #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_X86 //! @{ // ============================================================================ // [AsmJit::X86CompilerContext] // ============================================================================ //! @internal //! //! @brief Compiler context is used by @ref X86Compiler. //! //! X86Compiler context is used during compilation and normally developer doesn't //! need access to it. The context is user per function (it's reset after each //! function is generated). struct X86CompilerContext : public CompilerContext { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref X86CompilerContext instance. ASMJIT_API X86CompilerContext(X86Compiler* x86Compiler); //! @brief Destroy the @ref X86CompilerContext instance. ASMJIT_API ~X86CompilerContext(); // -------------------------------------------------------------------------- // [Accessor] // -------------------------------------------------------------------------- //! @brief Get compiler as @ref X86Compiler. inline X86Compiler* getCompiler() const { return reinterpret_cast(_compiler); } //! @brief Get function as @ref X86CompilerFuncDecl. inline X86CompilerFuncDecl* getFunc() const { return reinterpret_cast(_func); } // -------------------------------------------------------------------------- // [Clear] // -------------------------------------------------------------------------- //! @brief Clear context, preparing it for next function generation. ASMJIT_API void _clear(); // -------------------------------------------------------------------------- // [Register Allocator] // -------------------------------------------------------------------------- //! @brief Allocate variable //! //! Calls @c allocGpVar, @c allocMmVar or @c allocXmmVar methods. ASMJIT_API void allocVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags); //! @brief Save variable. //! //! Calls @c saveGpVar, @c saveMmVar or @c saveXmmVar methods. ASMJIT_API void saveVar(X86CompilerVar* cv); //! @brief Spill variable. //! //! Calls @c spillGpVar, @c spillMmVar or @c spillXmmVar methods. ASMJIT_API void spillVar(X86CompilerVar* cv); //! @brief Unuse variable (didn't spill, just forget about it). ASMJIT_API void unuseVar(X86CompilerVar* cv, uint32_t toState); //! @brief Helper method that is called for each variable per item. inline void _unuseVarOnEndOfScope(CompilerItem* item, X86CompilerVar* cv) { if (cv->lastItem == item) unuseVar(cv, kVarStateUnused); } //! @overload inline void _unuseVarOnEndOfScope(CompilerItem* item, VarAllocRecord* rec) { X86CompilerVar* cv = rec->vdata; if (cv->lastItem == item || (rec->vflags & kVarAllocUnuseAfterUse)) unuseVar(cv, kVarStateUnused); } //! @overload inline void _unuseVarOnEndOfScope(CompilerItem* item, VarCallRecord* rec) { X86CompilerVar* v = rec->vdata; if (v->lastItem == item || (rec->flags & VarCallRecord::kFlagUnuseAfterUse)) unuseVar(v, kVarStateUnused); } //! @brief Allocate variable (GP). ASMJIT_API void allocGpVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags); //! @brief Save variable (GP). ASMJIT_API void saveGpVar(X86CompilerVar* cv); //! @brief Spill variable (GP). ASMJIT_API void spillGpVar(X86CompilerVar* cv); //! @brief Allocate variable (MM). ASMJIT_API void allocMmVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags); //! @brief Save variable (MM). ASMJIT_API void saveMmVar(X86CompilerVar* cv); //! @brief Spill variable (MM). ASMJIT_API void spillMmVar(X86CompilerVar* cv); //! @brief Allocate variable (XMM). ASMJIT_API void allocXmmVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags); //! @brief Save variable (XMM). ASMJIT_API void saveXmmVar(X86CompilerVar* cv); //! @brief Spill variable (XMM). ASMJIT_API void spillXmmVar(X86CompilerVar* cv); //! @brief Emit load variable instruction(s). ASMJIT_API void emitLoadVar(X86CompilerVar* cv, uint32_t regIndex); //! @brief Emit save variable instruction(s). ASMJIT_API void emitSaveVar(X86CompilerVar* cv, uint32_t regIndex); //! @brief Emit move variable instruction(s). ASMJIT_API void emitMoveVar(X86CompilerVar* cv, uint32_t regIndex, uint32_t vflags); //! @brief Emit exchange variable instruction(s). ASMJIT_API void emitExchangeVar(X86CompilerVar* cv, uint32_t regIndex, uint32_t vflags, X86CompilerVar* other); //! @brief Called each time a variable is alloceted. ASMJIT_API void _postAlloc(X86CompilerVar* cv, uint32_t vflags); //! @brief Marks variable home memory as used (must be called at least once //! for each variable that uses function local memory - stack). ASMJIT_API void _markMemoryUsed(X86CompilerVar* cv); ASMJIT_API Mem _getVarMem(X86CompilerVar* cv); ASMJIT_API X86CompilerVar* _getSpillCandidateGP(); ASMJIT_API X86CompilerVar* _getSpillCandidateMM(); ASMJIT_API X86CompilerVar* _getSpillCandidateXMM(); ASMJIT_API X86CompilerVar* _getSpillCandidateGeneric(X86CompilerVar** varArray, uint32_t count); inline bool _isActive(X86CompilerVar* cv) { return cv->nextActive != NULL; } ASMJIT_API void _addActive(X86CompilerVar* cv); ASMJIT_API void _freeActive(X86CompilerVar* cv); ASMJIT_API void _freeAllActive(); ASMJIT_API void _allocatedVariable(X86CompilerVar* cv); inline void _allocatedGpRegister(uint32_t index) { _x86State.usedGP |= IntUtil::maskFromIndex(index); _modifiedGpRegisters |= IntUtil::maskFromIndex(index); } inline void _allocatedMmRegister(uint32_t index) { _x86State.usedMM |= IntUtil::maskFromIndex(index); _modifiedMmRegisters |= IntUtil::maskFromIndex(index); } inline void _allocatedXmmRegister(uint32_t index) { _x86State.usedXMM |= IntUtil::maskFromIndex(index); _modifiedXmmRegisters |= IntUtil::maskFromIndex(index); } inline void _freedGpRegister(uint32_t index) { _x86State.usedGP &= ~IntUtil::maskFromIndex(index); } inline void _freedMmRegister(uint32_t index) { _x86State.usedMM &= ~IntUtil::maskFromIndex(index); } inline void _freedXmmRegister(uint32_t index) { _x86State.usedXMM &= ~IntUtil::maskFromIndex(index); } inline void _markGpRegisterModified(uint32_t index) { _modifiedGpRegisters |= IntUtil::maskFromIndex(index); } inline void _markMmRegisterModified(uint32_t index) { _modifiedMmRegisters |= IntUtil::maskFromIndex(index); } inline void _markXmmRegisterModified(uint32_t index) { _modifiedXmmRegisters |= IntUtil::maskFromIndex(index); } // TODO: Find code which uses this and improve. inline void _newRegisterHomeIndex(X86CompilerVar* cv, uint32_t idx) { if (cv->homeRegisterIndex == kRegIndexInvalid) cv->homeRegisterIndex = idx; cv->prefRegisterMask |= (1U << idx); } // TODO: Find code which uses this and improve. inline void _newRegisterHomeMask(X86CompilerVar* cv, uint32_t mask) { cv->prefRegisterMask |= mask; } // -------------------------------------------------------------------------- // [Operand Patcher] // -------------------------------------------------------------------------- ASMJIT_API void translateOperands(Operand* operands, uint32_t count); // -------------------------------------------------------------------------- // [Backward Code] // -------------------------------------------------------------------------- ASMJIT_API void addBackwardCode(X86CompilerJmpInst* from); // -------------------------------------------------------------------------- // [Forward Jump] // -------------------------------------------------------------------------- ASMJIT_API void addForwardJump(X86CompilerJmpInst* inst); // -------------------------------------------------------------------------- // [State] // -------------------------------------------------------------------------- ASMJIT_API X86CompilerState* _saveState(); ASMJIT_API void _assignState(X86CompilerState* state); ASMJIT_API void _restoreState(X86CompilerState* state, uint32_t targetOffset = kInvalidValue); // -------------------------------------------------------------------------- // [Memory Allocator] // -------------------------------------------------------------------------- ASMJIT_API VarMemBlock* _allocMemBlock(uint32_t size); ASMJIT_API void _freeMemBlock(VarMemBlock* mem); ASMJIT_API void _allocMemoryOperands(); ASMJIT_API void _patchMemoryOperands(CompilerItem* start, CompilerItem* stop); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief X86 specific compiler state (linked with @ref _state). X86CompilerState _x86State; //! @brief Forward jumps (single linked list). ForwardJumpData* _forwardJumps; //! @brief Global modified GP registers mask (per function). uint32_t _modifiedGpRegisters; //! @brief Global modified MM registers mask (per function). uint32_t _modifiedMmRegisters; //! @brief Global modified XMM registers mask (per function). uint32_t _modifiedXmmRegisters; //! @brief Whether the EBP/RBP register can be used by register allocator. uint32_t _allocableEBP; //! @brief ESP adjust constant (changed during PUSH/POP or when using //! stack. int _adjustESP; //! @brief Function arguments base pointer (register). uint32_t _argumentsBaseReg; //! @brief Function arguments base offset. int32_t _argumentsBaseOffset; //! @brief Function arguments displacement. int32_t _argumentsActualDisp; //! @brief Function variables base pointer (register). uint32_t _variablesBaseReg; //! @brief Function variables base offset. int32_t _variablesBaseOffset; //! @brief Function variables displacement. int32_t _variablesActualDisp; //! @brief Used memory blocks (for variables, here is each created mem block //! that can be also in _memFree list). VarMemBlock* _memUsed; //! @brief Free memory blocks (freed, prepared for another allocation). VarMemBlock* _memFree; //! @brief Count of 4-byte memory blocks used by the function. uint32_t _mem4BlocksCount; //! @brief Count of 8-byte memory blocks used by the function. uint32_t _mem8BlocksCount; //! @brief Count of 16-byte memory blocks used by the function. uint32_t _mem16BlocksCount; //! @brief Count of total bytes of stack memory used by the function. uint32_t _memBytesTotal; //! @brief List of items which need to be translated. These items are filled //! by @c addBackwardCode(). PodVector _backCode; //! @brief Backward code position (starts at 0). sysuint_t _backPos; //! @brief Whether to emit comments. bool _emitComments; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_X86_X86COMPILERCONTEXT_H desmume-0.9.9/src/utils/AsmJit/x86/x86assembler.cpp0000644000175000017500000025110412140261626022517 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/context.h" #include "../core/cpuinfo.h" #include "../core/defs.h" #include "../core/intutil.h" #include "../core/logger.h" #include "../core/memorymanager.h" #include "../core/memorymarker.h" #include "../core/stringutil.h" #include "../x86/x86assembler.h" #include "../x86/x86cpuinfo.h" #include "../x86/x86defs.h" #include "../x86/x86operand.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [Constants] // ============================================================================ enum { kMaxCommentLength = 80 }; // ============================================================================ // [AsmJit::X64TrampolineWriter] // ============================================================================ #if defined(ASMJIT_X64) //! @brief Class used to determine size of trampoline and as trampoline writer. struct X64TrampolineWriter { // Size of trampoline enum { kSizeJmp = 6, kSizeAddr = 8, kSizeTotal = kSizeJmp + kSizeAddr }; // Write trampoline into code at address @a code that will jump to @a target. static void writeTrampoline(uint8_t* code, uint64_t target) { code[0] = 0xFF; // Jmp OpCode. code[1] = 0x25; // ModM (RIP addressing). ((uint32_t*)(code + 2))[0] = 0; // Offset (zero). ((uint64_t*)(code + kSizeJmp))[0] = (uint64_t)target; // Absolute address. } }; #endif // ASMJIT_X64 // ============================================================================ // [AsmJit::X86Assembler - Construction / Destruction] // ============================================================================ X86Assembler::X86Assembler(Context* context) : Assembler(context) { _properties = IntUtil::maskFromIndex(kX86PropertyOptimizedAlign); } X86Assembler::~X86Assembler() { } // ============================================================================ // [AsmJit::X86Assembler - Buffer - Setters (X86-Extensions)] // ============================================================================ void X86Assembler::setVarAt(size_t pos, sysint_t i, uint8_t isUnsigned, uint32_t size) { if (size == 1 && !isUnsigned) setByteAt (pos, (int8_t )i); else if (size == 1 && isUnsigned) setByteAt (pos, (uint8_t )i); else if (size == 2 && !isUnsigned) setWordAt (pos, (int16_t )i); else if (size == 2 && isUnsigned) setWordAt (pos, (uint16_t)i); else if (size == 4 && !isUnsigned) setDWordAt(pos, (int32_t )i); else if (size == 4 && isUnsigned) setDWordAt(pos, (uint32_t)i); #if defined(ASMJIT_X64) else if (size == 8 && !isUnsigned) setQWordAt(pos, (int64_t )i); else if (size == 8 && isUnsigned) setQWordAt(pos, (uint64_t)i); #endif // ASMJIT_X64 else ASMJIT_ASSERT(0); } // ============================================================================ // [AsmJit::X86Assembler - Emit] // ============================================================================ void X86Assembler::_emitModM( uint8_t opReg, const Mem& mem, sysint_t immSize) { ASMJIT_ASSERT(mem.getType() == kOperandMem); uint8_t baseReg = mem.getBase() & 0x7; uint8_t indexReg = mem.getIndex() & 0x7; sysint_t disp = mem.getDisplacement(); uint32_t shift = mem.getShift(); if (mem.getMemType() == kOperandMemNative) { // [base + displacemnt] if (!mem.hasIndex()) { // ESP/RSP/R12 == 4 if (baseReg == 4) { uint8_t mod = 0; if (disp) mod = IntUtil::isInt8(disp) ? 1 : 2; _emitMod(mod, opReg, 4); _emitSib(0, 4, 4); if (disp) { if (IntUtil::isInt8(disp)) _emitByte((int8_t)disp); else _emitInt32((int32_t)disp); } } // EBP/RBP/R13 == 5 else if (baseReg != 5 && disp == 0) { _emitMod(0, opReg, baseReg); } else if (IntUtil::isInt8(disp)) { _emitMod(1, opReg, baseReg); _emitByte((int8_t)disp); } else { _emitMod(2, opReg, baseReg); _emitInt32((int32_t)disp); } } // [base + index * scale + displacemnt] else { // ASMJIT_ASSERT(indexReg != RID_ESP); // EBP/RBP/R13 == 5 if (baseReg != 5 && disp == 0) { _emitMod(0, opReg, 4); _emitSib(shift, indexReg, baseReg); } else if (IntUtil::isInt8(disp)) { _emitMod(1, opReg, 4); _emitSib(shift, indexReg, baseReg); _emitByte((int8_t)disp); } else { _emitMod(2, opReg, 4); _emitSib(shift, indexReg, baseReg); _emitInt32((int32_t)disp); } } } // Address | 32-bit mode | 64-bit mode // ------------------------------+-------------+--------------- // [displacement] | ABSOLUTE | RELATIVE (RIP) // [index * scale + displacemnt] | ABSOLUTE | ABSOLUTE (ZERO EXTENDED) else { // - In 32-bit mode the absolute addressing model is used. // - In 64-bit mode the relative addressing model is used together with // the absolute addressing. Main problem is that if instruction // contains SIB then relative addressing (RIP) is not possible. #if defined(ASMJIT_X86) if (mem.hasIndex()) { // ASMJIT_ASSERT(mem.getMemIndex() != 4); // ESP/RSP == 4 _emitMod(0, opReg, 4); _emitSib(shift, indexReg, 5); } else { _emitMod(0, opReg, 5); } // X86 uses absolute addressing model, all relative addresses will be // relocated to absolute ones. if (mem.getMemType() == kOperandMemLabel) { LabelData& l_data = _labels[mem._mem.base & kOperandIdValueMask]; RelocData r_data; uint32_t relocId = _relocData.getLength(); // Relative addressing will be relocated to absolute address. r_data.type = kRelocRelToAbs; r_data.size = 4; r_data.offset = getOffset(); r_data.destination = disp; if (l_data.offset != -1) { // Bound label. r_data.destination += l_data.offset; // Add a dummy DWORD. _emitInt32(0); } else { // Non-bound label. _emitDisplacement(l_data, -4 - immSize, 4)->relocId = relocId; } _relocData.append(r_data); } else { // Absolute address _emitInt32( (int32_t)((uint8_t*)mem._mem.target + disp) ); } #else // X64 uses relative addressing model if (mem.getMemType() == kOperandMemLabel) { LabelData& l_data = _labels[mem._mem.base & kOperandIdValueMask]; if (mem.hasIndex()) { // Indexing is not possible. setError(kErrorIllegalAddressing); return; } // Relative address (RIP +/- displacement). _emitMod(0, opReg, 5); disp -= (4 + immSize); if (l_data.offset != -1) { // Bound label. disp += getOffset() - l_data.offset; // Displacement is known. _emitInt32((int32_t)disp); } else { // Non-bound label. _emitDisplacement(l_data, disp, 4); } } else { // Absolute address (truncated to 32-bits), this kind of address requires // SIB byte (4). _emitMod(0, opReg, 4); if (mem.hasIndex()) { // ASMJIT_ASSERT(mem.getMemIndex() != 4); // ESP/RSP == 4 _emitSib(shift, indexReg, 5); } else { _emitSib(0, 4, 5); } // Truncate to 32-bits. sysuint_t target = (sysuint_t)((uint8_t*)mem._mem.target + disp); if (target > (sysuint_t)0xFFFFFFFF) { if (_logger) { _logger->logString("*** ASSEMBER WARNING - Absolute address truncated to 32-bits.\n"); } target &= 0xFFFFFFFF; } _emitInt32( (int32_t)((uint32_t)target) ); } #endif // ASMJIT_X64 } } void X86Assembler::_emitModRM( uint8_t opReg, const Operand& op, sysint_t immSize) { ASMJIT_ASSERT(op.getType() == kOperandReg || op.getType() == kOperandMem); if (op.getType() == kOperandReg) _emitModR(opReg, reinterpret_cast(op).getRegCode()); else _emitModM(opReg, reinterpret_cast(op), immSize); } void X86Assembler::_emitSegmentPrefix(const Operand& rm) { static const uint8_t segmentCode[6] = { 0x26, // ES 0x2E, // SS 0x36, // SS 0x3E, // DS 0x64, // FS 0x65 // GS }; if (!rm.isMem()) return; uint32_t seg = reinterpret_cast(rm).getSegment(); if (seg >= kX86RegNumSeg) return; _emitByte(segmentCode[seg]); } void X86Assembler::_emitX86Inl( uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t reg, bool forceRexPrefix) { // 16-bit prefix. if (i16bit) _emitByte(0x66); // Instruction prefix. if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24)); // REX prefix. #if defined(ASMJIT_X64) _emitRexR(rexw, 0, reg, forceRexPrefix); #endif // ASMJIT_X64 // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16)); if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8)); _emitByte((uint8_t)(opCode & 0x000000FF) + (reg & 0x7)); } void X86Assembler::_emitX86RM( uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t o, const Operand& op, sysint_t immSize, bool forceRexPrefix) { // 16-bit prefix. if (i16bit) _emitByte(0x66); // Segment prefix. _emitSegmentPrefix(op); // Instruction prefix. if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24)); // REX prefix. #if defined(ASMJIT_X64) _emitRexRM(rexw, o, op, forceRexPrefix); #endif // ASMJIT_X64 // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16)); if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8)); _emitByte((uint8_t)(opCode & 0x000000FF)); // Mod R/M. _emitModRM(o, op, immSize); } void X86Assembler::_emitFpu(uint32_t opCode) { _emitOpCode(opCode); } void X86Assembler::_emitFpuSTI(uint32_t opCode, uint32_t sti) { // Illegal stack offset. ASMJIT_ASSERT(0 <= sti && sti < 8); _emitOpCode(opCode + sti); } void X86Assembler::_emitFpuMEM(uint32_t opCode, uint8_t opReg, const Mem& mem) { // Segment prefix. _emitSegmentPrefix(mem); // Instruction prefix. if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24)); // REX prefix. #if defined(ASMJIT_X64) _emitRexRM(0, opReg, mem, false); #endif // ASMJIT_X64 // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16)); if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8)); _emitByte((uint8_t)((opCode & 0x000000FF))); _emitModM(opReg, mem, 0); } void X86Assembler::_emitMmu(uint32_t opCode, uint8_t rexw, uint8_t opReg, const Operand& src, sysint_t immSize) { // Segment prefix. _emitSegmentPrefix(src); // Instruction prefix. if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24)); // REX prefix. #if defined(ASMJIT_X64) _emitRexRM(rexw, opReg, src, false); #endif // ASMJIT_X64 // Instruction opcodes. if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16)); // No checking, MMX/SSE instructions have always two opcodes or more. _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8)); _emitByte((uint8_t)((opCode & 0x000000FF))); if (src.isReg()) _emitModR(opReg, reinterpret_cast(src).getRegCode()); else _emitModM(opReg, reinterpret_cast(src), immSize); } X86Assembler::LabelLink* X86Assembler::_emitDisplacement( LabelData& l_data, sysint_t inlinedDisplacement, int size) { ASMJIT_ASSERT(l_data.offset == -1); ASMJIT_ASSERT(size == 1 || size == 4); // Chain with label. LabelLink* link = _newLabelLink(); link->prev = l_data.links; link->offset = getOffset(); link->displacement = inlinedDisplacement; l_data.links = link; // Emit label size as dummy data. if (size == 1) _emitByte(0x01); else // if (size == 4) _emitDWord(0x04040404); return link; } void X86Assembler::_emitJmpOrCallReloc(uint32_t instruction, void* target) { RelocData rd; rd.type = kRelocTrampoline; #if defined(ASMJIT_X64) // If we are compiling in 64-bit mode, we can use trampoline if relative jump // is not possible. _trampolineSize += X64TrampolineWriter::kSizeTotal; #endif // ARCHITECTURE_SPECIFIC rd.size = 4; rd.offset = getOffset(); rd.address = target; _relocData.append(rd); // Emit dummy 32-bit integer (will be overwritten by relocCode()). _emitInt32(0); } //! @internal //! //! @brief Get whether the extended register (additional eight registers //! introduced by 64-bit mode) is used. static inline bool X86Assembler_isExtRegisterUsed(const Operand& op) { // Hacky, but correct. // - If operand type is register then extended register is register with // index 8 and greater (8 to 15 inclusive). // - If operand type is memory operand then we need to take care about // label (in _mem.base) and kInvalidValue, we just decrement the value // by 8 and check if it's at interval 0 to 7 inclusive (if it's there // then it's extended register. return (op.isReg() && (op._reg.code & kRegIndexMask) >= 8U) || (op.isMem() && ((((uint32_t)op._mem.base - 8U) < 8U) || (((uint32_t)op._mem.index - 8U) < 8U) )); } // Logging helpers. static const char* AssemblerX86_operandSize[] = { NULL, "byte ptr ", "word ptr ", NULL, "dword ptr ", NULL, NULL, NULL, "qword ptr ", NULL, "tword ptr ", NULL, NULL, NULL, NULL, NULL, "dqword ptr " }; static const char X86Assembler_segmentName[] = "es:\0" "cs:\0" "ss:\0" "ds:\0" "fs:\0" "gs:\0" "\0\0\0\0"; static char* X86Assembler_dumpInstructionName(char* buf, uint32_t code) { ASMJIT_ASSERT(code < _kX86InstCount); return StringUtil::copy(buf, x86InstInfo[code].getName()); } char* X86Assembler_dumpRegister(char* buf, uint32_t type, uint32_t index) { // NE == Not-Encodable. const char reg8l[] = "al\0\0" "cl\0\0" "dl\0\0" "bl\0\0" "spl\0" "bpl\0" "sil\0" "dil\0" ; const char reg8h[] = "ah\0\0" "ch\0\0" "dh\0\0" "bh\0\0" "NE\0\0" "NE\0\0" "NE\0\0" "NE\0\0"; const char reg16[] = "ax\0\0" "cx\0\0" "dx\0\0" "bx\0\0" "sp\0\0" "bp\0\0" "si\0\0" "di\0\0"; switch (type) { case kX86RegTypeGpbLo: if (index < 8) return StringUtil::copy(buf, ®8l[index*4]); *buf++ = 'r'; goto _EmitID; case kX86RegTypeGpbHi: if (index < 4) return StringUtil::copy(buf, ®8h[index*4]); _EmitNE: return StringUtil::copy(buf, "NE"); case kX86RegTypeGpw: if (index < 8) return StringUtil::copy(buf, ®16[index*4]); *buf++ = 'r'; buf = StringUtil::utoa(buf, index); *buf++ = 'w'; return buf; case kX86RegTypeGpd: if (index < 8) { *buf++ = 'e'; return StringUtil::copy(buf, ®16[index*4]); } *buf++ = 'r'; buf = StringUtil::utoa(buf, index); *buf++ = 'd'; return buf; case kX86RegTypeGpq: *buf++ = 'r'; if (index < 8) return StringUtil::copy(buf, ®16[index*4]); _EmitID: return StringUtil::utoa(buf, index); case kX86RegTypeX87: *buf++ = 's'; *buf++ = 't'; goto _EmitID; case kX86RegTypeMm: *buf++ = 'm'; *buf++ = 'm'; goto _EmitID; case kX86RegTypeXmm: *buf++ = 'x'; *buf++ = 'm'; *buf++ = 'm'; goto _EmitID; case kX86RegTypeYmm: *buf++ = 'y'; *buf++ = 'm'; *buf++ = 'm'; goto _EmitID; case kX86RegTypeSeg: if (index < kX86RegNumSeg) return StringUtil::copy(buf, &X86Assembler_segmentName[index*4], 2); goto _EmitNE; default: return buf; } } char* X86Assembler_dumpOperand(char* buf, const Operand* op, uint32_t memRegType, uint32_t loggerFlags) { if (op->isReg()) { const Reg& reg = reinterpret_cast(*op); return X86Assembler_dumpRegister(buf, reg.getRegType(), reg.getRegIndex()); } else if (op->isMem()) { const Mem& mem = reinterpret_cast(*op); uint32_t seg = mem.getSegment(); bool isAbsolute = false; if (op->getSize() <= 16) buf = StringUtil::copy(buf, AssemblerX86_operandSize[op->getSize()]); if (seg < kX86RegNumSeg) buf = StringUtil::copy(buf, &X86Assembler_segmentName[seg * 4]); *buf++ = '['; switch (mem.getMemType()) { case kOperandMemNative: { // [base + index << shift + displacement] buf = X86Assembler_dumpRegister(buf, memRegType, mem.getBase()); break; } case kOperandMemLabel: { // [label + index << shift + displacement] buf += sprintf(buf, "L.%u", mem.getBase() & kOperandIdValueMask); break; } case kOperandMemAbsolute: { // [absolute] isAbsolute = true; buf = StringUtil::utoa(buf, (sysuint_t)mem.getTarget() + mem.getDisplacement(), 16); break; } } if (mem.hasIndex()) { buf = StringUtil::copy(buf, " + "); buf = X86Assembler_dumpRegister(buf, memRegType, mem.getIndex()); if (mem.getShift()) { buf = StringUtil::copy(buf, " * "); *buf++ = "1248"[mem.getShift() & 3]; } } if (mem.getDisplacement() && !isAbsolute) { sysint_t d = mem.getDisplacement(); uint32_t base = 10; char sign = '+'; if (d < 0) { d = -d; sign = '-'; } buf[0] = ' '; buf[1] = sign; buf[2] = ' '; buf += 3; if ((loggerFlags & kLoggerOutputHexDisplacement) != 0 && d > 9) { buf[0] = '0'; buf[1] = 'x'; buf += 2; base = 16; } buf = StringUtil::utoa(buf, static_cast(d), base); } *buf++ = ']'; return buf; } else if (op->isImm()) { const Imm& i = reinterpret_cast(*op); sysuint_t value = i.getUValue(); uint32_t base = 10; if ((loggerFlags & kLoggerOutputHexImmediate) && value > 9) base = 16; if (i.isUnsigned() || base == 16) { return StringUtil::utoa(buf, value, base); } else { return StringUtil::itoa(buf, static_cast(value), base); } } else if (op->isLabel()) { return buf + sprintf(buf, "L.%u", op->getId() & kOperandIdValueMask); } else { return StringUtil::copy(buf, "None"); } } static char* X86Assembler_dumpInstruction(char* buf, uint32_t code, uint32_t emitOptions, const Operand* o0, const Operand* o1, const Operand* o2, uint32_t memRegType, uint32_t loggerFlags) { // Rex, lock, and short prefix. if (emitOptions & kX86EmitOptionRex) buf = StringUtil::copy(buf, "rex ", 4); if (emitOptions & kX86EmitOptionLock) buf = StringUtil::copy(buf, "lock ", 5); if (emitOptions & kX86EmitOptionShortJump) buf = StringUtil::copy(buf, "short ", 6); // Dump instruction name. buf = X86Assembler_dumpInstructionName(buf, code); // Dump operands. if (!o0->isNone()) { *buf++ = ' '; buf = X86Assembler_dumpOperand(buf, o0, memRegType, loggerFlags); } if (!o1->isNone()) { *buf++ = ','; *buf++ = ' '; buf = X86Assembler_dumpOperand(buf, o1, memRegType, loggerFlags); } if (!o2->isNone()) { *buf++ = ','; *buf++ = ' '; buf = X86Assembler_dumpOperand(buf, o2, memRegType, loggerFlags); } return buf; } static char* X86Assembler_dumpComment(char* buf, size_t len, const uint8_t* binaryData, size_t binaryLen, const char* comment) { size_t currentLength = len; size_t commentLength = comment ? strnlen(comment, kMaxCommentLength) : 0; if (binaryLen || commentLength) { size_t align = 32; char sep = ';'; for (size_t i = (binaryLen == 0); i < 2; i++) { char* bufBegin = buf; // Append align. if (currentLength < align) { buf = StringUtil::fill(buf, ' ', align - currentLength); } // Append separator. if (sep) { *buf++ = sep; *buf++ = ' '; } // Append binary data or comment. if (i == 0) { buf = StringUtil::hex(buf, binaryData, binaryLen); if (commentLength == 0) break; } else { buf = StringUtil::copy(buf, comment, commentLength); } currentLength += (size_t)(buf - bufBegin); align += 18; sep = '|'; } } *buf++ = '\n'; return buf; } static const _OpReg _patchedHiRegs[4] = { // Operand |Size|Reserved0|Reserved1| OperandId | RegisterCode | // ----------+----+---------+---------+--------------+-----------------------+ { kOperandReg, 1, {0 ,0 }, kInvalidValue, kX86RegTypeGpbLo | 4 }, { kOperandReg, 1, {0 ,0 }, kInvalidValue, kX86RegTypeGpbLo | 5 }, { kOperandReg, 1, {0 ,0 }, kInvalidValue, kX86RegTypeGpbLo | 6 }, { kOperandReg, 1, {0 ,0 }, kInvalidValue, kX86RegTypeGpbLo | 7 } }; void X86Assembler::_emitInstruction(uint32_t code) { _emitInstruction(code, &noOperand, &noOperand, &noOperand); } void X86Assembler::_emitInstruction(uint32_t code, const Operand* o0) { _emitInstruction(code, o0, &noOperand, &noOperand); } void X86Assembler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1) { _emitInstruction(code, o0, o1, &noOperand); } void X86Assembler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2) { ASMJIT_ASSERT(o0 != NULL); ASMJIT_ASSERT(o1 != NULL); ASMJIT_ASSERT(o2 != NULL); const Operand* _loggerOperands[3]; uint32_t bLoHiUsed = 0; #if defined(ASMJIT_X86) uint32_t forceRexPrefix = false; #else uint32_t forceRexPrefix = _emitOptions & kX86EmitOptionRex; #endif uint32_t memRegType = kX86RegTypeGpz; #if defined(ASMJIT_DEBUG) bool assertIllegal = false; #endif // ASMJIT_DEBUG const Imm* immOperand = NULL; uint32_t immSize; #define _FINISHED() \ goto _End #define _FINISHED_IMMEDIATE(_Operand_, _Size_) \ do { \ immOperand = reinterpret_cast(_Operand_); \ immSize = (_Size_); \ goto _EmitImmediate; \ } while (0) // Convert operands to kOperandNone if needed. if (o0->isReg()) bLoHiUsed |= o0->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi); if (o1->isReg()) bLoHiUsed |= o1->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi); if (o2->isReg()) bLoHiUsed |= o2->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi); size_t beginOffset = getOffset(); const X86InstInfo* id = &x86InstInfo[code]; if (code >= _kX86InstCount) { setError(kErrorUnknownInstruction); goto _Cleanup; } // Check if register operand is BPL, SPL, SIL, DIL and do action that depends // to current mode: // - 64-bit: - Force REX prefix. // // Check if register operand is AH, BH, CH or DH and do action that depends // to current mode: // - 32-bit: - Patch operand index (index += 4), because we are using // different index what is used in opcode. // - 64-bit: - Check whether there is REX prefix and raise error if it is. // - Do the same as in 32-bit mode - patch register index. // // NOTE: This is a hit hacky, but I added this to older code-base and I have // no energy to rewrite it. Maybe in future all of this can be cleaned up! if (bLoHiUsed | forceRexPrefix) { _loggerOperands[0] = o0; _loggerOperands[1] = o1; _loggerOperands[2] = o2; #if defined(ASMJIT_X64) // Check if there is register that makes this instruction un-encodable. forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o0); forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o1); forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o2); if (o0->isRegType(kX86RegTypeGpbLo) && (o0->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true; else if (o1->isRegType(kX86RegTypeGpbLo) && (o1->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true; else if (o2->isRegType(kX86RegTypeGpbLo) && (o2->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true; if ((bLoHiUsed & kX86RegTypeGpbHi) != 0 && forceRexPrefix) { goto _IllegalInstruction; } #endif // ASMJIT_X64 // Patch GPB.HI operand index. if ((bLoHiUsed & kX86RegTypeGpbHi) != 0) { if (o0->isRegType(kX86RegTypeGpbHi)) o0 = reinterpret_cast(&_patchedHiRegs[o0->_reg.code & kRegIndexMask]); if (o1->isRegType(kX86RegTypeGpbHi)) o1 = reinterpret_cast(&_patchedHiRegs[o1->_reg.code & kRegIndexMask]); if (o2->isRegType(kX86RegTypeGpbHi)) o2 = reinterpret_cast(&_patchedHiRegs[o2->_reg.code & kRegIndexMask]); } } // Check for buffer space (and grow if needed). if (!canEmit()) goto _Cleanup; if (_emitOptions & kX86EmitOptionLock) { if (!id->isLockable()) goto _IllegalInstruction; _emitByte(0xF0); } switch (id->getGroup()) { case kX86InstGroupNone: { _FINISHED(); } case kX86InstGroupEmit: { _emitOpCode(id->_opCode[0]); _FINISHED(); } case kX86InstGroupArith: { uint32_t opCode = id->_opCode[0]; uint8_t opReg = (uint8_t)id->_opCodeR; // Mem <- Reg if (o0->isMem() && o1->isReg()) { _emitX86RM(opCode + (o1->getSize() != 1), o1->getSize() == 2, o1->getSize() == 8, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } // Reg <- Reg|Mem if (o0->isReg() && o1->isRegMem()) { _emitX86RM(opCode + 2 + (o0->getSize() != 1), o0->getSize() == 2, o0->getSize() == 8, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0, forceRexPrefix); _FINISHED(); } // Alternate Form - AL, AX, EAX, RAX. if (o0->isRegIndex(0) && o1->isImm()) { if (o0->getSize() == 1 || !IntUtil::isInt8(static_cast(o1)->getValue())) { if (o0->getSize() == 2) _emitByte(0x66); // 16-bit. else if (o0->getSize() == 8) _emitByte(0x48); // REX.W. _emitByte((opReg << 3) | (0x04 + (o0->getSize() != 1))); _FINISHED_IMMEDIATE(o1, IntUtil::_min(o0->getSize(), 4)); } } if (o0->isRegMem() && o1->isImm()) { const Imm& imm = reinterpret_cast(*o1); immSize = IntUtil::isInt8(imm.getValue()) ? 1 : IntUtil::_min(o0->getSize(), 4); _emitX86RM(id->_opCode[1] + (o0->getSize() != 1 ? (immSize != 1 ? 1 : 3) : 0), o0->getSize() == 2, o0->getSize() == 8, opReg, reinterpret_cast(*o0), immSize, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, immSize); } break; } case kX86InstGroupBSwap: { if (o0->isReg()) { const GpReg& dst = reinterpret_cast(*o0); #if defined(ASMJIT_X64) _emitRexR(dst.getRegType() == kX86RegTypeGpq, 1, dst.getRegCode(), forceRexPrefix); #endif // ASMJIT_X64 _emitByte(0x0F); _emitModR(1, dst.getRegCode()); _FINISHED(); } break; } case kX86InstGroupBTest: { if (o0->isRegMem() && o1->isReg()) { const Operand& dst = reinterpret_cast(*o0); const GpReg& src = reinterpret_cast(*o1); _emitX86RM(id->_opCode[0], src.isRegType(kX86RegTypeGpw), src.isRegType(kX86RegTypeGpq), src.getRegCode(), dst, 0, forceRexPrefix); _FINISHED(); } if (o0->isRegMem() && o1->isImm()) { const Operand& dst = reinterpret_cast(*o0); const Imm& src = reinterpret_cast(*o1); _emitX86RM(id->_opCode[1], dst.getSize() == 2, dst.getSize() == 8, (uint8_t)id->_opCodeR, dst, 1, forceRexPrefix); _FINISHED_IMMEDIATE(o1, 1); } break; } case kX86InstGroupCall: { if (o0->isRegTypeMem(kX86RegTypeGpz)) { const Operand& dst = reinterpret_cast(*o0); _emitX86RM(0xFF, 0, 0, 2, dst, 0, forceRexPrefix); _FINISHED(); } if (o0->isImm()) { const Imm& imm = reinterpret_cast(*o0); _emitByte(0xE8); _emitJmpOrCallReloc(kX86InstGroupCall, (void*)imm.getValue()); _FINISHED(); } if (o0->isLabel()) { LabelData& l_data = _labels[reinterpret_cast(o0)->getId() & kOperandIdValueMask]; if (l_data.offset != -1) { // Bound label. static const sysint_t rel32_size = 5; sysint_t offs = l_data.offset - getOffset(); ASMJIT_ASSERT(offs <= 0); _emitByte(0xE8); _emitInt32((int32_t)(offs - rel32_size)); } else { // Non-bound label. _emitByte(0xE8); _emitDisplacement(l_data, -4, 4); } _FINISHED(); } break; } case kX86InstGroupCrc32: { if (o0->isReg() && o1->isRegMem()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); ASMJIT_ASSERT(dst.getRegType() == kX86RegTypeGpd || dst.getRegType() == kX86RegTypeGpq); _emitX86RM(id->_opCode[0] + (src.getSize() != 1), src.getSize() == 2, dst.getRegType() == 8, dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupEnter: { if (o0->isImm() && o1->isImm()) { _emitByte(0xC8); _emitWord((uint16_t)(uintptr_t)reinterpret_cast(*o2).getValue()); _emitByte((uint8_t )(uintptr_t)reinterpret_cast(*o1).getValue()); _FINISHED(); } break; } case kX86InstGroupIMul: { // 1 operand if (o0->isRegMem() && o1->isNone() && o2->isNone()) { const Operand& src = reinterpret_cast(*o0); _emitX86RM(0xF6 + (src.getSize() != 1), src.getSize() == 2, src.getSize() == 8, 5, src, 0, forceRexPrefix); _FINISHED(); } // 2 operands else if (o0->isReg() && !o1->isNone() && o2->isNone()) { const GpReg& dst = reinterpret_cast(*o0); ASMJIT_ASSERT(!dst.isRegType(kX86RegTypeGpw)); if (o1->isRegMem()) { const Operand& src = reinterpret_cast(*o1); _emitX86RM(0x0FAF, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } else if (o1->isImm()) { const Imm& imm = reinterpret_cast(*o1); if (IntUtil::isInt8(imm.getValue())) { _emitX86RM(0x6B, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), dst, 1, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, 1); } else { immSize = dst.isRegType(kX86RegTypeGpw) ? 2 : 4; _emitX86RM(0x69, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), dst, immSize, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, immSize); } } } // 3 operands else if (o0->isReg() && o1->isRegMem() && o2->isImm()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); const Imm& imm = reinterpret_cast(*o2); if (IntUtil::isInt8(imm.getValue())) { _emitX86RM(0x6B, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, 1, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, 1); } else { immSize = dst.isRegType(kX86RegTypeGpw) ? 2 : 4; _emitX86RM(0x69, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, immSize, forceRexPrefix); _FINISHED_IMMEDIATE(&imm, immSize); } } break; } case kX86InstGroupIncDec: { if (o0->isRegMem()) { const Operand& dst = reinterpret_cast(*o0); // INC [r16|r32] in 64-bit mode is not encodable. #if defined(ASMJIT_X86) if ((dst.isReg()) && (dst.isRegType(kX86RegTypeGpw) || dst.isRegType(kX86RegTypeGpd))) { _emitX86Inl(id->_opCode[0], dst.isRegType(kX86RegTypeGpw), 0, reinterpret_cast(dst).getRegCode(), false); _FINISHED(); } #endif // ASMJIT_X86 _emitX86RM(id->_opCode[1] + (dst.getSize() != 1), dst.getSize() == 2, dst.getSize() == 8, (uint8_t)id->_opCodeR, dst, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupJcc: { if (o0->isLabel()) { LabelData& l_data = _labels[reinterpret_cast(o0)->getId() & kOperandIdValueMask]; uint32_t hint = (uint32_t)(o1->isImm() ? reinterpret_cast(*o1).getValue() : 0); bool isShortJump = (_emitOptions & kX86EmitOptionShortJump) != 0; // Emit jump hint if configured for that. if ((hint & (kCondHintLikely | kCondHintUnlikely)) && (_properties & (1 << kX86PropertyJumpHints))) { if (hint & kCondHintLikely) _emitByte(kX86CondPrefixLikely); else if (hint & kCondHintUnlikely) _emitByte(kX86CondPrefixUnlikely); } if (l_data.offset != -1) { // Bound label. static const sysint_t rel8_size = 2; static const sysint_t rel32_size = 6; sysint_t offs = l_data.offset - getOffset(); ASMJIT_ASSERT(offs <= 0); if (IntUtil::isInt8(offs - rel8_size)) { _emitByte(0x70 | (uint8_t)id->_opCode[0]); _emitByte((uint8_t)(int8_t)(offs - rel8_size)); // Change the emit options so logger can log instruction correctly. _emitOptions |= kX86EmitOptionShortJump; } else { if (isShortJump && _logger) { _logger->logString("*** ASSEMBLER WARNING: Emitting long conditional jump, but short jump instruction forced!\n"); _emitOptions &= ~kX86EmitOptionShortJump; } _emitByte(0x0F); _emitByte(0x80 | (uint8_t)id->_opCode[0]); _emitInt32((int32_t)(offs - rel32_size)); } } else { // Non-bound label. if (isShortJump) { _emitByte(0x70 | (uint8_t)id->_opCode[0]); _emitDisplacement(l_data, -1, 1); } else { _emitByte(0x0F); _emitByte(0x80 | (uint8_t)id->_opCode[0]); _emitDisplacement(l_data, -4, 4); } } _FINISHED(); } break; } case kX86InstGroupJmp: { if (o0->isRegMem()) { const Operand& dst = reinterpret_cast(*o0); _emitX86RM(0xFF, 0, 0, 4, dst, 0, forceRexPrefix); _FINISHED(); } if (o0->isImm()) { const Imm& imm = reinterpret_cast(*o0); _emitByte(0xE9); _emitJmpOrCallReloc(kX86InstGroupJmp, (void*)imm.getValue()); _FINISHED(); } if (o0->isLabel()) { LabelData& l_data = _labels[reinterpret_cast(o0)->getId() & kOperandIdValueMask]; bool isShortJump = (_emitOptions & kX86EmitOptionShortJump) != 0; if (l_data.offset != -1) { // Bound label. const sysint_t rel8_size = 2; const sysint_t rel32_size = 5; sysint_t offs = l_data.offset - getOffset(); if (IntUtil::isInt8(offs - rel8_size)) { _emitByte(0xEB); _emitByte((uint8_t)(int8_t)(offs - rel8_size)); // Change the emit options so logger can log instruction correctly. _emitOptions |= kX86EmitOptionShortJump; } else { if (isShortJump) { if (_logger) { _logger->logString("*** ASSEMBLER WARNING: Emitting long jump, but short jump instruction forced!\n"); _emitOptions &= ~kX86EmitOptionShortJump; } } _emitByte(0xE9); _emitInt32((int32_t)(offs - rel32_size)); } } else { // Non-bound label. if (isShortJump) { _emitByte(0xEB); _emitDisplacement(l_data, -1, 1); } else { _emitByte(0xE9); _emitDisplacement(l_data, -4, 4); } } _FINISHED(); } break; } case kX86InstGroupLea: { if (o0->isReg() && o1->isMem()) { const GpReg& dst = reinterpret_cast(*o0); const Mem& src = reinterpret_cast(*o1); // Size override prefix support. if (src.getSizePrefix()) { _emitByte(0x67); #if defined(ASMJIT_X86) memRegType = kX86RegTypeGpw; #else memRegType = kX86RegTypeGpd; #endif } _emitX86RM(0x8D, dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupMem: { if (o0->isMem()) { _emitX86RM(id->_opCode[0], 0, (uint8_t)id->_opCode[1], (uint8_t)id->_opCodeR, reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupMov: { const Operand& dst = *o0; const Operand& src = *o1; switch (dst.getType() << 4 | src.getType()) { // Reg <- Reg/Mem case (kOperandReg << 4) | kOperandReg: { // Reg <- Sreg if (src.isRegType(kX86RegTypeSeg)) { ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpw) || dst.isRegType(kX86RegTypeGpd) || dst.isRegType(kX86RegTypeGpq) ); _emitX86RM(0x8C, dst.getSize() == 2, dst.getSize() == 8, reinterpret_cast(src).getRegCode(), reinterpret_cast(dst), 0, forceRexPrefix); _FINISHED(); } // Sreg <- Reg/Mem if (dst.isRegType(kX86RegTypeSeg)) { ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpw ) || src.isRegType(kX86RegTypeGpd ) || src.isRegType(kX86RegTypeGpq ) ); _Emit_Mov_Sreg_RM: _emitX86RM(0x8E, src.getSize() == 2, src.getSize() == 8, reinterpret_cast(dst).getRegCode(), reinterpret_cast(src), 0, forceRexPrefix); _FINISHED(); } ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpbLo) || src.isRegType(kX86RegTypeGpbHi) || src.isRegType(kX86RegTypeGpw ) || src.isRegType(kX86RegTypeGpd ) || src.isRegType(kX86RegTypeGpq ) ); // ... fall through ... } case (kOperandReg << 4) | kOperandMem: { // Sreg <- Mem if (dst.isRegType(kX86RegTypeSeg)) { goto _Emit_Mov_Sreg_RM; } ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpbLo) || dst.isRegType(kX86RegTypeGpbHi) || dst.isRegType(kX86RegTypeGpw ) || dst.isRegType(kX86RegTypeGpd ) || dst.isRegType(kX86RegTypeGpq ) ); _emitX86RM(0x0000008A + (dst.getSize() != 1), dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), reinterpret_cast(dst).getRegCode(), reinterpret_cast(src), 0, forceRexPrefix); _FINISHED(); } // Reg <- Imm case (kOperandReg << 4) | kOperandImm: { const GpReg& dst = reinterpret_cast(*o0); const Imm& src = reinterpret_cast(*o1); // In 64-bit mode the immediate can be 64-bits long if the // destination operand type is register (otherwise 32-bits). immSize = dst.getSize(); #if defined(ASMJIT_X64) // Optimize instruction size by using 32-bit immediate if value can // fit into it. if (immSize == 8 && IntUtil::isInt32(src.getValue())) { _emitX86RM(0xC7, 0, // 16BIT 1, // REX.W 0, // O dst, 0, forceRexPrefix); immSize = 4; } else { #endif // ASMJIT_X64 _emitX86Inl((dst.getSize() == 1 ? 0xB0 : 0xB8), dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), forceRexPrefix); #if defined(ASMJIT_X64) } #endif // ASMJIT_X64 _FINISHED_IMMEDIATE(&src, immSize); } // Mem <- Reg/Sreg case (kOperandMem << 4) | kOperandReg: { if (src.isRegType(kX86RegTypeSeg)) { // Mem <- Sreg _emitX86RM(0x8C, dst.getSize() == 2, dst.getSize() == 8, reinterpret_cast(src).getRegCode(), reinterpret_cast(dst), 0, forceRexPrefix); _FINISHED(); } else { // Mem <- Reg ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpbLo) || src.isRegType(kX86RegTypeGpbHi) || src.isRegType(kX86RegTypeGpw ) || src.isRegType(kX86RegTypeGpd ) || src.isRegType(kX86RegTypeGpq ) ); _emitX86RM(0x88 + (src.getSize() != 1), src.isRegType(kX86RegTypeGpw), src.isRegType(kX86RegTypeGpq), reinterpret_cast(src).getRegCode(), reinterpret_cast(dst), 0, forceRexPrefix); _FINISHED(); } } // Mem <- Imm case (kOperandMem << 4) | kOperandImm: { immSize = IntUtil::_min(dst.getSize(), 4); _emitX86RM(0xC6 + (dst.getSize() != 1), dst.getSize() == 2, dst.getSize() == 8, 0, reinterpret_cast(dst), immSize, forceRexPrefix); _FINISHED_IMMEDIATE(&src, immSize); } } break; } case kX86InstGroupMovPtr: { if ((o0->isReg() && o1->isImm()) || (o0->isImm() && o1->isReg())) { bool reverse = o1->getType() == kOperandReg; uint8_t opCode = !reverse ? 0xA0 : 0xA2; const GpReg& reg = reinterpret_cast(!reverse ? *o0 : *o1); const Imm& imm = reinterpret_cast(!reverse ? *o1 : *o0); if (reg.getRegIndex() != 0) goto _IllegalInstruction; if (reg.isRegType(kX86RegTypeGpw)) _emitByte(0x66); #if defined(ASMJIT_X64) _emitRexR(reg.getSize() == 8, 0, 0, forceRexPrefix); #endif // ASMJIT_X64 _emitByte(opCode + (reg.getSize() != 1)); _FINISHED_IMMEDIATE(&imm, sizeof(sysint_t)); } break; } case kX86InstGroupMovSxMovZx: { if (o0->isReg() && o1->isRegMem()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); if (dst.getSize() == 1) goto _IllegalInstruction; if (src.getSize() != 1 && src.getSize() != 2) goto _IllegalInstruction; if (src.getSize() == 2 && dst.getSize() == 2) goto _IllegalInstruction; _emitX86RM(id->_opCode[0] + (src.getSize() != 1), dst.isRegType(kX86RegTypeGpw), dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } #if defined(ASMJIT_X64) case kX86InstGroupMovSxD: { if (o0->isReg() && o1->isRegMem()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); _emitX86RM(0x00000063, 0, 1, dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } #endif // ASMJIT_X64 case kX86InstGroupPush: { if (o0->isRegType(kX86RegTypeSeg)) { static const uint32_t opcodeList[] = { 0x06, // ES. 0x0E, // CS. 0x16, // SS. 0x1E, // DS. 0x0FA0, // FS. 0x0FA8 // GS. }; unsigned int segment = reinterpret_cast(o0)->getRegIndex(); ASMJIT_ASSERT(segment < kX86SegCount); unsigned int opcode = opcodeList[segment]; if (opcode > 0xFF) _emitByte(opcode >> 8); _emitByte(opcode & 0xFF); _FINISHED(); } // This section is only for immediates, memory/register operands are handled in kX86InstGroupPop. if (o0->isImm()) { const Imm& imm = reinterpret_cast(*o0); if (IntUtil::isInt8(imm.getValue())) { _emitByte(0x6A); _FINISHED_IMMEDIATE(&imm, 1); } else { _emitByte(0x68); _FINISHED_IMMEDIATE(&imm, 4); } } // ... goto kX86InstGroupPop ... } case kX86InstGroupPop: { if (o0->isRegType(kX86RegTypeSeg)) { static const uint32_t opcodeList[] = { 0x07, // ES. 0, // CS. 0x17, // SS. 0x1F, // DS. 0x0FA1, // FS. 0x0FA9 // GS. }; unsigned int segment = reinterpret_cast(o0)->getRegIndex(); ASMJIT_ASSERT(segment < kX86SegCount); unsigned int opcode = opcodeList[segment]; ASMJIT_ASSERT(opcode != 0); if (opcode > 0xFF) _emitByte(opcode >> 8); _emitByte(opcode & 0xFF); _FINISHED(); } if (o0->isReg()) { ASMJIT_ASSERT(o0->isRegType(kX86RegTypeGpw) || o0->isRegType(kX86RegTypeGpz)); _emitX86Inl(id->_opCode[0], o0->isRegType(kX86RegTypeGpw), 0, reinterpret_cast(*o0).getRegCode(), forceRexPrefix); _FINISHED(); } if (o0->isMem()) { _emitX86RM(id->_opCode[1], o0->getSize() == 2, 0, (uint8_t)id->_opCodeR, reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRegRm: { if (o0->isReg() && o1->isRegMem()) { const GpReg& dst = reinterpret_cast(*o0); const Operand& src = reinterpret_cast(*o1); ASMJIT_ASSERT(dst.getSize() != 1); _emitX86RM(id->_opCode[0], dst.getRegType() == kX86RegTypeGpw, dst.getRegType() == kX86RegTypeGpq, dst.getRegCode(), src, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRm: { if (o0->isRegMem()) { const Operand& op = reinterpret_cast(*o0); _emitX86RM(id->_opCode[0] + (op.getSize() != 1), op.getSize() == 2, op.getSize() == 8, (uint8_t)id->_opCodeR, op, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRmByte: { if (o0->isRegMem()) { const Operand& op = reinterpret_cast(*o0); // Only BYTE register or BYTE/TYPELESS memory location can be used. ASMJIT_ASSERT(op.getSize() <= 1); _emitX86RM(id->_opCode[0], false, false, 0, op, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRmReg: { if (o0->isRegMem() && o1->isReg()) { const Operand& dst = reinterpret_cast(*o0); const GpReg& src = reinterpret_cast(*o1); _emitX86RM(id->_opCode[0] + (src.getSize() != 1), src.getRegType() == kX86RegTypeGpw, src.getRegType() == kX86RegTypeGpq, src.getRegCode(), dst, 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupRep: { uint32_t opCode = id->_opCode[0]; uint32_t opSize = id->_opCode[1]; // Emit REP prefix (1 BYTE). _emitByte(opCode >> 24); if (opSize != 1) opCode++; // D, Q and W form. if (opSize == 2) _emitByte(0x66); // 16-bit prefix. #if defined(ASMJIT_X64) else if (opSize == 8) _emitByte(0x48); // REX.W prefix. #endif // ASMJIT_X64 // Emit opcode (1 BYTE). _emitByte(opCode & 0xFF); _FINISHED(); } case kX86InstGroupRet: { if (o0->isNone()) { _emitByte(0xC3); _FINISHED(); } else if (o0->isImm()) { const Imm& imm = reinterpret_cast(*o0); ASMJIT_ASSERT(IntUtil::isUInt16(imm.getValue())); if (imm.getValue() == 0) { _emitByte(0xC3); _FINISHED(); } else { _emitByte(0xC2); _FINISHED_IMMEDIATE(&imm, 2); } } break; } case kX86InstGroupRot: { if (o0->isRegMem() && (o1->isRegCode(kX86RegCl) || o1->isImm())) { // generate opcode. For these operations is base 0xC0 or 0xD0. bool useImm8 = o1->isImm() && reinterpret_cast(*o1).getValue() != 1; uint32_t opCode = useImm8 ? 0xC0 : 0xD0; // size and operand type modifies the opcode if (o0->getSize() != 1) opCode |= 0x01; if (o1->getType() == kOperandReg) opCode |= 0x02; _emitX86RM(opCode, o0->getSize() == 2, o0->getSize() == 8, (uint8_t)id->_opCodeR, reinterpret_cast(*o0), useImm8 ? 1 : 0, forceRexPrefix); if (useImm8) _FINISHED_IMMEDIATE(o1, 1); else _FINISHED(); } break; } case kX86InstGroupShldShrd: { if (o0->isRegMem() && o1->isReg() && (o2->isImm() || (o2->isReg() && o2->isRegCode(kX86RegCl)))) { const Operand& dst = reinterpret_cast(*o0); const GpReg& src1 = reinterpret_cast(*o1); const Operand& src2 = reinterpret_cast(*o2); ASMJIT_ASSERT(dst.getSize() == src1.getSize()); _emitX86RM(id->_opCode[0] + src2.isReg(), src1.isRegType(kX86RegTypeGpw), src1.isRegType(kX86RegTypeGpq), src1.getRegCode(), dst, src2.isImm() ? 1 : 0, forceRexPrefix); if (src2.isImm()) _FINISHED_IMMEDIATE(&src2, 1); else _FINISHED(); } break; } case kX86InstGroupTest: { if (o0->isRegMem() && o1->isReg()) { ASMJIT_ASSERT(o0->getSize() == o1->getSize()); _emitX86RM(0x84 + (o1->getSize() != 1), o1->getSize() == 2, o1->getSize() == 8, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } // Alternate Form - AL, AX, EAX, RAX. if (o0->isRegIndex(0) && o1->isImm()) { immSize = IntUtil::_min(o0->getSize(), 4); if (o0->getSize() == 2) _emitByte(0x66); // 16-bit. #if defined(ASMJIT_X64) _emitRexRM(o0->getSize() == 8, 0, reinterpret_cast(*o0), forceRexPrefix); #endif // ASMJIT_X64 _emitByte(0xA8 + (o0->getSize() != 1)); _FINISHED_IMMEDIATE(o1, immSize); } if (o0->isRegMem() && o1->isImm()) { immSize = IntUtil::_min(o0->getSize(), 4); if (o0->getSize() == 2) _emitByte(0x66); // 16-bit. _emitSegmentPrefix(reinterpret_cast(*o0)); // Segment prefix. #if defined(ASMJIT_X64) _emitRexRM(o0->getSize() == 8, 0, reinterpret_cast(*o0), forceRexPrefix); #endif // ASMJIT_X64 _emitByte(0xF6 + (o0->getSize() != 1)); _emitModRM(0, reinterpret_cast(*o0), immSize); _FINISHED_IMMEDIATE(o1, immSize); } break; } case kX86InstGroupXchg: { if (o0->isRegMem() && o1->isReg()) { const Operand& dst = reinterpret_cast(*o0); const GpReg& src = reinterpret_cast(*o1); if (src.isRegType(kX86RegTypeGpw)) _emitByte(0x66); // 16-bit. _emitSegmentPrefix(dst); // segment prefix #if defined(ASMJIT_X64) _emitRexRM(src.isRegType(kX86RegTypeGpq), src.getRegCode(), dst, forceRexPrefix); #endif // ASMJIT_X64 // Special opcode for index 0 registers (AX, EAX, RAX vs register). if ((dst.getType() == kOperandReg && dst.getSize() > 1) && (reinterpret_cast(dst).getRegCode() == 0 || reinterpret_cast(src).getRegCode() == 0 )) { uint8_t index = reinterpret_cast(dst).getRegCode() | src.getRegCode(); _emitByte(0x90 + index); _FINISHED(); } _emitByte(0x86 + (src.getSize() != 1)); _emitModRM(src.getRegCode(), dst, 0); _FINISHED(); } break; } case kX86InstGroupMovBE: { if (o0->isReg() && o1->isMem()) { _emitX86RM(0x000F38F0, o0->isRegType(kX86RegTypeGpw), o0->isRegType(kX86RegTypeGpq), reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0, forceRexPrefix); _FINISHED(); } if (o0->isMem() && o1->isReg()) { _emitX86RM(0x000F38F1, o1->isRegType(kX86RegTypeGpw), o1->isRegType(kX86RegTypeGpq), reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupX87StM: { if (o0->isRegType(kX86RegTypeX87)) { uint8_t i1 = reinterpret_cast(*o0).getRegIndex(); uint8_t i2 = 0; if (code != kX86InstFCom && code != kX86InstFComP) { if (!o1->isRegType(kX86RegTypeX87)) goto _IllegalInstruction; i2 = reinterpret_cast(*o1).getRegIndex(); } else if (i1 != 0 && i2 != 0) { goto _IllegalInstruction; } _emitByte(i1 == 0 ? ((id->_opCode[0] & 0xFF000000) >> 24) : ((id->_opCode[0] & 0x00FF0000) >> 16)); _emitByte(i1 == 0 ? ((id->_opCode[0] & 0x0000FF00) >> 8) + i2 : ((id->_opCode[0] & 0x000000FF) ) + i1); _FINISHED(); } if (o0->isMem() && (o0->getSize() == 4 || o0->getSize() == 8) && o1->isNone()) { const Mem& m = reinterpret_cast(*o0); // Segment prefix. _emitSegmentPrefix(m); _emitByte(o0->getSize() == 4 ? ((id->_opCode[0] & 0xFF000000) >> 24) : ((id->_opCode[0] & 0x00FF0000) >> 16)); _emitModM((uint8_t)id->_opCodeR, m, 0); _FINISHED(); } break; } case kX86InstGroupX87StI: { if (o0->isRegType(kX86RegTypeX87)) { uint8_t i = reinterpret_cast(*o0).getRegIndex(); _emitByte((uint8_t)((id->_opCode[0] & 0x0000FF00) >> 8)); _emitByte((uint8_t)((id->_opCode[0] & 0x000000FF) + i)); _FINISHED(); } break; } case kX86InstGroupX87Status: { if (o0->isReg() && reinterpret_cast(*o0).getRegType() <= kX86RegTypeGpq && reinterpret_cast(*o0).getRegIndex() == 0) { _emitOpCode(id->_opCode[1]); _FINISHED(); } if (o0->isMem()) { _emitX86RM(id->_opCode[0], 0, 0, (uint8_t)id->_opCodeR, reinterpret_cast(*o0), 0, forceRexPrefix); _FINISHED(); } break; } case kX86InstGroupX87FldFst: { if (o0->isRegType(kX86RegTypeX87)) { _emitByte((uint8_t)((id->_opCode[1] & 0xFF000000) >> 24)); _emitByte((uint8_t)((id->_opCode[1] & 0x00FF0000) >> 16) + reinterpret_cast(*o0).getRegIndex()); _FINISHED(); } // ... fall through to kX86InstGroupX87Mem ... } case kX86InstGroupX87Mem: { if (!o0->isMem()) goto _IllegalInstruction; const Mem& m = reinterpret_cast(*o0); uint8_t opCode = 0x00, mod = 0; if (o0->getSize() == 2 && (id->_opFlags[0] & kX86InstOpStM2)) { opCode = (uint8_t)((id->_opCode[0] & 0xFF000000) >> 24); mod = (uint8_t)id->_opCodeR; } if (o0->getSize() == 4 && (id->_opFlags[0] & kX86InstOpStM4)) { opCode = (uint8_t)((id->_opCode[0] & 0x00FF0000) >> 16); mod = (uint8_t)id->_opCodeR; } if (o0->getSize() == 8 && (id->_opFlags[0] & kX86InstOpStM8)) { opCode = (uint8_t)((id->_opCode[0] & 0x0000FF00) >> 8); mod = (uint8_t)((id->_opCode[0] & 0x000000FF) ); } if (opCode) { _emitSegmentPrefix(m); _emitByte(opCode); _emitModM(mod, m, 0); _FINISHED(); } break; } case kX86InstGroupMmuMov: { ASMJIT_ASSERT(id->_opFlags[0] != 0); ASMJIT_ASSERT(id->_opFlags[1] != 0); // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm if ((o0->isMem() && (id->_opFlags[0] & kX86InstOpMem) == 0) || (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) || (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) || (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) || (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) || (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) || (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) || (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) || (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) || (o1->isMem() && (id->_opFlags[1] & kX86InstOpMem) == 0) ) { goto _IllegalInstruction; } // Illegal. if (o0->isMem() && o1->isMem()) goto _IllegalInstruction; uint8_t rexw = ((id->_opFlags[0] | id->_opFlags[1]) & kX86InstOpNoRex) ? 0 : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq); // (X)MM|Reg <- (X)MM|Reg if (o0->isReg() && o1->isReg()) { _emitMmu(id->_opCode[0], rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // (X)MM|Reg <- Mem if (o0->isReg() && o1->isMem()) { _emitMmu(id->_opCode[0], rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // Mem <- (X)MM|Reg if (o0->isMem() && o1->isReg()) { _emitMmu(id->_opCode[1], rexw, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } break; } case kX86InstGroupMmuMovD: { if ((o0->isRegType(kX86RegTypeMm) || o0->isRegType(kX86RegTypeXmm)) && (o1->isRegType(kX86RegTypeGpd) || o1->isMem())) { _emitMmu(o0->isRegType(kX86RegTypeXmm) ? 0x66000F6E : 0x00000F6E, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if ((o0->isRegType(kX86RegTypeGpd) || o0->isMem()) && (o1->isRegType(kX86RegTypeMm) || o1->isRegType(kX86RegTypeXmm))) { _emitMmu(o1->isRegType(kX86RegTypeXmm) ? 0x66000F7E : 0x00000F7E, 0, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } break; } case kX86InstGroupMmuMovQ: { if (o0->isRegType(kX86RegTypeMm) && o1->isRegType(kX86RegTypeMm)) { _emitMmu(0x00000F6F, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if (o0->isRegType(kX86RegTypeXmm) && o1->isRegType(kX86RegTypeXmm)) { _emitMmu(0xF3000F7E, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // Convenience - movdq2q if (o0->isRegType(kX86RegTypeMm) && o1->isRegType(kX86RegTypeXmm)) { _emitMmu(0xF2000FD6, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // Convenience - movq2dq if (o0->isRegType(kX86RegTypeXmm) && o1->isRegType(kX86RegTypeMm)) { _emitMmu(0xF3000FD6, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if (o0->isRegType(kX86RegTypeMm) && o1->isMem()) { _emitMmu(0x00000F6F, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if (o0->isRegType(kX86RegTypeXmm) && o1->isMem()) { _emitMmu(0xF3000F7E, 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if (o0->isMem() && o1->isRegType(kX86RegTypeMm)) { _emitMmu(0x00000F7F, 0, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } if (o0->isMem() && o1->isRegType(kX86RegTypeXmm)) { _emitMmu(0x66000FD6, 0, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } #if defined(ASMJIT_X64) if ((o0->isRegType(kX86RegTypeMm) || o0->isRegType(kX86RegTypeXmm)) && (o1->isRegType(kX86RegTypeGpq) || o1->isMem())) { _emitMmu(o0->isRegType(kX86RegTypeXmm) ? 0x66000F6E : 0x00000F6E, 1, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } if ((o0->isRegType(kX86RegTypeGpq) || o0->isMem()) && (o1->isRegType(kX86RegTypeMm) || o1->isRegType(kX86RegTypeXmm))) { _emitMmu(o1->isRegType(kX86RegTypeXmm) ? 0x66000F7E : 0x00000F7E, 1, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 0); _FINISHED(); } #endif // ASMJIT_X64 break; } case kX86InstGroupMmuExtract: { if (!(o0->isRegMem() && (o1->isRegType(kX86RegTypeXmm) || (code == kX86InstPExtrW && o1->isRegType(kX86RegTypeMm))) && o2->isImm())) { goto _IllegalInstruction; } uint32_t opCode = id->_opCode[0]; uint8_t isGpdGpq = o0->isRegType(kX86RegTypeGpd) | o0->isRegType(kX86RegTypeGpq); if (code == kX86InstPExtrB && (o0->getSize() != 0 && o0->getSize() != 1) && !isGpdGpq) goto _IllegalInstruction; if (code == kX86InstPExtrW && (o0->getSize() != 0 && o0->getSize() != 2) && !isGpdGpq) goto _IllegalInstruction; if (code == kX86InstPExtrD && (o0->getSize() != 0 && o0->getSize() != 4) && !isGpdGpq) goto _IllegalInstruction; if (code == kX86InstPExtrQ && (o0->getSize() != 0 && o0->getSize() != 8) && !isGpdGpq) goto _IllegalInstruction; if (o1->isRegType(kX86RegTypeXmm)) opCode |= 0x66000000; if (o0->isReg()) { _emitMmu(opCode, id->_opCodeR | (uint8_t)o0->isRegType(kX86RegTypeGpq), reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 1); _FINISHED_IMMEDIATE(o2, 1); } if (o0->isMem()) { _emitMmu(opCode, (uint8_t)id->_opCodeR, reinterpret_cast(*o1).getRegCode(), reinterpret_cast(*o0), 1); _FINISHED_IMMEDIATE(o2, 1); } break; } case kX86InstGroupMmuPrefetch: { if (o0->isMem() && o1->isImm()) { const Mem& mem = reinterpret_cast(*o0); const Imm& hint = reinterpret_cast(*o1); _emitMmu(0x00000F18, 0, (uint8_t)hint.getValue(), mem, 0); _FINISHED(); } break; } case kX86InstGroupMmuRmI: { ASMJIT_ASSERT(id->_opFlags[0] != 0); ASMJIT_ASSERT(id->_opFlags[1] != 0); // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm if (!o0->isReg() || (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) || (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) || (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) || (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) || (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) || (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) || (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) || (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) || (o1->isMem() && (id->_opFlags[1] & kX86InstOpMem) == 0) || (o1->isImm() && (id->_opFlags[1] & kX86InstOpImm) == 0)) { goto _IllegalInstruction; } uint32_t prefix = ((id->_opFlags[0] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o0->isRegType(kX86RegTypeXmm)) || ((id->_opFlags[1] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o1->isRegType(kX86RegTypeXmm)) ? 0x66000000 : 0x00000000; uint8_t rexw = ((id->_opFlags[0] | id->_opFlags[1]) & kX86InstOpNoRex) ? 0 : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq); // (X)MM <- (X)MM (opcode0) if (o1->isReg()) { if ((id->_opFlags[1] & (kX86InstOpMmXmm | kX86InstOpGqd)) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[0] | prefix, rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // (X)MM <- Mem (opcode0) if (o1->isMem()) { if ((id->_opFlags[1] & kX86InstOpMem) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[0] | prefix, rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 0); _FINISHED(); } // (X)MM <- Imm (opcode1+opcodeR) if (o1->isImm()) { if ((id->_opFlags[1] & kX86InstOpImm) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[1] | prefix, rexw, (uint8_t)id->_opCodeR, reinterpret_cast(*o0), 1); _FINISHED_IMMEDIATE(o1, 1); } break; } case kX86InstGroupMmuRmImm8: { ASMJIT_ASSERT(id->_opFlags[0] != 0); ASMJIT_ASSERT(id->_opFlags[1] != 0); // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm if (!o0->isReg() || (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) || (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) || (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) || (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) || (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) || (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) || (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) || (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) || (o1->isMem() && (id->_opFlags[1] & kX86InstOpMem) == 0) || !o2->isImm()) { goto _IllegalInstruction; } uint32_t prefix = ((id->_opFlags[0] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o0->isRegType(kX86RegTypeXmm)) || ((id->_opFlags[1] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o1->isRegType(kX86RegTypeXmm)) ? 0x66000000 : 0x00000000; uint8_t rexw = ((id->_opFlags[0]|id->_opFlags[1]) & kX86InstOpNoRex) ? 0 : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq); // (X)MM <- (X)MM (opcode0) if (o1->isReg()) { if ((id->_opFlags[1] & (kX86InstOpMmXmm | kX86InstOpGqd)) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[0] | prefix, rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 1); _FINISHED_IMMEDIATE(o2, 1); } // (X)MM <- Mem (opcode0) if (o1->isMem()) { if ((id->_opFlags[1] & kX86InstOpMem) == 0) goto _IllegalInstruction; _emitMmu(id->_opCode[0] | prefix, rexw, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 1); _FINISHED_IMMEDIATE(o2, 1); } break; } case kX86InstGroupMmuRm3dNow: { if (o0->isRegType(kX86RegTypeMm) && (o1->isRegType(kX86RegTypeMm) || o1->isMem())) { _emitMmu(id->_opCode[0], 0, reinterpret_cast(*o0).getRegCode(), reinterpret_cast(*o1), 1); _emitByte((uint8_t)id->_opCode[1]); _FINISHED(); } break; } } _IllegalInstruction: // Set an error. If we run in release mode assertion will be not used, so we // must inform about invalid state. setError(kErrorIllegalInstruction); #if defined(ASMJIT_DEBUG) assertIllegal = true; #endif // ASMJIT_DEBUG goto _End; _EmitImmediate: { sysint_t value = immOperand->getValue(); switch (immSize) { case 1: _emitByte ((uint8_t )(sysuint_t)value); break; case 2: _emitWord ((uint16_t)(sysuint_t)value); break; case 4: _emitDWord((uint32_t)(sysuint_t)value); break; #if defined(ASMJIT_X64) case 8: _emitQWord((uint64_t)(sysuint_t)value); break; #endif // ASMJIT_X64 default: ASMJIT_ASSERT(0); } } _End: if (_logger #if defined(ASMJIT_DEBUG) || assertIllegal #endif // ASMJIT_DEBUG ) { char bufStorage[512]; char* buf = bufStorage; // Detect truncated operand. Imm immTemporary(0); uint32_t loggerFlags = 0; // Use the original operands, because BYTE some of them were replaced. if (bLoHiUsed) { o0 = _loggerOperands[0]; o1 = _loggerOperands[1]; o2 = _loggerOperands[2]; } if (immOperand) { sysint_t value = immOperand->getValue(); bool isUnsigned = immOperand->isUnsigned(); switch (immSize) { case 1: if ( isUnsigned && !IntUtil::isUInt8 (value)) { immTemporary.setValue((uint8_t)(sysuint_t)value, true ); break; } if (!isUnsigned && !IntUtil::isInt8 (value)) { immTemporary.setValue((uint8_t)(sysuint_t)value, false); break; } break; case 2: if ( isUnsigned && !IntUtil::isUInt16(value)) { immTemporary.setValue((uint16_t)(sysuint_t)value, true ); break; } if (!isUnsigned && !IntUtil::isInt16 (value)) { immTemporary.setValue((uint16_t)(sysuint_t)value, false); break; } break; case 4: if ( isUnsigned && !IntUtil::isUInt32(value)) { immTemporary.setValue((uint32_t)(sysuint_t)value, true ); break; } if (!isUnsigned && !IntUtil::isInt32 (value)) { immTemporary.setValue((uint32_t)(sysuint_t)value, false); break; } break; } if (immTemporary.getValue() != 0) { if (o0 == immOperand) o0 = &immTemporary; if (o1 == immOperand) o1 = &immTemporary; if (o2 == immOperand) o2 = &immTemporary; } } if (_logger) { buf = StringUtil::copy(buf, _logger->getInstructionPrefix()); loggerFlags = _logger->getFlags(); } buf = X86Assembler_dumpInstruction(buf, code, _emitOptions, o0, o1, o2, memRegType, loggerFlags); if ((loggerFlags & kLoggerOutputBinary) != 0) buf = X86Assembler_dumpComment(buf, (size_t)(buf - bufStorage), getCode() + beginOffset, getOffset() - beginOffset, _inlineComment); else buf = X86Assembler_dumpComment(buf, (size_t)(buf - bufStorage), NULL, 0, _inlineComment); // We don't need to NULL terminate the resulting string. #if defined(ASMJIT_DEBUG) if (_logger) #endif // ASMJIT_DEBUG _logger->logString(bufStorage, (size_t)(buf - bufStorage)); #if defined(ASMJIT_DEBUG) if (assertIllegal) { // Here we need to NULL terminate. buf[0] = '\0'; // Raise an assertion failure, because this situation shouldn't happen. assertionFailure(__FILE__, __LINE__, bufStorage); } #endif // ASMJIT_DEBUG } _Cleanup: _inlineComment = NULL; _emitOptions = 0; } void X86Assembler::_emitJcc(uint32_t code, const Label* label, uint32_t hint) { if (hint == kCondHintNone) { _emitInstruction(code, label); } else { Imm imm(hint); _emitInstruction(code, label, &imm); } } // ============================================================================ // [AsmJit::Assembler - Relocation helpers] // ============================================================================ size_t X86Assembler::relocCode(void* _dst, sysuint_t addressBase) const { // Copy code to virtual memory (this is a given _dst pointer). uint8_t* dst = reinterpret_cast(_dst); size_t coff = _buffer.getOffset(); size_t csize = getCodeSize(); // We are copying the exact size of the generated code. Extra code for trampolines // is generated on-the-fly by relocator (this code doesn't exist at the moment). memcpy(dst, _buffer.getData(), coff); #if defined(ASMJIT_X64) // Trampoline pointer. uint8_t* tramp = dst + coff; #endif // ASMJIT_X64 // Relocate all recorded locations. size_t i; size_t len = _relocData.getLength(); for (i = 0; i < len; i++) { const RelocData& r = _relocData[i]; sysint_t val; #if defined(ASMJIT_X64) // Whether to use trampoline, can be only used if relocation type is // kRelocAbsToRel. bool useTrampoline = false; #endif // ASMJIT_X64 // Be sure that reloc data structure is correct. ASMJIT_ASSERT((size_t)(r.offset + r.size) <= csize); switch (r.type) { case kRelocAbsToAbs: val = (sysint_t)(r.address); break; case kRelocRelToAbs: val = (sysint_t)(addressBase + r.destination); break; case kRelocAbsToRel: case kRelocTrampoline: val = (sysint_t)( (sysuint_t)r.address - (addressBase + (sysuint_t)r.offset + 4) ); #if defined(ASMJIT_X64) if (r.type == kRelocTrampoline && !IntUtil::isInt32(val)) { val = (sysint_t)( (sysuint_t)tramp - ((sysuint_t)_dst + (sysuint_t)r.offset + 4) ); useTrampoline = true; } #endif // ASMJIT_X64 break; default: ASMJIT_ASSERT(0); } switch (r.size) { case 4: *reinterpret_cast(dst + r.offset) = static_cast(val); break; case 8: *reinterpret_cast(dst + r.offset) = static_cast(val); break; default: ASMJIT_ASSERT(0); } #if defined(ASMJIT_X64) if (useTrampoline) { if (getLogger()) { getLogger()->logFormat("; Trampoline from %p -> %p\n", (int8_t*)addressBase + r.offset, r.address); } X64TrampolineWriter::writeTrampoline(tramp, (uint64_t)r.address); tramp += X64TrampolineWriter::kSizeTotal; } #endif // ASMJIT_X64 } #if defined(ASMJIT_X64) return (size_t)(tramp - dst); #else return (size_t)(coff); #endif // ASMJIT_X64 } // ============================================================================ // [AsmJit::Assembler - EmbedLabel] // ============================================================================ void X86Assembler::embedLabel(const Label& label) { ASMJIT_ASSERT(label.getId() != kInvalidValue); if (!canEmit()) return; LabelData& l_data = _labels[label.getId() & kOperandIdValueMask]; RelocData r_data; if (_logger) { _logger->logFormat(sizeof(sysint_t) == 4 ? ".dd L.%u\n" : ".dq L.%u\n", (uint32_t)label.getId() & kOperandIdValueMask); } r_data.type = kRelocRelToAbs; r_data.size = sizeof(sysint_t); r_data.offset = getOffset(); r_data.destination = 0; if (l_data.offset != -1) { // Bound label. r_data.destination = l_data.offset; } else { // Non-bound label. Need to chain. LabelLink* link = _newLabelLink(); link->prev = (LabelLink*)l_data.links; link->offset = getOffset(); link->displacement = 0; link->relocId = _relocData.getLength(); l_data.links = link; } _relocData.append(r_data); // Emit dummy intptr_t (4 or 8 bytes that depends on address size). _emitIntPtrT(0); } // ============================================================================ // [AsmJit::Assembler - Align] // ============================================================================ void X86Assembler::align(uint32_t m) { if (!canEmit()) return; if (_logger) _logger->logFormat("%s.align %u\n", _logger->getInstructionPrefix(), (uint)m); if (!m) return; if (m > 64) { ASMJIT_ASSERT(0); return; } sysint_t i = m - (getOffset() % m); if (i == m) return; if (_properties & (1 << kX86PropertyOptimizedAlign)) { const X86CpuInfo* ci = X86CpuInfo::getGlobal(); // NOPs optimized for Intel: // Intel 64 and IA-32 Architectures Software Developer's Manual // - Volume 2B // - Instruction Set Reference N-Z // - NOP // NOPs optimized for AMD: // Software Optimization Guide for AMD Family 10h Processors (Quad-Core) // - 4.13 - Code Padding with Operand-Size Override and Multibyte NOP // Intel and AMD. static const uint8_t nop1[] = { 0x90 }; static const uint8_t nop2[] = { 0x66, 0x90 }; static const uint8_t nop3[] = { 0x0F, 0x1F, 0x00 }; static const uint8_t nop4[] = { 0x0F, 0x1F, 0x40, 0x00 }; static const uint8_t nop5[] = { 0x0F, 0x1F, 0x44, 0x00, 0x00 }; static const uint8_t nop6[] = { 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00 }; static const uint8_t nop7[] = { 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t nop8[] = { 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t nop9[] = { 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }; // AMD. static const uint8_t nop10[] = { 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t nop11[] = { 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t* p; sysint_t n; if (ci->getVendorId() == kCpuIntel && ((ci->getFamily() & 0x0F) == 6 || (ci->getFamily() & 0x0F) == 15)) { do { switch (i) { case 1: p = nop1; n = 1; break; case 2: p = nop2; n = 2; break; case 3: p = nop3; n = 3; break; case 4: p = nop4; n = 4; break; case 5: p = nop5; n = 5; break; case 6: p = nop6; n = 6; break; case 7: p = nop7; n = 7; break; case 8: p = nop8; n = 8; break; default: p = nop9; n = 9; break; } i -= n; do { _emitByte(*p++); } while(--n); } while (i); return; } if (ci->getVendorId() == kCpuAmd && ci->getFamily() >= 0x0F) { do { switch (i) { case 1: p = nop1 ; n = 1; break; case 2: p = nop2 ; n = 2; break; case 3: p = nop3 ; n = 3; break; case 4: p = nop4 ; n = 4; break; case 5: p = nop5 ; n = 5; break; case 6: p = nop6 ; n = 6; break; case 7: p = nop7 ; n = 7; break; case 8: p = nop8 ; n = 8; break; case 9: p = nop9 ; n = 9; break; case 10: p = nop10; n = 10; break; default: p = nop11; n = 11; break; } i -= n; do { _emitByte(*p++); } while(--n); } while (i); return; } #if defined(ASMJIT_X86) // Legacy NOPs, 0x90 with 0x66 prefix. do { switch (i) { default: _emitByte(0x66); i--; case 3: _emitByte(0x66); i--; case 2: _emitByte(0x66); i--; case 1: _emitByte(0x90); i--; } } while(i); #endif } // Legacy NOPs, only 0x90. In 64-bit mode, we can't use 0x66 prefix. do { _emitByte(0x90); } while(--i); } // ============================================================================ // [AsmJit::Assembler - Label] // ============================================================================ Label X86Assembler::newLabel() { Label label; label._base.id = (uint32_t)_labels.getLength() | kOperandIdTypeLabel; LabelData l_data; l_data.offset = -1; l_data.links = NULL; _labels.append(l_data); return label; } void X86Assembler::registerLabels(size_t count) { // Duplicated newLabel() code, but we are not creating Label instances. LabelData l_data; l_data.offset = -1; l_data.links = NULL; for (size_t i = 0; i < count; i++) _labels.append(l_data); } void X86Assembler::bind(const Label& label) { // Only labels created by newLabel() can be used by Assembler. ASMJIT_ASSERT(label.getId() != kInvalidValue); // Never go out of bounds. ASMJIT_ASSERT((label.getId() & kOperandIdValueMask) < _labels.getLength()); // Get label data based on label id. LabelData& l_data = _labels[label.getId() & kOperandIdValueMask]; // Label can be bound only once. ASMJIT_ASSERT(l_data.offset == -1); // Log. if (_logger) _logger->logFormat("L.%u:\n", (uint32_t)label.getId() & kOperandIdValueMask); sysint_t pos = getOffset(); LabelLink* link = l_data.links; LabelLink* prev = NULL; while (link) { sysint_t offset = link->offset; if (link->relocId != -1) { // If linked label points to RelocData then instead of writing relative // displacement to assembler stream, we will write it to RelocData. _relocData[link->relocId].destination += pos; } else { // Not using relocId, this means that we overwriting real displacement // in assembler stream. int32_t patchedValue = (int32_t)(pos - offset + link->displacement); uint32_t size = getByteAt(offset); // Only these size specifiers are allowed. ASMJIT_ASSERT(size == 1 || size == 4); if (size == 4) { setInt32At(offset, patchedValue); } else // if (size == 1) { if (IntUtil::isInt8(patchedValue)) { setByteAt(offset, (uint8_t)(int8_t)patchedValue); } else { // Fatal error. setError(kErrorIllegalShortJump); } } } prev = link->prev; link = prev; } // Chain unused links. link = l_data.links; if (link) { if (prev == NULL) prev = link; prev->prev = _unusedLinks; _unusedLinks = link; } // Unlink label if it was linked. l_data.offset = pos; l_data.links = NULL; } // ============================================================================ // [AsmJit::Assembler - Make] // ============================================================================ void* X86Assembler::make() { // Do nothing on error state or when no instruction was emitted. if (_error || getCodeSize() == 0) return NULL; void* p; _error = _context->generate(&p, this); return p; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86util.cpp0000644000175000017500000000550012140261626021514 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../x86/x86defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::_x86UtilJccFromCond] // ============================================================================ const uint32_t _x86UtilJccFromCond[20] = { kX86InstJO, kX86InstJNO, kX86InstJB, kX86InstJAE, kX86InstJE, kX86InstJNE, kX86InstJBE, kX86InstJA, kX86InstJS, kX86InstJNS, kX86InstJPE, kX86InstJPO, kX86InstJL, kX86InstJGE, kX86InstJLE, kX86InstJG, kInstNone, kInstNone, kInstNone, kInstNone }; // ============================================================================ // [AsmJit::_x86UtilMovccFromCond] // ============================================================================ const uint32_t _x86UtilMovccFromCond[20] = { kX86InstCMovO, kX86InstCMovNO, kX86InstCMovB, kX86InstCMovAE, kX86InstCMovE, kX86InstCMovNE, kX86InstCMovBE, kX86InstCMovA, kX86InstCMovS, kX86InstCMovNS, kX86InstCMovPE, kX86InstCMovPO, kX86InstCMovL, kX86InstCMovGE, kX86InstCMovLE, kX86InstCMovG, kInstNone, kInstNone, kInstNone, kInstNone }; // ============================================================================ // [AsmJit::_x86UtilSetccFromCond] // ============================================================================ const uint32_t _x86UtilSetccFromCond[20] = { kX86InstSetO, kX86InstSetNO, kX86InstSetB, kX86InstSetAE, kX86InstSetE, kX86InstSetNE, kX86InstSetBE, kX86InstSetA, kX86InstSetS, kX86InstSetNS, kX86InstSetPE, kX86InstSetPO, kX86InstSetL, kX86InstSetGE, kX86InstSetLE, kX86InstSetG, kInstNone, kInstNone, kInstNone, kInstNone }; // ============================================================================ // [AsmJit::_x86UtilReversedCond] // ============================================================================ const uint32_t _x86UtilReversedCond[20] = { /* x86CondO -> */ kX86CondO, /* x86CondNO -> */ kX86CondNO, /* x86CondB -> */ kX86CondA, /* x86CondAE -> */ kX86CondBE, /* x86CondE -> */ kX86CondE, /* x86CondNE -> */ kX86CondNE, /* x86CondBE -> */ kX86CondAE, /* x86CondA -> */ kX86CondB, /* x86CondS -> */ kX86CondS, /* x86CondNS -> */ kX86CondNS, /* x86CondPE -> */ kX86CondPE, /* x86CondPO -> */ kX86CondPO, /* x86CondL -> */ kX86CondG, /* x86CondGE -> */ kX86CondLE, /* x86CondLE -> */ kX86CondGE, /* x86CondG -> */ kX86CondL, /* kX86CondFpuUnordered -> */ kX86CondFpuUnordered, /* kX86CondFpuNotUnordered -> */ kX86CondFpuNotUnordered, 0x12, 0x13 }; } // AsmJit namespace #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86compileritem.cpp0000644000175000017500000015127012140261626023236 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86compiler.h" #include "../x86/x86compilercontext.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::X86CompilerAlign - Construction / Destruction] // ============================================================================ X86CompilerAlign::X86CompilerAlign(X86Compiler* x86Compiler, uint32_t size) : CompilerAlign(x86Compiler, size) { } X86CompilerAlign::~X86CompilerAlign() { } // ============================================================================ // [AsmJit::X86CompilerAlign - Interface] // ============================================================================ void X86CompilerAlign::emit(Assembler& a) { X86Assembler& x86Asm = static_cast(a); x86Asm.align(_size); } // ============================================================================ // [AsmJit::X86CompilerTarget - Construction / Destruction] // ============================================================================ X86CompilerTarget::X86CompilerTarget(X86Compiler* c, const Label& label) : CompilerTarget(c, label) { } X86CompilerTarget::~X86CompilerTarget() { } // ============================================================================ // [AsmJit::X86CompilerTarget - Interface] // ============================================================================ static X86CompilerTarget* X86CompilerTarget_removeUnreachableItems(X86CompilerTarget* target) { CompilerItem* prev = target->getPrev(); CompilerItem* item = target->getNext(); ASMJIT_ASSERT(prev != NULL); ASMJIT_ASSERT(item != NULL); for (;;) { CompilerItem* next = item->getNext(); ASMJIT_ASSERT(next != NULL); if (item->getType() == kCompilerItemTarget) break; item->_prev = NULL; item->_next = NULL; item->_isUnreachable = true; item = next; } target->_prev = NULL; target->_next = NULL; target->_isTranslated = true; prev->_next = item; item->_prev = prev; return static_cast(item); } void X86CompilerTarget::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _offset = x86Context._currentOffset++; } CompilerItem* X86CompilerTarget::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); // If this X86CompilerTarget was already translated, it's needed to change // the current state and return NULL to tell CompilerContext to process next // untranslated item. if (_isTranslated) { x86Context._restoreState(getState()); return NULL; } if (x86Context._isUnreachable) { // If the context has "isUnreachable" flag set and there is no state then // it means that this code will be never called. This is a problem, because // we are unable to assign a state to current location so we can't allocate // registers for variables used inside. So instead of doing anything wrong // we remove the unreachable code. if (_state == NULL) return X86CompilerTarget_removeUnreachableItems(this); // Assign state to the compiler context. x86Context._isUnreachable = 0; x86Context._assignState(getState()); } else { _state = x86Context._saveState(); } return translated(); } void X86CompilerTarget::emit(Assembler& a) { X86Assembler& x86Asm = static_cast(a); x86Asm.bind(_label); } // ============================================================================ // [AsmJit::X86CompilerHint - Construction / Destruction] // ============================================================================ X86CompilerHint::X86CompilerHint(X86Compiler* compiler, X86CompilerVar* var, uint32_t hintId, uint32_t hintValue) : CompilerHint(compiler, var, hintId, hintValue) { } X86CompilerHint::~X86CompilerHint() { } // ============================================================================ // [AsmJit::X86CompilerHint - Interface] // ============================================================================ void X86CompilerHint::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86CompilerVar* var = getVar(); _offset = x86Context._currentOffset; // First item (begin of variable scope). if (var->firstItem == NULL) var->firstItem = this; // Last item (end of variable scope). CompilerItem* oldLast = var->lastItem; var->lastItem = this; switch (_hintId) { case kVarHintAlloc: case kVarHintSpill: case kVarHintSave: if (!x86Context._isActive(var)) x86Context._addActive(var); break; case kVarHintSaveAndUnuse: if (!x86Context._isActive(var)) x86Context._addActive(var); break; case kVarHintUnuse: if (oldLast) oldLast->_tryUnuseVar(var); break; } } CompilerItem* X86CompilerHint::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86CompilerVar* var = getVar(); switch (_hintId) { case kVarHintAlloc: x86Context.allocVar(var, _hintValue, kVarAllocRead); break; case kVarHintSpill: if (var->state == kVarStateReg) x86Context.spillVar(var); break; case kVarHintSave: case kVarHintSaveAndUnuse: if (var->state == kVarStateReg && var->changed) { x86Context.emitSaveVar(var, var->regIndex); var->changed = false; } if (_hintId == kVarHintSaveAndUnuse) goto _Unuse; break; case kVarHintUnuse: _Unuse: x86Context.unuseVar(var, kVarStateUnused); goto _End; } x86Context._unuseVarOnEndOfScope(this, var); _End: return translated(); } // ============================================================================ // [AsmJit::X86CompilerHint - Misc] // ============================================================================ int X86CompilerHint::getMaxSize() const { // Compiler hint is NOP, but it can generate other items which can do // something - in such more items are added into the stream so we don't need // to worry about this. return 0; } // ============================================================================ // [AsmJit::X86CompilerInst - Construction / Destruction] // ============================================================================ X86CompilerInst::X86CompilerInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount) : CompilerInst(x86Compiler, code, opData, opCount) { uint32_t i; _memOp = NULL; _vars = NULL; _variablesCount = 0; for (i = 0; i < opCount; i++) { if (_operands[i].isMem()) { _memOp = reinterpret_cast(&_operands[i]); break; } } const X86InstInfo* info = &x86InstInfo[_code]; if (info->isSpecial()) setInstFlag(kX86CompilerInstFlagIsSpecial); if (info->isFpu()) setInstFlag(kX86CompilerInstFlagIsFpu); if (isSpecial()) { // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} switch (_code) { case kX86InstCpuId: // Special... break; case kX86InstCbw: case kX86InstCdq: case kX86InstCdqe: case kX86InstCwd: case kX86InstCwde: case kX86InstCqo: // Special... break; case kX86InstCmpXCHG: case kX86InstCmpXCHG8B: #if defined(ASMJIT_X64) case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 // Special... break; #if defined(ASMJIT_X86) case kX86InstDaa: case kX86InstDas: // Special... break; #endif // ASMJIT_X86 case kX86InstIMul: switch (_operandsCount) { case 2: // IMUL dst, src is not special instruction. clearInstFlag(kX86CompilerInstFlagIsSpecial); break; case 3: // Only IMUL dst_hi, dst_lo, reg/mem is special, all others don't. if (!(_operands[0].isVar() && _operands[1].isVar() && _operands[2].isVarMem())) clearInstFlag(kX86CompilerInstFlagIsSpecial); break; } break; case kX86InstMul: case kX86InstIDiv: case kX86InstDiv: // Special... break; case kX86InstMovPtr: // Special... break; case kX86InstLahf: case kX86InstSahf: // Special... break; case kX86InstMaskMovQ: case kX86InstMaskMovDQU: // Special... break; case kX86InstEnter: case kX86InstLeave: // Special... break; case kX86InstRet: // Special... break; case kX86InstMonitor: case kX86InstMWait: // Special... break; case kX86InstPop: case kX86InstPopAD: case kX86InstPopFD: case kX86InstPopFQ: // Special... break; case kX86InstPush: case kX86InstPushAD: case kX86InstPushFD: case kX86InstPushFQ: // Special... break; case kX86InstRcl: case kX86InstRcr: case kX86InstRol: case kX86InstRor: case kX86InstSal: case kX86InstSar: case kX86InstShl: case kX86InstShr: // Rot instruction is special only if last operand is variable (register). if (!_operands[1].isVar()) clearInstFlag(kX86CompilerInstFlagIsSpecial); break; case kX86InstShld: case kX86InstShrd: // Shld/Shrd instruction is special only if last operand is variable (register). if (!_operands[2].isVar()) clearInstFlag(kX86CompilerInstFlagIsSpecial); break; case kX86InstRdtsc: case kX86InstRdtscP: // Special... break; case kX86InstRepLodSB: case kX86InstRepLodSD: case kX86InstRepLodSQ: case kX86InstRepLodSW: case kX86InstRepMovSB: case kX86InstRepMovSD: case kX86InstRepMovSQ: case kX86InstRepMovSW: case kX86InstRepStoSB: case kX86InstRepStoSD: case kX86InstRepStoSQ: case kX86InstRepStoSW: case kX86InstRepECmpSB: case kX86InstRepECmpSD: case kX86InstRepECmpSQ: case kX86InstRepECmpSW: case kX86InstRepEScaSB: case kX86InstRepEScaSD: case kX86InstRepEScaSQ: case kX86InstRepEScaSW: case kX86InstRepNECmpSB: case kX86InstRepNECmpSD: case kX86InstRepNECmpSQ: case kX86InstRepNECmpSW: case kX86InstRepNEScaSB: case kX86InstRepNEScaSD: case kX86InstRepNEScaSQ: case kX86InstRepNEScaSW: // Special... break; default: ASMJIT_ASSERT(0); } // ${SPECIAL_INSTRUCTION_HANDLING_END} } } X86CompilerInst::~X86CompilerInst() { } // ============================================================================ // [AsmJit::X86CompilerInst - Interface] // ============================================================================ void X86CompilerInst::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); #define __GET_VARIABLE(__vardata__) \ { \ X86CompilerVar* _candidate = __vardata__; \ \ for (var = cur; ;) \ { \ if (var == _vars) \ { \ var = cur++; \ var->vdata = _candidate; \ var->vflags = 0; \ var->regMask = 0xFFFFFFFF; \ break; \ } \ \ var--; \ \ if (var->vdata == _candidate) \ { \ break; \ } \ } \ \ ASMJIT_ASSERT(var != NULL); \ } _offset = x86Context._currentOffset; const X86InstInfo* id = &x86InstInfo[_code]; uint32_t i, len = _operandsCount; uint32_t variablesCount = 0; for (i = 0; i < len; i++) { Operand& o = _operands[i]; if (o.isVar()) { ASMJIT_ASSERT(o.getId() != kInvalidValue); X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(vdata != NULL); if (reinterpret_cast(&o)->isGpVar()) { if (reinterpret_cast(&o)->isGpbLo()) { setInstFlag(kX86CompilerInstFlagIsGpbLoUsed); vdata->regGpbLoCount++; }; if (reinterpret_cast(&o)->isGpbHi()) { setInstFlag(kX86CompilerInstFlagIsGpbHiUsed); vdata->regGpbHiCount++; }; } if (vdata->workOffset != _offset) { if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); vdata->workOffset = _offset; variablesCount++; } } else if (o.isMem()) { if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(vdata != NULL); x86Context._markMemoryUsed(vdata); if (vdata->workOffset != _offset) { if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); vdata->workOffset = _offset; variablesCount++; } } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(o._mem.base); ASMJIT_ASSERT(vdata != NULL); if (vdata->workOffset != _offset) { if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); vdata->workOffset = _offset; variablesCount++; } } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(o._mem.index); ASMJIT_ASSERT(vdata != NULL); if (vdata->workOffset != _offset) { if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); vdata->workOffset = _offset; variablesCount++; } } } } if (!variablesCount) { x86Context._currentOffset++; return; } _vars = reinterpret_cast(x86Compiler->getZoneMemory().alloc(sizeof(VarAllocRecord) * variablesCount)); if (_vars == NULL) { x86Compiler->setError(kErrorNoHeapMemory); x86Context._currentOffset++; return; } _variablesCount = variablesCount; VarAllocRecord* cur = _vars; VarAllocRecord* var = NULL; bool _isGpbUsed = hasInstFlag(kX86CompilerInstFlagIsGpbLoUsed) | hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed) ; uint32_t gpRestrictMask = IntUtil::maskUpToIndex(kX86RegNumGp); #if defined(ASMJIT_X64) if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed)) { gpRestrictMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx) | IntUtil::maskFromIndex(kX86RegIndexEbp) | IntUtil::maskFromIndex(kX86RegIndexEsi) | IntUtil::maskFromIndex(kX86RegIndexEdi) ; } #endif // ASMJIT_X64 for (i = 0; i < len; i++) { Operand& o = _operands[i]; if (o.isVar()) { X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(vdata != NULL); __GET_VARIABLE(vdata) var->vflags |= kVarAllocRegister; if (_isGpbUsed) { #if defined(ASMJIT_X86) if (reinterpret_cast(&o)->isGpb()) { var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx) ; } #else // Restrict all BYTE registers to RAX/RBX/RCX/RDX if HI BYTE register // is used (REX prefix makes HI BYTE addressing unencodable). if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed)) { if (reinterpret_cast(&o)->isGpb()) { var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx) ; } } #endif // ASMJIT_X86/X64 } if (isSpecial()) { // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} switch (_code) { case kX86InstCpuId: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; case 3: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstCbw: case kX86InstCdqe: case kX86InstCwde: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstCdq: case kX86InstCwd: case kX86InstCqo: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstCmpXCHG: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; break; case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead; break; default: ASMJIT_ASSERT(0); } break; case kX86InstCmpXCHG8B: #if defined(ASMJIT_X64) case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; case 3: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; #if defined(ASMJIT_X86) case kX86InstDaa: case kX86InstDas: ASMJIT_ASSERT(i == 0); vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; #endif // ASMJIT_X86 case kX86InstIMul: case kX86InstMul: case kX86InstIDiv: case kX86InstDiv: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead; break; default: ASMJIT_ASSERT(0); } break; case kX86InstMovPtr: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstLahf: ASMJIT_ASSERT(i == 0); vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case kX86InstSahf: ASMJIT_ASSERT(i == 0); vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case kX86InstMaskMovQ: case kX86InstMaskMovDQU: switch (i) { case 0: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); gpRestrictMask &= ~var->regMask; break; case 1: case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead; break; } break; case kX86InstEnter: case kX86InstLeave: // TODO: SPECIAL INSTRUCTION. break; case kX86InstRet: // TODO: SPECIAL INSTRUCTION. break; case kX86InstMonitor: case kX86InstMWait: // TODO: MONITOR/MWAIT (COMPILER). break; case kX86InstPop: // TODO: SPECIAL INSTRUCTION. break; case kX86InstPopAD: case kX86InstPopFD: case kX86InstPopFQ: // TODO: SPECIAL INSTRUCTION. break; case kX86InstPush: // TODO: SPECIAL INSTRUCTION. break; case kX86InstPushAD: case kX86InstPushFD: case kX86InstPushFQ: // TODO: SPECIAL INSTRUCTION. break; case kX86InstRcl: case kX86InstRcr: case kX86InstRol: case kX86InstRor: case kX86InstSal: case kX86InstSar: case kX86InstShl: case kX86InstShr: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstShld: case kX86InstShrd: switch (i) { case 0: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead; break; case 2: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRdtsc: case kX86InstRdtscP: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: ASMJIT_ASSERT(_code == kX86InstRdtscP); vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRepLodSB: case kX86InstRepLodSD: case kX86InstRepLodSQ: case kX86InstRepLodSW: switch (i) { case 0: vdata->regWriteCount++; var->vflags |= kVarAllocWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRepMovSB: case kX86InstRepMovSD: case kX86InstRepMovSQ: case kX86InstRepMovSW: case kX86InstRepECmpSB: case kX86InstRepECmpSD: case kX86InstRepECmpSQ: case kX86InstRepECmpSW: case kX86InstRepNECmpSB: case kX86InstRepNECmpSD: case kX86InstRepNECmpSQ: case kX86InstRepNECmpSW: switch (i) { case 0: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRepStoSB: case kX86InstRepStoSD: case kX86InstRepStoSQ: case kX86InstRepStoSW: switch (i) { case 0: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; case kX86InstRepEScaSB: case kX86InstRepEScaSD: case kX86InstRepEScaSQ: case kX86InstRepEScaSW: case kX86InstRepNEScaSB: case kX86InstRepNEScaSD: case kX86InstRepNEScaSQ: case kX86InstRepNEScaSW: switch (i) { case 0: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); gpRestrictMask &= ~var->regMask; break; case 1: vdata->regReadCount++; var->vflags |= kVarAllocRead | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); gpRestrictMask &= ~var->regMask; break; case 2: vdata->regRwCount++; var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); gpRestrictMask &= ~var->regMask; break; default: ASMJIT_ASSERT(0); } break; default: ASMJIT_ASSERT(0); } // ${SPECIAL_INSTRUCTION_HANDLING_END} } else { if (i == 0) { // CMP/TEST instruction. if (id->getCode() == kX86InstCmp || id->getCode() == kX86InstTest) { // Read-only case. vdata->regReadCount++; var->vflags |= kVarAllocRead; } // CVTTSD2SI/CVTTSS2SI instructions. else if (id->getCode() == kX86InstCvttSD2SI || id->getCode() == kX86InstCvttSS2SI) { // In 32-bit mode the whole destination is replaced. In 64-bit mode // we need to check whether the destination operand size is 64-bits. #if defined(ASMJIT_X64) if (_operands[0].isRegType(kX86RegTypeGpq)) { #endif // ASMJIT_X64 // Write-only case. vdata->regWriteCount++; var->vflags |= kVarAllocWrite; #if defined(ASMJIT_X64) } else { // Read/Write. vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; } #endif // ASMJIT_X64 } // MOV/MOVSS/MOVSD instructions. // // If instruction is MOV (source replaces the destination) or // MOVSS/MOVSD and source operand is memory location then register // allocator should know that previous destination value is lost // (write only operation). else if ((id->isMov()) || ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD) /* && _operands[1].isMem() */) || (id->getCode() == kX86InstIMul && _operandsCount == 3 && !isSpecial())) { // Write-only case. vdata->regWriteCount++; var->vflags |= kVarAllocWrite; } else if (id->getCode() == kX86InstLea) { // Write. vdata->regWriteCount++; var->vflags |= kVarAllocWrite; } else { // Read/Write. vdata->regRwCount++; var->vflags |= kVarAllocReadWrite; } } else { // Second, third, ... operands are read-only. vdata->regReadCount++; var->vflags |= kVarAllocRead; } if (!_memOp && i < 2 && (id->_opFlags[i] & kX86InstOpMem) != 0) { var->vflags |= kVarAllocMem; } } // If variable must be in specific register we could add some hint to allocator. if (var->vflags & kVarAllocSpecial) { vdata->prefRegisterMask |= var->regMask; x86Context._newRegisterHomeIndex(vdata, IntUtil::findFirstBit(var->regMask)); } } else if (o.isMem()) { if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(vdata != NULL); __GET_VARIABLE(vdata) if (i == 0) { // If variable is MOV instruction type (source replaces the destination) // or variable is MOVSS/MOVSD instruction then register allocator should // know that previous destination value is lost (write only operation). if (id->isMov() || ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD))) { // Write only case. vdata->memWriteCount++; } else { vdata->memRwCount++; } } else { vdata->memReadCount++; } } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(reinterpret_cast(o).getBase()); ASMJIT_ASSERT(vdata != NULL); __GET_VARIABLE(vdata) vdata->regReadCount++; var->vflags |= kVarAllocRegister | kVarAllocRead; var->regMask &= gpRestrictMask; } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* vdata = x86Compiler->_getVar(reinterpret_cast(o).getIndex()); ASMJIT_ASSERT(vdata != NULL); __GET_VARIABLE(vdata) vdata->regReadCount++; var->vflags |= kVarAllocRegister | kVarAllocRead; var->regMask &= gpRestrictMask; } } } // Traverse all variables and update firstItem / lastItem. This // function is called from iterator that scans items using forward // direction so we can use this knowledge to optimize the process. // // Similar to X86CompilerFuncCall::prepare(). for (i = 0; i < _variablesCount; i++) { X86CompilerVar* v = _vars[i].vdata; // Update GP register allocator restrictions. if (X86Util::isVarTypeInt(v->getType())) { if (_vars[i].regMask == 0xFFFFFFFF) _vars[i].regMask &= gpRestrictMask; } // Update first/last item (begin of variable scope). if (v->firstItem == NULL) v->firstItem = this; v->lastItem = this; } // There are some instructions that can be used to clear or to set all bits // in a register: // // - andn reg, reg ; Set all bits in reg to 0. // - xor/pxor reg, reg ; Set all bits in reg to 0. // - sub/psub reg, reg ; Set all bits in reg to 0. // - pcmpgt reg, reg ; Set all bits in reg to 0. // - pcmpeq reg, reg ; Set all bits in reg to 1. // // There are also combinations which do nothing: // // - and reg, reg ; Nop. // - or reg, reg ; Nop. // - xchg reg, reg ; Nop. if (_variablesCount == 1 && _operandsCount > 1 && _operands[0].isVar() && _operands[1].isVar() && !_memOp) { switch (_code) { // ---------------------------------------------------------------------- // [Zeros/Ones] // ---------------------------------------------------------------------- // ANDN Instructions. case kX86InstPAndN: // XOR Instructions. case kX86InstXor: case kX86InstXorPD: case kX86InstXorPS: case kX86InstPXor: // SUB Instructions. case kX86InstSub: case kX86InstPSubB: case kX86InstPSubW: case kX86InstPSubD: case kX86InstPSubQ: case kX86InstPSubSB: case kX86InstPSubSW: case kX86InstPSubUSB: case kX86InstPSubUSW: // PCMPEQ Instructions. case kX86InstPCmpEqB: case kX86InstPCmpEqW: case kX86InstPCmpEqD: case kX86InstPCmpEqQ: // PCMPGT Instructions. case kX86InstPCmpGtB: case kX86InstPCmpGtW: case kX86InstPCmpGtD: case kX86InstPCmpGtQ: // Clear the read flag. This prevents variable alloc/spill. _vars[0].vflags = kVarAllocWrite; _vars[0].vdata->regReadCount--; break; // ---------------------------------------------------------------------- // [Nop] // ---------------------------------------------------------------------- // AND Instructions. case kX86InstAnd: case kX86InstAndPD: case kX86InstAndPS: case kX86InstPAnd: // OR Instructions. case kX86InstOr: case kX86InstOrPD: case kX86InstOrPS: case kX86InstPOr: // XCHG Instruction. case kX86InstXchg: // Clear the write flag. _vars[0].vflags = kVarAllocRead; _vars[0].vdata->regWriteCount--; break; } } x86Context._currentOffset++; #undef __GET_VARIABLE } CompilerItem* X86CompilerInst::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); uint32_t i; uint32_t variablesCount = _variablesCount; if (variablesCount > 0) { // These variables are used by the instruction and we set current offset // to their work offsets -> getSpillCandidate never return the variable // used this instruction. for (i = 0; i < variablesCount; i++) { _vars[i].vdata->workOffset = x86Context._currentOffset; } // Alloc variables used by the instruction (special first). for (i = 0; i < variablesCount; i++) { VarAllocRecord& r = _vars[i]; // Alloc variables with specific register first. if ((r.vflags & kVarAllocSpecial) != 0) x86Context.allocVar(r.vdata, r.regMask, r.vflags); } for (i = 0; i < variablesCount; i++) { VarAllocRecord& r = _vars[i]; // Alloc variables without specific register last. if ((r.vflags & kVarAllocSpecial) == 0) x86Context.allocVar(r.vdata, r.regMask, r.vflags); } x86Context.translateOperands(_operands, _operandsCount); } if (_memOp && (_memOp->getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(_memOp->getId()); ASMJIT_ASSERT(cv != NULL); switch (cv->state) { case kVarStateUnused: cv->state = kVarStateMem; break; case kVarStateReg: cv->changed = false; x86Context.unuseVar(cv, kVarStateMem); break; } } for (i = 0; i < variablesCount; i++) { x86Context._unuseVarOnEndOfScope(this, &_vars[i]); } return translated(); } void X86CompilerInst::emit(Assembler& a) { X86Assembler& x86Asm = static_cast(a); x86Asm._inlineComment = _comment; x86Asm._emitOptions = _emitOptions; if (isSpecial()) { // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} switch (_code) { case kX86InstCpuId: x86Asm._emitInstruction(_code); return; case kX86InstCbw: case kX86InstCdq: case kX86InstCdqe: case kX86InstCwd: case kX86InstCwde: case kX86InstCqo: x86Asm._emitInstruction(_code); return; case kX86InstCmpXCHG: x86Asm._emitInstruction(_code, &_operands[1], &_operands[2]); return; case kX86InstCmpXCHG8B: #if defined(ASMJIT_X64) case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 x86Asm._emitInstruction(_code, &_operands[4]); return; #if defined(ASMJIT_X86) case kX86InstDaa: case kX86InstDas: x86Asm._emitInstruction(_code); return; #endif // ASMJIT_X86 case kX86InstIMul: case kX86InstMul: case kX86InstIDiv: case kX86InstDiv: // INST dst_lo (implicit), dst_hi (implicit), src (explicit) ASMJIT_ASSERT(_operandsCount == 3); x86Asm._emitInstruction(_code, &_operands[2]); return; case kX86InstMovPtr: break; case kX86InstLahf: case kX86InstSahf: x86Asm._emitInstruction(_code); return; case kX86InstMaskMovQ: case kX86InstMaskMovDQU: x86Asm._emitInstruction(_code, &_operands[1], &_operands[2]); return; case kX86InstEnter: case kX86InstLeave: // TODO: SPECIAL INSTRUCTION. break; case kX86InstRet: // TODO: SPECIAL INSTRUCTION. break; case kX86InstMonitor: case kX86InstMWait: // TODO: MONITOR/MWAIT (COMPILER). break; case kX86InstPop: case kX86InstPopAD: case kX86InstPopFD: case kX86InstPopFQ: // TODO: SPECIAL INSTRUCTION. break; case kX86InstPush: case kX86InstPushAD: case kX86InstPushFD: case kX86InstPushFQ: // TODO: SPECIAL INSTRUCTION. break; case kX86InstRcl: case kX86InstRcr: case kX86InstRol: case kX86InstRor: case kX86InstSal: case kX86InstSar: case kX86InstShl: case kX86InstShr: x86Asm._emitInstruction(_code, &_operands[0], &cl); return; case kX86InstShld: case kX86InstShrd: x86Asm._emitInstruction(_code, &_operands[0], &_operands[1], &cl); return; case kX86InstRdtsc: case kX86InstRdtscP: x86Asm._emitInstruction(_code); return; case kX86InstRepLodSB: case kX86InstRepLodSD: case kX86InstRepLodSQ: case kX86InstRepLodSW: case kX86InstRepMovSB: case kX86InstRepMovSD: case kX86InstRepMovSQ: case kX86InstRepMovSW: case kX86InstRepStoSB: case kX86InstRepStoSD: case kX86InstRepStoSQ: case kX86InstRepStoSW: case kX86InstRepECmpSB: case kX86InstRepECmpSD: case kX86InstRepECmpSQ: case kX86InstRepECmpSW: case kX86InstRepEScaSB: case kX86InstRepEScaSD: case kX86InstRepEScaSQ: case kX86InstRepEScaSW: case kX86InstRepNECmpSB: case kX86InstRepNECmpSD: case kX86InstRepNECmpSQ: case kX86InstRepNECmpSW: case kX86InstRepNEScaSB: case kX86InstRepNEScaSD: case kX86InstRepNEScaSQ: case kX86InstRepNEScaSW: x86Asm._emitInstruction(_code); return; default: ASMJIT_ASSERT(0); } // ${SPECIAL_INSTRUCTION_HANDLING_END} } switch (_operandsCount) { case 0: x86Asm._emitInstruction(_code); break; case 1: x86Asm._emitInstruction(_code, &_operands[0]); break; case 2: x86Asm._emitInstruction(_code, &_operands[0], &_operands[1]); break; case 3: x86Asm._emitInstruction(_code, &_operands[0], &_operands[1], &_operands[2]); break; default: ASMJIT_ASSERT(0); break; } } // ============================================================================ // [AsmJit::X86CompilerInst - Misc] // ============================================================================ int X86CompilerInst::getMaxSize() const { // TODO: Instruction max size. return 15; } bool X86CompilerInst::_tryUnuseVar(CompilerVar* _v) { X86CompilerVar* cv = static_cast(_v); for (uint32_t i = 0; i < _variablesCount; i++) { if (_vars[i].vdata == cv) { _vars[i].vflags |= kVarAllocUnuseAfterUse; return true; } } return false; } // ============================================================================ // [AsmJit::X86CompilerJmpInst - Construction / Destruction] // ============================================================================ X86CompilerJmpInst::X86CompilerJmpInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount) : X86CompilerInst(x86Compiler, code, opData, opCount) { _jumpTarget = x86Compiler->_getTarget(_operands[0].getId()); _jumpTarget->_jumpsCount++; _jumpNext = static_cast(_jumpTarget->_from); _jumpTarget->_from = this; // The 'jmp' is always taken, conditional jump can contain hint, we detect it. if (getCode() == kX86InstJmp) setInstFlag(kX86CompilerInstFlagIsTaken); else if (opCount > 1 && opData[1].isImm() && reinterpret_cast(&opData[1])->getValue() == kCondHintLikely) setInstFlag(kX86CompilerInstFlagIsTaken); } X86CompilerJmpInst::~X86CompilerJmpInst() { } // ============================================================================ // [AsmJit::X86CompilerJmpInst - Interface] // ============================================================================ void X86CompilerJmpInst::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _offset = x86Context._currentOffset; // Update _isTaken to true if this is conditional backward jump. This behavior // can be overridden by using kCondHintUnlikely when using the instruction. if (getCode() != kX86InstJmp && _operandsCount == 1 && _jumpTarget->getOffset() < getOffset()) { setInstFlag(kX86CompilerInstFlagIsTaken); } // Now patch all variables where jump location is in the active range. if (_jumpTarget->getOffset() != kInvalidValue && x86Context._active) { X86CompilerVar* first = static_cast(x86Context._active); X86CompilerVar* var = first; uint32_t jumpOffset = _jumpTarget->getOffset(); do { if (var->firstItem) { ASMJIT_ASSERT(var->lastItem != NULL); uint32_t start = var->firstItem->getOffset(); uint32_t end = var->lastItem->getOffset(); if (jumpOffset >= start && jumpOffset <= end) var->lastItem = this; } var = var->nextActive; } while (var != first); } x86Context._currentOffset++; } CompilerItem* X86CompilerJmpInst::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); // Translate using X86CompilerInst. CompilerItem* ret = X86CompilerInst::translate(cc); // We jump with item if its kX86InstJUMP (not based on condiiton) and it // points into yet unknown location. if (_code == kX86InstJmp && !_jumpTarget->isTranslated()) { x86Context.addBackwardCode(this); ret = _jumpTarget; } else { _state = x86Context._saveState(); if (_jumpTarget->isTranslated()) { doJump(cc); } else { // State is not known, so we need to call doJump() later. Compiler will // do it for us. x86Context.addForwardJump(this); _jumpTarget->_state = _state; } // Mark next code as unreachable, cleared by a next label (CompilerTarget). if (_code == kX86InstJmp) x86Context._isUnreachable = 1; } // Need to traverse over all active variables and unuse them if their scope ends // here. if (x86Context._active) { X86CompilerVar* first = static_cast(x86Context._active); X86CompilerVar* var = first; do { x86Context._unuseVarOnEndOfScope(this, var); var = var->nextActive; } while (var != first); } return ret; } void X86CompilerJmpInst::emit(Assembler& a) { static const uint MAXIMUM_SHORT_JMP_SIZE = 127; // Try to minimize size of jump using SHORT jump (8-bit displacement) by // traversing into the target and calculating the maximum code size. We // end when code size reaches MAXIMUM_SHORT_JMP_SIZE. if (!(_emitOptions & kX86EmitOptionShortJump) && getJumpTarget()->getOffset() > getOffset()) { // Calculate the code size. uint codeSize = 0; CompilerItem* cur = this->getNext(); CompilerItem* target = getJumpTarget(); while (cur) { if (cur == target) { // Target found, we can tell assembler to generate short form of jump. _emitOptions |= kX86EmitOptionShortJump; goto _End; } int s = cur->getMaxSize(); if (s == -1) break; codeSize += (uint)s; if (codeSize > MAXIMUM_SHORT_JMP_SIZE) break; cur = cur->getNext(); } } _End: X86CompilerInst::emit(a); } // ============================================================================ // [AsmJit::X86CompilerJmpInst - DoJump] // ============================================================================ void X86CompilerJmpInst::doJump(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); // The state have to be already known. The doJump() method is called by // translate() or by Compiler in case that it's forward jump. ASMJIT_ASSERT(_jumpTarget->getState()); if (getCode() == kX86InstJmp || (isTaken() && _jumpTarget->getOffset() < getOffset())) { // Instruction type is JMP or conditional jump that should be taken (likely). // We can set state here instead of jumping out, setting state and jumping // to _jumpTarget. // // NOTE: We can't use this technique if instruction is forward conditional // jump. The reason is that when generating code we can't change state here, // because the next instruction depends on it. x86Context._restoreState(_jumpTarget->getState(), _jumpTarget->getOffset()); } else { // Instruction type is JMP or conditional jump that should be not normally // taken. If we need add code that will switch between different states we // add it after the end of function body (after epilog, using 'ExtraBlock'). CompilerItem* ext = x86Context.getExtraBlock(); CompilerItem* old = x86Compiler->setCurrentItem(ext); x86Context._restoreState(_jumpTarget->getState(), _jumpTarget->getOffset()); if (x86Compiler->getCurrentItem() != ext) { // Add the jump to the target. x86Compiler->jmp(_jumpTarget->_label); ext = x86Compiler->getCurrentItem(); // The x86Context._restoreState() method emitted some instructions so we need to // patch the jump. Label L = x86Compiler->newLabel(); x86Compiler->setCurrentItem(x86Context.getExtraBlock()); x86Compiler->bind(L); // Finally, patch the jump target. ASMJIT_ASSERT(_operandsCount > 0); _operands[0] = L; // Operand part (Label). _jumpTarget = x86Compiler->_getTarget(L.getId()); // Compiler part (CompilerTarget). } x86Context.setExtraBlock(ext); x86Compiler->setCurrentItem(old); // Assign state back. x86Context._assignState(static_cast(_state)); } } // ============================================================================ // [AsmJit::X86CompilerJmpInst - GetJumpTarget] // ============================================================================ CompilerTarget* X86CompilerJmpInst::getJumpTarget() const { return _jumpTarget; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86func.cpp0000644000175000017500000004744612140261626021511 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86defs.h" #include "../x86/x86func.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::X86FuncDecl - Accessors] // ============================================================================ uint32_t X86FuncDecl::findArgumentByRegCode(uint32_t regCode) const { uint32_t type = regCode & kRegTypeMask; uint32_t idx = regCode & kRegIndexMask; uint32_t clazz; switch (type) { case kX86RegTypeGpd: case kX86RegTypeGpq: clazz = kX86VarClassGp; break; case kX86RegTypeX87: clazz = kX86VarClassX87; break; case kX86RegTypeMm: clazz = kX86VarClassMm; break; case kX86RegTypeXmm: clazz = kX86VarClassXmm; break; default: return kInvalidValue; } for (uint32_t i = 0; i < _argumentsCount; i++) { const FuncArg& arg = _arguments[i]; if (arg.getRegIndex() == idx && (X86Util::getVarClassFromVarType(arg.getVarType()) & clazz) != 0) return i; } return kInvalidValue; } // ============================================================================ // [AsmJit::X86FuncDecl - SetPrototype - InitCallingConvention] // ============================================================================ static void X86FuncDecl_initCallingConvention(X86FuncDecl* self, uint32_t convention) { uint32_t i; // -------------------------------------------------------------------------- // [Inir] // -------------------------------------------------------------------------- self->_convention = convention; self->_calleePopsStack = false; self->_argumentsDirection = kFuncArgsRTL; for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_gpList); i++) self->_gpList[i] = kRegIndexInvalid; for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_xmmList); i++) self->_xmmList[i] = kRegIndexInvalid; self->_gpListMask = 0x0; self->_mmListMask = 0x0; self->_xmmListMask = 0x0; self->_gpPreservedMask = 0x0; self->_mmPreservedMask = 0x0; self->_xmmPreservedMask = 0x0; // -------------------------------------------------------------------------- // [X86 Calling Conventions] // -------------------------------------------------------------------------- #if defined(ASMJIT_X86) self->_gpPreservedMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEsp) | IntUtil::maskFromIndex(kX86RegIndexEbp) | IntUtil::maskFromIndex(kX86RegIndexEsi) | IntUtil::maskFromIndex(kX86RegIndexEdi)); self->_xmmPreservedMask = 0; switch (convention) { // ------------------------------------------------------------------------ // [CDecl] // ------------------------------------------------------------------------ case kX86FuncConvCDecl: break; // ------------------------------------------------------------------------ // [StdCall] // ------------------------------------------------------------------------ case kX86FuncConvStdCall: self->_calleePopsStack = true; break; // ------------------------------------------------------------------------ // [MS-ThisCall] // ------------------------------------------------------------------------ case kX86FuncConvMsThisCall: self->_calleePopsStack = true; self->_gpList[0] = kX86RegIndexEcx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEcx)); break; // ------------------------------------------------------------------------ // [MS-FastCall] // ------------------------------------------------------------------------ case kX86FuncConvMsFastCall: self->_calleePopsStack = true; self->_gpList[0] = kX86RegIndexEcx; self->_gpList[1] = kX86RegIndexEdx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx)); break; // ------------------------------------------------------------------------ // [Borland-FastCall] // ------------------------------------------------------------------------ case kX86FuncConvBorlandFastCall: self->_calleePopsStack = true; self->_argumentsDirection = kFuncArgsLTR; self->_gpList[0] = kX86RegIndexEax; self->_gpList[1] = kX86RegIndexEdx; self->_gpList[2] = kX86RegIndexEcx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx) | IntUtil::maskFromIndex(kX86RegIndexEcx)); break; // ------------------------------------------------------------------------ // [Gcc-FastCall] // ------------------------------------------------------------------------ case kX86FuncConvGccFastCall: self->_calleePopsStack = true; self->_gpList[0] = kX86RegIndexEcx; self->_gpList[1] = kX86RegIndexEdx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx)); break; // ------------------------------------------------------------------------ // [Gcc-Regparm(1)] // ------------------------------------------------------------------------ case kX86FuncConvGccRegParm1: self->_calleePopsStack = false; self->_gpList[0] = kX86RegIndexEax; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEax)); break; // ------------------------------------------------------------------------ // [Gcc-Regparm(2)] // ------------------------------------------------------------------------ case kX86FuncConvGccRegParm2: self->_calleePopsStack = false; self->_gpList[0] = kX86RegIndexEax; self->_gpList[1] = kX86RegIndexEdx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx)); break; // ------------------------------------------------------------------------ // [Gcc-Regparm(3)] // ------------------------------------------------------------------------ case kX86FuncConvGccRegParm3: self->_calleePopsStack = false; self->_gpList[0] = kX86RegIndexEax; self->_gpList[1] = kX86RegIndexEdx; self->_gpList[2] = kX86RegIndexEcx; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx) | IntUtil::maskFromIndex(kX86RegIndexEcx)); break; // ------------------------------------------------------------------------ // [Illegal] // ------------------------------------------------------------------------ default: // Illegal calling convention. ASMJIT_ASSERT(0); } #endif // ASMJIT_X86 // -------------------------------------------------------------------------- // [X64 Calling Conventions] // -------------------------------------------------------------------------- #if defined(ASMJIT_X64) switch (convention) { // ------------------------------------------------------------------------ // [X64-Windows] // ------------------------------------------------------------------------ case kX86FuncConvX64W: self->_gpList[0] = kX86RegIndexRcx; self->_gpList[1] = kX86RegIndexRdx; self->_gpList[2] = kX86RegIndexR8; self->_gpList[3] = kX86RegIndexR9; self->_xmmList[0] = kX86RegIndexXmm0; self->_xmmList[1] = kX86RegIndexXmm1; self->_xmmList[2] = kX86RegIndexXmm2; self->_xmmList[3] = kX86RegIndexXmm3; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexRcx ) | IntUtil::maskFromIndex(kX86RegIndexRdx ) | IntUtil::maskFromIndex(kX86RegIndexR8 ) | IntUtil::maskFromIndex(kX86RegIndexR9 )); self->_xmmListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexXmm0 ) | IntUtil::maskFromIndex(kX86RegIndexXmm1 ) | IntUtil::maskFromIndex(kX86RegIndexXmm2 ) | IntUtil::maskFromIndex(kX86RegIndexXmm3 )); self->_gpPreservedMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexRbx ) | IntUtil::maskFromIndex(kX86RegIndexRsp ) | IntUtil::maskFromIndex(kX86RegIndexRbp ) | IntUtil::maskFromIndex(kX86RegIndexRsi ) | IntUtil::maskFromIndex(kX86RegIndexRdi ) | IntUtil::maskFromIndex(kX86RegIndexR12 ) | IntUtil::maskFromIndex(kX86RegIndexR13 ) | IntUtil::maskFromIndex(kX86RegIndexR14 ) | IntUtil::maskFromIndex(kX86RegIndexR15 )); self->_xmmPreservedMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexXmm6 ) | IntUtil::maskFromIndex(kX86RegIndexXmm7 ) | IntUtil::maskFromIndex(kX86RegIndexXmm8 ) | IntUtil::maskFromIndex(kX86RegIndexXmm9 ) | IntUtil::maskFromIndex(kX86RegIndexXmm10) | IntUtil::maskFromIndex(kX86RegIndexXmm11) | IntUtil::maskFromIndex(kX86RegIndexXmm12) | IntUtil::maskFromIndex(kX86RegIndexXmm13) | IntUtil::maskFromIndex(kX86RegIndexXmm14) | IntUtil::maskFromIndex(kX86RegIndexXmm15)); break; // ------------------------------------------------------------------------ // [X64-Unix] // ------------------------------------------------------------------------ case kX86FuncConvX64U: self->_gpList[0] = kX86RegIndexRdi; self->_gpList[1] = kX86RegIndexRsi; self->_gpList[2] = kX86RegIndexRdx; self->_gpList[3] = kX86RegIndexRcx; self->_gpList[4] = kX86RegIndexR8; self->_gpList[5] = kX86RegIndexR9; self->_xmmList[0] = kX86RegIndexXmm0; self->_xmmList[1] = kX86RegIndexXmm1; self->_xmmList[2] = kX86RegIndexXmm2; self->_xmmList[3] = kX86RegIndexXmm3; self->_xmmList[4] = kX86RegIndexXmm4; self->_xmmList[5] = kX86RegIndexXmm5; self->_xmmList[6] = kX86RegIndexXmm6; self->_xmmList[7] = kX86RegIndexXmm7; self->_gpListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexRdi ) | IntUtil::maskFromIndex(kX86RegIndexRsi ) | IntUtil::maskFromIndex(kX86RegIndexRdx ) | IntUtil::maskFromIndex(kX86RegIndexRcx ) | IntUtil::maskFromIndex(kX86RegIndexR8 ) | IntUtil::maskFromIndex(kX86RegIndexR9 )); self->_xmmListMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexXmm0 ) | IntUtil::maskFromIndex(kX86RegIndexXmm1 ) | IntUtil::maskFromIndex(kX86RegIndexXmm2 ) | IntUtil::maskFromIndex(kX86RegIndexXmm3 ) | IntUtil::maskFromIndex(kX86RegIndexXmm4 ) | IntUtil::maskFromIndex(kX86RegIndexXmm5 ) | IntUtil::maskFromIndex(kX86RegIndexXmm6 ) | IntUtil::maskFromIndex(kX86RegIndexXmm7 )); self->_gpPreservedMask = static_cast( IntUtil::maskFromIndex(kX86RegIndexRbx ) | IntUtil::maskFromIndex(kX86RegIndexRsp ) | IntUtil::maskFromIndex(kX86RegIndexRbp ) | IntUtil::maskFromIndex(kX86RegIndexR12 ) | IntUtil::maskFromIndex(kX86RegIndexR13 ) | IntUtil::maskFromIndex(kX86RegIndexR14 ) | IntUtil::maskFromIndex(kX86RegIndexR15 )); break; // ------------------------------------------------------------------------ // [Illegal] // ------------------------------------------------------------------------ default: // Illegal calling convention. ASMJIT_ASSERT(0); } #endif // ASMJIT_X64 } // ============================================================================ // [AsmJit::X86FuncDecl - SetPrototype - InitDefinition] // ============================================================================ static void X86FuncDecl_initDefinition(X86FuncDecl* self, uint32_t returnType, const uint32_t* argumentsData, uint32_t argumentsCount) { ASMJIT_ASSERT(argumentsCount <= kFuncArgsMax); // -------------------------------------------------------------------------- // [Init] // -------------------------------------------------------------------------- int32_t i = 0; int32_t gpPos = 0; int32_t xmmPos = 0; int32_t stackOffset = 0; self->_returnType = returnType; self->_argumentsCount = static_cast(argumentsCount); while (i < static_cast(argumentsCount)) { FuncArg& arg = self->_arguments[i]; arg._varType = static_cast(argumentsData[i]); arg._regIndex = kRegIndexInvalid; arg._stackOffset = kFuncStackInvalid; i++; } while (i < kFuncArgsMax) { FuncArg& arg = self->_arguments[i]; arg.reset(); i++; } self->_argumentsStackSize = 0; self->_gpArgumentsMask = 0x0; self->_mmArgumentsMask = 0x0; self->_xmmArgumentsMask = 0x0; if (self->_argumentsCount == 0) return; // -------------------------------------------------------------------------- // [X86 Calling Conventions (32-bit)] // -------------------------------------------------------------------------- #if defined(ASMJIT_X86) // Register arguments (Integer), always left-to-right. for (i = 0; i != argumentsCount; i++) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (X86Util::isVarTypeInt(varType) && gpPos < 16 && self->_gpList[gpPos] != kRegIndexInvalid) { arg._regIndex = self->_gpList[gpPos++]; self->_gpArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } } // Stack arguments. int32_t iStart = static_cast(argumentsCount - 1); int32_t iEnd = -1; int32_t iStep = -1; if (self->_argumentsDirection == kFuncArgsLTR) { iStart = 0; iEnd = static_cast(argumentsCount); iStep = 1; } for (i = iStart; i != iEnd; i += iStep) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (arg.hasRegIndex()) continue; if (X86Util::isVarTypeInt(varType)) { stackOffset -= 4; arg._stackOffset = static_cast(stackOffset); } else if (X86Util::isVarTypeFloat(varType)) { int32_t size = static_cast(x86VarInfo[varType].getSize()); stackOffset -= size; arg._stackOffset = static_cast(stackOffset); } } #endif // ASMJIT_X86 // -------------------------------------------------------------------------- // [X64 Calling Conventions (64-bit)] // -------------------------------------------------------------------------- #if defined(ASMJIT_X64) // Windows 64-bit specific. if (self->_convention == kX86FuncConvX64W) { int32_t max = argumentsCount < 4 ? argumentsCount : 4; // Register arguments (Integer / FP), always left-to-right. for (i = 0; i != max; i++) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (X86Util::isVarTypeInt(varType)) { arg._regIndex = self->_gpList[i]; self->_gpArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } else if (X86Util::isVarTypeFloat(varType)) { arg._regIndex = self->_xmmList[i]; self->_xmmArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } } // Stack arguments (always right-to-left). for (i = argumentsCount - 1; i != -1; i--) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (arg.isAssigned()) continue; if (X86Util::isVarTypeInt(varType)) { stackOffset -= 8; // Always 8 bytes. arg._stackOffset = stackOffset; } else if (X86Util::isVarTypeFloat(varType)) { int32_t size = static_cast(x86VarInfo[varType].getSize()); stackOffset -= size; arg._stackOffset = stackOffset; } } // 32 bytes shadow space (X64W calling convention specific). stackOffset -= 4 * 8; } // Linux/Unix 64-bit (AMD64 calling convention). else { // Register arguments (Integer), always left-to-right. for (i = 0; i != static_cast(argumentsCount); i++) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (X86Util::isVarTypeInt(varType) && gpPos < 32 && self->_gpList[gpPos] != kRegIndexInvalid) { arg._regIndex = self->_gpList[gpPos++]; self->_gpArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } } // Register arguments (FP), always left-to-right. for (i = 0; i != static_cast(argumentsCount); i++) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (X86Util::isVarTypeFloat(varType)) { arg._regIndex = self->_xmmList[xmmPos++]; self->_xmmArgumentsMask |= static_cast(IntUtil::maskFromIndex(arg.getRegIndex())); } } // Stack arguments. for (i = argumentsCount - 1; i != -1; i--) { FuncArg& arg = self->_arguments[i]; uint32_t varType = arg.getVarType(); if (arg.isAssigned()) continue; if (X86Util::isVarTypeInt(varType)) { stackOffset -= 8; arg._stackOffset = static_cast(stackOffset); } else if (X86Util::isVarTypeFloat(varType)) { int32_t size = (int32_t)x86VarInfo[varType].getSize(); stackOffset -= size; arg._stackOffset = static_cast(stackOffset); } } } #endif // ASMJIT_X64 // Modify stack offset (all function parameters will be in positive stack // offset that is never zero). for (i = 0; i < (int32_t)argumentsCount; i++) { FuncArg& arg = self->_arguments[i]; if (!arg.hasRegIndex()) { arg._stackOffset += static_cast(static_cast(sizeof(uintptr_t)) - stackOffset); } } self->_argumentsStackSize = (uint32_t)(-stackOffset); } void X86FuncDecl::setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { // Limit maximum function arguments to kFuncArgsMax. if (argumentsCount > kFuncArgsMax) argumentsCount = kFuncArgsMax; X86FuncDecl_initCallingConvention(this, convention); X86FuncDecl_initDefinition(this, returnType, arguments, argumentsCount); } // ============================================================================ // [AsmJit::X86FuncDecl - Reset] // ============================================================================ void X86FuncDecl::reset() { uint32_t i; // -------------------------------------------------------------------------- // [Core] // -------------------------------------------------------------------------- _returnType = kVarTypeInvalid; _argumentsCount = 0; _reserved0[0] = 0; _reserved0[1] = 0; for (i = 0; i < ASMJIT_ARRAY_SIZE(_arguments); i++) _arguments[i].reset(); _argumentsStackSize = 0; _gpArgumentsMask = 0x0; _mmArgumentsMask = 0x0; _xmmArgumentsMask = 0x0; // -------------------------------------------------------------------------- // [Convention] // -------------------------------------------------------------------------- _convention = kFuncConvNone; _calleePopsStack = false; _argumentsDirection = kFuncArgsRTL; _reserved1 = 0; for (i = 0; i < ASMJIT_ARRAY_SIZE(_gpList); i++) _gpList[i] = kRegIndexInvalid; for (i = 0; i < ASMJIT_ARRAY_SIZE(_xmmList); i++) _xmmList[i] = kRegIndexInvalid; _gpListMask = 0x0; _mmListMask = 0x0; _xmmListMask = 0x0; _gpPreservedMask = 0x0; _mmPreservedMask = 0x0; _xmmPreservedMask = 0x0; } } // AsmJit namespace // [Api-Begin] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86compiler.cpp0000644000175000017500000005227112140261626022360 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" #include "../x86/x86compilercontext.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerUtil] // ============================================================================ bool CompilerUtil::isStack16ByteAligned() { // Stack is always aligned to 16-bytes when using 64-bit OS. bool result = (sizeof(uintptr_t) == 8); // Modern Linux, APPLE and UNIX guarantees stack alignment to 16 bytes by // default. I'm really not sure about all UNIX operating systems, because // 16-byte alignment is an addition to an older specification. #if (defined(__linux__) || \ defined(__linux) || \ defined(linux) || \ defined(__unix__) || \ defined(__FreeBSD__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) || \ defined(__DARWIN__) || \ defined(__APPLE__) ) result = true; #endif // __linux__ return result; } // ============================================================================ // [AsmJit::X86Compiler - Construction / Destruction] // ============================================================================ X86Compiler::X86Compiler(Context* context) : Compiler(context) { _properties |= IntUtil::maskFromIndex(kX86PropertyOptimizedAlign); } X86Compiler::~X86Compiler() { } // ============================================================================ // [AsmJit::Compiler - Function Builder] // ============================================================================ X86CompilerFuncDecl* X86Compiler::newFunc_(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { ASMJIT_ASSERT(_func == NULL); X86CompilerFuncDecl* func = Compiler_newItem(this); _func = func; _varNameId = 0; func->setPrototype(convention, returnType, arguments, argumentsCount); addItem(func); bind(func->_entryLabel); func->_createVariables(); return func; } X86CompilerFuncDecl* X86Compiler::endFunc() { X86CompilerFuncDecl* func = getFunc(); ASMJIT_ASSERT(func != NULL); bind(func->_exitLabel); addItem(func->_end); func->setFuncFlag(kFuncFlagIsFinished); _func = NULL; return func; } // ============================================================================ // [AsmJit::Compiler - EmitInstruction] // ============================================================================ static inline X86CompilerInst* X86Compiler_newInstruction(X86Compiler* self, uint32_t code, Operand* opData, uint32_t opCount) { if (code >= _kX86InstJBegin && code <= _kX86InstJEnd) { void* p = self->_zoneMemory.alloc(sizeof(X86CompilerJmpInst)); return new(p) X86CompilerJmpInst(self, code, opData, opCount); } else { void* p = self->_zoneMemory.alloc(sizeof(X86CompilerInst) + opCount * sizeof(Operand)); return new(p) X86CompilerInst(self, code, opData, opCount); } } void X86Compiler::_emitInstruction(uint32_t code) { X86CompilerInst* inst = X86Compiler_newInstruction(this, code, NULL, 0); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(1 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 1); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(2 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; operands[1] = *o1; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 2); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(3 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; operands[1] = *o1; operands[2] = *o2; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 3); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(4 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; operands[1] = *o1; operands[2] = *o2; operands[3] = *o3; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 4); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3, const Operand* o4) { Operand* operands = reinterpret_cast(_zoneMemory.alloc(5 * sizeof(Operand))); if (operands == NULL) { setError(kErrorNoHeapMemory); return; } operands[0] = *o0; operands[1] = *o1; operands[2] = *o2; operands[3] = *o3; operands[4] = *o4; X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 5); if (inst == NULL) { setError(kErrorNoHeapMemory); return; } addItem(inst); if (_cc != NULL) { inst->_offset = _cc->_currentOffset; inst->prepare(*_cc); } } void X86Compiler::_emitJcc(uint32_t code, const Label* label, uint32_t hint) { if (hint == kCondHintNone) { _emitInstruction(code, label); } else { Imm imm(hint); _emitInstruction(code, label, &imm); } } X86CompilerFuncCall* X86Compiler::_emitCall(const Operand* o0) { X86CompilerFuncDecl* func = getFunc(); if (func == NULL) { setError(kErrorNoFunction); return NULL; } X86CompilerFuncCall* call = Compiler_newItem(this, func, o0); if (call == NULL) { setError(kErrorNoHeapMemory); return NULL; } addItem(call); return call; } void X86Compiler::_emitReturn(const Operand* first, const Operand* second) { X86CompilerFuncDecl* func = getFunc(); if (func == NULL) { setError(kErrorNoFunction); return; } X86CompilerFuncRet* ret = Compiler_newItem(this, func, first, second); if (ret == NULL) { setError(kErrorNoHeapMemory); return; } addItem(ret); } // ============================================================================ // [AsmJit::Compiler - Align] // ============================================================================ void X86Compiler::align(uint32_t m) { addItem(Compiler_newItem(this, m)); } // ============================================================================ // [AsmJit::Compiler - Label] // ============================================================================ Label X86Compiler::newLabel() { Label label; label._base.id = static_cast(_targets.getLength()) | kOperandIdTypeLabel; CompilerTarget* target = Compiler_newItem(this, label); _targets.append(target); return label; } void X86Compiler::bind(const Label& label) { uint32_t id = label.getId() & kOperandIdValueMask; ASMJIT_ASSERT(id != kInvalidValue); ASMJIT_ASSERT(id < _targets.getLength()); addItem(_targets[id]); } // ============================================================================ // [AsmJit::Compiler - Variables] // ============================================================================ X86CompilerVar* X86Compiler::_newVar(const char* name, uint32_t type, uint32_t size) { X86CompilerVar* var = reinterpret_cast(_zoneMemory.alloc(sizeof(X86CompilerVar))); if (var == NULL) return NULL; char nameBuffer[32]; if (name == NULL) { sprintf(nameBuffer, "var_%d", _varNameId); name = nameBuffer; _varNameId++; } var->_name = _zoneMemory.sdup(name); var->_id = static_cast(_vars.getLength()) | kOperandIdTypeVar; var->_type = static_cast(type); var->_class = x86VarInfo[type].getClass(); var->_priority = 10; var->_isRegArgument = false; var->_isMemArgument = false; var->_isCalculated = false; var->_unused = 0; var->_size = size; var->firstItem = NULL; var->lastItem = NULL; var->funcScope = getFunc(); var->funcCall = NULL; var->homeRegisterIndex = kRegIndexInvalid; var->prefRegisterMask = 0; var->homeMemoryOffset = 0; var->homeMemoryData = NULL; var->regIndex = kRegIndexInvalid; var->workOffset = kInvalidValue; var->nextActive = NULL; var->prevActive = NULL; var->state = kVarStateUnused; var->changed = false; var->saveOnUnuse = false; var->regReadCount = 0; var->regWriteCount = 0; var->regRwCount = 0; var->regGpbLoCount = 0; var->regGpbHiCount = 0; var->memReadCount = 0; var->memWriteCount = 0; var->memRwCount = 0; var->tPtr = NULL; _vars.append(var); return var; } GpVar X86Compiler::newGpVar(uint32_t varType, const char* name) { ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassGp) != 0); #if defined(ASMJIT_X86) if (x86VarInfo[varType].getSize() > 4) { varType = kX86VarTypeGpd; if (_logger) _logger->logString("*** COMPILER WARNING: QWORD variable translated to DWORD, FIX YOUR CODE! ***\n"); } #endif // ASMJIT_X86 X86CompilerVar* var = _newVar(name, varType, x86VarInfo[varType].getSize()); return var->asGpVar(); } GpVar X86Compiler::getGpArg(uint32_t argIndex) { X86CompilerFuncDecl* func = getFunc(); GpVar var; if (func != NULL) { X86FuncDecl* decl = func->getDecl(); if (argIndex < decl->getArgumentsCount()) { X86CompilerVar* cv = func->getVar(argIndex); var._var.id = cv->getId(); var._var.size = cv->getSize(); var._var.regCode = x86VarInfo[cv->getType()].getCode(); var._var.varType = cv->getType(); } } return var; } MmVar X86Compiler::newMmVar(uint32_t varType, const char* name) { ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassMm) != 0); X86CompilerVar* var = _newVar(name, varType, 8); return var->asMmVar(); } MmVar X86Compiler::getMmArg(uint32_t argIndex) { X86CompilerFuncDecl* func = getFunc(); MmVar var; if (func != NULL) { const X86FuncDecl* decl = func->getDecl(); if (argIndex < decl->getArgumentsCount()) { X86CompilerVar* cv = func->getVar(argIndex); var._var.id = cv->getId(); var._var.size = cv->getSize(); var._var.regCode = x86VarInfo[cv->getType()].getCode(); var._var.varType = cv->getType(); } } return var; } XmmVar X86Compiler::newXmmVar(uint32_t varType, const char* name) { ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassXmm) != 0); X86CompilerVar* var = _newVar(name, varType, 16); return var->asXmmVar(); } XmmVar X86Compiler::getXmmArg(uint32_t argIndex) { X86CompilerFuncDecl* func = getFunc(); XmmVar var; if (func != NULL) { const X86FuncDecl* decl = func->getDecl(); if (argIndex < decl->getArgumentsCount()) { X86CompilerVar* cv = func->getVar(argIndex); var._var.id = cv->getId(); var._var.size = cv->getSize(); var._var.regCode = x86VarInfo[cv->getType()].getCode(); var._var.varType = cv->getType(); } } return var; } void X86Compiler::_vhint(Var& var, uint32_t hintId, uint32_t hintValue) { if (var.getId() == kInvalidValue) return; X86CompilerVar* cv = _getVar(var.getId()); ASMJIT_ASSERT(cv != NULL); X86CompilerHint* item = Compiler_newItem(this, cv, hintId, hintValue); addItem(item); } void X86Compiler::alloc(Var& var) { _vhint(var, kVarHintAlloc, kInvalidValue); } void X86Compiler::alloc(Var& var, uint32_t regIndex) { if (regIndex > 31) return; _vhint(var, kVarHintAlloc, IntUtil::maskFromIndex(regIndex)); } void X86Compiler::alloc(Var& var, const Reg& reg) { _vhint(var, kVarHintAlloc, IntUtil::maskFromIndex(reg.getRegIndex())); } void X86Compiler::save(Var& var) { _vhint(var, kVarHintSave, kInvalidValue); } void X86Compiler::spill(Var& var) { _vhint(var, kVarHintSpill, kInvalidValue); } void X86Compiler::unuse(Var& var) { _vhint(var, kVarHintUnuse, kInvalidValue); } uint32_t X86Compiler::getPriority(Var& var) const { if (var.getId() == kInvalidValue) return kInvalidValue; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); return vdata->getPriority(); } void X86Compiler::setPriority(Var& var, uint32_t priority) { if (var.getId() == kInvalidValue) return; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); if (priority > 100) priority = 100; vdata->_priority = static_cast(priority); } bool X86Compiler::getSaveOnUnuse(Var& var) const { if (var.getId() == kInvalidValue) return false; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); return (bool)vdata->saveOnUnuse; } void X86Compiler::setSaveOnUnuse(Var& var, bool value) { if (var.getId() == kInvalidValue) return; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); vdata->saveOnUnuse = value; } void X86Compiler::rename(Var& var, const char* name) { if (var.getId() == kInvalidValue) return; X86CompilerVar* vdata = _getVar(var.getId()); ASMJIT_ASSERT(vdata != NULL); vdata->_name = _zoneMemory.sdup(name); } // ============================================================================ // [AsmJit::Compiler - State] // ============================================================================ X86CompilerState* X86Compiler::_newState(uint32_t memVarsCount) { X86CompilerState* state = reinterpret_cast(_zoneMemory.alloc( sizeof(X86CompilerState) + memVarsCount * sizeof(void*))); return state; } // ============================================================================ // [AsmJit::Compiler - Make] // ============================================================================ void* X86Compiler::make() { X86Assembler x86Asm(_context); x86Asm._properties = _properties; x86Asm.setLogger(_logger); serialize(x86Asm); if (this->getError()) return NULL; if (x86Asm.getError()) { setError(x86Asm.getError()); return NULL; } void* result = x86Asm.make(); if (_logger) { _logger->logFormat("*** COMPILER SUCCESS - Wrote %u bytes, code: %u, trampolines: %u.\n\n", (unsigned int)x86Asm.getCodeSize(), (unsigned int)x86Asm.getOffset(), (unsigned int)x86Asm.getTrampolineSize()); } return result; } void X86Compiler::serialize(Assembler& a) { X86CompilerContext x86Context(this); X86Assembler& x86Asm = static_cast(a); CompilerItem* start = _first; CompilerItem* stop = NULL; // Register all labels. x86Asm.registerLabels(_targets.getLength()); // Make code. for (;;) { _cc = NULL; // ------------------------------------------------------------------------ // [Find Function] // ------------------------------------------------------------------------ for (;;) { if (start == NULL) return; if (start->getType() == kCompilerItemFuncDecl) break; start->emit(x86Asm); start = start->getNext(); } // ------------------------------------------------------------------------ // [Setup CompilerContext] // ------------------------------------------------------------------------ stop = static_cast(start)->getEnd(); x86Context._func = static_cast(start); x86Context._start = start; x86Context._stop = stop; x86Context._extraBlock = stop->getPrev(); // Detect whether the function generation was finished. if (!x86Context._func->isFinished() || x86Context._func->getEnd()->getPrev() == NULL) { setError(kErrorIncompleteFunction); return; } // ------------------------------------------------------------------------ // Step 1: // - Assign/increment offset of each item. // - Extract variables from instructions. // - Prepare variables for register allocator: // - Update read(r) / write(w) / read/write(x) statistics. // - Update register / memory usage statistics. // - Find scope (first / last item) of variables. // ------------------------------------------------------------------------ CompilerItem* cur; for (cur = start; ; cur = cur->getNext()) { cur->prepare(x86Context); if (cur == stop) break; } // We set compiler context also to Compiler so newly emitted instructions // can call CompilerItem::prepare() on itself. _cc = &x86Context; // ------------------------------------------------------------------------ // Step 2: // - Translate special instructions (imul, cmpxchg8b, ...). // - Alloc registers. // - Translate forward jumps. // - Alloc memory operands (variables related). // - Emit function prolog. // - Emit function epilog. // - Patch memory operands (variables related). // - Dump function prototype and variable statistics (if enabled). // ------------------------------------------------------------------------ // Translate special instructions and run alloc registers. cur = start; do { do { // Assign current offset of each item back to CompilerContext. x86Context._currentOffset = cur->_offset; // Assign previous item to compiler so each variable spill/alloc will // be emitted before. _current = cur->getPrev(); cur = cur->translate(x86Context); } while (cur); x86Context._isUnreachable = true; size_t len = x86Context._backCode.getLength(); while (x86Context._backPos < len) { cur = x86Context._backCode[x86Context._backPos++]->getNext(); if (!cur->isTranslated()) break; cur = NULL; } } while (cur); // Translate forward jumps. { ForwardJumpData* j = x86Context._forwardJumps; while (j != NULL) { x86Context._assignState(j->state); _current = j->inst->getPrev(); j->inst->doJump(x86Context); j = j->next; } } // Alloc memory operands (variables related). x86Context._allocMemoryOperands(); // Emit function prolog / epilog. x86Context.getFunc()->_preparePrologEpilog(x86Context); _current = x86Context._func->getEntryTarget(); x86Context.getFunc()->_emitProlog(x86Context); _current = x86Context._func->getExitTarget(); x86Context.getFunc()->_emitEpilog(x86Context); // Patch memory operands (variables related). _current = _last; x86Context._patchMemoryOperands(start, stop); // Dump function prototype and variable statistics (if enabled). if (_logger) x86Context.getFunc()->_dumpFunction(x86Context); // ------------------------------------------------------------------------ // Hack: need to register labels that was created by the Step 2. // ------------------------------------------------------------------------ if (x86Asm._labels.getLength() < _targets.getLength()) x86Asm.registerLabels(_targets.getLength() - x86Asm._labels.getLength()); CompilerItem* extraBlock = x86Context._extraBlock; // ------------------------------------------------------------------------ // Step 3: // - Emit instructions to Assembler stream. // ------------------------------------------------------------------------ for (cur = start; ; cur = cur->getNext()) { cur->emit(x86Asm); if (cur == extraBlock) break; } // ------------------------------------------------------------------------ // Step 4: // - Emit everything else (post action). // ------------------------------------------------------------------------ for (cur = start; ; cur = cur->getNext()) { cur->post(x86Asm); if (cur == extraBlock) break; } start = extraBlock->getNext(); x86Context._clear(); } } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86compilerfunc.cpp0000644000175000017500000025007612140261626023237 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86compiler.h" #include "../x86/x86compilercontext.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" #include "../x86/x86cpuinfo.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::X86Assembler - Logging] // ============================================================================ // Defined in AsmJit/X86/X86Assembler.cpp. char* X86Assembler_dumpRegister(char* buf, uint32_t type, uint32_t index); char* X86Assembler_dumpOperand(char* buf, const Operand* op, uint32_t memRegType, uint32_t loggerFlags); // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Construction / Destructioin] // ============================================================================ X86CompilerFuncDecl::X86CompilerFuncDecl(X86Compiler* x86Compiler) : CompilerFuncDecl(x86Compiler), _gpModifiedAndPreserved(0), _mmModifiedAndPreserved(0), _xmmModifiedAndPreserved(0), _movDqInstCode(kInstNone), _pePushPopStackSize(0), _peMovStackSize(0), _peAdjustStackSize(0), _memStackSize(0), _memStackSize16(0) { _decl = &_x86Decl; // Just clear to safe defaults. _funcHints |= IntUtil::maskFromIndex(kX86FuncHintPushPop); // Stack is always aligned to 16-bytes when using 64-bit OS. if (CompilerUtil::isStack16ByteAligned()) _funcHints |= IntUtil::maskFromIndex(kX86FuncHintAssume16ByteAlignment); _entryLabel = x86Compiler->newLabel(); _exitLabel = x86Compiler->newLabel(); _entryTarget = x86Compiler->_getTarget(_entryLabel.getId()); _exitTarget = x86Compiler->_getTarget(_exitLabel.getId()); _end = Compiler_newItem(x86Compiler, this); } X86CompilerFuncDecl::~X86CompilerFuncDecl() { } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Interface] // ============================================================================ void X86CompilerFuncDecl::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _offset = x86Context._currentOffset++; _prepareVariables(this); } CompilerItem* X86CompilerFuncDecl::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _allocVariables(x86Context); return translated(); } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Misc] // ============================================================================ int X86CompilerFuncDecl::getMaxSize() const { // NOP. return 0; } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Prototype] // ============================================================================ void X86CompilerFuncDecl::setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { _x86Decl.setPrototype(convention, returnType, arguments, argumentsCount); } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Helpers] // ============================================================================ void X86CompilerFuncDecl::_createVariables() { X86Compiler* x86Compiler = getCompiler(); uint32_t i, count = _x86Decl.getArgumentsCount(); if (count == 0) return; _vars = reinterpret_cast(x86Compiler->getZoneMemory().alloc(count * sizeof(void*))); if (_vars == NULL) { x86Compiler->setError(kErrorNoHeapMemory); return; } char argNameStorage[64]; char* argName = NULL; bool debug = x86Compiler->getLogger() != NULL; if (debug) argName = argNameStorage; for (i = 0; i < count; i++) { FuncArg& arg = _x86Decl.getArgument(i); if (debug) snprintf(argName, ASMJIT_ARRAY_SIZE(argNameStorage), "arg_%u", i); uint32_t size = X86Util::getVarSizeFromVarType(arg.getVarType()); X86CompilerVar* cv = x86Compiler->_newVar(argName, arg.getVarType(), size); if (arg.getRegIndex() != kRegIndexInvalid) { cv->_isRegArgument = true; cv->regIndex = arg.getRegIndex(); } if (arg.getStackOffset() != kFuncStackInvalid) { cv->_isMemArgument = true; cv->homeMemoryOffset = arg.getStackOffset(); } _vars[i] = cv; } } void X86CompilerFuncDecl::_prepareVariables(CompilerItem* first) { uint32_t count = _x86Decl.getArgumentsCount(); if (count == 0) return; for (uint32_t i = 0; i < count; i++) { X86CompilerVar* cv = getVar(i); // This is where variable scope starts. cv->firstItem = first; // If this will not be changed then it will be deallocated immediately. cv->lastItem = first; } } void X86CompilerFuncDecl::_allocVariables(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); uint32_t count = getDecl()->getArgumentsCount(); if (count == 0) return; for (uint32_t i = 0; i < count; i++) { X86CompilerVar* cv = getVar(i); if (cv->firstItem != NULL || cv->isArgument()) { // Variable is used. if (cv->regIndex != kRegIndexInvalid) { cv->state = kVarStateReg; // If variable is in register -> mark it as changed so it will not be // lost by first spill. cv->changed = true; x86Context._allocatedVariable(cv); } else if (cv->isMemArgument()) { cv->state = kVarStateMem; } } else { // Variable is not used. cv->regIndex = kRegIndexInvalid; } } } void X86CompilerFuncDecl::_preparePrologEpilog(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); const X86CpuInfo* cpuInfo = X86CpuInfo::getGlobal(); clearFuncFlag( kX86FuncFlagPushPop | kX86FuncFlagEmitEmms | kX86FuncFlagEmitSFence | kX86FuncFlagEmitLFence | kX86FuncFlagAssume16ByteAlignment | kX86FuncFlagPerform16ByteAlignment); uint32_t accessibleMemoryBelowStack = 0; if (getDecl()->getConvention() == kX86FuncConvX64U) accessibleMemoryBelowStack = 128; if (getHint(kX86FuncHintAssume16ByteAlignment )) setFuncFlag(kX86FuncFlagAssume16ByteAlignment); if (getHint(kX86FuncHintPerform16ByteAlignment)) setFuncFlag(kX86FuncFlagPerform16ByteAlignment); if (getHint(kFuncHintNaked) != 0) setFuncFlag(kFuncFlagIsNaked); if (isCaller() && (x86Context._memBytesTotal > 0 || isAssumed16ByteAlignment())) setFuncFlag(kX86FuncFlagIsEspAdjusted); if (x86Context._memBytesTotal > accessibleMemoryBelowStack) setFuncFlag(kX86FuncFlagIsEspAdjusted); if (getHint(kX86FuncHintPushPop) != 0) setFuncFlag(kX86FuncFlagPushPop); if (getHint(kX86FuncHintEmms) != 0) setFuncFlag(kX86FuncFlagEmitEmms); if (getHint(kX86FuncHintSFence) != 0) setFuncFlag(kX86FuncFlagEmitSFence); if (getHint(kX86FuncHintLFence) != 0) setFuncFlag(kX86FuncFlagEmitLFence); // Updated to respect comment from issue #47, align also when using MMX code. if (!isAssumed16ByteAlignment() && !isNaked() && (x86Context._mem16BlocksCount + (x86Context._mem8BlocksCount > 0))) { // Have to align stack to 16-bytes. setFuncFlag(kX86FuncFlagIsEspAdjusted | kX86FuncFlagPerform16ByteAlignment); } _gpModifiedAndPreserved = x86Context._modifiedGpRegisters & _x86Decl.getGpPreservedMask() & (~IntUtil::maskFromIndex(kX86RegIndexEsp)); _mmModifiedAndPreserved = x86Context._modifiedMmRegisters & _x86Decl.getMmPreservedMask(); _xmmModifiedAndPreserved = x86Context._modifiedXmmRegisters & _x86Decl.getXmmPreservedMask(); _movDqInstCode = (isAssumed16ByteAlignment() | isPerformed16ByteAlignment()) ? kX86InstMovDQA : kX86InstMovDQU; // Prolog & Epilog stack size. { int32_t memGpSize = IntUtil::bitCount(_gpModifiedAndPreserved) * sizeof(intptr_t); int32_t memMmSize = IntUtil::bitCount(_mmModifiedAndPreserved) * 8; int32_t memXmmSize = IntUtil::bitCount(_xmmModifiedAndPreserved) * 16; if (hasFuncFlag(kX86FuncFlagPushPop)) { _pePushPopStackSize = memGpSize; _peMovStackSize = memXmmSize + IntUtil::align(memMmSize, 16); } else { _pePushPopStackSize = 0; _peMovStackSize = memXmmSize + IntUtil::align(memMmSize + memGpSize, 16); } } if (isPerformed16ByteAlignment()) { _peAdjustStackSize += IntUtil::delta(_pePushPopStackSize, 16); } else { int32_t v = 16 - sizeof(uintptr_t); if (!isNaked()) v -= sizeof(uintptr_t); v -= _pePushPopStackSize & 15; if (v < 0) v += 16; _peAdjustStackSize = v; //_peAdjustStackSize += IntUtil::delta(_pePushPopStackSize + v, 16); } // Memory stack size. _memStackSize = x86Context._memBytesTotal; _memStackSize16 = IntUtil::align(_memStackSize, 16); if (isNaked()) { x86Context._argumentsBaseReg = kX86RegIndexEsp; x86Context._argumentsBaseOffset = hasFuncFlag(kX86FuncFlagIsEspAdjusted) ? (_funcCallStackSize + _memStackSize16 + _peMovStackSize + _pePushPopStackSize + _peAdjustStackSize) : (_pePushPopStackSize); } else { x86Context._argumentsBaseReg = kX86RegIndexEbp; x86Context._argumentsBaseOffset = sizeof(sysint_t); } x86Context._variablesBaseReg = kX86RegIndexEsp; x86Context._variablesBaseOffset = _funcCallStackSize; if (!hasFuncFlag(kX86FuncFlagIsEspAdjusted)) x86Context._variablesBaseOffset = -_memStackSize16 - _peMovStackSize - _peAdjustStackSize; } void X86CompilerFuncDecl::_dumpFunction(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); Logger* logger = x86Compiler->getLogger(); ASMJIT_ASSERT(logger != NULL); uint32_t i; char _buf[1024]; char* p; // Log function prototype. { uint32_t argumentsCount = _x86Decl.getArgumentsCount(); bool first = true; logger->logString("; Function Prototype:\n"); logger->logString(";\n"); for (i = 0; i < argumentsCount; i++) { const FuncArg& a = _x86Decl.getArgument(i); X86CompilerVar* cv = getVar(i); if (first) { logger->logString("; IDX| Type | Sz | Home |\n"); logger->logString("; ---+----------+----+----------------+\n"); } char* memHome = memHome = _buf; if (a.hasRegIndex()) { Reg regOp(a.getRegIndex() | kX86RegTypeGpz, 0); X86Assembler_dumpOperand(memHome, ®Op, kX86RegTypeGpz, 0)[0] = '\0'; } else { Mem memOp; memOp._mem.base = kX86RegIndexEsp; memOp._mem.displacement = a.getStackOffset(); X86Assembler_dumpOperand(memHome, &memOp, kX86RegTypeGpz, 0)[0] = '\0'; } logger->logFormat("; %-3u| %-9s| %-3u| %-15s|\n", // Argument index. i, // Argument type. cv->getType() < kX86VarTypeCount ? x86VarInfo[cv->getType()].getName() : "invalid", // Argument size. cv->getSize(), // Argument memory home. memHome ); first = false; } logger->logString(";\n"); } // Log variables. { uint32_t variablesCount = (uint32_t)x86Compiler->_vars.getLength(); bool first = true; logger->logString("; Variables:\n"); logger->logString(";\n"); for (i = 0; i < variablesCount; i++) { X86CompilerVar* cv = static_cast(x86Compiler->_vars[i]); // If this variable is not related to this function then skip it. if (cv->funcScope != this) continue; // Get some information about variable type. const X86VarInfo& vinfo = x86VarInfo[cv->getType()]; if (first) { logger->logString("; ID | Type | Sz | Home | Register Access | Memory Access |\n"); logger->logString("; ---+----------+----+----------------+-------------------+-------------------+\n"); } char* memHome = (char*)"[None]"; if (cv->homeMemoryData != NULL) { VarMemBlock* memBlock = reinterpret_cast(cv->homeMemoryData); memHome = _buf; Mem memOp; if (cv->isMemArgument()) { const FuncArg& a = _x86Decl.getArgument(i); memOp._mem.base = x86Context._argumentsBaseReg; memOp._mem.displacement += x86Context._argumentsBaseOffset; memOp._mem.displacement += a.getStackOffset(); } else { memOp._mem.base = x86Context._variablesBaseReg; memOp._mem.displacement += x86Context._variablesBaseOffset; memOp._mem.displacement += memBlock->offset; } X86Assembler_dumpOperand(memHome, &memOp, kX86RegTypeGpz, 0)[0] = '\0'; } logger->logFormat("; %-3u| %-9s| %-3u| %-15s| r=%-4uw=%-4ux=%-4u| r=%-4uw=%-4ux=%-4u|\n", // Variable id. (uint)(i & kOperandIdValueMask), // Variable type. cv->getType() < kX86VarTypeCount ? vinfo.getName() : "invalid", // Variable size. cv->getSize(), // Variable memory home. memHome, // Register access count. (unsigned int)cv->regReadCount, (unsigned int)cv->regWriteCount, (unsigned int)cv->regRwCount, // Memory access count. (unsigned int)cv->memReadCount, (unsigned int)cv->memWriteCount, (unsigned int)cv->memRwCount ); first = false; } logger->logString(";\n"); } // Log modified registers. { p = _buf; uint32_t r; uint32_t modifiedRegisters = 0; for (r = 0; r < 3; r++) { bool first = true; uint32_t regs; uint32_t type; switch (r) { case 0: regs = x86Context._modifiedGpRegisters; type = kX86RegTypeGpz; p = StringUtil::copy(p, "; GP : "); break; case 1: regs = x86Context._modifiedMmRegisters; type = kX86RegTypeMm; p = StringUtil::copy(p, "; MM : "); break; case 2: regs = x86Context._modifiedXmmRegisters; type = kX86RegTypeXmm; p = StringUtil::copy(p, "; XMM: "); break; default: ASMJIT_ASSERT(0); } for (i = 0; i < kX86RegNumBase; i++) { if ((regs & IntUtil::maskFromIndex(i)) != 0) { if (!first) { *p++ = ','; *p++ = ' '; } p = X86Assembler_dumpRegister(p, type, i); first = false; modifiedRegisters++; } } *p++ = '\n'; } *p = '\0'; logger->logFormat("; Modified registers (%u):\n", (unsigned int)modifiedRegisters); logger->logString(_buf); } logger->logString("\n"); } void X86CompilerFuncDecl::_emitProlog(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); // -------------------------------------------------------------------------- // [Init] // -------------------------------------------------------------------------- uint32_t i, mask; uint32_t preservedGP = _gpModifiedAndPreserved; uint32_t preservedMM = _mmModifiedAndPreserved; uint32_t preservedXMM = _xmmModifiedAndPreserved; int32_t stackOffset = _getRequiredStackOffset(); int32_t stackPos; // -------------------------------------------------------------------------- // [Prolog] // -------------------------------------------------------------------------- if (x86Compiler->getLogger()) x86Compiler->comment("Prolog"); // Emit standard prolog entry code (but don't do it if function is set to be // naked). // // Also see the _prologEpilogStackAdjust variable. If function is naked (so // prolog and epilog will not contain "push ebp" and "mov ebp, esp", we need // to adjust stack by 8 bytes in 64-bit mode (this will give us that stack // will remain aligned to 16 bytes). if (!isNaked()) { x86Compiler->emit(kX86InstPush, zbp); x86Compiler->emit(kX86InstMov, zbp, zsp); } // Align manually stack-pointer to 16-bytes. if (isPerformed16ByteAlignment()) { ASMJIT_ASSERT(!isNaked()); x86Compiler->emit(kX86InstAnd, zsp, imm(-16)); } // -------------------------------------------------------------------------- // [Save Gp - Push/Pop] // -------------------------------------------------------------------------- if (preservedGP != 0 && hasFuncFlag(kX86FuncFlagPushPop)) { for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (preservedGP & mask) x86Compiler->emit(kX86InstPush, gpz(i)); } } // -------------------------------------------------------------------------- // [Adjust Scack] // -------------------------------------------------------------------------- if (isEspAdjusted()) { stackPos = _memStackSize16 + _funcCallStackSize; if (stackOffset != 0) x86Compiler->emit(kX86InstSub, zsp, imm(stackOffset)); } else { stackPos = -(_peMovStackSize + _peAdjustStackSize); //if (_pePushPop) stackPos += IntUtil::bitCount(preservedGP) * sizeof(sysint_t); } // -------------------------------------------------------------------------- // [Save Xmm - MovDqa/MovDqu] // -------------------------------------------------------------------------- if (preservedXMM != 0) { for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if (preservedXMM & mask) { x86Compiler->emit(_movDqInstCode, dqword_ptr(zsp, stackPos), xmm(i)); stackPos += 16; } } } // -------------------------------------------------------------------------- // [Save Mm - MovQ] // -------------------------------------------------------------------------- if (preservedMM != 0) { for (i = 0, mask = 1; i < 8; i++, mask <<= 1) { if (preservedMM & mask) { x86Compiler->emit(kX86InstMovQ, qword_ptr(zsp, stackPos), mm(i)); stackPos += 8; } } } // -------------------------------------------------------------------------- // [Save Gp - Mov] // -------------------------------------------------------------------------- if (preservedGP != 0 && !hasFuncFlag(kX86FuncFlagPushPop)) { for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (preservedGP & mask) { x86Compiler->emit(kX86InstMov, sysint_ptr(zsp, stackPos), gpz(i)); stackPos += sizeof(sysint_t); } } } // -------------------------------------------------------------------------- // [...] // -------------------------------------------------------------------------- if (x86Compiler->getLogger()) x86Compiler->comment("Body"); } void X86CompilerFuncDecl::_emitEpilog(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); const X86CpuInfo* cpuInfo = X86CpuInfo::getGlobal(); // -------------------------------------------------------------------------- // [Init] // -------------------------------------------------------------------------- uint32_t i, mask; uint32_t preservedGP = _gpModifiedAndPreserved; uint32_t preservedMM = _mmModifiedAndPreserved; uint32_t preservedXMM = _xmmModifiedAndPreserved; int32_t stackOffset = _getRequiredStackOffset(); int32_t stackPos; if (isEspAdjusted()) stackPos = _memStackSize16 + _funcCallStackSize; else stackPos = -(_peMovStackSize + _peAdjustStackSize); // -------------------------------------------------------------------------- // [Epilog] // -------------------------------------------------------------------------- if (x86Compiler->getLogger()) x86Compiler->comment("Epilog"); // -------------------------------------------------------------------------- // [Restore Xmm - MovDqa/ModDqu] // -------------------------------------------------------------------------- if (preservedXMM != 0) { for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if (preservedXMM & mask) { x86Compiler->emit(_movDqInstCode, xmm(i), dqword_ptr(zsp, stackPos)); stackPos += 16; } } } // -------------------------------------------------------------------------- // [Restore Mm - MovQ] // -------------------------------------------------------------------------- if (preservedMM != 0) { for (i = 0, mask = 1; i < 8; i++, mask <<= 1) { if (preservedMM & mask) { x86Compiler->emit(kX86InstMovQ, mm(i), qword_ptr(zsp, stackPos)); stackPos += 8; } } } // -------------------------------------------------------------------------- // [Restore Gp - Mov] // -------------------------------------------------------------------------- if (preservedGP != 0 && !hasFuncFlag(kX86FuncFlagPushPop)) { for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (preservedGP & mask) { x86Compiler->emit(kX86InstMov, gpz(i), sysint_ptr(zsp, stackPos)); stackPos += sizeof(sysint_t); } } } // -------------------------------------------------------------------------- // [Adjust Stack] // -------------------------------------------------------------------------- if (isEspAdjusted() && stackOffset != 0) x86Compiler->emit(kX86InstAdd, zsp, imm(stackOffset)); // -------------------------------------------------------------------------- // [Restore Gp - Push/Pop] // -------------------------------------------------------------------------- if (preservedGP != 0 && hasFuncFlag(kX86FuncFlagPushPop)) { for (i = kX86RegNumGp - 1, mask = 1 << i; (int32_t)i >= 0; i--, mask >>= 1) { if (preservedGP & mask) x86Compiler->emit(kX86InstPop, gpz(i)); } } // -------------------------------------------------------------------------- // [Emms] // -------------------------------------------------------------------------- if (hasFuncFlag(kX86FuncFlagEmitEmms)) x86Compiler->emit(kX86InstEmms); // -------------------------------------------------------------------------- // [MFence/SFence/LFence] // -------------------------------------------------------------------------- if (hasFuncFlag(kX86FuncFlagEmitSFence) & hasFuncFlag(kX86FuncFlagEmitLFence)) x86Compiler->emit(kX86InstMFence); else if (hasFuncFlag(kX86FuncFlagEmitSFence)) x86Compiler->emit(kX86InstSFence); else if (hasFuncFlag(kX86FuncFlagEmitLFence)) x86Compiler->emit(kX86InstLFence); // -------------------------------------------------------------------------- // [Epilog] // -------------------------------------------------------------------------- // Emit standard epilog leave code (if needed). if (!isNaked()) { // AMD seems to prefer LEAVE instead of MOV/POP sequence. if (cpuInfo->getVendorId() == kCpuAmd) { x86Compiler->emit(kX86InstLeave); } else { x86Compiler->emit(kX86InstMov, zsp, zbp); x86Compiler->emit(kX86InstPop, zbp); } } // Emit return. if (_x86Decl.getCalleePopsStack()) x86Compiler->emit(kX86InstRet, imm((int16_t)_x86Decl.getArgumentsStackSize())); else x86Compiler->emit(kX86InstRet); } // ============================================================================ // [AsmJit::X86CompilerFuncDecl - Function-Call] // ============================================================================ void X86CompilerFuncDecl::reserveStackForFunctionCall(int32_t size) { size = IntUtil::align(size, 16); if (size > _funcCallStackSize) _funcCallStackSize = size; setFuncFlag(kFuncFlagIsCaller); } // ============================================================================ // [AsmJit::X86CompilerFuncEnd - Construction / Destruction] // ============================================================================ X86CompilerFuncEnd::X86CompilerFuncEnd(X86Compiler* x86Compiler, X86CompilerFuncDecl* func) : CompilerFuncEnd(x86Compiler, func) { } X86CompilerFuncEnd::~X86CompilerFuncEnd() { } // ============================================================================ // [AsmJit::X86CompilerFuncEnd - Interface] // ============================================================================ void X86CompilerFuncEnd::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); _offset = x86Context._currentOffset++; } CompilerItem* X86CompilerFuncEnd::translate(CompilerContext& cc) { _isTranslated = true; return NULL; } // ============================================================================ // [AsmJit::X86CompilerFuncRet - Construction / Destruction] // ============================================================================ X86CompilerFuncRet::X86CompilerFuncRet(X86Compiler* x86Compiler, X86CompilerFuncDecl* func, const Operand* first, const Operand* second) : CompilerFuncRet(x86Compiler, func, first, second) { /* // TODO:? // Check whether the return value is compatible. uint32_t retValType = function->_x86Decl.getReturnType(); bool valid = false; switch (retValType) { case kX86VarTypeGpd: case kX86VarTypeGpq: if ((_ret[0].isVar() && (reinterpret_cast(_ret[0]).isGpVar())) || (_ret[0].isImm())) { valid = true; } break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: if ((_ret[0].isVar() && (reinterpret_cast(_ret[0]).isX87Var() || reinterpret_cast(_ret[0]).isXmmVar() )) ) { valid = true; } break; case kX86VarTypeMm: break; case kVarTypeInvalid: if (_ret[0].isNone() && _ret[1].isNone()) { valid = true; } break; default: break; } // Incompatible return value. if (!valid) { c->setError(kErrorIncompatibleReturnType); } */ } X86CompilerFuncRet::~X86CompilerFuncRet() { } // ============================================================================ // [AsmJit::X86CompilerFuncRet - Interface] // ============================================================================ void X86CompilerFuncRet::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); uint32_t retValType = getFunc()->_x86Decl.getReturnType(); _offset = x86Context._currentOffset; if (retValType != kVarTypeInvalid) { uint32_t i; for (i = 0; i < 2; i++) { Operand& o = _ret[i]; if (o.isVar()) { ASMJIT_ASSERT(o.getId() != kInvalidValue); X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); // First item (begin of variable scope). if (cv->firstItem == NULL) cv->firstItem = this; // Last item (end of variable scope). cv->lastItem = this; if (cv->workOffset == _offset) continue; if (!x86Context._isActive(cv)) x86Context._addActive(cv); cv->workOffset = _offset; cv->regReadCount++; if (X86Util::isVarTypeInt(cv->getType()) && X86Util::isVarTypeInt(retValType)) { x86Context._newRegisterHomeIndex(cv, (i == 0) ? kX86RegIndexEax : kX86RegIndexEdx); } } } } x86Context._currentOffset++; } CompilerItem* X86CompilerFuncRet::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); // Check whether the return value is compatible. uint32_t retValType = getFunc()->getDecl()->getReturnType(); uint32_t i; switch (retValType) { case kX86VarTypeGpd: case kX86VarTypeGpq: for (i = 0; i < 2; i++) { uint32_t dstIndex = (i == 0) ? kX86RegIndexEax : kX86RegIndexEdx; uint32_t srcIndex; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isGpVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srcIndex = cv->regIndex; if (srcIndex == kRegIndexInvalid) x86Compiler->emit(kX86InstMov, gpz(dstIndex), x86Context._getVarMem(cv)); else if (dstIndex != srcIndex) x86Compiler->emit(kX86InstMov, gpz(dstIndex), gpz(srcIndex)); } } else if (_ret[i].isImm()) { x86Compiler->emit(kX86InstMov, gpz(dstIndex), _ret[i]); } } break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // There is case that we need to return two values (Unix-ABI specific): // - FLD #2 //- FLD #1 i = 2; do { i--; uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isX87Var()) { // TODO: X87 Support. } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; if (srci != kRegIndexInvalid) x86Context.saveXmmVar(cv); switch (cv->getType()) { case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstFLd, _BaseVarMem(reinterpret_cast(_ret[i]), 4)); break; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstFLd, _BaseVarMem(reinterpret_cast(_ret[i]), 8)); break; } } } } while (i != 0); break; case kX86VarTypeMm: for (i = 0; i < 2; i++) { uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isGpVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; uint32_t inst = _ret[i].isRegType(kX86RegTypeGpq) ? kX86InstMovQ : kX86InstMovD; if (srci == kRegIndexInvalid) x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv)); else #if defined(ASMJIT_X86) x86Compiler->emit(inst, mm(dsti), gpd(srci)); #else x86Compiler->emit(inst, mm(dsti), _ret[i].isRegType(kX86RegTypeGpq) ? gpq(srci) : gpd(srci)); #endif } else if (reinterpret_cast(_ret[i]).isMmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; uint32_t inst = kX86InstMovQ; if (srci == kRegIndexInvalid) x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(inst, mm(dsti), mm(srci)); } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; uint32_t inst = kX86InstMovQ; if (reinterpret_cast(_ret[i]).getVarType() == kX86VarTypeXmmSS) inst = kX86InstMovD; if (srci == kRegIndexInvalid) x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(inst, mm(dsti), xmm(srci)); } } } break; case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: for (i = 0; i < 2; i++) { uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isGpVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; uint32_t inst = _ret[i].isRegType(kX86RegTypeGpq) ? kX86InstMovQ : kX86InstMovD; if (srci == kRegIndexInvalid) x86Compiler->emit(inst, xmm(dsti), x86Context._getVarMem(cv)); else #if defined(ASMJIT_X86) x86Compiler->emit(inst, xmm(dsti), gpd(srci)); #else x86Compiler->emit(inst, xmm(dsti), _ret[i].isRegType(kX86RegTypeGpq) ? gpq(srci) : gpd(srci)); #endif } else if (reinterpret_cast(_ret[i]).isX87Var()) { // TODO: X87 Support. } else if (reinterpret_cast(_ret[i]).isMmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovQ, xmm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(kX86InstMovQ, xmm(dsti), mm(srci)); } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci)); } } } break; case kX86VarTypeXmmSS: for (i = 0; i < 2; i++) { uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isX87Var()) { // TODO: X87 Support. } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; switch (cv->getType()) { case kX86VarTypeXmm: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci)); break; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovSS, xmm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(kX86InstMovSS, xmm(dsti), xmm(srci)); break; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstCvtSD2SS, xmm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(kX86InstCvtSD2SS, xmm(dsti), xmm(srci)); break; } } } } break; case kX86VarTypeXmmSD: for (i = 0; i < 2; i++) { uint32_t dsti = i; uint32_t srci; if (_ret[i].isVar()) { if (reinterpret_cast(_ret[i]).isX87Var()) { // TODO: X87 Support. } else if (reinterpret_cast(_ret[i]).isXmmVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); ASMJIT_ASSERT(cv != NULL); srci = cv->regIndex; switch (cv->getType()) { case kX86VarTypeXmm: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv)); else if (dsti != srci) x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci)); break; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstCvtSS2SD, xmm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(kX86InstCvtSS2SD, xmm(dsti), xmm(srci)); break; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: if (srci == kRegIndexInvalid) x86Compiler->emit(kX86InstMovSD, xmm(dsti), x86Context._getVarMem(cv)); else x86Compiler->emit(kX86InstMovSD, xmm(dsti), xmm(srci)); break; } } } } break; case kInvalidValue: default: break; } if (mustEmitJump()) { x86Context._isUnreachable = 1; } for (i = 0; i < 2; i++) { if (_ret[i].isVar()) { X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId()); x86Context._unuseVarOnEndOfScope(this, cv); } } return translated(); } void X86CompilerFuncRet::emit(Assembler& a) { X86Assembler& x86Asm = static_cast(a); if (mustEmitJump()) x86Asm.jmp(getFunc()->getExitLabel()); } // ============================================================================ // [AsmJit::X86CompilerFuncRet - Misc] // ============================================================================ int X86CompilerFuncRet::getMaxSize() const { return mustEmitJump() ? 15 : 0; } // ============================================================================ // [AsmJit::X86CompilerFuncCall - Construction / Destruction] // ============================================================================ X86CompilerFuncCall::X86CompilerFuncCall(X86Compiler* x86Compiler, X86CompilerFuncDecl* caller, const Operand* target) : CompilerFuncCall(x86Compiler, caller, target), _gpParams(0), _mmParams(0), _xmmParams(0), _variablesCount(0), _variables(NULL) { } X86CompilerFuncCall::~X86CompilerFuncCall() { memset(_argumentToVarRecord, 0, sizeof(VarCallRecord*) * kFuncArgsMax); } // ============================================================================ // [AsmJit::X86CompilerFuncCall - Interface] // ============================================================================ void X86CompilerFuncCall::prepare(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = getCompiler(); // Prepare is similar to X86CompilerInst::prepare(). We collect unique variables // and update statistics, but we don't use standard alloc/free register calls. // // The calling function is also unique in variable allocator point of view, // because we need to alloc some variables that may be destroyed be the // callee (okay, may not, but this is not guaranteed). _offset = x86Context._currentOffset; // Tell EFunction that another function will be called inside. It needs this // information to reserve stack for the call and to mark esp adjustable. getCaller()->reserveStackForFunctionCall(static_cast(_x86Decl.getArgumentsStackSize())); uint32_t i; uint32_t argumentsCount = _x86Decl.getArgumentsCount(); uint32_t operandsCount = argumentsCount; uint32_t variablesCount = 0; // Create registers used as arguments mask. for (i = 0; i < argumentsCount; i++) { const FuncArg& fArg = _x86Decl.getArguments()[i]; if (fArg.hasRegIndex()) { switch (fArg.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: _gpParams |= IntUtil::maskFromIndex(fArg.getRegIndex()); break; case kX86VarTypeMm: _mmParams |= IntUtil::maskFromIndex(fArg.getRegIndex()); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: _xmmParams |= IntUtil::maskFromIndex(fArg.getRegIndex()); break; default: ASMJIT_ASSERT(0); } } else { x86Context.getFunc()->setFuncFlag(kX86FuncFlagIsEspAdjusted); } } // Call address. operandsCount++; // The first and the second return value. if (!_ret[0].isNone()) operandsCount++; if (!_ret[1].isNone()) operandsCount++; #define __GET_VARIABLE(__vardata__) \ { \ X86CompilerVar* _candidate = __vardata__; \ \ for (var = cur; ;) \ { \ if (var == _variables) \ { \ var = cur++; \ var->vdata = _candidate; \ break; \ } \ \ var--; \ \ if (var->vdata == _candidate) \ { \ break; \ } \ } \ \ ASMJIT_ASSERT(var != NULL); \ } for (i = 0; i < operandsCount; i++) { Operand& o = (i < argumentsCount) ? (_args[i]) : (i == argumentsCount ? _target : _ret[i - argumentsCount - 1]); if (o.isVar()) { ASMJIT_ASSERT(o.getId() != kInvalidValue); X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); if (cv->workOffset == _offset) continue; if (!x86Context._isActive(cv)) x86Context._addActive(cv); cv->workOffset = _offset; variablesCount++; } else if (o.isMem()) { if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); x86Context._markMemoryUsed(cv); if (!x86Context._isActive(cv)) x86Context._addActive(cv); continue; } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o._mem.base); ASMJIT_ASSERT(cv != NULL); if (cv->workOffset == _offset) continue; if (!x86Context._isActive(cv)) x86Context._addActive(cv); cv->workOffset = _offset; variablesCount++; } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o._mem.index); ASMJIT_ASSERT(cv != NULL); if (cv->workOffset == _offset) continue; if (!x86Context._isActive(cv)) x86Context._addActive(cv); cv->workOffset = _offset; variablesCount++; } } } // Traverse all active variables and set their funcCall pointer to this // call. This information can be used to choose between the preserved-first // and preserved-last register allocation. if (x86Context._active) { X86CompilerVar* first = static_cast(x86Context._active); X86CompilerVar* active = first; do { if (active->funcCall == NULL) active->funcCall = this; active = active->nextActive; } while (active != first); } if (!variablesCount) { x86Context._currentOffset++; return; } _variables = reinterpret_cast(x86Compiler->getZoneMemory().alloc(sizeof(VarCallRecord) * variablesCount)); if (!_variables) { x86Compiler->setError(kErrorNoHeapMemory); x86Context._currentOffset++; return; } _variablesCount = variablesCount; memset(_variables, 0, sizeof(VarCallRecord) * variablesCount); VarCallRecord* cur = _variables; VarCallRecord* var = NULL; for (i = 0; i < operandsCount; i++) { Operand& o = (i < argumentsCount) ? (_args[i]) : (i == argumentsCount ? _target : _ret[i - argumentsCount - 1]); if (o.isVar()) { X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); __GET_VARIABLE(cv) _argumentToVarRecord[i] = var; if (i < argumentsCount) { const FuncArg& fArg = _x86Decl.getArgument(i); if (fArg.hasRegIndex()) { x86Context._newRegisterHomeIndex(cv, fArg.getRegIndex()); switch (fArg.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: var->flags |= VarCallRecord::kFlagInGp; var->inCount++; break; case kX86VarTypeMm: var->flags |= VarCallRecord::kFlagInMm; var->inCount++; break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: var->flags |= VarCallRecord::kFlagInXmm; var->inCount++; break; default: ASMJIT_ASSERT(0); } } else { var->inCount++; } cv->regReadCount++; } else if (i == argumentsCount) { uint32_t mask = (~_x86Decl.getGpPreservedMask()) & (~_x86Decl.getGpArgumentsMask()) & (IntUtil::maskUpToIndex(kX86RegNumGp)); x86Context._newRegisterHomeIndex(cv, IntUtil::findFirstBit(mask)); x86Context._newRegisterHomeMask(cv, mask); var->flags |= VarCallRecord::kFlagCallReg; cv->regReadCount++; } else { switch (cv->getType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutEax; else var->flags |= VarCallRecord::kFlagOutEdx; break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: #if defined(ASMJIT_X86) if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutSt0; else var->flags |= VarCallRecord::kFlagOutSt1; #else if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutXmm0; else var->flags |= VarCallRecord::kFlagOutXmm1; #endif break; case kX86VarTypeMm: var->flags |= VarCallRecord::kFlagOutMm0; break; case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutXmm0; else var->flags |= VarCallRecord::kFlagOutXmm1; break; case kX86VarTypeXmmSS: case kX86VarTypeXmmSD: #if defined(ASMJIT_X86) if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutSt0; else var->flags |= VarCallRecord::kFlagOutSt1; #else if (i == argumentsCount+1) var->flags |= VarCallRecord::kFlagOutXmm0; else var->flags |= VarCallRecord::kFlagOutXmm1; #endif break; default: ASMJIT_ASSERT(0); } cv->regWriteCount++; } } else if (o.isMem()) { ASMJIT_ASSERT(i == argumentsCount); if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); cv->memReadCount++; } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(reinterpret_cast(o).getBase()); ASMJIT_ASSERT(cv != NULL); cv->regReadCount++; __GET_VARIABLE(cv) var->flags |= VarCallRecord::kFlagCallReg | VarCallRecord::kFlagCallMem; } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(reinterpret_cast(o).getIndex()); ASMJIT_ASSERT(cv != NULL); cv->regReadCount++; __GET_VARIABLE(cv) var->flags |= VarCallRecord::kFlagCallReg | VarCallRecord::kFlagCallMem; } } } // Traverse all variables and update firstItem / lastItem. This // function is called from iterator that scans items using forward // direction so we can use this knowledge to optimize the process. // // Same code is in X86CompilerInst::prepare(). for (i = 0; i < _variablesCount; i++) { X86CompilerVar* v = _variables[i].vdata; // First item (begin of variable scope). if (v->firstItem == NULL) v->firstItem = this; // Last item (end of variable scope). v->lastItem = this; } x86Context._currentOffset++; #undef __GET_VARIABLE } CompilerItem* X86CompilerFuncCall::translate(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); uint32_t i; uint32_t preserved, mask; uint32_t temporaryGpReg; uint32_t temporaryXmmReg; uint32_t offset = x86Context._currentOffset; // Constants. const FuncArg* targs = _x86Decl.getArguments(); uint32_t argumentsCount = _x86Decl.getArgumentsCount(); uint32_t variablesCount = _variablesCount; // Processed arguments kFuncArgsMax. uint8_t processed[kFuncArgsMax] = { 0 }; x86Compiler->comment("Call"); // These variables are used by the instruction so we set current offset // to their work offsets -> The getSpillCandidate() method never returns // the variable used by this instruction. for (i = 0; i < variablesCount; i++) { _variables[i].vdata->workOffset = offset; // Init back-reference to VarCallRecord. _variables[i].vdata->tPtr = &_variables[i]; } // -------------------------------------------------------------------------- // STEP 1: // // Spill variables which are not used by the function call and have to // be destroyed. These registers may be used by callee. // -------------------------------------------------------------------------- preserved = _x86Decl.getGpPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { X86CompilerVar* cv = x86Context._x86State.gp[i]; if (cv && cv->workOffset != offset && (preserved & mask) == 0) x86Context.spillGpVar(cv); } preserved = _x86Decl.getMmPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1) { X86CompilerVar* cv = x86Context._x86State.mm[i]; if (cv && cv->workOffset != offset && (preserved & mask) == 0) x86Context.spillMmVar(cv); } preserved = _x86Decl.getXmmPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { X86CompilerVar* cv = x86Context._x86State.xmm[i]; if (cv && cv->workOffset != offset && (preserved & mask) == 0) x86Context.spillXmmVar(cv); } // -------------------------------------------------------------------------- // STEP 2: // // Move all arguments to the stack which all already in registers. // -------------------------------------------------------------------------- for (i = 0; i < argumentsCount; i++) { if (processed[i]) continue; const FuncArg& argType = targs[i]; if (argType.hasRegIndex()) continue; Operand& operand = _args[i]; if (operand.isVar()) { VarCallRecord* rec = _argumentToVarRecord[i]; X86CompilerVar* cv = x86Compiler->_getVar(operand.getId()); if (cv->regIndex != kRegIndexInvalid) { _moveAllocatedVariableToStack(cc, cv, argType); rec->inDone++; processed[i] = true; } } } // -------------------------------------------------------------------------- // STEP 3: // // Spill all non-preserved variables we moved to stack in STEP #2. // -------------------------------------------------------------------------- for (i = 0; i < argumentsCount; i++) { VarCallRecord* rec = _argumentToVarRecord[i]; if (!rec || processed[i]) continue; if (rec->inDone >= rec->inCount) { X86CompilerVar* cv = rec->vdata; if (cv->regIndex == kRegIndexInvalid) continue; if (rec->outCount) { // Variable will be rewritten by function return value, it's not needed // to spill it. It will be allocated again by X86CompilerFuncCall. x86Context.unuseVar(rec->vdata, kVarStateUnused); } else { switch (cv->getType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: if ((_x86Decl.getGpPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0) x86Context.spillGpVar(cv); break; case kX86VarTypeMm: if ((_x86Decl.getMmPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0) x86Context.spillMmVar(cv); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: if ((_x86Decl.getXmmPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0) x86Context.spillXmmVar(cv); break; } } } } // -------------------------------------------------------------------------- // STEP 4: // // Get temporary register that we can use to pass input function arguments. // Now it's safe to do, because the non-needed variables should be spilled. // -------------------------------------------------------------------------- temporaryGpReg = _findTemporaryGpRegister(cc); temporaryXmmReg = _findTemporaryXmmRegister(cc); // If failed to get temporary register then we need just to pick one. if (temporaryGpReg == kRegIndexInvalid) { // TODO. } if (temporaryXmmReg == kRegIndexInvalid) { // TODO. } // -------------------------------------------------------------------------- // STEP 5: // // Move all remaining arguments to the stack (we can use temporary register). // or allocate it to the primary register. Also move immediates. // -------------------------------------------------------------------------- for (i = 0; i < argumentsCount; i++) { if (processed[i]) continue; const FuncArg& argType = targs[i]; if (argType.hasRegIndex()) continue; Operand& operand = _args[i]; if (operand.isVar()) { VarCallRecord* rec = _argumentToVarRecord[i]; X86CompilerVar* cv = x86Compiler->_getVar(operand.getId()); _moveSpilledVariableToStack(cc, cv, argType, temporaryGpReg, temporaryXmmReg); rec->inDone++; processed[i] = true; } else if (operand.isImm()) { // TODO. } } // -------------------------------------------------------------------------- // STEP 6: // // Allocate arguments to registers. // -------------------------------------------------------------------------- bool didWork; do { didWork = false; for (i = 0; i < argumentsCount; i++) { if (processed[i]) continue; VarCallRecord* rsrc = _argumentToVarRecord[i]; Operand& osrc = _args[i]; ASMJIT_ASSERT(osrc.isVar()); X86CompilerVar* vsrc = x86Compiler->_getVar(osrc.getId()); const FuncArg& srcArgType = targs[i]; X86CompilerVar* vdst = _getOverlappingVariable(cc, srcArgType); if (vsrc == vdst) { rsrc->inDone++; processed[i] = true; didWork = true; continue; } else if (vdst != NULL) { VarCallRecord* rdst = reinterpret_cast(vdst->tPtr); if (rdst == NULL) { x86Context.spillVar(vdst); vdst = NULL; } else if (rdst->inDone >= rdst->inCount && (rdst->flags & VarCallRecord::kFlagCallReg) == 0) { // Safe to spill. if (rdst->outCount || vdst->lastItem == this) x86Context.unuseVar(vdst, kVarStateUnused); else x86Context.spillVar(vdst); vdst = NULL; } else { uint32_t x = _x86Decl.findArgumentByRegCode(X86Util::getRegCodeFromVarType(vsrc->getType(), vsrc->regIndex)); bool doSpill = true; if ((vdst->getClass() & kX86VarClassGp) != 0) { // Try to emit mov to register which is possible for call() operand. if (x == kInvalidValue && (rdst->flags & VarCallRecord::kFlagCallReg) != 0) { uint32_t rIndex; uint32_t rBit; // The mask which contains registers which are not-preserved // (these that might be clobbered by the callee) and which are // not used to pass function arguments. Each register contained // in this mask is ideal to be used by call() instruction. uint32_t possibleMask = (~_x86Decl.getGpPreservedMask()) & (~_x86Decl.getGpArgumentsMask()) & (IntUtil::maskUpToIndex(kX86RegNumGp)); if (possibleMask != 0) { for (rIndex = 0, rBit = 1; rIndex < kX86RegNumGp; rIndex++, rBit <<= 1) { if ((possibleMask & rBit) != 0) { if (x86Context._x86State.gp[rIndex] == NULL) { // This is the best possible solution, the register is // free. We do not need to continue with this loop, the // rIndex will be used by the call(). break; } else { // Wait until the register is freed or try to find another. doSpill = false; didWork = true; } } } } else { // Try to find a register which is free and which is not used // to pass a function argument. possibleMask = _x86Decl.getGpPreservedMask(); for (rIndex = 0, rBit = 1; rIndex < kX86RegNumGp; rIndex++, rBit <<= 1) { if ((possibleMask & rBit) != 0) { // Found one. if (x86Context._x86State.gp[rIndex] == NULL) break; } } } if (rIndex < kX86RegNumGp) { if (temporaryGpReg == vsrc->regIndex) temporaryGpReg = rIndex; x86Compiler->emit(kX86InstMov, gpz(rIndex), gpz(vsrc->regIndex)); x86Context._x86State.gp[vsrc->regIndex] = NULL; x86Context._x86State.gp[rIndex] = vsrc; vsrc->regIndex = rIndex; x86Context._allocatedGpRegister(rIndex); doSpill = false; didWork = true; } } // Emit xchg instead of spill/alloc if possible. else if (x != kInvalidValue) { const FuncArg& dstArgType = targs[x]; if (X86Util::getVarClassFromVarType(dstArgType.getVarType()) == X86Util::getVarClassFromVarType(srcArgType.getVarType())) { uint32_t dstIndex = vdst->regIndex; uint32_t srcIndex = vsrc->regIndex; if (srcIndex == dstArgType.getRegIndex()) { #if defined(ASMJIT_X64) if (vdst->getType() != kX86VarTypeGpd || vsrc->getType() != kX86VarTypeGpd) x86Compiler->emit(kX86InstXchg, gpq(dstIndex), gpq(srcIndex)); else #endif x86Compiler->emit(kX86InstXchg, gpd(dstIndex), gpd(srcIndex)); x86Context._x86State.gp[srcIndex] = vdst; x86Context._x86State.gp[dstIndex] = vsrc; vdst->regIndex = srcIndex; vsrc->regIndex = dstIndex; rdst->inDone++; rsrc->inDone++; processed[i] = true; processed[x] = true; doSpill = false; } } } } if (doSpill) { x86Context.spillVar(vdst); vdst = NULL; } } } if (vdst == NULL) { VarCallRecord* rec = reinterpret_cast(vsrc->tPtr); _moveSrcVariableToRegister(cc, vsrc, srcArgType); switch (srcArgType.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: x86Context._markGpRegisterModified(srcArgType.getRegIndex()); break; case kX86VarTypeMm: x86Context._markMmRegisterModified(srcArgType.getRegIndex()); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: x86Context._markMmRegisterModified(srcArgType.getRegIndex()); break; } rec->inDone++; processed[i] = true; } } } while (didWork); // -------------------------------------------------------------------------- // STEP 7: // // Allocate operand used by CALL instruction. // -------------------------------------------------------------------------- for (i = 0; i < variablesCount; i++) { VarCallRecord& r = _variables[i]; if ((r.flags & VarCallRecord::kFlagCallReg) && (r.vdata->regIndex == kRegIndexInvalid)) { // If the register is not allocated and the call form is 'call reg' then // it's possible to keep it in memory. if ((r.flags & VarCallRecord::kFlagCallMem) == 0) { _target = r.vdata->asGpVar().m(); break; } if (temporaryGpReg == kRegIndexInvalid) temporaryGpReg = _findTemporaryGpRegister(cc); x86Context.allocGpVar(r.vdata, IntUtil::maskFromIndex(temporaryGpReg), kVarAllocRegister | kVarAllocRead); } } x86Context.translateOperands(&_target, 1); // -------------------------------------------------------------------------- // STEP 8: // // Spill all preserved variables. // -------------------------------------------------------------------------- preserved = _x86Decl.getGpPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { X86CompilerVar* vdata = x86Context._x86State.gp[i]; if (vdata && (preserved & mask) == 0) { VarCallRecord* rec = reinterpret_cast(vdata->tPtr); if (rec && (rec->outCount || rec->flags & VarCallRecord::kFlagUnuseAfterUse || vdata->lastItem == this)) x86Context.unuseVar(vdata, kVarStateUnused); else x86Context.spillGpVar(vdata); } } preserved = _x86Decl.getMmPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1) { X86CompilerVar* vdata = x86Context._x86State.mm[i]; if (vdata && (preserved & mask) == 0) { VarCallRecord* rec = reinterpret_cast(vdata->tPtr); if (rec && (rec->outCount || vdata->lastItem == this)) x86Context.unuseVar(vdata, kVarStateUnused); else x86Context.spillMmVar(vdata); } } preserved = _x86Decl.getXmmPreservedMask(); for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { X86CompilerVar* vdata = x86Context._x86State.xmm[i]; if (vdata && (preserved & mask) == 0) { VarCallRecord* rec = reinterpret_cast(vdata->tPtr); if (rec && (rec->outCount || vdata->lastItem == this)) x86Context.unuseVar(vdata, kVarStateUnused); else x86Context.spillXmmVar(vdata); } } // -------------------------------------------------------------------------- // STEP 9: // // Emit CALL instruction. // -------------------------------------------------------------------------- x86Compiler->emit(kX86InstCall, _target); // Restore the stack offset. if (_x86Decl.getCalleePopsStack()) { int32_t s = static_cast(_x86Decl.getArgumentsStackSize()); if (s != 0) x86Compiler->emit(kX86InstSub, zsp, imm(s)); } // -------------------------------------------------------------------------- // STEP 10: // // Prepare others for return value(s) and cleanup. // -------------------------------------------------------------------------- // Clear temp data, see AsmJit::X86CompilerVar::temp why it's needed. for (i = 0; i < variablesCount; i++) { VarCallRecord* rec = &_variables[i]; X86CompilerVar* vdata = rec->vdata; if (rec->flags & (VarCallRecord::kFlagOutEax | VarCallRecord::kFlagOutEdx)) { if (vdata->getClass() & kX86VarClassGp) { x86Context.allocGpVar(vdata, IntUtil::maskFromIndex((rec->flags & VarCallRecord::kFlagOutEax) != 0 ? kX86RegIndexEax : kX86RegIndexEdx), kVarAllocRegister | kVarAllocWrite); vdata->changed = true; } } if (rec->flags & (VarCallRecord::kFlagOutMm0)) { if (vdata->getClass() & kX86VarClassMm) { x86Context.allocMmVar(vdata, IntUtil::maskFromIndex(kX86RegIndexMm0), kVarAllocRegister | kVarAllocWrite); vdata->changed = true; } } if (rec->flags & (VarCallRecord::kFlagOutXmm0 | VarCallRecord::kFlagOutXmm1)) { if (vdata->getClass() & kX86VarClassXmm) { x86Context.allocXmmVar(vdata, IntUtil::maskFromIndex((rec->flags & VarCallRecord::kFlagOutXmm0) != 0 ? kX86RegIndexXmm0 : kX86RegIndexXmm1), kVarAllocRegister | kVarAllocWrite); vdata->changed = true; } } if (rec->flags & (VarCallRecord::kFlagOutSt0 | VarCallRecord::kFlagOutSt1)) { if (vdata->getClass() & kX86VarClassXmm) { Mem mem(x86Context._getVarMem(vdata)); x86Context.unuseVar(vdata, kVarStateMem); switch (vdata->getType()) { case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: { mem.setSize(4); x86Compiler->emit(kX86InstFStP, mem); break; } case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: { mem.setSize(8); x86Compiler->emit(kX86InstFStP, mem); break; } default: { x86Compiler->comment("*** WARNING: Can't convert float return value to untyped XMM\n"); break; } } } } // Cleanup. vdata->tPtr = NULL; } for (i = 0; i < variablesCount; i++) { x86Context._unuseVarOnEndOfScope(this, &_variables[i]); } return translated(); } // ============================================================================ // [AsmJit::X86CompilerFuncCall - Misc] // ============================================================================ int X86CompilerFuncCall::getMaxSize() const { // TODO: Instruction max size. return 15; } bool X86CompilerFuncCall::_tryUnuseVar(CompilerVar* _v) { X86CompilerVar* cv = static_cast(_v); for (uint32_t i = 0; i < _variablesCount; i++) { if (_variables[i].vdata == cv) { _variables[i].flags |= VarCallRecord::kFlagUnuseAfterUse; return true; } } return false; } // ============================================================================ // [AsmJit::X86CompilerFuncCall - Helpers] // ============================================================================ uint32_t X86CompilerFuncCall::_findTemporaryGpRegister(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); uint32_t i; uint32_t mask; uint32_t passedGP = _x86Decl.getGpArgumentsMask(); uint32_t candidate = kRegIndexInvalid; // Find all registers used to pass function arguments. We shouldn't use these // if possible. for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (x86Context._x86State.gp[i] == NULL) { // If this register is used to pass arguments to function, we will mark // it and use it only if there is no other one. if ((passedGP & mask) != 0) candidate = i; else return i; } } return candidate; } uint32_t X86CompilerFuncCall::_findTemporaryXmmRegister(CompilerContext& cc) { X86CompilerContext& x86Context = static_cast(cc); uint32_t i; uint32_t mask; uint32_t passedXMM = _x86Decl.getXmmArgumentsMask(); uint32_t candidate = kRegIndexInvalid; // Find all registers used to pass function arguments. We shouldn't use these // if possible. for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if (x86Context._x86State.xmm[i] == NULL) { // If this register is used to pass arguments to function, we will mark // it and use it only if there is no other one. if ((passedXMM & mask) != 0) candidate = i; else return i; } } return candidate; } X86CompilerVar* X86CompilerFuncCall::_getOverlappingVariable(CompilerContext& cc, const FuncArg& argType) const { X86CompilerContext& x86Context = static_cast(cc); ASMJIT_ASSERT(argType.getVarType() != kVarTypeInvalid); switch (argType.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: return x86Context._x86State.gp[argType.getRegIndex()]; case kX86VarTypeMm: return x86Context._x86State.mm[argType.getRegIndex()]; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: return x86Context._x86State.xmm[argType.getRegIndex()]; } return NULL; } void X86CompilerFuncCall::_moveAllocatedVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); ASMJIT_ASSERT(!argType.hasRegIndex()); ASMJIT_ASSERT(vdata->regIndex != kRegIndexInvalid); uint32_t src = vdata->regIndex; Mem dst = ptr(zsp, -(int)sizeof(uintptr_t) + argType.getStackOffset()); switch (vdata->getType()) { case kX86VarTypeGpd: switch (argType.getVarType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, dst, gpd(src)); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: case kX86VarTypeMm: x86Compiler->emit(kX86InstMov, dst, gpq(src)); return; #endif // ASMJIT_X64 } break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: switch (argType.getVarType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, dst, gpd(src)); return; case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, dst, gpq(src)); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, dst, gpq(src)); return; } break; #endif // ASMJIT_X64 case kX86VarTypeMm: switch (argType.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeX87SS: case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMovD, dst, mm(src)); return; case kX86VarTypeGpq: case kX86VarTypeMm: case kX86VarTypeX87SD: case kX86VarTypeXmmSD: x86Compiler->emit(kX86InstMovQ, dst, mm(src)); return; } break; // We allow incompatible types here, because the called can convert them // to correct format before function is called. case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: switch (argType.getVarType()) { case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQU, dst, xmm(src)); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovUPS, dst, xmm(src)); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovUPD, dst, xmm(src)); return; } break; case kX86VarTypeXmmSS: switch (argType.getVarType()) { case kX86VarTypeX87SS: case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSS, dst, xmm(src)); return; } break; case kX86VarTypeXmmSD: switch (argType.getVarType()) { case kX86VarTypeX87SD: case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSD, dst, xmm(src)); return; } break; } x86Compiler->setError(kErrorIncompatibleArgumentType); } void X86CompilerFuncCall::_moveSpilledVariableToStack(CompilerContext& cc, X86CompilerVar* cv, const FuncArg& argType, uint32_t temporaryGpReg, uint32_t temporaryXmmReg) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); ASMJIT_ASSERT(!argType.hasRegIndex()); ASMJIT_ASSERT(cv->regIndex == kRegIndexInvalid); Mem src = x86Context._getVarMem(cv); Mem dst = ptr(zsp, -(int)sizeof(sysint_t) + argType.getStackOffset()); switch (cv->getType()) { case kX86VarTypeGpd: switch (argType.getVarType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg)); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: case kX86VarTypeMm: x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpq(temporaryGpReg)); return; #endif // ASMJIT_X64 } break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: switch (argType.getVarType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg)); return; case kX86VarTypeGpq: case kX86VarTypeMm: x86Compiler->emit(kX86InstMov, gpq(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpq(temporaryGpReg)); return; } break; #endif // ASMJIT_X64 case kX86VarTypeMm: switch (argType.getVarType()) { case kX86VarTypeGpd: case kX86VarTypeX87SS: case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src); x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg)); return; case kX86VarTypeGpq: case kX86VarTypeMm: case kX86VarTypeX87SD: case kX86VarTypeXmmSD: // TODO return; } break; // We allow incompatible types here, because the caller can convert them // to correct format before function is called. case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: switch (argType.getVarType()) { case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQU, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovDQU, dst, xmm(temporaryXmmReg)); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovUPS, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovUPS, dst, xmm(temporaryXmmReg)); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovUPD, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovUPD, dst, xmm(temporaryXmmReg)); return; } break; case kX86VarTypeXmmSS: switch (argType.getVarType()) { case kX86VarTypeX87SS: case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSS, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovSS, dst, xmm(temporaryXmmReg)); return; } break; case kX86VarTypeXmmSD: switch (argType.getVarType()) { case kX86VarTypeX87SD: case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSD, xmm(temporaryXmmReg), src); x86Compiler->emit(kX86InstMovSD, dst, xmm(temporaryXmmReg)); return; } break; } x86Compiler->setError(kErrorIncompatibleArgumentType); } void X86CompilerFuncCall::_moveSrcVariableToRegister(CompilerContext& cc, X86CompilerVar* cv, const FuncArg& argType) { X86CompilerContext& x86Context = static_cast(cc); X86Compiler* x86Compiler = x86Context.getCompiler(); uint32_t dst = argType.getRegIndex(); uint32_t src = cv->regIndex; if (src != kRegIndexInvalid) { switch (argType.getVarType()) { case kX86VarTypeGpd: switch (cv->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 x86Compiler->emit(kX86InstMov, gpd(dst), gpd(src)); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovD, gpd(dst), mm(src)); return; } break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(dst), gpd(src)); return; case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, gpq(dst), gpq(src)); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, gpq(dst), mm(src)); return; } break; #endif // ASMJIT_X64 case kX86VarTypeMm: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMovD, gpd(dst), gpd(src)); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMovQ, gpq(dst), gpq(src)); return; #endif // ASMJIT_X64 case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, mm(dst), mm(src)); return; } break; case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMovD, xmm(dst), gpd(src)); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMovQ, xmm(dst), gpq(src)); return; #endif // ASMJIT_X64 case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src)); return; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src)); return; } break; case kX86VarTypeXmmSS: switch (cv->getType()) { case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src)); return; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src)); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovSS, xmm(dst), xmm(src)); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstCvtSD2SS, xmm(dst), xmm(src)); return; } break; case kX86VarTypeXmmSD: switch (cv->getType()) { case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src)); return; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src)); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstCvtSS2SD, xmm(dst), xmm(src)); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSD, xmm(dst), xmm(src)); return; } break; } } else { Mem mem = x86Context._getVarMem(cv); switch (argType.getVarType()) { case kX86VarTypeGpd: switch (cv->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 x86Compiler->emit(kX86InstMov, gpd(dst), mem); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovD, gpd(dst), mem); return; } break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(dst), mem); return; case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, gpq(dst), mem); return; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, gpq(dst), mem); return; } break; #endif // ASMJIT_X64 case kX86VarTypeMm: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMovD, gpd(dst), mem); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMovQ, gpq(dst), mem); return; #endif // ASMJIT_X64 case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, mm(dst), mem); return; } break; case kX86VarTypeXmm: case kX86VarTypeXmmPS: case kX86VarTypeXmmPD: switch (cv->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMovD, xmm(dst), mem); return; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMovQ, xmm(dst), mem); return; #endif // ASMJIT_X64 case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mem); return; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem); return; } break; case kX86VarTypeXmmSS: switch (cv->getType()) { case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mem); return; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovSS, xmm(dst), mem); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstCvtSD2SS, xmm(dst), mem); return; } break; case kX86VarTypeXmmSD: switch (cv->getType()) { case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, xmm(dst), mem); return; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem); return; case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstCvtSS2SD, xmm(dst), mem); return; case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovSD, xmm(dst), mem); return; } break; } } x86Compiler->setError(kErrorIncompatibleArgumentType); } // Prototype & Arguments Management. void X86CompilerFuncCall::setPrototype(uint32_t callingConvention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { _x86Decl.setPrototype(callingConvention, returnType, arguments, argumentsCount); _args = reinterpret_cast( getCompiler()->getZoneMemory().alloc(sizeof(Operand) * argumentsCount)); memset(_args, 0, sizeof(Operand) * argumentsCount); } bool X86CompilerFuncCall::setArgument(uint32_t i, const Var& var) { ASMJIT_ASSERT(i < _x86Decl.getArgumentsCount()); if (i >= _x86Decl.getArgumentsCount()) return false; _args[i] = var; return true; } bool X86CompilerFuncCall::setArgument(uint32_t i, const Imm& imm) { ASMJIT_ASSERT(i < _x86Decl.getArgumentsCount()); if (i >= _x86Decl.getArgumentsCount()) return false; _args[i] = imm; return true; } bool X86CompilerFuncCall::setReturn(const Operand& first, const Operand& second) { _ret[0] = first; _ret[1] = second; return true; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86compilercontext.cpp0000644000175000017500000013717212140261626023771 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/stringutil.h" #include "../x86/x86assembler.h" #include "../x86/x86compiler.h" #include "../x86/x86compilercontext.h" #include "../x86/x86compilerfunc.h" #include "../x86/x86compileritem.h" #include "../x86/x86util.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerContext - Construction / Destruction] // ============================================================================ X86CompilerContext::X86CompilerContext(X86Compiler* x86Compiler) : CompilerContext(x86Compiler) { _state = &_x86State; _clear(); _emitComments = x86Compiler->getLogger() != NULL; } X86CompilerContext::~X86CompilerContext() { } // ============================================================================ // [AsmJit::CompilerContext - Clear] // ============================================================================ void X86CompilerContext::_clear() { _zoneMemory.clear(); _func = NULL; _start = NULL; _stop = NULL; _x86State.clear(); _active = NULL; _forwardJumps = NULL; _currentOffset = 0; _isUnreachable = 0; _modifiedGpRegisters = 0; _modifiedMmRegisters = 0; _modifiedXmmRegisters = 0; _allocableEBP = false; _adjustESP = 0; _argumentsBaseReg = kRegIndexInvalid; // Used by patcher. _argumentsBaseOffset = 0; // Used by patcher. _argumentsActualDisp = 0; // Used by translate(). _variablesBaseReg = kRegIndexInvalid; // Used by patcher. _variablesBaseOffset = 0; // Used by patcher. _variablesActualDisp = 0; // Used by translate() _memUsed = NULL; _memFree = NULL; _mem4BlocksCount = 0; _mem8BlocksCount = 0; _mem16BlocksCount = 0; _memBytesTotal = 0; _backCode.clear(); _backPos = 0; } // ============================================================================ // [AsmJit::CompilerContext - Construction / Destruction] // ============================================================================ void X86CompilerContext::allocVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags) { switch (var->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 allocGpVar(var, regMask, vflags); break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: allocMmVar(var, regMask, vflags); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: allocXmmVar(var, regMask, vflags); break; } _postAlloc(var, vflags); } void X86CompilerContext::saveVar(X86CompilerVar* var) { switch (var->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 saveGpVar(var); break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: saveMmVar(var); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: saveXmmVar(var); break; } } void X86CompilerContext::spillVar(X86CompilerVar* var) { switch (var->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 spillGpVar(var); break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: spillMmVar(var); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: spillXmmVar(var); break; } } void X86CompilerContext::unuseVar(X86CompilerVar* var, uint32_t toState) { ASMJIT_ASSERT(toState != kVarStateReg); if (var->state == kVarStateReg) { uint32_t regIndex = var->regIndex; switch (var->getType()) { case kX86VarTypeGpd: #if defined(ASMJIT_X64) case kX86VarTypeGpq: #endif // ASMJIT_X64 _x86State.gp[regIndex] = NULL; _freedGpRegister(regIndex); break; case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: _x86State.mm[regIndex] = NULL; _freedMmRegister(regIndex); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: _x86State.xmm[regIndex] = NULL; _freedXmmRegister(regIndex); break; } } var->state = toState; var->changed = false; var->regIndex = kRegIndexInvalid; } void X86CompilerContext::allocGpVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags) { uint32_t fullMask = IntUtil::maskUpToIndex(kX86RegNumGp) & ~IntUtil::maskFromIndex(kX86RegIndexEsp); if (!_allocableEBP) fullMask &= ~IntUtil::maskFromIndex(kX86RegIndexEbp); // Fix the regMask (0 or full bit-array means that any register may be used). if (regMask == 0) regMask = 0xFFFFFFFF; regMask &= fullMask; // Working variables. uint32_t i; uint32_t mask; // Last register code (aka home). uint32_t home = var->homeRegisterIndex; // New register code. uint32_t idx = kRegIndexInvalid; // Preserved GP variables. uint32_t preservedGP = var->funcScope->getDecl()->getGpPreservedMask(); // Spill candidate. X86CompilerVar* spillCandidate = NULL; // Whether to alloc the non-preserved variables first. bool nonPreservedFirst = true; if (getFunc()->isCaller()) nonPreservedFirst = (var->funcCall == NULL) || (var->funcCall->getOffset() >= var->lastItem->getOffset()); // -------------------------------------------------------------------------- // [Already Allocated] // -------------------------------------------------------------------------- // Go away if variable is already allocated. if (var->state == kVarStateReg) { uint32_t oldIndex = var->regIndex; // Already allocated in the right register. if (IntUtil::maskFromIndex(oldIndex) & regMask) return; // Try to find unallocated register first. mask = regMask & ~_x86State.usedGP; if (mask != 0) { idx = IntUtil::findFirstBit((nonPreservedFirst && (mask & ~preservedGP) != 0) ? mask & ~preservedGP : mask); } // Then find the allocated and exchange later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedGP); } ASMJIT_ASSERT(idx != kRegIndexInvalid); X86CompilerVar* other = _x86State.gp[idx]; emitExchangeVar(var, idx, vflags, other); _x86State.gp[oldIndex] = other; _x86State.gp[idx ] = var; if (other) other->regIndex = oldIndex; else _freedGpRegister(oldIndex); // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; _allocatedGpRegister(idx); return; } // -------------------------------------------------------------------------- // [Find Unused GP] // -------------------------------------------------------------------------- // Home register code. if ((idx == kRegIndexInvalid) && (home != kRegIndexInvalid) && (regMask & IntUtil::maskFromIndex(home)) != 0 && (_x86State.usedGP & IntUtil::maskFromIndex(home)) == 0) { idx = home; goto _Alloc; } // We start from 1, because EAX/RAX register is sometimes explicitly // needed. So we trying to prevent reallocation in near future. if (idx == kRegIndexInvalid) { for (i = 1, mask = (1 << i); i < kX86RegNumGp; i++, mask <<= 1) { if ((regMask & mask) != 0 && (_x86State.usedGP & mask) == 0) { // Convenience to alloc non-preserved first or non-preserved last. if (nonPreservedFirst) { if (idx != kRegIndexInvalid && (preservedGP & mask) != 0) continue; idx = i; // If current register is preserved, we should try to find different // one that is not. This can save one push / pop in prolog / epilog. if ((preservedGP & mask) == 0) break; } else { if (idx != kRegIndexInvalid && (preservedGP & mask) == 0) continue; idx = i; // The opposite. if ((preservedGP & mask) != 0) break; } } } } // If not found, try EAX/RAX. if ((idx == kRegIndexInvalid) && (regMask & IntUtil::maskFromIndex(kX86RegIndexEax)) != 0 && (_x86State.usedGP & IntUtil::maskFromIndex(kX86RegIndexEax)) == 0) { idx = kX86RegIndexEax; goto _Alloc; } // If regMask contains restricted registers which may be used then everything // is handled inside this block. if ((idx == kRegIndexInvalid) && (regMask != fullMask)) { // Try to find unallocated register first. mask = regMask & ~_x86State.usedGP; if (mask != 0) { idx = IntUtil::findFirstBit((nonPreservedFirst && (mask & ~preservedGP) != 0) ? (mask & ~preservedGP) : mask); ASMJIT_ASSERT(idx != kRegIndexInvalid); } // Then find the allocated and spill later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedGP); ASMJIT_ASSERT(idx != kRegIndexInvalid); // Spill register we need. spillCandidate = _x86State.gp[idx]; // Jump to spill part of allocation. goto L_Spill; } } // -------------------------------------------------------------------------- // [Spill] // -------------------------------------------------------------------------- // If register is still not found, spill other variable. if (idx == kRegIndexInvalid) { if (spillCandidate == NULL) { spillCandidate = _getSpillCandidateGP(); } // Spill candidate not found? if (spillCandidate == NULL) { _compiler->setError(kErrorNoRegisters); return; } L_Spill: // Prevented variables can't be spilled. _getSpillCandidate() never returns // prevented variables, but when jumping to L_Spill it could happen. if (spillCandidate->workOffset == _currentOffset) { _compiler->setError(kErrorOverlappedRegisters); return; } idx = spillCandidate->regIndex; spillGpVar(spillCandidate); } // -------------------------------------------------------------------------- // [Alloc] // -------------------------------------------------------------------------- _Alloc: if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0) { emitLoadVar(var, idx); } // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; // Update CompilerState. _allocatedVariable(var); } void X86CompilerContext::saveGpVar(X86CompilerVar* var) { // Can't save variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; emitSaveVar(var, idx); // Update X86CompilerVar. var->changed = false; } void X86CompilerContext::spillGpVar(X86CompilerVar* var) { // Can't spill variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; if (var->changed) emitSaveVar(var, idx); // Update X86CompilerVar. var->regIndex = kRegIndexInvalid; var->state = kVarStateMem; var->changed = false; // Update CompilerState. _x86State.gp[idx] = NULL; _freedGpRegister(idx); } void X86CompilerContext::allocMmVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags) { // Fix the regMask (0 or full bit-array means that any register may be used). if (regMask == 0) regMask = IntUtil::maskUpToIndex(kX86RegNumMm); regMask &= IntUtil::maskUpToIndex(kX86RegNumMm); // Working variables. uint32_t i; uint32_t mask; // Last register code (aka home). uint32_t home = var->homeRegisterIndex; // New register code. uint32_t idx = kRegIndexInvalid; // Preserved MM variables. // // NOTE: Currently MM variables are not preserved and there is no calling // convention known to me that does that. But on the other side it's possible // to write such calling convention. uint32_t preservedMM = var->funcScope->getDecl()->getMmPreservedMask(); // Spill candidate. X86CompilerVar* spillCandidate = NULL; // Whether to alloc non-preserved first or last. bool nonPreservedFirst = true; if (this->getFunc()->isCaller()) { nonPreservedFirst = var->funcCall == NULL || var->funcCall->getOffset() >= var->lastItem->getOffset(); } // -------------------------------------------------------------------------- // [Already Allocated] // -------------------------------------------------------------------------- // Go away if variable is already allocated. if (var->state == kVarStateReg) { uint32_t oldIndex = var->regIndex; // Already allocated in the right register. if (IntUtil::maskFromIndex(oldIndex) & regMask) return; // Try to find unallocated register first. mask = regMask & ~_x86State.usedMM; if (mask != 0) { idx = IntUtil::findFirstBit( (nonPreservedFirst && (mask & ~preservedMM) != 0) ? mask & ~preservedMM : mask); } // Then find the allocated and exchange later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedMM); } ASMJIT_ASSERT(idx != kRegIndexInvalid); X86CompilerVar* other = _x86State.mm[idx]; if (other) spillMmVar(other); emitMoveVar(var, idx, vflags); _freedMmRegister(oldIndex); _x86State.mm[idx] = var; // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; _allocatedMmRegister(idx); return; } // -------------------------------------------------------------------------- // [Find Unused MM] // -------------------------------------------------------------------------- // If regMask contains restricted registers which may be used then everything // is handled in this block. if (regMask != IntUtil::maskUpToIndex(kX86RegNumMm)) { // Try to find unallocated register first. mask = regMask & ~_x86State.usedMM; if (mask != 0) { idx = IntUtil::findFirstBit( (nonPreservedFirst && (mask & ~preservedMM) != 0) ? mask & ~preservedMM : mask); ASMJIT_ASSERT(idx != kRegIndexInvalid); } // Then find the allocated and spill later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedMM); ASMJIT_ASSERT(idx != kRegIndexInvalid); // Spill register we need. spillCandidate = _x86State.mm[idx]; // Jump to spill part of allocation. goto L_Spill; } } // Home register code. if (idx == kRegIndexInvalid && home != kRegIndexInvalid) { if ((_x86State.usedMM & (1U << home)) == 0) idx = home; } if (idx == kRegIndexInvalid) { for (i = 0, mask = (1 << i); i < kX86RegNumMm; i++, mask <<= 1) { if ((_x86State.usedMM & mask) == 0) { // Convenience to alloc non-preserved first or non-preserved last. if (nonPreservedFirst) { if (idx != kRegIndexInvalid && (preservedMM & mask) != 0) continue; idx = i; // If current register is preserved, we should try to find different // one that is not. This can save one push / pop in prolog / epilog. if ((preservedMM & mask) == 0) break; } else { if (idx != kRegIndexInvalid && (preservedMM & mask) == 0) continue; idx = i; // The opposite. if ((preservedMM & mask) != 0) break; } } } } // -------------------------------------------------------------------------- // [Spill] // -------------------------------------------------------------------------- // If register is still not found, spill other variable. if (idx == kRegIndexInvalid) { if (spillCandidate == NULL) spillCandidate = _getSpillCandidateMM(); // Spill candidate not found? if (spillCandidate == NULL) { _compiler->setError(kErrorNoRegisters); return; } L_Spill: // Prevented variables can't be spilled. _getSpillCandidate() never returns // prevented variables, but when jumping to L_spill it can happen. if (spillCandidate->workOffset == _currentOffset) { _compiler->setError(kErrorOverlappedRegisters); return; } idx = spillCandidate->regIndex; spillMmVar(spillCandidate); } // -------------------------------------------------------------------------- // [Alloc] // -------------------------------------------------------------------------- if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0) { emitLoadVar(var, idx); } // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; // Update CompilerState. _allocatedVariable(var); } void X86CompilerContext::saveMmVar(X86CompilerVar* var) { // Can't save variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; emitSaveVar(var, idx); // Update X86CompilerVar. var->changed = false; } void X86CompilerContext::spillMmVar(X86CompilerVar* var) { // Can't spill variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; if (var->changed) emitSaveVar(var, idx); // Update X86CompilerVar. var->regIndex = kRegIndexInvalid; var->state = kVarStateMem; var->changed = false; // Update CompilerState. _x86State.mm[idx] = NULL; _freedMmRegister(idx); } void X86CompilerContext::allocXmmVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags) { // Fix the regMask (0 or full bit-array means that any register may be used). if (regMask == 0) regMask = IntUtil::maskUpToIndex(kX86RegNumXmm); regMask &= IntUtil::maskUpToIndex(kX86RegNumXmm); // Working variables. uint32_t i; uint32_t mask; // Last register code (aka home). uint32_t home = var->homeRegisterIndex; // New register code. uint32_t idx = kRegIndexInvalid; // Preserved XMM variables. uint32_t preservedXMM = var->funcScope->getDecl()->getXmmPreservedMask(); // Spill candidate. X86CompilerVar* spillCandidate = NULL; // Whether to alloc non-preserved first or last. bool nonPreservedFirst = true; if (this->getFunc()->isCaller()) nonPreservedFirst = (var->funcCall == NULL) || (var->funcCall->getOffset() >= var->lastItem->getOffset()); // -------------------------------------------------------------------------- // [Already Allocated] // -------------------------------------------------------------------------- // Go away if variable is already allocated. if (var->state == kVarStateReg) { uint32_t oldIndex = var->regIndex; // Already allocated in the right register. if (IntUtil::maskFromIndex(oldIndex) & regMask) return; // Try to find unallocated register first. mask = regMask & ~_x86State.usedXMM; if (mask != 0) { idx = IntUtil::findFirstBit( (nonPreservedFirst && (mask & ~preservedXMM) != 0) ? mask & ~preservedXMM : mask); } // Then find the allocated and exchange later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedXMM); } ASMJIT_ASSERT(idx != kRegIndexInvalid); X86CompilerVar* other = _x86State.xmm[idx]; if (other) spillXmmVar(other); emitMoveVar(var, idx, vflags); _freedXmmRegister(oldIndex); _x86State.xmm[idx] = var; // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; _allocatedXmmRegister(idx); return; } // -------------------------------------------------------------------------- // [Find Unused XMM] // -------------------------------------------------------------------------- // If regMask contains restricted registers which may be used then everything // is handled in this block. if (regMask != IntUtil::maskUpToIndex(kX86RegNumXmm)) { // Try to find unallocated register first. mask = regMask & ~_x86State.usedXMM; if (mask != 0) { idx = IntUtil::findFirstBit( (nonPreservedFirst && (mask & ~preservedXMM) != 0) ? mask & ~preservedXMM : mask); ASMJIT_ASSERT(idx != kRegIndexInvalid); } // Then find the allocated and spill later. else { idx = IntUtil::findFirstBit(regMask & _x86State.usedXMM); ASMJIT_ASSERT(idx != kRegIndexInvalid); // Spill register we need. spillCandidate = _x86State.xmm[idx]; // Jump to spill part of allocation. goto L_Spill; } } // Home register code. if (idx == kRegIndexInvalid && home != kRegIndexInvalid) { if ((_x86State.usedXMM & (1U << home)) == 0) idx = home; } if (idx == kRegIndexInvalid) { for (i = 0, mask = (1 << i); i < kX86RegNumXmm; i++, mask <<= 1) { if ((_x86State.usedXMM & mask) == 0) { // Convenience to alloc non-preserved first or non-preserved last. if (nonPreservedFirst) { if (idx != kRegIndexInvalid && (preservedXMM & mask) != 0) continue; idx = i; // If current register is preserved, we should try to find different // one that is not. This can save one push / pop in prolog / epilog. if ((preservedXMM & mask) == 0) break; } else { if (idx != kRegIndexInvalid && (preservedXMM & mask) == 0) continue; idx = i; // The opposite. if ((preservedXMM & mask) != 0) break; } } } } // -------------------------------------------------------------------------- // [Spill] // -------------------------------------------------------------------------- // If register is still not found, spill other variable. if (idx == kRegIndexInvalid) { if (spillCandidate == NULL) spillCandidate = _getSpillCandidateXMM(); // Spill candidate not found? if (spillCandidate == NULL) { _compiler->setError(kErrorNoRegisters); return; } L_Spill: // Prevented variables can't be spilled. _getSpillCandidate() never returns // prevented variables, but when jumping to L_spill it can happen. if (spillCandidate->workOffset == _currentOffset) { _compiler->setError(kErrorOverlappedRegisters); return; } idx = spillCandidate->regIndex; spillXmmVar(spillCandidate); } // -------------------------------------------------------------------------- // [Alloc] // -------------------------------------------------------------------------- if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0) { emitLoadVar(var, idx); } // Update X86CompilerVar. var->state = kVarStateReg; var->regIndex = idx; var->homeRegisterIndex = idx; // Update CompilerState. _allocatedVariable(var); } void X86CompilerContext::saveXmmVar(X86CompilerVar* var) { // Can't save variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; emitSaveVar(var, idx); // Update X86CompilerVar. var->changed = false; } void X86CompilerContext::spillXmmVar(X86CompilerVar* var) { // Can't spill variable that isn't allocated. ASMJIT_ASSERT(var->state == kVarStateReg); ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); uint32_t idx = var->regIndex; if (var->changed) emitSaveVar(var, idx); // Update CompilerVar. var->regIndex = kRegIndexInvalid; var->state = kVarStateMem; var->changed = false; // Update CompilerState. _x86State.xmm[idx] = NULL; _freedXmmRegister(idx); } void X86CompilerContext::emitLoadVar(X86CompilerVar* var, uint32_t regIndex) { X86Compiler* x86Compiler = getCompiler(); Mem m = _getVarMem(var); switch (var->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(regIndex), m); if (_emitComments) goto _AddComment; break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, gpq(regIndex), m); if (_emitComments) goto _AddComment; break; #endif // ASMJIT_X64 case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, mm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMovSS, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmSD: x86Compiler->emit(kX86InstMovSD, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovAPS, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovAPD, xmm(regIndex), m); if (_emitComments) goto _AddComment; break; } return; _AddComment: x86Compiler->getCurrentItem()->formatComment("Alloc %s", var->getName()); } void X86CompilerContext::emitSaveVar(X86CompilerVar* var, uint32_t regIndex) { // Caller must ensure that variable is allocated. ASMJIT_ASSERT(regIndex != kRegIndexInvalid); X86Compiler* x86Compiler = getCompiler(); Mem m = _getVarMem(var); switch (var->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, m, gpd(regIndex)); if (_emitComments) goto _AddComment; break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, m, gpq(regIndex)); if (_emitComments) goto _AddComment; break; #endif // ASMJIT_X64 case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, m, mm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMovSS, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmSD: x86Compiler->emit(kX86InstMovSD, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovAPS, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovAPD, m, xmm(regIndex)); if (_emitComments) goto _AddComment; break; } return; _AddComment: x86Compiler->getCurrentItem()->formatComment("Spill %s", var->getName()); } void X86CompilerContext::emitMoveVar(X86CompilerVar* var, uint32_t regIndex, uint32_t vflags) { // Caller must ensure that the given variable is allocated. ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); X86Compiler* x86Compiler = getCompiler(); if ((vflags & kVarAllocRead) == 0) return; switch (var->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstMov, gpd(regIndex), gpd(var->regIndex)); break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstMov, gpq(regIndex), gpq(var->regIndex)); break; #endif // ASMJIT_X64 case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; case kX86VarTypeMm: x86Compiler->emit(kX86InstMovQ, mm(regIndex), mm(var->regIndex)); break; case kX86VarTypeXmm: x86Compiler->emit(kX86InstMovDQA, xmm(regIndex), xmm(var->regIndex)); break; case kX86VarTypeXmmSS: x86Compiler->emit(kX86InstMovSS, xmm(regIndex), xmm(var->regIndex)); break; case kX86VarTypeXmmSD: x86Compiler->emit(kX86InstMovSD, xmm(regIndex), xmm(var->regIndex)); break; case kX86VarTypeXmmPS: x86Compiler->emit(kX86InstMovAPS, xmm(regIndex), xmm(var->regIndex)); break; case kX86VarTypeXmmPD: x86Compiler->emit(kX86InstMovAPD, xmm(regIndex), xmm(var->regIndex)); break; } } void X86CompilerContext::emitExchangeVar(X86CompilerVar* var, uint32_t regIndex, uint32_t vflags, X86CompilerVar* other) { // Caller must ensure that the given variable is allocated. ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid); X86Compiler* x86Compiler = getCompiler(); // If other is not valid then we can just emit MOV (or other similar instruction). if (other == NULL) { emitMoveVar(var, regIndex, vflags); return; } // If we need to alloc for write-only operation then we can move other // variable away instead of exchanging them. if ((vflags & kVarAllocRead) == 0) { emitMoveVar(other, var->regIndex, kVarAllocRead); return; } switch (var->getType()) { case kX86VarTypeGpd: x86Compiler->emit(kX86InstXchg, gpd(regIndex), gpd(var->regIndex)); break; #if defined(ASMJIT_X64) case kX86VarTypeGpq: x86Compiler->emit(kX86InstXchg, gpq(regIndex), gpq(var->regIndex)); break; #endif // ASMJIT_X64 case kX86VarTypeX87: case kX86VarTypeX87SS: case kX86VarTypeX87SD: // TODO: X87 Support. break; // NOTE: MM and XMM registers shoudln't be exchanged using this way, it's // correct, but instead of using one instruction we need three. case kX86VarTypeMm: { MmReg a = mm(regIndex); MmReg b = mm(var->regIndex); x86Compiler->emit(kX86InstPXor, a, b); x86Compiler->emit(kX86InstPXor, b, a); x86Compiler->emit(kX86InstPXor, a, b); break; } case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: { XmmReg a = xmm(regIndex); XmmReg b = xmm(var->regIndex); x86Compiler->emit(kX86InstXorPS, a, b); x86Compiler->emit(kX86InstXorPS, b, a); x86Compiler->emit(kX86InstXorPS, a, b); break; } case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: { XmmReg a = xmm(regIndex); XmmReg b = xmm(var->regIndex); x86Compiler->emit(kX86InstXorPD, a, b); x86Compiler->emit(kX86InstXorPD, b, a); x86Compiler->emit(kX86InstXorPD, a, b); break; } case kX86VarTypeXmm: { XmmReg a = xmm(regIndex); XmmReg b = xmm(var->regIndex); x86Compiler->emit(kX86InstPXor, a, b); x86Compiler->emit(kX86InstPXor, b, a); x86Compiler->emit(kX86InstPXor, a, b); break; } } } void X86CompilerContext::_postAlloc(X86CompilerVar* var, uint32_t vflags) { if (vflags & kVarAllocWrite) var->changed = true; } void X86CompilerContext::_markMemoryUsed(X86CompilerVar* var) { if (var->homeMemoryData != NULL) return; VarMemBlock* mem = _allocMemBlock(var->getSize()); if (!mem) return; var->homeMemoryData = mem; } Mem X86CompilerContext::_getVarMem(X86CompilerVar* var) { Mem m; m._mem.id = var->getId(); if (!var->isMemArgument()) m._mem.displacement = _adjustESP; _markMemoryUsed(var); return m; } static int32_t getSpillScore(X86CompilerVar* var, uint32_t currentOffset) { int32_t score = 0; ASMJIT_ASSERT(var->lastItem != NULL); uint32_t lastOffset = var->lastItem->getOffset(); if (lastOffset >= currentOffset) score += (int32_t)(lastOffset - currentOffset); // Each write access decreases probability of spill. score -= static_cast(var->regWriteCount) + static_cast(var->regRwCount); // Each read-only access increases probability of spill. score += static_cast(var->regReadCount); // Each memory access increases probability of spill. score += static_cast(var->memWriteCount) + static_cast(var->memRwCount); score += static_cast(var->memReadCount); return score; } X86CompilerVar* X86CompilerContext::_getSpillCandidateGP() { return _getSpillCandidateGeneric(_x86State.gp, kX86RegNumGp); } X86CompilerVar* X86CompilerContext::_getSpillCandidateMM() { return _getSpillCandidateGeneric(_x86State.mm, kX86RegNumMm); } X86CompilerVar* X86CompilerContext::_getSpillCandidateXMM() { return _getSpillCandidateGeneric(_x86State.xmm, kX86RegNumXmm); } X86CompilerVar* X86CompilerContext::_getSpillCandidateGeneric(X86CompilerVar** varArray, uint32_t count) { uint32_t i; X86CompilerVar* candidate = NULL; uint32_t candidatePriority = 0; int32_t candidateScore = 0; uint32_t currentOffset = _compiler->getCurrentItem()->getOffset(); for (i = 0; i < count; i++) { // Get variable. X86CompilerVar* cv = varArray[i]; // Never spill variables needed for next instruction. if (cv == NULL || cv->workOffset == _currentOffset) continue; uint32_t variablePriority = cv->getPriority(); int32_t variableScore = getSpillScore(cv, currentOffset); if ((candidate == NULL) || (variablePriority > candidatePriority) || (variablePriority == candidatePriority && variableScore > candidateScore)) { candidate = cv; candidatePriority = variablePriority; candidateScore = variableScore; } } return candidate; } void X86CompilerContext::_addActive(X86CompilerVar* var) { // Never call with variable that is already in active list. ASMJIT_ASSERT(var->nextActive == NULL); ASMJIT_ASSERT(var->prevActive == NULL); if (_active == NULL) { var->nextActive = var; var->prevActive = var; _active = var; } else { X86CompilerVar* vlast = static_cast(_active)->prevActive; vlast->nextActive = var; static_cast(_active)->prevActive = var; var->nextActive = static_cast(_active); var->prevActive = vlast; } } void X86CompilerContext::_freeActive(X86CompilerVar* var) { X86CompilerVar* next = var->nextActive; X86CompilerVar* prev = var->prevActive; if (prev == next) { _active = NULL; } else { if (_active == var) _active = next; prev->nextActive = next; next->prevActive = prev; } var->nextActive = NULL; var->prevActive = NULL; } void X86CompilerContext::_freeAllActive() { if (_active == NULL) return; X86CompilerVar* cur = static_cast(_active); for (;;) { X86CompilerVar* next = cur->nextActive; cur->nextActive = NULL; cur->prevActive = NULL; if (next == _active) break; } _active = NULL; } void X86CompilerContext::_allocatedVariable(X86CompilerVar* var) { uint32_t idx = var->regIndex; switch (var->getType()) { case kX86VarTypeGpd: case kX86VarTypeGpq: _x86State.gp[idx] = var; _allocatedGpRegister(idx); break; case kX86VarTypeMm: _x86State.mm[idx] = var; _allocatedMmRegister(idx); break; case kX86VarTypeXmm: case kX86VarTypeXmmSS: case kX86VarTypeXmmPS: case kX86VarTypeXmmSD: case kX86VarTypeXmmPD: _x86State.xmm[idx] = var; _allocatedXmmRegister(idx); break; default: ASMJIT_ASSERT(0); break; } } void X86CompilerContext::translateOperands(Operand* operands, uint32_t count) { X86Compiler* x86Compiler = getCompiler(); uint32_t i; // Translate variables to registers. for (i = 0; i < count; i++) { Operand& o = operands[i]; if (o.isVar()) { X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); o._reg.op = kOperandReg; o._reg.code |= cv->regIndex; } else if (o.isMem()) { if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) { // Memory access. We just increment here actual displacement. X86CompilerVar* cv = x86Compiler->_getVar(o.getId()); ASMJIT_ASSERT(cv != NULL); o._mem.displacement += cv->isMemArgument() ? _argumentsActualDisp : _variablesActualDisp; // NOTE: This is not enough, variable position will be patched later // by X86CompilerContext::_patchMemoryOperands(). } else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o._mem.base); ASMJIT_ASSERT(cv != NULL); o._mem.base = cv->regIndex; } if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = x86Compiler->_getVar(o._mem.index); ASMJIT_ASSERT(cv != NULL); o._mem.index = cv->regIndex; } } } } void X86CompilerContext::addBackwardCode(X86CompilerJmpInst* from) { _backCode.append(from); } void X86CompilerContext::addForwardJump(X86CompilerJmpInst* inst) { ForwardJumpData* j = reinterpret_cast(_zoneMemory.alloc(sizeof(ForwardJumpData))); if (j == NULL) { _compiler->setError(kErrorNoHeapMemory); return; } j->inst = inst; j->state = _saveState(); j->next = _forwardJumps; _forwardJumps = j; } X86CompilerState* X86CompilerContext::_saveState() { X86Compiler* x86Compiler = getCompiler(); // Get count of variables stored in memory. uint32_t memVarsCount = 0; X86CompilerVar* cur = static_cast(_active); if (cur) { do { if (cur->state == kVarStateMem) memVarsCount++; cur = cur->nextActive; } while (cur != _active); } // Alloc X86CompilerState structure (using zone allocator) and copy current // state into it. X86CompilerState* state = x86Compiler->_newState(memVarsCount); memcpy(state, &_x86State, sizeof(X86CompilerState)); // Clear changed flags. state->changedGP = 0; state->changedMM = 0; state->changedXMM = 0; uint i; uint mask; // Save variables stored in REGISTERs and CHANGE flag. for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if (state->gp[i] && state->gp[i]->changed) state->changedGP |= mask; } for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1) { if (state->mm[i] && state->mm[i]->changed) state->changedMM |= mask; } for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if (state->xmm[i] && state->xmm[i]->changed) state->changedXMM |= mask; } // Save variables stored in MEMORY. state->memVarsCount = memVarsCount; memVarsCount = 0; cur = static_cast(_active); if (cur) { do { if (cur->state == kVarStateMem) state->memVarsData[memVarsCount++] = cur; cur = cur->nextActive; } while (cur != _active); } // Finished. return state; } void X86CompilerContext::_assignState(X86CompilerState* state) { Compiler* compiler = getCompiler(); memcpy(&_x86State, state, sizeof(X86CompilerState)); _x86State.memVarsCount = 0; uint i, mask; X86CompilerVar* cv; // Unuse all variables first. cv = static_cast(_active); if (cv) { do { cv->state = kVarStateUnused; cv = cv->nextActive; } while (cv != _active); } // Assign variables stored in memory which are not unused. for (i = 0; i < state->memVarsCount; i++) { state->memVarsData[i]->state = kVarStateMem; } // Assign allocated variables. for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1) { if ((cv = _x86State.gp[i]) != NULL) { cv->state = kVarStateReg; cv->regIndex = i; cv->changed = (_x86State.changedGP & mask) != 0; } } for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1) { if ((cv = _x86State.mm[i]) != NULL) { cv->state = kVarStateReg; cv->regIndex = i; cv->changed = (_x86State.changedMM & mask) != 0; } } for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1) { if ((cv = _x86State.xmm[i]) != NULL) { cv->state = kVarStateReg; cv->regIndex = i; cv->changed = (_x86State.changedXMM & mask) != 0; } } } void X86CompilerContext::_restoreState(X86CompilerState* state, uint32_t targetOffset) { X86CompilerState* fromState = &_x86State; X86CompilerState* toState = state; // No change, rare... if (fromState == toState) return; uint base; uint i; // -------------------------------------------------------------------------- // Set target state to all variables. cv->tInt is target state in this func. // -------------------------------------------------------------------------- { // UNUSED. X86CompilerVar* cv = static_cast(_active); if (cv) { do { cv->tInt = kVarStateUnused; cv = cv->nextActive; } while (cv != _active); } // MEMORY. for (i = 0; i < toState->memVarsCount; i++) { toState->memVarsData[i]->tInt = kVarStateMem; } // REGISTER. for (i = 0; i < X86CompilerState::kStateRegCount; i++) { if ((cv = toState->regs[i]) != NULL) cv->tInt = kVarStateReg; } } // -------------------------------------------------------------------------- // [GP-Registers Switch] // -------------------------------------------------------------------------- // TODO. #if 0 for (i = 0; i < kX86RegNumGp; i++) { X86CompilerVar* fromVar = fromState->gp[i]; X86CompilerVar* toVar = toState->gp[i]; if (fromVar != toVar) { if (fromVar != NULL) { if (toVar != NULL) { if (fromState->gp[to } else { // It is possible that variable that was saved in state currently not // exists (tInt is target scope!). if (fromVar->tInt == kVarStateUnused) { unuseVar(fromVar, kVarStateUnused); } else { spillVar(fromVar); } } } } else if (fromVar != NULL) { uint32_t mask = IntUtil::maskFromIndex(i); // Variables are the same, we just need to compare changed flags. if ((fromState->changedGP & mask) && !(toState->changedGP & mask)) saveVar(fromVar); } } #endif // Spill. for (base = 0, i = 0; i < X86CompilerState::kStateRegCount; i++) { // Change the base offset (from base offset so the register index can be calculated). if (i == X86CompilerState::kStateRegMmBase || i == X86CompilerState::kStateRegXmmBase) base = i; uint32_t regIndex = i - base; X86CompilerVar* fromVar = fromState->regs[i]; X86CompilerVar* toVar = toState->regs[i]; if (fromVar != toVar) { // Spill the register. if (fromVar != NULL) { // It is possible that variable that was saved in state currently not // exists (tInt is target scope!). if (fromVar->tInt == kVarStateUnused) unuseVar(fromVar, kVarStateUnused); else spillVar(fromVar); } } else if (fromVar != NULL) { // Variables are the same, we just need to compare changed flags. uint32_t mask = IntUtil::maskFromIndex(regIndex); if ((fromState->changedGP & mask) && !(toState->changedGP & mask)) saveVar(fromVar); } } // Alloc. for (base = 0, i = 0; i < X86CompilerState::kStateRegCount; i++) { // Change the base offset (from base offset so the register index can be calculated). if (i == X86CompilerState::kStateRegMmBase || i == X86CompilerState::kStateRegXmmBase) base = i; X86CompilerVar* fromVar = fromState->regs[i]; X86CompilerVar* toVar = toState->regs[i]; if (fromVar != toVar) { // Alloc register. uint32_t regIndex = i - base; if (toVar != NULL) allocVar(toVar, IntUtil::maskFromIndex(regIndex), kVarAllocRead); } // TODO: //if (toVar) //{ // toVar->changed = to->changed; //} } // -------------------------------------------------------------------------- // Update used masks. // -------------------------------------------------------------------------- _x86State.usedGP = state->usedGP; _x86State.usedMM = state->usedMM; _x86State.usedXMM = state->usedXMM; // -------------------------------------------------------------------------- // Update changed masks and cleanup. // -------------------------------------------------------------------------- { X86CompilerVar* cv = static_cast(_active); if (cv) { do { if (cv->tInt != kVarStateReg) { cv->state = (int)cv->tInt; cv->changed = false; } cv->tInt = 0; cv = cv->nextActive; } while (cv != _active); } } } VarMemBlock* X86CompilerContext::_allocMemBlock(uint32_t size) { ASMJIT_ASSERT(size != 0); // First try to find mem blocks. VarMemBlock* mem = _memFree; VarMemBlock* prev = NULL; while (mem) { VarMemBlock* next = mem->nextFree; if (mem->size == size) { if (prev) prev->nextFree = next; else _memFree = next; mem->nextFree = NULL; return mem; } prev = mem; mem = next; } // Never mind, create new. mem = reinterpret_cast(_zoneMemory.alloc(sizeof(VarMemBlock))); if (mem == NULL) { _compiler->setError(kErrorNoHeapMemory); return NULL; } mem->offset = 0; mem->size = size; mem->nextUsed = _memUsed; mem->nextFree = NULL; _memUsed = mem; switch (size) { case 16: _mem16BlocksCount++; break; case 8: _mem8BlocksCount++; break; case 4: _mem4BlocksCount++; break; } return mem; } void X86CompilerContext::_freeMemBlock(VarMemBlock* mem) { // Add mem to free blocks. mem->nextFree = _memFree; _memFree = mem; } void X86CompilerContext::_allocMemoryOperands() { VarMemBlock* mem; // Variables are allocated in this order: // 1. 16-byte variables. // 2. 8-byte variables. // 3. 4-byte variables. // 4. All others. uint32_t start16 = 0; uint32_t start8 = start16 + _mem16BlocksCount * 16; uint32_t start4 = start8 + _mem8BlocksCount * 8; uint32_t startX = IntUtil::align(start4 + _mem4BlocksCount * 4, 16); for (mem = _memUsed; mem; mem = mem->nextUsed) { uint32_t size = mem->size; uint32_t offset; switch (size) { case 16: offset = start16; start16 += 16; break; case 8: offset = start8; start8 += 8; break; case 4: offset = start4; start4 += 4; break; default: // Align to 16 bytes if size is 16 or more. if (size >= 16) { size = IntUtil::align(size, 16); startX = IntUtil::align(startX, 16); } offset = startX; startX += size; break; } mem->offset = (int32_t)offset; _memBytesTotal += size; } } void X86CompilerContext::_patchMemoryOperands(CompilerItem* start, CompilerItem* stop) { CompilerItem* cur; for (cur = start;; cur = cur->getNext()) { if (cur->getType() == kCompilerItemInst) { Mem* mem = reinterpret_cast(cur)->_memOp; if (mem && (mem->_mem.id & kOperandIdTypeMask) == kOperandIdTypeVar) { X86CompilerVar* cv = getCompiler()->_getVar(mem->_mem.id); ASMJIT_ASSERT(cv != NULL); if (cv->isMemArgument()) { mem->_mem.base = _argumentsBaseReg; mem->_mem.displacement += cv->homeMemoryOffset; mem->_mem.displacement += _argumentsBaseOffset; } else { VarMemBlock* mb = reinterpret_cast(cv->homeMemoryData); ASMJIT_ASSERT(mb != NULL); mem->_mem.base = _variablesBaseReg; mem->_mem.displacement += mb->offset; mem->_mem.displacement += _variablesBaseOffset; } } } if (cur == stop) break; } } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/x86/x86defs.cpp0000644000175000017500000035373212140261626021475 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../x86/x86defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::x86InstName] // ============================================================================ // Following {DATA SECTION} is auto-generated by generate-defs.py tool using // X86InstInfo data. // // ${X86_INST_DATA:BEGIN} const char x86InstName[] = "\0" "adc\0" "add\0" "addpd\0" "addps\0" "addsd\0" "addss\0" "addsubpd\0" "addsubps\0" "amd_prefetch\0" "amd_prefetchw\0" "and\0" "andnpd\0" "andnps\0" "andpd\0" "andps\0" "blendpd\0" "blendps\0" "blendvpd\0" "blendvps\0" "bsf\0" "bsr\0" "bswap\0" "bt\0" "btc\0" "btr\0" "bts\0" "call\0" "cbw\0" "cdq\0" "cdqe\0" "clc\0" "cld\0" "clflush\0" "cmc\0" "cmova\0" "cmovae\0" "cmovb\0" "cmovbe\0" "cmovc\0" "cmove\0" "cmovg\0" "cmovge\0" "cmovl\0" "cmovle\0" "cmovna\0" "cmovnae\0" "cmovnb\0" "cmovnbe\0" "cmovnc\0" "cmovne\0" "cmovng\0" "cmovnge\0" "cmovnl\0" "cmovnle\0" "cmovno\0" "cmovnp\0" "cmovns\0" "cmovnz\0" "cmovo\0" "cmovp\0" "cmovpe\0" "cmovpo\0" "cmovs\0" "cmovz\0" "cmp\0" "cmppd\0" "cmpps\0" "cmpsd\0" "cmpss\0" "cmpxchg\0" "cmpxchg16b\0" "cmpxchg8b\0" "comisd\0" "comiss\0" "cpuid\0" "cqo\0" "crc32\0" "cvtdq2pd\0" "cvtdq2ps\0" "cvtpd2dq\0" "cvtpd2pi\0" "cvtpd2ps\0" "cvtpi2pd\0" "cvtpi2ps\0" "cvtps2dq\0" "cvtps2pd\0" "cvtps2pi\0" "cvtsd2si\0" "cvtsd2ss\0" "cvtsi2sd\0" "cvtsi2ss\0" "cvtss2sd\0" "cvtss2si\0" "cvttpd2dq\0" "cvttpd2pi\0" "cvttps2dq\0" "cvttps2pi\0" "cvttsd2si\0" "cvttss2si\0" "cwd\0" "cwde\0" "daa\0" "das\0" "dec\0" "div\0" "divpd\0" "divps\0" "divsd\0" "divss\0" "dppd\0" "dpps\0" "emms\0" "enter\0" "extractps\0" "f2xm1\0" "fabs\0" "fadd\0" "faddp\0" "fbld\0" "fbstp\0" "fchs\0" "fclex\0" "fcmovb\0" "fcmovbe\0" "fcmove\0" "fcmovnb\0" "fcmovnbe\0" "fcmovne\0" "fcmovnu\0" "fcmovu\0" "fcom\0" "fcomi\0" "fcomip\0" "fcomp\0" "fcompp\0" "fcos\0" "fdecstp\0" "fdiv\0" "fdivp\0" "fdivr\0" "fdivrp\0" "femms\0" "ffree\0" "fiadd\0" "ficom\0" "ficomp\0" "fidiv\0" "fidivr\0" "fild\0" "fimul\0" "fincstp\0" "finit\0" "fist\0" "fistp\0" "fisttp\0" "fisub\0" "fisubr\0" "fld\0" "fld1\0" "fldcw\0" "fldenv\0" "fldl2e\0" "fldl2t\0" "fldlg2\0" "fldln2\0" "fldpi\0" "fldz\0" "fmul\0" "fmulp\0" "fnclex\0" "fninit\0" "fnop\0" "fnsave\0" "fnstcw\0" "fnstenv\0" "fnstsw\0" "fpatan\0" "fprem\0" "fprem1\0" "fptan\0" "frndint\0" "frstor\0" "fsave\0" "fscale\0" "fsin\0" "fsincos\0" "fsqrt\0" "fst\0" "fstcw\0" "fstenv\0" "fstp\0" "fstsw\0" "fsub\0" "fsubp\0" "fsubr\0" "fsubrp\0" "ftst\0" "fucom\0" "fucomi\0" "fucomip\0" "fucomp\0" "fucompp\0" "fwait\0" "fxam\0" "fxch\0" "fxrstor\0" "fxsave\0" "fxtract\0" "fyl2x\0" "fyl2xp1\0" "haddpd\0" "haddps\0" "hsubpd\0" "hsubps\0" "idiv\0" "imul\0" "inc\0" "int3\0" "ja\0" "jae\0" "jb\0" "jbe\0" "jc\0" "je\0" "jg\0" "jge\0" "jl\0" "jle\0" "jna\0" "jnae\0" "jnb\0" "jnbe\0" "jnc\0" "jne\0" "jng\0" "jnge\0" "jnl\0" "jnle\0" "jno\0" "jnp\0" "jns\0" "jnz\0" "jo\0" "jp\0" "jpe\0" "jpo\0" "js\0" "jz\0" "jmp\0" "lddqu\0" "ldmxcsr\0" "lahf\0" "lea\0" "leave\0" "lfence\0" "maskmovdqu\0" "maskmovq\0" "maxpd\0" "maxps\0" "maxsd\0" "maxss\0" "mfence\0" "minpd\0" "minps\0" "minsd\0" "minss\0" "monitor\0" "mov\0" "movapd\0" "movaps\0" "movbe\0" "movd\0" "movddup\0" "movdq2q\0" "movdqa\0" "movdqu\0" "movhlps\0" "movhpd\0" "movhps\0" "movlhps\0" "movlpd\0" "movlps\0" "movmskpd\0" "movmskps\0" "movntdq\0" "movntdqa\0" "movnti\0" "movntpd\0" "movntps\0" "movntq\0" "movq\0" "movq2dq\0" "movsd\0" "movshdup\0" "movsldup\0" "movss\0" "movsx\0" "movsxd\0" "movupd\0" "movups\0" "movzx\0" "mov_ptr\0" "mpsadbw\0" "mul\0" "mulpd\0" "mulps\0" "mulsd\0" "mulss\0" "mwait\0" "neg\0" "nop\0" "not\0" "or\0" "orpd\0" "orps\0" "pabsb\0" "pabsd\0" "pabsw\0" "packssdw\0" "packsswb\0" "packusdw\0" "packuswb\0" "paddb\0" "paddd\0" "paddq\0" "paddsb\0" "paddsw\0" "paddusb\0" "paddusw\0" "paddw\0" "palignr\0" "pand\0" "pandn\0" "pause\0" "pavgb\0" "pavgw\0" "pblendvb\0" "pblendw\0" "pcmpeqb\0" "pcmpeqd\0" "pcmpeqq\0" "pcmpeqw\0" "pcmpestri\0" "pcmpestrm\0" "pcmpgtb\0" "pcmpgtd\0" "pcmpgtq\0" "pcmpgtw\0" "pcmpistri\0" "pcmpistrm\0" "pextrb\0" "pextrd\0" "pextrq\0" "pextrw\0" "pf2id\0" "pf2iw\0" "pfacc\0" "pfadd\0" "pfcmpeq\0" "pfcmpge\0" "pfcmpgt\0" "pfmax\0" "pfmin\0" "pfmul\0" "pfnacc\0" "pfpnacc\0" "pfrcp\0" "pfrcpit1\0" "pfrcpit2\0" "pfrsqit1\0" "pfrsqrt\0" "pfsub\0" "pfsubr\0" "phaddd\0" "phaddsw\0" "phaddw\0" "phminposuw\0" "phsubd\0" "phsubsw\0" "phsubw\0" "pi2fd\0" "pi2fw\0" "pinsrb\0" "pinsrd\0" "pinsrq\0" "pinsrw\0" "pmaddubsw\0" "pmaddwd\0" "pmaxsb\0" "pmaxsd\0" "pmaxsw\0" "pmaxub\0" "pmaxud\0" "pmaxuw\0" "pminsb\0" "pminsd\0" "pminsw\0" "pminub\0" "pminud\0" "pminuw\0" "pmovmskb\0" "pmovsxbd\0" "pmovsxbq\0" "pmovsxbw\0" "pmovsxdq\0" "pmovsxwd\0" "pmovsxwq\0" "pmovzxbd\0" "pmovzxbq\0" "pmovzxbw\0" "pmovzxdq\0" "pmovzxwd\0" "pmovzxwq\0" "pmuldq\0" "pmulhrsw\0" "pmulhuw\0" "pmulhw\0" "pmulld\0" "pmullw\0" "pmuludq\0" "pop\0" "popad\0" "popcnt\0" "popfd\0" "popfq\0" "por\0" "prefetch\0" "psadbw\0" "pshufb\0" "pshufd\0" "pshufw\0" "pshufhw\0" "pshuflw\0" "psignb\0" "psignd\0" "psignw\0" "pslld\0" "pslldq\0" "psllq\0" "psllw\0" "psrad\0" "psraw\0" "psrld\0" "psrldq\0" "psrlq\0" "psrlw\0" "psubb\0" "psubd\0" "psubq\0" "psubsb\0" "psubsw\0" "psubusb\0" "psubusw\0" "psubw\0" "pswapd\0" "ptest\0" "punpckhbw\0" "punpckhdq\0" "punpckhqdq\0" "punpckhwd\0" "punpcklbw\0" "punpckldq\0" "punpcklqdq\0" "punpcklwd\0" "push\0" "pushad\0" "pushfd\0" "pushfq\0" "pxor\0" "rcl\0" "rcpps\0" "rcpss\0" "rcr\0" "rdtsc\0" "rdtscp\0" "rep lodsb\0" "rep lodsd\0" "rep lodsq\0" "rep lodsw\0" "rep movsb\0" "rep movsd\0" "rep movsq\0" "rep movsw\0" "rep stosb\0" "rep stosd\0" "rep stosq\0" "rep stosw\0" "repe cmpsb\0" "repe cmpsd\0" "repe cmpsq\0" "repe cmpsw\0" "repe scasb\0" "repe scasd\0" "repe scasq\0" "repe scasw\0" "repne cmpsb\0" "repne cmpsd\0" "repne cmpsq\0" "repne cmpsw\0" "repne scasb\0" "repne scasd\0" "repne scasq\0" "repne scasw\0" "ret\0" "rol\0" "ror\0" "roundpd\0" "roundps\0" "roundsd\0" "roundss\0" "rsqrtps\0" "rsqrtss\0" "sahf\0" "sal\0" "sar\0" "sbb\0" "seta\0" "setae\0" "setb\0" "setbe\0" "setc\0" "sete\0" "setg\0" "setge\0" "setl\0" "setle\0" "setna\0" "setnae\0" "setnb\0" "setnbe\0" "setnc\0" "setne\0" "setng\0" "setnge\0" "setnl\0" "setnle\0" "setno\0" "setnp\0" "setns\0" "setnz\0" "seto\0" "setp\0" "setpe\0" "setpo\0" "sets\0" "setz\0" "sfence\0" "shl\0" "shld\0" "shr\0" "shrd\0" "shufpd\0" "shufps\0" "sqrtpd\0" "sqrtps\0" "sqrtsd\0" "sqrtss\0" "stc\0" "std\0" "stmxcsr\0" "sub\0" "subpd\0" "subps\0" "subsd\0" "subss\0" "test\0" "ucomisd\0" "ucomiss\0" "ud2\0" "unpckhpd\0" "unpckhps\0" "unpcklpd\0" "unpcklps\0" "xadd\0" "xchg\0" "xor\0" "xorpd\0" "xorps\0" ; #define INDEX_kInstNone 0 #define INDEX_kX86InstAdc 1 #define INDEX_kX86InstAdd 5 #define INDEX_kX86InstAddPD 9 #define INDEX_kX86InstAddPS 15 #define INDEX_kX86InstAddSD 21 #define INDEX_kX86InstAddSS 27 #define INDEX_kX86InstAddSubPD 33 #define INDEX_kX86InstAddSubPS 42 #define INDEX_kX86InstAmdPrefetch 51 #define INDEX_kX86InstAmdPrefetchW 64 #define INDEX_kX86InstAnd 78 #define INDEX_kX86InstAndnPD 82 #define INDEX_kX86InstAndnPS 89 #define INDEX_kX86InstAndPD 96 #define INDEX_kX86InstAndPS 102 #define INDEX_kX86InstBlendPD 108 #define INDEX_kX86InstBlendPS 116 #define INDEX_kX86InstBlendVPD 124 #define INDEX_kX86InstBlendVPS 133 #define INDEX_kX86InstBsf 142 #define INDEX_kX86InstBsr 146 #define INDEX_kX86InstBSwap 150 #define INDEX_kX86InstBt 156 #define INDEX_kX86InstBtc 159 #define INDEX_kX86InstBtr 163 #define INDEX_kX86InstBts 167 #define INDEX_kX86InstCall 171 #define INDEX_kX86InstCbw 176 #define INDEX_kX86InstCdq 180 #define INDEX_kX86InstCdqe 184 #define INDEX_kX86InstClc 189 #define INDEX_kX86InstCld 193 #define INDEX_kX86InstClFlush 197 #define INDEX_kX86InstCmc 205 #define INDEX_kX86InstCMovA 209 #define INDEX_kX86InstCMovAE 215 #define INDEX_kX86InstCMovB 222 #define INDEX_kX86InstCMovBE 228 #define INDEX_kX86InstCMovC 235 #define INDEX_kX86InstCMovE 241 #define INDEX_kX86InstCMovG 247 #define INDEX_kX86InstCMovGE 253 #define INDEX_kX86InstCMovL 260 #define INDEX_kX86InstCMovLE 266 #define INDEX_kX86InstCMovNA 273 #define INDEX_kX86InstCMovNAE 280 #define INDEX_kX86InstCMovNB 288 #define INDEX_kX86InstCMovNBE 295 #define INDEX_kX86InstCMovNC 303 #define INDEX_kX86InstCMovNE 310 #define INDEX_kX86InstCMovNG 317 #define INDEX_kX86InstCMovNGE 324 #define INDEX_kX86InstCMovNL 332 #define INDEX_kX86InstCMovNLE 339 #define INDEX_kX86InstCMovNO 347 #define INDEX_kX86InstCMovNP 354 #define INDEX_kX86InstCMovNS 361 #define INDEX_kX86InstCMovNZ 368 #define INDEX_kX86InstCMovO 375 #define INDEX_kX86InstCMovP 381 #define INDEX_kX86InstCMovPE 387 #define INDEX_kX86InstCMovPO 394 #define INDEX_kX86InstCMovS 401 #define INDEX_kX86InstCMovZ 407 #define INDEX_kX86InstCmp 413 #define INDEX_kX86InstCmpPD 417 #define INDEX_kX86InstCmpPS 423 #define INDEX_kX86InstCmpSD 429 #define INDEX_kX86InstCmpSS 435 #define INDEX_kX86InstCmpXCHG 441 #define INDEX_kX86InstCmpXCHG16B 449 #define INDEX_kX86InstCmpXCHG8B 460 #define INDEX_kX86InstComISD 470 #define INDEX_kX86InstComISS 477 #define INDEX_kX86InstCpuId 484 #define INDEX_kX86InstCqo 490 #define INDEX_kX86InstCrc32 494 #define INDEX_kX86InstCvtDQ2PD 500 #define INDEX_kX86InstCvtDQ2PS 509 #define INDEX_kX86InstCvtPD2DQ 518 #define INDEX_kX86InstCvtPD2PI 527 #define INDEX_kX86InstCvtPD2PS 536 #define INDEX_kX86InstCvtPI2PD 545 #define INDEX_kX86InstCvtPI2PS 554 #define INDEX_kX86InstCvtPS2DQ 563 #define INDEX_kX86InstCvtPS2PD 572 #define INDEX_kX86InstCvtPS2PI 581 #define INDEX_kX86InstCvtSD2SI 590 #define INDEX_kX86InstCvtSD2SS 599 #define INDEX_kX86InstCvtSI2SD 608 #define INDEX_kX86InstCvtSI2SS 617 #define INDEX_kX86InstCvtSS2SD 626 #define INDEX_kX86InstCvtSS2SI 635 #define INDEX_kX86InstCvttPD2DQ 644 #define INDEX_kX86InstCvttPD2PI 654 #define INDEX_kX86InstCvttPS2DQ 664 #define INDEX_kX86InstCvttPS2PI 674 #define INDEX_kX86InstCvttSD2SI 684 #define INDEX_kX86InstCvttSS2SI 694 #define INDEX_kX86InstCwd 704 #define INDEX_kX86InstCwde 708 #define INDEX_kX86InstDaa 713 #define INDEX_kX86InstDas 717 #define INDEX_kX86InstDec 721 #define INDEX_kX86InstDiv 725 #define INDEX_kX86InstDivPD 729 #define INDEX_kX86InstDivPS 735 #define INDEX_kX86InstDivSD 741 #define INDEX_kX86InstDivSS 747 #define INDEX_kX86InstDpPD 753 #define INDEX_kX86InstDpPS 758 #define INDEX_kX86InstEmms 763 #define INDEX_kX86InstEnter 768 #define INDEX_kX86InstExtractPS 774 #define INDEX_kX86InstF2XM1 784 #define INDEX_kX86InstFAbs 790 #define INDEX_kX86InstFAdd 795 #define INDEX_kX86InstFAddP 800 #define INDEX_kX86InstFBLd 806 #define INDEX_kX86InstFBStP 811 #define INDEX_kX86InstFCHS 817 #define INDEX_kX86InstFClex 822 #define INDEX_kX86InstFCMovB 828 #define INDEX_kX86InstFCMovBE 835 #define INDEX_kX86InstFCMovE 843 #define INDEX_kX86InstFCMovNB 850 #define INDEX_kX86InstFCMovNBE 858 #define INDEX_kX86InstFCMovNE 867 #define INDEX_kX86InstFCMovNU 875 #define INDEX_kX86InstFCMovU 883 #define INDEX_kX86InstFCom 890 #define INDEX_kX86InstFComI 895 #define INDEX_kX86InstFComIP 901 #define INDEX_kX86InstFComP 908 #define INDEX_kX86InstFComPP 914 #define INDEX_kX86InstFCos 921 #define INDEX_kX86InstFDecStP 926 #define INDEX_kX86InstFDiv 934 #define INDEX_kX86InstFDivP 939 #define INDEX_kX86InstFDivR 945 #define INDEX_kX86InstFDivRP 951 #define INDEX_kX86InstFEmms 958 #define INDEX_kX86InstFFree 964 #define INDEX_kX86InstFIAdd 970 #define INDEX_kX86InstFICom 976 #define INDEX_kX86InstFIComP 982 #define INDEX_kX86InstFIDiv 989 #define INDEX_kX86InstFIDivR 995 #define INDEX_kX86InstFILd 1002 #define INDEX_kX86InstFIMul 1007 #define INDEX_kX86InstFIncStP 1013 #define INDEX_kX86InstFInit 1021 #define INDEX_kX86InstFISt 1027 #define INDEX_kX86InstFIStP 1032 #define INDEX_kX86InstFISttP 1038 #define INDEX_kX86InstFISub 1045 #define INDEX_kX86InstFISubR 1051 #define INDEX_kX86InstFLd 1058 #define INDEX_kX86InstFLd1 1062 #define INDEX_kX86InstFLdCw 1067 #define INDEX_kX86InstFLdEnv 1073 #define INDEX_kX86InstFLdL2E 1080 #define INDEX_kX86InstFLdL2T 1087 #define INDEX_kX86InstFLdLg2 1094 #define INDEX_kX86InstFLdLn2 1101 #define INDEX_kX86InstFLdPi 1108 #define INDEX_kX86InstFLdZ 1114 #define INDEX_kX86InstFMul 1119 #define INDEX_kX86InstFMulP 1124 #define INDEX_kX86InstFNClex 1130 #define INDEX_kX86InstFNInit 1137 #define INDEX_kX86InstFNop 1144 #define INDEX_kX86InstFNSave 1149 #define INDEX_kX86InstFNStCw 1156 #define INDEX_kX86InstFNStEnv 1163 #define INDEX_kX86InstFNStSw 1171 #define INDEX_kX86InstFPAtan 1178 #define INDEX_kX86InstFPRem 1185 #define INDEX_kX86InstFPRem1 1191 #define INDEX_kX86InstFPTan 1198 #define INDEX_kX86InstFRndInt 1204 #define INDEX_kX86InstFRstor 1212 #define INDEX_kX86InstFSave 1219 #define INDEX_kX86InstFScale 1225 #define INDEX_kX86InstFSin 1232 #define INDEX_kX86InstFSinCos 1237 #define INDEX_kX86InstFSqrt 1245 #define INDEX_kX86InstFSt 1251 #define INDEX_kX86InstFStCw 1255 #define INDEX_kX86InstFStEnv 1261 #define INDEX_kX86InstFStP 1268 #define INDEX_kX86InstFStSw 1273 #define INDEX_kX86InstFSub 1279 #define INDEX_kX86InstFSubP 1284 #define INDEX_kX86InstFSubR 1290 #define INDEX_kX86InstFSubRP 1296 #define INDEX_kX86InstFTst 1303 #define INDEX_kX86InstFUCom 1308 #define INDEX_kX86InstFUComI 1314 #define INDEX_kX86InstFUComIP 1321 #define INDEX_kX86InstFUComP 1329 #define INDEX_kX86InstFUComPP 1336 #define INDEX_kX86InstFWait 1344 #define INDEX_kX86InstFXam 1350 #define INDEX_kX86InstFXch 1355 #define INDEX_kX86InstFXRstor 1360 #define INDEX_kX86InstFXSave 1368 #define INDEX_kX86InstFXtract 1375 #define INDEX_kX86InstFYL2X 1383 #define INDEX_kX86InstFYL2XP1 1389 #define INDEX_kX86InstHAddPD 1397 #define INDEX_kX86InstHAddPS 1404 #define INDEX_kX86InstHSubPD 1411 #define INDEX_kX86InstHSubPS 1418 #define INDEX_kX86InstIDiv 1425 #define INDEX_kX86InstIMul 1430 #define INDEX_kX86InstInc 1435 #define INDEX_kX86InstInt3 1439 #define INDEX_kX86InstJA 1444 #define INDEX_kX86InstJAE 1447 #define INDEX_kX86InstJB 1451 #define INDEX_kX86InstJBE 1454 #define INDEX_kX86InstJC 1458 #define INDEX_kX86InstJE 1461 #define INDEX_kX86InstJG 1464 #define INDEX_kX86InstJGE 1467 #define INDEX_kX86InstJL 1471 #define INDEX_kX86InstJLE 1474 #define INDEX_kX86InstJNA 1478 #define INDEX_kX86InstJNAE 1482 #define INDEX_kX86InstJNB 1487 #define INDEX_kX86InstJNBE 1491 #define INDEX_kX86InstJNC 1496 #define INDEX_kX86InstJNE 1500 #define INDEX_kX86InstJNG 1504 #define INDEX_kX86InstJNGE 1508 #define INDEX_kX86InstJNL 1513 #define INDEX_kX86InstJNLE 1517 #define INDEX_kX86InstJNO 1522 #define INDEX_kX86InstJNP 1526 #define INDEX_kX86InstJNS 1530 #define INDEX_kX86InstJNZ 1534 #define INDEX_kX86InstJO 1538 #define INDEX_kX86InstJP 1541 #define INDEX_kX86InstJPE 1544 #define INDEX_kX86InstJPO 1548 #define INDEX_kX86InstJS 1552 #define INDEX_kX86InstJZ 1555 #define INDEX_kX86InstJmp 1558 #define INDEX_kX86InstLdDQU 1562 #define INDEX_kX86InstLdMXCSR 1568 #define INDEX_kX86InstLahf 1576 #define INDEX_kX86InstLea 1581 #define INDEX_kX86InstLeave 1585 #define INDEX_kX86InstLFence 1591 #define INDEX_kX86InstMaskMovDQU 1598 #define INDEX_kX86InstMaskMovQ 1609 #define INDEX_kX86InstMaxPD 1618 #define INDEX_kX86InstMaxPS 1624 #define INDEX_kX86InstMaxSD 1630 #define INDEX_kX86InstMaxSS 1636 #define INDEX_kX86InstMFence 1642 #define INDEX_kX86InstMinPD 1649 #define INDEX_kX86InstMinPS 1655 #define INDEX_kX86InstMinSD 1661 #define INDEX_kX86InstMinSS 1667 #define INDEX_kX86InstMonitor 1673 #define INDEX_kX86InstMov 1681 #define INDEX_kX86InstMovAPD 1685 #define INDEX_kX86InstMovAPS 1692 #define INDEX_kX86InstMovBE 1699 #define INDEX_kX86InstMovD 1705 #define INDEX_kX86InstMovDDup 1710 #define INDEX_kX86InstMovDQ2Q 1718 #define INDEX_kX86InstMovDQA 1726 #define INDEX_kX86InstMovDQU 1733 #define INDEX_kX86InstMovHLPS 1740 #define INDEX_kX86InstMovHPD 1748 #define INDEX_kX86InstMovHPS 1755 #define INDEX_kX86InstMovLHPS 1762 #define INDEX_kX86InstMovLPD 1770 #define INDEX_kX86InstMovLPS 1777 #define INDEX_kX86InstMovMskPD 1784 #define INDEX_kX86InstMovMskPS 1793 #define INDEX_kX86InstMovNTDQ 1802 #define INDEX_kX86InstMovNTDQA 1810 #define INDEX_kX86InstMovNTI 1819 #define INDEX_kX86InstMovNTPD 1826 #define INDEX_kX86InstMovNTPS 1834 #define INDEX_kX86InstMovNTQ 1842 #define INDEX_kX86InstMovQ 1849 #define INDEX_kX86InstMovQ2DQ 1854 #define INDEX_kX86InstMovSD 1862 #define INDEX_kX86InstMovSHDup 1868 #define INDEX_kX86InstMovSLDup 1877 #define INDEX_kX86InstMovSS 1886 #define INDEX_kX86InstMovSX 1892 #define INDEX_kX86InstMovSXD 1898 #define INDEX_kX86InstMovUPD 1905 #define INDEX_kX86InstMovUPS 1912 #define INDEX_kX86InstMovZX 1919 #define INDEX_kX86InstMovPtr 1925 #define INDEX_kX86InstMPSADBW 1933 #define INDEX_kX86InstMul 1941 #define INDEX_kX86InstMulPD 1945 #define INDEX_kX86InstMulPS 1951 #define INDEX_kX86InstMulSD 1957 #define INDEX_kX86InstMulSS 1963 #define INDEX_kX86InstMWait 1969 #define INDEX_kX86InstNeg 1975 #define INDEX_kX86InstNop 1979 #define INDEX_kX86InstNot 1983 #define INDEX_kX86InstOr 1987 #define INDEX_kX86InstOrPD 1990 #define INDEX_kX86InstOrPS 1995 #define INDEX_kX86InstPAbsB 2000 #define INDEX_kX86InstPAbsD 2006 #define INDEX_kX86InstPAbsW 2012 #define INDEX_kX86InstPackSSDW 2018 #define INDEX_kX86InstPackSSWB 2027 #define INDEX_kX86InstPackUSDW 2036 #define INDEX_kX86InstPackUSWB 2045 #define INDEX_kX86InstPAddB 2054 #define INDEX_kX86InstPAddD 2060 #define INDEX_kX86InstPAddQ 2066 #define INDEX_kX86InstPAddSB 2072 #define INDEX_kX86InstPAddSW 2079 #define INDEX_kX86InstPAddUSB 2086 #define INDEX_kX86InstPAddUSW 2094 #define INDEX_kX86InstPAddW 2102 #define INDEX_kX86InstPAlignR 2108 #define INDEX_kX86InstPAnd 2116 #define INDEX_kX86InstPAndN 2121 #define INDEX_kX86InstPause 2127 #define INDEX_kX86InstPAvgB 2133 #define INDEX_kX86InstPAvgW 2139 #define INDEX_kX86InstPBlendVB 2145 #define INDEX_kX86InstPBlendW 2154 #define INDEX_kX86InstPCmpEqB 2162 #define INDEX_kX86InstPCmpEqD 2170 #define INDEX_kX86InstPCmpEqQ 2178 #define INDEX_kX86InstPCmpEqW 2186 #define INDEX_kX86InstPCmpEStrI 2194 #define INDEX_kX86InstPCmpEStrM 2204 #define INDEX_kX86InstPCmpGtB 2214 #define INDEX_kX86InstPCmpGtD 2222 #define INDEX_kX86InstPCmpGtQ 2230 #define INDEX_kX86InstPCmpGtW 2238 #define INDEX_kX86InstPCmpIStrI 2246 #define INDEX_kX86InstPCmpIStrM 2256 #define INDEX_kX86InstPExtrB 2266 #define INDEX_kX86InstPExtrD 2273 #define INDEX_kX86InstPExtrQ 2280 #define INDEX_kX86InstPExtrW 2287 #define INDEX_kX86InstPF2ID 2294 #define INDEX_kX86InstPF2IW 2300 #define INDEX_kX86InstPFAcc 2306 #define INDEX_kX86InstPFAdd 2312 #define INDEX_kX86InstPFCmpEQ 2318 #define INDEX_kX86InstPFCmpGE 2326 #define INDEX_kX86InstPFCmpGT 2334 #define INDEX_kX86InstPFMax 2342 #define INDEX_kX86InstPFMin 2348 #define INDEX_kX86InstPFMul 2354 #define INDEX_kX86InstPFNAcc 2360 #define INDEX_kX86InstPFPNAcc 2367 #define INDEX_kX86InstPFRcp 2375 #define INDEX_kX86InstPFRcpIt1 2381 #define INDEX_kX86InstPFRcpIt2 2390 #define INDEX_kX86InstPFRSqIt1 2399 #define INDEX_kX86InstPFRSqrt 2408 #define INDEX_kX86InstPFSub 2416 #define INDEX_kX86InstPFSubR 2422 #define INDEX_kX86InstPHAddD 2429 #define INDEX_kX86InstPHAddSW 2436 #define INDEX_kX86InstPHAddW 2444 #define INDEX_kX86InstPHMinPOSUW 2451 #define INDEX_kX86InstPHSubD 2462 #define INDEX_kX86InstPHSubSW 2469 #define INDEX_kX86InstPHSubW 2477 #define INDEX_kX86InstPI2FD 2484 #define INDEX_kX86InstPI2FW 2490 #define INDEX_kX86InstPInsRB 2496 #define INDEX_kX86InstPInsRD 2503 #define INDEX_kX86InstPInsRQ 2510 #define INDEX_kX86InstPInsRW 2517 #define INDEX_kX86InstPMAddUBSW 2524 #define INDEX_kX86InstPMAddWD 2534 #define INDEX_kX86InstPMaxSB 2542 #define INDEX_kX86InstPMaxSD 2549 #define INDEX_kX86InstPMaxSW 2556 #define INDEX_kX86InstPMaxUB 2563 #define INDEX_kX86InstPMaxUD 2570 #define INDEX_kX86InstPMaxUW 2577 #define INDEX_kX86InstPMinSB 2584 #define INDEX_kX86InstPMinSD 2591 #define INDEX_kX86InstPMinSW 2598 #define INDEX_kX86InstPMinUB 2605 #define INDEX_kX86InstPMinUD 2612 #define INDEX_kX86InstPMinUW 2619 #define INDEX_kX86InstPMovMskB 2626 #define INDEX_kX86InstPMovSXBD 2635 #define INDEX_kX86InstPMovSXBQ 2644 #define INDEX_kX86InstPMovSXBW 2653 #define INDEX_kX86InstPMovSXDQ 2662 #define INDEX_kX86InstPMovSXWD 2671 #define INDEX_kX86InstPMovSXWQ 2680 #define INDEX_kX86InstPMovZXBD 2689 #define INDEX_kX86InstPMovZXBQ 2698 #define INDEX_kX86InstPMovZXBW 2707 #define INDEX_kX86InstPMovZXDQ 2716 #define INDEX_kX86InstPMovZXWD 2725 #define INDEX_kX86InstPMovZXWQ 2734 #define INDEX_kX86InstPMulDQ 2743 #define INDEX_kX86InstPMulHRSW 2750 #define INDEX_kX86InstPMulHUW 2759 #define INDEX_kX86InstPMulHW 2767 #define INDEX_kX86InstPMulLD 2774 #define INDEX_kX86InstPMulLW 2781 #define INDEX_kX86InstPMulUDQ 2788 #define INDEX_kX86InstPop 2796 #define INDEX_kX86InstPopAD 2800 #define INDEX_kX86InstPopCnt 2806 #define INDEX_kX86InstPopFD 2813 #define INDEX_kX86InstPopFQ 2819 #define INDEX_kX86InstPOr 2825 #define INDEX_kX86InstPrefetch 2829 #define INDEX_kX86InstPSADBW 2838 #define INDEX_kX86InstPShufB 2845 #define INDEX_kX86InstPShufD 2852 #define INDEX_kX86InstPShufW 2859 #define INDEX_kX86InstPShufHW 2866 #define INDEX_kX86InstPShufLW 2874 #define INDEX_kX86InstPSignB 2882 #define INDEX_kX86InstPSignD 2889 #define INDEX_kX86InstPSignW 2896 #define INDEX_kX86InstPSllD 2903 #define INDEX_kX86InstPSllDQ 2909 #define INDEX_kX86InstPSllQ 2916 #define INDEX_kX86InstPSllW 2922 #define INDEX_kX86InstPSraD 2928 #define INDEX_kX86InstPSraW 2934 #define INDEX_kX86InstPSrlD 2940 #define INDEX_kX86InstPSrlDQ 2946 #define INDEX_kX86InstPSrlQ 2953 #define INDEX_kX86InstPSrlW 2959 #define INDEX_kX86InstPSubB 2965 #define INDEX_kX86InstPSubD 2971 #define INDEX_kX86InstPSubQ 2977 #define INDEX_kX86InstPSubSB 2983 #define INDEX_kX86InstPSubSW 2990 #define INDEX_kX86InstPSubUSB 2997 #define INDEX_kX86InstPSubUSW 3005 #define INDEX_kX86InstPSubW 3013 #define INDEX_kX86InstPSwapD 3019 #define INDEX_kX86InstPTest 3026 #define INDEX_kX86InstPunpckHBW 3032 #define INDEX_kX86InstPunpckHDQ 3042 #define INDEX_kX86InstPunpckHQDQ 3052 #define INDEX_kX86InstPunpckHWD 3063 #define INDEX_kX86InstPunpckLBW 3073 #define INDEX_kX86InstPunpckLDQ 3083 #define INDEX_kX86InstPunpckLQDQ 3093 #define INDEX_kX86InstPunpckLWD 3104 #define INDEX_kX86InstPush 3114 #define INDEX_kX86InstPushAD 3119 #define INDEX_kX86InstPushFD 3126 #define INDEX_kX86InstPushFQ 3133 #define INDEX_kX86InstPXor 3140 #define INDEX_kX86InstRcl 3145 #define INDEX_kX86InstRcpPS 3149 #define INDEX_kX86InstRcpSS 3155 #define INDEX_kX86InstRcr 3161 #define INDEX_kX86InstRdtsc 3165 #define INDEX_kX86InstRdtscP 3171 #define INDEX_kX86InstRepLodSB 3178 #define INDEX_kX86InstRepLodSD 3188 #define INDEX_kX86InstRepLodSQ 3198 #define INDEX_kX86InstRepLodSW 3208 #define INDEX_kX86InstRepMovSB 3218 #define INDEX_kX86InstRepMovSD 3228 #define INDEX_kX86InstRepMovSQ 3238 #define INDEX_kX86InstRepMovSW 3248 #define INDEX_kX86InstRepStoSB 3258 #define INDEX_kX86InstRepStoSD 3268 #define INDEX_kX86InstRepStoSQ 3278 #define INDEX_kX86InstRepStoSW 3288 #define INDEX_kX86InstRepECmpSB 3298 #define INDEX_kX86InstRepECmpSD 3309 #define INDEX_kX86InstRepECmpSQ 3320 #define INDEX_kX86InstRepECmpSW 3331 #define INDEX_kX86InstRepEScaSB 3342 #define INDEX_kX86InstRepEScaSD 3353 #define INDEX_kX86InstRepEScaSQ 3364 #define INDEX_kX86InstRepEScaSW 3375 #define INDEX_kX86InstRepNECmpSB 3386 #define INDEX_kX86InstRepNECmpSD 3398 #define INDEX_kX86InstRepNECmpSQ 3410 #define INDEX_kX86InstRepNECmpSW 3422 #define INDEX_kX86InstRepNEScaSB 3434 #define INDEX_kX86InstRepNEScaSD 3446 #define INDEX_kX86InstRepNEScaSQ 3458 #define INDEX_kX86InstRepNEScaSW 3470 #define INDEX_kX86InstRet 3482 #define INDEX_kX86InstRol 3486 #define INDEX_kX86InstRor 3490 #define INDEX_kX86InstRoundPD 3494 #define INDEX_kX86InstRoundPS 3502 #define INDEX_kX86InstRoundSD 3510 #define INDEX_kX86InstRoundSS 3518 #define INDEX_kX86InstRSqrtPS 3526 #define INDEX_kX86InstRSqrtSS 3534 #define INDEX_kX86InstSahf 3542 #define INDEX_kX86InstSal 3547 #define INDEX_kX86InstSar 3551 #define INDEX_kX86InstSbb 3555 #define INDEX_kX86InstSetA 3559 #define INDEX_kX86InstSetAE 3564 #define INDEX_kX86InstSetB 3570 #define INDEX_kX86InstSetBE 3575 #define INDEX_kX86InstSetC 3581 #define INDEX_kX86InstSetE 3586 #define INDEX_kX86InstSetG 3591 #define INDEX_kX86InstSetGE 3596 #define INDEX_kX86InstSetL 3602 #define INDEX_kX86InstSetLE 3607 #define INDEX_kX86InstSetNA 3613 #define INDEX_kX86InstSetNAE 3619 #define INDEX_kX86InstSetNB 3626 #define INDEX_kX86InstSetNBE 3632 #define INDEX_kX86InstSetNC 3639 #define INDEX_kX86InstSetNE 3645 #define INDEX_kX86InstSetNG 3651 #define INDEX_kX86InstSetNGE 3657 #define INDEX_kX86InstSetNL 3664 #define INDEX_kX86InstSetNLE 3670 #define INDEX_kX86InstSetNO 3677 #define INDEX_kX86InstSetNP 3683 #define INDEX_kX86InstSetNS 3689 #define INDEX_kX86InstSetNZ 3695 #define INDEX_kX86InstSetO 3701 #define INDEX_kX86InstSetP 3706 #define INDEX_kX86InstSetPE 3711 #define INDEX_kX86InstSetPO 3717 #define INDEX_kX86InstSetS 3723 #define INDEX_kX86InstSetZ 3728 #define INDEX_kX86InstSFence 3733 #define INDEX_kX86InstShl 3740 #define INDEX_kX86InstShld 3744 #define INDEX_kX86InstShr 3749 #define INDEX_kX86InstShrd 3753 #define INDEX_kX86InstShufPD 3758 #define INDEX_kX86InstShufPS 3765 #define INDEX_kX86InstSqrtPD 3772 #define INDEX_kX86InstSqrtPS 3779 #define INDEX_kX86InstSqrtSD 3786 #define INDEX_kX86InstSqrtSS 3793 #define INDEX_kX86InstStc 3800 #define INDEX_kX86InstStd 3804 #define INDEX_kX86InstStMXCSR 3808 #define INDEX_kX86InstSub 3816 #define INDEX_kX86InstSubPD 3820 #define INDEX_kX86InstSubPS 3826 #define INDEX_kX86InstSubSD 3832 #define INDEX_kX86InstSubSS 3838 #define INDEX_kX86InstTest 3844 #define INDEX_kX86InstUComISD 3849 #define INDEX_kX86InstUComISS 3857 #define INDEX_kX86InstUd2 3865 #define INDEX_kX86InstUnpckHPD 3869 #define INDEX_kX86InstUnpckHPS 3878 #define INDEX_kX86InstUnpckLPD 3887 #define INDEX_kX86InstUnpckLPS 3896 #define INDEX_kX86InstXadd 3905 #define INDEX_kX86InstXchg 3910 #define INDEX_kX86InstXor 3915 #define INDEX_kX86InstXorPD 3919 #define INDEX_kX86InstXorPS 3925 // ${X86_INST_DATA:END} // ============================================================================ // [AsmJit::x86InstInfo] // ============================================================================ #define INST(_Code_, _Name_, _Group_, _Flags_, _OpFlags0_, _OpFlags1_, _OpReg_, _OpCode0_, _OpCode1_) \ { _Code_, INDEX_##_Code_, _Group_, _Flags_, { _OpFlags0_, _OpFlags1_ }, _OpReg_, { _OpCode0_, _OpCode1_ } } #define G(_Group_) kX86InstGroup##_Group_ #define F(_Flags_) kX86InstFlag##_Flags_ #define O(_Op_) kX86InstOp##_Op_ const X86InstInfo x86InstInfo[] = { // Instruction code | Instruction name | Instruction group| Instruction flags| Operand flags[0] | Operand flags[1] | r| opCode[0] | opcode[1] INST(kInstNone , "" , G(None) , F(None) , 0 , 0 , 0, 0 , 0), INST(kX86InstAdc , "adc" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 2, 0x00000010, 0x00000080), INST(kX86InstAdd , "add" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 0, 0x00000000, 0x00000080), INST(kX86InstAddPD , "addpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F58, 0), INST(kX86InstAddPS , "addps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F58, 0), INST(kX86InstAddSD , "addsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F58, 0), INST(kX86InstAddSS , "addss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F58, 0), INST(kX86InstAddSubPD , "addsubpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FD0, 0), INST(kX86InstAddSubPS , "addsubps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000FD0, 0), INST(kX86InstAmdPrefetch , "amd_prefetch" , G(Mem) , F(None) , O(Mem) , 0 , 0, 0x00000F0D, 0), INST(kX86InstAmdPrefetchW , "amd_prefetchw" , G(Mem) , F(None) , O(Mem) , 0 , 1, 0x00000F0D, 0), INST(kX86InstAnd , "and" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 4, 0x00000020, 0x00000080), INST(kX86InstAndnPD , "andnpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F55, 0), INST(kX86InstAndnPS , "andnps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F55, 0), INST(kX86InstAndPD , "andpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F54, 0), INST(kX86InstAndPS , "andps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F54, 0), INST(kX86InstBlendPD , "blendpd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0D, 0), INST(kX86InstBlendPS , "blendps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0C, 0), INST(kX86InstBlendVPD , "blendvpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3815, 0), INST(kX86InstBlendVPS , "blendvps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3814, 0), INST(kX86InstBsf , "bsf" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000FBC, 0), INST(kX86InstBsr , "bsr" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000FBD, 0), INST(kX86InstBSwap , "bswap" , G(BSwap) , F(None) , O(Gqd) , 0 , 0, 0 , 0), INST(kX86InstBt , "bt" , G(BTest) , F(None) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 4, 0x00000FA3, 0x00000FBA), INST(kX86InstBtc , "btc" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 7, 0x00000FBB, 0x00000FBA), INST(kX86InstBtr , "btr" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 6, 0x00000FB3, 0x00000FBA), INST(kX86InstBts , "bts" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 5, 0x00000FAB, 0x00000FBA), INST(kX86InstCall , "call" , G(Call) , F(Jump) , O(Gqd) |O(Mem) , 0 , 0, 0 , 0), INST(kX86InstCbw , "cbw" , G(Emit) , F(Special) , 0 , 0 , 0, 0x66000098, 0), INST(kX86InstCdq , "cdq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000099, 0), INST(kX86InstCdqe , "cdqe" , G(Emit) , F(Special) , 0 , 0 , 0, 0x48000098, 0), INST(kX86InstClc , "clc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F8, 0), INST(kX86InstCld , "cld" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000FC, 0), INST(kX86InstClFlush , "clflush" , G(Mem) , F(None) , O(Mem) , 0 , 7, 0x00000FAE, 0), INST(kX86InstCmc , "cmc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F5, 0), INST(kX86InstCMovA , "cmova" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F47, 0), INST(kX86InstCMovAE , "cmovae" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), INST(kX86InstCMovB , "cmovb" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), INST(kX86InstCMovBE , "cmovbe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F46, 0), INST(kX86InstCMovC , "cmovc" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), INST(kX86InstCMovE , "cmove" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F44, 0), INST(kX86InstCMovG , "cmovg" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4F, 0), INST(kX86InstCMovGE , "cmovge" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4D, 0), INST(kX86InstCMovL , "cmovl" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4C, 0), INST(kX86InstCMovLE , "cmovle" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4E, 0), INST(kX86InstCMovNA , "cmovna" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F46, 0), INST(kX86InstCMovNAE , "cmovnae" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), INST(kX86InstCMovNB , "cmovnb" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), INST(kX86InstCMovNBE , "cmovnbe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F47, 0), INST(kX86InstCMovNC , "cmovnc" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), INST(kX86InstCMovNE , "cmovne" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F45, 0), INST(kX86InstCMovNG , "cmovng" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4E, 0), INST(kX86InstCMovNGE , "cmovnge" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4C, 0), INST(kX86InstCMovNL , "cmovnl" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4D, 0), INST(kX86InstCMovNLE , "cmovnle" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4F, 0), INST(kX86InstCMovNO , "cmovno" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F41, 0), INST(kX86InstCMovNP , "cmovnp" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4B, 0), INST(kX86InstCMovNS , "cmovns" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F49, 0), INST(kX86InstCMovNZ , "cmovnz" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F45, 0), INST(kX86InstCMovO , "cmovo" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F40, 0), INST(kX86InstCMovP , "cmovp" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4A, 0), INST(kX86InstCMovPE , "cmovpe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4A, 0), INST(kX86InstCMovPO , "cmovpo" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4B, 0), INST(kX86InstCMovS , "cmovs" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F48, 0), INST(kX86InstCMovZ , "cmovz" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F44, 0), INST(kX86InstCmp , "cmp" , G(Arith) , F(None) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 7, 0x00000038, 0x00000080), INST(kX86InstCmpPD , "cmppd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FC2, 0), INST(kX86InstCmpPS , "cmpps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000FC2, 0), INST(kX86InstCmpSD , "cmpsd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000FC2, 0), INST(kX86InstCmpSS , "cmpss" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000FC2, 0), INST(kX86InstCmpXCHG , "cmpxchg" , G(RmReg) , F(Special)|F(Lockable), 0 , 0 , 0, 0x00000FB0, 0), INST(kX86InstCmpXCHG16B , "cmpxchg16b" , G(Mem) , F(Special) , O(Mem) , 0 , 1, 0x00000FC7, 1 /* RexW */), INST(kX86InstCmpXCHG8B , "cmpxchg8b" , G(Mem) , F(Special) , O(Mem) , 0 , 1, 0x00000FC7, 0), INST(kX86InstComISD , "comisd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F2F, 0), INST(kX86InstComISS , "comiss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F2F, 0), INST(kX86InstCpuId , "cpuid" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000FA2, 0), INST(kX86InstCqo , "cqo" , G(Emit) , F(Special) , 0 , 0 , 0, 0x48000099, 0), // TODO, set RexW bit instead? INST(kX86InstCrc32 , "crc32" , G(Crc32) , F(None) , O(Gqd) , O(GqdwbMem) , 0, 0xF20F38F0, 0), INST(kX86InstCvtDQ2PD , "cvtdq2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000FE6, 0), INST(kX86InstCvtDQ2PS , "cvtdq2ps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F5B, 0), INST(kX86InstCvtPD2DQ , "cvtpd2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000FE6, 0), INST(kX86InstCvtPD2PI , "cvtpd2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x66000F2D, 0), INST(kX86InstCvtPD2PS , "cvtpd2ps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F5A, 0), INST(kX86InstCvtPI2PD , "cvtpi2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(MmMem) , 0, 0x66000F2A, 0), INST(kX86InstCvtPI2PS , "cvtpi2ps" , G(MmuRmI) , F(None) , O(Xmm) , O(MmMem) , 0, 0x00000F2A, 0), INST(kX86InstCvtPS2DQ , "cvtps2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F5B, 0), INST(kX86InstCvtPS2PD , "cvtps2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F5A, 0), INST(kX86InstCvtPS2PI , "cvtps2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x00000F2D, 0), INST(kX86InstCvtSD2SI , "cvtsd2si" , G(MmuRmI) , F(Mov) , O(Gqd) , O(XmmMem) , 0, 0xF2000F2D, 0), INST(kX86InstCvtSD2SS , "cvtsd2ss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5A, 0), INST(kX86InstCvtSI2SD , "cvtsi2sd" , G(MmuRmI) , F(None) , O(Xmm) , O(Gqd)|O(Mem) , 0, 0xF2000F2A, 0), INST(kX86InstCvtSI2SS , "cvtsi2ss" , G(MmuRmI) , F(None) , O(Xmm) , O(Gqd)|O(Mem) , 0, 0xF3000F2A, 0), INST(kX86InstCvtSS2SD , "cvtss2sd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5A, 0), INST(kX86InstCvtSS2SI , "cvtss2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF3000F2D, 0), INST(kX86InstCvttPD2DQ , "cvttpd2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000FE6, 0), INST(kX86InstCvttPD2PI , "cvttpd2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x66000F2C, 0), INST(kX86InstCvttPS2DQ , "cvttps2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5B, 0), INST(kX86InstCvttPS2PI , "cvttps2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x00000F2C, 0), INST(kX86InstCvttSD2SI , "cvttsd2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF2000F2C, 0), INST(kX86InstCvttSS2SI , "cvttss2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF3000F2C, 0), INST(kX86InstCwd , "cwd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x66000099, 0), INST(kX86InstCwde , "cwde" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000098, 0), INST(kX86InstDaa , "daa" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000027, 0), INST(kX86InstDas , "das" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000002F, 0), INST(kX86InstDec , "dec" , G(IncDec) , F(Lockable) , O(GqdwbMem) , 0 , 1, 0x00000048, 0x000000FE), INST(kX86InstDiv , "div" , G(Rm) , F(Special) , 0 , 0 , 6, 0x000000F6, 0), INST(kX86InstDivPD , "divpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5E, 0), INST(kX86InstDivPS , "divps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5E, 0), INST(kX86InstDivSD , "divsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5E, 0), INST(kX86InstDivSS , "divss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5E, 0), INST(kX86InstDpPD , "dppd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A41, 0), INST(kX86InstDpPS , "dpps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A40, 0), INST(kX86InstEmms , "emms" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000F77, 0), INST(kX86InstEnter , "enter" , G(Enter) , F(Special) , 0 , 0 , 0, 0x000000C8, 0), INST(kX86InstExtractPS , "extractps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A17, 0), INST(kX86InstF2XM1 , "f2xm1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F0, 0), INST(kX86InstFAbs , "fabs" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E1, 0), INST(kX86InstFAdd , "fadd" , G(X87StM) , F(Fpu) , 0 , 0 , 0, 0xD8DCC0C0, 0), INST(kX86InstFAddP , "faddp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEC0, 0), INST(kX86InstFBLd , "fbld" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000DF, 0), INST(kX86InstFBStP , "fbstp" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000DF, 0), INST(kX86InstFCHS , "fchs" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E0, 0), INST(kX86InstFClex , "fclex" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x9B00DBE2, 0), INST(kX86InstFCMovB , "fcmovb" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAC0, 0), INST(kX86InstFCMovBE , "fcmovbe" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAD0, 0), INST(kX86InstFCMovE , "fcmove" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAC8, 0), INST(kX86InstFCMovNB , "fcmovnb" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBC0, 0), INST(kX86InstFCMovNBE , "fcmovnbe" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBD0, 0), INST(kX86InstFCMovNE , "fcmovne" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBC8, 0), INST(kX86InstFCMovNU , "fcmovnu" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBD8, 0), INST(kX86InstFCMovU , "fcmovu" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAD8, 0), INST(kX86InstFCom , "fcom" , G(X87StM) , F(Fpu) , 0 , 0 , 2, 0xD8DCD0D0, 0), INST(kX86InstFComI , "fcomi" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBF0, 0), INST(kX86InstFComIP , "fcomip" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DFF0, 0), INST(kX86InstFComP , "fcomp" , G(X87StM) , F(Fpu) , 0 , 0 , 3, 0xD8DCD8D8, 0), INST(kX86InstFComPP , "fcompp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DED9, 0), INST(kX86InstFCos , "fcos" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FF, 0), INST(kX86InstFDecStP , "fdecstp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F6, 0), INST(kX86InstFDiv , "fdiv" , G(X87StM) , F(Fpu) , 0 , 0 , 6, 0xD8DCF0F8, 0), INST(kX86InstFDivP , "fdivp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEF8, 0), INST(kX86InstFDivR , "fdivr" , G(X87StM) , F(Fpu) , 0 , 0 , 7, 0xD8DCF8F0, 0), INST(kX86InstFDivRP , "fdivrp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEF0, 0), INST(kX86InstFEmms , "femms" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x00000F0E, 0), INST(kX86InstFFree , "ffree" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDC0, 0), INST(kX86InstFIAdd , "fiadd" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 0, 0xDEDA0000, 0), INST(kX86InstFICom , "ficom" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 2, 0xDEDA0000, 0), INST(kX86InstFIComP , "ficomp" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 3, 0xDEDA0000, 0), INST(kX86InstFIDiv , "fidiv" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 6, 0xDEDA0000, 0), INST(kX86InstFIDivR , "fidivr" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 7, 0xDEDA0000, 0), INST(kX86InstFILd , "fild" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 0, 0xDFDBDF05, 0), INST(kX86InstFIMul , "fimul" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 1, 0xDEDA0000, 0), INST(kX86InstFIncStP , "fincstp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F7, 0), INST(kX86InstFInit , "finit" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x9B00DBE3, 0), INST(kX86InstFISt , "fist" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 2, 0xDFDB0000, 0), INST(kX86InstFIStP , "fistp" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 3, 0xDFDBDF07, 0), INST(kX86InstFISttP , "fisttp" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 1, 0xDFDBDD01, 0), INST(kX86InstFISub , "fisub" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 4, 0xDEDA0000, 0), INST(kX86InstFISubR , "fisubr" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 5, 0xDEDA0000, 0), INST(kX86InstFLd , "fld" , G(X87FldFst) , F(Fpu) , O(StM4_8_10) , 0 , 0, 0x00D9DD00, 0xD9C0DB05), INST(kX86InstFLd1 , "fld1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E8, 0), INST(kX86InstFLdCw , "fldcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 5, 0x000000D9, 0), INST(kX86InstFLdEnv , "fldenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000D9, 0), INST(kX86InstFLdL2E , "fldl2e" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EA, 0), INST(kX86InstFLdL2T , "fldl2t" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E9, 0), INST(kX86InstFLdLg2 , "fldlg2" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EC, 0), INST(kX86InstFLdLn2 , "fldln2" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9ED, 0), INST(kX86InstFLdPi , "fldpi" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EB, 0), INST(kX86InstFLdZ , "fldz" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EE, 0), INST(kX86InstFMul , "fmul" , G(X87StM) , F(Fpu) , 0 , 0 , 1, 0xD8DCC8C8, 0), INST(kX86InstFMulP , "fmulp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEC8, 0), INST(kX86InstFNClex , "fnclex" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DBE2, 0), INST(kX86InstFNInit , "fninit" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DBE3, 0), INST(kX86InstFNop , "fnop" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9D0, 0), INST(kX86InstFNSave , "fnsave" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000DD, 0), INST(kX86InstFNStCw , "fnstcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 7, 0x000000D9, 0), INST(kX86InstFNStEnv , "fnstenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000D9, 0), INST(kX86InstFNStSw , "fnstsw" , G(X87Status) , F(Fpu) , O(Mem) , 0 , 7, 0x000000DD, 0x0000DFE0), INST(kX86InstFPAtan , "fpatan" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F3, 0), INST(kX86InstFPRem , "fprem" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F8, 0), INST(kX86InstFPRem1 , "fprem1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F5, 0), INST(kX86InstFPTan , "fptan" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F2, 0), INST(kX86InstFRndInt , "frndint" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FC, 0), INST(kX86InstFRstor , "frstor" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000DD, 0), INST(kX86InstFSave , "fsave" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x9B0000DD, 0), INST(kX86InstFScale , "fscale" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FD, 0), INST(kX86InstFSin , "fsin" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FE, 0), INST(kX86InstFSinCos , "fsincos" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FB, 0), INST(kX86InstFSqrt , "fsqrt" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FA, 0), INST(kX86InstFSt , "fst" , G(X87FldFst) , F(Fpu) , O(StM4_8) , 0 , 2, 0x00D9DD02, 0xDDD00000), INST(kX86InstFStCw , "fstcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 7, 0x9B0000D9, 0), INST(kX86InstFStEnv , "fstenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x9B0000D9, 0), INST(kX86InstFStP , "fstp" , G(X87FldFst) , F(Fpu) , O(StM4_8_10) , 0 , 3, 0x00D9DD03, 0xDDD8DB07), INST(kX86InstFStSw , "fstsw" , G(X87Status) , F(Fpu) , O(Mem) , 0 , 7, 0x9B0000DD, 0x9B00DFE0), INST(kX86InstFSub , "fsub" , G(X87StM) , F(Fpu) , 0 , 0 , 4, 0xD8DCE0E8, 0), INST(kX86InstFSubP , "fsubp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEE8, 0), INST(kX86InstFSubR , "fsubr" , G(X87StM) , F(Fpu) , 0 , 0 , 5, 0xD8DCE8E0, 0), INST(kX86InstFSubRP , "fsubrp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEE0, 0), INST(kX86InstFTst , "ftst" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E4, 0), INST(kX86InstFUCom , "fucom" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDE0, 0), INST(kX86InstFUComI , "fucomi" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBE8, 0), INST(kX86InstFUComIP , "fucomip" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DFE8, 0), INST(kX86InstFUComP , "fucomp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDE8, 0), INST(kX86InstFUComPP , "fucompp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DAE9, 0), INST(kX86InstFWait , "fwait" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x000000DB, 0), INST(kX86InstFXam , "fxam" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E5, 0), INST(kX86InstFXch , "fxch" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000D9C8, 0), INST(kX86InstFXRstor , "fxrstor" , G(Mem) , F(Fpu) , 0 , 0 , 1, 0x00000FAE, 0), INST(kX86InstFXSave , "fxsave" , G(Mem) , F(Fpu) , 0 , 0 , 0, 0x00000FAE, 0), INST(kX86InstFXtract , "fxtract" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F4, 0), INST(kX86InstFYL2X , "fyl2x" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F1, 0), INST(kX86InstFYL2XP1 , "fyl2xp1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F9, 0), INST(kX86InstHAddPD , "haddpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F7C, 0), INST(kX86InstHAddPS , "haddps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F7C, 0), INST(kX86InstHSubPD , "hsubpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F7D, 0), INST(kX86InstHSubPS , "hsubps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F7D, 0), INST(kX86InstIDiv , "idiv" , G(Rm) , F(Special) , 0 , 0 , 7, 0x000000F6, 0), INST(kX86InstIMul , "imul" , G(IMul) , F(Special) , 0 , 0 , 0, 0 , 0), INST(kX86InstInc , "inc" , G(IncDec) , F(Lockable) , O(GqdwbMem) , 0 , 0, 0x00000040, 0x000000FE), INST(kX86InstInt3 , "int3" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000CC, 0), INST(kX86InstJA , "ja" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x7 , 0), INST(kX86InstJAE , "jae" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), INST(kX86InstJB , "jb" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), INST(kX86InstJBE , "jbe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x6 , 0), INST(kX86InstJC , "jc" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), INST(kX86InstJE , "je" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x4 , 0), INST(kX86InstJG , "jg" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xF , 0), INST(kX86InstJGE , "jge" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xD , 0), INST(kX86InstJL , "jl" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xC , 0), INST(kX86InstJLE , "jle" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xE , 0), INST(kX86InstJNA , "jna" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x6 , 0), INST(kX86InstJNAE , "jnae" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), INST(kX86InstJNB , "jnb" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), INST(kX86InstJNBE , "jnbe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x7 , 0), INST(kX86InstJNC , "jnc" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), INST(kX86InstJNE , "jne" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x5 , 0), INST(kX86InstJNG , "jng" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xE , 0), INST(kX86InstJNGE , "jnge" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xC , 0), INST(kX86InstJNL , "jnl" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xD , 0), INST(kX86InstJNLE , "jnle" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xF , 0), INST(kX86InstJNO , "jno" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x1 , 0), INST(kX86InstJNP , "jnp" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xB , 0), INST(kX86InstJNS , "jns" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x9 , 0), INST(kX86InstJNZ , "jnz" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x5 , 0), INST(kX86InstJO , "jo" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x0 , 0), INST(kX86InstJP , "jp" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xA , 0), INST(kX86InstJPE , "jpe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xA , 0), INST(kX86InstJPO , "jpo" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xB , 0), INST(kX86InstJS , "js" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x8 , 0), INST(kX86InstJZ , "jz" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x4 , 0), INST(kX86InstJmp , "jmp" , G(Jmp) , F(Jump) , 0 , 0 , 0, 0 , 0), INST(kX86InstLdDQU , "lddqu" , G(MmuRmI) , F(None) , O(Xmm) , O(Mem) , 0, 0xF2000FF0, 0), INST(kX86InstLdMXCSR , "ldmxcsr" , G(Mem) , F(None) , O(Mem) , 0 , 2, 0x00000FAE, 0), INST(kX86InstLahf , "lahf" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009F, 0), INST(kX86InstLea , "lea" , G(Lea) , F(None) , O(Gqd) , O(Mem) , 0, 0 , 0), INST(kX86InstLeave , "leave" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000000C9, 0), INST(kX86InstLFence , "lfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEE8, 0), INST(kX86InstMaskMovDQU , "maskmovdqu" , G(MmuRmI) , F(Special) , O(Xmm) , O(Xmm) , 0, 0x66000F57, 0), INST(kX86InstMaskMovQ , "maskmovq" , G(MmuRmI) , F(Special) , O(Mm) , O(Mm) , 0, 0x00000FF7, 0), INST(kX86InstMaxPD , "maxpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5F, 0), INST(kX86InstMaxPS , "maxps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5F, 0), INST(kX86InstMaxSD , "maxsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5F, 0), INST(kX86InstMaxSS , "maxss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5F, 0), INST(kX86InstMFence , "mfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEF0, 0), INST(kX86InstMinPD , "minpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5D, 0), INST(kX86InstMinPS , "minps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5D, 0), INST(kX86InstMinSD , "minsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5D, 0), INST(kX86InstMinSS , "minss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5D, 0), INST(kX86InstMonitor , "monitor" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01C8, 0), INST(kX86InstMov , "mov" , G(Mov) , F(Mov) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 0, 0 , 0), INST(kX86InstMovAPD , "movapd" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F28, 0x66000F29), INST(kX86InstMovAPS , "movaps" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x00000F28, 0x00000F29), INST(kX86InstMovBE , "movbe" , G(MovBE) , F(Mov) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Mem) , 0, 0x000F38F0, 0x000F38F1), INST(kX86InstMovD , "movd" , G(MmuMovD) , F(Mov) , O(Gd)|O(MmXmmMem) , O(Gd)|O(MmXmmMem) , 0, 0 , 0), INST(kX86InstMovDDup , "movddup" , G(MmuMov) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000F12, 0), INST(kX86InstMovDQ2Q , "movdq2q" , G(MmuMov) , F(Mov) , O(Mm) , O(Xmm) , 0, 0xF2000FD6, 0), INST(kX86InstMovDQA , "movdqa" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F6F, 0x66000F7F), INST(kX86InstMovDQU , "movdqu" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0xF3000F6F, 0xF3000F7F), INST(kX86InstMovHLPS , "movhlps" , G(MmuMov) , F(None) , O(Xmm) , O(Xmm) , 0, 0x00000F12, 0), INST(kX86InstMovHPD , "movhpd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x66000F16, 0x66000F17), INST(kX86InstMovHPS , "movhps" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x00000F16, 0x00000F17), INST(kX86InstMovLHPS , "movlhps" , G(MmuMov) , F(None) , O(Xmm) , O(Xmm) , 0, 0x00000F16, 0), INST(kX86InstMovLPD , "movlpd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x66000F12, 0x66000F13), INST(kX86InstMovLPS , "movlps" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x00000F12, 0x00000F13), INST(kX86InstMovMskPD , "movmskpd" , G(MmuMov) , F(Mov) , O(Gqd)|O(NoRex) , O(Xmm) , 0, 0x66000F50, 0), INST(kX86InstMovMskPS , "movmskps" , G(MmuMov) , F(Mov) , O(Gqd)|O(NoRex) , O(Xmm) , 0, 0x00000F50, 0), INST(kX86InstMovNTDQ , "movntdq" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x66000FE7), INST(kX86InstMovNTDQA , "movntdqa" , G(MmuMov) , F(Mov) , O(Xmm) , O(Mem) , 0, 0x660F382A, 0), INST(kX86InstMovNTI , "movnti" , G(MmuMov) , F(Mov) , O(Mem) , O(Gqd) , 0, 0 , 0x00000FC3), INST(kX86InstMovNTPD , "movntpd" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x66000F2B), INST(kX86InstMovNTPS , "movntps" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x00000F2B), INST(kX86InstMovNTQ , "movntq" , G(MmuMov) , F(None) , O(Mem) , O(Mm) , 0, 0 , 0x00000FE7), INST(kX86InstMovQ , "movq" , G(MmuMovQ) , F(Mov) , O(Gq)|O(MmXmmMem) , O(Gq)|O(MmXmmMem) , 0, 0 , 0), INST(kX86InstMovQ2DQ , "movq2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(Mm) , 0, 0xF3000FD6, 0), INST(kX86InstMovSD , "movsd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0xF2000F10, 0xF2000F11), INST(kX86InstMovSHDup , "movshdup" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F16, 0), INST(kX86InstMovSLDup , "movsldup" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F12, 0), INST(kX86InstMovSS , "movss" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0xF3000F10, 0xF3000F11), INST(kX86InstMovSX , "movsx" , G(MovSxMovZx) , F(None) , O(Gqdw) , O(GwbMem) , 0, 0x00000FBE, 0), INST(kX86InstMovSXD , "movsxd" , G(MovSxD) , F(None) , O(Gq) , O(GdMem) , 0, 0 , 0), INST(kX86InstMovUPD , "movupd" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F10, 0x66000F11), INST(kX86InstMovUPS , "movups" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x00000F10, 0x00000F11), INST(kX86InstMovZX , "movzx" , G(MovSxMovZx) , F(Mov) , O(Gqdw) , O(GwbMem) , 0, 0x00000FB6, 0), INST(kX86InstMovPtr , "mov_ptr" , G(MovPtr) , F(Mov)|F(Special), O(Gqdwb) , O(Imm) , 0, 0 , 0), INST(kX86InstMPSADBW , "mpsadbw" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A42, 0), INST(kX86InstMul , "mul" , G(Rm) , F(Special) , 0 , 0 , 4, 0x000000F6, 0), INST(kX86InstMulPD , "mulpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F59, 0), INST(kX86InstMulPS , "mulps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F59, 0), INST(kX86InstMulSD , "mulsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F59, 0), INST(kX86InstMulSS , "mulss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F59, 0), INST(kX86InstMWait , "mwait" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01C9, 0), INST(kX86InstNeg , "neg" , G(Rm) , F(Lockable) , O(GqdwbMem) , 0 , 3, 0x000000F6, 0), INST(kX86InstNop , "nop" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000090, 0), INST(kX86InstNot , "not" , G(Rm) , F(Lockable) , O(GqdwbMem) , 0 , 2, 0x000000F6, 0), INST(kX86InstOr , "or" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 1, 0x00000008, 0x00000080), INST(kX86InstOrPD , "orpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F56, 0), INST(kX86InstOrPS , "orps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F56, 0), INST(kX86InstPAbsB , "pabsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381C, 0), INST(kX86InstPAbsD , "pabsd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381E, 0), INST(kX86InstPAbsW , "pabsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381D, 0), INST(kX86InstPackSSDW , "packssdw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F6B, 0), INST(kX86InstPackSSWB , "packsswb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F63, 0), INST(kX86InstPackUSDW , "packusdw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F382B, 0), INST(kX86InstPackUSWB , "packuswb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F67, 0), INST(kX86InstPAddB , "paddb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFC, 0), INST(kX86InstPAddD , "paddd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFE, 0), INST(kX86InstPAddQ , "paddq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD4, 0), INST(kX86InstPAddSB , "paddsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEC, 0), INST(kX86InstPAddSW , "paddsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FED, 0), INST(kX86InstPAddUSB , "paddusb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDC, 0), INST(kX86InstPAddUSW , "paddusw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDD, 0), INST(kX86InstPAddW , "paddw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFD, 0), INST(kX86InstPAlignR , "palignr" , G(MmuRmImm8) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3A0F, 0), INST(kX86InstPAnd , "pand" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDB, 0), INST(kX86InstPAndN , "pandn" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDF, 0), INST(kX86InstPause , "pause" , G(Emit) , F(None) , 0 , 0 , 0, 0xF3000090, 0), INST(kX86InstPAvgB , "pavgb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE0, 0), INST(kX86InstPAvgW , "pavgw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE3, 0), INST(kX86InstPBlendVB , "pblendvb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3810, 0), INST(kX86InstPBlendW , "pblendw" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0E, 0), INST(kX86InstPCmpEqB , "pcmpeqb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F74, 0), INST(kX86InstPCmpEqD , "pcmpeqd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F76, 0), INST(kX86InstPCmpEqQ , "pcmpeqq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3829, 0), INST(kX86InstPCmpEqW , "pcmpeqw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F75, 0), INST(kX86InstPCmpEStrI , "pcmpestri" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A61, 0), INST(kX86InstPCmpEStrM , "pcmpestrm" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A60, 0), INST(kX86InstPCmpGtB , "pcmpgtb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F64, 0), INST(kX86InstPCmpGtD , "pcmpgtd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F66, 0), INST(kX86InstPCmpGtQ , "pcmpgtq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3837, 0), INST(kX86InstPCmpGtW , "pcmpgtw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F65, 0), INST(kX86InstPCmpIStrI , "pcmpistri" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A63, 0), INST(kX86InstPCmpIStrM , "pcmpistrm" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A62, 0), INST(kX86InstPExtrB , "pextrb" , G(MmuExtract) , F(None) , O(Gd)|O(Gb)|O(Mem) , O(Xmm) , 0, 0x000F3A14, 0), INST(kX86InstPExtrD , "pextrd" , G(MmuExtract) , F(None) , O(Gd) |O(Mem) , O(Xmm) , 0, 0x000F3A16, 0), INST(kX86InstPExtrQ , "pextrq" , G(MmuExtract) , F(None) , O(Gqd) |O(Mem) , O(Xmm) , 1, 0x000F3A16, 0), INST(kX86InstPExtrW , "pextrw" , G(MmuExtract) , F(None) , O(Gd) |O(Mem) , O(MmXmm) , 0, 0x000F3A15, 0), INST(kX86InstPF2ID , "pf2id" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x1D), INST(kX86InstPF2IW , "pf2iw" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x1C), INST(kX86InstPFAcc , "pfacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xAE), INST(kX86InstPFAdd , "pfadd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x9E), INST(kX86InstPFCmpEQ , "pfcmpeq" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB0), INST(kX86InstPFCmpGE , "pfcmpge" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x90), INST(kX86InstPFCmpGT , "pfcmpgt" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA0), INST(kX86InstPFMax , "pfmax" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA4), INST(kX86InstPFMin , "pfmin" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x94), INST(kX86InstPFMul , "pfmul" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB4), INST(kX86InstPFNAcc , "pfnacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x8A), INST(kX86InstPFPNAcc , "pfpnacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x8E), INST(kX86InstPFRcp , "pfrcp" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x96), INST(kX86InstPFRcpIt1 , "pfrcpit1" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA6), INST(kX86InstPFRcpIt2 , "pfrcpit2" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB6), INST(kX86InstPFRSqIt1 , "pfrsqit1" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA7), INST(kX86InstPFRSqrt , "pfrsqrt" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x97), INST(kX86InstPFSub , "pfsub" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x9A), INST(kX86InstPFSubR , "pfsubr" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xAA), INST(kX86InstPHAddD , "phaddd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3802, 0), INST(kX86InstPHAddSW , "phaddsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3803, 0), INST(kX86InstPHAddW , "phaddw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3801, 0), INST(kX86InstPHMinPOSUW , "phminposuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3841, 0), INST(kX86InstPHSubD , "phsubd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3806, 0), INST(kX86InstPHSubSW , "phsubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3807, 0), INST(kX86InstPHSubW , "phsubw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3805, 0), INST(kX86InstPI2FD , "pi2fd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x0D), INST(kX86InstPI2FW , "pi2fw" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x0C), INST(kX86InstPInsRB , "pinsrb" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gd) | O(Mem) , 0, 0x660F3A20, 0), INST(kX86InstPInsRD , "pinsrd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gd) | O(Mem) , 0, 0x660F3A22, 0), INST(kX86InstPInsRQ , "pinsrq" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gq) | O(Mem) , 0, 0x660F3A22, 0), INST(kX86InstPInsRW , "pinsrw" , G(MmuRmImm8) , F(None) , O(MmXmm) , O(Gd) | O(Mem) , 0, 0x00000FC4, 0), INST(kX86InstPMAddUBSW , "pmaddubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3804, 0), INST(kX86InstPMAddWD , "pmaddwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF5, 0), INST(kX86InstPMaxSB , "pmaxsb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383C, 0), INST(kX86InstPMaxSD , "pmaxsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383D, 0), INST(kX86InstPMaxSW , "pmaxsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEE, 0), INST(kX86InstPMaxUB , "pmaxub" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDE, 0), INST(kX86InstPMaxUD , "pmaxud" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383F, 0), INST(kX86InstPMaxUW , "pmaxuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383E, 0), INST(kX86InstPMinSB , "pminsb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3838, 0), INST(kX86InstPMinSD , "pminsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3839, 0), INST(kX86InstPMinSW , "pminsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEA, 0), INST(kX86InstPMinUB , "pminub" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDA, 0), INST(kX86InstPMinUD , "pminud" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383B, 0), INST(kX86InstPMinUW , "pminuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383A, 0), INST(kX86InstPMovMskB , "pmovmskb" , G(MmuRmI) , F(Mov) , O(Gqd) , O(MmXmm) , 0, 0x00000FD7, 0), INST(kX86InstPMovSXBD , "pmovsxbd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3821, 0), INST(kX86InstPMovSXBQ , "pmovsxbq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3822, 0), INST(kX86InstPMovSXBW , "pmovsxbw" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3820, 0), INST(kX86InstPMovSXDQ , "pmovsxdq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3825, 0), INST(kX86InstPMovSXWD , "pmovsxwd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3823, 0), INST(kX86InstPMovSXWQ , "pmovsxwq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3824, 0), INST(kX86InstPMovZXBD , "pmovzxbd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3831, 0), INST(kX86InstPMovZXBQ , "pmovzxbq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3832, 0), INST(kX86InstPMovZXBW , "pmovzxbw" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3830, 0), INST(kX86InstPMovZXDQ , "pmovzxdq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3835, 0), INST(kX86InstPMovZXWD , "pmovzxwd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3833, 0), INST(kX86InstPMovZXWQ , "pmovzxwq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3834, 0), INST(kX86InstPMulDQ , "pmuldq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3828, 0), INST(kX86InstPMulHRSW , "pmulhrsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F380B, 0), INST(kX86InstPMulHUW , "pmulhuw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE4, 0), INST(kX86InstPMulHW , "pmulhw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE5, 0), INST(kX86InstPMulLD , "pmulld" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3840, 0), INST(kX86InstPMulLW , "pmullw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD5, 0), INST(kX86InstPMulUDQ , "pmuludq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF4, 0), INST(kX86InstPop , "pop" , G(Pop) , F(Special) , 0 , 0 , 0, 0x00000058, 0x0000008F), INST(kX86InstPopAD , "popad" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000061, 0), INST(kX86InstPopCnt , "popcnt" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0xF3000FB8, 0), INST(kX86InstPopFD , "popfd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009D, 0), INST(kX86InstPopFQ , "popfq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009D, 0), INST(kX86InstPOr , "por" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEB, 0), INST(kX86InstPrefetch , "prefetch" , G(MmuPrefetch) , F(None) , O(Mem) , O(Imm) , 0, 0 , 0), INST(kX86InstPSADBW , "psadbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF6, 0), INST(kX86InstPShufB , "pshufb" , G(MmuRmI) , F(Mov) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3800, 0), INST(kX86InstPShufD , "pshufd" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F70, 0), INST(kX86InstPShufW , "pshufw" , G(MmuRmImm8) , F(Mov) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F70, 0), INST(kX86InstPShufHW , "pshufhw" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F70, 0), INST(kX86InstPShufLW , "pshuflw" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000F70, 0), INST(kX86InstPSignB , "psignb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3808, 0), INST(kX86InstPSignD , "psignd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F380A, 0), INST(kX86InstPSignW , "psignw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3809, 0), INST(kX86InstPSllD , "pslld" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF2, 0x00000F72), INST(kX86InstPSllDQ , "pslldq" , G(MmuRmI) , F(None) , O(Xmm) , O(Imm) , 7, 0 , 0x66000F73), INST(kX86InstPSllQ , "psllq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF3, 0x00000F73), INST(kX86InstPSllW , "psllw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF1, 0x00000F71), INST(kX86InstPSraD , "psrad" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 4, 0x00000FE2, 0x00000F72), INST(kX86InstPSraW , "psraw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 4, 0x00000FE1, 0x00000F71), INST(kX86InstPSrlD , "psrld" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD2, 0x00000F72), INST(kX86InstPSrlDQ , "psrldq" , G(MmuRmI) , F(None) , O(Xmm) , O(Imm) , 3, 0 , 0x66000F73), INST(kX86InstPSrlQ , "psrlq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD3, 0x00000F73), INST(kX86InstPSrlW , "psrlw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD1, 0x00000F71), INST(kX86InstPSubB , "psubb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF8, 0), INST(kX86InstPSubD , "psubd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFA, 0), INST(kX86InstPSubQ , "psubq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFB, 0), INST(kX86InstPSubSB , "psubsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE8, 0), INST(kX86InstPSubSW , "psubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE9, 0), INST(kX86InstPSubUSB , "psubusb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD8, 0), INST(kX86InstPSubUSW , "psubusw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD9, 0), INST(kX86InstPSubW , "psubw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF9, 0), INST(kX86InstPSwapD , "pswapd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xBB), INST(kX86InstPTest , "ptest" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3817, 0), INST(kX86InstPunpckHBW , "punpckhbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F68, 0), INST(kX86InstPunpckHDQ , "punpckhdq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F6A, 0), INST(kX86InstPunpckHQDQ , "punpckhqdq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F6D, 0), INST(kX86InstPunpckHWD , "punpckhwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F69, 0), INST(kX86InstPunpckLBW , "punpcklbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F60, 0), INST(kX86InstPunpckLDQ , "punpckldq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F62, 0), INST(kX86InstPunpckLQDQ , "punpcklqdq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F6C, 0), INST(kX86InstPunpckLWD , "punpcklwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F61, 0), INST(kX86InstPush , "push" , G(Push) , F(Special) , 0 , 0 , 6, 0x00000050, 0x000000FF), INST(kX86InstPushAD , "pushad" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000060, 0), INST(kX86InstPushFD , "pushfd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009C, 0), INST(kX86InstPushFQ , "pushfq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009C, 0), INST(kX86InstPXor , "pxor" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEF, 0), INST(kX86InstRcl , "rcl" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 2, 0 , 0), INST(kX86InstRcpPS , "rcpps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F53, 0), INST(kX86InstRcpSS , "rcpss" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F53, 0), INST(kX86InstRcr , "rcr" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 3, 0 , 0), INST(kX86InstRdtsc , "rdtsc" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000F31, 0), INST(kX86InstRdtscP , "rdtscp" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01F9, 0), INST(kX86InstRepLodSB , "rep lodsb" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 1 /* Size of mem */), INST(kX86InstRepLodSD , "rep lodsd" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 4 /* Size of mem */), INST(kX86InstRepLodSQ , "rep lodsq" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 8 /* Size of mem */), INST(kX86InstRepLodSW , "rep lodsw" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 2 /* Size of mem */), INST(kX86InstRepMovSB , "rep movsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 1 /* Size of mem */), INST(kX86InstRepMovSD , "rep movsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 4 /* Size of mem */), INST(kX86InstRepMovSQ , "rep movsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 8 /* Size of mem */), INST(kX86InstRepMovSW , "rep movsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 2 /* Size of mem */), INST(kX86InstRepStoSB , "rep stosb" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 1 /* Size of mem */), INST(kX86InstRepStoSD , "rep stosd" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 4 /* Size of mem */), INST(kX86InstRepStoSQ , "rep stosq" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 8 /* Size of mem */), INST(kX86InstRepStoSW , "rep stosw" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 2 /* Size of mem */), INST(kX86InstRepECmpSB , "repe cmpsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 1 /* Size of mem */), INST(kX86InstRepECmpSD , "repe cmpsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 4 /* Size of mem */), INST(kX86InstRepECmpSQ , "repe cmpsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 8 /* Size of mem */), INST(kX86InstRepECmpSW , "repe cmpsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 2 /* Size of mem */), INST(kX86InstRepEScaSB , "repe scasb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 1 /* Size of mem */), INST(kX86InstRepEScaSD , "repe scasd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 4 /* Size of mem */), INST(kX86InstRepEScaSQ , "repe scasq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 8 /* Size of mem */), INST(kX86InstRepEScaSW , "repe scasw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 2 /* Size of mem */), INST(kX86InstRepNECmpSB , "repne cmpsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 1 /* Size of mem */), INST(kX86InstRepNECmpSD , "repne cmpsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 4 /* Size of mem */), INST(kX86InstRepNECmpSQ , "repne cmpsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 8 /* Size of mem */), INST(kX86InstRepNECmpSW , "repne cmpsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 2 /* Size of mem */), INST(kX86InstRepNEScaSB , "repne scasb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 1 /* Size of mem */), INST(kX86InstRepNEScaSD , "repne scasd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 4 /* Size of mem */), INST(kX86InstRepNEScaSQ , "repne scasq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 8 /* Size of mem */), INST(kX86InstRepNEScaSW , "repne scasw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 2 /* Size of mem */), INST(kX86InstRet , "ret" , G(Ret) , F(Special) , 0 , 0 , 0, 0 , 0), INST(kX86InstRol , "rol" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 0, 0 , 0), INST(kX86InstRor , "ror" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 1, 0 , 0), INST(kX86InstRoundPD , "roundpd" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3A09, 0), INST(kX86InstRoundPS , "roundps" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3A08, 0), INST(kX86InstRoundSD , "roundsd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0B, 0), INST(kX86InstRoundSS , "roundss" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0A, 0), INST(kX86InstRSqrtPS , "rsqrtps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F52, 0), INST(kX86InstRSqrtSS , "rsqrtss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F52, 0), INST(kX86InstSahf , "sahf" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009E, 0), INST(kX86InstSal , "sal" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 4, 0 , 0), INST(kX86InstSar , "sar" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 7, 0 , 0), INST(kX86InstSbb , "sbb" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 3, 0x00000018, 0x00000080), INST(kX86InstSetA , "seta" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F97, 0), INST(kX86InstSetAE , "setae" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), INST(kX86InstSetB , "setb" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), INST(kX86InstSetBE , "setbe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F96, 0), INST(kX86InstSetC , "setc" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), INST(kX86InstSetE , "sete" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F94, 0), INST(kX86InstSetG , "setg" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9F, 0), INST(kX86InstSetGE , "setge" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9D, 0), INST(kX86InstSetL , "setl" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9C, 0), INST(kX86InstSetLE , "setle" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9E, 0), INST(kX86InstSetNA , "setna" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F96, 0), INST(kX86InstSetNAE , "setnae" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), INST(kX86InstSetNB , "setnb" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), INST(kX86InstSetNBE , "setnbe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F97, 0), INST(kX86InstSetNC , "setnc" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), INST(kX86InstSetNE , "setne" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F95, 0), INST(kX86InstSetNG , "setng" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9E, 0), INST(kX86InstSetNGE , "setnge" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9C, 0), INST(kX86InstSetNL , "setnl" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9D, 0), INST(kX86InstSetNLE , "setnle" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9F, 0), INST(kX86InstSetNO , "setno" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F91, 0), INST(kX86InstSetNP , "setnp" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9B, 0), INST(kX86InstSetNS , "setns" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F99, 0), INST(kX86InstSetNZ , "setnz" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F95, 0), INST(kX86InstSetO , "seto" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F90, 0), INST(kX86InstSetP , "setp" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9A, 0), INST(kX86InstSetPE , "setpe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9A, 0), INST(kX86InstSetPO , "setpo" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9B, 0), INST(kX86InstSetS , "sets" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F98, 0), INST(kX86InstSetZ , "setz" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F94, 0), INST(kX86InstSFence , "sfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEF8, 0), INST(kX86InstShl , "shl" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 4, 0 , 0), INST(kX86InstShld , "shld" , G(ShldShrd) , F(Special) , O(GqdwbMem) , O(Gb) , 0, 0x00000FA4, 0), INST(kX86InstShr , "shr" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 5, 0 , 0), INST(kX86InstShrd , "shrd" , G(ShldShrd) , F(Special) , O(GqdwbMem) , O(Gqdwb) , 0, 0x00000FAC, 0), INST(kX86InstShufPD , "shufpd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FC6, 0), INST(kX86InstShufPS , "shufps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000FC6, 0), INST(kX86InstSqrtPD , "sqrtpd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F51, 0), INST(kX86InstSqrtPS , "sqrtps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F51, 0), INST(kX86InstSqrtSD , "sqrtsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F51, 0), INST(kX86InstSqrtSS , "sqrtss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F51, 0), INST(kX86InstStc , "stc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F9, 0), INST(kX86InstStd , "std" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000FD, 0), INST(kX86InstStMXCSR , "stmxcsr" , G(Mem) , F(None) , O(Mem) , 0 , 3, 0x00000FAE, 0), INST(kX86InstSub , "sub" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 5, 0x00000028, 0x00000080), INST(kX86InstSubPD , "subpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5C, 0), INST(kX86InstSubPS , "subps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5C, 0), INST(kX86InstSubSD , "subsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5C, 0), INST(kX86InstSubSS , "subss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5C, 0), INST(kX86InstTest , "test" , G(Test) , F(None) , O(GqdwbMem) , O(Gqdwb)|O(Imm) , 0, 0 , 0), INST(kX86InstUComISD , "ucomisd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F2E, 0), INST(kX86InstUComISS , "ucomiss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F2E, 0), INST(kX86InstUd2 , "ud2" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000F0B, 0), INST(kX86InstUnpckHPD , "unpckhpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F15, 0), INST(kX86InstUnpckHPS , "unpckhps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F15, 0), INST(kX86InstUnpckLPD , "unpcklpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F14, 0), INST(kX86InstUnpckLPS , "unpcklps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F14, 0), INST(kX86InstXadd , "xadd" , G(RmReg) , F(Lockable) , O(GqdwbMem) , O(Gqdwb) , 0, 0x00000FC0, 0), INST(kX86InstXchg , "xchg" , G(Xchg) , F(Lockable) , O(GqdwbMem) , O(Gqdwb) , 0, 0 , 0), INST(kX86InstXor , "xor" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 6, 0x00000030, 0x00000080), INST(kX86InstXorPD , "xorpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F57, 0), INST(kX86InstXorPS , "xorps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F57, 0) }; #undef G #undef F #undef O #undef INST // ============================================================================ // [AsmJit::x86VarInfo] // ============================================================================ #define C(_Class_) kX86VarClass##_Class_ #define F(_Flag_) kX86VarFlag##_Flag_ const X86VarInfo x86VarInfo[] = { /* 0 */ { kX86RegTypeGpd , 4 , C(Gp) , 0 , "Gpd" }, /* 1 */ { kX86RegTypeGpq , 8 , C(Gp) , 0 , "Gpq" }, /* 2 */ { kX86RegTypeX87 , 4 , C(X87), F(SP) , "X87" }, /* 3 */ { kX86RegTypeX87 , 4 , C(X87), F(SP) , "X87.SS" }, /* 4 */ { kX86RegTypeX87 , 8 , C(X87), F(DP) , "X87.SD" }, /* 5 */ { kX86RegTypeMm , 8 , C(Mm) , 0 , "Mm" }, /* 6 */ { kX86RegTypeXmm , 16, C(Xmm), 0 , "Xmm" }, /* 7 */ { kX86RegTypeXmm , 4 , C(Xmm), F(SP) , "Xmm.SS" }, /* 8 */ { kX86RegTypeXmm , 8 , C(Xmm), F(DP) , "Xmm.SD" }, /* 9 */ { kX86RegTypeXmm , 16, C(Xmm), F(SP) | F(Packed), "Xmm.PS" }, /* 10 */ { kX86RegTypeXmm , 16, C(Xmm), F(DP) | F(Packed), "Xmm.PD" } }; #undef F #undef C } // AsmJit namespace #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/0000755000175000017500000000000012140305317017764 5ustar guillaumeguillaumedesmume-0.9.9/src/utils/AsmJit/core/logger.h0000644000175000017500000002055312140261627021426 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_LOGGER_H #define _ASMJIT_CORE_LOGGER_H // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/defs.h" #include "../core/stringbuilder.h" // [Dependencies - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Logging //! @{ // ============================================================================ // [AsmJit::Logger] // ============================================================================ //! @brief Abstract logging class. //! //! This class can be inherited and reimplemented to fit into your logging //! subsystem. When reimplementing use @c AsmJit::Logger::log() method to //! log into your stream. //! //! This class also contain @c _enabled member that can be used to enable //! or disable logging. struct Logger { ASMJIT_NO_COPY(Logger) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create logger. ASMJIT_API Logger(); //! @brief Destroy logger. ASMJIT_API virtual ~Logger(); // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- //! @brief Abstract method to log output. //! //! Default implementation that is in @c AsmJit::Logger is to do nothing. //! It's virtual to fit to your logging system. virtual void logString(const char* buf, size_t len = kInvalidSize) = 0; //! @brief Log formatter message (like sprintf) sending output to @c logString() method. ASMJIT_API virtual void logFormat(const char* fmt, ...); // -------------------------------------------------------------------------- // [Flags] // -------------------------------------------------------------------------- //! @brief Get logger flags (used internally by Assembler/Compiler). inline uint32_t getFlags() const { return _flags; } // -------------------------------------------------------------------------- // [Enabled] // -------------------------------------------------------------------------- //! @brief Return @c true if logging is enabled. inline bool isEnabled() const { return (_flags & kLoggerIsEnabled) != 0; } //! @brief Set logging to enabled or disabled. ASMJIT_API virtual void setEnabled(bool enabled); // -------------------------------------------------------------------------- // [Used] // -------------------------------------------------------------------------- //! @brief Get whether the logger should be used. inline bool isUsed() const { return (_flags & kLoggerIsUsed) != 0; } // -------------------------------------------------------------------------- // [LogBinary] // -------------------------------------------------------------------------- //! @brief Get whether logging of binary output is enabled. inline bool getLogBinary() const { return (_flags & kLoggerOutputBinary) != 0; } //! @brief Enable or disable binary output logging. ASMJIT_API void setLogBinary(bool value); // -------------------------------------------------------------------------- // [HexImmediate] // -------------------------------------------------------------------------- inline bool getHexImmediate() const { return (_flags & kLoggerOutputHexImmediate) != 0; } ASMJIT_API void setHexImmediate(bool value); // -------------------------------------------------------------------------- // [HexDisplacement] // -------------------------------------------------------------------------- inline bool getHexDisplacement() const { return (_flags & kLoggerOutputHexDisplacement) != 0; } ASMJIT_API void setHexDisplacement(bool value); // -------------------------------------------------------------------------- // [InstructionPrefix] // -------------------------------------------------------------------------- //! @brief Get instruction prefix. inline const char* getInstructionPrefix() const { return _instructionPrefix; } //! @brief Set instruction prefix. ASMJIT_API void setInstructionPrefix(const char* prefix); //! @brief Reset instruction prefix. inline void resetInstructionPrefix() { setInstructionPrefix(NULL); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Flags, see @ref kLoggerFlag. uint32_t _flags; //! @brief Instrictions and macro-instructions prefix. char _instructionPrefix[12]; }; // ============================================================================ // [AsmJit::FileLogger] // ============================================================================ //! @brief Logger that can log to standard C @c FILE* stream. struct FileLogger : public Logger { ASMJIT_NO_COPY(FileLogger) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @c FileLogger. //! @param stream FILE stream where logging will be sent (can be @c NULL //! to disable logging). ASMJIT_API FileLogger(FILE* stream = NULL); //! @brief Destroy the @ref FileLogger. ASMJIT_API virtual ~FileLogger(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get @c FILE* stream. //! //! @note Return value can be @c NULL. inline FILE* getStream() const { return _stream; } //! @brief Set @c FILE* stream. //! //! @param stream @c FILE stream where to log output (can be @c NULL to //! disable logging). ASMJIT_API void setStream(FILE* stream); // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- ASMJIT_API virtual void logString(const char* buf, size_t len = kInvalidSize); // -------------------------------------------------------------------------- // [Enabled] // -------------------------------------------------------------------------- ASMJIT_API virtual void setEnabled(bool enabled); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief C file stream. FILE* _stream; }; // ============================================================================ // [AsmJit::StringLogger] // ============================================================================ //! @brief String logger. struct StringLogger : public Logger { ASMJIT_NO_COPY(StringLogger) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new @ref StringLogger. ASMJIT_API StringLogger(); //! @brief Destroy the @ref StringLogger. ASMJIT_API virtual ~StringLogger(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get char* pointer which represents the serialized //! string. //! //! The pointer is owned by @ref StringLogger, it can't be modified or freed. inline const char* getString() const { return _stringBuilder.getData(); } //! @brief Clear the serialized string. inline void clearString() { _stringBuilder.clear(); } // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- ASMJIT_API virtual void logString(const char* buf, size_t len = kInvalidSize); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Output. StringBuilder _stringBuilder; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_LOGGER_H desmume-0.9.9/src/utils/AsmJit/core/compileritem.cpp0000644000175000017500000001771112140261627023175 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/compiler.h" #include "../core/compilercontext.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../core/intutil.h" #include "../core/logger.h" // [Dependencies - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerItem - Construction / Destruction] // ============================================================================ CompilerItem::CompilerItem(Compiler* compiler, uint32_t type) : _compiler(compiler), _prev(NULL), _next(NULL), _comment(NULL), _type(static_cast(type)), _isTranslated(false), _isUnreachable(false), _reserved(0), _offset(kInvalidValue) { } CompilerItem::~CompilerItem() { } // ============================================================================ // [AsmJit::CompilerItem - Interface] // ============================================================================ void CompilerItem::prepare(CompilerContext& cc) { _offset = cc._currentOffset; } CompilerItem* CompilerItem::translate(CompilerContext& cc) { return translated(); } void CompilerItem::emit(Assembler& a) {} void CompilerItem::post(Assembler& a) {} // ============================================================================ // [AsmJit::CompilerItem - Misc] // ============================================================================ int CompilerItem::getMaxSize() const { // Default maximum size is -1 which means that it's not known. return -1; } bool CompilerItem::_tryUnuseVar(CompilerVar* v) { return false; } // ============================================================================ // [AsmJit::CompilerItem - Comment] // ============================================================================ void CompilerItem::setComment(const char* str) { _comment = _compiler->getZoneMemory().sdup(str); } void CompilerItem::formatComment(const char* fmt, ...) { // The capacity should be large enough. char buf[128]; va_list ap; va_start(ap, fmt); vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap); va_end(ap); // I don't know if vsnprintf can produce non-null terminated string, in case // it can, we terminate it here. buf[ASMJIT_ARRAY_SIZE(buf) - 1] = '\0'; setComment(buf); } // ============================================================================ // [AsmJit::CompilerMark - Construction / Destruction] // ============================================================================ CompilerMark::CompilerMark(Compiler* compiler) : CompilerItem(compiler, kCompilerItemMark) { } CompilerMark::~CompilerMark() { } // ============================================================================ // [AsmJit::CompilerMark - Misc] // ============================================================================ int CompilerMark::getMaxSize() const { return 0; } // ============================================================================ // [AsmJit::CompilerComment - Construction / Destruction] // ============================================================================ CompilerComment::CompilerComment(Compiler* compiler, const char* str) : CompilerItem(compiler, kCompilerItemComment) { if (str != NULL) setComment(str); } CompilerComment::~CompilerComment() { } // ============================================================================ // [AsmJit::CompilerComment - Interface] // ============================================================================ void CompilerComment::emit(Assembler& a) { Logger* logger = a.getLogger(); if (logger == NULL || !logger->isUsed()) return; logger->logString(logger->getInstructionPrefix()); logger->logString(getComment()); } // ============================================================================ // [AsmJit::CompilerComment - Misc] // ============================================================================ int CompilerComment::getMaxSize() const { return 0; } // ============================================================================ // [AsmJit::CompilerEmbed - Construction / Destruction] // ============================================================================ CompilerEmbed::CompilerEmbed(Compiler* compiler, const void* data, size_t length) : CompilerItem(compiler, kCompilerItemEmbed) { _length = length; memcpy(_data, data, length); } CompilerEmbed::~CompilerEmbed() { } // ============================================================================ // [AsmJit::CompilerEmbed - Interface] // ============================================================================ void CompilerEmbed::emit(Assembler& a) { a.embed(_data, _length); } // ============================================================================ // [AsmJit::CompilerEmbed - Misc] // ============================================================================ int CompilerEmbed::getMaxSize() const { return (int)_length;; } // ============================================================================ // [AsmJit::CompilerAlign - Construction / Destruction] // ============================================================================ CompilerAlign::CompilerAlign(Compiler* compiler, uint32_t size) : CompilerItem(compiler, kCompilerItemAlign), _size(size) { } CompilerAlign::~CompilerAlign() { } // ============================================================================ // [AsmJit::CompilerAlign - Misc] // ============================================================================ int CompilerAlign::getMaxSize() const { if (_size == 0) return 0; else return static_cast(_size - 1); } // ============================================================================ // [AsmJit::CompilerHint - Construction / Destruction] // ============================================================================ CompilerHint::CompilerHint(Compiler* compiler, CompilerVar* var, uint32_t hintId, uint32_t hintValue) : CompilerItem(compiler, kCompilerItemHint), _var(var), _hintId(hintId), _hintValue(hintValue) { ASMJIT_ASSERT(var != NULL); } CompilerHint::~CompilerHint() { } // ============================================================================ // [AsmJit::CompilerTarget - Construction / Destruction] // ============================================================================ CompilerTarget::CompilerTarget(Compiler* compiler, const Label& label) : CompilerItem(compiler, kCompilerItemTarget), _label(label), _from(NULL), _state(NULL), _jumpsCount(0) { } CompilerTarget::~CompilerTarget() { } // ============================================================================ // [AsmJit::CompilerTarget - Misc] // ============================================================================ int CompilerTarget::getMaxSize() const { return 0; } // ============================================================================ // [AsmJit::CompilerInst - Construction / Destruction] // ============================================================================ CompilerInst::CompilerInst(Compiler* compiler, uint32_t code, Operand* opData, uint32_t opCount) : CompilerItem(compiler, kCompilerItemInst), _code(code), _emitOptions(static_cast(compiler->_emitOptions)), _instFlags(0), _operandsCount(static_cast(opCount)), _variablesCount(0), _operands(opData) { // Each created instruction takes emit options and clears it. compiler->_emitOptions = 0; } CompilerInst::~CompilerInst() { } // ============================================================================ // [AsmJit::CompilerInst - GetJumpTarget] // ============================================================================ CompilerTarget* CompilerInst::getJumpTarget() const { return NULL; } } // AsmJit namespace // [Api-Begin] #include "../core/apibegin.h" desmume-0.9.9/src/utils/AsmJit/core/stringutil.h0000644000175000017500000000213012140261627022342 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_STRINGUTIL_H #define _ASMJIT_CORE_STRINGUTIL_H // [Dependencies - AsmJit] #include "../core/defs.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::StringUtil] // ============================================================================ //! @brief String utilities. struct StringUtil { ASMJIT_API static char* copy(char* dst, const char* src, size_t len = kInvalidSize); ASMJIT_API static char* fill(char* dst, const int c, size_t len); ASMJIT_API static char* hex(char* dst, const uint8_t* src, size_t len); ASMJIT_API static char* utoa(char* dst, uintptr_t i, size_t base = 10); ASMJIT_API static char* itoa(char* dst, intptr_t i, size_t base = 10); static inline void memset32(uint32_t* p, uint32_t c, size_t len) { for (size_t i = 0; i < len; i++) p[i] = c; } }; //! @} } // AsmJit namespace #endif // _ASMJIT_CORE_STRINGUTIL_H desmume-0.9.9/src/utils/AsmJit/core/compileritem.h0000644000175000017500000004453012140261627022641 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_COMPILERITEM_H #define _ASMJIT_CORE_COMPILERITEM_H // [Dependencies - AsmJit] #include "../core/compiler.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerItem] // ============================================================================ //! @brief Compiler item. //! //! @ref CompilerItem represents items generated by compiler by calling its //! methods to build functions, instruction stream, bind labels, etc... Each //! item contains its type information and virtual methods which are called at //! various compilation steps. struct CompilerItem { ASMJIT_NO_COPY(CompilerItem) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new @ref CompilerItem. //! //! @note Always use @ref Compiler to create an item! ASMJIT_API CompilerItem(Compiler* compiler, uint32_t type); //! @brief Destroy @ref CompilerItem. //! //! @note @ref Compiler keeps links into all items so it can destroy them //! when code generation finished or in the case that @ref Compiler was //! destroyed early (for example if an error happened). Never destroy items //! manually! ASMJIT_API virtual ~CompilerItem(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get associated compiler instance. inline Compiler* getCompiler() const { return _compiler; } //! @brief Get previous item in the compiler stream. inline CompilerItem* getPrev() const { return _prev; } //! @brief Get next item in the compiler stream. inline CompilerItem* getNext() const { return _next; } //! @brief Get comment string. inline const char* getComment() const { return _comment; } //! @brief Get type of item, see @ref kCompilerItem. inline uint32_t getType() const { return _type; } //! @brief Get whether the item was translated. inline bool isTranslated() const { return _isTranslated; } //! @brief Get whether the item is unreachable. inline bool isUnreachable() const { return _isUnreachable; } //! @brief Get the item offset in the compiler stream. //! //! The offset is not byte offset, each item increments offset by 1 and this //! value is then used by register allocator. The offset is set by compiler //! by the register allocator, don't use it in your code. inline uint32_t getOffset() const { return _offset; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- //! @brief Step 1. Extract item variables, update statistics, ... ASMJIT_API virtual void prepare(CompilerContext& cc); //! @brief Step 2. Translate instruction, alloc variables, ... ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); //! @brief Step 3. Emit to @c Assembler. ASMJIT_API virtual void emit(Assembler& a); //! @brief Step 4. Last post step (verify, add data, etc). ASMJIT_API virtual void post(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- //! @brief Get maximum size of of this when serialized into @ref Assembler //! item in bytes. ASMJIT_API virtual int getMaxSize() const; //! @brief Try to unuse the variable @a. //! //! Returns @c true only if the variable will be unused by the instruction, //! otherwise @c false is returned. ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v); // -------------------------------------------------------------------------- // [Comment] // -------------------------------------------------------------------------- //! @brief Set comment string to @a str. ASMJIT_API void setComment(const char* str); //! @brief Format comment string using @a fmt string and variable argument list. ASMJIT_API void formatComment(const char* fmt, ...); // -------------------------------------------------------------------------- // [Protected] // -------------------------------------------------------------------------- protected: //! @brief Mark item as translated and return next. inline CompilerItem* translated() { ASMJIT_ASSERT(_isTranslated == false); _isTranslated = true; return _next; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- public: //! @brief Compiler which owns this item. Compiler* _compiler; //! @brief Previous item. CompilerItem* _prev; //! @brief Next item. CompilerItem* _next; //! @brief Inline comment string, initially set to NULL. const char* _comment; //! @brief Type of the item, see @ref kCompilerItem. uint32_t _type : 8; //! @brief Whether the item was translated, see @c translate(). uint32_t _isTranslated : 1; //! @brief Whether the item is unreachable. uint32_t _isUnreachable : 1; //! @brief Reserved for future use. uint32_t _reserved : 22; //! @brief Stream offset (not byte-offset). uint32_t _offset; }; // ============================================================================ // [AsmJit::CompilerMark] // ============================================================================ //! @brief Compiler mark item. //! //! This item does nothing and it's only used by @ref Compiler to mark some //! specific location in the compiler stream. struct CompilerMark : public CompilerItem { ASMJIT_NO_COPY(CompilerMark) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerMark instance. ASMJIT_API CompilerMark(Compiler* compiler); //! @brief Destroy the @ref CompilerMark instance. ASMJIT_API virtual ~CompilerMark(); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; }; // ============================================================================ // [AsmJit::CompilerComment] // ============================================================================ //! @brief Compiler comment item. //! //! Comments allows to comment your assembler stream for better debugging //! and visualization. Comments are usually ignored in release builds unless //! the logger is present. struct CompilerComment : public CompilerItem { ASMJIT_NO_COPY(CompilerComment) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerComment instance. ASMJIT_API CompilerComment(Compiler* compiler, const char* comment = NULL); //! @brief Destroy the @ref CompilerComment instance. ASMJIT_API virtual ~CompilerComment(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; }; // ============================================================================ // [AsmJit::CompilerEmbed] // ============================================================================ //! @brief Compiler embed item. //! //! Embed item is used to embed data into final assembler stream. The data is //! considered to be RAW, there is no analysis. struct CompilerEmbed : public CompilerItem { ASMJIT_NO_COPY(CompilerEmbed) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerEmbed instance. ASMJIT_API CompilerEmbed(Compiler* compiler, const void* data, size_t length); //! @brief Destroy the @ref CompilerEmbed instance. ASMJIT_API virtual ~CompilerEmbed(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get pointer to embedded data. uint8_t* getData() const { return const_cast(_data); } //! @brief Get length of embedded data. size_t getLength() const { return _length; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void emit(Assembler& a); // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Data length. size_t _length; //! @brief Data buffer (that will be embedded to the assembler stream). uint8_t _data[sizeof(void*)]; }; // ============================================================================ // [AsmJit::CompilerAlign] // ============================================================================ //! @brief Compiler align item. struct CompilerAlign : public CompilerItem { ASMJIT_NO_COPY(CompilerAlign) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerAlign instance. ASMJIT_API CompilerAlign(Compiler* compiler, uint32_t size = 0); //! @brief Destroy the @ref CompilerAlign instance. ASMJIT_API virtual ~CompilerAlign(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get align size in bytes. inline uint32_t getSize() const { return _size; } //! @brief Set align size in bytes to @a size. inline void setSize(uint32_t size) { _size = size; } // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Align size. uint32_t _size; }; // ============================================================================ // [AsmJit::CompilerHint] // ============================================================================ //! @brief Compiler variable hint item. struct CompilerHint : public CompilerItem { ASMJIT_NO_COPY(CompilerHint) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerHint instance. ASMJIT_API CompilerHint(Compiler* compiler, CompilerVar* var, uint32_t hintId, uint32_t hintValue); //! @brief Destroy the @ref CompilerHint instance. ASMJIT_API virtual ~CompilerHint(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get variable. inline CompilerVar* getVar() const { return _var; } //! @brief Get hint it (see @ref kVarHint). inline uint32_t getHintId() const { return _hintId; } //! @brief Set hint it (see @ref kVarHint). inline void setHintId(uint32_t hintId) { _hintId = hintId; } //! @brief Get hint value. inline uint32_t getHintValue() const { return _hintValue; } //! @brief Set hint value. inline void setHintValue(uint32_t hintValue) { _hintValue = hintValue; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Variable. CompilerVar* _var; //! @brief Variable hint id. uint32_t _hintId; //! @brief Variable hint value. uint32_t _hintValue; }; // ============================================================================ // [AsmJit::CompilerTarget] // ============================================================================ //! @brief Compiler target item. struct CompilerTarget : public CompilerItem { ASMJIT_NO_COPY(CompilerTarget) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerTarget instance. ASMJIT_API CompilerTarget(Compiler* compiler, const Label& target); //! @brief Destroy the @ref CompilerTarget instance. ASMJIT_API virtual ~CompilerTarget(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Return label bound to this target. inline const Label& getLabel() const { return _label; } //! @brief Get first jmp instruction. inline CompilerInst* getFrom() const { return _from; } //! @brief Get register allocator state for this target. inline CompilerState* getState() const { return _state; } //! @brief Get number of jumps to this target. inline uint32_t getJumpsCount() const { return _jumpsCount; } // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- ASMJIT_API virtual int getMaxSize() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Label. Label _label; //! @brief First jump instruction that points to this target (label). CompilerInst* _from; //! @brief State at this location. CompilerState* _state; //! @brief Count of jumps here. uint32_t _jumpsCount; }; // ============================================================================ // [AsmJit::CompilerInst] // ============================================================================ //! @brief Compiler instruction item. struct CompilerInst : public CompilerItem { ASMJIT_NO_COPY(CompilerInst) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerInst instance. ASMJIT_API CompilerInst(Compiler* compiler, uint32_t code, Operand* opData, uint32_t opCount); //! @brief Destroy the @ref CompilerInst instance. ASMJIT_API virtual ~CompilerInst(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get instruction code, see @c kInstCode. inline uint32_t getCode() const { return _code; } //! @brief Set instruction code to @a code. //! //! Please do not modify instruction code if you are not know what you are //! doing. Incorrect instruction code or operands can raise assertion() at //! runtime. inline void setCode(uint32_t code) { _code = code; } //! @brief Get emit options (compiler specific). inline uint32_t getEmitOptions() const { return _emitOptions; } //! @brief Get instruction flags (compiler specific). inline uint32_t getInstFlags() const { return _instFlags; } //! @brief Get whether the instruction has flag @a flag. inline bool hasInstFlag(uint8_t flag) const { return (_instFlags & flag) != 0; } //! @brief Set instruction @a flag. inline void setInstFlag(uint8_t flag) { _instFlags |= flag; } //! @brief Clear instruction @a flag. inline void clearInstFlag(uint8_t flag) { _instFlags &= ~flag; } //! @brief Get count of operands in operands array. inline uint32_t getOperandsCount() const { return _operandsCount; } //! @brief Get count of variables in variables array. inline uint32_t getVariablesCount() const { return _variablesCount; } //! @brief Get operands array (3 operands total). inline Operand* getOperands() { return _operands; } //! @brief Get operands array (3 operands total). inline const Operand* getOperands() const { return _operands; } // -------------------------------------------------------------------------- // [GetJumpTarget] // -------------------------------------------------------------------------- //! @brief Get possible jump target. //! //! If this instruction is conditional or normal jump then return value is //! the label location (@ref CompilerTarget), otherwise the return value is //! @c NULL. ASMJIT_API virtual CompilerTarget* getJumpTarget() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Instruction code, see @c kInstCode. uint32_t _code; //! @brief Emit options. uint8_t _emitOptions; //! @brief Instruction flags. uint8_t _instFlags; //! @brief Operands count. uint8_t _operandsCount; //! @brief Variables count. uint8_t _variablesCount; //! @brief Operands. Operand* _operands; }; } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_COMPILERITEM_H desmume-0.9.9/src/utils/AsmJit/core/assert.cpp0000644000175000017500000000127512140261627022003 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assert.h" // [Api-Begin] #include "../core/apibegin.h" // helpers namespace AsmJit { // ============================================================================ // [AsmJit::Assert] // ============================================================================ void assertionFailure(const char* file, int line, const char* exp) { fprintf(stderr, "*** ASSERTION FAILURE at %s (line %d)\n" "*** %s\n", file, line, exp); exit(1); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/podvector.h0000644000175000017500000001271512140261627022155 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_PODVECTOR_H #define _ASMJIT_CORE_PODVECTOR_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/defs.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::PodVector] // ============================================================================ //! @brief Template used to store and manage array of POD data. //! //! This template has these adventages over other vector<> templates: //! - Non-copyable (designed to be non-copyable, we want it) //! - No copy-on-write (some implementations of stl can use it) //! - Optimized for working only with POD types //! - Uses ASMJIT_... memory management macros template struct PodVector { ASMJIT_NO_COPY(PodVector) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new instance of PodVector template. Data will not //! be allocated (will be NULL). inline PodVector() : _data(NULL), _length(0), _capacity(0) { } //! @brief Destroy PodVector and free all data. inline ~PodVector() { if (_data != NULL) ASMJIT_FREE(_data); } // -------------------------------------------------------------------------- // [Data] // -------------------------------------------------------------------------- //! @brief Get data. inline T* getData() { return _data; } //! @overload inline const T* getData() const { return _data; } //! @brief Get length. inline size_t getLength() const { return _length; } //! @brief Get capacity. inline size_t getCapacity() const { return _capacity; } // -------------------------------------------------------------------------- // [Manipulation] // -------------------------------------------------------------------------- //! @brief Clear vector data, but not free internal buffer. void clear() { _length = 0; } //! @brief Clear vector data and free internal buffer. void reset() { if (_data != NULL) { ASMJIT_FREE(_data); _data = 0; _length = 0; _capacity = 0; } } //! @brief Prepend @a item to vector. bool prepend(const T& item) { if (_length == _capacity && !_grow()) return false; memmove(_data + 1, _data, sizeof(T) * _length); memcpy(_data, &item, sizeof(T)); _length++; return true; } //! @brief Insert an @a item at the @a index. bool insert(size_t index, const T& item) { ASMJIT_ASSERT(index <= _length); if (_length == _capacity && !_grow()) return false; T* dst = _data + index; memmove(dst + 1, dst, _length - index); memcpy(dst, &item, sizeof(T)); _length++; return true; } //! @brief Append @a item to vector. bool append(const T& item) { if (_length == _capacity && !_grow()) return false; memcpy(_data + _length, &item, sizeof(T)); _length++; return true; } //! @brief Get index of @a val or kInvalidSize if not found. size_t indexOf(const T& val) const { size_t i = 0, len = _length; for (i = 0; i < len; i++) { if (_data[i] == val) return i; } return kInvalidSize; } //! @brief Remove element at index @a i. void removeAt(size_t i) { ASMJIT_ASSERT(i < _length); T* dst = _data + i; _length--; memmove(dst, dst + 1, _length - i); } //! @brief Swap this pod-vector with @a other. void swap(PodVector& other) { T* _tmp_data = _data; size_t _tmp_length = _length; size_t _tmp_capacity = _capacity; _data = other._data; _length = other._length; _capacity = other._capacity; other._data = _tmp_data; other._length = _tmp_length; other._capacity = _tmp_capacity; } //! @brief Get item at position @a i. inline T& operator[](size_t i) { ASMJIT_ASSERT(i < _length); return _data[i]; } //! @brief Get item at position @a i. inline const T& operator[](size_t i) const { ASMJIT_ASSERT(i < _length); return _data[i]; } //! @brief Append the item and return address so it can be initialized. T* newItem() { if (_length == _capacity && !_grow()) return NULL; return _data + (_length++); } // -------------------------------------------------------------------------- // [Private] // -------------------------------------------------------------------------- //! @brief Called to grow internal array. bool _grow() { return _realloc(_capacity < 16 ? 16 : _capacity * 2); } //! @brief Realloc internal array to fit @a to items. bool _realloc(size_t to) { ASMJIT_ASSERT(to >= _length); T* p = reinterpret_cast(_data ? ASMJIT_REALLOC(_data, to * sizeof(T)) : ASMJIT_MALLOC(to * sizeof(T))); if (p == NULL) return false; _data = p; _capacity = to; return true; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Items data. T* _data; //! @brief Length of buffer (count of items in array). size_t _length; //! @brief Capacity of buffer (maximum items that can fit to current array). size_t _capacity; }; //! @} } // AsmJit namespace #endif // _ASMJIT_CORE_PODVECTOR_H desmume-0.9.9/src/utils/AsmJit/core/defs.h0000644000175000017500000004654612140261627021102 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_DEFS_H #define _ASMJIT_CORE_DEFS_H // [Dependencies - AsmJit] #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::Global] // ============================================================================ enum { //! @brief Invalid operand identifier. kInvalidValue = 0xFFFFFFFFU, //! @brief Minimum reserved bytes in @ref Buffer. kBufferGrow = 32U }; static const size_t kInvalidSize = (size_t)-1; // ============================================================================ // [AsmJit::kStringBuilderOpType] // ============================================================================ //! @brief String builder operation. enum kStringBuilderOpType { //! @brief Replace the current content by a given content. kStringBuilderOpSet = 0, //! @brief Append a given content to the current content. kStringBuilderOpAppend = 1 }; // ============================================================================ // [AsmJit::kStringBuilderNumType] // ============================================================================ enum kStringBuilderNumFlags { kStringBuilderNumShowSign = (1U << 0), kStringBuilderNumShowSpace = (1U << 1), kStringBuilderNumAlternate = (1U << 2), kStringBuilderNumSigned = (1U << 31) }; // ============================================================================ // [AsmJit::kLoggerOption] // ============================================================================ enum kLoggerFlag { //! @brief Whether logger is enabled or disabled. //! //! Default @c true. kLoggerIsEnabled = 0x00000001, //! @brief Whether logger is enabled and can be used. //! //! This value can be set by inherited classes to inform @c Logger that //! assigned stream (or something that can log output) is invalid. If //! @c _used is false it means that there is no logging output and AsmJit //! shouldn't use this logger (because all messages will be lost). //! //! This is designed only to optimize cases that logger exists, but its //! configured not to output messages. The API inside Logging and AsmJit //! should only check this value when needed. The API outside AsmJit should //! check only whether logging is @c _enabled. //! //! Default @c true. kLoggerIsUsed = 0x00000002, //! @brief Whether to output instructions also in binary form. kLoggerOutputBinary = 0x00000010, //! @brief Whether to output immediates as hexadecimal numbers. kLoggerOutputHexImmediate = 0x00000020, //! @brief Whether to output displacements as hexadecimal numbers. kLoggerOutputHexDisplacement = 0x00000040 }; // ============================================================================ // [AsmJit::kCpu] // ============================================================================ //! @brief Cpu vendor IDs. //! //! Cpu vendor IDs are specific for AsmJit library. Vendor ID is not directly //! read from cpuid result, instead it's based on CPU vendor string. enum kCpu { //! @brief Unknown CPU vendor. kCpuUnknown = 0, //! @brief Intel CPU vendor. kCpuIntel = 1, //! @brief AMD CPU vendor. kCpuAmd = 2, //! @brief National Semiconductor CPU vendor (applies also to Cyrix processors). kCpuNSM = 3, //! @brief Transmeta CPU vendor. kCpuTransmeta = 4, //! @brief VIA CPU vendor. kCpuVia = 5 }; // ============================================================================ // [AsmJit::kMemAllocType] // ============================================================================ //! @brief Types of allocation used by @c AsmJit::MemoryManager::alloc() method. enum kMemAllocType { //! @brief Allocate memory that can be freed by @c AsmJit::MemoryManager::free() //! method. kMemAllocFreeable = 0, //! @brief Allocate permanent memory that will be never freed. kMemAllocPermanent = 1 }; // ============================================================================ // [AsmJit::kOperandType] // ============================================================================ //! @brief Operand types that can be encoded in @c Op operand. enum kOperandType { //! @brief Operand is none, used only internally (not initialized Operand). //! //! This operand is not valid. kOperandNone = 0x00, //! @brief Operand is label. kOperandLabel = 0x01, //! @brief Operand is register. kOperandReg = 0x02, //! @brief Operand is variable. kOperandVar = 0x04, //! @brief Operand is memory. kOperandMem = 0x08, //! @brief Operand is immediate. kOperandImm = 0x10 }; // ============================================================================ // [AsmJit::kOperandMemType] // ============================================================================ //! @brief Type of memory operand. enum kOperandMemType { //! @brief Operand is combination of register(s) and displacement (native). kOperandMemNative = 0, //! @brief Operand is label. kOperandMemLabel = 1, //! @brief Operand is absolute memory location (supported mainly in 32-bit mode) kOperandMemAbsolute = 2, }; // ============================================================================ // [AsmJit::kOperandId] // ============================================================================ //! @brief Operand ID masks used to determine the operand type. enum kOperandId { //! @brief Operand id type mask (part used for operand type). kOperandIdTypeMask = 0xC0000000, //! @brief Label operand mark id. kOperandIdTypeLabel = 0x40000000, //! @brief Variable operand mark id. kOperandIdTypeVar = 0x80000000, //! @brief Operand id value mask (part used for IDs). kOperandIdValueMask = 0x3FFFFFFF }; // ============================================================================ // [AsmJit::kRegType / kRegIndex] // ============================================================================ enum { //! @brief Mask for register type. kRegTypeMask = 0xFF00, //! @brief Mask for register code (index). kRegIndexMask = 0xFF, //! @brief Invalid register index. kRegIndexInvalid = 0xFF }; // ============================================================================ // [AsmJit::kCondHint] // ============================================================================ //! @brief Condition hint. enum kCondHint { //! @brief No hint. kCondHintNone = 0x00, //! @brief Condition is likely to be taken. kCondHintLikely = 0x01, //! @brief Condition is unlikely to be taken. kCondHintUnlikely = 0x02 }; // ============================================================================ // [AsmJit::kFuncAnonymous] // ============================================================================ enum { //! @brief Maximum allowed arguments per function declaration / call. kFuncArgsMax = 32, //! @brief Invalid stack offset in function or function parameter. kFuncStackInvalid = -1 }; // ============================================================================ // [AsmJit::kFuncConv] // ============================================================================ enum kFuncConv { //! @brief Calling convention is invalid (can't be used). kFuncConvNone = 0 }; // ============================================================================ // [AsmJit::kFuncHint] // ============================================================================ //! @brief Function hints. enum kFuncHint { //! @brief Make naked function (without using ebp/erp in prolog / epilog). kFuncHintNaked = 0 }; // ============================================================================ // [AsmJit::kFuncFlags] // ============================================================================ //! @brief Function flags. enum kFuncFlags { //! @brief Whether another function is called from this function. //! //! If another function is called from this function, it's needed to prepare //! stack for it. If this member is true then it's likely that true will be //! also @c _isEspAdjusted one. kFuncFlagIsCaller = (1U << 0), //! @brief Whether the function is finished using @c Compiler::endFunc(). kFuncFlagIsFinished = (1U << 1), //! @brief Whether the function is using naked (minimal) prolog / epilog. kFuncFlagIsNaked = (1U << 2) }; // ============================================================================ // [AsmJit::kFuncArgsDirection] // ============================================================================ //! @brief Function arguments direction. enum kFuncArgsDirection { //! @brief Arguments are passed left to right. //! //! This arguments direction is unusual to C programming, it's used by pascal //! compilers and in some calling conventions by Borland compiler). kFuncArgsLTR = 0, //! @brief Arguments are passed right ro left //! //! This is default argument direction in C programming. kFuncArgsRTL = 1 }; // ============================================================================ // [AsmJit::kInstCode] // ============================================================================ enum kInstCode { //! @brief No instruction. kInstNone = 0 }; // ============================================================================ // [AsmJit::kVarAllocFlags] // ============================================================================ //! @brief Variable alloc mode. enum kVarAllocFlags { //! @brief Allocating variable to read only. //! //! Read only variables are used to optimize variable spilling. If variable //! is some time ago deallocated and it's not marked as changed (so it was //! all the life time read only) then spill is simply NOP (no mov instruction //! is generated to move it to it's home memory location). kVarAllocRead = 0x01, //! @brief Allocating variable to write only (overwrite). //! //! Overwriting means that if variable is in memory, there is no generated //! instruction to move variable from memory to register, because that //! register will be overwritten by next instruction. This is used as a //! simple optimization to improve generated code by @c Compiler. kVarAllocWrite = 0x02, //! @brief Allocating variable to read / write. //! //! Variable allocated for read / write is marked as changed. This means that //! if variable must be later spilled into memory, mov (or similar) //! instruction will be generated. kVarAllocReadWrite = 0x03, //! @brief Variable can be allocated in register. kVarAllocRegister = 0x04, //! @brief Variable can be allocated only to a special register. kVarAllocSpecial = 0x08, //! @brief Variable can be allocated in memory. kVarAllocMem = 0x10, //! @brief Unuse the variable after use. kVarAllocUnuseAfterUse = 0x20 }; // ============================================================================ // [AsmJit::kVarHint] // ============================================================================ //! @brief Variable hint (used by @ref Compiler). //! //! @sa @ref Compiler. enum kVarHint { //! @brief Alloc variable. kVarHintAlloc = 0, //! @brief Spill variable. kVarHintSpill = 1, //! @brief Save variable if modified. kVarHintSave = 2, //! @brief Save variable if modified and mark it as unused. kVarHintSaveAndUnuse = 3, //! @brief Mark variable as unused. kVarHintUnuse = 4 }; // ============================================================================ // [AsmJit::kVarPolicy] // ============================================================================ //! @brief Variable allocation method. //! //! Variable allocation method is used by compiler and it means if compiler //! should first allocate preserved registers or not. Preserved registers are //! registers that must be saved / restored by generated function. //! //! This option is for people who are calling C/C++ functions from JIT code so //! Compiler can recude generating push/pop sequences before and after call, //! respectively. enum kVarPolicy { //! @brief Allocate preserved registers first. kVarPolicyPreservedFirst = 0, //! @brief Allocate preserved registers last (default). kVarPolicyPreservedLast = 1 }; // ============================================================================ // [AsmJit::kVarState] // ============================================================================ //! @brief State of variable. //! //! @note State of variable is used only during make process and it's not //! visible to the developer. enum kVarState { //! @brief Variable is currently not used. kVarStateUnused = 0, //! @brief Variable is in register. //! //! Variable is currently allocated in register. kVarStateReg = 1, //! @brief Variable is in memory location or spilled. //! //! Variable was spilled from register to memory or variable is used for //! memory only storage. kVarStateMem = 2 }; // ============================================================================ // [AsmJit::kVarType] // ============================================================================ enum kVarType { //! @brief Invalid variable type. kVarTypeInvalid = 0xFF }; // ============================================================================ // [AsmJit::kScale] // ============================================================================ //! @brief Scale which can be used for addressing (it the target instruction //! supports it). //! //! See @c Op and addressing methods like @c byte_ptr(), @c word_ptr(), //! @c dword_ptr(), etc... enum kScale { //! @brief No scale. kScaleNone = 0, //! @brief Scale 2 times (same as shifting to left by 1). kScale2Times = 1, //! @brief Scale 4 times (same as shifting to left by 2). kScale4Times = 2, //! @brief Scale 8 times (same as shifting to left by 3). kScale8Times = 3 }; // ============================================================================ // [AsmJit::kSize] // ============================================================================ //! @brief Size of registers and pointers. enum kSize { //! @brief 1 byte size. kSizeByte = 1, //! @brief 2 bytes size. kSizeWord = 2, //! @brief 4 bytes size. kSizeDWord = 4, //! @brief 8 bytes size. kSizeQWord = 8, //! @brief 10 bytes size. kSizeTWord = 10, //! @brief 16 bytes size. kSizeDQWord = 16 }; // ============================================================================ // [AsmJit::kRelocMode] // ============================================================================ enum kRelocMode { kRelocAbsToAbs = 0, kRelocRelToAbs = 1, kRelocAbsToRel = 2, kRelocTrampoline = 3 }; // ============================================================================ // [AsmJit::kCompilerItem] // ============================================================================ //! @brief Type of @ref CompilerItem. //! //! Each @c CompilerItem contains information about its type. Compiler can //! optimize instruction stream by analyzing items and each type is hint //! for it. The most used/serialized items are instructions //! (@c kCompilerItemInst). enum kCompilerItem { //! @brief Invalid item (can't be used). kCompilerItemNone = 0, //! @brief Item is mark, see @ref CompilerMark. kCompilerItemMark, //! @brief Item is comment, see @ref CompilerComment. kCompilerItemComment, //! @brief Item is embedded data, see @ref CompilerEmbed. kCompilerItemEmbed, //! @brief Item is .align directive, see @ref CompilerAlign. kCompilerItemAlign, //! @brief Item is variable hint (alloc, spill, use, unuse), see @ref CompilerHint. kCompilerItemHint, //! @brief Item is instruction, see @ref CompilerInst. kCompilerItemInst, //! @brief Item is target, see @ref CompilerTarget. kCompilerItemTarget, //! @brief Item is function call, see @ref CompilerFuncCall. kCompilerItemFuncCall, //! @brief Item is function declaration, see @ref CompilerFuncDecl. kCompilerItemFuncDecl, //! @brief Item is an end of the function, see @ref CompilerFuncEnd. kCompilerItemFuncEnd, //! @brief Item is function return, see @ref CompilerFuncRet. kCompilerItemFuncRet }; // ============================================================================ // [AsmJit::kError] // ============================================================================ //! @brief Error codes. enum kError { //! @brief No error (success). //! //! This is default state and state you want. kErrorOk = 0, //! @brief Memory allocation error (@c ASMJIT_MALLOC returned @c NULL). kErrorNoHeapMemory = 1, //! @brief Virtual memory allocation error (@c VirtualMemory returned @c NULL). kErrorNoVirtualMemory = 2, //! @brief Unknown instruction. This happens only if instruction code is //! out of bounds. Shouldn't happen. kErrorUnknownInstruction = 3, //! @brief Illegal instruction, usually generated by AsmJit::Assembler //! class when emitting instruction opcode. If this error is generated the //! target buffer is not affected by this invalid instruction. //! //! You can also get this error code if you are under x64 (64-bit x86) and //! you tried to decode instruction using AH, BH, CH or DH register with REX //! prefix. These registers can't be accessed if REX prefix is used and AsmJit //! didn't check for this situation in intrinsics (@c Compiler takes care of //! this and rearrange registers if needed). //! //! Examples that will raise @c kErrorIllegalInstruction error (a is //! @c Assembler instance): //! //! @code //! a.mov(dword_ptr(eax), al); // Invalid address size. //! a.mov(byte_ptr(r10), ah); // Undecodable instruction (AH used with r10 //! // which can be encoded only using REX prefix) //! @endcode //! //! @note In debug mode you get assertion failure instead of setting error //! code. kErrorIllegalInstruction = 4, //! @brief Illegal addressing used (unencodable). kErrorIllegalAddressing = 5, //! @brief Short jump instruction used, but displacement is out of bounds. kErrorIllegalShortJump = 6, //! @brief No function defined. kErrorNoFunction = 7, //! @brief Function generation is not finished by using @c Compiler::endFunc() //! or something bad happened during generation related to function. This can //! be missing compiler item, etc... kErrorIncompleteFunction = 8, //! @brief Compiler can't allocate registers, because all of them are used. //! //! @note AsmJit is able to spill registers so this error really shouldn't //! happen unless all registers have priority 0 (which means never spill). kErrorNoRegisters = 9, //! @brief Compiler can't allocate one register to multiple destinations. //! //! This error can only happen using special instructions like cmpxchg8b and //! others where there are more destination operands (implicit). kErrorOverlappedRegisters = 10, //! @brief Tried to call function using incompatible argument. kErrorIncompatibleArgumentType = 11, //! @brief Incompatible return value. kErrorIncompatibleReturnType = 12, //! @brief Count of error codes by AsmJit. Can grow in future. kErrorCount }; // ============================================================================ // [AsmJit::API] // ============================================================================ //! @brief Translates error code (see @c kError) into text representation. ASMJIT_API const char* getErrorString(uint32_t error); //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_DEFS_H desmume-0.9.9/src/utils/AsmJit/core/build.h0000644000175000017500000002221512140261627021243 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_BUILD_H #define _ASMJIT_CORE_BUILD_H // [Include] #include "../Config.h" #if defined(ASMJIT_EXPORTS) # if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) # define _CRT_SECURE_NO_WARNINGS # endif // _MSC_VER #endif // ASMJIT_EXPORTS // Here should be optional include files that's needed fo successfuly // use macros defined here. Remember, AsmJit uses only AsmJit namespace // and all macros are used within it. #include #include #include #include // ============================================================================ // [AsmJit - OS] // ============================================================================ #if defined(WINDOWS) || defined(_WINDOWS) || defined(__WINDOWS__) || defined(_WIN32) || defined(_WIN64) # define ASMJIT_WINDOWS #elif defined(__linux__) || defined(__unix__) || \ defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || \ defined(__DragonFly__) || defined(__BSD__) || defined(__FREEBSD__) || \ defined(__APPLE__) # define ASMJIT_POSIX #else # warning "AsmJit - Can't match operating system, using ASMJIT_POSIX" # define ASMJIT_POSIX #endif // ============================================================================ // [AsmJit - Architecture] // ============================================================================ // define it only if it's not defined. In some systems we can // use -D command in compiler to bypass this autodetection. #if !defined(ASMJIT_X86) && !defined(ASMJIT_X64) # if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || \ defined(_M_X64) || defined(_WIN64) # define ASMJIT_X64 // x86-64 # else // _M_IX86, __INTEL__, __i386__ # define ASMJIT_X86 # endif #endif // ============================================================================ // [AsmJit - API] // ============================================================================ // Make AsmJit as shared library by default. #if !defined(ASMJIT_API) # if defined(ASMJIT_WINDOWS) # if defined(__GNUC__) # if defined(ASMJIT_EXPORTS) # define ASMJIT_API __attribute__((dllexport)) # else # define ASMJIT_API __attribute__((dllimport)) # endif // ASMJIT_EXPORTS # else # if defined(ASMJIT_EXPORTS) # define ASMJIT_API __declspec(dllexport) # else # define ASMJIT_API __declspec(dllimport) # endif // ASMJIT_EXPORTS # endif // __GNUC__ # else # if defined(__GNUC__) # if __GNUC__ >= 4 # define ASMJIT_API __attribute__((visibility("default"))) # define ASMJIT_VAR extern ASMJIT_API # endif // __GNUC__ >= 4 # endif // __GNUC__ # endif #endif // ASMJIT_API #if !defined(ASMJIT_VAR) # if defined(ASMJIT_API) # define ASMJIT_VAR extern ASMJIT_API # else # define ASMJIT_VAR # endif // ASMJIT_API #endif // !ASMJIT_VAR // [AsmJit - Memory Management] #if !defined(ASMJIT_MALLOC) # define ASMJIT_MALLOC ::malloc #endif // ASMJIT_MALLOC #if !defined(ASMJIT_REALLOC) # define ASMJIT_REALLOC ::realloc #endif // ASMJIT_REALLOC #if !defined(ASMJIT_FREE) # define ASMJIT_FREE ::free #endif // ASMJIT_FREE // ============================================================================ // [AsmJit - Calling Conventions] // ============================================================================ #if defined(ASMJIT_X86) # if defined(__GNUC__) # define ASMJIT_REGPARM_1 __attribute__((regparm(1))) # define ASMJIT_REGPARM_2 __attribute__((regparm(2))) # define ASMJIT_REGPARM_3 __attribute__((regparm(3))) # define ASMJIT_FASTCALL __attribute__((fastcall)) # define ASMJIT_STDCALL __attribute__((stdcall)) # define ASMJIT_CDECL __attribute__((cdecl)) # else # define ASMJIT_FASTCALL __fastcall # define ASMJIT_STDCALL __stdcall # define ASMJIT_CDECL __cdecl # endif #else # define ASMJIT_FASTCALL # define ASMJIT_STDCALL # define ASMJIT_CDECL #endif // ASMJIT_X86 #if !defined(ASMJIT_UNUSED) # define ASMJIT_UNUSED(var) ((void)var) #endif // ASMJIT_UNUSED #if !defined(ASMJIT_NOP) # define ASMJIT_NOP() ((void)0) #endif // ASMJIT_NOP // [AsmJit - C++ Compiler Support] #define ASMJIT_TYPE_TO_TYPE(_Type_) _Type_ #define ASMJIT_HAS_STANDARD_DEFINE_OPTIONS #define ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION // Support for VC6 #if defined(_MSC_VER) && (_MSC_VER < 1400) namespace AsmJit { template struct _Type2Type { typedef T Type; }; } #undef ASMJIT_TYPE_TO_TYPE #define ASMJIT_TYPE_TO_TYPE(_Type_) ::AsmJit::_Type2Type<_Type_>::Type #undef ASMJIT_HAS_STANDARD_DEFINE_OPTIONS #undef ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION #endif // ============================================================================ // [AsmJit - Types] // ============================================================================ #if defined(__MINGW32__) || defined(__MINGW64__) # include #endif // __MINGW32__ || __MINGW64__ #if defined(_MSC_VER) && (_MSC_VER < 1600) # if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef signed __int64 int64_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned __int64 uint64_t; # else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef signed __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; # endif // _MSC_VER #else # include # include #endif typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; #if defined(ASMJIT_X86) typedef int32_t sysint_t; typedef uint32_t sysuint_t; #else typedef int64_t sysint_t; typedef uint64_t sysuint_t; #endif #if defined(_MSC_VER) # define ASMJIT_INT64_C(num) num##i64 # define ASMJIT_UINT64_C(num) num##ui64 #else # define ASMJIT_INT64_C(num) num##LL # define ASMJIT_UINT64_C(num) num##ULL #endif // ============================================================================ // [AsmJit - C++ Macros] // ============================================================================ #define ASMJIT_ARRAY_SIZE(A) (sizeof(A) / sizeof(*A)) #define ASMJIT_NO_COPY(__type__) \ private: \ inline __type__(const __type__& other); \ inline __type__& operator=(const __type__& other); \ public: // ============================================================================ // [AsmJit - Debug] // ============================================================================ // If ASMJIT_DEBUG and ASMJIT_NO_DEBUG is not defined then ASMJIT_DEBUG will be // detected using the compiler specific macros. This enables to set the build // type using IDE. #if !defined(ASMJIT_DEBUG) && !defined(ASMJIT_NO_DEBUG) #if defined(_DEBUG) #define ASMJIT_DEBUG #endif // _DEBUG #endif // !ASMJIT_DEBUG && !ASMJIT_NO_DEBUG // ============================================================================ // [AsmJit - Initialize/DontInitialize] // ============================================================================ // TODO: This should be moved to AsmJit namespace! // Skip documenting this. #if !defined(ASMJIT_NODOC) struct _Initialize {}; struct _DontInitialize {}; #endif // !ASMJIT_NODOC // ============================================================================ // [AsmJit - Void] // ============================================================================ // TODO: This should be moved to AsmJit namespace! //! @brief Void type which can be used in @ref FunctionDeclaration templates. struct Void {}; // ============================================================================ // [asmjit_cast<>] // ============================================================================ //! @brief Cast used to cast pointer to function. It's like reinterpret_cast<>, //! but uses internally C style cast to work with MinGW. //! //! If you are using single compiler and @c reinterpret_cast<> works for you, //! there is no reason to use @c asmjit_cast<>. If you are writing //! cross-platform software with various compiler support, consider using //! @c asmjit_cast<> instead of @c reinterpret_cast<>. template static inline T asmjit_cast(Z* p) { return (T)p; } // ============================================================================ // [AsmJit - OS Support] // ============================================================================ #if defined(ASMJIT_WINDOWS) #include #endif // ASMJIT_WINDOWS #if defined(__APPLE__) #include #ifndef MAC_OS_X_VERSION_10_7 // In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here. static size_t strnlen(const char *s, size_t n) { const char *p = (const char *)memchr(s, 0, n); return(p ? p-s : n); } #endif #endif // __APPLE__ // [Guard] #endif // _ASMJIT_CORE_BUILD_H desmume-0.9.9/src/utils/AsmJit/core/stringbuilder.cpp0000644000175000017500000002166612140261627023365 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/defs.h" #include "../core/intutil.h" #include "../core/stringbuilder.h" // [Dependencies - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // Should be placed in read-only memory. static const char StringBuilder_empty[4] = { 0 }; // ============================================================================ // [AsmJit::StringBuilder - Construction / Destruction] // ============================================================================ StringBuilder::StringBuilder() : _data(const_cast(StringBuilder_empty)), _length(0), _capacity(0), _canFree(false) { } StringBuilder::~StringBuilder() { if (_canFree) ASMJIT_FREE(_data); } // ============================================================================ // [AsmJit::StringBuilder - Prepare / Reserve] // ============================================================================ char* StringBuilder::prepare(uint32_t op, size_t len) { // -------------------------------------------------------------------------- // [Set] // -------------------------------------------------------------------------- if (op == kStringBuilderOpSet) { // We don't care here, but we can't return a NULL pointer since it indicates // failure in memory allocation. if (len == 0) { if (_data != StringBuilder_empty) _data[0] = 0; _length = 0; return _data; } if (_capacity < len) { if (len >= IntUtil::maxValue() - sizeof(uintptr_t) * 2) return NULL; size_t to = IntUtil::align(len, sizeof(uintptr_t)); if (to < 256 - sizeof(uintptr_t)) to = 256 - sizeof(uintptr_t); char* newData = static_cast(ASMJIT_MALLOC(to + sizeof(uintptr_t))); if (newData == NULL) { clear(); return NULL; } if (_canFree) ASMJIT_FREE(_data); _data = newData; _capacity = to + sizeof(uintptr_t) - 1; _canFree = true; } _data[len] = 0; _length = len; ASMJIT_ASSERT(_length <= _capacity); return _data; } // -------------------------------------------------------------------------- // [Append] // -------------------------------------------------------------------------- else { // We don't care here, but we can't return a NULL pointer since it indicates // failure in memory allocation. if (len == 0) return _data + _length; // Overflow. if (IntUtil::maxValue() - sizeof(uintptr_t) * 2 - _length < len) return NULL; size_t after = _length + len; if (_capacity < after) { size_t to = _capacity; if (to < 256) to = 256; while (to < 1024 * 1024 && to < after) { to *= 2; } if (to < after) { to = after; if (to < (IntUtil::maxValue() - 1024 * 32)) to = IntUtil::align(to, 1024 * 32); } to = IntUtil::align(to, sizeof(uintptr_t)); char* newData = static_cast(ASMJIT_MALLOC(to + sizeof(uintptr_t))); if (newData == NULL) return NULL; ::memcpy(newData, _data, _length); if (_canFree) ASMJIT_FREE(_data); _data = newData; _capacity = to + sizeof(uintptr_t) - 1; _canFree = true; } char* ret = _data + _length; _data[after] = 0; _length = after; ASMJIT_ASSERT(_length <= _capacity); return ret; } } bool StringBuilder::reserve(size_t to) { if (_capacity >= to) return true; if (to >= IntUtil::maxValue() - sizeof(uintptr_t) * 2) return false; to = IntUtil::align(to, sizeof(uintptr_t)); char* newData = static_cast(ASMJIT_MALLOC(to + sizeof(uintptr_t))); if (newData == NULL) return false; ::memcpy(newData, _data, _length + 1); if (_canFree) ASMJIT_FREE(_data); _data = newData; _capacity = to + sizeof(uintptr_t) - 1; _canFree = true; return true; } // ============================================================================ // [AsmJit::StringBuilder - Clear] // ============================================================================ void StringBuilder::clear() { if (_data != StringBuilder_empty) _data[0] = 0; _length = 0; } // ============================================================================ // [AsmJit::StringBuilder - Methods] // ============================================================================ bool StringBuilder::_opString(uint32_t op, const char* str, size_t len) { if (len == kInvalidSize) len = ::strlen(str); char* p = prepare(op, len); if (p == NULL) return false; ::memcpy(p, str, len); return true; } bool StringBuilder::_opChars(uint32_t op, char c, size_t len) { char* p = prepare(op, len); if (p == NULL) return false; ::memset(p, c, len); return true; } static const char StringBuilder_numbers[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; bool StringBuilder::_opNumber(uint32_t op, uint64_t i, uint32_t base, size_t width, uint32_t flags) { if (base < 2 || base > 36) base = 10; char buf[128]; char* p = buf + ASMJIT_ARRAY_SIZE(buf); uint64_t orig = i; char sign = '\0'; // -------------------------------------------------------------------------- // [Sign] // -------------------------------------------------------------------------- if ((flags & kStringBuilderNumSigned) != 0 && static_cast(i) < 0) { i = static_cast(-static_cast(i)); sign = '-'; } else if ((flags & kStringBuilderNumShowSign) != 0) { sign = '+'; } else if ((flags & kStringBuilderNumShowSpace) != 0) { sign = ' '; } // -------------------------------------------------------------------------- // [Number] // -------------------------------------------------------------------------- do { uint64_t d = i / base; uint64_t r = i % base; *--p = StringBuilder_numbers[r]; i = d; } while (i); size_t numberLength = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p); // -------------------------------------------------------------------------- // [Alternate Form] // -------------------------------------------------------------------------- if ((flags & kStringBuilderNumAlternate) != 0) { if (base == 8) { if (orig != 0) *--p = '0'; } if (base == 16) { *--p = 'x'; *--p = '0'; } } // -------------------------------------------------------------------------- // [Width] // -------------------------------------------------------------------------- if (sign != 0) *--p = sign; if (width > 256) width = 256; if (width <= numberLength) width = 0; else width -= numberLength; // -------------------------------------------------------------------------- // Write] // -------------------------------------------------------------------------- size_t prefixLength = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p) - numberLength; char* data = prepare(op, prefixLength + width + numberLength); if (data == NULL) return false; ::memcpy(data, p, prefixLength); data += prefixLength; ::memset(data, '0', width); data += width; ::memcpy(data, p + prefixLength, numberLength); return true; } bool StringBuilder::_opHex(uint32_t op, const void* data, size_t len) { if (len >= IntUtil::maxValue() / 2) return false; char* dst = prepare(op, len); if (dst == NULL) return false; const char* src = static_cast(data); for (size_t i = 0; i < len; i++, dst += 2, src += 1) { dst[0] = StringBuilder_numbers[(src[0] >> 4) & 0xF]; dst[1] = StringBuilder_numbers[(src[0] ) & 0xF]; } return true; } bool StringBuilder::_opVFormat(uint32_t op, const char* fmt, va_list ap) { char buf[1024]; vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap); buf[ASMJIT_ARRAY_SIZE(buf) - 1] = '\0'; return _opString(op, buf); } bool StringBuilder::setFormat(const char* fmt, ...) { bool result; va_list ap; va_start(ap, fmt); result = _opVFormat(kStringBuilderOpSet, fmt, ap); va_end(ap); return result; } bool StringBuilder::appendFormat(const char* fmt, ...) { bool result; va_list ap; va_start(ap, fmt); result = _opVFormat(kStringBuilderOpAppend, fmt, ap); va_end(ap); return result; } bool StringBuilder::eq(const char* str, size_t len) const { const char* aData = _data; const char* bData = str; size_t aLength = _length; size_t bLength = len; if (bLength == kInvalidSize) { size_t i; for (i = 0; i < aLength; i++) { if (aData[i] != bData[i] || bData[i] == 0) return false; } return bData[i] == 0; } else { if (aLength != bLength) return false; return ::memcmp(aData, bData, aLength) == 0; } } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/assembler.cpp0000644000175000017500000001116612140261627022457 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/memorymanager.h" #include "../core/intutil.h" // [Dependenceis - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Assembler - Construction / Destruction] // ============================================================================ Assembler::Assembler(Context* context) : _zoneMemory(16384 - sizeof(ZoneChunk) - 32), _buffer(), _context(context != NULL ? context : static_cast(JitContext::getGlobal())), _logger(NULL), _error(kErrorOk), _properties(0), _emitOptions(0), _trampolineSize(0), _inlineComment(NULL), _unusedLinks(NULL) { } Assembler::~Assembler() { } // ============================================================================ // [AsmJit::Assembler - Logging] // ============================================================================ void Assembler::setLogger(Logger* logger) { _logger = logger; } // ============================================================================ // [AsmJit::Assembler - Error Handling] // ============================================================================ void Assembler::setError(uint32_t error) { _error = error; if (_error == kErrorOk) return; if (_logger) _logger->logFormat("*** ASSEMBLER ERROR: %s (%u).\n", getErrorString(error), (unsigned int)error); } // ============================================================================ // [AsmJit::Assembler - Properties] // ============================================================================ uint32_t Assembler::getProperty(uint32_t propertyId) const { if (propertyId > 31) return 0; return (_properties & (IntUtil::maskFromIndex(propertyId))) != 0; } void Assembler::setProperty(uint32_t propertyId, uint32_t value) { if (propertyId > 31) return; if (value) _properties |= IntUtil::maskFromIndex(propertyId); else _properties &= ~IntUtil::maskFromIndex(propertyId); } // ============================================================================ // [AsmJit::Assembler - TakeCode] // ============================================================================ uint8_t* Assembler::takeCode() { uint8_t* code = _buffer.take(); _relocData.clear(); _zoneMemory.clear(); if (_error != kErrorOk) setError(kErrorOk); return code; } // ============================================================================ // [AsmJit::Assembler - Clear / Reset] // ============================================================================ void Assembler::clear() { _purge(); if (_error != kErrorOk) setError(kErrorOk); } void Assembler::reset() { _purge(); _zoneMemory.reset(); _buffer.reset(); _labels.reset(); _relocData.reset(); if (_error != kErrorOk) setError(kErrorOk); } void Assembler::_purge() { _zoneMemory.clear(); _buffer.clear(); _emitOptions = 0; _trampolineSize = 0; _inlineComment = NULL; _unusedLinks = NULL; _labels.clear(); _relocData.clear(); } // ============================================================================ // [AsmJit::Assembler - Emit] // ============================================================================ void Assembler::embed(const void* data, size_t len) { if (!canEmit()) return; if (_logger) { size_t i, j; size_t max; char buf[128]; char dot[] = ".data "; char* p; memcpy(buf, dot, ASMJIT_ARRAY_SIZE(dot) - 1); for (i = 0; i < len; i += 16) { max = (len - i < 16) ? len - i : 16; p = buf + ASMJIT_ARRAY_SIZE(dot) - 1; for (j = 0; j < max; j++) p += sprintf(p, "%02X", reinterpret_cast(data)[i+j]); *p++ = '\n'; *p = '\0'; _logger->logString(buf); } } _buffer.emitData(data, len); } // ============================================================================ // [AsmJit::Assembler - Helpers] // ============================================================================ Assembler::LabelLink* Assembler::_newLabelLink() { LabelLink* link = _unusedLinks; if (link) { _unusedLinks = link->prev; } else { link = (LabelLink*)_zoneMemory.alloc(sizeof(LabelLink)); if (link == NULL) return NULL; } // clean link link->prev = NULL; link->offset = 0; link->displacement = 0; link->relocId = -1; return link; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/assert.h0000644000175000017500000000301212140261627021437 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_ASSERT_H #define _ASMJIT_CORE_ASSERT_H // [Dependencies - AsmJit] #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::Assert] // ============================================================================ //! @brief Called in debug build on assertion failure. //! @param file Source file name where it happened. //! @param line Line in the source file. //! @param exp Expression what failed. //! //! If you have problems with assertions simply put a breakpoint into //! AsmJit::assertionFailure() method (AsmJit/Core/Assert.cpp file) and examine //! call stack. ASMJIT_API void assertionFailure(const char* file, int line, const char* exp); // ============================================================================ // [ASMJIT_ASSERT] // ============================================================================ #if defined(ASMJIT_DEBUG) #if !defined(ASMJIT_ASSERT) #define ASMJIT_ASSERT(exp) \ do { \ if (!(exp)) ::AsmJit::assertionFailure(__FILE__, __LINE__, #exp); \ } while(0) #endif #else #if !defined(ASMJIT_ASSERT) #define ASMJIT_ASSERT(exp) ASMJIT_NOP() #endif #endif // DEBUG //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_ASSERT_H desmume-0.9.9/src/utils/AsmJit/core/func.cpp0000644000175000017500000000047212140261627021433 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/func.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { } // AsmJit // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/context.cpp0000644000175000017500000000444112140261627022164 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/context.h" #include "../core/defs.h" #include "../core/memorymanager.h" #include "../core/memorymarker.h" namespace AsmJit { // ============================================================================ // [AsmJit::Context - Construction / Destruction] // ============================================================================ Context::Context() {} Context::~Context() {} // ============================================================================ // [AsmJit::JitContext - Construction / Destruction] // ============================================================================ JitContext::JitContext() : _memoryManager(NULL), _memoryMarker(NULL), _allocType(kMemAllocFreeable) { } JitContext::~JitContext() { } // ============================================================================ // [AsmJit::JitContext - Generate] // ============================================================================ uint32_t JitContext::generate(void** dest, Assembler* assembler) { // Disallow empty code generation. size_t codeSize = assembler->getCodeSize(); if (codeSize == 0) { *dest = NULL; return kErrorNoFunction; } // Switch to global memory manager if not provided. MemoryManager* memmgr = getMemoryManager(); if (memmgr == NULL) memmgr = MemoryManager::getGlobal(); void* p = memmgr->alloc(codeSize, getAllocType()); if (p == NULL) { *dest = NULL; return kErrorNoVirtualMemory; } // Relocate the code. size_t relocatedSize = assembler->relocCode(p); // Return unused memory to MemoryManager. if (relocatedSize < codeSize) memmgr->shrink(p, relocatedSize); // Mark memory if MemoryMarker provided. if (_memoryMarker) _memoryMarker->mark(p, relocatedSize); // Return the code. *dest = p; return kErrorOk; } // ============================================================================ // [AsmJit::JitContext - GetGlobal] // ============================================================================ JitContext* JitContext::getGlobal() { static JitContext global; return &global; } } // AsmJit namespace desmume-0.9.9/src/utils/AsmJit/core/func.h0000644000175000017500000003640212140261627021102 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_FUNC_H #define _ASMJIT_CORE_FUNC_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [Forward Declaration] // ============================================================================ template struct TypeId; // ============================================================================ // [AsmJit::TypeId] // ============================================================================ #if defined(ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION) #define ASMJIT_DECLARE_TYPE_CORE(_PtrId_) \ template \ struct TypeId \ { \ enum \ { \ Id = static_cast(::AsmJit::kVarTypeInvalid) \ }; \ }; \ \ template \ struct TypeId { enum { Id = _PtrId_ }; } #else // Code without partial template specialization is a bit complex. We need to // determine whether the size of the return value of this function is equal // to sizeof(char) or sizeof(void*). Any sizeof() can be used to distinguish // between these two, but these are commonly used in other libraries as well. template char TypeId_NoPtiHelper(T*(*)()); // And specialization. void* TypeId_NoPtiHelper(...); #define ASMJIT_DECLARE_TYPE_CORE(_PtrId_) \ template \ struct TypeId \ { \ enum \ { \ Id = (sizeof( ::AsmJit::TypeId_NoPtiHelper((T(*)())0) ) == sizeof(char) \ ? static_cast(_PtrId_) \ : static_cast(::AsmJit::kVarTypeInvalid)) \ }; \ } #endif // ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION //! @brief Declare C/C++ type-id mapped to @c AsmJit::kX86VarType. #define ASMJIT_DECLARE_TYPE_ID(_T_, _Id_) \ template<> \ struct TypeId<_T_> { enum { Id = _Id_ }; } // ============================================================================ // [AsmJit::FuncArg] // ============================================================================ //! @brief Function argument translated from @ref FuncPrototype. struct FuncArg { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- inline uint32_t getVarType() const { return _varType; } inline uint32_t getRegIndex() const { return _regIndex; } inline bool hasRegIndex() const { return _regIndex != kRegIndexInvalid; } inline int32_t getStackOffset() const { return static_cast(_stackOffset); } inline bool hasStackOffset() const { return _stackOffset != kFuncStackInvalid; } //! @brief Get whether the argument is assigned, for private use only. inline bool isAssigned() const { return (_regIndex != kRegIndexInvalid) | (_stackOffset != kFuncStackInvalid); } // -------------------------------------------------------------------------- // [Reset] // -------------------------------------------------------------------------- //! @brief Reset the function argument to "unassigned state". inline void reset() { _packed = 0xFFFFFFFF; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- union { struct { //! @brief Variable type, see @c kVarType. uint8_t _varType; //! @brief Register index is argument is passed through register. uint8_t _regIndex; //! @brief Stack offset if argument is passed through stack. int16_t _stackOffset; }; //! @brief All members packed into single 32-bit integer. uint32_t _packed; }; }; // ============================================================================ // [AsmJit::FuncPrototype] // ============================================================================ //! @brief Function prototype. //! //! Function prototype contains information about function return type, count //! of arguments and their types. Function definition is low level structure //! which doesn't contain platform or calling convention specific information. struct FuncPrototype { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get function return value. inline uint32_t getReturnType() const { return _returnType; } //! @brief Get count of function arguments. inline uint32_t getArgumentsCount() const { return _argumentsCount; } //! @brief Get argument at index @a id. inline uint32_t getArgument(uint32_t id) const { ASMJIT_ASSERT(id < _argumentsCount); return _arguments[id]; } //! @brief Get function arguments' IDs. inline const uint32_t* getArguments() const { return _arguments; } //! @brief Set function definition - return type and arguments. inline void _setPrototype(uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) { _returnType = returnType; _arguments = arguments; _argumentsCount = argumentsCount; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- uint32_t _returnType; uint32_t _argumentsCount; const uint32_t* _arguments; }; // ============================================================================ // [AsmJit::FuncDecl] // ============================================================================ //! @brief Function declaration. struct FuncDecl { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get function return value or @ref kInvalidValue if it's void. inline uint32_t getReturnType() const { return _returnType; } //! @brief Get count of function arguments. inline uint32_t getArgumentsCount() const { return _argumentsCount; } //! @brief Get function arguments array. inline FuncArg* getArguments() { return _arguments; } //! @brief Get function arguments array (const). inline const FuncArg* getArguments() const { return _arguments; } //! @brief Get function argument at index @a index. inline FuncArg& getArgument(size_t index) { ASMJIT_ASSERT(index < static_cast(_argumentsCount)); return _arguments[index]; } //! @brief Get function argument at index @a index. inline const FuncArg& getArgument(size_t index) const { ASMJIT_ASSERT(index < static_cast(_argumentsCount)); return _arguments[index]; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Function return type. uint8_t _returnType; //! @brief Count of arguments (in @c _argumentsList). uint8_t _argumentsCount; //! @brief Reserved for future use (alignment). uint8_t _reserved0[2]; //! @brief Function arguments array. FuncArg _arguments[kFuncArgsMax]; }; // ============================================================================ // [AsmJit::FuncBuilderX] // ============================================================================ //! @brief Custom function builder for up to 32 function arguments. struct FuncBuilderX : public FuncPrototype { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline FuncBuilderX() { _setPrototype(kVarTypeInvalid, _argumentsData, 0); } // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- template inline void setReturnTypeT() { setReturnTypeRaw(TypeId::Id); } template inline void setArgumentT(uint32_t id) { setArgumentRaw(id, TypeId::Id); } template inline void addArgumentT() { addArgumentRaw(TypeId::Id); } inline void setReturnTypeRaw(uint32_t returnType) { _returnType = returnType; } inline void setArgumentRaw(uint32_t id, uint32_t type) { ASMJIT_ASSERT(id < _argumentsCount); _argumentsData[id] = type; } inline void addArgumentRaw(uint32_t type) { ASMJIT_ASSERT(_argumentsCount < kFuncArgsMax); _argumentsData[_argumentsCount++] = type; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- uint32_t _argumentsData[kFuncArgsMax]; }; //! @brief Class used to build function without arguments. template struct FuncBuilder0 : public FuncPrototype { inline FuncBuilder0() { _setPrototype(TypeId::Id, NULL, 0); } }; //! @brief Class used to build function with 1 argument. template struct FuncBuilder1 : public FuncPrototype { inline FuncBuilder1() { static const uint32_t arguments[] = { TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 2 arguments. template struct FuncBuilder2 : public FuncPrototype { inline FuncBuilder2() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 3 arguments. template struct FuncBuilder3 : public FuncPrototype { inline FuncBuilder3() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 4 arguments. template struct FuncBuilder4 : public FuncPrototype { inline FuncBuilder4() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 5 arguments. template struct FuncBuilder5 : public FuncPrototype { inline FuncBuilder5() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 6 arguments. template struct FuncBuilder6 : public FuncPrototype { inline FuncBuilder6() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 7 arguments. template struct FuncBuilder7 : public FuncPrototype { inline FuncBuilder7() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 8 arguments. template struct FuncBuilder8 : public FuncPrototype { inline FuncBuilder8() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 9 arguments. template struct FuncBuilder9 : public FuncPrototype { inline FuncBuilder9() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; //! @brief Class used to build function with 10 arguments. template struct FuncBuilder10 : public FuncPrototype { inline FuncBuilder10() { static const uint32_t arguments[] = { TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id, TypeId::Id }; _setPrototype(TypeId::Id, arguments, ASMJIT_ARRAY_SIZE(arguments)); } }; } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_FUNC_H desmume-0.9.9/src/utils/AsmJit/core/context.h0000644000175000017500000001152312140261627021630 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_CONTEXT_H #define _ASMJIT_CORE_CONTEXT_H // [Dependencies - AsmJit] #include "../core/build.h" namespace AsmJit { // ============================================================================ // [Forward Declarations] // ============================================================================ struct Assembler; struct MemoryManager; struct MemoryMarker; // ============================================================================ // [AsmJit::Context] // ============================================================================ //! @brief Class for changing behavior of code generated by @ref Assembler and //! @ref Compiler. struct Context { ASMJIT_NO_COPY(Context) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a @c Context instance. ASMJIT_API Context(); //! @brief Destroy the @c Context instance. ASMJIT_API virtual ~Context(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- //! @brief Allocate memory for code generated in @a assembler and reloc it //! to target location. //! //! This method is universal allowing any pre-process / post-process work //! with code generated by @c Assembler or @c Compiler. Because @c Compiler //! always uses @c Assembler it's allowed to access only the @c Assembler //! instance. //! //! This method is always last step when using code generation. You can use //! it to allocate memory for JIT code, saving code to remote process or a //! shared library. //! //! @retrurn Error value, see @c kError. virtual uint32_t generate(void** dest, Assembler* assembler) = 0; }; // ============================================================================ // [AsmJit::JitContext] // ============================================================================ struct JitContext : public Context { ASMJIT_NO_COPY(JitContext) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a @c JitContext instance. ASMJIT_API JitContext(); //! @brief Destroy the @c JitContext instance. ASMJIT_API virtual ~JitContext(); // -------------------------------------------------------------------------- // [Memory Manager and Alloc Type] // -------------------------------------------------------------------------- // Note: These members can be ignored by all derived classes. They are here // only to privide default implementation. All other implementations (remote // code patching or making dynamic loadable libraries/executables) ignore // members accessed by these accessors. //! @brief Get the @c MemoryManager instance. inline MemoryManager* getMemoryManager() const { return _memoryManager; } //! @brief Set the @c MemoryManager instance. inline void setMemoryManager(MemoryManager* memoryManager) { _memoryManager = memoryManager; } //! @brief Get the type of allocation. inline uint32_t getAllocType() const { return _allocType; } //! @brief Set the type of allocation. inline void setAllocType(uint32_t allocType) { _allocType = allocType; } // -------------------------------------------------------------------------- // [Memory Marker] // -------------------------------------------------------------------------- //! @brief Get the @c MemoryMarker instance. inline MemoryMarker* getMemoryMarker() const { return _memoryMarker; } //! @brief Set the @c MemoryMarker instance. inline void setMemoryMarker(MemoryMarker* memoryMarker) { _memoryMarker = memoryMarker; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual uint32_t generate(void** dest, Assembler* assembler); // -------------------------------------------------------------------------- // [Statics] // -------------------------------------------------------------------------- ASMJIT_API static JitContext* getGlobal(); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Memory manager. MemoryManager* _memoryManager; //! @brief Memory marker. MemoryMarker* _memoryMarker; //! @brief Type of allocation. uint32_t _allocType; }; } // AsmJit namespace // [Guard] #endif // _ASMJIT_CORE_CONTEXT_H desmume-0.9.9/src/utils/AsmJit/core/memorymanager.h0000644000175000017500000001430112140261627023004 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_MEMORYMANAGER_H #define _ASMJIT_CORE_MEMORYMANAGER_H // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" // [Debug] // #define ASMJIT_MEMORY_MANAGER_DUMP namespace AsmJit { //! @addtogroup AsmJit_MemoryManagement //! @{ // ============================================================================ // [AsmJit::MemoryManager] // ============================================================================ //! @brief Virtual memory manager interface. //! //! This class is pure virtual. You can get default virtual memory manager using //! @c getGlobal() method. If you want to create more memory managers with same //! functionality as global memory manager use @c VirtualMemoryManager class. struct MemoryManager { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create memory manager instance. ASMJIT_API MemoryManager(); //! @brief Destroy memory manager instance, this means also to free all memory //! blocks. ASMJIT_API virtual ~MemoryManager(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- //! @brief Allocate a @a size bytes of virtual memory. //! //! Note that if you are implementing your own virtual memory manager then you //! can quitly ignore type of allocation. This is mainly for AsmJit to memory //! manager that allocated memory will be never freed. virtual void* alloc(size_t size, uint32_t type = kMemAllocFreeable) = 0; //! @brief Free previously allocated memory at a given @a address. virtual bool free(void* address) = 0; //! @brief Free some tail memory. virtual bool shrink(void* address, size_t used) = 0; //! @brief Free all allocated memory. virtual void freeAll() = 0; //! @brief Get how many bytes are currently used. virtual size_t getUsedBytes() = 0; //! @brief Get how many bytes are currently allocated. virtual size_t getAllocatedBytes() = 0; // -------------------------------------------------------------------------- // [Statics] // -------------------------------------------------------------------------- //! @brief Get global memory manager instance. //! //! Global instance is instance of @c VirtualMemoryManager class. Global memory //! manager is used by default by @ref Assembler::make() and @ref Compiler::make() //! methods. ASMJIT_API static MemoryManager* getGlobal(); }; // ============================================================================ // [AsmJit::VirtualMemoryManager] // ============================================================================ //! @brief Reference implementation of memory manager that uses //! @ref AsmJit::VirtualMemory class to allocate chunks of virtual memory //! and bit arrays to manage it. struct VirtualMemoryManager : public MemoryManager { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a @c VirtualMemoryManager instance. ASMJIT_API VirtualMemoryManager(); #if defined(ASMJIT_WINDOWS) //! @brief Create a @c VirtualMemoryManager instance for process @a hProcess. //! //! This is specialized version of constructor available only for windows and //! usable to alloc/free memory of different process. ASMJIT_API VirtualMemoryManager(HANDLE hProcess); #endif // ASMJIT_WINDOWS //! @brief Destroy the @c VirtualMemoryManager instance, this means also to //! free all blocks. ASMJIT_API virtual ~VirtualMemoryManager(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual void* alloc(size_t size, uint32_t type = kMemAllocFreeable); ASMJIT_API virtual bool free(void* address); ASMJIT_API virtual bool shrink(void* address, size_t used); ASMJIT_API virtual void freeAll(); ASMJIT_API virtual size_t getUsedBytes(); ASMJIT_API virtual size_t getAllocatedBytes(); // -------------------------------------------------------------------------- // [Virtual Memory Manager Specific] // -------------------------------------------------------------------------- //! @brief Get whether to keep allocated memory after memory manager is //! destroyed. //! //! @sa @c setKeepVirtualMemory(). ASMJIT_API bool getKeepVirtualMemory() const; //! @brief Set whether to keep allocated memory after memory manager is //! destroyed. //! //! This method is usable when patching code of remote process. You need to //! allocate process memory, store generated assembler into it and patch the //! method you want to redirect (into your code). This method affects only //! VirtualMemoryManager destructor. After destruction all internal //! structures are freed, only the process virtual memory remains. //! //! @note Memory allocated with kMemAllocPermanent is always kept. //! //! @sa @c getKeepVirtualMemory(). ASMJIT_API void setKeepVirtualMemory(bool keepVirtualMemory); // -------------------------------------------------------------------------- // [Debug] // -------------------------------------------------------------------------- #if defined(ASMJIT_MEMORY_MANAGER_DUMP) //! @brief Dump memory manager tree into file. //! //! Generated output is using DOT language (from graphviz package). ASMJIT_API void dump(const char* fileName); #endif // ASMJIT_MEMORY_MANAGER_DUMP // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Pointer to private data hidden from the public API. void* _d; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_MEMORYMANAGER_H desmume-0.9.9/src/utils/AsmJit/core/compiler.h0000644000175000017500000002705312140261627021763 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_COMPILER_H #define _ASMJIT_CORE_COMPILER_H // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/context.h" #include "../core/func.h" #include "../core/operand.h" #include "../core/podvector.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [Forward Declarations] // ============================================================================ struct Compiler; struct CompilerAlign; struct CompilerComment; struct CompilerContext; struct CompilerEmbed; struct CompilerFuncCall; struct CompilerFuncDecl; struct CompilerFuncEnd; struct CompilerInst; struct CompilerItem; struct CompilerMark; struct CompilerState; struct CompilerTarget; struct CompilerVar; // ============================================================================ // [AsmJit::CompilerState] // ============================================================================ //! @brief Compiler state base. struct CompilerState { }; // ============================================================================ // [AsmJit::CompilerVar] // ============================================================================ //! @brief Compiler variable base. struct CompilerVar { // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get variable name. inline const char* getName() const { return _name; } //! @brief Get variable id. inline uint32_t getId() const { return _id; } //! @brief Get variable type. inline uint32_t getType() const { return _type; } //! @brief Get variable class. inline uint32_t getClass() const { return _class; } //! @brief Get variable priority. inline uint32_t getPriority() const { return _priority; } //! @brief Get variable size. inline uint32_t getSize() const { return _size; } //! @brief Get whether the variable is a function argument. inline bool isArgument() const { return static_cast(_isRegArgument | _isMemArgument); } //! @brief Get whether the variable is a function argument passed through register. inline bool isRegArgument() const { return static_cast(_isRegArgument); } //! @brief Get whether the variable is a function argument passed through memory. inline bool isMemArgument() const { return static_cast(_isMemArgument); } //! @brief Get variable content can be calculated by a simple instruction. inline bool isCalculated() const { return static_cast(_isCalculated); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Variable name. const char* _name; //! @brief Variable id. uint32_t _id; //! @brief Variable type. uint8_t _type; //! @brief Variable class. uint8_t _class; //! @brief Variable priority. uint8_t _priority; //! @brief Whether the variable is a function argument passed through register. uint8_t _isRegArgument : 1; //! @brief Whether the variable is a function argument passed through memory. uint8_t _isMemArgument : 1; //! @brief Whether variable content can be calculated by a simple instruction. //! //! This is used mainly by MMX and SSE2 code. This flag indicates that //! register allocator should never reserve memory for this variable, because //! the content can be generated by a single instruction (for example PXOR). uint8_t _isCalculated : 1; //! @internal. uint8_t _unused : 5; //! @brief Variable size. uint32_t _size; }; // ============================================================================ // [AsmJit::Compiler] // ============================================================================ //! @brief Compiler. //! //! @sa @ref Assembler. struct Compiler { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref Compiler instance. ASMJIT_API Compiler(Context* context); //! @brief Destroy the @ref Compiler instance. ASMJIT_API virtual ~Compiler(); // -------------------------------------------------------------------------- // [Context] // -------------------------------------------------------------------------- //! @brief Get code generator. inline Context* getContext() const { return _context; } // -------------------------------------------------------------------------- // [Memory Management] // -------------------------------------------------------------------------- //! @brief Get zone memory manager. inline ZoneMemory& getZoneMemory() { return _zoneMemory; } //! @brief Get link memory manager. inline ZoneMemory& getLinkMemory() { return _linkMemory; } // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- //! @brief Get logger. inline Logger* getLogger() const { return _logger; } //! @brief Set logger to @a logger. ASMJIT_API virtual void setLogger(Logger* logger); // -------------------------------------------------------------------------- // [Error Handling] // -------------------------------------------------------------------------- //! @brief Get error code. inline uint32_t getError() const { return _error; } //! @brief Set error code. //! //! This method is virtual, because higher classes can use it to catch all //! errors. ASMJIT_API virtual void setError(uint32_t error); // -------------------------------------------------------------------------- // [Properties] // -------------------------------------------------------------------------- //! @brief Get compiler property. ASMJIT_API virtual uint32_t getProperty(uint32_t propertyId); //! @brief Set compiler property. ASMJIT_API virtual void setProperty(uint32_t propertyId, uint32_t value); // -------------------------------------------------------------------------- // [Clear / Reset] // -------------------------------------------------------------------------- //! @brief Clear everything, but not deallocate buffers. //! //! @note This method will destroy your code. ASMJIT_API void clear(); //! @brief Free internal buffer, all emitters and NULL all pointers. //! //! @note This method will destroy your code. ASMJIT_API void reset(); //! @brief Called by clear() and reset() to clear all data related to derived //! class implementation. ASMJIT_API virtual void _purge(); // -------------------------------------------------------------------------- // [Item Management] // -------------------------------------------------------------------------- //! @brief Get first item. inline CompilerItem* getFirstItem() const { return _first; } //! @brief Get last item. inline CompilerItem* getLastItem() const { return _last; } //! @brief Get current item. //! //! @note If this method returns @c NULL it means that nothing has been //! emitted yet. inline CompilerItem* getCurrentItem() const { return _current; } //! @brief Get current function. inline CompilerFuncDecl* getFunc() const { return _func; } //! @brief Set current item to @a item and return the previous current one. ASMJIT_API CompilerItem* setCurrentItem(CompilerItem* item); //! @brief Add item after current item to @a item and set current item to //! @a item. ASMJIT_API void addItem(CompilerItem* item); //! @brief Add item after @a ref. ASMJIT_API void addItemAfter(CompilerItem* item, CompilerItem* ref); //! @brief Remove item @a item. ASMJIT_API void removeItem(CompilerItem* item); // -------------------------------------------------------------------------- // [Comment] // -------------------------------------------------------------------------- //! @brief Emit a single comment line. //! //! @note Comment is not directly sent to logger, but instead it's stored as //! @ref CompilerComment item emitted when @c serialize() method is called. ASMJIT_API void comment(const char* fmt, ...); // -------------------------------------------------------------------------- // [Embed] // -------------------------------------------------------------------------- //! @brief Embed data. ASMJIT_API void embed(const void* data, size_t len); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief ZoneMemory allocator, used to allocate compiler items. ZoneMemory _zoneMemory; //! @brief ZoneMemory allocator, used to alloc small data structures like //! linked lists. ZoneMemory _linkMemory; //! @brief Context. Context* _context; //! @brief Logger. Logger* _logger; //! @brief Error code. uint32_t _error; //! @brief Properties. uint32_t _properties; //! @brief Contains options for next emitted instruction, clear after each emit. uint32_t _emitOptions; //! @brief Whether compiler was finished the job (register allocator, etc...). uint32_t _finished; //! @brief First item. CompilerItem* _first; //! @brief Last item. CompilerItem* _last; //! @brief Current item. CompilerItem* _current; //! @brief Current function. CompilerFuncDecl* _func; //! @brief Targets. PodVector _targets; //! @brief Variables. PodVector _vars; //! @brief Compiler context instance, only available after prepare(). CompilerContext* _cc; //! @brief Variable name id (used to generate unique names per function). int _varNameId; }; // ============================================================================ // [AsmJit::Compiler - Helpers] // ============================================================================ template inline T* Compiler_newItem(Compiler* self) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self); } template inline T* Compiler_newItem(Compiler* self, P1 p1) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1); } template inline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1, p2); } template inline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1, p2, p3); } template inline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3, P4 p4) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1, p2, p3, p4); } template inline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { void* addr = self->getZoneMemory().alloc(sizeof(T)); return new(addr) T(self, p1, p2, p3, p4, p5); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_COMPILER_H desmume-0.9.9/src/utils/AsmJit/core/memorymarker.h0000644000175000017500000000242712140261627022661 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_MEMORYMARKER_H #define _ASMJIT_CORE_MEMORYMARKER_H // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_MemoryManagement //! @{ // ============================================================================ // [AsmJit::MemoryMarker] // ============================================================================ //! @brief Virtual memory marker interface. struct MemoryMarker { ASMJIT_NO_COPY(MemoryMarker) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API MemoryMarker(); ASMJIT_API virtual ~MemoryMarker(); // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- virtual void mark(const void* ptr, size_t size) = 0; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_MEMORYMARKER_H desmume-0.9.9/src/utils/AsmJit/core/compilercontext.h0000644000175000017500000000474212140261627023370 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_COMPILERCONTEXT_H #define _ASMJIT_CORE_COMPILERCONTEXT_H // [Dependencies - AsmJit] #include "../core/compiler.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../core/zonememory.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerContext] // ============================================================================ struct CompilerContext { ASMJIT_NO_COPY(CompilerContext) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API CompilerContext(Compiler* compiler); ASMJIT_API virtual ~CompilerContext(); // -------------------------------------------------------------------------- // [Accessor] // -------------------------------------------------------------------------- inline Compiler* getCompiler() const { return _compiler; } inline CompilerFuncDecl* getFunc() const { return _func; } inline CompilerItem* getExtraBlock() const { return _extraBlock; } inline void setExtraBlock(CompilerItem* item) { _extraBlock = item; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief ZoneMemory manager. ZoneMemory _zoneMemory; //! @brief Compiler. Compiler* _compiler; //! @brief Function. CompilerFuncDecl* _func; //! @brief Start of the current active scope. CompilerItem* _start; //! @brief End of the current active scope. CompilerItem* _stop; //! @brief Item that is used to insert some code after the function body. CompilerItem* _extraBlock; //! @brief Current state (used by register allocator). CompilerState* _state; //! @brief Link to circular double-linked list containing all active variables //! of the current state. CompilerVar* _active; //! @brief Current offset, used in prepare() stage. Each item should increment it. uint32_t _currentOffset; //! @brief Whether current code is unreachable. uint32_t _isUnreachable; }; } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_COMPILERCONTEXT_H desmume-0.9.9/src/utils/AsmJit/core/intutil.h0000644000175000017500000001620212140261627021633 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_INTUTIL_H #define _ASMJIT_CORE_INTUTIL_H // [Dependencies - AsmJit] #include "../core/assert.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::I32FPUnion] // ============================================================================ //! @internal //! //! @brief used to cast from float to 32-bit integer and vica versa. union I32FPUnion { //! @brief 32-bit signed integer value. int32_t i; //! @brief 32-bit SP-FP value. float f; }; // ============================================================================ // [AsmJit::I64FPUnion] // ============================================================================ //! @internal //! //! @brief used to cast from double to 64-bit integer and vica versa. union I64FPUnion { //! @brief 64-bit signed integer value. int64_t i; //! @brief 64-bit DP-FP value. double f; }; // ============================================================================ // [AsmJit::IntUtil] // ============================================================================ namespace IntUtil { // -------------------------------------------------------------------------- // [Min/Max] // -------------------------------------------------------------------------- // NOTE: Because some environments declare min() and max() as macros, we // decided to use different name so we never collide. template static inline T _min(const T& a, const T& b) { return a < b ? a : b; } template static inline T _max(const T& a, const T& b) { return a > b ? a : b; } // -------------------------------------------------------------------------- // [Limits] // -------------------------------------------------------------------------- template static inline T maxValue() { return ~T(0); } // -------------------------------------------------------------------------- // [IsInt / IsUInt] // -------------------------------------------------------------------------- //! @brief Returns @c true if a given integer @a x is signed 8-bit integer static inline bool isInt8(intptr_t x) { return x >= -128 && x <= 127; } //! @brief Returns @c true if a given integer @a x is unsigned 8-bit integer static inline bool isUInt8(intptr_t x) { return x >= 0 && x <= 255; } //! @brief Returns @c true if a given integer @a x is signed 16-bit integer static inline bool isInt16(intptr_t x) { return x >= -32768 && x <= 32767; } //! @brief Returns @c true if a given integer @a x is unsigned 16-bit integer static inline bool isUInt16(intptr_t x) { return x >= 0 && x <= 65535; } //! @brief Returns @c true if a given integer @a x is signed 16-bit integer static inline bool isInt32(intptr_t x) { #if defined(ASMJIT_X86) return true; #else return x >= ASMJIT_INT64_C(-2147483648) && x <= ASMJIT_INT64_C(2147483647); #endif } //! @brief Returns @c true if a given integer @a x is unsigned 16-bit integer static inline bool isUInt32(intptr_t x) { #if defined(ASMJIT_X86) return x >= 0; #else return x >= 0 && x <= ASMJIT_INT64_C(4294967295); #endif } // -------------------------------------------------------------------------- // [Masking] // -------------------------------------------------------------------------- static inline uint32_t maskFromIndex(uint32_t x) { ASMJIT_ASSERT(x < 32); return (1U << x); } static inline uint32_t maskUpToIndex(uint32_t x) { if (x >= 32) return 0xFFFFFFFF; else return (1U << x) - 1; } // -------------------------------------------------------------------------- // [Bits] // -------------------------------------------------------------------------- // From http://graphics.stanford.edu/~seander/bithacks.html . static inline uint32_t bitCount(uint32_t x) { x = x - ((x >> 1) & 0x55555555U); x = (x & 0x33333333U) + ((x >> 2) & 0x33333333U); return (((x + (x >> 4)) & 0x0F0F0F0FU) * 0x01010101U) >> 24; } static inline uint32_t findFirstBit(uint32_t mask) { for (uint32_t i = 0; i < sizeof(uint32_t) * 8; i++, mask >>= 1) { if (mask & 0x1) return i; } // kInvalidValue. return 0xFFFFFFFF; } // -------------------------------------------------------------------------- // [Alignment] // -------------------------------------------------------------------------- template static inline bool isAligned(T base, T alignment) { return (base % alignment) == 0; } //! @brief Align @a base to @a alignment. template static inline T align(T base, T alignment) { return (base + (alignment - 1)) & ~(alignment - 1); } //! @brief Get delta required to align @a base to @a alignment. template static inline T delta(T base, T alignment) { return align(base, alignment) - base; } // -------------------------------------------------------------------------- // [Round] // -------------------------------------------------------------------------- template static inline T roundUp(T base, T alignment) { T over = base % alignment; return base + (over > 0 ? alignment - over : 0); } template static inline T roundUpToPowerOf2(T base) { // Implementation is from "Hacker's Delight" by Henry S. Warren, Jr., // figure 3-3, page 48, where the function is called clp2. base -= 1; // I'm trying to make this portable and MSVC strikes me the warning C4293: // "Shift count negative or too big, undefined behavior" // Fixing... #if defined(_MSC_VER) # pragma warning(push) # pragma warning(disable: 4293) #endif // _MSC_VER base = base | (base >> 1); base = base | (base >> 2); base = base | (base >> 4); if (sizeof(T) >= 2) base = base | (base >> 8); if (sizeof(T) >= 4) base = base | (base >> 16); if (sizeof(T) >= 8) base = base | (base >> 32); #if defined(_MSC_VER) # pragma warning(pop) #endif // _MSC_VER return base + 1; } // -------------------------------------------------------------------------- // [Cast] // -------------------------------------------------------------------------- //! @brief Binary cast from 32-bit integer to SP-FP value (@c float). static inline float int32AsFloat(int32_t i) { I32FPUnion u; u.i = i; return u.f; } //! @brief Binary cast SP-FP value (@c float) to 32-bit integer. static inline int32_t floatAsInt32(float f) { I32FPUnion u; u.f = f; return u.i; } //! @brief Binary cast from 64-bit integer to DP-FP value (@c double). static inline double int64AsDouble(int64_t i) { I64FPUnion u; u.i = i; return u.f; } //! @brief Binary cast from DP-FP value (@c double) to 64-bit integer. static inline int64_t doubleAsInt64(double f) { I64FPUnion u; u.f = f; return u.i; } }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_INTUTIL_H desmume-0.9.9/src/utils/AsmJit/core/stringutil.cpp0000644000175000017500000000322512140261627022703 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/stringutil.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::StringUtil] // ============================================================================ static const char letters[] = "0123456789ABCDEF"; char* StringUtil::copy(char* dst, const char* src, size_t len) { if (src == NULL) return dst; if (len == kInvalidSize) { while (*src) *dst++ = *src++; } else { memcpy(dst, src, len); dst += len; } return dst; } char* StringUtil::fill(char* dst, const int c, size_t len) { memset(dst, c, len); return dst + len; } char* StringUtil::hex(char* dst, const uint8_t* src, size_t len) { for (size_t i = len; i; i--, dst += 2, src += 1) { dst[0] = letters[(src[0] >> 4) & 0xF]; dst[1] = letters[(src[0] ) & 0xF]; } return dst; } // Not too efficient, but this is mainly for debugging:) char* StringUtil::utoa(char* dst, uintptr_t i, size_t base) { ASMJIT_ASSERT(base <= 16); char buf[128]; char* p = buf + 128; do { uintptr_t b = i % base; *--p = letters[b]; i /= base; } while (i); return StringUtil::copy(dst, p, (size_t)(buf + 128 - p)); } char* StringUtil::itoa(char* dst, intptr_t i, size_t base) { if (i < 0) { *dst++ = '-'; i = -i; } return StringUtil::utoa(dst, (size_t)i, base); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/cpuinfo.cpp0000644000175000017500000000414212140261627022141 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/cpuinfo.h" #if defined(ASMJIT_X86) || defined(ASMJIT_X64) #include "../x86/x86cpuinfo.h" #else // ? #endif // ASMJIT_X86 || ASMJIT_X64 // [Dependencies - Windows] #if defined(ASMJIT_WINDOWS) # include #endif // ASMJIT_WINDOWS // [Dependencies - Posix] #if defined(ASMJIT_POSIX) # include # include # include # include #endif // ASMJIT_POSIX // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CpuInfo - DetectNumberOfProcessors] // ============================================================================ uint32_t CpuInfo::detectNumberOfProcessors() { #if defined(ASMJIT_WINDOWS) SYSTEM_INFO info; ::GetSystemInfo(&info); return info.dwNumberOfProcessors; #elif defined(ASMJIT_POSIX) && defined(_SC_NPROCESSORS_ONLN) // It seems that sysconf returns the number of "logical" processors on both // mac and linux. So we get the number of "online logical" processors. long res = ::sysconf(_SC_NPROCESSORS_ONLN); if (res == -1) return 1; return static_cast(res); #else return 1; #endif } // ============================================================================ // [AsmJit::CpuInfo - GetGlobal] // ============================================================================ #if defined(ASMJIT_X86) || defined(ASMJIT_X64) struct InitializedCpuInfo : public X86CpuInfo { inline InitializedCpuInfo() : X86CpuInfo() { x86CpuDetect(this); } }; #else #error "AsmJit::CpuInfo - Unsupported CPU or compiler." #endif // ASMJIT_X86 || ASMJIT_X64 const CpuInfo* CpuInfo::getGlobal() { #if defined(ASMJIT_X86) || defined(ASMJIT_X64) static InitializedCpuInfo cpuInfo; #else #error "AsmJit::CpuInfo - Unsupported CPU or compiler." #endif // ASMJIT_X86 || ASMJIT_X64 return &cpuInfo; } } // AsmJit // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/operand.cpp0000644000175000017500000000163612140261627022133 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/operand.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Operand] // ============================================================================ const Operand noOperand; // ============================================================================ // [AsmJit::Imm] // ============================================================================ //! @brief Create signed immediate value operand. Imm imm(sysint_t i) { return Imm(i, false); } //! @brief Create unsigned immediate value operand. Imm uimm(sysuint_t i) { return Imm((sysint_t)i, true); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/memorymanager.cpp0000644000175000017500000007330212140261627023345 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/lock.h" #include "../core/memorymanager.h" #include "../core/virtualmemory.h" // [Api-Begin] #include "../core/apibegin.h" // This file contains implementation of virtual memory management for AsmJit // library. The initial concept is to keep this implementation simple but // efficient. There are several goals I decided to write implementation myself. // // Goals: // - We need usually to allocate blocks of 64 bytes long and more. // - Alignment of allocated blocks is large - 32 bytes or 64 bytes. // - Keep memory manager information outside allocated virtual memory pages // (these pages allows execution of code). // - Keep implementation small. // // I think that implementation is not small and probably not too much readable, // so there is small know how. // // - Implementation is based on bit arrays and binary trees. Bit arrays // contains information about allocated and unused blocks of memory. Each // block size describes MemNode::density member. Count of blocks are // stored in MemNode::blocks member. For example if density is 64 and // count of blocks is 20, memory node contains 64*20 bytes of memory and // smallest possible allocation (and also alignment) is 64 bytes. So density // describes also memory alignment. Binary trees are used to enable fast // lookup into all addresses allocated by memory manager instance. This is // used mainly in MemoryManagerPrivate::free(). // // Bit array looks like this (empty = unused, X = used) - Size of block 64 // ------------------------------------------------------------------------- // | |X|X| | | | | |X|X|X|X|X|X| | | | | | | | | | | | |X| | | | |X|X|X| | | // ------------------------------------------------------------------------- // Bits array shows that there are 12 allocated blocks of 64 bytes, so total // allocated size is 768 bytes. Maximum count of continuous blocks is 12 // (see largest gap). namespace AsmJit { // ============================================================================ // [Bits Manipulation] // ============================================================================ #define BITS_PER_ENTITY (sizeof(size_t) * 8) static void _SetBit(size_t* buf, size_t index) { size_t i = index / BITS_PER_ENTITY; // size_t[] size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index buf += i; *buf |= (size_t)1 << j; } static void _ClearBit(size_t* buf, size_t index) { size_t i = index / BITS_PER_ENTITY; // size_t[] size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index buf += i; *buf &= ~((size_t)1 << j); } static void _SetBits(size_t* buf, size_t index, size_t len) { if (len == 0) return; size_t i = index / BITS_PER_ENTITY; // size_t[] size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index // How many bytes process in the first group. size_t c = BITS_PER_ENTITY - j; if (c > len) c = len; // Offset. buf += i; *buf++ |= ((~(size_t)0) >> (BITS_PER_ENTITY - c)) << j; len -= c; while (len >= BITS_PER_ENTITY) { *buf++ = ~(size_t)0; len -= BITS_PER_ENTITY; } if (len) { *buf |= ((~(size_t)0) >> (BITS_PER_ENTITY - len)); } } static void _ClearBits(size_t* buf, size_t index, size_t len) { if (len == 0) return; size_t i = index / BITS_PER_ENTITY; // size_t[] size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index // How many bytes process in the first group. size_t c = BITS_PER_ENTITY - j; if (c > len) c = len; // Offset. buf += i; *buf++ &= ~(((~(size_t)0) >> (BITS_PER_ENTITY - c)) << j); len -= c; while (len >= BITS_PER_ENTITY) { *buf++ = 0; len -= BITS_PER_ENTITY; } if (len) { *buf &= (~(size_t)0) << len; } } // ============================================================================ // [AsmJit::MemNode] // ============================================================================ #define M_DIV(x, y) ((x) / (y)) #define M_MOD(x, y) ((x) % (y)) template struct RbNode { // -------------------------------------------------------------------------- // [Node red-black tree tree, key is mem pointer]. // -------------------------------------------------------------------------- // Implementation is based on article by Julienne Walker (Public Domain), // including C code and original comments. Thanks for the excellent article. // Left[0] and right[1] nodes. T* node[2]; // Whether the node is RED. uint32_t red; // -------------------------------------------------------------------------- // [Chunk Memory] // -------------------------------------------------------------------------- // Virtual memory address. uint8_t* mem; }; // Get whether the node is red (NULL or node with red flag). template inline bool isRed(RbNode* node) { return node != NULL && node->red; } struct MemNode : public RbNode { // -------------------------------------------------------------------------- // [Node double-linked list] // -------------------------------------------------------------------------- MemNode* prev; // Prev node in list. MemNode* next; // Next node in list. // -------------------------------------------------------------------------- // [Chunk Data] // -------------------------------------------------------------------------- size_t size; // How many bytes contain this node. size_t blocks; // How many blocks are here. size_t density; // Minimum count of allocated bytes in this node (also alignment). size_t used; // How many bytes are used in this node. size_t largestBlock; // Contains largest block that can be allocated. size_t* baUsed; // Contains bits about used blocks. // (0 = unused, 1 = used). size_t* baCont; // Contains bits about continuous blocks. // (0 = stop, 1 = continue). // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- // Get available space. inline size_t getAvailable() const { return size - used; } inline void fillData(MemNode* other) { mem = other->mem; size = other->size; blocks = other->blocks; density = other->density; used = other->used; largestBlock = other->largestBlock; baUsed = other->baUsed; baCont = other->baCont; } }; // ============================================================================ // [AsmJit::M_Permanent] // ============================================================================ //! @brief Permanent node. struct PermanentNode { uint8_t* mem; // Base pointer (virtual memory address). size_t size; // Count of bytes allocated. size_t used; // Count of bytes used. PermanentNode* prev; // Pointer to prev chunk or NULL. // Get available space. inline size_t getAvailable() const { return size - used; } }; // ============================================================================ // [AsmJit::MemoryManagerPrivate] // ============================================================================ struct MemoryManagerPrivate { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- #if !defined(ASMJIT_WINDOWS) MemoryManagerPrivate(); #else MemoryManagerPrivate(HANDLE hProcess); #endif // ASMJIT_WINDOWS ~MemoryManagerPrivate(); // -------------------------------------------------------------------------- // [Allocation] // -------------------------------------------------------------------------- MemNode* createNode(size_t size, size_t density); void* allocPermanent(size_t vsize); void* allocFreeable(size_t vsize); bool free(void* address); bool shrink(void* address, size_t used); void freeAll(bool keepVirtualMemory); // Helpers to avoid ifdefs in the code. inline uint8_t* allocVirtualMemory(size_t size, size_t* vsize) { #if !defined(ASMJIT_WINDOWS) return (uint8_t*)VirtualMemory::alloc(size, vsize, true); #else return (uint8_t*)VirtualMemory::allocProcessMemory(_hProcess, size, vsize, true); #endif } inline void freeVirtualMemory(void* vmem, size_t vsize) { #if !defined(ASMJIT_WINDOWS) VirtualMemory::free(vmem, vsize); #else VirtualMemory::freeProcessMemory(_hProcess, vmem, vsize); #endif } // -------------------------------------------------------------------------- // [NodeList RB-Tree] // -------------------------------------------------------------------------- bool checkTree(); void insertNode(MemNode* node); MemNode* removeNode(MemNode* node); MemNode* findPtr(uint8_t* mem); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- #if defined(ASMJIT_WINDOWS) HANDLE _hProcess; // Process where to allocate memory. #endif // ASMJIT_WINDOWS Lock _lock; // Lock for thread safety. size_t _newChunkSize; // Default node size. size_t _newChunkDensity; // Default node density. size_t _allocated; // How many bytes are allocated. size_t _used; // How many bytes are used. // Memory nodes list. MemNode* _first; MemNode* _last; MemNode* _optimal; // Memory nodes tree. MemNode* _root; // Permanent memory. PermanentNode* _permanent; // Whether to keep virtual memory after destroy. bool _keepVirtualMemory; }; // ============================================================================ // [AsmJit::MemoryManagerPrivate - Construction / Destruction] // ============================================================================ #if !defined(ASMJIT_WINDOWS) MemoryManagerPrivate::MemoryManagerPrivate() : #else MemoryManagerPrivate::MemoryManagerPrivate(HANDLE hProcess) : _hProcess(hProcess), #endif _newChunkSize(65536), _newChunkDensity(64), _allocated(0), _used(0), _root(NULL), _first(NULL), _last(NULL), _optimal(NULL), _permanent(NULL), _keepVirtualMemory(false) { } MemoryManagerPrivate::~MemoryManagerPrivate() { // Freeable memory cleanup - Also frees the virtual memory if configured to. freeAll(_keepVirtualMemory); // Permanent memory cleanup - Never frees the virtual memory. PermanentNode* node = _permanent; while (node) { PermanentNode* prev = node->prev; ASMJIT_FREE(node); node = prev; } } // ============================================================================ // [AsmJit::MemoryManagerPrivate - Allocation] // ============================================================================ // Allocates virtual memory node and MemNode structure. // // Returns MemNode* on success, otherwise NULL. MemNode* MemoryManagerPrivate::createNode(size_t size, size_t density) { size_t vsize; uint8_t* vmem = allocVirtualMemory(size, &vsize); // Out of memory. if (vmem == NULL) return NULL; size_t blocks = (vsize / density); size_t bsize = (((blocks + 7) >> 3) + sizeof(size_t) - 1) & ~(size_t)(sizeof(size_t) - 1); MemNode* node = reinterpret_cast(ASMJIT_MALLOC(sizeof(MemNode))); uint8_t* data = reinterpret_cast(ASMJIT_MALLOC(bsize * 2)); // Out of memory. if (node == NULL || data == NULL) { freeVirtualMemory(vmem, vsize); if (node) ASMJIT_FREE(node); if (data) ASMJIT_FREE(data); return NULL; } // Initialize RbNode data. node->node[0] = NULL; node->node[1] = NULL; node->red = 1; node->mem = vmem; // Initialize MemNode data. node->prev = NULL; node->next = NULL; node->size = vsize; node->blocks = blocks; node->density = density; node->used = 0; node->largestBlock = vsize; memset(data, 0, bsize * 2); node->baUsed = reinterpret_cast(data); node->baCont = reinterpret_cast(data + bsize); return node; } void* MemoryManagerPrivate::allocPermanent(size_t vsize) { static const size_t permanentAlignment = 32; static const size_t permanentNodeSize = 32768; size_t over = vsize % permanentAlignment; if (over) over = permanentAlignment - over; size_t alignedSize = vsize + over; AutoLock locked(_lock); PermanentNode* node = _permanent; // Try to find space in allocated chunks. while (node && alignedSize > node->getAvailable()) node = node->prev; // Or allocate new node. if (node == NULL) { size_t nodeSize = permanentNodeSize; if (vsize > nodeSize) nodeSize = vsize; node = (PermanentNode*)ASMJIT_MALLOC(sizeof(PermanentNode)); // Out of memory. if (node == NULL) return NULL; node->mem = allocVirtualMemory(nodeSize, &node->size); // Out of memory. if (node->mem == NULL) { ASMJIT_FREE(node); return NULL; } node->used = 0; node->prev = _permanent; _permanent = node; } // Finally, copy function code to our space we reserved for. uint8_t* result = node->mem + node->used; // Update Statistics. node->used += alignedSize; _used += alignedSize; // Code can be null to only reserve space for code. return (void*)result; } void* MemoryManagerPrivate::allocFreeable(size_t vsize) { size_t i; // Current index. size_t need; // How many we need to be freed. size_t minVSize; // Align to 32 bytes (our default alignment). vsize = (vsize + 31) & ~(size_t)31; if (vsize == 0) return NULL; AutoLock locked(_lock); MemNode* node = _optimal; minVSize = _newChunkSize; // Try to find memory block in existing nodes. while (node) { // Skip this node? if ((node->getAvailable() < vsize) || (node->largestBlock < vsize && node->largestBlock != 0)) { MemNode* next = node->next; if (node->getAvailable() < minVSize && node == _optimal && next) _optimal = next; node = next; continue; } size_t* up = node->baUsed; // Current ubits address. size_t ubits; // Current ubits[0] value. size_t bit; // Current bit mask. size_t blocks = node->blocks; // Count of blocks in node. size_t cont = 0; // How many bits are currently freed in find loop. size_t maxCont = 0; // Largest continuous block (bits count). size_t j; need = M_DIV((vsize + node->density - 1), node->density); i = 0; // Try to find node that is large enough. while (i < blocks) { ubits = *up++; // Fast skip used blocks. if (ubits == ~(size_t)0) { if (cont > maxCont) maxCont = cont; cont = 0; i += BITS_PER_ENTITY; continue; } size_t max = BITS_PER_ENTITY; if (i + max > blocks) max = blocks - i; for (j = 0, bit = 1; j < max; bit <<= 1) { j++; if ((ubits & bit) == 0) { if (++cont == need) { i += j; i -= cont; goto _Found; } continue; } if (cont > maxCont) maxCont = cont; cont = 0; } i += BITS_PER_ENTITY; } // Because we traversed entire node, we can set largest node size that // will be used to cache next traversing.. node->largestBlock = maxCont * node->density; node = node->next; } // If we are here, we failed to find existing memory block and we must // allocate new. { size_t chunkSize = _newChunkSize; if (chunkSize < vsize) chunkSize = vsize; node = createNode(chunkSize, _newChunkDensity); if (node == NULL) return NULL; // Update binary tree. insertNode(node); ASMJIT_ASSERT(checkTree()); // Alloc first node at start. i = 0; need = (vsize + node->density - 1) / node->density; // Update statistics. _allocated += node->size; } _Found: // Update bits. _SetBits(node->baUsed, i, need); _SetBits(node->baCont, i, need - 1); // Update statistics. { size_t u = need * node->density; node->used += u; node->largestBlock = 0; _used += u; } // And return pointer to allocated memory. uint8_t* result = node->mem + i * node->density; ASMJIT_ASSERT(result >= node->mem && result <= node->mem + node->size - vsize); return result; } bool MemoryManagerPrivate::free(void* address) { if (address == NULL) return true; AutoLock locked(_lock); MemNode* node = findPtr((uint8_t*)address); if (node == NULL) return false; size_t offset = (size_t)((uint8_t*)address - (uint8_t*)node->mem); size_t bitpos = M_DIV(offset, node->density); size_t i = (bitpos / BITS_PER_ENTITY); size_t* up = node->baUsed + i; // Current ubits address. size_t* cp = node->baCont + i; // Current cbits address. size_t ubits = *up; // Current ubits[0] value. size_t cbits = *cp; // Current cbits[0] value. size_t bit = (size_t)1 << (bitpos % BITS_PER_ENTITY); size_t cont = 0; bool stop; for (;;) { stop = (cbits & bit) == 0; ubits &= ~bit; cbits &= ~bit; bit <<= 1; cont++; if (stop || bit == 0) { *up = ubits; *cp = cbits; if (stop) break; ubits = *++up; cbits = *++cp; bit = 1; } } // If the freed block is fully allocated node then it's needed to // update 'optimal' pointer in memory manager. if (node->used == node->size) { MemNode* cur = _optimal; do { cur = cur->prev; if (cur == node) { _optimal = node; break; } } while (cur); } // Statistics. cont *= node->density; if (node->largestBlock < cont) node->largestBlock = cont; node->used -= cont; _used -= cont; // If page is empty, we can free it. if (node->used == 0) { // Free memory associated with node (this memory is not accessed // anymore so it's safe). freeVirtualMemory(node->mem, node->size); ASMJIT_FREE(node->baUsed); node->baUsed = NULL; node->baCont = NULL; // Statistics. _allocated -= node->size; // Remove node. This function can return different node than // passed into, but data is copied into previous node if needed. ASMJIT_FREE(removeNode(node)); ASMJIT_ASSERT(checkTree()); } return true; } bool MemoryManagerPrivate::shrink(void* address, size_t used) { if (address == NULL) return false; if (used == 0) return free(address); AutoLock locked(_lock); MemNode* node = findPtr((uint8_t*)address); if (node == NULL) return false; size_t offset = (size_t)((uint8_t*)address - (uint8_t*)node->mem); size_t bitpos = M_DIV(offset, node->density); size_t i = (bitpos / BITS_PER_ENTITY); size_t* up = node->baUsed + i; // Current ubits address. size_t* cp = node->baCont + i; // Current cbits address. size_t ubits = *up; // Current ubits[0] value. size_t cbits = *cp; // Current cbits[0] value. size_t bit = (size_t)1 << (bitpos % BITS_PER_ENTITY); size_t cont = 0; size_t usedBlocks = (used + node->density - 1) / node->density; bool stop; // Find the first block we can mark as free. for (;;) { stop = (cbits & bit) == 0; if (stop) return true; if (++cont == usedBlocks) break; bit <<= 1; if (bit == 0) { ubits = *++up; cbits = *++cp; bit = 1; } } // Free the tail blocks. cont = ~(size_t)0; goto _EnterFreeLoop; for (;;) { stop = (cbits & bit) == 0; ubits &= ~bit; _EnterFreeLoop: cbits &= ~bit; bit <<= 1; cont++; if (stop || bit == 0) { *up = ubits; *cp = cbits; if (stop) break; ubits = *++up; cbits = *++cp; bit = 1; } } // Statistics. cont *= node->density; if (node->largestBlock < cont) node->largestBlock = cont; node->used -= cont; _used -= cont; return true; } void MemoryManagerPrivate::freeAll(bool keepVirtualMemory) { MemNode* node = _first; while (node) { MemNode* next = node->next; if (!keepVirtualMemory) freeVirtualMemory(node->mem, node->size); ASMJIT_FREE(node->baUsed); ASMJIT_FREE(node); node = next; } _allocated = 0; _used = 0; _root = NULL; _first = NULL; _last = NULL; _optimal = NULL; } // ============================================================================ // [AsmJit::MemoryManagerPrivate - NodeList RB-Tree] // ============================================================================ static int rbAssert(MemNode* root) { if (root == NULL) return 1; MemNode* ln = root->node[0]; MemNode* rn = root->node[1]; // Red violation. ASMJIT_ASSERT( !(isRed(root) && (isRed(ln) || isRed(rn))) ); int lh = rbAssert(ln); int rh = rbAssert(rn); // Invalid btree. ASMJIT_ASSERT(ln == NULL || ln->mem < root->mem); ASMJIT_ASSERT(rn == NULL || rn->mem > root->mem); // Black violation. ASMJIT_ASSERT( !(lh != 0 && rh != 0 && lh != rh) ); // Only count black links. if (lh != 0 && rh != 0) return isRed(root) ? lh : lh + 1; else return 0; } static inline MemNode* rbRotateSingle(MemNode* root, int dir) { MemNode* save = root->node[!dir]; root->node[!dir] = save->node[dir]; save->node[dir] = root; root->red = 1; save->red = 0; return save; } static inline MemNode* rbRotateDouble(MemNode* root, int dir) { root->node[!dir] = rbRotateSingle(root->node[!dir], !dir); return rbRotateSingle(root, dir); } bool MemoryManagerPrivate::checkTree() { return rbAssert(_root) > 0; } void MemoryManagerPrivate::insertNode(MemNode* node) { if (_root == NULL) { // Empty tree case. _root = node; } else { // False tree root. RbNode head = {0}; // Grandparent & parent. MemNode* g = NULL; MemNode* t = reinterpret_cast(&head); // Iterator & parent. MemNode* p = NULL; MemNode* q = t->node[1] = _root; int dir = 0, last; // Search down the tree. for (;;) { if (q == NULL) { // Insert new node at the bottom. q = node; p->node[dir] = node; } else if (isRed(q->node[0]) && isRed(q->node[1])) { // Color flip. q->red = 1; q->node[0]->red = 0; q->node[1]->red = 0; } // Fix red violation. if (isRed(q) && isRed(p)) { int dir2 = t->node[1] == g; t->node[dir2] = (q == p->node[last]) ? rbRotateSingle(g, !last) : rbRotateDouble(g, !last); } // Stop if found. if (q == node) break; last = dir; dir = q->mem < node->mem; // Update helpers. if (g != NULL) t = g; g = p; p = q; q = q->node[dir]; } // Update root. _root = head.node[1]; } // Make root black. _root->red = 0; // Link with others. node->prev = _last; if (_first == NULL) { _first = node; _last = node; _optimal = node; } else { node->prev = _last; _last->next = node; _last = node; } } MemNode* MemoryManagerPrivate::removeNode(MemNode* node) { // False tree root. RbNode head = {0}; // Helpers. MemNode* q = reinterpret_cast(&head); MemNode* p = NULL; MemNode* g = NULL; // Found item. MemNode* f = NULL; int dir = 1; // Set up. q->node[1] = _root; // Search and push a red down. while (q->node[dir] != NULL) { int last = dir; // Update helpers. g = p; p = q; q = q->node[dir]; dir = q->mem < node->mem; // Save found node. if (q == node) f = q; // Push the red node down. if (!isRed(q) && !isRed(q->node[dir])) { if (isRed(q->node[!dir])) { p = p->node[last] = rbRotateSingle(q, dir); } else if (!isRed(q->node[!dir])) { MemNode* s = p->node[!last]; if (s != NULL) { if (!isRed(s->node[!last]) && !isRed(s->node[last])) { // Color flip. p->red = 0; s->red = 1; q->red = 1; } else { int dir2 = g->node[1] == p; if (isRed(s->node[last])) g->node[dir2] = rbRotateDouble(p, last); else if (isRed(s->node[!last])) g->node[dir2] = rbRotateSingle(p, last); // Ensure correct coloring. q->red = g->node[dir2]->red = 1; g->node[dir2]->node[0]->red = 0; g->node[dir2]->node[1]->red = 0; } } } } } // Replace and remove. ASMJIT_ASSERT(f != NULL); ASMJIT_ASSERT(f != reinterpret_cast(&head)); ASMJIT_ASSERT(q != reinterpret_cast(&head)); if (f != q) f->fillData(q); p->node[p->node[1] == q] = q->node[q->node[0] == NULL]; // Update root and make it black. if ((_root = head.node[1]) != NULL) _root->red = 0; // Unlink. MemNode* next = q->next; MemNode* prev = q->prev; if (prev) { prev->next = next; } else { _first = next; } if (next) { next->prev = prev; } else { _last = prev; } if (_optimal == q) { _optimal = prev ? prev : next; } return q; } MemNode* MemoryManagerPrivate::findPtr(uint8_t* mem) { MemNode* cur = _root; while (cur) { uint8_t* curMem = cur->mem; if (mem < curMem) { // Go left. cur = cur->node[0]; continue; } else { uint8_t* curEnd = curMem + cur->size; if (mem >= curEnd) { // Go right. cur = cur->node[1]; continue; } else { // Match. break; } } } return cur; } // ============================================================================ // [AsmJit::MemoryManager] // ============================================================================ MemoryManager::MemoryManager() { } MemoryManager::~MemoryManager() { } MemoryManager* MemoryManager::getGlobal() { static VirtualMemoryManager memmgr; return &memmgr; } // ============================================================================ // [AsmJit::VirtualMemoryManager] // ============================================================================ #if !defined(ASMJIT_WINDOWS) VirtualMemoryManager::VirtualMemoryManager() { MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate(); _d = (void*)d; } #else VirtualMemoryManager::VirtualMemoryManager() { MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate(GetCurrentProcess()); _d = (void*)d; } VirtualMemoryManager::VirtualMemoryManager(HANDLE hProcess) { MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate(hProcess); _d = (void*)d; } #endif // ASMJIT_WINDOWS VirtualMemoryManager::~VirtualMemoryManager() { MemoryManagerPrivate* d = reinterpret_cast(_d); delete d; } void* VirtualMemoryManager::alloc(size_t size, uint32_t type) { MemoryManagerPrivate* d = reinterpret_cast(_d); if (type == kMemAllocPermanent) return d->allocPermanent(size); else return d->allocFreeable(size); } bool VirtualMemoryManager::free(void* address) { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->free(address); } bool VirtualMemoryManager::shrink(void* address, size_t used) { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->shrink(address, used); } void VirtualMemoryManager::freeAll() { MemoryManagerPrivate* d = reinterpret_cast(_d); // Calling MemoryManager::freeAll() will never keep allocated memory. return d->freeAll(false); } size_t VirtualMemoryManager::getUsedBytes() { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->_used; } size_t VirtualMemoryManager::getAllocatedBytes() { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->_allocated; } bool VirtualMemoryManager::getKeepVirtualMemory() const { MemoryManagerPrivate* d = reinterpret_cast(_d); return d->_keepVirtualMemory; } void VirtualMemoryManager::setKeepVirtualMemory(bool keepVirtualMemory) { MemoryManagerPrivate* d = reinterpret_cast(_d); d->_keepVirtualMemory = keepVirtualMemory; } // ============================================================================ // [AsmJit::VirtualMemoryManager - Debug] // ============================================================================ #if defined(ASMJIT_MEMORY_MANAGER_DUMP) struct GraphVizContext { GraphVizContext(); ~GraphVizContext(); bool openFile(const char* fileName); void closeFile(); void dumpNode(MemNode* node); void connect(MemNode* node, MemNode* other, const char* dst); FILE* file; }; GraphVizContext::GraphVizContext() : file(NULL) { } GraphVizContext::~GraphVizContext() { closeFile(); } bool GraphVizContext::openFile(const char* fileName) { file = fopen(fileName, "w"); return file != NULL; } void GraphVizContext::closeFile() { if (file) { fclose(file); file = NULL; } } void GraphVizContext::dumpNode(MemNode* node) { fprintf(file, " NODE_%p [shape=record, style=filled, color=%s, label=\"|Mem: %p, Used: %d/%d|\"];\n", node, node->red ? "red" : "gray", node->mem, node->used, node->size); if (node->node[0]) connect(node, node->node[0], "L"); if (node->node[1]) connect(node, node->node[1], "R"); } void GraphVizContext::connect(MemNode* node, MemNode* other, const char* dst) { dumpNode(other); fprintf(file, " NODE_%p:%s -> NODE_%p:C", node, dst, other); if (other->red) fprintf(file, " [style=bold, color=red]"); fprintf(file, ";\n"); } void VirtualMemoryManager::dump(const char* fileName) { MemoryManagerPrivate* d = reinterpret_cast(_d); GraphVizContext ctx; if (!ctx.openFile(fileName)) return; fprintf(ctx.file, "digraph {\n"); if (d->_root) ctx.dumpNode(d->_root); fprintf(ctx.file, "}\n"); } #endif // ASMJIT_MEMORY_MANAGER_DUMP } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/zonememory.h0000644000175000017500000001104312140261627022345 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_ZONEMEMORY_H #define _ASMJIT_CORE_ZONEMEMORY_H // [Dependencies - AsmJit] #include "../core/build.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::ZoneChunk] // ============================================================================ //! @internal //! //! @brief One allocated chunk of memory. struct ZoneChunk { // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Get count of remaining (unused) bytes in chunk. inline size_t getRemainingBytes() const { return size - pos; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Link to previous chunk. ZoneChunk* prev; //! @brief Position in this chunk. size_t pos; //! @brief Size of this chunk (in bytes). size_t size; //! @brief Data. uint8_t data[sizeof(void*)]; }; // ============================================================================ // [AsmJit::ZoneMemory] // ============================================================================ //! @brief Memory allocator designed to fast alloc memory that will be freed //! in one step. //! //! @note This is hackery for performance. Concept is that objects created //! by @c ZoneMemory are freed all at once. This means that lifetime of //! these objects are the same as the zone object itself. struct ZoneMemory { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new instance of @c ZoneMemory. //! @param chunkSize Default size for one zone chunk. ASMJIT_API ZoneMemory(size_t chunkSize); //! @brief Destroy @ref ZoneMemory instance. ASMJIT_API ~ZoneMemory(); // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- //! @brief Allocate @c size bytes of memory and return pointer to it. //! //! Pointer allocated by this way will be valid until @c ZoneMemory object //! is destroyed. To create class by this way use placement @c new and //! @c delete operators: //! //! @code //! // Example of allocating simple class //! //! // Your class //! class Object //! { //! // members... //! }; //! //! // Your function //! void f() //! { //! // We are using AsmJit namespace //! using namespace AsmJit //! //! // Create zone object with chunk size of 65536 bytes. //! ZoneMemory zone(65536); //! //! // Create your objects using zone object allocating, for example: //! Object* obj = new(zone.alloc(sizeof(YourClass))) Object(); //! //! // ... lifetime of your objects ... //! //! // Destroy your objects: //! obj->~Object(); //! //! // ZoneMemory destructor will free all memory allocated through it, //! // alternative is to call @c zone.reset(). //! } //! @endcode ASMJIT_API void* alloc(size_t size); //! @brief Helper to duplicate string. ASMJIT_API char* sdup(const char* str); //! @brief Free all allocated memory except first block that remains for reuse. //! //! Note that this method will invalidate all instances using this memory //! allocated by this zone instance. ASMJIT_API void clear(); //! @brief Free all allocated memory at once. //! //! Note that this method will invalidate all instances using this memory //! allocated by this zone instance. ASMJIT_API void reset(); //! @brief Get total size of allocated objects - by @c alloc(). inline size_t getTotal() const { return _total; } //! @brief Get (default) chunk size. inline size_t getChunkSize() const { return _chunkSize; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Last allocated chunk of memory. ZoneChunk* _chunks; //! @brief Total size of allocated objects - by @c alloc() method. size_t _total; //! @brief One chunk size. size_t _chunkSize; }; //! @} } // AsmJit namespace #endif // _ASMJIT_CORE_ZONEMEMORY_H desmume-0.9.9/src/utils/AsmJit/core/buffer.cpp0000644000175000017500000000316412140261627021752 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/buffer.h" #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Buffer] // ============================================================================ void Buffer::emitData(const void* ptr, size_t len) { size_t max = getCapacity() - getOffset(); if (max < len && !realloc(getOffset() + len)) { return; } memcpy(_cur, ptr, len); _cur += len; } bool Buffer::realloc(size_t to) { if (getCapacity() < to) { size_t len = getOffset(); uint8_t *newdata; if (_data != NULL) newdata = (uint8_t*)ASMJIT_REALLOC(_data, to); else newdata = (uint8_t*)ASMJIT_MALLOC(to); if (newdata == NULL) return false; _data = newdata; _cur = newdata + len; _max = newdata + to; _max -= (to >= kBufferGrow) ? kBufferGrow : to; _capacity = to; } return true; } bool Buffer::grow() { size_t to = _capacity; if (to < 512) to = 1024; else if (to > 65536) to += 65536; else to <<= 1; return realloc(to); } void Buffer::reset() { if (_data == NULL) return; ASMJIT_FREE(_data); _data = NULL; _cur = NULL; _max = NULL; _capacity = 0; } uint8_t* Buffer::take() { uint8_t* data = _data; _data = NULL; _cur = NULL; _max = NULL; _capacity = 0; return data; } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/compiler.cpp0000644000175000017500000001353012140261627022311 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/compiler.h" #include "../core/compilercontext.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../core/cpuinfo.h" #include "../core/intutil.h" #include "../core/logger.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Compiler - Construction / Destruction] // ============================================================================ Compiler::Compiler(Context* context) : _zoneMemory(16384 - sizeof(ZoneChunk) - 32), _linkMemory(1024 - 32), _context(context != NULL ? context : static_cast(JitContext::getGlobal())), _logger(NULL), _error(0), _properties(0), _emitOptions(0), _finished(false), _first(NULL), _last(NULL), _current(NULL), _func(NULL), _cc(NULL), _varNameId(0) { } Compiler::~Compiler() { reset(); } // ============================================================================ // [AsmJit::Compiler - Logging] // ============================================================================ void Compiler::setLogger(Logger* logger) { _logger = logger; } // ============================================================================ // [AsmJit::Compiler - Error Handling] // ============================================================================ void Compiler::setError(uint32_t error) { _error = error; if (_error == kErrorOk) return; if (_logger) _logger->logFormat("*** COMPILER ERROR: %s (%u).\n", getErrorString(error), (unsigned int)error); } // ============================================================================ // [AsmJit::Compiler - Properties] // ============================================================================ uint32_t Compiler::getProperty(uint32_t propertyId) { if (propertyId > 31) return 0; return (_properties & IntUtil::maskFromIndex(propertyId)) != 0; } void Compiler::setProperty(uint32_t propertyId, uint32_t value) { if (propertyId > 31) return; if (value) _properties |= IntUtil::maskFromIndex(propertyId); else _properties &= ~IntUtil::maskFromIndex(propertyId); } // ============================================================================ // [AsmJit::Compiler - Clear / Reset] // ============================================================================ void Compiler::clear() { _purge(); if (_error != kErrorOk) setError(kErrorOk); } void Compiler::reset() { _purge(); _zoneMemory.reset(); _linkMemory.reset(); _targets.reset(); _vars.reset(); if (_error != kErrorOk) setError(kErrorOk); } void Compiler::_purge() { _zoneMemory.clear(); _linkMemory.clear(); _emitOptions = 0; _finished = false; _first = NULL; _last = NULL; _current = NULL; _func = NULL; _targets.clear(); _vars.clear(); _cc = NULL; _varNameId = 0; } // ============================================================================ // [AsmJit::Compiler - Item Management] // ============================================================================ CompilerItem* Compiler::setCurrentItem(CompilerItem* item) { CompilerItem* old = _current; _current = item; return old; } void Compiler::addItem(CompilerItem* item) { ASMJIT_ASSERT(item != NULL); ASMJIT_ASSERT(item->_prev == NULL); ASMJIT_ASSERT(item->_next == NULL); if (_current == NULL) { if (_first == NULL) { _first = item; _last = item; } else { item->_next = _first; _first->_prev = item; _first = item; } } else { CompilerItem* prev = _current; CompilerItem* next = _current->_next; item->_prev = prev; item->_next = next; prev->_next = item; if (next) next->_prev = item; else _last = item; } _current = item; } void Compiler::addItemAfter(CompilerItem* item, CompilerItem* ref) { ASMJIT_ASSERT(item != NULL); ASMJIT_ASSERT(item->_prev == NULL); ASMJIT_ASSERT(item->_next == NULL); ASMJIT_ASSERT(ref != NULL); CompilerItem* prev = ref; CompilerItem* next = ref->_next; item->_prev = prev; item->_next = next; prev->_next = item; if (next) next->_prev = item; else _last = item; } void Compiler::removeItem(CompilerItem* item) { CompilerItem* prev = item->_prev; CompilerItem* next = item->_next; if (_first == item) { _first = next; } else { prev->_next = next; } if (_last == item) { _last = prev; } else { next->_prev = prev; } item->_prev = NULL; item->_next = NULL; if (_current == item) _current = prev; } // ============================================================================ // [AsmJit::Compiler - Comment] // ============================================================================ void Compiler::comment(const char* fmt, ...) { char buf[128]; char* p = buf; if (fmt) { *p++ = ';'; *p++ = ' '; va_list ap; va_start(ap, fmt); p += vsnprintf(p, 100, fmt, ap); va_end(ap); } *p++ = '\n'; *p = '\0'; CompilerComment* item = Compiler_newItem(this, buf); addItem(item); } // ============================================================================ // [AsmJit::Compiler - Embed] // ============================================================================ void Compiler::embed(const void* data, size_t len) { // Align length to 16 bytes. size_t alignedSize = IntUtil::align(len, sizeof(uintptr_t)); void* p = _zoneMemory.alloc(sizeof(CompilerEmbed) - sizeof(void*) + alignedSize); if (p == NULL) return; CompilerEmbed* item = new(p) CompilerEmbed(this, data, len); addItem(item); } } // AsmJit namespace // [Api-Begin] #include "../core/apibegin.h" desmume-0.9.9/src/utils/AsmJit/core/apiend.h0000644000175000017500000000052412140261627021403 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [MSVC] #if defined(_MSC_VER) // Pop disabled warnings by ApiBegin.h #pragma warning(pop) // Rename symbols back. #undef vsnprintf #undef snprintf #endif // _MSC_VER // [GNUC] #if defined(__GNUC__) #endif // __GNUC__ desmume-0.9.9/src/utils/AsmJit/core/defs.cpp0000644000175000017500000000212012140261627021411 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/defs.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::getErrorString] // ============================================================================ const char* getErrorString(uint32_t error) { static const char* errorMessage[] = { "No error", "No heap memory", "No virtual memory", "Unknown instruction", "Illegal instruction", "Illegal addressing", "Illegal short jump", "No function defined", "Incomplete function", "Not enough registers", "Registers overlap", "Incompatible argument", "Incompatible return value", "Unknown error" }; // Saturate error code to be able to use errorMessage[]. if (error > kErrorCount) error = kErrorCount; return errorMessage[error]; } } // AsmJit // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/zonememory.cpp0000644000175000017500000000424612140261627022707 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/defs.h" #include "../core/intutil.h" #include "../core/zonememory.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::ZoneMemory] // ============================================================================ ZoneMemory::ZoneMemory(size_t chunkSize) { _chunks = NULL; _total = 0; _chunkSize = chunkSize; } ZoneMemory::~ZoneMemory() { reset(); } void* ZoneMemory::alloc(size_t size) { ZoneChunk* cur = _chunks; // Align to 4 or 8 bytes. size = IntUtil::align(size, sizeof(size_t)); if (cur == NULL || cur->getRemainingBytes() < size) { size_t chSize = _chunkSize; if (chSize < size) chSize = size; cur = (ZoneChunk*)ASMJIT_MALLOC(sizeof(ZoneChunk) - sizeof(void*) + chSize); if (cur == NULL) return NULL; cur->prev = _chunks; cur->pos = 0; cur->size = chSize; _chunks = cur; } uint8_t* p = cur->data + cur->pos; cur->pos += size; _total += size; ASMJIT_ASSERT(cur->pos <= cur->size); return (void*)p; } char* ZoneMemory::sdup(const char* str) { if (str == NULL) return NULL; size_t len = strlen(str); if (len == 0) return NULL; // Include NULL terminator and limit string length. if (++len > 256) len = 256; char* m = reinterpret_cast(alloc(IntUtil::align(len, 16))); if (m == NULL) return NULL; memcpy(m, str, len); m[len - 1] = '\0'; return m; } void ZoneMemory::clear() { ZoneChunk* cur = _chunks; if (cur == NULL) return; cur = cur->prev; while (cur != NULL) { ZoneChunk* prev = cur->prev; ASMJIT_FREE(cur); cur = prev; } _chunks->pos = 0; _chunks->prev = NULL; _total = 0; } void ZoneMemory::reset() { ZoneChunk* cur = _chunks; _chunks = NULL; _total = 0; while (cur != NULL) { ZoneChunk* prev = cur->prev; ASMJIT_FREE(cur); cur = prev; } } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/operand.h0000644000175000017500000004226312140261627021601 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_OPERAND_H #define _ASMJIT_CORE_OPERAND_H // [Dependencies - AsmJit] #include "../core/defs.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::_OperandData] // ============================================================================ //! @internal //! //! @brief Base operand data. struct _OpBase { //! @brief Type of operand, see @c kOperandType. uint8_t op; //! @brief Size of operand (register, address, immediate, or variable). uint8_t size; //! @brief Not used. uint8_t reserved[2]; //! @brief Operand ID (private variable for @c Assembler and @c Compiler classes). //! //! @note Uninitialized operand has always zero id. uint32_t id; }; //! @internal //! //! @brief Label operand data. struct _OpLabel { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandLabel). uint8_t op; //! @brief Size of label, currently not used. uint8_t size; //! @brief Not used. uint8_t reserved[2]; //! @brief Operand ID. uint32_t id; }; //! @internal //! //! @brief Register operand data. struct _OpReg { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandReg). uint8_t op; //! @brief Size of register. uint8_t size; //! @brief Not used. uint8_t reserved[2]; //! @brief Operand id. uint32_t id; //! @brief Register/Variable code, see @c REG. uint32_t code; }; //! @internal //! //! @brief Variable operand data. struct _OpVar { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandVar). uint8_t op; //! @brief Size of variable (0 if don't known). uint8_t size; //! @brief Not used. uint8_t reserved[2]; //! @brief Operand ID. uint32_t id; //! @brief Type (and later also code) of register, see @c kX86RegType, @c kX86RegCode. //! //! @note Register code and variable code are two different things. In most //! cases regCode is very related to varType, but general purpose registers //! are divided to 64-bit, 32-bit, 16-bit and 8-bit entities so the regCode //! can be used to access these, varType remains unchanged from the //! initialization state. Variable type describes mainly variable type and //! home memory size. uint32_t regCode; //! @brief Type of variable. See @c kX86VarType enum. uint32_t varType; }; //! @internal //! //! @brief Memory operand data. struct _OpMem { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandMem). uint8_t op; //! @brief Size of pointer. uint8_t size; //! @brief Memory operand type, see @c kOperandMemType. uint8_t type; //! @brief Segment override prefix, see @c kX86Seg. uint8_t segment : 4; //! @brief Emit MOV/LEA instruction using 16-bit/32-bit form of base/index //! registers. uint8_t sizePrefix : 1; //! @brief Index register shift/scale (0 to 3 inclusive, see @c kScale). uint8_t shift : 3; //! @brief Operand ID. uint32_t id; //! @brief Base register index, variable or label id. uint32_t base; //! @brief Index register index or variable id. uint32_t index; //! @brief Target (for 32-bit, absolute address). void* target; //! @brief Displacement. sysint_t displacement; }; //! @internal //! //! @brief Immediate operand data. struct _OpImm { //! @brief Type of operand, see @c kOperandType (in this case @c kOperandImm).. uint8_t op; //! @brief Size of immediate (or 0 to autodetect). uint8_t size; //! @brief @c true if immediate is unsigned. uint8_t isUnsigned; //! @brief Not used. uint8_t reserved; //! @brief Operand ID. uint32_t id; //! @brief Immediate value. sysint_t value; }; //! @internal //! //! @brief Binary operand data. struct _OpBin { //! @brief First four 32-bit integers. uint32_t u32[4]; //! @brief Second two 32-bit or 64-bit integers. uintptr_t uptr[2]; }; // ============================================================================ // [AsmJit::Operand] // ============================================================================ //! @brief Operand can contain register, memory location, immediate, or label. struct Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create an uninitialized operand. inline Operand() { memset(this, 0, sizeof(Operand)); _base.id = kInvalidValue; } //! @brief Create a reference to @a other operand. inline Operand(const Operand& other) { _init(other); } #if !defined(ASMJIT_NODOC) inline Operand(const _DontInitialize&) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Init & Copy] // -------------------------------------------------------------------------- //! @internal //! //! @brief Initialize operand to @a other (used by constructors). inline void _init(const Operand& other) { memcpy(this, &other, sizeof(Operand)); } //! @internal //! //! @brief Initialize operand to @a other (used by assign operators). inline void _copy(const Operand& other) { memcpy(this, &other, sizeof(Operand)); } // -------------------------------------------------------------------------- // [Data] // -------------------------------------------------------------------------- template inline T& getData() { return reinterpret_cast(_base); } template inline const T& getData() const { return reinterpret_cast(_base); } // -------------------------------------------------------------------------- // [Type] // -------------------------------------------------------------------------- //! @brief Get type of the operand, see @c kOperandType. inline uint32_t getType() const { return _base.op; } //! @brief Get whether the operand is none (@c kOperandNone). inline bool isNone() const { return (_base.op == kOperandNone); } //! @brief Get whether the operand is any (general purpose, mmx or sse) register (@c kOperandReg). inline bool isReg() const { return (_base.op == kOperandReg); } //! @brief Get whether the operand is memory address (@c kOperandMem). inline bool isMem() const { return (_base.op == kOperandMem); } //! @brief Get whether the operand is immediate (@c kOperandImm). inline bool isImm() const { return (_base.op == kOperandImm); } //! @brief Get whether the operand is label (@c kOperandLabel). inline bool isLabel() const { return (_base.op == kOperandLabel); } //! @brief Get whether the operand is variable (@c kOperandVar). inline bool isVar() const { return (_base.op == kOperandVar); } //! @brief Get whether the operand is variable or memory. inline bool isVarMem() const { return ((_base.op & (kOperandVar | kOperandMem)) != 0); } //! @brief Get whether the operand is register and type of register is @a regType. inline bool isRegType(uint32_t regType) const { return (_base.op == kOperandReg) & ((_reg.code & kRegTypeMask) == regType); } //! @brief Get whether the operand is register and code of register is @a regCode. inline bool isRegCode(uint32_t regCode) const { return (_base.op == kOperandReg) & (_reg.code == regCode); } //! @brief Get whether the operand is register and index of register is @a regIndex. inline bool isRegIndex(uint32_t regIndex) const { return (_base.op == kOperandReg) & ((_reg.code & kRegIndexMask) == (regIndex & kRegIndexMask)); } //! @brief Get whether the operand is any register or memory. inline bool isRegMem() const { return ((_base.op & (kOperandReg | kOperandMem)) != 0); } //! @brief Get whether the operand is register of @a regType type or memory. inline bool isRegTypeMem(uint32_t regType) const { return ((_base.op == kOperandReg) & ((_reg.code & kRegTypeMask) == regType)) | (_base.op == kOperandMem); } // -------------------------------------------------------------------------- // [Size] // -------------------------------------------------------------------------- //! @brief Get size of the operand in bytes. inline uint32_t getSize() const { return _base.size; } // -------------------------------------------------------------------------- // [Id] // -------------------------------------------------------------------------- //! @brief Return operand Id (Operand Id's are used internally by //! @c Assembler and @c Compiler classes). //! //! @note There is no way how to change or remove operand id. If you don't //! need the operand just assign different operand to this one. inline uint32_t getId() const { return _base.id; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- union { //! @brief Base operand data. _OpBase _base; //! @brief Label operand data. _OpLabel _lbl; //! @brief Register operand data. _OpReg _reg; //! @brief Variable operand data. _OpVar _var; //! @brief Memory operand data. _OpMem _mem; //! @brief Immediate operand data. _OpImm _imm; //! @brief Binary data. _OpBin _bin; }; }; ASMJIT_VAR const Operand noOperand; // ============================================================================ // [AsmJit::Reg] // ============================================================================ //! @brief Base class for all register operands. struct Reg : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new base register. inline Reg(uint32_t code, uint32_t size) : Operand(_DontInitialize()) { _reg.op = kOperandReg; _reg.size = (uint8_t)size; _reg.id = kInvalidValue; _reg.code = code; } //! @brief Create a new reference to @a other. inline Reg(const Reg& other) : Operand(other) {} #if !defined(ASMJIT_NODOC) inline Reg(const _DontInitialize& dontInitialize) : Operand(dontInitialize) {} #endif // ASMJIT_NODOC // -------------------------------------------------------------------------- // [Reg Specific] // -------------------------------------------------------------------------- //! @brief Get register code, see @c REG. inline uint32_t getRegCode() const { return (uint32_t)(_reg.code); } //! @brief Get register type, see @c REG. inline uint32_t getRegType() const { return (uint32_t)(_reg.code & kRegTypeMask); } //! @brief Get register index (value from 0 to 7/15). inline uint32_t getRegIndex() const { return (uint32_t)(_reg.code & kRegIndexMask); } //! @brief Get whether register code is equal to @a code. inline bool isRegCode(uint32_t code) const { return _reg.code == code; } //! @brief Get whether register code is equal to @a type. inline bool isRegType(uint32_t type) const { return (uint32_t)(_reg.code & kRegTypeMask) == type; } //! @brief Get whether register index is equal to @a index. inline bool isRegIndex(uint32_t index) const { return (uint32_t)(_reg.code & kRegIndexMask) == index; } //! @brief Set register code to @a code. inline Reg& setCode(uint32_t code) { _reg.code = code; return *this; } //! @brief Set register size to @a size. inline Reg& setSize(uint32_t size) { _reg.size = static_cast(size); return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- inline Reg& operator=(const Reg& other) { _copy(other); return *this; } inline bool operator==(const Reg& other) const { return getRegCode() == other.getRegCode(); } inline bool operator!=(const Reg& other) const { return getRegCode() != other.getRegCode(); } }; // ============================================================================ // [AsmJit::Imm] // ============================================================================ //! @brief Immediate operand. //! //! Immediate operand is part of instruction (it's inlined after it). //! //! To create immediate operand, use @c imm() and @c uimm() constructors //! or constructors provided by @c Immediate class itself. struct Imm : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new immediate value (initial value is 0). Imm() : Operand(_DontInitialize()) { _imm.op = kOperandImm; _imm.size = 0; _imm.isUnsigned = false; _imm.reserved = 0; _imm.id = kInvalidValue; _imm.value = 0; } //! @brief Create a new signed immediate value, assigning the value to @a i. Imm(sysint_t i) : Operand(_DontInitialize()) { _imm.op = kOperandImm; _imm.size = 0; _imm.isUnsigned = false; _imm.reserved = 0; _imm.id = kInvalidValue; _imm.value = i; } //! @brief Create a new signed or unsigned immediate value, assigning the value to @a i. Imm(sysint_t i, bool isUnsigned) : Operand(_DontInitialize()) { _imm.op = kOperandImm; _imm.size = 0; _imm.isUnsigned = isUnsigned; _imm.reserved = 0; _imm.id = kInvalidValue; _imm.value = i; } //! @brief Create a new immediate value from @a other. inline Imm(const Imm& other) : Operand(other) { } // -------------------------------------------------------------------------- // [Immediate Specific] // -------------------------------------------------------------------------- //! @brief Get whether an immediate is unsigned value. inline bool isUnsigned() const { return _imm.isUnsigned != 0; } //! @brief Get signed immediate value. inline sysint_t getValue() const { return _imm.value; } //! @brief Get unsigned immediate value. inline sysuint_t getUValue() const { return static_cast(_imm.value); } //! @brief Set immediate value as signed type to @a val. inline Imm& setValue(sysint_t val, bool isUnsigned = false) { _imm.value = val; _imm.isUnsigned = isUnsigned; return *this; } //! @brief Set immediate value as unsigned type to @a val. inline Imm& setUValue(sysuint_t val) { _imm.value = (sysint_t)val; _imm.isUnsigned = true; return *this; } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- //! @brief Assign a signed value @a val to the immediate operand. inline Imm& operator=(sysint_t val) { setValue(val); return *this; } //! @brief Assign @a other to the immediate operand. inline Imm& operator=(const Imm& other) { _copy(other); return *this; } }; //! @brief Create signed immediate value operand. ASMJIT_API Imm imm(sysint_t i); //! @brief Create unsigned immediate value operand. ASMJIT_API Imm uimm(sysuint_t i); // ============================================================================ // [AsmJit::Label] // ============================================================================ //! @brief Label (jump target or data location). //! //! Label represents locations typically used as jump targets, but may be also //! used as position where are stored constants or static variables. If you //! want to use @c Label you need first to associate it with @c Assembler or //! @c Compiler instance. To create new label use @c Assembler::newLabel() or //! @c Compiler::newLabel(). //! //! Example of using labels: //! //! @code //! // Create Assembler or Compiler instance. //! X86Assembler a; //! //! // Create Label instance. //! Label L_1(a); //! //! // ... your code ... //! //! // Using label, see @c AsmJit::Assembler or @c AsmJit::Compiler. //! a.jump(L_1); //! //! // ... your code ... //! //! // Bind label to current position, see @c AsmJit::Assembler::bind() or //! // @c AsmJit::Compiler::bind(). //! a.bind(L_1); //! @endcode struct Label : public Operand { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create new, unassociated label. inline Label() : Operand(_DontInitialize()) { _lbl.op = kOperandLabel; _lbl.size = 0; _lbl.id = kInvalidValue; } //! @brief Create reference to another label. inline Label(const Label& other) : Operand(other) {} //! @brief Destroy the label. inline ~Label() {} // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- #if !defined(ASMJIT_NODOC) inline Label& operator=(const Label& other) { _copy(other); return *this; } inline bool operator==(const Label& other) const { return _base.id == other._base.id; } inline bool operator!=(const Label& other) const { return _base.id != other._base.id; } #endif // ASMJIT_NODOC }; //! @} } // AsmJit namespace // [Guard] #endif // _ASMJIT_CORE_OPERAND_H desmume-0.9.9/src/utils/AsmJit/core/cpuinfo.h0000644000175000017500000000665312140261627021617 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_CPUINFO_H #define _ASMJIT_CORE_CPUINFO_H // [Dependencies - AsmJit] #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::CpuInfo] // ============================================================================ //! @brief Informations about host cpu. struct CpuInfo { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline CpuInfo(uint32_t size = sizeof(CpuInfo)) : _size(size) { } // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get CPU vendor string. inline const char* getVendorString() const { return _vendorString; } //! @brief Get CPU brand string. inline const char* getBrandString() const { return _brandString; } //! @brief Get CPU vendor ID. inline uint32_t getVendorId() const { return _vendorId; } //! @brief Get CPU family ID. inline uint32_t getFamily() const { return _family; } //! @brief Get CPU model ID. inline uint32_t getModel() const { return _model; } //! @brief Get CPU stepping. inline uint32_t getStepping() const { return _stepping; } //! @brief Get CPU count. inline uint32_t getNumberOfProcessors() const { return _numberOfProcessors; } //! @brief Get CPU features. inline uint32_t getFeatures() const { return _features; } //! @brief Get CPU bugs. inline uint32_t getBugs() const { return _bugs; } //! @brief Get whether CPU has feature @a feature. inline bool hasFeature(uint32_t feature) { return (_features & feature) != 0; } //! @brief Get whether CPU has bug @a bug. inline bool hasBug(uint32_t bug) { return (_bugs & bug) != 0; } // -------------------------------------------------------------------------- // [Statics] // -------------------------------------------------------------------------- //! @brief Detect number of processors. ASMJIT_API static uint32_t detectNumberOfProcessors(); //! @brief Get global instance of @ref CpuInfo. ASMJIT_API static const CpuInfo* getGlobal(); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Size of CpuInfo structure (in bytes). uint32_t _size; //! @brief Cpu short vendor string. char _vendorString[16]; //! @brief Cpu long vendor string (brand). char _brandString[64]; //! @brief Cpu vendor id (see @c AsmJit::CpuInfo::VendorId enum). uint32_t _vendorId; //! @brief Cpu family ID. uint32_t _family; //! @brief Cpu model ID. uint32_t _model; //! @brief Cpu stepping. uint32_t _stepping; //! @brief Number of processors or cores. uint32_t _numberOfProcessors; //! @brief Cpu features bitfield, see @c AsmJit::CpuInfo::Feature enum). uint32_t _features; //! @brief Cpu bugs bitfield, see @c AsmJit::CpuInfo::Bug enum). uint32_t _bugs; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_CPUINFO_H desmume-0.9.9/src/utils/AsmJit/core/logger.cpp0000644000175000017500000001174212140261627021761 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/logger.h" // [Dependencies - C] #include // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::Logger - Construction / Destruction] // ============================================================================ Logger::Logger() : _flags(kLoggerIsEnabled | kLoggerIsUsed) { memset(_instructionPrefix, 0, ASMJIT_ARRAY_SIZE(_instructionPrefix)); } Logger::~Logger() { } // ============================================================================ // [AsmJit::Logger - Logging] // ============================================================================ void Logger::logFormat(const char* fmt, ...) { char buf[1024]; size_t len; va_list ap; va_start(ap, fmt); len = vsnprintf(buf, 1023, fmt, ap); va_end(ap); logString(buf, len); } // ============================================================================ // [AsmJit::Logger - Enabled] // ============================================================================ void Logger::setEnabled(bool enabled) { if (enabled) _flags |= kLoggerIsEnabled | kLoggerIsUsed; else _flags &= ~(kLoggerIsEnabled | kLoggerIsUsed); } // ============================================================================ // [AsmJit::Logger - LogBinary] // ============================================================================ void Logger::setLogBinary(bool value) { if (value) _flags |= kLoggerOutputBinary; else _flags &= ~kLoggerOutputBinary; } // ============================================================================ // [AsmJit::Logger - HexImmediate] // ============================================================================ void Logger::setHexImmediate(bool value) { if (value) _flags |= kLoggerOutputHexImmediate; else _flags &= ~kLoggerOutputHexImmediate; } // ============================================================================ // [AsmJit::Logger - HexDisplacement] // ============================================================================ void Logger::setHexDisplacement(bool value) { if (value) _flags |= kLoggerOutputHexDisplacement; else _flags &= ~kLoggerOutputHexDisplacement; } // ============================================================================ // [AsmJit::Logger - InstructionPrefix] // ============================================================================ void Logger::setInstructionPrefix(const char* prefix) { memset(_instructionPrefix, 0, ASMJIT_ARRAY_SIZE(_instructionPrefix)); if (!prefix) return; size_t length = strnlen(prefix, ASMJIT_ARRAY_SIZE(_instructionPrefix) - 1); memcpy(_instructionPrefix, prefix, length); } // ============================================================================ // [AsmJit::FileLogger - Construction / Destruction] // ============================================================================ FileLogger::FileLogger(FILE* stream) : _stream(NULL) { setStream(stream); } FileLogger::~FileLogger() { } // ============================================================================ // [AsmJit::FileLogger - Accessors] // ============================================================================ //! @brief Set file stream. void FileLogger::setStream(FILE* stream) { _stream = stream; if (isEnabled() && _stream != NULL) _flags |= kLoggerIsUsed; else _flags &= ~kLoggerIsUsed; } // ============================================================================ // [AsmJit::FileLogger - Logging] // ============================================================================ void FileLogger::logString(const char* buf, size_t len) { if (!isUsed()) return; if (len == kInvalidSize) len = strlen(buf); fwrite(buf, 1, len, _stream); } // ============================================================================ // [AsmJit::FileLogger - Enabled] // ============================================================================ void FileLogger::setEnabled(bool enabled) { if (enabled) _flags |= kLoggerIsEnabled | (_stream != NULL ? kLoggerIsUsed : 0); else _flags &= ~(kLoggerIsEnabled | kLoggerIsUsed); } // ============================================================================ // [AsmJit::StringLogger - Construction / Destruction] // ============================================================================ StringLogger::StringLogger() { } StringLogger::~StringLogger() { } // ============================================================================ // [AsmJit::StringLogger - Logging] // ============================================================================ void StringLogger::logString(const char* buf, size_t len) { if (!isUsed()) return; _stringBuilder.appendString(buf, len); } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/stringbuilder.h0000644000175000017500000001525712140261627023031 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_STRINGBUILDER_H #define _ASMJIT_CORE_STRINGBUILDER_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/defs.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::StringBuilder] // ============================================================================ //! @brief String builder. //! //! String builder was designed to be able to build a string using append like //! operation to append numbers, other strings, or signle characters. It can //! allocate it's own buffer or use a buffer created on the stack. //! //! String builder contains method specific to AsmJit functionality, used for //! logging or HTML output. struct StringBuilder { ASMJIT_NO_COPY(StringBuilder) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- ASMJIT_API StringBuilder(); ASMJIT_API ~StringBuilder(); inline StringBuilder(const _DontInitialize&) {} // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get string builder capacity. inline size_t getCapacity() const { return _capacity; } //! @brief Get length. inline size_t getLength() const { return _length; } //! @brief Get null-terminated string data. inline char* getData() { return _data; } //! @brief Get null-terminated string data (const). inline const char* getData() const { return _data; } // -------------------------------------------------------------------------- // [Prepare / Reserve] // -------------------------------------------------------------------------- //! @brief Prepare to set/append. ASMJIT_API char* prepare(uint32_t op, size_t len); //! @brief Reserve @a to bytes in string builder. ASMJIT_API bool reserve(size_t to); // -------------------------------------------------------------------------- // [Clear] // -------------------------------------------------------------------------- //! @brief Clear the content in String builder. ASMJIT_API void clear(); // -------------------------------------------------------------------------- // [Methods] // -------------------------------------------------------------------------- ASMJIT_API bool _opString(uint32_t op, const char* str, size_t len = kInvalidSize); ASMJIT_API bool _opVFormat(uint32_t op, const char* fmt, va_list ap); ASMJIT_API bool _opChars(uint32_t op, char c, size_t len); ASMJIT_API bool _opNumber(uint32_t op, uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0); ASMJIT_API bool _opHex(uint32_t op, const void* data, size_t length); //! @brief Replace the current content by @a str of @a len. inline bool setString(const char* str, size_t len = kInvalidSize) { return _opString(kStringBuilderOpSet, str, len); } //! @brief Replace the current content by formatted string @a fmt. inline bool setVFormat(const char* fmt, va_list ap) { return _opVFormat(kStringBuilderOpSet, fmt, ap); } //! @brief Replace the current content by formatted string @a fmt. ASMJIT_API bool setFormat(const char* fmt, ...); //! @brief Replace the current content by @a c of @a len. inline bool setChars(char c, size_t len) { return _opChars(kStringBuilderOpSet, c, len); } //! @brief Replace the current content by @a i.. inline bool setNumber(uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) { return _opNumber(kStringBuilderOpSet, i, base, width, flags); } //! @brief Append @a str of @a len. inline bool appendString(const char* str, size_t len = kInvalidSize) { return _opString(kStringBuilderOpAppend, str, len); } //! @brief Append a formatted string @a fmt to the current content. inline bool appendVFormat(const char* fmt, va_list ap) { return _opVFormat(kStringBuilderOpAppend, fmt, ap); } //! @brief Append a formatted string @a fmt to the current content. ASMJIT_API bool appendFormat(const char* fmt, ...); //! @brief Append @a c of @a len. inline bool appendChars(char c, size_t len) { return _opChars(kStringBuilderOpAppend, c, len); } //! @brief Append @a i. inline bool appendNumber(uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0) { return _opNumber(kStringBuilderOpAppend, i, base, width, flags); } //! @brief Check for equality with other @a str. ASMJIT_API bool eq(const char* str, size_t len = kInvalidSize) const; //! @brief Check for equality with StringBuilder @a other. inline bool eq(const StringBuilder& other) const { return eq(other._data); } // -------------------------------------------------------------------------- // [Operator Overload] // -------------------------------------------------------------------------- inline bool operator==(const StringBuilder& other) const { return eq(other); } inline bool operator!=(const StringBuilder& other) const { return !eq(other); } inline bool operator==(const char* str) const { return eq(str); } inline bool operator!=(const char* str) const { return !eq(str); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief String data. char* _data; //! @brief Length. size_t _length; //! @brief Capacity. size_t _capacity; //! @brief Whether the string can be freed. size_t _canFree; }; // ============================================================================ // [AsmJit::StringBuilderT] // ============================================================================ template struct StringBuilderT : public StringBuilder { ASMJIT_NO_COPY(StringBuilderT) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline StringBuilderT() : StringBuilder(_DontInitialize()) { _data = _embeddedData; _data[0] = 0; _length = 0; _capacity = 0; _canFree = false; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Embedded data. char _embeddedData[(N + sizeof(uintptr_t)) & ~(sizeof(uintptr_t) - 1)]; }; //! @} } // AsmJit namespace #endif // _ASMJIT_CORE_STRINGBUILDER_H desmume-0.9.9/src/utils/AsmJit/core/memorymarker.cpp0000644000175000017500000000114512140261627023210 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/build.h" #include "../core/memorymarker.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::MemoryMarker] // ============================================================================ MemoryMarker::MemoryMarker() {} MemoryMarker::~MemoryMarker() {} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/assembler.h0000644000175000017500000004240512140261627022124 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_ASSEMBLER_H #define _ASMJIT_CORE_ASSEMBLER_H // [Dependencies - AsmJit] #include "../core/buffer.h" #include "../core/context.h" #include "../core/defs.h" #include "../core/logger.h" #include "../core/podvector.h" #include "../core/zonememory.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::Assembler] // ============================================================================ //! @brief Base class for @ref Assembler. //! //! This class implements core setialization API only. The platform specific //! methods and intrinsics is implemented by derived classes. //! //! @sa @c Assembler. struct Assembler { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Creates Assembler instance. ASMJIT_API Assembler(Context* context); //! @brief Destroys Assembler instance ASMJIT_API virtual ~Assembler(); // -------------------------------------------------------------------------- // [LabelLink] // -------------------------------------------------------------------------- //! @brief Data structure used to link linked-labels. struct LabelLink { //! @brief Previous link. LabelLink* prev; //! @brief Offset. sysint_t offset; //! @brief Inlined displacement. sysint_t displacement; //! @brief RelocId if link must be absolute when relocated. sysint_t relocId; }; // -------------------------------------------------------------------------- // [LabelData] // -------------------------------------------------------------------------- //! @brief Label data. struct LabelData { //! @brief Label offset. sysint_t offset; //! @brief Label links chain. LabelLink* links; }; // -------------------------------------------------------------------------- // [RelocData] // -------------------------------------------------------------------------- // X86 architecture uses 32-bit absolute addressing model by memory operands, // but 64-bit mode uses relative addressing model (RIP + displacement). In // code we are always using relative addressing model for referencing labels // and embedded data. In 32-bit mode we must patch all references to absolute // address before we can call generated function. We are patching only memory // operands. //! @brief Code relocation data (relative vs absolute addresses). struct RelocData { //! @brief Type of relocation. uint32_t type; //! @brief Size of relocation (4 or 8 bytes). uint32_t size; //! @brief Offset from code begin address. sysint_t offset; //! @brief Relative displacement or absolute address. union { //! @brief Relative displacement from code begin address (not to @c offset). sysint_t destination; //! @brief Absolute address where to jump; void* address; }; }; // -------------------------------------------------------------------------- // [Context] // -------------------------------------------------------------------------- //! @brief Get code generator. inline Context* getContext() const { return _context; } // -------------------------------------------------------------------------- // [Memory Management] // -------------------------------------------------------------------------- //! @brief Get zone memory manager. inline ZoneMemory* getZoneMemory() const { return const_cast(&_zoneMemory); } // -------------------------------------------------------------------------- // [Logging] // -------------------------------------------------------------------------- //! @brief Get logger. inline Logger* getLogger() const { return _logger; } //! @brief Set logger to @a logger. ASMJIT_API virtual void setLogger(Logger* logger); // -------------------------------------------------------------------------- // [Error Handling] // -------------------------------------------------------------------------- //! @brief Get error code. inline uint32_t getError() const { return _error; } //! @brief Set error code. //! //! This method is virtual, because higher classes can use it to catch all //! errors. ASMJIT_API virtual void setError(uint32_t error); // -------------------------------------------------------------------------- // [Properties] // -------------------------------------------------------------------------- //! @brief Get assembler property. ASMJIT_API virtual uint32_t getProperty(uint32_t propertyId) const; //! @brief Set assembler property. ASMJIT_API virtual void setProperty(uint32_t propertyId, uint32_t value); // -------------------------------------------------------------------------- // [Capacity] // -------------------------------------------------------------------------- //! @brief Get capacity of internal code buffer. inline size_t getCapacity() const { return _buffer.getCapacity(); } // -------------------------------------------------------------------------- // [Offset] // -------------------------------------------------------------------------- //! @brief Return current offset in buffer. inline size_t getOffset() const { return _buffer.getOffset(); } //! @brief Set offset to @a o and returns previous offset. //! //! This method can be used to truncate code (previous offset is not //! recorded) or to overwrite instruction stream at position @a o. //! //! @return Previous offset value that can be uset to set offset back later. inline size_t toOffset(size_t o) { return _buffer.toOffset(o); } // -------------------------------------------------------------------------- // [GetCode / GetCodeSize] // -------------------------------------------------------------------------- //! @brief Return start of assembler code buffer. //! //! Note that buffer address can change if you emit instruction or something //! else. Use this pointer only when you finished or make sure you do not //! use returned pointer after emitting. inline uint8_t* getCode() const { return _buffer.getData(); } //! @brief Return current offset in buffer (same as getOffset() + getTramplineSize()). inline size_t getCodeSize() const { return _buffer.getOffset() + getTrampolineSize(); } // -------------------------------------------------------------------------- // [TakeCode] // -------------------------------------------------------------------------- //! @brief Take internal code buffer and NULL all pointers (you take the ownership). ASMJIT_API uint8_t* takeCode(); // -------------------------------------------------------------------------- // [Clear / Reset] // -------------------------------------------------------------------------- //! @brief Clear everything, but not deallocate buffers. ASMJIT_API void clear(); //! @brief Reset everything (means also to free all buffers). ASMJIT_API void reset(); //! @brief Called by clear() and reset() to clear all data related to derived //! class implementation. ASMJIT_API virtual void _purge(); // -------------------------------------------------------------------------- // [EnsureSpace] // -------------------------------------------------------------------------- //! @brief Ensure space for next instruction. //! //! Note that this method can return false. It's rare and probably you never //! get this, but in some situations it's still possible. inline bool ensureSpace() { return _buffer.ensureSpace(); } // -------------------------------------------------------------------------- // [GetTrampolineSize] // -------------------------------------------------------------------------- //! @brief Get size of all possible trampolines needed to successfuly generate //! relative jumps to absolute addresses. This value is only non-zero if jmp //! of call instructions were used with immediate operand (this means jump or //! call absolute address directly). //! //! Currently only _emitJmpOrCallReloc() method can increase trampoline size //! value. inline size_t getTrampolineSize() const { return _trampolineSize; } // -------------------------------------------------------------------------- // [Buffer - Getters] // -------------------------------------------------------------------------- //! @brief Get byte at position @a pos. inline uint8_t getByteAt(size_t pos) const { return _buffer.getByteAt(pos); } //! @brief Get word at position @a pos. inline uint16_t getWordAt(size_t pos) const { return _buffer.getWordAt(pos); } //! @brief Get dword at position @a pos. inline uint32_t getDWordAt(size_t pos) const { return _buffer.getDWordAt(pos); } //! @brief Get qword at position @a pos. inline uint64_t getQWordAt(size_t pos) const { return _buffer.getQWordAt(pos); } //! @brief Get int32_t at position @a pos. inline int32_t getInt32At(size_t pos) const { return (int32_t)_buffer.getDWordAt(pos); } //! @brief Get int64_t at position @a pos. inline int64_t getInt64At(size_t pos) const { return (int64_t)_buffer.getQWordAt(pos); } //! @brief Get intptr_t at position @a pos. inline intptr_t getIntPtrTAt(size_t pos) const { return _buffer.getIntPtrTAt(pos); } //! @brief Get uintptr_t at position @a pos. inline uintptr_t getUIntPtrTAt(size_t pos) const { return _buffer.getUIntPtrTAt(pos); } //! @brief Get uintptr_t at position @a pos. inline size_t getSizeTAt(size_t pos) const { return _buffer.getSizeTAt(pos); } // -------------------------------------------------------------------------- // [Buffer - Setters] // -------------------------------------------------------------------------- //! @brief Set byte at position @a pos. inline void setByteAt(size_t pos, uint8_t x) { _buffer.setByteAt(pos, x); } //! @brief Set word at position @a pos. inline void setWordAt(size_t pos, uint16_t x) { _buffer.setWordAt(pos, x); } //! @brief Set dword at position @a pos. inline void setDWordAt(size_t pos, uint32_t x) { _buffer.setDWordAt(pos, x); } //! @brief Set qword at position @a pos. inline void setQWordAt(size_t pos, uint64_t x) { _buffer.setQWordAt(pos, x); } //! @brief Set int32_t at position @a pos. inline void setInt32At(size_t pos, int32_t x) { _buffer.setDWordAt(pos, (uint32_t)x); } //! @brief Set int64_t at position @a pos. inline void setInt64At(size_t pos, int64_t x) { _buffer.setQWordAt(pos, (uint64_t)x); } //! @brief Set intptr_t at position @a pos. inline void setIntPtrTAt(size_t pos, intptr_t x) { _buffer.setIntPtrTAt(pos, x); } //! @brief Set uintptr_t at position @a pos. inline void setUInt64At(size_t pos, uintptr_t x) { _buffer.setUIntPtrTAt(pos, x); } //! @brief Set size_t at position @a pos. inline void setSizeTAt(size_t pos, size_t x) { _buffer.setSizeTAt(pos, x); } // -------------------------------------------------------------------------- // [CanEmit] // -------------------------------------------------------------------------- //! @brief Get whether the instruction can be emitted. //! //! This function behaves like @c ensureSpace(), but it also checks if //! assembler is in error state and in that case it returns @c false. //! Assembler internally always uses this function before new instruction is //! emitted. //! //! It's implemented like: //! return ensureSpace() && !getError(); inline bool canEmit() { // If there is an error, we can't emit another instruction until last error // is cleared by calling @c setError(kErrorOk). If something caused the // error while generating code it's probably fatal in all cases. You can't // use generated code anymore, because you are not sure about the status. if (_error) return false; // The ensureSpace() method returns true on success and false on failure. We // are catching return value and setting error code here. if (ensureSpace()) return true; // If we are here, there is memory allocation error. Note that this is HEAP // allocation error, virtual allocation error can be caused only by // AsmJit::VirtualMemory class! setError(kErrorNoHeapMemory); return false; } // -------------------------------------------------------------------------- // [Emit] // // These functions are not protected against buffer overrun. Each place of // code which calls these functions ensures that there is some space using // canEmit() method. Emitters are internally protected in AsmJit::Buffer, // but only in debug builds. // -------------------------------------------------------------------------- //! @brief Emit Byte to internal buffer. inline void _emitByte(uint8_t x) { _buffer.emitByte(x); } //! @brief Emit word (2 bytes) to internal buffer. inline void _emitWord(uint16_t x) { _buffer.emitWord(x); } //! @brief Emit dword (4 bytes) to internal buffer. inline void _emitDWord(uint32_t x) { _buffer.emitDWord(x); } //! @brief Emit qword (8 bytes) to internal buffer. inline void _emitQWord(uint64_t x) { _buffer.emitQWord(x); } //! @brief Emit Int32 (4 bytes) to internal buffer. inline void _emitInt32(int32_t x) { _buffer.emitDWord((uint32_t)x); } //! @brief Emit Int64 (8 bytes) to internal buffer. inline void _emitInt64(int64_t x) { _buffer.emitQWord((uint64_t)x); } //! @brief Emit intptr_t (4 or 8 bytes) to internal buffer. inline void _emitIntPtrT(intptr_t x) { _buffer.emitIntPtrT(x); } //! @brief Emit uintptr_t (4 or 8 bytes) to internal buffer. inline void _emitUIntPtrT(uintptr_t x) { _buffer.emitUIntPtrT(x); } //! @brief Emit size_t (4 or 8 bytes) to internal buffer. inline void _emitSizeT(size_t x) { _buffer.emitSizeT(x); } //! @brief Embed data into instruction stream. ASMJIT_API void embed(const void* data, size_t len); // -------------------------------------------------------------------------- // [Reloc] // -------------------------------------------------------------------------- //! @brief Relocate code to a given address @a dst. //! //! @param dst Where the relocated code should me stored. The pointer can be //! address returned by virtual memory allocator or your own address if you //! want only to store the code for later reuse (or load, etc...). //! @param addressBase Base address used for relocation. When using JIT code //! generation, this will be the same as @a dst, only casted to system //! integer type. But when generating code for remote process then the value //! can be different. //! //! @retval The bytes used. Code-generator can create trampolines which are //! used when calling other functions inside the JIT code. However, these //! trampolines can be unused so the relocCode() returns the exact size needed //! for the function. //! //! A given buffer will be overwritten, to get number of bytes required use //! @c getCodeSize(). virtual size_t relocCode(void* dst, sysuint_t addressBase) const = 0; //! @brief Simplifed version of @c relocCode() method designed for JIT. //! //! @overload inline size_t relocCode(void* dst) const { return relocCode(dst, (uintptr_t)dst); } // -------------------------------------------------------------------------- // [Make] // -------------------------------------------------------------------------- //! @brief Make is convenience method to make currently serialized code and //! return pointer to generated function. //! //! What you need is only to cast this pointer to your function type and call //! it. Note that if there was an error and calling @c getError() method not //! returns @c kErrorOk (zero) then this function always return @c NULL and //! error value remains the same. virtual void* make() = 0; // -------------------------------------------------------------------------- // [Helpers] // -------------------------------------------------------------------------- ASMJIT_API LabelLink* _newLabelLink(); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief ZoneMemory management. ZoneMemory _zoneMemory; //! @brief Binary code buffer. Buffer _buffer; //! @brief Context (for example @ref JitContext). Context* _context; //! @brief Logger. Logger* _logger; //! @brief Error code. uint32_t _error; //! @brief Properties. uint32_t _properties; //! @brief Emit flags for next instruction (cleared after emit). uint32_t _emitOptions; //! @brief Size of possible trampolines. uint32_t _trampolineSize; //! @brief Inline comment that will be logged by the next instruction and //! set to NULL. const char* _inlineComment; //! @brief Linked list of unused links (@c LabelLink* structures) LabelLink* _unusedLinks; //! @brief Labels data. PodVector _labels; //! @brief Relocations data. PodVector _relocData; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_ASSEMBLER_H desmume-0.9.9/src/utils/AsmJit/core/virtualmemory.cpp0000644000175000017500000000717112140261627023422 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/intutil.h" #include "../core/virtualmemory.h" // [Dependencies - Windows] #if defined(ASMJIT_WINDOWS) # include #endif // ASMJIT_WINDOWS // [Dependencies - Posix] #if defined(ASMJIT_POSIX) # include # include # include #endif // ASMJIT_POSIX // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::VirtualMemory - Windows] // ============================================================================ #if defined(ASMJIT_WINDOWS) struct VirtualMemoryLocal { VirtualMemoryLocal() { SYSTEM_INFO info; GetSystemInfo(&info); alignment = info.dwAllocationGranularity; pageSize = IntUtil::roundUpToPowerOf2(info.dwPageSize); } size_t alignment; size_t pageSize; }; static VirtualMemoryLocal& vm() { static VirtualMemoryLocal vm; return vm; }; void* VirtualMemory::alloc(size_t length, size_t* allocated, bool canExecute) { return allocProcessMemory(GetCurrentProcess(), length, allocated, canExecute); } void VirtualMemory::free(void* addr, size_t length) { return freeProcessMemory(GetCurrentProcess(), addr, length); } void* VirtualMemory::allocProcessMemory(HANDLE hProcess, size_t length, size_t* allocated, bool canExecute) { // VirtualAlloc rounds allocated size to page size automatically. size_t msize = IntUtil::roundUp(length, vm().pageSize); // Windows XP SP2 / Vista allow Data Excution Prevention (DEP). WORD protect = canExecute ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; LPVOID mbase = VirtualAllocEx(hProcess, NULL, msize, MEM_COMMIT | MEM_RESERVE, protect); if (mbase == NULL) return NULL; ASMJIT_ASSERT(IntUtil::isAligned(reinterpret_cast(mbase), vm().alignment)); if (allocated != NULL) *allocated = msize; return mbase; } void VirtualMemory::freeProcessMemory(HANDLE hProcess, void* addr, size_t /* length */) { VirtualFreeEx(hProcess, addr, 0, MEM_RELEASE); } size_t VirtualMemory::getAlignment() { return vm().alignment; } size_t VirtualMemory::getPageSize() { return vm().pageSize; } #endif // ASMJIT_WINDOWS // ============================================================================ // [AsmJit::VirtualMemory - Posix] // ============================================================================ #if defined(ASMJIT_POSIX) // MacOS uses MAP_ANON instead of MAP_ANONYMOUS. #if !defined(MAP_ANONYMOUS) # define MAP_ANONYMOUS MAP_ANON #endif // MAP_ANONYMOUS struct VirtualMemoryLocal { VirtualMemoryLocal() { alignment = pageSize = ::getpagesize(); } size_t alignment; size_t pageSize; }; static VirtualMemoryLocal& vm() { static VirtualMemoryLocal vm; return vm; } void* VirtualMemory::alloc(size_t length, size_t* allocated, bool canExecute) { size_t msize = IntUtil::roundUp(length, vm().pageSize); int protection = PROT_READ | PROT_WRITE | (canExecute ? PROT_EXEC : 0); void* mbase = ::mmap(NULL, msize, protection, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (mbase == MAP_FAILED) return NULL; if (allocated != NULL) *allocated = msize; return mbase; } void VirtualMemory::free(void* addr, size_t length) { munmap(addr, length); } size_t VirtualMemory::getAlignment() { return vm().alignment; } size_t VirtualMemory::getPageSize() { return vm().pageSize; } #endif // ASMJIT_POSIX } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/virtualmemory.h0000644000175000017500000000500112140261627023055 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_VIRTUALMEMORY_H #define _ASMJIT_CORE_VIRTUALMEMORY_H // [Dependencies - AsmJit] #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::VirtualMemory] // ============================================================================ //! @brief Class that helps with allocating memory for executing code //! generated by JIT compiler. //! //! There are defined functions that provides facility to allocate and free //! memory where can be executed code. If processor and operating system //! supports execution protection then you can't run code from normally //! malloc()'ed memory. //! //! Functions are internally implemented by operating system dependent way. //! VirtualAlloc() function is used for Windows operating system and mmap() //! for posix ones. If you want to study or create your own functions, look //! at VirtualAlloc() or mmap() documentation (depends on you target OS). //! //! Under posix operating systems is also useable mprotect() function, that //! can enable execution protection to malloc()'ed memory block. struct VirtualMemory { //! @brief Allocate virtual memory. //! //! Pages are readable/writeable, but they are not guaranteed to be //! executable unless 'canExecute' is true. Returns the address of //! allocated memory, or NULL if failed. ASMJIT_API static void* alloc(size_t length, size_t* allocated, bool canExecute); //! @brief Free memory allocated by @c alloc() ASMJIT_API static void free(void* addr, size_t length); #if defined(ASMJIT_WINDOWS) //! @brief Allocate virtual memory of @a hProcess. //! //! @note This function is Windows specific. ASMJIT_API static void* allocProcessMemory(HANDLE hProcess, size_t length, size_t* allocated, bool canExecute); //! @brief Free virtual memory of @a hProcess. //! //! @note This function is Windows specific. ASMJIT_API static void freeProcessMemory(HANDLE hProcess, void* addr, size_t length); #endif // ASMJIT_WINDOWS //! @brief Get the alignment guaranteed by alloc(). ASMJIT_API static size_t getAlignment(); //! @brief Get size of single page. ASMJIT_API static size_t getPageSize(); }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_VIRTUALMEMORY_H desmume-0.9.9/src/utils/AsmJit/core/lock.h0000644000175000017500000000702112140261627021072 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_LOCK_H #define _ASMJIT_CORE_LOCK_H // [Dependencies - AsmJit] #include "../core/build.h" // [Dependencies - Windows] #if defined(ASMJIT_WINDOWS) # include #endif // ASMJIT_WINDOWS // [Dependencies - Posix] #if defined(ASMJIT_POSIX) # include #endif // ASMJIT_POSIX // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [AsmJit::Lock] // ============================================================================ //! @brief Lock - used in thread-safe code for locking. struct Lock { ASMJIT_NO_COPY(Lock) // -------------------------------------------------------------------------- // [Windows] // -------------------------------------------------------------------------- #if defined(ASMJIT_WINDOWS) typedef CRITICAL_SECTION Handle; //! @brief Create a new @ref Lock instance. inline Lock() { InitializeCriticalSection(&_handle); } //! @brief Destroy the @ref Lock instance. inline ~Lock() { DeleteCriticalSection(&_handle); } //! @brief Lock. inline void lock() { EnterCriticalSection(&_handle); } //! @brief Unlock. inline void unlock() { LeaveCriticalSection(&_handle); } #endif // ASMJIT_WINDOWS // -------------------------------------------------------------------------- // [Posix] // -------------------------------------------------------------------------- #if defined(ASMJIT_POSIX) typedef pthread_mutex_t Handle; //! @brief Create a new @ref Lock instance. inline Lock() { pthread_mutex_init(&_handle, NULL); } //! @brief Destroy the @ref Lock instance. inline ~Lock() { pthread_mutex_destroy(&_handle); } //! @brief Lock. inline void lock() { pthread_mutex_lock(&_handle); } //! @brief Unlock. inline void unlock() { pthread_mutex_unlock(&_handle); } #endif // ASMJIT_POSIX // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get handle. inline Handle& getHandle() { return _handle; } //! @overload inline const Handle& getHandle() const { return _handle; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Handle. Handle _handle; }; // ============================================================================ // [AsmJit::AutoLock] // ============================================================================ //! @brief Scope auto locker. struct AutoLock { ASMJIT_NO_COPY(AutoLock) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Locks @a target. inline AutoLock(Lock& target) : _target(target) { _target.lock(); } //! @brief Unlocks target. inline ~AutoLock() { _target.unlock(); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Pointer to target (lock). Lock& _target; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_LOCK_H desmume-0.9.9/src/utils/AsmJit/core/compilerfunc.cpp0000644000175000017500000001077312140261627023173 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/assembler.h" #include "../core/compiler.h" #include "../core/compilerfunc.h" #include "../core/compileritem.h" #include "../core/intutil.h" #include "../core/logger.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerFuncDecl - Construction / Destruction] // ============================================================================ CompilerFuncDecl::CompilerFuncDecl(Compiler* compiler) : CompilerItem(compiler, kCompilerItemFuncDecl), _entryTarget(NULL), _exitTarget(NULL), _end(NULL), _decl(NULL), _vars(NULL), _funcHints(0), _funcFlags(0), _funcCallStackSize(0) { } CompilerFuncDecl::~CompilerFuncDecl() { } // ============================================================================ // [AsmJit::CompilerFuncDecl - Hints] // ============================================================================ void CompilerFuncDecl::setHint(uint32_t hint, uint32_t value) { if (hint > 31) return; if (value) _funcHints |= IntUtil::maskFromIndex(hint); else _funcHints &= ~IntUtil::maskFromIndex(hint); } uint32_t CompilerFuncDecl::getHint(uint32_t hint) const { if (hint > 31) return 0; return (_funcHints & IntUtil::maskFromIndex(hint)) != 0; } // ============================================================================ // [AsmJit::CompilerFuncEnd - Construction / Destruction] // ============================================================================ CompilerFuncEnd::CompilerFuncEnd(Compiler* compiler, CompilerFuncDecl* func) : CompilerItem(compiler, kCompilerItemFuncEnd), _func(func) { } CompilerFuncEnd::~CompilerFuncEnd() { } // ============================================================================ // [AsmJit::CompilerFuncEnd - Interface] // ============================================================================ CompilerItem* CompilerFuncEnd::translate(CompilerContext& cc) { _isTranslated = true; return NULL; } // ============================================================================ // [AsmJit::CompilerFuncRet - Construction / Destruction] // ============================================================================ CompilerFuncRet::CompilerFuncRet(Compiler* compiler, CompilerFuncDecl* func, const Operand* first, const Operand* second) : CompilerItem(compiler, kCompilerItemFuncRet), _func(func) { if (first != NULL) _ret[0] = *first; if (second != NULL) _ret[1] = *second; } CompilerFuncRet::~CompilerFuncRet() { } // ============================================================================ // [AsmJit::CompilerFuncRet - Misc] // ============================================================================ bool CompilerFuncRet::mustEmitJump() const { // Iterate over next items until we found an item which emits a real instruction. CompilerItem* item = this->getNext(); while (item) { switch (item->getType()) { // Interesting item. case kCompilerItemEmbed: case kCompilerItemInst: case kCompilerItemFuncCall: case kCompilerItemFuncRet: return true; // Non-interesting item. case kCompilerItemComment: case kCompilerItemMark: case kCompilerItemAlign: case kCompilerItemHint: break; case kCompilerItemTarget: if (static_cast(item)->getLabel().getId() == getFunc()->getExitLabel().getId()) return false; break; // Invalid items - these items shouldn't be here. We are inside the // function, after prolog. case kCompilerItemFuncDecl: break; // We can't go forward from here. case kCompilerItemFuncEnd: return false; } item = item->getNext(); } return false; } // ============================================================================ // [AsmJit::CompilerFuncCall - Construction / Destruction] // ============================================================================ CompilerFuncCall::CompilerFuncCall(Compiler* compiler, CompilerFuncDecl* caller, const Operand* target) : CompilerItem(compiler, kCompilerItemFuncCall), _caller(caller), _decl(NULL), _args(NULL) { if (target != NULL) _target = *target; } CompilerFuncCall::~CompilerFuncCall() { } } // AsmJit namespace // [Api-Begin] #include "../core/apibegin.h" desmume-0.9.9/src/utils/AsmJit/core/compilerfunc.h0000644000175000017500000002701712140261627022637 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_COMPILERFUNC_H #define _ASMJIT_CORE_COMPILERFUNC_H // [Dependencies - AsmJit] #include "../core/compiler.h" #include "../core/compileritem.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerFuncDecl] // ============================================================================ //! @brief Compiler function declaration item. //! //! Functions are base blocks for generating assembler output. Each generated //! assembler stream needs standard entry and leave sequences thats compatible //! with the operating system conventions (ABI). //! //! Function class can be used to generate function prolog) and epilog sequences //! that are compatible with the demanded calling convention and to allocate and //! manage variables that can be allocated/spilled during compilation time. //! //! @note To create a function use @c Compiler::newFunc() method, do not //! create any form of compiler function items using new operator. //! //! @sa @ref CompilerState, @ref CompilerVar. struct CompilerFuncDecl : public CompilerItem { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @c CompilerFuncDecl instance. //! //! @note Always use @c AsmJit::Compiler::newFunc() to create @c Function //! instance. ASMJIT_API CompilerFuncDecl(Compiler* compiler); //! @brief Destroy the @c CompilerFuncDecl instance. ASMJIT_API virtual ~CompilerFuncDecl(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get function entry label. //! //! Entry label can be used to call this function from another code that's //! being generated. inline const Label& getEntryLabel() const { return _entryLabel; } //! @brief Get function exit label. //! //! Use exit label to jump to function epilog. inline const Label& getExitLabel() const { return _exitLabel; } //! @brief Get function entry target. inline CompilerTarget* getEntryTarget() const { return _entryTarget; } //! @brief Get function exit target. inline CompilerTarget* getExitTarget() const { return _exitTarget; } //! @brief Get function end item. inline CompilerFuncEnd* getEnd() const { return _end; } //! @brief Get function declaration. inline FuncDecl* getDecl() const { return _decl; } //! @brief Get function arguments as variables. inline CompilerVar** getVars() const { return _vars; } //! @brief Get function argument at @a index. inline CompilerVar* getVar(uint32_t index) const { ASMJIT_ASSERT(index < _decl->getArgumentsCount()); return _vars[index]; } //! @brief Get function hints. inline uint32_t getFuncHints() const { return _funcHints; } //! @brief Get function flags. inline uint32_t getFuncFlags() const { return _funcFlags; } //! @brief Get whether the _funcFlags has @a flag inline bool hasFuncFlag(uint32_t flag) const { return (_funcFlags & flag) != 0; } //! @brief Set function @a flag. inline void setFuncFlag(uint32_t flag) { _funcFlags |= flag; } //! @brief Clear function @a flag. inline void clearFuncFlag(uint32_t flag) { _funcFlags &= ~flag; } //! @brief Get whether the function is also a caller. inline bool isCaller() const { return hasFuncFlag(kFuncFlagIsCaller); } //! @brief Get whether the function is finished. inline bool isFinished() const { return hasFuncFlag(kFuncFlagIsFinished); } //! @brief Get whether the function is naked. inline bool isNaked() const { return hasFuncFlag(kFuncFlagIsNaked); } //! @brief Get stack size needed to call other functions. inline int32_t getFuncCallStackSize() const { return _funcCallStackSize; } // -------------------------------------------------------------------------- // [Hints] // -------------------------------------------------------------------------- //! @brief Set function hint. ASMJIT_API virtual void setHint(uint32_t hint, uint32_t value); //! @brief Get function hint. ASMJIT_API virtual uint32_t getHint(uint32_t hint) const; // -------------------------------------------------------------------------- // [Prototype] // -------------------------------------------------------------------------- virtual void setPrototype( uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) = 0; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Function entry label. Label _entryLabel; //! @brief Function exit label. Label _exitLabel; //! @brief Function entry target. CompilerTarget* _entryTarget; //! @brief Function exit target. CompilerTarget* _exitTarget; //! @brief Function end item. CompilerFuncEnd* _end; //! @brief Function declaration. FuncDecl* _decl; //! @brief Function arguments as compiler variables. CompilerVar** _vars; //! @brief Function hints; uint32_t _funcHints; //! @brief Function flags. uint32_t _funcFlags; //! @brief Stack size needed to call other functions. int32_t _funcCallStackSize; }; // ============================================================================ // [AsmJit::CompilerFuncEnd] // ============================================================================ //! @brief Compiler function end item. //! //! This item does nothing; it's only used by @ref Compiler to mark specific //! location in the code. The @c CompilerFuncEnd is similar to @c CompilerMark, //! except that it overrides @c translate() to return @c NULL. struct CompilerFuncEnd : public CompilerItem { ASMJIT_NO_COPY(CompilerFuncEnd) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerMark instance. ASMJIT_API CompilerFuncEnd(Compiler* compiler, CompilerFuncDecl* func); //! @brief Destroy the @ref CompilerMark instance. ASMJIT_API virtual ~CompilerFuncEnd(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get related function. inline CompilerFuncDecl* getFunc() const { return _func; } // -------------------------------------------------------------------------- // [Interface] // -------------------------------------------------------------------------- ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc); // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Related function. CompilerFuncDecl* _func; }; // ============================================================================ // [AsmJit::CompilerFuncRet] // ============================================================================ //! @brief Compiler return from function item. struct CompilerFuncRet : public CompilerItem { ASMJIT_NO_COPY(CompilerFuncRet) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerFuncRet instance. ASMJIT_API CompilerFuncRet(Compiler* compiler, CompilerFuncDecl* func, const Operand* first, const Operand* second); //! @brief Destroy the @ref CompilerFuncRet instance. ASMJIT_API virtual ~CompilerFuncRet(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @Brief Get the related function. inline CompilerFuncDecl* getFunc() const { return _func; } //! @brief Get the first return operand. inline Operand& getFirst() { return _ret[0]; } //! @overload inline const Operand& getFirst() const { return _ret[0]; } //! @brief Get the second return operand. inline Operand& getSecond() { return _ret[1]; } //! @overload inline const Operand& getSecond() const { return _ret[1]; } // -------------------------------------------------------------------------- // [Misc] // -------------------------------------------------------------------------- //! @brief Get whether jump to epilog has to be emitted. ASMJIT_API bool mustEmitJump() const; // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Related function. CompilerFuncDecl* _func; //! @brief Return operand(s). Operand _ret[2]; }; // ============================================================================ // [AsmJit::CompilerFuncCall] // ============================================================================ //! @brief Compiler function call item. struct CompilerFuncCall : public CompilerItem { ASMJIT_NO_COPY(CompilerFuncCall) // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- //! @brief Create a new @ref CompilerFuncCall instance. ASMJIT_API CompilerFuncCall(Compiler* compiler, CompilerFuncDecl* caller, const Operand* target); //! @brief Destroy the @ref CompilerFuncCall instance. ASMJIT_API virtual ~CompilerFuncCall(); // -------------------------------------------------------------------------- // [Accessors] // -------------------------------------------------------------------------- //! @brief Get caller. inline CompilerFuncDecl* getCaller() const { return _caller; } //! @brief Get function declaration. inline FuncDecl* getDecl() const { return _decl; } //! @brief Get target operand. inline Operand& getTarget() { return _target; } //! @overload inline const Operand& getTarget() const { return _target; } // -------------------------------------------------------------------------- // [Prototype] // -------------------------------------------------------------------------- virtual void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) = 0; //! @brief Set function prototype. inline void setPrototype(uint32_t convention, const FuncPrototype& func) { setPrototype(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- //! @brief Caller (the function which does the call). CompilerFuncDecl* _caller; //! @brief Function declaration. FuncDecl* _decl; //! @brief Operand (address of function, register, label, ...). Operand _target; //! @brief Return operands. Operand _ret[2]; //! @brief Arguments operands. Operand* _args; }; } // AsmJit namespace // [Api-End] #include "../core/apiend.h" // [Guard] #endif // _ASMJIT_CORE_COMPILERFUNC_H desmume-0.9.9/src/utils/AsmJit/core/compilercontext.cpp0000644000175000017500000000154212140261627023716 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. #define ASMJIT_EXPORTS // [Dependencies - AsmJit] #include "../core/compilercontext.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { // ============================================================================ // [AsmJit::CompilerContext - Construction / Destruction] // ============================================================================ CompilerContext::CompilerContext(Compiler* compiler) : _zoneMemory(8192 - sizeof(ZoneChunk) - 32), _compiler(compiler), _func(NULL), _start(NULL), _stop(NULL), _extraBlock(NULL), _state(NULL), _active(NULL), _currentOffset(0), _isUnreachable(0) { } CompilerContext::~CompilerContext() { } } // AsmJit namespace // [Api-End] #include "../core/apiend.h" desmume-0.9.9/src/utils/AsmJit/core/buffer.h0000644000175000017500000002220512140261627021414 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_BUFFER_H #define _ASMJIT_CORE_BUFFER_H // [Dependencies - AsmJit] #include "../core/assert.h" #include "../core/build.h" // [Api-Begin] #include "../core/apibegin.h" namespace AsmJit { //! @addtogroup AsmJit_Core //! @{ // ============================================================================ // [Forward Declarations] // ============================================================================ struct Buffer; // ============================================================================ // [AsmJit::Buffer] // ============================================================================ //! @brief Buffer used to store instruction stream in AsmJit. //! //! This class can be dangerous, if you don't know how it works. Assembler //! instruction stream is usually constructed by multiple calls of emit //! functions that emits bytes, words, dwords or qwords. But to decrease //! AsmJit library size and improve performance, we are not checking for //! buffer overflow for each emit operation, but only once in highler level //! emit instruction. //! //! So, if you want to use this class, you need to do buffer checking yourself //! by using @c ensureSpace() method. It's designed to grow buffer if needed. //! Threshold for growing is named @c growThreshold() and it means count of //! bytes for emitting single operation. Default size is set to 16 bytes, //! because x86 and x64 instruction can't be larger (so it's space to hold 1 //! instruction). //! //! Example using Buffer: //! //! @code //! // Buffer instance, growThreshold == 16 //! // (no memory allocated in constructor). //! AsmJit::Buffer buf(16); //! //! // Begin of emit stream, ensure space can fail on out of memory error. //! if (buf.ensureSpace()) //! { //! // here, you can emit up to 16 (growThreshold) bytes //! buf.emitByte(0x00); //! buf.emitByte(0x01); //! buf.emitByte(0x02); //! buf.emitByte(0x03); //! ... //! } //! @endcode struct Buffer { // -------------------------------------------------------------------------- // [Construction / Destruction] // -------------------------------------------------------------------------- inline Buffer() : _data(NULL), _cur(NULL), _max(NULL), _capacity(0) { } inline ~Buffer() { if (_data) ASMJIT_FREE(_data); } //! @brief Get start of buffer. inline uint8_t* getData() const { return _data; } //! @brief Get current pointer in code buffer. inline uint8_t* getCur() const { return _cur; } //! @brief Get maximum pointer in code buffer for growing. inline uint8_t* getMax() const { return _max; } //! @brief Get current offset in buffer. inline size_t getOffset() const { return (size_t)(_cur - _data); } //! @brief Get capacity of buffer. inline size_t getCapacity() const { return _capacity; } //! @brief Ensure space for next instruction inline bool ensureSpace() { return (_cur >= _max) ? grow() : true; } //! @brief Sets offset to @a o and returns previous offset. //! //! This method can be used to truncate buffer or it's used to //! overwrite specific position in buffer by Assembler. inline size_t toOffset(size_t offset) { ASMJIT_ASSERT(offset < _capacity); size_t prev = (size_t)(_cur - _data); _cur = _data + offset; return prev; } //! @brief Reallocate buffer. //! //! It's only used for growing, buffer is never reallocated to smaller //! number than current capacity() is. ASMJIT_API bool realloc(size_t to); //! @brief Used to grow the buffer. //! //! It will typically realloc to twice size of capacity(), but if capacity() //! is large, it will use smaller steps. ASMJIT_API bool grow(); //! @brief Clear everything, but not deallocate buffer. inline void clear() { _cur = _data; } //! @brief Free buffer and NULL all pointers. ASMJIT_API void reset(); //! @brief Take ownership of the buffer data and purge @c Buffer instance. ASMJIT_API uint8_t* take(); // -------------------------------------------------------------------------- // [Emit] // -------------------------------------------------------------------------- //! @brief Emit Byte. inline void emitByte(uint8_t x) { ASMJIT_ASSERT(getOffset() + 1 <= _capacity); *_cur++ = x; } //! @brief Emit Word (2 bytes). inline void emitWord(uint16_t x) { ASMJIT_ASSERT(getOffset() + 2 <= _capacity); *(uint16_t *)_cur = x; _cur += 2; } //! @brief Emit DWord (4 bytes). inline void emitDWord(uint32_t x) { ASMJIT_ASSERT(getOffset() + 4 <= _capacity); *(uint32_t *)_cur = x; _cur += 4; } //! @brief Emit QWord (8 bytes). inline void emitQWord(uint64_t x) { ASMJIT_ASSERT(getOffset() + 8 <= _capacity); *(uint64_t *)_cur = x; _cur += 8; } //! @brief Emit intptr_t (4 or 8 bytes). inline void emitIntPtrT(intptr_t x) { ASMJIT_ASSERT(getOffset() + sizeof(intptr_t) <= _capacity); *(intptr_t *)_cur = x; _cur += sizeof(intptr_t); } //! @brief Emit uintptr_t (4 or 8 bytes). inline void emitUIntPtrT(uintptr_t x) { ASMJIT_ASSERT(getOffset() + sizeof(uintptr_t) <= _capacity); *(uintptr_t *)_cur = x; _cur += sizeof(uintptr_t); } //! @brief Emit size_t (4 or 8 bytes). inline void emitSizeT(size_t x) { ASMJIT_ASSERT(getOffset() + sizeof(size_t) <= _capacity); *(size_t *)_cur = x; _cur += sizeof(size_t); } //! @brief Emit custom data. ASMJIT_API void emitData(const void* ptr, size_t len); // -------------------------------------------------------------------------- // [Get / Set] // -------------------------------------------------------------------------- //! @brief Set byte at position @a pos. inline uint8_t getByteAt(size_t pos) const { ASMJIT_ASSERT(pos + 1 <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set word at position @a pos. inline uint16_t getWordAt(size_t pos) const { ASMJIT_ASSERT(pos + 2 <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set dword at position @a pos. inline uint32_t getDWordAt(size_t pos) const { ASMJIT_ASSERT(pos + 4 <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set qword at position @a pos. inline uint64_t getQWordAt(size_t pos) const { ASMJIT_ASSERT(pos + 8 <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set intptr_t at position @a pos. inline intptr_t getIntPtrTAt(size_t pos) const { ASMJIT_ASSERT(pos + sizeof(intptr_t) <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set uintptr_t at position @a pos. inline uintptr_t getUIntPtrTAt(size_t pos) const { ASMJIT_ASSERT(pos + sizeof(uintptr_t) <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set size_t at position @a pos. inline uintptr_t getSizeTAt(size_t pos) const { ASMJIT_ASSERT(pos + sizeof(size_t) <= _capacity); return *reinterpret_cast(_data + pos); } //! @brief Set byte at position @a pos. inline void setByteAt(size_t pos, uint8_t x) { ASMJIT_ASSERT(pos + 1 <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set word at position @a pos. inline void setWordAt(size_t pos, uint16_t x) { ASMJIT_ASSERT(pos + 2 <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set dword at position @a pos. inline void setDWordAt(size_t pos, uint32_t x) { ASMJIT_ASSERT(pos + 4 <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set qword at position @a pos. inline void setQWordAt(size_t pos, uint64_t x) { ASMJIT_ASSERT(pos + 8 <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set intptr_t at position @a pos. inline void setIntPtrTAt(size_t pos, intptr_t x) { ASMJIT_ASSERT(pos + sizeof(intptr_t) <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set uintptr_t at position @a pos. inline void setUIntPtrTAt(size_t pos, uintptr_t x) { ASMJIT_ASSERT(pos + sizeof(uintptr_t) <= _capacity); *reinterpret_cast(_data + pos) = x; } //! @brief Set size_t at position @a pos. inline void setSizeTAt(size_t pos, size_t x) { ASMJIT_ASSERT(pos + sizeof(size_t) <= _capacity); *reinterpret_cast(_data + pos) = x; } // -------------------------------------------------------------------------- // [Members] // -------------------------------------------------------------------------- // All members are public, because they can be accessed and modified by // Assembler/Compiler directly. //! @brief Beginning position of buffer. uint8_t* _data; //! @brief Current position in buffer. uint8_t* _cur; //! @brief Maximum position in buffer for realloc. uint8_t* _max; //! @brief Buffer capacity (in bytes). size_t _capacity; }; //! @} } // AsmJit namespace // [Api-End] #include "../core/apiend.h" #endif // _ASMJIT_CORE_BUFFER_H desmume-0.9.9/src/utils/AsmJit/core/apibegin.h0000644000175000017500000000207712140261627021726 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [MSVC] #if defined(_MSC_VER) // Disable some warnings we know about #pragma warning(push) #pragma warning(disable: 4127) // conditional expression is constant #pragma warning(disable: 4251) // struct needs to have dll-interface to be used // by clients of struct ... #pragma warning(disable: 4275) // non dll-interface struct ... used as base for // dll-interface struct #pragma warning(disable: 4355) // this used in base member initializer list #pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' // Rename symbols. #define vsnprintf _vsnprintf #define snprintf _snprintf #endif // _MSC_VER // [GNUC] #if defined(__GNUC__) // GCC warnings fix: I can't understand why GCC has no interface to push/pop // specific warnings. // # if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 402001 // # pragma GCC diagnostic ignored "-w" // # endif #endif // __GNUC__ desmume-0.9.9/src/utils/AsmJit/Config.h0000644000175000017500000000431712140261627020424 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CONFIG_H #define _ASMJIT_CONFIG_H // This file is designed to be modifyable. Platform specific changes should // be applied to this file so it's guaranteed that never versions of AsmJit // library will never overwrite generated config files. // // So modify this file by your build system or by hand. // ============================================================================ // [AsmJit - OS] // ============================================================================ // Provides definitions about your operating system. It's detected by default, // so override it if you have problems with automatic detection. // // #define ASMJIT_WINDOWS // #define ASMJIT_POSIX // ============================================================================ // [AsmJit - Architecture] // ============================================================================ // Provides definitions about your cpu architecture. It's detected by default, // so override it if you have problems with automatic detection. // #define ASMJIT_X86 // #define ASMJIT_X64 // ============================================================================ // [AsmJit - API] // ============================================================================ // If you are embedding AsmJit library into your project (statically), undef // ASMJIT_API macro. #define ASMJIT_API // ============================================================================ // [AsmJit - Memory Management] // ============================================================================ // #define ASMJIT_MALLOC ::malloc // #define ASMJIT_REALLOC ::realloc // #define ASMJIT_FREE ::free // ============================================================================ // [AsmJit - Debug] // ============================================================================ // Turn debug on/off (to bypass autodetection) // #define ASMJIT_DEBUG // #define ASMJIT_NO_DEBUG // Setup custom assertion code. // #define ASMJIT_ASSERT(exp) do { if (!(exp)) ::AsmJit::assertionFailure(__FILE__, __LINE__, #exp); } while(0) // [Guard] #endif // _ASMJIT_CONFIG_H desmume-0.9.9/src/utils/AsmJit/core.h0000644000175000017500000000152212140261627020142 0ustar guillaumeguillaume// [AsmJit] // Complete JIT Assembler for C++ Language. // // [License] // Zlib - See COPYING file in this package. // [Guard] #ifndef _ASMJIT_CORE_H #define _ASMJIT_CORE_H // [Dependencies - AsmJit] #include "core/build.h" #include "core/assembler.h" #include "core/assert.h" #include "core/buffer.h" #include "core/compiler.h" #include "core/compilercontext.h" #include "core/compilerfunc.h" #include "core/compileritem.h" #include "core/cpuinfo.h" #include "core/defs.h" #include "core/func.h" #include "core/intutil.h" #include "core/lock.h" #include "core/logger.h" #include "core/memorymanager.h" #include "core/memorymarker.h" #include "core/operand.h" #include "core/podvector.h" #include "core/stringbuilder.h" #include "core/stringutil.h" #include "core/virtualmemory.h" #include "core/zonememory.h" // [Guard] #endif // _ASMJIT_CORE_H desmume-0.9.9/src/utils/tinyxml/0000755000175000017500000000000012140305317017351 5ustar guillaumeguillaumedesmume-0.9.9/src/utils/tinyxml/tinyxml.h0000644000175000017500000017650212140261630021240 0ustar guillaumeguillaume/* www.sourceforge.net/projects/tinyxml Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef TINYXML_INCLUDED #define TINYXML_INCLUDED #ifdef _MSC_VER #pragma warning( push ) #pragma warning( disable : 4530 ) #pragma warning( disable : 4786 ) #endif #include #include #include #include #include // Help out windows: #if defined( _DEBUG ) && !defined( DEBUG ) #define DEBUG #endif #ifdef TIXML_USE_STL #include #include #include #define TIXML_STRING std::string #else #include "tinystr.h" #define TIXML_STRING TiXmlString #endif // Deprecated library function hell. Compilers want to use the // new safe versions. This probably doesn't fully address the problem, // but it gets closer. There are too many compilers for me to fully // test. If you get compilation troubles, undefine TIXML_SAFE #define TIXML_SAFE #ifdef TIXML_SAFE #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) // Microsoft visual studio, version 2005 and higher. #define TIXML_SNPRINTF _snprintf_s #define TIXML_SSCANF sscanf_s #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) // Microsoft visual studio, version 6 and higher. //#pragma message( "Using _sn* functions." ) #define TIXML_SNPRINTF _snprintf #define TIXML_SSCANF sscanf #elif defined(__GNUC__) && (__GNUC__ >= 3 ) // GCC version 3 and higher.s //#warning( "Using sn* functions." ) #define TIXML_SNPRINTF snprintf #define TIXML_SSCANF sscanf #else #define TIXML_SNPRINTF snprintf #define TIXML_SSCANF sscanf #endif #endif class TiXmlDocument; class TiXmlElement; class TiXmlComment; class TiXmlUnknown; class TiXmlAttribute; class TiXmlText; class TiXmlDeclaration; class TiXmlParsingData; const int TIXML_MAJOR_VERSION = 2; const int TIXML_MINOR_VERSION = 6; const int TIXML_PATCH_VERSION = 2; /* Internal structure for tracking location of items in the XML file. */ struct TiXmlCursor { TiXmlCursor() { Clear(); } void Clear() { row = col = -1; } int row; // 0 based. int col; // 0 based. }; /** Implements the interface to the "Visitor pattern" (see the Accept() method.) If you call the Accept() method, it requires being passed a TiXmlVisitor class to handle callbacks. For nodes that contain other nodes (Document, Element) you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves are simply called with Visit(). If you return 'true' from a Visit method, recursive parsing will continue. If you return false, no children of this node or its sibilings will be Visited. All flavors of Visit methods have a default implementation that returns 'true' (continue visiting). You need to only override methods that are interesting to you. Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. You should never change the document from a callback. @sa TiXmlNode::Accept() */ class TiXmlVisitor { public: virtual ~TiXmlVisitor() {} /// Visit a document. virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } /// Visit a document. virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } /// Visit an element. virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } /// Visit an element. virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } /// Visit a declaration virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } /// Visit a text node virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } /// Visit a comment node virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } /// Visit an unknown node virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } }; // Only used by Attribute::Query functions enum { TIXML_SUCCESS, TIXML_NO_ATTRIBUTE, TIXML_WRONG_TYPE }; // Used by the parsing routines. enum TiXmlEncoding { TIXML_ENCODING_UNKNOWN, TIXML_ENCODING_UTF8, TIXML_ENCODING_LEGACY }; const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; /** TiXmlBase is a base class for every class in TinyXml. It does little except to establish that TinyXml classes can be printed and provide some utility functions. In XML, the document and elements can contain other elements and other types of nodes. @verbatim A Document can contain: Element (container or leaf) Comment (leaf) Unknown (leaf) Declaration( leaf ) An Element can contain: Element (container or leaf) Text (leaf) Attributes (not on tree) Comment (leaf) Unknown (leaf) A Decleration contains: Attributes (not on tree) @endverbatim */ class TiXmlBase { friend class TiXmlNode; friend class TiXmlElement; friend class TiXmlDocument; public: TiXmlBase() : userData(0) {} virtual ~TiXmlBase() {} /** All TinyXml classes can print themselves to a filestream or the string class (TiXmlString in non-STL mode, std::string in STL mode.) Either or both cfile and str can be null. This is a formatted print, and will insert tabs and newlines. (For an unformatted stream, use the << operator.) */ virtual void Print( FILE* cfile, int depth ) const = 0; /** The world does not agree on whether white space should be kept or not. In order to make everyone happy, these global, static functions are provided to set whether or not TinyXml will condense all white space into a single space or not. The default is to condense. Note changing this value is not thread safe. */ static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } /// Return the current white space setting. static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } /** Return the position, in the original source file, of this node or attribute. The row and column are 1-based. (That is the first row and first column is 1,1). If the returns values are 0 or less, then the parser does not have a row and column value. Generally, the row and column value will be set when the TiXmlDocument::Load(), TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set when the DOM was created from operator>>. The values reflect the initial load. Once the DOM is modified programmatically (by adding or changing nodes and attributes) the new values will NOT update to reflect changes in the document. There is a minor performance cost to computing the row and column. Computation can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. @sa TiXmlDocument::SetTabSize() */ int Row() const { return location.row + 1; } int Column() const { return location.col + 1; } ///< See Row() void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. // Table that returs, for a given lead byte, the total number of bytes // in the UTF-8 sequence. static const int utf8ByteTable[256]; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, or they will be transformed into entities! */ static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); enum { TIXML_NO_ERROR = 0, TIXML_ERROR, TIXML_ERROR_OPENING_FILE, TIXML_ERROR_PARSING_ELEMENT, TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, TIXML_ERROR_READING_ELEMENT_VALUE, TIXML_ERROR_READING_ATTRIBUTES, TIXML_ERROR_PARSING_EMPTY, TIXML_ERROR_READING_END_TAG, TIXML_ERROR_PARSING_UNKNOWN, TIXML_ERROR_PARSING_COMMENT, TIXML_ERROR_PARSING_DECLARATION, TIXML_ERROR_DOCUMENT_EMPTY, TIXML_ERROR_EMBEDDED_NULL, TIXML_ERROR_PARSING_CDATA, TIXML_ERROR_DOCUMENT_TOP_ONLY, TIXML_ERROR_STRING_COUNT }; protected: static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); inline static bool IsWhiteSpace( char c ) { return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); } inline static bool IsWhiteSpace( int c ) { if ( c < 256 ) return IsWhiteSpace( (char) c ); return false; // Again, only truly correct for English/Latin...but usually works. } #ifdef TIXML_USE_STL static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); #endif /* Reads an XML name into the string provided. Returns a pointer just past the last character of the name, or 0 if the function has an error. */ static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); /* Reads text. Returns a pointer past the given end tag. Wickedly complex options, but it keeps the (sensitive) code in one place. */ static const char* ReadText( const char* in, // where to start TIXML_STRING* text, // the string read bool ignoreWhiteSpace, // whether to keep the white space const char* endTag, // what ends this text bool ignoreCase, // whether to ignore case in the end tag TiXmlEncoding encoding ); // the current encoding // If an entity has been found, transform it into a character. static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); // Get a character, while interpreting entities. // The length can be from 0 to 4 bytes. inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) { assert( p ); if ( encoding == TIXML_ENCODING_UTF8 ) { *length = utf8ByteTable[ *((const unsigned char*)p) ]; assert( *length >= 0 && *length < 5 ); } else { *length = 1; } if ( *length == 1 ) { if ( *p == '&' ) return GetEntity( p, _value, length, encoding ); *_value = *p; return p+1; } else if ( *length ) { //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), // and the null terminator isn't needed for( int i=0; p[i] && i<*length; ++i ) { _value[i] = p[i]; } return p + (*length); } else { // Not valid text. return 0; } } // Return true if the next characters in the stream are any of the endTag sequences. // Ignore case only works for english, and should only be relied on when comparing // to English words: StringEqual( p, "version", true ) is fine. static bool StringEqual( const char* p, const char* endTag, bool ignoreCase, TiXmlEncoding encoding ); static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; TiXmlCursor location; /// Field containing a generic user pointer void* userData; // None of these methods are reliable for any language except English. // Good for approximation, not great for accuracy. static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); inline static int ToLower( int v, TiXmlEncoding encoding ) { if ( encoding == TIXML_ENCODING_UTF8 ) { if ( v < 128 ) return tolower( v ); return v; } else { return tolower( v ); } } static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); private: TiXmlBase( const TiXmlBase& ); // not implemented. void operator=( const TiXmlBase& base ); // not allowed. struct Entity { const char* str; unsigned int strLength; char chr; }; enum { NUM_ENTITY = 5, MAX_ENTITY_LENGTH = 6 }; static Entity entity[ NUM_ENTITY ]; static bool condenseWhiteSpace; }; /** The parent class for everything in the Document Object Model. (Except for attributes). Nodes have siblings, a parent, and children. A node can be in a document, or stand on its own. The type of a TiXmlNode can be queried, and it can be cast to its more defined type. */ class TiXmlNode : public TiXmlBase { friend class TiXmlDocument; friend class TiXmlElement; public: #ifdef TIXML_USE_STL /** An input stream operator, for every class. Tolerant of newlines and formatting, but doesn't expect them. */ friend std::istream& operator >> (std::istream& in, TiXmlNode& base); /** An output stream operator, for every class. Note that this outputs without any newlines or formatting, as opposed to Print(), which includes tabs and new lines. The operator<< and operator>> are not completely symmetric. Writing a node to a stream is very well defined. You'll get a nice stream of output, without any extra whitespace or newlines. But reading is not as well defined. (As it always is.) If you create a TiXmlElement (for example) and read that from an input stream, the text needs to define an element or junk will result. This is true of all input streams, but it's worth keeping in mind. A TiXmlDocument will read nodes until it reads a root element, and all the children of that root element. */ friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); /// Appends the XML node or attribute to a std::string. friend std::string& operator<< (std::string& out, const TiXmlNode& base ); #endif /** The types of XML nodes supported by TinyXml. (All the unsupported types are picked up by UNKNOWN.) */ enum NodeType { TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, TINYXML_UNKNOWN, TINYXML_TEXT, TINYXML_DECLARATION, TINYXML_TYPECOUNT }; virtual ~TiXmlNode(); /** The meaning of 'value' changes for the specific type of TiXmlNode. @verbatim Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string @endverbatim The subclasses will wrap this function. */ const char *Value() const { return value.c_str (); } #ifdef TIXML_USE_STL /** Return Value() as a std::string. If you only use STL, this is more efficient than calling Value(). Only available in STL mode. */ const std::string& ValueStr() const { return value; } #endif const TIXML_STRING& ValueTStr() const { return value; } /** Changes the value of the node. Defined as: @verbatim Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string @endverbatim */ void SetValue(const char * _value) { value = _value;} #ifdef TIXML_USE_STL /// STL std::string form. void SetValue( const std::string& _value ) { value = _value; } #endif /// Delete all the children of this node. Does not affect 'this'. void Clear(); /// One step up the DOM. TiXmlNode* Parent() { return parent; } const TiXmlNode* Parent() const { return parent; } const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. TiXmlNode* FirstChild() { return firstChild; } const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. /// The first child of this node with the matching 'value'. Will be null if none found. TiXmlNode* FirstChild( const char * _value ) { // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) // call the method, cast the return back to non-const. return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); } const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. TiXmlNode* LastChild() { return lastChild; } const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. TiXmlNode* LastChild( const char * _value ) { return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); } #ifdef TIXML_USE_STL const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. #endif /** An alternate way to walk the children of a node. One way to iterate over nodes is: @verbatim for( child = parent->FirstChild(); child; child = child->NextSibling() ) @endverbatim IterateChildren does the same thing with the syntax: @verbatim child = 0; while( child = parent->IterateChildren( child ) ) @endverbatim IterateChildren takes the previous child as input and finds the next one. If the previous child is null, it returns the first. IterateChildren will return null when done. */ const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; TiXmlNode* IterateChildren( const TiXmlNode* previous ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); } /// This flavor of IterateChildren searches for children with a particular 'value' const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); } #ifdef TIXML_USE_STL const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. #endif /** Add a new node related to this. Adds a child past the LastChild. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); /** Add a new node related to this. Adds a child past the LastChild. NOTE: the node to be added is passed by pointer, and will be henceforth owned (and deleted) by tinyXml. This method is efficient and avoids an extra copy, but should be used with care as it uses a different memory model than the other insert functions. @sa InsertEndChild */ TiXmlNode* LinkEndChild( TiXmlNode* addThis ); /** Add a new node related to this. Adds a child before the specified child. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); /** Add a new node related to this. Adds a child after the specified child. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); /** Replace a child of this node. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); /// Delete a child of this node. bool RemoveChild( TiXmlNode* removeThis ); /// Navigate to a sibling node. const TiXmlNode* PreviousSibling() const { return prev; } TiXmlNode* PreviousSibling() { return prev; } /// Navigate to a sibling node. const TiXmlNode* PreviousSibling( const char * ) const; TiXmlNode* PreviousSibling( const char *_prev ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); } #ifdef TIXML_USE_STL const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. #endif /// Navigate to a sibling node. const TiXmlNode* NextSibling() const { return next; } TiXmlNode* NextSibling() { return next; } /// Navigate to a sibling node with the given 'value'. const TiXmlNode* NextSibling( const char * ) const; TiXmlNode* NextSibling( const char* _next ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); } /** Convenience function to get through elements. Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element. */ const TiXmlElement* NextSiblingElement() const; TiXmlElement* NextSiblingElement() { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); } /** Convenience function to get through elements. Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element. */ const TiXmlElement* NextSiblingElement( const char * ) const; TiXmlElement* NextSiblingElement( const char *_next ) { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); } #ifdef TIXML_USE_STL const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. #endif /// Convenience function to get through elements. const TiXmlElement* FirstChildElement() const; TiXmlElement* FirstChildElement() { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); } /// Convenience function to get through elements. const TiXmlElement* FirstChildElement( const char * _value ) const; TiXmlElement* FirstChildElement( const char * _value ) { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); } #ifdef TIXML_USE_STL const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. #endif /** Query the type (as an enumerated value, above) of this node. The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. */ int Type() const { return type; } /** Return a pointer to the Document this node lives in. Returns null if not in a document. */ const TiXmlDocument* GetDocument() const; TiXmlDocument* GetDocument() { return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); } /// Returns true if this node has no children. bool NoChildren() const { return !firstChild; } virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. /** Create an exact duplicate of this node and return it. The memory must be deleted by the caller. */ virtual TiXmlNode* Clone() const = 0; /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the XML tree will be conditionally visited and the host will be called back via the TiXmlVisitor interface. This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse the XML for the callbacks, so the performance of TinyXML is unchanged by using this interface versus any other.) The interface has been based on ideas from: - http://www.saxproject.org/ - http://c2.com/cgi/wiki?HierarchicalVisitorPattern Which are both good references for "visiting". An example of using Accept(): @verbatim TiXmlPrinter printer; tinyxmlDoc.Accept( &printer ); const char* xmlcstr = printer.CStr(); @endverbatim */ virtual bool Accept( TiXmlVisitor* visitor ) const = 0; protected: TiXmlNode( NodeType _type ); // Copy to the allocated object. Shared functionality between Clone, Copy constructor, // and the assignment operator. void CopyTo( TiXmlNode* target ) const; #ifdef TIXML_USE_STL // The real work of the input operator. virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; #endif // Figure out what is at *p, and parse it. Returns null if it is not an xml node. TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); TiXmlNode* parent; NodeType type; TiXmlNode* firstChild; TiXmlNode* lastChild; TIXML_STRING value; TiXmlNode* prev; TiXmlNode* next; private: TiXmlNode( const TiXmlNode& ); // not implemented. void operator=( const TiXmlNode& base ); // not allowed. }; /** An attribute is a name-value pair. Elements have an arbitrary number of attributes, each with a unique name. @note The attributes are not TiXmlNodes, since they are not part of the tinyXML document object model. There are other suggested ways to look at this problem. */ class TiXmlAttribute : public TiXmlBase { friend class TiXmlAttributeSet; public: /// Construct an empty attribute. TiXmlAttribute() : TiXmlBase() { document = 0; prev = next = 0; } #ifdef TIXML_USE_STL /// std::string constructor. TiXmlAttribute( const std::string& _name, const std::string& _value ) { name = _name; value = _value; document = 0; prev = next = 0; } #endif /// Construct an attribute with a name and value. TiXmlAttribute( const char * _name, const char * _value ) { name = _name; value = _value; document = 0; prev = next = 0; } const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. #ifdef TIXML_USE_STL const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. #endif int IntValue() const; ///< Return the value of this attribute, converted to an integer. double DoubleValue() const; ///< Return the value of this attribute, converted to a double. // Get the tinyxml string representation const TIXML_STRING& NameTStr() const { return name; } /** QueryIntValue examines the value string. It is an alternative to the IntValue() method with richer error checking. If the value is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. A specialized but useful call. Note that for success it returns 0, which is the opposite of almost all other TinyXml calls. */ int QueryIntValue( int* _value ) const; /// QueryDoubleValue examines the value string. See QueryIntValue(). int QueryDoubleValue( double* _value ) const; void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. void SetValue( const char* _value ) { value = _value; } ///< Set the value. void SetIntValue( int _value ); ///< Set the value from an integer. void SetDoubleValue( double _value ); ///< Set the value from a double. #ifdef TIXML_USE_STL /// STL std::string form. void SetName( const std::string& _name ) { name = _name; } /// STL std::string form. void SetValue( const std::string& _value ) { value = _value; } #endif /// Get the next sibling attribute in the DOM. Returns null at end. const TiXmlAttribute* Next() const; TiXmlAttribute* Next() { return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); } /// Get the previous sibling attribute in the DOM. Returns null at beginning. const TiXmlAttribute* Previous() const; TiXmlAttribute* Previous() { return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); } bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } /* Attribute parsing starts: first letter of the name returns: the next char after the value end quote */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); // Prints this Attribute to a FILE stream. virtual void Print( FILE* cfile, int depth ) const { Print( cfile, depth, 0 ); } void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; // [internal use] // Set the document pointer so the attribute can report errors. void SetDocument( TiXmlDocument* doc ) { document = doc; } private: TiXmlAttribute( const TiXmlAttribute& ); // not implemented. void operator=( const TiXmlAttribute& base ); // not allowed. TiXmlDocument* document; // A pointer back to a document, for error reporting. TIXML_STRING name; TIXML_STRING value; TiXmlAttribute* prev; TiXmlAttribute* next; }; /* A class used to manage a group of attributes. It is only used internally, both by the ELEMENT and the DECLARATION. The set can be changed transparent to the Element and Declaration classes that use it, but NOT transparent to the Attribute which has to implement a next() and previous() method. Which makes it a bit problematic and prevents the use of STL. This version is implemented with circular lists because: - I like circular lists - it demonstrates some independence from the (typical) doubly linked list. */ class TiXmlAttributeSet { public: TiXmlAttributeSet(); ~TiXmlAttributeSet(); void Add( TiXmlAttribute* attribute ); void Remove( TiXmlAttribute* attribute ); const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } TiXmlAttribute* Find( const char* _name ) const; TiXmlAttribute* FindOrCreate( const char* _name ); # ifdef TIXML_USE_STL TiXmlAttribute* Find( const std::string& _name ) const; TiXmlAttribute* FindOrCreate( const std::string& _name ); # endif private: //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), //*ME: this class must be also use a hidden/disabled copy-constructor !!! TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) TiXmlAttribute sentinel; }; /** The element is a container class. It has a value, the element name, and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes. */ class TiXmlElement : public TiXmlNode { public: /// Construct an element. TiXmlElement (const char * in_value); #ifdef TIXML_USE_STL /// std::string constructor. TiXmlElement( const std::string& _value ); #endif TiXmlElement( const TiXmlElement& ); TiXmlElement& operator=( const TiXmlElement& base ); virtual ~TiXmlElement(); /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. */ const char* Attribute( const char* name ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. If the attribute exists and can be converted to an integer, the integer value will be put in the return 'i', if 'i' is non-null. */ const char* Attribute( const char* name, int* i ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. If the attribute exists and can be converted to an double, the double value will be put in the return 'd', if 'd' is non-null. */ const char* Attribute( const char* name, double* d ) const; /** QueryIntAttribute examines the attribute - it is an alternative to the Attribute() method with richer error checking. If the attribute is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. If the attribute does not exist, then TIXML_NO_ATTRIBUTE is returned. */ int QueryIntAttribute( const char* name, int* _value ) const; /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute(). int QueryUnsignedAttribute( const char* name, unsigned* _value ) const; /** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). Note that '1', 'true', or 'yes' are considered true, while '0', 'false' and 'no' are considered false. */ int QueryBoolAttribute( const char* name, bool* _value ) const; /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). int QueryDoubleAttribute( const char* name, double* _value ) const; /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). int QueryFloatAttribute( const char* name, float* _value ) const { double d; int result = QueryDoubleAttribute( name, &d ); if ( result == TIXML_SUCCESS ) { *_value = (float)d; } return result; } #ifdef TIXML_USE_STL /// QueryStringAttribute examines the attribute - see QueryIntAttribute(). int QueryStringAttribute( const char* name, std::string* _value ) const { const char* cstr = Attribute( name ); if ( cstr ) { *_value = std::string( cstr ); return TIXML_SUCCESS; } return TIXML_NO_ATTRIBUTE; } /** Template form of the attribute query which will try to read the attribute into the specified type. Very easy, very powerful, but be careful to make sure to call this with the correct type. NOTE: This method doesn't work correctly for 'string' types that contain spaces. @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE */ template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; std::stringstream sstream( node->ValueStr() ); sstream >> *outValue; if ( !sstream.fail() ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } int QueryValueAttribute( const std::string& name, std::string* outValue ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; *outValue = node->ValueStr(); return TIXML_SUCCESS; } #endif /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const char* name, const char * _value ); #ifdef TIXML_USE_STL const std::string* Attribute( const std::string& name ) const; const std::string* Attribute( const std::string& name, int* i ) const; const std::string* Attribute( const std::string& name, double* d ) const; int QueryIntAttribute( const std::string& name, int* _value ) const; int QueryDoubleAttribute( const std::string& name, double* _value ) const; /// STL std::string form. void SetAttribute( const std::string& name, const std::string& _value ); ///< STL std::string form. void SetAttribute( const std::string& name, int _value ); ///< STL std::string form. void SetDoubleAttribute( const std::string& name, double value ); #endif /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const char * name, int value ); /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetDoubleAttribute( const char * name, double value ); /** Deletes an attribute with the given name. */ void RemoveAttribute( const char * name ); #ifdef TIXML_USE_STL void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. #endif const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } /** Convenience function for easy access to the text inside an element. Although easy and concise, GetText() is limited compared to getting the TiXmlText child and accessing it directly. If the first child of 'this' is a TiXmlText, the GetText() returns the character string of the Text node, else null is returned. This is a convenient method for getting the text of simple contained text: @verbatim This is text const char* str = fooElement->GetText(); @endverbatim 'str' will be a pointer to "This is text". Note that this function can be misleading. If the element foo was created from this XML: @verbatim This is text @endverbatim then the value of str would be null. The first child node isn't a text node, it is another element. From this XML: @verbatim This is text @endverbatim GetText() will return "This is ". WARNING: GetText() accesses a child node - don't become confused with the similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are safe type casts on the referenced node. */ const char* GetText() const; /// Creates a new Element and returns it - the returned element is a copy. virtual TiXmlNode* Clone() const; // Print the Element to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /* Attribtue parsing starts: next char past '<' returns: next char past '>' */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlElement* target ) const; void ClearThis(); // like clear, but initializes 'this' object as well // Used to be public [internal use] #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif /* [internal use] Reads the "value" of the element -- another element, or text. This should terminate with the current end tag. */ const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); private: TiXmlAttributeSet attributeSet; }; /** An XML comment. */ class TiXmlComment : public TiXmlNode { public: /// Constructs an empty comment. TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {} /// Construct a comment from text. TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { SetValue( _value ); } TiXmlComment( const TiXmlComment& ); TiXmlComment& operator=( const TiXmlComment& base ); virtual ~TiXmlComment() {} /// Returns a copy of this Comment. virtual TiXmlNode* Clone() const; // Write this Comment to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /* Attribtue parsing starts: at the ! of the !-- returns: next char past '>' */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlComment* target ) const; // used to be public #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif // virtual void StreamOut( TIXML_OSTREAM * out ) const; private: }; /** XML text. A text node can have 2 ways to output the next. "normal" output and CDATA. It will default to the mode it was parsed from the XML file and you generally want to leave it alone, but you can change the output mode with SetCDATA() and query it with CDATA(). */ class TiXmlText : public TiXmlNode { friend class TiXmlElement; public: /** Constructor for text element. By default, it is treated as normal, encoded text. If you want it be output as a CDATA text element, set the parameter _cdata to 'true' */ TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) { SetValue( initValue ); cdata = false; } virtual ~TiXmlText() {} #ifdef TIXML_USE_STL /// Constructor. TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) { SetValue( initValue ); cdata = false; } #endif TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); } TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; } // Write this text object to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /// Queries whether this represents text using a CDATA section. bool CDATA() const { return cdata; } /// Turns on or off a CDATA representation of text. void SetCDATA( bool _cdata ) { cdata = _cdata; } virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected : /// [internal use] Creates a new Element and returns it. virtual TiXmlNode* Clone() const; void CopyTo( TiXmlText* target ) const; bool Blank() const; // returns true if all white space and new lines // [internal use] #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: bool cdata; // true if this should be input and output as a CDATA style text element }; /** In correct XML the declaration is the first entry in the file. @verbatim @endverbatim TinyXml will happily read or write files without a declaration, however. There are 3 possible attributes to the declaration: version, encoding, and standalone. Note: In this version of the code, the attributes are handled as special cases, not generic attributes, simply because there can only be at most 3 and they are always the same. */ class TiXmlDeclaration : public TiXmlNode { public: /// Construct an empty declaration. TiXmlDeclaration() : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {} #ifdef TIXML_USE_STL /// Constructor. TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ); #endif /// Construct. TiXmlDeclaration( const char* _version, const char* _encoding, const char* _standalone ); TiXmlDeclaration( const TiXmlDeclaration& copy ); TiXmlDeclaration& operator=( const TiXmlDeclaration& copy ); virtual ~TiXmlDeclaration() {} /// Version. Will return an empty string if none was found. const char *Version() const { return version.c_str (); } /// Encoding. Will return an empty string if none was found. const char *Encoding() const { return encoding.c_str (); } /// Is this a standalone document? const char *Standalone() const { return standalone.c_str (); } /// Creates a copy of this Declaration and returns it. virtual TiXmlNode* Clone() const; // Print this declaration to a FILE stream. virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; virtual void Print( FILE* cfile, int depth ) const { Print( cfile, depth, 0 ); } virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlDeclaration* target ) const; // used to be public #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: TIXML_STRING version; TIXML_STRING encoding; TIXML_STRING standalone; }; /** Any tag that tinyXml doesn't recognize is saved as an unknown. It is a tag of text, but should not be modified. It will be written back to the XML, unchanged, when the file is saved. DTD tags get thrown into TiXmlUnknowns. */ class TiXmlUnknown : public TiXmlNode { public: TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) {} virtual ~TiXmlUnknown() {} TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); } TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; } /// Creates a copy of this Unknown and returns it. virtual TiXmlNode* Clone() const; // Print this Unknown to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected: void CopyTo( TiXmlUnknown* target ) const; #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: }; /** Always the top level node. A document binds together all the XML pieces. It can be saved, loaded, and printed to the screen. The 'value' of a document node is the xml file name. */ class TiXmlDocument : public TiXmlNode { public: /// Create an empty document, that has no name. TiXmlDocument(); /// Create a document with a name. The name of the document is also the filename of the xml. TiXmlDocument( const char * documentName ); #ifdef TIXML_USE_STL /// Constructor. TiXmlDocument( const std::string& documentName ); #endif TiXmlDocument( const TiXmlDocument& copy ); TiXmlDocument& operator=( const TiXmlDocument& copy ); virtual ~TiXmlDocument() {} /** Load a file using the current document value. Returns true if successful. Will delete any existing document data before loading. */ bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the current document value. Returns true if successful. bool SaveFile() const; /// Load a file using the given filename. Returns true if successful. bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the given filename. Returns true if successful. bool SaveFile( const char * filename ) const; /** Load a file using the given FILE*. Returns true if successful. Note that this method doesn't stream - the entire object pointed at by the FILE* will be interpreted as an XML file. TinyXML doesn't stream in XML from the current file location. Streaming may be added in the future. */ bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the given FILE*. Returns true if successful. bool SaveFile( FILE* ) const; #ifdef TIXML_USE_STL bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. { return LoadFile( filename.c_str(), encoding ); } bool SaveFile( const std::string& filename ) const ///< STL std::string version. { return SaveFile( filename.c_str() ); } #endif /** Parse the given null terminated block of xml data. Passing in an encoding to this method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml to use that encoding, regardless of what TinyXml might otherwise try to detect. */ virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /** Get the root element -- the only top level element -- of the document. In well formed XML, there should only be one. TinyXml is tolerant of multiple elements at the document level. */ const TiXmlElement* RootElement() const { return FirstChildElement(); } TiXmlElement* RootElement() { return FirstChildElement(); } /** If an error occurs, Error will be set to true. Also, - The ErrorId() will contain the integer identifier of the error (not generally useful) - The ErrorDesc() method will return the name of the error. (very useful) - The ErrorRow() and ErrorCol() will return the location of the error (if known) */ bool Error() const { return error; } /// Contains a textual (english) description of the error if one occurs. const char * ErrorDesc() const { return errorDesc.c_str (); } /** Generally, you probably want the error string ( ErrorDesc() ). But if you prefer the ErrorId, this function will fetch it. */ int ErrorId() const { return errorId; } /** Returns the location (if known) of the error. The first column is column 1, and the first row is row 1. A value of 0 means the row and column wasn't applicable (memory errors, for example, have no row/column) or the parser lost the error. (An error in the error reporting, in that case.) @sa SetTabSize, Row, Column */ int ErrorRow() const { return errorLocation.row+1; } int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to report the correct values for row and column. It does not change the output or input in any way. By calling this method, with a tab size greater than 0, the row and column of each node and attribute is stored when the file is loaded. Very useful for tracking the DOM back in to the source file. The tab size is required for calculating the location of nodes. If not set, the default of 4 is used. The tabsize is set per document. Setting the tabsize to 0 disables row/column tracking. Note that row and column tracking is not supported when using operator>>. The tab size needs to be enabled before the parse or load. Correct usage: @verbatim TiXmlDocument doc; doc.SetTabSize( 8 ); doc.Load( "myfile.xml" ); @endverbatim @sa Row, Column */ void SetTabSize( int _tabsize ) { tabsize = _tabsize; } int TabSize() const { return tabsize; } /** If you have handled the error, it can be reset with this call. The error state is automatically cleared if you Parse a new XML block. */ void ClearError() { error = false; errorId = 0; errorDesc = ""; errorLocation.row = errorLocation.col = 0; //errorLocation.last = 0; } /** Write the document to standard out using formatted printing ("pretty print"). */ void Print() const { Print( stdout, 0 ); } /* Write the document to a string using formatted printing ("pretty print"). This will allocate a character array (new char[]) and return it as a pointer. The calling code pust call delete[] on the return char* to avoid a memory leak. */ //char* PrintToMemory() const; /// Print this Document to a FILE stream. virtual void Print( FILE* cfile, int depth = 0 ) const; // [internal use] void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected : // [internal use] virtual TiXmlNode* Clone() const; #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: void CopyTo( TiXmlDocument* target ) const; bool error; int errorId; TIXML_STRING errorDesc; int tabsize; TiXmlCursor errorLocation; bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. }; /** A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml DOM structure. It is a separate utility class. Take an example: @verbatim @endverbatim Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very easy to write a *lot* of code that looks like: @verbatim TiXmlElement* root = document.FirstChildElement( "Document" ); if ( root ) { TiXmlElement* element = root->FirstChildElement( "Element" ); if ( element ) { TiXmlElement* child = element->FirstChildElement( "Child" ); if ( child ) { TiXmlElement* child2 = child->NextSiblingElement( "Child" ); if ( child2 ) { // Finally do something useful. @endverbatim And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity of such code. A TiXmlHandle checks for null pointers so it is perfectly safe and correct to use: @verbatim TiXmlHandle docHandle( &document ); TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); if ( child2 ) { // do something useful @endverbatim Which is MUCH more concise and useful. It is also safe to copy handles - internally they are nothing more than node pointers. @verbatim TiXmlHandle handleCopy = handle; @endverbatim What they should not be used for is iteration: @verbatim int i=0; while ( true ) { TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); if ( !child ) break; // do something ++i; } @endverbatim It seems reasonable, but it is in fact two embedded while loops. The Child method is a linear walk to find the element, so this code would iterate much more than it needs to. Instead, prefer: @verbatim TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); for( child; child; child=child->NextSiblingElement() ) { // do something } @endverbatim */ class TiXmlHandle { public: /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } /// Copy constructor TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; } /// Return a handle to the first child node. TiXmlHandle FirstChild() const; /// Return a handle to the first child node with the given name. TiXmlHandle FirstChild( const char * value ) const; /// Return a handle to the first child element. TiXmlHandle FirstChildElement() const; /// Return a handle to the first child element with the given name. TiXmlHandle FirstChildElement( const char * value ) const; /** Return a handle to the "index" child with the given name. The first child is 0, the second 1, etc. */ TiXmlHandle Child( const char* value, int index ) const; /** Return a handle to the "index" child. The first child is 0, the second 1, etc. */ TiXmlHandle Child( int index ) const; /** Return a handle to the "index" child element with the given name. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( const char* value, int index ) const; /** Return a handle to the "index" child element. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( int index ) const; #ifdef TIXML_USE_STL TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } #endif /** Return the handle as a TiXmlNode. This may return null. */ TiXmlNode* ToNode() const { return node; } /** Return the handle as a TiXmlElement. This may return null. */ TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } /** Return the handle as a TiXmlText. This may return null. */ TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } /** Return the handle as a TiXmlUnknown. This may return null. */ TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } /** @deprecated use ToNode. Return the handle as a TiXmlNode. This may return null. */ TiXmlNode* Node() const { return ToNode(); } /** @deprecated use ToElement. Return the handle as a TiXmlElement. This may return null. */ TiXmlElement* Element() const { return ToElement(); } /** @deprecated use ToText() Return the handle as a TiXmlText. This may return null. */ TiXmlText* Text() const { return ToText(); } /** @deprecated use ToUnknown() Return the handle as a TiXmlUnknown. This may return null. */ TiXmlUnknown* Unknown() const { return ToUnknown(); } private: TiXmlNode* node; }; /** Print to memory functionality. The TiXmlPrinter is useful when you need to: -# Print to memory (especially in non-STL mode) -# Control formatting (line endings, etc.) When constructed, the TiXmlPrinter is in its default "pretty printing" mode. Before calling Accept() you can call methods to control the printing of the XML document. After TiXmlNode::Accept() is called, the printed document can be accessed via the CStr(), Str(), and Size() methods. TiXmlPrinter uses the Visitor API. @verbatim TiXmlPrinter printer; printer.SetIndent( "\t" ); doc.Accept( &printer ); fprintf( stdout, "%s", printer.CStr() ); @endverbatim */ class TiXmlPrinter : public TiXmlVisitor { public: TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), buffer(), indent( " " ), lineBreak( "\n" ) {} virtual bool VisitEnter( const TiXmlDocument& doc ); virtual bool VisitExit( const TiXmlDocument& doc ); virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); virtual bool VisitExit( const TiXmlElement& element ); virtual bool Visit( const TiXmlDeclaration& declaration ); virtual bool Visit( const TiXmlText& text ); virtual bool Visit( const TiXmlComment& comment ); virtual bool Visit( const TiXmlUnknown& unknown ); /** Set the indent characters for printing. By default 4 spaces but tab (\t) is also useful, or null/empty string for no indentation. */ void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } /// Query the indention string. const char* Indent() { return indent.c_str(); } /** Set the line breaking string. By default set to newline (\n). Some operating systems prefer other characters, or can be set to the null/empty string for no indenation. */ void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } /// Query the current line breaking string. const char* LineBreak() { return lineBreak.c_str(); } /** Switch over to "stream printing" which is the most dense formatting without linebreaks. Common when the XML is needed for network transmission. */ void SetStreamPrinting() { indent = ""; lineBreak = ""; } /// Return the result. const char* CStr() { return buffer.c_str(); } /// Return the length of the result string. size_t Size() { return buffer.size(); } #ifdef TIXML_USE_STL /// Return the result. const std::string& Str() { return buffer; } #endif private: void DoIndent() { for( int i=0; i(-1); // Null rep. TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } }; void TiXmlString::reserve (size_type cap) { if (cap > capacity()) { TiXmlString tmp; tmp.init(length(), cap); memcpy(tmp.start(), data(), length()); swap(tmp); } } TiXmlString& TiXmlString::assign(const char* str, size_type len) { size_type cap = capacity(); if (len > cap || cap > 3*(len + 8)) { TiXmlString tmp; tmp.init(len); memcpy(tmp.start(), str, len); swap(tmp); } else { memmove(start(), str, len); set_size(len); } return *this; } TiXmlString& TiXmlString::append(const char* str, size_type len) { size_type newsize = length() + len; if (newsize > capacity()) { reserve (newsize + capacity()); } memmove(finish(), str, len); set_size(newsize); return *this; } TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) { TiXmlString tmp; tmp.reserve(a.length() + b.length()); tmp += a; tmp += b; return tmp; } TiXmlString operator + (const TiXmlString & a, const char* b) { TiXmlString tmp; TiXmlString::size_type b_len = static_cast( strlen(b) ); tmp.reserve(a.length() + b_len); tmp += a; tmp.append(b, b_len); return tmp; } TiXmlString operator + (const char* a, const TiXmlString & b) { TiXmlString tmp; TiXmlString::size_type a_len = static_cast( strlen(a) ); tmp.reserve(a_len + b.length()); tmp.append(a, a_len); tmp += b; return tmp; } #endif // TIXML_USE_STL desmume-0.9.9/src/utils/tinyxml/tinyxmlerror.cpp0000644000175000017500000000337712140261630022644 0ustar guillaumeguillaume/* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "tinyxml.h" // The goal of the seperate error file is to make the first // step towards localization. tinyxml (currently) only supports // english error messages, but the could now be translated. // // It also cleans up the code a bit. // const char* TiXmlBase::errorString[ TiXmlBase::TIXML_ERROR_STRING_COUNT ] = { "No error", "Error", "Failed to open file", "Error parsing Element.", "Failed to read Element name", "Error reading Element value.", "Error reading Attributes.", "Error: empty tag.", "Error reading end tag.", "Error parsing Unknown.", "Error parsing Comment.", "Error parsing Declaration.", "Error document empty.", "Error null (0) or unexpected EOF found in input stream.", "Error parsing CDATA.", "Error when TiXmlDocument added to document, because TiXmlDocument can only be at the root.", }; desmume-0.9.9/src/utils/tinyxml/tinyxmlparser.cpp0000644000175000017500000011057212140261630023003 0ustar guillaumeguillaume/* www.sourceforge.net/projects/tinyxml Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include #include #include "tinyxml.h" //#define DEBUG_PARSER #if defined( DEBUG_PARSER ) # if defined( DEBUG ) && defined( _MSC_VER ) # include # define TIXML_LOG OutputDebugString # else # define TIXML_LOG printf # endif #endif // Note tha "PutString" hardcodes the same list. This // is less flexible than it appears. Changing the entries // or order will break putstring. TiXmlBase::Entity TiXmlBase::entity[ TiXmlBase::NUM_ENTITY ] = { { "&", 5, '&' }, { "<", 4, '<' }, { ">", 4, '>' }, { """, 6, '\"' }, { "'", 6, '\'' } }; // Bunch of unicode info at: // http://www.unicode.org/faq/utf_bom.html // Including the basic of this table, which determines the #bytes in the // sequence from the lead byte. 1 placed for invalid sequences -- // although the result will be junk, pass it through as much as possible. // Beware of the non-characters in UTF-8: // ef bb bf (Microsoft "lead bytes") // ef bf be // ef bf bf const unsigned char TIXML_UTF_LEAD_0 = 0xefU; const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; const int TiXmlBase::utf8ByteTable[256] = { // 0 1 2 3 4 5 6 7 8 9 a b c d e f 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid }; void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) { const unsigned long BYTE_MASK = 0xBF; const unsigned long BYTE_MARK = 0x80; const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; if (input < 0x80) *length = 1; else if ( input < 0x800 ) *length = 2; else if ( input < 0x10000 ) *length = 3; else if ( input < 0x200000 ) *length = 4; else { *length = 0; return; } // This code won't covert this correctly anyway. output += *length; // Scary scary fall throughs. switch (*length) { case 4: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 3: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 2: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 1: --output; *output = (char)(input | FIRST_BYTE_MARK[*length]); } } /*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) { // This will only work for low-ascii, everything else is assumed to be a valid // letter. I'm not sure this is the best approach, but it is quite tricky trying // to figure out alhabetical vs. not across encoding. So take a very // conservative approach. // if ( encoding == TIXML_ENCODING_UTF8 ) // { if ( anyByte < 127 ) return isalpha( anyByte ); else return 1; // What else to do? The unicode set is huge...get the english ones right. // } // else // { // return isalpha( anyByte ); // } } /*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) { // This will only work for low-ascii, everything else is assumed to be a valid // letter. I'm not sure this is the best approach, but it is quite tricky trying // to figure out alhabetical vs. not across encoding. So take a very // conservative approach. // if ( encoding == TIXML_ENCODING_UTF8 ) // { if ( anyByte < 127 ) return isalnum( anyByte ); else return 1; // What else to do? The unicode set is huge...get the english ones right. // } // else // { // return isalnum( anyByte ); // } } class TiXmlParsingData { friend class TiXmlDocument; public: void Stamp( const char* now, TiXmlEncoding encoding ); const TiXmlCursor& Cursor() const { return cursor; } private: // Only used by the document! TiXmlParsingData( const char* start, int _tabsize, int row, int col ) { assert( start ); stamp = start; tabsize = _tabsize; cursor.row = row; cursor.col = col; } TiXmlCursor cursor; const char* stamp; int tabsize; }; void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) { assert( now ); // Do nothing if the tabsize is 0. if ( tabsize < 1 ) { return; } // Get the current row, column. int row = cursor.row; int col = cursor.col; const char* p = stamp; assert( p ); while ( p < now ) { // Treat p as unsigned, so we have a happy compiler. const unsigned char* pU = (const unsigned char*)p; // Code contributed by Fletcher Dunn: (modified by lee) switch (*pU) { case 0: // We *should* never get here, but in case we do, don't // advance past the terminating null character, ever return; case '\r': // bump down to the next line ++row; col = 0; // Eat the character ++p; // Check for \r\n sequence, and treat this as a single character if (*p == '\n') { ++p; } break; case '\n': // bump down to the next line ++row; col = 0; // Eat the character ++p; // Check for \n\r sequence, and treat this as a single // character. (Yes, this bizarre thing does occur still // on some arcane platforms...) if (*p == '\r') { ++p; } break; case '\t': // Eat the character ++p; // Skip to next tab stop col = (col / tabsize + 1) * tabsize; break; case TIXML_UTF_LEAD_0: if ( encoding == TIXML_ENCODING_UTF8 ) { if ( *(p+1) && *(p+2) ) { // In these cases, don't advance the column. These are // 0-width spaces. if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) p += 3; else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) p += 3; else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) p += 3; else { p +=3; ++col; } // A normal character. } } else { ++p; ++col; } break; default: if ( encoding == TIXML_ENCODING_UTF8 ) { // Eat the 1 to 4 byte utf8 character. int step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)]; if ( step == 0 ) step = 1; // Error case from bad encoding, but handle gracefully. p += step; // Just advance one column, of course. ++col; } else { ++p; ++col; } break; } } cursor.row = row; cursor.col = col; assert( cursor.row >= -1 ); assert( cursor.col >= -1 ); stamp = p; assert( stamp ); } const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) { if ( !p || !*p ) { return 0; } if ( encoding == TIXML_ENCODING_UTF8 ) { while ( *p ) { const unsigned char* pU = (const unsigned char*)p; // Skip the stupid Microsoft UTF-8 Byte order marks if ( *(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) { p += 3; continue; } else if(*(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==0xbfU && *(pU+2)==0xbeU ) { p += 3; continue; } else if(*(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==0xbfU && *(pU+2)==0xbfU ) { p += 3; continue; } if ( IsWhiteSpace( *p ) ) // Still using old rules for white space. ++p; else break; } } else { while ( *p && IsWhiteSpace( *p ) ) ++p; } return p; } #ifdef TIXML_USE_STL /*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ) { for( ;; ) { if ( !in->good() ) return false; int c = in->peek(); // At this scope, we can't get to a document. So fail silently. if ( !IsWhiteSpace( c ) || c <= 0 ) return true; *tag += (char) in->get(); } } /*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag ) { //assert( character > 0 && character < 128 ); // else it won't work in utf-8 while ( in->good() ) { int c = in->peek(); if ( c == character ) return true; if ( c <= 0 ) // Silent failure: can't get document at this scope return false; in->get(); *tag += (char) c; } return false; } #endif // One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The // "assign" optimization removes over 10% of the execution time. // const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) { // Oddly, not supported on some comilers, //name->clear(); // So use this: *name = ""; assert( p ); // Names start with letters or underscores. // Of course, in unicode, tinyxml has no idea what a letter *is*. The // algorithm is generous. // // After that, they can be letters, underscores, numbers, // hyphens, or colons. (Colons are valid ony for namespaces, // but tinyxml can't tell namespaces from names.) if ( p && *p && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) { const char* start = p; while( p && *p && ( IsAlphaNum( (unsigned char ) *p, encoding ) || *p == '_' || *p == '-' || *p == '.' || *p == ':' ) ) { //(*name) += *p; // expensive ++p; } if ( p-start > 0 ) { name->assign( start, p-start ); } return p; } return 0; } const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) { // Presume an entity, and pull it out. TIXML_STRING ent; int i; *length = 0; if ( *(p+1) && *(p+1) == '#' && *(p+2) ) { unsigned long ucs = 0; ptrdiff_t delta = 0; unsigned mult = 1; if ( *(p+2) == 'x' ) { // Hexadecimal. if ( !*(p+3) ) return 0; const char* q = p+3; q = strchr( q, ';' ); if ( !q || !*q ) return 0; delta = q-p; --q; while ( *q != 'x' ) { if ( *q >= '0' && *q <= '9' ) ucs += mult * (*q - '0'); else if ( *q >= 'a' && *q <= 'f' ) ucs += mult * (*q - 'a' + 10); else if ( *q >= 'A' && *q <= 'F' ) ucs += mult * (*q - 'A' + 10 ); else return 0; mult *= 16; --q; } } else { // Decimal. if ( !*(p+2) ) return 0; const char* q = p+2; q = strchr( q, ';' ); if ( !q || !*q ) return 0; delta = q-p; --q; while ( *q != '#' ) { if ( *q >= '0' && *q <= '9' ) ucs += mult * (*q - '0'); else return 0; mult *= 10; --q; } } if ( encoding == TIXML_ENCODING_UTF8 ) { // convert the UCS to UTF-8 ConvertUTF32ToUTF8( ucs, value, length ); } else { *value = (char)ucs; *length = 1; } return p + delta + 1; } // Now try to match it. for( i=0; iappend( cArr, len ); } } else { bool whitespace = false; // Remove leading white space: p = SkipWhiteSpace( p, encoding ); while ( p && *p && !StringEqual( p, endTag, caseInsensitive, encoding ) ) { if ( *p == '\r' || *p == '\n' ) { whitespace = true; ++p; } else if ( IsWhiteSpace( *p ) ) { whitespace = true; ++p; } else { // If we've found whitespace, add it before the // new character. Any whitespace just becomes a space. if ( whitespace ) { (*text) += ' '; whitespace = false; } int len; char cArr[4] = { 0, 0, 0, 0 }; p = GetChar( p, cArr, &len, encoding ); if ( len == 1 ) (*text) += cArr[0]; // more efficient else text->append( cArr, len ); } } } if ( p && *p ) p += strlen( endTag ); return ( p && *p ) ? p : 0; } #ifdef TIXML_USE_STL void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag ) { // The basic issue with a document is that we don't know what we're // streaming. Read something presumed to be a tag (and hope), then // identify it, and call the appropriate stream method on the tag. // // This "pre-streaming" will never read the closing ">" so the // sub-tag can orient itself. if ( !StreamTo( in, '<', tag ) ) { SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } while ( in->good() ) { int tagIndex = (int) tag->length(); while ( in->good() && in->peek() != '>' ) { int c = in->get(); if ( c <= 0 ) { SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); break; } (*tag) += (char) c; } if ( in->good() ) { // We now have something we presume to be a node of // some sort. Identify it, and call the node to // continue streaming. TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); if ( node ) { node->StreamIn( in, tag ); bool isElement = node->ToElement() != 0; delete node; node = 0; // If this is the root element, we're done. Parsing will be // done by the >> operator. if ( isElement ) { return; } } else { SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } } } // We should have returned sooner. SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); } #endif const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) { ClearError(); // Parse away, at the document level. Since a document // contains nothing but other tags, most of what happens // here is skipping white space. if ( !p || !*p ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } // Note that, for a document, this needs to come // before the while space skip, so that parsing // starts from the pointer we are given. location.Clear(); if ( prevData ) { location.row = prevData->cursor.row; location.col = prevData->cursor.col; } else { location.row = 0; location.col = 0; } TiXmlParsingData data( p, TabSize(), location.row, location.col ); location = data.Cursor(); if ( encoding == TIXML_ENCODING_UNKNOWN ) { // Check for the Microsoft UTF-8 lead bytes. const unsigned char* pU = (const unsigned char*)p; if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) { encoding = TIXML_ENCODING_UTF8; useMicrosoftBOM = true; } } p = SkipWhiteSpace( p, encoding ); if ( !p ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } while ( p && *p ) { TiXmlNode* node = Identify( p, encoding ); if ( node ) { p = node->Parse( p, &data, encoding ); LinkEndChild( node ); } else { break; } // Did we get encoding info? if ( encoding == TIXML_ENCODING_UNKNOWN && node->ToDeclaration() ) { TiXmlDeclaration* dec = node->ToDeclaration(); const char* enc = dec->Encoding(); assert( enc ); if ( *enc == 0 ) encoding = TIXML_ENCODING_UTF8; else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) encoding = TIXML_ENCODING_UTF8; else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice else encoding = TIXML_ENCODING_LEGACY; } p = SkipWhiteSpace( p, encoding ); } // Was this empty? if ( !firstChild ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); return 0; } // All is well. return p; } void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) { // The first error in a chain is more accurate - don't set again! if ( error ) return; assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); error = true; errorId = err; errorDesc = errorString[ errorId ]; errorLocation.Clear(); if ( pError && data ) { data->Stamp( pError, encoding ); errorLocation = data->Cursor(); } } TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) { TiXmlNode* returnNode = 0; p = SkipWhiteSpace( p, encoding ); if( !p || !*p || *p != '<' ) { return 0; } p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) { return 0; } // What is this thing? // - Elements start with a letter or underscore, but xml is reserved. // - Comments: "; if ( !StringEqual( p, startTag, false, encoding ) ) { if ( document ) document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); return 0; } p += strlen( startTag ); // [ 1475201 ] TinyXML parses entities in comments // Oops - ReadText doesn't work, because we don't want to parse the entities. // p = ReadText( p, &value, false, endTag, false, encoding ); // // from the XML spec: /* [Definition: Comments may appear anywhere in a document outside other markup; in addition, they may appear within the document type declaration at places allowed by the grammar. They are not part of the document's character data; an XML processor MAY, but need not, make it possible for an application to retrieve the text of comments. For compatibility, the string "--" (double-hyphen) MUST NOT occur within comments.] Parameter entity references MUST NOT be recognized within comments. An example of a comment: */ value = ""; // Keep all the white space. while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) { value.append( p, 1 ); ++p; } if ( p && *p ) p += strlen( endTag ); return p; } const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) return 0; if ( data ) { data->Stamp( p, encoding ); location = data->Cursor(); } // Read the name, the '=' and the value. const char* pErr = p; p = ReadName( p, &name, encoding ); if ( !p || !*p ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); return 0; } p = SkipWhiteSpace( p, encoding ); if ( !p || !*p || *p != '=' ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } ++p; // skip '=' p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } const char* end; const char SINGLE_QUOTE = '\''; const char DOUBLE_QUOTE = '\"'; if ( *p == SINGLE_QUOTE ) { ++p; end = "\'"; // single quote in string p = ReadText( p, &value, false, end, false, encoding ); } else if ( *p == DOUBLE_QUOTE ) { ++p; end = "\""; // double quote in string p = ReadText( p, &value, false, end, false, encoding ); } else { // All attribute values should be in single or double quotes. // But this is such a common error that the parser will try // its best, even without them. value = ""; while ( p && *p // existence && !IsWhiteSpace( *p ) // whitespace && *p != '/' && *p != '>' ) // tag end { if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) { // [ 1451649 ] Attribute values with trailing quotes not handled correctly // We did not have an opening quote but seem to have a // closing one. Give up and throw an error. if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } value += *p; ++p; } } return p; } #ifdef TIXML_USE_STL void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag ) { while ( in->good() ) { int c = in->peek(); if ( !cdata && (c == '<' ) ) { return; } if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; in->get(); // "commits" the peek made above if ( cdata && c == '>' && tag->size() >= 3 ) { size_t len = tag->size(); if ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) { // terminator of cdata. return; } } } } #endif const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { value = ""; TiXmlDocument* document = GetDocument(); if ( data ) { data->Stamp( p, encoding ); location = data->Cursor(); } const char* const startTag = ""; if ( cdata || StringEqual( p, startTag, false, encoding ) ) { cdata = true; if ( !StringEqual( p, startTag, false, encoding ) ) { if ( document ) document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); return 0; } p += strlen( startTag ); // Keep all the white space, ignore the encoding, etc. while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) { value += *p; ++p; } TIXML_STRING dummy; p = ReadText( p, &dummy, false, endTag, false, encoding ); return p; } else { bool ignoreWhite = true; const char* end = "<"; p = ReadText( p, &value, ignoreWhite, end, false, encoding ); if ( p && *p ) return p-1; // don't truncate the '<' return 0; } } #ifdef TIXML_USE_STL void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag ) { while ( in->good() ) { int c = in->get(); if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; if ( c == '>' ) { // All is well. return; } } } #endif const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) { p = SkipWhiteSpace( p, _encoding ); // Find the beginning, find the end, and look for // the stuff in-between. TiXmlDocument* document = GetDocument(); if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); return 0; } if ( data ) { data->Stamp( p, _encoding ); location = data->Cursor(); } p += 5; version = ""; encoding = ""; standalone = ""; while ( p && *p ) { if ( *p == '>' ) { ++p; return p; } p = SkipWhiteSpace( p, _encoding ); if ( StringEqual( p, "version", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); version = attrib.Value(); } else if ( StringEqual( p, "encoding", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); encoding = attrib.Value(); } else if ( StringEqual( p, "standalone", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); standalone = attrib.Value(); } else { // Read over whatever it is. while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) ++p; } } return 0; } bool TiXmlText::Blank() const { for ( unsigned i=0; i #ifdef TIXML_USE_STL #include #include #endif #include "tinyxml.h" FILE* TiXmlFOpen( const char* filename, const char* mode ); bool TiXmlBase::condenseWhiteSpace = true; // Microsoft compiler security FILE* TiXmlFOpen( const char* filename, const char* mode ) { #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) FILE* fp = 0; errno_t err = fopen_s( &fp, filename, mode ); if ( !err && fp ) return fp; return 0; #else return fopen( filename, mode ); #endif } void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) { int i=0; while( i<(int)str.length() ) { unsigned char c = (unsigned char) str[i]; if ( c == '&' && i < ( (int)str.length() - 2 ) && str[i+1] == '#' && str[i+2] == 'x' ) { // Hexadecimal character reference. // Pass through unchanged. // © -- copyright symbol, for example. // // The -1 is a bug fix from Rob Laveaux. It keeps // an overflow from happening if there is no ';'. // There are actually 2 ways to exit this loop - // while fails (error case) and break (semicolon found). // However, there is no mechanism (currently) for // this function to return an error. while ( i<(int)str.length()-1 ) { outString->append( str.c_str() + i, 1 ); ++i; if ( str[i] == ';' ) break; } } else if ( c == '&' ) { outString->append( entity[0].str, entity[0].strLength ); ++i; } else if ( c == '<' ) { outString->append( entity[1].str, entity[1].strLength ); ++i; } else if ( c == '>' ) { outString->append( entity[2].str, entity[2].strLength ); ++i; } else if ( c == '\"' ) { outString->append( entity[3].str, entity[3].strLength ); ++i; } else if ( c == '\'' ) { outString->append( entity[4].str, entity[4].strLength ); ++i; } else if ( c < 32 ) { // Easy pass at non-alpha/numeric/symbol // Below 32 is symbolic. char buf[ 32 ]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); #else sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); #endif //*ME: warning C4267: convert 'size_t' to 'int' //*ME: Int-Cast to make compiler happy ... outString->append( buf, (int)strlen( buf ) ); ++i; } else { //char realc = (char) c; //outString->append( &realc, 1 ); *outString += (char) c; // somewhat more efficient function call. ++i; } } } TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() { parent = 0; type = _type; firstChild = 0; lastChild = 0; prev = 0; next = 0; } TiXmlNode::~TiXmlNode() { TiXmlNode* node = firstChild; TiXmlNode* temp = 0; while ( node ) { temp = node; node = node->next; delete temp; } } void TiXmlNode::CopyTo( TiXmlNode* target ) const { target->SetValue (value.c_str() ); target->userData = userData; target->location = location; } void TiXmlNode::Clear() { TiXmlNode* node = firstChild; TiXmlNode* temp = 0; while ( node ) { temp = node; node = node->next; delete temp; } firstChild = 0; lastChild = 0; } TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) { assert( node->parent == 0 || node->parent == this ); assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() ); if ( node->Type() == TiXmlNode::TINYXML_DOCUMENT ) { delete node; if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } node->parent = this; node->prev = lastChild; node->next = 0; if ( lastChild ) lastChild->next = node; else firstChild = node; // it was an empty list. lastChild = node; return node; } TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) { if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; return LinkEndChild( node ); } TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) { if ( !beforeThis || beforeThis->parent != this ) { return 0; } if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; node->parent = this; node->next = beforeThis; node->prev = beforeThis->prev; if ( beforeThis->prev ) { beforeThis->prev->next = node; } else { assert( firstChild == beforeThis ); firstChild = node; } beforeThis->prev = node; return node; } TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) { if ( !afterThis || afterThis->parent != this ) { return 0; } if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; node->parent = this; node->prev = afterThis; node->next = afterThis->next; if ( afterThis->next ) { afterThis->next->prev = node; } else { assert( lastChild == afterThis ); lastChild = node; } afterThis->next = node; return node; } TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) { if ( !replaceThis ) return 0; if ( replaceThis->parent != this ) return 0; if ( withThis.ToDocument() ) { // A document can never be a child. Thanks to Noam. TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = withThis.Clone(); if ( !node ) return 0; node->next = replaceThis->next; node->prev = replaceThis->prev; if ( replaceThis->next ) replaceThis->next->prev = node; else lastChild = node; if ( replaceThis->prev ) replaceThis->prev->next = node; else firstChild = node; delete replaceThis; node->parent = this; return node; } bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) { if ( !removeThis ) { return false; } if ( removeThis->parent != this ) { assert( 0 ); return false; } if ( removeThis->next ) removeThis->next->prev = removeThis->prev; else lastChild = removeThis->prev; if ( removeThis->prev ) removeThis->prev->next = removeThis->next; else firstChild = removeThis->next; delete removeThis; return true; } const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const { const TiXmlNode* node; for ( node = firstChild; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const { const TiXmlNode* node; for ( node = lastChild; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const { if ( !previous ) { return FirstChild(); } else { assert( previous->parent == this ); return previous->NextSibling(); } } const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const { if ( !previous ) { return FirstChild( val ); } else { assert( previous->parent == this ); return previous->NextSibling( val ); } } const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const { const TiXmlNode* node; for ( node = next; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const { const TiXmlNode* node; for ( node = prev; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } void TiXmlElement::RemoveAttribute( const char * name ) { #ifdef TIXML_USE_STL TIXML_STRING str( name ); TiXmlAttribute* node = attributeSet.Find( str ); #else TiXmlAttribute* node = attributeSet.Find( name ); #endif if ( node ) { attributeSet.Remove( node ); delete node; } } const TiXmlElement* TiXmlNode::FirstChildElement() const { const TiXmlNode* node; for ( node = FirstChild(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const { const TiXmlNode* node; for ( node = FirstChild( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::NextSiblingElement() const { const TiXmlNode* node; for ( node = NextSibling(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const { const TiXmlNode* node; for ( node = NextSibling( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlDocument* TiXmlNode::GetDocument() const { const TiXmlNode* node; for( node = this; node; node = node->parent ) { if ( node->ToDocument() ) return node->ToDocument(); } return 0; } TiXmlElement::TiXmlElement (const char * _value) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; value = _value; } #ifdef TIXML_USE_STL TiXmlElement::TiXmlElement( const std::string& _value ) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; value = _value; } #endif TiXmlElement::TiXmlElement( const TiXmlElement& copy) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; copy.CopyTo( this ); } TiXmlElement& TiXmlElement::operator=( const TiXmlElement& base ) { ClearThis(); base.CopyTo( this ); return *this; } TiXmlElement::~TiXmlElement() { ClearThis(); } void TiXmlElement::ClearThis() { Clear(); while( attributeSet.First() ) { TiXmlAttribute* node = attributeSet.First(); attributeSet.Remove( node ); delete node; } } const char* TiXmlElement::Attribute( const char* name ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( node ) return node->Value(); return 0; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( attrib ) return &attrib->ValueStr(); return 0; } #endif const char* TiXmlElement::Attribute( const char* name, int* i ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const char* result = 0; if ( attrib ) { result = attrib->Value(); if ( i ) { attrib->QueryIntValue( i ); } } return result; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const std::string* result = 0; if ( attrib ) { result = &attrib->ValueStr(); if ( i ) { attrib->QueryIntValue( i ); } } return result; } #endif const char* TiXmlElement::Attribute( const char* name, double* d ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const char* result = 0; if ( attrib ) { result = attrib->Value(); if ( d ) { attrib->QueryDoubleValue( d ); } } return result; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const std::string* result = 0; if ( attrib ) { result = &attrib->ValueStr(); if ( d ) { attrib->QueryDoubleValue( d ); } } return result; } #endif int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryIntValue( ival ); } int TiXmlElement::QueryUnsignedAttribute( const char* name, unsigned* value ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; int ival = 0; int result = node->QueryIntValue( &ival ); *value = (unsigned)ival; return result; } int TiXmlElement::QueryBoolAttribute( const char* name, bool* bval ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; int result = TIXML_WRONG_TYPE; if ( StringEqual( node->Value(), "true", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "yes", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "1", true, TIXML_ENCODING_UNKNOWN ) ) { *bval = true; result = TIXML_SUCCESS; } else if ( StringEqual( node->Value(), "false", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "no", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "0", true, TIXML_ENCODING_UNKNOWN ) ) { *bval = false; result = TIXML_SUCCESS; } return result; } #ifdef TIXML_USE_STL int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryIntValue( ival ); } #endif int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryDoubleValue( dval ); } #ifdef TIXML_USE_STL int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryDoubleValue( dval ); } #endif void TiXmlElement::SetAttribute( const char * name, int val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetIntValue( val ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetAttribute( const std::string& name, int val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetIntValue( val ); } } #endif void TiXmlElement::SetDoubleAttribute( const char * name, double val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetDoubleValue( val ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetDoubleAttribute( const std::string& name, double val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetDoubleValue( val ); } } #endif void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( cname ); if ( attrib ) { attrib->SetValue( cvalue ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetAttribute( const std::string& _name, const std::string& _value ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( _name ); if ( attrib ) { attrib->SetValue( _value ); } } #endif void TiXmlElement::Print( FILE* cfile, int depth ) const { int i; assert( cfile ); for ( i=0; iNext() ) { fprintf( cfile, " " ); attrib->Print( cfile, depth ); } // There are 3 different formatting approaches: // 1) An element without children is printed as a node // 2) An element with only a text child is printed as text // 3) An element with children is printed on multiple lines. TiXmlNode* node; if ( !firstChild ) { fprintf( cfile, " />" ); } else if ( firstChild == lastChild && firstChild->ToText() ) { fprintf( cfile, ">" ); firstChild->Print( cfile, depth + 1 ); fprintf( cfile, "", value.c_str() ); } else { fprintf( cfile, ">" ); for ( node = firstChild; node; node=node->NextSibling() ) { if ( !node->ToText() ) { fprintf( cfile, "\n" ); } node->Print( cfile, depth+1 ); } fprintf( cfile, "\n" ); for( i=0; i", value.c_str() ); } } void TiXmlElement::CopyTo( TiXmlElement* target ) const { // superclass: TiXmlNode::CopyTo( target ); // Element class: // Clone the attributes, then clone the children. const TiXmlAttribute* attribute = 0; for( attribute = attributeSet.First(); attribute; attribute = attribute->Next() ) { target->SetAttribute( attribute->Name(), attribute->Value() ); } TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } } bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const { if ( visitor->VisitEnter( *this, attributeSet.First() ) ) { for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { if ( !node->Accept( visitor ) ) break; } } return visitor->VisitExit( *this ); } TiXmlNode* TiXmlElement::Clone() const { TiXmlElement* clone = new TiXmlElement( Value() ); if ( !clone ) return 0; CopyTo( clone ); return clone; } const char* TiXmlElement::GetText() const { const TiXmlNode* child = this->FirstChild(); if ( child ) { const TiXmlText* childText = child->ToText(); if ( childText ) { return childText->Value(); } } return 0; } TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; ClearError(); } TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; value = documentName; ClearError(); } #ifdef TIXML_USE_STL TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; value = documentName; ClearError(); } #endif TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { copy.CopyTo( this ); } TiXmlDocument& TiXmlDocument::operator=( const TiXmlDocument& copy ) { Clear(); copy.CopyTo( this ); return *this; } bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) { return LoadFile( Value(), encoding ); } bool TiXmlDocument::SaveFile() const { return SaveFile( Value() ); } bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding ) { TIXML_STRING filename( _filename ); value = filename; // reading in binary mode so that tinyxml can normalize the EOL FILE* file = TiXmlFOpen( value.c_str (), "rb" ); if ( file ) { bool result = LoadFile( file, encoding ); fclose( file ); return result; } else { SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } } bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding ) { if ( !file ) { SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Delete the existing data: Clear(); location.Clear(); // Get the file size, so we can pre-allocate the string. HUGE speed impact. long length = 0; fseek( file, 0, SEEK_END ); length = ftell( file ); fseek( file, 0, SEEK_SET ); // Strange case, but good to handle up front. if ( length <= 0 ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Subtle bug here. TinyXml did use fgets. But from the XML spec: // 2.11 End-of-Line Handling // // // ...the XML processor MUST behave as if it normalized all line breaks in external // parsed entities (including the document entity) on input, before parsing, by translating // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to // a single #xA character. // // // It is not clear fgets does that, and certainly isn't clear it works cross platform. // Generally, you expect fgets to translate from the convention of the OS to the c/unix // convention, and not work generally. /* while( fgets( buf, sizeof(buf), file ) ) { data += buf; } */ char* buf = new char[ length+1 ]; buf[0] = 0; if ( fread( buf, length, 1, file ) != 1 ) { delete [] buf; SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Process the buffer in place to normalize new lines. (See comment above.) // Copies from the 'p' to 'q' pointer, where p can advance faster if // a newline-carriage return is hit. // // Wikipedia: // Systems based on ASCII or a compatible character set use either LF (Line feed, '\n', 0x0A, 10 in decimal) or // CR (Carriage return, '\r', 0x0D, 13 in decimal) individually, or CR followed by LF (CR+LF, 0x0D 0x0A)... // * LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others // * CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS // * CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 const char* p = buf; // the read head char* q = buf; // the write head const char CR = 0x0d; const char LF = 0x0a; buf[length] = 0; while( *p ) { assert( p < (buf+length) ); assert( q <= (buf+length) ); assert( q <= p ); if ( *p == CR ) { *q++ = LF; p++; if ( *p == LF ) { // check for CR+LF (and skip LF) p++; } } else { *q++ = *p++; } } assert( q <= (buf+length) ); *q = 0; Parse( buf, 0, encoding ); delete [] buf; return !Error(); } bool TiXmlDocument::SaveFile( const char * filename ) const { // The old c stuff lives on... FILE* fp = TiXmlFOpen( filename, "w" ); if ( fp ) { bool result = SaveFile( fp ); fclose( fp ); return result; } return false; } bool TiXmlDocument::SaveFile( FILE* fp ) const { if ( useMicrosoftBOM ) { const unsigned char TIXML_UTF_LEAD_0 = 0xefU; const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; fputc( TIXML_UTF_LEAD_0, fp ); fputc( TIXML_UTF_LEAD_1, fp ); fputc( TIXML_UTF_LEAD_2, fp ); } Print( fp, 0 ); return (ferror(fp) == 0); } void TiXmlDocument::CopyTo( TiXmlDocument* target ) const { TiXmlNode::CopyTo( target ); target->error = error; target->errorId = errorId; target->errorDesc = errorDesc; target->tabsize = tabsize; target->errorLocation = errorLocation; target->useMicrosoftBOM = useMicrosoftBOM; TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } } TiXmlNode* TiXmlDocument::Clone() const { TiXmlDocument* clone = new TiXmlDocument(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlDocument::Print( FILE* cfile, int depth ) const { assert( cfile ); for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { node->Print( cfile, depth ); fprintf( cfile, "\n" ); } } bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const { if ( visitor->VisitEnter( *this ) ) { for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { if ( !node->Accept( visitor ) ) break; } } return visitor->VisitExit( *this ); } const TiXmlAttribute* TiXmlAttribute::Next() const { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( next->value.empty() && next->name.empty() ) return 0; return next; } /* TiXmlAttribute* TiXmlAttribute::Next() { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( next->value.empty() && next->name.empty() ) return 0; return next; } */ const TiXmlAttribute* TiXmlAttribute::Previous() const { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( prev->value.empty() && prev->name.empty() ) return 0; return prev; } /* TiXmlAttribute* TiXmlAttribute::Previous() { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( prev->value.empty() && prev->name.empty() ) return 0; return prev; } */ void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const { TIXML_STRING n, v; EncodeString( name, &n ); EncodeString( value, &v ); if (value.find ('\"') == TIXML_STRING::npos) { if ( cfile ) { fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); } if ( str ) { (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\""; } } else { if ( cfile ) { fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); } if ( str ) { (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'"; } } } int TiXmlAttribute::QueryIntValue( int* ival ) const { if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } int TiXmlAttribute::QueryDoubleValue( double* dval ) const { if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } void TiXmlAttribute::SetIntValue( int _value ) { char buf [64]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); #else sprintf (buf, "%d", _value); #endif SetValue (buf); } void TiXmlAttribute::SetDoubleValue( double _value ) { char buf [256]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "%g", _value); #else sprintf (buf, "%g", _value); #endif SetValue (buf); } int TiXmlAttribute::IntValue() const { return atoi (value.c_str ()); } double TiXmlAttribute::DoubleValue() const { return atof (value.c_str ()); } TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { copy.CopyTo( this ); } TiXmlComment& TiXmlComment::operator=( const TiXmlComment& base ) { Clear(); base.CopyTo( this ); return *this; } void TiXmlComment::Print( FILE* cfile, int depth ) const { assert( cfile ); for ( int i=0; i", value.c_str() ); } void TiXmlComment::CopyTo( TiXmlComment* target ) const { TiXmlNode::CopyTo( target ); } bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlComment::Clone() const { TiXmlComment* clone = new TiXmlComment(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlText::Print( FILE* cfile, int depth ) const { assert( cfile ); if ( cdata ) { int i; fprintf( cfile, "\n" ); for ( i=0; i\n", value.c_str() ); // unformatted output } else { TIXML_STRING buffer; EncodeString( value, &buffer ); fprintf( cfile, "%s", buffer.c_str() ); } } void TiXmlText::CopyTo( TiXmlText* target ) const { TiXmlNode::CopyTo( target ); target->cdata = cdata; } bool TiXmlText::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlText::Clone() const { TiXmlText* clone = 0; clone = new TiXmlText( "" ); if ( !clone ) return 0; CopyTo( clone ); return clone; } TiXmlDeclaration::TiXmlDeclaration( const char * _version, const char * _encoding, const char * _standalone ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { version = _version; encoding = _encoding; standalone = _standalone; } #ifdef TIXML_USE_STL TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { version = _version; encoding = _encoding; standalone = _standalone; } #endif TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { copy.CopyTo( this ); } TiXmlDeclaration& TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) { Clear(); copy.CopyTo( this ); return *this; } void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const { if ( cfile ) fprintf( cfile, "" ); if ( str ) (*str) += "?>"; } void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const { TiXmlNode::CopyTo( target ); target->version = version; target->encoding = encoding; target->standalone = standalone; } bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlDeclaration::Clone() const { TiXmlDeclaration* clone = new TiXmlDeclaration(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlUnknown::Print( FILE* cfile, int depth ) const { for ( int i=0; i", value.c_str() ); } void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const { TiXmlNode::CopyTo( target ); } bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlUnknown::Clone() const { TiXmlUnknown* clone = new TiXmlUnknown(); if ( !clone ) return 0; CopyTo( clone ); return clone; } TiXmlAttributeSet::TiXmlAttributeSet() { sentinel.next = &sentinel; sentinel.prev = &sentinel; } TiXmlAttributeSet::~TiXmlAttributeSet() { assert( sentinel.next == &sentinel ); assert( sentinel.prev == &sentinel ); } void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) { #ifdef TIXML_USE_STL assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set. #else assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. #endif addMe->next = &sentinel; addMe->prev = sentinel.prev; sentinel.prev->next = addMe; sentinel.prev = addMe; } void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) { TiXmlAttribute* node; for( node = sentinel.next; node != &sentinel; node = node->next ) { if ( node == removeMe ) { node->prev->next = node->next; node->next->prev = node->prev; node->next = 0; node->prev = 0; return; } } assert( 0 ); // we tried to remove a non-linked attribute. } #ifdef TIXML_USE_STL TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const { for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) { if ( node->name == name ) return node; } return 0; } TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const std::string& _name ) { TiXmlAttribute* attrib = Find( _name ); if ( !attrib ) { attrib = new TiXmlAttribute(); Add( attrib ); attrib->SetName( _name ); } return attrib; } #endif TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const { for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) { if ( strcmp( node->name.c_str(), name ) == 0 ) return node; } return 0; } TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const char* _name ) { TiXmlAttribute* attrib = Find( _name ); if ( !attrib ) { attrib = new TiXmlAttribute(); Add( attrib ); attrib->SetName( _name ); } return attrib; } #ifdef TIXML_USE_STL std::istream& operator>> (std::istream & in, TiXmlNode & base) { TIXML_STRING tag; tag.reserve( 8 * 1000 ); base.StreamIn( &in, &tag ); base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); return in; } #endif #ifdef TIXML_USE_STL std::ostream& operator<< (std::ostream & out, const TiXmlNode & base) { TiXmlPrinter printer; printer.SetStreamPrinting(); base.Accept( &printer ); out << printer.Str(); return out; } std::string& operator<< (std::string& out, const TiXmlNode& base ) { TiXmlPrinter printer; printer.SetStreamPrinting(); base.Accept( &printer ); out.append( printer.Str() ); return out; } #endif TiXmlHandle TiXmlHandle::FirstChild() const { if ( node ) { TiXmlNode* child = node->FirstChild(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const { if ( node ) { TiXmlNode* child = node->FirstChild( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement() const { if ( node ) { TiXmlElement* child = node->FirstChildElement(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const { if ( node ) { TiXmlElement* child = node->FirstChildElement( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( int count ) const { if ( node ) { int i; TiXmlNode* child = node->FirstChild(); for ( i=0; child && iNextSibling(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const { if ( node ) { int i; TiXmlNode* child = node->FirstChild( value ); for ( i=0; child && iNextSibling( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( int count ) const { if ( node ) { int i; TiXmlElement* child = node->FirstChildElement(); for ( i=0; child && iNextSiblingElement(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const { if ( node ) { int i; TiXmlElement* child = node->FirstChildElement( value ); for ( i=0; child && iNextSiblingElement( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } bool TiXmlPrinter::VisitEnter( const TiXmlDocument& ) { return true; } bool TiXmlPrinter::VisitExit( const TiXmlDocument& ) { return true; } bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) { DoIndent(); buffer += "<"; buffer += element.Value(); for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) { buffer += " "; attrib->Print( 0, 0, &buffer ); } if ( !element.FirstChild() ) { buffer += " />"; DoLineBreak(); } else { buffer += ">"; if ( element.FirstChild()->ToText() && element.LastChild() == element.FirstChild() && element.FirstChild()->ToText()->CDATA() == false ) { simpleTextPrint = true; // no DoLineBreak()! } else { DoLineBreak(); } } ++depth; return true; } bool TiXmlPrinter::VisitExit( const TiXmlElement& element ) { --depth; if ( !element.FirstChild() ) { // nothing. } else { if ( simpleTextPrint ) { simpleTextPrint = false; } else { DoIndent(); } buffer += ""; DoLineBreak(); } return true; } bool TiXmlPrinter::Visit( const TiXmlText& text ) { if ( text.CDATA() ) { DoIndent(); buffer += ""; DoLineBreak(); } else if ( simpleTextPrint ) { TIXML_STRING str; TiXmlBase::EncodeString( text.ValueTStr(), &str ); buffer += str; } else { DoIndent(); TIXML_STRING str; TiXmlBase::EncodeString( text.ValueTStr(), &str ); buffer += str; DoLineBreak(); } return true; } bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration ) { DoIndent(); declaration.Print( 0, 0, &buffer ); DoLineBreak(); return true; } bool TiXmlPrinter::Visit( const TiXmlComment& comment ) { DoIndent(); buffer += ""; DoLineBreak(); return true; } bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown ) { DoIndent(); buffer += "<"; buffer += unknown.Value(); buffer += ">"; DoLineBreak(); return true; } desmume-0.9.9/src/utils/tinyxml/tinystr.h0000644000175000017500000002000612140261630021233 0ustar guillaumeguillaume/* www.sourceforge.net/projects/tinyxml This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef TIXML_USE_STL #ifndef TIXML_STRING_INCLUDED #define TIXML_STRING_INCLUDED #include #include /* The support for explicit isn't that universal, and it isn't really required - it is used to check that the TiXmlString class isn't incorrectly used. Be nice to old compilers and macro it here: */ #if defined(_MSC_VER) && (_MSC_VER >= 1200 ) // Microsoft visual studio, version 6 and higher. #define TIXML_EXPLICIT explicit #elif defined(__GNUC__) && (__GNUC__ >= 3 ) // GCC version 3 and higher.s #define TIXML_EXPLICIT explicit #else #define TIXML_EXPLICIT #endif /* TiXmlString is an emulation of a subset of the std::string template. Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. Only the member functions relevant to the TinyXML project have been implemented. The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase a string and there's no more room, we allocate a buffer twice as big as we need. */ class TiXmlString { public : // The size type used typedef size_t size_type; // Error value for find primitive static const size_type npos; // = -1; // TiXmlString empty constructor TiXmlString () : rep_(&nullrep_) { } // TiXmlString copy constructor TiXmlString ( const TiXmlString & copy) : rep_(0) { init(copy.length()); memcpy(start(), copy.data(), length()); } // TiXmlString constructor, based on a string TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) { init( static_cast( strlen(copy) )); memcpy(start(), copy, length()); } // TiXmlString constructor, based on a string TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) { init(len); memcpy(start(), str, len); } // TiXmlString destructor ~TiXmlString () { quit(); } TiXmlString& operator = (const char * copy) { return assign( copy, (size_type)strlen(copy)); } TiXmlString& operator = (const TiXmlString & copy) { return assign(copy.start(), copy.length()); } // += operator. Maps to append TiXmlString& operator += (const char * suffix) { return append(suffix, static_cast( strlen(suffix) )); } // += operator. Maps to append TiXmlString& operator += (char single) { return append(&single, 1); } // += operator. Maps to append TiXmlString& operator += (const TiXmlString & suffix) { return append(suffix.data(), suffix.length()); } // Convert a TiXmlString into a null-terminated char * const char * c_str () const { return rep_->str; } // Convert a TiXmlString into a char * (need not be null terminated). const char * data () const { return rep_->str; } // Return the length of a TiXmlString size_type length () const { return rep_->size; } // Alias for length() size_type size () const { return rep_->size; } // Checks if a TiXmlString is empty bool empty () const { return rep_->size == 0; } // Return capacity of string size_type capacity () const { return rep_->capacity; } // single char extraction const char& at (size_type index) const { assert( index < length() ); return rep_->str[ index ]; } // [] operator char& operator [] (size_type index) const { assert( index < length() ); return rep_->str[ index ]; } // find a char in a string. Return TiXmlString::npos if not found size_type find (char lookup) const { return find(lookup, 0); } // find a char in a string from an offset. Return TiXmlString::npos if not found size_type find (char tofind, size_type offset) const { if (offset >= length()) return npos; for (const char* p = c_str() + offset; *p != '\0'; ++p) { if (*p == tofind) return static_cast< size_type >( p - c_str() ); } return npos; } void clear () { //Lee: //The original was just too strange, though correct: // TiXmlString().swap(*this); //Instead use the quit & re-init: quit(); init(0,0); } /* Function to reserve a big amount of data when we know we'll need it. Be aware that this function DOES NOT clear the content of the TiXmlString if any exists. */ void reserve (size_type cap); TiXmlString& assign (const char* str, size_type len); TiXmlString& append (const char* str, size_type len); void swap (TiXmlString& other) { Rep* r = rep_; rep_ = other.rep_; other.rep_ = r; } private: void init(size_type sz) { init(sz, sz); } void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } char* start() const { return rep_->str; } char* finish() const { return rep_->str + rep_->size; } struct Rep { size_type size, capacity; char str[1]; }; void init(size_type sz, size_type cap) { if (cap) { // Lee: the original form: // rep_ = static_cast(operator new(sizeof(Rep) + cap)); // doesn't work in some cases of new being overloaded. Switching // to the normal allocation, although use an 'int' for systems // that are overly picky about structure alignment. const size_type bytesNeeded = sizeof(Rep) + cap; const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); rep_ = reinterpret_cast( new int[ intsNeeded ] ); rep_->str[ rep_->size = sz ] = '\0'; rep_->capacity = cap; } else { rep_ = &nullrep_; } } void quit() { if (rep_ != &nullrep_) { // The rep_ is really an array of ints. (see the allocator, above). // Cast it back before delete, so the compiler won't incorrectly call destructors. delete [] ( reinterpret_cast( rep_ ) ); } } Rep * rep_; static Rep nullrep_; } ; inline bool operator == (const TiXmlString & a, const TiXmlString & b) { return ( a.length() == b.length() ) // optimization on some platforms && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare } inline bool operator < (const TiXmlString & a, const TiXmlString & b) { return strcmp(a.c_str(), b.c_str()) < 0; } inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); TiXmlString operator + (const TiXmlString & a, const char* b); TiXmlString operator + (const char* a, const TiXmlString & b); /* TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. Only the operators that we need for TinyXML have been developped. */ class TiXmlOutStream : public TiXmlString { public : // TiXmlOutStream << operator. TiXmlOutStream & operator << (const TiXmlString & in) { *this += in; return *this; } // TiXmlOutStream << operator. TiXmlOutStream & operator << (const char * in) { *this += in; return *this; } } ; #endif // TIXML_STRING_INCLUDED #endif // TIXML_USE_STL desmume-0.9.9/src/utils/emufat.cpp0000644000175000017500000017364512140261631017652 0ustar guillaumeguillaume/* Copyright 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ //based on Arduino SdFat Library ( http://code.google.com/p/sdfatlib/ ) //Copyright (C) 2009 by William Greiman //based on mkdosfs - utility to create FAT/MS-DOS filesystems //Copyright (C) 1991 Linus Torvalds //Copyright (C) 1992-1993 Remy Card //Copyright (C) 1993-1994 David Hudson //Copyright (C) 1998 H. Peter Anvin //Copyright (C) 1998-2005 Roman Hodek #include "emufat.h" #include #include #include #include #define LE16(x) (x) #define LE32(x) (x) #define MAX_CLUST_12 ((1 << 12) - 16) #define MAX_CLUST_16 ((1 << 16) - 16) #define MIN_CLUST_32 65529 /* M$ says the high 4 bits of a FAT32 FAT entry are reserved and don't belong * to the cluster number. So the max. cluster# is based on 2^28 */ #define MAX_CLUST_32 ((1 << 28) - 16) #define FAT12_THRESHOLD 4085 #define MSDOS_EXT_SIGN 0x29 /* extended boot sector signature */ #define MSDOS_FAT12_SIGN "FAT12 " /* FAT12 filesystem signature */ #define MSDOS_FAT16_SIGN "FAT16 " /* FAT16 filesystem signature */ #define MSDOS_FAT32_SIGN "FAT32 " /* FAT32 filesystem signature */ static const int sector_size = 512; #define BLOCK_SIZE 512 #define HARD_SECTOR_SIZE 512 #define SECTORS_PER_BLOCK ( BLOCK_SIZE / HARD_SECTOR_SIZE ) #define FAT_EOF (0x0ffffff8) #define BOOT_SIGN 0xAA55 /* Boot sector magic number */ struct __PACKED fat32_fsinfo { u32 reserved1; /* Nothing as far as I can tell */ u32 signature; /* 0x61417272L */ u32 free_clusters; /* Free cluster count. -1 if unknown */ u32 next_cluster; /* Most recently allocated cluster. * Unused under Linux. */ u32 reserved2[4]; }; //see mkdosfs for the disassembly static const u8 mkdosfs_bootcode_fat32[420] = { 0x0E, 0x1F, 0xBE, 0x77, 0x7C, 0xAC, 0x22, 0xC0, 0x74, 0x0B, 0x56, 0xB4, 0x0E, 0xBB, 0x07, 0x00, 0xCD, 0x10, 0x5E, 0xEB, 0xF0, 0x32, 0xE4, 0xCD, 0x16, 0xCD, 0x19, 0xEB, 0xFE, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6F, 0x6F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x64, 0x69, 0x73, 0x6B, 0x2E, 0x20, 0x20, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6F, 0x6F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x66, 0x6C, 0x6F, 0x70, 0x70, 0x79, 0x20, 0x61, 0x6E, 0x64, 0x0D, 0x0A, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x72, 0x79, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6E, 0x20, 0x2E, 0x2E, 0x2E, 0x20, 0x0D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; EmuFat::EmuFat(const char* fname, bool readonly) : m_readonly(readonly) , m_owns(true) { m_pFile = new EMUFILE_FILE(fname,readonly?"rb":"rb+"); } EmuFat::EmuFat() : m_readonly(false) , m_owns(true) { m_pFile = new EMUFILE_MEMORY(); } EmuFat::EmuFat(EMUFILE* fileNotToDelete) : m_pFile(fileNotToDelete) , m_owns(false) , m_readonly(false) { } EmuFat::~EmuFat() { cacheFlush(); if(m_owns) delete m_pFile; } u8 EmuFat::cacheRawBlock(u32 blockNumber, u8 action) { if (cache_.cacheBlockNumber_ != blockNumber) { if (!cacheFlush()) return false; if (!readBlock(blockNumber, cache_.cacheBuffer_.data)) return false; cache_.cacheBlockNumber_ = blockNumber; } cache_.cacheDirty_ |= action; return true; } u8 EmuFat::cacheZeroBlock(u32 blockNumber) { if (!cacheFlush()) return false; // loop take less flash than memset(cacheBuffer_.data, 0, 512); for (u16 i = 0; i < 512; i++) { cache_.cacheBuffer_.data[i] = 0; } cache_.cacheBlockNumber_ = blockNumber; cacheSetDirty(); return true; } void EmuFat::cacheReset() { reconstruct(&cache_); } u8 EmuFat::cacheFlush() { if (cache_.cacheDirty_) { if (!writeBlock(cache_.cacheBlockNumber_, cache_.cacheBuffer_.data)) { return false; } // mirror FAT tables if (cache_.cacheMirrorBlock_) { if (!writeBlock(cache_.cacheMirrorBlock_, cache_.cacheBuffer_.data)) { return false; } cache_.cacheMirrorBlock_ = 0; } cache_.cacheDirty_ = 0; } return true; } u8 EmuFat::readBlock(u32 block, u8* dst) { m_pFile->fseek(block*512,SEEK_SET); m_pFile->fread(dst,512); if(m_pFile->fail()) { m_pFile->unfail(); return 0; } return 1; } u8 EmuFat::writeBlock(u32 blockNumber, const u8* src) { m_pFile->fseek(blockNumber*512,SEEK_SET); m_pFile->fwrite(src,512); if(m_pFile->fail()) { m_pFile->unfail(); return 0; } return 1; } u8 EmuFat::readData(u32 block, u16 offset, u16 count, u8* dst) { m_pFile->fseek(block*512+offset,SEEK_SET); m_pFile->fread(dst,count); if(m_pFile->fail()) { m_pFile->unfail(); return 0; } return 1; } void EmuFat::truncate(u32 size) { m_pFile->truncate(size); } //------------------------------------------------------------------------------------- inline int cdiv (int a, int b) { return (a + b - 1) / b; } bool calculateClusterSize(TFat32BootSector* bsp, u32 avail_sectors, u32& cluster_count, u32& fat_length, int size_fat_by_user, int &size_fat) { TFat32BootSector &bs = *bsp; const u32 fatdata = avail_sectors; int maxclustsize = bsp->sectorsPerCluster; u32 fatlength12, fatlength16, fatlength32; u32 maxclust12, maxclust16, maxclust32; u32 clust12, clust16, clust32; do { printf( "Trying with %d sectors/cluster:\n", bs.sectorsPerCluster ); /* The factor 2 below avoids cut-off errors for nr_fats == 1. * The "nr_fats*3" is for the reserved first two FAT entries */ clust12 = 2*((u64) fatdata *sector_size + bs.fatCount*3) / (2*(int) bs.sectorsPerCluster * sector_size + bs.fatCount*3); fatlength12 = cdiv (((clust12+2) * 3 + 1) >> 1, sector_size); /* Need to recalculate number of clusters, since the unused parts of the * FATS and data area together could make up space for an additional, * not really present cluster. */ clust12 = (fatdata - bs.fatCount*fatlength12)/bs.sectorsPerCluster; maxclust12 = (fatlength12 * 2 * sector_size) / 3; if (maxclust12 > MAX_CLUST_12) maxclust12 = MAX_CLUST_12; printf( "FAT12: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", clust12, fatlength12, maxclust12, MAX_CLUST_12 ); if (clust12 > maxclust12-2) { clust12 = 0; printf( "FAT12: too much clusters\n" ); } clust16 = ((u64) fatdata *sector_size + bs.fatCount*4) / ((int) bs.sectorsPerCluster * sector_size + bs.fatCount*2); fatlength16 = cdiv ((clust16+2) * 2, sector_size); /* Need to recalculate number of clusters, since the unused parts of the * FATS and data area together could make up space for an additional, * not really present cluster. */ clust16 = (fatdata - bs.fatCount*fatlength16)/bs.sectorsPerCluster; maxclust16 = (fatlength16 * sector_size) / 2; if (maxclust16 > MAX_CLUST_16) maxclust16 = MAX_CLUST_16; printf( "FAT16: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", clust16, fatlength16, maxclust16, MAX_CLUST_16 ); if (clust16 > maxclust16-2) { printf( "FAT16: too much clusters\n" ); clust16 = 0; } /* The < 4078 avoids that the filesystem will be misdetected as having a * 12 bit FAT. */ if (clust16 < FAT12_THRESHOLD && !(size_fat_by_user && size_fat == 16)) { printf( clust16 < FAT12_THRESHOLD ? "FAT16: would be misdetected as FAT12\n" : "FAT16: too much clusters\n" ); clust16 = 0; } clust32 = ((u64) fatdata *sector_size + bs.fatCount*8) / ((int) bs.sectorsPerCluster * sector_size + bs.fatCount*4); fatlength32 = cdiv ((clust32+2) * 4, sector_size); /* Need to recalculate number of clusters, since the unused parts of the * FATS and data area together could make up space for an additional, * not really present cluster. */ clust32 = (fatdata - bs.fatCount*fatlength32)/bs.sectorsPerCluster; maxclust32 = (fatlength32 * sector_size) / 4; if (maxclust32 > MAX_CLUST_32) maxclust32 = MAX_CLUST_32; if (clust32 && clust32 < MIN_CLUST_32 && !(size_fat_by_user && size_fat == 32)) { clust32 = 0; printf( "FAT32: not enough clusters (%d)\n", MIN_CLUST_32); } printf( "FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", clust32, fatlength32, maxclust32, MAX_CLUST_32 ); if (clust32 > maxclust32) { clust32 = 0; printf( "FAT32: too much clusters\n" ); } if ((clust12 && (size_fat == 0 || size_fat == 12)) || (clust16 && (size_fat == 0 || size_fat == 16)) || (clust32 && size_fat == 32)) break; bs.sectorsPerCluster <<= 1; } while (bs.sectorsPerCluster && bs.sectorsPerCluster <= maxclustsize); /* Use the optimal FAT size if not specified; * FAT32 is (not yet) choosen automatically */ if (!size_fat) { size_fat = (clust16 > clust12) ? 16 : 12; printf( "Choosing %d bits for FAT\n", size_fat ); } switch (size_fat) { case 12: cluster_count = clust12; fat_length = fatlength12; bs.sectorsPerFat16 = LE16(fatlength12); break; case 16: if (clust16 < FAT12_THRESHOLD) { if (size_fat_by_user) { printf("WARNING: Not enough clusters for a " "16 bit FAT! The filesystem will be\n" "misinterpreted as having a 12 bit FAT without " "mount option \"fat=16\".\n" ); return false; } else { printf("This filesystem has an unfortunate size. " "A 12 bit FAT cannot provide\n" "enough clusters, but a 16 bit FAT takes up a little " "bit more space so that\n" "the total number of clusters becomes less than the " "threshold value for\n" "distinction between 12 and 16 bit FATs.\n" ); return false; } } cluster_count = clust16; fat_length = fatlength16; bs.sectorsPerFat16 = LE16(fatlength16); break; case 32: if (clust32 < MIN_CLUST_32) printf("WARNING: Not enough clusters for a 32 bit FAT!\n"); cluster_count = clust32; fat_length = fatlength32; bs.sectorsPerFat16 = LE16(0); bs.fat32.sectorsPerFat32 = LE32(fatlength32); break; } return true; } static void mark_FAT_cluster (int size_fat, u8* fat, int cluster, unsigned int value) { switch( size_fat ) { case 12: value &= 0x0fff; if (((cluster * 3) & 0x1) == 0) { fat[3 * cluster / 2] = (unsigned char) (value & 0x00ff); fat[(3 * cluster / 2) + 1] = (unsigned char) ((fat[(3 * cluster / 2) + 1] & 0x00f0) | ((value & 0x0f00) >> 8)); } else { fat[3 * cluster / 2] = (unsigned char) ((fat[3 * cluster / 2] & 0x000f) | ((value & 0x000f) << 4)); fat[(3 * cluster / 2) + 1] = (unsigned char) ((value & 0x0ff0) >> 4); } break; case 16: value &= 0xffff; fat[2 * cluster] = (unsigned char) (value & 0x00ff); fat[(2 * cluster) + 1] = (unsigned char) (value >> 8); break; case 32: value &= 0xfffffff; fat[4 * cluster] = (unsigned char) (value & 0x000000ff); fat[(4 * cluster) + 1] = (unsigned char) ((value & 0x0000ff00) >> 8); fat[(4 * cluster) + 2] = (unsigned char) ((value & 0x00ff0000) >> 16); fat[(4 * cluster) + 3] = (unsigned char) ((value & 0xff000000) >> 24); break; } } //use 36M as minimum fat32 size (or else mkdosfs complains) //this function assumes fat32. it could be redone to be intelligent by making another pass through mkdosfs and analyzing it again //but we onnly targeted fat32 our first time through bool EmuFatVolume::formatNew(u32 sectors) { u32 volumeStartBlock = 0; TFat32BootSector bsrec; memset(&bsrec,0,sizeof(TFat32BootSector)); TFat32BootSector *bs = &bsrec; //perform same analysis (we guess) as mkdosfs //"fake values" bs->sectorsPerTrack = 32; bs->headCount = 64; //def_hd_params: bs->mediaType = 0xF8; bs->rootDirEntryCount = LE16(512); //Default to 512 entries - N.B. this is overwritten later static const u32 BLOCK_SIZE_BITS = 9; const u32 sz_mb = (sectors+(1<<(20-BLOCK_SIZE_BITS))-1) >> (20-BLOCK_SIZE_BITS); bs->sectorsPerCluster = sz_mb > 16*1024 ? 32 : sz_mb > 8*1024 ? 16 : sz_mb > 260 ? 8 : 1; //(fat16 and fat12 would start at 4 sectors per cluster) memcpy (bs->oemName, "mkdosfs", 8); bs->rootDirEntryCount = 0; //Under FAT32, the root dir is in a cluster chain, and this is signalled by bs.dir_entries being 0 bs->fat32.vi.volume_id = 0; //not generating a volume id.. just use 0 for determinism's sake memcpy(bs->fat32.vi.volume_label," ",11); bs->jmpToBootCode[0] = 0xEB; bs->jmpToBootCode[1] = 0x58; //this value is only for fat32 //Patch in the correct offset to the boot code bs->jmpToBootCode[2] = 0x90; memcpy(bs->fat32.boot_code,mkdosfs_bootcode_fat32,420); bs->boot_sign[0] = 0x55; bs->boot_sign[1] = 0xAA; bs->reservedSectorCount = LE16(32); bs->fatCount = 2; bs->hiddenSectors = LE32(0); u32 fatdata = sectors - cdiv (bs->rootDirEntryCount * 32, 512) - bs->reservedSectorCount; u32 cluster_count; u32 fat_length; int size_fat = 32; if(!calculateClusterSize(bs, fatdata, cluster_count, fat_length, 1, size_fat)) return false; //TODO - this function whacks values we set earlier. gross. either mkdosfs is sloppy or i dont understand it. //anyway, whack that dup code switch(size_fat) { case 12: memcpy(bs->oldfat.vi.fs_type, MSDOS_FAT12_SIGN, 8); break; case 16: memcpy(bs->oldfat.vi.fs_type, MSDOS_FAT16_SIGN, 8); break; case 32: memcpy(bs->fat32.vi.fs_type, MSDOS_FAT32_SIGN, 8); break; } bs->bytesPerSector = 512; //set up additional FAT32 fields bs->fat32.fat32Flags = LE16(0); bs->fat32.fat32Version = LE16(0); bs->fat32.fat32RootCluster = LE32(2); bs->fat32.fat32FSInfo = LE16(1); u32 backup_boot = (bs->reservedSectorCount>= 7) ? 6 : (bs->reservedSectorCount >= 2) ? bs->reservedSectorCount-1 : 0; printf( "Using sector %d as backup boot sector (0 = none)\n",backup_boot ); bs->fat32.fat32BackBootBlock = LE16(backup_boot); memset(bs->fat32.fat32Reserved,0,sizeof(bs->fat32.fat32Reserved)); if(sectors>= 65536) { bs->totalSectors16 = LE16(0); bs->totalSectors32 = LE32(sectors); } else { bs->totalSectors16 = LE16(sectors); bs->totalSectors32 = LE32(0); } if (!cluster_count) { //if (sectors_per_cluster) /* If yes, die if we'd spec'd sectors per cluster */ // die ("Too many clusters for file system - try more sectors per cluster"); //else printf("Attempting to create a too large file system"); return false; } u32 start_data_sector = (bs->reservedSectorCount + bs->fatCount * fat_length) * (sector_size/512); u32 start_data_block = (start_data_sector + SECTORS_PER_BLOCK - 1) / SECTORS_PER_BLOCK; if (sectors < start_data_block + 32) /* Arbitrary undersize file system! */ { printf("Too few blocks for viable file system"); return false; } bs->fat32.vi.ext_boot_sign = MSDOS_EXT_SIGN; //Make the file allocation tables! u8* fat = new u8[fat_length * sector_size]; memset( fat, 0, fat_length * sector_size ); mark_FAT_cluster (size_fat, fat, 0, 0xffffffff); /* Initial fat entries */ mark_FAT_cluster (size_fat, fat, 1, 0xffffffff); fat[0] = bs->mediaType; /* Put media type in first byte! */ if (size_fat == 32) { /* Mark cluster 2 as EOF (used for root dir) */ mark_FAT_cluster (size_fat, fat, 2, FAT_EOF); } u32 size_root_dir = (size_fat == 32) ? bs->sectorsPerCluster*sector_size : bs->rootDirEntryCount * sizeof (TDirectoryEntry); //u8* root_dir = new u8[size_root_dir]; //memset(root_dir, 0, size_root_dir); u32 size_root_dir_in_sectors = size_root_dir/512; u8* info_sector = NULL; if (size_fat == 32) { /* For FAT32, create an info sector */ fat32_fsinfo *info; info_sector = new u8[sector_size]; memset(info_sector, 0, sector_size); /* fsinfo structure is at offset 0x1e0 in info sector by observation */ info = (fat32_fsinfo *)(info_sector + 0x1e0); /* Info sector magic */ info_sector[0] = 'R'; info_sector[1] = 'R'; info_sector[2] = 'a'; info_sector[3] = 'A'; /* Magic for fsinfo structure */ info->signature = LE32(0x61417272); /* We've allocated cluster 2 for the root dir. */ info->free_clusters = LE32(cluster_count - 1); info->next_cluster = LE32(2); /* Info sector also must have boot sign */ *(u16 *)(info_sector + 0x1fe) = LE16(BOOT_SIGN); } //------------- //write_tables() u8* blank_sector = new u8[512]; memset(blank_sector,0,512); dev_->cacheReset(); dev_->truncate(0); dev_->truncate(sectors*512); /* clear all reserved sectors */ for(int i=0;ireservedSectorCount;i++) dev_->writeBlock(0,blank_sector); /* seek back to sector 0 and write the boot sector */ dev_->writeBlock(0,(const u8*)bs); /* on FAT32, write the info sector and backup boot sector */ if (size_fat == 32) { dev_->writeBlock(bs->fat32.fat32FSInfo,info_sector); if(bs->fat32.fat32BackBootBlock) dev_->writeBlock(bs->fat32.fat32BackBootBlock,(const u8*)bs); } /* seek to start of FATS and write them all */ int ctr=bs->reservedSectorCount; for (int i=0;ifatCount;i++) for(int j=0;jwriteBlock(ctr,fat+j*sector_size); /* Write the root directory directly after the last FAT. This is the root * dir area on FAT12/16, and the first cluster on FAT32. */ for(int i=0;iwriteBlock(ctr,blank_sector); delete[] blank_sector; delete[] info_sector; delete[] fat; return init(dev_,0); //return true; } //well, there are a lot of ways to format a disk. this is just a simple one. //it would be nice if someone who understood fat better could modify the root //directory setup to use reasonable code instead of magic arrays bool EmuFatVolume::format(u32 sectors) { //u32 volumeStartBlock = 0; //dev_->truncate(0); //dev_->truncate(sectors*512); //if (!dev_->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_WRITE)) return false; //memset(&dev_->cache_.cacheBuffer_,0,sizeof(dev_->cache_.cacheBuffer_)); //TFat32BootSector* bs = &dev_->cache_.cacheBuffer_.fbs; //TBiosParmBlock* bpb = &bs->bpb; //bs->jmpToBootCode[0] = 0xEB; //bs->jmpToBootCode[1] = 0x3C; //bs->jmpToBootCode[2] = 0x90; //memcpy(bs->oemName,"mkdosfs",8); //bs->driveNumber = 0; //bs->reserved1 = 0; //bs->bootSignature = 0x29; //bs->volumeSerialNumber = 0; //memcpy(bs->volumeLabel," ",11); //memcpy(bs->fileSystemType,"FAT16 ",8); //memcpy(bs->bootCode,mkdosfs_bootcode,420); //bs->bootSectorSig0 = 0x55; //bs->bootSectorSig1 = 0xAA; //bpb->bytesPerSector = 512; //bpb->sectorsPerCluster = 4; //bpb->reservedSectorCount = 1; //bpb->fatCount = 2; //bpb->rootDirEntryCount = 512; //bpb->totalSectors16 = 0; //bpb->mediaType = 0xF8; //bpb->sectorsPerFat16 = 32; //bpb->sectorsPerTrack = 32; //bpb->headCount = 64; //bpb->hiddenSectors = 0; //bpb->totalSectors32 = sectors; //bpb->fat32Flags = 0xbe0d; //bpb->fat32Version = 0x20Fd; //bpb->fat32RootCluster = 0x20202020; //bpb->fat32FSInfo = 0x2020; //bpb->fat32BackBootBlock = 0x2020; //if(!dev_->cacheFlush()) // return false; //if (!dev_->cacheRawBlock(1, EmuFat::CACHE_FOR_WRITE)) return false; //static const u8 rootEntry[8] = //{ // 0xF8, 0xFF, 0xFF, 0xFF, //} ; //memcpy(dev_->cache_.cacheBuffer_.data,rootEntry,4); //if(!dev_->cacheFlush()) // return false; //if (!dev_->cacheRawBlock(33, EmuFat::CACHE_FOR_WRITE)) return false; //memcpy(dev_->cache_.cacheBuffer_.data,rootEntry,4); //if(!dev_->cacheFlush()) // return false; //return init(dev_,0); return false; } bool EmuFatVolume::init(EmuFat* dev, u8 part) { u32 volumeStartBlock = 0; dev_ = dev; // if part == 0 assume super floppy with FAT boot sector in block zero // if part > 0 assume mbr volume with partition table if (part) { if (part > 4) return false; if (!dev->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_READ)) return false; TPartitionRecord* p = &dev->cache_.cacheBuffer_.mbr.part[part-1]; if ((p->boot & 0X7F) !=0 || p->totalSectors < 100 || p->firstSector == 0) { // not a valid partition return false; } volumeStartBlock = p->firstSector; } if (!dev->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_READ)) return false; TFat32BootSector* bs = &dev->cache_.cacheBuffer_.fbs; if (bs->bytesPerSector != 512 || bs->fatCount == 0 || bs->reservedSectorCount == 0 || bs->sectorsPerCluster == 0) { // not valid FAT volume return false; } fatCount_ = bs->fatCount; blocksPerCluster_ = bs->sectorsPerCluster; // determine shift that is same as multiply by blocksPerCluster_ clusterSizeShift_ = 0; while (blocksPerCluster_ != (1 << clusterSizeShift_)) { // error if not power of 2 if (clusterSizeShift_++ > 7) return false; } blocksPerFat_ = bs->sectorsPerFat16 ? bs->sectorsPerFat16 : bs->fat32.sectorsPerFat32; fatStartBlock_ = volumeStartBlock + bs->reservedSectorCount; // count for FAT16 zero for FAT32 rootDirEntryCount_ = bs->rootDirEntryCount; // directory start for FAT16 dataStart for FAT32 rootDirStart_ = fatStartBlock_ + bs->fatCount * blocksPerFat_; // data start for FAT16 and FAT32 dataStartBlock_ = rootDirStart_ + ((32 * bs->rootDirEntryCount + 511)/512); // total blocks for FAT16 or FAT32 u32 totalBlocks = bs->totalSectors16 ? bs->totalSectors16 : bs->totalSectors32; // total data blocks clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); // divide by cluster size to get cluster count clusterCount_ >>= clusterSizeShift_; // FAT type is determined by cluster count if (clusterCount_ < 4085) { fatType_ = 12; } else if (clusterCount_ < 65525) { fatType_ = 16; } else { rootDirStart_ = bs->fat32.fat32RootCluster; fatType_ = 32; } return true; } u8 EmuFatVolume::allocContiguous(u32 count, u32* curCluster) { // start of group u32 bgnCluster; // flag to save place to start next search u8 setStart; // set search start cluster if (*curCluster) { // try to make file contiguous bgnCluster = *curCluster + 1; // don't save new start location setStart = false; } else { // start at likely place for free cluster bgnCluster = allocSearchStart_; // save next search start if one cluster setStart = 1 == count; } // end of group u32 endCluster = bgnCluster; // last cluster of FAT u32 fatEnd = clusterCount_ + 1; // search the FAT for free clusters for (u32 n = 0;; n++, endCluster++) { // can't find space checked all clusters if (n >= clusterCount_) return false; // past end - start from beginning of FAT if (endCluster > fatEnd) { bgnCluster = endCluster = 2; } u32 f; if (!fatGet(endCluster, &f)) return false; if (f != 0) { // cluster in use try next cluster as bgnCluster bgnCluster = endCluster + 1; } else if ((endCluster - bgnCluster + 1) == count) { // done - found space break; } } // mark end of chain if (!fatPutEOC(endCluster)) return false; // link clusters while (endCluster > bgnCluster) { if (!fatPut(endCluster - 1, endCluster)) return false; endCluster--; } if (*curCluster != 0) { // connect chains if (!fatPut(*curCluster, bgnCluster)) return false; } // return first cluster number to caller *curCluster = bgnCluster; // remember possible next free cluster if (setStart) allocSearchStart_ = bgnCluster + 1; return true; } u8 EmuFatVolume::fatGet(u32 cluster, u32* value) const { if (cluster > (clusterCount_ + 1)) return false; u32 lba = fatStartBlock_; lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; if (lba != dev_->cache_.cacheBlockNumber_) { if (!dev_->cacheRawBlock(lba, EmuFat::CACHE_FOR_READ)) return false; } if (fatType_ == 16) { *value = dev_->cache_.cacheBuffer_.fat16[cluster & 0XFF]; } else { *value = dev_->cache_.cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; } return true; } // Store a FAT entry u8 EmuFatVolume::fatPut(u32 cluster, u32 value) { // error if reserved cluster if (cluster < 2) return false; // error if not in FAT if (cluster > (clusterCount_ + 1)) return false; // calculate block address for entry u32 lba = fatStartBlock_; lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; if (lba != dev_->cache_.cacheBlockNumber_) { if (!dev_->cacheRawBlock(lba, EmuFat::CACHE_FOR_READ)) return false; } // store entry if (fatType_ == 16) { dev_->cache_.cacheBuffer_.fat16[cluster & 0xFF] = value; } else { dev_->cache_.cacheBuffer_.fat32[cluster & 0x7F] = value; } dev_->cacheSetDirty(); // mirror second FAT if (fatCount_ > 1) dev_->cache_.cacheMirrorBlock_ = lba + blocksPerFat_; return true; } // return the size in bytes of a cluster chain u8 EmuFatVolume::chainSize(u32 cluster, u32* size) const { u32 s = 0; do { if (!fatGet(cluster, &cluster)) return false; s += 512UL << clusterSizeShift_; } while (!isEOC(cluster)); *size = s; return true; } // free a cluster chain u8 EmuFatVolume::freeChain(u32 cluster) { // clear free cluster location allocSearchStart_ = 2; do { u32 next; if (!fatGet(cluster, &next)) return false; // free cluster if (!fatPut(cluster, 0)) return false; cluster = next; } while (!isEOC(cluster)); return true; } u8 EmuFatVolume::readData(u32 block, u16 offset, u16 count, u8* dst) { return dev_->readData(block, offset, count, dst); } u8 EmuFatVolume::writeBlock(u32 block, const u8* dst) { return dev_->writeBlock(block, dst); } //----------------------------------------------------------------------------------- //EmuFatFile: // add a cluster to a file u8 EmuFatFile::addCluster() { if (!vol_->allocContiguous(1, &curCluster_)) return false; // if first cluster of file link to directory entry if (firstCluster_ == 0) { firstCluster_ = curCluster_; flags_ |= F_FILE_DIR_DIRTY; } return true; } // Add a cluster to a directory file and zero the cluster. // return with first block of cluster in the cache u8 EmuFatFile::addDirCluster(void) { if (!addCluster()) return false; // zero data in cluster insure first cluster is in cache u32 block = vol_->clusterStartBlock(curCluster_); for (u8 i = vol_->blocksPerCluster_; i != 0; i--) { if (!vol_->dev_->cacheZeroBlock(block + i - 1)) return false; } // Increase directory file size by cluster size fileSize_ += 512UL << vol_->clusterSizeShift_; return true; } // cache a file's directory entry // return pointer to cached entry or null for failure TDirectoryEntry* EmuFatFile::cacheDirEntry(u8 action) { if (!vol_->dev_->cacheRawBlock(dirBlock_, action)) return NULL; return vol_->dev_->cache_.cacheBuffer_.dir + dirIndex_; } /** * Close a file and force cached data and directory information * to be written to the storage device. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include no file is open or an I/O error. */ u8 EmuFatFile::close(void) { if (!sync())return false; type_ = FAT_FILE_TYPE_CLOSED; return true; } /** * Check for contiguous file and return its raw block range. * * \param[out] bgnBlock the first block address for the file. * \param[out] endBlock the last block address for the file. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include file is not contiguous, file has zero length * or an I/O error occurred. */ u8 EmuFatFile::contiguousRange(u32* bgnBlock, u32* endBlock) { // error if no blocks if (firstCluster_ == 0) return false; for (u32 c = firstCluster_; ; c++) { u32 next; if (!vol_->fatGet(c, &next)) return false; // check for contiguous if (next != (c + 1)) { // error if not end of chain if (!vol_->isEOC(next)) return false; *bgnBlock = vol_->clusterStartBlock(firstCluster_); *endBlock = vol_->clusterStartBlock(c) + vol_->blocksPerCluster_ - 1; return true; } } } //------------------------------------------------------------------------------ /** * Create and open a new contiguous file of a specified size. * * \note This function only supports short DOS 8.3 names. * See open() for more information. * * \param[in] dirFile The directory where the file will be created. * \param[in] fileName A valid DOS 8.3 file name. * \param[in] size The desired file size. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include \a fileName contains * an invalid DOS 8.3 file name, the FAT volume has not been initialized, * a file is already open, the file already exists, the root * directory is full or an I/O error. * */ u8 EmuFatFile::createContiguous(EmuFatFile* dirFile, const char* fileName, u32 size) { // don't allow zero length file if (size == 0) return false; if (!open(dirFile, fileName, EO_CREAT | EO_EXCL | EO_RDWR)) return false; // calculate number of clusters needed u32 count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1; // allocate clusters if (!vol_->allocContiguous(count, &firstCluster_)) { remove(); return false; } fileSize_ = size; // insure sync() will update dir entry flags_ |= F_FILE_DIR_DIRTY; return sync(); } /** * Return a files directory entry * * \param[out] dir Location for return of the files directory entry. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ u8 EmuFatFile::dirEntry(TDirectoryEntry* dir) { // make sure fields on SD are correct if (!sync()) return false; // read entry TDirectoryEntry* p = cacheDirEntry(EmuFat::CACHE_FOR_READ); if (!p) return false; // copy to caller's struct memcpy(dir, p, sizeof(TDirectoryEntry)); return true; } /** * Format the name field of \a dir into the 13 byte array * \a name in standard 8.3 short name format. * * \param[in] dir The directory structure containing the name. * \param[out] name A 13 byte char array for the formatted name. */ void EmuFatFile::dirName(const TDirectoryEntry& dir, char* name) { u8 j = 0; for (u8 i = 0; i < 11; i++) { if (dir.name[i] == ' ')continue; if (i == 8) name[j++] = '.'; name[j++] = dir.name[i]; } name[j] = 0; } // format directory name field from a 8.3 name string u8 EmuFatFile::make83Name(const char* str, u8* name) { u8 c; u8 n = 7; // max index for part before dot u8 i = 0; // blank fill name and extension while (i < 11) name[i++] = ' '; i = 0; while ((c = *str++) != '\0') { if (c == '.') { if (n == 10) return false; // only one dot allowed n = 10; // max index for full 8.3 name i = 8; // place for extension } else { // illegal FAT characters static const char* px = "\\/:*?\"<>"; const char* p = px; u8 b; while ((b = *p++)) if (b == c) return false; // check size and only allow ASCII printable characters if (i > n || c < 0X21 || c > 0X7E)return false; // only upper case allowed in 8.3 names - convert lower to upper name[i++] = c < 'a' || c > 'z' ? c : c + ('A' - 'a'); } } // must have a file name, extension is optional return name[0] != ' '; } /** Make a new directory. * * \param[in] dir An open SdFat instance for the directory that will containing * the new directory. * * \param[in] dirName A valid 8.3 DOS name for the new directory. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include this SdFile is already open, \a dir is not a * directory, \a dirName is invalid or already exists in \a dir. */ u8 EmuFatFile::makeDir(EmuFatFile* dir, const char* dirName) { TDirectoryEntry d; // create a normal file if (!open(dir, dirName, EO_CREAT | EO_EXCL | EO_RDWR)) return false; // convert SdFile to directory flags_ = EO_READ; type_ = FAT_FILE_TYPE_SUBDIR; // allocate and zero first cluster if (!addDirCluster())return false; // force entry to SD if (!sync()) return false; // cache entry - should already be in cache due to sync() call TDirectoryEntry* p = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!p) return false; // change directory entry attribute p->attributes = DIR_ATT_DIRECTORY; // make entry for '.' memcpy(&d, p, sizeof(d)); for (u8 i = 1; i < 11; i++) d.name[i] = ' '; d.name[0] = '.'; // cache block for '.' and '..' u32 block = vol_->clusterStartBlock(firstCluster_); if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_WRITE)) return false; // copy '.' to block memcpy(&vol_->dev_->cache_.cacheBuffer_.dir[0], &d, sizeof(d)); // make entry for '..' d.name[1] = '.'; if (dir->isRoot()) { d.firstClusterLow = 0; d.firstClusterHigh = 0; } else { d.firstClusterLow = dir->firstCluster_ & 0XFFFF; d.firstClusterHigh = dir->firstCluster_ >> 16; } // copy '..' to block memcpy(&vol_->dev_->cache_.cacheBuffer_.dir[1], &d, sizeof(d)); // set position after '..' curPosition_ = 2 * sizeof(d); // write first block return vol_->dev_->cacheFlush(); } /** * Open a file or directory by name. * * \param[in] dirFile An open SdFat instance for the directory containing the * file to be opened. * * \param[in] fileName A valid 8.3 DOS name for a file to be opened. * * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of flags from the following list * * O_READ - Open for reading. * * O_RDONLY - Same as O_READ. * * O_WRITE - Open for writing. * * O_WRONLY - Same as O_WRITE. * * O_RDWR - Open for reading and writing. * * O_APPEND - If set, the file offset shall be set to the end of the * file prior to each write. * * O_CREAT - If the file exists, this flag has no effect except as noted * under O_EXCL below. Otherwise, the file shall be created * * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. * * O_SYNC - Call sync() after each write. This flag should not be used with * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. * These functions do character at a time writes so sync() will be called * after each byte. * * O_TRUNC - If the file exists and is a regular file, and the file is * successfully opened and is not read only, its length shall be truncated to 0. * * \note Directory files must be opened read only. Write and truncation is * not allowed for directory files. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include this SdFile is already open, \a difFile is not * a directory, \a fileName is invalid, the file does not exist * or can't be opened in the access mode specified by oflag. */ u8 EmuFatFile::open(EmuFatFile* dirFile, const char* fileName, u8 oflag) { u8 dname[11]; TDirectoryEntry* p; // error if already open if (isOpen())return false; if (!make83Name(fileName, dname)) return false; vol_ = dirFile->vol_; dirFile->rewind(); // bool for empty entry found u8 emptyFound = false; // search for file while (dirFile->curPosition_ < dirFile->fileSize_) { u8 index = 0XF & (dirFile->curPosition_ >> 5); p = dirFile->readDirCache(); if (p == NULL) return false; if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { // remember first empty slot if (!emptyFound) { emptyFound = true; dirIndex_ = index; dirBlock_ = vol_->dev_->cache_.cacheBlockNumber_; } // done if no entries follow if (p->name[0] == DIR_NAME_FREE) break; } else if (!memcmp(dname, p->name, 11)) { // don't open existing file if O_CREAT and O_EXCL if ((oflag & (EO_CREAT | EO_EXCL)) == (EO_CREAT | EO_EXCL)) return false; // open found file return openCachedEntry(0XF & index, oflag); } } // only create file if O_CREAT and O_WRITE if ((oflag & (EO_CREAT | EO_WRITE)) != (EO_CREAT | EO_WRITE)) return false; // cache found slot or add cluster if end of file if (emptyFound) { p = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!p) return false; } else { if (dirFile->type_ == FAT_FILE_TYPE_ROOT16) return false; // add and zero cluster for dirFile - first cluster is in cache for write if (!dirFile->addDirCluster()) return false; // use first entry in cluster dirIndex_ = 0; p = vol_->dev_->cache_.cacheBuffer_.dir; } // initialize as empty file memset(p, 0, sizeof(TDirectoryEntry)); memcpy(p->name, dname, 11); // set timestamps if (dateTime_) { // call user function dateTime_(&p->creationDate, &p->creationTime); } else { // use default date/time p->creationDate = FAT_DEFAULT_DATE; p->creationTime = FAT_DEFAULT_TIME; } p->lastAccessDate = p->creationDate; p->lastWriteDate = p->creationDate; p->lastWriteTime = p->creationTime; // force write of entry to SD if (!vol_->dev_->cacheFlush()) return false; // open entry in cache return openCachedEntry(dirIndex_, oflag); } /** * Open a file by index. * * \param[in] dirFile An open SdFat instance for the directory. * * \param[in] index The \a index of the directory entry for the file to be * opened. The value for \a index is (directory file position)/32. * * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. * * See open() by fileName for definition of flags and return values. * */ u8 EmuFatFile::open(EmuFatFile* dirFile, u16 index, u8 oflag) { // error if already open if (isOpen())return false; // don't open existing file if O_CREAT and O_EXCL - user call error if ((oflag & (EO_CREAT | EO_EXCL)) == (EO_CREAT | EO_EXCL)) return false; vol_ = dirFile->vol_; // seek to location of entry if (!dirFile->seekSet(32 * index)) return false; // read entry into cache TDirectoryEntry* p = dirFile->readDirCache(); if (p == NULL) return false; // error if empty slot or '.' or '..' if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { return false; } // open cached entry return openCachedEntry(index & 0XF, oflag); } //------------------------------------------------------------------------------ // open a cached directory entry. Assumes vol_ is initializes u8 EmuFatFile::openCachedEntry(u8 dirIndex, u8 oflag) { // location of entry in cache TDirectoryEntry* p = vol_->dev_->cache_.cacheBuffer_.dir + dirIndex; // write or truncate is an error for a directory or read-only file if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { if (oflag & (EO_WRITE | EO_TRUNC)) return false; } // remember location of directory entry on SD dirIndex_ = dirIndex; dirBlock_ = vol_->dev_->cache_.cacheBlockNumber_; // copy first cluster number for directory fields firstCluster_ = (u32)p->firstClusterHigh << 16; firstCluster_ |= p->firstClusterLow; // make sure it is a normal file or subdirectory if (DIR_IS_FILE(p)) { fileSize_ = p->fileSize; type_ = FAT_FILE_TYPE_NORMAL; } else if (DIR_IS_SUBDIR(p)) { if (!vol_->chainSize(firstCluster_, &fileSize_)) return false; type_ = FAT_FILE_TYPE_SUBDIR; } else { return false; } // save open flags for read/write flags_ = oflag & (EO_ACCMODE | EO_SYNC | EO_APPEND); // set to start of file curCluster_ = 0; curPosition_ = 0; // truncate file to zero length if requested if (oflag & EO_TRUNC) return truncate(0); return true; } //------------------------------------------------------------------------------ /** * Open a volume's root directory. * * \param[in] vol The FAT volume containing the root directory to be opened. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the FAT volume has not been initialized * or it a FAT12 volume. */ u8 EmuFatFile::openRoot(EmuFatVolume* vol) { // error if file is already open if (isOpen()) return false; if (vol->fatType() == 16) { type_ = FAT_FILE_TYPE_ROOT16; firstCluster_ = 0; fileSize_ = 32 * vol->rootDirEntryCount(); } else if (vol->fatType() == 32) { type_ = FAT_FILE_TYPE_ROOT32; firstCluster_ = vol->rootDirStart(); if (!vol->chainSize(firstCluster_, &fileSize_)) return false; } else { // volume is not initialized or FAT12 return false; } vol_ = vol; // read only flags_ = EO_READ; // set to start of file curCluster_ = 0; curPosition_ = 0; // root has no directory entry dirBlock_ = 0; dirIndex_ = 0; return true; } //------------------------------------------------------------------------------ /** * Read data from a file starting at the current position. * * \param[out] buf Pointer to the location that will receive the data. * * \param[in] nbyte Maximum number of bytes to read. * * \return For success read() returns the number of bytes read. * A value less than \a nbyte, including zero, will be returned * if end of file is reached. * If an error occurs, read() returns -1. Possible errors include * read() called before a file has been opened, corrupt file system * or an I/O error occurred. */ s32 EmuFatFile::read(void* buf, u32 nbyte) { u8* dst = reinterpret_cast(buf); // error if not open or write only if (!isOpen() || !(flags_ & EO_READ)) return -1; // max bytes left in file if (nbyte > (fileSize_ - curPosition_)) nbyte = fileSize_ - curPosition_; // amount left to read u32 toRead = nbyte; while (toRead > 0) { u32 block; // raw device block number u16 offset = curPosition_ & 0x1FF; // offset in block if (type_ == FAT_FILE_TYPE_ROOT16) { block = vol_->rootDirStart() + (curPosition_ >> 9); } else { u8 blockOfCluster = vol_->blockOfCluster(curPosition_); if (offset == 0 && blockOfCluster == 0) { // start of new cluster if (curPosition_ == 0) { // use first cluster in file curCluster_ = firstCluster_; } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) return -1; } } block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; } u32 n = toRead; // amount to be read from current block if (n > (512UL - offset)) n = 512 - offset; // no buffering needed if n == 512 or user requests no buffering if ((unbufferedRead() || n == 512) && block != vol_->dev_->cache_.cacheBlockNumber_) { if (!vol_->readData(block, offset, n, dst)) return -1; dst += n; } else { // read block to cache and copy data to caller if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_READ)) return -1; u8* src = vol_->dev_->cache_.cacheBuffer_.data + offset; u8* end = src + n; while (src != end) *dst++ = *src++; } curPosition_ += n; toRead -= n; } return nbyte; } //------------------------------------------------------------------------------ /** * Read the next directory entry from a directory file. * * \param[out] dir The dir_t struct that will receive the data. * * \return For success readDir() returns the number of bytes read. * A value of zero will be returned if end of file is reached. * If an error occurs, readDir() returns -1. Possible errors include * readDir() called before a directory has been opened, this is not * a directory file or an I/O error occurred. */ s8 EmuFatFile::readDir(TDirectoryEntry* dir) { s16 n; // if not a directory file or miss-positioned return an error if (!isDir() || (0x1F & curPosition_)) return -1; while ((n = read(dir, sizeof(TDirectoryEntry))) == sizeof(TDirectoryEntry)) { // last entry if DIR_NAME_FREE if (dir->name[0] == DIR_NAME_FREE) break; // skip empty entries and entry for . and .. if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; // return if normal file or subdirectory if (DIR_IS_FILE_OR_SUBDIR(dir)) return (s8)n; } // error, end of file, or past last entry return n < 0 ? -1 : 0; } // Read next directory entry into the cache // Assumes file is correctly positioned TDirectoryEntry* EmuFatFile::readDirCache(void) { // error if not directory if (!isDir()) return NULL; // index of entry in cache u8 i = (curPosition_ >> 5) & 0XF; // use read to locate and cache block if (read() < 0) return NULL; // advance to next entry curPosition_ += 31; // return pointer to entry return (vol_->dev_->cache_.cacheBuffer_.dir + i); } //------------------------------------------------------------------------------ /** * Remove a file. * * The directory entry and all data for the file are deleted. * * \note This function should not be used to delete the 8.3 version of a * file that has a long name. For example if a file has the long name * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the file read-only, is a directory, * or an I/O error occurred. */ u8 EmuFatFile::remove(void) { // free any clusters - will fail if read-only or directory if (!truncate(0)) return false; // cache directory entry TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!d) return false; // mark entry deleted d->name[0] = DIR_NAME_DELETED; // set this SdFile closed type_ = FAT_FILE_TYPE_CLOSED; // write entry to SD return vol_->dev_->cacheFlush(); } //------------------------------------------------------------------------------ /** * Remove a file. * * The directory entry and all data for the file are deleted. * * \param[in] dirFile The directory that contains the file. * \param[in] fileName The name of the file to be removed. * * \note This function should not be used to delete the 8.3 version of a * file that has a long name. For example if a file has the long name * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the file is a directory, is read only, * \a dirFile is not a directory, \a fileName is not found * or an I/O error occurred. */ u8 EmuFatFile::remove(EmuFatFile* dirFile, const char* fileName) { EmuFatFile file; if (!file.open(dirFile, fileName, EO_WRITE)) return false; return file.remove(); } //------------------------------------------------------------------------------ /** Remove a directory file. * * The directory file will be removed only if it is empty and is not the * root directory. rmDir() follows DOS and Windows and ignores the * read-only attribute for the directory. * * \note This function should not be used to delete the 8.3 version of a * directory that has a long name. For example if a directory has the * long name "New folder" you should not delete the 8.3 name "NEWFOL~1". * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the file is not a directory, is the root * directory, is not empty, or an I/O error occurred. */ u8 EmuFatFile::rmDir(void) { // must be open subdirectory if (!isSubDir()) return false; rewind(); // make sure directory is empty while (curPosition_ < fileSize_) { TDirectoryEntry* p = readDirCache(); if (p == NULL) return false; // done if past last used entry if (p->name[0] == DIR_NAME_FREE) break; // skip empty slot or '.' or '..' if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; // error not empty if (DIR_IS_FILE_OR_SUBDIR(p)) return false; } // convert empty directory to normal file for remove type_ = FAT_FILE_TYPE_NORMAL; flags_ |= EO_WRITE; return remove(); } //------------------------------------------------------------------------------ /** Recursively delete a directory and all contained files. * * This is like the Unix/Linux 'rm -rf *' if called with the root directory * hence the name. * * Warning - This will remove all contents of the directory including * subdirectories. The directory will then be removed if it is not root. * The read-only attribute for files will be ignored. * * \note This function should not be used to delete the 8.3 version of * a directory that has a long name. See remove() and rmDir(). * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ u8 EmuFatFile::rmRfStar(void) { rewind(); while (curPosition_ < fileSize_) { EmuFatFile f; // remember position u16 index = curPosition_/32; TDirectoryEntry* p = readDirCache(); if (!p) return false; // done if past last entry if (p->name[0] == DIR_NAME_FREE) break; // skip empty slot or '.' or '..' if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; // skip if part of long file name or volume label in root if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; if (!f.open(this, index, EO_READ)) return false; if (f.isSubDir()) { // recursively delete return rmRfStar(); } else { // ignore read-only f.flags_ |= EO_WRITE; if (!f.remove()) return false; } // position to next entry if required if (curPosition_ != (32*(index + 1))) { if (!seekSet(32*(index + 1))) return false; } } // don't try to delete root if (isRoot()) return true; return rmDir(); } u8 EmuFatFile::seekSet(u32 pos) { // error if file not open or seek past end of file if (!isOpen() || pos > fileSize_) return false; if (type_ == FAT_FILE_TYPE_ROOT16) { curPosition_ = pos; return true; } if (pos == 0) { // set position to start of file curCluster_ = 0; curPosition_ = 0; return true; } // calculate cluster index for cur and new position u32 nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); u32 nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); if (nNew < nCur || curPosition_ == 0) { // must follow chain from first cluster curCluster_ = firstCluster_; } else { // advance from curPosition nNew -= nCur; } while (nNew--) { if (!vol_->fatGet(curCluster_, &curCluster_)) return false; } curPosition_ = pos; return true; } //------------------------------------------------------------------------------ /** * The sync() call causes all modified data and directory fields * to be written to the storage device. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include a call to sync() before a file has been * opened or an I/O error. */ u8 EmuFatFile::sync(void) { // only allow open files and directories if (!isOpen()) return false; if (flags_ & F_FILE_DIR_DIRTY) { TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!d) return false; // do not set filesize for dir files if (!isDir()) d->fileSize = fileSize_; // update first cluster fields d->firstClusterLow = firstCluster_ & 0XFFFF; d->firstClusterHigh = firstCluster_ >> 16; // set modify time if user supplied a callback date/time function if (dateTime_) { dateTime_(&d->lastWriteDate, &d->lastWriteTime); d->lastAccessDate = d->lastWriteDate; } // clear directory dirty flags_ &= ~F_FILE_DIR_DIRTY; } return vol_->dev_->cacheFlush(); } //------------------------------------------------------------------------------ /** * Set a file's timestamps in its directory entry. * * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive * OR of flags from the following list * * T_ACCESS - Set the file's last access date. * * T_CREATE - Set the file's creation date and time. * * T_WRITE - Set the file's last write/modification date and time. * * \param[in] year Valid range 1980 - 2107 inclusive. * * \param[in] month Valid range 1 - 12 inclusive. * * \param[in] day Valid range 1 - 31 inclusive. * * \param[in] hour Valid range 0 - 23 inclusive. * * \param[in] minute Valid range 0 - 59 inclusive. * * \param[in] second Valid range 0 - 59 inclusive * * \note It is possible to set an invalid date since there is no check for * the number of days in a month. * * \note * Modify and access timestamps may be overwritten if a date time callback * function has been set by dateTimeCallback(). * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ u8 EmuFatFile::timestamp(u8 flags, u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second) { if (!isOpen() || year < 1980 || year > 2107 || month < 1 || month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || second > 59) { return false; } TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE); if (!d) return false; u16 dirDate = FAT_DATE(year, month, day); u16 dirTime = FAT_TIME(hour, minute, second); if (flags & T_ACCESS) { d->lastAccessDate = dirDate; } if (flags & T_CREATE) { d->creationDate = dirDate; d->creationTime = dirTime; // seems to be units of 1/100 second not 1/10 as Microsoft states d->creationTimeTenths = second & 1 ? 100 : 0; } if (flags & T_WRITE) { d->lastWriteDate = dirDate; d->lastWriteTime = dirTime; } vol_->dev_->cacheSetDirty(); return sync(); } //------------------------------------------------------------------------------ /** * Truncate a file to a specified length. The current file position * will be maintained if it is less than or equal to \a length otherwise * it will be set to end of file. * * \param[in] length The desired length for the file. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include file is read only, file is a directory, * \a length is greater than the current file size or an I/O error occurs. */ u8 EmuFatFile::truncate(u32 length) { // error if not a normal file or read-only if (!isFile() || !(flags_ & EO_WRITE)) return false; // error if length is greater than current size if (length > fileSize_) return false; // fileSize and length are zero - nothing to do if (fileSize_ == 0) return true; // remember position for seek after truncation u32 newPos = curPosition_ > length ? length : curPosition_; // position to last cluster in truncated file if (!seekSet(length)) return false; if (length == 0) { // free all clusters if (!vol_->freeChain(firstCluster_)) return false; firstCluster_ = 0; } else { u32 toFree; if (!vol_->fatGet(curCluster_, &toFree)) return false; if (!vol_->isEOC(toFree)) { // free extra clusters if (!vol_->freeChain(toFree)) return false; // current cluster is end of chain if (!vol_->fatPutEOC(curCluster_)) return false; } } fileSize_ = length; // need to update directory entry flags_ |= F_FILE_DIR_DIRTY; if (!sync()) return false; // set file to correct position return seekSet(newPos); } /** * Write data to an open file. * * \note Data is moved to the cache but may not be written to the * storage device until sync() is called. * * \param[in] buf Pointer to the location of the data to be written. * * \param[in] nbyte Number of bytes to write. * * \return For success write() returns the number of bytes written, always * \a nbyte. If an error occurs, write() returns -1. Possible errors * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. * */ s32 EmuFatFile::write(const void* buf, u32 nbyte) { // convert void* to uint8_t* - must be before goto statements const u8* src = reinterpret_cast(buf); // number of bytes left to write - must be before goto statements u32 nToWrite = nbyte; // error if not a normal file or is read-only if (!isFile() || !(flags_ & EO_WRITE)) goto writeErrorReturn; // seek to end of file if append flag if ((flags_ & EO_APPEND) && curPosition_ != fileSize_) { if (!seekEnd()) goto writeErrorReturn; } while (nToWrite > 0) { u8 blockOfCluster = vol_->blockOfCluster(curPosition_); u16 blockOffset = curPosition_ & 0X1FF; if (blockOfCluster == 0 && blockOffset == 0) { // start of new cluster if (curCluster_ == 0) { if (firstCluster_ == 0) { // allocate first cluster of file if (!addCluster()) goto writeErrorReturn; } else { curCluster_ = firstCluster_; } } else { u32 next; if (!vol_->fatGet(curCluster_, &next)) return false; if (vol_->isEOC(next)) { // add cluster if at end of chain if (!addCluster()) goto writeErrorReturn; } else { curCluster_ = next; } } } // max space in block u32 n = 512 - blockOffset; // lesser of space and amount to write if (n > nToWrite) n = nToWrite; // block for data write u32 block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; if (n == 512) { // full block - don't need to use cache // invalidate cache if block is in cache if (vol_->dev_->cache_.cacheBlockNumber_ == block) { vol_->dev_->cache_.cacheBlockNumber_ = 0XFFFFFFFF; } if (!vol_->writeBlock(block, src)) goto writeErrorReturn; src += 512; } else { if (blockOffset == 0 && curPosition_ >= fileSize_) { // start of new block don't need to read into cache if (!vol_->dev_->cacheFlush()) goto writeErrorReturn; vol_->dev_->cache_.cacheBlockNumber_ = block; vol_->dev_->cacheSetDirty(); } else { // rewrite part of block if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_WRITE)) { goto writeErrorReturn; } } u8* dst = vol_->dev_->cache_.cacheBuffer_.data + blockOffset; u8* end = dst + n; while (dst != end) *dst++ = *src++; } nToWrite -= n; curPosition_ += n; } if (curPosition_ > fileSize_) { // update fileSize and insure sync will update dir entry fileSize_ = curPosition_; flags_ |= F_FILE_DIR_DIRTY; } else if (dateTime_ && nbyte) { // insure sync will update modified date and time flags_ |= F_FILE_DIR_DIRTY; } if (flags_ & EO_SYNC) { if (!sync()) goto writeErrorReturn; } return nbyte; writeErrorReturn: // return for write error writeError = true; return -1; } desmume-0.9.9/src/utils/md5.h0000644000175000017500000000073612140261631016511 0ustar guillaumeguillaume#ifndef _MD5_H #define _MD5_H #include "../types.h" #include "valuearray.h" struct md5_context { u32 total[2]; u32 state[4]; u8 buffer[64]; }; typedef ValueArray MD5DATA; void md5_starts( struct md5_context *ctx ); void md5_update( struct md5_context *ctx, u8 *input, u32 length ); void md5_finish( struct md5_context *ctx, u8 digest[16] ); /* Uses a static buffer, so beware of how it's used. */ char *md5_asciistr(MD5DATA& md5); #endif /* md5.h */ desmume-0.9.9/src/utils/xstring.h0000644000175000017500000000725212140261631017522 0ustar guillaumeguillaume//taken from fceux on 27-oct-2008 //subsequently modified for desmume /* Copyright (C) 2008-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _STRINGUTIL_H_ #define _STRINGUTIL_H_ #include #include #include #include #include #include #include "../types.h" #include "../emufile.h" //definitions for str_strip() flags #define STRIP_SP 0x01 // space #define STRIP_TAB 0x02 // tab #define STRIP_CR 0x04 // carriage return #define STRIP_LF 0x08 // line feed int str_ucase(char *str); int str_lcase(char *str); int str_ltrim(char *str, int flags); int str_rtrim(char *str, int flags); int str_strip(char *str, int flags); int chr_replace(char *str, char search, char replace); int str_replace(char *str, char *search, char *replace); std::string strsub(const std::string& str, int pos, int len); std::string strmid(const std::string& str, int pos, int len); std::string strleft(const std::string& str, int len); std::string strright(const std::string& str, int len); std::string toupper(const std::string& str); int HexStringToBytesLength(const std::string& str); int Base64StringToBytesLength(const std::string& str); std::string u32ToHexString(u32 val); std::string BytesToString(const void* data, int len); bool StringToBytes(const std::string& str, void* data, int len); std::vector tokenize_str(const std::string & str,const std::string & delims); void splitpath(const char* path, char* drv, char* dir, char* name, char* ext); uint16 FastStrToU16(char* s, bool& valid); char *U16ToDecStr(uint16 a); char *U32ToDecStr(uint32 a); char *U32ToDecStr(char* buf, uint32 a); char *U8ToDecStr(uint8 a); char *U8ToHexStr(uint8 a); char *U16ToHexStr(uint16 a); std::string stditoa(int n); std::string readNullTerminatedAscii(std::istream* is); //extracts a decimal uint from an istream template T templateIntegerDecFromIstream(EMUFILE* is) { unsigned int ret = 0; bool pre = true; for(;;) { int c = is->fgetc(); if(c == -1) return ret; int d = c - '0'; if((d<0 || d>9)) { if(!pre) break; } else { pre = false; ret *= 10; ret += d; } } is->unget(); return ret; } inline u32 u32DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream(is); } inline u64 u64DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream(is); } //puts an optionally 0-padded decimal integer of type T into the ostream (0-padding is quicker) template void putdec(EMUFILE* os, T dec) { char temp[DIGITS]; int ctr = 0; for(int i=0;ifwrite(temp+DIGITS-ctr-1,ctr+1); else os->fwrite(temp,DIGITS); } std::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement); std::wstring mbstowcs(std::string str); std::string wcstombs(std::wstring str); //TODO - dont we already have another function that can do this std::string getExtension(const char* input); #endif desmume-0.9.9/src/utils/valuearray.h0000644000175000017500000000205012140261631020166 0ustar guillaumeguillaume/* Copyright (C) 2008 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _VALUEARRAY_H_ #define _VALUEARRAY_H_ template struct ValueArray { T data[N]; T &operator[](int index) { return data[index]; } static const int size = N; bool operator!=(ValueArray &other) { return !operator==(other); } bool operator==(ValueArray &other) { for(int i=0;i. */ #include "xstring.h" #include //a vc-style substring operation (very kind and lenient) std::string strsub(const std::string& str, int pos, int len) { int strlen = str.size(); if(strlen==0) return str; //empty strings always return empty strings if(pos>=strlen) return str; //if you start past the end of the string, return the entire string. this is unusual, but there you have it //clipping if(pos<0) { len += pos; pos = 0; } if (pos+len>=strlen) len=strlen-pos+1; //return str.str().substr(pos,len); return str.substr(pos,len); } std::string strmid(const std::string& str, int pos, int len) { return strsub(str,pos,len); } std::string strleft(const std::string& str, int len) { return strsub(str,0,len); } std::string strright(const std::string& str, int len) { return len ? strsub(str,str.size()-len,len) : ""; } std::string toupper(const std::string& str) { std::string ret = str; for(u32 i=0;i= 'a') && (str[i] <= 'z')) { str[i] &= ~0x20; j++; } i++; } return j; } ///Lower case routine. Returns number of characters modified int str_lcase(char *str) { u32 i=0,j=0; while (i < strlen(str)) { if ((str[i] >= 'A') && (str[i] <= 'Z')) { str[i] |= 0x20; j++; } i++; } return j; } ///White space-trimming routine ///Removes whitespace from left side of string, depending on the flags set (See STRIP_x definitions in xstring.h) ///Returns number of characters removed int str_ltrim(char *str, int flags) { u32 i=0; while (str[0]) { if ((str[0] != ' ') || (str[0] != '\t') || (str[0] != '\r') || (str[0] != '\n')) break; if ((flags & STRIP_SP) && (str[0] == ' ')) { i++; strcpy(str,str+1); } if ((flags & STRIP_TAB) && (str[0] == '\t')) { i++; strcpy(str,str+1); } if ((flags & STRIP_CR) && (str[0] == '\r')) { i++; strcpy(str,str+1); } if ((flags & STRIP_LF) && (str[0] == '\n')) { i++; strcpy(str,str+1); } } return i; } ///White space-trimming routine ///Removes whitespace from right side of string, depending on the flags set (See STRIP_x definitions in xstring.h) ///Returns number of characters removed int str_rtrim(char *str, int flags) { u32 i=0; while (strlen(str)) { if ((str[strlen(str)-1] != ' ') || (str[strlen(str)-1] != '\t') || (str[strlen(str)-1] != '\r') || (str[strlen(str)-1] != '\n')) break; if ((flags & STRIP_SP) && (str[0] == ' ')) { i++; str[strlen(str)-1] = 0; } if ((flags & STRIP_TAB) && (str[0] == '\t')) { i++; str[strlen(str)-1] = 0; } if ((flags & STRIP_CR) && (str[0] == '\r')) { i++; str[strlen(str)-1] = 0; } if ((flags & STRIP_LF) && (str[0] == '\n')) { i++; str[strlen(str)-1] = 0; } } return i; } ///White space-stripping routine ///Removes whitespace depending on the flags set (See STRIP_x definitions in xstring.h) ///Returns number of characters removed, or -1 on error int str_strip(char *str, int flags) { u32 i=0,j=0; char *astr,chr; if (!strlen(str)) return -1; if (!(flags & (STRIP_SP|STRIP_TAB|STRIP_CR|STRIP_LF))) return -1; if (!(astr = (char*)malloc(strlen(str)+1))) return -1; while (i < strlen(str)) { chr = str[i++]; if ((flags & STRIP_SP) && (chr == ' ')) chr = 0; if ((flags & STRIP_TAB) && (chr == '\t')) chr = 0; if ((flags & STRIP_CR) && (chr == '\r')) chr = 0; if ((flags & STRIP_LF) && (chr == '\n')) chr = 0; if (chr) astr[j++] = chr; } astr[j] = 0; strcpy(str,astr); free(astr); return j; } ///Character replacement routine ///Replaces all instances of 'search' with 'replace' ///Returns number of characters modified int chr_replace(char *str, char search, char replace) { u32 i=0,j=0; while (i < strlen(str)) { if (str[i] == search) { str[i] = replace; j++; } i++; } return j; } ///Sub-String replacement routine ///Replaces all instances of 'search' with 'replace' ///Returns number of sub-strings modified, or -1 on error int str_replace(char *str, char *search, char *replace) { u32 i=0,j=0; int searchlen,replacelen; char *astr; searchlen = strlen(search); replacelen = strlen(replace); if ((!strlen(str)) || (!searchlen)) return -1; //note: allow *replace to have a length of zero! if (!(astr = (char*)malloc(strlen(str)+1))) return -1; while (i < strlen(str)) { if (!strncmp(str+i,search,searchlen)) { if (replacelen) memcpy(astr+j,replace,replacelen); i += searchlen; j += replacelen; } else astr[j++] = str[i++]; } astr[j] = 0; strcpy(str,astr); free(astr); return j; } static const struct Base64Table { Base64Table() { size_t a=0; for(a=0; a<256; ++a) data[a] = 0xFF; // mark everything as invalid by default // create value->ascii mapping a=0; for(unsigned char c='A'; c<='Z'; ++c) data[a++] = c; // 0..25 for(unsigned char c='a'; c<='z'; ++c) data[a++] = c; // 26..51 for(unsigned char c='0'; c<='9'; ++c) data[a++] = c; // 52..61 data[62] = '+'; // 62 data[63] = '/'; // 63 // create ascii->value mapping (but due to overlap, write it to highbit region) for(a=0; a<64; ++a) data[data[a]^0x80] = a; // data[((unsigned char)'=') ^ 0x80] = 0; } unsigned char operator[] (size_t pos) const { return data[pos]; } private: unsigned char data[256]; } Base64Table; std::string u32ToHexString(u32 val) { char temp[16]; sprintf(temp,"%08X",val); return temp; } ///Converts the provided data to a string in a standard, user-friendly, round-trippable format std::string BytesToString(const void* data, int len) { char temp[16]; if(len==1) { sprintf(temp,"%d",*(const unsigned char*)data); return temp; } else if(len==2) { sprintf(temp,"%d",*(const unsigned short*)data); return temp; } else if(len==4) { sprintf(temp,"%d",*(const unsigned int*)data); return temp; } std::string ret; if(1) // use base64 { const unsigned char* src = (const unsigned char*)data; ret = "base64:"; for(int n; len > 0; len -= n) { unsigned char input[3] = {0,0,0}; for(n=0; n<3 && n> 2 ], Base64Table[ ((input[0] & 0x03) << 4) | (input[1] >> 4) ], n<2 ? '=' : Base64Table[ ((input[1] & 0x0F) << 2) | (input[2] >> 6) ], n<3 ? '=' : Base64Table[ input[2] & 0x3F ] }; ret.append(output, output+4); } } else // use hex { ret.resize(len*2+2); ret[0] = '0'; ret[1] = 'x'; for(int i=0;i>4); int b = (((const unsigned char*)data)[i])&15; if(a>9) a += 'A'-10; else a += '0'; if(b>9) b += 'A'-10; else b += '0'; ret[2+i*2] = a; ret[2+i*2+1] = b; } } return ret; } ///returns -1 if this is not a hex string int HexStringToBytesLength(const std::string& str) { if(str.size()>2 && str[0] == '0' && toupper(str[1]) == 'X') return str.size()/2-1; else return -1; } int Base64StringToBytesLength(const std::string& str) { if(str.size() < 7 || (str.size()-7) % 4 || str.substr(0,7) != "base64:") return -1; size_t c = ((str.size() - 7) / 4) * 3; if(str[str.size()-1] == '=') { --c; if(str[str.size()-2] == '=') --c; } return c; } ///parses a string in the same format as BytesToString ///returns true if success. bool StringToBytes(const std::string& str, void* data, int len) { if(str.substr(0,7) == "base64:") { // base64 unsigned char* tgt = (unsigned char*)data; for(size_t pos = 7; pos < str.size() && len > 0; ) { unsigned char input[4], converted[4]; for(int i=0; i<4; ++i) { if(pos >= str.size() && i > 0) return false; // invalid data input[i] = str[pos++]; if(input[i] & 0x80) return false; // illegal character converted[i] = Base64Table[input[i]^0x80]; if(converted[i] & 0x80) return false; // illegal character } unsigned char outpacket[3] = { (converted[0] << 2) | (converted[1] >> 4), (converted[1] << 4) | (converted[2] >> 2), (converted[2] << 6) | (converted[3]) }; int outlen = (input[2] == '=') ? 1 : (input[3] == '=' ? 2 : 3); if(outlen > len) outlen = len; memcpy(tgt, outpacket, outlen); tgt += outlen; len -= outlen; } return true; } if(str.size()>2 && str[0] == '0' && toupper(str[1]) == 'X') { // hex int amt = len; int bytesAvailable = str.size()/2; if(bytesAvailable < amt) amt = bytesAvailable; const char* cstr = str.c_str()+2; for(int i=0;i='A') a=a-'A'+10; else a-='0'; if(b>='A') b=b-'A'+10; else b-='0'; unsigned char val = ((unsigned char)a<<4)|(unsigned char)b; ((unsigned char*)data)[i] = val; } return true; } if(len==1) { int x = atoi(str.c_str()); *(unsigned char*)data = x; return true; } else if(len==2) { int x = atoi(str.c_str()); *(unsigned short*)data = x; return true; } else if(len==4) { int x = atoi(str.c_str()); *(unsigned int*)data = x; return true; } //we can't handle it return false; } #include #include /// \brief convert input string into vector of string tokens /// /// \note consecutive delimiters will be treated as single delimiter /// \note delimiters are _not_ included in return data /// /// \param input string to be parsed /// \param delims list of delimiters. std::vector tokenize_str(const std::string & str, const std::string & delims=", \t") { using namespace std; // Skip delims at beginning, find start of first token string::size_type lastPos = str.find_first_not_of(delims, 0); // Find next delimiter @ end of token string::size_type pos = str.find_first_of(delims, lastPos); // output vector vector tokens; while (string::npos != pos || string::npos != lastPos) { // Found a token, add it to the vector. tokens.push_back(str.substr(lastPos, pos - lastPos)); // Skip delims. Note the "not_of". this is beginning of token lastPos = str.find_first_not_of(delims, pos); // Find next delimiter at end of token. pos = str.find_first_of(delims, lastPos); } return tokens; } //this code was taken from WINE (LGPL) //http://google.com/codesearch?hl=en&q=+lang:c+splitpath+show:CPvw9Z-euls:_RSotQzmLeU:KGzljMEYFbY&sa=N&cd=9&ct=rc&cs_p=http://gentoo.osuosl.org/distfiles/Wine-20050524.tar.gz&cs_f=wine-20050524/programs/winefile/splitpath.c void splitpath(const char* path, char* drv, char* dir, char* name, char* ext) { const char* end; /* end of processed string */ const char* p; /* search pointer */ const char* s; /* copy pointer */ /* extract drive name */ if (path[0] && path[1]==':') { if (drv) { *drv++ = *path++; *drv++ = *path++; *drv = '\0'; } else path+=2; } else if (drv) *drv = '\0'; /* search for end of string or stream separator */ for(end=path; *end && *end!=':'; ) end++; /* search for begin of file extension */ for(p=end; p>path && *--p!='\\' && *p!='/'; ) if (*p == '.') { end = p; break; } if (ext) for(s=end; (*ext=*s++); ) ext++; else for(s=end; *s++; ) {} /* search for end of directory name */ for(p=end; p>path; ) if (*--p=='\\' || *p=='/') { p++; break; } if (name) { for(s=p; s= '0' && s[i] <= '9') { v+=s[i]-'0'; } else if(s[i] >= 'a' && s[i] <= 'f') { v+=s[i]-'a'+10; } else if(s[i] >= 'A' && s[i] <= 'F') { v+=s[i]-'A'+10; } else { valid = false; return 0xFFFF; } } valid = true; return v; } char *U8ToDecStr(uint8 a) { TempArray[0] = '0' + a/100; TempArray[1] = '0' + (a%100)/10; TempArray[2] = '0' + (a%10); TempArray[3] = 0; return TempArray; } char *U16ToDecStr(uint16 a) { TempArray[0] = '0' + a/10000; TempArray[1] = '0' + (a%10000)/1000; TempArray[2] = '0' + (a%1000)/100; TempArray[3] = '0' + (a%100)/10; TempArray[4] = '0' + (a%10); TempArray[5] = 0; return TempArray; } char *U32ToDecStr(char* buf, uint32 a) { buf[0] = '0' + a/1000000000; buf[1] = '0' + (a%1000000000)/100000000; buf[2] = '0' + (a%100000000)/10000000; buf[3] = '0' + (a%10000000)/1000000; buf[4] = '0' + (a%1000000)/100000; buf[5] = '0' + (a%100000)/10000; buf[6] = '0' + (a%10000)/1000; buf[7] = '0' + (a%1000)/100; buf[8] = '0' + (a%100)/10; buf[9] = '0' + (a%10); buf[10] = 0; return buf; } char *U32ToDecStr(uint32 a) { return U32ToDecStr(TempArray,a); } char *U16ToHexStr(uint16 a) { TempArray[0] = a/4096 > 9?'A'+a/4096-10:'0' + a/4096; TempArray[1] = (a%4096)/256 > 9?'A'+(a%4096)/256 - 10:'0' + (a%4096)/256; TempArray[2] = (a%256)/16 > 9?'A'+(a%256)/16 - 10:'0' + (a%256)/16; TempArray[3] = a%16 > 9?'A'+(a%16) - 10:'0' + (a%16); TempArray[4] = 0; return TempArray; } char *U8ToHexStr(uint8 a) { TempArray[0] = a/16 > 9?'A'+a/16 - 10:'0' + a/16; TempArray[1] = a%16 > 9?'A'+(a%16) - 10:'0' + (a%16); TempArray[2] = 0; return TempArray; } std::string stditoa(int n) { char tempbuf[16]; sprintf(tempbuf, "%d", n); return tempbuf; } std::string readNullTerminatedAscii(std::istream* is) { std::string ret; ret.reserve(50); for(;;) { int c = is->get(); if(c == 0) break; else ret += (char)c; } return ret; } // replace all instances of victim with replacement std::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement) { std::string answer = source; std::string::size_type j = 0; while ((j = answer.find(victim, j)) != std::string::npos ) { answer.replace(j, victim.length(), replacement); j+= replacement.length(); } return answer; } //http://www.codeproject.com/KB/string/UtfConverter.aspx #include "ConvertUTF.h" namespace UtfConverter { static std::wstring FromUtf8(const std::string& utf8string) { size_t widesize = utf8string.length(); if (sizeof(wchar_t) == 2) { wchar_t* widestringnative = new wchar_t[widesize+1]; const UTF8* sourcestart = reinterpret_cast(utf8string.c_str()); const UTF8* sourceend = sourcestart + widesize; UTF16* targetstart = reinterpret_cast(widestringnative); UTF16* targetend = targetstart + widesize+1; ConversionResult res = ConvertUTF8toUTF16(&sourcestart, sourceend, &targetstart, targetend, strictConversion); if (res != conversionOK) { delete [] widestringnative; throw std::exception(); } *targetstart = 0; std::wstring resultstring(widestringnative); delete [] widestringnative; return resultstring; } else if (sizeof(wchar_t) == 4) { wchar_t* widestringnative = new wchar_t[widesize+1]; const UTF8* sourcestart = reinterpret_cast(utf8string.c_str()); const UTF8* sourceend = sourcestart + widesize; UTF32* targetstart = reinterpret_cast(widestringnative); UTF32* targetend = targetstart + widesize+1; ConversionResult res = ConvertUTF8toUTF32(&sourcestart, sourceend, &targetstart, targetend, strictConversion); if (res != conversionOK) { delete [] widestringnative; throw std::exception(); } *targetstart = 0; std::wstring resultstring(widestringnative); delete [] widestringnative; return resultstring; } else { throw std::exception(); } return L""; } static std::string ToUtf8(const std::wstring& widestring) { size_t widesize = widestring.length(); if (sizeof(wchar_t) == 2) { size_t utf8size = 3 * widesize + 1; char* utf8stringnative = new char[utf8size]; const UTF16* sourcestart = reinterpret_cast(widestring.c_str()); const UTF16* sourceend = sourcestart + widesize; UTF8* targetstart = reinterpret_cast(utf8stringnative); UTF8* targetend = targetstart + utf8size; ConversionResult res = ConvertUTF16toUTF8(&sourcestart, sourceend, &targetstart, targetend, strictConversion); if (res != conversionOK) { delete [] utf8stringnative; throw std::exception(); } *targetstart = 0; std::string resultstring(utf8stringnative); delete [] utf8stringnative; return resultstring; } else if (sizeof(wchar_t) == 4) { size_t utf8size = 4 * widesize + 1; char* utf8stringnative = new char[utf8size]; const UTF32* sourcestart = reinterpret_cast(widestring.c_str()); const UTF32* sourceend = sourcestart + widesize; UTF8* targetstart = reinterpret_cast(utf8stringnative); UTF8* targetend = targetstart + utf8size; ConversionResult res = ConvertUTF32toUTF8(&sourcestart, sourceend, &targetstart, targetend, strictConversion); if (res != conversionOK) { delete [] utf8stringnative; throw std::exception(); } *targetstart = 0; std::string resultstring(utf8stringnative); delete [] utf8stringnative; return resultstring; } else { throw std::exception(); } return ""; } } //convert a std::string to std::wstring std::wstring mbstowcs(std::string str) { try { return UtfConverter::FromUtf8(str); } catch(std::exception) { return L"(failed UTF-8 conversion)"; } } std::string wcstombs(std::wstring str) { return UtfConverter::ToUtf8(str); } //TODO - dont we already have another function that can do this std::string getExtension(const char* input) { char buf[1024]; strcpy(buf,input); char* dot=strrchr(buf,'.'); if(!dot) return ""; char ext [512]; strcpy(ext, dot+1); int k, extlen=strlen(ext); for(k=0;k. */ #ifndef _VFAT_H class EMUFILE; //THIS CLASS IS NOT THREAD SAFE!! SORRY SO SLOPPY class VFAT { public: VFAT(); ~VFAT(); bool build(const char* path, int extra_MB=0); EMUFILE* detach(); private: EMUFILE* file; }; #endif //_VFAT_H desmume-0.9.9/src/utils/datetime.cpp0000644000175000017500000000052712140261631020151 0ustar guillaumeguillaume#include "datetime.h" const char* DateTime::monthnames[] = { NULL, "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; const int DateTime::daysmonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; const int DateTime::daysmonthleap[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; desmume-0.9.9/src/NDSSystem.cpp0000644000175000017500000025205012140261633017050 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include #include #include #include "common.h" #include "NDSSystem.h" #include "render3D.h" #include "MMU.h" #include "ROMReader.h" #include "gfx3d.h" #include "utils/decrypt/decrypt.h" #include "utils/decrypt/crc.h" #include "cp15.h" #include "bios.h" #include "debug.h" #include "cheatSystem.h" #include "movie.h" #include "Disassembler.h" #include "readwrite.h" #include "debug.h" #include "firmware.h" #include "version.h" #include "slot1.h" #include "path.h" //int xxctr=0; //#define LOG_ARM9 //#define LOG_ARM7 //#define dolog (currFrameCounter>15) //bool dolog=true; //#define LOG_TO_FILE //#define LOG_TO_FILE_REGS //=============================================================== FILE *fp_dis7 = NULL; FILE *fp_dis9 = NULL; PathInfo path; TCommonSettings CommonSettings; static BaseDriver _stub_driver; BaseDriver* driver = &_stub_driver; std::string InputDisplayString; static BOOL LidClosed = FALSE; static u8 countLid = 0; GameInfo gameInfo; NDSSystem nds; CFIRMWARE *firmware = NULL; ADVANsCEne advsc; using std::min; using std::max; bool singleStep; bool nds_debug_continuing[2]; int lagframecounter; int LagFrameFlag; int lastLag; int TotalLagFrames; TSCalInfo TSCal; namespace DLDI { bool tryPatch(void* data, size_t size); } void Desmume_InitOnce() { static bool initOnce = false; if(initOnce) return; initOnce = true; #ifdef HAVE_LIBAGG extern void Agg_init(); //no need to include just for this Agg_init(); #endif } #ifdef GDB_STUB int NDS_Init( struct armcpu_memory_iface *arm9_mem_if, struct armcpu_ctrl_iface **arm9_ctrl_iface, struct armcpu_memory_iface *arm7_mem_if, struct armcpu_ctrl_iface **arm7_ctrl_iface) #else int NDS_Init( void) #endif { nds.idleFrameCounter = 0; memset(nds.runCycleCollector,0,sizeof(nds.runCycleCollector)); MMU_Init(); nds.VCount = 0; //got to print this somewhere.. printf("%s\n", EMU_DESMUME_NAME_AND_VERSION()); if (Screen_Init() != 0) return -1; gfx3d_init(); #ifdef GDB_STUB armcpu_new(&NDS_ARM7,1, arm7_mem_if, arm7_ctrl_iface); armcpu_new(&NDS_ARM9,0, arm9_mem_if, arm9_ctrl_iface); #else armcpu_new(&NDS_ARM7,1); armcpu_new(&NDS_ARM9,0); #endif if (SPU_Init(SNDCORE_DUMMY, 740) != 0) return -1; WIFI_Init() ; // Init calibration info TSCal.adc.x1 = 0x0200; TSCal.adc.y1 = 0x0200; TSCal.scr.x1 = 0x20 + 1; // calibration screen coords are 1-based, TSCal.scr.y1 = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong. TSCal.adc.x2 = 0x0E00; TSCal.adc.y2 = 0x0800; TSCal.scr.x2 = 0xE0 + 1; TSCal.scr.y2 = 0x80 + 1; TSCal.adc.width = (TSCal.adc.x2 - TSCal.adc.x1); TSCal.adc.height = (TSCal.adc.y2 - TSCal.adc.y1); TSCal.scr.width = (TSCal.scr.x2 - TSCal.scr.x1); TSCal.scr.height = (TSCal.scr.y2 - TSCal.scr.y1); cheats = new CHEATS(); cheatSearch = new CHEATSEARCH(); return 0; } void NDS_DeInit(void) { if(MMU.CART_ROM != MMU.UNUSED_RAM) NDS_FreeROM(); SPU_DeInit(); Screen_DeInit(); MMU_DeInit(); gpu3D->NDS_3D_Close(); WIFI_DeInit(); delete cheats; cheats = NULL; delete cheatSearch; cheatSearch = NULL; #ifdef HAVE_JIT arm_jit_close(); #endif #ifdef LOG_ARM7 if (fp_dis7 != NULL) { fclose(fp_dis7); fp_dis7 = NULL; } #endif #ifdef LOG_ARM9 if (fp_dis9 != NULL) { fclose(fp_dis9); fp_dis9 = NULL; } #endif } BOOL NDS_SetROM(u8 * rom, u32 mask) { MMU_setRom(rom, mask); return TRUE; } NDS_header * NDS_getROMHeader(void) { if(MMU.CART_ROM == MMU.UNUSED_RAM) return NULL; NDS_header * header = new NDS_header; memcpy(header->gameTile, MMU.CART_ROM, 12); memcpy(header->gameCode, MMU.CART_ROM + 12, 4); header->makerCode = T1ReadWord(MMU.CART_ROM, 16); header->unitCode = MMU.CART_ROM[18]; header->deviceCode = MMU.CART_ROM[19]; header->cardSize = MMU.CART_ROM[20]; memcpy(header->cardInfo, MMU.CART_ROM + 21, 8); header->flags = MMU.CART_ROM[29]; header->romversion = MMU.CART_ROM[30]; header->ARM9src = T1ReadLong(MMU.CART_ROM, 32); header->ARM9exe = T1ReadLong(MMU.CART_ROM, 36); header->ARM9cpy = T1ReadLong(MMU.CART_ROM, 40); header->ARM9binSize = T1ReadLong(MMU.CART_ROM, 44); header->ARM7src = T1ReadLong(MMU.CART_ROM, 48); header->ARM7exe = T1ReadLong(MMU.CART_ROM, 52); header->ARM7cpy = T1ReadLong(MMU.CART_ROM, 56); header->ARM7binSize = T1ReadLong(MMU.CART_ROM, 60); header->FNameTblOff = T1ReadLong(MMU.CART_ROM, 64); header->FNameTblSize = T1ReadLong(MMU.CART_ROM, 68); header->FATOff = T1ReadLong(MMU.CART_ROM, 72); header->FATSize = T1ReadLong(MMU.CART_ROM, 76); header->ARM9OverlayOff = T1ReadLong(MMU.CART_ROM, 80); header->ARM9OverlaySize = T1ReadLong(MMU.CART_ROM, 84); header->ARM7OverlayOff = T1ReadLong(MMU.CART_ROM, 88); header->ARM7OverlaySize = T1ReadLong(MMU.CART_ROM, 92); header->unknown2a = T1ReadLong(MMU.CART_ROM, 96); header->unknown2b = T1ReadLong(MMU.CART_ROM, 100); header->IconOff = T1ReadLong(MMU.CART_ROM, 104); header->CRC16 = T1ReadWord(MMU.CART_ROM, 108); header->ROMtimeout = T1ReadWord(MMU.CART_ROM, 110); header->ARM9unk = T1ReadLong(MMU.CART_ROM, 112); header->ARM7unk = T1ReadLong(MMU.CART_ROM, 116); memcpy(header->unknown3c, MMU.CART_ROM + 120, 8); header->ROMSize = T1ReadLong(MMU.CART_ROM, 128); header->HeaderSize = T1ReadLong(MMU.CART_ROM, 132); memcpy(header->unknown5, MMU.CART_ROM + 136, 56); memcpy(header->logo, MMU.CART_ROM + 192, 156); header->logoCRC16 = T1ReadWord(MMU.CART_ROM, 348); header->headerCRC16 = T1ReadWord(MMU.CART_ROM, 350); memcpy(header->reserved, MMU.CART_ROM + 352, min(160, (int)gameInfo.romsize - 352)); return header; } void debug() { //if(NDS_ARM9.R[15]==0x020520DC) emu_halt(); //DSLinux //if(NDS_ARM9.CPSR.bits.mode == 0) emu_halt(); //if((NDS_ARM9.R[15]&0xFFFFF000)==0) emu_halt(); //if((NDS_ARM9.R[15]==0x0201B4F4)/*&&(NDS_ARM9.R[1]==0x0)*/) emu_halt(); //AOE //if((NDS_ARM9.R[15]==0x01FFE194)&&(NDS_ARM9.R[0]==0)) emu_halt(); //if((NDS_ARM9.R[15]==0x01FFE134)&&(NDS_ARM9.R[0]==0)) emu_halt(); //BBMAN //if(NDS_ARM9.R[15]==0x02098B4C) emu_halt(); //if(NDS_ARM9.R[15]==0x02004924) emu_halt(); //if(NDS_ARM9.R[15]==0x02004890) emu_halt(); //if(NDS_ARM9.R[15]==0x0202B800) emu_halt(); //if(NDS_ARM9.R[15]==0x0202B3DC) emu_halt(); //if((NDS_ARM9.R[1]==0x9AC29AC1)&&(!fait)) {emu_halt();fait = TRUE;} //if(NDS_ARM9.R[1]==0x0400004A) {emu_halt();fait = TRUE;} /*if(NDS_ARM9.R[4]==0x2E33373C) emu_halt(); if(NDS_ARM9.R[15]==0x02036668) //emu_halt(); { nds.logcount++; sprintf(logbuf, "%d %08X", nds.logcount, NDS_ARM9.R[13]); log::ajouter(logbuf); if(nds.logcount==89) execute=FALSE; }*/ //if(NDS_ARM9.instruction==0) emu_halt(); //if((NDS_ARM9.R[15]>>28)) emu_halt(); } #define DSGBA_LOADER_SIZE 512 enum { ROM_NDS = 0, ROM_DSGBA }; #if 0 /* not used */ //http://www.aggregate.org/MAGIC/#Population%20Count%20(Ones%20Count) static u32 ones32(u32 x) { /* 32-bit recursive reduction using SWAR... but first step is mapping 2-bit values into sum of 2 1-bit values in sneaky way */ x -= ((x >> 1) & 0x55555555); x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); x = (((x >> 4) + x) & 0x0f0f0f0f); x += (x >> 8); x += (x >> 16); return(x & 0x0000003f); } #endif RomBanner::RomBanner(bool defaultInit) { if(!defaultInit) return; version = 1; //Version (0001h) crc16 = 0; //CRC16 across entries 020h..83Fh memset(reserved,0,sizeof(reserved)); memset(bitmap,0,sizeof(bitmap)); memset(palette,0,sizeof(palette)); memset(titles,0,sizeof(titles)); memset(end0xFF,0,sizeof(end0xFF)); } bool GameInfo::hasRomBanner() { if(header.IconOff + sizeof(RomBanner) > romsize) return false; else return true; } const RomBanner& GameInfo::getRomBanner() { //we may not have a valid banner. return a default one if(!hasRomBanner()) { static RomBanner defaultBanner(true); return defaultBanner; } return *(RomBanner*)(romdata+header.IconOff); } void GameInfo::populate() { const char *regions[] = { "JPFSEDIRKHX", "JPN", "EUR", "FRA", "ESP", "USA", "NOE", "ITA", "RUS", "KOR", "HOL", "EUU", }; NDS_header * _header = NDS_getROMHeader(); header = *_header; delete _header; memset(ROMserial, 0, sizeof(ROMserial)); memset(ROMname, 0, sizeof(ROMname)); //homebrew detection heuristics //Option Old. - look for this instruction in the game title //(did this ever work?) //(header->gameTile[0] == 0x2E) && (header->gameTile[1] == 0x00) && header->gameTile[2] == 0x00) && header->gameTile[3] == 0xEA) //Option New. - look for gamecode #### (default for ndstool) //or an invalid gamecode //this first part may look like a poor heuristic for detecting homebrew, but it is actually pretty good. //setting your own game code is stupid, so homebrew should just leave it. //however, non-devkitARM-default makefiles may not have set this. bool gamecodeHash = !memcmp(header.gameCode,"####",4); bool gamecodeInvalid = header.gameCode[0] == 0x00; if((gamecodeHash || gamecodeInvalid) //TBD - is this check a good idea? && header.makerCode == 0x0 ) { isHomebrew = true; } else isHomebrew = false; if(isHomebrew) { //we can't really make a serial for a homebrew game that hasnt set a game code strcpy(ROMserial, "Homebrew"); } else { strcpy(ROMserial,"NTR- -"); memcpy(ROMserial+4, header.gameCode, 4); u32 region = (u32)(std::max(strchr(regions[0],header.gameCode[3]) - regions[0] + 1, 0)); if (region > 0 && region < 12) strcat(ROMserial, regions[region]); else strcat(ROMserial, "Unknown"); } //rom name is probably set even in homebrew, so do it regardless memset(ROMname, 0, sizeof(ROMname)); memcpy(ROMname, header.gameTile, 12); trim(ROMname,20); /*if(header.IconOff < romsize) { u8 num = (T1ReadByte((u8*)romdata, header.IconOff) == 1)?6:7; for (int i = 0; i < num; i++) { wcstombs(ROMfullName[i], (wchar_t *)(romdata+header.IconOff+0x240+(i*0x100)), 0x100); trim(ROMfullName[i]); } }*/ } #ifdef _WINDOWS static std::vector buffer; static std::vector v; static void loadrom(std::string fname) { FILE* inf = fopen(fname.c_str(),"rb"); if(!inf) return; fseek(inf,0,SEEK_END); int size = ftell(inf); fseek(inf,0,SEEK_SET); gameInfo.resize(size); fread(gameInfo.romdata,1,size,inf); gameInfo.fillGap(); fclose(inf); } static int rom_init_path(const char *filename, const char *physicalName, const char *logicalFilename) { int type = ROM_NDS; path.init(logicalFilename); if ( path.isdsgba(path.path)) { type = ROM_DSGBA; loadrom(path.path); } else if ( !strcasecmp(path.extension().c_str(), "nds")) { type = ROM_NDS; loadrom(physicalName ? physicalName : path.path); //n.b. this does nothing if the file can't be found (i.e. if it was an extracted tempfile)... //...but since the data was extracted to gameInfo then it is ok } //ds.gba in archives, it's already been loaded into memory at this point else if (path.isdsgba(std::string(logicalFilename))) { type = ROM_DSGBA; } else { //well, try to load it as an nds rom anyway type = ROM_NDS; loadrom(physicalName ? physicalName : path.path); } if(type == ROM_DSGBA) { std::vector v(gameInfo.romdata + DSGBA_LOADER_SIZE, gameInfo.romdata + gameInfo.romsize); gameInfo.loadData(&v[0],gameInfo.romsize - DSGBA_LOADER_SIZE); } //check that size is at least the size of the header if (gameInfo.romsize < 352) { return -1; } return 1; } #else static int rom_init_path(const char *filename, const char *physicalName, const char *logicalFilename) { int ret; int type; ROMReader_struct *reader; void *file; u32 size; char *noext; noext = strdup(filename); reader = ROMReaderInit(&noext); free(noext); if (logicalFilename) path.init(logicalFilename); else path.init(filename); if (!strcasecmp(path.extension().c_str(), "zip")) type = ROM_NDS; else if (!strcasecmp(path.extension().c_str(), "nds")) type = ROM_NDS; else if (path.isdsgba(path.path)) type = ROM_DSGBA; else type = ROM_NDS; file = reader->Init(filename); if (!file) { reader->DeInit(file); return -1; } size = reader->Size(file); if(type == ROM_DSGBA) { reader->Seek(file, DSGBA_LOADER_SIZE, SEEK_SET); size -= DSGBA_LOADER_SIZE; } //check that size is at least the size of the header if (size < 352) { reader->DeInit(file); return -1; } // Make sure old ROM is freed first(at least this way we won't be eating // up a ton of ram before the old ROM is freed) if(MMU.CART_ROM != MMU.UNUSED_RAM) NDS_FreeROM(); gameInfo.resize(size); ret = reader->Read(file, gameInfo.romdata, size); gameInfo.fillGap(); reader->DeInit(file); return ret; } #endif int NDS_LoadROM(const char *filename, const char *physicalName, const char *logicalFilename) { int ret; char buf[MAX_PATH]; if (filename == NULL) return -1; ret = rom_init_path(filename, physicalName, logicalFilename); if (ret < 1) return ret; //decrypt if necessary.. //but this is untested and suspected to fail on big endian, so lets not support this on big endian #ifndef WORDS_BIGENDIAN bool okRom = DecryptSecureArea((u8*)gameInfo.romdata,gameInfo.romsize); if(!okRom) { printf("Specified file is not a valid rom\n"); return -1; } #endif if (cheatSearch) cheatSearch->close(); FCEUI_StopMovie(); MMU_unsetRom(); NDS_SetROM((u8*)gameInfo.romdata, gameInfo.mask); gameInfo.populate(); gameInfo.crc = crc32(0,(u8*)gameInfo.romdata,gameInfo.romsize); INFO("\nROM game code: %c%c%c%c\n", gameInfo.header.gameCode[0], gameInfo.header.gameCode[1], gameInfo.header.gameCode[2], gameInfo.header.gameCode[3]); INFO("ROM crc: %08X\n", gameInfo.crc); INFO("ROM serial: %s\n", gameInfo.ROMserial); INFO("ROM internal name: %s\n", gameInfo.ROMname); memset(buf, 0, MAX_PATH); strcpy(buf, path.pathToModule); strcat(buf, "desmume.ddb"); // DeSmuME database :) advsc.setDatabase(buf); buf[0] = gameInfo.header.gameCode[0]; buf[1] = gameInfo.header.gameCode[1]; buf[2] = gameInfo.header.gameCode[2]; buf[3] = gameInfo.header.gameCode[3]; buf[4] = 0; if (advsc.checkDB(buf)) { u8 sv = advsc.getSaveType(); printf("ADVANsCEne database:\n"); printf("\t* ROM save type: "); if (sv == 0xFF) printf("Unknown"); else if (sv == 0xFE) printf("None"); else { printf("%s", save_types[sv].descr); if (CommonSettings.autodetectBackupMethod == 1) backup_setManualBackupType(sv+1); } printf("\n\t* ROM crc: %08X\n", advsc.getCRC32()); } printf("\n"); //for homebrew, try auto-patching DLDI. should be benign if there is no DLDI or if it fails if(gameInfo.isHomebrew) DLDI::tryPatch((void*)gameInfo.romdata, gameInfo.romsize); memset(buf, 0, MAX_PATH); path.getpathnoext(path.BATTERY, buf); strcat(buf, ".dsv"); // DeSmuME memory card :) MMU_new.backupDevice.load_rom(buf); if (cheats != NULL) { memset(buf, 0, MAX_PATH); path.getpathnoext(path.CHEATS, buf); strcat(buf, ".dct"); // DeSmuME cheat :) cheats->init(buf); } NDS_Reset(); return ret; } void NDS_FreeROM(void) { FCEUI_StopMovie(); if ((u8*)MMU.CART_ROM == (u8*)gameInfo.romdata) gameInfo.romdata = NULL; if (MMU.CART_ROM != MMU.UNUSED_RAM) delete [] MMU.CART_ROM; MMU_unsetRom(); } u32 NDS_ImportSaveSize(const char *filename) { u32 res = 0; if (strlen(filename) < 4) return 0; if (memcmp(filename+strlen(filename)-4, ".duc", 4) == 0) { res = MMU_new.backupDevice.get_save_duc_size(filename); if (res == 0xFFFFFFFF) return 0; return res; } res = MMU_new.backupDevice.get_save_nogba_size(filename); if (res != 0xFFFFFFFF) return res; res = MMU_new.backupDevice.get_save_raw_size(filename); if (res != 0xFFFFFFFF) return res; return 0; } int NDS_ImportSave(const char *filename, u32 force_size) { if (strlen(filename) < 4) return 0; if (memcmp(filename+strlen(filename)-4, ".duc", 4) == 0) return MMU_new.backupDevice.load_duc(filename, force_size); else if (MMU_new.backupDevice.load_no_gba(filename, force_size)) return 1; else return MMU_new.backupDevice.load_raw(filename, force_size); return 0; } bool NDS_ExportSave(const char *filename) { if (strlen(filename) < 4) return false; if (memcmp(filename+strlen(filename)-5, ".sav*", 5) == 0) { char tmp[MAX_PATH]; memset(tmp, 0, MAX_PATH); strcpy(tmp, filename); tmp[strlen(tmp)-1] = 0; return MMU_new.backupDevice.save_no_gba(tmp); } if (memcmp(filename+strlen(filename)-4, ".sav", 4) == 0) return MMU_new.backupDevice.save_raw(filename); return false; } static int WritePNGChunk(FILE *fp, uint32 size, const char *type, const uint8 *data) { uint32 crc; uint8 tempo[4]; tempo[0]=size>>24; tempo[1]=size>>16; tempo[2]=size>>8; tempo[3]=size; if(fwrite(tempo,4,1,fp)!=1) return 0; if(fwrite(type,4,1,fp)!=1) return 0; if(size) if(fwrite(data,1,size,fp)!=size) return 0; crc = crc32(0,(uint8 *)type,4); if(size) crc = crc32(crc,data,size); tempo[0]=crc>>24; tempo[1]=crc>>16; tempo[2]=crc>>8; tempo[3]=crc; if(fwrite(tempo,4,1,fp)!=1) return 0; return 1; } int NDS_WritePNG(const char *fname) { int x, y; int width=256; int height=192*2; u16 * bmp = (u16 *)GPU_screen; FILE *pp=NULL; uint8 *compmem = NULL; uLongf compmemsize = (uLongf)( (height * (width + 1) * 3 * 1.001 + 1) + 12 ); if(!(compmem=(uint8 *)malloc(compmemsize))) return 0; if(!(pp=fopen(fname, "wb"))) { goto PNGerr; } { const uint8 header[8]={137,80,78,71,13,10,26,10}; if(fwrite(header,8,1,pp)!=1) goto PNGerr; } { uint8 chunko[13]; chunko[0] = width >> 24; // Width chunko[1] = width >> 16; chunko[2] = width >> 8; chunko[3] = width; chunko[4] = height >> 24; // Height chunko[5] = height >> 16; chunko[6] = height >> 8; chunko[7] = height; chunko[8]=8; // 8 bits per sample(24 bits per pixel) chunko[9]=2; // Color type; RGB triplet chunko[10]=0; // compression: deflate chunko[11]=0; // Basic adapative filter set(though none are used). chunko[12]=0; // No interlace. if(!WritePNGChunk(pp,13,"IHDR",chunko)) goto PNGerr; } { uint8 *tmp_buffer; uint8 *tmp_inc; tmp_inc = tmp_buffer = (uint8 *)malloc((width * 3 + 1) * height); for(y=0;y>10; pixel-=r<<10; g = pixel>>5; pixel-=g<<5; b = pixel; r*=255/31; g*=255/31; b*=255/31; tmp_inc[0] = b; tmp_inc[1] = g; tmp_inc[2] = r; tmp_inc += 3; } } if(compress(compmem, &compmemsize, tmp_buffer, height * (width * 3 + 1))!=Z_OK) { if(tmp_buffer) free(tmp_buffer); goto PNGerr; } if(tmp_buffer) free(tmp_buffer); if(!WritePNGChunk(pp,compmemsize,"IDAT",compmem)) goto PNGerr; } if(!WritePNGChunk(pp,0,"IEND",0)) goto PNGerr; free(compmem); fclose(pp); return 1; PNGerr: if(compmem) free(compmem); if(pp) fclose(pp); return(0); } typedef struct { u32 size; s32 width; s32 height; u16 planes; u16 bpp; u32 cmptype; u32 imgsize; s32 hppm; s32 vppm; u32 numcol; u32 numimpcol; } bmpimgheader_struct; #include "PACKED.h" typedef struct { u16 id __PACKED; u32 size __PACKED; u16 reserved1 __PACKED; u16 reserved2 __PACKED; u32 imgoffset __PACKED; } bmpfileheader_struct; #include "PACKED_END.h" int NDS_WriteBMP(const char *filename) { bmpfileheader_struct fileheader; bmpimgheader_struct imageheader; FILE *file; int i,j; u16 * bmp = (u16 *)GPU_screen; size_t elems_written = 0; memset(&fileheader, 0, sizeof(fileheader)); fileheader.size = sizeof(fileheader); fileheader.id = 'B' | ('M' << 8); fileheader.imgoffset = sizeof(fileheader)+sizeof(imageheader); memset(&imageheader, 0, sizeof(imageheader)); imageheader.size = sizeof(imageheader); imageheader.width = 256; imageheader.height = 192*2; imageheader.planes = 1; imageheader.bpp = 24; imageheader.cmptype = 0; // None imageheader.imgsize = imageheader.width * imageheader.height * 3; if ((file = fopen(filename,"wb")) == NULL) return 0; elems_written += fwrite(&fileheader, 1, sizeof(fileheader), file); elems_written += fwrite(&imageheader, 1, sizeof(imageheader), file); for(j=0;j<192*2;j++) { for(i=0;i<256;i++) { u8 r,g,b; u16 pixel = bmp[(192*2-j-1)*256+i]; r = pixel>>10; pixel-=r<<10; g = pixel>>5; pixel-=g<<5; b = (u8)pixel; r*=255/31; g*=255/31; b*=255/31; elems_written += fwrite(&r, 1, sizeof(u8), file); elems_written += fwrite(&g, 1, sizeof(u8), file); elems_written += fwrite(&b, 1, sizeof(u8), file); } } fclose(file); return 1; } int NDS_WriteBMP_32bppBuffer(int width, int height, const void* buf, const char *filename) { bmpfileheader_struct fileheader; bmpimgheader_struct imageheader; FILE *file; size_t elems_written = 0; memset(&fileheader, 0, sizeof(fileheader)); fileheader.size = sizeof(fileheader); fileheader.id = 'B' | ('M' << 8); fileheader.imgoffset = sizeof(fileheader)+sizeof(imageheader); memset(&imageheader, 0, sizeof(imageheader)); imageheader.size = sizeof(imageheader); imageheader.width = width; imageheader.height = height; imageheader.planes = 1; imageheader.bpp = 32; imageheader.cmptype = 0; // None imageheader.imgsize = imageheader.width * imageheader.height * 4; if ((file = fopen(filename,"wb")) == NULL) return 0; elems_written += fwrite(&fileheader, 1, sizeof(fileheader), file); elems_written += fwrite(&imageheader, 1, sizeof(imageheader), file); for(int i=0;i 30) || forceEvenIfCapturing) { SkipCur2DFrame = false; SkipCur3DFrame = false; SkipNext2DFrame = false; if(forceEvenIfCapturing) consecutiveNonCaptures = 0; } } void Advance() { bool capturing = (MainScreen.gpu->dispCapCnt.enabled || (MainScreen.gpu->dispCapCnt.val & 0x80000000)); if(capturing && consecutiveNonCaptures > 30) { // the worst-looking graphics corruption problems from frameskip // are the result of skipping the capture on first frame it turns on. // so we do this to handle the capture immediately, // despite the risk of 1 frame of 2d/3d mismatch or wrong screen display. SkipNext2DFrame = false; nextSkip = false; } else if(lastOffset != MainScreen.offset && lastSkip && !skipped) { // if we're switching from not skipping to skipping // and the screens are also switching around this frame, // go for 1 extra frame without skipping. // this avoids the scenario where we only draw one of the two screens // when a game is switching screens every frame. nextSkip = false; } if(capturing) consecutiveNonCaptures = 0; else if(!(consecutiveNonCaptures > 9000)) // arbitrary cap to avoid eventual wrap consecutiveNonCaptures++; lastLastOffset = lastOffset; lastOffset = MainScreen.offset; lastSkip = skipped; skipped = nextSkip; nextSkip = false; SkipCur2DFrame = SkipNext2DFrame; SkipCur3DFrame = skipped; SkipNext2DFrame = skipped; } FORCEINLINE bool ShouldSkip2D() { return SkipCur2DFrame; } FORCEINLINE bool ShouldSkip3D() { return SkipCur3DFrame; } FrameSkipper() { nextSkip = false; skipped = false; lastSkip = false; lastOffset = 0; SkipCur2DFrame = false; SkipCur3DFrame = false; SkipNext2DFrame = false; consecutiveNonCaptures = 0; } private: bool nextSkip; bool skipped; bool lastSkip; int lastOffset; int lastLastOffset; int consecutiveNonCaptures; bool SkipCur2DFrame; bool SkipCur3DFrame; bool SkipNext2DFrame; }; static FrameSkipper frameSkipper; void NDS_SkipNextFrame() { if (!driver->AVI_IsRecording()) { frameSkipper.RequestSkip(); } } void NDS_OmitFrameSkip(int force) { frameSkipper.OmitSkip(force > 0, force > 1); } #define INDEX(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF)) enum ESI_DISPCNT { ESI_DISPCNT_HStart, ESI_DISPCNT_HStartIRQ, ESI_DISPCNT_HDraw, ESI_DISPCNT_HBlank }; u64 nds_timer; u64 nds_arm9_timer, nds_arm7_timer; static const u64 kNever = 0xFFFFFFFFFFFFFFFFULL; struct TSequenceItem { u64 timestamp; u32 param; bool enabled; virtual void save(EMUFILE* os) { write64le(timestamp,os); write32le(param,os); writebool(enabled,os); } virtual bool load(EMUFILE* is) { if(read64le(×tamp,is) != 1) return false; if(read32le(¶m,is) != 1) return false; if(readbool(&enabled,is) != 1) return false; return true; } FORCEINLINE bool isTriggered() { return enabled && nds_timer >= timestamp; } FORCEINLINE u64 next() { return timestamp; } }; struct TSequenceItem_GXFIFO : public TSequenceItem { FORCEINLINE bool isTriggered() { return enabled && nds_timer >= MMU.gfx3dCycles; } FORCEINLINE void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[4]++); while(isTriggered()) { enabled = false; gfx3d_execute3D(); } } FORCEINLINE u64 next() { if(enabled) return MMU.gfx3dCycles; else return kNever; } }; template struct TSequenceItem_Timer : public TSequenceItem { FORCEINLINE bool isTriggered() { return enabled && nds_timer >= nds.timerCycle[procnum][num]; } FORCEINLINE void schedule() { enabled = MMU.timerON[procnum][num] && MMU.timerMODE[procnum][num] != 0xFFFF; } FORCEINLINE u64 next() { return nds.timerCycle[procnum][num]; } FORCEINLINE void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[13+procnum*4+num]++); u8* regs = procnum==0?MMU.ARM9_REG:MMU.ARM7_REG; bool first = true, over; //we'll need to check chained timers.. for(int i=num;i<4;i++) { //maybe too many checks if this is here, but we need it here for now if(!MMU.timerON[procnum][i]) return; if(MMU.timerMODE[procnum][i] == 0xFFFF) { ++(MMU.timer[procnum][i]); over = !MMU.timer[procnum][i]; } else { if(!first) break; //this timer isn't chained. break the chain first = false; over = true; int remain = 65536 - MMU.timerReload[procnum][i]; int ctr=0; while(nds.timerCycle[procnum][i] <= nds_timer) { nds.timerCycle[procnum][i] += (remain << MMU.timerMODE[procnum][i]); ctr++; } #ifndef NDEBUG if(ctr>1) { printf("yikes!!!!! please report!\n"); } #endif } if(over) { MMU.timer[procnum][i] = MMU.timerReload[procnum][i]; if(T1ReadWord(regs, 0x102 + i*4) & 0x40) { NDS_makeIrq(procnum, IRQ_BIT_TIMER_0 + i); } } else break; //no more chained timers to trigger. we're done here } } }; template struct TSequenceItem_DMA : public TSequenceItem { DmaController* controller; FORCEINLINE bool isTriggered() { return (controller->dmaCheck && nds_timer>= controller->nextEvent); } FORCEINLINE bool isEnabled() { return controller->dmaCheck?TRUE:FALSE; } FORCEINLINE u64 next() { return controller->nextEvent; } FORCEINLINE void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[5+procnum*4+chan]++); //if (nds.freezeBus) return; //printf("exec from TSequenceItem_DMA: %d %d\n",procnum,chan); controller->exec(); // //give gxfifo dmas a chance to re-trigger // if(MMU.DMAStartTime[procnum][chan] == EDMAMode_GXFifo) { // MMU.DMAing[procnum][chan] = FALSE; // if (gxFIFO.size <= 127) // { // execHardware_doDma(procnum,chan,EDMAMode_GXFifo); // if (MMU.DMACompleted[procnum][chan]) // goto docomplete; // else return; // } // } // //docomplete: // if (MMU.DMACompleted[procnum][chan]) // { // u8* regs = procnum==0?MMU.ARM9_REG:MMU.ARM7_REG; // // //disable the channel // if(MMU.DMAStartTime[procnum][chan] != EDMAMode_GXFifo) { // T1WriteLong(regs, 0xB8 + (0xC*chan), T1ReadLong(regs, 0xB8 + (0xC*chan)) & 0x7FFFFFFF); // MMU.DMACrt[procnum][chan] &= 0x7FFFFFFF; //blehhh i hate this shit being mirrored in memory // } // // if((MMU.DMACrt[procnum][chan])&(1<<30)) { // if(procnum==0) NDS_makeARM9Int(8+chan); // else NDS_makeARM7Int(8+chan); // } // // MMU.DMAing[procnum][chan] = FALSE; // } } }; struct TSequenceItem_divider : public TSequenceItem { FORCEINLINE bool isTriggered() { return MMU.divRunning && nds_timer >= MMU.divCycles; } bool isEnabled() { return MMU.divRunning!=0; } FORCEINLINE u64 next() { return MMU.divCycles; } void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[2]++); MMU_new.div.busy = 0; #ifdef _WIN64 T1WriteQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, MMU.divResult); T1WriteQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, MMU.divMod); #else T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, (u32)MMU.divResult); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A4, (u32)(MMU.divResult >> 32)); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, (u32)MMU.divMod); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2AC, (u32)(MMU.divMod >> 32)); #endif MMU.divRunning = FALSE; } }; struct TSequenceItem_sqrtunit : public TSequenceItem { FORCEINLINE bool isTriggered() { return MMU.sqrtRunning && nds_timer >= MMU.sqrtCycles; } bool isEnabled() { return MMU.sqrtRunning!=0; } FORCEINLINE u64 next() { return MMU.sqrtCycles; } FORCEINLINE void exec() { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[3]++); MMU_new.sqrt.busy = 0; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B4, MMU.sqrtResult); MMU.sqrtRunning = FALSE; } }; struct Sequencer { bool nds_vblankEnded; bool reschedule; TSequenceItem dispcnt; TSequenceItem wifi; TSequenceItem_divider divider; TSequenceItem_sqrtunit sqrtunit; TSequenceItem_GXFIFO gxfifo; TSequenceItem_DMA<0,0> dma_0_0; TSequenceItem_DMA<0,1> dma_0_1; TSequenceItem_DMA<0,2> dma_0_2; TSequenceItem_DMA<0,3> dma_0_3; TSequenceItem_DMA<1,0> dma_1_0; TSequenceItem_DMA<1,1> dma_1_1; TSequenceItem_DMA<1,2> dma_1_2; TSequenceItem_DMA<1,3> dma_1_3; TSequenceItem_Timer<0,0> timer_0_0; TSequenceItem_Timer<0,1> timer_0_1; TSequenceItem_Timer<0,2> timer_0_2; TSequenceItem_Timer<0,3> timer_0_3; TSequenceItem_Timer<1,0> timer_1_0; TSequenceItem_Timer<1,1> timer_1_1; TSequenceItem_Timer<1,2> timer_1_2; TSequenceItem_Timer<1,3> timer_1_3; void init(); void execHardware(); u64 findNext(); void save(EMUFILE* os) { write64le(nds_timer,os); write64le(nds_arm9_timer,os); write64le(nds_arm7_timer,os); dispcnt.save(os); divider.save(os); sqrtunit.save(os); gxfifo.save(os); wifi.save(os); #define SAVE(I,X,Y) I##_##X##_##Y .save(os); SAVE(timer,0,0); SAVE(timer,0,1); SAVE(timer,0,2); SAVE(timer,0,3); SAVE(timer,1,0); SAVE(timer,1,1); SAVE(timer,1,2); SAVE(timer,1,3); SAVE(dma,0,0); SAVE(dma,0,1); SAVE(dma,0,2); SAVE(dma,0,3); SAVE(dma,1,0); SAVE(dma,1,1); SAVE(dma,1,2); SAVE(dma,1,3); #undef SAVE } bool load(EMUFILE* is, int version) { if(read64le(&nds_timer,is) != 1) return false; if(read64le(&nds_arm9_timer,is) != 1) return false; if(read64le(&nds_arm7_timer,is) != 1) return false; if(!dispcnt.load(is)) return false; if(!divider.load(is)) return false; if(!sqrtunit.load(is)) return false; if(!gxfifo.load(is)) return false; if(version >= 1) if(!wifi.load(is)) return false; #define LOAD(I,X,Y) if(!I##_##X##_##Y .load(is)) return false; LOAD(timer,0,0); LOAD(timer,0,1); LOAD(timer,0,2); LOAD(timer,0,3); LOAD(timer,1,0); LOAD(timer,1,1); LOAD(timer,1,2); LOAD(timer,1,3); LOAD(dma,0,0); LOAD(dma,0,1); LOAD(dma,0,2); LOAD(dma,0,3); LOAD(dma,1,0); LOAD(dma,1,1); LOAD(dma,1,2); LOAD(dma,1,3); #undef LOAD return true; } } sequencer; void NDS_RescheduleGXFIFO(u32 cost) { if(!sequencer.gxfifo.enabled) { MMU.gfx3dCycles = nds_timer; sequencer.gxfifo.enabled = true; } MMU.gfx3dCycles += cost; NDS_Reschedule(); } void NDS_RescheduleTimers() { #define check(X,Y) sequencer.timer_##X##_##Y .schedule(); check(0,0); check(0,1); check(0,2); check(0,3); check(1,0); check(1,1); check(1,2); check(1,3); #undef check NDS_Reschedule(); } void NDS_RescheduleDMA() { //TBD NDS_Reschedule(); } static void initSchedule() { sequencer.init(); //begin at the very end of the last scanline //so that at t=0 we can increment to scanline=0 nds.VCount = 262; sequencer.nds_vblankEnded = false; } // 2196372 ~= (ARM7_CLOCK << 16) / 1000000 // This value makes more sense to me, because: // ARM7_CLOCK = 33.51 mhz // = 33513982 cycles per second // = 33.513982 cycles per microsecond const u64 kWifiCycles = 67;//34*2; //(this isn't very precise. I don't think it needs to be) void Sequencer::init() { NDS_RescheduleTimers(); NDS_RescheduleDMA(); reschedule = false; nds_timer = 0; nds_arm9_timer = 0; nds_arm7_timer = 0; dispcnt.enabled = true; dispcnt.param = ESI_DISPCNT_HStart; dispcnt.timestamp = 0; gxfifo.enabled = false; dma_0_0.controller = &MMU_new.dma[0][0]; dma_0_1.controller = &MMU_new.dma[0][1]; dma_0_2.controller = &MMU_new.dma[0][2]; dma_0_3.controller = &MMU_new.dma[0][3]; dma_1_0.controller = &MMU_new.dma[1][0]; dma_1_1.controller = &MMU_new.dma[1][1]; dma_1_2.controller = &MMU_new.dma[1][2]; dma_1_3.controller = &MMU_new.dma[1][3]; #ifdef EXPERIMENTAL_WIFI_COMM wifi.enabled = true; wifi.timestamp = kWifiCycles; #else wifi.enabled = false; #endif } //this isnt helping much right now. work on it later //#include "utils/task.h" //Task taskSubGpu(true); //void* renderSubScreen(void*) //{ // GPU_RenderLine(&SubScreen, nds.VCount, SkipCur2DFrame); // return NULL; //} static void execHardware_hblank() { //this logic keeps moving around. //now, we try and give the game as much time as possible to finish doing its work for the scanline, //by drawing scanline N at the end of drawing time (but before subsequent interrupt or hdma-driven events happen) //don't try to do this at the end of the scanline, because some games (sonic classics) may use hblank IRQ to set //scroll regs for the next scanline if(nds.VCount<192) { //taskSubGpu.execute(renderSubScreen,NULL); GPU_RenderLine(&MainScreen, nds.VCount, frameSkipper.ShouldSkip2D()); GPU_RenderLine(&SubScreen, nds.VCount, frameSkipper.ShouldSkip2D()); //taskSubGpu.finish(); //trigger hblank dmas //but notice, we do that just after we finished drawing the line //(values copied by this hdma should not be used until the next scanline) triggerDma(EDMAMode_HBlank); } if(nds.VCount==262) { //we need to trigger one last hblank dma since //a. we're sort of lagged behind by one scanline //b. i think that 193 hblanks actually fire (one for the hblank in scanline 262) //this is demonstrated by NSMB splot-parallaxing clouds //for some reason the game will setup two hdma scroll register buffers //to be run consecutively, and unless we do this, the second buffer will be offset by one scanline //causing a glitch in the 0th scanline //triggerDma(EDMAMode_HBlank); //BUT! this was removed in order to make glitches in megaman zero collection (mmz 4 1st level) work. //and, it seems that it is no longer necessary in nsmb. perhaps something else fixed it } //turn on hblank status bit T1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) | 2); T1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) | 2); //fire hblank interrupts if necessary if(T1ReadWord(MMU.ARM9_REG, 4) & 0x10) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_LCD_HBLANK); if(T1ReadWord(MMU.ARM7_REG, 4) & 0x10) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_LCD_HBLANK); //emulation housekeeping. for some reason we always do this at hblank, //even though it sounds more reasonable to do it at hstart SPU_Emulate_core(); driver->AVI_SoundUpdate(SPU_core->outbuf,spu_core_samples); WAV_WavSoundUpdate(SPU_core->outbuf,spu_core_samples); } static void execHardware_hstart_vblankEnd() { sequencer.nds_vblankEnded = true; sequencer.reschedule = true; //turn off vblank status bit T1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) & ~1); T1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) & ~1); //some emulation housekeeping frameSkipper.Advance(); } static void execHardware_hstart_vblankStart() { //printf("--------VBLANK!!!--------\n"); //fire vblank interrupts if necessary for(int i=0;i<2;i++) if(MMU.reg_IF_pending[i] & (1<>8)|((vmatch<<1)&(1<<8))); return vmatch; } static void execHardware_hstart_vcount_irq() { //trigger pending VMATCH irqs if(MMU.reg_IF_pending[ARMCPU_ARM9] & (1<>8)|((vmatch<<1)&(1<<8))); if(nds.VCount==vmatch) { //arm7 vmatch T1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) | 4); if(T1ReadWord(MMU.ARM7_REG, 4) & 32) MMU.reg_IF_pending[ARMCPU_ARM7] |= (1<> (32-1)) & (c^d)) ^ d); } FORCEINLINE u64 _fast_min(u64 a, u64 b) { //you might find that this is faster on a 64bit system; someone should try it //http://aggregate.org/MAGIC/#Integer%20Selection //u64 ret = (((((s64)(a-b)) >> (64-1)) & (a^b)) ^ b); //assert(ret==min(a,b)); //return ret; //but this ends up being the fastest on 32bits return a>= 63; //no 64bit shra in sse2, what a disappointment //temp = _mm_and_si128(temp,xorval); //temp = _mm_xor_si128(temp,__b); //return temp.m128i_u64[0]; } u64 Sequencer::findNext() { //this one is always enabled so dont bother to check it u64 next = dispcnt.next(); if(divider.isEnabled()) next = _fast_min(next,divider.next()); if(sqrtunit.isEnabled()) next = _fast_min(next,sqrtunit.next()); if(gxfifo.enabled) next = _fast_min(next,gxfifo.next()); #ifdef EXPERIMENTAL_WIFI_COMM next = _fast_min(next,wifi.next()); #endif #define test(X,Y) if(dma_##X##_##Y .isEnabled()) next = _fast_min(next,dma_##X##_##Y .next()); test(0,0); test(0,1); test(0,2); test(0,3); test(1,0); test(1,1); test(1,2); test(1,3); #undef test #define test(X,Y) if(timer_##X##_##Y .enabled) next = _fast_min(next,timer_##X##_##Y .next()); test(0,0); test(0,1); test(0,2); test(0,3); test(1,0); test(1,1); test(1,2); test(1,3); #undef test return next; } void Sequencer::execHardware() { if(dispcnt.isTriggered()) { IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[1]++); switch(dispcnt.param) { case ESI_DISPCNT_HStart: execHardware_hstart(); //(used to be 3168) //hstart is actually 8 dots before the visible drawing begins //we're going to run 1 here and then run 7 in the next case dispcnt.timestamp += 1*6*2; dispcnt.param = ESI_DISPCNT_HStartIRQ; break; case ESI_DISPCNT_HStartIRQ: execHardware_hstart_irq(); dispcnt.timestamp += 7*6*2; dispcnt.param = ESI_DISPCNT_HDraw; break; case ESI_DISPCNT_HDraw: execHardware_hdraw(); //duration of non-blanking period is ~1606 clocks (gbatek agrees) [but says its different on arm7] //im gonna call this 267 dots = 267*6=1602 //so, this event lasts 267 dots minus the 8 dot preroll dispcnt.timestamp += (267-8)*6*2; dispcnt.param = ESI_DISPCNT_HBlank; break; case ESI_DISPCNT_HBlank: execHardware_hblank(); //(once this was 1092 or 1092/12=91 dots.) //there are surely 355 dots per scanline, less 267 for non-blanking period. the rest is hblank and then after that is hstart dispcnt.timestamp += (355-267)*6*2; dispcnt.param = ESI_DISPCNT_HStart; break; } } #ifdef EXPERIMENTAL_WIFI_COMM if(wifi.isTriggered()) { WIFI_usTrigger(); wifi.timestamp += kWifiCycles; } #endif if(divider.isTriggered()) divider.exec(); if(sqrtunit.isTriggered()) sqrtunit.exec(); if(gxfifo.isTriggered()) gxfifo.exec(); #define test(X,Y) if(dma_##X##_##Y .isTriggered()) dma_##X##_##Y .exec(); test(0,0); test(0,1); test(0,2); test(0,3); test(1,0); test(1,1); test(1,2); test(1,3); #undef test #define test(X,Y) if(timer_##X##_##Y .enabled) if(timer_##X##_##Y .isTriggered()) timer_##X##_##Y .exec(); test(0,0); test(0,1); test(0,2); test(0,3); test(1,0); test(1,1); test(1,2); test(1,3); #undef test } void execHardware_interrupts(); static void saveUserInput(EMUFILE* os); static bool loadUserInput(EMUFILE* is, int version); void nds_savestate(EMUFILE* os) { //version write32le(3,os); sequencer.save(os); saveUserInput(os); write32le(LidClosed,os); write8le(countLid,os); } bool nds_loadstate(EMUFILE* is, int size) { // this isn't part of the savestate loading logic, but // don't skip the next frame after loading a savestate frameSkipper.OmitSkip(true, true); //read version u32 version; if(read32le(&version,is) != 1) return false; if(version > 3) return false; bool temp = true; temp &= sequencer.load(is, version); if(version <= 1 || !temp) return temp; temp &= loadUserInput(is, version); if(version < 3) return temp; read32le(&LidClosed,is); read8le(&countLid,is); return temp; } FORCEINLINE void arm9log() { #ifdef LOG_ARM9 if(dolog) { char dasmbuf[4096]; if(NDS_ARM9.CPSR.bits.T) des_thumb_instructions_set[((NDS_ARM9.instruction)>>6)&1023](NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf); else des_arm_instructions_set[INDEX(NDS_ARM9.instruction)](NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf); #ifdef LOG_TO_FILE if (!fp_dis9) return; #ifdef LOG_TO_FILE_REGS fprintf(fp_dis9, "\t\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\n\t\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\n", NDS_ARM9.R[0], NDS_ARM9.R[1], NDS_ARM9.R[2], NDS_ARM9.R[3], NDS_ARM9.R[4], NDS_ARM9.R[5], NDS_ARM9.R[6], NDS_ARM9.R[7], NDS_ARM9.R[8], NDS_ARM9.R[9], NDS_ARM9.R[10], NDS_ARM9.R[11], NDS_ARM9.R[12], NDS_ARM9.R[13], NDS_ARM9.R[14], NDS_ARM9.R[15], NDS_ARM9.next_instruction, NDS_ARM9.CPSR.bits.N, NDS_ARM9.CPSR.bits.Z, NDS_ARM9.CPSR.bits.C, NDS_ARM9.CPSR.bits.V); #endif fprintf(fp_dis9, "%s %08X\t%08X \t%s\n", NDS_ARM9.CPSR.bits.T?"THUMB":"ARM", NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf); /*if (NDS_ARM9.instruction == 0) { dolog = false; INFO("Disassembler is stopped\n"); }*/ #else printf("%05d:%03d %12lld 9:%08X %08X %-30s R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\n", currFrameCounter, nds.VCount, nds_timer, NDS_ARM9.instruct_adr,NDS_ARM9.instruction, dasmbuf, NDS_ARM9.R[0], NDS_ARM9.R[1], NDS_ARM9.R[2], NDS_ARM9.R[3], NDS_ARM9.R[4], NDS_ARM9.R[5], NDS_ARM9.R[6], NDS_ARM9.R[7], NDS_ARM9.R[8], NDS_ARM9.R[9], NDS_ARM9.R[10], NDS_ARM9.R[11], NDS_ARM9.R[12], NDS_ARM9.R[13], NDS_ARM9.R[14], NDS_ARM9.R[15]); #endif } #endif } FORCEINLINE void arm7log() { #ifdef LOG_ARM7 if(dolog) { char dasmbuf[4096]; if(NDS_ARM7.CPSR.bits.T) des_thumb_instructions_set[((NDS_ARM7.instruction)>>6)&1023](NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf); else des_arm_instructions_set[INDEX(NDS_ARM7.instruction)](NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf); #ifdef LOG_TO_FILE if (!fp_dis7) return; #ifdef LOG_TO_FILE_REGS fprintf(fp_dis7, "\t\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\n\t\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\n", NDS_ARM7.R[0], NDS_ARM7.R[1], NDS_ARM7.R[2], NDS_ARM7.R[3], NDS_ARM7.R[4], NDS_ARM7.R[5], NDS_ARM7.R[6], NDS_ARM7.R[7], NDS_ARM7.R[8], NDS_ARM7.R[9], NDS_ARM7.R[10], NDS_ARM7.R[11], NDS_ARM7.R[12], NDS_ARM7.R[13], NDS_ARM7.R[14], NDS_ARM7.R[15], NDS_ARM7.next_instruction, NDS_ARM7.CPSR.bits.N, NDS_ARM7.CPSR.bits.Z, NDS_ARM7.CPSR.bits.C, NDS_ARM7.CPSR.bits.V); #endif fprintf(fp_dis7, "%s %08X\t%08X \t%s\n", NDS_ARM7.CPSR.bits.T?"THUMB":"ARM", NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf); /*if (NDS_ARM7.instruction == 0) { dolog = false; INFO("Disassembler is stopped\n"); }*/ #else printf("%05d:%03d %12lld 7:%08X %08X %-30s R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\n", currFrameCounter, nds.VCount, nds_timer, NDS_ARM7.instruct_adr,NDS_ARM7.instruction, dasmbuf, NDS_ARM7.R[0], NDS_ARM7.R[1], NDS_ARM7.R[2], NDS_ARM7.R[3], NDS_ARM7.R[4], NDS_ARM7.R[5], NDS_ARM7.R[6], NDS_ARM7.R[7], NDS_ARM7.R[8], NDS_ARM7.R[9], NDS_ARM7.R[10], NDS_ARM7.R[11], NDS_ARM7.R[12], NDS_ARM7.R[13], NDS_ARM7.R[14], NDS_ARM7.R[15]); #endif } #endif } //these have not been tuned very well yet. static const int kMaxWork = 4000; static const int kIrqWait = 4000; template static FORCEINLINE s32 minarmtime(s32 arm9, s32 arm7) { if(doarm9) if(doarm7) return min(arm9,arm7); else return arm9; else return arm7; } #ifdef HAVE_JIT template #else template #endif static /*donotinline*/ std::pair armInnerLoop( const u64 nds_timer_base, const s32 s32next, s32 arm9, s32 arm7) { s32 timer = minarmtime(arm9,arm7); while(timer < s32next && !sequencer.reschedule && execute) { if(doarm9 && (!doarm7 || arm9 <= timer)) { if(!NDS_ARM9.waitIRQ&&!nds.freezeBus) { arm9log(); debug(); #ifdef HAVE_JIT arm9 += armcpu_exec(); #else arm9 += armcpu_exec(); #endif #ifdef DEVELOPER nds_debug_continuing[0] = false; #endif } else { s32 temp = arm9; arm9 = min(s32next, arm9 + kIrqWait); nds.idleCycles[0] += arm9-temp; if (gxFIFO.size < 255) nds.freezeBus &= ~1; } } if(doarm7 && (!doarm9 || arm7 <= timer)) { if(!NDS_ARM7.waitIRQ&&!nds.freezeBus) { arm7log(); #ifdef HAVE_JIT arm7 += (armcpu_exec()<<1); #else arm7 += (armcpu_exec()<<1); #endif #ifdef DEVELOPER nds_debug_continuing[1] = false; #endif } else { s32 temp = arm7; arm7 = min(s32next, arm7 + kIrqWait); nds.idleCycles[1] += arm7-temp; if(arm7 == s32next) { nds_timer = nds_timer_base + minarmtime(arm9,arm7); #ifdef HAVE_JIT return armInnerLoop(nds_timer_base, s32next, arm9, arm7); #else return armInnerLoop(nds_timer_base, s32next, arm9, arm7); #endif } } } timer = minarmtime(arm9,arm7); nds_timer = nds_timer_base + timer; } return std::make_pair(arm9, arm7); } void NDS_debug_break() { NDS_ARM9.stalled = NDS_ARM7.stalled = 1; //triggers an immediate exit from the cpu loop NDS_Reschedule(); } void NDS_debug_continue() { NDS_ARM9.stalled = NDS_ARM7.stalled = 0; } void NDS_debug_step() { NDS_debug_continue(); singleStep = true; } template void NDS_exec(s32 nb) { LagFrameFlag=1; if((currFrameCounter&63) == 0) MMU_new.backupDevice.lazy_flush(); sequencer.nds_vblankEnded = false; nds.cpuloopIterationCount = 0; IF_DEVELOPER(for(int i=0;i<32;i++) DEBUG_statistics.sequencerExecutionCounters[i] = 0); if(nds.sleeping) { //speculative code: if ANY irq happens, wake up the arm7. //I think the arm7 program analyzes the system and may decide not to wake up //if it is dissatisfied with the conditions if((MMU.reg_IE[1] & MMU.gen_IF<1>())) { nds.sleeping = FALSE; } } else { for(;;) { //trap the debug-stalled condition #ifdef DEVELOPER singleStep = false; //(gdb stub doesnt yet know how to trigger these immediately by calling reschedule) while((NDS_ARM9.stalled || NDS_ARM7.stalled) && execute) { driver->EMU_DebugIdleUpdate(); nds_debug_continuing[0] = nds_debug_continuing[1] = true; } #endif nds.cpuloopIterationCount++; sequencer.execHardware(); //break out once per frame if(sequencer.nds_vblankEnded) break; //it should be benign to execute execHardware in the next frame, //since there won't be anything for it to do (everything should be scheduled in the future) //bail in case the system halted if(!execute) break; execHardware_interrupts(); //find next work unit: u64 next = sequencer.findNext(); next = min(next,nds_timer+kMaxWork); //lets set an upper limit for now //printf("%d\n",(next-nds_timer)); sequencer.reschedule = false; //cast these down to 32bits so that things run faster on 32bit procs u64 nds_timer_base = nds_timer; s32 arm9 = (s32)(nds_arm9_timer-nds_timer); s32 arm7 = (s32)(nds_arm7_timer-nds_timer); s32 s32next = (s32)(next-nds_timer); #ifdef DEVELOPER if(singleStep) { s32next = 1; } #endif #ifdef HAVE_JIT std::pair arm9arm7 = CommonSettings.use_jit ? armInnerLoop(nds_timer_base,s32next,arm9,arm7) : armInnerLoop(nds_timer_base,s32next,arm9,arm7); #else std::pair arm9arm7 = armInnerLoop(nds_timer_base,s32next,arm9,arm7); #endif #ifdef DEVELOPER if(singleStep) { NDS_ARM9.stalled = NDS_ARM7.stalled = 1; } #endif arm9 = arm9arm7.first; arm7 = arm9arm7.second; nds_arm7_timer = nds_timer_base+arm7; nds_arm9_timer = nds_timer_base+arm9; #ifndef NDEBUG //what we find here is dependent on the timing constants above //if(nds_timer>next && (nds_timer-next)>22) // printf("curious. please report: over by %d\n",(int)(nds_timer-next)); #endif //if we were waiting for an irq, don't wait too long: //let's re-analyze it after this hardware event (this rolls back a big burst of irq waiting which may have been interrupted by a resynch) if(NDS_ARM9.waitIRQ) { nds.idleCycles[0] -= (s32)(nds_arm9_timer-nds_timer); nds_arm9_timer = nds_timer; } if(NDS_ARM7.waitIRQ) { nds.idleCycles[1] -= (s32)(nds_arm7_timer-nds_timer); nds_arm7_timer = nds_timer; } } } //DEBUG_statistics.printSequencerExecutionCounters(); //DEBUG_statistics.print(); //end of frame emulation housekeeping if(LagFrameFlag) { lagframecounter++; TotalLagFrames++; } else { lastLag = lagframecounter; lagframecounter = 0; } currFrameCounter++; DEBUG_Notify.NextFrame(); if (cheats) cheats->process(); } template static void execHardware_interrupts_core() { u32 IF = MMU.gen_IF(); u32 IE = MMU.reg_IE[PROCNUM]; u32 masked = IF & IE; if(ARMPROC.halt_IE_and_IF && masked) { ARMPROC.halt_IE_and_IF = FALSE; ARMPROC.waitIRQ = FALSE; } if(masked && MMU.reg_IME[PROCNUM] && !ARMPROC.CPSR.bits.I) { //printf("Executing IRQ on procnum %d with IF = %08X and IE = %08X\n",PROCNUM,IF,IE); armcpu_irqException(&ARMPROC); } } void execHardware_interrupts() { execHardware_interrupts_core(); execHardware_interrupts_core(); } static void resetUserInput(); static void PrepareBiosARM7() { NDS_ARM7.BIOS_loaded = false; memset(MMU.ARM7_BIOS, 0, sizeof(MMU.ARM7_BIOS)); if(CommonSettings.UseExtBIOS == true) { //read arm7 bios from inputfile and flag it if it succeeds FILE *arm7inf = fopen(CommonSettings.ARM7BIOS,"rb"); if (fread(MMU.ARM7_BIOS,1,16384,arm7inf) == 16384) NDS_ARM7.BIOS_loaded = true; fclose(arm7inf); } //choose to use SWI emulation or routines from bios if((CommonSettings.SWIFromBIOS) && (NDS_ARM7.BIOS_loaded)) { NDS_ARM7.swi_tab = 0; //if we used routines from bios, apply patches if (CommonSettings.PatchSWI3) _MMU_write16(0x00002F08, 0x4770); } else NDS_ARM7.swi_tab = ARM_swi_tab[ARMCPU_ARM7]; if(NDS_ARM7.BIOS_loaded) { INFO("ARM7 BIOS load: %s.\n", NDS_ARM7.BIOS_loaded?"OK":"FAILED"); } else { //fake bios content, critical to normal operations, since we dont have a real bios. #if 0 //someone please document what is in progress here // TODO T1WriteLong(MMU.ARM7_BIOS, 0x0000, 0xEAFFFFFE); // loop for Reset !!! T1WriteLong(MMU.ARM7_BIOS, 0x0004, 0xEAFFFFFE); // loop for Undef instr expection T1WriteLong(MMU.ARM7_BIOS, 0x0008, 0xEA00009C); // SWI T1WriteLong(MMU.ARM7_BIOS, 0x000C, 0xEAFFFFFE); // loop for Prefetch Abort T1WriteLong(MMU.ARM7_BIOS, 0x0010, 0xEAFFFFFE); // loop for Data Abort T1WriteLong(MMU.ARM7_BIOS, 0x0014, 0x00000000); // Reserved T1WriteLong(MMU.ARM7_BIOS, 0x001C, 0x00000000); // Fast IRQ #endif T1WriteLong(MMU.ARM7_BIOS, 0x0000, 0xE25EF002); T1WriteLong(MMU.ARM7_BIOS, 0x0018, 0xEA000000); T1WriteLong(MMU.ARM7_BIOS, 0x0020, 0xE92D500F); T1WriteLong(MMU.ARM7_BIOS, 0x0024, 0xE3A00301); T1WriteLong(MMU.ARM7_BIOS, 0x0028, 0xE28FE000); T1WriteLong(MMU.ARM7_BIOS, 0x002C, 0xE510F004); T1WriteLong(MMU.ARM7_BIOS, 0x0030, 0xE8BD500F); T1WriteLong(MMU.ARM7_BIOS, 0x0034, 0xE25EF004); } } static void PrepareBiosARM9() { memset(MMU.ARM9_BIOS, 0, sizeof(MMU.ARM9_BIOS)); NDS_ARM9.BIOS_loaded = false; if(CommonSettings.UseExtBIOS == true) { //read arm9 bios from inputfile and flag it if it succeeds FILE* arm9inf = fopen(CommonSettings.ARM9BIOS,"rb"); if (fread(MMU.ARM9_BIOS,1,4096,arm9inf) == 4096) NDS_ARM9.BIOS_loaded = true; fclose(arm9inf); } //choose to use SWI emulation or routines from bios if((CommonSettings.SWIFromBIOS) && (NDS_ARM9.BIOS_loaded)) { NDS_ARM9.swi_tab = 0; //if we used routines from bios, apply patches if (CommonSettings.PatchSWI3) _MMU_write16(0xFFFF07CC, 0x4770); } else NDS_ARM9.swi_tab = ARM_swi_tab[ARMCPU_ARM9]; if(NDS_ARM9.BIOS_loaded) { INFO("ARM9 BIOS load: %s.\n", NDS_ARM9.BIOS_loaded?"OK":"FAILED"); } else { //fake bios content, critical to normal operations, since we dont have a real bios. //it'd be cool if we could write this in some kind of assembly language, inline or otherwise, without some bulky dependencies //perhaps we could build it with devkitarm? but thats bulky (offline) dependencies, to be sure.. //reminder: bios chains data abort to fast irq //exception vectors: T1WriteLong(MMU.ARM9_BIOS, 0x0000, 0xEAFFFFFE); // (infinite loop for) Reset !!! //T1WriteLong(MMU.ARM9_BIOS, 0x0004, 0xEAFFFFFE); // (infinite loop for) Undefined instruction T1WriteLong(MMU.ARM9_BIOS, 0x0004, 0xEA000004); // Undefined instruction -> Fast IRQ (just guessing) T1WriteLong(MMU.ARM9_BIOS, 0x0008, 0xEA00009C); // SWI -> ????? T1WriteLong(MMU.ARM9_BIOS, 0x000C, 0xEAFFFFFE); // (infinite loop for) Prefetch Abort T1WriteLong(MMU.ARM9_BIOS, 0x0010, 0xEA000001); // Data Abort -> Fast IRQ T1WriteLong(MMU.ARM9_BIOS, 0x0014, 0x00000000); // Reserved T1WriteLong(MMU.ARM9_BIOS, 0x0018, 0xEA000095); // Normal IRQ -> 0x0274 T1WriteLong(MMU.ARM9_BIOS, 0x001C, 0xEA00009D); // Fast IRQ -> 0x0298 static const u8 logo_data[156] = { 0x24,0xFF,0xAE,0x51,0x69,0x9A,0xA2,0x21,0x3D,0x84,0x82,0x0A,0x84,0xE4,0x09,0xAD, 0x11,0x24,0x8B,0x98,0xC0,0x81,0x7F,0x21,0xA3,0x52,0xBE,0x19,0x93,0x09,0xCE,0x20, 0x10,0x46,0x4A,0x4A,0xF8,0x27,0x31,0xEC,0x58,0xC7,0xE8,0x33,0x82,0xE3,0xCE,0xBF, 0x85,0xF4,0xDF,0x94,0xCE,0x4B,0x09,0xC1,0x94,0x56,0x8A,0xC0,0x13,0x72,0xA7,0xFC, 0x9F,0x84,0x4D,0x73,0xA3,0xCA,0x9A,0x61,0x58,0x97,0xA3,0x27,0xFC,0x03,0x98,0x76, 0x23,0x1D,0xC7,0x61,0x03,0x04,0xAE,0x56,0xBF,0x38,0x84,0x00,0x40,0xA7,0x0E,0xFD, 0xFF,0x52,0xFE,0x03,0x6F,0x95,0x30,0xF1,0x97,0xFB,0xC0,0x85,0x60,0xD6,0x80,0x25, 0xA9,0x63,0xBE,0x03,0x01,0x4E,0x38,0xE2,0xF9,0xA2,0x34,0xFF,0xBB,0x3E,0x03,0x44, 0x78,0x00,0x90,0xCB,0x88,0x11,0x3A,0x94,0x65,0xC0,0x7C,0x63,0x87,0xF0,0x3C,0xAF, 0xD6,0x25,0xE4,0x8B,0x38,0x0A,0xAC,0x72,0x21,0xD4,0xF8,0x07 }; // logo (do some games fail to boot without this? example?) for (int t = 0; t < 0x9C; t++) MMU.ARM9_BIOS[t + 0x20] = logo_data[t]; //...0xBC: //(now what goes in this gap??) //IRQ handler: get dtcm address and jump to a vector in it T1WriteLong(MMU.ARM9_BIOS, 0x0274, 0xE92D500F); //STMDB SP!, {R0-R3,R12,LR} T1WriteLong(MMU.ARM9_BIOS, 0x0278, 0xEE190F11); //MRC CP15, 0, R0, CR9, CR1, 0 T1WriteLong(MMU.ARM9_BIOS, 0x027C, 0xE1A00620); //MOV R0, R0, LSR #C T1WriteLong(MMU.ARM9_BIOS, 0x0280, 0xE1A00600); //MOV R0, R0, LSL #C T1WriteLong(MMU.ARM9_BIOS, 0x0284, 0xE2800C40); //ADD R0, R0, #4000 T1WriteLong(MMU.ARM9_BIOS, 0x0288, 0xE28FE000); //ADD LR, PC, #0 T1WriteLong(MMU.ARM9_BIOS, 0x028C, 0xE510F004); //LDR PC, [R0, -#4] //???? T1WriteLong(MMU.ARM9_BIOS, 0x0290, 0xE8BD500F); //LDMIA SP!, {R0-R3,R12,LR} T1WriteLong(MMU.ARM9_BIOS, 0x0294, 0xE25EF004); //SUBS PC, LR, #4 //------- //FIQ and abort exception handler //TODO - this code is copied from the bios. refactor it //friendly reminder: to calculate an immediate offset: encoded = (desired_address-cur_address-8) T1WriteLong(MMU.ARM9_BIOS, 0x0298, 0xE10FD000); //MRS SP, CPSR T1WriteLong(MMU.ARM9_BIOS, 0x029C, 0xE38DD0C0); //ORR SP, SP, #C0 T1WriteLong(MMU.ARM9_BIOS, 0x02A0, 0xE12FF00D); //MSR CPSR_fsxc, SP T1WriteLong(MMU.ARM9_BIOS, 0x02A4, 0xE59FD000 | (0x2D4-0x2A4-8)); //LDR SP, [FFFF02D4] T1WriteLong(MMU.ARM9_BIOS, 0x02A8, 0xE28DD001); //ADD SP, SP, #1 T1WriteLong(MMU.ARM9_BIOS, 0x02AC, 0xE92D5000); //STMDB SP!, {R12,LR} T1WriteLong(MMU.ARM9_BIOS, 0x02B0, 0xE14FE000); //MRS LR, SPSR T1WriteLong(MMU.ARM9_BIOS, 0x02B4, 0xEE11CF10); //MRC CP15, 0, R12, CR1, CR0, 0 T1WriteLong(MMU.ARM9_BIOS, 0x02B8, 0xE92D5000); //STMDB SP!, {R12,LR} T1WriteLong(MMU.ARM9_BIOS, 0x02BC, 0xE3CCC001); //BIC R12, R12, #1 T1WriteLong(MMU.ARM9_BIOS, 0x02C0, 0xEE01CF10); //MCR CP15, 0, R12, CR1, CR0, 0 T1WriteLong(MMU.ARM9_BIOS, 0x02C4, 0xE3CDC001); //BIC R12, SP, #1 T1WriteLong(MMU.ARM9_BIOS, 0x02C8, 0xE59CC010); //LDR R12, [R12, #10] T1WriteLong(MMU.ARM9_BIOS, 0x02CC, 0xE35C0000); //CMP R12, #0 T1WriteLong(MMU.ARM9_BIOS, 0x02D0, 0x112FFF3C); //BLXNE R12 T1WriteLong(MMU.ARM9_BIOS, 0x02D4, 0x027FFD9C); //0x027FFD9C //--------- } } static void JumbleMemory() { //put random garbage in vram for homebrew games, to help mimic the situation where libnds does not clear out junk //which the card's launcher may or may not have left behind //analysis: //1. retail games dont clear TCM, so why should we jumble it and expect homebrew to clear it? //2. some retail games _dont boot_ if main memory is jumbled. wha...? //3. clearing this is not as useful as tracking uninitialized reads in dev+ builds //4. the vram clearing causes lots of graphical corruptions in badly coded homebrews. this reduces compatibility substantially //conclusion: disable it for now and bring it back as an option //if(gameInfo.isHomebrew) //{ // u32 w=100000,x=99,y=117,z=19382173; // CTASSERT(sizeof(MMU.ARM9_LCD) < sizeof(MMU.MAIN_MEM)); // CTASSERT(sizeof(MMU.ARM9_VMEM) < sizeof(MMU.MAIN_MEM)); // CTASSERT(sizeof(MMU.ARM9_ITCM) < sizeof(MMU.MAIN_MEM)); // CTASSERT(sizeof(MMU.ARM9_DTCM) < sizeof(MMU.MAIN_MEM)); // for(int i=0;i>19))^(t^(t>>8))); // //MMU.MAIN_MEM[i] = t; // if (i(REG_WRAMCNT,3); if (firmware) { delete firmware; firmware = NULL; } firmware = new CFIRMWARE(); fw_success = firmware->load(); if (NDS_ARM7.BIOS_loaded && NDS_ARM9.BIOS_loaded && CommonSettings.BootFromFirmware && fw_success) { //Copy secure area to memory if needed. //could we get a comment about what's going on here? //how does this stuff get copied before anything ever even runs? //does it get mapped straight to the rom somehow? //This code could be made more clear too. if ((header->ARM9src >= 0x4000) && (header->ARM9src < 0x8000)) { u32 src = header->ARM9src; u32 dst = header->ARM9cpy; u32 size = (0x8000 - src) >> 2; for (u32 i = 0; i < size; i++) { _MMU_write32(dst, T1ReadLong(MMU.CART_ROM, src)); src += 4; dst += 4; } } //TODO someone describe why here if (firmware->patched) { armcpu_init(&NDS_ARM7, 0x00000008); armcpu_init(&NDS_ARM9, 0xFFFF0008); } else { //set the cpus to an initial state with their respective firmware program entrypoints armcpu_init(&NDS_ARM7, firmware->ARM7bootAddr); armcpu_init(&NDS_ARM9, firmware->ARM9bootAddr); } //set REG_POSTFLG to the value indicating pre-firmware status MMU.ARM9_REG[0x300] = 0; MMU.ARM7_REG[0x300] = 0; } else { //fake firmware boot-up process //copy the arm9 program to the address specified by rom header u32 src = header->ARM9src; u32 dst = header->ARM9cpy; for(u32 i = 0; i < (header->ARM9binSize>>2); ++i) { _MMU_write32(dst, T1ReadLong(MMU.CART_ROM, src)); dst += 4; src += 4; } //copy the arm7 program to the address specified by rom header src = header->ARM7src; dst = header->ARM7cpy; for(u32 i = 0; i < (header->ARM7binSize>>2); ++i) { _MMU_write32(dst, T1ReadLong(MMU.CART_ROM, src)); dst += 4; src += 4; } //set the cpus to an initial state with their respective programs entrypoints armcpu_init(&NDS_ARM7, header->ARM7exe); armcpu_init(&NDS_ARM9, header->ARM9exe); //set REG_POSTFLG to the value indicating post-firmware status MMU.ARM9_REG[0x300] = 1; MMU.ARM7_REG[0x300] = 1; } // only ARM9 have co-processor reconstruct(&cp15); cp15.reset(&NDS_ARM9); //bitbox 4k demo is so stripped down it relies on default stack values //otherwise the arm7 will crash before making a sound //(these according to gbatek softreset bios docs) NDS_ARM7.R13_svc = 0x0380FFDC; NDS_ARM7.R13_irq = 0x0380FFB0; NDS_ARM7.R13_usr = 0x0380FF00; NDS_ARM7.R[13] = NDS_ARM7.R13_usr; //and let's set these for the arm9 while we're at it, though we have no proof NDS_ARM9.R13_svc = 0x00803FC0; NDS_ARM9.R13_irq = 0x00803FA0; NDS_ARM9.R13_usr = 0x00803EC0; NDS_ARM9.R13_abt = NDS_ARM9.R13_usr; //????? //I think it is wrong to take gbatek's "SYS" and put it in USR--maybe USR doesnt matter. //i think SYS is all the misc modes. please verify by setting nonsensical stack values for USR here NDS_ARM9.R[13] = NDS_ARM9.R13_usr; //n.b.: im not sure about all these, I dont know enough about arm9 svc/irq/etc modes //and how theyre named in desmume to match them up correctly. i just guessed. nds.wifiCycle = 0; memset(nds.timerCycle, 0, sizeof(u64) * 2 * 4); nds.old = 0; nds.scr_touchX = nds.scr_touchY = nds.adc_touchX = nds.adc_touchY = 0; nds.isTouch = 0; nds.paddle = 0; nds.ConsoleType = CommonSettings.ConsoleType; nds._DebugConsole = CommonSettings.DebugConsole; nds.ensataEmulation = CommonSettings.EnsataEmulation; nds.stylusJitter = CommonSettings.StylusJitter; nds.ensataHandshake = ENSATA_HANDSHAKE_none; nds.ensataIpcSyncCounter = 0; SetupMMU(nds.Is_DebugConsole(),nds.Is_DSI()); _MMU_write16(REG_KEYINPUT, 0x3FF); _MMU_write16(REG_KEYINPUT, 0x3FF); _MMU_write08(REG_EXTKEYIN, 0x43); LidClosed = FALSE; countLid = 0; resetUserInput(); //Setup a copy of the firmware user settings in memory. //(this is what the DS firmware would do). { u8 temp_buffer[NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT]; int fw_index; if ( copy_firmware_user_data( temp_buffer, MMU.fw.data)) { for ( fw_index = 0; fw_index < NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT; fw_index++) _MMU_write08(0x027FFC80 + fw_index, temp_buffer[fw_index]); } } // Copy the whole header to Main RAM 0x27FFE00 on startup. (http://nocash.emubase.de/gbatek.htm#dscartridgeheader) //once upon a time this copied 0x90 more. this was thought to be wrong, and changed. if(nds.Is_DSI()) { //dsi needs this copied later in memory. there are probably a number of things that get copied to a later location in memory.. thats where the NDS consoles tend to stash stuff. for (int i = 0; i < ((0x170)/4); i++) _MMU_write32(0x02FFFE00+i*4, LE_TO_LOCAL_32(((u32*)MMU.CART_ROM)[i])); } else { for (int i = 0; i < ((0x170)/4); i++) _MMU_write32(0x027FFE00+i*4, LE_TO_LOCAL_32(((u32*)MMU.CART_ROM)[i])); } // Write the header checksum to memory (the firmware needs it to see the cart) _MMU_write16(0x027FF808, T1ReadWord(MMU.CART_ROM, 0x15E)); //-------------------------------- //setup the homebrew argv //this is useful for nitrofs apps which are emulating themselves via cflash //struct __argv { // int argvMagic; //!< argv magic number, set to 0x5f617267 ('_arg') if valid // char *commandLine; //!< base address of command line, set of null terminated strings // int length; //!< total length of command line // int argc; //!< internal use, number of arguments // char **argv; //!< internal use, argv pointer //}; std::string rompath = "fat:/" + path.RomName; const u32 kCommandline = 0x027E0000; //const u32 kCommandline = 0x027FFF84; // _MMU_write32(0x02FFFE70, 0x5f617267); _MMU_write32(0x02FFFE74, kCommandline); //(commandline starts here) _MMU_write32(0x02FFFE78, rompath.size()+1); //0x027FFF7C (argc) //0x027FFF80 (argv) for(size_t i=0;i(kCommandline+i, rompath[i]); _MMU_write08(kCommandline+rompath.size(), 0); //-------------------------------- if ((firmware->patched) && (CommonSettings.UseExtBIOS == true) && (CommonSettings.BootFromFirmware == true) && (fw_success == TRUE)) { // HACK! for flashme _MMU_write32(0x27FFE24, firmware->ARM9bootAddr); _MMU_write32(0x27FFE34, firmware->ARM7bootAddr); } // make system think it's booted from card -- EXTREMELY IMPORTANT!!! Thanks to cReDiAr _MMU_write08(0x02FFFC40,0x1); _MMU_write08(0x02FFFC40,0x1); // Save touchscreen calibration info in a structure // so we can easily access it at any time TSCal.adc.x1 = _MMU_read16(0x027FFC80 + 0x58); TSCal.adc.y1 = _MMU_read16(0x027FFC80 + 0x5A); TSCal.scr.x1 = _MMU_read08(0x027FFC80 + 0x5C); TSCal.scr.y1 = _MMU_read08(0x027FFC80 + 0x5D); TSCal.adc.x2 = _MMU_read16(0x027FFC80 + 0x5E); TSCal.adc.y2 = _MMU_read16(0x027FFC80 + 0x60); TSCal.scr.x2 = _MMU_read08(0x027FFC80 + 0x62); TSCal.scr.y2 = _MMU_read08(0x027FFC80 + 0x63); TSCal.adc.width = (TSCal.adc.x2 - TSCal.adc.x1); TSCal.adc.height = (TSCal.adc.y2 - TSCal.adc.y1); TSCal.scr.width = (TSCal.scr.x2 - TSCal.scr.x1); TSCal.scr.height = (TSCal.scr.y2 - TSCal.scr.y1); MainScreen.offset = 0; SubScreen.offset = 192; //_MMU_write32[ARMCPU_ARM9](0x02007FFC, 0xE92D4030); delete header; Screen_Reset(); gfx3d_reset(); gpu3D->NDS_3D_Reset(); slot1Reset(); WIFI_Reset(); memcpy(FW_Mac, (MMU.fw.data + 0x36), 6); initSchedule(); SPU_ReInit(); } static std::string MakeInputDisplayString(u16 pad, const std::string* Buttons, int count) { std::string s; for (int x = 0; x < count; x++) { if (pad & (1 << x)) s.append(Buttons[x].size(), ' '); else s += Buttons[x]; } return s; } static std::string MakeInputDisplayString(u16 pad, u16 padExt) { const std::string Buttons[] = {"A", "B", "Sl", "St", "R", "L", "U", "D", "Rs", "Ls"}; const std::string Ext[] = {"X", "Y"}; std::string s = MakeInputDisplayString(pad, Ext, ARRAY_SIZE(Ext)); s += MakeInputDisplayString(padExt, Buttons, ARRAY_SIZE(Buttons)); return s; } buttonstruct Turbo; buttonstruct TurboTime; buttonstruct AutoHold; void ClearAutoHold(void) { for (u32 i=0; i < ARRAY_SIZE(AutoHold.array); i++) { AutoHold.array[i]=false; } } //convert a 12.4 screen coordinate to an ADC value. //the desmume host system will track the screen coordinate, but the hardware should be receiving the raw ADC values. //so we'll need to use this to simulate the ADC values corresponding to the desired screen coords, based on the current TSC calibrations u16 NDS_getADCTouchPosX(int scrX_lsl4) { scrX_lsl4 >>= 4; int rv = ((scrX_lsl4 - TSCal.scr.x1 + 1) * TSCal.adc.width) / TSCal.scr.width + TSCal.adc.x1; rv = min(0xFFF, max(0, rv)); return (u16)(rv); } u16 NDS_getADCTouchPosY(int scrY_lsl4) { scrY_lsl4 >>= 4; int rv = ((scrY_lsl4 - TSCal.scr.y1 + 1) * TSCal.adc.height) / TSCal.scr.height + TSCal.adc.y1; rv = min(0xFFF, max(0, rv)); return (u16)(rv); } static UserInput rawUserInput = {}; // requested input, generally what the user is physically pressing static UserInput intermediateUserInput = {}; // intermediate buffer for modifications (seperated from finalUserInput for safety reasons) static UserInput finalUserInput = {}; // what gets sent to the game and possibly recorded bool validToProcessInput = false; const UserInput& NDS_getRawUserInput() { return rawUserInput; } UserInput& NDS_getProcessingUserInput() { assert(validToProcessInput); return intermediateUserInput; } bool NDS_isProcessingUserInput() { return validToProcessInput; } const UserInput& NDS_getFinalUserInput() { return finalUserInput; } static void saveUserInput(EMUFILE* os, UserInput& input) { os->fwrite((const char*)input.buttons.array, 14); writebool(input.touch.isTouch, os); write16le(input.touch.touchX, os); write16le(input.touch.touchY, os); write32le(input.mic.micButtonPressed, os); } static bool loadUserInput(EMUFILE* is, UserInput& input, int version) { is->fread((char*)input.buttons.array, 14); readbool(&input.touch.isTouch, is); read16le(&input.touch.touchX, is); read16le(&input.touch.touchY, is); read32le(&input.mic.micButtonPressed, is); return true; } static void resetUserInput(UserInput& input) { memset(&input, 0, sizeof(UserInput)); } // (userinput is kind of a misnomer, e.g. finalUserInput has to mirror nds.pad, nds.touchX, etc.) static void saveUserInput(EMUFILE* os) { saveUserInput(os, finalUserInput); saveUserInput(os, intermediateUserInput); // saved in case a savestate is made during input processing (which Lua could do if nothing else) writebool(validToProcessInput, os); for(int i = 0; i < 14; i++) write32le(TurboTime.array[i], os); // saved to make autofire more tolerable to use with re-recording } static bool loadUserInput(EMUFILE* is, int version) { bool rv = true; rv &= loadUserInput(is, finalUserInput, version); rv &= loadUserInput(is, intermediateUserInput, version); readbool(&validToProcessInput, is); for(int i = 0; i < 14; i++) read32le((u32*)&TurboTime.array[i], is); return rv; } static void resetUserInput() { resetUserInput(finalUserInput); resetUserInput(intermediateUserInput); } static inline void gotInputRequest() { // nobody should set the raw input while we're processing the input. // it might not screw anything up but it would be completely useless. assert(!validToProcessInput); } void NDS_setPad(bool R,bool L,bool D,bool U,bool T,bool S,bool B,bool A,bool Y,bool X,bool W,bool E,bool G, bool F) { gotInputRequest(); UserButtons& rawButtons = rawUserInput.buttons; rawButtons.R = R; rawButtons.L = L; rawButtons.D = D; rawButtons.U = U; rawButtons.T = T; rawButtons.S = S; rawButtons.B = B; rawButtons.A = A; rawButtons.Y = Y; rawButtons.X = X; rawButtons.W = W; rawButtons.E = E; rawButtons.G = G; rawButtons.F = F; } void NDS_setTouchPos(u16 x, u16 y) { gotInputRequest(); rawUserInput.touch.touchX = x<<4; rawUserInput.touch.touchY = y<<4; rawUserInput.touch.isTouch = true; if(movieMode != MOVIEMODE_INACTIVE && movieMode != MOVIEMODE_FINISHED) { // just in case, since the movie only stores 8 bits per touch coord #ifdef WORDS_BIGENDIAN rawUserInput.touch.touchX &= 0xF00F; rawUserInput.touch.touchY &= 0xF00F; #else rawUserInput.touch.touchX &= 0x0FF0; rawUserInput.touch.touchY &= 0x0FF0; #endif } } void NDS_releaseTouch(void) { gotInputRequest(); rawUserInput.touch.touchX = 0; rawUserInput.touch.touchY = 0; rawUserInput.touch.isTouch = false; } void NDS_setMic(bool pressed) { gotInputRequest(); rawUserInput.mic.micButtonPressed = (pressed ? TRUE : FALSE); } static void NDS_applyFinalInput(); void NDS_beginProcessingInput() { // start off from the raw input intermediateUserInput = rawUserInput; // processing is valid now validToProcessInput = true; } void NDS_endProcessingInput() { // transfer the processed input finalUserInput = intermediateUserInput; // processing is invalid now validToProcessInput = false; // use the final input for a few things right away NDS_applyFinalInput(); } static void NDS_applyFinalInput() { const UserInput& input = NDS_getFinalUserInput(); u16 pad = (0 | ((input.buttons.A ? 0 : 0x80) >> 7) | ((input.buttons.B ? 0 : 0x80) >> 6) | ((input.buttons.T ? 0 : 0x80) >> 5) | ((input.buttons.S ? 0 : 0x80) >> 4) | ((input.buttons.R ? 0 : 0x80) >> 3) | ((input.buttons.L ? 0 : 0x80) >> 2) | ((input.buttons.U ? 0 : 0x80) >> 1) | ((input.buttons.D ? 0 : 0x80) ) | ((input.buttons.E ? 0 : 0x80) << 1) | ((input.buttons.W ? 0 : 0x80) << 2)) ; pad = LOCAL_TO_LE_16(pad); ((u16 *)MMU.ARM9_REG)[0x130>>1] = (u16)pad; ((u16 *)MMU.ARM7_REG)[0x130>>1] = (u16)pad; u16 k_cnt = ((u16 *)MMU.ARM9_REG)[0x132>>1]; if ( k_cnt & (1<<14)) { //INFO("ARM9: KeyPad IRQ (pad 0x%04X, cnt 0x%04X (condition %s))\n", pad, k_cnt, k_cnt&(1<<15)?"AND":"OR"); u16 k_cnt_selected = (k_cnt & 0x3F); if (k_cnt&(1<<15)) // AND { if ((~pad & k_cnt_selected) == k_cnt_selected) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_KEYPAD); } else // OR { if (~pad & k_cnt_selected) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_KEYPAD); } } k_cnt = ((u16 *)MMU.ARM7_REG)[0x132>>1]; if ( k_cnt & (1<<14)) { //INFO("ARM7: KeyPad IRQ (pad 0x%04X, cnt 0x%04X (condition %s))\n", pad, k_cnt, k_cnt&(1<<15)?"AND":"OR"); u16 k_cnt_selected = (k_cnt & 0x3F); if (k_cnt&(1<<15)) // AND { if ((~pad & k_cnt_selected) == k_cnt_selected) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_KEYPAD); } else // OR { if (~pad & k_cnt_selected) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_KEYPAD); } } if(input.touch.isTouch) { u16 adc_x = NDS_getADCTouchPosX(input.touch.touchX); u16 adc_y = NDS_getADCTouchPosY(input.touch.touchY); nds.adc_touchX = adc_x; nds.adc_touchY = adc_y; nds.adc_jitterctr = 0; nds.scr_touchX = input.touch.touchX; nds.scr_touchY = input.touch.touchY; nds.isTouch = 1; } else { nds.adc_touchX = 0; nds.adc_touchY = 0; nds.scr_touchX = 0; nds.scr_touchY = 0; nds.isTouch = 0; } if (input.buttons.F && !countLid) { LidClosed = (!LidClosed) & 0x01; if (!LidClosed) { NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_ARM7_FOLD); } countLid = 30; } else { if (countLid > 0) countLid--; } u16 padExt = ((input.buttons.X ? 0 : 0x80) >> 7) | ((input.buttons.Y ? 0 : 0x80) >> 6) | ((input.buttons.G ? 0 : 0x80) >> 4) | ((LidClosed) << 7) | 0x0034; padExt = LOCAL_TO_LE_16(padExt); padExt |= (((u16 *)MMU.ARM7_REG)[0x136>>1] & 0x0070); ((u16 *)MMU.ARM7_REG)[0x136>>1] = (u16)padExt; InputDisplayString=MakeInputDisplayString(padExt, pad); //put into the format we want for the movie system //fRLDUTSBAYXWEg //we don't really need nds.pad anymore, but removing it would be a pain nds.pad = ((input.buttons.R ? 1 : 0) << 12)| ((input.buttons.L ? 1 : 0) << 11)| ((input.buttons.D ? 1 : 0) << 10)| ((input.buttons.U ? 1 : 0) << 9)| ((input.buttons.T ? 1 : 0) << 8)| ((input.buttons.S ? 1 : 0) << 7)| ((input.buttons.B ? 1 : 0) << 6)| ((input.buttons.A ? 1 : 0) << 5)| ((input.buttons.Y ? 1 : 0) << 4)| ((input.buttons.X ? 1 : 0) << 3)| ((input.buttons.W ? 1 : 0) << 2)| ((input.buttons.E ? 1 : 0) << 1); //these values are arbitrarily chosen to make arkanoid paddle control act similarly to its dpad controls if(input.buttons.R) nds.paddle += 5; else if(input.buttons.L) nds.paddle -= 5; // TODO: low power IRQ } void NDS_suspendProcessingInput(bool suspend) { static int suspendCount = 0; if(suspend) { // enter non-processing block assert(validToProcessInput); validToProcessInput = false; suspendCount++; } else if(suspendCount) { // exit non-processing block validToProcessInput = true; suspendCount--; } else { // unwound past first time -> not processing validToProcessInput = false; } } void emu_halt() { //printf("halting emu: ARM9 PC=%08X/%08X, ARM7 PC=%08X/%08X\n", NDS_ARM9.R[15], NDS_ARM9.instruct_adr, NDS_ARM7.R[15], NDS_ARM7.instruct_adr); execute = false; #ifdef LOG_ARM9 if (fp_dis9) { char buf[256] = { 0 }; sprintf(buf, "halting emu: ARM9 PC=%08X/%08X\n", NDS_ARM9.R[15], NDS_ARM9.instruct_adr); fwrite(buf, 1, strlen(buf), fp_dis9); INFO("ARM9 halted\n"); } #endif #ifdef LOG_ARM7 if (fp_dis7) { char buf[256] = { 0 }; sprintf(buf, "halting emu: ARM7 PC=%08X/%08X\n", NDS_ARM7.R[15], NDS_ARM7.instruct_adr); fwrite(buf, 1, strlen(buf), fp_dis7); INFO("ARM7 halted\n"); } #endif } //returns true if exmemcnt specifies satisfactory parameters for the device, which calls this function bool ValidateSlot2Access(u32 procnum, u32 demandSRAMSpeed, u32 demand1stROMSpeed, u32 demand2ndROMSpeed, int clockbits) { static const u32 _sramSpeeds[] = {10,8,6,18}; static const u32 _rom1Speeds[] = {10,8,6,18}; static const u32 _rom2Speeds[] = {6,4}; u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[procnum][0x40], 0x204); u16 exmemcnt9 = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); u32 arm7access = (exmemcnt9 & EXMEMCNT_MASK_SLOT2_ARM7); u32 sramSpeed = _sramSpeeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_SRAM_TIME)]; u32 romSpeed1 = _rom1Speeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_ROM_1ST_TIME)>>2]; u32 romSpeed2 = _rom2Speeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_ROM_2ND_TIME)>>4]; u32 curclockbits = (exmemcnt & EXMEMCNT_MASK_SLOT2_CLOCKRATE)>>5; if(procnum==ARMCPU_ARM9 && arm7access) return false; if(procnum==ARMCPU_ARM7 && !arm7access) return false; //what we're interested in here is whether the rom/ram are too low -> too fast. then accesses won't have enough time to work. //i'm not sure if this gives us enough flexibility, but it is good enough for now. //should make the arguments to this function bitmasks later if we need better. if(sramSpeed < demandSRAMSpeed) return false; if(romSpeed1 < demand1stROMSpeed) return false; if(romSpeed2 < demand2ndROMSpeed) return false; if(clockbits != -1 && clockbits != (int)curclockbits) return false; return true; } //these templates needed to be instantiated manually template void NDS_exec(s32 nb); template void NDS_exec(s32 nb); desmume-0.9.9/src/driver.h0000644000175000017500000001050412140261633016153 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _DRIVER_H_ #define _DRIVER_H_ #include "types.h" #include "debug.h" #include #ifdef EXPERIMENTAL_WIFI_COMM #include #endif class VIEW3D_Driver { public: virtual void Launch() {} virtual void NewFrame() {} virtual bool IsRunning() { return false; } }; //each platform needs to implement this, although it doesnt need to implement any functions class BaseDriver { public: BaseDriver(); ~BaseDriver(); #ifdef EXPERIMENTAL_WIFI_COMM virtual bool WIFI_SocketsAvailable() { return true; } virtual bool WIFI_PCapAvailable() { return false; } virtual void WIFI_GetUniqueMAC(u8* mac) {} virtual bool WIFI_WFCWarning() { return false; } virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) { return -1; } virtual void PCAP_freealldevs(pcap_if_t* alldevs) {} virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) { return NULL; } virtual void PCAP_close(pcap_t* dev) {} virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) { return -1; } virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) { return -1; } virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) { return -1; } #endif virtual void AVI_SoundUpdate(void* soundData, int soundLen) {} virtual bool AVI_IsRecording() { return FALSE; } virtual bool WAV_IsRecording() { return FALSE; } virtual void USR_InfoMessage(const char *message) { LOG("%s\n", message); } virtual void USR_RefreshScreen() {} virtual void USR_SetDisplayPostpone(int milliseconds, bool drawNextFrame) {} // -1 == indefinitely, 0 == don't pospone, 500 == don't draw for 0.5 seconds enum eStepMainLoopResult { ESTEP_NOT_IMPLEMENTED = -1, ESTEP_CALL_AGAIN = 0, ESTEP_DONE = 1, }; virtual eStepMainLoopResult EMU_StepMainLoop(bool allowSleep, bool allowPause, int frameSkip, bool disableUser, bool disableCore) { return ESTEP_NOT_IMPLEMENTED; } // -1 frameSkip == useCurrentDefault virtual void EMU_PauseEmulation(bool pause) {} virtual bool EMU_IsEmulationPaused() { return false; } virtual bool EMU_IsFastForwarding() { return false; } virtual bool EMU_HasEmulationStarted() { return true; } virtual bool EMU_IsAtFrameBoundary() { return true; } virtual void EMU_DebugIdleUpdate() {} enum eDebug_IOReg { EDEBUG_IOREG_DMA }; virtual void DEBUG_UpdateIORegView(eDebug_IOReg category) { } VIEW3D_Driver* view3d; void VIEW3D_Shutdown(); void VIEW3D_Init(); }; extern BaseDriver* driver; #ifndef _WINDOWS class UnixDriver : public BaseDriver { #ifdef EXPERIMENTAL_WIFI_COMM virtual bool WIFI_SocketsAvailable() { return true; } virtual bool WIFI_PCapAvailable() { return true; } virtual bool WIFI_WFCWarning() { return false; } virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) { return pcap_findalldevs(alldevs, errbuf); } virtual void PCAP_freealldevs(pcap_if_t* alldevs) { pcap_freealldevs(alldevs); } virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) { return pcap_open_live(source, snaplen, flags, readtimeout, errbuf); } virtual void PCAP_close(pcap_t* dev) { pcap_close(dev); } virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) { return pcap_setnonblock(dev, nonblock, errbuf); } virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) { return pcap_sendpacket(dev, data, len); } virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) { return pcap_dispatch(dev, num, callback, userdata); } #endif }; #endif #endif //_DRIVER_H_ desmume-0.9.9/src/saves.h0000644000175000017500000000320212140261633015776 0ustar guillaumeguillaume/* Copyright (C) 2006 Normmatt Copyright (C) 2007 Pascal Giard Copyright (C) 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _SRAM_H #define _SRAM_H #include "types.h" #define NB_STATES 10 extern int lastSaveState; typedef struct { BOOL exists; char date[40]; } savestates_t; struct SFORMAT { //a string description of the element const char *desc; //the size of each element u32 size; //the number of each element u32 count; //a void* to the data or a void** to the data void *v; }; extern savestates_t savestates[NB_STATES]; void clear_savestates(); void scan_savestates(); u8 sram_read (u32 address); void sram_write (u32 address, u8 value); int sram_load (const char *file_name); int sram_save (const char *file_name); bool savestate_load (const char *file_name); bool savestate_save (const char *file_name); void savestate_slot(int num); void loadstate_slot(int num); bool savestate_load(class EMUFILE* is); bool savestate_save(class EMUFILE* outstream, int compressionLevel); void dorewind(); void rewindsave(); #endif desmume-0.9.9/src/texcache.h0000644000175000017500000000370212140261633016446 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _TEXCACHE_H_ #define _TEXCACHE_H_ #include "common.h" #include enum TexCache_TexFormat { TexFormat_None, //used when nothing yet is cached TexFormat_32bpp, //used by ogl renderer TexFormat_15bpp //used by rasterizer }; class TexCacheItem; typedef std::multimap TTexCacheItemMultimap; class TexCacheItem { public: TexCacheItem() : decode_len(0) , decoded(NULL) , suspectedInvalid(false) , deleteCallback(NULL) , cacheFormat(TexFormat_None) {} ~TexCacheItem() { delete[] decoded; if(deleteCallback) deleteCallback(this); } u32 decode_len; u32 mode; u8* decoded; //decoded texture data bool suspectedInvalid; TTexCacheItemMultimap::iterator iterator; u32 texformat, texpal; u32 sizeX, sizeY; float invSizeX, invSizeY; u64 texid; //used by ogl renderer for the texid void (*deleteCallback)(TexCacheItem*); TexCache_TexFormat cacheFormat; struct Dump { ~Dump() { delete[] texture; } int textureSize, indexSize; static const int maxTextureSize=128*1024; u8* texture; u8 palette[256*2]; } dump; }; void TexCache_Invalidate(); void TexCache_Reset(); void TexCache_EvictFrame(); TexCacheItem* TexCache_SetTexture(TexCache_TexFormat TEXFORMAT, u32 format, u32 texpal); #endif desmume-0.9.9/src/emufile.cpp0000644000175000017500000001124112140261633016640 0ustar guillaumeguillaume/* The MIT License Copyright (C) 2009-2010 DeSmuME team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "emufile.h" #include bool EMUFILE::readAllBytes(std::vector* dstbuf, const std::string& fname) { EMUFILE_FILE file(fname.c_str(),"rb"); if(file.fail()) return false; int size = file.size(); dstbuf->resize(size); file.fread(&dstbuf->at(0),size); return true; } size_t EMUFILE_MEMORY::_fread(const void *ptr, size_t bytes){ u32 remain = len-pos; u32 todo = std::min(remain,(u32)bytes); if(len==0) { failbit = true; return 0; } if(todo<=4) { u8* src = buf()+pos; u8* dst = (u8*)ptr; for(size_t i=0;ibuf(),size()); return mem; } EMUFILE* EMUFILE_MEMORY::memwrap() { return this; } void EMUFILE::write64le(u64* val) { write64le(*val); } void EMUFILE::write64le(u64 val) { #ifdef LOCAL_BE u8 s[8]; s[0]=(u8)val; s[1]=(u8)(val>>8); s[2]=(u8)(val>>16); s[3]=(u8)(val>>24); s[4]=(u8)(val>>32); s[5]=(u8)(val>>40); s[6]=(u8)(val>>48); s[7]=(u8)(val>>56); fwrite((char*)&s,8); #else fwrite(&val,8); #endif } size_t EMUFILE::read64le(u64 *Bufo) { u64 buf; if(fread((char*)&buf,8) != 8) return 0; #ifndef LOCAL_BE *Bufo=buf; #else *Bufo = LE_TO_LOCAL_64(buf); #endif return 1; } u64 EMUFILE::read64le() { u64 temp; read64le(&temp); return temp; } void EMUFILE::write32le(u32* val) { write32le(*val); } void EMUFILE::write32le(u32 val) { #ifdef LOCAL_BE u8 s[4]; s[0]=(u8)val; s[1]=(u8)(val>>8); s[2]=(u8)(val>>16); s[3]=(u8)(val>>24); fwrite(s,4); #else fwrite(&val,4); #endif } size_t EMUFILE::read32le(s32* Bufo) { return read32le((u32*)Bufo); } size_t EMUFILE::read32le(u32* Bufo) { u32 buf; if(fread(&buf,4)<4) return 0; #ifndef LOCAL_BE *(u32*)Bufo=buf; #else *(u32*)Bufo=((buf&0xFF)<<24)|((buf&0xFF00)<<8)|((buf&0xFF0000)>>8)|((buf&0xFF000000)>>24); #endif return 1; } u32 EMUFILE::read32le() { u32 ret; read32le(&ret); return ret; } void EMUFILE::write16le(u16* val) { write16le(*val); } void EMUFILE::write16le(u16 val) { #ifdef LOCAL_BE u8 s[2]; s[0]=(u8)val; s[1]=(u8)(val>>8); fwrite(s,2); #else fwrite(&val,2); #endif } size_t EMUFILE::read16le(s16* Bufo) { return read16le((u16*)Bufo); } size_t EMUFILE::read16le(u16* Bufo) { u32 buf; if(fread(&buf,2)<2) return 0; #ifndef LOCAL_BE *(u16*)Bufo=buf; #else *Bufo = LE_TO_LOCAL_16(buf); #endif return 1; } u16 EMUFILE::read16le() { u16 ret; read16le(&ret); return ret; } void EMUFILE::write8le(u8* val) { write8le(*val); } void EMUFILE::write8le(u8 val) { fwrite(&val,1); } size_t EMUFILE::read8le(u8* val) { return fread(val,1); } u8 EMUFILE::read8le() { u8 temp; fread(&temp,1); return temp; } void EMUFILE::writedouble(double* val) { write64le(double_to_u64(*val)); } void EMUFILE::writedouble(double val) { write64le(double_to_u64(val)); } double EMUFILE::readdouble() { double temp; readdouble(&temp); return temp; } size_t EMUFILE::readdouble(double* val) { u64 temp; size_t ret = read64le(&temp); *val = u64_to_double(temp); return ret; } desmume-0.9.9/src/wifi.h0000644000175000017500000003316312140261633015624 0ustar guillaumeguillaume/* Copyright (C) 2007 Tim Seidel Copyright (C) 2008-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef WIFI_H #define WIFI_H #include #include "types.h" #include #ifdef EXPERIMENTAL_WIFI_COMM #define HAVE_REMOTE #define WPCAP #define PACKET_SIZE 65535 #define _INC_STDIO #endif #define REG_WIFI_ID 0x000 #define REG_WIFI_MODE 0x004 #define REG_WIFI_WEP 0x006 #define REG_WIFI_TXSTATCNT 0x008 #define REG_WIFI_0A 0x00A #define REG_WIFI_IF 0x010 #define REG_WIFI_IE 0x012 #define REG_WIFI_MAC0 0x018 #define REG_WIFI_MAC1 0x01A #define REG_WIFI_MAC2 0x01C #define REG_WIFI_BSS0 0x020 #define REG_WIFI_BSS1 0x022 #define REG_WIFI_BSS2 0x024 #define REG_WIFI_AID_LOW 0x028 #define REG_WIFI_AID_HIGH 0x02A #define REG_WIFI_RETRYLIMIT 0x02C // 02E - internal #define REG_WIFI_RXCNT 0x030 #define REG_WIFI_WEPCNT 0x032 // 034 - internal #define REG_WIFI_POWER_US 0x036 #define REG_WIFI_POWER_TX 0x038 #define REG_WIFI_POWERSTATE 0x03C #define REG_WIFI_POWERFORCE 0x040 #define REG_WIFI_RANDOM 0x044 #define REG_WIFI_POWER_UNK 0x048 #define REG_WIFI_RXRANGEBEGIN 0x050 #define REG_WIFI_RXRANGEEND 0x052 #define REG_WIFI_RXHWWRITECSR 0x054 #define REG_WIFI_WRITECSRLATCH 0x056 #define REG_WIFI_CIRCBUFRADR 0x058 #define REG_WIFI_RXREADCSR 0x05A #define REG_WIFI_RXBUF_COUNT 0x05C #define REG_WIFI_CIRCBUFREAD 0x060 #define REG_WIFI_CIRCBUFRD_END 0x062 #define REG_WIFI_CIRCBUFRD_SKIP 0x064 #define REG_WIFI_CIRCBUFWADR 0x068 #define REG_WIFI_TXBUFCOUNT 0x06C #define REG_WIFI_CIRCBUFWRITE 0x070 #define REG_WIFI_CIRCBUFWR_END 0x074 #define REG_WIFI_CIRCBUFWR_SKIP 0x076 // 078 - internal #define REG_WIFI_TXBUF_BEACON 0x080 #define REG_WIFI_LISTENCOUNT 0x088 #define REG_WIFI_BEACONPERIOD 0x08C #define REG_WIFI_LISTENINT 0x08E #define REG_WIFI_TXBUF_CMD 0x090 #define REG_WIFI_TXBUF_REPLY1 0x094 #define REG_WIFI_TXBUF_REPLY2 0x098 // 09C - internal #define REG_WIFI_TXBUF_LOC1 0x0A0 #define REG_WIFI_TXBUF_LOC2 0x0A4 #define REG_WIFI_TXBUF_LOC3 0x0A8 #define REG_WIFI_TXREQ_RESET 0x0AC #define REG_WIFI_TXREQ_SET 0x0AE #define REG_WIFI_TXREQ_READ 0x0B0 #define REG_WIFI_TXRESET 0x0B4 #define REG_WIFI_TXBUSY 0x0B6 #define REG_WIFI_TXSTAT 0x0B8 // 0BA - internal #define REG_WIFI_PREAMBLE 0x0BC // 0C0 - ? // 0C4 - ? // 0C8 - internal #define REG_WIFI_RXFILTER 0x0D0 // 0D4 - config // 0D8 - config // 0DA - config #define REG_WIFI_RXFILTER2 0x0E0 #define REG_WIFI_USCOUNTERCNT 0x0E8 #define REG_WIFI_USCOMPARECNT 0x0EA // 0EC - config #define REG_WIFI_EXTRACOUNTCNT 0x0EE #define REG_WIFI_USCOMPARE0 0x0F0 #define REG_WIFI_USCOMPARE1 0x0F2 #define REG_WIFI_USCOMPARE2 0x0F4 #define REG_WIFI_USCOMPARE3 0x0F6 #define REG_WIFI_USCOUNTER0 0x0F8 #define REG_WIFI_USCOUNTER1 0x0FA #define REG_WIFI_USCOUNTER2 0x0FC #define REG_WIFI_USCOUNTER3 0x0FE // 100 - internal // 102 - internal // 104 - internal // 106 - internal #define REG_WIFI_CONTENTFREE 0x10C #define REG_WIFI_PREBEACONCOUNT 0x110 #define REG_WIFI_EXTRACOUNT 0x118 #define REG_WIFI_BEACONCOUNT1 0x11C // 120 to 132 - config/internal ports #define REG_WIFI_BEACONCOUNT2 0x134 // 140 to 154 - config ports #define REG_WIFI_BBCNT 0x158 #define REG_WIFI_BBWRITE 0x15A #define REG_WIFI_BBREAD 0x15C #define REG_WIFI_BBBUSY 0x15E #define REG_WIFI_BBMODE 0x160 #define REG_WIFI_BBPOWER 0x168 // 16A to 178 - internal #define REG_WIFI_RFDATA2 0x17C #define REG_WIFI_RFDATA1 0x17E #define REG_WIFI_RFBUSY 0x180 #define REG_WIFI_RFCNT 0x184 // 190 - internal // 194 - ? // 198 - internal #define REG_WIFI_RFPINS 0x19C // 1A0 - internal // 1A2 - internal #define REG_WIFI_MAYBE_RATE 0x1A4 #define REG_WIFI_RXSTAT_INC_IF 0x1A8 #define REG_WIFI_RXSTAT_INC_IE 0x1AA #define REG_WIFI_RXSTAT_OVF_IF 0x1AC #define REG_WIFI_RXSTAT_OVF_IE 0x1AE #define REG_WIFI_TXERR_COUNT 0x1C0 #define REG_WIFI_RX_COUNT 0x1C4 // 1D0 to 1DE - related to multiplayer. argh. #define REG_WIFI_RFSTATUS 0x214 #define REG_WIFI_IF_SET 0x21C #define REG_WIFI_TXSEQNO 0x210 #define REG_WIFI_RXTXADDR 0x268 #define REG_WIFI_POWERACK 0x2D0 #define WIFI_IOREG(reg) wifiMac.IOPorts[(reg) >> 1] /* WIFI misc constants */ #define WIFI_CHIPID 0x1440 /* emulates "old" wifi chip, new is 0xC340 */ /* Referenced as RF_ in dswifi: rffilter_t */ /* based on the documentation for the RF2958 chip of RF Micro Devices */ /* using the register names as in docs ( http://www.rfmd.com/pdfs/2958.pdf )*/ /* even tho every register only has 18 bits we are using u32 */ typedef struct rffilter_t { union CFG1 { struct { /* 0*/ unsigned IF_VGA_REG_EN:1; /* 1*/ unsigned IF_VCO_REG_EN:1; /* 2*/ unsigned RF_VCO_REG_EN:1; /* 3*/ unsigned HYBERNATE:1; /* 4*/ unsigned :10; /*14*/ unsigned REF_SEL:2; /*16*/ unsigned :2; } bits; u32 val; } CFG1; union IFPLL1 { struct { /* 0*/ unsigned DAC:4; /* 4*/ unsigned :5; /* 9*/ unsigned P1:1; /*10*/ unsigned LD_EN1:1; /*11*/ unsigned AUTOCAL_EN1:1; /*12*/ unsigned PDP1:1; /*13*/ unsigned CPL1:1; /*14*/ unsigned LPF1:1; /*15*/ unsigned VTC_EN1:1; /*16*/ unsigned KV_EN1:1; /*17*/ unsigned PLL_EN1:1; } bits; u32 val; } IFPLL1; union IFPLL2 { struct { /* 0*/ unsigned IF_N:16; /*16*/ unsigned :2; } bits; u32 val; } IFPLL2; union IFPLL3 { struct { /* 0*/ unsigned KV_DEF1:4; /* 4*/ unsigned CT_DEF1:4; /* 8*/ unsigned DN1:9; /*17*/ unsigned :1; } bits; u32 val; } IFPLL3; union RFPLL1 { struct { /* 0*/ unsigned DAC:4; /* 4*/ unsigned :5; /* 9*/ unsigned P:1; /*10*/ unsigned LD_EN:1; /*11*/ unsigned AUTOCAL_EN:1; /*12*/ unsigned PDP:1; /*13*/ unsigned CPL:1; /*14*/ unsigned LPF:1; /*15*/ unsigned VTC_EN:1; /*16*/ unsigned KV_EN:1; /*17*/ unsigned PLL_EN:1; } bits; u32 val; } RFPLL1; union RFPLL2 { struct { /* 0*/ unsigned NUM2:6; /* 6*/ unsigned N2:12; } bits; u32 val; } RFPLL2; union RFPLL3 { struct { /* 0*/ unsigned NUM2:18; } bits; u32 val; } RFPLL3; union RFPLL4 { struct { /* 0*/ unsigned KV_DEF:4; /* 4*/ unsigned CT_DEF:4; /* 8*/ unsigned DN:9; /*17*/ unsigned :1; } bits; u32 val; } RFPLL4; union CAL1 { struct { /* 0*/ unsigned LD_WINDOW:3; /* 3*/ unsigned M_CT_VALUE:5; /* 8*/ unsigned TLOCK:5; /*13*/ unsigned TVCO:5; } bits; u32 val; } CAL1; union TXRX1 { struct { /* 0*/ unsigned TXBYPASS:1; /* 1*/ unsigned INTBIASEN:1; /* 2*/ unsigned TXENMODE:1; /* 3*/ unsigned TXDIFFMODE:1; /* 4*/ unsigned TXLPFBW:3; /* 7*/ unsigned RXLPFBW:3; /*10*/ unsigned TXVGC:5; /*15*/ unsigned PCONTROL:2; /*17*/ unsigned RXDCFBBYPS:1; } bits; u32 val; } TXRX1; union PCNT1 { struct { /* 0*/ unsigned TX_DELAY:3; /* 3*/ unsigned PC_OFFSET:6; /* 9*/ unsigned P_DESIRED:6; /*15*/ unsigned MID_BIAS:3; } bits; u32 val; } PCNT1; union PCNT2 { struct { /* 0*/ unsigned MIN_POWER:6; /* 6*/ unsigned MID_POWER:6; /*12*/ unsigned MAX_POWER:6; } bits; u32 val; } PCNT2; union VCOT1 { struct { /* 0*/ unsigned :16; /*16*/ unsigned AUX1:1; /*17*/ unsigned AUX:1; } bits; u32 val; } VCOT1; } rffilter_t; /* baseband chip refered as BB_, dataformat is unknown yet */ /* it has at least 105 bytes of functional data */ typedef struct { u8 data[105]; } bb_t; /* communication interface between RF,BB and the mac */ typedef union { struct { /* 0*/ unsigned wordsize:5; /* 5*/ unsigned :2; /* 7*/ unsigned readOperation:1; /* 8*/ unsigned :8; } bits; u16 val; } rfIOCnt_t; typedef union { struct { /* 0*/ unsigned busy:1; /* 1*/ unsigned :15; } bits; u16 val; } rfIOStat_t; typedef union { struct { /* 0*/ unsigned content:18; /*18*/ unsigned address:5; /*23*/ unsigned :9; } bits; struct { /* 0*/ unsigned low:16; /*16*/ unsigned high:16; } val16; u16 array16[2]; u32 val; } rfIOData_t; typedef union { struct { /* 0*/ unsigned address:7; /* 7*/ unsigned :5; /*12*/ unsigned mode:2; /*14*/ unsigned enable:1; /*15*/ unsigned :1; } bits; u16 val; } bbIOCnt_t; #define WIFI_IRQ_RXEND 0 #define WIFI_IRQ_TXEND 1 #define WIFI_IRQ_RXINC 2 #define WIFI_IRQ_TXERROR 3 #define WIFI_IRQ_RXOVF 4 #define WIFI_IRQ_TXERROVF 5 #define WIFI_IRQ_RXSTART 6 #define WIFI_IRQ_TXSTART 7 #define WIFI_IRQ_TXCOUNTEXP 8 #define WIFI_IRQ_RXCOUNTEXP 9 #define WIFI_IRQ_RFWAKEUP 11 #define WIFI_IRQ_UNK 12 #define WIFI_IRQ_TIMEPOSTBEACON 13 #define WIFI_IRQ_TIMEBEACON 14 #define WIFI_IRQ_TIMEPREBEACON 15 struct Wifi_TXSlot { u16 RegVal; u16 CurAddr; int RemPreamble; // preamble time in s int RemHWords; u32 TimeMask; // 3 = 2mbps, 7 = 1mbps bool NotStarted; }; #define WIFI_TXSLOT_LOC1 0 #define WIFI_TXSLOT_MPCMD 1 #define WIFI_TXSLOT_LOC2 2 #define WIFI_TXSLOT_LOC3 3 #define WIFI_TXSLOT_BEACON 4 #define WIFI_TXSLOT_MPREPLY 5 #define WIFI_TXSLOT_NUM 6 struct Wifi_RXPacket { u8* Data; int CurOffset; int RemHWords; bool NotStarted; }; typedef std::queue Wifi_RXPacketQueue; enum EAPStatus { APStatus_Disconnected = 0, APStatus_Authenticated, APStatus_Associated }; /* wifimac_t: the buildin mac (arm7 addressrange: 0x04800000-0x04FFFFFF )*/ /* http://www.akkit.org/info/dswifi.htm#WifiIOMap */ typedef struct { /* power */ BOOL powerOn; BOOL powerOnPending; /* status */ u16 rfStatus; u16 rfPins; /* wifi interrupt handling */ u16 IE; u16 IF; /* modes */ u16 macMode; u16 wepMode; BOOL WEP_enable; /* sending */ u16 TXStatCnt; u16 TXPower; u16 TXCnt; u16 TXStat; u16 TXSeqNo; Wifi_TXSlot TXSlots[WIFI_TXSLOT_NUM]; int TXCurSlot; u16 TXBusy; /* receiving */ u16 RXCnt; u16 RXCheckCounter; u8 RXNum; Wifi_RXPacketQueue RXPacketQueue; u16 RXStatIncIF, RXStatIncIE; u16 RXStatOvfIF, RXStatOvfIE; u8 RXStat[16]; u16 RXTXAddr; /* addressing/handshaking */ union { //TODO - is this endian safe? don't think so u16 words[3]; u8 bytes[6]; } mac; union { u16 words[3]; u8 bytes[6]; } bss; u16 aid; u16 pid; /* player ID or aid_low */ u16 retryLimit; /* timing */ u64 GlobalUsecTimer; BOOL crystalEnabled; u64 usec; BOOL usecEnable; u64 ucmp; BOOL ucmpEnable; u32 eCount; BOOL eCountEnable; u16 BeaconInterval; u16 BeaconCount1; u16 BeaconCount2; u16 ListenInterval; u16 ListenCount; /* subchips */ rffilter_t RF; bb_t BB; /* subchip communications */ rfIOCnt_t rfIOCnt; rfIOStat_t rfIOStatus; rfIOData_t rfIOData; bbIOCnt_t bbIOCnt; /* buffers */ u16 RAM[0x1000]; u16 RXRangeBegin; u16 RXRangeEnd; u16 RXWriteCursor; u16 RXReadCursor; u16 RXUnits; u16 RXBufCount; u16 CircBufReadAddress; u16 CircBufWriteAddress; u16 CircBufRdEnd; u16 CircBufRdSkip; u16 CircBufWrEnd; u16 CircBufWrSkip; /* I/O ports */ u16 IOPorts[0x800]; /* others */ u16 randomSeed; } wifimac_t; typedef struct { EAPStatus status; u16 seqNum; } SoftAP_t; // desmume host communication #ifdef EXPERIMENTAL_WIFI_COMM typedef struct pcap pcap_t; extern pcap_t *wifi_bridge; #endif extern wifimac_t wifiMac; extern SoftAP_t SoftAP; bool WIFI_Init(); void WIFI_DeInit(); void WIFI_Reset(); /* subchip communication IO functions */ void WIFI_setRF_CNT(u16 val); void WIFI_setRF_DATA(u16 val, u8 part); u16 WIFI_getRF_DATA(u8 part); u16 WIFI_getRF_STATUS(); void WIFI_setBB_CNT(u16 val); u8 WIFI_getBB_DATA(); void WIFI_setBB_DATA(u8 val); /* wifimac io */ void WIFI_write16(u32 address, u16 val); u16 WIFI_read16(u32 address); /* wifimac timing */ void WIFI_usTrigger(); /* DS WFC profile data documented here : */ /* http://dsdev.bigredpimp.com/2006/07/31/aoss-wfc-profile-data/ */ /* Note : we use bytes to avoid endianness issues */ typedef struct _FW_WFCProfile { char SSID[32]; char SSID_WEP64[32]; char WEPKEY_PART1[16]; char WEPKEY_PART2[16]; char WEPKEY_PART3[16]; char WEPKEY_PART4[16]; u8 IP_ADDRESS[4]; u8 GATEWAY[4]; u8 PRIM_DNS[4]; u8 SEC_DNS[4]; u8 SUBNET_MASK; u8 WEP64_KEY_AOSS[20]; u8 UNK1; u8 WEP_MODE; u8 STATUS; u8 UNK2[7]; u8 UNK3; u8 UNK4[14]; u8 CRC16[2]; } FW_WFCProfile; /* wifi data to be stored in firmware, when no firmware image was loaded */ extern u8 FW_Mac[6]; extern const u8 FW_WIFIInit[32]; extern const u8 FW_BBInit[105]; extern const u8 FW_RFInit[36]; extern const u8 FW_RFChannel[6*14]; extern const u8 FW_BBChannel[14]; extern FW_WFCProfile FW_WFCProfile1; extern FW_WFCProfile FW_WFCProfile2; extern FW_WFCProfile FW_WFCProfile3; #endif desmume-0.9.9/src/readwrite.cpp0000644000175000017500000000561012140261633017203 0ustar guillaumeguillaume/* Copyright (C) 2006-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "readwrite.h" #include "types.h" //well. just for the sake of consistency int write8le(u8 b, EMUFILE*os) { os->fwrite((char*)&b,1); return 1; } //well. just for the sake of consistency int read8le(u8 *Bufo, EMUFILE*is) { if(is->_fread((char*)Bufo,1) != 1) return 0; return 1; } ///writes a little endian 16bit value to the specified file int write16le(u16 b, EMUFILE *fp) { u8 s[2]; s[0]=(u8)b; s[1]=(u8)(b>>8); fp->fwrite(s,2); return 2; } ///writes a little endian 32bit value to the specified file int write32le(u32 b, EMUFILE *fp) { u8 s[4]; s[0]=(u8)b; s[1]=(u8)(b>>8); s[2]=(u8)(b>>16); s[3]=(u8)(b>>24); fp->fwrite(s,4); return 4; } void writebool(bool b, EMUFILE* os) { write32le(b?1:0,os); } int write64le(u64 b, EMUFILE* os) { u8 s[8]; s[0]=(u8)b; s[1]=(u8)(b>>8); s[2]=(u8)(b>>16); s[3]=(u8)(b>>24); s[4]=(u8)(b>>32); s[5]=(u8)(b>>40); s[6]=(u8)(b>>48); s[7]=(u8)(b>>56); os->fwrite((char*)&s,8); return 8; } int read32le(u32 *Bufo, EMUFILE *fp) { u32 buf; if(fp->_fread(&buf,4)<4) return 0; #ifdef LOCAL_LE *(u32*)Bufo=buf; #else *(u32*)Bufo=((buf&0xFF)<<24)|((buf&0xFF00)<<8)|((buf&0xFF0000)>>8)|((buf&0xFF000000)>>24); #endif return 1; } int read16le(u16 *Bufo, EMUFILE *is) { u16 buf; if(is->_fread((char*)&buf,2) != 2) return 0; #ifdef LOCAL_LE *Bufo=buf; #else *Bufo = LE_TO_LOCAL_16(buf); #endif return 1; } int read64le(u64 *Bufo, EMUFILE *is) { u64 buf; if(is->_fread((char*)&buf,8) != 8) return 0; #ifdef LOCAL_LE *Bufo=buf; #else *Bufo = LE_TO_LOCAL_64(buf); #endif return 1; } static int read32le(u32 *Bufo, std::istream *is) { u32 buf; if(is->read((char*)&buf,4).gcount() != 4) return 0; #ifdef LOCAL_LE *(u32*)Bufo=buf; #else *(u32*)Bufo=((buf&0xFF)<<24)|((buf&0xFF00)<<8)|((buf&0xFF0000)>>8)|((buf&0xFF000000)>>24); #endif return 1; } int readbool(bool *b, EMUFILE* is) { u32 temp; int ret = read32le(&temp,is); *b = temp!=0; return ret; } int readbuffer(std::vector &vec, EMUFILE* is) { u32 size; if(read32le(&size,is) != 1) return 0; vec.resize(size); if(size>0) is->fread((char*)&vec[0],size); return 1; } int writebuffer(std::vector& vec, EMUFILE* os) { u32 size = vec.size(); write32le(size,os); if(size>0) os->fwrite((char*)&vec[0],size); return 1; } desmume-0.9.9/src/gtk-glade/0000755000175000017500000000000012140305320016336 5ustar guillaumeguillaumedesmume-0.9.9/src/gtk-glade/doc/0000755000175000017500000000000012140305320017103 5ustar guillaumeguillaumedesmume-0.9.9/src/gtk-glade/doc/Makefile.am0000644000175000017500000000004012140261477021147 0ustar guillaumeguillaumedist_man_MANS = desmume-glade.1 desmume-0.9.9/src/gtk-glade/doc/Makefile.in0000644000175000017500000003722512140304537021172 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/gtk-glade/doc DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(dist_man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = desmume-glade.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gtk-glade/doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gtk-glade/doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/gtk-glade/doc/desmume-glade.10000644000175000017500000000522512140261477021720 0ustar guillaumeguillaume.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH DESMUME 1 "June 26, 2007" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME desmume-glade \- Nintendo DS emulator .SH SYNOPSIS .B desmume-glade .RI [ options ] " files" ... .SH DESCRIPTION This manual page documents briefly the .B desmume-glade program .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBdesmume\fP is a Nintendo DS emulator running homebrew demos and commercial games. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-\-load-slot=NUM Loads savegame from slot NUM .TP .B \-\-soft-convert Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. .TP .B \-\-3d-engine=ENGINE Select available 3d emulation: .RS 0 = 3d disabled .RE .RS 1 = internal desmume software rasterizer (default) .RE .RS 2 = osmesa or gtkglext opengl (if available, depending on compilation options, see desmume \-\-help) .RE .TP .B \-\-disable-limiter Disables the 60 fps limiter .TP .B \-\-arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port .TP .B \-\-arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port .TP .B \-h, \-\-help Show summary of options. .TP .B \-v, \-\-version Show version of program. .SH INPUT Mouse cursor acts as stylus, mouse click replaces stylus touch. .PP Keyboard can be configured and by default works as follows: .RS F1-F10 load savegame from slot 1-10 .RE .RS Shift+F1-F10 save game to slot 1-10 .RE .RS Non-keypad arrows act as d-pad .RE .RS z = A .RE .RS x = B .RE .RS a = Y .RE .RS s = X .RE .RS q = L .RE .RS w = R .RE .RS Enter = START .RE .RS Left Shift = SELECT .RE .PP Desmume accepts joystick events, which can be configured by user. .SH AUTHOR desmume was written by DeSmuME team (http://sourceforge.net/projects/desmume). .PP This manual page was written by Pascal Giard , for the Debian project (but may be used by others). desmume-0.9.9/src/gtk-glade/desmume.cpp0000755000175000017500000000766512140261477020540 0ustar guillaumeguillaume/* desmume.c - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "desmume.h" #define EMULOOP_PRIO (G_PRIORITY_HIGH_IDLE + 20) gboolean EmuLoop(gpointer data); static BOOL regMainLoop = FALSE; #define TICKS_PER_FRAME 17 static BOOL noticed_3D=FALSE; volatile bool execute = false; BOOL click = FALSE; void desmume_mem_init(); u8 *desmume_rom_data = NULL; u32 desmume_last_cycle; void desmume_init( struct armcpu_memory_iface *arm9_mem_if, struct armcpu_ctrl_iface **arm9_ctrl_iface, //ticksPrevFrame = ticksCurFrame; struct armcpu_memory_iface *arm7_mem_if, struct armcpu_ctrl_iface **arm7_ctrl_iface) { #ifdef GDB_STUB NDS_Init( arm9_mem_if, arm9_ctrl_iface, arm7_mem_if, arm7_ctrl_iface); #else NDS_Init(); #endif SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); execute = false; } void desmume_free() { execute = false; NDS_DeInit(); } int desmume_open(const char *filename) { int i; noticed_3D=FALSE; clear_savestates(); i = NDS_LoadROM(filename); return i; } void desmume_savetype(int type) { backup_setManualBackupType(type); } void desmume_pause() { execute = false; SPU_Pause(1); } void desmume_resume() { SPU_Pause(0); execute = true; if(!regMainLoop) g_idle_add_full(EMULOOP_PRIO, &EmuLoop, NULL, NULL); regMainLoop = TRUE; } void desmume_reset() { noticed_3D=FALSE; NDS_Reset(); desmume_resume(); } void desmume_toggle() { execute ^= true; } /*INLINE BOOL desmume_running() { return execute; }*/ INLINE void desmume_cycle() { u16 keypad; /* Joystick events */ /* Retrieve old value: can use joysticks w/ another device (from our side) */ keypad = get_keypad(); /* Process joystick events if any */ process_joystick_events( &keypad); /* Update keypad value */ update_keypad(keypad); NDS_exec(); SPU_Emulate_user(); } Uint32 fps, fps_SecStart, fps_FrameCount; Uint32 fsFrameCount = 0; Uint32 ticksPrevFrame = 0, ticksCurFrame = 0; static void Draw() { } gboolean EmuLoop(gpointer data) { if(desmume_running()) /* Si on est en train d'executer le programme ... */ { if(Frameskip != 0 && (fsFrameCount % (Frameskip+1)) != 0) NDS_SkipNextFrame(); fsFrameCount++; fps_FrameCount++; if(!fps_SecStart) fps_SecStart = SDL_GetTicks(); if(SDL_GetTicks() - fps_SecStart >= 1000) { fps_SecStart = SDL_GetTicks(); fps = fps_FrameCount; fps_FrameCount = 0; char Title[32]; sprintf(Title, "Desmume - %dfps", fps); gtk_window_set_title(GTK_WINDOW(pWindow), Title); } desmume_cycle(); /* Emule ! */ //for(i = 0; i < Frameskip; i++) desmume_cycle(); /* cycles supplémentaires pour le frameskip */ Draw(); notify_Tools(); gtk_widget_queue_draw(pDrawingArea); gtk_widget_queue_draw(pDrawingArea2); ticksCurFrame = SDL_GetTicks(); if(!glade_fps_limiter_disabled) { if((ticksCurFrame - ticksPrevFrame) < TICKS_PER_FRAME) while((ticksCurFrame - ticksPrevFrame) < TICKS_PER_FRAME) ticksCurFrame = SDL_GetTicks(); } ticksPrevFrame = SDL_GetTicks(); return TRUE; } gtk_widget_queue_draw(pDrawingArea); gtk_widget_queue_draw(pDrawingArea2); regMainLoop = FALSE; return FALSE; } desmume-0.9.9/src/gtk-glade/desmume-glade.desktop0000644000175000017500000000027512140261477022464 0ustar guillaumeguillaume[Desktop Entry] Version=1.0 Type=Application Name=DeSmuME (Gtk-Glade) Comment=Nintento DS emulator TryExec=desmume-glade Exec=desmume-glade Icon=DeSmuME Categories=GNOME;GTK;Game;Emulator; desmume-0.9.9/src/gtk-glade/glade/0000755000175000017500000000000012140305320017412 5ustar guillaumeguillaumedesmume-0.9.9/src/gtk-glade/glade/DeSmuME.xpm0000755000175000017500000000263512140261477021426 0ustar guillaumeguillaume/* XPM */ static const char * DeSmuME_xpm[] = { "32 32 15 1", " c None", ". c #000000", "+ c #F6F6FB", "@ c #ECECF6", "# c #E2E2F1", "$ c #D8D8EC", "% c #CFCFE7", "& c #C5C5E2", "* c #BBBBDE", "= c #B1B1D9", "- c #A8A8D4", "; c #9E9ECF", "> c #9494CA", ", c #8A8AC5", "' c #8080C0", " .................... ", " .................... ", ".....++..+++++..+++++.. ", ".....++..++.....++..... ", "..@@@@@..@@@@@..@@@@@.. ", "..@@.@@..@@........@@.. ", "..##.##..##.##..##.##.. ", "..##.##..##.##..##.##.. ", "..$$.$$..$$.$$..$$.$$.. ", "..$$.$$..$$.$$..$$.$$.. ", "..%%.%%..%%.%%..%%.%%.. ", "..%%.%%..%%.%%..%%.%%.. ", "..&&&&&..&&&&&..&&&&&.. ", "....................... ", ".......********.**.**.. ", " ..==.==.==.==.==.. ", " ..==.==.==.==.==.. ", " ..--.--.--.--.--.. ", " ..--.--.--.--.--.. ", " ..;;.;;.;;.;;;;;.. ", " ..................... ", " ..................... ", " ..>>>>>>>>.>>>>>.. ", " ..>>.>>.>>.>>..... ", " ..,,.,,.,,.,,,,,.. ", " ..,,.,,.,,.,,..... ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.'''''.. ", " .................. ", " .................. "}; desmume-0.9.9/src/gtk-glade/glade/DeSmuMe.glade0000755000175000017500000035714412140261477021746 0ustar guillaumeguillaume True GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK DeSmuME GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER False False False DeSmuME.xpm True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 0 True GTK_PACK_DIRECTION_LTR GTK_PACK_DIRECTION_LTR True _File True True gtk-open True True Save State True True State 1 True True State 2 True True State 3 True True State 4 True True State 5 True True State 6 True True State 7 True True State 8 True True State 9 True True State 10 True True Load State True True State 1 True True State 2 True True State 3 True True State 4 True True State 5 True True State 6 True True State 7 True True State 8 True True State 9 True True State 10 True True _PrintScreen True True gtk-quit True True _Emulation True True False gtk-execute True True False gtk-media-pause True True False Reset True True gtk-refresh 1 0.5 0.5 0 0 True Layers True False True FrameSkip True True 0 True True True 1 True False fs0 True 2 True False fs0 True 3 True False fs0 True 4 True False fs0 True 5 True False fs0 True 6 True False fs0 True 7 True False fs0 True 8 True False fs0 True 9 True False fs0 True Size True True 1x True True True 2x True False size1x True 3x True False size1x True Config True True _Saves True True TYPE: Auto (1B) True True True TYPE: EEPROM1 (4kB) True False savetype1 True TYPE: EEPROM2 (64kB) True False savetype1 True TYPE: EEPROM2 (512kB) True False savetype1 True TYPE: FLASH (256kB) True False savetype1 True TYPE: FRAM (2MB) True False savetype1 True TYPE: FRAM (4MB) True False savetype1 True Keyboard controls True True gtk-preferences 1 0.5 0.5 0 0 True Joystick controls True True gtk-preferences 1 0.5 0.5 0 0 True Audio On True True True True Gap True False True No Gap True False True Right Screen True False True Rotate Screen 0 True True True Rotate Screen 90 True False menu_rotatescreen0 True Rotate Screen 180 True False menu_rotatescreen0 True Rotate Screen 270 True False menu_rotatescreen0 True Tools True True IO regs True True gtk-properties 1 0.5 0.5 0 0 True View Memory True True gtk-properties 1 0.5 0.5 0 0 True View Palette True True gtk-properties 1 0.5 0.5 0 0 True View Tiles True True gtk-properties 1 0.5 0.5 0 0 True ? True True gtk-about True 0 False False GTK_ORIENTATION_HORIZONTAL GTK_TOOLBAR_BOTH True True True gtk-open True True False False True True True True True False False True False gtk-execute True True False False False True True False Reset True gtk-refresh True True False False True True True True True False False True gtk-quit True True False False True 0 False False True 3 5 False 0 0 256 192 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_EXPOSURE_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK 1 2 0 1 256 192 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_EXPOSURE_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK 1 2 2 3 False False 0 True True BG0 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG1 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG2 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG3 True GTK_RELIEF_NORMAL True True False True 0 False False True True OBJ True GTK_RELIEF_NORMAL True True False True 0 False False 0 1 2 3 False False 0 True True BG0 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG1 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG2 True GTK_RELIEF_NORMAL True True False True 0 False False True True BG3 True GTK_RELIEF_NORMAL True True False True 0 False False True True OBJ True GTK_RELIEF_NORMAL True True False True 0 False False 0 1 0 1 True 2 3 0 1 fill True 1 2 1 2 fill 0 False False True True 0 False False False DeSmuME Nintendo DS emulator based on work by Yopyop False http://desmume.org http://desmume.org Original author: yopyop (now inactive) Current team: Allustar amponzi ape delfare Guillaume Duhamel Normmatt Romain Vallet shash Theo Berkau thoduv Tim Seidel (Mighty Max) Damien Nozay (damdoum) Pascal Giard (evilynux) Contributors: Anthony Molinaro translator-credits DeSmuME.xpm Keyboard Config GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER_ON_PARENT False True True DeSmuME.xpm True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END True 6 7 False 0 0 True True Left : True GTK_RELIEF_NORMAL True 0 1 4 5 fill True True Up : True GTK_RELIEF_NORMAL True 1 2 3 4 fill True True Right : True GTK_RELIEF_NORMAL True 2 3 4 5 fill True True Y : True GTK_RELIEF_NORMAL True 4 5 4 5 fill True True X : True GTK_RELIEF_NORMAL True 5 6 3 4 fill True True A : True GTK_RELIEF_NORMAL True 6 7 4 5 fill True True Down : True GTK_RELIEF_NORMAL True 1 2 5 6 fill True True B : True GTK_RELIEF_NORMAL True 5 6 5 6 fill True True Select : True GTK_RELIEF_NORMAL True 3 4 2 3 fill True True L : True GTK_RELIEF_NORMAL True 0 2 1 2 fill True True R : True GTK_RELIEF_NORMAL True 5 7 1 2 fill True True Debug : True GTK_RELIEF_NORMAL True 2 3 1 2 fill True True Start : True GTK_RELIEF_NORMAL True 3 4 1 2 fill True True Boost : True GTK_RELIEF_NORMAL True 4 5 1 2 fill 0 True True GDK_KEY_RELEASE_MASK Key definition GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER_ON_PARENT True True True DeSmuME.xpm True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True gtk-cancel True GTK_RELIEF_NORMAL False -6 True gtk-ok True GTK_RELIEF_NORMAL False -5 0 False True GTK_PACK_END True Press a key... False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False Joystick Config GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER_ON_PARENT False True True DeSmuME.xpm True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END True 5 7 True 0 0 True True Y : True GTK_RELIEF_NORMAL True 4 5 3 4 fill True True X : True GTK_RELIEF_NORMAL True 5 6 2 3 fill True True A : True GTK_RELIEF_NORMAL True 6 7 3 4 fill True True B : True GTK_RELIEF_NORMAL True 5 6 4 5 fill True True Select : True GTK_RELIEF_NORMAL True 3 4 1 2 fill True True L : True GTK_RELIEF_NORMAL True 0 2 0 1 fill True True R : True GTK_RELIEF_NORMAL True 5 7 0 1 fill True True Debug : True GTK_RELIEF_NORMAL True 2 3 0 1 fill True True Start : True GTK_RELIEF_NORMAL True 3 4 0 1 fill True True Boost : True GTK_RELIEF_NORMAL True 4 5 0 1 fill True True Axis : True GTK_RELIEF_NORMAL True 1 2 2 3 fill True True Axis : True GTK_RELIEF_NORMAL True 1 2 4 5 fill True True Axis : True GTK_RELIEF_NORMAL True 0 1 3 4 fill True True Axis : True GTK_RELIEF_NORMAL True 2 3 3 4 fill 0 True True GDK_KEY_RELEASE_MASK Key definition GTK_WINDOW_POPUP GTK_WIN_POS_CENTER_ALWAYS True False False DeSmuME.xpm False False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False False True False 0 True GTK_BUTTONBOX_END 0 False True GTK_PACK_END True Press a button... False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 True True 3D rom GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER True False False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END 250 20 True 3D operation detected False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 10 True True desmume-0.9.9/src/gtk-glade/glade/DeSmuMe_Dtools.glade0000755000175000017500000006120712140261477023262 0ustar guillaumeguillaume IO registers True GDK_WINDOW_TYPE_HINT_DIALOG True True 2 2 5 True GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 1 2 GTK_FILL True cpu : ARM9 cpu : ARM7 GTK_FILL GTK_FILL 2 True GTK_BUTTONBOX_END True True True gtk-ok True -5 False GTK_PACK_END memory viewer DeSmuME.xpm GDK_WINDOW_TYPE_HINT_DIALOG True True 2 2 True True True 8 bit True True True False False True True 16 bit True True wtools_2_r8 False False 1 True True 32 bit True True wtools_2_r8 False False 2 True ARM9 cpu ARM7 cpu False False 3 True 0.000000 GoTo: GTK_JUSTIFY_RIGHT False 4 True True 10 0x00000000 False 5 True True Go! True False False 6 GTK_FILL GTK_FILL True GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 True 0 0 0 0 0 0 1 2 1 2 GTK_FILL GTK_FILL 2 True GTK_BUTTONBOX_END True True True gtk-close True -7 False GTK_PACK_END Palette Viewer DeSmuME.xpm GDK_WINDOW_TYPE_HINT_DIALOG True True 2 3 256 256 True 3 1 2 True 0.000000 Palette : GTK_JUSTIFY_RIGHT 1 2 GTK_FILL True True 0 0 15 1 2 0 1 2 3 GTK_FILL True GTK_FILL 2 True GTK_BUTTONBOX_END True True True gtk-close True -7 False GTK_PACK_END Tile viewer False GDK_WINDOW_TYPE_HINT_DIALOG True True 3 4 True 1 2 GTK_FILL True True BMP True True True wtools_4_r16 1 2 1 2 GTK_FILL True True 256c True True True wtools_4_r16 2 3 1 2 GTK_FILL True True 16c True True True 3 4 1 2 GTK_FILL True 0.000000 Palette : GTK_JUSTIFY_RIGHT 2 3 GTK_FILL True True 0 0 15 1 2 0 1 3 4 256 256 GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK 3 2 3 True GTK_FILL 2 True GTK_BUTTONBOX_END True True True gtk-close True -7 False GTK_PACK_END desmume-0.9.9/src/gtk-glade/Makefile.am0000644000175000017500000000254512140261477020416 0ustar guillaumeguillaumeSUBDIRS = doc include $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += $(SDL_CFLAGS) $(GTKGLEXT_CFLAGS) $(LIBGLADE_CFLAGS) \ $(GTHREAD_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) \ -DDATADIR=\"$(gladedir)/\" -DLOCALEDIR=\"$(localedir)\" AM_LDFLAGS += -rdynamic $(INTLLIBS) EXTRA_DIST = $(glade_DATA) desmume-glade.desktop Applicationsdir = $(datadir)/applications Applications_DATA = desmume-glade.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = glade/DeSmuME.xpm gladedir = $(datadir)/desmume/glade glade_DATA = glade/DeSmuMe_Dtools.glade glade/DeSmuMe.glade glade/DeSmuME.xpm bin_PROGRAMS = desmume-glade desmume_glade_SOURCES = \ globals.h glade-xml.cpp \ callbacks.cpp callbacks.h callbacks_IO.cpp callbacks_IO.h \ desmume.cpp desmume.h \ keyval_names.cpp keyval_names.h main.cpp gdk_gl.cpp gdk_gl.h \ dTools/callbacks_1_ioregs.cpp dTools/callbacks_2_memview.cpp \ dTools/callbacks_3_palview.cpp dTools/callbacks_4_tileview.cpp \ dTools/callbacks_dtools.h \ dTools/dTools_display.h \ gdk_3Demu.cpp gdk_3Demu.h \ ../sndsdl.h ../sndsdl.cpp ../ctrlssdl.h ../ctrlssdl.cpp \ ../driver.h ../driver.cpp desmume_glade_LDADD = ../libdesmume.a \ $(SDL_LIBS) $(GTKGLEXT_LIBS) $(LIBGLADE_LIBS) \ $(GTHREAD_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) \ $(LIBSOUNDTOUCH_LIBS) if HAVE_GDB_STUB desmume_glade_LDADD += ../gdbstub/libgdbstub.a endif desmume-0.9.9/src/gtk-glade/desmume.h0000755000175000017500000000317012140261477020170 0ustar guillaumeguillaume/* desmume.h - this file is part of DeSmuME * * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __DESMUME_H__ #define __DESMUME_H__ #include "globals.h" #define FPS_LIMITER_FRAME_PERIOD 5 extern SDL_sem *glade_fps_limiter_semaphore; extern int glade_fps_limiter_disabled; extern void desmume_init( struct armcpu_memory_iface *arm9_mem_if, struct armcpu_ctrl_iface **arm9_ctrl_iface, struct armcpu_memory_iface *arm7_mem_if, struct armcpu_ctrl_iface **arm7_ctrl_iface); extern void desmume_free( void); extern int desmume_open(const char *filename); extern void desmume_savetype(int type); extern void desmume_pause( void); extern void desmume_resume( void); extern void desmume_reset( void); extern void desmume_toggle( void); //extern BOOL desmume_running( void); INLINE BOOL desmume_running(void) { return execute; } extern INLINE void desmume_cycle( void); #endif /*__DESMUME_H__*/ desmume-0.9.9/src/gtk-glade/keyval_names.h0000755000175000017500000000162612140261477021213 0ustar guillaumeguillaume/* keyval_names.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ const char * KEYNAME(int k); void init_keyvals(); desmume-0.9.9/src/gtk-glade/callbacks.h0000755000175000017500000000761712140261477020462 0ustar guillaumeguillaume/* callbacks.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "globals.h" extern "C" { /* MENU FILE */ G_MODULE_EXPORT void on_menu_open_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_pscreen_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_quit_activate (GtkMenuItem *menuitem, gpointer user_data); /* MENU SAVES */ G_MODULE_EXPORT void on_loadstateXX_activate (GtkMenuItem *, gpointer ); G_MODULE_EXPORT void on_savestateXX_activate (GtkMenuItem *, gpointer ); G_MODULE_EXPORT void on_savetypeXX_activate (GtkMenuItem *, gpointer ); /* MENU EMULATION */ G_MODULE_EXPORT void on_menu_exec_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_pause_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_reset_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_layers_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_fsXX_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_sizeXX_activate (GtkMenuItem *menuitem, gpointer user_data); /* MENU CONFIG */ G_MODULE_EXPORT void on_menu_controls_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_joy_controls_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_audio_on_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_gapscreen_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_nogap_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_rightscreen_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_rotatescreen_activate (GtkMenuItem *menuitem, gpointer user_data); /* MENU TOOLS */ G_MODULE_EXPORT void on_menu_wtoolsXX_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_IO_regs_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_memview_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_palview_activate (GtkMenuItem *menuitem, gpointer user_data); G_MODULE_EXPORT void on_menu_tileview_activate (GtkMenuItem *menuitem, gpointer user_data); /* MENU ? */ G_MODULE_EXPORT void on_menu_apropos_activate (GtkMenuItem *menuitem, gpointer user_data); /* TOOLBAR */ G_MODULE_EXPORT void on_wgt_Open_clicked (GtkToolButton *toolbutton, gpointer user_data); G_MODULE_EXPORT void on_wgt_Exec_toggled (GtkToggleToolButton *toggletoolbutton, gpointer user_data); G_MODULE_EXPORT void on_wgt_Reset_clicked (GtkToolButton *toolbutton, gpointer user_data); G_MODULE_EXPORT void on_wgt_Quit_clicked (GtkToolButton *toolbutton, gpointer user_data); /* LAYERS TOGGLE */ G_MODULE_EXPORT void on_wc_1_BGXX_toggled (GtkToggleButton *togglebutton, gpointer user_data); G_MODULE_EXPORT void on_wc_2_BGXX_toggled (GtkToggleButton *togglebutton, gpointer user_data); } desmume-0.9.9/src/gtk-glade/keyval_names.cpp0000755000175000017500000014325112140261477021547 0ustar guillaumeguillaume/* keyval_names.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "keyval_names.h" /* see */ const char * unknown="(unknown)"; const char * KEYVAL_NAMES[0x10000]; const char * KEYNAME(int k) { const char * s = unknown; s = KEYVAL_NAMES[k & 0xFFFF]; return s; } static void KEYVAL(int k, const char * name) { if (KEYVAL_NAMES[k] == unknown) KEYVAL_NAMES[k] = name; } void init_keyvals() { int i; for (i=0; i<0x10000; i++) KEYVAL_NAMES[i]=unknown; KEYVAL ( 0x0020 , "space" ); KEYVAL ( 0x0021 , "exclam" ); KEYVAL ( 0x0022 , "quotedbl" ); KEYVAL ( 0x0023 , "numbersign" ); KEYVAL ( 0x0024 , "dollar" ); KEYVAL ( 0x0025 , "percent" ); KEYVAL ( 0x0026 , "ampersand" ); KEYVAL ( 0x0027 , "apostrophe" ); KEYVAL ( 0x0027 , "quoteright" ); KEYVAL ( 0x0028 , "parenleft" ); KEYVAL ( 0x0029 , "parenright" ); KEYVAL ( 0x002a , "asterisk" ); KEYVAL ( 0x002b , "plus" ); KEYVAL ( 0x002c , "comma" ); KEYVAL ( 0x002d , "minus" ); KEYVAL ( 0x002e , "period" ); KEYVAL ( 0x002f , "slash" ); KEYVAL ( 0x0030 , "0" ); KEYVAL ( 0x0031 , "1" ); KEYVAL ( 0x0032 , "2" ); KEYVAL ( 0x0033 , "3" ); KEYVAL ( 0x0034 , "4" ); KEYVAL ( 0x0035 , "5" ); KEYVAL ( 0x0036 , "6" ); KEYVAL ( 0x0037 , "7" ); KEYVAL ( 0x0038 , "8" ); KEYVAL ( 0x0039 , "9" ); KEYVAL ( 0x003a , "colon" ); KEYVAL ( 0x003b , "semicolon" ); KEYVAL ( 0x003c , "less" ); KEYVAL ( 0x003d , "equal" ); KEYVAL ( 0x003e , "greater" ); KEYVAL ( 0x003f , "question" ); KEYVAL ( 0x0040 , "at" ); KEYVAL ( 0x0041 , "A" ); KEYVAL ( 0x0042 , "B" ); KEYVAL ( 0x0043 , "C" ); KEYVAL ( 0x0044 , "D" ); KEYVAL ( 0x0045 , "E" ); KEYVAL ( 0x0046 , "F" ); KEYVAL ( 0x0047 , "G" ); KEYVAL ( 0x0048 , "H" ); KEYVAL ( 0x0049 , "I" ); KEYVAL ( 0x004a , "J" ); KEYVAL ( 0x004b , "K" ); KEYVAL ( 0x004c , "L" ); KEYVAL ( 0x004d , "M" ); KEYVAL ( 0x004e , "N" ); KEYVAL ( 0x004f , "O" ); KEYVAL ( 0x0050 , "P" ); KEYVAL ( 0x0051 , "Q" ); KEYVAL ( 0x0052 , "R" ); KEYVAL ( 0x0053 , "S" ); KEYVAL ( 0x0054 , "T" ); KEYVAL ( 0x0055 , "U" ); KEYVAL ( 0x0056 , "V" ); KEYVAL ( 0x0057 , "W" ); KEYVAL ( 0x0058 , "X" ); KEYVAL ( 0x0059 , "Y" ); KEYVAL ( 0x005a , "Z" ); KEYVAL ( 0x005b , "bracketleft" ); KEYVAL ( 0x005c , "backslash" ); KEYVAL ( 0x005d , "bracketright" ); KEYVAL ( 0x005e , "asciicircum" ); KEYVAL ( 0x005f , "underscore" ); KEYVAL ( 0x0060 , "grave" ); KEYVAL ( 0x0060 , "quoteleft" ); KEYVAL ( 0x0061 , "a" ); KEYVAL ( 0x0062 , "b" ); KEYVAL ( 0x0063 , "c" ); KEYVAL ( 0x0064 , "d" ); KEYVAL ( 0x0065 , "e" ); KEYVAL ( 0x0066 , "f" ); KEYVAL ( 0x0067 , "g" ); KEYVAL ( 0x0068 , "h" ); KEYVAL ( 0x0069 , "i" ); KEYVAL ( 0x006a , "j" ); KEYVAL ( 0x006b , "k" ); KEYVAL ( 0x006c , "l" ); KEYVAL ( 0x006d , "m" ); KEYVAL ( 0x006e , "n" ); KEYVAL ( 0x006f , "o" ); KEYVAL ( 0x0070 , "p" ); KEYVAL ( 0x0071 , "q" ); KEYVAL ( 0x0072 , "r" ); KEYVAL ( 0x0073 , "s" ); KEYVAL ( 0x0074 , "t" ); KEYVAL ( 0x0075 , "u" ); KEYVAL ( 0x0076 , "v" ); KEYVAL ( 0x0077 , "w" ); KEYVAL ( 0x0078 , "x" ); KEYVAL ( 0x0079 , "y" ); KEYVAL ( 0x007a , "z" ); KEYVAL ( 0x007b , "braceleft" ); KEYVAL ( 0x007c , "bar" ); KEYVAL ( 0x007d , "braceright" ); KEYVAL ( 0x007e , "asciitilde" ); KEYVAL ( 0x00a0 , "nobreakspace" ); KEYVAL ( 0x00a1 , "exclamdown" ); KEYVAL ( 0x00a2 , "cent" ); KEYVAL ( 0x00a3 , "sterling" ); KEYVAL ( 0x00a4 , "currency" ); KEYVAL ( 0x00a5 , "yen" ); KEYVAL ( 0x00a6 , "brokenbar" ); KEYVAL ( 0x00a7 , "section" ); KEYVAL ( 0x00a8 , "diaeresis" ); KEYVAL ( 0x00a9 , "copyright" ); KEYVAL ( 0x00aa , "ordfeminine" ); KEYVAL ( 0x00ab , "guillemotleft" ); KEYVAL ( 0x00ac , "notsign" ); KEYVAL ( 0x00ad , "hyphen" ); KEYVAL ( 0x00ae , "registered" ); KEYVAL ( 0x00af , "macron" ); KEYVAL ( 0x00b0 , "degree" ); KEYVAL ( 0x00b1 , "plusminus" ); KEYVAL ( 0x00b2 , "twosuperior" ); KEYVAL ( 0x00b3 , "threesuperior" ); KEYVAL ( 0x00b4 , "acute" ); KEYVAL ( 0x00b5 , "mu" ); KEYVAL ( 0x00b6 , "paragraph" ); KEYVAL ( 0x00b7 , "periodcentered" ); KEYVAL ( 0x00b8 , "cedilla" ); KEYVAL ( 0x00b9 , "onesuperior" ); KEYVAL ( 0x00ba , "masculine" ); KEYVAL ( 0x00bb , "guillemotright" ); KEYVAL ( 0x00bc , "onequarter" ); KEYVAL ( 0x00bd , "onehalf" ); KEYVAL ( 0x00be , "threequarters" ); KEYVAL ( 0x00bf , "questiondown" ); KEYVAL ( 0x00c0 , "Agrave" ); KEYVAL ( 0x00c1 , "Aacute" ); KEYVAL ( 0x00c2 , "Acircumflex" ); KEYVAL ( 0x00c3 , "Atilde" ); KEYVAL ( 0x00c4 , "Adiaeresis" ); KEYVAL ( 0x00c5 , "Aring" ); KEYVAL ( 0x00c6 , "AE" ); KEYVAL ( 0x00c7 , "Ccedilla" ); KEYVAL ( 0x00c8 , "Egrave" ); KEYVAL ( 0x00c9 , "Eacute" ); KEYVAL ( 0x00ca , "Ecircumflex" ); KEYVAL ( 0x00cb , "Ediaeresis" ); KEYVAL ( 0x00cc , "Igrave" ); KEYVAL ( 0x00cd , "Iacute" ); KEYVAL ( 0x00ce , "Icircumflex" ); KEYVAL ( 0x00cf , "Idiaeresis" ); KEYVAL ( 0x00d0 , "ETH" ); KEYVAL ( 0x00d0 , "Eth" ); KEYVAL ( 0x00d1 , "Ntilde" ); KEYVAL ( 0x00d2 , "Ograve" ); KEYVAL ( 0x00d3 , "Oacute" ); KEYVAL ( 0x00d4 , "Ocircumflex" ); KEYVAL ( 0x00d5 , "Otilde" ); KEYVAL ( 0x00d6 , "Odiaeresis" ); KEYVAL ( 0x00d7 , "multiply" ); KEYVAL ( 0x00d8 , "Ooblique" ); KEYVAL ( 0x00d9 , "Ugrave" ); KEYVAL ( 0x00da , "Uacute" ); KEYVAL ( 0x00db , "Ucircumflex" ); KEYVAL ( 0x00dc , "Udiaeresis" ); KEYVAL ( 0x00dd , "Yacute" ); KEYVAL ( 0x00de , "THORN" ); KEYVAL ( 0x00de , "Thorn" ); KEYVAL ( 0x00df , "ssharp" ); KEYVAL ( 0x00e0 , "agrave" ); KEYVAL ( 0x00e1 , "aacute" ); KEYVAL ( 0x00e2 , "acircumflex" ); KEYVAL ( 0x00e3 , "atilde" ); KEYVAL ( 0x00e4 , "adiaeresis" ); KEYVAL ( 0x00e5 , "aring" ); KEYVAL ( 0x00e6 , "ae" ); KEYVAL ( 0x00e7 , "ccedilla" ); KEYVAL ( 0x00e8 , "egrave" ); KEYVAL ( 0x00e9 , "eacute" ); KEYVAL ( 0x00ea , "ecircumflex" ); KEYVAL ( 0x00eb , "ediaeresis" ); KEYVAL ( 0x00ec , "igrave" ); KEYVAL ( 0x00ed , "iacute" ); KEYVAL ( 0x00ee , "icircumflex" ); KEYVAL ( 0x00ef , "idiaeresis" ); KEYVAL ( 0x00f0 , "eth" ); KEYVAL ( 0x00f1 , "ntilde" ); KEYVAL ( 0x00f2 , "ograve" ); KEYVAL ( 0x00f3 , "oacute" ); KEYVAL ( 0x00f4 , "ocircumflex" ); KEYVAL ( 0x00f5 , "otilde" ); KEYVAL ( 0x00f6 , "odiaeresis" ); KEYVAL ( 0x00f7 , "division" ); KEYVAL ( 0x00f8 , "oslash" ); KEYVAL ( 0x00f9 , "ugrave" ); KEYVAL ( 0x00fa , "uacute" ); KEYVAL ( 0x00fb , "ucircumflex" ); KEYVAL ( 0x00fc , "udiaeresis" ); KEYVAL ( 0x00fd , "yacute" ); KEYVAL ( 0x00fe , "thorn" ); KEYVAL ( 0x00ff , "ydiaeresis" ); KEYVAL ( 0x01a1 , "Aogonek" ); KEYVAL ( 0x01a2 , "breve" ); KEYVAL ( 0x01a3 , "Lstroke" ); KEYVAL ( 0x01a5 , "Lcaron" ); KEYVAL ( 0x01a6 , "Sacute" ); KEYVAL ( 0x01a9 , "Scaron" ); KEYVAL ( 0x01aa , "Scedilla" ); KEYVAL ( 0x01ab , "Tcaron" ); KEYVAL ( 0x01ac , "Zacute" ); KEYVAL ( 0x01ae , "Zcaron" ); KEYVAL ( 0x01af , "Zabovedot" ); KEYVAL ( 0x01b1 , "aogonek" ); KEYVAL ( 0x01b2 , "ogonek" ); KEYVAL ( 0x01b3 , "lstroke" ); KEYVAL ( 0x01b5 , "lcaron" ); KEYVAL ( 0x01b6 , "sacute" ); KEYVAL ( 0x01b7 , "caron" ); KEYVAL ( 0x01b9 , "scaron" ); KEYVAL ( 0x01ba , "scedilla" ); KEYVAL ( 0x01bb , "tcaron" ); KEYVAL ( 0x01bc , "zacute" ); KEYVAL ( 0x01bd , "doubleacute" ); KEYVAL ( 0x01be , "zcaron" ); KEYVAL ( 0x01bf , "zabovedot" ); KEYVAL ( 0x01c0 , "Racute" ); KEYVAL ( 0x01c3 , "Abreve" ); KEYVAL ( 0x01c5 , "Lacute" ); KEYVAL ( 0x01c6 , "Cacute" ); KEYVAL ( 0x01c8 , "Ccaron" ); KEYVAL ( 0x01ca , "Eogonek" ); KEYVAL ( 0x01cc , "Ecaron" ); KEYVAL ( 0x01cf , "Dcaron" ); KEYVAL ( 0x01d0 , "Dstroke" ); KEYVAL ( 0x01d1 , "Nacute" ); KEYVAL ( 0x01d2 , "Ncaron" ); KEYVAL ( 0x01d5 , "Odoubleacute" ); KEYVAL ( 0x01d8 , "Rcaron" ); KEYVAL ( 0x01d9 , "Uring" ); KEYVAL ( 0x01db , "Udoubleacute" ); KEYVAL ( 0x01de , "Tcedilla" ); KEYVAL ( 0x01e0 , "racute" ); KEYVAL ( 0x01e3 , "abreve" ); KEYVAL ( 0x01e5 , "lacute" ); KEYVAL ( 0x01e6 , "cacute" ); KEYVAL ( 0x01e8 , "ccaron" ); KEYVAL ( 0x01ea , "eogonek" ); KEYVAL ( 0x01ec , "ecaron" ); KEYVAL ( 0x01ef , "dcaron" ); KEYVAL ( 0x01f0 , "dstroke" ); KEYVAL ( 0x01f1 , "nacute" ); KEYVAL ( 0x01f2 , "ncaron" ); KEYVAL ( 0x01f5 , "odoubleacute" ); KEYVAL ( 0x01f8 , "rcaron" ); KEYVAL ( 0x01f9 , "uring" ); KEYVAL ( 0x01fb , "udoubleacute" ); KEYVAL ( 0x01fe , "tcedilla" ); KEYVAL ( 0x01ff , "abovedot" ); KEYVAL ( 0x02a1 , "Hstroke" ); KEYVAL ( 0x02a6 , "Hcircumflex" ); KEYVAL ( 0x02a9 , "Iabovedot" ); KEYVAL ( 0x02ab , "Gbreve" ); KEYVAL ( 0x02ac , "Jcircumflex" ); KEYVAL ( 0x02b1 , "hstroke" ); KEYVAL ( 0x02b6 , "hcircumflex" ); KEYVAL ( 0x02b9 , "idotless" ); KEYVAL ( 0x02bb , "gbreve" ); KEYVAL ( 0x02bc , "jcircumflex" ); KEYVAL ( 0x02c5 , "Cabovedot" ); KEYVAL ( 0x02c6 , "Ccircumflex" ); KEYVAL ( 0x02d5 , "Gabovedot" ); KEYVAL ( 0x02d8 , "Gcircumflex" ); KEYVAL ( 0x02dd , "Ubreve" ); KEYVAL ( 0x02de , "Scircumflex" ); KEYVAL ( 0x02e5 , "cabovedot" ); KEYVAL ( 0x02e6 , "ccircumflex" ); KEYVAL ( 0x02f5 , "gabovedot" ); KEYVAL ( 0x02f8 , "gcircumflex" ); KEYVAL ( 0x02fd , "ubreve" ); KEYVAL ( 0x02fe , "scircumflex" ); KEYVAL ( 0x03a2 , "kappa" ); KEYVAL ( 0x03a2 , "kra" ); KEYVAL ( 0x03a3 , "Rcedilla" ); KEYVAL ( 0x03a5 , "Itilde" ); KEYVAL ( 0x03a6 , "Lcedilla" ); KEYVAL ( 0x03aa , "Emacron" ); KEYVAL ( 0x03ab , "Gcedilla" ); KEYVAL ( 0x03ac , "Tslash" ); KEYVAL ( 0x03b3 , "rcedilla" ); KEYVAL ( 0x03b5 , "itilde" ); KEYVAL ( 0x03b6 , "lcedilla" ); KEYVAL ( 0x03ba , "emacron" ); KEYVAL ( 0x03bb , "gcedilla" ); KEYVAL ( 0x03bc , "tslash" ); KEYVAL ( 0x03bd , "ENG" ); KEYVAL ( 0x03bf , "eng" ); KEYVAL ( 0x03c0 , "Amacron" ); KEYVAL ( 0x03c7 , "Iogonek" ); KEYVAL ( 0x03cc , "Eabovedot" ); KEYVAL ( 0x03cf , "Imacron" ); KEYVAL ( 0x03d1 , "Ncedilla" ); KEYVAL ( 0x03d2 , "Omacron" ); KEYVAL ( 0x03d3 , "Kcedilla" ); KEYVAL ( 0x03d9 , "Uogonek" ); KEYVAL ( 0x03dd , "Utilde" ); KEYVAL ( 0x03de , "Umacron" ); KEYVAL ( 0x03e0 , "amacron" ); KEYVAL ( 0x03e7 , "iogonek" ); KEYVAL ( 0x03ec , "eabovedot" ); KEYVAL ( 0x03ef , "imacron" ); KEYVAL ( 0x03f1 , "ncedilla" ); KEYVAL ( 0x03f2 , "omacron" ); KEYVAL ( 0x03f3 , "kcedilla" ); KEYVAL ( 0x03f9 , "uogonek" ); KEYVAL ( 0x03fd , "utilde" ); KEYVAL ( 0x03fe , "umacron" ); KEYVAL ( 0x047e , "overline" ); KEYVAL ( 0x04a1 , "kana_fullstop" ); KEYVAL ( 0x04a2 , "kana_openingbracket" ); KEYVAL ( 0x04a3 , "kana_closingbracket" ); KEYVAL ( 0x04a4 , "kana_comma" ); KEYVAL ( 0x04a5 , "kana_conjunctive" ); KEYVAL ( 0x04a5 , "kana_middledot" ); KEYVAL ( 0x04a6 , "kana_WO" ); KEYVAL ( 0x04a7 , "kana_a" ); KEYVAL ( 0x04a8 , "kana_i" ); KEYVAL ( 0x04a9 , "kana_u" ); KEYVAL ( 0x04aa , "kana_e" ); KEYVAL ( 0x04ab , "kana_o" ); KEYVAL ( 0x04ac , "kana_ya" ); KEYVAL ( 0x04ad , "kana_yu" ); KEYVAL ( 0x04ae , "kana_yo" ); KEYVAL ( 0x04af , "kana_tsu" ); KEYVAL ( 0x04af , "kana_tu" ); KEYVAL ( 0x04b0 , "prolongedsound" ); KEYVAL ( 0x04b1 , "kana_A" ); KEYVAL ( 0x04b2 , "kana_I" ); KEYVAL ( 0x04b3 , "kana_U" ); KEYVAL ( 0x04b4 , "kana_E" ); KEYVAL ( 0x04b5 , "kana_O" ); KEYVAL ( 0x04b6 , "kana_KA" ); KEYVAL ( 0x04b7 , "kana_KI" ); KEYVAL ( 0x04b8 , "kana_KU" ); KEYVAL ( 0x04b9 , "kana_KE" ); KEYVAL ( 0x04ba , "kana_KO" ); KEYVAL ( 0x04bb , "kana_SA" ); KEYVAL ( 0x04bc , "kana_SHI" ); KEYVAL ( 0x04bd , "kana_SU" ); KEYVAL ( 0x04be , "kana_SE" ); KEYVAL ( 0x04bf , "kana_SO" ); KEYVAL ( 0x04c0 , "kana_TA" ); KEYVAL ( 0x04c1 , "kana_CHI" ); KEYVAL ( 0x04c1 , "kana_TI" ); KEYVAL ( 0x04c2 , "kana_TSU" ); KEYVAL ( 0x04c2 , "kana_TU" ); KEYVAL ( 0x04c3 , "kana_TE" ); KEYVAL ( 0x04c4 , "kana_TO" ); KEYVAL ( 0x04c5 , "kana_NA" ); KEYVAL ( 0x04c6 , "kana_NI" ); KEYVAL ( 0x04c7 , "kana_NU" ); KEYVAL ( 0x04c8 , "kana_NE" ); KEYVAL ( 0x04c9 , "kana_NO" ); KEYVAL ( 0x04ca , "kana_HA" ); KEYVAL ( 0x04cb , "kana_HI" ); KEYVAL ( 0x04cc , "kana_FU" ); KEYVAL ( 0x04cc , "kana_HU" ); KEYVAL ( 0x04cd , "kana_HE" ); KEYVAL ( 0x04ce , "kana_HO" ); KEYVAL ( 0x04cf , "kana_MA" ); KEYVAL ( 0x04d0 , "kana_MI" ); KEYVAL ( 0x04d1 , "kana_MU" ); KEYVAL ( 0x04d2 , "kana_ME" ); KEYVAL ( 0x04d3 , "kana_MO" ); KEYVAL ( 0x04d4 , "kana_YA" ); KEYVAL ( 0x04d5 , "kana_YU" ); KEYVAL ( 0x04d6 , "kana_YO" ); KEYVAL ( 0x04d7 , "kana_RA" ); KEYVAL ( 0x04d8 , "kana_RI" ); KEYVAL ( 0x04d9 , "kana_RU" ); KEYVAL ( 0x04da , "kana_RE" ); KEYVAL ( 0x04db , "kana_RO" ); KEYVAL ( 0x04dc , "kana_WA" ); KEYVAL ( 0x04dd , "kana_N" ); KEYVAL ( 0x04de , "voicedsound" ); KEYVAL ( 0x04df , "semivoicedsound" ); KEYVAL ( 0x05ac , "Arabic_comma" ); KEYVAL ( 0x05bb , "Arabic_semicolon" ); KEYVAL ( 0x05bf , "Arabic_question_mark" ); KEYVAL ( 0x05c1 , "Arabic_hamza" ); KEYVAL ( 0x05c2 , "Arabic_maddaonalef" ); KEYVAL ( 0x05c3 , "Arabic_hamzaonalef" ); KEYVAL ( 0x05c4 , "Arabic_hamzaonwaw" ); KEYVAL ( 0x05c5 , "Arabic_hamzaunderalef" ); KEYVAL ( 0x05c6 , "Arabic_hamzaonyeh" ); KEYVAL ( 0x05c7 , "Arabic_alef" ); KEYVAL ( 0x05c8 , "Arabic_beh" ); KEYVAL ( 0x05c9 , "Arabic_tehmarbuta" ); KEYVAL ( 0x05ca , "Arabic_teh" ); KEYVAL ( 0x05cb , "Arabic_theh" ); KEYVAL ( 0x05cc , "Arabic_jeem" ); KEYVAL ( 0x05cd , "Arabic_hah" ); KEYVAL ( 0x05ce , "Arabic_khah" ); KEYVAL ( 0x05cf , "Arabic_dal" ); KEYVAL ( 0x05d0 , "Arabic_thal" ); KEYVAL ( 0x05d1 , "Arabic_ra" ); KEYVAL ( 0x05d2 , "Arabic_zain" ); KEYVAL ( 0x05d3 , "Arabic_seen" ); KEYVAL ( 0x05d4 , "Arabic_sheen" ); KEYVAL ( 0x05d5 , "Arabic_sad" ); KEYVAL ( 0x05d6 , "Arabic_dad" ); KEYVAL ( 0x05d7 , "Arabic_tah" ); KEYVAL ( 0x05d8 , "Arabic_zah" ); KEYVAL ( 0x05d9 , "Arabic_ain" ); KEYVAL ( 0x05da , "Arabic_ghain" ); KEYVAL ( 0x05e0 , "Arabic_tatweel" ); KEYVAL ( 0x05e1 , "Arabic_feh" ); KEYVAL ( 0x05e2 , "Arabic_qaf" ); KEYVAL ( 0x05e3 , "Arabic_kaf" ); KEYVAL ( 0x05e4 , "Arabic_lam" ); KEYVAL ( 0x05e5 , "Arabic_meem" ); KEYVAL ( 0x05e6 , "Arabic_noon" ); KEYVAL ( 0x05e7 , "Arabic_ha" ); KEYVAL ( 0x05e7 , "Arabic_heh" ); KEYVAL ( 0x05e8 , "Arabic_waw" ); KEYVAL ( 0x05e9 , "Arabic_alefmaksura" ); KEYVAL ( 0x05ea , "Arabic_yeh" ); KEYVAL ( 0x05eb , "Arabic_fathatan" ); KEYVAL ( 0x05ec , "Arabic_dammatan" ); KEYVAL ( 0x05ed , "Arabic_kasratan" ); KEYVAL ( 0x05ee , "Arabic_fatha" ); KEYVAL ( 0x05ef , "Arabic_damma" ); KEYVAL ( 0x05f0 , "Arabic_kasra" ); KEYVAL ( 0x05f1 , "Arabic_shadda" ); KEYVAL ( 0x05f2 , "Arabic_sukun" ); KEYVAL ( 0x06a1 , "Serbian_dje" ); KEYVAL ( 0x06a2 , "Macedonia_gje" ); KEYVAL ( 0x06a3 , "Cyrillic_io" ); KEYVAL ( 0x06a4 , "Ukrainian_ie" ); KEYVAL ( 0x06a4 , "Ukranian_je" ); KEYVAL ( 0x06a5 , "Macedonia_dse" ); KEYVAL ( 0x06a6 , "Ukrainian_i" ); KEYVAL ( 0x06a6 , "Ukranian_i" ); KEYVAL ( 0x06a7 , "Ukrainian_yi" ); KEYVAL ( 0x06a7 , "Ukranian_yi" ); KEYVAL ( 0x06a8 , "Cyrillic_je" ); KEYVAL ( 0x06a8 , "Serbian_je" ); KEYVAL ( 0x06a9 , "Cyrillic_lje" ); KEYVAL ( 0x06a9 , "Serbian_lje" ); KEYVAL ( 0x06aa , "Cyrillic_nje" ); KEYVAL ( 0x06aa , "Serbian_nje" ); KEYVAL ( 0x06ab , "Serbian_tshe" ); KEYVAL ( 0x06ac , "Macedonia_kje" ); KEYVAL ( 0x06ad , "Ukrainian_ghe_with_upturn" ); KEYVAL ( 0x06ae , "Byelorussian_shortu" ); KEYVAL ( 0x06af , "Cyrillic_dzhe" ); KEYVAL ( 0x06af , "Serbian_dze" ); KEYVAL ( 0x06b0 , "numerosign" ); KEYVAL ( 0x06b1 , "Serbian_DJE" ); KEYVAL ( 0x06b2 , "Macedonia_GJE" ); KEYVAL ( 0x06b3 , "Cyrillic_IO" ); KEYVAL ( 0x06b4 , "Ukrainian_IE" ); KEYVAL ( 0x06b4 , "Ukranian_JE" ); KEYVAL ( 0x06b5 , "Macedonia_DSE" ); KEYVAL ( 0x06b6 , "Ukrainian_I" ); KEYVAL ( 0x06b6 , "Ukranian_I" ); KEYVAL ( 0x06b7 , "Ukrainian_YI" ); KEYVAL ( 0x06b7 , "Ukranian_YI" ); KEYVAL ( 0x06b8 , "Cyrillic_JE" ); KEYVAL ( 0x06b8 , "Serbian_JE" ); KEYVAL ( 0x06b9 , "Cyrillic_LJE" ); KEYVAL ( 0x06b9 , "Serbian_LJE" ); KEYVAL ( 0x06ba , "Cyrillic_NJE" ); KEYVAL ( 0x06ba , "Serbian_NJE" ); KEYVAL ( 0x06bb , "Serbian_TSHE" ); KEYVAL ( 0x06bc , "Macedonia_KJE" ); KEYVAL ( 0x06bd , "Ukrainian_GHE_WITH_UPTURN" ); KEYVAL ( 0x06be , "Byelorussian_SHORTU" ); KEYVAL ( 0x06bf , "Cyrillic_DZHE" ); KEYVAL ( 0x06bf , "Serbian_DZE" ); KEYVAL ( 0x06c0 , "Cyrillic_yu" ); KEYVAL ( 0x06c1 , "Cyrillic_a" ); KEYVAL ( 0x06c2 , "Cyrillic_be" ); KEYVAL ( 0x06c3 , "Cyrillic_tse" ); KEYVAL ( 0x06c4 , "Cyrillic_de" ); KEYVAL ( 0x06c5 , "Cyrillic_ie" ); KEYVAL ( 0x06c6 , "Cyrillic_ef" ); KEYVAL ( 0x06c7 , "Cyrillic_ghe" ); KEYVAL ( 0x06c8 , "Cyrillic_ha" ); KEYVAL ( 0x06c9 , "Cyrillic_i" ); KEYVAL ( 0x06ca , "Cyrillic_shorti" ); KEYVAL ( 0x06cb , "Cyrillic_ka" ); KEYVAL ( 0x06cc , "Cyrillic_el" ); KEYVAL ( 0x06cd , "Cyrillic_em" ); KEYVAL ( 0x06ce , "Cyrillic_en" ); KEYVAL ( 0x06cf , "Cyrillic_o" ); KEYVAL ( 0x06d0 , "Cyrillic_pe" ); KEYVAL ( 0x06d1 , "Cyrillic_ya" ); KEYVAL ( 0x06d2 , "Cyrillic_er" ); KEYVAL ( 0x06d3 , "Cyrillic_es" ); KEYVAL ( 0x06d4 , "Cyrillic_te" ); KEYVAL ( 0x06d5 , "Cyrillic_u" ); KEYVAL ( 0x06d6 , "Cyrillic_zhe" ); KEYVAL ( 0x06d7 , "Cyrillic_ve" ); KEYVAL ( 0x06d8 , "Cyrillic_softsign" ); KEYVAL ( 0x06d9 , "Cyrillic_yeru" ); KEYVAL ( 0x06da , "Cyrillic_ze" ); KEYVAL ( 0x06db , "Cyrillic_sha" ); KEYVAL ( 0x06dc , "Cyrillic_e" ); KEYVAL ( 0x06dd , "Cyrillic_shcha" ); KEYVAL ( 0x06de , "Cyrillic_che" ); KEYVAL ( 0x06df , "Cyrillic_hardsign" ); KEYVAL ( 0x06e0 , "Cyrillic_YU" ); KEYVAL ( 0x06e1 , "Cyrillic_A" ); KEYVAL ( 0x06e2 , "Cyrillic_BE" ); KEYVAL ( 0x06e3 , "Cyrillic_TSE" ); KEYVAL ( 0x06e4 , "Cyrillic_DE" ); KEYVAL ( 0x06e5 , "Cyrillic_IE" ); KEYVAL ( 0x06e6 , "Cyrillic_EF" ); KEYVAL ( 0x06e7 , "Cyrillic_GHE" ); KEYVAL ( 0x06e8 , "Cyrillic_HA" ); KEYVAL ( 0x06e9 , "Cyrillic_I" ); KEYVAL ( 0x06ea , "Cyrillic_SHORTI" ); KEYVAL ( 0x06eb , "Cyrillic_KA" ); KEYVAL ( 0x06ec , "Cyrillic_EL" ); KEYVAL ( 0x06ed , "Cyrillic_EM" ); KEYVAL ( 0x06ee , "Cyrillic_EN" ); KEYVAL ( 0x06ef , "Cyrillic_O" ); KEYVAL ( 0x06f0 , "Cyrillic_PE" ); KEYVAL ( 0x06f1 , "Cyrillic_YA" ); KEYVAL ( 0x06f2 , "Cyrillic_ER" ); KEYVAL ( 0x06f3 , "Cyrillic_ES" ); KEYVAL ( 0x06f4 , "Cyrillic_TE" ); KEYVAL ( 0x06f5 , "Cyrillic_U" ); KEYVAL ( 0x06f6 , "Cyrillic_ZHE" ); KEYVAL ( 0x06f7 , "Cyrillic_VE" ); KEYVAL ( 0x06f8 , "Cyrillic_SOFTSIGN" ); KEYVAL ( 0x06f9 , "Cyrillic_YERU" ); KEYVAL ( 0x06fa , "Cyrillic_ZE" ); KEYVAL ( 0x06fb , "Cyrillic_SHA" ); KEYVAL ( 0x06fc , "Cyrillic_E" ); KEYVAL ( 0x06fd , "Cyrillic_SHCHA" ); KEYVAL ( 0x06fe , "Cyrillic_CHE" ); KEYVAL ( 0x06ff , "Cyrillic_HARDSIGN" ); KEYVAL ( 0x07a1 , "Greek_ALPHAaccent" ); KEYVAL ( 0x07a2 , "Greek_EPSILONaccent" ); KEYVAL ( 0x07a3 , "Greek_ETAaccent" ); KEYVAL ( 0x07a4 , "Greek_IOTAaccent" ); KEYVAL ( 0x07a5 , "Greek_IOTAdieresis" ); KEYVAL ( 0x07a7 , "Greek_OMICRONaccent" ); KEYVAL ( 0x07a8 , "Greek_UPSILONaccent" ); KEYVAL ( 0x07a9 , "Greek_UPSILONdieresis" ); KEYVAL ( 0x07ab , "Greek_OMEGAaccent" ); KEYVAL ( 0x07ae , "Greek_accentdieresis" ); KEYVAL ( 0x07af , "Greek_horizbar" ); KEYVAL ( 0x07b1 , "Greek_alphaaccent" ); KEYVAL ( 0x07b2 , "Greek_epsilonaccent" ); KEYVAL ( 0x07b3 , "Greek_etaaccent" ); KEYVAL ( 0x07b4 , "Greek_iotaaccent" ); KEYVAL ( 0x07b5 , "Greek_iotadieresis" ); KEYVAL ( 0x07b6 , "Greek_iotaaccentdieresis" ); KEYVAL ( 0x07b7 , "Greek_omicronaccent" ); KEYVAL ( 0x07b8 , "Greek_upsilonaccent" ); KEYVAL ( 0x07b9 , "Greek_upsilondieresis" ); KEYVAL ( 0x07ba , "Greek_upsilonaccentdieresis" ); KEYVAL ( 0x07bb , "Greek_omegaaccent" ); KEYVAL ( 0x07c1 , "Greek_ALPHA" ); KEYVAL ( 0x07c2 , "Greek_BETA" ); KEYVAL ( 0x07c3 , "Greek_GAMMA" ); KEYVAL ( 0x07c4 , "Greek_DELTA" ); KEYVAL ( 0x07c5 , "Greek_EPSILON" ); KEYVAL ( 0x07c6 , "Greek_ZETA" ); KEYVAL ( 0x07c7 , "Greek_ETA" ); KEYVAL ( 0x07c8 , "Greek_THETA" ); KEYVAL ( 0x07c9 , "Greek_IOTA" ); KEYVAL ( 0x07ca , "Greek_KAPPA" ); KEYVAL ( 0x07cb , "Greek_LAMBDA" ); KEYVAL ( 0x07cb , "Greek_LAMDA" ); KEYVAL ( 0x07cc , "Greek_MU" ); KEYVAL ( 0x07cd , "Greek_NU" ); KEYVAL ( 0x07ce , "Greek_XI" ); KEYVAL ( 0x07cf , "Greek_OMICRON" ); KEYVAL ( 0x07d0 , "Greek_PI" ); KEYVAL ( 0x07d1 , "Greek_RHO" ); KEYVAL ( 0x07d2 , "Greek_SIGMA" ); KEYVAL ( 0x07d4 , "Greek_TAU" ); KEYVAL ( 0x07d5 , "Greek_UPSILON" ); KEYVAL ( 0x07d6 , "Greek_PHI" ); KEYVAL ( 0x07d7 , "Greek_CHI" ); KEYVAL ( 0x07d8 , "Greek_PSI" ); KEYVAL ( 0x07d9 , "Greek_OMEGA" ); KEYVAL ( 0x07e1 , "Greek_alpha" ); KEYVAL ( 0x07e2 , "Greek_beta" ); KEYVAL ( 0x07e3 , "Greek_gamma" ); KEYVAL ( 0x07e4 , "Greek_delta" ); KEYVAL ( 0x07e5 , "Greek_epsilon" ); KEYVAL ( 0x07e6 , "Greek_zeta" ); KEYVAL ( 0x07e7 , "Greek_eta" ); KEYVAL ( 0x07e8 , "Greek_theta" ); KEYVAL ( 0x07e9 , "Greek_iota" ); KEYVAL ( 0x07ea , "Greek_kappa" ); KEYVAL ( 0x07eb , "Greek_lambda" ); KEYVAL ( 0x07eb , "Greek_lamda" ); KEYVAL ( 0x07ec , "Greek_mu" ); KEYVAL ( 0x07ed , "Greek_nu" ); KEYVAL ( 0x07ee , "Greek_xi" ); KEYVAL ( 0x07ef , "Greek_omicron" ); KEYVAL ( 0x07f0 , "Greek_pi" ); KEYVAL ( 0x07f1 , "Greek_rho" ); KEYVAL ( 0x07f2 , "Greek_sigma" ); KEYVAL ( 0x07f3 , "Greek_finalsmallsigma" ); KEYVAL ( 0x07f4 , "Greek_tau" ); KEYVAL ( 0x07f5 , "Greek_upsilon" ); KEYVAL ( 0x07f6 , "Greek_phi" ); KEYVAL ( 0x07f7 , "Greek_chi" ); KEYVAL ( 0x07f8 , "Greek_psi" ); KEYVAL ( 0x07f9 , "Greek_omega" ); KEYVAL ( 0x08a1 , "leftradical" ); KEYVAL ( 0x08a2 , "topleftradical" ); KEYVAL ( 0x08a3 , "horizconnector" ); KEYVAL ( 0x08a4 , "topintegral" ); KEYVAL ( 0x08a5 , "botintegral" ); KEYVAL ( 0x08a6 , "vertconnector" ); KEYVAL ( 0x08a7 , "topleftsqbracket" ); KEYVAL ( 0x08a8 , "botleftsqbracket" ); KEYVAL ( 0x08a9 , "toprightsqbracket" ); KEYVAL ( 0x08aa , "botrightsqbracket" ); KEYVAL ( 0x08ab , "topleftparens" ); KEYVAL ( 0x08ac , "botleftparens" ); KEYVAL ( 0x08ad , "toprightparens" ); KEYVAL ( 0x08ae , "botrightparens" ); KEYVAL ( 0x08af , "leftmiddlecurlybrace" ); KEYVAL ( 0x08b0 , "rightmiddlecurlybrace" ); KEYVAL ( 0x08b1 , "topleftsummation" ); KEYVAL ( 0x08b2 , "botleftsummation" ); KEYVAL ( 0x08b3 , "topvertsummationconnector" ); KEYVAL ( 0x08b4 , "botvertsummationconnector" ); KEYVAL ( 0x08b5 , "toprightsummation" ); KEYVAL ( 0x08b6 , "botrightsummation" ); KEYVAL ( 0x08b7 , "rightmiddlesummation" ); KEYVAL ( 0x08bc , "lessthanequal" ); KEYVAL ( 0x08bd , "notequal" ); KEYVAL ( 0x08be , "greaterthanequal" ); KEYVAL ( 0x08bf , "integral" ); KEYVAL ( 0x08c0 , "therefore" ); KEYVAL ( 0x08c1 , "variation" ); KEYVAL ( 0x08c2 , "infinity" ); KEYVAL ( 0x08c5 , "nabla" ); KEYVAL ( 0x08c8 , "approximate" ); KEYVAL ( 0x08c9 , "similarequal" ); KEYVAL ( 0x08cd , "ifonlyif" ); KEYVAL ( 0x08ce , "implies" ); KEYVAL ( 0x08cf , "identical" ); KEYVAL ( 0x08d6 , "radical" ); KEYVAL ( 0x08da , "includedin" ); KEYVAL ( 0x08db , "includes" ); KEYVAL ( 0x08dc , "intersection" ); KEYVAL ( 0x08dd , "union" ); KEYVAL ( 0x08de , "logicaland" ); KEYVAL ( 0x08df , "logicalor" ); KEYVAL ( 0x08ef , "partialderivative" ); KEYVAL ( 0x08f6 , "function" ); KEYVAL ( 0x08fb , "leftarrow" ); KEYVAL ( 0x08fc , "uparrow" ); KEYVAL ( 0x08fd , "rightarrow" ); KEYVAL ( 0x08fe , "downarrow" ); KEYVAL ( 0x09df , "blank" ); KEYVAL ( 0x09e0 , "soliddiamond" ); KEYVAL ( 0x09e1 , "checkerboard" ); KEYVAL ( 0x09e2 , "ht" ); KEYVAL ( 0x09e3 , "ff" ); KEYVAL ( 0x09e4 , "cr" ); KEYVAL ( 0x09e5 , "lf" ); KEYVAL ( 0x09e8 , "nl" ); KEYVAL ( 0x09e9 , "vt" ); KEYVAL ( 0x09ea , "lowrightcorner" ); KEYVAL ( 0x09eb , "uprightcorner" ); KEYVAL ( 0x09ec , "upleftcorner" ); KEYVAL ( 0x09ed , "lowleftcorner" ); KEYVAL ( 0x09ee , "crossinglines" ); KEYVAL ( 0x09ef , "horizlinescan1" ); KEYVAL ( 0x09f0 , "horizlinescan3" ); KEYVAL ( 0x09f1 , "horizlinescan5" ); KEYVAL ( 0x09f2 , "horizlinescan7" ); KEYVAL ( 0x09f3 , "horizlinescan9" ); KEYVAL ( 0x09f4 , "leftt" ); KEYVAL ( 0x09f5 , "rightt" ); KEYVAL ( 0x09f6 , "bott" ); KEYVAL ( 0x09f7 , "topt" ); KEYVAL ( 0x09f8 , "vertbar" ); KEYVAL ( 0x0aa1 , "emspace" ); KEYVAL ( 0x0aa2 , "enspace" ); KEYVAL ( 0x0aa3 , "em3space" ); KEYVAL ( 0x0aa4 , "em4space" ); KEYVAL ( 0x0aa5 , "digitspace" ); KEYVAL ( 0x0aa6 , "punctspace" ); KEYVAL ( 0x0aa7 , "thinspace" ); KEYVAL ( 0x0aa8 , "hairspace" ); KEYVAL ( 0x0aa9 , "emdash" ); KEYVAL ( 0x0aaa , "endash" ); KEYVAL ( 0x0aac , "signifblank" ); KEYVAL ( 0x0aae , "ellipsis" ); KEYVAL ( 0x0aaf , "doubbaselinedot" ); KEYVAL ( 0x0ab0 , "onethird" ); KEYVAL ( 0x0ab1 , "twothirds" ); KEYVAL ( 0x0ab2 , "onefifth" ); KEYVAL ( 0x0ab3 , "twofifths" ); KEYVAL ( 0x0ab4 , "threefifths" ); KEYVAL ( 0x0ab5 , "fourfifths" ); KEYVAL ( 0x0ab6 , "onesixth" ); KEYVAL ( 0x0ab7 , "fivesixths" ); KEYVAL ( 0x0ab8 , "careof" ); KEYVAL ( 0x0abb , "figdash" ); KEYVAL ( 0x0abc , "leftanglebracket" ); KEYVAL ( 0x0abd , "decimalpoint" ); KEYVAL ( 0x0abe , "rightanglebracket" ); KEYVAL ( 0x0abf , "marker" ); KEYVAL ( 0x0ac3 , "oneeighth" ); KEYVAL ( 0x0ac4 , "threeeighths" ); KEYVAL ( 0x0ac5 , "fiveeighths" ); KEYVAL ( 0x0ac6 , "seveneighths" ); KEYVAL ( 0x0ac9 , "trademark" ); KEYVAL ( 0x0aca , "signaturemark" ); KEYVAL ( 0x0acb , "trademarkincircle" ); KEYVAL ( 0x0acc , "leftopentriangle" ); KEYVAL ( 0x0acd , "rightopentriangle" ); KEYVAL ( 0x0ace , "emopencircle" ); KEYVAL ( 0x0acf , "emopenrectangle" ); KEYVAL ( 0x0ad0 , "leftsinglequotemark" ); KEYVAL ( 0x0ad1 , "rightsinglequotemark" ); KEYVAL ( 0x0ad2 , "leftdoublequotemark" ); KEYVAL ( 0x0ad3 , "rightdoublequotemark" ); KEYVAL ( 0x0ad4 , "prescription" ); KEYVAL ( 0x0ad6 , "minutes" ); KEYVAL ( 0x0ad7 , "seconds" ); KEYVAL ( 0x0ad9 , "latincross" ); KEYVAL ( 0x0ada , "hexagram" ); KEYVAL ( 0x0adb , "filledrectbullet" ); KEYVAL ( 0x0adc , "filledlefttribullet" ); KEYVAL ( 0x0add , "filledrighttribullet" ); KEYVAL ( 0x0ade , "emfilledcircle" ); KEYVAL ( 0x0adf , "emfilledrect" ); KEYVAL ( 0x0ae0 , "enopencircbullet" ); KEYVAL ( 0x0ae1 , "enopensquarebullet" ); KEYVAL ( 0x0ae2 , "openrectbullet" ); KEYVAL ( 0x0ae3 , "opentribulletup" ); KEYVAL ( 0x0ae4 , "opentribulletdown" ); KEYVAL ( 0x0ae5 , "openstar" ); KEYVAL ( 0x0ae6 , "enfilledcircbullet" ); KEYVAL ( 0x0ae7 , "enfilledsqbullet" ); KEYVAL ( 0x0ae8 , "filledtribulletup" ); KEYVAL ( 0x0ae9 , "filledtribulletdown" ); KEYVAL ( 0x0aea , "leftpointer" ); KEYVAL ( 0x0aeb , "rightpointer" ); KEYVAL ( 0x0aec , "club" ); KEYVAL ( 0x0aed , "diamond" ); KEYVAL ( 0x0aee , "heart" ); KEYVAL ( 0x0af0 , "maltesecross" ); KEYVAL ( 0x0af1 , "dagger" ); KEYVAL ( 0x0af2 , "doubledagger" ); KEYVAL ( 0x0af3 , "checkmark" ); KEYVAL ( 0x0af4 , "ballotcross" ); KEYVAL ( 0x0af5 , "musicalsharp" ); KEYVAL ( 0x0af6 , "musicalflat" ); KEYVAL ( 0x0af7 , "malesymbol" ); KEYVAL ( 0x0af8 , "femalesymbol" ); KEYVAL ( 0x0af9 , "telephone" ); KEYVAL ( 0x0afa , "telephonerecorder" ); KEYVAL ( 0x0afb , "phonographcopyright" ); KEYVAL ( 0x0afc , "caret" ); KEYVAL ( 0x0afd , "singlelowquotemark" ); KEYVAL ( 0x0afe , "doublelowquotemark" ); KEYVAL ( 0x0aff , "cursor" ); KEYVAL ( 0x0ba3 , "leftcaret" ); KEYVAL ( 0x0ba6 , "rightcaret" ); KEYVAL ( 0x0ba8 , "downcaret" ); KEYVAL ( 0x0ba9 , "upcaret" ); KEYVAL ( 0x0bc0 , "overbar" ); KEYVAL ( 0x0bc2 , "downtack" ); KEYVAL ( 0x0bc3 , "upshoe" ); KEYVAL ( 0x0bc4 , "downstile" ); KEYVAL ( 0x0bc6 , "underbar" ); KEYVAL ( 0x0bca , "jot" ); KEYVAL ( 0x0bcc , "quad" ); KEYVAL ( 0x0bce , "uptack" ); KEYVAL ( 0x0bcf , "circle" ); KEYVAL ( 0x0bd3 , "upstile" ); KEYVAL ( 0x0bd6 , "downshoe" ); KEYVAL ( 0x0bd8 , "rightshoe" ); KEYVAL ( 0x0bda , "leftshoe" ); KEYVAL ( 0x0bdc , "lefttack" ); KEYVAL ( 0x0bfc , "righttack" ); KEYVAL ( 0x0cdf , "hebrew_doublelowline" ); KEYVAL ( 0x0ce0 , "hebrew_aleph" ); KEYVAL ( 0x0ce1 , "hebrew_bet" ); KEYVAL ( 0x0ce1 , "hebrew_beth" ); KEYVAL ( 0x0ce2 , "hebrew_gimel" ); KEYVAL ( 0x0ce2 , "hebrew_gimmel" ); KEYVAL ( 0x0ce3 , "hebrew_dalet" ); KEYVAL ( 0x0ce3 , "hebrew_daleth" ); KEYVAL ( 0x0ce4 , "hebrew_he" ); KEYVAL ( 0x0ce5 , "hebrew_waw" ); KEYVAL ( 0x0ce6 , "hebrew_zain" ); KEYVAL ( 0x0ce6 , "hebrew_zayin" ); KEYVAL ( 0x0ce7 , "hebrew_chet" ); KEYVAL ( 0x0ce7 , "hebrew_het" ); KEYVAL ( 0x0ce8 , "hebrew_tet" ); KEYVAL ( 0x0ce8 , "hebrew_teth" ); KEYVAL ( 0x0ce9 , "hebrew_yod" ); KEYVAL ( 0x0cea , "hebrew_finalkaph" ); KEYVAL ( 0x0ceb , "hebrew_kaph" ); KEYVAL ( 0x0cec , "hebrew_lamed" ); KEYVAL ( 0x0ced , "hebrew_finalmem" ); KEYVAL ( 0x0cee , "hebrew_mem" ); KEYVAL ( 0x0cef , "hebrew_finalnun" ); KEYVAL ( 0x0cf0 , "hebrew_nun" ); KEYVAL ( 0x0cf1 , "hebrew_samech" ); KEYVAL ( 0x0cf1 , "hebrew_samekh" ); KEYVAL ( 0x0cf2 , "hebrew_ayin" ); KEYVAL ( 0x0cf3 , "hebrew_finalpe" ); KEYVAL ( 0x0cf4 , "hebrew_pe" ); KEYVAL ( 0x0cf5 , "hebrew_finalzade" ); KEYVAL ( 0x0cf5 , "hebrew_finalzadi" ); KEYVAL ( 0x0cf6 , "hebrew_zade" ); KEYVAL ( 0x0cf6 , "hebrew_zadi" ); KEYVAL ( 0x0cf7 , "hebrew_kuf" ); KEYVAL ( 0x0cf7 , "hebrew_qoph" ); KEYVAL ( 0x0cf8 , "hebrew_resh" ); KEYVAL ( 0x0cf9 , "hebrew_shin" ); KEYVAL ( 0x0cfa , "hebrew_taf" ); KEYVAL ( 0x0cfa , "hebrew_taw" ); KEYVAL ( 0x0da1 , "Thai_kokai" ); KEYVAL ( 0x0da2 , "Thai_khokhai" ); KEYVAL ( 0x0da3 , "Thai_khokhuat" ); KEYVAL ( 0x0da4 , "Thai_khokhwai" ); KEYVAL ( 0x0da5 , "Thai_khokhon" ); KEYVAL ( 0x0da6 , "Thai_khorakhang" ); KEYVAL ( 0x0da7 , "Thai_ngongu" ); KEYVAL ( 0x0da8 , "Thai_chochan" ); KEYVAL ( 0x0da9 , "Thai_choching" ); KEYVAL ( 0x0daa , "Thai_chochang" ); KEYVAL ( 0x0dab , "Thai_soso" ); KEYVAL ( 0x0dac , "Thai_chochoe" ); KEYVAL ( 0x0dad , "Thai_yoying" ); KEYVAL ( 0x0dae , "Thai_dochada" ); KEYVAL ( 0x0daf , "Thai_topatak" ); KEYVAL ( 0x0db0 , "Thai_thothan" ); KEYVAL ( 0x0db1 , "Thai_thonangmontho" ); KEYVAL ( 0x0db2 , "Thai_thophuthao" ); KEYVAL ( 0x0db3 , "Thai_nonen" ); KEYVAL ( 0x0db4 , "Thai_dodek" ); KEYVAL ( 0x0db5 , "Thai_totao" ); KEYVAL ( 0x0db6 , "Thai_thothung" ); KEYVAL ( 0x0db7 , "Thai_thothahan" ); KEYVAL ( 0x0db8 , "Thai_thothong" ); KEYVAL ( 0x0db9 , "Thai_nonu" ); KEYVAL ( 0x0dba , "Thai_bobaimai" ); KEYVAL ( 0x0dbb , "Thai_popla" ); KEYVAL ( 0x0dbc , "Thai_phophung" ); KEYVAL ( 0x0dbd , "Thai_fofa" ); KEYVAL ( 0x0dbe , "Thai_phophan" ); KEYVAL ( 0x0dbf , "Thai_fofan" ); KEYVAL ( 0x0dc0 , "Thai_phosamphao" ); KEYVAL ( 0x0dc1 , "Thai_moma" ); KEYVAL ( 0x0dc2 , "Thai_yoyak" ); KEYVAL ( 0x0dc3 , "Thai_rorua" ); KEYVAL ( 0x0dc4 , "Thai_ru" ); KEYVAL ( 0x0dc5 , "Thai_loling" ); KEYVAL ( 0x0dc6 , "Thai_lu" ); KEYVAL ( 0x0dc7 , "Thai_wowaen" ); KEYVAL ( 0x0dc8 , "Thai_sosala" ); KEYVAL ( 0x0dc9 , "Thai_sorusi" ); KEYVAL ( 0x0dca , "Thai_sosua" ); KEYVAL ( 0x0dcb , "Thai_hohip" ); KEYVAL ( 0x0dcc , "Thai_lochula" ); KEYVAL ( 0x0dcd , "Thai_oang" ); KEYVAL ( 0x0dce , "Thai_honokhuk" ); KEYVAL ( 0x0dcf , "Thai_paiyannoi" ); KEYVAL ( 0x0dd0 , "Thai_saraa" ); KEYVAL ( 0x0dd1 , "Thai_maihanakat" ); KEYVAL ( 0x0dd2 , "Thai_saraaa" ); KEYVAL ( 0x0dd3 , "Thai_saraam" ); KEYVAL ( 0x0dd4 , "Thai_sarai" ); KEYVAL ( 0x0dd5 , "Thai_saraii" ); KEYVAL ( 0x0dd6 , "Thai_saraue" ); KEYVAL ( 0x0dd7 , "Thai_sarauee" ); KEYVAL ( 0x0dd8 , "Thai_sarau" ); KEYVAL ( 0x0dd9 , "Thai_sarauu" ); KEYVAL ( 0x0dda , "Thai_phinthu" ); KEYVAL ( 0x0dde , "Thai_maihanakat_maitho" ); KEYVAL ( 0x0ddf , "Thai_baht" ); KEYVAL ( 0x0de0 , "Thai_sarae" ); KEYVAL ( 0x0de1 , "Thai_saraae" ); KEYVAL ( 0x0de2 , "Thai_sarao" ); KEYVAL ( 0x0de3 , "Thai_saraaimaimuan" ); KEYVAL ( 0x0de4 , "Thai_saraaimaimalai" ); KEYVAL ( 0x0de5 , "Thai_lakkhangyao" ); KEYVAL ( 0x0de6 , "Thai_maiyamok" ); KEYVAL ( 0x0de7 , "Thai_maitaikhu" ); KEYVAL ( 0x0de8 , "Thai_maiek" ); KEYVAL ( 0x0de9 , "Thai_maitho" ); KEYVAL ( 0x0dea , "Thai_maitri" ); KEYVAL ( 0x0deb , "Thai_maichattawa" ); KEYVAL ( 0x0dec , "Thai_thanthakhat" ); KEYVAL ( 0x0ded , "Thai_nikhahit" ); KEYVAL ( 0x0df0 , "Thai_leksun" ); KEYVAL ( 0x0df1 , "Thai_leknung" ); KEYVAL ( 0x0df2 , "Thai_leksong" ); KEYVAL ( 0x0df3 , "Thai_leksam" ); KEYVAL ( 0x0df4 , "Thai_leksi" ); KEYVAL ( 0x0df5 , "Thai_lekha" ); KEYVAL ( 0x0df6 , "Thai_lekhok" ); KEYVAL ( 0x0df7 , "Thai_lekchet" ); KEYVAL ( 0x0df8 , "Thai_lekpaet" ); KEYVAL ( 0x0df9 , "Thai_lekkao" ); KEYVAL ( 0x0ea1 , "Hangul_Kiyeog" ); KEYVAL ( 0x0ea2 , "Hangul_SsangKiyeog" ); KEYVAL ( 0x0ea3 , "Hangul_KiyeogSios" ); KEYVAL ( 0x0ea4 , "Hangul_Nieun" ); KEYVAL ( 0x0ea5 , "Hangul_NieunJieuj" ); KEYVAL ( 0x0ea6 , "Hangul_NieunHieuh" ); KEYVAL ( 0x0ea7 , "Hangul_Dikeud" ); KEYVAL ( 0x0ea8 , "Hangul_SsangDikeud" ); KEYVAL ( 0x0ea9 , "Hangul_Rieul" ); KEYVAL ( 0x0eaa , "Hangul_RieulKiyeog" ); KEYVAL ( 0x0eab , "Hangul_RieulMieum" ); KEYVAL ( 0x0eac , "Hangul_RieulPieub" ); KEYVAL ( 0x0ead , "Hangul_RieulSios" ); KEYVAL ( 0x0eae , "Hangul_RieulTieut" ); KEYVAL ( 0x0eaf , "Hangul_RieulPhieuf" ); KEYVAL ( 0x0eb0 , "Hangul_RieulHieuh" ); KEYVAL ( 0x0eb1 , "Hangul_Mieum" ); KEYVAL ( 0x0eb2 , "Hangul_Pieub" ); KEYVAL ( 0x0eb3 , "Hangul_SsangPieub" ); KEYVAL ( 0x0eb4 , "Hangul_PieubSios" ); KEYVAL ( 0x0eb5 , "Hangul_Sios" ); KEYVAL ( 0x0eb6 , "Hangul_SsangSios" ); KEYVAL ( 0x0eb7 , "Hangul_Ieung" ); KEYVAL ( 0x0eb8 , "Hangul_Jieuj" ); KEYVAL ( 0x0eb9 , "Hangul_SsangJieuj" ); KEYVAL ( 0x0eba , "Hangul_Cieuc" ); KEYVAL ( 0x0ebb , "Hangul_Khieuq" ); KEYVAL ( 0x0ebc , "Hangul_Tieut" ); KEYVAL ( 0x0ebd , "Hangul_Phieuf" ); KEYVAL ( 0x0ebe , "Hangul_Hieuh" ); KEYVAL ( 0x0ebf , "Hangul_A" ); KEYVAL ( 0x0ec0 , "Hangul_AE" ); KEYVAL ( 0x0ec1 , "Hangul_YA" ); KEYVAL ( 0x0ec2 , "Hangul_YAE" ); KEYVAL ( 0x0ec3 , "Hangul_EO" ); KEYVAL ( 0x0ec4 , "Hangul_E" ); KEYVAL ( 0x0ec5 , "Hangul_YEO" ); KEYVAL ( 0x0ec6 , "Hangul_YE" ); KEYVAL ( 0x0ec7 , "Hangul_O" ); KEYVAL ( 0x0ec8 , "Hangul_WA" ); KEYVAL ( 0x0ec9 , "Hangul_WAE" ); KEYVAL ( 0x0eca , "Hangul_OE" ); KEYVAL ( 0x0ecb , "Hangul_YO" ); KEYVAL ( 0x0ecc , "Hangul_U" ); KEYVAL ( 0x0ecd , "Hangul_WEO" ); KEYVAL ( 0x0ece , "Hangul_WE" ); KEYVAL ( 0x0ecf , "Hangul_WI" ); KEYVAL ( 0x0ed0 , "Hangul_YU" ); KEYVAL ( 0x0ed1 , "Hangul_EU" ); KEYVAL ( 0x0ed2 , "Hangul_YI" ); KEYVAL ( 0x0ed3 , "Hangul_I" ); KEYVAL ( 0x0ed4 , "Hangul_J_Kiyeog" ); KEYVAL ( 0x0ed5 , "Hangul_J_SsangKiyeog" ); KEYVAL ( 0x0ed6 , "Hangul_J_KiyeogSios" ); KEYVAL ( 0x0ed7 , "Hangul_J_Nieun" ); KEYVAL ( 0x0ed8 , "Hangul_J_NieunJieuj" ); KEYVAL ( 0x0ed9 , "Hangul_J_NieunHieuh" ); KEYVAL ( 0x0eda , "Hangul_J_Dikeud" ); KEYVAL ( 0x0edb , "Hangul_J_Rieul" ); KEYVAL ( 0x0edc , "Hangul_J_RieulKiyeog" ); KEYVAL ( 0x0edd , "Hangul_J_RieulMieum" ); KEYVAL ( 0x0ede , "Hangul_J_RieulPieub" ); KEYVAL ( 0x0edf , "Hangul_J_RieulSios" ); KEYVAL ( 0x0ee0 , "Hangul_J_RieulTieut" ); KEYVAL ( 0x0ee1 , "Hangul_J_RieulPhieuf" ); KEYVAL ( 0x0ee2 , "Hangul_J_RieulHieuh" ); KEYVAL ( 0x0ee3 , "Hangul_J_Mieum" ); KEYVAL ( 0x0ee4 , "Hangul_J_Pieub" ); KEYVAL ( 0x0ee5 , "Hangul_J_PieubSios" ); KEYVAL ( 0x0ee6 , "Hangul_J_Sios" ); KEYVAL ( 0x0ee7 , "Hangul_J_SsangSios" ); KEYVAL ( 0x0ee8 , "Hangul_J_Ieung" ); KEYVAL ( 0x0ee9 , "Hangul_J_Jieuj" ); KEYVAL ( 0x0eea , "Hangul_J_Cieuc" ); KEYVAL ( 0x0eeb , "Hangul_J_Khieuq" ); KEYVAL ( 0x0eec , "Hangul_J_Tieut" ); KEYVAL ( 0x0eed , "Hangul_J_Phieuf" ); KEYVAL ( 0x0eee , "Hangul_J_Hieuh" ); KEYVAL ( 0x0eef , "Hangul_RieulYeorinHieuh" ); KEYVAL ( 0x0ef0 , "Hangul_SunkyeongeumMieum" ); KEYVAL ( 0x0ef1 , "Hangul_SunkyeongeumPieub" ); KEYVAL ( 0x0ef2 , "Hangul_PanSios" ); KEYVAL ( 0x0ef3 , "Hangul_KkogjiDalrinIeung" ); KEYVAL ( 0x0ef4 , "Hangul_SunkyeongeumPhieuf" ); KEYVAL ( 0x0ef5 , "Hangul_YeorinHieuh" ); KEYVAL ( 0x0ef6 , "Hangul_AraeA" ); KEYVAL ( 0x0ef7 , "Hangul_AraeAE" ); KEYVAL ( 0x0ef8 , "Hangul_J_PanSios" ); KEYVAL ( 0x0ef9 , "Hangul_J_KkogjiDalrinIeung" ); KEYVAL ( 0x0efa , "Hangul_J_YeorinHieuh" ); KEYVAL ( 0x0eff , "Korean_Won" ); KEYVAL ( 0x13bc , "OE" ); KEYVAL ( 0x13bd , "oe" ); KEYVAL ( 0x13be , "Ydiaeresis" ); KEYVAL ( 0x20a0 , "EcuSign" ); KEYVAL ( 0x20a1 , "ColonSign" ); KEYVAL ( 0x20a2 , "CruzeiroSign" ); KEYVAL ( 0x20a3 , "FFrancSign" ); KEYVAL ( 0x20a4 , "LiraSign" ); KEYVAL ( 0x20a5 , "MillSign" ); KEYVAL ( 0x20a6 , "NairaSign" ); KEYVAL ( 0x20a7 , "PesetaSign" ); KEYVAL ( 0x20a8 , "RupeeSign" ); KEYVAL ( 0x20a9 , "WonSign" ); KEYVAL ( 0x20aa , "NewSheqelSign" ); KEYVAL ( 0x20ab , "DongSign" ); KEYVAL ( 0x20ac , "EuroSign" ); KEYVAL ( 0xFD01 , "3270_Duplicate" ); KEYVAL ( 0xFD02 , "3270_FieldMark" ); KEYVAL ( 0xFD03 , "3270_Right2" ); KEYVAL ( 0xFD04 , "3270_Left2" ); KEYVAL ( 0xFD05 , "3270_BackTab" ); KEYVAL ( 0xFD06 , "3270_EraseEOF" ); KEYVAL ( 0xFD07 , "3270_EraseInput" ); KEYVAL ( 0xFD08 , "3270_Reset" ); KEYVAL ( 0xFD09 , "3270_Quit" ); KEYVAL ( 0xFD0A , "3270_PA1" ); KEYVAL ( 0xFD0B , "3270_PA2" ); KEYVAL ( 0xFD0C , "3270_PA3" ); KEYVAL ( 0xFD0D , "3270_Test" ); KEYVAL ( 0xFD0E , "3270_Attn" ); KEYVAL ( 0xFD0F , "3270_CursorBlink" ); KEYVAL ( 0xFD10 , "3270_AltCursor" ); KEYVAL ( 0xFD11 , "3270_KeyClick" ); KEYVAL ( 0xFD12 , "3270_Jump" ); KEYVAL ( 0xFD13 , "3270_Ident" ); KEYVAL ( 0xFD14 , "3270_Rule" ); KEYVAL ( 0xFD15 , "3270_Copy" ); KEYVAL ( 0xFD16 , "3270_Play" ); KEYVAL ( 0xFD17 , "3270_Setup" ); KEYVAL ( 0xFD18 , "3270_Record" ); KEYVAL ( 0xFD19 , "3270_ChangeScreen" ); KEYVAL ( 0xFD1A , "3270_DeleteWord" ); KEYVAL ( 0xFD1B , "3270_ExSelect" ); KEYVAL ( 0xFD1C , "3270_CursorSelect" ); KEYVAL ( 0xFD1D , "3270_PrintScreen" ); KEYVAL ( 0xFD1E , "3270_Enter" ); KEYVAL ( 0xFE01 , "ISO_Lock" ); KEYVAL ( 0xFE02 , "ISO_Level2_Latch" ); KEYVAL ( 0xFE03 , "ISO_Level3_Shift" ); KEYVAL ( 0xFE04 , "ISO_Level3_Latch" ); KEYVAL ( 0xFE05 , "ISO_Level3_Lock" ); KEYVAL ( 0xFE06 , "ISO_Group_Latch" ); KEYVAL ( 0xFE07 , "ISO_Group_Lock" ); KEYVAL ( 0xFE08 , "ISO_Next_Group" ); KEYVAL ( 0xFE09 , "ISO_Next_Group_Lock" ); KEYVAL ( 0xFE0A , "ISO_Prev_Group" ); KEYVAL ( 0xFE0B , "ISO_Prev_Group_Lock" ); KEYVAL ( 0xFE0C , "ISO_First_Group" ); KEYVAL ( 0xFE0D , "ISO_First_Group_Lock" ); KEYVAL ( 0xFE0E , "ISO_Last_Group" ); KEYVAL ( 0xFE0F , "ISO_Last_Group_Lock" ); KEYVAL ( 0xFE20 , "ISO_Left_Tab" ); KEYVAL ( 0xFE21 , "ISO_Move_Line_Up" ); KEYVAL ( 0xFE22 , "ISO_Move_Line_Down" ); KEYVAL ( 0xFE23 , "ISO_Partial_Line_Up" ); KEYVAL ( 0xFE24 , "ISO_Partial_Line_Down" ); KEYVAL ( 0xFE25 , "ISO_Partial_Space_Left" ); KEYVAL ( 0xFE26 , "ISO_Partial_Space_Right" ); KEYVAL ( 0xFE27 , "ISO_Set_Margin_Left" ); KEYVAL ( 0xFE28 , "ISO_Set_Margin_Right" ); KEYVAL ( 0xFE29 , "ISO_Release_Margin_Left" ); KEYVAL ( 0xFE2A , "ISO_Release_Margin_Right" ); KEYVAL ( 0xFE2B , "ISO_Release_Both_Margins" ); KEYVAL ( 0xFE2C , "ISO_Fast_Cursor_Left" ); KEYVAL ( 0xFE2D , "ISO_Fast_Cursor_Right" ); KEYVAL ( 0xFE2E , "ISO_Fast_Cursor_Up" ); KEYVAL ( 0xFE2F , "ISO_Fast_Cursor_Down" ); KEYVAL ( 0xFE30 , "ISO_Continuous_Underline" ); KEYVAL ( 0xFE31 , "ISO_Discontinuous_Underline" ); KEYVAL ( 0xFE32 , "ISO_Emphasize" ); KEYVAL ( 0xFE33 , "ISO_Center_Object" ); KEYVAL ( 0xFE34 , "ISO_Enter" ); KEYVAL ( 0xFE50 , "dead_grave" ); KEYVAL ( 0xFE51 , "dead_acute" ); KEYVAL ( 0xFE52 , "dead_circumflex" ); KEYVAL ( 0xFE53 , "dead_tilde" ); KEYVAL ( 0xFE54 , "dead_macron" ); KEYVAL ( 0xFE55 , "dead_breve" ); KEYVAL ( 0xFE56 , "dead_abovedot" ); KEYVAL ( 0xFE57 , "dead_diaeresis" ); KEYVAL ( 0xFE58 , "dead_abovering" ); KEYVAL ( 0xFE59 , "dead_doubleacute" ); KEYVAL ( 0xFE5A , "dead_caron" ); KEYVAL ( 0xFE5B , "dead_cedilla" ); KEYVAL ( 0xFE5C , "dead_ogonek" ); KEYVAL ( 0xFE5D , "dead_iota" ); KEYVAL ( 0xFE5E , "dead_voiced_sound" ); KEYVAL ( 0xFE5F , "dead_semivoiced_sound" ); KEYVAL ( 0xFE60 , "dead_belowdot" ); KEYVAL ( 0xFE61 , "dead_hook" ); KEYVAL ( 0xFE62 , "dead_horn" ); KEYVAL ( 0xFE70 , "AccessX_Enable" ); KEYVAL ( 0xFE71 , "AccessX_Feedback_Enable" ); KEYVAL ( 0xFE72 , "RepeatKeys_Enable" ); KEYVAL ( 0xFE73 , "SlowKeys_Enable" ); KEYVAL ( 0xFE74 , "BounceKeys_Enable" ); KEYVAL ( 0xFE75 , "StickyKeys_Enable" ); KEYVAL ( 0xFE76 , "MouseKeys_Enable" ); KEYVAL ( 0xFE77 , "MouseKeys_Accel_Enable" ); KEYVAL ( 0xFE78 , "Overlay1_Enable" ); KEYVAL ( 0xFE79 , "Overlay2_Enable" ); KEYVAL ( 0xFE7A , "AudibleBell_Enable" ); KEYVAL ( 0xFED0 , "First_Virtual_Screen" ); KEYVAL ( 0xFED1 , "Prev_Virtual_Screen" ); KEYVAL ( 0xFED2 , "Next_Virtual_Screen" ); KEYVAL ( 0xFED4 , "Last_Virtual_Screen" ); KEYVAL ( 0xFED5 , "Terminate_Server" ); KEYVAL ( 0xFEE0 , "Pointer_Left" ); KEYVAL ( 0xFEE1 , "Pointer_Right" ); KEYVAL ( 0xFEE2 , "Pointer_Up" ); KEYVAL ( 0xFEE3 , "Pointer_Down" ); KEYVAL ( 0xFEE4 , "Pointer_UpLeft" ); KEYVAL ( 0xFEE5 , "Pointer_UpRight" ); KEYVAL ( 0xFEE6 , "Pointer_DownLeft" ); KEYVAL ( 0xFEE7 , "Pointer_DownRight" ); KEYVAL ( 0xFEE8 , "Pointer_Button_Dflt" ); KEYVAL ( 0xFEE9 , "Pointer_Button1" ); KEYVAL ( 0xFEEA , "Pointer_Button2" ); KEYVAL ( 0xFEEB , "Pointer_Button3" ); KEYVAL ( 0xFEEC , "Pointer_Button4" ); KEYVAL ( 0xFEED , "Pointer_Button5" ); KEYVAL ( 0xFEEE , "Pointer_DblClick_Dflt" ); KEYVAL ( 0xFEEF , "Pointer_DblClick1" ); KEYVAL ( 0xFEF0 , "Pointer_DblClick2" ); KEYVAL ( 0xFEF1 , "Pointer_DblClick3" ); KEYVAL ( 0xFEF2 , "Pointer_DblClick4" ); KEYVAL ( 0xFEF3 , "Pointer_DblClick5" ); KEYVAL ( 0xFEF4 , "Pointer_Drag_Dflt" ); KEYVAL ( 0xFEF5 , "Pointer_Drag1" ); KEYVAL ( 0xFEF6 , "Pointer_Drag2" ); KEYVAL ( 0xFEF7 , "Pointer_Drag3" ); KEYVAL ( 0xFEF8 , "Pointer_Drag4" ); KEYVAL ( 0xFEF9 , "Pointer_EnableKeys" ); KEYVAL ( 0xFEFA , "Pointer_Accelerate" ); KEYVAL ( 0xFEFB , "Pointer_DfltBtnNext" ); KEYVAL ( 0xFEFC , "Pointer_DfltBtnPrev" ); KEYVAL ( 0xFEFD , "Pointer_Drag5" ); KEYVAL ( 0xFF08 , "BackSpace" ); KEYVAL ( 0xFF09 , "Tab" ); KEYVAL ( 0xFF0A , "Linefeed" ); KEYVAL ( 0xFF0B , "Clear" ); KEYVAL ( 0xFF0D , "Return" ); KEYVAL ( 0xFF13 , "Pause" ); KEYVAL ( 0xFF14 , "Scroll_Lock" ); KEYVAL ( 0xFF15 , "Sys_Req" ); KEYVAL ( 0xFF1B , "Escape" ); KEYVAL ( 0xFF20 , "Multi_key" ); KEYVAL ( 0xFF21 , "Kanji" ); KEYVAL ( 0xFF22 , "Muhenkan" ); KEYVAL ( 0xFF23 , "Henkan" ); KEYVAL ( 0xFF23 , "Henkan_Mode" ); KEYVAL ( 0xFF24 , "Romaji" ); KEYVAL ( 0xFF25 , "Hiragana" ); KEYVAL ( 0xFF26 , "Katakana" ); KEYVAL ( 0xFF27 , "Hiragana_Katakana" ); KEYVAL ( 0xFF28 , "Zenkaku" ); KEYVAL ( 0xFF29 , "Hankaku" ); KEYVAL ( 0xFF2A , "Zenkaku_Hankaku" ); KEYVAL ( 0xFF2B , "Touroku" ); KEYVAL ( 0xFF2C , "Massyo" ); KEYVAL ( 0xFF2D , "Kana_Lock" ); KEYVAL ( 0xFF2E , "Kana_Shift" ); KEYVAL ( 0xFF2F , "Eisu_Shift" ); KEYVAL ( 0xFF30 , "Eisu_toggle" ); KEYVAL ( 0xff31 , "Hangul" ); KEYVAL ( 0xff32 , "Hangul_Start" ); KEYVAL ( 0xff33 , "Hangul_End" ); KEYVAL ( 0xff34 , "Hangul_Hanja" ); KEYVAL ( 0xff35 , "Hangul_Jamo" ); KEYVAL ( 0xff36 , "Hangul_Romaja" ); KEYVAL ( 0xFF37 , "Codeinput" ); KEYVAL ( 0xff37 , "Hangul_Codeinput" ); KEYVAL ( 0xFF37 , "Kanji_Bangou" ); KEYVAL ( 0xff38 , "Hangul_Jeonja" ); KEYVAL ( 0xff39 , "Hangul_Banja" ); KEYVAL ( 0xff3a , "Hangul_PreHanja" ); KEYVAL ( 0xff3b , "Hangul_PostHanja" ); KEYVAL ( 0xff3c , "Hangul_SingleCandidate" ); KEYVAL ( 0xFF3C , "SingleCandidate" ); KEYVAL ( 0xff3d , "Hangul_MultipleCandidate" ); KEYVAL ( 0xFF3D , "MultipleCandidate" ); KEYVAL ( 0xFF3D , "Zen_Koho" ); KEYVAL ( 0xff3e , "Hangul_PreviousCandidate" ); KEYVAL ( 0xFF3E , "Mae_Koho" ); KEYVAL ( 0xFF3E , "PreviousCandidate" ); KEYVAL ( 0xff3f , "Hangul_Special" ); KEYVAL ( 0xFF50 , "Home" ); KEYVAL ( 0xFF51 , "Left" ); KEYVAL ( 0xFF52 , "Up" ); KEYVAL ( 0xFF53 , "Right" ); KEYVAL ( 0xFF54 , "Down" ); KEYVAL ( 0xFF55 , "Page_Up" ); KEYVAL ( 0xFF55 , "Prior" ); KEYVAL ( 0xFF56 , "Next" ); KEYVAL ( 0xFF56 , "Page_Down" ); KEYVAL ( 0xFF57 , "End" ); KEYVAL ( 0xFF58 , "Begin" ); KEYVAL ( 0xFF60 , "Select" ); KEYVAL ( 0xFF61 , "Print" ); KEYVAL ( 0xFF62 , "Execute" ); KEYVAL ( 0xFF63 , "Insert" ); KEYVAL ( 0xFF65 , "Undo" ); KEYVAL ( 0xFF66 , "Redo" ); KEYVAL ( 0xFF67 , "Menu" ); KEYVAL ( 0xFF68 , "Find" ); KEYVAL ( 0xFF69 , "Cancel" ); KEYVAL ( 0xFF6A , "Help" ); KEYVAL ( 0xFF6B , "Break" ); KEYVAL ( 0xFF7E , "Arabic_switch" ); KEYVAL ( 0xFF7E , "Greek_switch" ); KEYVAL ( 0xFF7E , "Hangul_switch" ); KEYVAL ( 0xFF7E , "Hebrew_switch" ); KEYVAL ( 0xFF7E , "ISO_Group_Shift" ); KEYVAL ( 0xFF7E , "kana_switch" ); KEYVAL ( 0xFF7E , "Mode_switch" ); KEYVAL ( 0xFF7E , "script_switch" ); KEYVAL ( 0xFF7F , "Num_Lock" ); KEYVAL ( 0xFF80 , "KP_Space" ); KEYVAL ( 0xFF89 , "KP_Tab" ); KEYVAL ( 0xFF8D , "KP_Enter" ); KEYVAL ( 0xFF91 , "KP_F1" ); KEYVAL ( 0xFF92 , "KP_F2" ); KEYVAL ( 0xFF93 , "KP_F3" ); KEYVAL ( 0xFF94 , "KP_F4" ); KEYVAL ( 0xFF95 , "KP_Home" ); KEYVAL ( 0xFF96 , "KP_Left" ); KEYVAL ( 0xFF97 , "KP_Up" ); KEYVAL ( 0xFF98 , "KP_Right" ); KEYVAL ( 0xFF99 , "KP_Down" ); KEYVAL ( 0xFF9A , "KP_Page_Up" ); KEYVAL ( 0xFF9A , "KP_Prior" ); KEYVAL ( 0xFF9B , "KP_Next" ); KEYVAL ( 0xFF9B , "KP_Page_Down" ); KEYVAL ( 0xFF9C , "KP_End" ); KEYVAL ( 0xFF9D , "KP_Begin" ); KEYVAL ( 0xFF9E , "KP_Insert" ); KEYVAL ( 0xFF9F , "KP_Delete" ); KEYVAL ( 0xFFAA , "KP_Multiply" ); KEYVAL ( 0xFFAB , "KP_Add" ); KEYVAL ( 0xFFAC , "KP_Separator" ); KEYVAL ( 0xFFAD , "KP_Subtract" ); KEYVAL ( 0xFFAE , "KP_Decimal" ); KEYVAL ( 0xFFAF , "KP_Divide" ); KEYVAL ( 0xFFB0 , "KP_0" ); KEYVAL ( 0xFFB1 , "KP_1" ); KEYVAL ( 0xFFB2 , "KP_2" ); KEYVAL ( 0xFFB3 , "KP_3" ); KEYVAL ( 0xFFB4 , "KP_4" ); KEYVAL ( 0xFFB5 , "KP_5" ); KEYVAL ( 0xFFB6 , "KP_6" ); KEYVAL ( 0xFFB7 , "KP_7" ); KEYVAL ( 0xFFB8 , "KP_8" ); KEYVAL ( 0xFFB9 , "KP_9" ); KEYVAL ( 0xFFBD , "KP_Equal" ); KEYVAL ( 0xFFBE , "F1" ); KEYVAL ( 0xFFBF , "F2" ); KEYVAL ( 0xFFC0 , "F3" ); KEYVAL ( 0xFFC1 , "F4" ); KEYVAL ( 0xFFC2 , "F5" ); KEYVAL ( 0xFFC3 , "F6" ); KEYVAL ( 0xFFC4 , "F7" ); KEYVAL ( 0xFFC5 , "F8" ); KEYVAL ( 0xFFC6 , "F9" ); KEYVAL ( 0xFFC7 , "F10" ); KEYVAL ( 0xFFC8 , "F11" ); KEYVAL ( 0xFFC8 , "L1" ); KEYVAL ( 0xFFC9 , "F12" ); KEYVAL ( 0xFFC9 , "L2" ); KEYVAL ( 0xFFCA , "F13" ); KEYVAL ( 0xFFCA , "L3" ); KEYVAL ( 0xFFCB , "F14" ); KEYVAL ( 0xFFCB , "L4" ); KEYVAL ( 0xFFCC , "F15" ); KEYVAL ( 0xFFCC , "L5" ); KEYVAL ( 0xFFCD , "F16" ); KEYVAL ( 0xFFCD , "L6" ); KEYVAL ( 0xFFCE , "F17" ); KEYVAL ( 0xFFCE , "L7" ); KEYVAL ( 0xFFCF , "F18" ); KEYVAL ( 0xFFCF , "L8" ); KEYVAL ( 0xFFD0 , "F19" ); KEYVAL ( 0xFFD0 , "L9" ); KEYVAL ( 0xFFD1 , "F20" ); KEYVAL ( 0xFFD1 , "L10" ); KEYVAL ( 0xFFD2 , "F21" ); KEYVAL ( 0xFFD2 , "R1" ); KEYVAL ( 0xFFD3 , "F22" ); KEYVAL ( 0xFFD3 , "R2" ); KEYVAL ( 0xFFD4 , "F23" ); KEYVAL ( 0xFFD4 , "R3" ); KEYVAL ( 0xFFD5 , "F24" ); KEYVAL ( 0xFFD5 , "R4" ); KEYVAL ( 0xFFD6 , "F25" ); KEYVAL ( 0xFFD6 , "R5" ); KEYVAL ( 0xFFD7 , "F26" ); KEYVAL ( 0xFFD7 , "R6" ); KEYVAL ( 0xFFD8 , "F27" ); KEYVAL ( 0xFFD8 , "R7" ); KEYVAL ( 0xFFD9 , "F28" ); KEYVAL ( 0xFFD9 , "R8" ); KEYVAL ( 0xFFDA , "F29" ); KEYVAL ( 0xFFDA , "R9" ); KEYVAL ( 0xFFDB , "F30" ); KEYVAL ( 0xFFDB , "R10" ); KEYVAL ( 0xFFDC , "F31" ); KEYVAL ( 0xFFDC , "R11" ); KEYVAL ( 0xFFDD , "F32" ); KEYVAL ( 0xFFDD , "R12" ); KEYVAL ( 0xFFDE , "F33" ); KEYVAL ( 0xFFDE , "R13" ); KEYVAL ( 0xFFDF , "F34" ); KEYVAL ( 0xFFDF , "R14" ); KEYVAL ( 0xFFE0 , "F35" ); KEYVAL ( 0xFFE0 , "R15" ); KEYVAL ( 0xFFE1 , "Shift_L" ); KEYVAL ( 0xFFE2 , "Shift_R" ); KEYVAL ( 0xFFE3 , "Control_L" ); KEYVAL ( 0xFFE4 , "Control_R" ); KEYVAL ( 0xFFE5 , "Caps_Lock" ); KEYVAL ( 0xFFE6 , "Shift_Lock" ); KEYVAL ( 0xFFE7 , "Meta_L" ); KEYVAL ( 0xFFE8 , "Meta_R" ); KEYVAL ( 0xFFE9 , "Alt_L" ); KEYVAL ( 0xFFEA , "Alt_R" ); KEYVAL ( 0xFFEB , "Super_L" ); KEYVAL ( 0xFFEC , "Super_R" ); KEYVAL ( 0xFFED , "Hyper_L" ); KEYVAL ( 0xFFEE , "Hyper_R" ); KEYVAL ( 0xFFFF , "Delete" ); /* 0xFFFFFF "VoidSymbol" */ } desmume-0.9.9/src/gtk-glade/glade-xml.cpp0000755000175000017500000001174612140261477020746 0ustar guillaumeguillaume/* -*- Mode: C; c-basic-offset: 4 -*- * libglade - a library for building interfaces from XML files at runtime * Copyright (C) 1998-2002 James Henstridge * * glade-xml.c: implementation of core public interface functions * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "globals.h" #include #include #include #include typedef struct _GladeXMLPrivate nopriv_GladeXMLPrivate; struct _GladeXMLPrivate { GladeInterface *tree; /* the tree for this GladeXML */ GtkTooltips *tooltips; /* if not NULL, holds all tooltip info */ GHashTable *name_hash; GHashTable *signals; GtkWindow *toplevel; GtkAccelGroup *accel_group; GtkWidget *focus_widget; GtkWidget *default_widget; GList *deferred_props; }; typedef struct _GladeSignalData GladeSignalData; struct _GladeSignalData { GObject *signal_object; char *signal_name; char *connect_object; /* or NULL if there is none */ gboolean signal_after; }; static void autoconnect_foreach_StringObject(const char *signal_handler, GList * signals, GModule * allsymbols) { GCallback func; if (!g_module_symbol(allsymbols, signal_handler, (void **) &func)) g_warning(_("could not find signal handler '%s'."), signal_handler); else for (; signals != NULL; signals = signals->next) { GladeSignalData *data = (GladeSignalData *) signals->data; if (data->connect_object) { GladeXML *self = glade_get_widget_tree(GTK_WIDGET(data->signal_object)); char format[] = "%_\0\0"; if (sscanf(data->connect_object, "%%%c:", &format[1])) { // this should solve 64bit problems but now memory gets // (it should get) deallocated when program is destroyed gpointer argument = g_malloc(sizeof(callback_arg)); sscanf(data->connect_object + 3, format, argument); // printf ("%f \n",obj); if (data->signal_after) g_signal_connect_after(data->signal_object, data->signal_name, func, argument); else g_signal_connect(data->signal_object, data->signal_name, func, argument); } else { GObject *other = (GObject *) g_hash_table_lookup( self->priv->name_hash, data->connect_object); g_signal_connect_object(data->signal_object, data->signal_name, func, other, (GConnectFlags) ((data->signal_after ? G_CONNECT_AFTER : 0) | G_CONNECT_SWAPPED)); } } else { /* the signal_data argument is just a string, but may * be helpful for someone */ if (data->signal_after) g_signal_connect_after(data->signal_object, data->signal_name, func, NULL); else g_signal_connect(data->signal_object, data->signal_name, func, NULL); } } } /** * glade_xml_signal_autoconnect_StringObject: * @self: the GladeXML object. * * This function is a variation of glade_xml_signal_connect. It uses * gmodule's introspective features (by openning the module %NULL) to * look at the application's symbol table. From here it tries to match * the signal handler names given in the interface description with * symbols in the application and connects the signals. * * Note that this function will not work correctly if gmodule is not * supported on the platform. */ void glade_xml_signal_autoconnect_StringObject(GladeXML * self) { GModule *allsymbols; nopriv_GladeXMLPrivate *priv; g_return_if_fail(self != NULL); if (!g_module_supported()) g_error("glade_xml_signal_autoconnect requires working gmodule"); /* get a handle on the main executable -- use this to find symbols */ allsymbols = g_module_open(NULL, (GModuleFlags) 0); priv = (nopriv_GladeXMLPrivate *) self->priv; g_hash_table_foreach(priv->signals, (GHFunc) autoconnect_foreach_StringObject, allsymbols); } desmume-0.9.9/src/gtk-glade/gdk_3Demu.cpp0000644000175000017500000001535512140261477020673 0ustar guillaumeguillaume/* $Id: gdk_3Demu.c,v 1.4 2007-07-15 21:50:30 evilynux Exp $ */ /* Copyright (C) 2006-2007 Ben Jaques This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef GTKGLEXT_AVAILABLE #include #include // Localization #include #define _(String) gettext (String) #include "../types.h" #include "../render3D.h" #include "../OGLRender.h" #include "gdk_3Demu.h" /* * The GDK 3D emulation. * This uses the OpenGL Collector plugin, using gdkGLext for the platform * specific helper functions. */ static GdkPixmap *target_pixmap; static GdkGLContext *glcontext = NULL; static GdkGLDrawable *gldrawable; #if 0 /* not used */ static void print_gl_config_attrib (GdkGLConfig *glconfig, const gchar *attrib_str, int attrib, gboolean is_boolean) { int value; g_print ("%s = ", attrib_str); if (gdk_gl_config_get_attrib (glconfig, attrib, &value)) { if (is_boolean) g_print ("%s\n", value == TRUE ? "TRUE" : "FALSE"); else g_print ("%d\n", value); } else g_print (_("*** Cannot get %s attribute value\n"), attrib_str); } static void examine_gl_config_attrib (GdkGLConfig *glconfig) { g_print ("\nOpenGL visual configurations :\n\n"); g_print ("gdk_gl_config_is_rgba (glconfig) = %s\n", gdk_gl_config_is_rgba (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_is_double_buffered (glconfig) = %s\n", gdk_gl_config_is_double_buffered (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_is_stereo (glconfig) = %s\n", gdk_gl_config_is_stereo (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_has_alpha (glconfig) = %s\n", gdk_gl_config_has_alpha (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_has_depth_buffer (glconfig) = %s\n", gdk_gl_config_has_depth_buffer (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_has_stencil_buffer (glconfig) = %s\n", gdk_gl_config_has_stencil_buffer (glconfig) ? "TRUE" : "FALSE"); g_print ("gdk_gl_config_has_accum_buffer (glconfig) = %s\n", gdk_gl_config_has_accum_buffer (glconfig) ? "TRUE" : "FALSE"); g_print ("\n"); print_gl_config_attrib (glconfig, "GDK_GL_USE_GL", GDK_GL_USE_GL, TRUE); print_gl_config_attrib (glconfig, "GDK_GL_BUFFER_SIZE", GDK_GL_BUFFER_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_LEVEL", GDK_GL_LEVEL, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_RGBA", GDK_GL_RGBA, TRUE); print_gl_config_attrib (glconfig, "GDK_GL_DOUBLEBUFFER", GDK_GL_DOUBLEBUFFER, TRUE); print_gl_config_attrib (glconfig, "GDK_GL_STEREO", GDK_GL_STEREO, TRUE); print_gl_config_attrib (glconfig, "GDK_GL_AUX_BUFFERS", GDK_GL_AUX_BUFFERS, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_RED_SIZE", GDK_GL_RED_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_GREEN_SIZE", GDK_GL_GREEN_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_BLUE_SIZE", GDK_GL_BLUE_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ALPHA_SIZE", GDK_GL_ALPHA_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_DEPTH_SIZE", GDK_GL_DEPTH_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_STENCIL_SIZE", GDK_GL_STENCIL_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ACCUM_RED_SIZE", GDK_GL_ACCUM_RED_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ACCUM_GREEN_SIZE", GDK_GL_ACCUM_GREEN_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ACCUM_BLUE_SIZE", GDK_GL_ACCUM_BLUE_SIZE, FALSE); print_gl_config_attrib (glconfig, "GDK_GL_ACCUM_ALPHA_SIZE", GDK_GL_ACCUM_ALPHA_SIZE, FALSE); g_print ("\n"); } #endif static bool begin_opengl_region_gdk_3d( void) { bool failed = false; gdk_error_trap_push(); failed = !gdk_gl_drawable_gl_begin(gldrawable, glcontext); gdk_flush(); failed = failed | gdk_error_trap_pop(); if (failed) return false; return true; } static void end_opengl_region_gdk_3d( void) { gdk_gl_drawable_gl_end (gldrawable); } static bool initialise_gdk_3d( void) { /* this does nothing */ return true; } int init_opengl_gdk_3Demu( GdkDrawable * drawable) { GdkGLConfig *glconfig; /* create the off screen pixmap */ target_pixmap = gdk_pixmap_new ( drawable, 256, 192, -1); if ( target_pixmap == NULL) { g_print (_("*** Failed to create pixmap.\n")); return 0; } glconfig = gdk_gl_config_new_by_mode ((GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | GDK_GL_MODE_STENCIL | GDK_GL_MODE_SINGLE)); if (glconfig == NULL) { g_print (_("*** No appropriate OpenGL-capable visual found.\n")); return 0; } /* * Set OpenGL-capability to the pixmap */ gldrawable = GDK_GL_DRAWABLE (gdk_pixmap_set_gl_capability (target_pixmap, glconfig, NULL)); if ( gldrawable == NULL) { g_print (_("Failed to create the GdkGLPixmap\n")); return 0; } glcontext = gdk_gl_context_new (gldrawable, NULL, FALSE, GDK_GL_RGBA_TYPE); if (glcontext == NULL) { g_print (_("Connot create the OpenGL rendering context\n")); return 0; } oglrender_init = initialise_gdk_3d; oglrender_beginOpenGL = begin_opengl_region_gdk_3d; oglrender_endOpenGL = end_opengl_region_gdk_3d; return 1; } #endif desmume-0.9.9/src/gtk-glade/globals.h0000755000175000017500000000565212140261477020163 0ustar guillaumeguillaume/* globals.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GLOBALS_H__ #define __GLOBALS_H__ #ifndef GTK_UI #define GTK_UI #endif #include #include #include #include // Localization #include #define _(String) gettext (String) #include "SDL.h" // fix gtk-glade on windows with no configure #ifndef DATADIR #define DATADIR " " #endif #ifndef GLADEUI_UNINSTALLED_DIR #define GLADEUI_UNINSTALLED_DIR "glade/" #endif #include #include #include #include typedef union _callback_arg{ gpointer my_pointer; gconstpointer my_constpointer; gfloat my_float; gdouble my_double; gsize my_size; gssize my_ssize; gboolean my_boolean; guchar my_uchar; guint my_uint; guint8 my_uint8; guint16 my_uint16; guint32 my_uint32; guint64 my_uint64; gushort my_ushort; gulong my_ulong; gchar my_char; gint my_int; gint8 my_int8; gint16 my_int16; gint32 my_int32; gint64 my_int64; gshort my_short; glong my_long; } callback_arg; #define dyn_CAST(gtype,var) (((callback_arg*)var)->my_##gtype) #include "../MMU.h" #include "../registers.h" #include "../armcpu.h" #include "../NDSSystem.h" #include "../sndsdl.h" #include "../ctrlssdl.h" #include "../types.h" #include "../saves.h" #include "../render3D.h" #include "desmume.h" // autoconnect with strings as user_data void glade_xml_signal_autoconnect_StringObject (GladeXML *self); //--- extern int Frameskip; /* main.cpp */ extern GtkWidget * pWindow; extern GtkWidget * pDrawingArea, * pDrawingArea2; extern GladeXML * xml, * xml_tools; typedef void (*VoidFunPtr)(); void notify_Tools(); void register_Tool(VoidFunPtr fun); void unregister_Tool(VoidFunPtr fun); gchar * get_ui_file (const char *filename); /* callbacks.cpp */ void enable_rom_features(); void resize (float Size1, float Size2); void rotate(float angle); extern gboolean ScreenInvert; /* callbacks_IO.cpp */ extern float ScreenCoeff_Size[2]; extern float ScreenRotate; void black_screen (); void edit_controls(); void init_joy_labels(); #endif /* __GLOBALS_H__ */ desmume-0.9.9/src/gtk-glade/callbacks_IO.h0000755000175000017500000000470712140261477021046 0ustar guillaumeguillaume/* callbacks_IO.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "globals.h" #include "gdk_gl.h" extern "C" { /* INPUT BUTTONS / KEYBOARD */ G_MODULE_EXPORT gboolean on_wMainW_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); /* OUTPUT SCREENS */ G_MODULE_EXPORT gboolean on_wDrawScreen_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wDrawScreen_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data); /* INPUT STYLUS / MOUSE */ G_MODULE_EXPORT gboolean on_wDrawScreen_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wDrawScreen_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wDrawScreen_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wDrawScreen_scroll_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); /* KEYBOARD CONFIG / KEY DEFINITION */ G_MODULE_EXPORT gboolean on_wKeyDlg_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); G_MODULE_EXPORT void on_wKeybConfDlg_response (GtkDialog *dialog, gint arg1, gpointer user_data); G_MODULE_EXPORT void on_button_kb_key_clicked (GtkButton *button, gpointer user_data); /* Joystick configuration / Key definition */ G_MODULE_EXPORT void on_button_joy_key_clicked (GtkButton *button, gpointer user_data); } desmume-0.9.9/src/gtk-glade/main.cpp0000755000175000017500000003743612140261477020024 0ustar guillaumeguillaume/* main.c - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks.h" #include "callbacks_IO.h" #include "dTools/callbacks_dtools.h" #include "globals.h" #include "keyval_names.h" #include "rasterize.h" #include "desmume.h" #include "firmware.h" #include "desmume_config.h" #ifdef GDB_STUB #include "../gdbstub.h" #endif #ifdef GTKGLEXT_AVAILABLE #include #include "../OGLRender.h" #include "gdk_3Demu.h" #endif int glade_fps_limiter_disabled = 0; GtkWidget * pWindow; GtkWidget * pDrawingArea, * pDrawingArea2; GladeXML * xml, * xml_tools; const u16 gtk_kb_cfg[NB_KEYS] = { GDK_x, // A GDK_z, // B GDK_Shift_R, // select GDK_Return, // start GDK_Right, // Right GDK_Left, // Left GDK_Up, // Up GDK_Down, // Down GDK_w, // R GDK_q, // L GDK_s, // X GDK_a, // Y GDK_p, // DEBUG GDK_o // BOOST }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDDummy, &SNDSDL, NULL }; GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize #ifdef GTKGLEXT_AVAILABLE , &gpu3Dgl #endif }; /* * * Command line handling * */ struct configured_features { int load_slot; int software_colour_convert; int opengl_2d; int engine_3d; int disable_limiter; int savetype; u16 arm9_gdb_port; u16 arm7_gdb_port; int firmware_language; const char *nds_file; }; static void init_configured_features( struct configured_features *config) { config->load_slot = 0; config->arm9_gdb_port = 0; config->arm7_gdb_port = 0; config->software_colour_convert = 0; config->opengl_2d = 0; config->engine_3d = 1; config->disable_limiter = 0; config->savetype = 0; config->nds_file = NULL; /* use the default language */ config->firmware_language = -1; } static int fill_configured_features( struct configured_features *config, int argc, char ** argv) { int good_args = 1; int print_usage = 0; int i; for ( i = 1; i < argc && good_args; i++) { if ( strcmp( argv[i], "--help") == 0) { g_print( _("USAGE: %s [OPTIONS] [nds-file]\n"), argv[0]); g_print( _("OPTIONS:\n")); g_print( _("\ --load-slot=NUM Load game saved under NUM position.\n\n")); #ifdef GTKGLEXT_AVAILABLE g_print( _("\ --soft-convert Use software colour conversion during OpenGL\n\ screen rendering. May produce better or worse\n\ frame rates depending on hardware.\n\n")); #endif g_print( _("\ --3d-engine=ENGINE Selects 3D rendering engine\n\ 0 = disabled\n\ 1 = internal desmume rasterizer (default)\n")); #ifdef GTKGLEXT_AVAILABLE g_print( _("\ 2 = gtkglext off-screen 3d opengl\n\n")); #endif g_print( _("\ --disable-limiter Disables the 60 fps limiter\n\n")); g_print( _("\ --save-type=TYPE Selects savetype:\n\ 0 = Autodetect (default)\n\ 1 = EEPROM 4kbit\n\ 2 = EEPROM 64kbit\n\ 3 = EEPROM 512kbit\n\ 4 = FRAM 256kbit\n\ 5 = FLASH 2mbit\n\ 6 = FLASH 4mbit\n\ \n")); g_print( _("\ --fwlang=LANG Set the language in the firmware, LANG as follows:\n\ 0 = Japanese\n\ 1 = English\n\ 2 = French\n\ 3 = German\n\ 4 = Italian\n\ 5 = Spanish\n\n")); #ifdef GDB_STUB g_print( _("\ --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n\ --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n\n")); #endif g_print( _("\ --help Display this message\n")); //g_print(" --sticky Enable sticky keys and stylus\n"); good_args = 0; } else if ( strncmp( argv[i], "--load-slot=", 12) == 0) { char *end_char; int slot = strtoul( &argv[i][12], &end_char, 10); if ( slot >= 0 && slot <= 10) { config->load_slot = slot; } else { g_printerr( _("I only know how to load from slots 1-10.\n")); good_args = 0; } } #ifdef GTKGLEXT_AVAILABLE else if ( strcmp( argv[i], "--opengl-2d") == 0) { // FIXME: to be implemented config->opengl_2d = 1; } else if ( strcmp( argv[i], "--soft-convert") == 0) { config->software_colour_convert = 1; } #define MAX3DEMU 2 #else #define MAX3DEMU 1 #endif else if ( strncmp( argv[i], "--3d-engine=", 12) == 0) { char *end_char; int engine = strtoul( &argv[i][12], &end_char, 10); if ( engine >= 0 && engine <= MAX3DEMU) { config->engine_3d = engine; } else { g_printerr( _("Supported 3d engines: 0, 1, and on some machines 2; use --help option for details\n")); good_args = 0; } } else if ( strncmp( argv[i], "--save-type=", 12) == 0) { char *end_char; int type = strtoul( &argv[i][12], &end_char, 10); if ( type >= 0 && type <= 6) { config->savetype = type; } else { g_printerr( _("select savetype from 0 to 6; use --help option for details\n")); good_args = 0; } } else if ( strncmp( argv[i], "--fwlang=", 9) == 0) { char *end_char; int lang = strtoul( &argv[i][9], &end_char, 10); if ( lang >= 0 && lang <= 5) { config->firmware_language = lang; } else { g_printerr( _("Firmware language must be set to a value from 0 to 5.\n")); good_args = 0; } } #ifdef GDB_STUB else if ( strncmp( argv[i], "--arm9gdb=", 10) == 0) { char *end_char; unsigned long port_num = strtoul( &argv[i][10], &end_char, 10); if ( port_num > 0 && port_num < 65536) { config->arm9_gdb_port = port_num; } else { g_print( _("ARM9 GDB stub port must be in the range 1 to 65535\n")); good_args = 0; } } else if ( strncmp( argv[i], "--arm7gdb=", 10) == 0) { char *end_char; unsigned long port_num = strtoul( &argv[i][10], &end_char, 10); if ( port_num > 0 && port_num < 65536) { config->arm7_gdb_port = port_num; } else { g_print( _("ARM7 GDB stub port must be in the range 1 to 65535\n")); good_args = 0; } } #endif else if ( strcmp( argv[i], "--disable-limiter") == 0) { config->disable_limiter = 1; } else { if ( config->nds_file == NULL) { config->nds_file = argv[i]; } else { g_print( _("NDS file (\"%s\") already set\n"), config->nds_file); good_args = 0; } } } if ( good_args) { /* * check if the configured features are consistant */ } if ( print_usage) { g_print( _("USAGE: %s [options] [nds-file]\n"), argv[0]); g_print( _("USAGE: %s --help - for help\n"), argv[0]); } return good_args; } /* ***** ***** TOOLS ***** ***** */ GList * tools_to_update = NULL; // register tool void register_Tool(VoidFunPtr fun) { tools_to_update = g_list_append(tools_to_update, (void *) fun); } void unregister_Tool(VoidFunPtr fun) { if (tools_to_update == NULL) return; tools_to_update = g_list_remove(tools_to_update, (void *) fun); } static void notify_Tool (VoidFunPtr fun, gpointer func_data) { fun(); } void notify_Tools() { g_list_foreach(tools_to_update, (GFunc)notify_Tool, NULL); } /* Return the glade directory. Note: See configure.ac for the value of GLADEUI_UNINSTALLED_DIR. */ gchar * get_ui_file (const char *filename) { gchar *path; /* looking in uninstalled (aka building) dir first */ path = g_build_filename (GLADEUI_UNINSTALLED_DIR, filename, NULL); if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) return path; g_free (path); /* looking in installed dir */ path = g_build_filename (DATADIR, filename, NULL); if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) return path; g_free (path); /* not found */ return NULL; } /* * The thread handling functions needed by the GDB stub code. */ #ifdef GDB_STUB void * createThread_gdb( void (*thread_function)( void *data), void *thread_data) { GThread *new_thread = g_thread_create( (GThreadFunc)thread_function, thread_data, TRUE, NULL); return new_thread; } void joinThread_gdb( void *thread_handle) { g_thread_join((GThread *) thread_handle); } #endif /* ***** ***** MAIN ***** ***** */ static int common_gtk_glade_main( struct configured_features *my_config) { /*SDL_TimerID limiter_timer;*/ #ifdef GDB_STUB gdbstub_handle_t arm9_gdb_stub; gdbstub_handle_t arm7_gdb_stub; #endif struct armcpu_memory_iface *arm9_memio = &arm9_base_memory_iface; struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface; struct armcpu_ctrl_iface *arm9_ctrl_iface; struct armcpu_ctrl_iface *arm7_ctrl_iface; /* the firmware settings */ struct NDS_fw_config_data fw_config; gchar *uifile; GKeyFile *keyfile; /* default the firmware settings, they may get changed later */ NDS_FillDefaultFirmwareConfigData( &fw_config); /* use any language set on the command line */ if ( my_config->firmware_language != -1) { fw_config.language = my_config->firmware_language; } desmume_savetype(my_config->savetype); #ifdef GTKGLEXT_AVAILABLE // check if you have GTHREAD when running configure script //g_thread_init(NULL); register_gl_fun(my_gl_Begin,my_gl_End); #endif init_keyvals(); #ifdef GDB_STUB if ( my_config->arm9_gdb_port != 0) { arm9_gdb_stub = createStub_gdb( my_config->arm9_gdb_port, &arm9_memio, &arm9_base_memory_iface); if ( arm9_gdb_stub == NULL) { g_print( _("Failed to create ARM9 gdbstub on port %d\n"), my_config->arm9_gdb_port); return -1; } } if ( my_config->arm7_gdb_port != 0) { arm7_gdb_stub = createStub_gdb( my_config->arm7_gdb_port, &arm7_memio, &arm7_base_memory_iface); if ( arm7_gdb_stub == NULL) { g_print( _("Failed to create ARM7 gdbstub on port %d\n"), my_config->arm7_gdb_port); return -1; } } #endif if(SDL_Init( SDL_INIT_TIMER | SDL_INIT_VIDEO) == -1) { fprintf(stderr, _("Error trying to initialize SDL: %s\n"), SDL_GetError()); return 1; } desmume_init( arm9_memio, &arm9_ctrl_iface, arm7_memio, &arm7_ctrl_iface); /* Create the dummy firmware */ NDS_CreateDummyFirmware( &fw_config); /* * Activate the GDB stubs * This has to come after the NDS_Init (called in desmume_init) * where the cpus are set up. */ #ifdef GDB_STUB if ( my_config->arm9_gdb_port != 0) { activateStub_gdb( arm9_gdb_stub, arm9_ctrl_iface); } if ( my_config->arm7_gdb_port != 0) { activateStub_gdb( arm7_gdb_stub, arm7_ctrl_iface); } #endif /* Initialize joysticks */ if(!init_joy()) return 1; keyfile = desmume_config_read_file(gtk_kb_cfg); /* load the interface */ uifile = get_ui_file("DeSmuMe.glade"); xml = glade_xml_new(uifile, NULL, NULL); g_free (uifile); uifile = get_ui_file("DeSmuMe_Dtools.glade"); xml_tools = glade_xml_new(uifile, NULL, NULL); g_free (uifile); pWindow = glade_xml_get_widget(xml, "wMainW"); pDrawingArea = glade_xml_get_widget(xml, "wDraw_Main"); pDrawingArea2 = glade_xml_get_widget(xml, "wDraw_Sub"); { char wdgName[40]; snprintf(wdgName, 39, "savetype%d", my_config->savetype+1); GtkWidget * wdgt = glade_xml_get_widget(xml, wdgName); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (wdgt), TRUE); } /* connect the signals in the interface */ glade_xml_signal_autoconnect_StringObject(xml); glade_xml_signal_autoconnect_StringObject(xml_tools); init_GL_capabilities( my_config->software_colour_convert); /* check command line file */ if( my_config->nds_file) { if(desmume_open( my_config->nds_file) >= 0) { loadstate_slot( my_config->load_slot); desmume_resume(); enable_rom_features(); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, _("Unable to load :\n%s"), my_config->nds_file); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } } gtk_widget_show(pDrawingArea); gtk_widget_show(pDrawingArea2); { int engine = my_config->engine_3d; #ifdef GTKGLEXT_AVAILABLE if ( my_config->engine_3d==2 ) /* setup the gdk 3D emulation */ if(!init_opengl_gdk_3Demu(GDK_DRAWABLE(pWindow->window))){ fprintf( stderr, _("Failed to initialise openGL 3D emulation; " "removing 3D support\n")); engine = 0; } #endif NDS_3D_ChangeCore(engine); if(my_config->engine_3d != 0 && gpu3D == GPU3D_NULL) fprintf(stderr, _("Failed to setup 3D engine; removing 3D support\n")); } // on_menu_tileview_activate(NULL,NULL); /* setup the frame limiter and indicate if it is disabled */ glade_fps_limiter_disabled = my_config->disable_limiter; /* start event loop */ gtk_main(); desmume_free(); /* Unload joystick */ uninit_joy(); SDL_Quit(); desmume_config_update_keys(keyfile); desmume_config_update_joykeys(keyfile); desmume_config_dispose(keyfile); return EXIT_SUCCESS; } int main(int argc, char *argv[]) { struct configured_features my_config; // Localization bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); init_configured_features( &my_config); if (!g_thread_supported()) g_thread_init( NULL); gtk_init(&argc, &argv); #ifdef GTKGLEXT_AVAILABLE gtk_gl_init( &argc, &argv); #endif if ( !fill_configured_features( &my_config, argc, argv)) { exit(0); } return common_gtk_glade_main( &my_config); } #ifdef WIN32 int WinMain ( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { int argc = 0; char *argv[] = NULL; /* * FIXME: * Emulate the argc and argv main parameters. Could do this using * CommandLineToArgvW and then convert the wide chars to thin chars. * Or parse the wide chars directly and call common_gtk_glade_main with a * filled configuration structure. */ main( argc, argv); } #endif desmume-0.9.9/src/gtk-glade/Makefile.in0000644000175000017500000012451412140304537020423 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk bin_PROGRAMS = desmume-glade$(EXEEXT) @HAVE_GDB_STUB_TRUE@am__append_1 = ../gdbstub/libgdbstub.a subdir = src/gtk-glade ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" \ "$(DESTDIR)$(gladedir)" "$(DESTDIR)$(pixmapdir)" PROGRAMS = $(bin_PROGRAMS) am_desmume_glade_OBJECTS = glade-xml.$(OBJEXT) callbacks.$(OBJEXT) \ callbacks_IO.$(OBJEXT) desmume.$(OBJEXT) \ keyval_names.$(OBJEXT) main.$(OBJEXT) gdk_gl.$(OBJEXT) \ callbacks_1_ioregs.$(OBJEXT) callbacks_2_memview.$(OBJEXT) \ callbacks_3_palview.$(OBJEXT) callbacks_4_tileview.$(OBJEXT) \ gdk_3Demu.$(OBJEXT) sndsdl.$(OBJEXT) ctrlssdl.$(OBJEXT) \ driver.$(OBJEXT) desmume_glade_OBJECTS = $(am_desmume_glade_OBJECTS) am__DEPENDENCIES_1 = desmume_glade_DEPENDENCIES = ../libdesmume.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(desmume_glade_SOURCES) DIST_SOURCES = $(desmume_glade_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(Applications_DATA) $(glade_DATA) $(pixmap_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(GTKGLEXT_CFLAGS) \ $(LIBGLADE_CFLAGS) $(GTHREAD_CFLAGS) $(ALSA_CFLAGS) \ $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) \ -DDATADIR=\"$(gladedir)/\" -DLOCALEDIR=\"$(localedir)\" AM_LDFLAGS = -rdynamic $(INTLLIBS) EXTRA_DIST = $(glade_DATA) desmume-glade.desktop Applicationsdir = $(datadir)/applications Applications_DATA = desmume-glade.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = glade/DeSmuME.xpm gladedir = $(datadir)/desmume/glade glade_DATA = glade/DeSmuMe_Dtools.glade glade/DeSmuMe.glade glade/DeSmuME.xpm desmume_glade_SOURCES = \ globals.h glade-xml.cpp \ callbacks.cpp callbacks.h callbacks_IO.cpp callbacks_IO.h \ desmume.cpp desmume.h \ keyval_names.cpp keyval_names.h main.cpp gdk_gl.cpp gdk_gl.h \ dTools/callbacks_1_ioregs.cpp dTools/callbacks_2_memview.cpp \ dTools/callbacks_3_palview.cpp dTools/callbacks_4_tileview.cpp \ dTools/callbacks_dtools.h \ dTools/dTools_display.h \ gdk_3Demu.cpp gdk_3Demu.h \ ../sndsdl.h ../sndsdl.cpp ../ctrlssdl.h ../ctrlssdl.cpp \ ../driver.h ../driver.cpp desmume_glade_LDADD = ../libdesmume.a $(SDL_LIBS) $(GTKGLEXT_LIBS) \ $(LIBGLADE_LIBS) $(GTHREAD_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) \ $(LIBSOUNDTOUCH_LIBS) $(am__append_1) all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gtk-glade/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gtk-glade/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) desmume-glade$(EXEEXT): $(desmume_glade_OBJECTS) $(desmume_glade_DEPENDENCIES) $(EXTRA_desmume_glade_DEPENDENCIES) @rm -f desmume-glade$(EXEEXT) $(CXXLINK) $(desmume_glade_OBJECTS) $(desmume_glade_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks_1_ioregs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks_2_memview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks_3_palview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks_4_tileview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks_IO.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrlssdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desmume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdk_3Demu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdk_gl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glade-xml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyval_names.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sndsdl.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` callbacks_1_ioregs.o: dTools/callbacks_1_ioregs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT callbacks_1_ioregs.o -MD -MP -MF $(DEPDIR)/callbacks_1_ioregs.Tpo -c -o callbacks_1_ioregs.o `test -f 'dTools/callbacks_1_ioregs.cpp' || echo '$(srcdir)/'`dTools/callbacks_1_ioregs.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/callbacks_1_ioregs.Tpo $(DEPDIR)/callbacks_1_ioregs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dTools/callbacks_1_ioregs.cpp' object='callbacks_1_ioregs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o callbacks_1_ioregs.o `test -f 'dTools/callbacks_1_ioregs.cpp' || echo '$(srcdir)/'`dTools/callbacks_1_ioregs.cpp callbacks_1_ioregs.obj: dTools/callbacks_1_ioregs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT callbacks_1_ioregs.obj -MD -MP -MF $(DEPDIR)/callbacks_1_ioregs.Tpo -c -o callbacks_1_ioregs.obj `if test -f 'dTools/callbacks_1_ioregs.cpp'; then $(CYGPATH_W) 'dTools/callbacks_1_ioregs.cpp'; else $(CYGPATH_W) '$(srcdir)/dTools/callbacks_1_ioregs.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/callbacks_1_ioregs.Tpo $(DEPDIR)/callbacks_1_ioregs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dTools/callbacks_1_ioregs.cpp' object='callbacks_1_ioregs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o callbacks_1_ioregs.obj `if test -f 'dTools/callbacks_1_ioregs.cpp'; then $(CYGPATH_W) 'dTools/callbacks_1_ioregs.cpp'; else $(CYGPATH_W) '$(srcdir)/dTools/callbacks_1_ioregs.cpp'; fi` callbacks_2_memview.o: dTools/callbacks_2_memview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT callbacks_2_memview.o -MD -MP -MF $(DEPDIR)/callbacks_2_memview.Tpo -c -o callbacks_2_memview.o `test -f 'dTools/callbacks_2_memview.cpp' || echo '$(srcdir)/'`dTools/callbacks_2_memview.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/callbacks_2_memview.Tpo $(DEPDIR)/callbacks_2_memview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dTools/callbacks_2_memview.cpp' object='callbacks_2_memview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o callbacks_2_memview.o `test -f 'dTools/callbacks_2_memview.cpp' || echo '$(srcdir)/'`dTools/callbacks_2_memview.cpp callbacks_2_memview.obj: dTools/callbacks_2_memview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT callbacks_2_memview.obj -MD -MP -MF $(DEPDIR)/callbacks_2_memview.Tpo -c -o callbacks_2_memview.obj `if test -f 'dTools/callbacks_2_memview.cpp'; then $(CYGPATH_W) 'dTools/callbacks_2_memview.cpp'; else $(CYGPATH_W) '$(srcdir)/dTools/callbacks_2_memview.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/callbacks_2_memview.Tpo $(DEPDIR)/callbacks_2_memview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dTools/callbacks_2_memview.cpp' object='callbacks_2_memview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o callbacks_2_memview.obj `if test -f 'dTools/callbacks_2_memview.cpp'; then $(CYGPATH_W) 'dTools/callbacks_2_memview.cpp'; else $(CYGPATH_W) '$(srcdir)/dTools/callbacks_2_memview.cpp'; fi` callbacks_3_palview.o: dTools/callbacks_3_palview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT callbacks_3_palview.o -MD -MP -MF $(DEPDIR)/callbacks_3_palview.Tpo -c -o callbacks_3_palview.o `test -f 'dTools/callbacks_3_palview.cpp' || echo '$(srcdir)/'`dTools/callbacks_3_palview.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/callbacks_3_palview.Tpo $(DEPDIR)/callbacks_3_palview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dTools/callbacks_3_palview.cpp' object='callbacks_3_palview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o callbacks_3_palview.o `test -f 'dTools/callbacks_3_palview.cpp' || echo '$(srcdir)/'`dTools/callbacks_3_palview.cpp callbacks_3_palview.obj: dTools/callbacks_3_palview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT callbacks_3_palview.obj -MD -MP -MF $(DEPDIR)/callbacks_3_palview.Tpo -c -o callbacks_3_palview.obj `if test -f 'dTools/callbacks_3_palview.cpp'; then $(CYGPATH_W) 'dTools/callbacks_3_palview.cpp'; else $(CYGPATH_W) '$(srcdir)/dTools/callbacks_3_palview.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/callbacks_3_palview.Tpo $(DEPDIR)/callbacks_3_palview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dTools/callbacks_3_palview.cpp' object='callbacks_3_palview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o callbacks_3_palview.obj `if test -f 'dTools/callbacks_3_palview.cpp'; then $(CYGPATH_W) 'dTools/callbacks_3_palview.cpp'; else $(CYGPATH_W) '$(srcdir)/dTools/callbacks_3_palview.cpp'; fi` callbacks_4_tileview.o: dTools/callbacks_4_tileview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT callbacks_4_tileview.o -MD -MP -MF $(DEPDIR)/callbacks_4_tileview.Tpo -c -o callbacks_4_tileview.o `test -f 'dTools/callbacks_4_tileview.cpp' || echo '$(srcdir)/'`dTools/callbacks_4_tileview.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/callbacks_4_tileview.Tpo $(DEPDIR)/callbacks_4_tileview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dTools/callbacks_4_tileview.cpp' object='callbacks_4_tileview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o callbacks_4_tileview.o `test -f 'dTools/callbacks_4_tileview.cpp' || echo '$(srcdir)/'`dTools/callbacks_4_tileview.cpp callbacks_4_tileview.obj: dTools/callbacks_4_tileview.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT callbacks_4_tileview.obj -MD -MP -MF $(DEPDIR)/callbacks_4_tileview.Tpo -c -o callbacks_4_tileview.obj `if test -f 'dTools/callbacks_4_tileview.cpp'; then $(CYGPATH_W) 'dTools/callbacks_4_tileview.cpp'; else $(CYGPATH_W) '$(srcdir)/dTools/callbacks_4_tileview.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/callbacks_4_tileview.Tpo $(DEPDIR)/callbacks_4_tileview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dTools/callbacks_4_tileview.cpp' object='callbacks_4_tileview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o callbacks_4_tileview.obj `if test -f 'dTools/callbacks_4_tileview.cpp'; then $(CYGPATH_W) 'dTools/callbacks_4_tileview.cpp'; else $(CYGPATH_W) '$(srcdir)/dTools/callbacks_4_tileview.cpp'; fi` sndsdl.o: ../sndsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sndsdl.o -MD -MP -MF $(DEPDIR)/sndsdl.Tpo -c -o sndsdl.o `test -f '../sndsdl.cpp' || echo '$(srcdir)/'`../sndsdl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/sndsdl.Tpo $(DEPDIR)/sndsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../sndsdl.cpp' object='sndsdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sndsdl.o `test -f '../sndsdl.cpp' || echo '$(srcdir)/'`../sndsdl.cpp sndsdl.obj: ../sndsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sndsdl.obj -MD -MP -MF $(DEPDIR)/sndsdl.Tpo -c -o sndsdl.obj `if test -f '../sndsdl.cpp'; then $(CYGPATH_W) '../sndsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../sndsdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/sndsdl.Tpo $(DEPDIR)/sndsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../sndsdl.cpp' object='sndsdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sndsdl.obj `if test -f '../sndsdl.cpp'; then $(CYGPATH_W) '../sndsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../sndsdl.cpp'; fi` ctrlssdl.o: ../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ctrlssdl.o -MD -MP -MF $(DEPDIR)/ctrlssdl.Tpo -c -o ctrlssdl.o `test -f '../ctrlssdl.cpp' || echo '$(srcdir)/'`../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ctrlssdl.Tpo $(DEPDIR)/ctrlssdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ctrlssdl.cpp' object='ctrlssdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ctrlssdl.o `test -f '../ctrlssdl.cpp' || echo '$(srcdir)/'`../ctrlssdl.cpp ctrlssdl.obj: ../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ctrlssdl.obj -MD -MP -MF $(DEPDIR)/ctrlssdl.Tpo -c -o ctrlssdl.obj `if test -f '../ctrlssdl.cpp'; then $(CYGPATH_W) '../ctrlssdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../ctrlssdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ctrlssdl.Tpo $(DEPDIR)/ctrlssdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ctrlssdl.cpp' object='ctrlssdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ctrlssdl.obj `if test -f '../ctrlssdl.cpp'; then $(CYGPATH_W) '../ctrlssdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../ctrlssdl.cpp'; fi` driver.o: ../driver.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT driver.o -MD -MP -MF $(DEPDIR)/driver.Tpo -c -o driver.o `test -f '../driver.cpp' || echo '$(srcdir)/'`../driver.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/driver.Tpo $(DEPDIR)/driver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../driver.cpp' object='driver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o driver.o `test -f '../driver.cpp' || echo '$(srcdir)/'`../driver.cpp driver.obj: ../driver.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT driver.obj -MD -MP -MF $(DEPDIR)/driver.Tpo -c -o driver.obj `if test -f '../driver.cpp'; then $(CYGPATH_W) '../driver.cpp'; else $(CYGPATH_W) '$(srcdir)/../driver.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/driver.Tpo $(DEPDIR)/driver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../driver.cpp' object='driver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o driver.obj `if test -f '../driver.cpp'; then $(CYGPATH_W) '../driver.cpp'; else $(CYGPATH_W) '$(srcdir)/../driver.cpp'; fi` install-ApplicationsDATA: $(Applications_DATA) @$(NORMAL_INSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(Applicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(Applicationsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(Applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(Applicationsdir)" || exit $$?; \ done uninstall-ApplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(Applicationsdir)'; $(am__uninstall_files_from_dir) install-gladeDATA: $(glade_DATA) @$(NORMAL_INSTALL) @list='$(glade_DATA)'; test -n "$(gladedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(gladedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(gladedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gladedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(gladedir)" || exit $$?; \ done uninstall-gladeDATA: @$(NORMAL_UNINSTALL) @list='$(glade_DATA)'; test -n "$(gladedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(gladedir)'; $(am__uninstall_files_from_dir) install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \ done uninstall-pixmapDATA: @$(NORMAL_UNINSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" "$(DESTDIR)$(gladedir)" "$(DESTDIR)$(pixmapdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-ApplicationsDATA install-gladeDATA \ install-pixmapDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-ApplicationsDATA uninstall-binPROGRAMS \ uninstall-gladeDATA uninstall-pixmapDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install \ install-ApplicationsDATA install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-gladeDATA install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pixmapDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-ApplicationsDATA uninstall-am \ uninstall-binPROGRAMS uninstall-gladeDATA uninstall-pixmapDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/gtk-glade/dTools/0000755000175000017500000000000012140305320017602 5ustar guillaumeguillaumedesmume-0.9.9/src/gtk-glade/dTools/callbacks_3_palview.cpp0000755000175000017500000001176312140261477024227 0ustar guillaumeguillaume/* callbacks_3_palview.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_dtools.h" void init_combo_palette(GtkComboBox *combo, u16 ** addresses) { GtkTreeIter iter; GtkListStore* model = gtk_list_store_new(1, G_TYPE_STRING); gtk_combo_box_set_model(combo, (GtkTreeModel*)model); int i=0; #define DO(str,addr,r) \ gtk_list_store_append (model, &iter); \ gtk_list_store_set (model, &iter, 0, str,-1); \ addresses[i]=((u16*)(addr) r); i++; DO("Main screen BG PAL", MMU.ARM9_VMEM,) DO("Main screen SPR PAL", MMU.ARM9_VMEM,+0x100) DO("Sub screen BG PAL", MMU.ARM9_VMEM,+0x200) DO("Sub screen SPR PAL", MMU.ARM9_VMEM,+0x300) DO("Main screen ExtPAL 0", MMU.ExtPal[0][0],) DO("Main screen ExtPAL 1", MMU.ExtPal[0][1],) DO("Main screen ExtPAL 2", MMU.ExtPal[0][2],) DO("Main screen ExtPAL 3", MMU.ExtPal[0][3],) DO("Sub screen ExtPAL 0", MMU.ExtPal[1][0],) DO("Sub screen ExtPAL 1", MMU.ExtPal[1][1],) DO("Sub screen ExtPAL 2", MMU.ExtPal[1][2],) DO("Sub screen ExtPAL 3", MMU.ExtPal[1][3],) DO("Main screen SPR ExtPAL 0", MMU.ObjExtPal[0][0],) DO("Main screen SPR ExtPAL 1", MMU.ObjExtPal[0][1],) DO("Sub screen SPR ExtPAL 0", MMU.ObjExtPal[1][0],) DO("Sub screen SPR ExtPAL 1", MMU.ObjExtPal[1][1],) DO("Texture PAL 0", MMU.texInfo.texPalSlot[0],) DO("Texture PAL 1", MMU.texInfo.texPalSlot[1],) DO("Texture PAL 2", MMU.texInfo.texPalSlot[2],) DO("Texture PAL 3", MMU.texInfo.texPalSlot[3],) #undef DO gtk_combo_box_set_active(combo,0); } static u16* base_addr[20]; static BOOL init=FALSE; static int palnum=0; static int palindex=0; static void refresh(); static GtkWidget * wPaint; static GtkSpinButton * wSpin; static u16 mem[0x100]; static COLOR c; static COLOR32 c32; static GdkGC * gdkGC; static inline void paint_col(int x, int y, u16 col) { c.val = col; COLOR_16_32(c,c32) gdk_rgb_gc_set_foreground(gdkGC, c32.val); gdk_draw_rectangle(wPaint->window, gdkGC, TRUE, x, y, 15, 15); } static inline void paint_cross(int x, int y) { gdk_rgb_gc_set_foreground(gdkGC, 0x808080); gdk_draw_rectangle(wPaint->window, gdkGC, TRUE, x, y, 15, 15); gdk_rgb_gc_set_foreground(gdkGC, 0xFF0000); gdk_draw_line(wPaint->window, gdkGC, x+14, y+1, x+1, y+14); gdk_draw_line(wPaint->window, gdkGC, x+1, y+1, x+14, y+14); } static void wtools_3_update() { int i,x,y,X,Y; u16 * addr = base_addr[palindex], tmp; gdkGC = gdk_gc_new(wPaint->window); if (addr) { memcpy(mem, addr, 0x100*sizeof(u16)); i=0; for(y=Y= 0; y < 16; y++,Y+=16) for(x=X= 0; x < 16; x++,X+=16) { tmp=mem[i]; if (tmp != (mem[i]=*(addr+Y+x+0x100*palnum))) paint_col(X,Y,mem[i]); } } else { for(y=Y= 0; y < 16; y++,Y+=16) for(x=X= 0; x < 16; x++,X+=16) paint_cross(X,Y); } g_object_unref(gdkGC); } static void refresh() { int x,y,X,Y; u16 * addr = base_addr[palindex]; gdkGC = gdk_gc_new(wPaint->window); if (addr) { memcpy(mem, addr, 0x100*sizeof(u16)); for(y=Y= 0; y < 16; y++,Y+=16) for(x=X= 0; x < 16; x++,X+=16) paint_col(X,Y,*(addr+Y+x+0x100*palnum)); } else { for(y=Y= 0; y < 16; y++,Y+=16) for(x=X= 0; x < 16; x++,X+=16) paint_cross(X,Y); } g_object_unref(gdkGC); } static void initialize() { GtkComboBox * combo; if (init) return; wPaint= glade_xml_get_widget(xml_tools, "wtools_3_draw"); wSpin = (GtkSpinButton*)glade_xml_get_widget(xml_tools, "wtools_3_palnum"); combo = (GtkComboBox*)glade_xml_get_widget(xml_tools, "wtools_3_palette"); init_combo_palette(combo, base_addr); init=TRUE; } void on_wtools_3_PalView_show (GtkWidget *widget, gpointer data) { initialize(); register_Tool(wtools_3_update); } gboolean on_wtools_3_PalView_close (GtkWidget *widget, ...) { unregister_Tool(wtools_3_update); gtk_widget_hide(widget); return TRUE; } gboolean on_wtools_3_draw_expose_event (GtkWidget * widget, GdkEventExpose *event, gpointer user_data) { refresh(); return TRUE; } void on_wtools_3_palette_changed (GtkComboBox *combo, gpointer user_data) { palindex = gtk_combo_box_get_active(combo); gtk_widget_set_sensitive((GtkWidget*)wSpin,(palindex >=4)); gtk_spin_button_set_value(wSpin,0); refresh(); } void on_wtools_3_palnum_value_changed (GtkSpinButton *spin, gpointer user_data) { palnum = gtk_spin_button_get_value_as_int(spin); refresh(); } desmume-0.9.9/src/gtk-glade/dTools/callbacks_4_tileview.cpp0000755000175000017500000002302412140261477024402 0ustar guillaumeguillaume/* callbacks_3_palview.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_dtools.h" #ifdef GTKGLEXT_AVAILABLE #include "../gdk_gl.h" void init_combo_memory(GtkComboBox *combo, u8 ** addresses) { GtkTreeIter iter; GtkListStore* model = gtk_list_store_new(1, G_TYPE_STRING); gtk_combo_box_set_model(combo, (GtkTreeModel*)model); int i=0; #define DO(str,addr,r) \ gtk_list_store_append (model, &iter); \ gtk_list_store_set (model, &iter, 0, str,-1); \ addresses[i]=(addr r); i++; // FIXME: update tileview to actually work // DO("A-BG - 0x6000000",MMU.ARM9_ABG,) // DO("A-BG - 0x6010000",MMU.ARM9_ABG,+0x10000) // DO("A-BG - 0x6020000",MMU.ARM9_ABG,+0x20000) // DO("A-BG - 0x6030000",MMU.ARM9_ABG,+0x30000) // DO("A-BG - 0x6040000",MMU.ARM9_ABG,+0x40000) // DO("A-BG - 0x6050000",MMU.ARM9_ABG,+0x50000) // DO("A-BG - 0x6060000",MMU.ARM9_ABG,+0x60000) // DO("A-BG - 0x6070000",MMU.ARM9_ABG,+0x70000) // DO("B-BG - 0x6200000",MMU.ARM9_BBG,) // DO("B-BG - 0x6210000",MMU.ARM9_BBG,+0x10000) // DO("A-OBJ- 0x6400000",MMU.ARM9_AOBJ,) // DO("A-OBJ- 0x6410000",MMU.ARM9_AOBJ,+0x10000) // DO("A-OBJ- 0x6420000",MMU.ARM9_AOBJ,+0x20000) // DO("A-OBJ- 0x6430000",MMU.ARM9_AOBJ,+0x30000) // DO("B-OBJ- 0x6600000",MMU.ARM9_BOBJ,) // DO("B-OBJ- 0x6610000",MMU.ARM9_BOBJ,+0x10000) DO("LCD - 0x6800000",MMU.ARM9_LCD,) DO("LCD - 0x6810000",MMU.ARM9_LCD,+0x10000) DO("LCD - 0x6820000",MMU.ARM9_LCD,+0x20000) DO("LCD - 0x6830000",MMU.ARM9_LCD,+0x30000) DO("LCD - 0x6840000",MMU.ARM9_LCD,+0x40000) DO("LCD - 0x6850000",MMU.ARM9_LCD,+0x50000) DO("LCD - 0x6860000",MMU.ARM9_LCD,+0x60000) DO("LCD - 0x6870000",MMU.ARM9_LCD,+0x70000) DO("LCD - 0x6880000",MMU.ARM9_LCD,+0x80000) DO("LCD - 0x6890000",MMU.ARM9_LCD,+0x90000) #undef DO gtk_combo_box_set_active(combo,0); } static u16* pal_addr[20]; static u8* mem_addr[26]; static BOOL init=FALSE; static int palnum=0; static int palindex=0; static int memnum=0; static int colnum=0; static void refresh(); static GtkWidget * wPaint; static GtkSpinButton * wSpin; static int gl_context_num=0; #define TILE_NUM_MAX 1024 #define TILE_W_SZ 8 #define TILE_H_SZ 8 static void wtools_4_update() { } typedef u16 tileBMP[8*8]; static void refresh() { u16 palette_16[64]; u16 palette_256[64]; u8 * index16, * index256, * indexBMP; u16 * pal; int tile_n, index; guint Textures; if (!init) return; index16 = index256 = indexBMP = mem_addr[memnum]; // this little thing doesnt display properly // nothing drawn... // seems that is the context is not shared there is a pb switching context /* if (!my_gl_Begin(gl_context_num)) return; glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); my_gl_DrawBeautifulQuad(); my_gl_End(gl_context_num); return; */ if (!my_gl_Begin(gl_context_num)) return; glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); #if 1 glEnable(GL_TEXTURE_2D); glGenTextures(1, &Textures); //proxy glBindTexture(GL_TEXTURE_2D, Textures); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, indexBMP); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex2d(-1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex2d( 1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex2d( 1.0,-1.0); glTexCoord2f(0.0, 1.0); glVertex2d(-1.0,-1.0); glEnd(); glDeleteTextures(1, &Textures); my_gl_End(gl_context_num); return; glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL); switch(colnum) { case 0: //BMP for (tile_n=0; tile_n> 5)<<3, 8, 8, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, indexBMP); indexBMP +=64; } break; case 1: //256c pal = pal_addr[palindex]; if (pal) { pal += palnum*256; for (tile_n=0; tile_n<1024; tile_n++) { for (index=0; index<64; index++) { palette_256[index]=pal[*index256]; index256++; } glTexSubImage2D(GL_TEXTURE_2D, 0, (tile_n & 0x1F)<<3, (tile_n >> 5)<<3, 8, 8, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_256); } } break; case 2: //16c pal = pal_addr[palindex]; if (pal) { pal += palnum*16; for (tile_n=0; tile_n<1024; tile_n++) { for (index=0; index<64-1; index++) { if (index & 1) continue; palette_16[index] =pal[*index16 & 15]; palette_16[index+1]=pal[*index16 >> 4]; index16++; } glTexSubImage2D(GL_TEXTURE_2D, 0, (tile_n & 0x1F)<<3, (tile_n >> 5)<<3, 8, 8, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_16); } } break; } glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex2d(-0.5, 0.5); glTexCoord2f(0.0, 1.0); glVertex2d(-0.5,-0.5); glTexCoord2f(1.0, 1.0); glVertex2d( 0.5,-0.5); glTexCoord2f(1.0, 0.0); glVertex2d( 0.5, 0.5); glEnd(); glDeleteTextures(1, &Textures); #else glDisable(GL_LIGHTING); glDisable(GL_BLEND); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor4ub(255,255,255,255); switch(colnum) { case 0: //BMP { tileBMP tiles * = indexBMP; for (tile_n=0; tile_n<1024; tile_n++) { i = (tile_n & 0x1F) << 4; j = (tile_n >> 5) << 12; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; j+=512; memcpy(bmp + j + i, indexBMP, 16); indexBMP += 16; } glRasterPos2i(0,0); glDrawPixels(256,256,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV, bmp); } break; case 1: //256c if (pal = pal_addr[palindex]) { pal += palnum*256; for (tile_n=0; tile_n<1024; tile_n++) { for (index=0; index<64; index++) { palette_256[index]=pal[*index256]; index256++; } glRasterPos2i((tile_n & 0x1F)<<3, (tile_n >> 5)<<3); glDrawPixels(8,8,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_256); } } break; case 2: //16c if (pal = pal_addr[palindex]) { pal += palnum*16; for (tile_n=0; tile_n<1024; tile_n++) { for (index=0; index<64; index++) { if (index & 1) continue; palette_16[index] =pal[*index16 & 15]; palette_16[index+1]=pal[*index16 >> 4]; index16++; } glRasterPos2i((tile_n & 0x1F)<<3, (tile_n >> 5)<<3); glDrawPixels(8,8,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_16); } } break; } #endif my_gl_End(gl_context_num); } static void initialize() { GtkComboBox * combo; if (init) return; wPaint= glade_xml_get_widget(xml_tools, "wDraw_Tile"); wSpin = (GtkSpinButton*)glade_xml_get_widget(xml_tools, "wtools_4_palnum"); combo = (GtkComboBox*)glade_xml_get_widget(xml_tools, "wtools_4_palette"); init_combo_palette(combo, pal_addr); combo = (GtkComboBox*)glade_xml_get_widget(xml_tools, "wtools_4_memory"); init_combo_memory(combo, mem_addr); gl_context_num = init_GL_free_s(wPaint,0); reshape(wPaint, gl_context_num); gtk_widget_show(wPaint); init=TRUE; } void on_wtools_4_TileView_show (GtkWidget *widget, gpointer data) { initialize(); register_Tool(wtools_4_update); } gboolean on_wtools_4_TileView_close (GtkWidget *widget, ...) { unregister_Tool(wtools_4_update); gtk_widget_hide(widget); return TRUE; } void on_wtools_4_palette_changed (GtkComboBox *combo, gpointer user_data) { palindex = gtk_combo_box_get_active(combo); gtk_widget_set_sensitive((GtkWidget*)wSpin,(palindex >=4)); gtk_spin_button_set_value(wSpin,0); gtk_widget_queue_draw(wPaint); } void on_wtools_4_palnum_value_changed (GtkSpinButton *spin, gpointer user_data) { palnum = gtk_spin_button_get_value_as_int(spin); gtk_widget_queue_draw(wPaint); } void on_wtools_4_memory_changed (GtkComboBox *combo, gpointer user_data) { memnum = gtk_combo_box_get_active(combo); gtk_widget_queue_draw(wPaint); } void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data) { colnum = dyn_CAST(int,user_data); gtk_widget_queue_draw(wPaint); } gboolean on_wDraw_Tile_expose_event (GtkWidget * w, GdkEventExpose * e, gpointer user_data) { refresh(); return TRUE; } #else void on_wtools_4_TileView_show (GtkWidget *widget, gpointer data) { } gboolean on_wtools_4_TileView_close (GtkWidget *widget, ...) { return FALSE; } void on_wtools_4_palette_changed (GtkComboBox *combo, gpointer user_data) { } void on_wtools_4_palnum_value_changed (GtkSpinButton *spin, gpointer user_data) { } void on_wtools_4_memory_changed (GtkComboBox *combo, gpointer user_data) { } void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data) { } gboolean on_wDraw_Tile_expose_event (GtkWidget * w, GdkEventExpose * e, gpointer user_data) { return FALSE; } #endif desmume-0.9.9/src/gtk-glade/dTools/callbacks_1_ioregs.cpp0000755000175000017500000001045112140261477024037 0ustar guillaumeguillaume/* callbacks_1_ioregs.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_dtools.h" #include "dTools_display.h" /* ***** ***** IO REGISTERS ***** ***** */ static int cpu=0; static BOOL init=FALSE; static int size_=0; static dTools_dsp dsp; static void update_regs_fast(); static void update_regs(); /* Register name list */ #define NBR_IO_REGS 7 typedef struct { char name[20]; u32 addr; BOOL trunc; } reg_name_addr; const reg_name_addr Reg_Names_Addr[NBR_IO_REGS] = { { "REG_IPCFIFOCNT", REG_IPCFIFOCNT, TRUE }, { "REG_SPICNT", REG_SPICNT, TRUE }, { "REG_IME", REG_IME, TRUE }, { "REG_IE", REG_IE, FALSE }, { "REG_IF", REG_IF, FALSE }, { "REG_POWCNT1", REG_POWCNT1, TRUE }, { "REG_DISPCAPCNT", REG_DISPA_DISPCAPCNT, FALSE } }; /* update */ static void wtools_1_update () { update_regs_fast(); } /* Update register display */ static u32 mem[NBR_IO_REGS]; static void update_regs_fast(){ char text[11]; int i; u32 w, m; for( i = 0; i < NBR_IO_REGS; i++ ) { w = MMU_read32(cpu,Reg_Names_Addr[i].addr); m = mem[i]; if ( Reg_Names_Addr[i].trunc ) { w &= 0xFFFF; m &= 0xFFFF; } mem[i] = w; if (w == m) continue; if ( Reg_Names_Addr[i].trunc ) sprintf(text, " 0x%04X", w); else sprintf(text, "0x%08X", w); dTools_display_select_attr(&dsp, 2); dTools_display_clear_char(&dsp, size_+3, i, 10); dTools_display_draw_text(&dsp, size_+3, i, text); } } static void update_regs() { char text[80]; int len, i; if (init==FALSE) { GtkWidget * wPaint = glade_xml_get_widget(xml_tools, "wtools_1_draw"); for( i = 0; i < NBR_IO_REGS; i++ ) { len = strlen(Reg_Names_Addr[i].name); if (size_ "); dTools_display_add_markup(&dsp, "0x00000000"); dTools_display_add_markup(&dsp, "0x00000000"); init=TRUE; } dTools_display_clear(&dsp); for( i = 0; i < NBR_IO_REGS; i++ ) { mem[i] = MMU_read32(cpu,Reg_Names_Addr[i].addr); if ( Reg_Names_Addr[i].trunc ) sprintf(text, " 0x%04X", mem[i]); else sprintf(text, "0x%08X", mem[i]); dTools_display_select_attr(&dsp, 0); dTools_display_draw_text(&dsp, 0, i, Reg_Names_Addr[i].name); dTools_display_draw_text(&dsp, size_, i, " : "); dTools_display_select_attr(&dsp, 1); dTools_display_draw_text(&dsp, size_+3, i, text); } } gboolean on_wtools_1_draw_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { // clear the red marks :) if (event->button==1) update_regs(); return TRUE; } gboolean on_wtools_1_draw_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { update_regs(); return TRUE; } void on_wtools_1_combo_cpu_changed (GtkComboBox *widget, gpointer user_data) { /* c == 0 means ARM9 */ cpu=gtk_combo_box_get_active(widget); update_regs(); } /* show, register, unregister */ void on_wtools_1_IOregs_show (GtkWidget *widget, gpointer user_data) { GtkWidget * combo = glade_xml_get_widget(xml_tools, "wtools_1_combo_cpu"); // do as if we had selected this button and ARM7 cpu gtk_combo_box_set_active((GtkComboBox*)combo, 0); register_Tool(wtools_1_update); } gboolean on_wtools_1_IOregs_close (GtkWidget *widget, ...) { unregister_Tool(wtools_1_update); gtk_widget_hide(widget); return TRUE; } desmume-0.9.9/src/gtk-glade/dTools/callbacks_dtools.h0000755000175000017500000001041312140261477023276 0ustar guillaumeguillaume/* callbacks_dtools.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __CALLBACKS_DTOOLS_H__ #define __CALLBACKS_DTOOLS_H__ #include "../globals.h" extern "C" { /* ***** ***** IO REGISTERS ***** ***** */ G_MODULE_EXPORT void on_wtools_1_combo_cpu_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_1_IOregs_show (GtkWidget *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_1_IOregs_close (GtkWidget *, ...); G_MODULE_EXPORT gboolean on_wtools_1_draw_button_release_event(GtkWidget *, GdkEventButton *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_1_draw_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); /* ***** ***** MEMORY VIEWER ***** ***** */ G_MODULE_EXPORT void on_wtools_2_MemView_show (GtkWidget *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_2_MemView_close (GtkWidget *, ...); G_MODULE_EXPORT void on_wtools_2_cpu_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_2_r8_toggled (GtkToggleButton *, gpointer ); G_MODULE_EXPORT void on_wtools_2_r16_toggled (GtkToggleButton *, gpointer ); G_MODULE_EXPORT void on_wtools_2_r32_toggled (GtkToggleButton *, gpointer ); G_MODULE_EXPORT void on_wtools_2_GotoAddress_activate (GtkEntry *, gpointer ); G_MODULE_EXPORT void on_wtools_2_GotoAddress_changed (GtkEntry *, gpointer ); G_MODULE_EXPORT void on_wtools_2_GotoButton_clicked (GtkButton *, gpointer ); G_MODULE_EXPORT void on_wtools_2_scroll_value_changed (GtkRange *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_2_draw_button_release_event(GtkWidget *, GdkEventButton *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_2_draw_expose_event (GtkWidget *, GdkEventExpose *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_2_draw_scroll_event (GtkWidget *, GdkEventScroll *, gpointer ); /* ***** ***** PALETTE VIEWER ***** ***** */ // initialise combo box for all palettes void init_combo_palette(GtkComboBox *combo, u16 ** addresses); G_MODULE_EXPORT void on_wtools_3_PalView_show (GtkWidget *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_3_PalView_close (GtkWidget *, ...); G_MODULE_EXPORT gboolean on_wtools_3_PalView_delete_event (GtkWidget *, GdkEvent *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_3_draw_expose_event (GtkWidget *, GdkEventExpose *, gpointer ); G_MODULE_EXPORT void on_wtools_3_palette_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_3_palnum_value_changed (GtkSpinButton *, gpointer ); /* ***** ***** TILE VIEWER ***** ***** */ // initialise combo box for all palettes void init_combo_memory(GtkComboBox *combo, u8 ** addresses); G_MODULE_EXPORT void on_wtools_4_TileView_show (GtkWidget *, gpointer ); G_MODULE_EXPORT gboolean on_wtools_4_TileView_close (GtkWidget *, ...); G_MODULE_EXPORT gboolean on_wtools_4_TileView_delete_event (GtkWidget *, GdkEvent *, gpointer ); G_MODULE_EXPORT void on_wtools_4_memory_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_4_palette_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_4_palnum_value_changed (GtkSpinButton *, gpointer ); G_MODULE_EXPORT void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data); G_MODULE_EXPORT gboolean on_wDraw_Tile_expose_event (GtkWidget *, GdkEventExpose *, gpointer ); } #endif desmume-0.9.9/src/gtk-glade/dTools/dTools_display.h0000755000175000017500000000674112140261477022775 0ustar guillaumeguillaume/* dTools_display.c * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef _DTOOLS_DISPLAY_H_ #define _DTOOLS_DISPLAY_H_ #include typedef struct { GtkWidget *widget; GdkDrawable *draw; GdkGC *gc_fg; GdkGC *gc_bg; PangoLayout* playout; int size_w, size_h; int char_w, char_h, padding; GList * colors_rgb; GList * attr_list; PangoAttrList * curr_attr; } dTools_dsp; static void inline dTools_display_set_size(dTools_dsp * dsp, int w, int h, int pad) { dsp->size_w = w; dsp->size_h = h; dsp->padding = pad; // gtk_widget_set_size_request(dsp->widget, // dsp->char_w * w + pad * 2, dsp->char_h * h + pad * 2); gtk_widget_set_usize(dsp->widget, dsp->char_w * w + pad * 2, dsp->char_h * h + pad * 2); } static void inline dTools_display_init(dTools_dsp * dsp, GtkWidget * widget, int w, int h, int pad) { dsp->widget = widget; dsp->draw = widget->window; dsp->gc_fg = widget->style->fg_gc[widget->state]; dsp->gc_bg = widget->style->white_gc; dsp->playout = gtk_widget_create_pango_layout(widget, NULL); dsp->colors_rgb = NULL; dsp->attr_list = NULL; dsp->curr_attr = NULL; pango_layout_set_markup(dsp->playout, "X",-1); pango_layout_get_pixel_size(dsp->playout, &dsp->char_w, &dsp->char_h); dTools_display_set_size(dsp, w, h, pad); } // void unref (gpointer data, ...) { // pango_attr_list_unref(data); // } static void inline dTools_display_free(dTools_dsp * dsp) { // g_list_foreach(dsp->attr_list, (GFunc)unref, NULL); // g_object_unref(dsp->playout); // not alloc } static void inline dTools_display_add_markup(dTools_dsp * dsp, const char * markup) { PangoAttrList *attr; pango_parse_markup (markup, -1, 0, &attr, NULL, NULL, NULL); dsp->attr_list = g_list_append(dsp->attr_list, attr); dsp->curr_attr = attr; } static void inline dTools_display_clear(dTools_dsp * dsp) { gdk_draw_rectangle(dsp->draw, dsp->gc_bg, TRUE, 0, 0, dsp->widget->allocation.width, dsp->widget->allocation.height); } static void inline dTools_display_clear_char(dTools_dsp * dsp, int x, int y, int nb) { gdk_draw_rectangle(dsp->draw, dsp->gc_bg, TRUE, x * dsp->char_w + dsp->padding, y * dsp->char_h + dsp->padding, nb * dsp->char_w, dsp->char_h); } static void inline dTools_display_select_attr(dTools_dsp * dsp, int index) { PangoAttrList *attr = NULL; attr = (PangoAttrList*) g_list_nth_data(dsp->attr_list, index); if (attr != NULL) { dsp->curr_attr = attr; } pango_layout_set_attributes(dsp->playout, dsp->curr_attr); } static void inline dTools_display_draw_text(dTools_dsp * dsp, int x, int y, const char * txt) { pango_layout_set_text(dsp->playout, txt, -1); gdk_draw_layout(dsp->draw, dsp->gc_fg, x * dsp->char_w + dsp->padding, y * dsp->char_h + dsp->padding, dsp->playout); } #endif desmume-0.9.9/src/gtk-glade/dTools/callbacks_2_memview.cpp0000755000175000017500000001731612140261477024230 0ustar guillaumeguillaume/* callbacks_2_memview.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_dtools.h" #include "dTools_display.h" /* ***** ***** MEMORY VIEWER ***** ***** */ enum SHOW { Bit8, Bit16, Bit32 }; static BOOL init=FALSE; static enum SHOW packmode=Bit8; static u32 address=0, tmpaddr=0; int cpu=0; static char patt[512]; static u8 mem[0x100]; static dTools_dsp dsp; static GtkEntry *wAddress; static GtkRange *wRange; static void refresh(); static void initialize(); /* update */ static void wtools_2_update() { int i,j; u8 m8, *mem8 =mem; u16 m16, *mem16=(u16*)mem; u32 m32, *mem32=(u32*)mem; u32 addr; char txt[16]; // red dTools_display_select_attr(&dsp, 3); addr = address; switch (packmode) { case Bit8: for (i=0; i<0x10; i++) { for (j=0; j<16; j++, addr++,mem8++) { m8 = *mem8; *mem8 = MMU_read8(cpu, addr); if (m8 != *mem8) { sprintf(txt, "%02X", *mem8); dTools_display_clear_char(&dsp, 12+3*j, i, 3); dTools_display_draw_text(&dsp, 12+3*j, i, txt); } } } break; case Bit16: for (i=0; i<0x10; i++) { for (j=0; j<16; j+=2, addr+=2,mem16++) { m16 = *mem16; *mem16 = MMU_read16(cpu, addr); if (m16 != *mem16) { sprintf(txt, " %04X", *mem16); dTools_display_clear_char(&dsp, 12+3*j, i, 6); dTools_display_draw_text(&dsp, 12+3*j, i, txt); } } } break; case Bit32: for (i=0; i<0x10; i++) { for (j=0; j<16; j+=4, addr+=4,mem32++) { m32 = *mem32; *mem32 = MMU_read32(cpu, addr); if (m32 != *mem32) { sprintf(txt, " %08X", *mem32); dTools_display_clear_char(&dsp, 12+3*j, i, 12); dTools_display_draw_text(&dsp, 12+3*j, i, txt); } } } break; } } gboolean on_wtools_2_draw_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { // clear the red marks :) if (event->button==1) refresh(); return TRUE; } /* which cpu we look into */ void on_wtools_2_cpu_changed (GtkComboBox *widget, gpointer user_data) { /* c == 0 means ARM9 */ cpu=gtk_combo_box_get_active(widget); refresh(); } /* how to pack bytes */ void on_wtools_2_r8_toggled (GtkToggleButton *togglebutton, gpointer user_data) { packmode=Bit8; refresh(); } void on_wtools_2_r16_toggled (GtkToggleButton *togglebutton, gpointer user_data) { packmode=Bit16; refresh(); } void on_wtools_2_r32_toggled (GtkToggleButton *togglebutton, gpointer user_data) { packmode=Bit32; refresh(); } /* which address */ #define RANGE_MIN 0 #define RANGE_MAX 0x10000000 #define ADDR_MASK 0xFFFFFFF #define STEP_ONE_LINE 0x1 #define STEP_ONE_PAGE 0x10 #define STEP_x10_PAGE 0x100 static void scroll_address(u32 addr) { address = (addr & ADDR_MASK); refresh(); } static void change_address(u32 addr) { addr /= 0x10; gtk_range_set_value(wRange, addr); } static void add_to_address(s32 inc) { u32 addr = (address+inc) & ADDR_MASK; gtk_range_set_value(wRange, addr); } void on_wtools_2_GotoAddress_activate (GtkEntry *entry, gpointer user_data) { change_address(strtol(gtk_entry_get_text(entry),NULL,0)); } void on_wtools_2_GotoAddress_changed (GtkEntry *entry, gpointer user_data) { tmpaddr=strtol(gtk_entry_get_text(entry),NULL,0); } void on_wtools_2_GotoButton_clicked (GtkButton *button, gpointer user_data) { change_address(tmpaddr); } /* show, register, unregister */ void on_wtools_2_MemView_show (GtkWidget *widget, gpointer user_data) { initialize(); register_Tool(wtools_2_update); } gboolean on_wtools_2_MemView_close (GtkWidget *widget, ...) { unregister_Tool(wtools_2_update); dTools_display_free(&dsp); gtk_widget_hide(widget); return TRUE; } /* scroll functions :D */ void on_wtools_2_scroll_value_changed (GtkRange *range, gpointer user_data) { u32 addr=(u32)gtk_range_get_value(range); scroll_address(addr); } gboolean on_wtools_2_draw_scroll_event (GtkWidget *widget, GdkEventScroll *event, gpointer user_data) { switch (event->direction) { case GDK_SCROLL_UP: add_to_address(-STEP_ONE_PAGE); break; case GDK_SCROLL_DOWN: add_to_address(+STEP_ONE_PAGE); break; case GDK_SCROLL_LEFT: case GDK_SCROLL_RIGHT: default: break; } return TRUE; } gboolean on_wtools_2_draw_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { refresh(); return TRUE; } /* initialise what we have to */ static void initialize() { GtkWidget * combo; GtkWidget * wPaint; GtkAdjustment *adj; if (init) return; combo = glade_xml_get_widget(xml_tools, "wtools_2_cpu"); adj = (GtkAdjustment *)gtk_adjustment_new (RANGE_MIN, RANGE_MIN, RANGE_MAX, STEP_ONE_LINE, STEP_x10_PAGE, STEP_ONE_PAGE); // get widget reference wAddress = (GtkEntry*)glade_xml_get_widget(xml_tools, "wtools_2_GotoAddress"); wRange = (GtkRange*)glade_xml_get_widget(xml_tools, "wtools_2_scroll"); wPaint = glade_xml_get_widget(xml_tools, "wtools_2_draw"); dTools_display_init(&dsp, wPaint, 80, 16, 5); #define PATT(x) x"" x "" #define DUP(x) x x sprintf(patt, "0000:0000 | %s| 0123456789ABCDEF", DUP(DUP(DUP(PATT("00_")))) ); dTools_display_add_markup(&dsp, patt); sprintf(patt, "0000:0000 | %s| 0123456789ABCDEF", DUP(DUP(PATT("_0000_"))) ); dTools_display_add_markup(&dsp, patt); sprintf(patt, "0000:0000 | %s| 0123456789ABCDEF", DUP(PATT("__00000000__")) ); dTools_display_add_markup(&dsp, patt); #undef DUP #undef PATT strcpy(patt, "__00000000__"); dTools_display_add_markup(&dsp, patt); init = TRUE; gtk_combo_box_set_active((GtkComboBox*)combo, 0); gtk_range_set_adjustment(wRange, adj); change_address(RANGE_MIN); } /* PAINT memory panel */ static void refresh() { int i,j,addr; u8 c; u8 *mem8=mem; u16 *mem16=(u16*)mem; u32 *mem32=(u32*)mem; char *ptxt, txt[]="0000:0000 | 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | 0123456789ABCDEF\0"; if (!init) return; addr=address * 0x10; for (i=0; i<0x100; i++) mem[i] = MMU_read8(cpu, addr+i); dTools_display_clear(&dsp); switch(packmode) { case Bit8: dTools_display_select_attr(&dsp, 0); break; case Bit16: dTools_display_select_attr(&dsp, 1); break; case Bit32: dTools_display_select_attr(&dsp, 2); break; } // draw memory content here for (i=0; i<0x10; i++) { ptxt = txt; sprintf(ptxt, "%04X:%04X | ", (addr>>16)&0xFFFF, addr&0xFFFF); ptxt+=12; switch(packmode) { case Bit8: for (j=0; j<16; j++,ptxt+=3) sprintf(ptxt, "%02X ", mem8[j]); break; case Bit16: for (j=0; j<16; j+=2,ptxt+=6, mem16++) sprintf(ptxt, " %04X ", *mem16); break; case Bit32: for (j=0; j<16; j+=4,ptxt+=12, mem32++) sprintf(ptxt, " %08X ", *mem32); break; } sprintf(ptxt, "| "); ptxt +=2; for (j=0; j<16; j++,ptxt++) // only ASCII printable sprintf(ptxt, "%c", ((c=mem8[j])<0x20)?'.':((c>=0x7F)?'.':c)); addr += 16; mem8 +=16; *(ptxt)=0; dTools_display_draw_text(&dsp, 0, i, txt); } } desmume-0.9.9/src/gtk-glade/callbacks.cpp0000755000175000017500000004057512140261477021015 0ustar guillaumeguillaume/* callbacks.c - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks.h" #define SAVESTATE_SLOT(x) ((x) < 10 ? (x) : 0) /* globals */ int Frameskip = 0; gboolean ScreenRightForce=FALSE; gboolean ScreenRight=FALSE; gboolean ScreenGap=FALSE; gboolean ScreenNoGap=FALSE; gboolean ScreenInvert=FALSE; /* ******** Savestate menu items handling ******** */ static void set_menuitem_label(GtkWidget * w, char * text ) { GtkLabel * child; if ( GTK_BIN(w)->child ) { child = (GtkLabel*)GTK_BIN(w)->child; gtk_label_set_text(child, text); } } static void clear_savestate_menu(const char * cb_name, u8 num) { GtkWidget * w; char cb[40]; char text[40]; sprintf( cb, "%s%d", cb_name, num); sprintf( text, _("State %d (empty)"), num); w = glade_xml_get_widget(xml, cb); set_menuitem_label( w, text ); } static void update_savestate_menu(const char * cb_name, u8 num) { GtkWidget * w; char cb[40]; snprintf( cb, 39, "%s%d", cb_name, num); w = glade_xml_get_widget(xml, cb); set_menuitem_label( w, savestates[SAVESTATE_SLOT(num)].date ); } static void update_savestates_menu() { u8 i; for( i = 1; i <= NB_STATES; i++ ) { if( savestates[SAVESTATE_SLOT(i)].exists == TRUE ) { update_savestate_menu("loadstate", i); update_savestate_menu("savestate", i); } else { clear_savestate_menu("loadstate", i); clear_savestate_menu("savestate", i); } } } static void update_savestate(u8 num) { desmume_pause(); savestate_slot(SAVESTATE_SLOT(num)); update_savestate_menu("savestate", num); update_savestate_menu("loadstate", num); desmume_resume(); } /* inline & protos */ inline void SET_SENSITIVE(const gchar *w, gboolean b) { gtk_widget_set_sensitive( glade_xml_get_widget(xml, w), TRUE); } void enable_rom_features() { scan_savestates(); update_savestates_menu(); SET_SENSITIVE("menu_exec", TRUE); SET_SENSITIVE("menu_pause", TRUE); SET_SENSITIVE("menu_reset", TRUE); SET_SENSITIVE("wgt_Exec", TRUE); SET_SENSITIVE("wgt_Reset", TRUE); } static void MAINWINDOW_RESIZE() { GtkWidget * spacer1 = glade_xml_get_widget(xml, "misc_sep3"); GtkWidget * spacer2 = glade_xml_get_widget(xml, "misc_sep4"); int dim1,dim2; BOOL rotate = (ScreenRotate==90.0 || ScreenRotate==270.0 ); dim1 = dim2 = 66 * ScreenCoeff_Size[0]; /* sees whether we want a gap */ if (!ScreenGap) dim1 = dim2 = -1; if (ScreenNoGap) { gtk_widget_hide (spacer1); gtk_widget_hide (spacer2); } else { gtk_widget_show (spacer1); gtk_widget_show (spacer2); } if (ScreenRight == rotate) { if (ScreenRight) dim2 = -1; else dim1 = -1; } else { dim1 = dim2 = -1; } gtk_widget_set_usize(spacer1, dim1, -1); gtk_widget_set_usize(spacer2, -1, dim2); gtk_window_resize ((GtkWindow*)pWindow,1,1); } /* MENU FILE ***** ***** ***** ***** */ void inline ADD_FILTER(GtkWidget * filech, const char * pattern, const char * name) { GtkFileFilter *pFilter; pFilter = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter, pattern); gtk_file_filter_set_name(pFilter, name); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(filech), pFilter); } static void file_open() { desmume_pause(); GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sChemin; pParent = GTK_WIDGET(pWindow); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new(_("Open..."), GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); /* On limite les actions a cette fenetre */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); ADD_FILTER(pFileSelection, "*.nds", _("Nds binary (.nds)")); ADD_FILTER(pFileSelection, "*.ds.gba", _("Nds binary with loader (.ds.gba)")); ADD_FILTER(pFileSelection, "*", _("All files")); //ADD_FILTER(pFileSelection, "*.zip", "Nds zipped binary"); /* Affichage fenetre*/ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: /* Recuperation du chemin */ sChemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(desmume_open((const char*)sChemin) < 0) { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Unable to load :\n%s"), sChemin); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { desmume_resume(); enable_rom_features(); } g_free(sChemin); break; default: break; } gtk_widget_destroy(pFileSelection); } void on_menu_open_activate (GtkMenuItem *menuitem, gpointer user_data) { file_open();} void on_menu_quit_activate (GtkMenuItem *menuitem, gpointer user_data) { gtk_main_quit(); } #define SCREENS_PIXEL_SIZE 98304 static void Printscreen() { GdkPixbuf *screenshot; gchar *filename; GError *error = NULL; u8 *rgb; static int seq = 0; rgb = (u8 *) malloc(SCREENS_PIXEL_SIZE*3); if (!rgb) return; for (int i = 0; i < SCREENS_PIXEL_SIZE; i++) { rgb[(i * 3) + 0] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 0) & 0x1f) << 3; rgb[(i * 3) + 1] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 5) & 0x1f) << 3; rgb[(i * 3) + 2] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 10) & 0x1f) << 3; } screenshot = gdk_pixbuf_new_from_data(rgb, GDK_COLORSPACE_RGB, FALSE, 8, 256, 192*2, 256*3, NULL, NULL); filename = g_strdup_printf("./desmume-screenshot-%d.png", seq); gdk_pixbuf_save(screenshot, filename, "png", &error, NULL); if (error) { g_error_free (error); g_printerr("Failed to save %s", filename); } else { seq++; } free(rgb); g_object_unref(screenshot); g_free(filename); } void on_menu_pscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { Printscreen(); } /* MENU SAVES ***** ***** ***** ***** */ void on_loadstateXX_activate (GtkMenuItem *m, gpointer d) { int slot = dyn_CAST(int,d); loadstate_slot(SAVESTATE_SLOT(slot)); } void on_savestateXX_activate (GtkMenuItem *m, gpointer d) { int slot = dyn_CAST(int,d); update_savestate(slot); } void on_savetypeXX_activate (GtkMenuItem *m, gpointer d) { int type = dyn_CAST(int,d); desmume_savetype(type); } /* MENU EMULATION ***** ***** ***** ***** */ void on_menu_exec_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_resume(); } void on_menu_pause_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_pause(); } void on_menu_reset_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_reset(); } void on_menu_layers_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we want to hide or show the checkbox for the layers */ GtkWidget * w1 = glade_xml_get_widget(xml, "wvb_1_Main"); GtkWidget * w2 = glade_xml_get_widget(xml, "wvb_2_Sub"); if (gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem)==TRUE) { gtk_widget_show(w1); gtk_widget_show(w2); } else { gtk_widget_hide(w1); gtk_widget_hide(w2); } /* pack the window */ MAINWINDOW_RESIZE(); } /* SUBMENU FRAMESKIP ***** ***** ***** ***** */ void on_fsXX_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = dyn_CAST(int,user_data); // printf ("setting FS %d %d\n", Frameskip, user_data); } /* SUBMENU SIZE ***** ***** ***** ***** */ static void gtk_table_reattach(GtkTable * table, GtkWidget * w, guint left_attach, guint right_attach, guint top_attach, guint bottom_attach, GtkAttachOptions xoptions, GtkAttachOptions yoptions, guint xpadding, guint ypadding) { GList *list; for (list = table->children; list; list = list->next) { GtkTableChild *table_child; table_child = (GtkTableChild *) list->data; if (table_child->widget == w) { table_child->left_attach = left_attach; table_child->right_attach = right_attach; table_child->top_attach = top_attach; table_child->bottom_attach = bottom_attach; table_child->xexpand = (xoptions & GTK_EXPAND) != 0; table_child->xshrink = (xoptions & GTK_SHRINK) != 0; table_child->xfill = (xoptions & GTK_FILL) != 0; table_child->xpadding = xpadding; table_child->yexpand = (yoptions & GTK_EXPAND) != 0; table_child->yshrink = (yoptions & GTK_SHRINK) != 0; table_child->yfill = (yoptions & GTK_FILL) != 0; table_child->ypadding = ypadding; break; } } } static void rightscreen(BOOL apply) { GtkWidget *chk = glade_xml_get_widget(xml, "wvb_2_Sub"); GtkTable *table = (GtkTable *)glade_xml_get_widget(xml, "table_layout"); ScreenRight = apply || ScreenRightForce; if (ScreenRight) { /* we want to change the layout, lower screen goes right */ gtk_table_reattach(table, pDrawingArea2, 3,4, 0,1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0,0); gtk_table_reattach(table, chk, 4,5, 0,1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0,0); } else { /* we want to change the layout, lower screen goes down */ gtk_table_reattach(table, pDrawingArea2, 1,2, 2,3, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0,0); gtk_table_reattach(table, chk, 0,1, 2,3, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0,0); ScreenRight = FALSE; } gtk_widget_queue_resize (GTK_WIDGET (table)); /* pack the window */ MAINWINDOW_RESIZE(); } int H=192, W=256; void resize (float Size1, float Size2) { // not ready yet to handle different zoom factors Size2 = Size1; /* we want to scale drawing areas by a factor (1x,2x or 3x) */ gtk_widget_set_size_request (pDrawingArea, W * Size1, H * Size1); gtk_widget_set_size_request (pDrawingArea2, W * Size2, H * Size2); ScreenCoeff_Size[0] = Size1; ScreenCoeff_Size[1] = Size2; /* remove artifacts */ black_screen(); /* pack the window */ MAINWINDOW_RESIZE(); } void rotate(float angle) { BOOL rotated; if (angle >= 360.0) angle -= 360.0; ScreenRotate = angle; rotated = (ScreenRotate==90.0 || ScreenRotate==270.0); ScreenInvert = (ScreenRotate >= 180.0); if (rotated) { H=256; W=192; } else { W=256; H=192; } rightscreen(rotated); resize(ScreenCoeff_Size[0],ScreenCoeff_Size[1]); } void on_sizeXX_activate (GtkMenuItem *menuitem, gpointer user_data) { float f = dyn_CAST(float,user_data); // printf("setting ZOOM %f\n",f); resize(f,f); } /* MENU CONFIG ***** ***** ***** ***** */ void on_menu_controls_activate (GtkMenuItem *menuitem, gpointer user_data) { edit_controls(); } /* Show joystick controls configuration dialog FIXME: sdl doesn't detect unplugged joysticks!! */ void on_menu_joy_controls_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkDialog * dlg; GtkDialog * msgbox; char * text; /* At least one joystick connected? Can't configure joystick if SDL Event loop is already running. */ if( (nbr_joy < 1) || desmume_running() ) { if( nbr_joy < 1 ) text = _("You don't have any joystick!"); else text = _("Can't configure joystick while the game is running!"); dlg = (GtkDialog*)glade_xml_get_widget(xml, "wMainW"); msgbox = (GtkDialog*) gtk_message_dialog_new((GtkWindow*)dlg, (GtkDialogFlags) (GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT), GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "%s", text); g_signal_connect(G_OBJECT(msgbox), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_dialog_run( msgbox ); } else { dlg = (GtkDialog*)glade_xml_get_widget(xml, "wJoyConfDlg"); init_joy_labels(); gtk_dialog_run(dlg); } } void on_menu_audio_on_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we want set audio emulation ON or OFF */ if (gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem)) { SPU_Pause(0); } else { SPU_Pause(1); } } void on_menu_gapscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we want to add a gap between screens */ ScreenGap = gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem); /* pack the window */ MAINWINDOW_RESIZE(); } void on_menu_nogap_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we'll make both gaps visibility false */ ScreenNoGap = gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem); /* pack the window */ MAINWINDOW_RESIZE(); } void on_menu_rightscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { ScreenRightForce=gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem); rightscreen(ScreenRightForce); } void on_menu_rotatescreen_activate (GtkMenuItem *menuitem, gpointer user_data) { /* we want to rotate the screen */ float angle = dyn_CAST(float,user_data); rotate(angle); } /* MENU TOOLS ***** ***** ***** ***** */ void on_menu_IO_regs_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * dlg = glade_xml_get_widget(xml_tools, "wtools_1_IOregs"); gtk_widget_show(dlg); } void on_menu_memview_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * dlg = glade_xml_get_widget(xml_tools, "wtools_2_MemView"); gtk_widget_show(dlg); } void on_menu_palview_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * dlg = glade_xml_get_widget(xml_tools, "wtools_3_PalView"); gtk_widget_show(dlg); } #ifdef GTKGLEXT_AVAILABLE void on_menu_tileview_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * dlg = glade_xml_get_widget(xml_tools, "wtools_4_TileView"); gtk_widget_show(dlg); } #else void on_menu_tileview_activate (GtkMenuItem *menuitem, gpointer user_data) { g_printerr("You need gtkglext for the tile viewer\n"); } #endif void on_menu_wtoolsXX_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * w = (GtkWidget *) user_data; gtk_widget_show(w); } /* MENU ? ***** ***** ***** ***** */ /* About dialog FIXME: Add proper copyright */ void on_menu_apropos_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget * wAbout = glade_xml_get_widget(xml, "wAboutDlg"); gtk_about_dialog_set_version((GtkAboutDialog *)wAbout, VERSION); gtk_widget_show(wAbout); } /* TOOLBAR ***** ***** ***** ***** */ void on_wgt_Open_clicked (GtkToolButton *toolbutton, gpointer user_data) { file_open(); } void on_wgt_Reset_clicked (GtkToolButton *toolbutton, gpointer user_data) { desmume_reset(); } void on_wgt_Quit_clicked (GtkToolButton *toolbutton, gpointer user_data) { gtk_main_quit(); } void on_wgt_Exec_toggled (GtkToggleToolButton *toggletoolbutton, gpointer user_data) { if (gtk_toggle_tool_button_get_active(toggletoolbutton)==TRUE) desmume_resume(); else desmume_pause(); } /* LAYERS ***** ***** ***** ***** */ static void change_bgx_layer(int layer, gboolean state, NDS_Screen scr) { //if(!desmume_running()) return; if(state==TRUE) { GPU_addBack(scr.gpu, layer); } else { GPU_remove(scr.gpu, layer); } //fprintf(stderr,"Changed Layer %s to %d\n",layer,state); } void on_wc_1_BGXX_toggled (GtkToggleButton *togglebutton, gpointer user_data) { int layer = dyn_CAST(int,user_data); change_bgx_layer(layer, gtk_toggle_button_get_active(togglebutton), MainScreen); } void on_wc_2_BGXX_toggled (GtkToggleButton *togglebutton, gpointer user_data) { int layer = dyn_CAST(int,user_data); change_bgx_layer(layer, gtk_toggle_button_get_active(togglebutton), SubScreen); } desmume-0.9.9/src/gtk-glade/callbacks_IO.cpp0000755000175000017500000002532212140261477021375 0ustar guillaumeguillaume/* callbacks_IO.c - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Copyright (C) 2007 Pascal Giard (evilynux) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "callbacks_IO.h" #include "keyval_names.h" static u16 Cur_Keypad = 0; float ScreenCoeff_Size[2]={1.0,1.0}; float ScreenRotate=0.0; gboolean Boost=FALSE; int BoostFS=20; int saveFS; /* ***** ***** INPUT BUTTONS / KEYBOARD ***** ***** */ gboolean on_wMainW_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { u16 Key = lookup_key(event->keyval); guint mask; mask = GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_MOD5_MASK; // shift,ctrl, both alts if( (event->state & mask) == 0){ if (event->keyval == keyboard_cfg[KEY_BOOST-1]) { Boost = !Boost; if (Boost) { saveFS = Frameskip; Frameskip = BoostFS; } else { Frameskip = saveFS; } return 1; } if(Key){ ADD_KEY( Cur_Keypad, Key ); if(desmume_running()) update_keypad(Cur_Keypad); return 1; } } return 0; } gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { u16 Key = lookup_key(event->keyval); RM_KEY( Cur_Keypad, Key ); if(desmume_running()) update_keypad(Cur_Keypad); return 1; } /* ***** ***** SCREEN DRAWING ***** ***** */ #define RAW_W 256 #define RAW_H 192 #define RAW_OFFSET 256*192*sizeof(u16) #define MAX_SIZE 3 u32 on_screen_image32[RAW_W*RAW_H*2*MAX_SIZE*MAX_SIZE]; int inline screen_size() { int sz = ScreenCoeff_Size[0]; return RAW_W*RAW_H*2*sz*sz*sizeof(u32); } int inline offset_pixels_lower_screen() { return screen_size()/2; } void black_screen () { /* removes artifacts when resizing with scanlines */ memset(on_screen_image32,0,screen_size()); } #ifndef GTKGLEXT_AVAILABLE // they are empty if no opengl // else see gdk_gl.c / gdk_gl.h BOOL my_gl_Begin (int screen) { return FALSE; } void my_gl_End (int screen) {} void reshape (GtkWidget * widget, int screen) {} void init_GL_capabilities( int use_software_convert) {} int has_pix_col_map=0; u32 pix_col_map[0x8000]; static void init_pix_col_map() { // precalc factors int a,b,c,A,B,C,rA,rB,rC; if (has_pix_col_map) return; for (a=0; a<0x20; a++) { A=a<<10; rA=A<<9; for (b=0; b<0x20; b++) { B=b<<5; rB=B<<6; for (c=0; c<0x20; c++) { C=c; rC=C<<3; pix_col_map[A|B|C]=rA|rB|rC; } } } has_pix_col_map=1; } static void decode_screen () { int x,y, m, W,H,L,BL; u32 image[RAW_H*2][RAW_W], pix; u16 * pixel = (u16*)&GPU_screen; u32 * rgb32 = &on_screen_image32[0]; /* decode colors */ init_pix_col_map(); for (y=0; y= 0, x--, y=0, y < RAW_H, y++) LOOP(x=RAW_W-1, x >= 0, x--, y=RAW_H, y < RAW_H*2, y++) } else { H=RAW_H*2; W=RAW_W; LOOP(y=0, y < RAW_H*2, y++, x=0, x < RAW_W, x++) } } gboolean screen (GtkWidget * widget, int off) { int H,W,L; if (off==0) decode_screen(); if (ScreenRotate) { W=RAW_H; H=RAW_W; } else { H=RAW_H; W=RAW_W; } L=W*ScreenCoeff_Size[0]*sizeof(u32); off*= offset_pixels_lower_screen(); gdk_draw_rgb_32_image (widget->window, widget->style->fg_gc[widget->state],0,0, W*ScreenCoeff_Size[0], H*ScreenCoeff_Size[0], GDK_RGB_DITHER_NONE,((guchar*)on_screen_image32)+off,L); return TRUE; } #endif /* if GTKGLEXT_AVAILABLE */ /* OUTPUT SCREENS */ gboolean on_wDrawScreen_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); return screen(widget, scr); } gboolean on_wDrawScreen_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); reshape(widget, scr); return TRUE; } /* ***** ***** INPUT STYLUS / MOUSE ***** ***** */ static void resize_incremental(int i, GdkEventScroll *event) { #ifdef GTKGLEXT_AVAILABLE float zoom_inc=.125, zoom_min=0.25, zoom_max=5.0; #else float zoom_inc=1.0, zoom_min=1.0, zoom_max=3.0; #endif switch (event->direction) { case GDK_SCROLL_UP: ScreenCoeff_Size[i]=MIN(ScreenCoeff_Size[i]+zoom_inc,zoom_max); break; case GDK_SCROLL_DOWN: ScreenCoeff_Size[i]=MAX(ScreenCoeff_Size[i]-zoom_inc,zoom_min); break; case GDK_SCROLL_LEFT: case GDK_SCROLL_RIGHT: return; } resize(ScreenCoeff_Size[0],ScreenCoeff_Size[1]); } gboolean on_wDrawScreen_scroll_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); // separate zoom factors not supported yet scr = 0; resize_incremental(scr,(GdkEventScroll*)event); return TRUE; } static void set_touch_pos (int x, int y) { s32 EmuX, EmuY; x /= ScreenCoeff_Size[1]; y /= ScreenCoeff_Size[1]; EmuX = x; EmuY = y; if (ScreenRotate==90.0 || ScreenRotate==270.0) { EmuX = 256-y; EmuY = x; } if(EmuX<0) EmuX = 0; else if(EmuX>255) EmuX = 255; if(EmuY<0) EmuY = 0; else if(EmuY>192) EmuY = 192; if (ScreenInvert) { EmuX = 255-EmuX; EmuY = 192-EmuY; } NDS_setTouchPos(EmuX, EmuY); } gboolean on_wDrawScreen_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); GdkModifierType state; gint x,y; switch (event->button) { case 1: if (((scr==1) ^ ScreenInvert) && desmume_running()) { click = TRUE; gdk_window_get_pointer(widget->window, &x, &y, &state); if (state & GDK_BUTTON1_MASK) set_touch_pos(x,y); } break; case 3: break; case 2: // filter out 2x / 3x clicks if (event->type==GDK_BUTTON_PRESS) rotate(ScreenRotate + 90.0); break; } return TRUE; } gboolean on_wDrawScreen_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); if ((scr==1) ^ ScreenInvert) { if (click) NDS_releaseTouch(); click = FALSE; } return TRUE; } gboolean on_wDrawScreen_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { int scr = dyn_CAST(int,user_data); GdkModifierType state; gint x,y; if (((scr==1) ^ ScreenInvert) && click) { if(event->is_hint) gdk_window_get_pointer(widget->window, &x, &y, &state); else { x= (gint)event->x; y= (gint)event->y; state=(GdkModifierType)event->state; } // fprintf(stderr,"X=%d, Y=%d, S&1=%d\n", x,y,state&GDK_BUTTON1_MASK); if(state & GDK_BUTTON1_MASK) set_touch_pos(x,y); } return TRUE; } /* ***** ***** KEYBOARD CONFIG / KEY DEFINITION ***** ***** */ u16 Keypad_Temp[NB_KEYS]; guint temp_Key=0; static void init_labels() { int i; char text[50], bname[20]; GtkButton *b; for (i=0; ikeyval; current_key_label(); return TRUE; } static void ask(GtkButton*b, int key) { char text[50]; GtkDialog * dlg = (GtkDialog*)glade_xml_get_widget(xml, "wKeyDlg"); key--; /* key = bit position, start with 1 */ temp_Key = Keypad_Temp[key]; current_key_label(); switch (gtk_dialog_run(dlg)) { case GTK_RESPONSE_OK: Keypad_Temp[key]=temp_Key; snprintf(text, 50, "%s : %s",key_names[key],KEYNAME(temp_Key)); gtk_button_set_label(b,text); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: break; } gtk_widget_hide((GtkWidget*)dlg); } /* Joystick configuration / Key definition */ static void ask_joy_key(GtkButton*b, int key) { char text[50]; u16 joykey; GtkWidget * dlg = (GtkWidget*)glade_xml_get_widget(xml, "wJoyDlg"); key--; /* remove 1 to get index */ gtk_widget_show_now(dlg); /* Need to force event processing. Otherwise, popup won't show up. */ while ( gtk_events_pending() ) gtk_main_iteration(); joykey = get_set_joy_key(key); snprintf(text, 50, "%s : %d",key_names[key],joykey); gtk_button_set_label(b,text); gtk_widget_hide((GtkWidget*)dlg); } /* Bind a keyboard key to a keypad key */ void on_button_kb_key_clicked (GtkButton *b, gpointer user_data) { int key = dyn_CAST( int, user_data ); ask( b, key ); } /* Bind a joystick button to a keypad key */ void on_button_joy_key_clicked (GtkButton *b, gpointer user_data) { int key = dyn_CAST( int, user_data ); ask_joy_key( b, key ); } desmume-0.9.9/src/gtk-glade/gdk_gl.h0000755000175000017500000000276412140261477017770 0ustar guillaumeguillaume/* gdk_gl.h - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GDKGL_H__ #define __GDKGL_H__ #include "globals.h" #ifdef GTKGLEXT_AVAILABLE #include #include #include #include #endif BOOL my_gl_Begin (int screen); void my_gl_End (int screen); void my_gl_Clear(int screen); void my_gl_DrawBeautifulQuad( void); void my_gl_Identity( void); void init_GL_capabilities( int use_software_convert); void init_GL(GtkWidget * widget, int screen, int share_num); int init_GL_free_s(GtkWidget * widget, int share_num); int init_GL_free(GtkWidget * widget); void reshape (GtkWidget * widget, int screen); gboolean screen (GtkWidget * widget, int off); #endif desmume-0.9.9/src/gtk-glade/gdk_gl.cpp0000755000175000017500000002226012140261477020314 0ustar guillaumeguillaume/* gdk_gl.cpp - this file is part of DeSmuME * * Copyright (C) 2007 Damien Nozay (damdoum) * Author: damdoum at users.sourceforge.net * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "gdk_gl.h" #ifdef GTKGLEXT_AVAILABLE #include #include #define _DUP8(a) a,a,a,a, a,a,a,a #define _DUP4(a) a,a,a,a #define _DUP2(a) a,a GLuint Textures[2]; // free number we can use in tools 0-1 reserved for screens static int free_gl_drawable=2; GdkGLConfig *my_glConfig=NULL; GdkGLContext *my_glContext[8]={_DUP8(NULL)}; GdkGLDrawable *my_glDrawable[8]={_DUP8(NULL)}; GtkWidget *pDrawingTexArea; GLuint screen_texture[1]; /* enable software colour format conversion */ static int gtk_glade_use_software_colour_convert; #undef _DUP8 #undef _DUP4 #undef _DUP2 /* FIXME: Purpose of this code? */ static BOOL _fun_gl_Begin (int screen) { return FALSE; } static void _fun_gl_End (int screen) { } fun_gl_Begin Open_GL_beg = _fun_gl_Begin; fun_gl_End Open_GL_end = _fun_gl_End; void register_gl_fun(fun_gl_Begin beg,fun_gl_End end) { Open_GL_beg = beg; Open_GL_end = end; } /************************************************/ /* BEGIN & END */ /************************************************/ BOOL my_gl_Begin (int screen) { return gdk_gl_drawable_gl_begin(my_glDrawable[screen], my_glContext[screen]); } void my_gl_End (int screen) { if (gdk_gl_drawable_is_double_buffered (my_glDrawable[screen])) gdk_gl_drawable_swap_buffers (my_glDrawable[screen]); else glFlush(); gdk_gl_drawable_gl_end(my_glDrawable[screen]); } /************************************************/ /* OTHER GL COMMANDS */ /************************************************/ void my_gl_Identity() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void my_gl_DrawBeautifulQuad( void) { // beautiful quad glBegin(GL_QUADS); glColor3ub(255,0,0); glVertex2d(-0.75,-0.75); glColor3ub(128,255,0); glVertex2d(-0.75, 0.75); glColor3ub(0,255,128); glVertex2d( 0.75, 0.75); glColor3ub(0,0,255); glVertex2d( 0.75,-0.75); glEnd(); glColor3ub(255,255,255); } #if 0 /* not used */ static void my_gl_DrawLogo() { } #endif void my_gl_Clear(int screen) { if (!my_gl_Begin(screen)) return; /* Set the background black */ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearDepth(1.0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); my_gl_DrawBeautifulQuad(); my_gl_End(screen); } /************************************************/ /* INITIALIZATION */ /************************************************/ void init_GL(GtkWidget * widget, int screen, int share_num) { // for (n=gtk_events_pending(); n>0; n--) // gtk_main_iteration(); // init GL capability my_glContext[screen]=NULL; my_glDrawable[screen]=NULL; if (!gtk_widget_set_gl_capability( widget, my_glConfig, my_glContext[share_num], //NULL, TRUE, GDK_GL_RGBA_TYPE)) { printf ("gtk_widget_set_gl_capability\n"); exit(1); } // realize so that we get a GdkWindow gtk_widget_realize(widget); // make sure we realize gdk_flush(); my_glDrawable[screen] = gtk_widget_get_gl_drawable(widget); if (screen == share_num) { my_glContext[screen] = gtk_widget_get_gl_context(widget); } else { my_glContext[screen] = my_glContext[share_num]; return; } reshape(widget, screen); } int init_GL_free_s(GtkWidget * widget, int share_num) { int r = free_gl_drawable; my_glContext[r]=NULL; my_glDrawable[r]=NULL; init_GL(widget, r, share_num); free_gl_drawable++; return r; } int init_GL_free(GtkWidget * widget) { int r = free_gl_drawable; my_glContext[r]=NULL; my_glDrawable[r]=NULL; init_GL(widget, r, r); free_gl_drawable++; return r; } void init_GL_capabilities( int use_software_convert) { uint16_t blank_texture[256 * 512]; my_glConfig = gdk_gl_config_new_by_mode ( (GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE) ); gtk_glade_use_software_colour_convert = use_software_convert; // initialize 1st drawing area init_GL(pDrawingArea,0,0); my_gl_Clear(0); if (!my_gl_Begin(0)) return; // generate ONE texture (display) glEnable(GL_TEXTURE_2D); glGenTextures(2, Textures); /* Generate The Texture */ glBindTexture( GL_TEXTURE_2D, Textures[0]); memset(blank_texture, 0x001f, sizeof(blank_texture)); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 256, 512, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, blank_texture); my_gl_End(0); // initialize 2nd drawing area (sharing context) init_GL(pDrawingArea2,1,0); my_gl_Clear(1); } /************************************************/ /* RESHAPE */ /************************************************/ void reshape (GtkWidget * widget, int screen) { if (my_glDrawable[screen] == NULL || !my_gl_Begin(screen)) return; glViewport (0, 0, widget->allocation.width, widget->allocation.height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); my_gl_End(screen); } /************************************************/ /* TEXTURING */ /************************************************/ static void my_gl_Texture2D() { glBindTexture(GL_TEXTURE_2D, Textures[0]); #define MyFILTER GL_LINEAR //#define MyFILTER GL_NEAREST glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, MyFILTER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, MyFILTER); #undef MyFILTER } static void my_gl_ScreenTex( int software_convert) { if ( software_convert) { u8 converted[256 * 384 * 3]; int i; for ( i = 0; i < (256 * 384); i++) { converted[(i * 3) + 0] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 0) & 0x1f) << 3; converted[(i * 3) + 1] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 5) & 0x1f) << 3; converted[(i * 3) + 2] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 10) & 0x1f) << 3; } glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 384, GL_RGB, GL_UNSIGNED_BYTE, converted); } else { glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 384, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, &GPU_screen); } } static void my_gl_ScreenTexApply(int screen) { float off = (screen)?0.375:0; glBegin(GL_QUADS); // texcoords 0.375 means 192, 1 means 256 glTexCoord2f(0.0, off+0.000); glVertex2d(-1.0, 1.0); glTexCoord2f(1.0, off+0.000); glVertex2d( 1.0, 1.0); glTexCoord2f(1.0, off+0.375); glVertex2d( 1.0,-1.0); glTexCoord2f(0.0, off+0.375); glVertex2d(-1.0,-1.0); glEnd(); } /************************************************/ /* RENDERING */ /************************************************/ gboolean screen (GtkWidget * widget, int viewportscreen) { int screen; GPU * gpu; float bright_color = 0.0f; // blend with black float bright_alpha = 0.0f; // don't blend // we take care to draw the right thing the right place // we need to rearrange widgets not to use this trick screen = (ScreenInvert)?1-viewportscreen:viewportscreen; // screen = viewportscreen; if (!my_gl_Begin(viewportscreen)) return TRUE; glLoadIdentity(); // clear screen glClearColor(0.0f,0.0f,0.0f,0.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnable(GL_TEXTURE_2D); if (desmume_running()) { // master bright gpu = ((screen)?SubScreen:MainScreen).gpu; switch (gpu->MasterBrightMode) { case 1: // Bright up : blend with white bright_color = 1.0f; // no break; case 2: // Bright down : blend with black bright_alpha = 1.0f; // blending max bright_alpha = gpu->MasterBrightFactor / 16.0; break; // Disabled 0, Reserved 3 default: break; } // rotate glRotatef(ScreenRotate, 0.0, 0.0, 1.0); // create the texture for both display my_gl_Texture2D(); if (viewportscreen==0) { my_gl_ScreenTex( gtk_glade_use_software_colour_convert); } } else { // pause // fake master bright up 50% bright_color = 0.0f; bright_alpha = 0.5f; } // make sure current color is ok glColor4ub(255,255,255,255); // apply part of the texture my_gl_ScreenTexApply(screen); glDisable(GL_TEXTURE_2D); // master bright (bis) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(bright_color,bright_color,bright_color,bright_alpha); glBegin(GL_QUADS); glVertex2d(-1.0, 1.0); glVertex2d( 1.0, 1.0); glVertex2d( 1.0,-1.0); glVertex2d(-1.0,-1.0); glEnd(); glDisable(GL_BLEND); my_gl_End(viewportscreen); return TRUE; } #endif /* if GTKGLEXT_AVAILABLE */ desmume-0.9.9/src/gtk-glade/gdk_3Demu.h0000644000175000017500000000206012140261477020325 0ustar guillaumeguillaume/* $Id: gdk_3Demu.h,v 1.1 2007-04-21 19:45:07 evilynux Exp $ */ /* Copyright (C) 2006-2007 Ben Jaques This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef GTKGLEXT_AVAILABLE /* * The GDK 3D emulation. * This uses the OpenGL Collector plugin, using gdkGLext for the platform * specific helper functions. */ int init_opengl_gdk_3Demu( GdkDrawable * drawable); #endif desmume-0.9.9/src/saves.cpp0000644000175000017500000007631312140261633016346 0ustar guillaumeguillaume/* Copyright (C) 2006 Normmatt Copyright (C) 2006 Theo Berkau Copyright (C) 2007 Pascal Giard Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ //MUST SAVE ADDONS! OMG HOW DID WE FORGET THAT #ifdef HAVE_LIBZ #include #endif #include #include #include #include #include #include #include #include "saves.h" #include "MMU.h" #include "NDSSystem.h" #include "render3D.h" #include "cp15.h" #include "GPU_osd.h" #include "version.h" #include "readwrite.h" #include "gfx3d.h" #include "movie.h" #include "mic.h" #include "MMU_timing.h" #include "path.h" #ifdef _WINDOWS #include "windows/main.h" #endif int lastSaveState = 0; //Keeps track of last savestate used for quick save/load functions //void*v is actually a void** which will be indirected before reading //since this isnt supported right now, it is declared in here to make things compile #define SS_INDIRECT 0x80000000 savestates_t savestates[NB_STATES]; #define SAVESTATE_VERSION 12 static const char* magic = "DeSmuME SState\0"; //a savestate chunk loader can set this if it wants to permit a silent failure (for compatibility) static bool SAV_silent_fail_flag; SFORMAT SF_ARM7[]={ { "7INS", 4, 1, &NDS_ARM7.instruction }, { "7INA", 4, 1, &NDS_ARM7.instruct_adr }, { "7INN", 4, 1, &NDS_ARM7.next_instruction }, { "7REG", 4,16, NDS_ARM7.R }, { "7CPS", 4, 1, &NDS_ARM7.CPSR }, { "7SPS", 4, 1, &NDS_ARM7.SPSR }, { "7DUS", 4, 1, &NDS_ARM7.R13_usr }, { "7EUS", 4, 1, &NDS_ARM7.R14_usr }, { "7DSV", 4, 1, &NDS_ARM7.R13_svc }, { "7ESV", 4, 1, &NDS_ARM7.R14_svc }, { "7DAB", 4, 1, &NDS_ARM7.R13_abt }, { "7EAB", 4, 1, &NDS_ARM7.R14_abt }, { "7DUN", 4, 1, &NDS_ARM7.R13_und }, { "7EUN", 4, 1, &NDS_ARM7.R14_und }, { "7DIR", 4, 1, &NDS_ARM7.R13_irq }, { "7EIR", 4, 1, &NDS_ARM7.R14_irq }, { "78FI", 4, 1, &NDS_ARM7.R8_fiq }, { "79FI", 4, 1, &NDS_ARM7.R9_fiq }, { "7AFI", 4, 1, &NDS_ARM7.R10_fiq }, { "7BFI", 4, 1, &NDS_ARM7.R11_fiq }, { "7CFI", 4, 1, &NDS_ARM7.R12_fiq }, { "7DFI", 4, 1, &NDS_ARM7.R13_fiq }, { "7EFI", 4, 1, &NDS_ARM7.R14_fiq }, { "7SVC", 4, 1, &NDS_ARM7.SPSR_svc }, { "7ABT", 4, 1, &NDS_ARM7.SPSR_abt }, { "7UND", 4, 1, &NDS_ARM7.SPSR_und }, { "7IRQ", 4, 1, &NDS_ARM7.SPSR_irq }, { "7FIQ", 4, 1, &NDS_ARM7.SPSR_fiq }, { "7int", 4, 1, &NDS_ARM7.intVector }, { "7LDT", 1, 1, &NDS_ARM7.LDTBit }, { "7Wai", 4, 1, &NDS_ARM7.waitIRQ }, { "7hef", 4, 1, &NDS_ARM7.halt_IE_and_IF }, { "7iws", 1, 1, &NDS_ARM7.intrWaitARM_state }, { 0 } }; SFORMAT SF_ARM9[]={ { "9INS", 4, 1, &NDS_ARM9.instruction}, { "9INA", 4, 1, &NDS_ARM9.instruct_adr}, { "9INN", 4, 1, &NDS_ARM9.next_instruction}, { "9REG", 4,16, NDS_ARM9.R}, { "9CPS", 4, 1, &NDS_ARM9.CPSR}, { "9SPS", 4, 1, &NDS_ARM9.SPSR}, { "9DUS", 4, 1, &NDS_ARM9.R13_usr}, { "9EUS", 4, 1, &NDS_ARM9.R14_usr}, { "9DSV", 4, 1, &NDS_ARM9.R13_svc}, { "9ESV", 4, 1, &NDS_ARM9.R14_svc}, { "9DAB", 4, 1, &NDS_ARM9.R13_abt}, { "9EAB", 4, 1, &NDS_ARM9.R14_abt}, { "9DUN", 4, 1, &NDS_ARM9.R13_und}, { "9EUN", 4, 1, &NDS_ARM9.R14_und}, { "9DIR", 4, 1, &NDS_ARM9.R13_irq}, { "9EIR", 4, 1, &NDS_ARM9.R14_irq}, { "98FI", 4, 1, &NDS_ARM9.R8_fiq}, { "99FI", 4, 1, &NDS_ARM9.R9_fiq}, { "9AFI", 4, 1, &NDS_ARM9.R10_fiq}, { "9BFI", 4, 1, &NDS_ARM9.R11_fiq}, { "9CFI", 4, 1, &NDS_ARM9.R12_fiq}, { "9DFI", 4, 1, &NDS_ARM9.R13_fiq}, { "9EFI", 4, 1, &NDS_ARM9.R14_fiq}, { "9SVC", 4, 1, &NDS_ARM9.SPSR_svc}, { "9ABT", 4, 1, &NDS_ARM9.SPSR_abt}, { "9UND", 4, 1, &NDS_ARM9.SPSR_und}, { "9IRQ", 4, 1, &NDS_ARM9.SPSR_irq}, { "9FIQ", 4, 1, &NDS_ARM9.SPSR_fiq}, { "9int", 4, 1, &NDS_ARM9.intVector}, { "9LDT", 1, 1, &NDS_ARM9.LDTBit}, { "9Wai", 4, 1, &NDS_ARM9.waitIRQ}, { "9hef", 4, 1, &NDS_ARM9.halt_IE_and_IF }, { "9iws", 1, 1, &NDS_ARM9.intrWaitARM_state }, { 0 } }; SFORMAT SF_MEM[]={ { "ITCM", 1, sizeof(MMU.ARM9_ITCM), MMU.ARM9_ITCM}, { "DTCM", 1, sizeof(MMU.ARM9_DTCM), MMU.ARM9_DTCM}, //for legacy purposes, WRAX is a separate variable. shouldnt be a problem. { "WRAM", 1, 0x400000, MMU.MAIN_MEM}, { "WRAX", 1, 0x400000, MMU.MAIN_MEM+0x400000}, //NOTE - this is not as large as the allocated memory. //the memory is overlarge due to the way our memory map system is setup //but there are actually no more registers than this { "9REG", 1, 0x2000, MMU.ARM9_REG}, { "VMEM", 1, sizeof(MMU.ARM9_VMEM), MMU.ARM9_VMEM}, { "OAMS", 1, sizeof(MMU.ARM9_OAM), MMU.ARM9_OAM}, //this size is specially chosen to avoid saving the blank space at the end { "LCDM", 1, 0xA4000, MMU.ARM9_LCD}, { 0 } }; SFORMAT SF_NDS[]={ { "_WCY", 4, 1, &nds.wifiCycle}, { "_TCY", 8, 8, nds.timerCycle}, { "_VCT", 4, 1, &nds.VCount}, { "_OLD", 4, 1, &nds.old}, { "_TPX", 2, 1, &nds.adc_touchX}, { "_TPY", 2, 1, &nds.adc_touchY}, { "_TPC", 2, 1, &nds.adc_jitterctr}, { "_STX", 2, 1, &nds.scr_touchX}, { "_STY", 2, 1, &nds.scr_touchY}, { "_TPB", 4, 1, &nds.isTouch}, { "_DBG", 4, 1, &nds._DebugConsole}, { "_ENS", 4, 1, &nds.ensataEmulation}, { "_TYP", 4, 1, &nds.ConsoleType}, { "_ENH", 4, 1, &nds.ensataHandshake}, { "_ENI", 4, 1, &nds.ensataIpcSyncCounter}, { "_SLP", 4, 1, &nds.sleeping}, { "_FBS", 4, 1, &nds.freezeBus}, { "_CEJ", 4, 1, &nds.cardEjected}, { "_PDL", 2, 1, &nds.paddle}, { "_P00", 1, 1, &nds.power1.lcd}, { "_P01", 1, 1, &nds.power1.gpuMain}, { "_P02", 1, 1, &nds.power1.gfx3d_render}, { "_P03", 1, 1, &nds.power1.gfx3d_geometry}, { "_P04", 1, 1, &nds.power1.gpuSub}, { "_P05", 1, 1, &nds.power1.dispswap}, { "_P06", 1, 1, &nds.power2.speakers}, { "_P07", 1, 1, &nds.power2.wifi}, { 0 } }; SFORMAT SF_MMU[]={ { "M7BI", 1, sizeof(MMU.ARM7_BIOS), MMU.ARM7_BIOS}, { "M7ER", 1, sizeof(MMU.ARM7_ERAM), MMU.ARM7_ERAM}, { "M7RG", 1, sizeof(MMU.ARM7_REG), MMU.ARM7_REG}, { "M7WI", 1, sizeof(MMU.ARM7_WIRAM), MMU.ARM7_WIRAM}, { "MSWI", 1, sizeof(MMU.SWIRAM), MMU.SWIRAM}, { "M9RW", 1, 1, &MMU.ARM9_RW_MODE}, { "MDTC", 4, 1, &MMU.DTCMRegion}, { "MITC", 4, 1, &MMU.ITCMRegion}, { "MTIM", 2, 8, MMU.timer}, { "MTMO", 4, 8, MMU.timerMODE}, { "MTON", 4, 8, MMU.timerON}, { "MTRN", 4, 8, MMU.timerRUN}, { "MTRL", 2, 8, MMU.timerReload}, { "MIME", 4, 2, MMU.reg_IME}, { "MIE_", 4, 2, MMU.reg_IE}, { "MIF_", 4, 2, MMU.reg_IF_bits}, { "MIFP", 4, 2, MMU.reg_IF_pending}, { "MGXC", 8, 1, &MMU.gfx3dCycles}, { "M_SX", 1, 2, &MMU.SPI_CNT}, { "M_SC", 1, 2, &MMU.SPI_CMD}, { "MASX", 1, 2, &MMU.AUX_SPI_CNT}, { "MASC", 1, 2, &MMU.AUX_SPI_CMD}, { "MWRA", 1, 2, &MMU.WRAMCNT}, { "MDV1", 4, 1, &MMU.divRunning}, { "MDV2", 8, 1, &MMU.divResult}, { "MDV3", 8, 1, &MMU.divMod}, { "MDV5", 8, 1, &MMU.divCycles}, { "MSQ1", 4, 1, &MMU.sqrtRunning}, { "MSQ2", 4, 1, &MMU.sqrtResult}, { "MSQ4", 8, 1, &MMU.sqrtCycles}, //begin memory chips { "BUCO", 1, 1, &MMU.fw.com}, { "BUAD", 4, 1, &MMU.fw.addr}, { "BUAS", 1, 1, &MMU.fw.addr_shift}, { "BUAZ", 1, 1, &MMU.fw.addr_size}, { "BUWE", 4, 1, &MMU.fw.write_enable}, { "BUWR", 4, 1, &MMU.fw.writeable_buffer}, //end memory chips { "MC0A", 4, 1, &MMU.dscard[0].address}, { "MC0T", 4, 1, &MMU.dscard[0].transfer_count}, { "MC1A", 4, 1, &MMU.dscard[1].address}, { "MC1T", 4, 1, &MMU.dscard[1].transfer_count}, //{ "MCHT", 4, 1, &MMU.CheckTimers}, //{ "MCHD", 4, 1, &MMU.CheckDMAs}, //fifos { "F0TH", 1, 1, &ipc_fifo[0].head}, { "F0TL", 1, 1, &ipc_fifo[0].tail}, { "F0SZ", 1, 1, &ipc_fifo[0].size}, { "F0BF", 4, 16, ipc_fifo[0].buf}, { "F1TH", 1, 1, &ipc_fifo[1].head}, { "F1TL", 1, 1, &ipc_fifo[1].tail}, { "F1SZ", 1, 1, &ipc_fifo[1].size}, { "F1BF", 4, 16, ipc_fifo[1].buf}, { "FDHD", 4, 1, &disp_fifo.head}, { "FDTL", 4, 1, &disp_fifo.tail}, { "FDBF", 4, 0x6000, disp_fifo.buf}, { "PMCN", 1, 1, &MMU.powerMan_CntReg}, { "PMCW", 4, 1, &MMU.powerMan_CntRegWritten}, { "PMCR", 1, 5, &MMU.powerMan_Reg}, { "MR3D", 4, 1, &MMU.reg_DISP3DCNT_bits}, { 0 } }; SFORMAT SF_MOVIE[]={ { "FRAC", 4, 1, &currFrameCounter}, { "LAGC", 4, 1, &TotalLagFrames}, { 0 } }; static void mmu_savestate(EMUFILE* os) { u32 version = 8; write32le(version,os); //version 2: MMU_new.backupDevice.save_state(os); //version 3: MMU_new.gxstat.savestate(os); for(int i=0;i<2;i++) for(int j=0;j<4;j++) MMU_new.dma[i][j].savestate(os); MMU_timing.arm9codeFetch.savestate(os, version); MMU_timing.arm9dataFetch.savestate(os, version); MMU_timing.arm7codeFetch.savestate(os, version); MMU_timing.arm7dataFetch.savestate(os, version); MMU_timing.arm9codeCache.savestate(os, version); MMU_timing.arm9dataCache.savestate(os, version); //version 4: MMU_new.sqrt.savestate(os); MMU_new.div.savestate(os); //version 6: MMU_new.dsi_tsc.save_state(os); //version 8: os->write32le(MMU.fw.size); os->fwrite(MMU.fw.data,MMU.fw.size); } // TODO: integrate the new wifi state variables once everything is settled SFORMAT SF_WIFI[]={ { "W000", 4, 1, &wifiMac.powerOn}, { "W010", 4, 1, &wifiMac.powerOnPending}, { "W020", 2, 1, &wifiMac.rfStatus}, { "W030", 2, 1, &wifiMac.rfPins}, { "W040", 2, 1, &wifiMac.IE}, { "W050", 2, 1, &wifiMac.IF}, { "W060", 2, 1, &wifiMac.macMode}, { "W070", 2, 1, &wifiMac.wepMode}, { "W080", 4, 1, &wifiMac.WEP_enable}, { "W100", 2, 1, &wifiMac.TXCnt}, { "W120", 2, 1, &wifiMac.TXStat}, { "W200", 2, 1, &wifiMac.RXCnt}, { "W210", 2, 1, &wifiMac.RXCheckCounter}, { "W220", 1, 6, &wifiMac.mac.bytes}, { "W230", 1, 6, &wifiMac.bss.bytes}, { "W240", 2, 1, &wifiMac.aid}, { "W250", 2, 1, &wifiMac.pid}, { "W260", 2, 1, &wifiMac.retryLimit}, { "W270", 4, 1, &wifiMac.crystalEnabled}, { "W280", 8, 1, &wifiMac.usec}, { "W290", 4, 1, &wifiMac.usecEnable}, { "W300", 8, 1, &wifiMac.ucmp}, { "W310", 4, 1, &wifiMac.ucmpEnable}, { "W320", 2, 1, &wifiMac.eCount}, { "W330", 4, 1, &wifiMac.eCountEnable}, { "WR00", 4, 1, &wifiMac.RF.CFG1.val}, { "WR01", 4, 1, &wifiMac.RF.IFPLL1.val}, { "WR02", 4, 1, &wifiMac.RF.IFPLL2.val}, { "WR03", 4, 1, &wifiMac.RF.IFPLL3.val}, { "WR04", 4, 1, &wifiMac.RF.RFPLL1.val}, { "WR05", 4, 1, &wifiMac.RF.RFPLL2.val}, { "WR06", 4, 1, &wifiMac.RF.RFPLL3.val}, { "WR07", 4, 1, &wifiMac.RF.RFPLL4.val}, { "WR08", 4, 1, &wifiMac.RF.CAL1.val}, { "WR09", 4, 1, &wifiMac.RF.TXRX1.val}, { "WR10", 4, 1, &wifiMac.RF.PCNT1.val}, { "WR11", 4, 1, &wifiMac.RF.PCNT2.val}, { "WR12", 4, 1, &wifiMac.RF.VCOT1.val}, { "W340", 1, 105, &wifiMac.BB.data[0]}, { "W350", 2, 1, &wifiMac.rfIOCnt.val}, { "W360", 2, 1, &wifiMac.rfIOStatus.val}, { "W370", 4, 1, &wifiMac.rfIOData.val}, { "W380", 2, 1, &wifiMac.bbIOCnt.val}, { "W400", 2, 0x1000, &wifiMac.RAM[0]}, { "W410", 2, 1, &wifiMac.RXRangeBegin}, { "W420", 2, 1, &wifiMac.RXRangeEnd}, { "W430", 2, 1, &wifiMac.RXWriteCursor}, { "W460", 2, 1, &wifiMac.RXReadCursor}, { "W470", 2, 1, &wifiMac.RXUnits}, { "W480", 2, 1, &wifiMac.RXBufCount}, { "W490", 2, 1, &wifiMac.CircBufReadAddress}, { "W500", 2, 1, &wifiMac.CircBufWriteAddress}, { "W510", 2, 1, &wifiMac.CircBufRdEnd}, { "W520", 2, 1, &wifiMac.CircBufRdSkip}, { "W530", 2, 1, &wifiMac.CircBufWrEnd}, { "W540", 2, 1, &wifiMac.CircBufWrSkip}, { "W580", 2, 0x800, &wifiMac.IOPorts[0]}, { "W590", 2, 1, &wifiMac.randomSeed}, { 0 } }; static bool mmu_loadstate(EMUFILE* is, int size) { //read version u32 version; if(read32le(&version,is) != 1) return false; if(version == 0 || version == 1) { u32 bupmem_size; u32 addr_size; if(version == 0) { //version 0 was buggy and didnt save the type. //it would silently fail if there was a size mismatch SAV_silent_fail_flag = true; if(read32le(&bupmem_size,is) != 1) return false; //if(bupmem_size != MMU.bupmem.size) return false; //mismatch between current initialized and saved size addr_size = BackupDevice::addr_size_for_old_save_size(bupmem_size); } else if(version == 1) { //version 1 reinitializes the save system with the type that was saved u32 bupmem_type; if(read32le(&bupmem_type,is) != 1) return false; if(read32le(&bupmem_size,is) != 1) return false; addr_size = BackupDevice::addr_size_for_old_save_type(bupmem_type); if(addr_size == 0xFFFFFFFF) addr_size = BackupDevice::addr_size_for_old_save_size(bupmem_size); } if(addr_size == 0xFFFFFFFF) return false; u8* temp = new u8[bupmem_size]; is->fread((char*)temp,bupmem_size); MMU_new.backupDevice.load_old_state(addr_size,temp,bupmem_size); delete[] temp; if(is->fail()) return false; } if(version < 2) return true; bool ok = MMU_new.backupDevice.load_state(is); if(version < 3) return ok; ok &= MMU_new.gxstat.loadstate(is); for(int i=0;i<2;i++) for(int j=0;j<4;j++) ok &= MMU_new.dma[i][j].loadstate(is); ok &= MMU_timing.arm9codeFetch.loadstate(is, version); ok &= MMU_timing.arm9dataFetch.loadstate(is, version); ok &= MMU_timing.arm7codeFetch.loadstate(is, version); ok &= MMU_timing.arm7dataFetch.loadstate(is, version); ok &= MMU_timing.arm9codeCache.loadstate(is, version); ok &= MMU_timing.arm9dataCache.loadstate(is, version); if(version < 4) return ok; ok &= MMU_new.sqrt.loadstate(is,version); ok &= MMU_new.div.loadstate(is,version); //to prevent old savestates from confusing IF bits, mask out ones which had been stored but should have been generated MMU.reg_IF_bits[0] &= ~0x00200000; MMU.reg_IF_bits[1] &= ~0x00000000; MMU_new.gxstat.fifo_low = gxFIFO.size <= 127; MMU_new.gxstat.fifo_empty = gxFIFO.size == 0; if(version < 5) MMU.reg_DISP3DCNT_bits = T1ReadWord(MMU.ARM9_REG,0x60); if(version < 6) return ok; MMU_new.dsi_tsc.load_state(is); //version 6 if(version < 7) { //recover WRAMCNT from the stashed WRAMSTAT memory location MMU.WRAMCNT = MMU.MMU_MEM[ARMCPU_ARM7][0x40][0x241]; } if(version<8) return ok; //version 8: delete[] MMU.fw.data; MMU.fw.size = is->read32le(); MMU.fw.data = new u8[size]; is->fread(MMU.fw.data,MMU.fw.size); return ok; } static void cp15_savestate(EMUFILE* os) { //version write32le(1,os); cp15.saveone(os); //ARM7 not have coprocessor //cp15_saveone((armcp15_t *)NDS_ARM7.coproc[15],os); } static bool cp15_loadstate(EMUFILE* is, int size) { //read version u32 version; if(read32le(&version,is) != 1) return false; if(version > 1) return false; if(!cp15.loadone(is)) return false; if(version == 0) { //ARM7 not have coprocessor u8 *tmp_buf = new u8 [sizeof(armcp15_t)]; if (!tmp_buf) return false; if(!cp15.loadone(is)) return false; delete [] tmp_buf; tmp_buf = NULL; } return true; } /* Format time and convert to string */ static char * format_time(time_t cal_time) { struct tm *time_struct; static char str[64]; time_struct=localtime(&cal_time); strftime(str, sizeof str, "%d-%b-%Y %H:%M:%S", time_struct); return(str); } void clear_savestates() { u8 i; for( i = 0; i < NB_STATES; i++ ) savestates[i].exists = FALSE; } // Scan for existing savestates and update struct void scan_savestates() { struct stat sbuf; char filename[MAX_PATH+1]; clear_savestates(); for(int i = 0; i < NB_STATES; i++ ) { path.getpathnoext(path.STATES, filename); if (strlen(filename) + strlen(".dst") + strlen("-2147483648") /* = biggest string for i */ >MAX_PATH) return ; sprintf(filename+strlen(filename), ".ds%d", i); if( stat(filename,&sbuf) == -1 ) continue; savestates[i].exists = TRUE; strncpy(savestates[i].date, format_time(sbuf.st_mtime),40); savestates[i].date[40-1] = '\0'; } return ; } void savestate_slot(int num) { struct stat sbuf; char filename[MAX_PATH+1]; lastSaveState = num; //Set last savestate used path.getpathnoext(path.STATES, filename); if (strlen(filename) + strlen(".dsx") + strlen("-2147483648") /* = biggest string for num */ >MAX_PATH) return ; sprintf(filename+strlen(filename), ".ds%d", num); if (savestate_save(filename)) { osd->setLineColor(255, 255, 255); osd->addLine("Saved to %i slot", num); } else { osd->setLineColor(255, 0, 0); osd->addLine("Error saving %i slot", num); return; } if (num >= 0 && num < NB_STATES) { if (stat(filename,&sbuf) != -1) { savestates[num].exists = TRUE; strncpy(savestates[num].date, format_time(sbuf.st_mtime),40); savestates[num].date[40-1] = '\0'; } } } void loadstate_slot(int num) { char filename[MAX_PATH]; lastSaveState = num; //Set last savestate used path.getpathnoext(path.STATES, filename); if (strlen(filename) + strlen(".dsx") + strlen("-2147483648") /* = biggest string for num */ >MAX_PATH) return ; sprintf(filename+strlen(filename), ".ds%d", num); if (savestate_load(filename)) { osd->setLineColor(255, 255, 255); osd->addLine("Loaded from %i slot", num); } else { osd->setLineColor(255, 0, 0); osd->addLine("Error loading %i slot", num); } } // note: guessSF is so we don't have to do a linear search through the SFORMAT array every time // in the (most common) case that we already know where the next entry is. static const SFORMAT *CheckS(const SFORMAT *guessSF, const SFORMAT *firstSF, u32 size, u32 count, char *desc) { const SFORMAT *sf = guessSF ? guessSF : firstSF; while(sf->v) { //NOT SUPPORTED RIGHT NOW //if(sf->size==~0) // Link to another SFORMAT structure. //{ // SFORMAT *tmp; // if((tmp= CheckS((SFORMAT *)sf->v, tsize, desc) )) // return(tmp); // sf++; // continue; //} if(!memcmp(desc,sf->desc,4)) { if(sf->size != size || sf->count != count) return 0; return sf; } // failed to find it, have to keep iterating if(guessSF) { sf = firstSF; guessSF = NULL; } else { sf++; } } return 0; } static bool ReadStateChunk(EMUFILE* is, const SFORMAT *sf, int size) { const SFORMAT *tmp = NULL; const SFORMAT *guessSF = NULL; int temp = is->ftell(); while(is->ftell()fread(toa,4); if(is->fail()) return false; if(!read32le(&sz,is)) return false; if(!read32le(&count,is)) return false; if((tmp=CheckS(guessSF,sf,sz,count,toa))) { #ifdef LOCAL_LE // no need to ever loop one at a time if not flipping byte order is->fread((char *)tmp->v,sz*count); #else if(sz == 1) { //special case: read a huge byte array is->fread((char *)tmp->v,count); } else { for(unsigned int i=0;ifread((char *)tmp->v + i*sz,sz); FlipByteOrder((u8*)tmp->v + i*sz,sz); } } #endif guessSF = tmp + 1; } else { is->fseek(sz*count,SEEK_CUR); guessSF = NULL; } } // while(...) return true; } static int SubWrite(EMUFILE* os, const SFORMAT *sf) { uint32 acc=0; #ifdef DEBUG std::set keyset; #endif const SFORMAT* temp = sf; while(temp->v) { const SFORMAT* seek = sf; while(seek->v && seek != temp) { if(!strcmp(seek->desc,temp->desc)) { printf("ERROR! duplicated chunk name: %s\n", temp->desc); } seek++; } temp++; } while(sf->v) { //not supported right now //if(sf->size==~0) //Link to another struct //{ // uint32 tmp; // if(!(tmp=SubWrite(os,(SFORMAT *)sf->v))) // return(0); // acc+=tmp; // sf++; // continue; //} int count = sf->count; int size = sf->size; //add size of current node to the accumulator acc += 4 + sizeof(sf->size) + sizeof(sf->count); acc += count * size; if(os) //Are we writing or calculating the size of this block? { os->fwrite(sf->desc,4); write32le(sf->size,os); write32le(sf->count,os); #ifdef DEBUG //make sure we dont dup any keys if(keyset.find(sf->desc) != keyset.end()) { printf("duplicate save key!\n"); assert(false); } keyset.insert(sf->desc); #endif #ifdef LOCAL_LE // no need to ever loop one at a time if not flipping byte order os->fwrite((char *)sf->v,size*count); #else if(size == 1) { //special case: write a huge byte array os->fwrite((char *)sf->v,count); } else { for(int i=0;iv + i*size, size); os->fwrite((char*)sf->v + i*size,size); //Now restore the original byte order. FlipByteOrder((u8*)sf->v + i*size, size); } } #endif } sf++; } return(acc); } static int savestate_WriteChunk(EMUFILE* os, int type, const SFORMAT *sf) { write32le(type,os); if(!sf) return 4; int bsize = SubWrite((EMUFILE*)0,sf); write32le(bsize,os); if(!SubWrite(os,sf)) { return 8; } return (bsize+8); } static void savestate_WriteChunk(EMUFILE* os, int type, void (*saveproc)(EMUFILE* os)) { u32 pos1 = os->ftell(); //write the type, size(placeholder), and data write32le(type,os); os->fseek(4, SEEK_CUR); // skip the size, we write that later saveproc(os); //get the size u32 pos2 = os->ftell(); assert(pos2 != (u32)-1); // if this assert fails, saveproc did something bad u32 size = (pos2 - pos1) - (2 * sizeof(u32)); //fill in the actual size os->fseek(pos1 + sizeof(u32),SEEK_SET); write32le(size,os); os->fseek(pos2,SEEK_SET); /* // old version of this function, // for reference in case the new one above starts misbehaving somehow: // - this is retarded. why not write placeholders for size and then write directly to the stream //and then go back and fill them in //get the size memorystream mstemp; saveproc(&mstemp); mstemp.flush(); u32 size = mstemp.size(); //write the type, size, and data write32le(type,os); write32le(size,os); os->write(mstemp.buf(),size); */ } static void writechunks(EMUFILE* os); bool savestate_save(EMUFILE* outstream, int compressionLevel) { #ifdef HAVE_JIT arm_jit_sync(); #endif #ifndef HAVE_LIBZ compressionLevel = Z_NO_COMPRESSION; #endif EMUFILE_MEMORY ms; EMUFILE* os; if(compressionLevel != Z_NO_COMPRESSION) { //generate the savestate in memory first os = (EMUFILE*)&ms; writechunks(os); } else { os = outstream; os->fseek(32,SEEK_SET); //skip the header writechunks(os); } //save the length of the file u32 len = os->ftell(); u32 comprlen = 0xFFFFFFFF; u8* cbuf; //compress the data int error = Z_OK; if(compressionLevel != Z_NO_COMPRESSION) { cbuf = ms.buf(); uLongf comprlen2; //worst case compression. //zlib says "0.1% larger than sourceLen plus 12 bytes" comprlen = (len>>9)+12 + len; cbuf = new u8[comprlen]; // Workaround to make it compile under linux 64bit comprlen2 = comprlen; error = compress2(cbuf,&comprlen2,ms.buf(),len,compressionLevel); comprlen = (u32)comprlen2; } //dump the header outstream->fseek(0,SEEK_SET); outstream->fwrite(magic,16); write32le(SAVESTATE_VERSION,outstream); write32le(EMU_DESMUME_VERSION_NUMERIC(),outstream); //desmume version write32le(len,outstream); //uncompressed length write32le(comprlen,outstream); //compressed length (-1 if it is not compressed) if(compressionLevel != Z_NO_COMPRESSION) { outstream->fwrite((char*)cbuf,comprlen==(u32)-1?len:comprlen); delete[] cbuf; } return error == Z_OK; } bool savestate_save (const char *file_name) { EMUFILE_MEMORY ms; size_t elems_written; #ifdef HAVE_LIBZ if(!savestate_save(&ms, Z_DEFAULT_COMPRESSION)) #else if(!savestate_save(&ms, 0)) #endif return false; FILE* file = fopen(file_name,"wb"); if(file) { elems_written = fwrite(ms.buf(),1,ms.size(),file); fclose(file); return (elems_written == ms.size()); } else return false; } extern SFORMAT SF_RTC[]; static void writechunks(EMUFILE* os) { savestate_WriteChunk(os,1,SF_ARM9); savestate_WriteChunk(os,2,SF_ARM7); savestate_WriteChunk(os,3,cp15_savestate); savestate_WriteChunk(os,4,SF_MEM); savestate_WriteChunk(os,5,SF_NDS); savestate_WriteChunk(os,51,nds_savestate); savestate_WriteChunk(os,60,SF_MMU); savestate_WriteChunk(os,61,mmu_savestate); savestate_WriteChunk(os,7,gpu_savestate); savestate_WriteChunk(os,8,spu_savestate); savestate_WriteChunk(os,81,mic_savestate); savestate_WriteChunk(os,90,SF_GFX3D); savestate_WriteChunk(os,91,gfx3d_savestate); savestate_WriteChunk(os,100,SF_MOVIE); savestate_WriteChunk(os,101,mov_savestate); savestate_WriteChunk(os,110,SF_WIFI); savestate_WriteChunk(os,120,SF_RTC); savestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0); } static bool ReadStateChunks(EMUFILE* is, s32 totalsize) { bool ret = true; while(totalsize > 0) { uint32 size; u32 t; if(!read32le(&t,is)) { ret=false; break; } if(t == 0xFFFFFFFF) goto done; if(!read32le(&size,is)) { ret=false; break; } switch(t) { case 1: if(!ReadStateChunk(is,SF_ARM9,size)) ret=false; break; case 2: if(!ReadStateChunk(is,SF_ARM7,size)) ret=false; break; case 3: if(!cp15_loadstate(is,size)) ret=false; break; case 4: if(!ReadStateChunk(is,SF_MEM,size)) ret=false; break; case 5: if(!ReadStateChunk(is,SF_NDS,size)) ret=false; break; case 51: if(!nds_loadstate(is,size)) ret=false; break; case 60: if(!ReadStateChunk(is,SF_MMU,size)) ret=false; break; case 61: if(!mmu_loadstate(is,size)) ret=false; break; case 7: if(!gpu_loadstate(is,size)) ret=false; break; case 8: if(!spu_loadstate(is,size)) ret=false; break; case 81: if(!mic_loadstate(is,size)) ret=false; break; case 90: if(!ReadStateChunk(is,SF_GFX3D,size)) ret=false; break; case 91: if(!gfx3d_loadstate(is,size)) ret=false; break; case 100: if(!ReadStateChunk(is,SF_MOVIE, size)) ret=false; break; case 101: if(!mov_loadstate(is, size)) ret=false; break; case 110: if(!ReadStateChunk(is,SF_WIFI,size)) ret=false; break; case 120: if(!ReadStateChunk(is,SF_RTC,size)) ret=false; break; default: ret=false; break; } if(!ret) return false; } done: return ret; } static void loadstate() { // This should regenerate the vram banks for (int i = 0; i < 0xA; i++) _MMU_write08(0x04000240+i, _MMU_read08(0x04000240+i)); // This should regenerate the graphics power control register _MMU_write16(0x04000304, _MMU_read16(0x04000304)); // This should regenerate the graphics configuration //zero 27-jul-09 : was formerly up to 7F but that wrote to dispfifo which is dumb (one of nitsuja's desynch bugs [that he found, not caused]) //so then i brought it down to 66 but this resulted in a conceptual bug with affine start registers, which shouldnt get regenerated //so then i just made this exhaustive list // for (int i = REG_BASE_DISPA; i<=REG_BASE_DISPA + 0x66; i+=2) //_MMU_write16(i, _MMU_read16(i)); // for (int i = REG_BASE_DISPB; i<=REG_BASE_DISPB + 0x7F; i+=2) //_MMU_write16(i, _MMU_read16(i)); static const u8 mainRegenAddr[] = {0x00,0x02,0x08,0x0a,0x0c,0x0e,0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x50,0x52,0x54,0x64,0x66,0x6c}; static const u8 subRegenAddr[] = {0x00,0x02,0x08,0x0a,0x0c,0x0e,0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x50,0x52,0x54,0x6c}; for(u32 i=0;i(REG_BASE_DISPA+mainRegenAddr[i], _MMU_read16(REG_BASE_DISPA+mainRegenAddr[i])); for(u32 i=0;i(REG_BASE_DISPB+subRegenAddr[i], _MMU_read16(REG_BASE_DISPB+subRegenAddr[i])); // no need to restore 0x60 since control and MMU.ARM9_REG are both in the savestates, and restoring it could mess up the ack bits anyway SetupMMU(nds.Is_DebugConsole(),nds.Is_DSI()); execute = !driver->EMU_IsEmulationPaused(); } bool savestate_load(EMUFILE* is) { SAV_silent_fail_flag = false; char header[16]; is->fread(header,16); if(is->fail() || memcmp(header,magic,16)) return false; u32 ssversion,dversion,len,comprlen; if(!read32le(&ssversion,is)) return false; if(!read32le(&dversion,is)) return false; if(!read32le(&len,is)) return false; if(!read32le(&comprlen,is)) return false; if(ssversion != SAVESTATE_VERSION) return false; std::vector buf(len); if(comprlen != 0xFFFFFFFF) { #ifndef HAVE_LIBZ //without libz, we can't decompress this savestate return false; #endif std::vector cbuf(comprlen); is->fread(&cbuf[0],comprlen); if(is->fail()) return false; #ifdef HAVE_LIBZ uLongf uncomprlen = len; int error = uncompress((uint8*)&buf[0],&uncomprlen,(uint8*)&cbuf[0],comprlen); if(error != Z_OK || uncomprlen != len) return false; #endif } else { is->fread((char*)&buf[0],len-32); } //GO!! READ THE SAVESTATE //THERE IS NO GOING BACK NOW //reset the emulator first to clean out the host's state //while the series of resets below should work, //we are testing the robustness of the savestate system with this full reset. //the full reset wipes more things, so we can make sure that they are being restored correctly extern bool _HACK_DONT_STOPMOVIE; _HACK_DONT_STOPMOVIE = true; NDS_Reset(); _HACK_DONT_STOPMOVIE = false; //reset some options to their old defaults which werent saved nds._DebugConsole = FALSE; //GPU_Reset(MainScreen.gpu, 0); //GPU_Reset(SubScreen.gpu, 1); //gfx3d_reset(); //gpu3D->NDS_3D_Reset(); //SPU_Reset(); EMUFILE_MEMORY mstemp(&buf); bool x = ReadStateChunks(&mstemp,(s32)len); if(!x && !SAV_silent_fail_flag) { printf("Error loading savestate. It failed halfway through;\nSince there is no savestate backup system, your current game session is wrecked"); #ifdef _WINDOWS //HACK! we really need a better way to handle this kind of feedback MessageBox(0,"Error loading savestate. It failed halfway through;\nSince there is no savestate backup system, your current game session is wrecked",0,0); #endif return false; } loadstate(); if(nds.ConsoleType != CommonSettings.ConsoleType) { printf("WARNING: forcing console type to: ConsoleType=%d\n",nds.ConsoleType); } if((nds._DebugConsole!=0) != CommonSettings.DebugConsole) { printf("WARNING: forcing console debug mode to: debugmode=%s\n",nds._DebugConsole?"TRUE":"FALSE"); } return true; } bool savestate_load(const char *file_name) { EMUFILE_FILE f(file_name,"rb"); if(f.fail()) return false; return savestate_load(&f); } static std::stack rewindFreeList; static std::vector rewindbuffer; int rewindstates = 16; int rewindinterval = 4; void rewindsave () { if(currFrameCounter % rewindinterval) return; //printf("rewindsave"); printf("%d%s", currFrameCounter, "\n"); EMUFILE_MEMORY *ms; if(!rewindFreeList.empty()) { ms = rewindFreeList.top(); rewindFreeList.pop(); } else { ms = new EMUFILE_MEMORY(1024*1024*12); } if(!savestate_save(ms, Z_NO_COMPRESSION)) return; rewindbuffer.push_back(ms); if((int)rewindbuffer.size() > rewindstates) { delete *rewindbuffer.begin(); rewindbuffer.erase(rewindbuffer.begin()); } } void dorewind() { if(currFrameCounter % rewindinterval) return; //printf("rewind\n"); int size = rewindbuffer.size(); if(size < 1) { printf("rewind buffer empty\n"); return; } printf("%d", size); EMUFILE_MEMORY* loadms = rewindbuffer[size-1]; loadms->fseek(32, SEEK_SET); ReadStateChunks(loadms,loadms->size()-32); loadstate(); if(rewindbuffer.size()>1) { rewindFreeList.push(loadms); rewindbuffer.pop_back(); } } desmume-0.9.9/src/GPU_osd.cpp0000644000175000017500000004772412140261633016531 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "GPU_osd.h" #include "GPU.h" #include "mem.h" #include //mem funcs #include //va_start, etc #include #include #include #include #include "debug.h" #include "aggdraw.h" #include "movie.h" #include "rtc.h" #include "NDSSystem.h" #include "mic.h" #include "saves.h" bool HudEditorMode = false; OSDCLASS *osd = NULL; HudStruct Hud; //contains a timer to be used for well-timed hud components static s64 hudTimer; static void SetHudDummy (HudCoordinates *hud) { hud->x=666; hud->y=666; } static bool IsHudDummy (HudCoordinates *hud) { return (hud->x == 666 && hud->y == 666); } template static T calcY(T y) // alters a GUI element y coordinate as necessary to obey swapScreens and singleScreen settings { if(osd->singleScreen) { if(y >= 192) y -= 192; if(osd->swapScreens) y += 192; } else if(osd->swapScreens) { if(y >= 192) y -= 192; else y += 192; } return y; } void EditHud(s32 x, s32 y, HudStruct *hudstruct) { u32 i = 0; while (!IsHudDummy(&hudstruct->hud(i))) { HudCoordinates &hud = hudstruct->hud(i); //reset if(!hud.clicked) { hud.storedx=0; hud.storedy=0; } if((x >= hud.x && x <= hud.x + hud.xsize) && (calcY(y) >= calcY(hud.y) && calcY(y) <= calcY(hud.y) + hud.ysize) && !hudstruct->clicked ) { hud.clicked=1; hud.storedx = x - hud.x; hud.storedy = y - hud.y; } if(hud.clicked) { hud.x = x - hud.storedx; hud.y = y - hud.storedy; } //sanity checks if(hud.x < 0) hud.x = 0; if(hud.y < 0) hud.y = 0; if(hud.x > 245)hud.x = 245; //margins if(hud.y > 384-16)hud.y = 384-16; if(hud.clicked) { hudstruct->clicked = true; break;//prevent items from grouping together } i++; } } void HudClickRelease(HudStruct *hudstruct) { u32 i = 0; while (!IsHudDummy(&hudstruct->hud(i))) { HudCoordinates &hud = hudstruct->hud(i); hud.clicked=0; i++; } hudstruct->clicked = false; } void HudStruct::reset() { FpsDisplay.x=0; FpsDisplay.y=5; FpsDisplay.xsize=166; FpsDisplay.ysize=10; FrameCounter.x=0; FrameCounter.y=25; FrameCounter.xsize=60; FrameCounter.ysize=10; InputDisplay.x=0; InputDisplay.y=45; InputDisplay.xsize=220; InputDisplay.ysize=10; GraphicalInputDisplay.x=8; GraphicalInputDisplay.y=328; GraphicalInputDisplay.xsize=102; GraphicalInputDisplay.ysize=50; LagFrameCounter.x=0; LagFrameCounter.y=65; LagFrameCounter.xsize=30; LagFrameCounter.ysize=10; Microphone.x=0; Microphone.y=85; Microphone.xsize=20; Microphone.ysize=10; RTCDisplay.x=0; RTCDisplay.y=105; RTCDisplay.xsize=220; RTCDisplay.ysize=10; SavestateSlots.x = 8; SavestateSlots.y = 160; SavestateSlots.xsize = 240; SavestateSlots.ysize = 24; SetHudDummy(&Dummy); clicked = false; } static void joyFill(int n) { bool pressedForGame = NDS_getFinalUserInput().buttons.array[n]; bool physicallyPressed = NDS_getRawUserInput().buttons.array[n]; if(pressedForGame && physicallyPressed) aggDraw.hud->fillColor(0,0,0,255); else if(pressedForGame) aggDraw.hud->fillColor(255,0,0,255); else if(physicallyPressed) aggDraw.hud->fillColor(0,255,0,255); else aggDraw.hud->fillColor(255,255,255,255); } static void joyEllipse(double ex, double ey, int xc, int yc, int x, int y, double ratio, double rad, int button) { joyFill(button); aggDraw.hud->lineWidth(rad); aggDraw.hud->ellipse(x+((xc*ex)*ratio), y+((yc*ey)*ratio), rad*ratio, rad*ratio); } static void joyRoundedRect(double x1, double y1, int x2, int y2, int alpha1, int alpha2, int button) { bool pressedForGame = NDS_getFinalUserInput().buttons.array[button]; bool physicallyPressed = NDS_getRawUserInput().buttons.array[button]; if(pressedForGame && physicallyPressed) aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(0,0,0,alpha1), agg::rgba8(0,0,0,alpha2)); else if(pressedForGame) aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(255,0,0,alpha1), agg::rgba8(255,0,0,alpha2)); else if(physicallyPressed) aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(0,255,0,alpha1), agg::rgba8(0,255,0,alpha2)); else return; //aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(255,255,255,alpha1), agg::rgba8(255,255,255,alpha2)); aggDraw.hud->roundedRect(x1,y1,x2,y2,1); } static void drawPad(double x, double y, double ratio) { // you might notice black/red/green colors used to show what buttons are pressed. // the logic is roughly: // RED == PAST (the button was held last frame) // GREEN == FUTURE (the button is physically held now) // BLACK == PRESENT (the button was held last frame and is still physically held now) // aligning to odd half-pixel boundaries prevents agg2d from blurring thin straight lines x = floor(x) + 0.5; y = floor(calcY(y)) + 0.5; double xc = 41 - 0.5; double yc = 20 - 0.5; aggDraw.hud->lineColor(128,128,128,255); aggDraw.hud->fillLinearGradient(x, y, x+(xc*ratio), y+(yc*ratio), agg::rgba8(222,222,222,128), agg::rgba8(255,255,255,255)); aggDraw.hud->roundedRect (x, y, floor(x+(xc*ratio))+0.5, floor(y+(yc*ratio))+0.5, 1); double screenLeft = x+(xc*.25*ratio); double screenTop = y+(yc*.1*ratio); double screenRight = x+(xc*.745*ratio); double screenBottom = y+(yc*.845*ratio); aggDraw.hud->fillLinearGradient(screenLeft, screenTop, screenRight, screenBottom, agg::rgba8(128,128,128,128), agg::rgba8(255,255,255,255)); aggDraw.hud->roundedRect (screenLeft, screenTop, screenRight, screenBottom, 1); joyEllipse(.89,.45,xc,yc,x,y,ratio,1,6);//B joyEllipse(.89,.22,xc,yc,x,y,ratio,1,3);//X joyEllipse(.83,.34,xc,yc,x,y,ratio,1,4);//Y joyEllipse(.95,.34,xc,yc,x,y,ratio,1,5);//A joyEllipse(.82,.716,xc,yc,x,y,ratio,.5,7);//Start joyEllipse(.82,.842,xc,yc,x,y,ratio,.5,8);//Select double dpadPoints [][2] = { {.04,.33}, // top-left corner of left button {.08,.33}, {.08,.24}, // top-left corner of up button {.13,.24}, // top-right corner of up button {.13,.33}, {.17,.33}, // top-right corner of right button {.17,.43}, // bottom-right corner of right button {.13,.43}, {.13,.516}, // bottom-right corner of down button {.08,.516}, // bottom-left corner of down button {.08,.43}, {.04,.43}, // bottom-left corner of left button }; static const int numdpadPoints = sizeof(dpadPoints)/sizeof(dpadPoints[0]); for(int i = 0; i < numdpadPoints; i++) { dpadPoints[i][0] = x+(xc*(dpadPoints[i][0]+.01)*ratio); dpadPoints[i][1] = y+(yc*(dpadPoints[i][1]+.00)*ratio); } // dpad outline aggDraw.hud->fillColor(255,255,255,200); aggDraw.hud->polygon((double*)dpadPoints, numdpadPoints); aggDraw.hud->noLine(); // left joyRoundedRect(dpadPoints[0][0], dpadPoints[0][1], dpadPoints[7][0], dpadPoints[7][1], 255, 0, 11); // right joyRoundedRect(dpadPoints[1][0], dpadPoints[1][1], dpadPoints[6][0], dpadPoints[6][1], 0, 255, 12); // up joyRoundedRect(dpadPoints[2][0], dpadPoints[2][1], dpadPoints[7][0], dpadPoints[7][1], 255, 0, 9); // right joyRoundedRect(dpadPoints[1][0], dpadPoints[1][1], dpadPoints[8][0], dpadPoints[8][1], 0, 255, 10); // left shoulder joyRoundedRect(x+(xc*.00*ratio), y+(yc*.00*ratio), x+(xc*.15*ratio), y+(yc*.07*ratio), 255, 200, 2); // right shoulder joyRoundedRect(x+(xc*.85*ratio), y+(yc*.00*ratio), x+(xc*1.0*ratio), y+(yc*.07*ratio), 200, 255, 1); // lid... joyRoundedRect(x+(xc*.4*ratio), y+(yc*.96*ratio), x+(xc*0.6*ratio), y+(yc*1.0*ratio), 200, 200, 13); // touch pad { BOOL gameTouchOn = nds.isTouch; double gameTouchX = screenLeft+1 + (nds.scr_touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0; double gameTouchY = screenTop+1 + (nds.scr_touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0; bool physicalTouchOn = NDS_getRawUserInput().touch.isTouch; double physicalTouchX = screenLeft+1 + (NDS_getRawUserInput().touch.touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0; double physicalTouchY = screenTop+1 + (NDS_getRawUserInput().touch.touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0; if(gameTouchOn && physicalTouchOn && gameTouchX == physicalTouchX && gameTouchY == physicalTouchY) { aggDraw.hud->fillColor(0,0,0,255); aggDraw.hud->ellipse(gameTouchX, gameTouchY, ratio*0.37, ratio*0.37); } else { if(physicalTouchOn) { aggDraw.hud->fillColor(0,0,0,128); aggDraw.hud->ellipse(physicalTouchX, physicalTouchY, ratio*0.5, ratio*0.5); aggDraw.hud->fillColor(0,255,0,255); aggDraw.hud->ellipse(physicalTouchX, physicalTouchY, ratio*0.37, ratio*0.37); } if(gameTouchOn) { aggDraw.hud->fillColor(255,0,0,255); aggDraw.hud->ellipse(gameTouchX, gameTouchY, ratio*0.37, ratio*0.37); } } } } struct TouchInfo{ u16 X; u16 Y; }; static int touchalpha[8]= {31, 63, 95, 127, 159, 191, 223, 255}; static TouchInfo temptouch; static const bool touchshadow = false;//true; // sorry, it's cool but also distracting and looks cleaner with it off. maybe if it drew line segments between touch points instead of isolated crosses... static std::vector touch (8); static void TextualInputDisplay() { // drawing the whole string at once looks ugly // (because of variable width font and the "shadow" appearing over blank space) // and can't give us the color-coded effects we want anyway (see drawPad for info) const UserButtons& gameButtons = NDS_getFinalUserInput().buttons; const UserButtons& physicalButtons = NDS_getRawUserInput().buttons; double x = Hud.InputDisplay.x; // from order FRLDUTSBAYXWEG where G is 0 static const char* buttonChars = "<^>vABXYLRSsgf"; static const int buttonIndex [14] = {11,9,12,10,5,6,3,4,2,1,7,8,0,13}; for(int i = 0; i < 14; i++, x+=11.0) { bool pressedForGame = gameButtons.array[buttonIndex[i]]; bool physicallyPressed = physicalButtons.array[buttonIndex[i]]; if(pressedForGame && physicallyPressed) aggDraw.hud->lineColor(255,255,255,255); else if(pressedForGame) aggDraw.hud->lineColor(255,48,48,255); else if(physicallyPressed) aggDraw.hud->lineColor(0,192,0,255); else continue; // cast from char to std::string is a bit awkward std::string str(buttonChars+i, 2); str[1] = '\0'; aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y), str); } // touch pad { char str [32]; BOOL gameTouchOn = nds.isTouch; int gameTouchX = nds.adc_touchX >> 4; int gameTouchY = nds.adc_touchY >> 4; bool physicalTouchOn = NDS_getRawUserInput().touch.isTouch; int physicalTouchX = NDS_getRawUserInput().touch.touchX >> 4; int physicalTouchY = NDS_getRawUserInput().touch.touchY >> 4; if(gameTouchOn && physicalTouchOn && gameTouchX == physicalTouchX && gameTouchY == physicalTouchY) { sprintf(str, "%d,%d", gameTouchX, gameTouchY); aggDraw.hud->lineColor(255,255,255,255); aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y), str); } else { if(gameTouchOn) { sprintf(str, "%d,%d", gameTouchX, gameTouchY); aggDraw.hud->lineColor(255,48,48,255); aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y)-(physicalTouchOn?8:0), str); } if(physicalTouchOn) { sprintf(str, "%d,%d", physicalTouchX, physicalTouchY); aggDraw.hud->lineColor(0,192,0,255); aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y)+(gameTouchOn?8:0), str); } } } } static void TouchDisplay() { // note: calcY should not be used in this function. aggDraw.hud->lineWidth(1.0); temptouch.X = NDS_getRawUserInput().touch.touchX >> 4; temptouch.Y = NDS_getRawUserInput().touch.touchY >> 4; if(touchshadow) { touch.push_back(temptouch); if(touch.size() > 8) touch.erase(touch.begin()); for (int i = 0; i < 8; i++) { temptouch = touch[i]; if(temptouch.X != 0 || temptouch.Y != 0) { aggDraw.hud->lineColor(0, 255, 0, touchalpha[i]); aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert aggDraw.hud->fillColor(0, 0, 0, touchalpha[i]); aggDraw.hud->rectangle(temptouch.X-1, temptouch.Y + 192-1, temptouch.X+1, temptouch.Y + 192+1); } } } else if(NDS_getRawUserInput().touch.isTouch) { aggDraw.hud->lineColor(0, 255, 0, 128); aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert } if(nds.isTouch) { temptouch.X = nds.scr_touchX / 16; temptouch.Y = nds.scr_touchY / 16; aggDraw.hud->lineColor(255, 0, 0, 128); aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert } } static int previousslot = 0; static char number[10]; static s64 slotTimer=0; static void DrawStateSlots(){ const int yloc = calcY(Hud.SavestateSlots.y); //160 const int xloc = Hud.SavestateSlots.x; //8 s64 fadecounter = 512 - (hudTimer-slotTimer)/4; //change constant to alter fade speed if(fadecounter < 1) fadecounter = 0; if(fadecounter>255) fadecounter = 255; int alpha = (int)fadecounter; if(HudEditorMode) alpha = 255; if(alpha!=0) { aggDraw.hud->lineWidth(1.0); aggDraw.hud->lineColor(0, 0, 0, alpha); aggDraw.hud->fillColor(255, 255, 255, alpha); for ( int i = 0, xpos=0; i < 10; xpos=xpos+24) { int yheight=0; aggDraw.hud->fillLinearGradient(xloc + xpos, yloc - yheight, xloc + 22 + xpos, yloc + 20 + yheight+20, agg::rgba8(100,200,255,alpha), agg::rgba8(255,255,255,0)); if(lastSaveState == i) { yheight = 5; aggDraw.hud->fillLinearGradient(xloc + xpos, yloc - yheight, 22 + xloc + xpos, yloc + 20 + yheight+20, agg::rgba8(100,255,255,alpha), agg::rgba8(255,255,255,0)); } aggDraw.hud->rectangle(xloc + xpos , yloc - yheight, xloc + 22 + xpos , yloc + 20 + yheight); snprintf(number, 10, "%d", i); aggDraw.hud->renderText(xloc + 1 + xpos + 4, yloc+4, std::string(number)); i++; } } if(lastSaveState != previousslot) slotTimer = hudTimer; previousslot = lastSaveState; } static void DrawEditableElementIndicators() { u32 i = 0; while (!IsHudDummy(&Hud.hud(i))) { HudCoordinates &hud = Hud.hud(i); aggDraw.hud->fillColor(0,0,0,0); aggDraw.hud->lineColor(0,0,0,64); aggDraw.hud->lineWidth(2.0); aggDraw.hud->rectangle(hud.x,calcY(hud.y),hud.x+hud.xsize+1.0,calcY(hud.y)+hud.ysize+1.0); aggDraw.hud->lineColor(255,hud.clicked?127:255,0,255); aggDraw.hud->lineWidth(1.0); aggDraw.hud->rectangle(hud.x-0.5,calcY(hud.y)-0.5,hud.x+hud.xsize+0.5,calcY(hud.y)+hud.ysize+0.5); i++; } } void DrawHUD() { GTimeVal time; g_get_current_time(&time); hudTimer = ((s64)time.tv_sec * 1000) + ((s64)time.tv_usec/1000); if (HudEditorMode) { DrawEditableElementIndicators(); } if (CommonSettings.hud.ShowInputDisplay) { TextualInputDisplay(); TouchDisplay(); } if (CommonSettings.hud.FpsDisplay) { osd->addFixed(Hud.FpsDisplay.x, Hud.FpsDisplay.y, "Fps:%02d/%02d (%02d%%/%02d%%)%s", Hud.fps, Hud.fps3d, Hud.cpuload[0], Hud.cpuload[1], driver->EMU_IsEmulationPaused() ? " (paused)" : ""); } if (CommonSettings.hud.FrameCounterDisplay) { if(movieMode == MOVIEMODE_RECORD) osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d",currFrameCounter); else if (movieMode == MOVIEMODE_PLAY) osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d/%d",currFrameCounter,currMovieData.records.size()); else if (movieMode == MOVIEMODE_FINISHED) osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d/%d (finished)",currFrameCounter,currMovieData.records.size()); else osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d (no movie)",currFrameCounter); } if (CommonSettings.hud.ShowLagFrameCounter) { osd->addFixed(Hud.LagFrameCounter.x, Hud.LagFrameCounter.y, "%d",TotalLagFrames); } if (CommonSettings.hud.ShowGraphicalInputDisplay) { drawPad(Hud.GraphicalInputDisplay.x, Hud.GraphicalInputDisplay.y, 2.5); } #if defined(WIN32) && !defined(WXPORT) if (CommonSettings.hud.ShowMicrophone) { osd->addFixed(Hud.Microphone.x, Hud.Microphone.y, "%03d [%07d]",MicDisplay, Hud.cpuloopIterationCount); } #endif if (CommonSettings.hud.ShowRTC) { DateTime tm = rtcGetTime(); static const char *wday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; osd->addFixed(Hud.RTCDisplay.x, Hud.RTCDisplay.y, "%04d-%03s-%02d %s %02d:%02d:%02d", tm.get_Year(), DateTime::GetNameOfMonth(tm.get_Month()), tm.get_Day(), wday[tm.get_DayOfWeek()%7], tm.get_Hour(), tm.get_Minute(), tm.get_Second()); } DrawStateSlots(); } OSDCLASS::OSDCLASS(u8 core) { memset(name,0,7); mode=core; offset=0; lastLineText=0; lineText_x = 5; lineText_y = 120; lineText_color = AggColor(255, 255, 255); for (int i=0; i < OSD_MAX_LINES+1; i++) { lineText[i] = new char[1024]; memset(lineText[i], 0, 1024); lineTimer[i] = 0; lineColor[i] = lineText_color; } rotAngle = 0; singleScreen = false; swapScreens = false; needUpdate = false; if (core==0) strcpy(name,"Core A"); else if (core==1) strcpy(name,"Core B"); else { strcpy(name,"Main"); mode=255; } //border(false); LOG("OSD_Init (%s)\n",name); } OSDCLASS::~OSDCLASS() { LOG("OSD_Deinit (%s)\n",name); for (int i=0; i < OSD_MAX_LINES+1; i++) { if (lineText[i]) delete [] lineText[i]; lineText[i] = NULL; } } void OSDCLASS::setOffset(u16 ofs) { offset=ofs; } void OSDCLASS::setRotate(u16 angle) { rotAngle = angle; } void OSDCLASS::clear() { needUpdate=false; } bool OSDCLASS::checkTimers() { if (lastLineText == 0) return false; time_t tmp_time = time(NULL); for (int i=0; i < lastLineText; i++) { if (tmp_time > (lineTimer[i] + OSD_TIMER_SECS) ) { if (i < lastLineText) { for (int j=i; j < lastLineText; j++) { strcpy(lineText[j], lineText[j+1]); lineTimer[j] = lineTimer[j+1]; lineColor[j] = lineColor[j+1]; } } lineTimer[lastLineText] = 0; lastLineText--; if (lastLineText == 0) return false; } } return true; } void OSDCLASS::update() { if ( (!needUpdate) && (!lastLineText) ) return; // don't update if buffer empty (speed up) if (lastLineText) { if (checkTimers()) { for (int i=0; i < lastLineText; i++) { aggDraw.hud->lineColor(lineColor[i]); aggDraw.hud->renderTextDropshadowed(lineText_x,lineText_y+(i*16),lineText[i]); } } else { if (!needUpdate) return; } } } void OSDCLASS::setListCoord(u16 x, u16 y) { lineText_x = x; lineText_y = y; } void OSDCLASS::setLineColor(u8 r=255, u8 g=255, u8 b=255) { lineText_color = AggColor(r,g,b); } void OSDCLASS::addLine(const char *fmt, ...) { va_list list; if (lastLineText > OSD_MAX_LINES) lastLineText = OSD_MAX_LINES; if (lastLineText == OSD_MAX_LINES) // full { lastLineText--; for (int j=0; j < lastLineText; j++) { strcpy(lineText[j], lineText[j+1]); lineTimer[j] = lineTimer[j+1]; lineColor[j] = lineColor[j+1]; } } va_start(list,fmt); #if defined(_MSC_VER) || defined(__INTEL_COMPILER) _vsnprintf(lineText[lastLineText],1023,fmt,list); #else vsnprintf(lineText[lastLineText],1023,fmt,list); #endif va_end(list); lineColor[lastLineText] = lineText_color; lineTimer[lastLineText] = time(NULL); needUpdate = true; lastLineText++; } void OSDCLASS::addFixed(u16 x, u16 y, const char *fmt, ...) { va_list list; char msg[1024]; va_start(list,fmt); vsnprintf(msg,1023,fmt,list); va_end(list); aggDraw.hud->lineColor(255,255,255); aggDraw.hud->renderTextDropshadowed(x,calcY(y),msg); needUpdate = true; } void OSDCLASS::border(bool enabled) { //render51.setTextBoxBorder(enabled); } desmume-0.9.9/src/addons/0000755000175000017500000000000012140305317015755 5ustar guillaumeguillaumedesmume-0.9.9/src/addons/slot2_mpcf.cpp0000644000175000017500000001501612140261500020527 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006 Mic Copyright (C) 2009-2011 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../addons.h" #include #include #include "debug.h" #include #include #include #include "types.h" #include "../utils/vfat.h" #include "../path.h" #include "MMU.h" #include "NDSSystem.h" // Set up addresses for GBAMP #define CF_REG_DATA 0x9000000 #define CF_REG_ERR 0x9020000 #define CF_REG_SEC 0x9040000 #define CF_REG_LBA1 0x9060000 #define CF_REG_LBA2 0x9080000 #define CF_REG_LBA3 0x90A0000 #define CF_REG_LBA4 0x90C0000 #define CF_REG_CMD 0x90E0000 #define CF_REG_STS 0x98C0000 // CF Card commands #define CF_CMD_LBA 0xE0 #define CF_CMD_READ 0x20 #define CF_CMD_WRITE 0x30 static u16 cf_reg_sts, cf_reg_lba1, cf_reg_lba2, cf_reg_lba3, cf_reg_lba4, cf_reg_cmd; static off_t currLBA; static const int lfnPos[13] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; static u32 fileStartLBA,fileEndLBA; static std::string sFlashPath; static BOOL cflashDeviceEnabled = FALSE; static EMUFILE* file = NULL; // =========================== BOOL inited; enum EListCallbackArg { EListCallbackArg_Item, EListCallbackArg_Pop }; static BOOL cflash_init() { if (inited) return FALSE; BOOL init_good = FALSE; CFLASHLOG("CFlash_Mode: %d\n",CFlash_Mode); if (CFlash_Mode == ADDON_CFLASH_MODE_RomPath) { sFlashPath = path.RomDirectory; INFO("Using CFlash directory of rom: %s\n", sFlashPath.c_str()); } else if(CFlash_Mode == ADDON_CFLASH_MODE_Path) { sFlashPath = CFlash_Path; INFO("Using CFlash directory: %s\n", sFlashPath.c_str()); } if(CFlash_IsUsingPath()) { cflashDeviceEnabled = FALSE; currLBA = 0; fileStartLBA = fileEndLBA = 0xFFFFFFFF; VFAT vfat; bool ret = vfat.build(sFlashPath.c_str(),16); //allocate 16MB extra for writing. this is probably enough for anyone, but maybe it should be configurable. //we could always suggest to users to add a big file to their directory to overwrite (that would cause the image to get padded) if(!ret) { CFLASHLOG("FAILED cflash_build_fat\n"); return FALSE; } file = vfat.detach(); cf_reg_sts = 0x58; // READY cflashDeviceEnabled = TRUE; init_good = TRUE; } else { sFlashPath = CFlash_Path; INFO("Using CFlash disk image file %s\n", sFlashPath.c_str()); file = new EMUFILE_FILE(sFlashPath.c_str(),"rb+"); if(file->fail()) { INFO("Failed to open file %s\n", sFlashPath.c_str()); delete file; file = NULL; } } // READY cf_reg_sts = 0x58; currLBA = 0; cf_reg_lba1 = cf_reg_lba2 = cf_reg_lba3 = cf_reg_lba4 = 0; inited = TRUE; return init_good; } static unsigned int cflash_read(unsigned int address) { unsigned int ret_value = 0; size_t elems_read = 0; switch (address) { case CF_REG_STS: ret_value = cf_reg_sts; break; case CF_REG_DATA: if (cf_reg_cmd == CF_CMD_READ) { if(file) { u8 data[2]; file->fseek(currLBA, SEEK_SET); elems_read += file->fread(data,2); ret_value = data[1] << 8 | data[0]; } currLBA += 2; } break; case CF_REG_CMD: break; case CF_REG_LBA1: ret_value = cf_reg_lba1; break; } return ret_value; } static void cflash_write(unsigned int address,unsigned int data) { static u8 sector_data[512]; static u32 sector_write_index = 0; switch (address) { case CF_REG_STS: cf_reg_sts = data&0xFFFF; break; case CF_REG_DATA: if (cf_reg_cmd == CF_CMD_WRITE) { { sector_data[sector_write_index] = (data >> 0) & 0xff; sector_data[sector_write_index + 1] = (data >> 8) & 0xff; sector_write_index += 2; if (sector_write_index == 512) { CFLASHLOG( "Write sector to %ld\n", currLBA); size_t written = 0; if(file) if(currLBA + 512 < file->size()) { file->fseek(currLBA,SEEK_SET); while(written < 512) { size_t todo = 512-written; file->fwrite(§or_data[written], todo); size_t cur_write = todo; written += cur_write; if ( cur_write == (size_t)-1) break; } } CFLASHLOG("Wrote %u bytes\n", written); currLBA += 512; sector_write_index = 0; } } } break; case CF_REG_CMD: cf_reg_cmd = data&0xFF; cf_reg_sts = 0x58; // READY break; case CF_REG_LBA1: cf_reg_lba1 = data&0xFF; currLBA = (currLBA&0xFFFFFF00)| cf_reg_lba1; break; case CF_REG_LBA2: cf_reg_lba2 = data&0xFF; currLBA = (currLBA&0xFFFF00FF)|(cf_reg_lba2<<8); break; case CF_REG_LBA3: cf_reg_lba3 = data&0xFF; currLBA = (currLBA&0xFF00FFFF)|(cf_reg_lba3<<16); break; case CF_REG_LBA4: cf_reg_lba4 = data&0xFF; if ((cf_reg_lba4 & 0xf0) == CF_CMD_LBA) { currLBA = (currLBA&0x00FFFFFF)|((cf_reg_lba4&0x0F)<<24); currLBA *= 512; sector_write_index = 0; } break; } } static void cflash_close( void) { if (!inited) return; if(file) delete file; cflashDeviceEnabled = FALSE; file = NULL; inited = FALSE; } static BOOL init(void) { return TRUE; } static void reset(void) { cflash_close(); cflash_init(); } static void close(void) { cflash_close(); } static void config(void) { } static void write08(u32 procnum, u32 adr, u8 val) { cflash_write(adr, val); } static void write16(u32 procnum, u32 adr, u16 val) { cflash_write(adr, val); } static void write32(u32 procnum, u32 adr, u32 val) { cflash_write(adr, val); } static u8 read08(u32 procnum, u32 adr) { return (cflash_read(adr)); } static u16 read16(u32 procnum, u32 adr) { return (cflash_read(adr)); } static u32 read32(u32 procnum, u32 adr) { return (cflash_read(adr)); } static void info(char *info) { strcpy(info, "MPCF Flash Card Device"); } ADDONINTERFACE addonCFlash = { "MPCF Flash Card Device", init, reset, close, config, write08, write16, write32, read08, read16, read32, info}; #undef CFLASHDEBUG desmume-0.9.9/src/addons/slot2_expMemory.cpp0000644000175000017500000001006112140261500021562 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../addons.h" #include "../mem.h" #include #include "../MMU.h" u8 *expMemory = NULL; u32 expMemSize = 8 * 1024 * 1024; // 8Mb #if 0 #define EXPINFO(...) INFO(__VA_ARGS__) #else #define EXPINFO(...) #endif static BOOL ExpMemory_init(void) { return (TRUE); } static void ExpMemory_reset(void) { if (expMemory) { delete [] expMemory; expMemory = NULL; } expMemory = new u8 [expMemSize]; memset(expMemory, 0xFF, expMemSize); } static void ExpMemory_close(void) { if (expMemory) { delete [] expMemory; expMemory = NULL; } } static void ExpMemory_config(void) {} static void ExpMemory_write08(u32 procnum, u32 adr, u8 val) { if (adr >= 0x09000000) { u32 offs = (adr - 0x09000000); if (offs >= expMemSize) return; T1WriteByte(expMemory, offs, val); } EXPINFO("ExpMemory: write 08 at 0x%08X = 0x%02X\n", adr, val); } static void ExpMemory_write16(u32 procnum, u32 adr, u16 val) { if (adr >= 0x09000000) { u32 offs = (adr - 0x09000000); if (offs >= expMemSize) return; T1WriteWord(expMemory, offs, val); } EXPINFO("ExpMemory: write 16 at 0x%08X = 0x%04X\n", adr, val); } static void ExpMemory_write32(u32 procnum, u32 adr, u32 val) { if (adr >= 0x09000000) { u32 offs = (adr - 0x09000000); if (offs >= expMemSize) return; T1WriteLong(expMemory, offs, val); } EXPINFO("ExpMemory: write 32 at 0x%08X = 0x%08X\n", adr, val); } static u8 header_0x00B0[] = { 0xFF, 0xFF, 0x96, 0x00, //this 0x96 is strange. it can't be read from the pak when it boots, it must appear later 0x00, 0x24, 0x24, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F }; static u8 ExpMemory_read08(u32 procnum, u32 adr) { EXPINFO("ExpMemory: read 08 at 0x%08X\n", adr); if(adr>=0x080000B0 && adr<0x080000C0) return T1ReadByte(header_0x00B0,adr-0x080000B0); if (adr >= 0x09000000) { u32 offs = (adr - 0x09000000); if (offs >= expMemSize) return (0xFF); return T1ReadByte(expMemory, offs); } return 0xFF; } static u16 ExpMemory_read16(u32 procnum, u32 adr) { if(adr>=0x080000B0 && adr<0x080000C0) return T1ReadWord(header_0x00B0,adr-0x080000B0); if (adr == 0x0801FFFC) return 0x7FFF; if (adr == 0x08240002) return 0; //this can't be 0xFFFF. dunno why, we just guessed 0 if (adr >= 0x09000000) { u32 offs = (adr - 0x09000000); if (offs >= expMemSize) return (0xFFFF); return T1ReadWord(expMemory, offs); } EXPINFO("ExpMemory: read 16 at 0x%08X\n", adr); return 0xFFFF; } static u32 ExpMemory_read32(u32 procnum, u32 adr) { if(adr>=0x080000B0 && adr<0x080000C0) return T1ReadLong(header_0x00B0,adr-0x080000B0); if (adr >= 0x09000000) { u32 offs = (adr - 0x09000000); if (offs >= expMemSize) return 0xFFFFFFFF; return T1ReadLong(expMemory, offs); } EXPINFO("ExpMemory: read 32 at 0x%08X\n", adr); return 0xFFFFFFFF; } static void ExpMemory_info(char *info) { strcpy(info, "Memory Expansion Pak"); } ADDONINTERFACE addonExpMemory = { "Memory Expansion Pak", ExpMemory_init, ExpMemory_reset, ExpMemory_close, ExpMemory_config, ExpMemory_write08, ExpMemory_write16, ExpMemory_write32, ExpMemory_read08, ExpMemory_read16, ExpMemory_read32, ExpMemory_info}; desmume-0.9.9/src/addons/slot2_piano.cpp0000644000175000017500000000677312140261500020722 0ustar guillaumeguillaume/* Copyright (C) 2010-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "../addons.h" #include static u16 pianoKeyStatus = 0; static BOOL piano_init(void) { return (TRUE); } static void piano_reset(void) { //INFO("piano: Reset\n"); pianoKeyStatus = 0; } static void piano_close(void) {} static void piano_config(void) {} static void piano_write08(u32 procnum, u32 adr, u8 val) { //INFO("piano: write 08 at 0x%08X = %02X\n", adr, val); } static void piano_write16(u32 procnum, u32 adr, u16 val) { //INFO("piano: write 16 at 0x%08X = %04X\n", adr, val); } static void piano_write32(u32 procnum, u32 adr, u32 val) { //INFO("piano: write 32 at 0x%08X = %08X\n", adr, val); } extern int currFrameCounter; static u8 piano_read08(u32 procnum, u32 adr) { //printf("piano: read 08 at 0x%08X\n", adr); //the actual keyboard output //byte:bit //0x09FFFFFE:0 = C //0x09FFFFFE:1 = C# //0x09FFFFFE:2 = D //0x09FFFFFE:3 = D# //0x09FFFFFE:4 = E //0x09FFFFFE:5 = F //0x09FFFFFE:6 = F# //0x09FFFFFE:7 = G //0x09FFFFFF:0 = G# //0x09FFFFFF:1 = A //0x09FFFFFF:2 = A# //0x09FFFFFF:3 = ? //0x09FFFFFF:4 = ? //0x09FFFFFF:5 = B //0x09FFFFFF:6 = hiC //0x09FFFFFF:7 = ? //deassert bit if key is pressed //LOG("PIANO: %04X\n",pianoKeyStatus); if(adr == 0x09FFFFFE) return (~(pianoKeyStatus&0xFF)); if(adr == 0x09FFFFFF) return (~((pianoKeyStatus>>8)&0xFF))&~(0x18); if(adr&1) return 0xE7; else return 0xFF; } static u16 piano_read16(u32 procnum, u32 adr) { //printf("piano: read 16 at 0x%08X\n", adr); if(adr != 0x09FFFFFE) return 0xE7FF; u16 ret = piano_read08(procnum,0x09FFFFFE)|(piano_read08(procnum,0x09FFFFFF)<<8); //return ( (PIANO_PAK & 0x1800 ) == 0 ); return ret; } static u32 piano_read32(u32 procnum, u32 adr) { //printf("piano: read 32 at 0x%08X\n", adr); return 0xE7FFE7FF; } static void piano_info(char *info) { strcpy(info, "Piano for EasyPiano"); } void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic) { //0x09FFFFFE:0 = C //0x09FFFFFE:1 = C# //0x09FFFFFE:2 = D //0x09FFFFFE:3 = D# //0x09FFFFFE:4 = E //0x09FFFFFE:5 = F //0x09FFFFFE:6 = F# //0x09FFFFFE:7 = G //0x09FFFFFE:0 = G# //0x09FFFFFE:1 = A //0x09FFFFFF:2 = A# //0x09FFFFFF:3 = ? //0x09FFFFFF:4 = ? //0x09FFFFFF:5 = B //0x09FFFFFF:6 = hiC //0x09FFFFFF:7 = ? #define BIT(N,v) ((v)?(1<<(N)):0) pianoKeyStatus = BIT(0,c) | BIT(1,cs) | BIT(2,d) | BIT(3,ds) | BIT(4,e) | BIT(5,f) | BIT(6,fs) | BIT(7,g) | BIT(8,gs) | BIT(9,a) | BIT(10,as) | BIT(13,b) | BIT(14,hic) ; pianoKeyStatus = pianoKeyStatus; } ADDONINTERFACE addonPiano = { "Piano", piano_init, piano_reset, piano_close, piano_config, piano_write08, piano_write16, piano_write32, piano_read08, piano_read16, piano_read32, piano_info}; desmume-0.9.9/src/addons/slot1_none.cpp0000644000175000017500000000301312140261500020532 0ustar guillaumeguillaume/* Copyright (C) 2010-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "../slot1.h" static void slot1_info(char *info) { strcpy(info, "Slot1 no-card emulation"); } static void slot1_config(void) {} static BOOL slot1_init() { return (TRUE); } static void slot1_reset() {} static void slot1_close() {} static void slot1_write08(u8 PROCNUM, u32 adr, u8 val) {} static void slot1_write16(u8 PROCNUM, u32 adr, u16 val) {} static void slot1_write32(u8 PROCNUM, u32 adr, u32 val) {} static u8 slot1_read08(u8 PROCNUM, u32 adr) { return 0xFF; } static u16 slot1_read16(u8 PROCNUM, u32 adr) { return 0xFFFF; } static u32 slot1_read32(u8 PROCNUM, u32 adr) { return 0xFFFFFFFF; } SLOT1INTERFACE slot1None = { "None", slot1_init, slot1_reset, slot1_close, slot1_config, slot1_write08, slot1_write16, slot1_write32, slot1_read08, slot1_read16, slot1_read32, slot1_info}; desmume-0.9.9/src/addons/slot2_none.cpp0000644000175000017500000000321712140261500020541 0ustar guillaumeguillaume/* Copyright (C) 2009 CrazyMax Copyright (C) 2009 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../addons.h" #include static BOOL None_init(void) { return (TRUE); } static void None_reset(void) {} static void None_close(void) {} static void None_config(void) {} static void None_write08(u32 procnum, u32 adr, u8 val) {} static void None_write16(u32 procnum, u32 adr, u16 val) {} static void None_write32(u32 procnum, u32 adr, u32 val) {} static u8 None_read08(u32 procnum, u32 adr){ return (0xFF); } static u16 None_read16(u32 procnum, u32 adr){ return (0xFFFF); } static u32 None_read32(u32 procnum, u32 adr){ return (0xFFFFFFFF); } static void None_info(char *info) { strcpy(info, "Nothing in GBA slot"); } ADDONINTERFACE addonNone = { "NONE", None_init, None_reset, None_close, None_config, None_write08, None_write16, None_write32, None_read08, None_read16, None_read32, None_info}; desmume-0.9.9/src/addons/slot2_rumblepak.cpp0000644000175000017500000000436112140261500021565 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../addons.h" #include "../mem.h" #include "../MMU.h" #include u16 old_val_rumble = 0; void (*FeedbackON)(BOOL enable) = NULL; static BOOL RumblePak_init(void) { return (TRUE); } static void RumblePak_reset(void) { old_val_rumble = 0; if (!FeedbackON) return; FeedbackON(false); } static void RumblePak_close(void) {} static void RumblePak_config(void) {} static void RumblePak_write08(u32 procnum, u32 adr, u8 val) { } static void RumblePak_write16(u32 procnum, u32 adr, u16 val) { if (!FeedbackON) return; if (old_val_rumble == val) return; old_val_rumble = val; // CrazyMax 17/01/2009 // i don't know how send to feedback (PC) impulse with small latency. if (adr == 0x08000000) FeedbackON(val); if (adr == 0x08001000) FeedbackON(val); } static void RumblePak_write32(u32 procnum, u32 adr, u32 val) { } static u8 RumblePak_read08(u32 procnum, u32 adr) { if(adr&1) return 0xFF; else return 0xFD; } static u16 RumblePak_read16(u32 procnum, u32 adr) { return 0xFFFD; } static u32 RumblePak_read32(u32 procnum, u32 adr) { return 0xFFFDFFFD; } static void RumblePak_info(char *info) { strcpy(info, "NDS Rumble Pak (need joystick with Feedback)"); } ADDONINTERFACE addonRumblePak = { "Rumble Pak", RumblePak_init, RumblePak_reset, RumblePak_close, RumblePak_config, RumblePak_write08, RumblePak_write16, RumblePak_write32, RumblePak_read08, RumblePak_read16, RumblePak_read32, RumblePak_info}; desmume-0.9.9/src/addons/slot2_guitarGrip.cpp0000644000175000017500000000447112140261500021722 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../addons.h" #include static u8 guitarKeyStatus = 0; static BOOL guitarGrip_init(void) { return (TRUE); } static void guitarGrip_reset(void) { //INFO("GuitarGrip: Reset\n"); guitarKeyStatus = 0; } static void guitarGrip_close(void) {} static void guitarGrip_config(void) {} static void guitarGrip_write08(u32 procnum, u32 adr, u8 val) {} static void guitarGrip_write16(u32 procnum, u32 adr, u16 val) {} static void guitarGrip_write32(u32 procnum, u32 adr, u32 val) {} static u8 guitarGrip_read08(u32 procnum, u32 adr) { //INFO("GuitarGrip: read 08 at 0x%08X\n", adr); if (adr == 0x0A000000) return (~guitarKeyStatus); else if(adr&1) return 0xF9; else return 0xFF; } static u16 guitarGrip_read16(u32 procnum, u32 adr) { //INFO("GuitarGrip: read 16 at 0x%08X\n", adr); return 0xF9FF; } static u32 guitarGrip_read32(u32 procnum, u32 adr) { //INFO("GuitarGrip: read 32 at 0x%08X\n", adr); return (0xF9FFF9FF); } static void guitarGrip_info(char *info) { strcpy(info, "Guitar Grip for Guitar Hero games"); } void guitarGrip_setKey(bool green, bool red, bool yellow, bool blue) { guitarKeyStatus = 0 | (green << 6) | (red << 5) | (yellow << 4) | (blue << 3); } ADDONINTERFACE addonGuitarGrip = { "Guitar Grip", guitarGrip_init, guitarGrip_reset, guitarGrip_close, guitarGrip_config, guitarGrip_write08, guitarGrip_write16, guitarGrip_write32, guitarGrip_read08, guitarGrip_read16, guitarGrip_read32, guitarGrip_info}; desmume-0.9.9/src/addons/slot2_paddle.cpp0000644000175000017500000000735012140261500021035 0ustar guillaumeguillaume/* Copyright (C) 2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ /* this device seems to have a 12bit value (like 20.12 fixed point.. get it?) located at 0x0A000000 clockwise = right = increases. it returns the correct little endian bytes through byte reads. through halfword reads, it returns the LSB twice through full word reads, it returns the LSB four times. after that everything is 0x00. if the slot2 timings are wrong, then this device will return glitchy or 0xFF output. so this emulation code will attempt to validate that. arkanoid was setting REG_EXMEMCNT = 0x082F the rom returns 0xEFFF for all addresses and should be used to detect this device writing any byte to SRAM or writing any halfword/word to rom results in a reset or some kind of recalibrate the resulting value may be 0x000,0x001, or 0xFFF. seems mostly random, though once it is reset, resetting again won't change it. you must wait until the paddle has been moved. conclusion: The emulation in all the handling of erroneous cases is not perfect, and some other users of the paddle (do any other games use it?) maybe legally configure the paddle differently, which could be rejected here; in which case this code will need finetuning */ #include "../addons.h" #include #include "NDSSystem.h" static BOOL init(void) { return (TRUE); } static void reset(void) { } static void calibrate() { nds.paddle = 0; } static void close(void) {} static void config(void) {} static void write08(u32 procnum, u32 adr, u8 val) { if(adr<0x0A000000) return; calibrate(); } static void write16(u32 procnum, u32 adr, u16 val) { if(adr<0x0A000000) { calibrate(); return; } } static void write32(u32 procnum, u32 adr, u32 val) { if(adr<0x0A000000) { calibrate(); return; } } extern int currFrameCounter; static bool Validate(u32 procnum, bool rom) { if(rom) return ValidateSlot2Access(procnum,0,0,0,-1); else return ValidateSlot2Access(procnum,18,0,0,1); } static u8 read08(u32 procnum, u32 adr) { //printf("paddle: read 08 at 0x%08X\n", adr); if(!Validate(procnum,adr<0x0A000000)) return 0xFF; if(adr<0x0A000000) { if(adr&1) return 0xFF; else return 0xEF; } if(adr==0x0A000000) { return nds.paddle&0xFF; } if(adr==0x0A000001) { return (nds.paddle>>8)&0x0F; } return 0x00; } static u16 read16(u32 procnum, u32 adr) { //printf("paddle : read 16 at 0x%08X\n", adr); if(!Validate(procnum,adr<0x0A000000)) return 0xFFFF; if(adr<0x0A000000) return 0xEFFF; if(adr==0x0A000000) { u8 val = nds.paddle&0xFF; return val|(val<<8); } return 0x0000; } static u32 read32(u32 procnum, u32 adr) { //printf("paddle: read 32 at 0x%08X\n", adr); if(!Validate(procnum,adr<0x0A000000)) return 0xFFFFFFFF; if(adr<0x0A000000) return 0xEFFFEFFF; if(adr==0x0A000000) { u8 val = nds.paddle&0xFF; return val|(val<<8)|(val<<16)|(val<<24); } return 0x00000000; } static void info(char *info) { strcpy(info, "Paddle"); } ADDONINTERFACE addonPaddle = { "Paddle", init, reset, close, config, write08, write16, write32, read08, read16, read32, info}; desmume-0.9.9/src/addons/slot1_r4.cpp0000644000175000017500000001155212140261500020127 0ustar guillaumeguillaume/* Copyright (C) 2010-2011 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "../slot1.h" #include "../registers.h" #include "../MMU.h" #include "../NDSSystem.h" #include "../emufile.h" static EMUFILE *img = NULL; static u32 write_count = 0; static u32 write_enabled = 0; static void init_r4_flash() { srand(time(NULL)); if (!img) img = slot1GetFatImage(); if(!img) { INFO("slot1 fat not successfully mounted\n"); } } static void info(char *info) { strcpy(info, "Slot1 R4 Emulation"); } static void config(void) {} static BOOL init() { init_r4_flash(); return TRUE; } static void reset() { init_r4_flash(); } static void close() { img = NULL; } static void write08(u8 PROCNUM, u32 adr, u8 val) {} static void write16(u8 PROCNUM, u32 adr, u16 val) {} static void write32_GCROMCTRL(u32 val) { nds_dscard& card = MMU.dscard[0]; switch(card.command[0]) { case 0xB0: break; case 0xB9: case 0xBA: card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4]; img->fseek(card.address,SEEK_SET); break; case 0xBB: write_enabled = 1; write_count = 0x80; case 0xBC: card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4]; img->fseek(card.address,SEEK_SET); break; } } static void write32_GCDATAIN(u32 val) { nds_dscard& card = MMU.dscard[0]; //bool log=false; memcpy(&card.command[0], &MMU.MMU_MEM[0][0x40][0x1A8], 8); //last_write_count = write_count; if(card.command[4]) { // transfer is done T1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF); // if needed, throw irq for the end of transfer if(MMU.AUX_SPI_CNT & 0x4000) NDS_makeIrq(ARMCPU_ARM9, IRQ_BIT_GC_TRANSFER_COMPLETE); return; } switch(card.command[0]) { case 0xBB: { if(write_count && write_enabled) { img->fwrite(&val, 4); img->fflush(); write_count--; } break; } default: break; } if(write_count==0) { write_enabled = 0; // transfer is done T1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF); // if needed, throw irq for the end of transfer if(MMU.AUX_SPI_CNT & 0x4000) NDS_makeIrq(ARMCPU_ARM9, IRQ_BIT_GC_TRANSFER_COMPLETE); } /*if(log) { INFO("WRITE CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\t", card.command[0], card.command[1], card.command[2], card.command[3], card.command[4], card.command[5], card.command[6], card.command[7]); INFO("FROM: %08X\t", NDS_ARM9.instruct_adr); INFO("VAL: %08X\n", val); }*/ } static void write32(u8 PROCNUM, u32 adr, u32 val) { switch(adr) { case REG_GCROMCTRL: write32_GCROMCTRL(val); break; case REG_GCDATAIN: write32_GCDATAIN(val); break; } } static u8 read08(u8 PROCNUM, u32 adr) { return 0xFF; } static u16 read16(u8 PROCNUM, u32 adr) { return 0xFFFF; } static u32 read32_GCDATAIN() { nds_dscard& card = MMU.dscard[0]; u32 val; switch(card.command[0]) { //Get ROM chip ID case 0x90: case 0xB8: val = 0xFC2; break; case 0xB0: val = 0x1F4; break; case 0xB9: val = (rand() % 100) ? 0x1F4 : 0; break; case 0xBB: case 0xBC: val = 0; break; case 0xBA: //INFO("Read from sd at sector %08X at adr %08X ",card.address/512,ftell(img)); img->fread(&val, 4); //INFO("val %08X\n",val); break; default: val = 0; } /*INFO("READ CARD command: %02X%02X%02X%02X% 02X%02X%02X%02X RET: %08X ", card.command[0], card.command[1], card.command[2], card.command[3], card.command[4], card.command[5], card.command[6], card.command[7], val); INFO("FROM: %08X LR: %08X\n", NDS_ARM9.instruct_adr, NDS_ARM9.R[14]);*/ return val; } //read32_GCDATAIN static u32 read32(u8 PROCNUM, u32 adr) { switch(adr) { case REG_GCDATAIN: return read32_GCDATAIN(); default: return 0; } } SLOT1INTERFACE slot1R4 = { "R4", init, reset, close, config, write08, write16, write32, read08, read16, read32, info}; desmume-0.9.9/src/addons/slot1_retail.cpp0000644000175000017500000001604612140261500021065 0ustar guillaumeguillaume/* Copyright (C) 2010-2011 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../slot1.h" #include "../registers.h" #include "../MMU.h" #include "../NDSSystem.h" static void info(char *info) { strcpy(info, "Slot1 Retail card emulation"); } static void config(void) {} static BOOL init() { return (TRUE); } static void reset() {} static void close() {} static void write08(u8 PROCNUM, u32 adr, u8 val) {} static void write16(u8 PROCNUM, u32 adr, u16 val) {} static void write32_GCROMCTRL(u8 PROCNUM, u32 val) { nds_dscard& card = MMU.dscard[PROCNUM]; switch(card.command[0]) { case 0x00: //Data read case 0xB7: card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4]; card.transfer_count = 0x80; break; case 0xB8: // Chip ID card.address = 0; card.transfer_count = 1; break; default: card.address = 0; card.transfer_count = 0; break; } } static void write32(u8 PROCNUM, u32 adr, u32 val) { switch(adr) { case REG_GCROMCTRL: write32_GCROMCTRL(PROCNUM, val); break; } } static u8 read08(u8 PROCNUM, u32 adr) { return 0xFF; } static u16 read16(u8 PROCNUM, u32 adr) { return 0xFFFF; } static u32 read32_GCDATAIN(u8 PROCNUM) { nds_dscard& card = MMU.dscard[PROCNUM]; switch(card.command[0]) { //Get ROM chip ID case 0x90: case 0xB8: { // Note: the BIOS stores the chip ID in main memory // Most games continuously compare the chip ID with // the value in memory, probably to know if the card // was removed. // As DeSmuME normally boots directly from the game, the chip // ID in main mem is zero and this value needs to be // zero too. //note that even if desmume was booting from firmware, and reading this chip ID to store in main memory, //this still works, since it will have read 00 originally and then read 00 to validate. //staff of kings verifies this (it also uses the arm7 IRQ 20) if(nds.cardEjected) //TODO - handle this with ejected card slot1 device (and verify using this case) return 0xFFFFFFFF; else return 0; } break; // Data read case 0x00: case 0xB7: { //it seems that etrian odyssey 3 doesnt work unless we mask this to cart size. //but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision //but there is no test case yet u32 address = card.address & (gameInfo.mask); // Make sure any reads below 0x8000 redirect to 0x8000+(adr&0x1FF) as on real cart if((card.command[0] == 0xB7) && (address < 0x8000)) { //TODO - refactor this to include the PROCNUM, for debugging purposes if nothing else //(can refactor gbaslot also) //INFO("Read below 0x8000 (0x%04X) from: ARM%s %08X\n", // card.address, (PROCNUM ? "7":"9"), (PROCNUM ? NDS_ARM7:NDS_ARM9).instruct_adr); address = (0x8000 + (address&0x1FF)); } //as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms) //we need to protect ourselves by returning 0xFF for things still out of range if(address >= gameInfo.romsize) { DEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize); return 0xFFFFFFFF; } return T1ReadLong(MMU.CART_ROM, address); } break; default: return 0; } //switch(card.command[0]) } //read32_GCDATAIN static u32 read32(u8 PROCNUM, u32 adr) { switch(adr) { case REG_GCDATAIN: return read32_GCDATAIN(PROCNUM); default: return 0; } } SLOT1INTERFACE slot1Retail = { "Retail", init, reset, close, config, write08, write16, write32, read08, read16, read32, info }; // ///writetoGCControl: //// --- Ninja SD commands ------------------------------------- // // NJSD init/reset // case 0x20: // { // card.address = 0; // card.transfer_count = 0; // } // break; // // NJSD_sendCLK() // case 0xE0: // { // card.address = 0; // card.transfer_count = 0; // NDS_makeInt(PROCNUM, 20); // } // break; // // NJSD_sendCMDN() / NJSD_sendCMDR() // case 0xF0: // case 0xF1: // switch (card.command[2]) // { // // GO_IDLE_STATE // case 0x40: // card.address = 0; // card.transfer_count = 0; // NDS_makeInt(PROCNUM, 20); // break; // case 0x42: // ALL_SEND_CID // case 0x43: // SEND_RELATIVE_ADDR // case 0x47: // SELECT_CARD // case 0x49: // SEND_CSD // case 0x4D: // case 0x77: // APP_CMD // case 0x69: // SD_APP_OP_COND // card.address = 0; // card.transfer_count = 6; // NDS_makeInt(PROCNUM, 20); // break; // // SET_BLOCKLEN // case 0x50: // card.address = 0; // card.transfer_count = 6; // card.blocklen = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24); // NDS_makeInt(PROCNUM, 20); // break; // // READ_SINGLE_BLOCK // case 0x51: // card.address = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24); // card.transfer_count = (card.blocklen + 3) >> 2; // NDS_makeInt(PROCNUM, 20); // break; // } // break; // // --- Ninja SD commands end --------------------------------- // //GCDATAIN: // // --- Ninja SD commands ------------------------------------- // // NJSD_sendCMDN() / NJSD_sendCMDR() // case 0xF0: // case 0xF1: // switch (card.command[2]) // { // // ALL_SEND_CID // case 0x42: // if (card.transfer_count == 2) val = 0x44534A4E; // else val = 0x00000000; // // SEND_RELATIVE_ADDR // case 0x43: // case 0x47: // case 0x49: // case 0x50: // val = 0x00000000; // break; // case 0x4D: // if (card.transfer_count == 2) val = 0x09000000; // else val = 0x00000000; // break; // // APP_CMD // case 0x77: // if (card.transfer_count == 2) val = 0x00000037; // else val = 0x00000000; // break; // // SD_APP_OP_COND // case 0x69: // if (card.transfer_count == 2) val = 0x00008000; // else val = 0x00000000; // break; // // READ_SINGLE_BLOCK // case 0x51: // val = 0x00000000; // break; // } // break; // // --- Ninja SD commands end --------------------------------- desmume-0.9.9/src/addons/slot2_gbagame.cpp0000644000175000017500000002241212140261500021163 0ustar guillaumeguillaume/* Copyright (C) 2009 CrazyMax Copyright (C) 2009 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../addons.h" #include "../mem.h" #include #include "../MMU.h" #include "../path.h" //SRAM is going to be stored just above the rom. //that is convenient for us, since it mirrors the nds memory map #define GBA_ROMSIZE (32 * 1024 * 1024) + 1 #define GBA_SAVESIZE (512 * 1024) + 1 static u8 *GBArom = NULL; static u8 *saveData = NULL; static u8 saveType = 0xFF; //================================================================================== Flash GBA typedef struct { u8 state; u8 cmd; u32 size; u8 idDevice; u8 idManufacturer; u8 bank; } FLASH_GBA; FLASH_GBA gbaFlash = {0}; static void gbaWriteFlash(u32 adr, u8 val) { switch (gbaFlash.state) { case 0: if (adr == 0x0A005555) { if (val == 0xF0) { //INFO("GBAgame: Flash: reset\n"); gbaFlash.state = 0; gbaFlash.cmd = 0; return; } if (val == 0xAA) { gbaFlash.state = 1; return; } } if (adr == 0x0A000000) { if (gbaFlash.cmd == 0xB0) { gbaFlash.bank = val; gbaFlash.cmd = 0; //INFO("GBAgame: Flash: change bank %i\n", val); return; } } break; case 1: if ( (adr == 0x0A002AAA) && (val == 0x55) ) { gbaFlash.state = 2; return; } gbaFlash.state = 0; break; case 2: if (adr == 0x0A005555) { //INFO("GBAgame: Flash: send command flash 0x%02X\n", val); switch (val) { case 0x80: // Erase gbaFlash.state = 0x80; break; case 0x90: // Chip Identification gbaFlash.state = 0x90; break; case 0xA0: // Write gbaFlash.state = 0; break; default: gbaFlash.state = 0; break; } gbaFlash.cmd = val; return; } gbaFlash.state = 0; break; // erase case 0x80: if ( (adr == 0x0A005555) && (val == 0xAA) ) { gbaFlash.state = 0x81; return; } gbaFlash.state = 0; break; case 0x81: if ( (adr == 0x0A002AAA) && (val == 0x55) ) { gbaFlash.state = 0x82; return; } gbaFlash.state = 0; break; case 0x82: if (val == 0x30) { u32 ofs = (adr & 0x0000F000); //INFO("GBAgame: Flash: erase from 0x%08X to 0x%08X\n", ofs + 0x0A000000, ofs + 0x0A001000); for (u32 i = ofs; i < (ofs + 0x1000); i++) saveData[i] = 0xFF; } gbaFlash.state = 0; gbaFlash.cmd = 0; return; // Chip Identification case 0x90: if ( (adr == 0x0A005555) && (val == 0xAA) ) { gbaFlash.state = 0x91; return; } gbaFlash.state = 0; break; case 0x91: if ( (adr == 0x0A002AAA) && (val == 0x55) ) { gbaFlash.state = 0x92; return; } gbaFlash.state = 0; break; case 0x92: gbaFlash.state = 0; gbaFlash.cmd = 0; return; } if (gbaFlash.cmd == 0xA0) // write { saveData[(adr & 0x1FFFF)+(0x10000*gbaFlash.bank)] = val; gbaFlash.state = 0; gbaFlash.cmd = 0; return; } INFO("GBAgame: Flash: write unknown atn 0x%08X = 0x%02X\n", adr, val); } static u8 gbaReadFlash(u32 adr) { if (gbaFlash.cmd == 0) { //INFO("GBAgame: flash read at 0x%08X = 0x%02X\n", adr, saveData[(adr & 0x1FFFF)+(0x10000*gbaFlash.bank)]); return saveData[(adr & 0x1FFFF)+(0x10000*gbaFlash.bank)]; } //INFO("GBAgame: flash read at 0x%08X\n", adr); switch (gbaFlash.cmd) { case 0x90: // Chip Identification if (adr == 0x0A000000) return gbaFlash.idManufacturer; if (adr == 0x0A000001) return gbaFlash.idDevice; break; case 0xF0: // //INFO("GBAgame: Flash: reset2\n"); gbaFlash.state = 0; gbaFlash.cmd = 0; break; case 0xB0: // Bank switching break; default: INFO("GBAgame: Flash: read - unknown command at 0x%08X = 0x%02X\n", adr, gbaFlash.cmd); break; } return 0xFF; } //================================================================================== static u8 getSaveTypeGBA(const u8 *data, const u32 size) { u8 *dat = (u8 *)data; for (u32 i = 0; i < size; i++) { u32 tmp = T1ReadLong(dat, 0); if (tmp == 0x52504545) { if(memcmp(dat, "EEPROM_", 7) == 0) { return 1; } } if (tmp == 0x4D415253) { if(memcmp(dat, "SRAM_", 5) == 0) { return 2; } } if (tmp == 0x53414C46) { if(memcmp(dat, "FLASH1M_", 8) == 0) { return 3; } } if (tmp == 0x52494953) { if(memcmp(dat, "SIIRTC_V", 8) == 0) { return 4; } } if(memcmp(dat, "FLASH", 5) == 0) { return 5; } dat++; } return 0xFF; // NONE } static BOOL GBAgame_init(void) { return (TRUE); } static void GBAgame_reset(void) { memset(&gbaFlash, 0, sizeof(gbaFlash)); if (GBArom) { delete [] GBArom; GBArom = NULL; } GBArom = new u8 [GBA_ROMSIZE]; memset(GBArom, 0xFF, GBA_ROMSIZE); if (saveData) { delete [] saveData; saveData = NULL; } saveData = new u8 [GBA_SAVESIZE]; memset(saveData, 0xFF, GBA_SAVESIZE); if (!strlen(GBAgameName)) return; FILE *fgame = 0; //perk: if the gbagame name is "self" this is a special indicator that we should mount the main rom that we're running as the gba game if(!strcasecmp(GBAgameName,"self")) { strcpy(GBAgameName,path.path.c_str()); } fgame = fopen(GBAgameName,"rb"); if (!fgame) return; fseek(fgame, 0, SEEK_END); u32 size = ftell(fgame); rewind(fgame); if (!fread(GBArom, 1, size, fgame)) { fclose(fgame); return; } fclose(fgame); saveType = getSaveTypeGBA(GBArom, size); INFO("Loaded \"%s\" in GBA slot (save type %i)\n", GBAgameName, saveType); //try loading the sram char * dot = strrchr(GBAgameName,'.'); if(!dot) return; std::string sram_fname = GBAgameName; sram_fname.resize(dot-GBAgameName); sram_fname += ".sav"; fgame = fopen(sram_fname.c_str(),"rb"); if(!fgame) return; fseek(fgame, 0, SEEK_END); size = ftell(fgame); rewind(fgame); if (!fread(saveData, 1, size, fgame)) { fclose(fgame); return; } fclose(fgame); gbaFlash.size = size; if (gbaFlash.size <= (64 * 1024)) { gbaFlash.idDevice = 0x1B; gbaFlash.idManufacturer = 0x32; } else { gbaFlash.idDevice = 0x09; gbaFlash.idManufacturer = 0xC2; } INFO("Loaded save \"%s\" in GBA slot\n", sram_fname.c_str()); } static void GBAgame_close(void) { if (GBArom) { delete [] GBArom; GBArom = NULL; } if (saveData) { delete [] saveData; saveData = NULL; } } static void GBAgame_config(void) {} static void GBAgame_write08(u32 procnum, u32 adr, u8 val) { //INFO("GBAgame: write08 at 0x%08X val=0x%02X\n", adr, val); if ( (adr >= 0x0A000000) && (adr < 0x0A010000) ) { switch (saveType) { case 3: // Flash case 5: gbaWriteFlash(adr, val); break; default: break; } //return (u8)T1ReadByte(saveData, (adr - 0x0A000000)); } } static void GBAgame_write16(u32 procnum, u32 adr, u16 val) { //INFO("GBAgame: write16 at 0x%08X val=0x%04X\n", adr, val); } static void GBAgame_write32(u32 procnum, u32 adr, u32 val) { //INFO("GBAgame: write32 at 0x%08X val=0x%08X\n", adr, val); } static u8 GBAgame_read08(u32 procnum, u32 adr) { //INFO("GBAgame: read08 at 0x%08X value 0x%02X\n", adr, (u8)T1ReadByte(GBArom, (adr - 0x08000000))); if (adr < 0x0A000000) return (u8)T1ReadByte(GBArom, (adr - 0x08000000)); if (adr < 0x0A010000) { switch (saveType) { case 3: // Flash case 5: return gbaReadFlash(adr); default: break; } //INFO("Read08 at 0x%08X val=0x%08X\n", adr, (u8)T1ReadByte(GBArom, (adr - 0x08000000)) ); return (u8)T1ReadByte(saveData, (adr - 0x0A000000)); } //INFO("Read08 at 0x%08X val=0x%08X\n", adr, (u8)T1ReadByte(GBArom, (adr - 0x08000000)) ); return 0xFF; } static u16 GBAgame_read16(u32 procnum, u32 adr) { //INFO("GBAgame: read16 at 0x%08X value 0x%04X\n", adr, (u16)T1ReadWord(GBArom, (adr - 0x08000000))); if (adr < 0x0A000000) return (u16)T1ReadWord(GBArom, (adr - 0x08000000)); if (adr < 0x0A010000) { //INFO("GBAgame: flash read16 at 0x%08X\n", adr); return (u16)T1ReadWord(saveData, (adr - 0x0A000000)); } return 0xFFFF; } static u32 GBAgame_read32(u32 procnum, u32 adr) { //INFO("GBAgame: read32 at 0x%08X value 0x%08X\n", adr, (u32)T1ReadLong(GBArom, (adr - 0x08000000))); if (adr < 0x0A000000) return (u32)T1ReadLong(GBArom, (adr - 0x08000000)); if (adr < 0x0A010000) { //INFO("GBAgame: flash read32 at 0x%08X\n", adr); return (u32)T1ReadLong(saveData, (adr - 0x0A000000)); } return 0xFFFFFFFF; } static void GBAgame_info(char *info) { strcpy(info, "GBA game in slot"); } ADDONINTERFACE addonGBAgame = { "GBA game", GBAgame_init, GBAgame_reset, GBAgame_close, GBAgame_config, GBAgame_write08, GBAgame_write16, GBAgame_write32, GBAgame_read08, GBAgame_read16, GBAgame_read32, GBAgame_info}; desmume-0.9.9/src/addons/slot1_retail_nand.cpp0000644000175000017500000001213612140261500022061 0ustar guillaumeguillaume/* Copyright (C) 2011 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../slot1.h" #include "../registers.h" #include "../MMU.h" #include "../NDSSystem.h" static void info(char *info) { strcpy(info, "Slot1 Retail NAND card emulation"); } static void config(void) {} static BOOL init() { return (TRUE); } static void reset() {} static void close() {} static void write08(u8 PROCNUM, u32 adr, u8 val) {} static void write16(u8 PROCNUM, u32 adr, u16 val) {} static void write32_GCROMCTRL(u8 PROCNUM, u32 val) { nds_dscard& card = MMU.dscard[PROCNUM]; switch(card.command[0]) { case 0x00: //Data read case 0xB7: card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4]; card.transfer_count = 0x80; break; case 0xB8: // Chip ID card.address = 0; card.transfer_count = 1; break; // Nand Init case 0x94: card.address = 0; card.transfer_count = 0x80; break; // Nand Error? case 0xD6: card.address = 0; card.transfer_count = 1; break; // Nand Write? ---- PROGRAM for INTERNAL DATA MOVE/RANDOM DATA INPUT //case 0x8B: case 0x85: card.address = 0; card.transfer_count = 0x80; break; default: card.address = 0; card.transfer_count = 0; break; } } static void write32(u8 PROCNUM, u32 adr, u32 val) { switch(adr) { case REG_GCROMCTRL: write32_GCROMCTRL(PROCNUM, val); break; } } static u8 read08(u8 PROCNUM, u32 adr) { return 0xFF; } static u16 read16(u8 PROCNUM, u32 adr) { return 0xFFFF; } static u32 read32_GCDATAIN(u8 PROCNUM) { nds_dscard& card = MMU.dscard[PROCNUM]; switch(card.command[0]) { //Get ROM chip ID case 0x90: case 0xB8: { // Note: the BIOS stores the chip ID in main memory // Most games continuously compare the chip ID with // the value in memory, probably to know if the card // was removed. // As DeSmuME boots directly from the game, the chip // ID in main mem is zero and this value needs to be // zero too. //note that even if desmume was booting from firmware, and reading this chip ID to store in main memory, //this still works, since it will have read 00 originally and then read 00 to validate. //staff of kings verifies this (it also uses the arm7 IRQ 20) if(nds.cardEjected) //TODO - handle this with ejected card slot1 device (and verify using this case) return 0xFFFFFFFF; else return 0; } break; // Data read case 0x00: case 0xB7: { // Make sure any reads below 0x8000 redirect to 0x8000+(adr&0x1FF) as on real cart if((card.command[0] == 0xB7) && (card.address < 0x8000)) { //TODO - refactor this to include the PROCNUM, for debugging purposes if nothing else //(can refactor gbaslot also) //INFO("Read below 0x8000 (0x%04X) from: ARM%s %08X\n", // card.address, (PROCNUM ? "7":"9"), (PROCNUM ? NDS_ARM7:NDS_ARM9).instruct_adr); card.address = (0x8000 + (card.address&0x1FF)); } //it seems that etrian odyssey 3 doesnt work unless we mask this to cart size. //but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision //but there is no test case yet u32 address = card.address & (gameInfo.mask); //as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms) //we need to protect ourselves by returning 0xFF for things still out of range if(address >= gameInfo.romsize) { DEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize); return 0xFFFFFFFF; } return T1ReadLong(MMU.CART_ROM, address); } break; // Nand Init? case 0x94: return 0; //Unsure what to return here so return 0 for now // Nand Status? case 0xD6: //0x80 == busy // Made in Ore/WariWare D.I.Y. need set value to 0x80 return 0x80; //0x20 == ready default: return 0; } //switch(card.command[0]) } //read32_GCDATAIN static u32 read32(u8 PROCNUM, u32 adr) { switch(adr) { case REG_GCDATAIN: return read32_GCDATAIN(PROCNUM); default: return 0; } } SLOT1INTERFACE slot1Retail_NAND = { "Retail with NAND Flash", init, reset, close, config, write08, write16, write32, read08, read16, read32, info }; desmume-0.9.9/src/rasterize.cpp0000644000175000017500000014045012140261633017227 0ustar guillaumeguillaume/* Copyright (C) 2009-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ //nothing in this file should be assumed to be accurate // //the shape rasterizers contained herein are based on code supplied by Chris Hecker from //http://chrishecker.com/Miscellaneous_Technical_Articles //TODO - due to a late change of a y-coord flipping, our winding order is wrong //this causes us to have to flip the verts for every front-facing poly. //a performance improvement would be to change the winding order logic //so that this is done less frequently #include "rasterize.h" #include #include #include #include #ifndef _MSC_VER #include #endif #include "bits.h" #include "common.h" #include "matrix.h" #include "render3D.h" #include "gfx3d.h" #include "texcache.h" #include "NDSSystem.h" #include "utils/task.h" //#undef FORCEINLINE //#define FORCEINLINE //#undef INLINE //#define INLINE using std::min; using std::max; using std::swap; template T _min(T a, T b, T c) { return min(min(a,b),c); } template T _max(T a, T b, T c) { return max(max(a,b),c); } template T _min(T a, T b, T c, T d) { return min(_min(a,b,d),c); } template T _max(T a, T b, T c, T d) { return max(_max(a,b,d),c); } static const int kUnsetTranslucentPolyID = 255; static u8 modulate_table[64][64]; static u8 decal_table[32][64][64]; static u8 index_lookup_table[65]; static u8 index_start_table[8]; static bool softRastHasNewData = false; ////optimized float floor useful in limited cases ////from http://www.stereopsis.com/FPU.html#convert ////(unfortunately, it relies on certain FPU register settings) //int Real2Int(double val) //{ // const double _double2fixmagic = 68719476736.0*1.5; //2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor // const int _shiftamt = 16; //16.16 fixed point representation, // // #ifdef WORDS_BIGENDIAN // #define iman_ 1 // #else // #define iman_ 0 // #endif // // val = val + _double2fixmagic; // return ((int*)&val)[iman_] >> _shiftamt; //} //// this probably relies on rounding settings.. //int Real2Int(float val) //{ // //val -= 0.5f; // //int temp; // //__asm { // // fld val; // // fistp temp; // //} // //return temp; // return 0; //} //doesnt work yet static FORCEINLINE int fastFloor(float f) { float temp = f + 1.f; int ret = (*((u32*)&temp))&0x7FFFFF; return ret; } //INLINE static void SubmitVertex(int vert_index, VERT& rawvert) //{ // verts[vert_index] = &rawvert; //} static Fragment _screen[256*192]; static FragmentColor _screenColor[256*192]; static FORCEINLINE int iround(float f) { return (int)f; //lol } typedef int fixed28_4; // handle floor divides and mods correctly static FORCEINLINE void FloorDivMod(long Numerator, long Denominator, long &Floor, long &Mod, bool& failure) { //These must be caused by invalid or degenerate shapes.. not sure yet. //check it out in the mario face intro of SM64 //so, we have to take out the assert. //I do know that we handle SOME invalid shapes without crashing, //since I see them acting poppy in a way that doesnt happen in the HW.. so alas it is also incorrect. //This particular incorrectness is not likely ever to get fixed! //assert(Denominator > 0); //but we have to bail out since our handling for these cases currently steps scanlines //the wrong way and goes totally nuts (freezes) if(Denominator<=0) failure = true; if(Numerator >= 0) { // positive case, C is okay Floor = Numerator / Denominator; Mod = Numerator % Denominator; } else { // Numerator is negative, do the right thing Floor = -((-Numerator) / Denominator); Mod = (-Numerator) % Denominator; if(Mod) { // there is a remainder Floor--; Mod = Denominator - Mod; } } } static FORCEINLINE fixed28_4 FloatToFixed28_4( float Value ) { return (fixed28_4)(Value * 16); } static FORCEINLINE float Fixed28_4ToFloat( fixed28_4 Value ) { return Value / 16.0f; } //inline fixed16_16 FloatToFixed16_16( float Value ) { // return (fixed16_6)(Value * 65536); //} //inline float Fixed16_16ToFloat( fixed16_16 Value ) { // return Value / 65536.0; //} static FORCEINLINE fixed28_4 Fixed28_4Mul( fixed28_4 A, fixed28_4 B ) { // could make this asm to prevent overflow return (A * B) / 16; // 28.4 * 28.4 = 24.8 / 16 = 28.4 } static FORCEINLINE int Ceil28_4( fixed28_4 Value ) { int ReturnValue; int Numerator = Value - 1 + 16; if(Numerator >= 0) { ReturnValue = Numerator/16; } else { // deal with negative numerators correctly ReturnValue = -((-Numerator)/16); ReturnValue -= ((-Numerator) % 16) ? 1 : 0; } return ReturnValue; } struct edge_fx_fl { edge_fx_fl() {} edge_fx_fl(int Top, int Bottom, VERT** verts, bool& failure); FORCEINLINE int Step(); VERT** verts; long X, XStep, Numerator, Denominator; // DDA info for x long ErrorTerm; int Y, Height; // current y and vertical count struct Interpolant { float curr, step, stepExtra; FORCEINLINE void doStep() { curr += step; } FORCEINLINE void doStepExtra() { curr += stepExtra; } FORCEINLINE void initialize(float value) { curr = value; step = 0; stepExtra = 0; } FORCEINLINE void initialize(float top, float bottom, float dx, float dy, long XStep, float XPrestep, float YPrestep) { dx = 0; dy *= (bottom-top); curr = top + YPrestep * dy + XPrestep * dx; step = XStep * dx + dy; stepExtra = dx; } }; static const int NUM_INTERPOLANTS = 7; union { struct { Interpolant invw,z,u,v,color[3]; }; Interpolant interpolants[NUM_INTERPOLANTS]; }; void FORCEINLINE doStepInterpolants() { for(int i=0;iverts = verts; Y = Ceil28_4((fixed28_4)verts[Top]->y); int YEnd = Ceil28_4((fixed28_4)verts[Bottom]->y); Height = YEnd - Y; X = Ceil28_4((fixed28_4)verts[Top]->x); int XEnd = Ceil28_4((fixed28_4)verts[Bottom]->x); int Width = XEnd - X; // can be negative // even if Height == 0, give some info for horizontal line poly if(Height != 0 || Width != 0) { long dN = long(verts[Bottom]->y - verts[Top]->y); long dM = long(verts[Bottom]->x - verts[Top]->x); if (dN != 0) { long InitialNumerator = (long)(dM*16*Y - dM*verts[Top]->y + dN*verts[Top]->x - 1 + dN*16); FloorDivMod(InitialNumerator,dN*16,X,ErrorTerm,failure); FloorDivMod(dM*16,dN*16,XStep,Numerator,failure); Denominator = dN*16; } else { XStep = Width; Numerator = 0; ErrorTerm = 0; Denominator = 1; dN = 1; } float YPrestep = Fixed28_4ToFloat((fixed28_4)(Y*16 - verts[Top]->y)); float XPrestep = Fixed28_4ToFloat((fixed28_4)(X*16 - verts[Top]->x)); float dy = 1/Fixed28_4ToFloat(dN); float dx = 1/Fixed28_4ToFloat(dM); invw.initialize(1/verts[Top]->w,1/verts[Bottom]->w,dx,dy,XStep,XPrestep,YPrestep); u.initialize(verts[Top]->u,verts[Bottom]->u,dx,dy,XStep,XPrestep,YPrestep); v.initialize(verts[Top]->v,verts[Bottom]->v,dx,dy,XStep,XPrestep,YPrestep); z.initialize(verts[Top]->z,verts[Bottom]->z,dx,dy,XStep,XPrestep,YPrestep); for(int i=0;i<3;i++) color[i].initialize(verts[Top]->fcolor[i],verts[Bottom]->fcolor[i],dx,dy,XStep,XPrestep,YPrestep); } else { // even if Width == 0 && Height == 0, give some info for pixel poly // example: Castlevania Portrait of Ruin, warp stone XStep = 1; Numerator = 0; Denominator = 1; ErrorTerm = 0; invw.initialize(1/verts[Top]->w); u.initialize(verts[Top]->u); v.initialize(verts[Top]->v); z.initialize(verts[Top]->z); for(int i=0;i<3;i++) color[i].initialize(verts[Top]->fcolor[i]); } } FORCEINLINE int edge_fx_fl::Step() { X += XStep; Y++; Height--; doStepInterpolants(); ErrorTerm += Numerator; if(ErrorTerm >= Denominator) { X++; ErrorTerm -= Denominator; doStepExtraInterpolants(); } return Height; } static FORCEINLINE void alphaBlend(FragmentColor & dst, const FragmentColor & src) { if(gfx3d.renderState.enableAlphaBlending) { if(src.a == 31 || dst.a == 0) { dst = src; } //else if(src.a == 0) { } //this is not necessary since it was handled earlier else { u8 alpha = src.a+1; u8 invAlpha = 32 - alpha; dst.r = (alpha*src.r + invAlpha*dst.r)>>5; dst.g = (alpha*src.g + invAlpha*dst.g)>>5; dst.b = (alpha*src.b + invAlpha*dst.b)>>5; } dst.a = max(src.a,dst.a); } else { if(src.a == 0) { //do nothing; the fragment is totally transparent } else { dst = src; } } } // TODO: wire-frame struct PolyAttr { u32 val; bool decalMode; bool translucentDepthWrite; bool drawBackPlaneIntersectingPolys; u8 polyid; u8 alpha; bool backfacing; bool translucent; u8 fogged; bool isVisible(bool backfacing) { //this was added after adding multi-bit stencil buffer //it seems that we also need to prevent drawing back faces of shadow polys for rendering u32 mode = (val>>4)&0x3; if(mode==3 && polyid !=0) return !backfacing; //another reasonable possibility is that we should be forcing back faces to draw (mariokart doesnt use them) //and then only using a single bit buffer (but a cursory test of this doesnt actually work) // //this code needs to be here for shadows in wizard of oz to work. switch((val>>6)&3) { case 0: return false; case 1: return backfacing; case 2: return !backfacing; case 3: return true; default: assert(false); return false; } } void setup(u32 polyAttr) { val = polyAttr; decalMode = BIT14(val); translucentDepthWrite = BIT11(val); polyid = (polyAttr>>24)&0x3F; alpha = (polyAttr>>16)&0x1F; drawBackPlaneIntersectingPolys = BIT12(val); fogged = BIT15(val); } }; template class RasterizerUnit { public: int SLI_MASK, SLI_VALUE; bool _debug_thisPoly; RasterizerUnit() : _debug_thisPoly(false) { } TexCacheItem* lastTexKey; VERT* verts[MAX_CLIPPED_VERTS]; PolyAttr polyAttr; int polynum; struct Sampler { Sampler() {} bool enabled; int width, height; int wmask, hmask; int wrap; int wshift; int texFormat; void setup(u32 texParam) { texFormat = (texParam>>26)&7; wshift = ((texParam>>20)&0x07) + 3; width=(1 << wshift); height=(8 << ((texParam>>23)&0x07)); wmask = width-1; hmask = height-1; wrap = (texParam>>16)&0xF; enabled = gfx3d.renderState.enableTexturing && (texFormat!=0); } FORCEINLINE void clamp(int &val, const int size, const int sizemask){ if(val<0) val = 0; if(val>sizemask) val = sizemask; } FORCEINLINE void hclamp(int &val) { clamp(val,width,wmask); } FORCEINLINE void vclamp(int &val) { clamp(val,height,hmask); } FORCEINLINE void repeat(int &val, const int size, const int sizemask) { val &= sizemask; } FORCEINLINE void hrepeat(int &val) { repeat(val,width,wmask); } FORCEINLINE void vrepeat(int &val) { repeat(val,height,hmask); } FORCEINLINE void flip(int &val, const int size, const int sizemask) { val &= ((size<<1)-1); if(val>=size) val = (size<<1)-val-1; } FORCEINLINE void hflip(int &val) { flip(val,width,wmask); } FORCEINLINE void vflip(int &val) { flip(val,height,hmask); } FORCEINLINE void dowrap(int& iu, int& iv) { switch(wrap) { //flip none case 0x0: hclamp(iu); vclamp(iv); break; case 0x1: hrepeat(iu); vclamp(iv); break; case 0x2: hclamp(iu); vrepeat(iv); break; case 0x3: hrepeat(iu); vrepeat(iv); break; //flip S case 0x4: hclamp(iu); vclamp(iv); break; case 0x5: hflip(iu); vclamp(iv); break; case 0x6: hclamp(iu); vrepeat(iv); break; case 0x7: hflip(iu); vrepeat(iv); break; //flip T case 0x8: hclamp(iu); vclamp(iv); break; case 0x9: hrepeat(iu); vclamp(iv); break; case 0xA: hclamp(iu); vflip(iv); break; case 0xB: hrepeat(iu); vflip(iv); break; //flip both case 0xC: hclamp(iu); vclamp(iv); break; case 0xD: hflip(iu); vclamp(iv); break; case 0xE: hclamp(iu); vflip(iv); break; case 0xF: hflip(iu); vflip(iv); break; } } } sampler; FORCEINLINE FragmentColor sample(float u, float v) { static const FragmentColor white = MakeFragmentColor(63,63,63,31); if(!sampler.enabled) return white; //finally, we can use floor here. but, it is slower than we want. //the best solution is probably to wait until the pipeline is full of fixed point s32 iu = s32floor(u); s32 iv = s32floor(v); sampler.dowrap(iu,iv); FragmentColor color; color.color = ((u32*)lastTexKey->decoded)[(iv<>1; //dst.a = 28; //#ifdef _MSC_VER //if(GetAsyncKeyState(VK_SHIFT)) { // //debugging tricks // dst = shader.materialColor; // if(GetAsyncKeyState(VK_TAB)) { // u8 alpha = dst.a; // dst.color = polynum*8+8; // dst.a = alpha; // } //} //#endif break; case 1: //decal if(sampler.enabled) { u = shader.invu*shader.w; v = shader.invv*shader.w; texColor = sample(u,v); dst.r = decal_table[texColor.a][texColor.r][shader.materialColor.r]; dst.g = decal_table[texColor.a][texColor.g][shader.materialColor.g]; dst.b = decal_table[texColor.a][texColor.b][shader.materialColor.b]; dst.a = shader.materialColor.a; } else dst = shader.materialColor; break; case 2: //toon/highlight shading { u = shader.invu*shader.w; v = shader.invv*shader.w; texColor = sample(u,v); FragmentColor toonColor = engine->toonTable[shader.materialColor.r>>1]; if(gfx3d.renderState.shading == GFX3D_State::HIGHLIGHT) { dst.r = modulate_table[texColor.r][shader.materialColor.r]; dst.g = modulate_table[texColor.g][shader.materialColor.r]; dst.b = modulate_table[texColor.b][shader.materialColor.r]; dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1; dst.r = min(63, (dst.r + toonColor.r)); dst.g = min(63, (dst.g + toonColor.g)); dst.b = min(63, (dst.b + toonColor.b)); } else { dst.r = modulate_table[texColor.r][toonColor.r]; dst.g = modulate_table[texColor.g][toonColor.g]; dst.b = modulate_table[texColor.b][toonColor.b]; dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1; } } break; case 3: //shadows //is this right? only with the material color? dst = shader.materialColor; break; } } void setupShader(u32 polyattr) { shader.mode = (polyattr>>4)&0x3; } FORCEINLINE void pixel(int adr,float r, float g, float b, float invu, float invv, float w, float z) { Fragment &destFragment = engine->screen[adr]; FragmentColor &destFragmentColor = engine->screenColor[adr]; u32 depth; if(gfx3d.renderState.wbuffer) { //not sure about this //this value was chosen to make the skybox, castle window decals, and water level render correctly in SM64 depth = u32floor(4096*w); } else { depth = u32floor(z*0x7FFF); depth <<= 9; } if(polyAttr.decalMode) { if ( CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack > 0) { if(depthdestFragment.depth + CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack) { goto depth_fail; } } else { if(depth != destFragment.depth) { goto depth_fail; } } } else { if(depth>=destFragment.depth) { goto depth_fail; } } //handle shadow polys if(shader.mode == 3) { if(polyAttr.polyid == 0) { goto rejected_fragment; } else { if(destFragment.stencil==0) { goto rejected_fragment; } //shadow polys have a special check here to keep from self-shadowing when user //has tried to prevent it from happening //if this isnt here, then the vehicle select in mariokart will look terrible if(destFragment.polyid.opaque == polyAttr.polyid) goto rejected_fragment; } } shader.w = w; shader.invu = invu; shader.invv = invv; //perspective-correct the colors r = (r * w) + 0.5f; g = (g * w) + 0.5f; b = (b * w) + 0.5f; //this is a HACK: //we are being very sloppy with our interpolation precision right now //and rather than fix it, i just want to clamp it shader.materialColor.r = max(0U,min(63U,u32floor(r))); shader.materialColor.g = max(0U,min(63U,u32floor(g))); shader.materialColor.b = max(0U,min(63U,u32floor(b))); shader.materialColor.a = polyAttr.alpha; //pixel shader FragmentColor shaderOutput; shade(shaderOutput); //we shouldnt do any of this if we generated a totally transparent pixel if(shaderOutput.a != 0) { //alpha test (don't have any test cases for this...? is it in the right place...?) if(gfx3d.renderState.enableAlphaTest) { if(shaderOutput.a < gfx3d.renderState.alphaTestRef) goto rejected_fragment; } //handle polyids bool isOpaquePixel = shaderOutput.a == 31; if(isOpaquePixel) { destFragment.polyid.opaque = polyAttr.polyid; destFragment.isTranslucentPoly = polyAttr.translucent?1:0; destFragment.fogged = polyAttr.fogged; destFragmentColor = shaderOutput; } else { //dont overwrite pixels on translucent polys with the same polyids if(destFragment.polyid.translucent == polyAttr.polyid) goto rejected_fragment; //originally we were using a test case of shadows-behind-trees in sm64ds //but, it looks bad in that game. this is actually correct //if this isnt correct, then complex shape cart shadows in mario kart don't work right destFragment.polyid.translucent = polyAttr.polyid; //alpha blending and write color alphaBlend(destFragmentColor, shaderOutput); destFragment.fogged &= polyAttr.fogged; } //depth writing if(isOpaquePixel || polyAttr.translucentDepthWrite) destFragment.depth = depth; } //shadow cases: (need multi-bit stencil buffer to cope with all of these, especially the mariokart compelx shadows) //1. sm64 (standing near signs and blocks) //2. mariokart (no glitches in shadow shape in kart selector) //3. mariokart (no junk beneath platform in kart selector / no shadow beneath grate floor in bowser stage) //(specifically, the shadows in mario kart are complicated concave shapes) goto done; depth_fail: if(shader.mode == 3 && polyAttr.polyid == 0) destFragment.stencil++; rejected_fragment: done: ; if(shader.mode == 3 && polyAttr.polyid != 0 && destFragment.stencil) destFragment.stencil--; } //draws a single scanline FORCEINLINE void drawscanline(edge_fx_fl *pLeft, edge_fx_fl *pRight, bool lineHack) { int XStart = pLeft->X; int width = pRight->X - XStart; // HACK: workaround for vertical/slant line poly if (lineHack && width == 0) { int leftWidth = pLeft->XStep; if (pLeft->ErrorTerm + pLeft->Numerator >= pLeft->Denominator) leftWidth++; int rightWidth = pRight->XStep; if (pRight->ErrorTerm + pRight->Numerator >= pRight->Denominator) rightWidth++; width = max(1, max(abs(leftWidth), abs(rightWidth))); } //these are the starting values, taken from the left edge float invw = pLeft->invw.curr; float u = pLeft->u.curr; float v = pLeft->v.curr; float z = pLeft->z.curr; float color[3] = { pLeft->color[0].curr, pLeft->color[1].curr, pLeft->color[2].curr }; //our dx values are taken from the steps up until the right edge float invWidth = 1.0f / width; float dinvw_dx = (pRight->invw.curr - invw) * invWidth; float du_dx = (pRight->u.curr - u) * invWidth; float dv_dx = (pRight->v.curr - v) * invWidth; float dz_dx = (pRight->z.curr - z) * invWidth; float dc_dx[3] = { (pRight->color[0].curr - color[0]) * invWidth, (pRight->color[1].curr - color[1]) * invWidth, (pRight->color[2].curr - color[2]) * invWidth }; int adr = (pLeft->Y*engine->width)+XStart; //CONSIDER: in case some other math is wrong (shouldve been clipped OK), we might go out of bounds here. //better check the Y value. if(RENDERER && (pLeft->Y<0 || pLeft->Y>191)) { printf("rasterizer rendering at y=%d! oops!\n",pLeft->Y); return; } if(!RENDERER && (pLeft->Y<0 || pLeft->Y>=engine->height)) { printf("rasterizer rendering at y=%d! oops!\n",pLeft->Y); return; } int x = XStart; if(x<0) { if(RENDERER && !lineHack) { printf("rasterizer rendering at x=%d! oops!\n",x); return; } invw += dinvw_dx * -x; u += du_dx * -x; v += dv_dx * -x; z += dz_dx * -x; color[0] += dc_dx[0] * -x; color[1] += dc_dx[1] * -x; color[2] += dc_dx[2] * -x; adr += -x; width -= -x; x = 0; } if(x+width > (RENDERER?256:engine->width)) { if(RENDERER && !lineHack) { printf("rasterizer rendering at x=%d! oops!\n",x+width-1); return; } width = (RENDERER?256:engine->width)-x; } while(width-- > 0) { pixel(adr,color[0],color[1],color[2],u,v,1.0f/invw,z); adr++; x++; invw += dinvw_dx; u += du_dx; v += dv_dx; z += dz_dx; color[0] += dc_dx[0]; color[1] += dc_dx[1]; color[2] += dc_dx[2]; } } //runs several scanlines, until an edge is finished template void runscanlines(edge_fx_fl *left, edge_fx_fl *right, bool horizontal, bool lineHack) { //oh lord, hack city for edge drawing //do not overstep either of the edges int Height = min(left->Height,right->Height); bool first=true; //HACK: special handling for horizontal line poly if (lineHack && left->Height == 0 && right->Height == 0 && left->Y<192 && left->Y>=0) { bool draw = (!SLI || (left->Y & SLI_MASK) == SLI_VALUE); if(draw) drawscanline(left,right,lineHack); } while(Height--) { bool draw = (!SLI || (left->Y & SLI_MASK) == SLI_VALUE); if(draw) drawscanline(left,right,lineHack); const int xl = left->X; const int xr = right->X; const int y = left->Y; left->Step(); right->Step(); if(!RENDERER && _debug_thisPoly) { //debug drawing bool top = (horizontal&&first); bool bottom = (!Height&&horizontal); if(Height || top || bottom) { if(draw) { int nxl = left->X; int nxr = right->X; if(top) { int xs = min(xl,xr); int xe = max(xl,xr); for(int x=xs;x<=xe;x++) { int adr = (y*engine->width)+x; engine->screenColor[adr].r = 63; engine->screenColor[adr].g = 0; engine->screenColor[adr].b = 0; } } else if(bottom) { int xs = min(xl,xr); int xe = max(xl,xr); for(int x=xs;x<=xe;x++) { int adr = (y*engine->width)+x; engine->screenColor[adr].r = 63; engine->screenColor[adr].g = 0; engine->screenColor[adr].b = 0; } } else { int xs = min(xl,nxl); int xe = max(xl,nxl); for(int x=xs;x<=xe;x++) { int adr = (y*engine->width)+x; engine->screenColor[adr].r = 63; engine->screenColor[adr].g = 0; engine->screenColor[adr].b = 0; } xs = min(xr,nxr); xe = max(xr,nxr); for(int x=xs;x<=xe;x++) { int adr = (y*engine->width)+x; engine->screenColor[adr].r = 63; engine->screenColor[adr].g = 0; engine->screenColor[adr].b = 0; } } } } first = false; } } } //rotates verts counterclockwise template INLINE void rot_verts() { #define ROTSWAP(X) if(type>X) swap(verts[X-1],verts[X]); ROTSWAP(1); ROTSWAP(2); ROTSWAP(3); ROTSWAP(4); ROTSWAP(5); ROTSWAP(6); ROTSWAP(7); ROTSWAP(8); ROTSWAP(9); } //rotate verts until vert0.y is minimum, and then vert0.x is minimum in case of ties //this is a necessary precondition for our shape engine template void sort_verts(bool backwards) { //if the verts are backwards, reorder them first if(backwards) for(int i=0;iX) if(verts[0]->y > verts[X]->y) goto doswap; CHECKY(1); CHECKY(2); CHECKY(3); CHECKY(4); CHECKY(5); CHECKY(6); CHECKY(7); CHECKY(8); CHECKY(9); break; doswap: rot_verts(); } while(verts[0]->y == verts[1]->y && verts[0]->x > verts[1]->x) { rot_verts(); // hack for VC++ 2010 (bug in compiler optimization?) // freeze on 3D // TODO: study it #if defined(_MSC_VER) && _MSC_VER == 1600 Sleep(0); // nop #endif } } //This function can handle any convex N-gon up to octagons //verts must be clockwise. //I didnt reference anything for this algorithm but it seems like I've seen it somewhere before. //Maybe it is like crow's algorithm template void shape_engine(int type, bool backwards, bool lineHack) { bool failure = false; switch(type) { case 3: sort_verts<3>(backwards); break; case 4: sort_verts<4>(backwards); break; case 5: sort_verts<5>(backwards); break; case 6: sort_verts<6>(backwards); break; case 7: sort_verts<7>(backwards); break; case 8: sort_verts<8>(backwards); break; case 9: sort_verts<9>(backwards); break; case 10: sort_verts<10>(backwards); break; default: printf("skipping type %d\n",type); return; } //we are going to step around the polygon in both directions starting from vert 0. //right edges will be stepped over clockwise and left edges stepped over counterclockwise. //these variables track that stepping, but in order to facilitate wrapping we start extra high //for the counter we're decrementing. int lv = type, rv = 0; edge_fx_fl left, right; bool step_left = true, step_right = true; for(;;) { //generate new edges if necessary. we must avoid regenerating edges when they are incomplete //so that they can be continued on down the shape assert(rv != type); int _lv = lv==type?0:lv; //make sure that we ask for vert 0 when the variable contains the starting value if(step_left) left = edge_fx_fl(_lv,lv-1,(VERT**)&verts, failure); if(step_right) right = edge_fx_fl(rv,rv+1,(VERT**)&verts, failure); step_left = step_right = false; //handle a failure in the edge setup due to nutty polys if(failure) return; bool horizontal = left.Y == right.Y; runscanlines(&left,&right,horizontal, lineHack); //if we ran out of an edge, step to the next one if(right.Height == 0) { step_right = true; rv++; } if(left.Height == 0) { step_left = true; lv--; } //this is our completion condition: when our stepped edges meet in the middle if(lv<=rv+1) break; } } SoftRasterizerEngine* engine; template FORCEINLINE void mainLoop(SoftRasterizerEngine* const engine) { this->engine = engine; lastTexKey = NULL; u32 lastPolyAttr = 0; u32 lastTextureFormat = 0, lastTexturePalette = 0; //iterate over polys bool first=true; for(int i=0;iclippedPolyCounter;i++) { if(!RENDERER) _debug_thisPoly = (i==engine->_debug_drawClippedUserPoly); if(!engine->polyVisible[i]) continue; polynum = i; GFX3D_Clipper::TClippedPoly &clippedPoly = engine->clippedPolys[i]; POLY *poly = clippedPoly.poly; int type = clippedPoly.type; if(first || lastPolyAttr != poly->polyAttr) { polyAttr.setup(poly->polyAttr); polyAttr.translucent = poly->isTranslucent(); lastPolyAttr = poly->polyAttr; } if(first || lastTextureFormat != poly->texParam || lastTexturePalette != poly->texPalette) { sampler.setup(poly->texParam); lastTextureFormat = poly->texParam; lastTexturePalette = poly->texPalette; } first = false; lastTexKey = engine->polyTexKeys[i]; //hmm... shader gets setup every time because it depends on sampler which may have just changed setupShader(poly->polyAttr); for(int j=0;jverts[j] = &clippedPoly.clipVerts[j]; for(int j=type;jverts[j] = NULL; polyAttr.backfacing = engine->polyBackfacing[i]; shape_engine(type,!polyAttr.backfacing, (poly->vtxFormat & 4) && CommonSettings.GFX3D_LineHack); } } }; //rasterizerUnit static SoftRasterizerEngine mainSoftRasterizer; #define _MAX_CORES 16 static Task rasterizerUnitTask[_MAX_CORES]; static RasterizerUnit rasterizerUnit[_MAX_CORES]; static RasterizerUnit _HACK_viewer_rasterizerUnit; static unsigned int rasterizerCores = 0; static bool rasterizerUnitTasksInited = false; static void* execRasterizerUnit(void* arg) { intptr_t which = (intptr_t)arg; rasterizerUnit[which].mainLoop(&mainSoftRasterizer); return 0; } static char SoftRastInit(void) { char result = Default3D_Init(); if (result == 0) { return result; } if(!rasterizerUnitTasksInited) { rasterizerUnitTasksInited = true; _HACK_viewer_rasterizerUnit.SLI_MASK = 1; _HACK_viewer_rasterizerUnit.SLI_VALUE = 0; rasterizerCores = CommonSettings.num_cores; if (rasterizerCores > _MAX_CORES) rasterizerCores = _MAX_CORES; if(CommonSettings.num_cores <= 1) { rasterizerCores = 1; rasterizerUnit[0].SLI_MASK = 0; rasterizerUnit[0].SLI_VALUE = 0; } else { for (u8 i = 0; i < rasterizerCores; i++) { rasterizerUnit[i].SLI_MASK = (rasterizerCores - 1); rasterizerUnit[i].SLI_VALUE = i; rasterizerUnitTask[i].start(false); } } } static bool tables_generated = false; if(!tables_generated) { tables_generated = true; for(int i=0;i<64;i++) { for(int j=0;j<64;j++) { modulate_table[i][j] = ((i+1) * (j+1) - 1) >> 6; for(int a=0;a<32;a++) decal_table[a][i][j] = ((i*a) + (j*(31-a))) >> 5; } } //these tables are used to increment through vert lists without having to do wrapping logic/math int idx=0; for(int i=3;i<=8;i++) { index_start_table[i-3] = idx; for(int j=0;j 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); } } softRastHasNewData = false; Default3D_Reset(); } static void SoftRastClose() { if (rasterizerCores > 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); rasterizerUnitTask[i].shutdown(); } } rasterizerUnitTasksInited = false; softRastHasNewData = false; Default3D_Close(); } static void SoftRastVramReconfigureSignal() { Default3D_VramReconfigureSignal(); } static void SoftRastConvertFramebuffer() { memcpy(gfx3d_convertedScreen,_screenColor,256*192*4); } void SoftRasterizerEngine::initFramebuffer(const int width, const int height, const bool clearImage) { const int todo = width*height; Fragment clearFragment; FragmentColor clearFragmentColor; clearFragment.isTranslucentPoly = 0; clearFragmentColor.r = GFX3D_5TO6(gfx3d.renderState.clearColor&0x1F); clearFragmentColor.g = GFX3D_5TO6((gfx3d.renderState.clearColor>>5)&0x1F); clearFragmentColor.b = GFX3D_5TO6((gfx3d.renderState.clearColor>>10)&0x1F); clearFragmentColor.a = ((gfx3d.renderState.clearColor>>16)&0x1F); clearFragment.polyid.opaque = (gfx3d.renderState.clearColor>>24)&0x3F; //special value for uninitialized translucent polyid. without this, fires in spiderman2 dont display //I am not sure whether it is right, though. previously this was cleared to 0, as a guess, //but in spiderman2 some fires with polyid 0 try to render on top of the background clearFragment.polyid.translucent = kUnsetTranslucentPolyID; clearFragment.depth = gfx3d.renderState.clearDepth; clearFragment.stencil = 0; clearFragment.isTranslucentPoly = 0; clearFragment.fogged = BIT15(gfx3d.renderState.clearColor); for(int i=0;i>8)&0xFF; FragmentColor *dstColor = screenColor; Fragment *dst = screen; for(int iy=0;iy<192;iy++) { int y = ((iy + yscroll)&255)<<8; for(int ix=0;ix<256;ix++) { int x = (ix + xscroll)&255; int adr = y + x; //this is tested by harry potter and the order of the phoenix. //TODO (optimization) dont do this if we are mapped to blank memory (such as in sonic chronicles) //(or use a special zero fill in the bulk clearing above) u16 col = clearImage[adr]; dstColor->color = RGB15TO6665(col,31*(col>>15)); //this is tested quite well in the sonic chronicles main map mode //where depth values are used for trees etc you can walk behind u16 depth = clearDepth[adr]; dst->fogged = BIT15(depth); dst->depth = DS_DEPTH15TO24(depth); dstColor++; dst++; } } } else for(int i=0;i> 2) & 0x3F; toonTable[i].g = (u32temp >> 10) & 0x3F; toonTable[i].b = (u32temp >> 18) & 0x3F; #else toonTable[i].color = (RGB15TO32_NOALPHA(gfx3d.renderState.u16ToonTable[i])>>2)&0x3F3F3F3F; #endif //printf("%d %d %d %d\n",toonTable[i].r,toonTable[i].g,toonTable[i].b,toonTable[i].a); } } void SoftRasterizerEngine::updateFogTable() { u8* fogDensity = MMU.MMU_MEM[ARMCPU_ARM9][0x40] + 0x360; #if 0 //TODO - this might be a little slow; //we might need to hash all the variables and only recompute this when something changes const int increment = (0x400 >> gfx3d.renderState.fogShift); for(u32 i=0;i<32768;i++) { if(i> gfx3d.renderState.fogShift); const int incrementDivShift = 10 - gfx3d.renderState.fogShift; u32 fogOffset = min(max(gfx3d.renderState.fogOffset, 0), 32768); u32 iMin = min(32768, (( 1 + 1) << incrementDivShift) + fogOffset + 1 - increment); u32 iMax = min(32768, ((32 + 1) << incrementDivShift) + fogOffset + 1 - increment); assert(iMin <= iMax); memset(fogTable, fogDensity[0], iMin); for(u32 i = iMin; i < iMax; i++) { int num = (i - fogOffset + (increment-1)); int j = (num >> incrementDivShift) - 1; u32 value = (num & ~(increment-1)) + fogOffset; u32 diff = value - i; assert(j >= 1 && j < 32); fogTable[i] = ((diff*(fogDensity[j-1]) + (increment-diff)*(fogDensity[j])) >> incrementDivShift); } memset(fogTable+iMax, fogDensity[31], 32768-iMax); #endif } void SoftRasterizerEngine::updateFloatColors() { //convert colors to float to get more precision in case we need it for(int i=0;icount;i++) vertlist->list[i].color_to_float(); } SoftRasterizerEngine::SoftRasterizerEngine() : _debug_drawClippedUserPoly(-1) { this->clippedPolys = clipper.clippedPolys = new GFX3D_Clipper::TClippedPoly[POLYLIST_SIZE*2]; } void SoftRasterizerEngine::framebufferProcess() { // this looks ok although it's still pretty much a hack, // it needs to be redone with low-level accuracy at some point, // but that should probably wait until the shape renderer is more accurate. // a good test case for edge marking is Sonic Rush: // - the edges are completely sharp/opaque on the very brief title screen intro, // - the level-start intro gets a pseudo-antialiasing effect around the silhouette, // - the character edges in-level are clearly transparent, and also show well through shield powerups. if(gfx3d.renderState.enableEdgeMarking) { //TODO - need to test and find out whether these get grabbed at flush time, or at render time //we can do this by rendering a 3d frame and then freezing the system, but only changing the edge mark colors FragmentColor edgeMarkColors[8]; int edgeMarkDisabled[8]; for(int i=0;i<8;i++) { u16 col = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x330+i*2); edgeMarkColors[i].color = RGB15TO5555(col,gfx3d.state.enableAntialiasing ? 0x0F : 0x1F); edgeMarkColors[i].r = GFX3D_5TO6(edgeMarkColors[i].r); edgeMarkColors[i].g = GFX3D_5TO6(edgeMarkColors[i].g); edgeMarkColors[i].b = GFX3D_5TO6(edgeMarkColors[i].b); // this seems to be the only thing that selectively disables edge marking edgeMarkDisabled[i] = (col == 0x7FFF); } for(int i=0,y=0;y<192;y++) { for(int x=0;x<256;x++,i++) { Fragment destFragment = screen[i]; u8 self = destFragment.polyid.opaque; if(edgeMarkDisabled[self>>3]) continue; if(destFragment.isTranslucentPoly) continue; // > is used instead of != to prevent double edges // between overlapping polys of different IDs. // also note that the edge generally goes on the outside, not the inside, (maybe needs to change later) // and that polys with the same edge color can make edges against each other. FragmentColor edgeColor = edgeMarkColors[self>>3]; #define PIXOFFSET(dx,dy) ((dx)+(256*(dy))) #define ISEDGE(dx,dy) ((x+(dx)!=256) && (x+(dx)!=-1) && (y+(dy)!=192) && (y+(dy)!=-1) && self > screen[i+PIXOFFSET(dx,dy)].polyid.opaque) #define DRAWEDGE(dx,dy) alphaBlend(screenColor[i+PIXOFFSET(dx,dy)], edgeColor) bool upleft = ISEDGE(-1,-1); bool up = ISEDGE( 0,-1); bool upright = ISEDGE( 1,-1); bool left = ISEDGE(-1, 0); bool right = ISEDGE( 1, 0); bool downleft = ISEDGE(-1, 1); bool down = ISEDGE( 0, 1); bool downright = ISEDGE( 1, 1); if(upleft && upright && downleft && !downright) DRAWEDGE(-1,-1); if(up && !down) DRAWEDGE(0,-1); if(upleft && upright && !downleft && downright) DRAWEDGE(1,-1); if(left && !right) DRAWEDGE(-1,0); if(right && !left) DRAWEDGE(1,0); if(upleft && !upright && downleft && downright) DRAWEDGE(-1,1); if(down && !up) DRAWEDGE(0,1); if(!upleft && upright && downleft && downright) DRAWEDGE(1,1); #undef PIXOFFSET #undef ISEDGE #undef DRAWEDGE } } } if(gfx3d.renderState.enableFog) { u32 r = GFX3D_5TO6((gfx3d.renderState.fogColor)&0x1F); u32 g = GFX3D_5TO6((gfx3d.renderState.fogColor>>5)&0x1F); u32 b = GFX3D_5TO6((gfx3d.renderState.fogColor>>10)&0x1F); u32 a = (gfx3d.renderState.fogColor>>16)&0x1F; for(int i=0;i<256*192;i++) { Fragment &destFragment = screen[i]; if(!destFragment.fogged) continue; FragmentColor &destFragmentColor = screenColor[i]; u32 fogIndex = destFragment.depth>>9; assert(fogIndex<32768); u8 fog = fogTable[fogIndex]; if(fog==127) fog=128; if(!gfx3d.renderState.enableFogAlphaOnly) { destFragmentColor.r = ((128-fog)*destFragmentColor.r + r*fog)>>7; destFragmentColor.g = ((128-fog)*destFragmentColor.g + g*fog)>>7; destFragmentColor.b = ((128-fog)*destFragmentColor.b + b*fog)>>7; } destFragmentColor.a = ((128-fog)*destFragmentColor.a + a*fog)>>7; } } ////debug alpha channel framebuffer contents //for(int i=0;i<256*192;i++) //{ // FragmentColor &destFragmentColor = screenColor[i]; // destFragmentColor.r = destFragmentColor.a; // destFragmentColor.g = destFragmentColor.a; // destFragmentColor.b = destFragmentColor.a; //} } void SoftRasterizerEngine::performClipping(bool hirez) { //submit all polys to clipper clipper.reset(); for(int i=0;icount;i++) { POLY* poly = &polylist->list[indexlist->list[i]]; VERT* clipVerts[4] = { &vertlist->list[poly->vertIndexes[0]], &vertlist->list[poly->vertIndexes[1]], &vertlist->list[poly->vertIndexes[2]], poly->type==4 ?&vertlist->list[poly->vertIndexes[3]] :NULL }; if(hirez) clipper.clipPoly(poly,clipVerts); else clipper.clipPoly(poly,clipVerts); } clippedPolyCounter = clipper.clippedPolyCounter; } template void SoftRasterizerEngine::performViewportTransforms(int width, int height) { const float xfactor = width/256.0f; const float yfactor = height/192.0f; const float xmax = 256.0f*xfactor-(CUSTOM?0.001f:0); //fudge factor to keep from overrunning render buffers const float ymax = 192.0f*yfactor-(CUSTOM?0.001f:0); //viewport transforms for(int i=0;iviewport); vert.coord[0] *= viewport.width * xfactor; vert.coord[0] += viewport.x * xfactor; vert.coord[1] *= viewport.height * yfactor; vert.coord[1] += viewport.y * yfactor; vert.coord[1] = ymax - vert.coord[1]; //well, i guess we need to do this to keep Princess Debut from rendering huge polys. //there must be something strange going on vert.coord[0] = max(0.0f,min(xmax,vert.coord[0])); vert.coord[1] = max(0.0f,min(ymax,vert.coord[1])); } } } //these templates needed to be instantiated manually template void SoftRasterizerEngine::performViewportTransforms(int width, int height); template void SoftRasterizerEngine::performViewportTransforms(int width, int height); void SoftRasterizerEngine::performCoordAdjustment(const bool skipBackfacing) { for(int i=0;ipolyAttr); //make sure all the textures we'll need are cached //(otherwise on a multithreaded system there will be multiple writers-- //this SHOULD be read-only, although some day the texcache may collect statistics or something //and then it won't be safe. if(needInitTexture || lastTextureFormat != poly->texParam || lastTexturePalette != poly->texPalette) { lastTexKey = TexCache_SetTexture(TexFormat_15bpp,poly->texParam,poly->texPalette); lastTextureFormat = poly->texParam; lastTexturePalette = poly->texPalette; needInitTexture = false; } //printf("%08X %d\n",poly->texParam,rasterizerUnit[0].textures.currentNum); polyTexKeys[i] = lastTexKey; } } void SoftRasterizerEngine::performBackfaceTests() { for(int i=0;ipolyAttr); //HACK: backface culling //this should be moved to gfx3d, but first we need to redo the way the lists are built //because it is too convoluted right now. //(must we throw out verts if a poly gets backface culled? if not, then it might be easier) //an older approach //(not good enough for quads and other shapes) //float ab[2], ac[2]; Vector2Copy(ab, verts[1].coord); Vector2Copy(ac, verts[2].coord); Vector2Subtract(ab, verts[0].coord); //Vector2Subtract(ac, verts[0].coord); float cross = Vector2Cross(ab, ac); polyAttr.backfacing = (cross>0); //a better approach // we have to support somewhat non-convex polygons (see NSMB world map 1st screen). // this version should handle those cases better. int n = type - 1; float facing = (verts[0].y + verts[n].y) * (verts[0].x - verts[n].x) + (verts[1].y + verts[0].y) * (verts[1].x - verts[0].x) + (verts[2].y + verts[1].y) * (verts[2].x - verts[1].x); for(int j = 2; j < n; j++) facing += (verts[j+1].y + verts[j].y) * (verts[j+1].x - verts[j].x); polyBackfacing[i] = polyAttr.backfacing = (facing < 0); polyVisible[i] = polyAttr.isVisible(polyAttr.backfacing); } } void _HACK_Viewer_ExecUnit(SoftRasterizerEngine* engine) { _HACK_viewer_rasterizerUnit.mainLoop(engine); } static void SoftRastRender() { // Force threads to finish before rendering with new data if (rasterizerCores > 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); } } mainSoftRasterizer.polylist = gfx3d.polylist; mainSoftRasterizer.vertlist = gfx3d.vertlist; mainSoftRasterizer.indexlist = &gfx3d.indexlist; mainSoftRasterizer.screen = _screen; mainSoftRasterizer.screenColor = _screenColor; mainSoftRasterizer.width = 256; mainSoftRasterizer.height = 192; //setup fog variables (but only if fog is enabled) if(gfx3d.renderState.enableFog) mainSoftRasterizer.updateFogTable(); mainSoftRasterizer.initFramebuffer(256,192,gfx3d.renderState.enableClearImage?true:false); mainSoftRasterizer.updateToonTable(); mainSoftRasterizer.updateFloatColors(); mainSoftRasterizer.performClipping(CommonSettings.GFX3D_HighResolutionInterpolateColor); mainSoftRasterizer.performViewportTransforms(256,192); mainSoftRasterizer.performBackfaceTests(); mainSoftRasterizer.performCoordAdjustment(true); mainSoftRasterizer.setupTextures(true); softRastHasNewData = true; if (rasterizerCores > 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].execute(&execRasterizerUnit, (void *)i); } } else { rasterizerUnit[0].mainLoop(&mainSoftRasterizer); } } static void SoftRastRenderFinish() { if (!softRastHasNewData) { return; } if (rasterizerCores > 1) { for(unsigned int i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); } } TexCache_EvictFrame(); mainSoftRasterizer.framebufferProcess(); // printf("rendered %d of %d polys after backface culling\n",gfx3d.polylist->count-culled,gfx3d.polylist->count); SoftRastConvertFramebuffer(); softRastHasNewData = false; } GPU3DInterface gpu3DRasterize = { "SoftRasterizer", SoftRastInit, SoftRastReset, SoftRastClose, SoftRastRender, SoftRastRenderFinish, SoftRastVramReconfigureSignal }; desmume-0.9.9/src/readwrite.h0000644000175000017500000000422112140261633016645 0ustar guillaumeguillaume/* Copyright (C) 2008-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _READWRITE_H_ #define _READWRITE_H_ #include "types.h" #include "emufile.h" #include #include #include //well. just for the sake of consistency int write8le(u8 b, EMUFILE *fp); inline int write8le(u8* b, EMUFILE *fp) { return write8le(*b,fp); } int write16le(u16 b, EMUFILE* os); int write32le(u32 b, EMUFILE* os); int write64le(u64 b, EMUFILE* os); inline int write_double_le(double b, EMUFILE*is) { u64 temp = double_to_u64(b); int ret = write64le(temp,is); return ret; } int read8le(u8 *Bufo, EMUFILE*is); int read16le(u16 *Bufo, EMUFILE*is); inline int read16le(s16 *Bufo, EMUFILE*is) { return read16le((u16*)Bufo,is); } int read32le(u32 *Bufo, EMUFILE*is); inline int read32le(s32 *Bufo, EMUFILE*is) { return read32le((u32*)Bufo,is); } int read64le(u64 *Bufo, EMUFILE*is); inline int read_double_le(double *Bufo, EMUFILE*is) { u64 temp; int ret = read64le(&temp,is); *Bufo = u64_to_double(temp); return ret; } int read16le(u16 *Bufo, std::istream *is); template int readle(T *Bufo, EMUFILE*is) { CTASSERT(sizeof(T)==1||sizeof(T)==2||sizeof(T)==4||sizeof(T)==8); switch(sizeof(T)) { case 1: return read8le((u8*)Bufo,is); case 2: return read16le((u16*)Bufo,is); case 4: return read32le((u32*)Bufo,is); case 8: return read64le((u64*)Bufo,is); default: return 0; } } int readbool(bool *b, EMUFILE* is); void writebool(bool b, EMUFILE* os); int readbuffer(std::vector &vec, EMUFILE* is); int writebuffer(std::vector& vec, EMUFILE* os); #endif desmume-0.9.9/src/common.cpp0000644000175000017500000000241012140261633016500 0ustar guillaumeguillaume/* Copyright (C) 2008-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ //TODO - move this into ndssystem where it belongs probably #include #include #include "common.h" char *trim(char *s, int len) { char *ptr = NULL; if (!s) return NULL; if (!*s) return s; if(len==-1) ptr = s + strlen(s) - 1; else ptr = s+len - 1; for (; (ptr >= s) && (!*ptr || isspace((u8)*ptr)) ; ptr--); ptr[1] = '\0'; return s; } char *removeSpecialChars(char *s) { char *buf = s; if (!s) return NULL; if (!*s) return s; for (u32 i = 0; i < strlen(s); i++) { if (isspace((u8)s[i]) && (s[i] != 0x20)) *buf = 0x20; else *buf = s[i]; buf++; } *buf = 0; return s; } desmume-0.9.9/src/mic_openal.cpp0000644000175000017500000000674412140261633017334 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef WIN32 #include #include #include "types.h" #include "mic.h" #include "readwrite.h" #include "emufile.h" #include "debug.h" #define MIC_BUFSIZE 512 BOOL Mic_Inited = FALSE; u8 Mic_Buffer[2][2*MIC_BUFSIZE]; u16 Mic_BufPos; u8 Mic_PlayBuf; u8 Mic_WriteBuf; int MicButtonPressed; ALCdevice *alDevice; ALCdevice *alCaptureDevice; ALCcontext *alContext; BOOL Mic_Init() { ALenum err; const char *szDefaultCaptureDevice; if (!(alDevice = alcOpenDevice(0))) { INFO("Failed to Initialize Open AL\n"); return FALSE; } if( !(alContext = alcCreateContext(alDevice, 0))) { INFO("Failed to create OpenAL context\n"); return FALSE; } if( !alcMakeContextCurrent(alContext)) { INFO("Failed to make OpenAL context current\n"); return FALSE; } alDistanceModel(AL_INVERSE_DISTANCE); szDefaultCaptureDevice = alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER); LOG("Default OpenAL Capture Device is '%s'\n\n", szDefaultCaptureDevice); alCaptureDevice = alcCaptureOpenDevice(szDefaultCaptureDevice, 16000, AL_FORMAT_STEREO8, MIC_BUFSIZE); err = alGetError(); if (err != AL_NO_ERROR) { INFO("Failed to alCaptureOpenDevice, ALenum %i\n", err); return 0; } alcCaptureStart(alCaptureDevice); Mic_Inited = TRUE; Mic_Reset(); return TRUE; } void Mic_Reset() { if (!Mic_Inited) return; memset(Mic_Buffer, 0, MIC_BUFSIZE*2*2); Mic_BufPos = 0; Mic_PlayBuf = 1; Mic_WriteBuf = 0; } void Mic_DeInit() { if (!Mic_Inited) return; Mic_Inited = FALSE; if (alDevice) { if (alCaptureDevice) { alcCaptureStop(alCaptureDevice); alcCaptureCloseDevice(alCaptureDevice); } if (alContext) { alcMakeContextCurrent(0); alcDestroyContext(alContext); } alcCloseDevice(alDevice); } } static void alReadSound() { ALenum err; int num; alcGetIntegerv(alCaptureDevice, ALC_CAPTURE_SAMPLES, 1, &num); if (num < MIC_BUFSIZE-1) { LOG("not enough microphone data waiting! (%i samples)\n", num); } else { LOG("%i samples waiting\n", num); } if (num > MIC_BUFSIZE) num = MIC_BUFSIZE; alcCaptureSamples(alCaptureDevice, Mic_Buffer[Mic_WriteBuf], num); err = alGetError(); if (err != AL_NO_ERROR) { INFO("Failed to alcCaptureSamples, ALenum %i\n", err); return; } } u8 Mic_ReadSample() { static u8 stats_max; static u8 stats_min; u8 ret; if (Mic_BufPos >= MIC_BUFSIZE) { alReadSound(); Mic_BufPos = 0; Mic_PlayBuf ^= 1; Mic_WriteBuf ^= 1; } ret = Mic_Buffer[Mic_PlayBuf][Mic_BufPos >> 1]; if (ret > stats_max) stats_max = ret; if (ret < stats_min) stats_min = ret; Mic_BufPos += 2; return ret; } void mic_savestate(EMUFILE* os) { write32le(-1,os); } bool mic_loadstate(EMUFILE* is, int size) { is->fseek(size, SEEK_CUR); return TRUE; } #endif desmume-0.9.9/src/shaders.h0000644000175000017500000000735712140261633016325 0ustar guillaumeguillaume/* Copyright (C) 2008-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ /* Predefined OpenGL shaders */ /* Vertex shader */ const char *vertexShader = {"\ attribute vec4 inPosition; \n\ attribute vec2 inTexCoord0; \n\ attribute vec3 inColor; \n\ \n\ uniform float polyAlpha; \n\ uniform vec2 texScale; \n\ \n\ varying vec4 vtxPosition; \n\ varying vec2 vtxTexCoord; \n\ varying vec4 vtxColor; \n\ \n\ void main() \n\ { \n\ // Keep the projection matrix as a placeholder in case we need to use one in the future. \n\ mat4 projectionMtx = mat4( vec4(1.0, 0.0, 0.0, 0.0), \n\ vec4(0.0, 1.0, 0.0, 0.0), \n\ vec4(0.0, 0.0, 1.0, 0.0), \n\ vec4(0.0, 0.0, 0.0, 1.0));\n\ \n\ mat2 texScaleMtx = mat2( vec2(texScale.x, 0.0), \n\ vec2( 0.0, texScale.y)); \n\ \n\ vtxPosition = projectionMtx * inPosition; \n\ vtxTexCoord = texScaleMtx * inTexCoord0; \n\ vtxColor = vec4(inColor * 4.0, polyAlpha); \n\ \n\ gl_Position = vtxPosition; \n\ } \n\ "}; /* Fragment shader */ const char *fragmentShader = {"\ uniform sampler2D texMainRender; \n\ uniform sampler1D texToonTable; \n\ uniform int polyID; \n\ uniform bool hasTexture; \n\ uniform int polygonMode; \n\ uniform int toonShadingMode; \n\ uniform int oglWBuffer; \n\ uniform bool enableAlphaTest; \n\ uniform float alphaTestRef; \n\ \n\ varying vec4 vtxPosition; \n\ varying vec2 vtxTexCoord; \n\ varying vec4 vtxColor; \n\ \n\ void main() \n\ { \n\ vec4 texColor = vec4(1.0, 1.0, 1.0, 1.0); \n\ vec4 flagColor; \n\ float flagDepth; \n\ \n\ if(hasTexture) \n\ { \n\ texColor = texture2D(texMainRender, vtxTexCoord); \n\ } \n\ \n\ flagColor = texColor; \n\ \n\ if(polygonMode == 0) \n\ { \n\ flagColor = vtxColor * texColor; \n\ } \n\ else if(polygonMode == 1) \n\ { \n\ if (texColor.a == 0.0 || !hasTexture) \n\ { \n\ flagColor.rgb = vtxColor.rgb; \n\ } \n\ else if (texColor.a == 1.0) \n\ { \n\ flagColor.rgb = texColor.rgb; \n\ } \n\ else \n\ { \n\ flagColor.rgb = texColor.rgb * (1.0-texColor.a) + vtxColor.rgb * texColor.a;\n\ } \n\ \n\ flagColor.a = vtxColor.a; \n\ } \n\ else if(polygonMode == 2) \n\ { \n\ if (toonShadingMode == 0) \n\ { \n\ vec3 toonColor = vec3(texture1D(texToonTable, vtxColor.r).rgb); \n\ flagColor.rgb = texColor.rgb * toonColor.rgb;\n\ flagColor.a = texColor.a * vtxColor.a;\n\ } \n\ else \n\ { \n\ vec3 toonColor = vec3(texture1D(texToonTable, vtxColor.r).rgb); \n\ flagColor.rgb = texColor.rgb * vtxColor.rgb + toonColor.rgb; \n\ flagColor.a = texColor.a * vtxColor.a; \n\ } \n\ } \n\ else if(polygonMode == 3) \n\ { \n\ if (polyID != 0) \n\ { \n\ flagColor = vtxColor; \n\ } \n\ } \n\ \n\ if (flagColor.a == 0.0 || (enableAlphaTest && flagColor.a < alphaTestRef)) \n\ { \n\ discard; \n\ } \n\ \n\ if (oglWBuffer == 1) \n\ { \n\ // TODO \n\ flagDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \n\ } \n\ else \n\ { \n\ flagDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \n\ } \n\ \n\ gl_FragColor = flagColor; \n\ gl_FragDepth = flagDepth; \n\ } \n\ "}; desmume-0.9.9/src/sndsdl.cpp0000644000175000017500000001210012140261633016474 0ustar guillaumeguillaume/* Copyright (C) 2005-2006 Theo Berkau Copyright (C) 2006-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include #include "types.h" #include "SPU.h" #include "sndsdl.h" #include "debug.h" #ifdef _XBOX #include #include #include #endif int SNDSDLInit(int buffersize); void SNDSDLDeInit(); void SNDSDLUpdateAudio(s16 *buffer, u32 num_samples); u32 SNDSDLGetAudioSpace(); void SNDSDLMuteAudio(); void SNDSDLUnMuteAudio(); void SNDSDLSetVolume(int volume); SoundInterface_struct SNDSDL = { SNDCORE_SDL, "SDL Sound Interface", SNDSDLInit, SNDSDLDeInit, SNDSDLUpdateAudio, SNDSDLGetAudioSpace, SNDSDLMuteAudio, SNDSDLUnMuteAudio, SNDSDLSetVolume }; static u16 *stereodata16; static u32 soundoffset; static volatile u32 soundpos; static u32 soundlen; static u32 soundbufsize; static SDL_AudioSpec audiofmt; ////////////////////////////////////////////////////////////////////////////// #ifdef _XBOX static volatile bool doterminate; static volatile bool terminated; DWORD WINAPI SNDXBOXThread( LPVOID ) { for(;;) { if(doterminate) break; { SPU_Emulate_user(); } Sleep(10); } terminated = true; return 0; } #endif static void MixAudio(void *userdata, Uint8 *stream, int len) { int i; Uint8 *soundbuf=(Uint8 *)stereodata16; for (i = 0; i < len; i++) { if (soundpos >= soundbufsize) soundpos = 0; stream[i] = soundbuf[soundpos]; soundpos++; } } ////////////////////////////////////////////////////////////////////////////// int SNDSDLInit(int buffersize) { if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0) return -1; audiofmt.freq = 44100; audiofmt.format = AUDIO_S16SYS; audiofmt.channels = 2; audiofmt.samples = (audiofmt.freq / 60) * 2; audiofmt.callback = MixAudio; audiofmt.userdata = NULL; //samples should be a power of 2 according to SDL-doc //so normalize it to the nearest power of 2 here u32 normSamples = 512; while (normSamples < audiofmt.samples) normSamples <<= 1; audiofmt.samples = normSamples; soundlen = audiofmt.freq / 60; // 60 for NTSC soundbufsize = buffersize * sizeof(s16) * 2; if (SDL_OpenAudio(&audiofmt, NULL) != 0) { return -1; } if ((stereodata16 = (u16 *)malloc(soundbufsize)) == NULL) return -1; memset(stereodata16, 0, soundbufsize); soundpos = 0; SDL_PauseAudio(0); #ifdef _XBOX doterminate = false; terminated = false; CreateThread(0,0,SNDXBOXThread,0,0,0); #endif return 0; } ////////////////////////////////////////////////////////////////////////////// void SNDSDLDeInit() { #ifdef _XBOX doterminate = true; while(!terminated) { Sleep(1); } #endif SDL_CloseAudio(); if (stereodata16) free(stereodata16); } ////////////////////////////////////////////////////////////////////////////// void SNDSDLUpdateAudio(s16 *buffer, u32 num_samples) { u32 copy1size=0, copy2size=0; SDL_LockAudio(); if ((soundbufsize - soundoffset) < (num_samples * sizeof(s16) * 2)) { copy1size = (soundbufsize - soundoffset); copy2size = (num_samples * sizeof(s16) * 2) - copy1size; } else { copy1size = (num_samples * sizeof(s16) * 2); copy2size = 0; } memcpy((((u8 *)stereodata16)+soundoffset), buffer, copy1size); // ScspConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)(((u8 *)stereodata16)+soundoffset), copy1size / sizeof(s16) / 2); if (copy2size) memcpy(stereodata16, ((u8 *)buffer)+copy1size, copy2size); // ScspConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)stereodata16, copy2size / sizeof(s16) / 2); soundoffset += copy1size + copy2size; soundoffset %= soundbufsize; SDL_UnlockAudio(); } ////////////////////////////////////////////////////////////////////////////// u32 SNDSDLGetAudioSpace() { u32 freespace=0; if (soundoffset > soundpos) freespace = soundbufsize - soundoffset + soundpos; else freespace = soundpos - soundoffset; return (freespace / sizeof(s16) / 2); } ////////////////////////////////////////////////////////////////////////////// void SNDSDLMuteAudio() { SDL_PauseAudio(1); } ////////////////////////////////////////////////////////////////////////////// void SNDSDLUnMuteAudio() { SDL_PauseAudio(0); } ////////////////////////////////////////////////////////////////////////////// void SNDSDLSetVolume(int volume) { } ////////////////////////////////////////////////////////////////////////////// desmume-0.9.9/src/fs.h0000644000175000017500000000215412140261633015272 0ustar guillaumeguillaume/* Copyright (C) 2006 Guillaume Duhamel Copyright (C) 2007-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef FS_H #define FS_H #include "types.h" #define FS_IS_DIR 1 #define FS_ERR_UNKNOWN -1 #define FS_ERR_NO_MORE_FILES 1 extern const char FS_SEPARATOR; typedef struct { char cFileName[256]; char cAlternateFileName[14]; u32 flags; u32 fileSize; } FsEntry; void * FsReadFirst(const char * path, FsEntry * entry); int FsReadNext(void * search, FsEntry * entry); void FsClose(void * search); int FsError(void); #endif desmume-0.9.9/src/movie.h0000644000175000017500000001236212140261633016003 0ustar guillaumeguillaume/* Copyright 2008-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef __MOVIE_H_ #define __MOVIE_H_ #include #include #include #include #include #include "emufile.h" #include "utils/datetime.h" #include "utils/guid.h" #include "utils/md5.h" typedef struct { int movie_version; // version of the movie format in the file u32 num_frames; u32 rerecord_count; bool poweron; u32 emu_version_used; MD5DATA md5_of_rom_used; std::string name_of_rom_used; std::vector comments; std::vector subtitles; } MOVIE_INFO; enum EMOVIEMODE { MOVIEMODE_INACTIVE = 0, MOVIEMODE_RECORD = 1, MOVIEMODE_PLAY = 2, MOVIEMODE_FINISHED = 3, }; enum EMOVIECMD { MOVIECMD_MIC = 1, MOVIECMD_RESET = 2, MOVIECMD_LID = 4, }; //RLDUTSBAYXWEG class MovieData; class MovieRecord { public: u16 pad; union { struct { u8 x, y; u8 touch; }; u32 padding; } touch; //misc commands like reset, etc. //small now to save space; we might need to support more commands later. //the disk format will support up to 64bit if necessary uint8 commands; bool command_reset() { return (commands&MOVIECMD_RESET)!=0; } bool command_microphone() { return (commands&MOVIECMD_MIC)!=0; } bool command_lid() { return (commands&MOVIECMD_LID)!=0; } void toggleBit(int bit) { pad ^= mask(bit); } void setBit(int bit) { pad |= mask(bit); } void clearBit(int bit) { pad &= ~mask(bit); } void setBitValue(int bit, bool val) { if(val) setBit(bit); else clearBit(bit); } bool checkBit(int bit) { return (pad & mask(bit))!=0; } bool Compare(MovieRecord& compareRec); void clear(); void parse(MovieData* md, EMUFILE* fp); bool parseBinary(MovieData* md, EMUFILE* fp); void dump(MovieData* md, EMUFILE* fp, int index); void dumpBinary(MovieData* md, EMUFILE* fp, int index); void parsePad(EMUFILE* fp, u16& pad); void dumpPad(EMUFILE* fp, u16 pad); static const char mnemonics[13]; private: int mask(int bit) { return 1< savestate; std::vector sram; std::vector records; std::vector comments; int rerecordCount; Desmume_Guid guid; DateTime rtcStart; //was the frame data stored in binary? bool binaryFlag; int getNumRecords() { return records.size(); } class TDictionary : public std::map { public: bool containsKey(std::string key) { return find(key) != end(); } void tryInstallBool(std::string key, bool& val) { if(containsKey(key)) val = atoi(operator [](key).c_str())!=0; } void tryInstallString(std::string key, std::string& val) { if(containsKey(key)) val = operator [](key); } void tryInstallInt(std::string key, int& val) { if(containsKey(key)) val = atoi(operator [](key).c_str()); } }; void truncateAt(int frame); void installValue(std::string& key, std::string& val); int dump(EMUFILE* fp, bool binary); void clearRecordRange(int start, int len); void insertEmpty(int at, int frames); static bool loadSavestateFrom(std::vector* buf); static void dumpSavestateTo(std::vector* buf, int compressionLevel); static bool loadSramFrom(std::vector* buf); //void TryDumpIncremental(); private: void installInt(std::string& val, int& var) { var = atoi(val.c_str()); } void installBool(std::string& val, bool& var) { var = atoi(val.c_str())!=0; } }; extern int currFrameCounter; extern EMOVIEMODE movieMode; //adelikat: main needs this for frame counter display extern MovieData currMovieData; //adelikat: main needs this for frame counter display extern bool movie_reset_command; bool FCEUI_MovieGetInfo(EMUFILE* fp, MOVIE_INFO& info, bool skipFrameCount); void FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart); const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe); // returns NULL on success, errmsg on failure void FCEUI_StopMovie(); void FCEUMOV_AddInputState(); void FCEUMOV_HandlePlayback(); void FCEUMOV_HandleRecording(); void mov_savestate(EMUFILE* fp); bool mov_loadstate(EMUFILE* fp, int size); void LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size); bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader); extern bool movie_readonly; extern bool ShowInputDisplay; void FCEUI_MakeBackupMovie(bool dispMessage); DateTime FCEUI_MovieGetRTCDefault(); #endif desmume-0.9.9/src/gdbstub/0000755000175000017500000000000012140305320016131 5ustar guillaumeguillaumedesmume-0.9.9/src/gdbstub/Makefile.am0000644000175000017500000000017412140261622020175 0ustar guillaumeguillaumeinclude $(top_srcdir)/src/desmume.mk noinst_LIBRARIES = libgdbstub.a libgdbstub_a_SOURCES = gdbstub.cpp gdbstub_internal.h desmume-0.9.9/src/gdbstub/gdbstub.cpp0000644000175000017500000012213412140261622020300 0ustar guillaumeguillaume/* Copyright (C) 2008-2010 DeSmuME team Originally written by Ben Jaques. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include //#include #include #include #include #include "types.h" #include "NDSSystem.h" #ifdef WIN32 #include #else #include #include #include #include #include #endif #include "armcpu.h" #define uint32_t u32 #define uint16_t u16 #define uint8_t u8 #include "gdbstub.h" #include "gdbstub_internal.h" #ifdef __GNUC__ #define UNUSED_PARM( parm) parm __attribute__((unused)) #else #define UNUSED_PARM( parm) parm #endif #if 1 #define DEBUG_LOG( fmt, ...) fprintf(stdout, fmt, ##__VA_ARGS__) #else #define DEBUG_LOG( fmt, ...) #endif #if 0 #define LOG_ERROR( fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) #else #define LOG_ERROR( fmt, ...) #endif #define LITTLE_ENDIAN_TO_UINT32_T( v) (\ ((v)[3] << 24) | \ ((v)[2] << 16) | \ ((v)[1] << 8) | \ ((v)[0] << 0)) /* * The state of the packet reader */ #define IDLE_READ_STATE 0 #define MID_PACKET_READ_STATE 1 #define FIRST_CHECKSUM_READ_STATE 2 #define SECOND_CHECKSUM_READ_STATE 3 /* * The gdb stub thread control message types. */ enum stub_message_type { /** The quit message type */ QUIT_STUB_MESSAGE = 0, /** The emulated CPU has stopped */ CPU_STOPPED_STUB_MESSAGE = 1 }; /* * The GDB signal values */ enum target_signal { /* Used some places (e.g. stop_signal) to record the concept that there is no signal. */ TARGET_SIGNAL_0 = 0, TARGET_SIGNAL_FIRST = 0, TARGET_SIGNAL_HUP = 1, TARGET_SIGNAL_INT = 2, TARGET_SIGNAL_QUIT = 3, TARGET_SIGNAL_ILL = 4, TARGET_SIGNAL_TRAP = 5, TARGET_SIGNAL_ABRT = 6, TARGET_SIGNAL_EMT = 7, TARGET_SIGNAL_FPE = 8, TARGET_SIGNAL_KILL = 9, TARGET_SIGNAL_BUS = 10, TARGET_SIGNAL_SEGV = 11, TARGET_SIGNAL_SYS = 12, TARGET_SIGNAL_PIPE = 13, TARGET_SIGNAL_ALRM = 14, TARGET_SIGNAL_TERM = 15, TARGET_SIGNAL_URG = 16, TARGET_SIGNAL_STOP = 17, TARGET_SIGNAL_TSTP = 18, TARGET_SIGNAL_CONT = 19, TARGET_SIGNAL_CHLD = 20, TARGET_SIGNAL_TTIN = 21, TARGET_SIGNAL_TTOU = 22, TARGET_SIGNAL_IO = 23, TARGET_SIGNAL_XCPU = 24, TARGET_SIGNAL_XFSZ = 25, TARGET_SIGNAL_VTALRM = 26, TARGET_SIGNAL_PROF = 27, TARGET_SIGNAL_WINCH = 28, TARGET_SIGNAL_LOST = 29, TARGET_SIGNAL_USR1 = 30, TARGET_SIGNAL_USR2 = 31, TARGET_SIGNAL_PWR = 32, /* Similar to SIGIO. Perhaps they should have the same number. */ TARGET_SIGNAL_POLL = 33, TARGET_SIGNAL_WIND = 34, TARGET_SIGNAL_PHONE = 35, TARGET_SIGNAL_WAITING = 36, TARGET_SIGNAL_LWP = 37, TARGET_SIGNAL_DANGER = 38, TARGET_SIGNAL_GRANT = 39, TARGET_SIGNAL_RETRACT = 40, TARGET_SIGNAL_MSG = 41, TARGET_SIGNAL_SOUND = 42, TARGET_SIGNAL_SAK = 43, TARGET_SIGNAL_PRIO = 44, }; static void causeQuit_gdb( struct gdb_stub_state *stub) { uint8_t command = QUIT_STUB_MESSAGE; #ifdef WIN32 send( stub->ctl_pipe[1], (char*)&command, 1, 0); #else write( stub->ctl_pipe[1], &command, 1); #endif } static void indicateCPUStop_gdb( struct gdb_stub_state *stub) { uint8_t command = CPU_STOPPED_STUB_MESSAGE; #ifdef WIN32 send( stub->ctl_pipe[1], (char*)&command, 1, 0); #else write( stub->ctl_pipe[1], &command, 1); #endif } /* * * * */ static void break_execution( void *data, UNUSED_PARM(uint32_t addr), UNUSED_PARM(int thunmb)) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; /* stall the processor */ stub->cpu_ctrl->stall( stub->cpu_ctrl->data); NDS_debug_break(); /* remove the post execution function */ stub->cpu_ctrl->remove_post_ex_fn( stub->cpu_ctrl->data); /* indicate the halt */ stub->stop_type = STOP_HOST_BREAK; indicateCPUStop_gdb( stub); } static void step_instruction_watch( void *data, uint32_t addr, UNUSED_PARM(int thunmb)) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; DEBUG_LOG("Step watch: waiting for %08x at %08x\n", stub->step_instr_address, addr); if ( addr == stub->step_instr_address) { DEBUG_LOG("Step hit -> %08x\n", stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, 15)); /* stall the processor */ stub->cpu_ctrl->stall( stub->cpu_ctrl->data); /* remove the post execution function */ stub->cpu_ctrl->remove_post_ex_fn( stub->cpu_ctrl->data); /* indicate the halt */ stub->stop_type = STOP_STEP_BREAK; indicateCPUStop_gdb( stub); NDS_debug_break(); } } /************************************************************************/ /* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/ /* at least NUMREGBYTES*2 are needed for register packets */ #define BUFMAX 2048 static const char hexchars[]="0123456789abcdef"; /* * Convert ch from a hex digit to an int */ static int hex (unsigned char ch) { if (ch >= 'a' && ch <= 'f') return ch-'a'+10; if (ch >= '0' && ch <= '9') return ch-'0'; if (ch >= 'A' && ch <= 'F') return ch-'A'+10; return -1; } static const unsigned char * hex2mem ( const unsigned char *buf, uint8_t *mem, int count) { int i; unsigned char ch; for (i=0; i 0) { ch = memio->read8( memio->data, mem_addr++); *buf++ = hexchars[ch >> 4]; *buf++ = hexchars[ch & 0xf]; } *buf = 0; return buf; } static enum read_res_gdb readPacket_gdb( SOCKET_TYPE sock, struct packet_reader_gdb *packet) { uint8_t cur_byte; enum read_res_gdb read_res = READ_NOT_FINISHED; int sock_res; /* update the state */ while ( (sock_res = recv( sock, (char*)&cur_byte, 1, 0)) == 1) { switch ( packet->state) { case IDLE_READ_STATE: /* wait for the '$' start of packet character */ if ( cur_byte == '$') { //DEBUG_LOG( "Found packet\n"); packet->state = MID_PACKET_READ_STATE; packet->pos_index = 0; packet->checksum = 0; } /* Is this the break command */ else if ( cur_byte == 3) { //DEBUG_LOG( "GDB has sent a break\n"); packet->buffer[0] = cur_byte; packet->buffer[1] = 0; packet->pos_index = 1; return READ_BREAK; } break; case MID_PACKET_READ_STATE: if ( cur_byte == '#') { //DEBUG_LOG( "\nAbout to get checksum\n"); packet->buffer[packet->pos_index] = '\0'; packet->state = FIRST_CHECKSUM_READ_STATE; } else if ( packet->pos_index >= BUFMAX - 1) { //DEBUG_LOG( "read buffer exceeded\n"); packet->state = IDLE_READ_STATE; } else { //DEBUG_LOG( "%c", cur_byte); packet->checksum = packet->checksum + cur_byte; packet->buffer[packet->pos_index] = cur_byte; packet->pos_index = packet->pos_index + 1; } break; case FIRST_CHECKSUM_READ_STATE: packet->read_checksum = hex( cur_byte) << 4; packet->state = SECOND_CHECKSUM_READ_STATE; break; case SECOND_CHECKSUM_READ_STATE: { packet->read_checksum += hex( cur_byte); packet->state = IDLE_READ_STATE; return READ_COMPLETE; break; } } } if ( sock_res == 0) { read_res = READ_SOCKET_ERROR; } else if ( sock_res == -1) { if ( errno != EAGAIN) { read_res = READ_SOCKET_ERROR; } } return read_res; } struct hidden_debug_out_packet { unsigned char *start_ptr; }; struct debug_out_packet { unsigned char *const start_ptr; }; static struct hidden_debug_out_packet the_out_packet; static unsigned char hidden_buffer[BUFMAX]; static struct debug_out_packet * getOutPacket( void) { the_out_packet.start_ptr = &hidden_buffer[1]; return (struct debug_out_packet *)&the_out_packet; } #define CHECKSUM_PART_SIZE 3 /** * send the packet in buffer. */ static int putpacket ( SOCKET_TYPE sock, struct debug_out_packet *out_packet, uint32_t size) { unsigned char checksum = 0; uint32_t count; unsigned char *ch_ptr = (unsigned char *)&out_packet->start_ptr[-1]; uint8_t reply_ch; //DEBUG_LOG_START( "Putting packet size %d ", size); /* add the '$' to the start of the packet */ *ch_ptr++ = '$'; /* calculate and add the checksum to the packet */ for ( count = 0; count < size; count += 1) { checksum += ch_ptr[count]; //DEBUG_LOG_PART("%c", ch_ptr[count]); } //DEBUG_LOG_PART("\n"); ch_ptr[count++] = '#'; ch_ptr[count++] = hexchars[checksum >> 4]; ch_ptr[count++] = hexchars[checksum & 0xf]; ch_ptr[count] = '\0'; //DEBUG_LOG("packet %s\n", &out_packet->start_ptr[-1]); /* add one for the '$' character */ count += 1; do { int reply_found = 0; send( sock, (char*)&out_packet->start_ptr[-1], count, 0); do { int read_res = recv( sock, (char*)&reply_ch, 1, 0); if ( read_res == 0) { return -1; } else if ( read_res == -1) { if ( errno != EAGAIN) { return -1; } } else { reply_found = 1; } } while ( !reply_found); } while ( reply_ch != '+'); /* $#. */ return count - 4; } static uint32_t make_stop_packet( uint8_t *ptr, enum stop_type type, uint32_t stop_address) { uint32_t stop_size = 0; int watch_index = 0; const char watch_chars[] = { 'a', 'r' }; switch (type) { case STOP_UNKNOWN: case STOP_HOST_BREAK: ptr[0] = 'S'; ptr[1] = hexchars[TARGET_SIGNAL_INT >> 4]; ptr[2] = hexchars[TARGET_SIGNAL_INT & 0xf]; stop_size = 3; break; case STOP_STEP_BREAK: case STOP_BREAKPOINT: ptr[0] = 'S'; ptr[1] = hexchars[TARGET_SIGNAL_TRAP >> 4]; ptr[2] = hexchars[TARGET_SIGNAL_TRAP & 0xf]; stop_size = 3; break; case STOP_WATCHPOINT: watch_index = 1; case STOP_RWATCHPOINT: watch_index += 1; case STOP_AWATCHPOINT: { int i; int out_index = 0; ptr[out_index++] = 'T'; ptr[out_index++] = hexchars[TARGET_SIGNAL_ABRT >> 4]; ptr[out_index++] = hexchars[TARGET_SIGNAL_ABRT & 0xf]; if ( watch_index < 2) { ptr[out_index++] = watch_chars[watch_index]; } ptr[out_index++] = 'w'; ptr[out_index++] = 'a'; ptr[out_index++] = 't'; ptr[out_index++] = 'c'; ptr[out_index++] = 'h'; ptr[out_index++] = ':'; for ( i = 0; i < 8; i++) { ptr[out_index++] = hexchars[(stop_address >> (i * 4)) & 0xf]; } ptr[out_index++] = ';'; stop_size = out_index; } break; } return stop_size; } /** * Returns -1 if there is a socket error. */ static int processPacket_gdb( SOCKET_TYPE sock, const uint8_t *packet, struct gdb_stub_state *stub) { // uint8_t remcomOutBuffer[BUFMAX_GDB]; struct debug_out_packet *out_packet = getOutPacket(); uint8_t *out_ptr = out_packet->start_ptr; int send_reply = 1; uint32_t send_size = 0; DEBUG_LOG("Processing packet %c\n", packet[0]); switch( packet[0]) { case 3: /* The break command */ //stub->running_state = gdb_stub_state::STOPPED_GDB_STATE; //*ptr++ = 'S'; //*ptr++ = hexchars[0x2 >> 4]; //*ptr++ = hexchars[0x2 & 0xf]; //*ptr++ = 0; send_reply = 0; break; case '?': send_size = make_stop_packet( out_ptr, stub->stop_type, stub->stop_address); /**ptr++ = 'S'; *ptr++ = hexchars[stub->stop_reason >> 4]; *ptr++ = hexchars[stub->stop_reason & 0xf]; send_size = 3;*/ break; case 'c': stub->emu_stub_state = gdb_stub_state::RUNNING_EMU_GDB_STATE; stub->ctl_stub_state = gdb_stub_state::START_RUN_GDB_STATE; stub->main_stop_flag = 0; send_reply = 0; /* remove the cpu stall */ stub->cpu_ctrl->unstall( stub->cpu_ctrl->data); NDS_debug_continue(); break; case 's': { uint32_t instr_addr = stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, 15); /* Determine where the next instruction will take the CPU. * Execute the instruction using a copy of the CPU with a zero memory interface. */ DEBUG_LOG( "Stepping instruction at %08x\n", instr_addr); /* install the post execution function */ stub->step_instr_address = instr_addr; stub->cpu_ctrl->install_post_ex_fn( stub->cpu_ctrl->data, step_instruction_watch, stub); stub->emu_stub_state = gdb_stub_state::RUNNING_EMU_GDB_STATE; stub->ctl_stub_state = gdb_stub_state::START_RUN_GDB_STATE; stub->main_stop_flag = 0; send_reply = 0; /* remove the cpu stall */ stub->cpu_ctrl->unstall( stub->cpu_ctrl->data); //NDS_debug_step(); NDS_debug_continue(); break; } /* * Register set */ case 'P': { uint32_t reg; uint32_t value; const uint8_t *rx_ptr = &packet[1]; DEBUG_LOG("Processing packet %s\n", packet); if ( hexToInt( &rx_ptr, ®)) { if ( *rx_ptr++ == '=') { uint8_t tmp_mem[4]; rx_ptr = hex2mem( rx_ptr, tmp_mem, 4); value = LITTLE_ENDIAN_TO_UINT32_T( tmp_mem); DEBUG_LOG("Setting reg %d to %08x\n", reg, value); if ( reg < 16) stub->cpu_ctrl->set_reg( stub->cpu_ctrl->data, reg, value); if ( reg == 25) { stub->cpu_ctrl->set_reg( stub->cpu_ctrl->data, 16, value); } strcpy( (char *)out_ptr, "OK"); send_size = 2; } } break; } case 'm': { uint32_t addr = 0; uint32_t length = 0; int error01 = 1; const uint8_t *rx_ptr = &packet[1]; if ( hexToInt( &rx_ptr, &addr)) { if ( *rx_ptr++ == ',') { if ( hexToInt( &rx_ptr, &length)) { //DEBUG_LOG("mem read from %08x (%d)\n", addr, length); if ( !mem2hex( stub->direct_memio, addr, out_ptr, length)) { strcpy ( (char *)out_ptr, "E03"); send_size = 3; } else { send_size = length * 2; } error01 = 0; } } } if ( error01) strcpy( (char *)out_ptr,"E01"); break; } /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ case 'M': { /* Try to read '%x,%x:'. */ const uint8_t *rx_ptr = &packet[1]; uint32_t addr = 0; uint32_t length = 0; int error01 = 1; DEBUG_LOG("Memory write %s\n", rx_ptr); if ( hexToInt(&rx_ptr, &addr)) { if ( *rx_ptr++ == ',') { if ( hexToInt(&rx_ptr, &length)) { if ( *rx_ptr++ == ':') { uint8_t write_byte; unsigned int i; DEBUG_LOG("Memory write of %d bytes to %08x\n", length, addr); for ( i = 0; i < length; i++) { rx_ptr = hex2mem( rx_ptr, &write_byte, 1); stub->direct_memio->write8( stub->direct_memio->data, addr++, write_byte); } strcpy( (char *)out_ptr, "OK"); error01 = 0; } } else { DEBUG_LOG("Failed to find length (addr %08x)\n", addr); } } else { DEBUG_LOG("expected ',' got '%c' (addr = %08x)\n", *rx_ptr, addr); } } else { DEBUG_LOG("Failed to find addr\n"); } if ( error01) { strcpy( (char *)out_ptr, "E02"); } break; } case 'Z': case 'z': { const uint8_t *rx_ptr = &packet[2]; int remove_flag = 0; if ( packet[0] == 'z') remove_flag = 1; DEBUG_LOG( "%c%c packet %s (remove? %d)\n", packet[0], packet[1], rx_ptr, remove_flag); switch ( packet[1]) { /* all instruction breakpoints are treated the same */ case '0': case '1': case '2': case '3': case '4': { uint32_t addr = 0; uint32_t length = 0; int error01 = 1; struct breakpoint_gdb **bpoint_list; switch ( packet[1]) { case '0': case '1': bpoint_list = &stub->instr_breakpoints; break; case '2': bpoint_list = &stub->write_breakpoints; break; case '3': bpoint_list = &stub->read_breakpoints; break; case '4': bpoint_list = &stub->access_breakpoints; break; } if ( *rx_ptr++ == ',') { DEBUG_LOG("%s\n", rx_ptr); if ( hexToInt( &rx_ptr, &addr)) { if ( *rx_ptr++ == ',') { DEBUG_LOG("addr %08x %s\n", addr, rx_ptr); if ( hexToInt( &rx_ptr, &length)) { if ( remove_flag) { int removed = 0; struct breakpoint_gdb *last_bpoint = NULL; struct breakpoint_gdb *bpoint = *bpoint_list; while ( bpoint != NULL && !removed) { if ( bpoint->addr == addr) { DEBUG_LOG("Breakpoint(%c) at %08x removed\n", packet[1], addr); removed = 1; if ( last_bpoint == NULL) { *bpoint_list = bpoint->next; } else { last_bpoint->next = bpoint->next; } bpoint->next = stub->free_breakpoints; stub->free_breakpoints = bpoint; } last_bpoint = bpoint; bpoint = bpoint->next; } strcpy( (char *)out_ptr, "OK"); send_size = 2; error01 = 0; } else { /* get a breakpoint descriptor from the free pool and add it to * the current stub instruction breakpoint list */ struct breakpoint_gdb *bpoint = stub->free_breakpoints; if ( bpoint != NULL) { DEBUG_LOG( "Breakpoint(%c) added at %08x length %d\n", packet[1], addr, length); stub->free_breakpoints = bpoint->next; bpoint->addr = addr; bpoint->size = length; bpoint->next = *bpoint_list; *bpoint_list = bpoint; strcpy( (char *)out_ptr, "OK"); send_size = 2; error01 = 0; } } } } } } if ( error01) { strcpy( (char *)out_ptr, "E01"); send_size = 3; } } break; default: break; } break; } /* * Set the register values */ case 'G': { int i; const uint8_t *rx_ptr = &packet[1]; uint32_t reg_values[16]; uint32_t cpsr; uint8_t tmp_mem[4]; DEBUG_LOG("'G' command %s\n", rx_ptr); /* general purpose regs 0 to 15 */ for ( i = 0; i < 16; i++) { rx_ptr = hex2mem( rx_ptr, tmp_mem, 4); reg_values[i] = LITTLE_ENDIAN_TO_UINT32_T( tmp_mem); DEBUG_LOG("Setting reg %d to %08x\n", i, reg_values[i]); } /* skip the floaing point registers and floating point status register */ rx_ptr += 8 * (96 / 8 * 2); rx_ptr += 8; /* the CPSR register is last */ rx_ptr = hex2mem( rx_ptr, tmp_mem, 4); cpsr = LITTLE_ENDIAN_TO_UINT32_T( tmp_mem); DEBUG_LOG("Setting cpsr to %08x\n", cpsr); strcpy( (char *)out_ptr, "OK"); send_size = 2; break; } case 'g': /* return the value of the CPU registers */ { int i; int out_index = 0; uint32_t pc_value = stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, 15); uint32_t cpsr_value = stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, 16); DEBUG_LOG("'g' command PC = %08x\n", pc_value); /* general purpose regs 0 to 14 */ for ( i = 0; i < 15; i++) { uint32_t reg = stub->cpu_ctrl->read_reg( stub->cpu_ctrl->data, i); out_ptr[out_index++] = hexchars[(reg >> 4) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 0) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 12) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 8) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 20) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 16) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 28) & 0xf]; out_ptr[out_index++] = hexchars[(reg >> 24) & 0xf]; } out_ptr[out_index++] = hexchars[(pc_value >> 4) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 0) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 12) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 8) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 20) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 16) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 28) & 0xf]; out_ptr[out_index++] = hexchars[(pc_value >> 24) & 0xf]; /* floating point registers (8 96bit) */ for ( i = 0; i < 8; i++) { int j; for ( j = 0; j < (96/4); j++) { out_ptr[out_index++] = '0'; } } /* floating point status register? */ for ( i = 0; i < 1; i++) { int j; for ( j = 0; j < 8; j++) { out_ptr[out_index++] = '0'; } } /* The CPSR */ for ( i = 0; i < 1; i++) { out_ptr[out_index++] = hexchars[(cpsr_value >> 4) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 0) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 12) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 8) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 20) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 16) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 28) & 0xf]; out_ptr[out_index++] = hexchars[(cpsr_value >> 24) & 0xf]; } send_size = out_index; } break; } if ( send_reply) { return putpacket( sock, out_packet, send_size); } return 0; } /** * create the listening socket */ static SOCKET_TYPE createSocket ( int port) { SOCKET_TYPE sock; struct sockaddr_in bind_addr; memset (&bind_addr, 0, sizeof (bind_addr)); bind_addr.sin_family = AF_INET; bind_addr.sin_port = htons( port); bind_addr.sin_addr.s_addr = htonl (INADDR_ANY); /* create the socket, bind the address */ sock = socket (PF_INET, SOCK_STREAM, 0); #ifdef WIN32 if ( sock != INVALID_SOCKET) #else if (sock != -1) #endif { if (bind (sock, (struct sockaddr *) &bind_addr, sizeof (bind_addr)) == -1) { LOG_ERROR("Bind failed \"%s\" port %d\n", strerror( errno), port); #ifdef WIN32 closesocket( sock); #else close (sock); #endif sock = -1; } else if (listen (sock, 5) == -1) { LOG_ERROR("Listen failed \"%s\"\n", strerror( errno)); #ifdef WIN32 closesocket( sock); #else close (sock); #endif sock = -1; } } else { #ifdef WIN32 char message[30]; int error = WSAGetLastError(); sprintf( message, "Error creating socket %d\n", error); LOG_ERROR("Error creating socket %d\n", error); #endif } return sock; } /* * Handle GDB stub connections. */ /** */ INLINE static int check_breaks_gdb( struct gdb_stub_state *gdb_state, struct breakpoint_gdb *bpoint_list, uint32_t addr, UNUSED_PARM(uint32_t size), enum stop_type stop_type) { int found_break = 0; if ( gdb_state->active) { struct breakpoint_gdb *bpoint = bpoint_list; while ( bpoint != NULL && !found_break) { if ( addr == bpoint->addr) { DEBUG_LOG("Breakpoint hit at %08x\n", addr); /* stall the processor */ gdb_state->cpu_ctrl->stall( gdb_state->cpu_ctrl->data); NDS_debug_break(); /* indicate the break to the GDB stub thread */ gdb_state->stop_type = stop_type; gdb_state->stop_address = addr; indicateCPUStop_gdb( gdb_state); } bpoint = bpoint->next; } } return found_break; } static void WINAPI listenerThread_gdb( void *data) { struct gdb_stub_state *state = (struct gdb_stub_state *)data; fd_set read_sock_set; fd_set main_set; int quit = 0; FD_ZERO( &main_set); FD_SET( state->listen_fd, &main_set); FD_SET( state->ctl_pipe[0], &main_set); while (!quit) { int sel_res; read_sock_set = main_set; //DEBUG_LOG("Waiting on sockets\n"); sel_res = select( FD_SETSIZE, &read_sock_set, NULL, NULL, NULL); //DEBUG_LOG("sockets ready %d\n", sel_res); if ( sel_res > 0) { /* Is this a control message */ if ( FD_ISSET( state->ctl_pipe[0], &read_sock_set)) { uint8_t ctl_command; //DEBUG_LOG("Control message\n"); #ifdef WIN32 recv( state->ctl_pipe[0], (char*)&ctl_command, 1, 0); #else read( state->ctl_pipe[0], (char*)&ctl_command, 1); #endif switch ( ctl_command) { case CPU_STOPPED_STUB_MESSAGE: if ( state->active && state->ctl_stub_state != gdb_stub_state::STOPPED_GDB_STATE) { struct debug_out_packet *out_packet = getOutPacket(); uint8_t *ptr = out_packet->start_ptr; uint32_t send_size; /* mark the stub as stopped and send the stop packet */ state->ctl_stub_state = gdb_stub_state::STOPPED_GDB_STATE; state->main_stop_flag = 1; send_size = make_stop_packet( ptr, state->stop_type, state->stop_address); /*ptr[0] = 'S'; ptr[1] = hexchars[state->stop_reason >> 4]; ptr[2] = hexchars[state->stop_reason & 0xf];*/ putpacket( state->sock_fd, out_packet, send_size); DEBUG_LOG( "\nBreak from Emulation\n"); } else { LOG_ERROR( "Asked to stop and already stopped\n"); } break; default: /* quit out */ quit = 1; break; } } else { //struct armcpu_t *cpu = twin_states->cpus[i]; SOCKET_TYPE arm_listener = state->listen_fd; /* check for a connection request */ if ( FD_ISSET( arm_listener, &read_sock_set)) { SOCKET_TYPE new_conn; struct sockaddr_in gdb_addr; #ifdef WIN32 int addr_size = sizeof( gdb_addr); #else socklen_t addr_size = sizeof( gdb_addr); #endif //DEBUG_LOG("listener\n"); /* accept the connection if we do not already have one */ new_conn = accept( arm_listener, (struct sockaddr *)&gdb_addr, &addr_size); if ( new_conn != -1) { int close_sock = 1; //DEBUG_LOG("got new socket\n"); if ( state->sock_fd == -1 && state->active) { #ifdef WIN32 BOOL nodelay_opt = 1; #else int nodelay_opt = 1; #endif int set_res; //DEBUG_LOG("new connection\n"); close_sock = 0; /* make the socket NODELAY */ #ifdef WIN32 set_res = setsockopt( new_conn, IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay_opt, sizeof( nodelay_opt)); #else set_res = setsockopt( new_conn, IPPROTO_TCP, TCP_NODELAY, &nodelay_opt, sizeof( nodelay_opt)); #endif if ( set_res != 0) { LOG_ERROR( "Failed to set NODELAY socket option \"%s\"\n", strerror( errno)); } FD_SET( new_conn, &main_set); state->sock_fd = new_conn; } if ( close_sock) { //DEBUG_LOG("closing new socket\n"); #ifdef WIN32 closesocket( new_conn); #else close( new_conn); #endif } } } /* handle the gdb connection */ if ( state->sock_fd != -1 && state->active) { SOCKET_TYPE gdb_sock = state->sock_fd; if ( FD_ISSET( gdb_sock, &read_sock_set)) { enum read_res_gdb read_res = readPacket_gdb( gdb_sock, &state->rx_packet); //DEBUG_LOG("socket read %d\n", read_res); switch ( read_res) { case READ_NOT_FINISHED: /* do nothing here */ break; case READ_SOCKET_ERROR: /* close the socket */ #ifdef WIN32 closesocket( gdb_sock); #else close( gdb_sock); #endif state->sock_fd = -1; FD_CLR( gdb_sock, &main_set); break; case READ_BREAK: { /* break the running of the cpu */ if ( state->ctl_stub_state != gdb_stub_state::STOPPED_GDB_STATE) { /* this will cause the emulation to break the execution */ DEBUG_LOG( "Breaking execution\n"); /* install the post execution function */ state->cpu_ctrl->install_post_ex_fn( state->cpu_ctrl->data, break_execution, state); } break; } case READ_COMPLETE: { uint8_t reply; int write_res; int process_packet = 0; int close_socket = 0; struct packet_reader_gdb *packet = &state->rx_packet; if ( state->ctl_stub_state != gdb_stub_state::STOPPED_GDB_STATE) { /* not ready to process packet yet, send a bad reply */ reply = '-'; } else { /* send a reply based on the checksum and if okay process the packet */ if ( packet->read_checksum == packet->checksum) { reply = '+'; process_packet = 1; } else { reply = '-'; } } write_res = send( gdb_sock, (char*)&reply, 1, 0); if ( write_res != 1) { close_socket = 1; } else { if ( processPacket_gdb( gdb_sock, state->rx_packet.buffer, state) == -1) { close_socket = 1; } } if ( close_socket) { #ifdef WIN32 closesocket( gdb_sock); #else close( gdb_sock); #endif state->sock_fd = -1; FD_CLR( gdb_sock, &main_set); } break; } } } } } } } /* tidy up and leave */ if ( state->sock_fd != -1) { #ifdef WIN32 closesocket( state->sock_fd); #else close( state->sock_fd); #endif } /* close the listenering sockets */ #ifdef WIN32 closesocket( state->listen_fd); #else close( state->listen_fd); #endif return; } /* * * The memory interface * */ static uint32_t FASTCALL gdb_prefetch32( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; breakpoint = check_breaks_gdb( stub, stub->instr_breakpoints, adr, 4, STOP_BREAKPOINT); //return stub->real_cpu_memio->prefetch32( stub->real_cpu_memio->data, adr); return 0; } static uint16_t FASTCALL gdb_prefetch16( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; breakpoint = check_breaks_gdb( stub, stub->instr_breakpoints, adr, 2, STOP_BREAKPOINT); //return stub->real_cpu_memio->prefetch16( stub->real_cpu_memio->data, adr); return 0; } /** read 8 bit data value */ static uint8_t FASTCALL gdb_read8( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; uint8_t value = 0; int breakpoint; /* pass down to the real memory interace */ value = stub->real_cpu_memio->read8( stub->real_cpu_memio->data, adr); breakpoint = check_breaks_gdb( stub, stub->read_breakpoints, adr, 1, STOP_RWATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 1, STOP_AWATCHPOINT); return value; } /** read 16 bit data value */ static uint16_t FASTCALL gdb_read16( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; uint16_t value; int breakpoint; /* pass down to the real memory interace */ value = stub->real_cpu_memio->read16( stub->real_cpu_memio->data, adr); breakpoint = check_breaks_gdb( stub, stub->read_breakpoints, adr, 2, STOP_RWATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 2, STOP_AWATCHPOINT); return value; } /** read 32 bit data value */ static uint32_t FASTCALL gdb_read32( void *data, uint32_t adr) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; uint32_t value; int breakpoint; /* pass down to the real memory interace */ value = stub->real_cpu_memio->read32( stub->real_cpu_memio->data, adr); breakpoint = check_breaks_gdb( stub, stub->read_breakpoints, adr, 4, STOP_RWATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 4, STOP_AWATCHPOINT); return value; } /** write 8 bit data value */ static void FASTCALL gdb_write8( void *data, uint32_t adr, uint8_t val) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; /* pass down to the real memory interace */ stub->real_cpu_memio->write8( stub->real_cpu_memio->data, adr, val); breakpoint = check_breaks_gdb( stub, stub->write_breakpoints, adr, 1, STOP_WATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 1, STOP_AWATCHPOINT); } /** write 16 bit data value */ static void FASTCALL gdb_write16( void *data, uint32_t adr, uint16_t val) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; /* pass down to the real memory interace */ stub->real_cpu_memio->write16( stub->real_cpu_memio->data, adr, val); breakpoint = check_breaks_gdb( stub, stub->write_breakpoints, adr, 2, STOP_WATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 2, STOP_AWATCHPOINT); } /** write 32 bit data value */ static void FASTCALL gdb_write32( void *data, uint32_t adr, uint32_t val) { struct gdb_stub_state *stub = (struct gdb_stub_state *)data; int breakpoint; /* pass down to the real memory interace */ stub->real_cpu_memio->write32( stub->real_cpu_memio->data, adr, val); breakpoint = check_breaks_gdb( stub, stub->write_breakpoints, adr, 4, STOP_WATCHPOINT); if ( !breakpoint) check_breaks_gdb( stub, stub->access_breakpoints, adr, 4, STOP_AWATCHPOINT); } #ifdef WIN32 struct socket_creator_data { SOCKET_TYPE *sock; int port_num; }; /** */ static DWORD WINAPI control_creator( LPVOID lpParameter) { struct socket_creator_data *my_data = (struct socket_creator_data *)lpParameter; *my_data->sock = socket( PF_INET, SOCK_STREAM, 0); if ( *my_data->sock != INVALID_SOCKET) { int connect_res; struct sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" ); clientService.sin_port = htons( my_data->port_num); connect_res = connect( *my_data->sock, (SOCKADDR*) &clientService, sizeof(clientService)); if ( connect_res == SOCKET_ERROR) { LOG_ERROR( "Failed to connect to socket\n"); } } return 0; } #endif /** */ gdbstub_handle_t createStub_gdb( uint16_t port, struct armcpu_memory_iface **cpu_memio, struct armcpu_memory_iface *direct_memio) { struct gdb_stub_state *stub; gdbstub_handle_t handle = NULL; int i; int res = 0; stub = (gdb_stub_state*)malloc( sizeof (struct gdb_stub_state)); if ( stub == NULL) { return NULL; } stub->active = 0; /* keep the memory interfaces */ stub->real_cpu_memio = *cpu_memio; stub->direct_memio = direct_memio; *cpu_memio = &stub->cpu_memio; /* fill in the memory interface */ stub->cpu_memio.data = stub; stub->cpu_memio.prefetch32 = gdb_prefetch32; stub->cpu_memio.prefetch16 = gdb_prefetch16; stub->cpu_memio.read8 = gdb_read8; stub->cpu_memio.read16 = gdb_read16; stub->cpu_memio.read32 = gdb_read32; stub->cpu_memio.write8 = gdb_write8; stub->cpu_memio.write16 = gdb_write16; stub->cpu_memio.write32 = gdb_write32; /* put the breakpoint descriptors onto the free list */ for ( i = 0; i < BREAKPOINT_POOL_SIZE - 1; i++) { stub->breakpoint_pool[i].next = &stub->breakpoint_pool[i+1]; } stub->breakpoint_pool[i].next = NULL; stub->free_breakpoints = &stub->breakpoint_pool[0]; stub->instr_breakpoints = NULL; stub->read_breakpoints = NULL; stub->write_breakpoints = NULL; stub->access_breakpoints = NULL; #ifdef WIN32 /* initialise the winsock library */ { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return NULL; } } { struct socket_creator_data temp_data = { &stub->ctl_pipe[0], 24689 }; SOCKET_TYPE temp_sock = createSocket ( temp_data.port_num); HANDLE temp_thread = INVALID_HANDLE_VALUE; DWORD temp_threadID; res = -1; if ( temp_sock != -1) { /* create a thread to connect to this socket */ temp_thread = CreateThread( NULL, 0, control_creator, &temp_data, 0, &temp_threadID); if ( temp_thread != INVALID_HANDLE_VALUE) { struct sockaddr_in ignore_addr; int addr_size = sizeof( ignore_addr); stub->ctl_pipe[1] = accept( temp_sock, (struct sockaddr *)&ignore_addr, &addr_size); if ( stub->ctl_pipe[1] != INVALID_SOCKET) { BOOL nodelay_opt = 1; int set_res; /* make the socket NODELAY */ set_res = setsockopt( stub->ctl_pipe[1], IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay_opt, sizeof( nodelay_opt)); if ( set_res == 0) { closesocket( temp_sock); res = 0; } } } } } if ( res != 0) { LOG_ERROR( "Failed to create control socket\n"); } #else /* create the control pipe */ res = pipe( stub->ctl_pipe); if ( res != 0) { LOG_ERROR( "Failed to create control pipe \"%s\"\n", strerror( errno)); } #endif else { stub->active = 1; stub->emu_stub_state = gdb_stub_state::RUNNING_EMU_GDB_STATE; stub->ctl_stub_state = gdb_stub_state::STOPPED_GDB_STATE; stub->rx_packet.state = IDLE_READ_STATE; stub->main_stop_flag = 1; stub->port_num = port; stub->sock_fd = -1; stub->listen_fd = createSocket( port); stub->stop_type = STOP_UNKNOWN; if ( stub->listen_fd == -1) { LOG_ERROR( "Failed to create listening socket \"%s\"\n", strerror( errno)); res = -1; } } if ( res != -1) { /* create the listenering thread */ stub->thread = createThread_gdb( listenerThread_gdb, stub); if ( stub->thread == NULL) { LOG_ERROR("Failed to create listener thread\n"); free( stub); } else { handle = stub; DEBUG_LOG("Created stub on port %d\n", port); } } else { free( stub); } return handle; } void destroyStub_gdb( gdbstub_handle_t instance) { struct gdb_stub_state *stub = (struct gdb_stub_state *)instance; causeQuit_gdb( stub); joinThread_gdb( stub->thread); //stub->cpu_ctl->unstall( stub->cpu_ctl->data); //stub->cpu_ctl->remove_post_ex_fn( stub->cpu_ctl->data); free( stub); } void activateStub_gdb( gdbstub_handle_t instance, struct armcpu_ctrl_iface *cpu_ctrl) { struct gdb_stub_state *stub = (struct gdb_stub_state *)instance; stub->cpu_ctrl = cpu_ctrl; /* stall the cpu */ stub->cpu_ctrl->stall( stub->cpu_ctrl->data); stub->active = 1; } desmume-0.9.9/src/gdbstub/gdbstub_internal.h0000644000175000017500000001101612140261622021635 0ustar guillaumeguillaume/* Copyright (C) 2008-2009 DeSmuME team Originally written by Ben Jaques. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef _GDBSTUB_INTERNAL_H_ #define _GDBSTUB_INTERNAL_H_ 1 #ifdef WIN32 #define SOCKET_TYPE SOCKET #else #define SOCKET_TYPE int #endif enum stop_type { STOP_UNKNOWN, STOP_HOST_BREAK, STOP_STEP_BREAK, STOP_BREAKPOINT, STOP_WATCHPOINT, STOP_RWATCHPOINT, STOP_AWATCHPOINT }; /** * The structure describing a breakpoint. */ struct breakpoint_gdb { /** link them in a list */ struct breakpoint_gdb *next; /** The address of the breakpoint */ uint32_t addr; /** The size of the breakpoint */ uint32_t size; }; /* */ #define BUFMAX_GDB 2048 struct packet_reader_gdb { int state; int pos_index; uint8_t checksum; uint8_t read_checksum; uint8_t buffer[BUFMAX_GDB]; }; /** The maximum number of breakpoints (of all types) available to the stub */ #define BREAKPOINT_POOL_SIZE 100 struct gdb_stub_state { /** flag indicating if the stub is active */ int active; int main_stop_flag; /** the listener thread */ void *thread; /** the id of the cpu the is under control */ //u32 cpu_id; /** the interface used to control the CPU */ struct armcpu_ctrl_iface *cpu_ctrl; /** the memory interface passed to the CPU */ struct armcpu_memory_iface cpu_memio; /** the direct interface to the memory system */ struct armcpu_memory_iface *direct_memio; /** the CPU memory interface to the real memory system */ struct armcpu_memory_iface *real_cpu_memio; /** the list of active instruction breakpoints */ struct breakpoint_gdb *instr_breakpoints; /** the list of active read breakpoints */ struct breakpoint_gdb *read_breakpoints; /** the list of active write breakpoints */ struct breakpoint_gdb *write_breakpoints; /** the list of active access breakpoints */ struct breakpoint_gdb *access_breakpoints; /** the pointer to the step break point (not NULL if set) */ //struct breakpoint_gdb *step_breakpoint; uint32_t step_instr_address; /** the state of the stub as seen by the emulator, the emulator side can * set this to STOPPING_EMU_GDB_STATE to indicate that the a breakpoint has been hit, * and STOPPED_EMU_GDB_STATE when it has informed the gdb thread that a breakpoint has * been hit. * When handled the stub side will set it back to RUNNING_EMU_GDB_STATE. * * The emulator should only run the corresponding ARM if this is set to * RUNNING_EMU_GDB_STATE. */ enum EMU_STUB_STATE { STOPPED_EMU_GDB_STATE, STOPPING_EMU_GDB_STATE, RUNNING_EMU_GDB_STATE} emu_stub_state; /** the state of the stub as set by the stub control thread */ enum CTL_STUB_STATE { STOPPED_GDB_STATE, RUNNING_GDB_STATE, STEPPING_GDB_STATE, START_RUN_GDB_STATE} ctl_stub_state; struct packet_reader_gdb rx_packet; /** the socket information */ uint16_t port_num; SOCKET_TYPE sock_fd; /** The listening socket */ SOCKET_TYPE listen_fd; /** the type of event that caused the stop */ enum stop_type stop_type; /** the address of the stop */ uint32_t stop_address; /** The step break point decsriptor */ struct breakpoint_gdb step_breakpoint_descr; /** the breakpoint descriptor pool */ struct breakpoint_gdb breakpoint_pool[BREAKPOINT_POOL_SIZE]; /** the free breakpoint descriptor list */ struct breakpoint_gdb *free_breakpoints; /** the control pipe (or socket) to the gdb stub */ SOCKET_TYPE ctl_pipe[2]; }; enum read_res_gdb { READ_NOT_FINISHED, READ_SOCKET_ERROR, READ_COMPLETE, READ_BREAK }; #endif /* End of _GDBSTUB_INTERNAL_H_ */ desmume-0.9.9/src/gdbstub/Makefile.in0000644000175000017500000003777012140304537020225 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk subdir = src/gdbstub ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libgdbstub_a_AR = $(AR) $(ARFLAGS) libgdbstub_a_LIBADD = am_libgdbstub_a_OBJECTS = gdbstub.$(OBJEXT) libgdbstub_a_OBJECTS = $(am_libgdbstub_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libgdbstub_a_SOURCES) DIST_SOURCES = $(libgdbstub_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src AM_LDFLAGS = noinst_LIBRARIES = libgdbstub.a libgdbstub_a_SOURCES = gdbstub.cpp gdbstub_internal.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gdbstub/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gdbstub/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgdbstub.a: $(libgdbstub_a_OBJECTS) $(libgdbstub_a_DEPENDENCIES) $(EXTRA_libgdbstub_a_DEPENDENCIES) -rm -f libgdbstub.a $(libgdbstub_a_AR) libgdbstub.a $(libgdbstub_a_OBJECTS) $(libgdbstub_a_LIBADD) $(RANLIB) libgdbstub.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdbstub.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/addons.h0000644000175000017500000000600212140261633016126 0ustar guillaumeguillaume/* Copyright (C) 2009-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef __ADDONS_H__ #define __ADDONS_H__ #include "common.h" #include "types.h" #include "debug.h" struct ADDONINTERFACE { // The name of the plugin, this name will appear in the plugins list const char * name; //called once when the plugin starts up BOOL (*init)(void); //called when the emulator resets void (*reset)(void); //called when the plugin shuts down void (*close)(void); //called when the user configurating plugin void (*config)(void); //called when the emulator write to addon void (*write08)(u32 procnum, u32 adr, u8 val); void (*write16)(u32 procnum, u32 adr, u16 val); void (*write32)(u32 procnum, u32 adr, u32 val); //called when the emulator read from addon u8 (*read08)(u32 procnum, u32 adr); u16 (*read16)(u32 procnum, u32 adr); u32 (*read32)(u32 procnum, u32 adr); //called when the user get info about addon pak (description) void (*info)(char *info); }; enum NDS_ADDON_TYPE { NDS_ADDON_NONE, NDS_ADDON_CFLASH, // compact flash NDS_ADDON_RUMBLEPAK, // rumble pack NDS_ADDON_GBAGAME, // gba game in slot NDS_ADDON_GUITARGRIP, // Guitar Grip NDS_ADDON_EXPMEMORY, // Memory Expansion NDS_ADDON_PIANO, // Piano NDS_ADDON_PADDLE, //NDS_ADDON_EXTERNALMIC, NDS_ADDON_COUNT // use for counter addons - MUST TO BE LAST!!! }; enum ADDON_CFLASH_MODE { ADDON_CFLASH_MODE_Path, ADDON_CFLASH_MODE_File, ADDON_CFLASH_MODE_RomPath }; extern ADDON_CFLASH_MODE CFlash_Mode; extern std::string CFlash_Path; inline bool CFlash_IsUsingPath() { return CFlash_Mode==ADDON_CFLASH_MODE_Path || CFlash_Mode==ADDON_CFLASH_MODE_RomPath; } extern ADDONINTERFACE addon; // current pak extern ADDONINTERFACE addonList[NDS_ADDON_COUNT]; // lists pointer on paks extern NDS_ADDON_TYPE addon_type; // current type pak extern char GBAgameName[MAX_PATH]; // file name for GBA game (rom) extern void (*FeedbackON)(BOOL enable); // feedback on/off extern BOOL addonsInit(); // Init addons extern void addonsClose(); // Shutdown addons extern void addonsReset(); // Reset addon extern BOOL addonsChangePak(NDS_ADDON_TYPE type); // change current adddon extern void guitarGrip_setKey(bool green, bool red, bool yellow, bool blue); // Guitar grip keys extern void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic); //piano keys #endif //__ADDONS_H__ desmume-0.9.9/src/lua-engine.cpp0000644000175000017500000056202312140261633017247 0ustar guillaumeguillaume/* Copyright (C) 2009-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "types.h" #include "lua-engine.h" #include "movie.h" #include #include #include #include #include #include "zlib.h" #include "NDSSystem.h" #include "movie.h" #include "GPU_osd.h" #include "saves.h" #include "emufile.h" #if defined(WIN32) && !defined(WXPORT) #include #include "main.h" #include "video.h" #include "resource.h" #endif #ifdef WIN32 #include #else #include #endif using namespace std; // functions that maybe aren't part of the Lua engine // but didn't make sense to add to BaseDriver (at least not yet) static bool IsHardwareAddressValid(u32 address) { // maybe TODO? let's say everything is valid. return true; } // actual lua engine follows // adapted from gens-rr, nitsuja + upthorn extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" #include "lstate.h" }; enum SpeedMode { SPEEDMODE_NORMAL, SPEEDMODE_NOTHROTTLE, SPEEDMODE_TURBO, SPEEDMODE_MAXIMUM, }; struct LuaGUIData { u32* data; int stridePix; int xOrigin, yOrigin; int xMin, yMin, xMax, yMax; }; struct LuaSubMenuData { PlatformMenu menu; PlatformMenu subMenu; PlatformMenuItem menuItem; LuaSubMenuData(PlatformMenu _menu, PlatformMenu _subMenu, PlatformMenuItem _menuItem) { menu = _menu; subMenu = _subMenu; menuItem = _menuItem; } }; struct LuaMenuData { std::vector subMenuData; std::map menuItemMap; }; static const char* menuCallbackIDString = "menuhandlers"; struct LuaContextInfo { lua_State* L; // the Lua state bool started; // script has been started and hasn't yet been terminated, although it may not be currently running bool running; // script is currently running code (either the main call to the script or the callbacks it registered) bool returned; // main call to the script has returned (but it may still be active if it registered callbacks) bool crashed; // true if script has errored out bool restart; // if true, tells the script-running code to restart the script when the script stops bool restartLater; // set to true when a still-running script is stopped so that RestartAllLuaScripts can know which scripts to restart unsigned int worryCount; // counts up as the script executes, gets reset when the application is able to process messages, triggers a warning prompt if it gets too high bool stopWorrying; // set to true if the user says to let the script run forever despite appearing to be frozen bool panic; // if set to true, tells the script to terminate as soon as it can do so safely (used because directly calling lua_close() or luaL_error() is unsafe in some contexts) bool ranExit; // used to prevent a registered exit callback from ever getting called more than once bool guiFuncsNeedDeferring; // true whenever GUI drawing would be cleared by the next emulation update before it would be visible, and thus needs to be deferred until after the next emulation update int numDeferredFuncs; // number of deferred function calls accumulated, used to impose an arbitrary limit to avoid running out of memory bool ranFrameAdvance; // false if emu.frameadvance() hasn't been called yet int transparencyModifier; // values less than 255 will scale down the opacity of whatever the GUI renders, values greater than 255 will increase the opacity of anything transparent the GUI renders SpeedMode speedMode; // determines how emu.frameadvance() acts char panicMessage [72]; // a message to print if the script terminates due to panic being set std::string lastFilename; // path to where the script last ran from so that restart can work (note: storing the script in memory instead would not be useful because we always want the most up-to-date script from file) std::string nextFilename; // path to where the script should run from next, mainly used in case the restart flag is true unsigned int dataSaveKey; // crc32 of the save data key, used to decide which script should get which data... by default (if no key is specified) it's calculated from the script filename unsigned int dataLoadKey; // same as dataSaveKey but set through registerload instead of registersave if the two differ bool dataSaveLoadKeySet; // false if the data save keys are unset or set to their default value bool rerecordCountingDisabled; // true if this script has disabled rerecord counting for the savestates it loads std::vector persistVars; // names of the global variables to persist, kept here so their associated values can be output when the script exits LuaSaveData newDefaultData; // data about the default state of persisted global variables, which we save on script exit so we can detect when the default value has changed to make it easier to reset persisted variables unsigned int numMemHooks; // number of registered memory functions (1 per hooked byte) LuaGUIData guiData; LuaMenuData menuData; // callbacks into the lua window... these don't need to exist per context the way I'm using them, but whatever void(*print)(int uid, const char* str); void(*onstart)(int uid); void(*onstop)(int uid, bool statusOK); }; std::map luaContextInfo; std::map luaStateToUIDMap; int g_numScriptsStarted = 0; bool g_anyScriptsHighSpeed = false; bool g_stopAllScriptsEnabled = true; #define USE_INFO_STACK #ifdef USE_INFO_STACK std::vector infoStack; #define GetCurrentInfo() (*infoStack.front()) // should be faster but relies on infoStack correctly being updated to always have the current info in the first element #else std::map luaStateToContextMap; #define GetCurrentInfo() (*luaStateToContextMap[L->l_G->mainthread]) // should always work but might be slower #endif //#define ASK_USER_ON_FREEZE // dialog on freeze is disabled now because it seems to be unnecessary, but this can be re-defined to enable it static std::map s_cFuncInfoMap; // using this macro you can define a callable-from-Lua function // while associating with it some information about its arguments. // that information will show up if the user tries to print the function // or otherwise convert it to a string. // (for example, "writebyte=function(addr,value)" instead of "writebyte=function:0A403490") // note that the user can always use addressof(func) if they want to retrieve the address. #define DEFINE_LUA_FUNCTION(name, argstring) \ static int name(lua_State* L); \ static const char* name##_args = s_cFuncInfoMap[name] = argstring; \ static int name(lua_State* L) #ifdef _MSC_VER #define snprintf _snprintf #define vscprintf _vscprintf #else #define stricmp strcasecmp #define strnicmp strncasecmp #define __forceinline __attribute__((always_inline)) #endif static const char* luaCallIDStrings [] = { "CALL_BEFOREEMULATION", "CALL_AFTEREMULATION", "CALL_AFTEREMULATIONGUI", "CALL_BEFOREEXIT", "CALL_BEFORESAVE", "CALL_AFTERLOAD", "CALL_ONSTART", "CALL_ONINITMENU", "CALL_HOTKEY_1", "CALL_HOTKEY_2", "CALL_HOTKEY_3", "CALL_HOTKEY_4", "CALL_HOTKEY_5", "CALL_HOTKEY_6", "CALL_HOTKEY_7", "CALL_HOTKEY_8", "CALL_HOTKEY_9", "CALL_HOTKEY_10", "CALL_HOTKEY_11", "CALL_HOTKEY_12", "CALL_HOTKEY_13", "CALL_HOTKEY_14", "CALL_HOTKEY_15", "CALL_HOTKEY_16", }; static const int _makeSureWeHaveTheRightNumberOfStrings [sizeof(luaCallIDStrings)/sizeof(*luaCallIDStrings) == LUACALL_COUNT ? 1 : 0]; static const char* luaMemHookTypeStrings [] = { "MEMHOOK_WRITE", "MEMHOOK_READ", "MEMHOOK_EXEC", "MEMHOOK_WRITE_SUB", "MEMHOOK_READ_SUB", "MEMHOOK_EXEC_SUB", }; static const int _makeSureWeHaveTheRightNumberOfStrings2 [sizeof(luaMemHookTypeStrings)/sizeof(*luaMemHookTypeStrings) == LUAMEMHOOK_COUNT ? 1 : 0]; void StopScriptIfFinished(int uid, bool justReturned = false); void SetSaveKey(LuaContextInfo& info, const char* key); void SetLoadKey(LuaContextInfo& info, const char* key); void RefreshScriptStartedStatus(); void RefreshScriptSpeedStatus(); static char* rawToCString(lua_State* L, int idx=0); static const char* toCString(lua_State* L, int idx=0); static void CalculateMemHookRegions(LuaMemHookType hookType); static int memory_registerHook(lua_State* L, LuaMemHookType hookType, int defaultSize) { // get first argument: address unsigned int addr = luaL_checkinteger(L,1); //if((addr & ~0xFFFFFF) == ~0xFFFFFF) // addr &= 0xFFFFFF; // get optional second argument: size int size = defaultSize; int funcIdx = 2; if(lua_isnumber(L,2)) { size = luaL_checkinteger(L,2); if(size < 0) { size = -size; addr -= size; } funcIdx++; } // check last argument: callback function bool clearing = lua_isnil(L,funcIdx); if(!clearing) luaL_checktype(L, funcIdx, LUA_TFUNCTION); lua_settop(L,funcIdx); // get the address-to-callback table for this hook type of the current script lua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]); // count how many callback functions we'll be displacing int numFuncsAfter = clearing ? 0 : size; int numFuncsBefore = 0; for(unsigned int i = addr; i != addr+size; i++) { lua_rawgeti(L, -1, i); if(lua_isfunction(L, -1)) numFuncsBefore++; lua_pop(L,1); } // put the callback function in the address slots for(unsigned int i = addr; i != addr+size; i++) { lua_pushvalue(L, -2); lua_rawseti(L, -2, i); } // adjust the count of active hooks LuaContextInfo& info = GetCurrentInfo(); info.numMemHooks += numFuncsAfter - numFuncsBefore; // re-cache regions of hooked memory across all scripts CalculateMemHookRegions(hookType); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 0; } LuaMemHookType MatchHookTypeToCPU(lua_State* L, LuaMemHookType hookType) { int cpuID = 0; int cpunameIndex = 0; if(lua_type(L,2) == LUA_TSTRING) cpunameIndex = 2; else if(lua_type(L,3) == LUA_TSTRING) cpunameIndex = 3; if(cpunameIndex) { const char* cpuName = lua_tostring(L, cpunameIndex); // if(!stricmp(cpuName, "sub") || !stricmp(cpuName, "s68k")) // cpuID = 1; lua_remove(L, cpunameIndex); } // switch(cpuID) // { // case 0: // m68k: // return hookType; // // case 1: // s68k: // switch(hookType) // { // case LUAMEMHOOK_WRITE: return LUAMEMHOOK_WRITE_SUB; // case LUAMEMHOOK_READ: return LUAMEMHOOK_READ_SUB; // case LUAMEMHOOK_EXEC: return LUAMEMHOOK_EXEC_SUB; // } // } return hookType; } DEFINE_LUA_FUNCTION(memory_registerwrite, "address,[size=1,][cpuname=\"main\",]func") { #ifndef HAVE_LUA luaL_error(L, "memory.registerwrite failed: function is not available in this build."); #endif return memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_WRITE), 1); } DEFINE_LUA_FUNCTION(memory_registerread, "address,[size=1,][cpuname=\"main\",]func") { #ifndef HAVE_LUA luaL_error(L, "memory.registerread failed: function is not available in this build."); #endif return memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_READ), 1); } DEFINE_LUA_FUNCTION(memory_registerexec, "address,[size=2,][cpuname=\"main\",]func") { #ifndef HAVE_LUA luaL_error(L, "memory.registerexec failed: function is not available in this build."); #endif return memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_EXEC), 2); } DEFINE_LUA_FUNCTION(emu_registerbefore, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEMULATION]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEMULATION]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(emu_registerafter, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATION]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATION]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(emu_registerexit, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(emu_registerstart, "func") // TODO: use call registered LUACALL_ONSTART functions on reset { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONSTART]); lua_insert(L,1); lua_pushvalue(L,-1); // copy the function so we can also call it lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONSTART]); if (!lua_isnil(L,-1) && driver->EMU_HasEmulationStarted()) lua_call(L,0,0); // call the function now since the game has already started and this start function hasn't been called yet StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(gui_register, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATIONGUI]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATIONGUI]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(state_registersave, "func[,savekey]") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); if (!lua_isnoneornil(L,2)) SetSaveKey(GetCurrentInfo(), rawToCString(L,2)); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFORESAVE]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFORESAVE]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(state_registerload, "func[,loadkey]") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); if (!lua_isnoneornil(L,2)) SetLoadKey(GetCurrentInfo(), rawToCString(L,2)); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTERLOAD]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTERLOAD]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } DEFINE_LUA_FUNCTION(input_registerhotkey, "keynum,func") { int hotkeyNumber = luaL_checkinteger(L,1); if(hotkeyNumber < 1 || hotkeyNumber > 16) { luaL_error(L, "input.registerhotkey(n,func) requires 1 <= n <= 16, but got n = %d.", hotkeyNumber); return 0; } else { const char* key = luaCallIDStrings[LUACALL_SCRIPT_HOTKEY_1 + hotkeyNumber-1]; lua_getfield(L, LUA_REGISTRYINDEX, key); lua_replace(L,1); if (!lua_isnil(L,2)) luaL_checktype(L, 2, LUA_TFUNCTION); lua_settop(L,2); lua_setfield(L, LUA_REGISTRYINDEX, key); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } } static int doPopup(lua_State* L, const char* deftype, const char* deficon) { const char* str = toCString(L,1); const char* type = lua_type(L,2) == LUA_TSTRING ? lua_tostring(L,2) : deftype; const char* icon = lua_type(L,3) == LUA_TSTRING ? lua_tostring(L,3) : deficon; int itype = -1, iters = 0; while(itype == -1 && iters++ < 2) { if(!stricmp(type, "ok")) itype = 0; else if(!stricmp(type, "yesno")) itype = 1; else if(!stricmp(type, "yesnocancel")) itype = 2; else if(!stricmp(type, "okcancel")) itype = 3; else if(!stricmp(type, "abortretryignore")) itype = 4; else type = deftype; } assert(itype >= 0 && itype <= 4); if(!(itype >= 0 && itype <= 4)) itype = 0; int iicon = -1; iters = 0; while(iicon == -1 && iters++ < 2) { if(!stricmp(icon, "message") || !stricmp(icon, "notice")) iicon = 0; else if(!stricmp(icon, "question")) iicon = 1; else if(!stricmp(icon, "warning")) iicon = 2; else if(!stricmp(icon, "error")) iicon = 3; else icon = deficon; } assert(iicon >= 0 && iicon <= 3); if(!(iicon >= 0 && iicon <= 3)) iicon = 0; static const char * const titles [] = {"Notice", "Question", "Warning", "Error"}; const char* answer = "ok"; #if defined(_WIN32) && !defined(WXPORT) static const int etypes [] = {MB_OK, MB_YESNO, MB_YESNOCANCEL, MB_OKCANCEL, MB_ABORTRETRYIGNORE}; static const int eicons [] = {MB_ICONINFORMATION, MB_ICONQUESTION, MB_ICONWARNING, MB_ICONERROR}; // DialogsOpen++; int uid = luaStateToUIDMap[L->l_G->mainthread]; EnableWindow(MainWindow->getHWnd(), false); // if (Full_Screen) // { // while (ShowCursor(false) >= 0); // while (ShowCursor(true) < 0); // } int ianswer = MessageBox((HWND)uid, str, titles[iicon], etypes[itype] | eicons[iicon]); EnableWindow(MainWindow->getHWnd(), true); // DialogsOpen--; switch(ianswer) { case IDOK: answer = "ok"; break; case IDCANCEL: answer = "cancel"; break; case IDABORT: answer = "abort"; break; case IDRETRY: answer = "retry"; break; case IDIGNORE: answer = "ignore"; break; case IDYES: answer = "yes"; break; case IDNO: answer = "no"; break; } #else // NYI (assume first answer for now) switch(itype) { case 0: case 3: answer = "ok"; break; case 1: case 2: answer = "yes"; break; case 4: answer = "abort"; break; } #endif lua_pushstring(L, answer); return 1; } // string gui.popup(string message, string type = "ok", string icon = "message") // string input.popup(string message, string type = "yesno", string icon = "question") DEFINE_LUA_FUNCTION(gui_popup, "message[,type=\"ok\"[,icon=\"message\"]]") { return doPopup(L, "ok", "message"); } DEFINE_LUA_FUNCTION(input_popup, "message[,type=\"yesno\"[,icon=\"question\"]]") { return doPopup(L, "yesno", "question"); } static const char* FilenameFromPath(const char* path) { const char* slash1 = strrchr(path, '\\'); const char* slash2 = strrchr(path, '/'); if(slash1) slash1++; if(slash2) slash2++; const char* rv = path; rv = std::max(rv, slash1); rv = std::max(rv, slash2); if(!rv) rv = ""; return rv; } void TrimFilenameFromPath(char* path) { char* slash1 = strrchr(path, '\\'); char* slash2 = strrchr(path, '/'); char* slash = slash1; if (slash == NULL || slash2 > slash) { slash = slash2; } if (slash != NULL) { *(slash + 1) = '\0'; } } static void toCStringConverter(lua_State* L, int i, char*& ptr, int& remaining); // compare the contents of two items on the Lua stack to determine if they differ // only works for relatively simple, saveable items (numbers, strings, bools, nil, and possibly-nested tables of those, up to a certain max length) // not the best implementation, but good enough for what it's currently used for static bool luaValueContentsDiffer(lua_State* L, int idx1, int idx2) { static const int maxLen = 8192; static char str1[maxLen]; static char str2[maxLen]; str1[0] = 0; str2[0] = 0; char* ptr1 = str1; char* ptr2 = str2; int remaining1 = maxLen; int remaining2 = maxLen; toCStringConverter(L, idx1, ptr1, remaining1); toCStringConverter(L, idx2, ptr2, remaining2); return (remaining1 != remaining2) || (strcmp(str1,str2) != 0); } // fills output with the path // also returns a pointer to the first character in the filename (non-directory) part of the path static char* ConstructScriptSaveDataPath(char* output, int bufferSize, LuaContextInfo& info) { // Get_State_File_Name(output); TODO char* slash1 = strrchr(output, '\\'); char* slash2 = strrchr(output, '/'); if(slash1) slash1[1] = '\0'; if(slash2) slash2[1] = '\0'; char* rv = output + strlen(output); strncat(output, "u.", bufferSize-(strlen(output)+1)); if(!info.dataSaveLoadKeySet) strncat(output, FilenameFromPath(info.lastFilename.c_str()), bufferSize-(strlen(output)+1)); else snprintf(output+strlen(output), bufferSize-(strlen(output)+1), "%X", info.dataSaveKey); strncat(output, ".luasav", bufferSize-(strlen(output)+1)); return rv; } // emu.persistglobalvariables({ // variable1 = defaultvalue1, // variable2 = defaultvalue2, // etc // }) // takes a table with variable names as the keys and default values as the values, // and defines each of those variables names as a global variable, // setting them equal to the values they had the last time the script exited, // or (if that isn't available) setting them equal to the provided default values. // as a special case, if you want the default value for a variable to be nil, // then put the variable name alone in quotes as an entry in the table without saying "= nil". // this special case is because tables in lua don't store nil valued entries. // also, if you change the default value that will reset the variable to the new default. DEFINE_LUA_FUNCTION(emu_persistglobalvariables, "variabletable") { int uid = luaStateToUIDMap[L->l_G->mainthread]; LuaContextInfo& info = GetCurrentInfo(); // construct a path we can load the persistent variables from char path [1024] = {0}; char* pathTypeChrPtr = ConstructScriptSaveDataPath(path, 1024, info); // load the previously-saved final variable values from file LuaSaveData exitData; { *pathTypeChrPtr = 'e'; FILE* persistFile = fopen(path, "rb"); if(persistFile) { exitData.ImportRecords(persistFile); fclose(persistFile); } } // load the previously-saved default variable values from file LuaSaveData defaultData; { *pathTypeChrPtr = 'd'; FILE* defaultsFile = fopen(path, "rb"); if(defaultsFile) { defaultData.ImportRecords(defaultsFile); fclose(defaultsFile); } } // loop through the passed-in variables, // exposing a global variable to the script for each one // while also keeping a record of their names // so we can save them (to the persistFile) later when the script exits int numTables = lua_gettop(L); for(int i = 1; i <= numTables; i++) { luaL_checktype(L, i, LUA_TTABLE); lua_pushnil(L); // before first key int keyIndex = lua_gettop(L); int valueIndex = keyIndex + 1; while(lua_next(L, i)) { int keyType = lua_type(L, keyIndex); int valueType = lua_type(L, valueIndex); if(keyType == LUA_TSTRING && valueType <= LUA_TTABLE && valueType != LUA_TLIGHTUSERDATA) { // variablename = defaultvalue, // duplicate the key first because lua_next() needs to eat that lua_pushvalue(L, keyIndex); lua_insert(L, keyIndex); } else if(keyType == LUA_TNUMBER && valueType == LUA_TSTRING) { // "variablename", // or [index] = "variablename", // defaultvalue is assumed to be nil lua_pushnil(L); } else { luaL_error(L, "'%s' = '%s' entries are not allowed in the table passed to emu.persistglobalvariables()", lua_typename(L,keyType), lua_typename(L,valueType)); } int varNameIndex = valueIndex; int defaultIndex = valueIndex+1; // keep track of the variable name for later const char* varName = lua_tostring(L, varNameIndex); info.persistVars.push_back(varName); unsigned int varNameCRC = crc32(0, (const unsigned char*)varName, strlen(varName)); info.newDefaultData.SaveRecordPartial(uid, varNameCRC, defaultIndex); // load the previous default value for this variable if it exists. // if the new default is different than the old one, // assume the user wants to set the value to the new default value // instead of the previously-saved exit value. bool attemptPersist = true; defaultData.LoadRecord(uid, varNameCRC, 1); lua_pushnil(L); if(luaValueContentsDiffer(L, defaultIndex, defaultIndex+1)) attemptPersist = false; lua_settop(L, defaultIndex); if(attemptPersist) { // load the previous saved value for this variable if it exists exitData.LoadRecord(uid, varNameCRC, 1); if(lua_gettop(L) > defaultIndex) lua_remove(L, defaultIndex); // replace value with loaded record lua_settop(L, defaultIndex); } // set the global variable lua_settable(L, LUA_GLOBALSINDEX); assert(lua_gettop(L) == keyIndex); } } return 0; } static const char* deferredGUIIDString = "lazygui"; static const char* deferredJoySetIDString = "lazyjoy"; #define MAX_DEFERRED_COUNT 16384 // store the most recent C function call from Lua (and all its arguments) // for later evaluation void DeferFunctionCall(lua_State* L, const char* idstring) { LuaContextInfo& info = GetCurrentInfo(); if(info.numDeferredFuncs < MAX_DEFERRED_COUNT) info.numDeferredFuncs++; else return; // too many deferred functions on the same frame, silently discard the rest // there might be a cleaner way of doing this using lua_pushcclosure and lua_getref int num = lua_gettop(L); // get the C function pointer //lua_CFunction cf = lua_tocfunction(L, -(num+1)); lua_CFunction cf = (L->ci->func)->value.gc->cl.c.f; assert(cf); lua_pushcfunction(L,cf); // make a list of the function and its arguments (and also pop those arguments from the stack) lua_createtable(L, num+1, 0); lua_insert(L, 1); for(int n = num+1; n > 0; n--) lua_rawseti(L, 1, n); // put the list into a global array lua_getfield(L, LUA_REGISTRYINDEX, idstring); lua_insert(L, 1); int curSize = lua_objlen(L, 1); lua_rawseti(L, 1, curSize+1); // clean the stack lua_settop(L, 0); } static const char* refStashString = "refstash"; void CallDeferredFunctions(lua_State* L, const char* idstring) { lua_getfield(L, LUA_REGISTRYINDEX, idstring); int numCalls = lua_objlen(L, -1); if(numCalls > 0) { // save and pop any extra things that were on the stack int top = lua_gettop(L); int stashRef = -1; if(top > 1) { lua_insert(L, 1); lua_getfield(L, LUA_REGISTRYINDEX, refStashString); lua_insert(L, 2); lua_createtable(L, top-1, 0); lua_insert(L, 3); for(int remaining = top; remaining-- > 1;) lua_rawseti(L, 3, remaining); assert(lua_gettop(L) == 3); stashRef = luaL_ref(L, 2); lua_pop(L, 1); } // loop through all the queued function calls for(int i = 1; i <= numCalls; i++) { lua_rawgeti(L, 1, i); // get the function+arguments list int listSize = lua_objlen(L, 2); // push the arguments and the function for(int j = 1; j <= listSize; j++) lua_rawgeti(L, 2, j); // get and pop the function lua_CFunction cf = lua_tocfunction(L, -1); lua_pop(L, 1); // shift first argument to slot 1 and call the function lua_remove(L, 2); lua_remove(L, 1); cf(L); // prepare for next iteration lua_settop(L, 0); lua_getfield(L, LUA_REGISTRYINDEX, idstring); } // clear the list of deferred functions lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, idstring); LuaContextInfo& info = GetCurrentInfo(); info.numDeferredFuncs -= numCalls; if(info.numDeferredFuncs < 0) info.numDeferredFuncs = 0; // restore the stack lua_settop(L, 0); if(top > 1) { lua_getfield(L, LUA_REGISTRYINDEX, refStashString); lua_rawgeti(L, 1, stashRef); for(int i = 1; i <= top-1; i++) lua_rawgeti(L, 2, i); luaL_unref(L, 1, stashRef); lua_remove(L, 2); lua_remove(L, 1); } assert(lua_gettop(L) == top - 1); } else { lua_pop(L, 1); } } bool DeferGUIFuncIfNeeded(lua_State* L) { LuaContextInfo& info = GetCurrentInfo(); if(info.speedMode == SPEEDMODE_MAXIMUM) { // if the mode is "maximum" then discard all GUI function calls // and pretend it was because we deferred them return true; } if(info.guiFuncsNeedDeferring) { // defer whatever function called this one until later DeferFunctionCall(L, deferredGUIIDString); return true; } // ok to run the function right now return false; } void worry(lua_State* L, int intensity) { LuaContextInfo& info = GetCurrentInfo(); info.worryCount += intensity; } static inline bool isalphaorunderscore(char c) { return isalpha(c) || c == '_'; } static std::vector s_tableAddressStack; // prevents infinite recursion of a table within a table (when cycle is found, print something like table:parent) static std::vector s_metacallStack; // prevents infinite recursion if something's __tostring returns another table that contains that something (when cycle is found, print the inner result without using __tostring) #define APPENDPRINT { int _n = snprintf(ptr, remaining, #define END ); if(_n >= 0) { ptr += _n; remaining -= _n; } else { remaining = 0; } } static void toCStringConverter(lua_State* L, int i, char*& ptr, int& remaining) { if(remaining <= 0) return; const char* str = ptr; // for debugging // if there is a __tostring metamethod then call it int usedMeta = luaL_callmeta(L, i, "__tostring"); if(usedMeta) { std::vector::const_iterator foundCycleIter = std::find(s_metacallStack.begin(), s_metacallStack.end(), lua_topointer(L,i)); if(foundCycleIter != s_metacallStack.end()) { lua_pop(L, 1); usedMeta = false; } else { s_metacallStack.push_back(lua_topointer(L,i)); i = lua_gettop(L); } } switch(lua_type(L, i)) { case LUA_TNONE: break; case LUA_TNIL: APPENDPRINT "nil" END break; case LUA_TBOOLEAN: APPENDPRINT lua_toboolean(L,i) ? "true" : "false" END break; case LUA_TSTRING: APPENDPRINT "%s",lua_tostring(L,i) END break; case LUA_TNUMBER: APPENDPRINT "%.12Lg",lua_tonumber(L,i) END break; case LUA_TFUNCTION: if((L->base + i-1)->value.gc->cl.c.isC) { lua_CFunction func = lua_tocfunction(L, i); std::map::iterator iter = s_cFuncInfoMap.find(func); if(iter == s_cFuncInfoMap.end()) goto defcase; APPENDPRINT "function(%s)", iter->second END } else { APPENDPRINT "function(" END Proto* p = (L->base + i-1)->value.gc->cl.l.p; int numParams = p->numparams + (p->is_vararg?1:0); for (int n=0; nnumparams; n++) { APPENDPRINT "%s", getstr(p->locvars[n].varname) END if(n != numParams-1) APPENDPRINT "," END } if(p->is_vararg) APPENDPRINT "..." END APPENDPRINT ")" END } break; defcase:default: APPENDPRINT "%s:%p",luaL_typename(L,i),lua_topointer(L,i) END break; case LUA_TTABLE: { // first make sure there's enough stack space if(!lua_checkstack(L, 4)) { // note that even if lua_checkstack never returns false, // that doesn't mean we didn't need to call it, // because calling it retrieves stack space past LUA_MINSTACK goto defcase; } std::vector::const_iterator foundCycleIter = std::find(s_tableAddressStack.begin(), s_tableAddressStack.end(), lua_topointer(L,i)); if(foundCycleIter != s_tableAddressStack.end()) { int parentNum = s_tableAddressStack.end() - foundCycleIter; if(parentNum > 1) APPENDPRINT "%s:parent^%d",luaL_typename(L,i),parentNum END else APPENDPRINT "%s:parent",luaL_typename(L,i) END } else { s_tableAddressStack.push_back(lua_topointer(L,i)); struct Scope { ~Scope(){ s_tableAddressStack.pop_back(); } } scope; APPENDPRINT "{" END lua_pushnil(L); // first key int keyIndex = lua_gettop(L); int valueIndex = keyIndex + 1; bool first = true; bool skipKey = true; // true if we're still in the "array part" of the table lua_Number arrayIndex = (lua_Number)0; while(lua_next(L, i)) { if(first) first = false; else APPENDPRINT ", " END if(skipKey) { arrayIndex += (lua_Number)1; bool keyIsNumber = (lua_type(L, keyIndex) == LUA_TNUMBER); skipKey = keyIsNumber && (lua_tonumber(L, keyIndex) == arrayIndex); } if(!skipKey) { bool keyIsString = (lua_type(L, keyIndex) == LUA_TSTRING); bool invalidLuaIdentifier = (!keyIsString || !isalphaorunderscore(*lua_tostring(L, keyIndex))); if(invalidLuaIdentifier) if(keyIsString) APPENDPRINT "['" END else APPENDPRINT "[" END toCStringConverter(L, keyIndex, ptr, remaining); // key if(invalidLuaIdentifier) if(keyIsString) APPENDPRINT "']=" END else APPENDPRINT "]=" END else APPENDPRINT "=" END } bool valueIsString = (lua_type(L, valueIndex) == LUA_TSTRING); if(valueIsString) APPENDPRINT "'" END toCStringConverter(L, valueIndex, ptr, remaining); // value if(valueIsString) APPENDPRINT "'" END lua_pop(L, 1); if(remaining <= 0) { lua_settop(L, keyIndex-1); // stack might not be clean yet if we're breaking early break; } } APPENDPRINT "}" END } } break; } if(usedMeta) { s_metacallStack.pop_back(); lua_pop(L, 1); } } static const int s_tempStrMaxLen = 64 * 1024; static char s_tempStr [s_tempStrMaxLen]; static char* rawToCString(lua_State* L, int idx) { int a = idx>0 ? idx : 1; int n = idx>0 ? idx : lua_gettop(L); char* ptr = s_tempStr; *ptr = 0; int remaining = s_tempStrMaxLen; for(int i = a; i <= n; i++) { toCStringConverter(L, i, ptr, remaining); if(i != n) APPENDPRINT " " END } if(remaining < 3) { while(remaining < 6) remaining++, ptr--; APPENDPRINT "..." END } APPENDPRINT "\r\n" END // the trailing newline is so print() can avoid having to do wasteful things to print its newline // (string copying would be wasteful and calling info.print() twice can be extremely slow) // at the cost of functions that don't want the newline needing to trim off the last two characters // (which is a very fast operation and thus acceptable in this case) return s_tempStr; } #undef APPENDPRINT #undef END // replacement for luaB_tostring() that is able to show the contents of tables (and formats numbers better, and show function prototypes) // can be called directly from lua via tostring(), assuming tostring hasn't been reassigned DEFINE_LUA_FUNCTION(tostring, "...") { char* str = rawToCString(L); str[strlen(str)-2] = 0; // hack: trim off the \r\n (which is there to simplify the print function's task) lua_pushstring(L, str); return 1; } // like rawToCString, but will check if the global Lua function tostring() // has been replaced with a custom function, and call that instead if so static const char* toCString(lua_State* L, int idx) { int a = idx>0 ? idx : 1; int n = idx>0 ? idx : lua_gettop(L); lua_getglobal(L, "tostring"); lua_CFunction cf = lua_tocfunction(L,-1); if(cf == tostring) // optimization: if using our own C tostring function, we can bypass the call through Lua and all the string object allocation that would entail { lua_pop(L,1); return rawToCString(L, idx); } else // if the user overrided the tostring function, we have to actually call it and store the temporarily allocated string it returns { lua_pushstring(L, ""); for (int i=a; i<=n; i++) { lua_pushvalue(L, -2); // function to be called lua_pushvalue(L, i); // value to print lua_call(L, 1, 1); if(lua_tostring(L, -1) == NULL) luaL_error(L, LUA_QL("tostring") " must return a string to " LUA_QL("print")); lua_pushstring(L, (il_G->mainthread]; LuaContextInfo& info = GetCurrentInfo(); if(info.print) info.print(uid, str); else puts(str); worry(L, 100); return 0; } DEFINE_LUA_FUNCTION(emu_message, "str") { const char* str = toCString(L); driver->USR_InfoMessage(str); return 0; } // provides an easy way to copy a table from Lua // (simple assignment only makes an alias, but sometimes an independent table is desired) // currently this function only performs a shallow copy, // but I think it should be changed to do a deep copy (possibly of configurable depth?) // that maintains the internal table reference structure DEFINE_LUA_FUNCTION(copytable, "origtable") { int origIndex = 1; // we only care about the first argument int origType = lua_type(L, origIndex); if(origType == LUA_TNIL) { lua_pushnil(L); return 1; } if(origType != LUA_TTABLE) { luaL_typerror(L, 1, lua_typename(L, LUA_TTABLE)); lua_pushnil(L); return 1; } lua_createtable(L, lua_objlen(L,1), 0); int copyIndex = lua_gettop(L); lua_pushnil(L); // first key int keyIndex = lua_gettop(L); int valueIndex = keyIndex + 1; while(lua_next(L, origIndex)) { lua_pushvalue(L, keyIndex); lua_pushvalue(L, valueIndex); lua_rawset(L, copyIndex); // copytable[key] = value lua_pop(L, 1); } // copy the reference to the metatable as well, if any if(lua_getmetatable(L, origIndex)) lua_setmetatable(L, copyIndex); return 1; // return the new table } // because print traditionally shows the address of tables, // and the print function I provide instead shows the contents of tables, // I also provide this function // (otherwise there would be no way to see a table's address, AFAICT) DEFINE_LUA_FUNCTION(addressof, "table_or_function") { const void* ptr = lua_topointer(L,-1); lua_pushinteger(L, (lua_Integer)ptr); return 1; } // the following bit operations are ported from LuaBitOp 1.0.1, // because it can handle the sign bit (bit 31) correctly. /* ** Lua BitOp -- a bit operations library for Lua 5.1. ** http://bitop.luajit.org/ ** ** Copyright (C) 2008-2009 Mike Pall. All rights reserved. ** ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the ** "Software"), to deal in the Software without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Software, and to ** permit persons to whom the Software is furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ** ** [ MIT license: http://www.opensource.org/licenses/mit-license.php ] */ #ifdef _MSC_VER /* MSVC is stuck in the last century and doesn't have C99's stdint.h. */ typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else #include #endif typedef int32_t SBits; typedef uint32_t UBits; typedef union { lua_Number n; #ifdef LUA_NUMBER_DOUBLE uint64_t b; #else UBits b; #endif } BitNum; /* Convert argument to bit type. */ static UBits barg(lua_State *L, int idx) { BitNum bn; UBits b; bn.n = lua_tonumber(L, idx); #if defined(LUA_NUMBER_DOUBLE) bn.n += 6755399441055744.0; /* 2^52+2^51 */ #ifdef SWAPPED_DOUBLE b = (UBits)(bn.b >> 32); #else b = (UBits)bn.b; #endif #elif defined(LUA_NUMBER_INT) || defined(LUA_NUMBER_LONG) || \ defined(LUA_NUMBER_LONGLONG) || defined(LUA_NUMBER_LONG_LONG) || \ defined(LUA_NUMBER_LLONG) if (sizeof(UBits) == sizeof(lua_Number)) b = bn.b; else b = (UBits)(SBits)bn.n; #elif defined(LUA_NUMBER_FLOAT) #error "A 'float' lua_Number type is incompatible with this library" #else #error "Unknown number type, check LUA_NUMBER_* in luaconf.h" #endif if (b == 0 && !lua_isnumber(L, idx)) luaL_typerror(L, idx, "number"); return b; } /* Return bit type. */ #define BRET(b) lua_pushnumber(L, (lua_Number)(SBits)(b)); return 1; DEFINE_LUA_FUNCTION(bit_tobit, "x") { BRET(barg(L, 1)) } DEFINE_LUA_FUNCTION(bit_bnot, "x") { BRET(~barg(L, 1)) } #define BIT_OP(func, opr) \ DEFINE_LUA_FUNCTION(func, "x1 [,x2...]") { int i; UBits b = barg(L, 1); \ for (i = lua_gettop(L); i > 1; i--) b opr barg(L, i); BRET(b) } BIT_OP(bit_band, &=) BIT_OP(bit_bor, |=) BIT_OP(bit_bxor, ^=) #define bshl(b, n) (b << n) #define bshr(b, n) (b >> n) #define bsar(b, n) ((SBits)b >> n) #define brol(b, n) ((b << n) | (b >> (32-n))) #define bror(b, n) ((b << (32-n)) | (b >> n)) #define BIT_SH(func, fn) \ DEFINE_LUA_FUNCTION(func, "x, n") { \ UBits b = barg(L, 1); UBits n = barg(L, 2) & 31; BRET(fn(b, n)) } BIT_SH(bit_lshift, bshl) BIT_SH(bit_rshift, bshr) BIT_SH(bit_arshift, bsar) BIT_SH(bit_rol, brol) BIT_SH(bit_ror, bror) DEFINE_LUA_FUNCTION(bit_bswap, "x") { UBits b = barg(L, 1); b = (b >> 24) | ((b >> 8) & 0xff00) | ((b & 0xff00) << 8) | (b << 24); BRET(b) } DEFINE_LUA_FUNCTION(bit_tohex, "x [,n]") { UBits b = barg(L, 1); SBits n = lua_isnone(L, 2) ? 8 : (SBits)barg(L, 2); const char *hexdigits = "0123456789abcdef"; char buf[8]; int i; if (n < 0) { n = -n; hexdigits = "0123456789ABCDEF"; } if (n > 8) n = 8; for (i = (int)n; --i >= 0; ) { buf[i] = hexdigits[b & 15]; b >>= 4; } lua_pushlstring(L, buf, (size_t)n); return 1; } static const struct luaL_Reg bit_funcs[] = { { "tobit", bit_tobit }, { "bnot", bit_bnot }, { "band", bit_band }, { "bor", bit_bor }, { "bxor", bit_bxor }, { "lshift", bit_lshift }, { "rshift", bit_rshift }, { "arshift", bit_arshift }, { "rol", bit_rol }, { "ror", bit_ror }, { "bswap", bit_bswap }, { "tohex", bit_tohex }, { NULL, NULL } }; /* Signed right-shifts are implementation-defined per C89/C99. ** But the de facto standard are arithmetic right-shifts on two's ** complement CPUs. This behaviour is required here, so test for it. */ #define BAD_SAR (bsar(-8, 2) != (SBits)-2) bool luabitop_validate(lua_State *L) // originally named as luaopen_bit { UBits b; lua_pushnumber(L, (lua_Number)1437217655L); b = barg(L, -1); if (b != (UBits)1437217655L || BAD_SAR) { /* Perform a simple self-test. */ const char *msg = "compiled with incompatible luaconf.h"; #ifdef LUA_NUMBER_DOUBLE #if defined(_WIN32) && !defined(WXPORT) if (b == (UBits)1610612736L) msg = "use D3DCREATE_FPU_PRESERVE with DirectX"; #endif if (b == (UBits)1127743488L) msg = "not compiled with SWAPPED_DOUBLE"; #endif if (BAD_SAR) msg = "arithmetic right-shift broken"; luaL_error(L, "bit library self-test failed (%s)", msg); return false; } return true; } // LuaBitOp ends here DEFINE_LUA_FUNCTION(bitshift, "num,shift") { int shift = luaL_checkinteger(L,2); if (shift < 0) { lua_pushinteger(L, -shift); lua_replace(L, 2); return bit_lshift(L); } else return bit_rshift(L); } DEFINE_LUA_FUNCTION(bitbit, "whichbit") { int rv = 0; int numArgs = lua_gettop(L); for(int i = 1; i <= numArgs; i++) { int where = luaL_checkinteger(L,i); if (where >= 0 && where < 32) rv |= (1 << where); } lua_settop(L,0); BRET(rv); } int emu_wait(lua_State* L); int dontworry(LuaContextInfo& info); void indicateBusy(lua_State* L, bool busy) { // disabled because there have been complaints about this message being useless spam. // the script window's title changing should be sufficient, I guess. /* if(busy) { const char* fmt = "script became busy (frozen?)"; va_list argp; va_start(argp, fmt); luaL_where(L, 0); lua_pushvfstring(L, fmt, argp); va_end(argp); lua_concat(L, 2); LuaContextInfo& info = GetCurrentInfo(); int uid = luaStateToUIDMap[L->l_G->mainthread]; if(info.print) { info.print(uid, lua_tostring(L,-1)); info.print(uid, "\r\n"); } else { fprintf(stderr, "%s\n", lua_tostring(L,-1)); } lua_pop(L, 1); } */ #if defined(_WIN32) && !defined(WXPORT) int uid = luaStateToUIDMap[L->l_G->mainthread]; HWND hDlg = (HWND)uid; char str [1024]; GetWindowText(hDlg, str, 1000); char* extra = strchr(str, '<'); if(busy) { if(!extra) extra = str + strlen(str), *extra++ = ' '; strcpy(extra, ""); } else { if(extra) extra[-1] = 0; } SetWindowText(hDlg, str); #endif } #define HOOKCOUNT 4096 #define MAX_WORRY_COUNT 6000 void LuaRescueHook(lua_State* L, lua_Debug *dbg) { LuaContextInfo& info = GetCurrentInfo(); info.worryCount++; if(info.stopWorrying && !info.panic) { if(info.worryCount > (MAX_WORRY_COUNT >> 2)) { // the user already said they're OK with the script being frozen, // but we don't trust their judgement completely, // so periodically update the main loop so they have a chance to manually stop it info.worryCount = 0; emu_wait(L); info.stopWorrying = true; } return; } if(info.worryCount > MAX_WORRY_COUNT || info.panic) { info.worryCount = 0; info.stopWorrying = false; bool stoprunning = true; bool stopworrying = true; if(!info.panic) { SPU_ClearOutputBuffer(); #if defined(ASK_USER_ON_FREEZE) && defined(_WIN32) && !defined(WXPORT) DialogsOpen++; int answer = MessageBox(HWnd, "A Lua script has been running for quite a while. Maybe it is in an infinite loop.\n\nWould you like to stop the script?\n\n(Yes to stop it now,\n No to keep running and not ask again,\n Cancel to keep running but ask again later)", "Lua Alert", MB_YESNOCANCEL | MB_DEFBUTTON3 | MB_ICONASTERISK); DialogsOpen--; if(answer == IDNO) stoprunning = false; if(answer == IDCANCEL) stopworrying = false; #else stoprunning = false; #endif } if(!stoprunning && stopworrying) { info.stopWorrying = true; // don't remove the hook because we need it still running for RequestAbortLuaScript to work indicateBusy(info.L, true); } if(stoprunning) { //lua_sethook(L, NULL, 0, 0); assert(L->errfunc || L->errorJmp); luaL_error(L, info.panic ? info.panicMessage : "terminated by user"); } info.panic = false; } } void printfToOutput(const char* fmt, ...) { va_list list; va_start(list, fmt); int len = vscprintf(fmt, list); char* str = new char[len+1]; vsprintf(str, fmt, list); va_end(list); LuaContextInfo& info = GetCurrentInfo(); if(info.print) { lua_State* L = info.L; int uid = luaStateToUIDMap[L->l_G->mainthread]; info.print(uid, str); info.print(uid, "\r\n"); worry(L,300); } else { fprintf(stdout, "%s\n", str); } delete[] str; } bool FailVerifyAtFrameBoundary(lua_State* L, const char* funcName, int unstartedSeverity=2, int inframeSeverity=2) { if (!driver->EMU_HasEmulationStarted()) { static const char* msg = "cannot call %s() when emulation has not started."; switch(unstartedSeverity) { case 0: break; case 1: printfToOutput(msg, funcName); break; default: case 2: luaL_error(L, msg, funcName); break; } return true; } if(!driver->EMU_IsAtFrameBoundary()) { static const char* msg = "cannot call %s() inside an emulation frame."; switch(inframeSeverity) { case 0: break; case 1: printfToOutput(msg, funcName); break; default: case 2: luaL_error(L, msg, funcName); break; } return true; } return false; } // wrapper for EMU_StepMainLoop that provides a default implementation if ESTEP_NOT_IMPLEMENTED is returned. // which only works if called from a function whose return value will get returned to Lua directly. // TODO: actually implement the default case by making the main thread we use into a coroutine and resuming it periodically static bool stepped_emulation = false; // <-- this is the result of running the macro #define StepEmulationOnce(allowSleep, allowPause, frameSkip, disableUser, disableCore) \ switch(driver->EMU_StepMainLoop(allowSleep, allowPause, frameSkip, disableUser, disableCore)) \ { default: \ case BaseDriver::ESTEP_NOT_IMPLEMENTED: /*return lua_yield(L, 0);*/ luaL_error(L, "Lua frame advance functions are not yet implemented for this platform, and neither is the fallback implementation."); break;/*TODO*/ \ case BaseDriver::ESTEP_CALL_AGAIN: stepped_emulation = !driver->EMU_HasEmulationStarted(); break; \ case BaseDriver::ESTEP_DONE: stepped_emulation = true; break; \ } // same as StepEmulationOnce, except calls EMU_StepMainLoop multiple times if it returns ESTEP_CALL_AGAIN #define StepEmulation(allowSleep, allowPause, frameSkip, disableUser, disableCore) \ do { \ StepEmulationOnce(allowSleep, allowPause, frameSkip, disableUser, disableCore); \ if(stepped_emulation || (info).panic) break; \ } while(true) // note: caller must return the value this returns to Lua (at least if nonzero) int StepEmulationAtSpeed(lua_State* L, SpeedMode speedMode, bool allowPause) { int postponeTime; bool drawNextFrame; int worryIntensity; bool allowSleep; int frameSkip; bool disableUserFeedback; LuaContextInfo& info = GetCurrentInfo(); switch(speedMode) { default: case SPEEDMODE_NORMAL: postponeTime = 0, drawNextFrame = true, worryIntensity = 300; allowSleep = true; frameSkip = -1; disableUserFeedback = false; break; case SPEEDMODE_NOTHROTTLE: postponeTime = 250, drawNextFrame = true, worryIntensity = 200; allowSleep = driver->EMU_IsEmulationPaused(); frameSkip = driver->EMU_IsFastForwarding() ? -1 : 0; disableUserFeedback = false; break; case SPEEDMODE_TURBO: postponeTime = 500, drawNextFrame = true, worryIntensity = 150; allowSleep = driver->EMU_IsEmulationPaused(); frameSkip = 16; disableUserFeedback = false; break; case SPEEDMODE_MAXIMUM: postponeTime = 1000, drawNextFrame = false, worryIntensity = 100; allowSleep = driver->EMU_IsEmulationPaused(); frameSkip = 65535; disableUserFeedback = true; break; } driver->USR_SetDisplayPostpone(postponeTime, drawNextFrame); allowPause ? dontworry(info) : worry(L, worryIntensity); if(!allowPause && driver->EMU_IsEmulationPaused()) driver->EMU_PauseEmulation(false); StepEmulation(allowSleep, allowPause, frameSkip, disableUserFeedback, false); return 0; } // acts similar to normal emulation update DEFINE_LUA_FUNCTION(emu_emulateframe, "") { if(FailVerifyAtFrameBoundary(L, "emu.emulateframe", 0,1)) return 0; return StepEmulationAtSpeed(L, SPEEDMODE_NORMAL, false); } // acts as a fast-forward emulation update that still renders every frame DEFINE_LUA_FUNCTION(emu_emulateframefastnoskipping, "") { if(FailVerifyAtFrameBoundary(L, "emu.emulateframefastnoskipping", 0,1)) return 0; return StepEmulationAtSpeed(L, SPEEDMODE_NOTHROTTLE, false); } // acts as a fast-forward emulation update DEFINE_LUA_FUNCTION(emu_emulateframefast, "") { if(FailVerifyAtFrameBoundary(L, "emu.emulateframefast", 0,1)) return 0; return StepEmulationAtSpeed(L, SPEEDMODE_TURBO, false); } // acts as an extremely-fast-forward emulation update // that also doesn't render any graphics or generate any sounds DEFINE_LUA_FUNCTION(emu_emulateframeinvisible, "") { if(FailVerifyAtFrameBoundary(L, "emu.emulateframeinvisible", 0,1)) return 0; return StepEmulationAtSpeed(L, SPEEDMODE_MAXIMUM, false); } DEFINE_LUA_FUNCTION(emu_speedmode, "mode") { SpeedMode newSpeedMode = SPEEDMODE_NORMAL; if(lua_isnumber(L,1)) newSpeedMode = (SpeedMode)luaL_checkinteger(L,1); else { const char* str = luaL_checkstring(L,1); if(!stricmp(str, "normal")) newSpeedMode = SPEEDMODE_NORMAL; else if(!stricmp(str, "nothrottle")) newSpeedMode = SPEEDMODE_NOTHROTTLE; else if(!stricmp(str, "turbo")) newSpeedMode = SPEEDMODE_TURBO; else if(!stricmp(str, "maximum")) newSpeedMode = SPEEDMODE_MAXIMUM; } LuaContextInfo& info = GetCurrentInfo(); info.speedMode = newSpeedMode; RefreshScriptSpeedStatus(); return 0; } // tells the emulation to wait while the script is doing calculations // can call this periodically instead of emu.frameadvance // note that the user can use hotkeys at this time // (e.g. a savestate could possibly get loaded before emu.wait() returns) DEFINE_LUA_FUNCTION(emu_wait, "") { LuaContextInfo& info = GetCurrentInfo(); StepEmulationOnce(false, false, -1, true, true); dontworry(info); return 0; } DEFINE_LUA_FUNCTION(emu_frameadvance, "") { if(FailVerifyAtFrameBoundary(L, "emu.frameadvance", 0,1)) return emu_wait(L); int uid = luaStateToUIDMap[L->l_G->mainthread]; LuaContextInfo& info = GetCurrentInfo(); if(!info.ranFrameAdvance) { // otherwise we'll never see the first frame of GUI drawing if(info.speedMode != SPEEDMODE_MAXIMUM) driver->USR_RefreshScreen(); info.ranFrameAdvance = true; } return StepEmulationAtSpeed(L, info.speedMode, true); } DEFINE_LUA_FUNCTION(emu_pause, "") { driver->EMU_PauseEmulation(true); LuaContextInfo& info = GetCurrentInfo(); StepEmulation(true, true, 0, true, true); // allow the user to not have to manually unpause // after restarting a script that used emu.pause() if(info.panic) driver->EMU_PauseEmulation(false); return 0; } DEFINE_LUA_FUNCTION(emu_unpause, "") { LuaContextInfo& info = GetCurrentInfo(); driver->EMU_PauseEmulation(false); return 0; } DEFINE_LUA_FUNCTION(emu_redraw, "") { driver->USR_RefreshScreen(); worry(L,250); return 0; } DEFINE_LUA_FUNCTION(memory_readbyte, "address") { int address = luaL_checkinteger(L,1); unsigned char value = (unsigned char)(_MMU_read08(address) & 0xFF); lua_settop(L,0); lua_pushinteger(L, value); return 1; // we return the number of return values } DEFINE_LUA_FUNCTION(memory_readbytesigned, "address") { int address = luaL_checkinteger(L,1); signed char value = (signed char)(_MMU_read08(address) & 0xFF); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(vram_readword, "address") { int address = luaL_checkinteger(L,1); u16 value = T1ReadWord(MMU.ARM9_LCD,address); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(memory_readword, "address") { int address = luaL_checkinteger(L,1); unsigned short value = (unsigned short)(_MMU_read16(address) & 0xFFFF); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(memory_readwordsigned, "address") { int address = luaL_checkinteger(L,1); signed short value = (signed short)(_MMU_read16(address) & 0xFFFF); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(memory_readdword, "address") { int address = luaL_checkinteger(L,1); unsigned long value = (unsigned long)(_MMU_read32(address)); lua_settop(L,0); lua_pushnumber(L, value); // can't use pushinteger in this case (out of range) return 1; } DEFINE_LUA_FUNCTION(memory_readdwordsigned, "address") { int address = luaL_checkinteger(L,1); signed long value = (signed long)(_MMU_read32(address)); lua_settop(L,0); lua_pushinteger(L, value); return 1; } DEFINE_LUA_FUNCTION(memory_writebyte, "address,value") { int address = luaL_checkinteger(L,1); unsigned char value = (unsigned char)(luaL_checkinteger(L,2) & 0xFF); _MMU_write08(address, value); return 0; } DEFINE_LUA_FUNCTION(memory_writeword, "address,value") { int address = luaL_checkinteger(L,1); unsigned short value = (unsigned short)(luaL_checkinteger(L,2) & 0xFFFF); _MMU_write16(address, value); return 0; } DEFINE_LUA_FUNCTION(vram_writeword, "address,value") { int address = luaL_checkinteger(L,1); u16 value = (u16)(luaL_checkinteger(L,2) & 0xFFFF); T1WriteWord(MMU.ARM9_LCD,address,value); return 0; } DEFINE_LUA_FUNCTION(memory_writedword, "address,value") { int address = luaL_checkinteger(L,1); unsigned long value = (unsigned long)(luaL_checkinteger(L,2)); _MMU_write32(address, value); return 0; } DEFINE_LUA_FUNCTION(memory_readbyterange, "address,length") { int address = luaL_checkinteger(L,1); int length = luaL_checkinteger(L,2); if(length < 0) { address += length; length = -length; } // push the array lua_createtable(L, abs(length), 0); // put all the values into the (1-based) array for(int a = address, n = 1; n <= length; a++, n++) { if(IsHardwareAddressValid(a)) { unsigned char value = (unsigned char)(_MMU_read08(a) & 0xFF); lua_pushinteger(L, value); lua_rawseti(L, -2, n); } // else leave the value nil } return 1; } DEFINE_LUA_FUNCTION(memory_isvalid, "address") { int address = luaL_checkinteger(L,1); lua_settop(L,0); lua_pushboolean(L, IsHardwareAddressValid(address)); return 1; } struct registerPointerMap { const char* registerName; unsigned int* pointer; int dataSize; }; #define RPM_ENTRY(name,var) {name, (unsigned int*)&var, sizeof(var)}, registerPointerMap arm9PointerMap [] = { RPM_ENTRY("r0", NDS_ARM9.R[0]) RPM_ENTRY("r1", NDS_ARM9.R[1]) RPM_ENTRY("r2", NDS_ARM9.R[2]) RPM_ENTRY("r3", NDS_ARM9.R[3]) RPM_ENTRY("r4", NDS_ARM9.R[4]) RPM_ENTRY("r5", NDS_ARM9.R[5]) RPM_ENTRY("r6", NDS_ARM9.R[6]) RPM_ENTRY("r7", NDS_ARM9.R[7]) RPM_ENTRY("r8", NDS_ARM9.R[8]) RPM_ENTRY("r9", NDS_ARM9.R[9]) RPM_ENTRY("r10", NDS_ARM9.R[10]) RPM_ENTRY("r11", NDS_ARM9.R[11]) RPM_ENTRY("r12", NDS_ARM9.R[12]) RPM_ENTRY("r13", NDS_ARM9.R[13]) RPM_ENTRY("r14", NDS_ARM9.R[14]) RPM_ENTRY("r15", NDS_ARM9.R[15]) RPM_ENTRY("cpsr", NDS_ARM9.CPSR.val) RPM_ENTRY("spsr", NDS_ARM9.SPSR.val) {} }; registerPointerMap arm7PointerMap [] = { RPM_ENTRY("r0", NDS_ARM7.R[0]) RPM_ENTRY("r1", NDS_ARM7.R[1]) RPM_ENTRY("r2", NDS_ARM7.R[2]) RPM_ENTRY("r3", NDS_ARM7.R[3]) RPM_ENTRY("r4", NDS_ARM7.R[4]) RPM_ENTRY("r5", NDS_ARM7.R[5]) RPM_ENTRY("r6", NDS_ARM7.R[6]) RPM_ENTRY("r7", NDS_ARM7.R[7]) RPM_ENTRY("r8", NDS_ARM7.R[8]) RPM_ENTRY("r9", NDS_ARM7.R[9]) RPM_ENTRY("r10", NDS_ARM7.R[10]) RPM_ENTRY("r11", NDS_ARM7.R[11]) RPM_ENTRY("r12", NDS_ARM7.R[12]) RPM_ENTRY("r13", NDS_ARM7.R[13]) RPM_ENTRY("r14", NDS_ARM7.R[14]) RPM_ENTRY("r15", NDS_ARM7.R[15]) RPM_ENTRY("cpsr", NDS_ARM7.CPSR.val) RPM_ENTRY("spsr", NDS_ARM7.SPSR.val) {} }; struct cpuToRegisterMap { const char* cpuName; registerPointerMap* rpmap; } cpuToRegisterMaps [] = { {"arm9.", arm9PointerMap}, {"main.", arm9PointerMap}, {"arm7.", arm7PointerMap}, {"sub.", arm7PointerMap}, {"", arm9PointerMap}, }; DEFINE_LUA_FUNCTION(memory_getregister, "cpu_dot_registername_string") { const char* qualifiedRegisterName = luaL_checkstring(L,1); lua_settop(L,0); for(int cpu = 0; cpu < sizeof(cpuToRegisterMaps)/sizeof(*cpuToRegisterMaps); cpu++) { cpuToRegisterMap ctrm = cpuToRegisterMaps[cpu]; int cpuNameLen = strlen(ctrm.cpuName); if(!strnicmp(qualifiedRegisterName, ctrm.cpuName, cpuNameLen)) { qualifiedRegisterName += cpuNameLen; for(int reg = 0; ctrm.rpmap[reg].dataSize; reg++) { registerPointerMap rpm = ctrm.rpmap[reg]; if(!stricmp(qualifiedRegisterName, rpm.registerName)) { switch(rpm.dataSize) { default: case 1: lua_pushinteger(L, *(unsigned char*)rpm.pointer); break; case 2: lua_pushinteger(L, *(unsigned short*)rpm.pointer); break; case 4: lua_pushinteger(L, *(unsigned long*)rpm.pointer); break; } return 1; } } lua_pushnil(L); return 1; } } lua_pushnil(L); return 1; } DEFINE_LUA_FUNCTION(memory_setregister, "cpu_dot_registername_string,value") { const char* qualifiedRegisterName = luaL_checkstring(L,1); unsigned long value = (unsigned long)(luaL_checkinteger(L,2)); lua_settop(L,0); for(int cpu = 0; cpu < sizeof(cpuToRegisterMaps)/sizeof(*cpuToRegisterMaps); cpu++) { cpuToRegisterMap ctrm = cpuToRegisterMaps[cpu]; int cpuNameLen = strlen(ctrm.cpuName); if(!strnicmp(qualifiedRegisterName, ctrm.cpuName, cpuNameLen)) { qualifiedRegisterName += cpuNameLen; for(int reg = 0; ctrm.rpmap[reg].dataSize; reg++) { registerPointerMap rpm = ctrm.rpmap[reg]; if(!stricmp(qualifiedRegisterName, rpm.registerName)) { switch(rpm.dataSize) { default: case 1: *(unsigned char*)rpm.pointer = (unsigned char)(value & 0xFF); break; case 2: *(unsigned short*)rpm.pointer = (unsigned short)(value & 0xFFFF); break; case 4: *(unsigned long*)rpm.pointer = value; break; } return 0; } } return 0; } } return 0; } DEFINE_LUA_FUNCTION(state_create, "[location]") { if(lua_isnumber(L,1)) { // simply return the integer that got passed in // (that's as good a savestate object as any for a numbered savestate slot) lua_settop(L,1); return 1; } // allocate a pointer to an in-memory/anonymous savestate EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)lua_newuserdata(L, sizeof(EMUFILE_MEMORY*)); *ppEmuFile = new EMUFILE_MEMORY(); luaL_getmetatable(L, "EMUFILE_MEMORY*"); lua_setmetatable(L, -2); return 1; } // savestate.save(location [, option]) // saves the current emulation state to the given location // you can pass in either a savestate file number (an integer), // OR you can pass in a savestate object that was returned by savestate.create() // if option is "quiet" then any warning messages will be suppressed // if option is "scriptdataonly" then the state will not actually be saved, but any save callbacks will still get called and their results will be saved (see savestate.registerload()/savestate.registersave()) DEFINE_LUA_FUNCTION(state_save, "location[,option]") { //const char* option = (lua_type(L,2) == LUA_TSTRING) ? lua_tostring(L,2) : NULL; //if(option) //{ // if(!stricmp(option, "quiet")) // I'm not sure if saving can generate warning messages, but we might as well support suppressing them should they turn out to exist // g_disableStatestateWarnings = true; // else if(!stricmp(option, "scriptdataonly")) // TODO // g_onlyCallSavestateCallbacks = true; //} //struct Scope { ~Scope(){ g_disableStatestateWarnings = false; g_onlyCallSavestateCallbacks = false; } } scope; // needs to run even if the following code throws an exception... maybe I should have put this in a "finally" block instead, but this project seems to have something against using the "try" statement if(/*!g_onlyCallSavestateCallbacks &&*/ FailVerifyAtFrameBoundary(L, "savestate.save", 2,2)) return 0; int type = lua_type(L,1); switch(type) { case LUA_TNUMBER: // numbered save file default: { int stateNumber = luaL_checkinteger(L,1); savestate_slot(stateNumber); } return 0; case LUA_TUSERDATA: // in-memory save slot { EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*"); (*ppEmuFile)->fseek(0, SEEK_SET); if((*ppEmuFile)->fail()) luaL_error(L, "failed to save, savestate object was dead."); savestate_save(*ppEmuFile, 0); if((*ppEmuFile)->fail()) luaL_error(L, "failed to save savestate!"); if((*ppEmuFile)->size() == 0) luaL_error(L, "failed to save, savestate became empty somehow."); } return 0; } } // savestate.load(location [, option]) // loads the current emulation state from the given location // you can pass in either a savestate file number (an integer), // OR you can pass in a savestate object that was returned by savestate.create() and has already saved to with savestate.save() // if option is "quiet" then any warning messages will be suppressed // if option is "scriptdataonly" then the state will not actually be loaded, but load callbacks will still get called and supplied with the data saved by save callbacks (see savestate.registerload()/savestate.registersave()) DEFINE_LUA_FUNCTION(state_load, "location[,option]") { //const char* option = (lua_type(L,2) == LUA_TSTRING) ? lua_tostring(L,2) : NULL; //if(option) //{ // if(!stricmp(option, "quiet")) // g_disableStatestateWarnings = true; // else if(!stricmp(option, "scriptdataonly")) // TODO // g_onlyCallSavestateCallbacks = true; //} //struct Scope { ~Scope(){ g_disableStatestateWarnings = false; g_onlyCallSavestateCallbacks = false; } } scope; // needs to run even if the following code throws an exception... maybe I should have put this in a "finally" block instead, but this project seems to have something against using the "try" statement if(/*!g_onlyCallSavestateCallbacks &&*/ FailVerifyAtFrameBoundary(L, "savestate.load", 2,2)) return 0; // g_disableStatestateWarnings = lua_toboolean(L,2) != 0; int type = lua_type(L,1); switch(type) { case LUA_TNUMBER: // numbered save file default: { //LuaContextInfo& info = GetCurrentInfo(); //if(info.rerecordCountingDisabled) // SkipNextRerecordIncrement = true; int stateNumber = luaL_checkinteger(L,1); loadstate_slot(stateNumber); } return 0; case LUA_TUSERDATA: // in-memory save slot { EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*"); (*ppEmuFile)->fseek(0, SEEK_SET); if((*ppEmuFile)->fail()) luaL_error(L, "failed to load, savestate object was dead."); if((*ppEmuFile)->size() == 0) luaL_error(L, "failed to load, savestate wasn't saved first."); savestate_load(*ppEmuFile); if((*ppEmuFile)->fail()) luaL_error(L, "failed to load savestate!"); } return 0; } } // savestate.loadscriptdata(location) // returns the user data associated with the given savestate // without actually loading the rest of that savestate or calling any callbacks. // you can pass in either a savestate file number (an integer), // OR you can pass in a savestate object that was returned by savestate.create() // but note that currently only non-anonymous savestates can have associated scriptdata // // also note that this returns the same values // that would be passed into a registered load function. // the main reason this exists also is so you can register a load function that // chooses whether or not to load the scriptdata instead of always loading it, // and also to provide a nicer interface for loading scriptdata // without needing to trigger savestate loading first DEFINE_LUA_FUNCTION(state_loadscriptdata, "location") { int type = lua_type(L,1); switch(type) { case LUA_TNUMBER: // numbered save file default: { // TODO //int stateNumber = luaL_checkinteger(L,1); //Set_Current_State(stateNumber, false,false); //char Name [1024] = {0}; //Get_State_File_Name(Name); //{ // LuaSaveData saveData; // char luaSaveFilename [512]; // strncpy(luaSaveFilename, Name, 512); // luaSaveFilename[512-(1+7/*strlen(".luasav")*/)] = '\0'; // strcat(luaSaveFilename, ".luasav"); // FILE* luaSaveFile = fopen(luaSaveFilename, "rb"); // if(luaSaveFile) // { // saveData.ImportRecords(luaSaveFile); // fclose(luaSaveFile); // int uid = luaStateToUIDMap[L->l_G->mainthread]; // LuaContextInfo& info = GetCurrentInfo(); // lua_settop(L, 0); // saveData.LoadRecord(uid, info.dataLoadKey, (unsigned int)-1); // return lua_gettop(L); // } //} } return 0; case LUA_TUSERDATA: // in-memory save slot { // there can be no user data associated with those, at least not yet } return 0; } } // savestate.savescriptdata(location) // same as savestate.save(location, "scriptdataonly") // only provided for consistency with savestate.loadscriptdata(location) DEFINE_LUA_FUNCTION(state_savescriptdata, "location") { lua_settop(L, 1); lua_pushstring(L, "scriptdataonly"); return state_save(L); } #ifndef PUBLIC_RELEASE #include "gfx3d.h" class EMUFILE_MEMORY_VERIFIER : public EMUFILE_MEMORY { public: EMUFILE_MEMORY_VERIFIER(EMUFILE_MEMORY* underlying) : EMUFILE_MEMORY(underlying->get_vec()) { } std::vector differences; virtual void fwrite(const void *ptr, size_t bytes) { if(!failbit) { u8* dst = buf()+pos; const u8* src = (const u8*)ptr; int differencesAddedThisCall = 0; for(int i = pos; i < (int)bytes+pos; i++) { if(*src != *dst) { if(differences.size() == 100) failbit = true; else { char temp [256]; sprintf(temp, " " /*"mismatch at "*/ "byte %d(0x%X at 0x%X): %d(0x%X) != %d(0x%X)\n", i, i, dst, *src,*src, *dst,*dst); if(ptr == GPU_screen || ptr == gfx3d_convertedScreen) // ignore screen-only differences since frame skipping can cause them and it's probably ok break; differences.push_back(temp); // <-- probably the best place for a breakpoint if(++differencesAddedThisCall == 4) break; } } src++; dst++; } } pos += bytes; } }; // like savestate.save() except instead of actually saving // it compares against what's already in the savestate // and throws an error if any differences are found. // only useful for development (catching desyncs). DEFINE_LUA_FUNCTION(state_verify, "location[,option]") { int type = lua_type(L,1); switch(type) { case LUA_TNUMBER: // numbered save file default: { luaL_error(L, "savestate.verify only works for in-memory saves."); } return 0; case LUA_TUSERDATA: // in-memory save slot { EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*"); if((*ppEmuFile)->fail()) luaL_error(L, "failed to verify, savestate object was dead."); EMUFILE_MEMORY_VERIFIER verifier (*ppEmuFile); savestate_save(&verifier, 0); if(verifier.differences.size()) { fputs("\n", stdout); for(unsigned int i = 0; i < verifier.differences.size(); i++) fputs(verifier.differences[i].c_str(), stdout); luaL_error(L, "failed to verify savestate! %s", verifier.differences[0].c_str()); } } return 0; } } #endif //joypad lib static const char *button_mappings[] = { // G E W X Y A B S T U D L R F "debug","R","L","X","Y","A","B","start","select","up","down","left","right","lid" }; static int joy_getArgControllerNum(lua_State* L, int& index) { // well, I think there's only one controller, // but this should probably stay here for cross-emulator consistency int type = lua_type(L,index); if(type == LUA_TSTRING || type == LUA_TNUMBER) index++; return 1; } // joypad.set(table buttons) // // Sets the joypad state (takes effect at the next frame boundary) // true -> pressed // false -> unpressed // nil -> no change DEFINE_LUA_FUNCTION(joy_set, "buttonTable") { if(movieMode == MOVIEMODE_PLAY) // don't allow tampering with a playing movie's input return 0; // (although it might be useful sometimes...) if(!NDS_isProcessingUserInput()) { // defer this function until when we are processing input DeferFunctionCall(L, deferredJoySetIDString); return 0; } int index = 1; (void)joy_getArgControllerNum(L, index); luaL_checktype(L, index, LUA_TTABLE); UserButtons& buttons = NDS_getProcessingUserInput().buttons; for(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++) { const char* name = button_mappings[i]; lua_getfield(L, index, name); if (!lua_isnil(L,-1)) { bool pressed = lua_toboolean(L,-1) != 0; buttons.array[i] = pressed; } lua_pop(L,1); } return 0; } // table joypad.read() // // Reads the joypad state (what the game sees) int joy_get_internal(lua_State* L, bool reportUp, bool reportDown) { int index = 1; (void)joy_getArgControllerNum(L, index); lua_newtable(L); const UserButtons& buttons = NDS_getFinalUserInput().buttons; for(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++) { const char* name = button_mappings[i]; bool pressed = buttons.array[i]; if((pressed && reportDown) || (!pressed && reportUp)) { lua_pushboolean(L, pressed); lua_setfield(L, -2, name); } } return 1; } // joypad.get() // returns a table of every game button, // true meaning currently-held and false meaning not-currently-held // (as of last frame boundary) // this WILL read input from a currently-playing movie DEFINE_LUA_FUNCTION(joy_get, "") { return joy_get_internal(L, true, true); } // joypad.getdown() // returns a table of every game button that is currently held DEFINE_LUA_FUNCTION(joy_getdown, "") { return joy_get_internal(L, false, true); } // joypad.getup() // returns a table of every game button that is not currently held DEFINE_LUA_FUNCTION(joy_getup, "") { return joy_get_internal(L, true, false); } // table joypad.peek() // // Reads the joypad state (what the user is currently pressing/requesting) int joy_peek_internal(lua_State* L, bool reportUp, bool reportDown) { int index = 1; (void)joy_getArgControllerNum(L, index); lua_newtable(L); const UserButtons& buttons = NDS_getRawUserInput().buttons; for(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++) { const char* name = button_mappings[i]; bool pressed = buttons.array[i]; if((pressed && reportDown) || (!pressed && reportUp)) { lua_pushboolean(L, pressed); lua_setfield(L, -2, name); } } return 1; } // joypad.peek() // returns a table of every game button, // true meaning currently-held and false meaning not-currently-held // peek checks which joypad buttons are physically pressed, // so it will NOT read input from a playing movie, // it CAN read mid-frame input, // and it will NOT pay attention to stuff like disabled L+R/U+D DEFINE_LUA_FUNCTION(joy_peek, "") { return joy_peek_internal(L, true, true); } // joypad.peekdown() // returns a table of every game button that is currently held (according to what joypad.peek() would return) DEFINE_LUA_FUNCTION(joy_peekdown, "") { return joy_peek_internal(L, false, true); } // joypad.peekup() // returns a table of every game button that is not currently held (according to what joypad.peek() would return) DEFINE_LUA_FUNCTION(joy_peekup, "") { return joy_peek_internal(L, true, false); } static const struct ColorMapping { const char* name; int value; } s_colorMapping [] = { {"white", 0xFFFFFFFF}, {"black", 0x000000FF}, {"clear", 0x00000000}, {"gray", 0x7F7F7FFF}, {"grey", 0x7F7F7FFF}, {"red", 0xFF0000FF}, {"orange", 0xFF7F00FF}, {"yellow", 0xFFFF00FF}, {"chartreuse",0x7FFF00FF}, {"green", 0x00FF00FF}, {"teal", 0x00FF7FFF}, {"cyan" , 0x00FFFFFF}, {"blue", 0x0000FFFF}, {"purple", 0x7F00FFFF}, {"magenta", 0xFF00FFFF}, }; inline int getcolor_unmodified(lua_State *L, int idx, int defaultColor) { int type = lua_type(L,idx); switch(type) { case LUA_TNUMBER: { return lua_tointeger(L,idx); } break; case LUA_TSTRING: { const char* str = lua_tostring(L,idx); if(*str == '#') { int color; sscanf(str+1, "%X", &color); int len = strlen(str+1); int missing = std::max(0, 8-len); color <<= missing << 2; if(missing >= 2) color |= 0xFF; return color; } else for(int i = 0; i 255) value = 255; switch(key) { case 1: case 'r': color |= value << 24; break; case 2: case 'g': color |= value << 16; break; case 3: case 'b': color |= value << 8; break; case 4: case 'a': color = (color & ~0xFF) | value; break; } lua_pop(L, 1); } return color; } break; case LUA_TFUNCTION: return 0; } return defaultColor; } int getcolor(lua_State *L, int idx, int defaultColor) { int color = getcolor_unmodified(L, idx, defaultColor); LuaContextInfo& info = GetCurrentInfo(); if(info.transparencyModifier != 255) { int alpha = (((color & 0xFF) * info.transparencyModifier) / 255); if(alpha > 255) alpha = 255; color = (color & ~0xFF) | alpha; } return color; } // r,g,b,a = gui.parsecolor(color) // examples: // local r,g,b = gui.parsecolor("green") // local r,g,b,a = gui.parsecolor(0x7F3FFF7F) DEFINE_LUA_FUNCTION(gui_parsecolor, "color") { int color = getcolor_unmodified(L, 1, 0); int r = (color & 0xFF000000) >> 24; int g = (color & 0x00FF0000) >> 16; int b = (color & 0x0000FF00) >> 8; int a = (color & 0x000000FF); lua_pushinteger(L, r); lua_pushinteger(L, g); lua_pushinteger(L, b); lua_pushinteger(L, a); return 4; } static inline void blend32(u32 *dstPixel, u32 color) { u8 *dst = (u8*) dstPixel; int r = (color & 0xFF000000) >> 24; int g = (color & 0x00FF0000) >> 16; int b = (color & 0x0000FF00) >> 8; int a = color & 0x000000FF; if (a == 255) { // direct copy dst[0] = b; dst[1] = g; dst[2] = r; dst[3] = a; } else if (a == 0) { // do not copy } else { // alpha-blending u8 bo = dst[0]; u8 go = dst[1]; u8 ro = dst[2]; u8 ao = dst[3]; dst[0] = (((b - bo) * a + (bo << 8)) >> 8); dst[1] = (((g - go) * a + (go << 8)) >> 8); dst[2] = (((r - ro) * a + (ro << 8)) >> 8); dst[3] = ((a + ao) - ((a * ao + 0xFF) >> 8)); } } static LuaGUIData curGuiData; static void prepare_drawing() { curGuiData = GetCurrentInfo().guiData; } static void prepare_reading() { curGuiData = GetCurrentInfo().guiData; u32* buf = (u32*)aggDraw.screen->buf().buf(); if(buf) { curGuiData.data = buf; curGuiData.stridePix = aggDraw.screen->buf().stride_abs() / 4; } else { #if defined(WIN32) && !defined(WXPORT) extern VideoInfo video; curGuiData.data = video.buffer; curGuiData.stridePix = 256; #endif } } // note: prepare_drawing or prepare_reading must be called, // before any of the following bunch of gui functions will work properly. // negative -> top // positive -> bottom // 0 -> both static void restrict_to_screen(int ySelectScreen) { if(ySelectScreen > 0) curGuiData.yMin = (curGuiData.yMin + curGuiData.yMax) >> 1; else if(ySelectScreen < 0) curGuiData.yMax = (curGuiData.yMin + curGuiData.yMax) >> 1; } // check if a pixel is in the lua canvas static FORCEINLINE bool gui_checkboundary(int x, int y) { return !(x < curGuiData.xMin || x >= curGuiData.xMax || y < curGuiData.yMin || y >= curGuiData.yMax); } static FORCEINLINE void gui_adjust_coord(int& x, int& y) { x += curGuiData.xOrigin; y += curGuiData.yOrigin; } static FORCEINLINE bool gui_checkbox(int x1, int y1, int x2, int y2) { if((x1 < curGuiData.xMin && x2 < curGuiData.xMin) || (x1 >= curGuiData.xMax && x2 >= curGuiData.xMax) || (y1 < curGuiData.yMin && y2 < curGuiData.yMin) || (y1 >= curGuiData.yMax && y2 >= curGuiData.yMax)) return false; return true; } // write a pixel (do not check boundaries for speedup) static FORCEINLINE void gui_drawpixel_unchecked(int x, int y, u32 color) { blend32((u32*) &curGuiData.data[y*curGuiData.stridePix+x], color); } // write a pixel (check boundaries) static FORCEINLINE void gui_drawpixel_checked(int x, int y, u32 color) { if (gui_checkboundary(x, y)) gui_drawpixel_unchecked(x, y, color); } static FORCEINLINE u32 gui_getpixel_unchecked(int x, int y) { return curGuiData.data[y*curGuiData.stridePix+x]; } static FORCEINLINE u32 gui_adjust_coord_and_getpixel(int x, int y) { x += curGuiData.xOrigin; y += curGuiData.yOrigin; x = min(max(x, curGuiData.xMin), curGuiData.xMax-1); y = min(max(y, curGuiData.yMin), curGuiData.yMax-1); return gui_getpixel_unchecked(x, y); } // draw a line (checks boundaries) static void gui_drawline_internal(int x1, int y1, int x2, int y2, bool lastPixel, u32 color) { // Note: New version of Bresenham's Line Algorithm // http://groups.google.co.jp/group/rec.games.roguelike.development/browse_thread/thread/345f4c42c3b25858/29e07a3af3a450e6?show_docid=29e07a3af3a450e6 int swappedx = 0; int swappedy = 0; int xtemp = x1-x2; int ytemp = y1-y2; if (xtemp == 0 && ytemp == 0) { gui_drawpixel_checked(x1, y1, color); return; } if (xtemp < 0) { xtemp = -xtemp; swappedx = 1; } if (ytemp < 0) { ytemp = -ytemp; swappedy = 1; } int delta_x = xtemp << 1; int delta_y = ytemp << 1; signed char ix = x1 > x2?1:-1; signed char iy = y1 > y2?1:-1; if (lastPixel) gui_drawpixel_checked(x2, y2, color); if (delta_x >= delta_y) { int error = delta_y - (delta_x >> 1); while (x2 != x1) { if (error == 0 && !swappedx) gui_drawpixel_checked(x2+ix, y2, color); if (error >= 0) { if (error || (ix > 0)) { y2 += iy; error -= delta_x; } } x2 += ix; gui_drawpixel_checked(x2, y2, color); if (error == 0 && swappedx) gui_drawpixel_checked(x2, y2+iy, color); error += delta_y; } } else { int error = delta_x - (delta_y >> 1); while (y2 != y1) { if (error == 0 && !swappedy) gui_drawpixel_checked(x2, y2+iy, color); if (error >= 0) { if (error || (iy > 0)) { x2 += ix; error -= delta_y; } } y2 += iy; gui_drawpixel_checked(x2, y2, color); if (error == 0 && swappedy) gui_drawpixel_checked(x2+ix, y2, color); error += delta_x; } } } static const u8 Small_Font_Data[] = { #define I +0, #define a +1 #define b +2 #define c +4 #define d +8 #define e +16 // !"#$%&' I c I b d I I d I a b I c I c I I c I b d I b d I c d e I a b e I b d I c I I c I I a b c d e I b I d I b c I I I c I I b d I b c I c I b I I I c I I a b c d e I d e I b I a c e I I I I I b d I e I a d e I a d I I I c I I I b c d I d e I b c e I I I I I I c I I I I // ()*+,-./ e I b I I I I I I e I d I c I b e I c I I I I e I d I c I c d I c I I I I d I d I c I b c d e I a b c d e I I b c d e I I d I d I c I c d I c I I I I c I d I c I b e I c I d I I c d I c I d I c I I I d I I c d I b I e I b I I I c I I I b I // 01234567 c d I d I c d I c d I b e I b c d e I c d I b c d e I b e I c d I b e I b e I b e I b I b e I e I b e I d I e I e I b e I b I b I d I b e I d I d I c d I b c d e I b c d I b c d I d I b e I d I c I e I e I e I b e I c I b e I d I b I b e I e I e I b e I c I c d I c d e I b c d e I c d I e I b c d I c d I b I I I I I I I I I // 89:;<=>? c d I c d I I I e I I b I c d I b e I b e I I I d I I c I b e I b e I b e I c d I d I c I b c d e I d I e I c d I c d e I c d I d I b I I e I d I b e I e I I I c I b c d e I d I c I b e I b e I c d I d I d I I c I I c d I c d I c d I d I e I I b I c I I I I c I I I I I // @ABCDEFG b c d I c d I b c d I c d I b c d I b c d e I b c d e I c d I a e I b e I b e I b e I b e I b I b I b e I a d e I b e I b e I b I b e I b I b I b I a c e I b c d e I b c d I b I b e I b c d I b c d I b I a d e I b e I b e I b I b e I b I b I b d e I a I b e I b e I b e I b e I b I b I b e I b c d e I b e I b c d I c d I b c d I b c d e I b I c d e I I I I I I I I I // HIJKlMNO b e I b c d I e I b e I b I a e I b e I b c d e I b e I c I e I b e I b I a b d e I b c e I b e I b e I c I e I b d I b I a c e I b d e I b e I b c d e I c I e I b c I b I a c e I b e I b e I b e I c I e I b d I b I a e I b e I b e I b e I c I b e I b e I b I a e I b e I b e I b e I b c d I c d I b e I b c d e I a e I b e I b c d e I I I I I I I I I // PQRSTUVW b c d I c d I b c d I c d e I a b c d e I b e I a e I a e I b e I b e I b e I b I c I b e I a e I a e I b e I b e I b e I b I c I b e I a e I a e I b c d I b e I b c d I c d I c I b e I a e I a e I b I b e I b e I e I c I b e I b d I a c e I b I b e I b e I e I c I b e I b d I a b d e I b I c d I b e I b c d I c I c d I c I a e I I d e I I I I I I I // XYZ[\]^_ a e I a e I a b c d e I d e I b I b c I c I I a e I a e I e I d I b I c I b d I I b d I a e I d I d I c I c I I I c I b d I c I d I c I c I I I b d I c I b I d I d I c I I I a e I c I a I d I d I c I I I a e I c I a b c d e I d I e I c I I I I I I d e I e I b c I I a b c d e I // `abcdefg b I I b I I e I I d e I I c I I b I I e I I c I I I c d I b I c d I e I c d I c I c d e I I e I b c d I b e I c d e I b e I b c d I b e I I c d e I b e I b I b e I b c d e I c I b e I I b e I b e I b I b e I b I c I c d e I I c d e I b c d I c d e I c d e I c d e I c I e I I I I I I I I c d I // hijklmno b I I I b I c I I I I b I c I c I b I c I I I I b I I I b I c I a b c d I b c d I c d I b c d I c I c I b d e I c I a c e I b e I b e I b e I c I c I b c I c I a c e I b e I b e I b e I c I c I b d I c I a c e I b e I b e I b e I c I c I b e I c I a e I b e I c d I I I b I I I I I I // pqrstuvw I I I I c I I I I I I I I c I I I I b c d I c d e I b c d I c d e I b c d I b e I b e I a e I b e I b e I b e I b I c I b e I b e I a e I b e I b e I b I c d I c I b e I b e I a c e I b c d I c d e I b I e I c I b e I c d I a b d e I b I e I b I b c d I d I c d e I c d I a e I b I e I I I I I I I // xyz{|}~ I I I d e I c I b c I I I I I I d I c I c I I b d I b e I b e I b c d e I d I c I c I c e I a c e I c d I b e I e I c d I c I c d I b d I a e I c d I b e I c d I c d I c I c d I I b d I b e I c d e I b I d I c I c I I c I b e I e I b c d e I d I c I c I I I I b c d I I d e I c I b c I I I #undef I #undef a #undef b #undef c #undef d #undef e }; template static void PutTextInternal (const char *str, int len, short x, short y, int color, int backcolor) { int Opac = color & 0xFF; int backOpac = backcolor & 0xFF; int origX = x; int origY = y; if(!Opac && !backOpac) return; while(*str && len) { if(dydy > 0 && y >= curGuiData.yMax) break; if(dydy < 0 && y < curGuiData.yMin) break; if(dxdy > 0 && x >= curGuiData.xMax) break; if(dxdy < 0 && x < curGuiData.xMin) break; int c = *str++; if(dxdx > 0 && x >= curGuiData.xMax || dxdx < 0 && x < curGuiData.xMin || dydx > 0 && y >= curGuiData.yMax || dydx < 0 && y < curGuiData.yMin) { while (c != '\n') { c = *str; if (c == '\0') break; str++; } } if(c == '\n') { if(dydy) { x = origX; y += 10 * dydy; } else { y = origY; x += 10 * dxdy; } continue; } else if(c == '\t') // just in case { const int tabSpace = 8; x += (tabSpace-(((x-origX)/5)%tabSpace))*5*dxdx; y += (tabSpace-(((y-origY)/5)%tabSpace))*5*dydx; continue; } c -= 32; if((unsigned int)c >= 96) continue; if(c) { const u8* Cur_Glyph = (const unsigned char*)&Small_Font_Data + (c%8)+((c/8)*64); for(int y2 = -1; y2 < 10; y2++) { for(int x2 = -1; x2 < 6; x2++) { bool on = y2 >= 0 && y2 < 8 && (Cur_Glyph[y2*8] & (1 << x2)); if(on) { gui_drawpixel_checked(x+x2*dxdx+y2*dxdy, y+y2*dydy+x2*dydx, color); } else if(backOpac) { for(int y3 = max(0,y2-1); y3 <= min(7,y2+1); y3++) { for(int x3 = max(0,x2-1); x3 <= min(4,x2+1); x3++) { on |= y3 >= 0 && y3 < 8 && (Cur_Glyph[y3*8] & (1 << x3)); if (on) goto draw_outline; // speedup? } } if(on) { draw_outline: gui_drawpixel_checked(x+x2*dxdx+y2*dxdy, y+y2*dydy+x2*dydx, backcolor); } } } } } x += 6*dxdx; y += 6*dydx; len--; } } static int strlinelen(const char* string) { const char* s = string; while(*s && *s != '\n') s++; if(*s) s++; return s - string; } static void LuaDisplayString (const char *str, int x, int y, u32 color, u32 outlineColor) { if(!str) return; #if 1 //if(rotate == 0) PutTextInternal<1,1,0,0>(str, strlen(str), x, y, color, outlineColor); //else if(rotate == 90) // PutTextInternal<0,0,1,-1>(str, strlen(str), x, y, color, outlineColor); //else if #else const char* ptr = str; while(*ptr && y < curGuiData.yMax) { int len = strlinelen(ptr); int skip = 0; if(len < 1) len = 1; // break up the line if it's too long to display otherwise if(len > 63) { len = 63; const char* ptr2 = ptr + len-1; for(int j = len-1; j; j--, ptr2--) { if(*ptr2 == ' ' || *ptr2 == '\t') { len = j; skip = 1; break; } } } int xl = 0; int yl = curGuiData.yMin; int xh = (curGuiData.xMax - 1 - 1) - 4*len; int yh = curGuiData.yMax - 1; int x2 = min(max(x,xl),xh); int y2 = min(max(y,yl),yh); PutTextInternal<1,1,0,0>(ptr,len,x2,y2,color,outlineColor); ptr += len + skip; y += 8; } #endif } DEFINE_LUA_FUNCTION(gui_text, "x,y,str[,color=\"white\"[,outline=\"black\"]]") { int x = luaL_checkinteger(L,1); // have to check for errors before deferring int y = luaL_checkinteger(L,2); if(DeferGUIFuncIfNeeded(L)) return 0; // we have to wait until later to call this function because we haven't emulated the next frame yet // (the only way to avoid this deferring is to be in a gui.register or emu.registerafter callback) const char* str = toCString(L,3); // better than using luaL_checkstring here (more permissive) if(str && *str) { int foreColor = getcolor(L,4,0xFFFFFFFF); int backColor = getcolor(L,5,0x000000FF); prepare_drawing(); gui_adjust_coord(x,y); LuaDisplayString(str, x, y, foreColor, backColor); } return 0; } DEFINE_LUA_FUNCTION(gui_box, "x1,y1,x2,y2[,fill[,outline]]") { int x1 = luaL_checkinteger(L,1); // have to check for errors before deferring int y1 = luaL_checkinteger(L,2); int x2 = luaL_checkinteger(L,3); int y2 = luaL_checkinteger(L,4); if(DeferGUIFuncIfNeeded(L)) return 0; int fillcolor = getcolor(L,5,0xFFFFFF3F); int outlinecolor = getcolor(L,6,fillcolor|0xFF); prepare_drawing(); restrict_to_screen(y1); gui_adjust_coord(x1,y1); gui_adjust_coord(x2,y2); if(!gui_checkbox(x1,y1,x2,y2)) return 0; // require x1,y1 <= x2,y2 if (x1 > x2) std::swap(x1,x2); if (y1 > y2) std::swap(y1,y2); // avoid trying to draw lots of offscreen pixels // (this is intentionally 1 out from the edge here) x1 = min(max(x1, curGuiData.xMin-1), curGuiData.xMax); x2 = min(max(x2, curGuiData.xMin-1), curGuiData.xMax); y1 = min(max(y1, curGuiData.yMin-1), curGuiData.yMax); y2 = min(max(y2, curGuiData.yMin-1), curGuiData.yMax); if(outlinecolor & 0xFF) { if(y1 >= curGuiData.yMin) for (short x = x1+1; x < x2; x++) gui_drawpixel_unchecked(x,y1,outlinecolor); if(x1 >= curGuiData.xMin && x1 < curGuiData.xMax) { if(y1 >= curGuiData.yMin) gui_drawpixel_unchecked(x1,y1,outlinecolor); for (short y = y1+1; y < y2; y++) gui_drawpixel_unchecked(x1,y,outlinecolor); if(y2 < curGuiData.yMax) gui_drawpixel_unchecked(x1,y2,outlinecolor); } if(y1 != y2 && y2 < curGuiData.yMax) for (short x = x1+1; x < x2; x++) gui_drawpixel_unchecked(x,y2,outlinecolor); if(x1 != x2 && x2 >= curGuiData.xMin && x2 < curGuiData.xMax) { if(y1 >= curGuiData.yMin) gui_drawpixel_unchecked(x2,y1,outlinecolor); for (short y = y1+1; y < y2; y++) gui_drawpixel_unchecked(x2,y,outlinecolor); if(y2 < curGuiData.yMax) gui_drawpixel_unchecked(x2,y2,outlinecolor); } } if(fillcolor & 0xFF) { for(short y = y1+1; y <= y2-1; y++) for(short x = x1+1; x <= x2-1; x++) gui_drawpixel_unchecked(x,y,fillcolor); } return 0; } // gui.setpixel(x,y,color) // color can be a RGB web color like '#ff7030', or with alpha RGBA like '#ff703060' // or it can be an RGBA hex number like 0xFF703060 // or it can be a preset color like 'red', 'orange', 'blue', 'white', etc. DEFINE_LUA_FUNCTION(gui_pixel, "x,y[,color=\"white\"]") { int x = luaL_checkinteger(L,1); // have to check for errors before deferring int y = luaL_checkinteger(L,2); if(DeferGUIFuncIfNeeded(L)) return 0; int color = getcolor(L,3,0xFFFFFFFF); if(color & 0xFF) { prepare_drawing(); gui_adjust_coord(x,y); gui_drawpixel_checked(x, y, color); } return 0; } // r,g,b = gui.getpixel(x,y) DEFINE_LUA_FUNCTION(gui_getpixel, "x,y") { prepare_reading(); int x = luaL_checkinteger(L,1); int y = luaL_checkinteger(L,2); u32 color = gui_adjust_coord_and_getpixel(x,y); int b = (color & 0x000000FF); int g = (color & 0x0000FF00) >> 8; int r = (color & 0x00FF0000) >> 16; lua_pushinteger(L, r); lua_pushinteger(L, g); lua_pushinteger(L, b); return 3; } DEFINE_LUA_FUNCTION(gui_line, "x1,y1,x2,y2[,color=\"white\"[,skipfirst=false]]") { int x1 = luaL_checkinteger(L,1); // have to check for errors before deferring int y1 = luaL_checkinteger(L,2); int x2 = luaL_checkinteger(L,3); int y2 = luaL_checkinteger(L,4); if(DeferGUIFuncIfNeeded(L)) return 0; int color = getcolor(L,5,0xFFFFFFFF); int skipFirst = lua_toboolean(L,6); if(!(color & 0xFF)) return 0; prepare_drawing(); restrict_to_screen(y1); gui_adjust_coord(x1,y1); gui_adjust_coord(x2,y2); if(!gui_checkbox(x1,y1,x2,y2)) return 0; gui_drawline_internal(x2, y2, x1, y1, !skipFirst, color); return 0; } // gui.opacity(number alphaValue) // sets the transparency of subsequent draw calls // 0.0 is completely transparent, 1.0 is completely opaque // non-integer values are supported and meaningful, as are values greater than 1.0 // it is not necessary to use this function to get transparency (or the less-recommended gui.transparency() either), // because you can provide an alpha value in the color argument of each draw call. // however, it can be convenient to be able to globally modify the drawing transparency DEFINE_LUA_FUNCTION(gui_setopacity, "alpha_0_to_1") { lua_Number opacF = luaL_checknumber(L,1); opacF *= 255.0; if(opacF < 0) opacF = 0; int opac; lua_number2int(opac, opacF); LuaContextInfo& info = GetCurrentInfo(); info.transparencyModifier = opac; return 0; } // gui.transparency(number transparencyValue) // sets the transparency of subsequent draw calls // 0.0 is completely opaque, 4.0 is completely transparent // non-integer values are supported and meaningful, as are values less than 0.0 // this is a legacy function, and the range is from 0 to 4 solely for this reason // it does the exact same thing as gui.opacity() but with a different argument range DEFINE_LUA_FUNCTION(gui_settransparency, "transparency_4_to_0") { lua_Number transp = luaL_checknumber(L,1); lua_Number opacF = 4 - transp; opacF *= 255.0 / 4.0; if(opacF < 0) opacF = 0; int opac; lua_number2int(opac, opacF); LuaContextInfo& info = GetCurrentInfo(); info.transparencyModifier = opac; return 0; } // takes a screenshot and returns it in gdstr format // example: gd.createFromGdStr(gui.gdscreenshot()):png("outputimage.png") DEFINE_LUA_FUNCTION(gui_gdscreenshot, "[whichScreen='both']") { prepare_reading(); int selectedScreen = 0; if(lua_isboolean(L, 1)) selectedScreen = lua_toboolean(L, 1) ? 1 : -1; else if(lua_isnumber(L, 1)) selectedScreen = lua_tointeger(L, 1); else if(lua_isstring(L, 1)) { const char* str = lua_tostring(L, 1); if(!stricmp(str,"top")) selectedScreen = -1; if(!stricmp(str,"bottom")) selectedScreen = 1; } restrict_to_screen(selectedScreen); int width = curGuiData.xMax - curGuiData.xMin; int height = curGuiData.yMax - curGuiData.yMin; int size = 11 + width * height * 4; char* str = new char[size+1]; // TODO: use _alloca instead (but I don't know which compilers support it) str[size] = 0; unsigned char* ptr = (unsigned char*)str; // GD format header for truecolor image (11 bytes) *ptr++ = (65534 >> 8) & 0xFF; *ptr++ = (65534 ) & 0xFF; *ptr++ = (width >> 8) & 0xFF; *ptr++ = (width ) & 0xFF; *ptr++ = (height >> 8) & 0xFF; *ptr++ = (height ) & 0xFF; *ptr++ = 1; *ptr++ = 255; *ptr++ = 255; *ptr++ = 255; *ptr++ = 255; u8* Src = (u8*)curGuiData.data + (curGuiData.stridePix*4) * curGuiData.yMin; for(int y = curGuiData.yMin; y < curGuiData.yMax; y++, Src += curGuiData.stridePix*4) { for(int x = curGuiData.xMin; x < curGuiData.xMax; x++) { *ptr++ = 0 /* (255 - Src[4*x+3]) / 2 */; // alpha (0-127, 0=opaque, 127=transparent) *ptr++ = Src[4*x+2]; *ptr++ = Src[4*x+1]; *ptr++ = Src[4*x+0]; } } lua_pushlstring(L, str, size); delete[] str; return 1; } // draws a gd image that's in gdstr format to the screen // example: gui.gdoverlay(gd.createFromPng("myimage.png"):gdStr()) DEFINE_LUA_FUNCTION(gui_gdoverlay, "[dx=0,dy=0,]gdimage[,sx=0,sy=0,width,height][,alphamul]") { int xStartDst = 0; int yStartDst = 0; int xStartSrc = 0; int yStartSrc = 0; int width, height; int numArgs = lua_gettop(L); int index = 1; if(lua_type(L,index) == LUA_TNUMBER) { xStartDst = lua_tointeger(L,index++); if(lua_type(L,index) == LUA_TNUMBER) yStartDst = lua_tointeger(L,index++); } luaL_checktype(L,index,LUA_TSTRING); // have to check for errors before deferring if(DeferGUIFuncIfNeeded(L)) return 0; const unsigned char* ptr = (const unsigned char*)lua_tostring(L,index++); const bool defSrcRect = ((numArgs - index + 1) < 2); if (!defSrcRect) { xStartSrc = luaL_checkinteger(L, index++); yStartSrc = luaL_checkinteger(L, index++); width = luaL_checkinteger(L, index++); height = luaL_checkinteger(L, index++); } LuaContextInfo& info = GetCurrentInfo(); int alphaMul = info.transparencyModifier; if(lua_isnumber(L, index)) alphaMul = (int)(alphaMul * lua_tonumber(L, index++)); if(alphaMul <= 0) return 0; // since there aren't that many possible opacity levels, // do the opacity modification calculations beforehand instead of per pixel int opacMap[256]; for(int i = 0; i < 128; i++) { int opac = 255 - ((i << 1) | (i & 1)); // gdAlphaMax = 127, not 255 opac = (opac * alphaMul) / 255; if(opac < 0) opac = 0; if(opac > 255) opac = 255; opacMap[i] = opac; } for(int i = 128; i < 256; i++) opacMap[i] = 0; // what should we do for them, actually? // GD format header for truecolor image (11 bytes) ptr++; bool trueColor = (*ptr++ == 254); int gdWidth = *ptr++ << 8; gdWidth |= *ptr++; int gdHeight = *ptr++ << 8; gdHeight |= *ptr++; int bytespp = (trueColor ? 4 : 1); if (defSrcRect) { width = gdWidth; height = gdHeight; } if ((!trueColor && *ptr) || (trueColor && !*ptr)) { luaL_error(L, "gdoverlay: inconsistent color type."); return 0; } ptr++; int colorsTotal = 0; if (!trueColor) { colorsTotal = *ptr++ << 8; colorsTotal |= *ptr++; } int transparent = *ptr++ << 24; transparent |= *ptr++ << 16; transparent |= *ptr++ << 8; transparent |= *ptr++; struct { int r, g, b, a; } pal[256]; if (!trueColor) for (int i = 0; i < 256; i++) { pal[i].r = *ptr++; pal[i].g = *ptr++; pal[i].b = *ptr++; pal[i].a = opacMap[*ptr++]; } prepare_drawing(); u8* Dst = (u8*)curGuiData.data; gui_adjust_coord(xStartDst,yStartDst); int xMin = curGuiData.xMin; int yMin = curGuiData.yMin; int xMax = curGuiData.xMax - 1; int yMax = curGuiData.yMax - 1; int strideBytes = curGuiData.stridePix * 4; // limit source rect if (xStartSrc < 0) { width += xStartSrc; xStartDst -= xStartSrc; xStartSrc = 0; } if (yStartSrc < 0) { height += yStartSrc; yStartDst -= yStartSrc; yStartSrc = 0; } if (xStartSrc + width >= gdWidth) width = gdWidth - xStartSrc; if (yStartSrc+height >= gdHeight) height = gdHeight - yStartSrc; if (width <= 0 || height <= 0) return 0; ptr += (yStartSrc * gdWidth + xStartSrc) * bytespp; Dst += yStartDst * strideBytes; for(int y = yStartDst; y < height+yStartDst && y < yMax; y++, Dst += strideBytes) { if(y < yMin) ptr += gdWidth * bytespp; else { int xA = (xStartDst < xMin ? xMin : xStartDst); int xB = (xStartDst+width > xMax ? xMax : xStartDst+width); ptr += (xA - xStartDst) * bytespp; for(int x = xA; x < xB; x++) { if (trueColor) { int opac = opacMap[ptr[0]]; u32 pix = (opac|(ptr[3]<<8)|(ptr[2]<<16)|(ptr[1]<<24)); blend32((u32*)(Dst+x*4), pix); ptr += 4; } else { int palNo = ptr[0]; u32 pix = (pal[palNo].a|(pal[palNo].b<<8)|(pal[palNo].g<<16)|(pal[palNo].r<<24)); blend32((u32*)(Dst+x*4), pix); ptr++; } } ptr += (gdWidth - (xB - xStartDst)) * bytespp; } } return 0; } static void GetCurrentScriptDir(char* buffer, int bufLen) { LuaContextInfo& info = GetCurrentInfo(); strncpy(buffer, info.lastFilename.c_str(), bufLen); buffer[bufLen-1] = 0; char* slash = std::max(strrchr(buffer, '/'), strrchr(buffer, '\\')); if(slash) slash[1] = 0; } DEFINE_LUA_FUNCTION(emu_openscript, "filename") { #if defined(WIN32) && !defined(WXPORT) char curScriptDir[1024]; GetCurrentScriptDir(curScriptDir, 1024); // make sure we can always find scripts that are in the same directory as the current script const char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL; extern const char* OpenLuaScript(const char* filename, const char* extraDirToCheck, bool makeSubservient); const char* errorMsg = OpenLuaScript(filename, curScriptDir, true); if(errorMsg) luaL_error(L, errorMsg); #endif return 0; } DEFINE_LUA_FUNCTION(emu_reset, "") { extern bool _HACK_DONT_STOPMOVIE; _HACK_DONT_STOPMOVIE = true; NDS_Reset(); _HACK_DONT_STOPMOVIE = false; return 0; } static bool IsLuaMenuItem(PlatformMenuItem menuItem) { #if defined(WIN32) && !defined(WXPORT) return (menuItem >= IDC_LUAMENU_RESERVE_START && menuItem <= IDC_LUAMENU_RESERVE_END); #else return false; #endif } static bool SearchFreeMenuItem(PlatformMenu menu, PlatformMenuItem& menuItem) { #if defined(WIN32) && !defined(WXPORT) for (UINT menuItemId = IDC_LUAMENU_RESERVE_START; menuItemId <= IDC_LUAMENU_RESERVE_END; menuItemId++) { MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID; if (!GetMenuItemInfo(menu, menuItemId, FALSE, &mii) && GetLastError() == ERROR_MENU_ITEM_NOT_FOUND) { menuItem = menuItemId; return true; } } return false; #else return false; #endif } static PlatformMenu AddSubMenu(PlatformMenu topMenu, PlatformMenu menu, const char* menuName) { #if defined(WIN32) && !defined(WXPORT) LuaContextInfo& info = GetCurrentInfo(); MENUITEMINFO mii; // search existing submenu for (int index = 0; index < GetMenuItemCount(menu); index++) { ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_SUBMENU | MIIM_STRING; const UINT bufferSize = 128; TCHAR menuItemText[bufferSize]; mii.dwTypeData = menuItemText; mii.cch = bufferSize; GetMenuItemInfo(menu, index, TRUE, &mii); // if exists, return it if (mii.hSubMenu != NULL && lstrcmp(menuName, mii.dwTypeData) == 0) { if (IsLuaMenuItem(mii.wID)) { info.menuData.subMenuData.push_back(LuaSubMenuData(menu, mii.hSubMenu, mii.wID)); } return mii.hSubMenu; } } // add new submenu UINT subMenuId; if (!SearchFreeMenuItem(topMenu, subMenuId)) { return NULL; } ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_SUBMENU; mii.fType = MFT_STRING; mii.fState = MFS_ENABLED; mii.wID = subMenuId; mii.hSubMenu = CreatePopupMenu(); mii.dwTypeData = (char*) menuName; if (!InsertMenuItem(menu, (UINT)-1, TRUE, &mii)) { if (mii.hSubMenu != NULL) { DestroyMenu(mii.hSubMenu); } return NULL; } info.menuData.subMenuData.push_back(LuaSubMenuData(menu, mii.hSubMenu, subMenuId)); return mii.hSubMenu; #else return 0; #endif } bool AddMenuEntries(PlatformMenu topMenu, PlatformMenu menu) { #if defined(WIN32) && !defined(WXPORT) LuaContextInfo& info = GetCurrentInfo(); lua_State* L = info.L; luaL_checktype(L, -1, LUA_TTABLE); luaL_checkstack(L, 6, ""); // for index = 1, #menuEntries unsigned int count = lua_objlen(L, -1); for (unsigned int index = 1; index <= count; index++) { // switch(type(menuEntries[index])) lua_rawgeti(L, -1, index); if (lua_isnil(L, -1)) { UINT menuItem; if (!SearchFreeMenuItem(topMenu, menuItem)) { luaL_error(L, "too many menu items"); return false; } MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_FTYPE; mii.wID = menuItem; mii.fType = MFT_SEPARATOR; if (!InsertMenuItem(menu, menuItem, FALSE, &mii)) { luaL_error(L, "menu item addition failed"); return false; } info.menuData.menuItemMap.insert(map::value_type(menuItem, menu)); lua_pop(L, 1); } else if (lua_istable(L, -1)) { lua_rawgeti(L, -1, 1); const char* menuName = luaL_checkstring(L, -1); lua_insert(L, -2); lua_rawgeti(L, -1, 2); if (lua_isfunction(L, -1)) { UINT menuItem; if (!SearchFreeMenuItem(topMenu, menuItem)) { luaL_error(L, "too many menu items"); return false; } MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_STRING; mii.wID = menuItem; mii.dwTypeData = (char*) menuName; if (!InsertMenuItem(menu, menuItem, FALSE, &mii)) { luaL_error(L, "menu item addition failed"); return false; } info.menuData.menuItemMap.insert(map::value_type(menuItem, menu)); lua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString); lua_insert(L, -2); lua_rawseti(L, -2, menuItem); lua_pop(L, 3); } else if (lua_istable(L, -1)) { HMENU subMenu = AddSubMenu(topMenu, menu, menuName); if (subMenu == NULL) { luaL_error(L, "menu item addition failed"); return false; } if (!AddMenuEntries(topMenu, subMenu)) { return false; } lua_pop(L, 3); } else { luaL_typerror(L, -1, "function or table"); return false; } } else { luaL_typerror(L, -1, "nil or table"); return false; } } return true; #else return false; #endif } DEFINE_LUA_FUNCTION(emu_addmenu, "menuName, menuEntries") { #if defined(WIN32) && !defined(WXPORT) int nargs = lua_gettop(L); if (nargs > 1 && !lua_isnil(L, 1)) { const char* menuName = luaL_checkstring(L, 1); luaL_checktype(L, 2, LUA_TTABLE); lua_settop(L, 2); // drop redundant args HMENU menu = mainMenu; HMENU subMenu = AddSubMenu(menu, menu, menuName); if (subMenu != NULL) { AddMenuEntries(menu, subMenu); DrawMenuBar(MainWindow->getHWnd()); } else { luaL_error(L, "menu item addition failed"); } } else { //HMENU menu = NULL; // TODO: set popup (right-click) menu //int index = (nargs > 1) ? 2 : 1; //luaL_checktype(L, index, LUA_TTABLE); //lua_settop(L, index); // drop redundant args //AddMenuEntries(menu, menu); } #endif return 0; } DEFINE_LUA_FUNCTION(emu_setmenuiteminfo, "menuItem, infoTable") { luaL_checktype(L, 1, LUA_TFUNCTION); luaL_checktype(L, 2, LUA_TTABLE); #if defined(WIN32) && !defined(WXPORT) LuaContextInfo& info = GetCurrentInfo(); map::iterator it = info.menuData.menuItemMap.begin(); while(it != info.menuData.menuItemMap.end()) { HMENU menu = (*it).second; UINT menuItem = (*it).first; lua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString); lua_rawgeti(L, -1, menuItem); if (lua_rawequal(L, 1, -1) != 0) { MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_STATE | MIIM_STRING; GetMenuItemInfo(menu, menuItem, FALSE, &mii); mii.fMask = 0; lua_getfield(L, 2, "enabled"); if (lua_isboolean(L, -1)) { mii.fMask |= MIIM_STATE; if (lua_toboolean(L, -1) != 0) { mii.fState &= ~MFS_DISABLED; } else { mii.fState |= MFS_DISABLED; } } else if (!lua_isnil(L, -1)) { luaL_where(L, 0); luaL_error(L, "%s bad argument \"enabled\" (boolean expected, got %s)", luaL_optstring(L, -1, ""), luaL_typename(L, -2)); } lua_pop(L, 1); lua_getfield(L, 2, "checked"); if (lua_isboolean(L, -1)) { mii.fMask |= MIIM_STATE; if (lua_toboolean(L, -1) != 0) { mii.fState |= MFS_CHECKED; } else { mii.fState &= ~MFS_CHECKED; } } else if (!lua_isnil(L, -1)) { luaL_where(L, 0); luaL_error(L, "%s bad argument \"checked\" (boolean expected, got %s)", luaL_optstring(L, -1, ""), luaL_typename(L, -2)); } lua_pop(L, 1); lua_getfield(L, 2, "name"); if (lua_isstring(L, -1)) { mii.fMask |= MIIM_STRING; mii.dwTypeData = (LPSTR) lua_tostring(L, -1); } else if (!lua_isnil(L, -1)) { luaL_where(L, 0); luaL_error(L, "%s bad argument \"name\" (string expected, got %s)", luaL_optstring(L, -1, ""), luaL_typename(L, -2)); } SetMenuItemInfo(menu, menuItem, FALSE, &mii); lua_pop(L, 1); } lua_pop(L, 1); it++; } #endif return 0; } DEFINE_LUA_FUNCTION(emu_registermenustart, "func") { if (!lua_isnil(L,1)) luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L,1); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONINITMENU]); lua_insert(L,1); lua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONINITMENU]); StopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]); return 1; } // TODO /* DEFINE_LUA_FUNCTION(emu_loadrom, "filename") { struct Temp { Temp() {EnableStopAllLuaScripts(false);} ~Temp() {EnableStopAllLuaScripts(true);}} dontStopScriptsHere; const char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL; char curScriptDir[1024]; GetCurrentScriptDir(curScriptDir, 1024); filename = MakeRomPathAbsolute(filename, curScriptDir); int result = GensLoadRom(filename); if(result <= 0) luaL_error(L, "Failed to load ROM \"%s\": %s", filename, result ? "invalid or unsupported" : "cancelled or not found"); CallRegisteredLuaFunctions(LUACALL_ONSTART); return 0; } */ DEFINE_LUA_FUNCTION(emu_getframecount, "") { lua_pushinteger(L, currFrameCounter); return 1; } DEFINE_LUA_FUNCTION(emu_getlagcount, "") { lua_pushinteger(L, TotalLagFrames); return 1; } DEFINE_LUA_FUNCTION(emu_lagged, "") { lua_pushboolean(L, LagFrameFlag); return 1; } DEFINE_LUA_FUNCTION(emu_emulating, "") { lua_pushboolean(L, driver->EMU_HasEmulationStarted()); return 1; } DEFINE_LUA_FUNCTION(emu_atframeboundary, "") { lua_pushboolean(L, driver->EMU_IsAtFrameBoundary()); return 1; } DEFINE_LUA_FUNCTION(movie_getlength, "") { lua_pushinteger(L, currMovieData.records.size()); return 1; } DEFINE_LUA_FUNCTION(movie_isactive, "") { lua_pushboolean(L, movieMode != MOVIEMODE_INACTIVE); return 1; } DEFINE_LUA_FUNCTION(movie_rerecordcount, "") { lua_pushinteger(L, currMovieData.rerecordCount); return 1; } DEFINE_LUA_FUNCTION(movie_setrerecordcount, "") { currMovieData.rerecordCount = luaL_checkinteger(L, 1); return 0; } DEFINE_LUA_FUNCTION(emu_rerecordcounting, "[enabled]") { LuaContextInfo& info = GetCurrentInfo(); if(lua_gettop(L) == 0) { // if no arguments given, return the current value lua_pushboolean(L, !info.rerecordCountingDisabled); return 1; } else { // set rerecord disabling info.rerecordCountingDisabled = !lua_toboolean(L,1); return 0; } } DEFINE_LUA_FUNCTION(movie_getreadonly, "") { lua_pushboolean(L, movie_readonly); return 1; } DEFINE_LUA_FUNCTION(movie_setreadonly, "readonly") { movie_readonly = lua_toboolean(L,1) != 0; // else if(!movie_readonly) // luaL_error(L, "movie.setreadonly failed: write permission denied"); return 0; } DEFINE_LUA_FUNCTION(movie_isrecording, "") { lua_pushboolean(L, movieMode == MOVIEMODE_RECORD); return 1; } DEFINE_LUA_FUNCTION(movie_isplaying, "") { lua_pushboolean(L, movieMode == MOVIEMODE_PLAY); return 1; } DEFINE_LUA_FUNCTION(movie_getmode, "") { switch(movieMode) { case MOVIEMODE_PLAY: lua_pushstring(L, "playback"); break; case MOVIEMODE_RECORD: lua_pushstring(L, "record"); break; case MOVIEMODE_INACTIVE: lua_pushstring(L, "inactive"); break; case MOVIEMODE_FINISHED: lua_pushstring(L, "finished"); break; default: lua_pushnil(L); break; } return 1; } DEFINE_LUA_FUNCTION(movie_getname, "") { extern char curMovieFilename[512]; lua_pushstring(L, curMovieFilename); return 1; } // movie.play() -- plays a movie of the user's choice // movie.play(filename) -- starts playing a particular movie // throws an error (with a description) if for whatever reason the movie couldn't be played DEFINE_LUA_FUNCTION(movie_play, "[filename]") { const char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL; const char* errorMsg = FCEUI_LoadMovie(filename, true, false, 0); if(errorMsg) luaL_error(L, errorMsg); return 0; } DEFINE_LUA_FUNCTION(movie_replay, "") { if(movieMode == MOVIEMODE_INACTIVE) return 0; lua_settop(L, 0); extern char curMovieFilename[512]; lua_pushstring(L, curMovieFilename); return movie_play(L); } DEFINE_LUA_FUNCTION(movie_close, "") { FCEUI_StopMovie(); return 0; } DEFINE_LUA_FUNCTION(sound_clear, "") { SPU_ClearOutputBuffer(); return 0; } #if defined(_WIN32) && !defined(WXPORT) const char* s_keyToName[256] = { NULL, "leftclick", "rightclick", NULL, "middleclick", NULL, NULL, NULL, "backspace", "tab", NULL, NULL, NULL, "enter", NULL, NULL, "shift", // 0x10 "control", "alt", "pause", "capslock", NULL, NULL, NULL, NULL, NULL, NULL, "escape", NULL, NULL, NULL, NULL, "space", // 0x20 "pageup", "pagedown", "end", "home", "left", "up", "right", "down", NULL, NULL, NULL, NULL, "insert", "delete", NULL, "0","1","2","3","4","5","6","7","8","9", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "A","B","C","D","E","F","G","H","I","J", "K","L","M","N","O","P","Q","R","S","T", "U","V","W","X","Y","Z", NULL, NULL, NULL, NULL, NULL, "numpad0","numpad1","numpad2","numpad3","numpad4","numpad5","numpad6","numpad7","numpad8","numpad9", "numpad*","numpad+", NULL, "numpad-","numpad.","numpad/", "F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12", "F13","F14","F15","F16","F17","F18","F19","F20","F21","F22","F23","F24", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "numlock", "scrolllock", NULL, // 0x92 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 0xB9 "semicolon", "plus", "comma", "minus", "period", "slash", "tilde", NULL, // 0xC1 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 0xDA "leftbracket", "backslash", "rightbracket", "quote", }; #endif // input.get() // takes no input, returns a lua table of entries representing the current input state, // independent of the joypad buttons the emulated game thinks are pressed // for example: // if the user is holding the W key and the left mouse button // and has the mouse at the bottom-right corner of the game screen, // then this would return {W=true, leftclick=true, xmouse=319, ymouse=223} DEFINE_LUA_FUNCTION(input_getcurrentinputstatus, "") { lua_newtable(L); #if defined(_WIN32) && !defined(WXPORT) // keyboard and mouse button status { extern bool allowBackgroundInput; unsigned char keys [256]; if(!allowBackgroundInput) { if(GetKeyboardState(keys)) { for(int i = 1; i < 255; i++) { int mask = (i == VK_CAPITAL || i == VK_NUMLOCK || i == VK_SCROLL) ? 0x01 : 0x80; if(keys[i] & mask) { const char* name = s_keyToName[i]; if(name) { lua_pushboolean(L, true); lua_setfield(L, -2, name); } } } } } else // use a slightly different method that will detect background input: { for(int i = 1; i < 255; i++) { const char* name = s_keyToName[i]; if(name) { int active; if(i == VK_CAPITAL || i == VK_NUMLOCK || i == VK_SCROLL) active = GetKeyState(i) & 0x01; else active = GetAsyncKeyState(i) & 0x8000; if(active) { lua_pushboolean(L, true); lua_setfield(L, -2, name); } } } } } // mouse position in game screen pixel coordinates { void UnscaleScreenCoords(s32& x, s32& y); void ToDSScreenRelativeCoords(s32& x, s32& y, int bottomScreen); POINT point; GetCursorPos(&point); ScreenToClient(MainWindow->getHWnd(), &point); s32 x (point.x); s32 y (point.y); UnscaleScreenCoords(x,y); ToDSScreenRelativeCoords(x,y,1); lua_pushinteger(L, x); lua_setfield(L, -2, "xmouse"); lua_pushinteger(L, y); lua_setfield(L, -2, "ymouse"); } worry(L,10); #else // NYI (well, return an empty table) #endif return 1; } // resets our "worry" counter of the Lua state int dontworry(LuaContextInfo& info) { if(info.stopWorrying) { info.stopWorrying = false; if(info.worryCount) indicateBusy(info.L, false); } info.worryCount = 0; return 0; } //agg basic shapes //TODO polygon and polyline, maybe the overloads for roundedRect and curve #include "aggdraw.h" static int line(lua_State *L) { double x1,y1,x2,y2; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; aggDraw.hud->line(x1, y1, x2, y2); return 0; } static int triangle(lua_State *L) { double x1,y1,x2,y2,x3,y3; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; x3 = luaL_checknumber(L,5) + 0.5; y3 = luaL_checknumber(L,6) + 0.5; aggDraw.hud->triangle(x1, y1, x2, y2, x3, y3); return 0; } static int rectangle(lua_State *L) { double x1,y1,x2,y2; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; aggDraw.hud->rectangle(x1, y1, x2, y2); return 0; } static int roundedRect(lua_State *L) { double x1,y1,x2,y2,r; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; r = luaL_checknumber(L,5); aggDraw.hud->roundedRect(x1, y1, x2, y2, r); return 0; } static int ellipse(lua_State *L) { double cx,cy,rx,ry; cx = luaL_checknumber(L,1) + 0.5; cy = luaL_checknumber(L,2) + 0.5; rx = luaL_checknumber(L,3); ry = luaL_checknumber(L,4); aggDraw.hud->ellipse(cx, cy, rx, ry); return 0; } static int arc(lua_State *L) { double cx,cy,rx,ry,start,sweep; cx = luaL_checknumber(L,1) + 0.5; cy = luaL_checknumber(L,2) + 0.5; rx = luaL_checknumber(L,3); ry = luaL_checknumber(L,4); start = luaL_checknumber(L,5); sweep = luaL_checknumber(L,6); aggDraw.hud->arc(cx, cy,rx, ry, start, sweep); return 0; } static int star(lua_State *L) { double cx,cy,r1,r2,startAngle; int numRays; cx = luaL_checknumber(L,1) + 0.5; cy = luaL_checknumber(L,2) + 0.5; r1 = luaL_checknumber(L,3); r2 = luaL_checknumber(L,4); startAngle = luaL_checknumber(L,5); numRays = luaL_checkinteger(L,6); aggDraw.hud->star(cx, cy, r1, r2, startAngle, numRays); return 0; } static int curve(lua_State *L) { double x1,y1,x2,y2,x3,y3; x1 = luaL_checknumber(L,1) + 0.5; y1 = luaL_checknumber(L,2) + 0.5; x2 = luaL_checknumber(L,3) + 0.5; y2 = luaL_checknumber(L,4) + 0.5; x3 = luaL_checknumber(L,5) + 0.5; y3 = luaL_checknumber(L,6) + 0.5; aggDraw.hud->curve(x1, y1, x2, y2, x3, y3); return 0; } static const struct luaL_reg aggbasicshapes [] = { {"line", line}, {"triangle", triangle}, {"rectangle", rectangle}, {"roundedRect", roundedRect}, {"ellipse", ellipse}, {"arc", arc}, {"star", star}, {"curve", curve}, // {"polygon", polygon}, // {"polyline", polyline}, {NULL, NULL} }; //agg general attributes //TODO missing functions, maybe the missing overloads static void getColorForAgg(lua_State *L, int&r,int&g,int&b,int&a) { if(lua_gettop(L) == 1) { int color = getcolor(L, 1, 0xFF); r = (color & 0xFF000000) >> 24; g = (color & 0x00FF0000) >> 16; b = (color & 0x0000FF00) >> 8; a = (color & 0x000000FF); } else { r = luaL_optinteger(L,1,255); g = luaL_optinteger(L,2,255); b = luaL_optinteger(L,3,255); a = luaL_optinteger(L,4,255); } } static int fillColor(lua_State *L) { int r,g,b,a; getColorForAgg(L, r,g,b,a); aggDraw.hud->fillColor(r, g, b, a); return 0; } static int noFill(lua_State *L) { aggDraw.hud->noFill(); return 0; } static int lineColor(lua_State *L) { int r,g,b,a; getColorForAgg(L, r,g,b,a); aggDraw.hud->lineColor(r, g, b, a); return 0; } static int noLine(lua_State *L) { aggDraw.hud->noLine(); return 0; } static int lineWidth(lua_State *L) { double w; w = luaL_checknumber(L,1); aggDraw.hud->lineWidth(w); return 0; } static const struct luaL_reg agggeneralattributes [] = { // {"blendMode", blendMode}, // {"imageBlendMode", imageBlendMode}, // {"imageBlendColor", imageBlendColor}, // {"masterAlpha", masterAlpha}, // {"antiAliasGamma", antiAliasGamma}, // {"font", font}, {"fillColor", fillColor}, {"noFill", noFill}, {"lineColor", lineColor}, {"noLine", noLine}, // {"fillLinearGradient", fillLinearGradient}, // {"lineLinearGradient", lineLinearGradient}, // {"fillRadialGradient", fillRadialGradient}, // {"lineRadialGradient", lineRadialGradient}, {"lineWidth", lineWidth}, // {"lineCap", lineCap}, // {"lineJoin", lineJoin}, // {"fillEvenOdd", fillEvenOdd}, {NULL, NULL} }; static int setFont(lua_State *L) { const char *choice; choice = luaL_checkstring(L,1); aggDraw.hud->setFont(choice); return 0; } static int text(lua_State *L) { int x, y; const char *choice; x = luaL_checkinteger(L, 1); y = luaL_checkinteger(L, 2); choice = luaL_checkstring(L,3); aggDraw.hud->renderTextDropshadowed(x,y,choice); return 0; } static const struct luaL_reg aggcustom [] = { {"setFont", setFont}, {"text", text}, {NULL, NULL} }; // gui.osdtext(int x, int y, string msg) // // Displays the given text on the screen, using the same font and techniques as the // main HUD. // static int gui_osdtext(lua_State *L) { int x = luaL_checkinteger(L,1); // have to check for errors before deferring int y = luaL_checkinteger(L,2); if(DeferGUIFuncIfNeeded(L)) return 0; // we have to wait until later to call this function because we haven't emulated the next frame yet // (the only way to avoid this deferring is to be in a gui.register or emu.registerafter callback) const char* msg = toCString(L,3); osd->addFixed(x, y, "%s", msg); return 0; } DEFINE_LUA_FUNCTION(stylus_read, "") { lua_newtable(L); lua_pushinteger(L, nds.scr_touchX >> 4); lua_setfield(L, -2, "x"); lua_pushinteger(L, nds.scr_touchY >> 4); lua_setfield(L, -2, "y"); lua_pushboolean(L, nds.isTouch); lua_setfield(L, -2, "touch"); return 1; } DEFINE_LUA_FUNCTION(stylus_peek, "") { lua_newtable(L); lua_pushinteger(L, NDS_getRawUserInput().touch.touchX >> 4); lua_setfield(L, -2, "x"); lua_pushinteger(L, NDS_getRawUserInput().touch.touchY >> 4); lua_setfield(L, -2, "y"); lua_pushboolean(L, NDS_getRawUserInput().touch.isTouch?1:0); lua_setfield(L, -2, "touch"); return 1; } static int toTouchValue(int pixCoord, int maximum) { pixCoord = std::min(std::max(pixCoord, 0), maximum-1); return (pixCoord << 4) & 0x0FF0; } DEFINE_LUA_FUNCTION(stylus_write, "table") { if(movieMode == MOVIEMODE_PLAY) // don't allow tampering with a playing movie's input return 0; // (although it might be useful sometimes...) if(!NDS_isProcessingUserInput()) { // defer this function until when we are processing input DeferFunctionCall(L, deferredJoySetIDString); return 0; } int index = 1; luaL_checktype(L, index, LUA_TTABLE); UserTouch& touch = NDS_getProcessingUserInput().touch; lua_getfield(L, index, "x"); if (!lua_isnil(L,-1)) touch.touchX = toTouchValue(lua_tointeger(L, -1), 256); lua_pop(L, 1); lua_getfield(L, index, "y"); if (!lua_isnil(L,-1)) touch.touchY = toTouchValue(lua_tointeger(L, -1), 192); lua_pop(L, 1); lua_getfield(L, index, "touch"); if (!lua_isnil(L,-1)) touch.isTouch = lua_toboolean(L, -1) ? true : false; lua_pop(L, 1); return 0; } static int gcEMUFILE_MEMORY(lua_State *L) { EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*"); delete (*ppEmuFile); *ppEmuFile = 0; return 0; } static const struct luaL_reg styluslib [] = { {"get", stylus_read}, {"peek", stylus_peek}, {"set", stylus_write}, // alternative names {"read", stylus_read}, {"write", stylus_write}, {NULL, NULL} }; static const struct luaL_reg emulib [] = { {"frameadvance", emu_frameadvance}, {"speedmode", emu_speedmode}, {"wait", emu_wait}, {"pause", emu_pause}, {"unpause", emu_unpause}, {"emulateframe", emu_emulateframe}, {"emulateframefastnoskipping", emu_emulateframefastnoskipping}, {"emulateframefast", emu_emulateframefast}, {"emulateframeinvisible", emu_emulateframeinvisible}, {"redraw", emu_redraw}, {"framecount", emu_getframecount}, {"lagcount", emu_getlagcount}, {"lagged", emu_lagged}, {"emulating", emu_emulating}, {"atframeboundary", emu_atframeboundary}, {"registerbefore", emu_registerbefore}, {"registerafter", emu_registerafter}, {"registerstart", emu_registerstart}, {"registerexit", emu_registerexit}, {"persistglobalvariables", emu_persistglobalvariables}, {"message", emu_message}, {"print", print}, // sure, why not {"openscript", emu_openscript}, // {"loadrom", emu_loadrom}, {"reset", emu_reset}, {"addmenu", emu_addmenu}, {"setmenuiteminfo", emu_setmenuiteminfo}, {"registermenustart", emu_registermenustart}, // alternative names // {"openrom", emu_loadrom}, {NULL, NULL} }; static const struct luaL_reg guilib [] = { {"register", gui_register}, {"text", gui_text}, {"box", gui_box}, {"line", gui_line}, {"pixel", gui_pixel}, {"getpixel", gui_getpixel}, {"opacity", gui_setopacity}, {"transparency", gui_settransparency}, {"popup", gui_popup}, {"parsecolor", gui_parsecolor}, {"gdscreenshot", gui_gdscreenshot}, {"gdoverlay", gui_gdoverlay}, {"redraw", emu_redraw}, // some people might think of this as more of a GUI function {"osdtext", gui_osdtext}, // alternative names {"drawtext", gui_text}, {"drawbox", gui_box}, {"drawline", gui_line}, {"drawpixel", gui_pixel}, {"setpixel", gui_pixel}, {"writepixel", gui_pixel}, {"readpixel", gui_getpixel}, {"rect", gui_box}, {"drawrect", gui_box}, {"drawimage", gui_gdoverlay}, {"image", gui_gdoverlay}, {NULL, NULL} }; static const struct luaL_reg statelib [] = { {"create", state_create}, {"save", state_save}, {"load", state_load}, #ifndef PUBLIC_RELEASE {"verify", state_verify}, // for desync catching #endif // TODO //{"loadscriptdata", state_loadscriptdata}, //{"savescriptdata", state_savescriptdata}, //{"registersave", state_registersave}, //{"registerload", state_registerload}, {NULL, NULL} }; static const struct luaL_reg memorylib [] = { {"readbyte", memory_readbyte}, {"readbytesigned", memory_readbytesigned}, {"readword", memory_readword}, {"readwordsigned", memory_readwordsigned}, {"readdword", memory_readdword}, {"readdwordsigned", memory_readdwordsigned}, {"readbyterange", memory_readbyterange}, {"writebyte", memory_writebyte}, {"writeword", memory_writeword}, {"writedword", memory_writedword}, {"isvalid", memory_isvalid}, {"getregister", memory_getregister}, {"setregister", memory_setregister}, // alternate naming scheme for word and double-word and unsigned {"readbyteunsigned", memory_readbyte}, {"readwordunsigned", memory_readword}, {"readdwordunsigned", memory_readdword}, {"readshort", memory_readword}, {"readshortunsigned", memory_readword}, {"readshortsigned", memory_readwordsigned}, {"readlong", memory_readdword}, {"readlongunsigned", memory_readdword}, {"readlongsigned", memory_readdwordsigned}, {"writeshort", memory_writeword}, {"writelong", memory_writedword}, {"vram_readword", vram_readword}, {"vram_writeword", vram_writeword}, // memory hooks {"registerwrite", memory_registerwrite}, {"registerread", memory_registerread}, {"registerexec", memory_registerexec}, // alternate names {"register", memory_registerwrite}, {"registerrun", memory_registerexec}, {"registerexecute", memory_registerexec}, {NULL, NULL} }; static const struct luaL_reg joylib [] = { {"get", joy_get}, {"getdown", joy_getdown}, {"getup", joy_getup}, {"peek", joy_peek}, {"peekdown", joy_peekdown}, {"peekup", joy_peekup}, {"set", joy_set}, // alternative names {"read", joy_get}, {"write", joy_set}, {"readdown", joy_getdown}, {"readup", joy_getup}, {NULL, NULL} }; static const struct luaL_reg inputlib [] = { {"get", input_getcurrentinputstatus}, {"registerhotkey", input_registerhotkey}, {"popup", input_popup}, // alternative names {"read", input_getcurrentinputstatus}, {NULL, NULL} }; static const struct luaL_reg movielib [] = { {"active", movie_isactive}, {"recording", movie_isrecording}, {"playing", movie_isplaying}, {"mode", movie_getmode}, {"length", movie_getlength}, {"name", movie_getname}, {"rerecordcount", movie_rerecordcount}, {"setrerecordcount", movie_setrerecordcount}, {"rerecordcounting", emu_rerecordcounting}, {"readonly", movie_getreadonly}, {"setreadonly", movie_setreadonly}, {"framecount", emu_getframecount}, // for those familiar with other emulators that have movie.framecount() instead of emulatorname.framecount() {"play", movie_play}, {"replay", movie_replay}, {"stop", movie_close}, // alternative names {"open", movie_play}, {"close", movie_close}, {"getname", movie_getname}, {"playback", movie_play}, {"getreadonly", movie_getreadonly}, {NULL, NULL} }; static const struct luaL_reg soundlib [] = { {"clear", sound_clear}, {NULL, NULL} }; static const struct CFuncInfo { const char* library; const char* name; const char* args; bool registry; } cFuncInfo [] = // this info is stored here to avoid having to change all of Lua's libraries to use something like DEFINE_LUA_FUNCTION { {LUA_STRLIBNAME, "byte", "str[,start[,end]]"}, {LUA_STRLIBNAME, "char", "...[bytes]"}, {LUA_STRLIBNAME, "dump", "func"}, {LUA_STRLIBNAME, "find", "str,pattern[,init[,plain]]"}, {LUA_STRLIBNAME, "format", "formatstring,..."}, {LUA_STRLIBNAME, "gfind", "!deprecated!"}, {LUA_STRLIBNAME, "gmatch", "str,pattern"}, {LUA_STRLIBNAME, "gsub", "str,pattern,repl[,n]"}, {LUA_STRLIBNAME, "len", "str"}, {LUA_STRLIBNAME, "lower", "str"}, {LUA_STRLIBNAME, "match", "str,pattern[,init]"}, {LUA_STRLIBNAME, "rep", "str,n"}, {LUA_STRLIBNAME, "reverse", "str"}, {LUA_STRLIBNAME, "sub", "str,start[,end]"}, {LUA_STRLIBNAME, "upper", "str"}, {NULL, "module", "name[,...]"}, {NULL, "require", "modname"}, {LUA_LOADLIBNAME, "loadlib", "libname,funcname"}, {LUA_LOADLIBNAME, "seeall", "module"}, {LUA_COLIBNAME, "create", "func"}, {LUA_COLIBNAME, "resume", "co[,val1,...]"}, {LUA_COLIBNAME, "running", ""}, {LUA_COLIBNAME, "status", "co"}, {LUA_COLIBNAME, "wrap", "func"}, {LUA_COLIBNAME, "yield", "..."}, {NULL, "assert", "cond[,message]"}, {NULL, "collectgarbage", "opt[,arg]"}, {NULL, "gcinfo", ""}, {NULL, "dofile", "filename"}, {NULL, "error", "message[,level]"}, {NULL, "getfenv", "[level_or_func]"}, {NULL, "getmetatable", "object"}, {NULL, "ipairs", "arraytable"}, {NULL, "load", "func[,chunkname]"}, {NULL, "loadfile", "[filename]"}, {NULL, "loadstring", "str[,chunkname]"}, {NULL, "next", "table[,index]"}, {NULL, "pairs", "table"}, {NULL, "pcall", "func,arg1,..."}, {NULL, "rawequal", "v1,v2"}, {NULL, "rawget", "table,index"}, {NULL, "rawset", "table,index,value"}, {NULL, "select", "index,..."}, {NULL, "setfenv", "level_or_func,envtable"}, {NULL, "setmetatable", "table,metatable"}, {NULL, "tonumber", "str_or_num[,base]"}, {NULL, "type", "obj"}, {NULL, "unpack", "list[,i=1[,j=#list]]"}, {NULL, "xpcall", "func,errhandler"}, {NULL, "newproxy", "hasmeta"}, {LUA_MATHLIBNAME, "abs", "x"}, {LUA_MATHLIBNAME, "acos", "x"}, {LUA_MATHLIBNAME, "asin", "x"}, {LUA_MATHLIBNAME, "atan", "x"}, {LUA_MATHLIBNAME, "atan2", "y,x"}, {LUA_MATHLIBNAME, "ceil", "x"}, {LUA_MATHLIBNAME, "cos", "rads"}, {LUA_MATHLIBNAME, "cosh", "x"}, {LUA_MATHLIBNAME, "deg", "rads"}, {LUA_MATHLIBNAME, "exp", "x"}, {LUA_MATHLIBNAME, "floor", "x"}, {LUA_MATHLIBNAME, "fmod", "x,y"}, {LUA_MATHLIBNAME, "frexp", "x"}, {LUA_MATHLIBNAME, "ldexp", "m,e"}, {LUA_MATHLIBNAME, "log", "x"}, {LUA_MATHLIBNAME, "log10", "x"}, {LUA_MATHLIBNAME, "max", "x,..."}, {LUA_MATHLIBNAME, "min", "x,..."}, {LUA_MATHLIBNAME, "modf", "x"}, {LUA_MATHLIBNAME, "pow", "x,y"}, {LUA_MATHLIBNAME, "rad", "degs"}, {LUA_MATHLIBNAME, "random", "[m[,n]]"}, {LUA_MATHLIBNAME, "randomseed", "x"}, {LUA_MATHLIBNAME, "sin", "rads"}, {LUA_MATHLIBNAME, "sinh", "x"}, {LUA_MATHLIBNAME, "sqrt", "x"}, {LUA_MATHLIBNAME, "tan", "rads"}, {LUA_MATHLIBNAME, "tanh", "x"}, {LUA_IOLIBNAME, "close", "[file]"}, {LUA_IOLIBNAME, "flush", ""}, {LUA_IOLIBNAME, "input", "[file]"}, {LUA_IOLIBNAME, "lines", "[filename]"}, {LUA_IOLIBNAME, "open", "filename[,mode=\"r\"]"}, {LUA_IOLIBNAME, "output", "[file]"}, {LUA_IOLIBNAME, "popen", "prog,[model]"}, {LUA_IOLIBNAME, "read", "..."}, {LUA_IOLIBNAME, "tmpfile", ""}, {LUA_IOLIBNAME, "type", "obj"}, {LUA_IOLIBNAME, "write", "..."}, {LUA_OSLIBNAME, "clock", ""}, {LUA_OSLIBNAME, "date", "[format[,time]]"}, {LUA_OSLIBNAME, "difftime", "t2,t1"}, {LUA_OSLIBNAME, "execute", "[command]"}, {LUA_OSLIBNAME, "exit", "[code]"}, {LUA_OSLIBNAME, "getenv", "varname"}, {LUA_OSLIBNAME, "remove", "filename"}, {LUA_OSLIBNAME, "rename", "oldname,newname"}, {LUA_OSLIBNAME, "setlocale", "locale[,category]"}, {LUA_OSLIBNAME, "time", "[timetable]"}, {LUA_OSLIBNAME, "tmpname", ""}, {LUA_DBLIBNAME, "debug", ""}, {LUA_DBLIBNAME, "getfenv", "o"}, {LUA_DBLIBNAME, "gethook", "[thread]"}, {LUA_DBLIBNAME, "getinfo", "[thread,]function[,what]"}, {LUA_DBLIBNAME, "getlocal", "[thread,]level,local"}, {LUA_DBLIBNAME, "getmetatable", "[object]"}, {LUA_DBLIBNAME, "getregistry", ""}, {LUA_DBLIBNAME, "getupvalue", "func,up"}, {LUA_DBLIBNAME, "setfenv", "object,table"}, {LUA_DBLIBNAME, "sethook", "[thread,]hook,mask[,count]"}, {LUA_DBLIBNAME, "setlocal", "[thread,]level,local,value"}, {LUA_DBLIBNAME, "setmetatable", "object,table"}, {LUA_DBLIBNAME, "setupvalue", "func,up,value"}, {LUA_DBLIBNAME, "traceback", "[thread,][message][,level]"}, {LUA_TABLIBNAME, "concat", "table[,sep[,i[,j]]]"}, {LUA_TABLIBNAME, "insert", "table,[pos,]value"}, {LUA_TABLIBNAME, "maxn", "table"}, {LUA_TABLIBNAME, "remove", "table[,pos]"}, {LUA_TABLIBNAME, "sort", "table[,comp]"}, {LUA_TABLIBNAME, "foreach", "table,func"}, {LUA_TABLIBNAME, "foreachi", "table,func"}, {LUA_TABLIBNAME, "getn", "table"}, {LUA_TABLIBNAME, "maxn", "table"}, {LUA_TABLIBNAME, "setn", "table,value"}, // I know some of these are obsolete but they should still have argument info if they're exposed to the user {LUA_FILEHANDLE, "setvbuf", "mode[,size]", true}, {LUA_FILEHANDLE, "lines", "", true}, {LUA_FILEHANDLE, "read", "...", true}, {LUA_FILEHANDLE, "flush", "", true}, {LUA_FILEHANDLE, "seek", "[whence][,offset]", true}, {LUA_FILEHANDLE, "write", "...", true}, {LUA_FILEHANDLE, "__tostring", "obj", true}, {LUA_FILEHANDLE, "__gc", "", true}, {"_LOADLIB", "__gc", "", true}, }; void registerLibs(lua_State* L) { luaL_openlibs(L); luaL_register(L, "emu", emulib); luaL_register(L, "gui", guilib); luaL_register(L, "stylus", styluslib); luaL_register(L, "savestate", statelib); luaL_register(L, "memory", memorylib); luaL_register(L, "joypad", joylib); // for game input luaL_register(L, "input", inputlib); // for user input luaL_register(L, "movie", movielib); luaL_register(L, "sound", soundlib); luaL_register(L, "bit", bit_funcs); // LuaBitOp library luaL_register(L, "agg", aggbasicshapes); luaL_register(L, "agg", agggeneralattributes); luaL_register(L, "agg", aggcustom); lua_settop(L, 0); // clean the stack, because each call to luaL_register leaves a table on top // register a few utility functions outside of libraries (in the global namespace) lua_register(L, "print", print); lua_register(L, "tostring", tostring); lua_register(L, "addressof", addressof); lua_register(L, "copytable", copytable); // old bit operation functions lua_register(L, "AND", bit_band); lua_register(L, "OR", bit_bor); lua_register(L, "XOR", bit_bxor); lua_register(L, "SHIFT", bitshift); lua_register(L, "BIT", bitbit); luabitop_validate(L); // populate s_cFuncInfoMap the first time static bool once = true; if(once) { once = false; for(int i = 0; i < sizeof(cFuncInfo)/sizeof(*cFuncInfo); i++) { const CFuncInfo& cfi = cFuncInfo[i]; if(cfi.registry) { lua_getregistry(L); lua_getfield(L, -1, cfi.library); lua_remove(L, -2); lua_getfield(L, -1, cfi.name); lua_remove(L, -2); } else if(cfi.library) { lua_getfield(L, LUA_GLOBALSINDEX, cfi.library); lua_getfield(L, -1, cfi.name); lua_remove(L, -2); } else { lua_getfield(L, LUA_GLOBALSINDEX, cfi.name); } lua_CFunction func = lua_tocfunction(L, -1); s_cFuncInfoMap[func] = cfi.args; lua_pop(L, 1); } // deal with some stragglers lua_getfield(L, LUA_GLOBALSINDEX, "package"); lua_getfield(L, -1, "loaders"); lua_remove(L, -2); if(lua_istable(L, -1)) { for(int i=1;;i++) { lua_rawgeti(L, -1, i); lua_CFunction func = lua_tocfunction(L, -1); lua_pop(L,1); if(!func) break; s_cFuncInfoMap[func] = "name"; } } lua_pop(L,1); } // push arrays for storing hook functions in for(int i = 0; i < LUAMEMHOOK_COUNT; i++) { lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[i]); } // push an array for menu handlers lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, menuCallbackIDString); // register type luaL_newmetatable(L, "EMUFILE_MEMORY*"); lua_pushcfunction(L, gcEMUFILE_MEMORY); lua_setfield(L, -2, "__gc"); lua_pop(L, 1); } void ResetInfo(LuaContextInfo& info) { info.L = NULL; info.started = false; info.running = false; info.returned = false; info.crashed = false; info.restart = false; info.restartLater = false; info.worryCount = 0; info.stopWorrying = false; info.panic = false; info.ranExit = false; info.numDeferredFuncs = 0; info.ranFrameAdvance = false; info.transparencyModifier = 255; info.speedMode = SPEEDMODE_NORMAL; info.guiFuncsNeedDeferring = false; info.dataSaveKey = 0; info.dataLoadKey = 0; info.dataSaveLoadKeySet = false; info.rerecordCountingDisabled = false; info.numMemHooks = 0; info.persistVars.clear(); info.newDefaultData.ClearRecords(); info.guiData.data = (u32*)aggDraw.hud->buf().buf(); info.guiData.stridePix = aggDraw.hud->buf().stride_abs() / 4; info.guiData.xMin = 0; info.guiData.xMax = 256; info.guiData.yMin = 0; info.guiData.yMax = 192 * 2; info.guiData.xOrigin = 0; info.guiData.yOrigin = 192; } void OpenLuaContext(int uid, void(*print)(int uid, const char* str), void(*onstart)(int uid), void(*onstop)(int uid, bool statusOK)) { LuaContextInfo* newInfo = new LuaContextInfo(); ResetInfo(*newInfo); newInfo->print = print; newInfo->onstart = onstart; newInfo->onstop = onstop; luaContextInfo[uid] = newInfo; } void RunLuaScriptFile(int uid, const char* filenameCStr) { if(luaContextInfo.find(uid) == luaContextInfo.end()) return; StopLuaScript(uid); LuaContextInfo& info = *luaContextInfo[uid]; #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; // doing it like this makes sure that the info stack gets cleaned up even if an exception is thrown #endif info.nextFilename = filenameCStr; // TODO: store script's current directory into LuaContextInfo static char dirnameCStr[MAX_PATH]; strcpy(dirnameCStr, filenameCStr); TrimFilenameFromPath(dirnameCStr); chdir(dirnameCStr); if(info.running) { // it's a little complicated, but... the call to luaL_dofile below // could call a C function that calls this very function again // additionally, if that happened then the above call to StopLuaScript // probably couldn't stop the script yet, so instead of continuing, // we'll set a flag that tells the first call of this function to loop again // when the script is able to stop safely info.restart = true; return; } do { std::string filename = info.nextFilename; lua_State* L = lua_open(); #ifndef USE_INFO_STACK luaStateToContextMap[L] = &info; #endif luaStateToUIDMap[L] = uid; ResetInfo(info); info.L = L; info.guiFuncsNeedDeferring = true; info.lastFilename = filename; SetSaveKey(info, FilenameFromPath(filename.c_str())); info.dataSaveLoadKeySet = false; registerLibs(L); // register a function to periodically check for inactivity lua_sethook(L, LuaRescueHook, LUA_MASKCOUNT, HOOKCOUNT); // deferred evaluation table lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, deferredGUIIDString); lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, deferredJoySetIDString); lua_newtable(L); lua_setfield(L, LUA_REGISTRYINDEX, refStashString); info.started = true; RefreshScriptStartedStatus(); if(info.onstart) info.onstart(uid); info.running = true; RefreshScriptSpeedStatus(); info.returned = false; int errorcode = luaL_dofile(L,filename.c_str()); info.running = false; RefreshScriptSpeedStatus(); info.returned = true; if (errorcode) { info.crashed = true; if(info.print) { info.print(uid, lua_tostring(L,-1)); info.print(uid, "\r\n"); } else { fprintf(stderr, "%s\n", lua_tostring(L,-1)); } StopLuaScript(uid); } else { dontworry(info); driver->USR_RefreshScreen(); StopScriptIfFinished(uid, true); } } while(info.restart); } void StopScriptIfFinished(int uid, bool justReturned) { LuaContextInfo& info = *luaContextInfo[uid]; if(!info.returned) return; // the script has returned, but it is not necessarily done running // because it may have registered a function that it expects to keep getting called // so check if it has any registered functions and stop the script only if it doesn't bool keepAlive = (info.numMemHooks != 0 || !info.menuData.menuItemMap.empty()); for(int calltype = 0; calltype < LUACALL_COUNT && !keepAlive; calltype++) { lua_State* L = info.L; if(L) { const char* idstring = luaCallIDStrings[calltype]; lua_getfield(L, LUA_REGISTRYINDEX, idstring); bool isFunction = lua_isfunction(L, -1); lua_pop(L, 1); if(isFunction) keepAlive = true; } } if(keepAlive) { if(justReturned) { if(info.print) info.print(uid, "script returned but is still running registered functions\r\n"); else fprintf(stdout, "%s\n", "script returned but is still running registered functions"); } } else { if(info.print) info.print(uid, "script finished running\r\n"); else fprintf(stdout, "%s\n", "script finished running"); StopLuaScript(uid); } } void RequestAbortLuaScript(int uid, const char* message) { if(luaContextInfo.find(uid) == luaContextInfo.end()) return; LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(L) { // this probably isn't the right way to do it // but calling luaL_error here is positively unsafe // (it seemingly works fine but sometimes corrupts the emulation state in colorful ways) // and this works pretty well and is definitely safe, so screw it info.L->hookcount = 1; // run hook function as soon as possible info.panic = true; // and call luaL_error once we're inside the hook function if(message) { strncpy(info.panicMessage, message, sizeof(info.panicMessage)); info.panicMessage[sizeof(info.panicMessage)-1] = 0; } else { // attach file/line info because this is the case where it's most necessary to see that, // and often it won't be possible for the later luaL_error call to retrieve it otherwise. // this means sometimes printing multiple file/line numbers if luaL_error does find something, // but that's fine since more information is probably better anyway. luaL_where(L,0); // should be 0 and not 1 here to get useful (on force stop) messages const char* whereString = lua_tostring(L,-1); snprintf(info.panicMessage, sizeof(info.panicMessage), "%sscript terminated", whereString); lua_pop(L,1); } } } void SetSaveKey(LuaContextInfo& info, const char* key) { info.dataSaveKey = crc32(0, (const unsigned char*)key, strlen(key)); if(!info.dataSaveLoadKeySet) { info.dataLoadKey = info.dataSaveKey; info.dataSaveLoadKeySet = true; } } void SetLoadKey(LuaContextInfo& info, const char* key) { info.dataLoadKey = crc32(0, (const unsigned char*)key, strlen(key)); if(!info.dataSaveLoadKeySet) { info.dataSaveKey = info.dataLoadKey; info.dataSaveLoadKeySet = true; } } void HandleCallbackError(lua_State* L, LuaContextInfo& info, int uid, bool stopScript) { info.crashed = true; if(L->errfunc || L->errorJmp) luaL_error(L, lua_tostring(L,-1)); else { if(info.print) { info.print(uid, lua_tostring(L,-1)); info.print(uid, "\r\n"); } else { fprintf(stderr, "%s\n", lua_tostring(L,-1)); } if(stopScript) StopLuaScript(uid); } } void CallExitFunction(int uid) { LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(!L) return; dontworry(info); // first call the registered exit function if there is one if(!info.ranExit) { info.ranExit = true; #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif //lua_settop(L, 0); lua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]); int errorcode = 0; if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); bool wasPanic = info.panic; info.panic = false; // otherwise we could barely do anything in the exit function errorcode = lua_pcall(L, 0, 0, 0); info.panic |= wasPanic; // restore panic info.running = wasRunning; RefreshScriptSpeedStatus(); } // save persisted variable info after the exit function runs (even if it crashed) { // gather the final value of the variables we're supposed to persist LuaSaveData newExitData; { int numPersistVars = info.persistVars.size(); for(int i = 0; i < numPersistVars; i++) { const char* varName = info.persistVars[i].c_str(); lua_getfield(L, LUA_GLOBALSINDEX, varName); int type = lua_type(L,-1); unsigned int varNameCRC = crc32(0, (const unsigned char*)varName, strlen(varName)); newExitData.SaveRecordPartial(uid, varNameCRC, -1); lua_pop(L,1); } } char path [1024] = {0}; char* pathTypeChrPtr = ConstructScriptSaveDataPath(path, 1024, info); *pathTypeChrPtr = 'd'; if(info.newDefaultData.recordList) { FILE* defaultsFile = fopen(path, "wb"); if(defaultsFile) { info.newDefaultData.ExportRecords(defaultsFile); fclose(defaultsFile); } } else unlink(path); *pathTypeChrPtr = 'e'; if(newExitData.recordList) { FILE* persistFile = fopen(path, "wb"); if(persistFile) { newExitData.ExportRecords(persistFile); fclose(persistFile); } } else unlink(path); } if (errorcode) HandleCallbackError(L,info,uid,false); } } void StopLuaScript(int uid) { LuaContextInfo* infoPtr = luaContextInfo[uid]; if(!infoPtr) return; LuaContextInfo& info = *infoPtr; if(info.running) { // if it's currently running then we can't stop it now without crashing // so the best we can do is politely request for it to go kill itself RequestAbortLuaScript(uid); return; } lua_State* L = info.L; if(L) { CallExitFunction(uid); if(info.onstop) { info.stopWorrying = true, info.worryCount++, dontworry(info); // clear "busy" status info.onstop(uid, !info.crashed); // must happen before closing L and after the exit function, otherwise the final GUI state of the script won't be shown properly or at all } if(info.started) // this check is necessary { lua_close(L); #ifndef USE_INFO_STACK luaStateToContextMap.erase(L); #endif luaStateToUIDMap.erase(L); info.L = NULL; info.started = false; info.numMemHooks = 0; for(int i = 0; i < LUAMEMHOOK_COUNT; i++) CalculateMemHookRegions((LuaMemHookType)i); #if defined(WIN32) && !defined(WXPORT) // remove items map::iterator it = info.menuData.menuItemMap.begin(); while(it != info.menuData.menuItemMap.end()) { HMENU menu = (*it).second; UINT menuItem = (*it).first; DeleteMenu(menu, menuItem, MF_BYCOMMAND); it++; } info.menuData.menuItemMap.clear(); // remove submenus vector::reverse_iterator rit = info.menuData.subMenuData.rbegin(); while(rit != info.menuData.subMenuData.rend()) { HMENU menu = (*rit).menu; UINT menuItem = (*rit).menuItem; MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_SUBMENU; GetMenuItemInfo(menu, menuItem, FALSE, &mii); HMENU subMenu = mii.hSubMenu; // delete if it's empty if (GetMenuItemCount(subMenu) == 0) { DeleteMenu(menu, menuItem, MF_BYCOMMAND); } rit++; } info.menuData.subMenuData.clear(); DrawMenuBar(MainWindow->getHWnd()); #endif } RefreshScriptStartedStatus(); } } void CloseLuaContext(int uid) { StopLuaScript(uid); delete luaContextInfo[uid]; luaContextInfo.erase(uid); } TieredRegion hookedRegions [LUAMEMHOOK_COUNT]; // currently disabled for desmume, // and the performance hit might not be accepable // unless we can switch the emulation into a whole separate path // that has this callback enabled. static void CalculateMemHookRegions(LuaMemHookType hookType) { std::vector hookedBytes; std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.numMemHooks) { lua_State* L = info.L; if(L) { int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]); lua_pushnil(L); while(lua_next(L, -2)) { if(lua_isfunction(L, -1)) { unsigned int addr = lua_tointeger(L, -2); hookedBytes.push_back(addr); } lua_pop(L, 1); } if(!info.crashed) lua_settop(L, top); } } ++iter; } hookedRegions[hookType].Calculate(hookedBytes); } void CallRegisteredLuaMemHook_LuaMatch(unsigned int address, int size, unsigned int value, LuaMemHookType hookType) { std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.numMemHooks) { lua_State* L = info.L; if(L && !info.panic) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]); for(int i = address; i != address+size; i++) { lua_rawgeti(L, -1, i); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); lua_pushinteger(L, address); lua_pushinteger(L, size); int errorcode = lua_pcall(L, 2, 0, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) { int uid = iter->first; HandleCallbackError(L,info,uid,true); } break; } else { lua_pop(L,1); } } if(!info.crashed) lua_settop(L, top); } } ++iter; } } void CallRegisteredLuaMenuHandlers(PlatformMenuItem menuItem) { std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; lua_State* L = info.L; if(L && !info.panic) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString); lua_rawgeti(L, -1, menuItem); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); int errorcode = lua_pcall(L, 0, 0, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) { int uid = iter->first; HandleCallbackError(L,info,uid,true); } break; } else { lua_pop(L,1); } if(!info.crashed) lua_settop(L, top); } ++iter; } } bool AnyLuaActive() { std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.started) return true; ++iter; } return false; } void CallRegisteredLuaFunctions(LuaCallID calltype) { assert((unsigned int)calltype < (unsigned int)LUACALL_COUNT); const char* idstring = luaCallIDStrings[calltype]; std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; lua_State* L = info.L; if(L && (!info.panic || calltype == LUACALL_BEFOREEXIT)) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif // handle deferred GUI function calls and disabling deferring when unnecessary if(calltype == LUACALL_AFTEREMULATIONGUI || calltype == LUACALL_AFTEREMULATION) info.guiFuncsNeedDeferring = false; if(calltype == LUACALL_AFTEREMULATIONGUI) CallDeferredFunctions(L, deferredGUIIDString); if(calltype == LUACALL_BEFOREEMULATION) { assert(NDS_isProcessingUserInput()); CallDeferredFunctions(L, deferredJoySetIDString); } int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, idstring); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); int errorcode = lua_pcall(L, 0, 0, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) HandleCallbackError(L,info,uid,true); } else { lua_pop(L, 1); } info.guiFuncsNeedDeferring = true; if(!info.crashed) { lua_settop(L, top); if(!info.panic) dontworry(info); } } ++iter; } } void CallRegisteredLuaSaveFunctions(int savestateNumber, LuaSaveData& saveData) { const char* idstring = luaCallIDStrings[LUACALL_BEFORESAVE]; std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; lua_State* L = info.L; if(L) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, idstring); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); lua_pushinteger(L, savestateNumber); int errorcode = lua_pcall(L, 1, LUA_MULTRET, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) HandleCallbackError(L,info,uid,true); saveData.SaveRecord(uid, info.dataSaveKey); } else { lua_pop(L, 1); } if(!info.crashed) lua_settop(L, top); } ++iter; } } void CallRegisteredLuaLoadFunctions(int savestateNumber, const LuaSaveData& saveData) { const char* idstring = luaCallIDStrings[LUACALL_AFTERLOAD]; std::map::iterator iter = luaContextInfo.begin(); std::map::iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; lua_State* L = info.L; if(L) { #ifdef USE_INFO_STACK infoStack.insert(infoStack.begin(), &info); struct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; #endif int top = lua_gettop(L); lua_getfield(L, LUA_REGISTRYINDEX, idstring); if (lua_isfunction(L, -1)) { bool wasRunning = info.running; info.running = true; RefreshScriptSpeedStatus(); // since the scriptdata can be very expensive to load // (e.g. the registered save function returned some huge tables) // check the number of parameters the registered load function expects // and don't bother loading the parameters it wouldn't receive anyway int numParamsExpected = (L->top - 1)->value.gc->cl.l.p->numparams; if(numParamsExpected) numParamsExpected--; // minus one for the savestate number we always pass in int prevGarbage = lua_gc(L, LUA_GCCOUNT, 0); lua_pushinteger(L, savestateNumber); saveData.LoadRecord(uid, info.dataLoadKey, numParamsExpected); int n = lua_gettop(L) - 1; int errorcode = lua_pcall(L, n, 0, 0); info.running = wasRunning; RefreshScriptSpeedStatus(); if (errorcode) HandleCallbackError(L,info,uid,true); else { int newGarbage = lua_gc(L, LUA_GCCOUNT, 0); if(newGarbage - prevGarbage > 50) { // now seems to be a very good time to run the garbage collector // it might take a while now but that's better than taking 10 whiles 9 loads from now lua_gc(L, LUA_GCCOLLECT, 0); } } } else { lua_pop(L, 1); } if(!info.crashed) lua_settop(L, top); } ++iter; } } static const unsigned char* s_dbg_dataStart = NULL; static int s_dbg_dataSize = 0; // can't remember what the best way of doing this is... #if defined(i386) || defined(__i386) || defined(__i386__) || defined(M_I86) || defined(_M_IX86) || defined(_WIN32) #define IS_LITTLE_ENDIAN #endif // push a value's bytes onto the output stack template void PushBinaryItem(T item, std::vector& output) { unsigned char* buf = (unsigned char*)&item; #ifdef IS_LITTLE_ENDIAN for(int i = sizeof(T); i; i--) output.push_back(*buf++); #else int vecsize = output.size(); for(int i = sizeof(T); i; i--) output.insert(output.begin() + vecsize, *buf++); #endif } // read a value from the byte stream and advance the stream by its size template T AdvanceByteStream(const unsigned char*& data, unsigned int& remaining) { #ifdef IS_LITTLE_ENDIAN T rv = *(T*)data; data += sizeof(T); #else T rv; unsigned char* rvptr = (unsigned char*)&rv; for(int i = sizeof(T)-1; i>=0; i--) rvptr[i] = *data++; #endif remaining -= sizeof(T); return rv; } // advance the byte stream by a certain size without reading a value void AdvanceByteStream(const unsigned char*& data, unsigned int& remaining, int amount) { data += amount; remaining -= amount; } #define LUAEXT_TLONG 30 // 0x1E // 4-byte signed integer #define LUAEXT_TUSHORT 31 // 0x1F // 2-byte unsigned integer #define LUAEXT_TSHORT 32 // 0x20 // 2-byte signed integer #define LUAEXT_TBYTE 33 // 0x21 // 1-byte unsigned integer #define LUAEXT_TNILS 34 // 0x22 // multiple nils represented by a 4-byte integer (warning: becomes multiple stack entities) #define LUAEXT_TTABLE 0x40 // 0x40 through 0x4F // tables of different sizes: #define LUAEXT_BITS_1A 0x01 // size of array part fits in a 1-byte unsigned integer #define LUAEXT_BITS_2A 0x02 // size of array part fits in a 2-byte unsigned integer #define LUAEXT_BITS_4A 0x03 // size of array part fits in a 4-byte unsigned integer #define LUAEXT_BITS_1H 0x04 // size of hash part fits in a 1-byte unsigned integer #define LUAEXT_BITS_2H 0x08 // size of hash part fits in a 2-byte unsigned integer #define LUAEXT_BITS_4H 0x0C // size of hash part fits in a 4-byte unsigned integer #define BITMATCH(x,y) (((x) & (y)) == (y)) static void PushNils(std::vector& output, int& nilcount) { int count = nilcount; nilcount = 0; static const int minNilsWorthEncoding = 6; // because a LUAEXT_TNILS entry is 5 bytes if(count < minNilsWorthEncoding) { for(int i = 0; i < count; i++) output.push_back(LUA_TNIL); } else { output.push_back(LUAEXT_TNILS); PushBinaryItem(count, output); } } static void LuaStackToBinaryConverter(lua_State* L, int i, std::vector& output) { int type = lua_type(L, i); // the first byte of every serialized item says what Lua type it is output.push_back(type & 0xFF); switch(type) { default: { //printf("wrote unknown type %d (0x%x)\n", type, type); //assert(0); LuaContextInfo& info = GetCurrentInfo(); if(info.print) { char errmsg [1024]; sprintf(errmsg, "values of type \"%s\" are not allowed to be returned from registered save functions.\r\n", luaL_typename(L,i)); info.print(luaStateToUIDMap[L->l_G->mainthread], errmsg); } else { fprintf(stderr, "values of type \"%s\" are not allowed to be returned from registered save functions.\n", luaL_typename(L,i)); } } break; case LUA_TNIL: // no information necessary beyond the type break; case LUA_TBOOLEAN: // serialize as 0 or 1 output.push_back(lua_toboolean(L,i)); break; case LUA_TSTRING: // serialize as a 0-terminated string of characters { const char* str = lua_tostring(L,i); while(*str) output.push_back(*str++); output.push_back('\0'); } break; case LUA_TNUMBER: { double num = (double)lua_tonumber(L,i); s32 inum = (s32)lua_tointeger(L,i); if(num != inum) { PushBinaryItem(num, output); } else { if((inum & ~0xFF) == 0) type = LUAEXT_TBYTE; else if((u16)(inum & 0xFFFF) == inum) type = LUAEXT_TUSHORT; else if((s16)(inum & 0xFFFF) == inum) type = LUAEXT_TSHORT; else type = LUAEXT_TLONG; output.back() = type; switch(type) { case LUAEXT_TLONG: PushBinaryItem(inum, output); break; case LUAEXT_TUSHORT: PushBinaryItem(inum, output); break; case LUAEXT_TSHORT: PushBinaryItem(inum, output); break; case LUAEXT_TBYTE: output.push_back(inum); break; } } } break; case LUA_TTABLE: // serialize as a type that describes how many bytes are used for storing the counts, // followed by the number of array entries if any, then the number of hash entries if any, // then a Lua value per array entry, then a (key,value) pair of Lua values per hashed entry // note that the structure of table references are not faithfully serialized (yet) { int outputTypeIndex = output.size() - 1; int arraySize = 0; int hashSize = 0; if(lua_checkstack(L, 4) && std::find(s_tableAddressStack.begin(), s_tableAddressStack.end(), lua_topointer(L,i)) == s_tableAddressStack.end()) { s_tableAddressStack.push_back(lua_topointer(L,i)); struct Scope { ~Scope(){ s_tableAddressStack.pop_back(); } } scope; bool wasnil = false; int nilcount = 0; arraySize = lua_objlen(L, i); int arrayValIndex = lua_gettop(L) + 1; for(int j = 1; j <= arraySize; j++) { lua_rawgeti(L, i, j); bool isnil = lua_isnil(L, arrayValIndex); if(isnil) nilcount++; else { if(wasnil) PushNils(output, nilcount); LuaStackToBinaryConverter(L, arrayValIndex, output); } lua_pop(L, 1); wasnil = isnil; } if(wasnil) PushNils(output, nilcount); if(arraySize) lua_pushinteger(L, arraySize); // before first key else lua_pushnil(L); // before first key int keyIndex = lua_gettop(L); int valueIndex = keyIndex + 1; while(lua_next(L, i)) { assert(lua_type(L, keyIndex) && "nil key in Lua table, impossible"); assert(lua_type(L, valueIndex) && "nil value in Lua table, impossible"); LuaStackToBinaryConverter(L, keyIndex, output); LuaStackToBinaryConverter(L, valueIndex, output); lua_pop(L, 1); hashSize++; } } int outputType = LUAEXT_TTABLE; if(arraySize & 0xFFFF0000) outputType |= LUAEXT_BITS_4A; else if(arraySize & 0xFF00) outputType |= LUAEXT_BITS_2A; else if(arraySize & 0xFF) outputType |= LUAEXT_BITS_1A; if(hashSize & 0xFFFF0000) outputType |= LUAEXT_BITS_4H; else if(hashSize & 0xFF00) outputType |= LUAEXT_BITS_2H; else if(hashSize & 0xFF) outputType |= LUAEXT_BITS_1H; output[outputTypeIndex] = outputType; int insertIndex = outputTypeIndex; if(BITMATCH(outputType,LUAEXT_BITS_4A) || BITMATCH(outputType,LUAEXT_BITS_2A) || BITMATCH(outputType,LUAEXT_BITS_1A)) output.insert(output.begin() + (++insertIndex), arraySize & 0xFF); if(BITMATCH(outputType,LUAEXT_BITS_4A) || BITMATCH(outputType,LUAEXT_BITS_2A)) output.insert(output.begin() + (++insertIndex), (arraySize & 0xFF00) >> 8); if(BITMATCH(outputType,LUAEXT_BITS_4A)) output.insert(output.begin() + (++insertIndex), (arraySize & 0x00FF0000) >> 16), output.insert(output.begin() + (++insertIndex), (arraySize & 0xFF000000) >> 24); if(BITMATCH(outputType,LUAEXT_BITS_4H) || BITMATCH(outputType,LUAEXT_BITS_2H) || BITMATCH(outputType,LUAEXT_BITS_1H)) output.insert(output.begin() + (++insertIndex), hashSize & 0xFF); if(BITMATCH(outputType,LUAEXT_BITS_4H) || BITMATCH(outputType,LUAEXT_BITS_2H)) output.insert(output.begin() + (++insertIndex), (hashSize & 0xFF00) >> 8); if(BITMATCH(outputType,LUAEXT_BITS_4H)) output.insert(output.begin() + (++insertIndex), (hashSize & 0x00FF0000) >> 16), output.insert(output.begin() + (++insertIndex), (hashSize & 0xFF000000) >> 24); } break; } } // complements LuaStackToBinaryConverter void BinaryToLuaStackConverter(lua_State* L, const unsigned char*& data, unsigned int& remaining) { assert(s_dbg_dataSize - (data - s_dbg_dataStart) == remaining); unsigned char type = AdvanceByteStream(data, remaining); switch(type) { default: { //printf("read unknown type %d (0x%x)\n", type, type); //assert(0); LuaContextInfo& info = GetCurrentInfo(); if(info.print) { char errmsg [1024]; if(type <= 10 && type != LUA_TTABLE) sprintf(errmsg, "values of type \"%s\" are not allowed to be loaded into registered load functions. The save state's Lua save data file might be corrupted.\r\n", lua_typename(L,type)); else sprintf(errmsg, "The save state's Lua save data file seems to be corrupted.\r\n"); info.print(luaStateToUIDMap[L->l_G->mainthread], errmsg); } else { if(type <= 10 && type != LUA_TTABLE) fprintf(stderr, "values of type \"%s\" are not allowed to be loaded into registered load functions. The save state's Lua save data file might be corrupted.\n", lua_typename(L,type)); else fprintf(stderr, "The save state's Lua save data file seems to be corrupted.\n"); } } break; case LUA_TNIL: lua_pushnil(L); break; case LUA_TBOOLEAN: lua_pushboolean(L, AdvanceByteStream(data, remaining)); break; case LUA_TSTRING: lua_pushstring(L, (const char*)data); AdvanceByteStream(data, remaining, strlen((const char*)data) + 1); break; case LUA_TNUMBER: lua_pushnumber(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TLONG: lua_pushinteger(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TUSHORT: lua_pushinteger(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TSHORT: lua_pushinteger(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TBYTE: lua_pushinteger(L, AdvanceByteStream(data, remaining)); break; case LUAEXT_TTABLE: case LUAEXT_TTABLE | LUAEXT_BITS_1A: case LUAEXT_TTABLE | LUAEXT_BITS_2A: case LUAEXT_TTABLE | LUAEXT_BITS_4A: case LUAEXT_TTABLE | LUAEXT_BITS_1H: case LUAEXT_TTABLE | LUAEXT_BITS_2H: case LUAEXT_TTABLE | LUAEXT_BITS_4H: case LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_1H: case LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_1H: case LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_1H: case LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_2H: case LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_2H: case LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_2H: case LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_4H: case LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_4H: case LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_4H: { unsigned int arraySize = 0; if(BITMATCH(type,LUAEXT_BITS_4A) || BITMATCH(type,LUAEXT_BITS_2A) || BITMATCH(type,LUAEXT_BITS_1A)) arraySize |= AdvanceByteStream(data, remaining); if(BITMATCH(type,LUAEXT_BITS_4A) || BITMATCH(type,LUAEXT_BITS_2A)) arraySize |= ((u16)AdvanceByteStream(data, remaining)) << 8; if(BITMATCH(type,LUAEXT_BITS_4A)) arraySize |= ((u32)AdvanceByteStream(data, remaining)) << 16, arraySize |= ((u32)AdvanceByteStream(data, remaining)) << 24; unsigned int hashSize = 0; if(BITMATCH(type,LUAEXT_BITS_4H) || BITMATCH(type,LUAEXT_BITS_2H) || BITMATCH(type,LUAEXT_BITS_1H)) hashSize |= AdvanceByteStream(data, remaining); if(BITMATCH(type,LUAEXT_BITS_4H) || BITMATCH(type,LUAEXT_BITS_2H)) hashSize |= ((u16)AdvanceByteStream(data, remaining)) << 8; if(BITMATCH(type,LUAEXT_BITS_4H)) hashSize |= ((u32)AdvanceByteStream(data, remaining)) << 16, hashSize |= ((u32)AdvanceByteStream(data, remaining)) << 24; lua_createtable(L, arraySize, hashSize); unsigned int n = 1; while(n <= arraySize) { if(*data == LUAEXT_TNILS) { AdvanceByteStream(data, remaining, 1); n += AdvanceByteStream(data, remaining); } else { BinaryToLuaStackConverter(L, data, remaining); // push value lua_rawseti(L, -2, n); // table[n] = value n++; } } for(unsigned int h = 1; h <= hashSize; h++) { BinaryToLuaStackConverter(L, data, remaining); // push key BinaryToLuaStackConverter(L, data, remaining); // push value lua_rawset(L, -3); // table[key] = value } } break; } } static const unsigned char luaBinaryMajorVersion = 9; static const unsigned char luaBinaryMinorVersion = 1; unsigned char* LuaStackToBinary(lua_State* L, unsigned int& size) { int n = lua_gettop(L); if(n == 0) return NULL; std::vector output; output.push_back(luaBinaryMajorVersion); output.push_back(luaBinaryMinorVersion); for(int i = 1; i <= n; i++) LuaStackToBinaryConverter(L, i, output); unsigned char* rv = new unsigned char [output.size()]; memcpy(rv, &output.front(), output.size()); size = output.size(); return rv; } void BinaryToLuaStack(lua_State* L, const unsigned char* data, unsigned int size, unsigned int itemsToLoad) { unsigned char major = *data++; unsigned char minor = *data++; size -= 2; if(luaBinaryMajorVersion != major || luaBinaryMinorVersion != minor) return; while(size > 0 && itemsToLoad > 0) { BinaryToLuaStackConverter(L, data, size); itemsToLoad--; } } // saves Lua stack into a record and pops it void LuaSaveData::SaveRecord(int uid, unsigned int key) { LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(!L) return; Record* cur = new Record(); cur->key = key; cur->data = LuaStackToBinary(L, cur->size); cur->next = NULL; lua_settop(L,0); if(cur->size <= 0) { delete cur; return; } Record* last = recordList; while(last && last->next) last = last->next; if(last) last->next = cur; else recordList = cur; } // pushes a record's data onto the Lua stack void LuaSaveData::LoadRecord(int uid, unsigned int key, unsigned int itemsToLoad) const { LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(!L) return; Record* cur = recordList; while(cur) { if(cur->key == key) { s_dbg_dataStart = cur->data; s_dbg_dataSize = cur->size; BinaryToLuaStack(L, cur->data, cur->size, itemsToLoad); return; } cur = cur->next; } } // saves part of the Lua stack (at the given index) into a record and does NOT pop anything void LuaSaveData::SaveRecordPartial(int uid, unsigned int key, int idx) { LuaContextInfo& info = *luaContextInfo[uid]; lua_State* L = info.L; if(!L) return; if(idx < 0) idx += lua_gettop(L)+1; Record* cur = new Record(); cur->key = key; cur->next = NULL; if(idx <= lua_gettop(L)) { std::vector output; output.push_back(luaBinaryMajorVersion); output.push_back(luaBinaryMinorVersion); LuaStackToBinaryConverter(L, idx, output); unsigned char* rv = new unsigned char [output.size()]; memcpy(rv, &output.front(), output.size()); cur->size = output.size(); cur->data = rv; } if(cur->size <= 0) { delete cur; return; } Record* last = recordList; while(last && last->next) last = last->next; if(last) last->next = cur; else recordList = cur; } void fwriteint(unsigned int value, FILE* file) { for(int i=0;i<4;i++) { int w = value & 0xFF; fwrite(&w, 1, 1, file); value >>= 8; } } void freadint(unsigned int& value, FILE* file) { int rv = 0; for(int i=0;i<4;i++) { int r = 0; fread(&r, 1, 1, file); rv |= r << (i*8); } value = rv; } // writes all records to an already-open file void LuaSaveData::ExportRecords(void* fileV) const { FILE* file = (FILE*)fileV; if(!file) return; Record* cur = recordList; while(cur) { fwriteint(cur->key, file); fwriteint(cur->size, file); fwrite(cur->data, cur->size, 1, file); cur = cur->next; } } // reads records from an already-open file void LuaSaveData::ImportRecords(void* fileV) { FILE* file = (FILE*)fileV; if(!file) return; ClearRecords(); Record rec; Record* cur = &rec; Record* last = NULL; while(1) { freadint(cur->key, file); freadint(cur->size, file); if(feof(file) || ferror(file)) break; cur->data = new unsigned char [cur->size]; fread(cur->data, cur->size, 1, file); Record* next = new Record(); memcpy(next, cur, sizeof(Record)); next->next = NULL; if(last) last->next = next; else recordList = next; last = next; } } void LuaSaveData::ClearRecords() { Record* cur = recordList; while(cur) { Record* del = cur; cur = cur->next; delete[] del->data; delete del; } recordList = NULL; } void DontWorryLua() // everything's going to be OK { std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { dontworry(*iter->second); ++iter; } } void EnableStopAllLuaScripts(bool enable) { g_stopAllScriptsEnabled = enable; } void StopAllLuaScripts() { if(!g_stopAllScriptsEnabled) return; std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; bool wasStarted = info.started; StopLuaScript(uid); info.restartLater = wasStarted; ++iter; } } void RestartAllLuaScripts() { if(!g_stopAllScriptsEnabled) return; std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { int uid = iter->first; LuaContextInfo& info = *iter->second; if(info.restartLater || info.started) { info.restartLater = false; RunLuaScriptFile(uid, info.lastFilename.c_str()); } ++iter; } } // sets anything that needs to depend on the total number of scripts running void RefreshScriptStartedStatus() { int numScriptsStarted = 0; std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.started) numScriptsStarted++; ++iter; } // frameadvSkipLagForceDisable = (numScriptsStarted != 0); // disable while scripts are running because currently lag skipping makes lua callbacks get called twice per frame advance g_numScriptsStarted = numScriptsStarted; } // sets anything that needs to depend on speed mode or running status of scripts void RefreshScriptSpeedStatus() { g_anyScriptsHighSpeed = false; std::map::const_iterator iter = luaContextInfo.begin(); std::map::const_iterator end = luaContextInfo.end(); while(iter != end) { LuaContextInfo& info = *iter->second; if(info.running) if(info.speedMode == SPEEDMODE_TURBO || info.speedMode == SPEEDMODE_MAXIMUM) g_anyScriptsHighSpeed = true; ++iter; } } desmume-0.9.9/src/OGLRender.cpp0000644000175000017500000030621112140261633016777 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "OGLRender.h" #include #include #include "debug.h" #include "gfx3d.h" #include "NDSSystem.h" #include "texcache.h" typedef struct { unsigned int major; unsigned int minor; unsigned int revision; } OGLVersion; static OGLVersion _OGLDriverVersion = {0, 0, 0}; static OpenGLRenderer *_OGLRenderer = NULL; static bool isIntel965 = false; // Lookup Tables CACHE_ALIGN GLfloat material_8bit_to_float[256] = {0}; CACHE_ALIGN GLuint dsDepthToD24S8_LUT[32768] = {0}; const GLfloat divide5bitBy31_LUT[32] = {0.0, 0.03225806451613, 0.06451612903226, 0.09677419354839, 0.1290322580645, 0.1612903225806, 0.1935483870968, 0.2258064516129, 0.258064516129, 0.2903225806452, 0.3225806451613, 0.3548387096774, 0.3870967741935, 0.4193548387097, 0.4516129032258, 0.4838709677419, 0.5161290322581, 0.5483870967742, 0.5806451612903, 0.6129032258065, 0.6451612903226, 0.6774193548387, 0.7096774193548, 0.741935483871, 0.7741935483871, 0.8064516129032, 0.8387096774194, 0.8709677419355, 0.9032258064516, 0.9354838709677, 0.9677419354839, 1.0}; static bool BEGINGL() { if(oglrender_beginOpenGL) return oglrender_beginOpenGL(); else return true; } static void ENDGL() { if(oglrender_endOpenGL) oglrender_endOpenGL(); } // Function Pointers bool (*oglrender_init)() = NULL; bool (*oglrender_beginOpenGL)() = NULL; void (*oglrender_endOpenGL)() = NULL; void (*OGLLoadEntryPoints_3_2_Func)() = NULL; void (*OGLCreateRenderer_3_2_Func)(OpenGLRenderer **rendererPtr) = NULL; //------------------------------------------------------------ // Textures #if !defined(GLX_H) OGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3 OGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB) #endif // Blending OGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4 OGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0 OGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT) OGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT) // Shaders OGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0 OGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0 OGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0 OGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0 OGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0 OGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0 OGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0 OGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0 OGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0 OGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0 OGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0 OGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0 OGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0 OGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0 OGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0 OGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0 OGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0 OGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0 OGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0 OGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0 OGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 OGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0 OGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0 OGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0 OGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0 // VAO OGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) OGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) OGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // Buffer Objects OGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB) OGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB) OGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB) OGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB) OGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB) OGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB) OGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB) OGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5 OGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5 OGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5 OGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5 OGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5 OGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5 OGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5 // FBO OGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT) OGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT) OGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT) OGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT) OGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT) OGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT) OGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT) OGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT) OGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT) OGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT) OGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT) OGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT) static void OGLLoadEntryPoints_Legacy() { // Textures #if !defined(GLX_H) INITOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3 INITOGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB) #endif // Blending INITOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4 INITOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0 INITOGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT) INITOGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT) // Shaders INITOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0 INITOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0 INITOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0 INITOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0 INITOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0 INITOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0 INITOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0 INITOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0 INITOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0 INITOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0 INITOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0 INITOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0 INITOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0 INITOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0 INITOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0 INITOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0 INITOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0 INITOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0 INITOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0 INITOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0 INITOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0 INITOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0 INITOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0 INITOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0 INITOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0 // VAO INITOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) INITOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) INITOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // Buffer Objects INITOGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB) INITOGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB) INITOGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB) INITOGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB) INITOGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB) INITOGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB) INITOGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB) INITOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5 INITOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5 INITOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5 INITOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5 INITOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5 INITOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5 INITOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5 // FBO INITOGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT) INITOGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT) INITOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT) INITOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT) INITOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT) INITOGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT) INITOGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT) INITOGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT) INITOGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT) INITOGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT) INITOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT) INITOGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT) } // Vertex Shader GLSL 1.00 static const char *vertexShader_100 = {"\ attribute vec4 inPosition; \n\ attribute vec2 inTexCoord0; \n\ attribute vec3 inColor; \n\ \n\ uniform float polyAlpha; \n\ uniform vec2 texScale; \n\ \n\ varying vec4 vtxPosition; \n\ varying vec2 vtxTexCoord; \n\ varying vec4 vtxColor; \n\ \n\ void main() \n\ { \n\ mat2 texScaleMtx = mat2( vec2(texScale.x, 0.0), \n\ vec2( 0.0, texScale.y)); \n\ \n\ vtxPosition = inPosition; \n\ vtxTexCoord = texScaleMtx * inTexCoord0; \n\ vtxColor = vec4(inColor * 4.0, polyAlpha); \n\ \n\ gl_Position = vtxPosition; \n\ } \n\ "}; // Fragment Shader GLSL 1.00 static const char *fragmentShader_100 = {"\ varying vec4 vtxPosition; \n\ varying vec2 vtxTexCoord; \n\ varying vec4 vtxColor; \n\ \n\ uniform sampler2D texMainRender; \n\ uniform sampler1D texToonTable; \n\ uniform int polyID; \n\ uniform bool hasTexture; \n\ uniform int polygonMode; \n\ uniform int toonShadingMode; \n\ uniform int oglWBuffer; \n\ uniform bool enableAlphaTest; \n\ uniform float alphaTestRef; \n\ \n\ void main() \n\ { \n\ vec4 texColor = vec4(1.0, 1.0, 1.0, 1.0); \n\ vec4 fragColor; \n\ \n\ if(hasTexture) \n\ { \n\ texColor = texture2D(texMainRender, vtxTexCoord); \n\ } \n\ \n\ fragColor = texColor; \n\ \n\ if(polygonMode == 0) \n\ { \n\ fragColor = vtxColor * texColor; \n\ } \n\ else if(polygonMode == 1) \n\ { \n\ if (texColor.a == 0.0 || !hasTexture) \n\ { \n\ fragColor.rgb = vtxColor.rgb; \n\ } \n\ else if (texColor.a == 1.0) \n\ { \n\ fragColor.rgb = texColor.rgb; \n\ } \n\ else \n\ { \n\ fragColor.rgb = texColor.rgb * (1.0-texColor.a) + vtxColor.rgb * texColor.a;\n\ } \n\ \n\ fragColor.a = vtxColor.a; \n\ } \n\ else if(polygonMode == 2) \n\ { \n\ if (toonShadingMode == 0) \n\ { \n\ vec3 toonColor = vec3(texture1D(texToonTable, vtxColor.r).rgb); \n\ fragColor.rgb = texColor.rgb * toonColor.rgb;\n\ fragColor.a = texColor.a * vtxColor.a;\n\ } \n\ else \n\ { \n\ vec3 toonColor = vec3(texture1D(texToonTable, vtxColor.r).rgb); \n\ fragColor.rgb = texColor.rgb * vtxColor.rgb + toonColor.rgb; \n\ fragColor.a = texColor.a * vtxColor.a; \n\ } \n\ } \n\ else if(polygonMode == 3) \n\ { \n\ if (polyID != 0) \n\ { \n\ fragColor = vtxColor; \n\ } \n\ } \n\ \n\ if (fragColor.a == 0.0 || (enableAlphaTest && fragColor.a < alphaTestRef)) \n\ { \n\ discard; \n\ } \n\ \n\ #ifdef WANT_DEPTHLOGIC \n\ if (oglWBuffer == 1) \n\ { \n\ // TODO \n\ gl_FragDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \n\ } \n\ else \n\ { \n\ gl_FragDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \n\ } \n\ #endif //WANT_DEPTHLOGIC \n\ \n\ gl_FragColor = fragColor; \n\ } \n\ "}; FORCEINLINE u32 BGRA8888_32_To_RGBA6665_32(const u32 srcPix) { const u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F; return (dstPix & 0x0000FF00) << 16 | // R (dstPix & 0x00FF0000) | // G (dstPix & 0xFF000000) >> 16 | // B ((dstPix >> 1) & 0x000000FF); // A } FORCEINLINE u32 BGRA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix) { const u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F; return (dstPix & 0x00FF0000) >> 16 | // R (dstPix & 0x0000FF00) | // G (dstPix & 0x000000FF) << 16 | // B ((dstPix >> 1) & 0xFF000000); // A } //opengl state caching: //This is of dubious performance assistance, but it is easy to take out so I am leaving it for now. //every function that is xgl* can be replaced with gl* if we decide to rip this out or if anyone else //doesnt feel like sticking with it (or if it causes trouble) struct GLCaps { u8 caps[0x100]; GLCaps() { memset(caps,0xFF,sizeof(caps)); } }; static GLCaps glcaps; static void _xglEnable(GLenum cap) { cap -= 0x0B00; if(glcaps.caps[cap] == 0xFF || glcaps.caps[cap] == 0) { glEnable(cap+0x0B00); glcaps.caps[cap] = 1; } } static void _xglDisable(GLenum cap) { cap -= 0x0B00; if(glcaps.caps[cap]) { glDisable(cap+0x0B00); glcaps.caps[cap] = 0; } } #define xglEnable(cap) { \ CTASSERT((cap-0x0B00)<0x100); \ _xglEnable(cap); } #define xglDisable(cap) {\ CTASSERT((cap-0x0B00)<0x100); \ _xglDisable(cap); } bool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor, unsigned int checkVersionRevision) { bool result = false; if ( (_OGLDriverVersion.major > checkVersionMajor) || (_OGLDriverVersion.major >= checkVersionMajor && _OGLDriverVersion.minor > checkVersionMinor) || (_OGLDriverVersion.major >= checkVersionMajor && _OGLDriverVersion.minor >= checkVersionMinor && _OGLDriverVersion.revision >= checkVersionRevision) ) { result = true; } return result; } static void OGLGetDriverVersion(const char *oglVersionString, unsigned int *versionMajor, unsigned int *versionMinor, unsigned int *versionRevision) { size_t versionStringLength = 0; if (oglVersionString == NULL) { return; } // First, check for the dot in the revision string. There should be at // least one present. const char *versionStrEnd = strstr(oglVersionString, "."); if (versionStrEnd == NULL) { return; } // Next, check for the space before the vendor-specific info (if present). versionStrEnd = strstr(oglVersionString, " "); if (versionStrEnd == NULL) { // If a space was not found, then the vendor-specific info is not present, // and therefore the entire string must be the version number. versionStringLength = strlen(oglVersionString); } else { // If a space was found, then the vendor-specific info is present, // and therefore the version number is everything before the space. versionStringLength = versionStrEnd - oglVersionString; } // Copy the version substring and parse it. char *versionSubstring = (char *)malloc(versionStringLength * sizeof(char)); strncpy(versionSubstring, oglVersionString, versionStringLength); unsigned int major = 0; unsigned int minor = 0; unsigned int revision = 0; sscanf(versionSubstring, "%u.%u.%u", &major, &minor, &revision); free(versionSubstring); versionSubstring = NULL; if (versionMajor != NULL) { *versionMajor = major; } if (versionMinor != NULL) { *versionMinor = minor; } if (versionRevision != NULL) { *versionRevision = revision; } } static void texDeleteCallback(TexCacheItem *item) { _OGLRenderer->DeleteTexture(item); } template static char OGLInit(void) { char result = 0; Render3DError error = OGLERROR_NOERR; if(!oglrender_init) return result; if(!oglrender_init()) return result; result = Default3D_Init(); if (result == 0) { return result; } if(!BEGINGL()) { INFO("OpenGL<%s,%s>: Could not initialize -- BEGINGL() failed.\n",require_profile?"force":"auto",enable_3_2?"3_2":"old"); result = 0; return result; } // Get OpenGL info const char *oglVersionString = (const char *)glGetString(GL_VERSION); const char *oglVendorString = (const char *)glGetString(GL_VENDOR); const char *oglRendererString = (const char *)glGetString(GL_RENDERER); if(!strcmp(oglVendorString,"Intel") && strstr(oglRendererString,"965")) isIntel965 = true; // Check the driver's OpenGL version OGLGetDriverVersion(oglVersionString, &_OGLDriverVersion.major, &_OGLDriverVersion.minor, &_OGLDriverVersion.revision); if (!IsVersionSupported(OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION)) { INFO("OpenGL: Driver does not support OpenGL v%u.%u.%u or later. Disabling 3D renderer.\n[ Driver Info -\n Version: %s\n Vendor: %s\n Renderer: %s ]\n", OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION, oglVersionString, oglVendorString, oglRendererString); result = 0; return result; } // Create new OpenGL rendering object if(enable_3_2) { if (OGLLoadEntryPoints_3_2_Func != NULL && OGLCreateRenderer_3_2_Func != NULL) { OGLLoadEntryPoints_3_2_Func(); OGLLoadEntryPoints_Legacy(); //zero 04-feb-2013 - this seems to be necessary as well OGLCreateRenderer_3_2_Func(&_OGLRenderer); } else { if(require_profile) return 0; } } // If the renderer doesn't initialize with OpenGL v3.2 or higher, fall back // to one of the lower versions. if (_OGLRenderer == NULL) { OGLLoadEntryPoints_Legacy(); if (IsVersionSupported(2, 1, 0)) { _OGLRenderer = new OpenGLRenderer_2_1; _OGLRenderer->SetVersion(2, 1, 0); } else if (IsVersionSupported(2, 0, 0)) { _OGLRenderer = new OpenGLRenderer_2_0; _OGLRenderer->SetVersion(2, 0, 0); } else if (IsVersionSupported(1, 5, 0)) { _OGLRenderer = new OpenGLRenderer_1_5; _OGLRenderer->SetVersion(1, 5, 0); } else if (IsVersionSupported(1, 4, 0)) { _OGLRenderer = new OpenGLRenderer_1_4; _OGLRenderer->SetVersion(1, 4, 0); } else if (IsVersionSupported(1, 3, 0)) { _OGLRenderer = new OpenGLRenderer_1_3; _OGLRenderer->SetVersion(1, 3, 0); } else if (IsVersionSupported(1, 2, 0)) { _OGLRenderer = new OpenGLRenderer_1_2; _OGLRenderer->SetVersion(1, 2, 0); } } if (_OGLRenderer == NULL) { INFO("OpenGL: Renderer did not initialize. Disabling 3D renderer.\n[ Driver Info -\n Version: %s\n Vendor: %s\n Renderer: %s ]\n", oglVersionString, oglVendorString, oglRendererString); result = 0; return result; } // Initialize OpenGL extensions error = _OGLRenderer->InitExtensions(); if (error != OGLERROR_NOERR) { if ( IsVersionSupported(2, 0, 0) && (error == OGLERROR_SHADER_CREATE_ERROR || error == OGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR || error == OGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR) ) { INFO("OpenGL: Shaders are not working, even though they should be. Disabling 3D renderer.\n"); result = 0; return result; } else if (IsVersionSupported(3, 0, 0) && error == OGLERROR_FBO_CREATE_ERROR && OGLLoadEntryPoints_3_2_Func != NULL) { INFO("OpenGL: FBOs are not working, even though they should be. Disabling 3D renderer.\n"); result = 0; return result; } } // Initialization finished -- reset the renderer _OGLRenderer->Reset(); ENDGL(); unsigned int major = 0; unsigned int minor = 0; unsigned int revision = 0; _OGLRenderer->GetVersion(&major, &minor, &revision); INFO("OpenGL: Renderer initialized successfully (v%u.%u.%u).\n[ Driver Info -\n Version: %s\n Vendor: %s\n Renderer: %s ]\n", major, minor, revision, oglVersionString, oglVendorString, oglRendererString); return result; } static void OGLReset() { if(!BEGINGL()) return; _OGLRenderer->Reset(); ENDGL(); } static void OGLClose() { if(!BEGINGL()) return; delete _OGLRenderer; _OGLRenderer = NULL; ENDGL(); Default3D_Close(); } static void OGLRender() { if(!BEGINGL()) return; _OGLRenderer->Render(&gfx3d.renderState, gfx3d.vertlist, gfx3d.polylist, &gfx3d.indexlist, gfx3d.frameCtr); ENDGL(); } static void OGLVramReconfigureSignal() { if(!BEGINGL()) return; _OGLRenderer->VramReconfigureSignal(); ENDGL(); } static void OGLRenderFinish() { if(!BEGINGL()) return; _OGLRenderer->RenderFinish(); ENDGL(); } //automatically select 3.2 or old profile depending on whether 3.2 is available GPU3DInterface gpu3Dgl = { "OpenGL", OGLInit, OGLReset, OGLClose, OGLRender, OGLRenderFinish, OGLVramReconfigureSignal }; //forcibly use old profile GPU3DInterface gpu3DglOld = { "OpenGL Old", OGLInit, OGLReset, OGLClose, OGLRender, OGLRenderFinish, OGLVramReconfigureSignal }; //forcibly use new profile GPU3DInterface gpu3Dgl_3_2 = { "OpenGL 3.2", OGLInit, OGLReset, OGLClose, OGLRender, OGLRenderFinish, OGLVramReconfigureSignal }; OpenGLRenderer::OpenGLRenderer() { versionMajor = 0; versionMinor = 0; versionRevision = 0; } bool OpenGLRenderer::IsExtensionPresent(const std::set *oglExtensionSet, const std::string extensionName) const { if (oglExtensionSet == NULL || oglExtensionSet->size() == 0) { return false; } return (oglExtensionSet->find(extensionName) != oglExtensionSet->end()); } bool OpenGLRenderer::ValidateShaderCompile(GLuint theShader) const { bool isCompileValid = false; GLint status = GL_FALSE; glGetShaderiv(theShader, GL_COMPILE_STATUS, &status); if(status == GL_TRUE) { isCompileValid = true; } else { GLint logSize; GLchar *log = NULL; glGetShaderiv(theShader, GL_INFO_LOG_LENGTH, &logSize); log = new GLchar[logSize]; glGetShaderInfoLog(theShader, logSize, &logSize, log); INFO("OpenGL: SEVERE - FAILED TO COMPILE SHADER : %s\n", log); delete[] log; } return isCompileValid; } bool OpenGLRenderer::ValidateShaderProgramLink(GLuint theProgram) const { bool isLinkValid = false; GLint status = GL_FALSE; glGetProgramiv(theProgram, GL_LINK_STATUS, &status); if(status == GL_TRUE) { isLinkValid = true; } else { GLint logSize; GLchar *log = NULL; glGetProgramiv(theProgram, GL_INFO_LOG_LENGTH, &logSize); log = new GLchar[logSize]; glGetProgramInfoLog(theProgram, logSize, &logSize, log); INFO("OpenGL: SEVERE - FAILED TO LINK SHADER PROGRAM : %s\n", log); delete[] log; } return isLinkValid; } void OpenGLRenderer::GetVersion(unsigned int *major, unsigned int *minor, unsigned int *revision) const { *major = this->versionMajor; *minor = this->versionMinor; *revision = this->versionRevision; } void OpenGLRenderer::SetVersion(unsigned int major, unsigned int minor, unsigned int revision) { this->versionMajor = major; this->versionMinor = minor; this->versionRevision = revision; } void OpenGLRenderer::ConvertFramebuffer(const u32 *__restrict srcBuffer, u32 *dstBuffer) { if (srcBuffer == NULL || dstBuffer == NULL) { return; } // Convert from 32-bit BGRA8888 format to 32-bit RGBA6665 reversed format. OpenGL // stores pixels using a flipped Y-coordinate, so this needs to be flipped back // to the DS Y-coordinate. for(int i = 0, y = 191; y >= 0; y--) { u32 *__restrict dst = dstBuffer + (y << 8); // Same as dstBuffer + (y * 256) for(unsigned int x = 0; x < 256; x++, i++) { // Use the correct endian format since OpenGL uses the native endian of // the architecture it is running on. #ifdef WORDS_BIGENDIAN *dst++ = BGRA8888_32_To_RGBA6665_32(srcBuffer[i]); #else *dst++ = BGRA8888_32Rev_To_RGBA6665_32Rev(srcBuffer[i]); #endif } } } OpenGLRenderer_1_2::OpenGLRenderer_1_2() { isVBOSupported = false; isPBOSupported = false; isFBOSupported = false; isMultisampledFBOSupported = false; isShaderSupported = false; isVAOSupported = false; // Init OpenGL rendering states ref = new OGLRenderRef; } OpenGLRenderer_1_2::~OpenGLRenderer_1_2() { if (ref == NULL) { return; } glFinish(); gpuScreen3DHasNewData[0] = false; gpuScreen3DHasNewData[1] = false; delete [] ref->color4fBuffer; ref->color4fBuffer = NULL; DestroyShaders(); DestroyVAOs(); DestroyVBOs(); DestroyPBOs(); DestroyFBOs(); DestroyMultisampledFBO(); //kill the tex cache to free all the texture ids TexCache_Reset(); glBindTexture(GL_TEXTURE_2D, 0); while(!ref->freeTextureIDs.empty()) { GLuint temp = ref->freeTextureIDs.front(); ref->freeTextureIDs.pop(); glDeleteTextures(1, &temp); } glFinish(); // Destroy OpenGL rendering states delete ref; ref = NULL; } Render3DError OpenGLRenderer_1_2::InitExtensions() { Render3DError error = OGLERROR_NOERR; OGLRenderRef &OGLRef = *this->ref; // Get OpenGL extensions std::set oglExtensionSet; this->GetExtensionSet(&oglExtensionSet); // Initialize OpenGL this->InitTables(); this->isShaderSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_shader_objects") && this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_shader") && this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_fragment_shader") && this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_program"); if (this->isShaderSupported) { std::string vertexShaderProgram; std::string fragmentShaderProgram; error = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram); if (error == OGLERROR_NOERR) { error = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram); if (error != OGLERROR_NOERR) { this->isShaderSupported = false; if (error == OGLERROR_SHADER_CREATE_ERROR) { return error; } } else { this->CreateToonTable(); } } else { this->isShaderSupported = false; } } else { INFO("OpenGL: Shaders are unsupported. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); } this->isVBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_buffer_object"); if (this->isVBOSupported) { this->CreateVBOs(); } #if !defined(GL_ARB_pixel_buffer_object) && !defined(GL_EXT_pixel_buffer_object) this->isPBOSupported = false; #else this->isPBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_buffer_object") && (this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_pixel_buffer_object") || this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_pixel_buffer_object")); #endif if (this->isPBOSupported) { this->CreatePBOs(); } #if !defined(GL_ARB_vertex_array_object) && !defined(GL_APPLE_vertex_array_object) this->isVAOSupported = false; #else this->isVAOSupported = this->isShaderSupported && this->isVBOSupported && (this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_array_object") || this->IsExtensionPresent(&oglExtensionSet, "GL_APPLE_vertex_array_object")); #endif if (this->isVAOSupported) { this->CreateVAOs(); } // Don't use ARB versions since we're using the EXT versions for backwards compatibility. #if !defined(GL_EXT_framebuffer_object) || \ !defined(GL_EXT_framebuffer_blit) || \ !defined(GL_EXT_packed_depth_stencil) this->isFBOSupported = false; #else this->isFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil"); #endif if (this->isFBOSupported) { error = this->CreateFBOs(); if (error != OGLERROR_NOERR) { OGLRef.fboFinalOutputID = 0; this->isFBOSupported = false; } } else { OGLRef.fboFinalOutputID = 0; INFO("OpenGL: FBOs are unsupported. Some emulation features will be disabled.\n"); } // Don't use ARB versions since we're using the EXT versions for backwards compatibility. #if !defined(GL_EXT_framebuffer_object) || \ !defined(GL_EXT_framebuffer_multisample) || \ !defined(GL_EXT_framebuffer_blit) || \ !defined(GL_EXT_packed_depth_stencil) this->isMultisampledFBOSupported = false; #else this->isMultisampledFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_multisample"); #endif if (this->isMultisampledFBOSupported) { error = this->CreateMultisampledFBO(); if (error != OGLERROR_NOERR) { OGLRef.selectedRenderingFBO = 0; this->isMultisampledFBOSupported = false; } } else { OGLRef.selectedRenderingFBO = 0; INFO("OpenGL: Multisampled FBOs are unsupported. Multisample antialiasing will be disabled.\n"); } this->InitTextures(); this->InitFinalRenderStates(&oglExtensionSet); // This must be done last return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::CreateVBOs() { OGLRenderRef &OGLRef = *this->ref; glGenBuffersARB(1, &OGLRef.vboVertexID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID); glBufferDataARB(GL_ARRAY_BUFFER_ARB, VERTLIST_SIZE * sizeof(VERT), NULL, GL_STREAM_DRAW_ARB); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glGenBuffersARB(1, &OGLRef.iboIndexID); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort), NULL, GL_STREAM_DRAW_ARB); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyVBOs() { if (!this->isVBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glDeleteBuffersARB(1, &OGLRef.vboVertexID); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); glDeleteBuffersARB(1, &OGLRef.iboIndexID); this->isVBOSupported = false; } Render3DError OpenGLRenderer_1_2::CreatePBOs() { glGenBuffersARB(2, this->ref->pboRenderDataID); for (unsigned int i = 0; i < 2; i++) { glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]); glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, 256 * 192 * sizeof(u32), NULL, GL_STREAM_READ_ARB); } glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyPBOs() { if (!this->isPBOSupported) { return; } glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); glDeleteBuffersARB(2, this->ref->pboRenderDataID); this->isPBOSupported = false; } Render3DError OpenGLRenderer_1_2::LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram) { outVertexShaderProgram->clear(); outFragmentShaderProgram->clear(); //not only does this hardware not work, it flat-out freezes the system. //the problem is due to writing gl_FragDepth (it seems theres no way to successfully use it) //so, we disable that feature. it still works pretty well. if(isIntel965) *outFragmentShaderProgram = std::string("#define WANT_DEPTHLOGIC\n"); *outVertexShaderProgram += std::string(vertexShader_100); *outFragmentShaderProgram += std::string(fragmentShader_100); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupShaderIO() { OGLRenderRef &OGLRef = *this->ref; glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_TexCoord0, "inTexCoord0"); glBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Color, "inColor"); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram) { OGLRenderRef &OGLRef = *this->ref; OGLRef.vertexShaderID = glCreateShader(GL_VERTEX_SHADER); if(!OGLRef.vertexShaderID) { INFO("OpenGL: Failed to create the vertex shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } const char *vertexShaderProgramChar = vertexShaderProgram->c_str(); glShaderSource(OGLRef.vertexShaderID, 1, (const GLchar **)&vertexShaderProgramChar, NULL); glCompileShader(OGLRef.vertexShaderID); if (!this->ValidateShaderCompile(OGLRef.vertexShaderID)) { glDeleteShader(OGLRef.vertexShaderID); INFO("OpenGL: Failed to compile the vertex shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } OGLRef.fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); if(!OGLRef.fragmentShaderID) { glDeleteShader(OGLRef.vertexShaderID); INFO("OpenGL: Failed to create the fragment shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } const char *fragmentShaderProgramChar = fragmentShaderProgram->c_str(); glShaderSource(OGLRef.fragmentShaderID, 1, (const GLchar **)&fragmentShaderProgramChar, NULL); glCompileShader(OGLRef.fragmentShaderID); if (!this->ValidateShaderCompile(OGLRef.fragmentShaderID)) { glDeleteShader(OGLRef.vertexShaderID); glDeleteShader(OGLRef.fragmentShaderID); INFO("OpenGL: Failed to compile the fragment shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } OGLRef.shaderProgram = glCreateProgram(); if(!OGLRef.shaderProgram) { glDeleteShader(OGLRef.vertexShaderID); glDeleteShader(OGLRef.fragmentShaderID); INFO("OpenGL: Failed to create the shader program. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } glAttachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID); glAttachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID); this->SetupShaderIO(); glLinkProgram(OGLRef.shaderProgram); if (!this->ValidateShaderProgramLink(OGLRef.shaderProgram)) { glDetachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID); glDetachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID); glDeleteProgram(OGLRef.shaderProgram); glDeleteShader(OGLRef.vertexShaderID); glDeleteShader(OGLRef.fragmentShaderID); INFO("OpenGL: Failed to link the shader program. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\n"); return OGLERROR_SHADER_CREATE_ERROR; } glValidateProgram(OGLRef.shaderProgram); glUseProgram(OGLRef.shaderProgram); // Set up shader uniforms GLint uniformTexSampler = glGetUniformLocation(OGLRef.shaderProgram, "texMainRender"); glUniform1i(uniformTexSampler, 0); uniformTexSampler = glGetUniformLocation(OGLRef.shaderProgram, "texToonTable"); glUniform1i(uniformTexSampler, OGLTextureUnitID_ToonTable); OGLRef.uniformPolyAlpha = glGetUniformLocation(OGLRef.shaderProgram, "polyAlpha"); OGLRef.uniformTexScale = glGetUniformLocation(OGLRef.shaderProgram, "texScale"); OGLRef.uniformPolyID = glGetUniformLocation(OGLRef.shaderProgram, "polyID"); OGLRef.uniformHasTexture = glGetUniformLocation(OGLRef.shaderProgram, "hasTexture"); OGLRef.uniformPolygonMode = glGetUniformLocation(OGLRef.shaderProgram, "polygonMode"); OGLRef.uniformToonShadingMode = glGetUniformLocation(OGLRef.shaderProgram, "toonShadingMode"); OGLRef.uniformWBuffer = glGetUniformLocation(OGLRef.shaderProgram, "oglWBuffer"); OGLRef.uniformEnableAlphaTest = glGetUniformLocation(OGLRef.shaderProgram, "enableAlphaTest"); OGLRef.uniformAlphaTestRef = glGetUniformLocation(OGLRef.shaderProgram, "alphaTestRef"); INFO("OpenGL: Successfully created shaders.\n"); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyShaders() { if(!this->isShaderSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glUseProgram(0); glDetachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID); glDetachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID); glDeleteProgram(OGLRef.shaderProgram); glDeleteShader(OGLRef.vertexShaderID); glDeleteShader(OGLRef.fragmentShaderID); this->DestroyToonTable(); this->isShaderSupported = false; } Render3DError OpenGLRenderer_1_2::CreateVAOs() { OGLRenderRef &OGLRef = *this->ref; glGenVertexArrays(1, &OGLRef.vaoMainStatesID); glBindVertexArray(OGLRef.vaoMainStatesID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); glBindVertexArray(0); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyVAOs() { if (!this->isVAOSupported) { return; } glBindVertexArray(0); glDeleteVertexArrays(1, &this->ref->vaoMainStatesID); this->isVAOSupported = false; } Render3DError OpenGLRenderer_1_2::CreateFBOs() { OGLRenderRef &OGLRef = *this->ref; // Set up FBO render targets this->CreateClearImage(); // Set up FBOs glGenFramebuffersEXT(1, &OGLRef.fboClearImageID); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboClearImageID); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, OGLRef.texClearImageColorID, 0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0); if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { INFO("OpenGL: Failed to created FBOs. Some emulation features will be disabled.\n"); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1, &OGLRef.fboClearImageID); this->DestroyClearImage(); this->isFBOSupported = false; return OGLERROR_FBO_CREATE_ERROR; } // Set up final output FBO OGLRef.fboFinalOutputID = 0; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboFinalOutputID); INFO("OpenGL: Successfully created FBOs.\n"); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyFBOs() { if (!this->isFBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1, &OGLRef.fboClearImageID); this->DestroyClearImage(); this->isFBOSupported = false; } Render3DError OpenGLRenderer_1_2::CreateMultisampledFBO() { // Check the maximum number of samples that the driver supports and use that. // Since our target resolution is only 256x192 pixels, using the most samples // possible is the best thing to do. GLint maxSamples = 0; glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSamples); if (maxSamples < 2) { INFO("OpenGL: Driver does not support at least 2x multisampled FBOs. Multisample antialiasing will be disabled.\n"); return OGLERROR_FEATURE_UNSUPPORTED; } else if (maxSamples > OGLRENDER_MAX_MULTISAMPLES) { maxSamples = OGLRENDER_MAX_MULTISAMPLES; } OGLRenderRef &OGLRef = *this->ref; // Set up FBO render targets glGenRenderbuffersEXT(1, &OGLRef.rboMultisampleColorID); glGenRenderbuffersEXT(1, &OGLRef.rboMultisampleDepthStencilID); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleColorID); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamples, GL_RGBA, 256, 192); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleDepthStencilID); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamples, GL_DEPTH24_STENCIL8_EXT, 256, 192); // Set up multisampled rendering FBO glGenFramebuffersEXT(1, &OGLRef.fboMultisampleRenderID); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboMultisampleRenderID); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleColorID); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleDepthStencilID); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleDepthStencilID); if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { INFO("OpenGL: Failed to create multisampled FBO. Multisample antialiasing will be disabled.\n"); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1, &OGLRef.fboMultisampleRenderID); glDeleteRenderbuffersEXT(1, &OGLRef.rboMultisampleColorID); glDeleteRenderbuffersEXT(1, &OGLRef.rboMultisampleDepthStencilID); return OGLERROR_FBO_CREATE_ERROR; } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboFinalOutputID); INFO("OpenGL: Successfully created multisampled FBO.\n"); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::DestroyMultisampledFBO() { if (!this->isMultisampledFBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1, &OGLRef.fboMultisampleRenderID); glDeleteRenderbuffersEXT(1, &OGLRef.rboMultisampleColorID); glDeleteRenderbuffersEXT(1, &OGLRef.rboMultisampleDepthStencilID); this->isMultisampledFBOSupported = false; } Render3DError OpenGLRenderer_1_2::InitFinalRenderStates(const std::set *oglExtensionSet) { OGLRenderRef &OGLRef = *this->ref; bool isTexMirroredRepeatSupported = this->IsExtensionPresent(oglExtensionSet, "GL_ARB_texture_mirrored_repeat"); bool isBlendFuncSeparateSupported = this->IsExtensionPresent(oglExtensionSet, "GL_EXT_blend_func_separate"); bool isBlendEquationSeparateSupported = this->IsExtensionPresent(oglExtensionSet, "GL_EXT_blend_equation_separate"); // Blending Support if (isBlendFuncSeparateSupported) { if (isBlendEquationSeparateSupported) { // we want to use alpha destination blending so we can track the last-rendered alpha value // test: new super mario brothers renders the stormclouds at the beginning glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA); glBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX); } else { glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_DST_ALPHA); } } else { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } // Mirrored Repeat Mode Support OGLRef.stateTexMirroredRepeat = isTexMirroredRepeatSupported ? GL_MIRRORED_REPEAT : GL_REPEAT; // Always enable depth test, and control using glDepthMask(). glEnable(GL_DEPTH_TEST); // Map the vertex list's colors with 4 floats per color. This is being done // because OpenGL needs 4-colors per vertex to support translucency. (The DS // uses 3-colors per vertex, and adds alpha through the poly, so we can't // simply reference the colors+alpha from just the vertices by themselves.) OGLRef.color4fBuffer = this->isShaderSupported ? NULL : new GLfloat[VERTLIST_SIZE * 4]; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::InitTextures() { this->ExpandFreeTextures(); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::InitTables() { static bool needTableInit = true; if (needTableInit) { for (unsigned int i = 0; i < 256; i++) material_8bit_to_float[i] = (GLfloat)(i * 4) / 255.0f; for (unsigned int i = 0; i < 32768; i++) dsDepthToD24S8_LUT[i] = (GLuint)DS_DEPTH15TO24(i) << 8; needTableInit = false; } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::CreateToonTable() { OGLRenderRef &OGLRef = *this->ref; // The toon table is a special 1D texture where each pixel corresponds // to a specific color in the toon table. glGenTextures(1, &OGLRef.texToonTableID); glActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ToonTable); glBindTexture(GL_TEXTURE_1D, OGLRef.texToonTableID); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_1D, 0); glActiveTextureARB(GL_TEXTURE0_ARB); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DestroyToonTable() { glActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ToonTable); glBindTexture(GL_TEXTURE_1D, 0); glActiveTextureARB(GL_TEXTURE0_ARB); glDeleteTextures(1, &this->ref->texToonTableID); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::UploadToonTable(const GLushort *toonTableBuffer) { glActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ToonTable); glBindTexture(GL_TEXTURE_1D, this->ref->texToonTableID); glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, toonTableBuffer); glActiveTextureARB(GL_TEXTURE0_ARB); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::CreateClearImage() { OGLRenderRef &OGLRef = *this->ref; glGenTextures(1, &OGLRef.texClearImageColorID); glGenTextures(1, &OGLRef.texClearImageDepthStencilID); glActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ClearImage); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, 256, 192, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL); glActiveTextureARB(GL_TEXTURE0_ARB); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DestroyClearImage() { OGLRenderRef &OGLRef = *this->ref; glActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ClearImage); glBindTexture(GL_TEXTURE_2D, 0); glActiveTextureARB(GL_TEXTURE0_ARB); glDeleteTextures(1, &OGLRef.texClearImageColorID); glDeleteTextures(1, &OGLRef.texClearImageDepthStencilID); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer) { OGLRenderRef &OGLRef = *this->ref; glActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ClearImage); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, clearImageColorBuffer); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, clearImageDepthBuffer); glBindTexture(GL_TEXTURE_2D, 0); glActiveTextureARB(GL_TEXTURE0_ARB); return OGLERROR_NOERR; } void OpenGLRenderer_1_2::GetExtensionSet(std::set *oglExtensionSet) { std::string oglExtensionString = std::string((const char *)glGetString(GL_EXTENSIONS)); size_t extStringStartLoc = 0; size_t delimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc); while (delimiterLoc != std::string::npos) { std::string extensionName = oglExtensionString.substr(extStringStartLoc, delimiterLoc - extStringStartLoc); oglExtensionSet->insert(extensionName); extStringStartLoc = delimiterLoc + 1; delimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc); } if (extStringStartLoc - oglExtensionString.length() > 0) { std::string extensionName = oglExtensionString.substr(extStringStartLoc, oglExtensionString.length() - extStringStartLoc); oglExtensionSet->insert(extensionName); } } Render3DError OpenGLRenderer_1_2::ExpandFreeTextures() { static const int kInitTextures = 128; GLuint oglTempTextureID[kInitTextures]; glGenTextures(kInitTextures, oglTempTextureID); for(int i=0;iref->freeTextureIDs.push(oglTempTextureID[i]); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount) { OGLRenderRef &OGLRef = *this->ref; const unsigned int polyCount = polyList->count; unsigned int vertIndexCount = 0; for(unsigned int i = 0; i < polyCount; i++) { const POLY *poly = &polyList->list[indexList->list[i]]; const unsigned int polyType = poly->type; if (this->isShaderSupported) { for(unsigned int j = 0; j < polyType; j++) { const GLushort vertIndex = poly->vertIndexes[j]; // While we're looping through our vertices, add each vertex index to // a buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional // vertices here to convert them to GL_TRIANGLES, which are much easier // to work with and won't be deprecated in future OpenGL versions. outIndexBuffer[vertIndexCount++] = vertIndex; if (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP) { if (j == 2) { outIndexBuffer[vertIndexCount++] = vertIndex; } else if (j == 3) { outIndexBuffer[vertIndexCount++] = poly->vertIndexes[0]; } } } } else { const GLfloat thePolyAlpha = (!poly->isWireframe() && poly->isTranslucent()) ? divide5bitBy31_LUT[poly->getAttributeAlpha()] : 1.0f; for(unsigned int j = 0; j < polyType; j++) { const GLushort vertIndex = poly->vertIndexes[j]; const GLushort colorIndex = vertIndex * 4; // Consolidate the vertex color and the poly alpha to our internal color buffer // so that OpenGL can use it. const VERT *vert = &vertList->list[vertIndex]; OGLRef.color4fBuffer[colorIndex+0] = material_8bit_to_float[vert->color[0]]; OGLRef.color4fBuffer[colorIndex+1] = material_8bit_to_float[vert->color[1]]; OGLRef.color4fBuffer[colorIndex+2] = material_8bit_to_float[vert->color[2]]; OGLRef.color4fBuffer[colorIndex+3] = thePolyAlpha; // While we're looping through our vertices, add each vertex index to a // buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional // vertices here to convert them to GL_TRIANGLES, which are much easier // to work with and won't be deprecated in future OpenGL versions. outIndexBuffer[vertIndexCount++] = vertIndex; if (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP) { if (j == 2) { outIndexBuffer[vertIndexCount++] = vertIndex; } else if (j == 3) { outIndexBuffer[vertIndexCount++] = poly->vertIndexes[0]; } } } } } *outIndexCount = vertIndexCount; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount) { OGLRenderRef &OGLRef = *this->ref; if (this->isVAOSupported) { glBindVertexArray(OGLRef.vaoMainStatesID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList); glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), indexBuffer); } else { if (this->isShaderSupported) { glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); if (this->isVBOSupported) { glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID); glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), OGLRef.vertIndexBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); } else { glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), &vertList->list[0].coord); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), &vertList->list[0].texcoord); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), &vertList->list[0].color); } } else { glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); if (this->isVBOSupported) { glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID); glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), OGLRef.vertIndexBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList); glVertexPointer(4, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glTexCoordPointer(2, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); } else { glVertexPointer(4, GL_FLOAT, sizeof(VERT), &vertList->list[0].coord); glTexCoordPointer(2, GL_FLOAT, sizeof(VERT), &vertList->list[0].texcoord); glColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer); } } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DisableVertexAttributes() { if (this->isVAOSupported) { glBindVertexArray(0); } else { if (this->isShaderSupported) { glDisableVertexAttribArray(OGLVertexAttributeID_Position); glDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glDisableVertexAttribArray(OGLVertexAttributeID_Color); } else { glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } if (this->isVBOSupported) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SelectRenderingFramebuffer() { OGLRenderRef &OGLRef = *this->ref; if (this->isMultisampledFBOSupported) { OGLRef.selectedRenderingFBO = CommonSettings.GFX3D_Renderer_Multisample ? OGLRef.fboMultisampleRenderID : OGLRef.fboFinalOutputID; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DownsampleFBO() { OGLRenderRef &OGLRef = *this->ref; if (!this->isMultisampledFBOSupported || OGLRef.selectedRenderingFBO != OGLRef.fboMultisampleRenderID) { return OGLERROR_NOERR; } glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, OGLRef.fboFinalOutputID); glBlitFramebufferEXT(0, 0, 256, 192, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT, GL_NEAREST); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboFinalOutputID); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::ReadBackPixels() { const unsigned int i = this->doubleBufferIndex; if (this->isPBOSupported) { this->DownsampleFBO(); glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]); glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, 0); glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); } this->gpuScreen3DHasNewData[i] = true; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DeleteTexture(const TexCacheItem *item) { this->ref->freeTextureIDs.push((GLuint)item->texid); if(this->currTexture == item) { this->currTexture = NULL; } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::BeginRender(const GFX3D_State *renderState) { OGLRenderRef &OGLRef = *this->ref; this->doubleBufferIndex = (this->doubleBufferIndex + 1) & 0x01; this->SelectRenderingFramebuffer(); if (this->isShaderSupported) { glUniform1i(OGLRef.uniformEnableAlphaTest, renderState->enableAlphaTest ? GL_TRUE : GL_FALSE); glUniform1f(OGLRef.uniformAlphaTestRef, divide5bitBy31_LUT[renderState->alphaTestRef]); glUniform1i(OGLRef.uniformToonShadingMode, renderState->shading); glUniform1i(OGLRef.uniformWBuffer, renderState->wbuffer); } else { if(renderState->enableAlphaTest && (renderState->alphaTestRef > 0)) { glAlphaFunc(GL_GEQUAL, divide5bitBy31_LUT[renderState->alphaTestRef]); } else { glAlphaFunc(GL_GREATER, 0); } } if(renderState->enableAlphaBlending) { glEnable(GL_BLEND); } else { glDisable(GL_BLEND); } glDepthMask(GL_TRUE); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { OGLRenderRef &OGLRef = *this->ref; unsigned int vertIndexCount = 0; if (!this->isShaderSupported) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); } this->SetupVertices(vertList, polyList, indexList, OGLRef.vertIndexBuffer, &vertIndexCount); this->EnableVertexAttributes(vertList, OGLRef.vertIndexBuffer, vertIndexCount); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { OGLRenderRef &OGLRef = *this->ref; u32 lastTexParams = 0; u32 lastTexPalette = 0; u32 lastPolyAttr = 0; u32 lastViewport = 0xFFFFFFFF; const unsigned int polyCount = polyList->count; GLushort *indexBufferPtr = this->isVBOSupported ? 0 : OGLRef.vertIndexBuffer; // Map GFX3D_QUADS and GFX3D_QUAD_STRIP to GL_TRIANGLES since we will convert them. // // Also map GFX3D_TRIANGLE_STRIP to GL_TRIANGLES. This is okay since this is actually // how the POLY struct stores triangle strip vertices, which is in sets of 3 vertices // each. This redefinition is necessary since uploading more than 3 indices at a time // will cause glDrawElements() to draw the triangle strip incorrectly. static const GLenum oglPrimitiveType[] = {GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_LINE_LOOP, GL_LINE_LOOP, GL_LINE_STRIP, GL_LINE_STRIP}; static const unsigned int indexIncrementLUT[] = {3, 6, 3, 6, 3, 4, 3, 4}; for(unsigned int i = 0; i < polyCount; i++) { const POLY *poly = &polyList->list[indexList->list[i]]; // Set up the polygon if it changed if(lastPolyAttr != poly->polyAttr || i == 0) { lastPolyAttr = poly->polyAttr; this->SetupPolygon(poly); } // Set up the texture if it changed if(lastTexParams != poly->texParam || lastTexPalette != poly->texPalette || i == 0) { lastTexParams = poly->texParam; lastTexPalette = poly->texPalette; this->SetupTexture(poly, renderState->enableTexturing); } // Set up the viewport if it changed if(lastViewport != poly->viewport || i == 0) { lastViewport = poly->viewport; this->SetupViewport(poly); } // In wireframe mode, redefine all primitives as GL_LINE_LOOP rather than // setting the polygon mode to GL_LINE though glPolygonMode(). Not only is // drawing more accurate this way, but it also allows GFX3D_QUADS and // GFX3D_QUAD_STRIP primitives to properly draw as wireframe without the // extra diagonal line. const GLenum polyPrimitive = !poly->isWireframe() ? oglPrimitiveType[poly->vtxFormat] : GL_LINE_LOOP; // Render the polygon const unsigned int vertIndexCount = indexIncrementLUT[poly->vtxFormat]; glDrawElements(polyPrimitive, vertIndexCount, GL_UNSIGNED_SHORT, indexBufferPtr); indexBufferPtr += vertIndexCount; } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::PostRender() { this->DisableVertexAttributes(); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::EndRender(const u64 frameCount) { //needs to happen before endgl because it could free some textureids for expired cache items TexCache_EvictFrame(); this->ReadBackPixels(); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll) { static const size_t pixelsPerLine = 256; static const size_t lineCount = 192; static const size_t totalPixelCount = pixelsPerLine * lineCount; static const size_t bufferSize = totalPixelCount * sizeof(u16); static CACHE_ALIGN GLushort clearImageColorBuffer[totalPixelCount] = {0}; static CACHE_ALIGN GLint clearImageDepthBuffer[totalPixelCount] = {0}; static CACHE_ALIGN u16 lastColorBuffer[totalPixelCount] = {0}; static CACHE_ALIGN u16 lastDepthBuffer[totalPixelCount] = {0}; static u8 lastXScroll = 0; static u8 lastYScroll = 0; if (!this->isFBOSupported) { return OGLERROR_FEATURE_UNSUPPORTED; } if (lastXScroll != xScroll || lastYScroll != yScroll || memcmp(colorBuffer, lastColorBuffer, bufferSize) || memcmp(depthBuffer, lastDepthBuffer, bufferSize) ) { lastXScroll = xScroll; lastYScroll = yScroll; memcpy(lastColorBuffer, colorBuffer, bufferSize); memcpy(lastDepthBuffer, depthBuffer, bufferSize); unsigned int dd = totalPixelCount - pixelsPerLine; for(unsigned int iy = 0; iy < lineCount; iy++) { const unsigned int y = ((iy + yScroll) & 0xFF) << 8; for(unsigned int ix = 0; ix < pixelsPerLine; ix++) { const unsigned int x = (ix + xScroll) & 0xFF; const unsigned int adr = y + x; clearImageColorBuffer[dd] = colorBuffer[adr]; clearImageDepthBuffer[dd] = dsDepthToD24S8_LUT[depthBuffer[adr] & 0x7FFF] | clearStencil; dd++; } dd -= pixelsPerLine * 2; } this->UploadClearImage(clearImageColorBuffer, clearImageDepthBuffer); } this->clearImageStencilValue = clearStencil; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::UpdateToonTable(const u16 *toonTableBuffer) { // Update the toon table if it changed. if (memcmp(this->currentToonTable16, toonTableBuffer, sizeof(this->currentToonTable16))) { memcpy(this->currentToonTable16, toonTableBuffer, sizeof(this->currentToonTable16)); this->toonTableNeedsUpdate = true; } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::ClearUsingImage() const { static u8 lastClearStencil = 0; if (!this->isFBOSupported) { return OGLERROR_FEATURE_UNSUPPORTED; } OGLRenderRef &OGLRef = *this->ref; glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, OGLRef.fboClearImageID); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO); glBlitFramebufferEXT(0, 0, 256, 192, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO); // It might seem wasteful to be doing a separate glClear(GL_STENCIL_BUFFER_BIT) instead // of simply blitting the stencil buffer with everything else. // // We do this because glBlitFramebufferEXT() for GL_STENCIL_BUFFER_BIT has been tested // to be unsupported on ATI/AMD GPUs running in compatibility mode. So we do the separate // glClear() for GL_STENCIL_BUFFER_BIT to keep these GPUs working. if (lastClearStencil == this->clearImageStencilValue) { lastClearStencil = this->clearImageStencilValue; glClearStencil(lastClearStencil); } glClear(GL_STENCIL_BUFFER_BIT); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const { static u8 last_r = 0; static u8 last_g = 0; static u8 last_b = 0; static u8 last_a = 0; static u32 lastClearDepth = 0; static u8 lastClearStencil = 0; if (r != last_r || g != last_g || b != last_b || a != last_a) { last_r = r; last_g = g; last_b = b; last_a = a; glClearColor(divide5bitBy31_LUT[r], divide5bitBy31_LUT[g], divide5bitBy31_LUT[b], divide5bitBy31_LUT[a]); } if (clearDepth != lastClearDepth) { lastClearDepth = clearDepth; glClearDepth((GLfloat)clearDepth / (GLfloat)0x00FFFFFF); } if (clearStencil != lastClearStencil) { lastClearStencil = clearStencil; glClearStencil(clearStencil); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupPolygon(const POLY *thePoly) { static unsigned int lastTexBlendMode = 0; static int lastStencilState = -1; OGLRenderRef &OGLRef = *this->ref; const PolygonAttributes attr = thePoly->getAttributes(); // Set up polygon ID if (this->isShaderSupported) { glUniform1i(OGLRef.uniformPolyID, attr.polygonID); } // Set up alpha value if (this->isShaderSupported) { const GLfloat thePolyAlpha = (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f; glUniform1f(OGLRef.uniformPolyAlpha, thePolyAlpha); } // Set up depth test mode static const GLenum oglDepthFunc[2] = {GL_LESS, GL_EQUAL}; glDepthFunc(oglDepthFunc[attr.enableDepthTest]); // Set up culling mode static const GLenum oglCullingMode[4] = {GL_FRONT_AND_BACK, GL_FRONT, GL_BACK, 0}; GLenum cullingMode = oglCullingMode[attr.surfaceCullingMode]; if (cullingMode == 0) { xglDisable(GL_CULL_FACE); } else { xglEnable(GL_CULL_FACE); glCullFace(cullingMode); } // Set up depth write GLboolean enableDepthWrite = GL_TRUE; // Handle shadow polys. Do this after checking for depth write, since shadow polys // can change this too. if(attr.polygonMode == 3) { xglEnable(GL_STENCIL_TEST); if(attr.polygonID == 0) { enableDepthWrite = GL_FALSE; if(lastStencilState != 0) { lastStencilState = 0; //when the polyID is zero, we are writing the shadow mask. //set stencilbuf = 1 where the shadow volume is obstructed by geometry. //do not write color or depth information. glStencilFunc(GL_ALWAYS, 65, 255); glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); } } else { enableDepthWrite = GL_TRUE; if(lastStencilState != 1) { lastStencilState = 1; //when the polyid is nonzero, we are drawing the shadow poly. //only draw the shadow poly where the stencilbuf==1. //I am not sure whether to update the depth buffer here--so I chose not to. glStencilFunc(GL_EQUAL, 65, 255); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } } else { xglEnable(GL_STENCIL_TEST); if(attr.isTranslucent) { lastStencilState = 3; glStencilFunc(GL_NOTEQUAL, attr.polygonID, 255); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } else if(lastStencilState != 2) { lastStencilState = 2; glStencilFunc(GL_ALWAYS, 64, 255); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } if(attr.isTranslucent && !attr.enableAlphaDepthWrite) { enableDepthWrite = GL_FALSE; } glDepthMask(enableDepthWrite); // Set up texture blending mode if(attr.polygonMode != lastTexBlendMode) { lastTexBlendMode = attr.polygonMode; if(this->isShaderSupported) { glUniform1i(OGLRef.uniformPolygonMode, attr.polygonMode); // Update the toon table if necessary if (this->toonTableNeedsUpdate && attr.polygonMode == 2) { this->UploadToonTable(this->currentToonTable16); this->toonTableNeedsUpdate = false; } } else { static const GLint oglTexBlendMode[4] = {GL_MODULATE, GL_DECAL, GL_MODULATE, GL_MODULATE}; glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, oglTexBlendMode[attr.polygonMode]); } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupTexture(const POLY *thePoly, bool enableTexturing) { OGLRenderRef &OGLRef = *this->ref; const PolygonTexParams params = thePoly->getTexParams(); // Check if we need to use textures if (thePoly->texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing) { if (this->isShaderSupported) { glUniform1i(OGLRef.uniformHasTexture, GL_FALSE); } else { glDisable(GL_TEXTURE_2D); } return OGLERROR_NOERR; } // Enable textures if they weren't already enabled if (this->isShaderSupported) { glUniform1i(OGLRef.uniformHasTexture, GL_TRUE); } else { glEnable(GL_TEXTURE_2D); } // texCacheUnit.TexCache_SetTexture(format, texpal); TexCacheItem *newTexture = TexCache_SetTexture(TexFormat_32bpp, thePoly->texParam, thePoly->texPalette); if(newTexture != this->currTexture) { this->currTexture = newTexture; //has the ogl renderer initialized the texture? if(!this->currTexture->deleteCallback) { this->currTexture->deleteCallback = texDeleteCallback; if(OGLRef.freeTextureIDs.empty()) { this->ExpandFreeTextures(); } this->currTexture->texid = (u64)OGLRef.freeTextureIDs.front(); OGLRef.freeTextureIDs.pop(); glBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (params.enableRepeatS ? (params.enableMirroredRepeatS ? OGLRef.stateTexMirroredRepeat : GL_REPEAT) : GL_CLAMP_TO_EDGE)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (params.enableRepeatT ? (params.enableMirroredRepeatT ? OGLRef.stateTexMirroredRepeat : GL_REPEAT) : GL_CLAMP_TO_EDGE)); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->currTexture->sizeX, this->currTexture->sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, this->currTexture->decoded); } else { //otherwise, just bind it glBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid); } if (this->isShaderSupported) { glUniform2f(OGLRef.uniformTexScale, this->currTexture->invSizeX, this->currTexture->invSizeY); } else { glMatrixMode(GL_TEXTURE); glLoadIdentity(); glScalef(this->currTexture->invSizeX, this->currTexture->invSizeY, 1.0f); } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::SetupViewport(const POLY *thePoly) { VIEWPORT viewport; viewport.decode(thePoly->viewport); glViewport(viewport.x, viewport.y, viewport.width, viewport.height); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::Reset() { OGLRenderRef &OGLRef = *this->ref; this->gpuScreen3DHasNewData[0] = false; this->gpuScreen3DHasNewData[1] = false; glFinish(); for (unsigned int i = 0; i < 2; i++) { memset(this->GPU_screen3D[i], 0, sizeof(this->GPU_screen3D[i])); } memset(currentToonTable16, 0, sizeof(currentToonTable16)); this->toonTableNeedsUpdate = true; if(this->isShaderSupported) { glUniform1f(OGLRef.uniformPolyAlpha, 1.0f); glUniform2f(OGLRef.uniformTexScale, 1.0f, 1.0f); glUniform1i(OGLRef.uniformPolyID, 0); glUniform1i(OGLRef.uniformHasTexture, GL_FALSE); glUniform1i(OGLRef.uniformPolygonMode, 0); glUniform1i(OGLRef.uniformToonShadingMode, 0); glUniform1i(OGLRef.uniformWBuffer, 0); glUniform1i(OGLRef.uniformEnableAlphaTest, GL_TRUE); glUniform1f(OGLRef.uniformAlphaTestRef, 0.0f); } else { glEnable(GL_NORMALIZE); glEnable(GL_TEXTURE_1D); glEnable(GL_TEXTURE_2D); glAlphaFunc(GL_GREATER, 0); glEnable(GL_ALPHA_TEST); memset(OGLRef.color4fBuffer, 0, VERTLIST_SIZE * 4 * sizeof(GLfloat)); } memset(OGLRef.vertIndexBuffer, 0, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort)); this->currTexture = NULL; this->doubleBufferIndex = 0; this->clearImageStencilValue = 0; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_2::RenderFinish() { const unsigned int i = this->doubleBufferIndex; if (!this->gpuScreen3DHasNewData[i]) { return OGLERROR_NOERR; } OGLRenderRef &OGLRef = *this->ref; if (this->isPBOSupported) { glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]); const u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); if (mappedBufferPtr != NULL) { this->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen); glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); } glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); } else { this->DownsampleFBO(); u32 *__restrict workingBuffer = this->GPU_screen3D[i]; glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, workingBuffer); this->ConvertFramebuffer(workingBuffer, (u32 *)gfx3d_convertedScreen); } this->gpuScreen3DHasNewData[i] = false; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_3::CreateToonTable() { OGLRenderRef &OGLRef = *this->ref; // The toon table is a special 1D texture where each pixel corresponds // to a specific color in the toon table. glGenTextures(1, &OGLRef.texToonTableID); glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable); glBindTexture(GL_TEXTURE_1D, OGLRef.texToonTableID); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_1D, 0); glActiveTexture(GL_TEXTURE0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_3::DestroyToonTable() { glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable); glBindTexture(GL_TEXTURE_1D, 0); glActiveTexture(GL_TEXTURE0); glDeleteTextures(1, &this->ref->texToonTableID); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_3::UploadToonTable(const GLushort *toonTableBuffer) { glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable); glBindTexture(GL_TEXTURE_1D, this->ref->texToonTableID); glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, toonTableBuffer); glActiveTexture(GL_TEXTURE0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_3::CreateClearImage() { OGLRenderRef &OGLRef = *this->ref; glGenTextures(1, &OGLRef.texClearImageColorID); glGenTextures(1, &OGLRef.texClearImageDepthStencilID); glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, 256, 192, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL); glActiveTexture(GL_TEXTURE0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_3::DestroyClearImage() { OGLRenderRef &OGLRef = *this->ref; glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage); glBindTexture(GL_TEXTURE_2D, 0); glActiveTexture(GL_TEXTURE0); glDeleteTextures(1, &OGLRef.texClearImageColorID); glDeleteTextures(1, &OGLRef.texClearImageDepthStencilID); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_3::UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer) { OGLRenderRef &OGLRef = *this->ref; glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, clearImageColorBuffer); glBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, clearImageDepthBuffer); glBindTexture(GL_TEXTURE_2D, 0); glActiveTexture(GL_TEXTURE0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_4::InitFinalRenderStates(const std::set *oglExtensionSet) { OGLRenderRef &OGLRef = *this->ref; bool isBlendEquationSeparateSupported = this->IsExtensionPresent(oglExtensionSet, "GL_EXT_blend_equation_separate"); // Blending Support if (isBlendEquationSeparateSupported) { // we want to use alpha destination blending so we can track the last-rendered alpha value // test: new super mario brothers renders the stormclouds at the beginning glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA); glBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX); } else { glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_DST_ALPHA); } // Mirrored Repeat Mode Support OGLRef.stateTexMirroredRepeat = GL_MIRRORED_REPEAT; // Always enable depth test, and control using glDepthMask(). glEnable(GL_DEPTH_TEST); // Map the vertex list's colors with 4 floats per color. This is being done // because OpenGL needs 4-colors per vertex to support translucency. (The DS // uses 3-colors per vertex, and adds alpha through the poly, so we can't // simply reference the colors+alpha from just the vertices by themselves.) OGLRef.color4fBuffer = this->isShaderSupported ? NULL : new GLfloat[VERTLIST_SIZE * 4]; return OGLERROR_NOERR; } OpenGLRenderer_1_5::~OpenGLRenderer_1_5() { glFinish(); DestroyVAOs(); DestroyVBOs(); DestroyPBOs(); } Render3DError OpenGLRenderer_1_5::CreateVBOs() { OGLRenderRef &OGLRef = *this->ref; glGenBuffers(1, &OGLRef.vboVertexID); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBufferData(GL_ARRAY_BUFFER, VERTLIST_SIZE * sizeof(VERT), NULL, GL_STREAM_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); glGenBuffers(1, &OGLRef.iboIndexID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glBufferData(GL_ELEMENT_ARRAY_BUFFER, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort), NULL, GL_STREAM_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); return OGLERROR_NOERR; } void OpenGLRenderer_1_5::DestroyVBOs() { if (!this->isVBOSupported) { return; } OGLRenderRef &OGLRef = *this->ref; glBindBuffer(GL_ARRAY_BUFFER, 0); glDeleteBuffers(1, &OGLRef.vboVertexID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glDeleteBuffers(1, &OGLRef.iboIndexID); this->isVBOSupported = false; } Render3DError OpenGLRenderer_1_5::CreatePBOs() { OGLRenderRef &OGLRef = *this->ref; glGenBuffers(2, OGLRef.pboRenderDataID); for (unsigned int i = 0; i < 2; i++) { glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]); glBufferData(GL_PIXEL_PACK_BUFFER_ARB, 256 * 192 * sizeof(u32), NULL, GL_STREAM_READ); } glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); return OGLERROR_NOERR; } void OpenGLRenderer_1_5::DestroyPBOs() { if (!this->isPBOSupported) { return; } glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); glDeleteBuffers(2, this->ref->pboRenderDataID); this->isPBOSupported = false; } Render3DError OpenGLRenderer_1_5::CreateVAOs() { OGLRenderRef &OGLRef = *this->ref; glGenVertexArrays(1, &OGLRef.vaoMainStatesID); glBindVertexArray(OGLRef.vaoMainStatesID); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); glBindVertexArray(0); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_5::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount) { OGLRenderRef &OGLRef = *this->ref; if (this->isVAOSupported) { glBindVertexArray(OGLRef.vaoMainStatesID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); } else { if (this->isShaderSupported) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); } else { glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); glBindBuffer(GL_ARRAY_BUFFER, 0); glColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glVertexPointer(4, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glTexCoordPointer(2, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_5::DisableVertexAttributes() { if (this->isVAOSupported) { glBindVertexArray(0); } else { if (this->isShaderSupported) { glDisableVertexAttribArray(OGLVertexAttributeID_Position); glDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glDisableVertexAttribArray(OGLVertexAttributeID_Color); } else { glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_5::ReadBackPixels() { const unsigned int i = this->doubleBufferIndex; if (this->isPBOSupported) { this->DownsampleFBO(); glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]); glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); } this->gpuScreen3DHasNewData[i] = true; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_1_5::RenderFinish() { const unsigned int i = this->doubleBufferIndex; if (!this->gpuScreen3DHasNewData[i]) { return OGLERROR_NOERR; } OGLRenderRef &OGLRef = *this->ref; if (this->isPBOSupported) { glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]); const u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY); if (mappedBufferPtr != NULL) { this->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen); glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); } glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); } else { this->DownsampleFBO(); u32 *__restrict workingBuffer = this->GPU_screen3D[i]; glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, workingBuffer); this->ConvertFramebuffer(workingBuffer, (u32 *)gfx3d_convertedScreen); } this->gpuScreen3DHasNewData[i] = false; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::InitExtensions() { Render3DError error = OGLERROR_NOERR; OGLRenderRef &OGLRef = *this->ref; // Get OpenGL extensions std::set oglExtensionSet; this->GetExtensionSet(&oglExtensionSet); // Initialize OpenGL this->InitTables(); // Load and create shaders. Return on any error, since a v2.0 driver will assume that shaders are available. this->isShaderSupported = true; std::string vertexShaderProgram; std::string fragmentShaderProgram; error = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram); if (error != OGLERROR_NOERR) { this->isShaderSupported = false; return error; } error = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram); if (error != OGLERROR_NOERR) { this->isShaderSupported = false; return error; } this->CreateToonTable(); this->isVBOSupported = true; this->CreateVBOs(); #if !defined(GL_ARB_pixel_buffer_object) && !defined(GL_EXT_pixel_buffer_object) this->isPBOSupported = false; #else this->isPBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_buffer_object") && (this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_pixel_buffer_object") || this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_pixel_buffer_object")); #endif if (this->isPBOSupported) { this->CreatePBOs(); } #if !defined(GL_ARB_vertex_array_object) && !defined(GL_APPLE_vertex_array_object) this->isVAOSupported = false; #else this->isVAOSupported = this->isShaderSupported && this->isVBOSupported && (this->IsExtensionPresent(&oglExtensionSet, "GL_ARB_vertex_array_object") || this->IsExtensionPresent(&oglExtensionSet, "GL_APPLE_vertex_array_object")); #endif if (this->isVAOSupported) { this->CreateVAOs(); } // Don't use ARB versions since we're using the EXT versions for backwards compatibility. #if !defined(GL_EXT_framebuffer_object) || \ !defined(GL_EXT_framebuffer_blit) || \ !defined(GL_EXT_packed_depth_stencil) this->isFBOSupported = false; #else this->isFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil"); #endif if (this->isFBOSupported) { error = this->CreateFBOs(); if (error != OGLERROR_NOERR) { OGLRef.fboFinalOutputID = 0; this->isFBOSupported = false; } } else { OGLRef.fboFinalOutputID = 0; INFO("OpenGL: FBOs are unsupported. Some emulation features will be disabled.\n"); } // Don't use ARB versions since we're using the EXT versions for backwards compatibility. #if !defined(GL_EXT_framebuffer_object) || \ !defined(GL_EXT_framebuffer_multisample) || \ !defined(GL_EXT_framebuffer_blit) || \ !defined(GL_EXT_packed_depth_stencil) this->isMultisampledFBOSupported = false; #else this->isMultisampledFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_multisample"); #endif if (this->isMultisampledFBOSupported) { error = this->CreateMultisampledFBO(); if (error != OGLERROR_NOERR) { OGLRef.selectedRenderingFBO = 0; this->isMultisampledFBOSupported = false; } } else { OGLRef.selectedRenderingFBO = 0; INFO("OpenGL: Multisampled FBOs are unsupported. Multisample antialiasing will be disabled.\n"); } this->InitTextures(); this->InitFinalRenderStates(&oglExtensionSet); // This must be done last return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::InitFinalRenderStates(const std::set *oglExtensionSet) { OGLRenderRef &OGLRef = *this->ref; // we want to use alpha destination blending so we can track the last-rendered alpha value // test: new super mario brothers renders the stormclouds at the beginning // Blending Support glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA); glBlendEquationSeparate(GL_FUNC_ADD, GL_MAX); // Mirrored Repeat Mode Support OGLRef.stateTexMirroredRepeat = GL_MIRRORED_REPEAT; // Always enable depth test, and control using glDepthMask(). glEnable(GL_DEPTH_TEST); // Ignore our color buffer since we'll transfer the polygon alpha through a uniform. OGLRef.color4fBuffer = NULL; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount) { const unsigned int polyCount = polyList->count; unsigned int vertIndexCount = 0; for(unsigned int i = 0; i < polyCount; i++) { const POLY *poly = &polyList->list[indexList->list[i]]; const unsigned int polyType = poly->type; for(unsigned int j = 0; j < polyType; j++) { const GLushort vertIndex = poly->vertIndexes[j]; // While we're looping through our vertices, add each vertex index to // a buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional // vertices here to convert them to GL_TRIANGLES, which are much easier // to work with and won't be deprecated in future OpenGL versions. outIndexBuffer[vertIndexCount++] = vertIndex; if (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP) { if (j == 2) { outIndexBuffer[vertIndexCount++] = vertIndex; } else if (j == 3) { outIndexBuffer[vertIndexCount++] = poly->vertIndexes[0]; } } } } *outIndexCount = vertIndexCount; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount) { OGLRenderRef &OGLRef = *this->ref; if (this->isVAOSupported) { glBindVertexArray(OGLRef.vaoMainStatesID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); } else { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer); glBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glEnableVertexAttribArray(OGLVertexAttributeID_Color); glVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord)); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord)); glVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color)); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::DisableVertexAttributes() { if (this->isVAOSupported) { glBindVertexArray(0); } else { glDisableVertexAttribArray(OGLVertexAttributeID_Position); glDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0); glDisableVertexAttribArray(OGLVertexAttributeID_Color); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::BeginRender(const GFX3D_State *renderState) { OGLRenderRef &OGLRef = *this->ref; this->doubleBufferIndex = (this->doubleBufferIndex + 1) & 0x01; this->SelectRenderingFramebuffer(); glUniform1i(OGLRef.uniformEnableAlphaTest, renderState->enableAlphaTest ? GL_TRUE : GL_FALSE); glUniform1f(OGLRef.uniformAlphaTestRef, divide5bitBy31_LUT[renderState->alphaTestRef]); glUniform1i(OGLRef.uniformToonShadingMode, renderState->shading); glUniform1i(OGLRef.uniformWBuffer, renderState->wbuffer); if(renderState->enableAlphaBlending) { glEnable(GL_BLEND); } else { glDisable(GL_BLEND); } glDepthMask(GL_TRUE); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { OGLRenderRef &OGLRef = *this->ref; unsigned int vertIndexCount = 0; this->SetupVertices(vertList, polyList, indexList, OGLRef.vertIndexBuffer, &vertIndexCount); this->EnableVertexAttributes(vertList, OGLRef.vertIndexBuffer, vertIndexCount); return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::SetupPolygon(const POLY *thePoly) { static unsigned int lastTexBlendMode = 0; static int lastStencilState = -1; OGLRenderRef &OGLRef = *this->ref; const PolygonAttributes attr = thePoly->getAttributes(); // Set up polygon ID glUniform1i(OGLRef.uniformPolyID, attr.polygonID); // Set up alpha value const GLfloat thePolyAlpha = (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f; glUniform1f(OGLRef.uniformPolyAlpha, thePolyAlpha); // Set up depth test mode static const GLenum oglDepthFunc[2] = {GL_LESS, GL_EQUAL}; glDepthFunc(oglDepthFunc[attr.enableDepthTest]); // Set up culling mode static const GLenum oglCullingMode[4] = {GL_FRONT_AND_BACK, GL_FRONT, GL_BACK, 0}; GLenum cullingMode = oglCullingMode[attr.surfaceCullingMode]; if (cullingMode == 0) { xglDisable(GL_CULL_FACE); } else { xglEnable(GL_CULL_FACE); glCullFace(cullingMode); } // Set up depth write GLboolean enableDepthWrite = GL_TRUE; // Handle shadow polys. Do this after checking for depth write, since shadow polys // can change this too. if(attr.polygonMode == 3) { xglEnable(GL_STENCIL_TEST); if(attr.polygonID == 0) { enableDepthWrite = GL_FALSE; if(lastStencilState != 0) { lastStencilState = 0; //when the polyID is zero, we are writing the shadow mask. //set stencilbuf = 1 where the shadow volume is obstructed by geometry. //do not write color or depth information. glStencilFunc(GL_ALWAYS, 65, 255); glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); } } else { enableDepthWrite = GL_TRUE; if(lastStencilState != 1) { lastStencilState = 1; //when the polyid is nonzero, we are drawing the shadow poly. //only draw the shadow poly where the stencilbuf==1. //I am not sure whether to update the depth buffer here--so I chose not to. glStencilFunc(GL_EQUAL, 65, 255); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } } else { xglEnable(GL_STENCIL_TEST); if(attr.isTranslucent) { lastStencilState = 3; glStencilFunc(GL_NOTEQUAL, attr.polygonID, 255); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } else if(lastStencilState != 2) { lastStencilState = 2; glStencilFunc(GL_ALWAYS, 64, 255); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } if(attr.isTranslucent && !attr.enableAlphaDepthWrite) { enableDepthWrite = GL_FALSE; } glDepthMask(enableDepthWrite); // Set up texture blending mode if(attr.polygonMode != lastTexBlendMode) { lastTexBlendMode = attr.polygonMode; glUniform1i(OGLRef.uniformPolygonMode, attr.polygonMode); // Update the toon table if necessary if (this->toonTableNeedsUpdate && attr.polygonMode == 2) { this->UploadToonTable(this->currentToonTable16); this->toonTableNeedsUpdate = false; } } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_0::SetupTexture(const POLY *thePoly, bool enableTexturing) { OGLRenderRef &OGLRef = *this->ref; const PolygonTexParams params = thePoly->getTexParams(); // Check if we need to use textures if (thePoly->texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing) { glUniform1i(OGLRef.uniformHasTexture, GL_FALSE); return OGLERROR_NOERR; } glUniform1i(OGLRef.uniformHasTexture, GL_TRUE); // texCacheUnit.TexCache_SetTexture(format, texpal); TexCacheItem *newTexture = TexCache_SetTexture(TexFormat_32bpp, thePoly->texParam, thePoly->texPalette); if(newTexture != this->currTexture) { this->currTexture = newTexture; //has the ogl renderer initialized the texture? if(!this->currTexture->deleteCallback) { this->currTexture->deleteCallback = texDeleteCallback; if(OGLRef.freeTextureIDs.empty()) { this->ExpandFreeTextures(); } this->currTexture->texid = (u64)OGLRef.freeTextureIDs.front(); OGLRef.freeTextureIDs.pop(); glBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (params.enableRepeatS ? (params.enableMirroredRepeatS ? GL_MIRRORED_REPEAT : GL_REPEAT) : GL_CLAMP_TO_EDGE)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (params.enableRepeatT ? (params.enableMirroredRepeatT ? GL_MIRRORED_REPEAT : GL_REPEAT) : GL_CLAMP_TO_EDGE)); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->currTexture->sizeX, this->currTexture->sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, this->currTexture->decoded); } else { //otherwise, just bind it glBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid); } glUniform2f(OGLRef.uniformTexScale, this->currTexture->invSizeX, this->currTexture->invSizeY); } return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_1::ReadBackPixels() { const unsigned int i = this->doubleBufferIndex; this->DownsampleFBO(); glBindBuffer(GL_PIXEL_PACK_BUFFER, this->ref->pboRenderDataID[i]); glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); this->gpuScreen3DHasNewData[i] = true; return OGLERROR_NOERR; } Render3DError OpenGLRenderer_2_1::RenderFinish() { const unsigned int i = this->doubleBufferIndex; if (!this->gpuScreen3DHasNewData[i]) { return OGLERROR_NOERR; } glBindBuffer(GL_PIXEL_PACK_BUFFER, this->ref->pboRenderDataID[i]); const u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); if (mappedBufferPtr != NULL) { this->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen); glUnmapBuffer(GL_PIXEL_PACK_BUFFER); } glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); this->gpuScreen3DHasNewData[i] = false; return OGLERROR_NOERR; } desmume-0.9.9/src/emufile_types.h0000644000175000017500000000014412140261633017531 0ustar guillaumeguillaume#ifndef EMUFILE_TYPES_H #define EMUFILE_TYPES_H #include "types.h" #endif //EMUFILE_TYPES_H desmume-0.9.9/src/aggdraw.cpp0000644000175000017500000005615612140261633016644 0ustar guillaumeguillaume/* The MIT License Copyright (C) 2009-2010 DeSmuME team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include "GPU.h" #include "NDSSystem.h" #include "aggdraw.h" #include "agg_renderer_base.h" #include "agg_renderer_primitives.h" #include "agg_renderer_scanline.h" #include "agg_bounding_rect.h" #include "agg_trans_affine.h" #include "agg_path_storage.h" #include "agg_color_rgba.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_scanline_u.h" #include "agg_renderer_scanline.h" #include "agg_scanline_p.h" //raster text #include "agg_glyph_raster_bin.h" #include "agg_embedded_raster_fonts.h" #include "agg_renderer_raster_text.h" #include "ctrl/agg_bezier_ctrl.h" #include "platform/agg_platform_support.h" #include "agg_pattern_filters_rgba.h" #include "agg_renderer_outline_image.h" #include "agg_rasterizer_outline_aa.h" #include "agg_image_accessors.h" #include "agg_span_interpolator_linear.h" #include "agg_span_image_filter_rgb.h" #include "agg_span_image_filter_rgba.h" #include "agg_span_image_filter_gray.h" #include "agg_span_allocator.h" typedef std::map TAgg_Font_Table; static TAgg_Font_Table font_table; font_type fonts_list[] = { { agg::gse4x6, "gse4x6" }, { agg::gse4x8, "gse4x8" }, { agg::gse5x7, "gse5x7" }, { agg::gse5x9, "gse5x9" }, { agg::gse6x9, "gse6x9" }, { agg::gse6x12, "gse6x12" }, { agg::gse7x11, "gse7x11" }, { agg::gse7x11_bold, "gse7x11_bold" }, { agg::gse7x15, "gse7x15" }, { agg::gse7x15_bold, "gse7x15_bold" }, { agg::gse8x16, "gse8x16" }, { agg::gse8x16_bold, "gse8x16_bold" }, { agg::mcs11_prop, "mcs11_prop" }, { agg::mcs11_prop_condensed, "mcs11_prop_condensed" }, { agg::mcs12_prop, "mcs12_prop" }, { agg::mcs13_prop, "mcs13_prop" }, { agg::mcs5x10_mono, "mcs5x10_mono" }, { agg::mcs5x11_mono, "mcs5x11_mono" }, { agg::mcs6x10_mono, "mcs6x10_mono" }, { agg::mcs6x11_mono, "mcs6x11_mono" }, { agg::mcs7x12_mono_high, "mcs7x12_mono_high" }, { agg::mcs7x12_mono_low, "mcs7x12_mono_low" }, { agg::verdana12, "verdana12" }, { agg::verdana12_bold, "verdana12_bold" }, { agg::verdana13, "verdana13" }, { agg::verdana13_bold, "verdana13_bold" }, { agg::verdana14, "verdana14" }, { agg::verdana14_bold, "verdana14_bold" }, { agg::verdana16, "verdana16" }, { agg::verdana16_bold, "verdana16_bold" }, { agg::verdana17, "verdana17" }, { agg::verdana17_bold, "verdana17_bold" }, { agg::verdana18, "verdana18" }, { agg::verdana18_bold, "verdana18_bold" }, }; int font_Nums = ARRAY_SIZE(fonts_list); const agg::int8u* AggDrawTarget::lookupFont(const std::string& name) { TAgg_Font_Table::iterator it(font_table.find(name)); if(it == font_table.end()) return NULL; else return it->second; } static void Agg_init_fonts() { for(u32 i=0;isetFont("verdana18_bold"); } void AggDraw_Desmume::setTarget(AggTarget newTarget) { target = targets[newTarget]; } ////temporary, just for testing the lib //void AGGDraw() { //// // aggDraw.setTarget(AggTarget_Screen); // //// aggDraw.target->clear(); //// //// aggDraw.target->clipBox(0,0,255,383); //// // aggDraw.target->lineColor(0, 0, 255, 128); // aggDraw.target->fillColor(0, 0, 255, 128); //// //aggDraw.target->noFill(); // aggDraw.target->lineWidth(1.0); // aggDraw.target->roundedRect(10,30,256-10,192-10,4); //// //// aggDraw.target->setFont("verdana18_bold"); //// aggDraw.target->renderText(60,60, "testing testing testing"); //// //// // Gradients (Aqua Buttons) //// //======================================= ////// m_graphics.font("Verdana", 20.0, false, false, TAGG2D::VectorFontCache); //// double xb1 = 10; //// double yb1 = 80; //// double xb2 = xb1 + 150; //// double yb2 = yb1 + 36; //// //// aggDraw.target->fillColor(0,50,180,180); //// aggDraw.target->lineColor(0,0,80, 255); //// aggDraw.target->lineWidth(1.0); //// aggDraw.target->roundedRect(xb1, yb1, xb2, yb2, 12, 18); //// //// aggDraw.target->lineColor(0,0,0,0); //// aggDraw.target->fillLinearGradient(xb1, yb1, xb1, yb1+30, //// agg::rgba8(100,200,255,255), //// agg::rgba8(255,255,255,0)); //// aggDraw.target->roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); //// //// aggDraw.target->fillColor(0,0,50, 200); //// aggDraw.target->noLine(); /////* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); //// m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Button", true, 0.0, 0.0); ////*/ //// aggDraw.target->fillLinearGradient(xb1, yb2-20, xb1, yb2-3, //// agg::rgba8(0, 0, 255,0), //// agg::rgba8(100,255,255,255)); //// aggDraw.target->roundedRect(xb1+3, yb2-20, xb2-3, yb2-2, 1, 1, 9, 18); //// //// // Basic Shapes -- Ellipse //// //=========================================== //// aggDraw.target->lineWidth(3.5); //// aggDraw.target->lineColor(20, 80, 80); //// aggDraw.target->fillColor(200, 255, 80, 200); //// aggDraw.target->ellipse(150, 200, 50, 90); //// //// // Paths //// //=========================================== //// aggDraw.target->resetPath(); //// aggDraw.target->fillColor(255, 0, 0, 100); //// aggDraw.target->lineColor(0, 0, 255, 100); //// aggDraw.target->lineWidth(2); //// aggDraw.target->moveTo(300/2, 200/2); //// aggDraw.target->horLineRel(-150/2); //// aggDraw.target->arcRel(150/2, 150/2, 0, 1, 0, 150/2, -150/2); //// aggDraw.target->closePolygon(); //// aggDraw.target->drawPath(); //// //// aggDraw.target->resetPath(); //// aggDraw.target->fillColor(255, 255, 0, 100); //// aggDraw.target->lineColor(0, 0, 255, 100); //// aggDraw.target->lineWidth(2); //// aggDraw.target->moveTo(275/2, 175/2); //// aggDraw.target->verLineRel(-150/2); //// aggDraw.target->arcRel(150/2, 150/2, 0, 0, 0, -150/2, 150/2); //// aggDraw.target->closePolygon(); //// aggDraw.target->drawPath(); //// //// aggDraw.target->resetPath(); //// aggDraw.target->noFill(); //// aggDraw.target->lineColor(127, 0, 0); //// aggDraw.target->lineWidth(5); //// aggDraw.target->moveTo(600/2, 350/2); //// aggDraw.target->lineRel(50/2, -25/2); //// aggDraw.target->arcRel(25/2, 25/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2); //// aggDraw.target->lineRel(50/2, -25/2); //// aggDraw.target->arcRel(25/2, 50/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2); //// aggDraw.target->lineRel(50/2, -25/2); //// aggDraw.target->arcRel(25/2, 75/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2); //// aggDraw.target->lineRel(50, -25); //// aggDraw.target->arcRel(25/2, 100/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2); //// aggDraw.target->lineRel(50/2, -25/2); //// aggDraw.target->drawPath(); //} //// // ////======================== ////testing stufff // //int width = 256; //int height = 384; // //Agg2D m_graphics; // //void AGGDraw(unsigned char * buffer) // { // m_graphics.attach(buffer, // 256, // 384, // 512); // // m_graphics.clearAll(255, 255, 255); // //m_graphics.clearAll(0, 0, 0); // // //m_graphics.blendMode(TAGG2D::BlendSub); // //m_graphics.blendMode(TAGG2D::BlendAdd); // // m_graphics.antiAliasGamma(1.4); // // // Set flipText(true) if you have the Y axis upside down. // //m_graphics.flipText(true); // // // // ClipBox. // //m_graphics.clipBox(50, 50, rbuf_window().width() - 50, rbuf_window().height() - 50); // // // Transfornations - Rotate around (300,300) to 5 degree // //m_graphics.translate(-300, -300); // //m_graphics.rotate(TAGG2D::deg2Rad(5.0)); // //m_graphics.translate(300, 300); // // // Viewport - set 0,0,600,600 to the actual window size // // preserving aspect ratio and placing the viewport in the center. // // To ignore aspect ratio use TAGG2D::Anisotropic // // Note that the viewport just adds transformations to the current // // affine matrix. So that, set the viewport *after* all transformations! // m_graphics.viewport(0, 0, 600, 600, // 0, 0, width, height, // //TAGG2D::Anisotropic); // TAGG2D::XMidYMid); // // // // Rounded Rect // m_graphics.lineColor(0, 0, 0); // m_graphics.noFill(); // m_graphics.roundedRect(0.5, 0.5, 600-0.5, 600-0.5, 20.0); ///* // // // Reglar Text // m_graphics.font("Times New Roman", 14.0, false, false); // m_graphics.fillColor(0, 0, 0); // m_graphics.noLine(); // m_graphics.text(100, 20, "Regular Raster Text -- Fast, but can't be rotated"); // // // Outlined Text // m_graphics.font("Times New Roman", 50.0, false, false, TAGG2D::VectorFontCache); // m_graphics.lineColor(50, 0, 0); // m_graphics.fillColor(180, 200, 100); // m_graphics.lineWidth(1.0); // m_graphics.text(100.5, 50.5, "Outlined Text"); // // // Text Alignment // m_graphics.line(250.5-150, 150.5, 250.5+150, 150.5); // m_graphics.line(250.5, 150.5-20, 250.5, 150.5+20); // m_graphics.line(250.5-150, 200.5, 250.5+150, 200.5); // m_graphics.line(250.5, 200.5-20, 250.5, 200.5+20); // m_graphics.line(250.5-150, 250.5, 250.5+150, 250.5); // m_graphics.line(250.5, 250.5-20, 250.5, 250.5+20); // m_graphics.line(250.5-150, 300.5, 250.5+150, 300.5); // m_graphics.line(250.5, 300.5-20, 250.5, 300.5+20); // m_graphics.line(250.5-150, 350.5, 250.5+150, 350.5); // m_graphics.line(250.5, 350.5-20, 250.5, 350.5+20); // m_graphics.line(250.5-150, 400.5, 250.5+150, 400.5); // m_graphics.line(250.5, 400.5-20, 250.5, 400.5+20); // m_graphics.line(250.5-150, 450.5, 250.5+150, 450.5); // m_graphics.line(250.5, 450.5-20, 250.5, 450.5+20); // m_graphics.line(250.5-150, 500.5, 250.5+150, 500.5); // m_graphics.line(250.5, 500.5-20, 250.5, 500.5+20); // m_graphics.line(250.5-150, 550.5, 250.5+150, 550.5); // m_graphics.line(250.5, 550.5-20, 250.5, 550.5+20); //*/ ///* // m_graphics.fillColor(100, 50, 50); // m_graphics.noLine(); // //m_graphics.textHints(false); // m_graphics.font("Times New Roman", 40.0, false, false, TAGG2D::VectorFontCache); // // m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignBottom); // m_graphics.text(250.0, 150.0, "Left-Bottom", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignBottom); // m_graphics.text(250.0, 200.0, "Center-Bottom", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignBottom); // m_graphics.text(250.0, 250.0, "Right-Bottom", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignCenter); // m_graphics.text(250.0, 300.0, "Left-Center", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); // m_graphics.text(250.0, 350.0, "Center-Center", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignCenter); // m_graphics.text(250.0, 400.0, "Right-Center", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignTop); // m_graphics.text(250.0, 450.0, "Left-Top", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignTop); // m_graphics.text(250.0, 500.0, "Center-Top", true, 0, 0); // // m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignTop); // m_graphics.text(250.0, 550.0, "Right-Top", true, 0, 0); // //*/ // // Gradients (Aqua Buttons) // //======================================= // m_graphics.font("Verdana", 20.0, false, false, TAGG2D::VectorFontCache); // double xb1 = 400; // double yb1 = 80; // double xb2 = xb1 + 150; // double yb2 = yb1 + 36; // // m_graphics.fillColor(TAGG2D::Color(0,50,180,180)); // m_graphics.lineColor(TAGG2D::Color(0,0,80, 255)); // m_graphics.lineWidth(1.0); // m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18); // // m_graphics.lineColor(TAGG2D::Color(0,0,0,0)); // m_graphics.fillLinearGradient(xb1, yb1, xb1, yb1+30, // TAGG2D::Color(100,200,255,255), // TAGG2D::Color(255,255,255,0)); // m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); // // m_graphics.fillColor(TAGG2D::Color(0,0,50, 200)); // m_graphics.noLine(); ///* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); // m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Button", true, 0.0, 0.0); //*/ // m_graphics.fillLinearGradient(xb1, yb2-20, xb1, yb2-3, // TAGG2D::Color(0, 0, 255,0), // TAGG2D::Color(100,255,255,255)); // m_graphics.roundedRect(xb1+3, yb2-20, xb2-3, yb2-2, 1, 1, 9, 18); // // // // Aqua Button Pressed // xb1 = 400; // yb1 = 30; // xb2 = xb1 + 150; // yb2 = yb1 + 36; // // m_graphics.fillColor(TAGG2D::Color(0,50,180,180)); // m_graphics.lineColor(TAGG2D::Color(0,0,0, 255)); // m_graphics.lineWidth(2.0); // m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18); // // m_graphics.lineColor(TAGG2D::Color(0,0,0,0)); // m_graphics.fillLinearGradient(xb1, yb1+2, xb1, yb1+25, // TAGG2D::Color(60, 160,255,255), // TAGG2D::Color(100,255,255,0)); // m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); // // m_graphics.fillColor(TAGG2D::Color(0,0,50, 255)); // m_graphics.noLine(); ///* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); // m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Pressed", 0.0, 0.0); //*/ // m_graphics.fillLinearGradient(xb1, yb2-25, xb1, yb2-5, // TAGG2D::Color(0, 180,255,0), // TAGG2D::Color(0, 200,255,255)); // m_graphics.roundedRect(xb1+3, yb2-25, xb2-3, yb2-2, 1, 1, 9, 18); // // // // // // Basic Shapes -- Ellipse // //=========================================== // m_graphics.lineWidth(3.5); // m_graphics.lineColor(20, 80, 80); // m_graphics.fillColor(200, 255, 80, 200); // m_graphics.ellipse(450, 200, 50, 90); // // // // Paths // //=========================================== // m_graphics.resetPath(); // m_graphics.fillColor(255, 0, 0, 100); // m_graphics.lineColor(0, 0, 255, 100); // m_graphics.lineWidth(2); // m_graphics.moveTo(300/2, 200/2); // m_graphics.horLineRel(-150/2); // m_graphics.arcRel(150/2, 150/2, 0, 1, 0, 150/2, -150/2); // m_graphics.closePolygon(); // m_graphics.drawPath(); // // m_graphics.resetPath(); // m_graphics.fillColor(255, 255, 0, 100); // m_graphics.lineColor(0, 0, 255, 100); // m_graphics.lineWidth(2); // m_graphics.moveTo(275/2, 175/2); // m_graphics.verLineRel(-150/2); // m_graphics.arcRel(150/2, 150/2, 0, 0, 0, -150/2, 150/2); // m_graphics.closePolygon(); // m_graphics.drawPath(); // // // m_graphics.resetPath(); // m_graphics.noFill(); // m_graphics.lineColor(127, 0, 0); // m_graphics.lineWidth(5); // m_graphics.moveTo(600/2, 350/2); // m_graphics.lineRel(50/2, -25/2); // m_graphics.arcRel(25/2, 25/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); // m_graphics.lineRel(50/2, -25/2); // m_graphics.arcRel(25/2, 50/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); // m_graphics.lineRel(50/2, -25/2); // m_graphics.arcRel(25/2, 75/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); // m_graphics.lineRel(50, -25); // m_graphics.arcRel(25/2, 100/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); // m_graphics.lineRel(50/2, -25/2); // m_graphics.drawPath(); // // // // Master Alpha. From now on everything will be translucent // //=========================================== // m_graphics.masterAlpha(0.85); // // // // Image Transformations // //=========================================== ///* TAGG2D::Image img(rbuf_img(0).buf(), // rbuf_img(0).width(), // rbuf_img(0).height(), // rbuf_img(0).stride()); // m_graphics.imageFilter(TAGG2D::Bilinear); // // //m_graphics.imageResample(TAGG2D::NoResample); // //m_graphics.imageResample(TAGG2D::ResampleAlways); // m_graphics.imageResample(TAGG2D::ResampleOnZoomOut); // // // Set the initial image blending operation as BlendDst, that actually // // does nothing. // //----------------- // m_graphics.imageBlendMode(TAGG2D::BlendDst); // // // // Transform the whole image to the destination rectangle // //----------------- // //m_graphics.transformImage(img, 450, 200, 595, 350); // // // Transform the rectangular part of the image to the destination rectangle // //----------------- // //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, // // 450, 200, 595, 350); // // // Transform the whole image to the destination parallelogram // //----------------- // //double parl[6] = { 450, 200, 595, 220, 575, 350 }; // //m_graphics.transformImage(img, parl); // // // Transform the rectangular part of the image to the destination parallelogram // //----------------- // //double parl[6] = { 450, 200, 595, 220, 575, 350 }; // //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, parl); // // // Transform image to the destination path. The scale is determined by a rectangle // //----------------- // //m_graphics.resetPath(); // //m_graphics.moveTo(450, 200); // //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); // //m_graphics.lineTo(470, 340); // //m_graphics.transformImagePath(img, 450, 200, 595, 350); // // // // Transform image to the destination path. // // The scale is determined by a rectangle // //----------------- // m_graphics.resetPath(); // m_graphics.moveTo(450, 200); // m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); // m_graphics.lineTo(470, 340); // m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, // 450, 200, 595, 350); // // // Transform image to the destination path. // // The transformation is determined by a parallelogram // //m_graphics.resetPath(); // //m_graphics.moveTo(450, 200); // //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); // //m_graphics.lineTo(470, 340); // //double parl[6] = { 450, 200, 595, 220, 575, 350 }; // //m_graphics.transformImagePath(img, parl); // // // Transform the rectangular part of the image to the destination path. // // The transformation is determined by a parallelogram // //m_graphics.resetPath(); // //m_graphics.moveTo(450, 200); // //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); // //m_graphics.lineTo(470, 340); // //double parl[6] = { 450, 200, 595, 220, 575, 350 }; // //m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, parl); //*/ // // // Add/Sub/Contrast Blending Modes // m_graphics.noLine(); // m_graphics.fillColor(70, 70, 0); // m_graphics.blendMode(TAGG2D::BlendAdd); // m_graphics.ellipse(500, 280, 20, 40); // // m_graphics.fillColor(255, 255, 255); // m_graphics.blendMode(TAGG2D::BlendContrast); // m_graphics.ellipse(500+40, 280, 20, 40); // // // // // Radial gradient. // m_graphics.blendMode(TAGG2D::BlendAlpha); // m_graphics.fillRadialGradient(400, 500, 40, // TAGG2D::Color(255, 255, 0, 0), // TAGG2D::Color(0, 0, 127), // TAGG2D::Color(0, 255, 0, 0)); // m_graphics.ellipse(400, 500, 40, 40); // // } // desmume-0.9.9/src/render3D.h0000644000175000017500000000742712140261633016340 0ustar guillaumeguillaume/* Copyright (C) 2006-2007 shash Copyright (C) 2007-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef RENDER3D_H #define RENDER3D_H #include "gfx3d.h" #include "types.h" //not using this right now #define CALL_CONVENTION typedef struct Render3DInterface { // The name of the plugin, this name will appear in the plugins list const char * name; //called once when the plugin starts up char (CALL_CONVENTION* NDS_3D_Init) (); //called when the emulator resets (is this necessary?) void (CALL_CONVENTION* NDS_3D_Reset) (); //called when the plugin shuts down void (CALL_CONVENTION* NDS_3D_Close) (); //called when the renderer should do its job and render the current display lists void (CALL_CONVENTION* NDS_3D_Render) (); // Called whenever 3D rendering needs to finish. This function should block the calling thread // and only release the block when 3D rendering is finished. (Before reading the 3D layer, be // sure to always call this function.) void (CALL_CONVENTION* NDS_3D_RenderFinish) (); //called when the emulator reconfigures its vram. you may need to invalidate your texture cache. void (CALL_CONVENTION* NDS_3D_VramReconfigureSignal) (); } GPU3DInterface; extern int cur3DCore; // gpu 3D core list, per port extern GPU3DInterface *core3DList[]; // Default null plugin #define GPU3D_NULL 0 extern GPU3DInterface gpu3DNull; // Extern pointer extern GPU3DInterface *gpu3D; char Default3D_Init(); void Default3D_Reset(); void Default3D_Close(); void Default3D_Render(); void Default3D_RenderFinish(); void Default3D_VramReconfigureSignal(); void NDS_3D_SetDriver (int core3DIndex); bool NDS_3D_ChangeCore(int newCore); enum Render3DErrorCode { RENDER3DERROR_NOERR = 0 }; typedef int Render3DError; class Render3D { protected: virtual Render3DError BeginRender(const GFX3D_State *renderState); virtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList); virtual Render3DError PostRender(); virtual Render3DError EndRender(const u64 frameCount); virtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll); virtual Render3DError UpdateToonTable(const u16 *toonTableBuffer); virtual Render3DError ClearFramebuffer(const GFX3D_State *renderState); virtual Render3DError ClearUsingImage() const; virtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const; virtual Render3DError SetupPolygon(const POLY *thePoly); virtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing); virtual Render3DError SetupViewport(const POLY *thePoly); public: virtual Render3DError Reset(); virtual Render3DError Render(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, const u64 frameCount); virtual Render3DError RenderFinish(); virtual Render3DError VramReconfigureSignal(); }; #endif desmume-0.9.9/src/matrix.cpp0000644000175000017500000003465712140261633016536 0ustar guillaumeguillaume/* Copyright (C) 2006-2007 shash Copyright (C) 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include #include #include #include "matrix.h" #include "MMU.h" void _NOSSE_MatrixMultVec4x4 (const float *matrix, float *vecPtr) { float x = vecPtr[0]; float y = vecPtr[1]; float z = vecPtr[2]; float w = vecPtr[3]; vecPtr[0] = x * matrix[0] + y * matrix[4] + z * matrix[ 8] + w * matrix[12]; vecPtr[1] = x * matrix[1] + y * matrix[5] + z * matrix[ 9] + w * matrix[13]; vecPtr[2] = x * matrix[2] + y * matrix[6] + z * matrix[10] + w * matrix[14]; vecPtr[3] = x * matrix[3] + y * matrix[7] + z * matrix[11] + w * matrix[15]; } void MatrixMultVec4x4 (const s32 *matrix, s32 *vecPtr) { const s32 x = vecPtr[0]; const s32 y = vecPtr[1]; const s32 z = vecPtr[2]; const s32 w = vecPtr[3]; vecPtr[0] = fx32_shiftdown(fx32_mul(x,matrix[0]) + fx32_mul(y,matrix[4]) + fx32_mul(z,matrix [8]) + fx32_mul(w,matrix[12])); vecPtr[1] = fx32_shiftdown(fx32_mul(x,matrix[1]) + fx32_mul(y,matrix[5]) + fx32_mul(z,matrix[ 9]) + fx32_mul(w,matrix[13])); vecPtr[2] = fx32_shiftdown(fx32_mul(x,matrix[2]) + fx32_mul(y,matrix[6]) + fx32_mul(z,matrix[10]) + fx32_mul(w,matrix[14])); vecPtr[3] = fx32_shiftdown(fx32_mul(x,matrix[3]) + fx32_mul(y,matrix[7]) + fx32_mul(z,matrix[11]) + fx32_mul(w,matrix[15])); } void MatrixMultVec3x3_fixed(const s32 *matrix, s32 *vecPtr) { const s32 x = vecPtr[0]; const s32 y = vecPtr[1]; const s32 z = vecPtr[2]; vecPtr[0] = fx32_shiftdown(fx32_mul(x,matrix[0]) + fx32_mul(y,matrix[4]) + fx32_mul(z,matrix[8])); vecPtr[1] = fx32_shiftdown(fx32_mul(x,matrix[1]) + fx32_mul(y,matrix[5]) + fx32_mul(z,matrix[9])); vecPtr[2] = fx32_shiftdown(fx32_mul(x,matrix[2]) + fx32_mul(y,matrix[6]) + fx32_mul(z,matrix[10])); } //------------------------- //switched SSE functions: implementations for no SSE #ifndef ENABLE_SSE void MatrixMultVec4x4 (const float *matrix, float *vecPtr) { _NOSSE_MatrixMultVec4x4(matrix, vecPtr); } void MatrixMultVec3x3 (const float *matrix, float *vecPtr) { float x = vecPtr[0]; float y = vecPtr[1]; float z = vecPtr[2]; vecPtr[0] = x * matrix[0] + y * matrix[4] + z * matrix[ 8]; vecPtr[1] = x * matrix[1] + y * matrix[5] + z * matrix[ 9]; vecPtr[2] = x * matrix[2] + y * matrix[6] + z * matrix[10]; } void MatrixMultiply (float *matrix, const float *rightMatrix) { float tmpMatrix[16]; tmpMatrix[0] = (matrix[0]*rightMatrix[0])+(matrix[4]*rightMatrix[1])+(matrix[8]*rightMatrix[2])+(matrix[12]*rightMatrix[3]); tmpMatrix[1] = (matrix[1]*rightMatrix[0])+(matrix[5]*rightMatrix[1])+(matrix[9]*rightMatrix[2])+(matrix[13]*rightMatrix[3]); tmpMatrix[2] = (matrix[2]*rightMatrix[0])+(matrix[6]*rightMatrix[1])+(matrix[10]*rightMatrix[2])+(matrix[14]*rightMatrix[3]); tmpMatrix[3] = (matrix[3]*rightMatrix[0])+(matrix[7]*rightMatrix[1])+(matrix[11]*rightMatrix[2])+(matrix[15]*rightMatrix[3]); tmpMatrix[4] = (matrix[0]*rightMatrix[4])+(matrix[4]*rightMatrix[5])+(matrix[8]*rightMatrix[6])+(matrix[12]*rightMatrix[7]); tmpMatrix[5] = (matrix[1]*rightMatrix[4])+(matrix[5]*rightMatrix[5])+(matrix[9]*rightMatrix[6])+(matrix[13]*rightMatrix[7]); tmpMatrix[6] = (matrix[2]*rightMatrix[4])+(matrix[6]*rightMatrix[5])+(matrix[10]*rightMatrix[6])+(matrix[14]*rightMatrix[7]); tmpMatrix[7] = (matrix[3]*rightMatrix[4])+(matrix[7]*rightMatrix[5])+(matrix[11]*rightMatrix[6])+(matrix[15]*rightMatrix[7]); tmpMatrix[8] = (matrix[0]*rightMatrix[8])+(matrix[4]*rightMatrix[9])+(matrix[8]*rightMatrix[10])+(matrix[12]*rightMatrix[11]); tmpMatrix[9] = (matrix[1]*rightMatrix[8])+(matrix[5]*rightMatrix[9])+(matrix[9]*rightMatrix[10])+(matrix[13]*rightMatrix[11]); tmpMatrix[10] = (matrix[2]*rightMatrix[8])+(matrix[6]*rightMatrix[9])+(matrix[10]*rightMatrix[10])+(matrix[14]*rightMatrix[11]); tmpMatrix[11] = (matrix[3]*rightMatrix[8])+(matrix[7]*rightMatrix[9])+(matrix[11]*rightMatrix[10])+(matrix[15]*rightMatrix[11]); tmpMatrix[12] = (matrix[0]*rightMatrix[12])+(matrix[4]*rightMatrix[13])+(matrix[8]*rightMatrix[14])+(matrix[12]*rightMatrix[15]); tmpMatrix[13] = (matrix[1]*rightMatrix[12])+(matrix[5]*rightMatrix[13])+(matrix[9]*rightMatrix[14])+(matrix[13]*rightMatrix[15]); tmpMatrix[14] = (matrix[2]*rightMatrix[12])+(matrix[6]*rightMatrix[13])+(matrix[10]*rightMatrix[14])+(matrix[14]*rightMatrix[15]); tmpMatrix[15] = (matrix[3]*rightMatrix[12])+(matrix[7]*rightMatrix[13])+(matrix[11]*rightMatrix[14])+(matrix[15]*rightMatrix[15]); memcpy (matrix, tmpMatrix, sizeof(float)*16); } void MatrixTranslate (float *matrix, const float *ptr) { matrix[12] += (matrix[0]*ptr[0])+(matrix[4]*ptr[1])+(matrix[ 8]*ptr[2]); matrix[13] += (matrix[1]*ptr[0])+(matrix[5]*ptr[1])+(matrix[ 9]*ptr[2]); matrix[14] += (matrix[2]*ptr[0])+(matrix[6]*ptr[1])+(matrix[10]*ptr[2]); matrix[15] += (matrix[3]*ptr[0])+(matrix[7]*ptr[1])+(matrix[11]*ptr[2]); } void MatrixScale (float *matrix, const float *ptr) { matrix[0] *= ptr[0]; matrix[1] *= ptr[0]; matrix[2] *= ptr[0]; matrix[3] *= ptr[0]; matrix[4] *= ptr[1]; matrix[5] *= ptr[1]; matrix[6] *= ptr[1]; matrix[7] *= ptr[1]; matrix[8] *= ptr[2]; matrix[9] *= ptr[2]; matrix[10] *= ptr[2]; matrix[11] *= ptr[2]; } #endif //switched c/asm functions //----------------------------------------- void MatrixInit (s32 *matrix) { memset (matrix, 0, sizeof(s32)*16); matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1<<12; } void MatrixInit (float *matrix) { memset (matrix, 0, sizeof(s32)*16); matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.f; } void MatrixIdentity (s32 *matrix) { matrix[1] = matrix[2] = matrix[3] = matrix[4] = 0; matrix[6] = matrix[7] = matrix[8] = matrix[9] = 0; matrix[11] = matrix[12] = matrix[13] = matrix[14] = 0; matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1<<12; } s32 MatrixGetMultipliedIndex (int index, s32 *matrix, s32 *rightMatrix) { int iMod = index%4, iDiv = (index>>2)<<2; s64 temp = ((s64)matrix[iMod ]*rightMatrix[iDiv ])+((s64)matrix[iMod+ 4]*rightMatrix[iDiv+1])+ ((s64)matrix[iMod+8]*rightMatrix[iDiv+2])+((s64)matrix[iMod+12]*rightMatrix[iDiv+3]); return (s32)(temp>>12); } void MatrixSet (s32 *matrix, int x, int y, s32 value) { matrix [x+(y<<2)] = value; } void MatrixCopy (float* matrixDST, const float* matrixSRC) { matrixDST[0] = matrixSRC[0]; matrixDST[1] = matrixSRC[1]; matrixDST[2] = matrixSRC[2]; matrixDST[3] = matrixSRC[3]; matrixDST[4] = matrixSRC[4]; matrixDST[5] = matrixSRC[5]; matrixDST[6] = matrixSRC[6]; matrixDST[7] = matrixSRC[7]; matrixDST[8] = matrixSRC[8]; matrixDST[9] = matrixSRC[9]; matrixDST[10] = matrixSRC[10]; matrixDST[11] = matrixSRC[11]; matrixDST[12] = matrixSRC[12]; matrixDST[13] = matrixSRC[13]; matrixDST[14] = matrixSRC[14]; matrixDST[15] = matrixSRC[15]; } void MatrixCopy (s32* matrixDST, const s32* matrixSRC) { memcpy(matrixDST,matrixSRC,sizeof(s32)*16); } int MatrixCompare (const s32* matrixDST, const s32* matrixSRC) { return memcmp((void*)matrixDST, matrixSRC, sizeof(s32)*16); } void MatrixStackInit(MatrixStack *stack) { for (int i = 0; i < stack->size; i++) { MatrixInit(&stack->matrix[i*16]); } stack->position = 0; } void MatrixStackSetMaxSize (MatrixStack *stack, int size) { int i; stack->size = (size + 1); if (stack->matrix != NULL) { free (stack->matrix); } stack->matrix = new s32[stack->size*16*sizeof(s32)]; for (i = 0; i < stack->size; i++) { MatrixInit (&stack->matrix[i*16]); } stack->size--; } MatrixStack::MatrixStack(int size, int type) { MatrixStackSetMaxSize(this,size); this->type = type; } static void MatrixStackSetStackPosition (MatrixStack *stack, int pos) { stack->position += pos; if((stack->position < 0) || (stack->position > stack->size)) MMU_new.gxstat.se = 1; //once upon a time, we tried clamping to the size. //this utterly broke sims 2 apartment pets. //changing to wrap around made it work perfectly stack->position = ((u32)stack->position) & stack->size; } void MatrixStackPushMatrix (MatrixStack *stack, const s32 *ptr) { //printf("Push %i pos %i\n", stack->type, stack->position); if ((stack->type == 0) || (stack->type == 3)) MatrixCopy (&stack->matrix[0], ptr); else MatrixCopy (&stack->matrix[stack->position*16], ptr); MatrixStackSetStackPosition (stack, 1); } void MatrixStackPopMatrix (s32 *mtxCurr, MatrixStack *stack, int size) { //printf("Pop %i pos %i (change %d)\n", stack->type, stack->position, -size); MatrixStackSetStackPosition(stack, -size); if ((stack->type == 0) || (stack->type == 3)) MatrixCopy (mtxCurr, &stack->matrix[0]); else MatrixCopy (mtxCurr, &stack->matrix[stack->position*16]); } s32 * MatrixStackGetPos (MatrixStack *stack, int pos) { assert(pos<31); return &stack->matrix[pos*16]; } s32 * MatrixStackGet (MatrixStack *stack) { return &stack->matrix[stack->position*16]; } void MatrixStackLoadMatrix (MatrixStack *stack, int pos, const s32 *ptr) { assert(pos<31); MatrixCopy (&stack->matrix[pos*16], ptr); } void Vector2Copy(float *dst, const float *src) { dst[0] = src[0]; dst[1] = src[1]; } void Vector2Add(float *dst, const float *src) { dst[0] += src[0]; dst[1] += src[1]; } void Vector2Subtract(float *dst, const float *src) { dst[0] -= src[0]; dst[1] -= src[1]; } float Vector2Dot(const float *a, const float *b) { return (a[0]*b[0]) + (a[1]*b[1]); } /* http://www.gamedev.net/community/forums/topic.asp?topic_id=289972 */ float Vector2Cross(const float *a, const float *b) { return (a[0]*b[1]) - (a[1]*b[0]); } float Vector3Dot(const float *a, const float *b) { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; } void Vector3Cross(float* dst, const float *a, const float *b) { dst[0] = a[1]*b[2] - a[2]*b[1]; dst[1] = a[2]*b[0] - a[0]*b[2]; dst[2] = a[0]*b[1] - a[1]*b[0]; } float Vector3Length(const float *a) { float lengthSquared = Vector3Dot(a,a); float length = sqrt(lengthSquared); return length; } void Vector3Add(float *dst, const float *src) { dst[0] += src[0]; dst[1] += src[1]; dst[2] += src[2]; } void Vector3Subtract(float *dst, const float *src) { dst[0] -= src[0]; dst[1] -= src[1]; dst[2] -= src[2]; } void Vector3Scale(float *dst, const float scale) { dst[0] *= scale; dst[1] *= scale; dst[2] *= scale; } void Vector3Copy(float *dst, const float *src) { dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; } void Vector3Normalize(float *dst) { float length = Vector3Length(dst); Vector3Scale(dst,1.0f/length); } void Vector4Copy(float *dst, const float *src) { dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst[3] = src[3]; } void MatrixMultiply (s32 *matrix, const s32 *rightMatrix) { s32 tmpMatrix[16]; tmpMatrix[0] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[0])+fx32_mul(matrix[4],rightMatrix[1])+fx32_mul(matrix[8],rightMatrix[2])+fx32_mul(matrix[12],rightMatrix[3])); tmpMatrix[1] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[0])+fx32_mul(matrix[5],rightMatrix[1])+fx32_mul(matrix[9],rightMatrix[2])+fx32_mul(matrix[13],rightMatrix[3])); tmpMatrix[2] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[0])+fx32_mul(matrix[6],rightMatrix[1])+fx32_mul(matrix[10],rightMatrix[2])+fx32_mul(matrix[14],rightMatrix[3])); tmpMatrix[3] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[0])+fx32_mul(matrix[7],rightMatrix[1])+fx32_mul(matrix[11],rightMatrix[2])+fx32_mul(matrix[15],rightMatrix[3])); tmpMatrix[4] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[4])+fx32_mul(matrix[4],rightMatrix[5])+fx32_mul(matrix[8],rightMatrix[6])+fx32_mul(matrix[12],rightMatrix[7])); tmpMatrix[5] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[4])+fx32_mul(matrix[5],rightMatrix[5])+fx32_mul(matrix[9],rightMatrix[6])+fx32_mul(matrix[13],rightMatrix[7])); tmpMatrix[6] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[4])+fx32_mul(matrix[6],rightMatrix[5])+fx32_mul(matrix[10],rightMatrix[6])+fx32_mul(matrix[14],rightMatrix[7])); tmpMatrix[7] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[4])+fx32_mul(matrix[7],rightMatrix[5])+fx32_mul(matrix[11],rightMatrix[6])+fx32_mul(matrix[15],rightMatrix[7])); tmpMatrix[8] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[8])+fx32_mul(matrix[4],rightMatrix[9])+fx32_mul(matrix[8],rightMatrix[10])+fx32_mul(matrix[12],rightMatrix[11])); tmpMatrix[9] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[8])+fx32_mul(matrix[5],rightMatrix[9])+fx32_mul(matrix[9],rightMatrix[10])+fx32_mul(matrix[13],rightMatrix[11])); tmpMatrix[10] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[8])+fx32_mul(matrix[6],rightMatrix[9])+fx32_mul(matrix[10],rightMatrix[10])+fx32_mul(matrix[14],rightMatrix[11])); tmpMatrix[11] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[8])+fx32_mul(matrix[7],rightMatrix[9])+fx32_mul(matrix[11],rightMatrix[10])+fx32_mul(matrix[15],rightMatrix[11])); tmpMatrix[12] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[12])+fx32_mul(matrix[4],rightMatrix[13])+fx32_mul(matrix[8],rightMatrix[14])+fx32_mul(matrix[12],rightMatrix[15])); tmpMatrix[13] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[12])+fx32_mul(matrix[5],rightMatrix[13])+fx32_mul(matrix[9],rightMatrix[14])+fx32_mul(matrix[13],rightMatrix[15])); tmpMatrix[14] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[12])+fx32_mul(matrix[6],rightMatrix[13])+fx32_mul(matrix[10],rightMatrix[14])+fx32_mul(matrix[14],rightMatrix[15])); tmpMatrix[15] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[12])+fx32_mul(matrix[7],rightMatrix[13])+fx32_mul(matrix[11],rightMatrix[14])+fx32_mul(matrix[15],rightMatrix[15])); memcpy(matrix,tmpMatrix,sizeof(s32)*16); } void MatrixScale(s32 *matrix, const s32 *ptr) { //zero 21-sep-2010 - verified unrolling seems faster on my cpu MACRODO_N(12, matrix[X] = fx32_shiftdown(fx32_mul(matrix[X],ptr[X>>2])) ); } void MatrixTranslate(s32 *matrix, const s32 *ptr) { MACRODO_N(4, { s64 temp = fx32_shiftup(matrix[X+12]); temp += fx32_mul(matrix[X+0],ptr[0]); temp += fx32_mul(matrix[X+4],ptr[1]); temp += fx32_mul(matrix[X+8],ptr[2]); matrix[X+12] = fx32_shiftdown(temp); }); } void MatrixMultVec4x4_M2(const s32 *matrix, s32 *vecPtr) { MatrixMultVec4x4(matrix+16,vecPtr); MatrixMultVec4x4(matrix,vecPtr); } desmume-0.9.9/src/bios.h0000644000175000017500000000143212140261633015614 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef BIOS_H #define BIOS_H #include "armcpu.h" extern u32 (* ARM_swi_tab[2][32])();; #endif desmume-0.9.9/src/mc.cpp0000644000175000017500000011160612140261633015617 0ustar guillaumeguillaume/* Copyright (C) 2006 thoduv Copyright (C) 2006-2007 Theo Berkau Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include "debug.h" #include "types.h" #include "mc.h" #include "movie.h" #include "readwrite.h" #include "NDSSystem.h" #define TIXML_USE_STL #include "utils/tinyxml/tinyxml.h" //temporary hack until we have better error reporting facilities #ifdef _WINDOWS #include #elif defined(_XBOX) #include // it`s really need? #endif #define FW_CMD_READ 0x03 #define FW_CMD_WRITEDISABLE 0x04 #define FW_CMD_READSTATUS 0x05 #define FW_CMD_WRITEENABLE 0x06 #define FW_CMD_PAGEWRITE 0x0A #define FW_CMD_READ_ID 0x9F #define BM_CMD_AUTODETECT 0xFF #define BM_CMD_WRITESTATUS 0x01 #define BM_CMD_WRITELOW 0x02 #define BM_CMD_READLOW 0x03 #define BM_CMD_WRITEDISABLE 0x04 #define BM_CMD_READSTATUS 0x05 #define BM_CMD_WRITEENABLE 0x06 #define BM_CMD_WRITEHIGH 0x0A #define BM_CMD_READHIGH 0x0B /* FLASH*/ #define COMM_PAGE_WRITE 0x0A #define COMM_PAGE_ERASE 0xDB #define COMM_SECTOR_ERASE 0xD8 #define COMM_CHIP_ERASE 0xC7 #define CARDFLASH_READ_BYTES_FAST 0x0B /* Not used*/ #define CARDFLASH_DEEP_POWDOWN 0xB9 /* Not used*/ #define CARDFLASH_WAKEUP 0xAB /* Not used*/ //since r2203 this was 0x00. //but baby pals proves finally that it should be 0xFF: //the game reads its initial sound volumes from uninitialized data, and if it is 0, the game will be silent //if it is 0xFF then the game starts with its sound and music at max, as presumably it is supposed to. //so in r3303 I finally changed it (no$ appears definitely to initialized to 0xFF) static const u8 kUninitializedSaveDataValue = 0xFF; static const char* kDesmumeSaveCookie = "|-DESMUME SAVE-|"; static const u32 saveSizes[] = {512, // 4k 8*1024, // 64k 32*1024, // 512k 64*1024, // 1Mbit 256*1024, // 2Mbit 512*1024, // 4Mbit 1024*1024, // 8Mbit 2048*1024, // 16Mbit 4096*1024, // 32Mbit 8192*1024, // 64Mbit 16384*1024, // 128Mbit 32768*1024, // 256Mbit 65536*1024, // 512Mbit 0xFFFFFFFF}; static const u32 saveSizes_count = ARRAY_SIZE(saveSizes); //the lookup table from user save types to save parameters const SAVE_TYPE save_types[] = { {"Autodetect", MC_TYPE_AUTODETECT,1}, {"EEPROM 4kbit",MC_TYPE_EEPROM1,MC_SIZE_4KBITS}, {"EEPROM 64kbit",MC_TYPE_EEPROM2,MC_SIZE_64KBITS}, {"EEPROM 512kbit",MC_TYPE_EEPROM2,MC_SIZE_512KBITS}, {"FRAM 256kbit",MC_TYPE_FRAM,MC_SIZE_256KBITS}, {"FLASH 2Mbit",MC_TYPE_FLASH,MC_SIZE_2MBITS}, {"FLASH 4Mbit",MC_TYPE_FLASH,MC_SIZE_4MBITS}, {"FLASH 8Mbit",MC_TYPE_FLASH,MC_SIZE_8MBITS}, {"FLASH 16Mbit",MC_TYPE_FLASH,MC_SIZE_16MBITS}, {"FLASH 32Mbit",MC_TYPE_FLASH,MC_SIZE_32MBITS}, {"FLASH 64Mbit",MC_TYPE_FLASH,MC_SIZE_64MBITS}, {"FLASH 128Mbit",MC_TYPE_FLASH,MC_SIZE_128MBITS}, {"FLASH 256Mbit",MC_TYPE_FLASH,MC_SIZE_256MBITS}, {"FLASH 512Mbit",MC_TYPE_FLASH,MC_SIZE_512MBITS} }; //forces the currently selected backup type to be current //(can possibly be used to repair poorly chosen save types discovered late in gameplay i.e. pokemon gamers) void backup_forceManualBackupType() { MMU_new.backupDevice.forceManualBackupType(); } void backup_setManualBackupType(int type) { CommonSettings.manualBackupType = type; } void mc_init(memory_chip_t *mc, int type) { mc->com = 0; mc->addr = 0; mc->addr_shift = 0; mc->data = NULL; mc->size = 0; mc->write_enable = FALSE; mc->writeable_buffer = FALSE; mc->type = type; mc->autodetectsize = 0; switch(mc->type) { case MC_TYPE_EEPROM1: mc->addr_size = 1; break; case MC_TYPE_EEPROM2: case MC_TYPE_FRAM: mc->addr_size = 2; break; case MC_TYPE_FLASH: mc->addr_size = 3; break; default: break; } } u8 *mc_alloc(memory_chip_t *mc, u32 size) { u8 *buffer; buffer = new u8[size]; memset(buffer,0,size); if (mc->data) delete [] mc->data; mc->data = buffer; if(!buffer) { return NULL; } mc->size = size; mc->writeable_buffer = TRUE; return buffer; } void mc_free(memory_chip_t *mc) { if(mc->data) delete[] mc->data; mc_init(mc, 0); } void fw_reset_com(memory_chip_t *mc) { if(mc->com == FW_CMD_PAGEWRITE) { if (mc->fp) { fseek(mc->fp, 0, SEEK_SET); fwrite(mc->data, mc->size, 1, mc->fp); } if (mc->isFirmware&&CommonSettings.UseExtFirmware) { // copy User Settings 1 to User Settings 0 area memcpy(&mc->data[0x3FE00], &mc->data[0x3FF00], 0x100); printf("Firmware: save config"); FILE *fp = fopen(mc->userfile, "wb"); if (fp) { if (fwrite(&mc->data[0x3FF00], 1, 0x100, fp) == 0x100) // User Settings { if (fwrite(&mc->data[0x0002A], 1, 0x1D6, fp) == 0x1D6) // WiFi Settings { if (fwrite(&mc->data[0x3FA00], 1, 0x300, fp) == 0x300) // WiFi AP Settings printf(" - done\n"); else printf(" - failed\n"); } } fclose(fp); } else printf(" - failed\n"); } mc->write_enable = FALSE; } mc->com = 0; } u8 fw_transfer(memory_chip_t *mc, u8 data) { if(mc->com == FW_CMD_READ || mc->com == FW_CMD_PAGEWRITE) /* check if we are in a command that needs 3 bytes address */ { if(mc->addr_shift > 0) /* if we got a complete address */ { mc->addr_shift--; mc->addr |= data << (mc->addr_shift * 8); /* argument is a byte of address */ } else /* if we have received 3 bytes of address, proceed command */ { switch(mc->com) { case FW_CMD_READ: if(mc->addr < mc->size) /* check if we can read */ { data = mc->data[mc->addr]; /* return byte */ mc->addr++; /* then increment address */ } break; case FW_CMD_PAGEWRITE: if(mc->addr < mc->size) { mc->data[mc->addr] = data; /* write byte */ mc->addr++; } break; } } } else if(mc->com == FW_CMD_READ_ID) { switch(mc->addr) { //here is an ID string measured from an old ds fat: 62 16 00 (0x62=sanyo) //but we chose to use an ST from martin's ds fat string so programs might have a clue as to the firmware size: //20 40 12 case 0: data = 0x20; mc->addr=1; break; case 1: data = 0x40; //according to gbatek this is the device ID for the flash on someone's ds fat mc->addr=2; break; case 2: data = 0x12; mc->addr = 0; break; } } else if(mc->com == FW_CMD_READSTATUS) { return (mc->write_enable ? 0x02 : 0x00); } else //finally, check if it's a new command { switch(data) { case 0: break; //nothing case FW_CMD_READ_ID: mc->addr = 0; mc->com = FW_CMD_READ_ID; break; case FW_CMD_READ: //read command mc->addr = 0; mc->addr_shift = 3; mc->com = FW_CMD_READ; break; case FW_CMD_WRITEENABLE: //enable writing if(mc->writeable_buffer) { mc->write_enable = TRUE; } break; case FW_CMD_WRITEDISABLE: //disable writing mc->write_enable = FALSE; break; case FW_CMD_PAGEWRITE: //write command if(mc->write_enable) { mc->addr = 0; mc->addr_shift = 3; mc->com = FW_CMD_PAGEWRITE; } else { data = 0; } break; case FW_CMD_READSTATUS: //status register command mc->com = FW_CMD_READSTATUS; break; default: printf("Unhandled FW command: %02X\n", data); break; } } return data; } bool BackupDevice::save_state(EMUFILE* os) { u32 version = 2; //v0 write32le(version,os); write32le(write_enable,os); write32le(com,os); write32le(addr_size,os); write32le(addr_counter,os); write32le((u32)state,os); writebuffer(data,os); writebuffer(data_autodetect,os); //v1 write32le(addr,os); //v2 write8le(motionInitState,os); write8le(motionFlag,os); return true; } bool BackupDevice::load_state(EMUFILE* is) { u32 version; if(read32le(&version,is)!=1) return false; if(version>=0) { readbool(&write_enable,is); read32le(&com,is); read32le(&addr_size,is); read32le(&addr_counter,is); u32 temp; read32le(&temp,is); state = (STATE)temp; readbuffer(data,is); readbuffer(data_autodetect,is); } if(version>=1) read32le(&addr,is); if(version>=2) { read8le(&motionInitState,is); read8le(&motionFlag,is); } return true; } BackupDevice::BackupDevice() { isMovieMode = false; reset(); } //due to unfortunate shortcomings in the emulator architecture, //at reset-time, we won't have a filename to the .dsv file. //so the only difference between load_rom (init) and reset is that //one of them saves the filename void BackupDevice::load_rom(const char* filename) { isMovieMode = false; this->filename = filename; reset(); } void BackupDevice::movie_mode() { isMovieMode = true; reset(); } void BackupDevice::reset_hardware() { write_enable = FALSE; com = 0; addr = addr_counter = 0; motionInitState = MOTION_INIT_STATE_IDLE; motionFlag = MOTION_FLAG_NONE; state = DETECTING; flushPending = false; lazyFlushPending = false; } void BackupDevice::reset() { memset(&info, 0, sizeof(info)); reset_hardware(); resize(0); data_autodetect.resize(0); addr_size = 0; loadfile(); //if the user has requested a manual choice for backup type, and we havent imported a raw save file, then apply it now if(state == DETECTING && CommonSettings.manualBackupType != MC_TYPE_AUTODETECT) { state = RUNNING; int savetype = save_types[CommonSettings.manualBackupType].media_type; int savesize = save_types[CommonSettings.manualBackupType].size; ensure((u32)savesize); //expand properly if necessary resize(savesize); //truncate if necessary addr_size = addr_size_for_old_save_type(savetype); flush(); } } void BackupDevice::close_rom() { flush(); } u8 BackupDevice::searchFileSaveType(u32 size) { for (u8 i = 1; i < MAX_SAVE_TYPES; i++) { if (size == save_types[i].size) return (i-1); } return 0xFF; } void BackupDevice::reset_command() { //printf("MC RESET\n"); //for a performance hack, save files are only flushed after each reset command //(hopefully, after each page) if(flushPending) { flush(); flushPending = false; lazyFlushPending = false; } if(state == DETECTING && data_autodetect.size()>0) { //we can now safely detect the save address size u32 autodetect_size = data_autodetect.size(); printf("Autodetecting with autodetect_size=%d\n",autodetect_size); const u8 sm64_sig[] = {0x01,0x80,0x00,0x00}; if(autodetect_size == 4 && !memcmp(&data_autodetect[0],sm64_sig,4)) { addr_size = 2; } else //detect based on rules switch(autodetect_size) { case 0: case 1: printf("Catastrophic error while autodetecting save type.\nIt will need to be specified manually\n"); #ifdef _WINDOWS MessageBox(0,"Catastrophic Error Code: Camel;\nyour save type has not been autodetected correctly;\nplease report to developers",0,0); #endif addr_size = 1; //choose 1 just to keep the busted savefile from growing too big break; case 2: //the modern typical case for small eeproms addr_size = 1; break; case 3: //another modern typical case.. //but unfortunately we select this case for spider-man 3, when what it meant to do was //present the archaic 1+2 case //it seems that over the hedge does this also. addr_size = 2; break; case 4: //a modern typical case addr_size = 3; break; default: //the archaic case: write the address and then some modulo-4 number of bytes //why modulo 4? who knows. //SM64 (KOR) makes it here with autodetect_size=11 and nothing interesting in the buffer addr_size = autodetect_size & 3; break; } state = RUNNING; data_autodetect.resize(0); flush(); } com = 0; } u8 BackupDevice::data_command(u8 val, int cpu) { //printf("MC CMD: %02X\n",val); //motion: some guessing here... hope it doesn't break anything if(com == BM_CMD_READLOW && motionInitState == MOTION_INIT_STATE_RECEIVED_4_B && val == 0) { motionInitState = MOTION_INIT_STATE_IDLE; motionFlag |= MOTION_FLAG_ENABLED; //return 0x04; //return 0x04 to enable motion!!!!! return 0; //but we return 0 to disable it! since we don't emulate it anyway } //if the game firmly believes we have motion support, then ignore all motion commands, since theyre not emulated. if(motionFlag & MOTION_FLAG_SENSORMODE) { return 0; } if(com == BM_CMD_READLOW || com == BM_CMD_WRITELOW) { //handle data or address if(state == DETECTING) { if(com == BM_CMD_WRITELOW) { printf("Unexpected backup device initialization sequence using writes!\n"); } //just buffer the data until we're no longer detecting data_autodetect.push_back(val); val = 0; } else { if(addr_counteraddr_size = addr_size; resize(datasize); memcpy(&this->data[0],data,datasize); //dump back out as a dsv, just to keep things sane flush(); } //======================================================================= no$GBA //======================================================================= //======================================================================= const char no_GBA_HEADER_ID[] = "NocashGbaBackupMediaSavDataFile"; const char no_GBA_HEADER_SRAM_ID[] = "SRAM"; u32 BackupDevice::get_save_nogba_size(const char* fname) { FILE *fsrc = fopen(fname, "rb"); if (fsrc) { char src[0x50] = {0}; u32 fsize = 0; fseek(fsrc, 0, SEEK_END); fsize = ftell(fsrc); fseek(fsrc, 0, SEEK_SET); if (fsize < 0x50) { fclose(fsrc); return 0xFFFFFFFF; } memset(&src[0], 0, sizeof(src)); if (fread(src, 1, sizeof(src), fsrc) != sizeof(src)) { fclose(fsrc); return 0xFFFFFFFF; } for (u8 i = 0; i < 0x1F; i++) if (src[i] != no_GBA_HEADER_ID[i]) { fclose(fsrc); return 0xFFFFFFFF; } if (src[0x1F] != 0x1A) { fclose(fsrc); return 0xFFFFFFFF; } for (int i = 0; i < 0x4; i++) if (src[i+0x40] != no_GBA_HEADER_SRAM_ID[i]) { fclose(fsrc); return 0xFFFFFFFF; } u32 compressMethod = *((u32*)(src+0x44)); if (compressMethod == 0) { fclose(fsrc); return *((u32*)(src+0x48)); } else if (compressMethod == 1) { fclose(fsrc); return *((u32*)(src+0x4C)); } fclose(fsrc); } return 0xFFFFFFFF; } static int no_gba_unpackSAV(void *in_buf, u32 fsize, void *out_buf, u32 &size) { u8 *src = (u8 *)in_buf; u8 *dst = (u8 *)out_buf; u32 src_pos = 0; u32 dst_pos = 0; u8 cc = 0; u32 size_unpacked = 0; u32 size_packed = 0; u32 compressMethod = 0; if (fsize < 0x50) return (1); for (int i = 0; i < 0x1F; i++) { if (src[i] != no_GBA_HEADER_ID[i]) return (2); } if (src[0x1F] != 0x1A) return (2); for (int i = 0; i < 0x4; i++) { if (src[i+0x40] != no_GBA_HEADER_SRAM_ID[i]) return (2); } compressMethod = *((u32*)(src+0x44)); if (compressMethod == 0) // unpacked { size_unpacked = *((u32*)(src+0x48)); src_pos = 0x4C; for (u32 i = 0; i < size_unpacked; i++) { dst[dst_pos++] = src[src_pos++]; } size = dst_pos; return (0); } if (compressMethod == 1) // packed (method 1) { size_packed = *((u32*)(src+0x48)); size_unpacked = *((u32*)(src+0x4C)); src_pos = 0x50; while (true) { cc = src[src_pos++]; if (cc == 0) { size = dst_pos; return (0); } if (cc == 0x80) { u16 tsize = *((u16*)(src+src_pos+1)); for (int t = 0; t < tsize; t++) dst[dst_pos++] = src[src_pos]; src_pos += 3; continue; } if (cc > 0x80) // repeat { cc -= 0x80; for (int t = 0; t < cc; t++) dst[dst_pos++] = src[src_pos]; src_pos++; continue; } // copy for (int t = 0; t < cc; t++) dst[dst_pos++] = src[src_pos++]; } size = dst_pos; return (0); } return (200); } static u32 no_gba_savTrim(void *buf, u32 size) { u32 rows = size / 16; u32 pos = (size - 16); u8 *src = (u8*)buf; for (unsigned int i = 0; i < rows; i++, pos -= 16) { if (src[pos] == 0xFF) { for (int t = 0; t < 16; t++) { if (src[pos+t] != 0xFF) return (pos+16); } } else { return (pos+16); } } return (size); } static u32 no_gba_fillLeft(u32 size) { for (u32 i = 1; i < ARRAY_SIZE(save_types); i++) { if (size <= (u32)save_types[i].size) return (size + (save_types[i].size - size)); } return size; } bool BackupDevice::load_no_gba(const char *fname, u32 force_size) { FILE *fsrc = fopen(fname, "rb"); u8 *in_buf = NULL; u8 *out_buf = NULL; if (fsrc) { u32 fsize = 0; fseek(fsrc, 0, SEEK_END); fsize = ftell(fsrc); fseek(fsrc, 0, SEEK_SET); //printf("Open %s file (size %i bytes)\n", fname, fsize); in_buf = new u8 [fsize]; if (fread(in_buf, 1, fsize, fsrc) == fsize) { out_buf = new u8 [8 * 1024 * 1024 / 8]; u32 size = 0; memset(out_buf, 0xFF, 8 * 1024 * 1024 / 8); if (no_gba_unpackSAV(in_buf, fsize, out_buf, size) == 0) { if (force_size > 0) size = force_size; //printf("New size %i byte(s)\n", size); size = no_gba_savTrim(out_buf, size); //printf("--- new size after trim %i byte(s)\n", size); size = no_gba_fillLeft(size); //printf("--- new size after fill %i byte(s)\n", size); raw_applyUserSettings(size, (force_size > 0)); resize(size); for (u32 tt = 0; tt < size; tt++) data[tt] = out_buf[tt]; //dump back out as a dsv, just to keep things sane flush(); printf("---- Loaded no$GBA save\n"); if (in_buf) delete [] in_buf; if (out_buf) delete [] out_buf; fclose(fsrc); return true; } if (out_buf) delete [] out_buf; } if (in_buf) delete [] in_buf; fclose(fsrc); } return false; } bool BackupDevice::save_no_gba(const char* fname) { FILE* outf = fopen(fname,"wb"); if(!outf) return false; u32 size = data.size(); u32 padSize = pad_up_size(size); if(data.size()>0) fwrite(&data[0],1,size,outf); for(u32 i=size;ifail()) { delete inf; //no dsv found; we need to try auto-importing a file with .sav extension printf("DeSmuME .dsv save file not found. Trying to load an old raw .sav file.\n"); //change extension to sav char tmp[MAX_PATH]; strcpy(tmp,filename.c_str()); tmp[strlen(tmp)-3] = 0; strcat(tmp,"sav"); inf = new EMUFILE_FILE(tmp,"rb"); if(inf->fail()) { delete inf; printf("Missing save file %s\n",filename.c_str()); return; } delete inf; if (!load_no_gba(tmp)) load_raw(tmp); } else { //scan for desmume save footer const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie); char *sigbuf = new char[cookieLen]; inf->fseek(-cookieLen, SEEK_END); inf->fread(sigbuf,cookieLen); int cmp = memcmp(sigbuf,kDesmumeSaveCookie,cookieLen); delete[] sigbuf; if(cmp) { //maybe it is a misnamed raw save file. try loading it that way printf("Not a DeSmuME .dsv save file. Trying to load as raw.\n"); delete inf; if (!load_no_gba(filename.c_str())) load_raw(filename.c_str()); return; } //desmume format inf->fseek(-cookieLen, SEEK_END); inf->fseek(-4, SEEK_CUR); u32 version = 0xFFFFFFFF; read32le(&version,inf); if(version!=0) { printf("Unknown save file format\n"); return; } inf->fseek(-24, SEEK_CUR); read32le(&info.size,inf); read32le(&info.padSize,inf); read32le(&info.type,inf); read32le(&info.addr_size,inf); read32le(&info.mem_size,inf); u32 left = 0; if (CommonSettings.autodetectBackupMethod == 1) { if (advsc.isLoaded()) { info.type = advsc.getSaveType(); if (info.type != 0xFF && info.type != 0xFE) { u32 adv_size = save_types[info.type+1].size; if (info.size > adv_size) info.size = adv_size; else if (info.size < adv_size) { left = adv_size - info.size; info.size = adv_size; } } } } //establish the save data resize(info.size); inf->fseek(0, SEEK_SET); if(info.size>0) inf->fread(&data[0],info.size - left); //read all the raw data we have state = RUNNING; addr_size = info.addr_size; //none of the other fields are used right now if (CommonSettings.autodetectBackupMethod != 1 && info.type == 0) { info.type = searchFileSaveType(info.size); if (info.type == 0xFF) info.type = 0; } u32 ss = info.size * 8 / 1024; if (ss >= 1024) { ss /= 1024; printf("Backup size: %i Mbit\n", ss); } else printf("Backup size: %i Kbit\n", ss); delete inf; } } bool BackupDevice::save_raw(const char* filename) { FILE* outf = fopen(filename,"wb"); if(!outf) return false; u32 size = data.size(); u32 padSize = pad_up_size(size); if(data.size()>0) fwrite(&data[0],1,size,outf); for(u32 i=size;i saveSizes[ctr]) ctr++; u32 padSize = saveSizes[ctr]; if(padSize == 0xFFFFFFFF) { printf("PANIC! Couldn't pad up save size. Refusing to pad.\n"); padSize = startSize; } return padSize; } void BackupDevice::lazy_flush() { if(flushPending || lazyFlushPending) { lazyFlushPending = flushPending = false; flush(); } } void BackupDevice::flush() { //never use save files if we are in movie mode if(isMovieMode) return; if (filename.length() == 0) return; EMUFILE* outf = new EMUFILE_FILE(filename.c_str(),"wb"); if(!outf->fail()) { if(data.size()>0) outf->fwrite(&data[0],data.size()); //write the footer. we use a footer so that we can maximize the chance of the //save file being recognized as a raw save file by other emulators etc. //first, pad up to the next largest known save size. u32 size = data.size(); u32 padSize = pad_up_size(size); for(u32 i=size;ifputc(kUninitializedSaveDataValue); //this is just for humans to read outf->fprintf("|<--Snip above here to create a raw sav by excluding this DeSmuME savedata footer:"); //and now the actual footer write32le(size,outf); //the size of data that has actually been written write32le(padSize,outf); //the size we padded it to write32le(info.type,outf); //save memory type write32le(addr_size,outf); write32le(info.size,outf); //save memory size write32le(0,outf); //version number outf->fprintf("%s", kDesmumeSaveCookie); //this is what we'll use to recognize the desmume format save delete outf; } else { delete outf; printf("Unable to open savefile %s\n", filename.c_str()); } } void BackupDevice::raw_applyUserSettings(u32& size, bool manual) { //respect the user's choice of backup memory type if(CommonSettings.manualBackupType == MC_TYPE_AUTODETECT && !manual) { addr_size = addr_size_for_old_save_size(size); resize(size); } else { u32 type = CommonSettings.manualBackupType; if (manual) { u32 res = searchFileSaveType(size); if (res != 0xFF) type = (res + 1); // +1 - skip autodetect } int savetype = save_types[type].media_type; int savesize = save_types[type].size; addr_size = addr_size_for_old_save_type(savetype); if((u32)savesize 0) { if (size > force_size) size = force_size; else if (size < force_size) { left = force_size - size; size = force_size; } } fseek(inf, 0, SEEK_SET); raw_applyUserSettings(size, (force_size > 0)); fread(&data[0],1,size-left,inf); fclose(inf); //dump back out as a dsv, just to keep things sane flush(); return true; } u32 BackupDevice::get_save_duc_size(const char* fname) { FILE* inf = fopen(fname,"rb"); if (!inf) return 0xFFFFFFFF; fseek(inf, 0, SEEK_END); u32 size = (u32)ftell(inf); fclose(inf); if (size < 500) return 0xFFFFFFFF; return (size - 500); } bool BackupDevice::load_duc(const char* filename, u32 force_size) { u32 size; char id[16]; FILE* file = fopen(filename, "rb"); if(!file) return false; fseek(file, 0, SEEK_END); size = (u32)ftell(file) - 500; fseek(file, 0, SEEK_SET); // Make sure we really have the right file fread((void *)id, sizeof(char), 16, file); if (memcmp(id, "ARDS000000000001", 16) != 0) { printf("Not recognized as a valid DUC file\n"); fclose(file); return false; } // Skip the rest of the header since we don't need it fseek(file, 500, SEEK_SET); u32 left = 0; if (force_size > 0) { if (size > force_size) size = force_size; else if (size < force_size) { left = force_size - size; size = force_size; } } raw_applyUserSettings(size, (force_size > 0)); ensure((u32)size); fread(&data[0],1,size-left,file); fclose(file); //choose flush(); return true; } bool BackupDevice::load_movie(EMUFILE* is) { const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie); is->fseek(-cookieLen, SEEK_END); is->fseek(-4, SEEK_CUR); u32 version = 0xFFFFFFFF; is->fread((char*)&version,4); if(version!=0) { printf("Unknown save file format\n"); return false; } is->fseek(-24, SEEK_CUR); struct{ u32 size,padSize,type,addr_size,mem_size; }info; is->fread((char*)&info.size,4); is->fread((char*)&info.padSize,4); is->fread((char*)&info.type,4); is->fread((char*)&info.addr_size,4); is->fread((char*)&info.mem_size,4); //establish the save data resize(info.size); is->fseek(0, SEEK_SET); if(info.size>0) is->fread((char*)&data[0],info.size); state = RUNNING; addr_size = info.addr_size; //none of the other fields are used right now return true; } void BackupDevice::forceManualBackupType() { addr_size = addr_size_for_old_save_size(save_types[CommonSettings.manualBackupType].size); state = RUNNING; } // ============================================= ADVANsCEne u8 ADVANsCEne::checkDB(const char *serial) { loaded = false; FILE *fp = fopen(database_path, "rb"); if (fp) { char buf[64]; memset(buf, 0, sizeof(buf)); if (fread(buf, 1, strlen(_ADVANsCEne_BASE_ID), fp) == strlen(_ADVANsCEne_BASE_ID)) { //printf("ID: %s\n", buf); if (strcmp(buf, _ADVANsCEne_BASE_ID) == 0) { if (fread(&versionBase[0], 1, 2, fp) == 2) { //printf("Version base: %i.%i\n", versionBase[0], versionBase[1]); if (fread(&version[0], 1, 4, fp) == 4) { //printf("Version: %c%c%c%c\n", version[3], version[2], version[1], version[0]); if (fread(&createTime, 1, sizeof(time_t), fp) == sizeof(time_t)) { memset(buf, 0,sizeof(buf)); // serial(8) + crc32(4) + save_type(1) = 13 + reserved(8) = 21 while (true) { if (fread(buf, 1, 21, fp) != 21) break; if (memcmp(&buf[4], serial, 4) == 0) { memcpy(&crc32, &buf[8], 4); //printf("%s founded: crc32=%04X, save type %02X\n", serial, crc32, buf[12]); saveType = buf[12]; fclose(fp); loaded = true; return true; } } } } } } } fclose(fp); } return false; } bool ADVANsCEne::getXMLConfig(const char *in_filaname) { TiXmlDocument *xml = NULL; TiXmlElement *el = NULL; TiXmlElement *el_configuration = NULL; TiXmlElement *el_newDat = NULL; xml = new TiXmlDocument(); if (!xml) return false; if (!xml->LoadFile(in_filaname)) return false; el = xml->FirstChildElement("dat"); if (!el) return false; el_configuration = el->FirstChildElement("configuration"); if (!el_configuration) return false; el = el_configuration->FirstChildElement("datName"); if (el) { datName = el->GetText(); } el = el_configuration->FirstChildElement("datVersion"); if (el) { datVersion = el->GetText(); } el_newDat = el_configuration->FirstChildElement("newDat"); if (!el_newDat) return false; el = el_newDat->FirstChildElement("datVersionURL"); if (el) { urlVersion = el->GetText(); } el = el_newDat->FirstChildElement("datURL"); if (el) { urlDat = el->GetText(); } delete xml; return true; } u32 ADVANsCEne::convertDB(const char *in_filaname) { const char *saveTypeNames[] = { "Eeprom - 4 kbit", // EEPROM 4kbit "Eeprom - 64 kbit", // EEPROM 64kbit "Eeprom - 512 kbit", // EEPROM 512kbit "Fram - 256 kbit", // FRAM 256kbit ! "Flash - 2 mbit", // FLASH 2Mbit "Flash - 4 mbit", // FLASH 4Mbit "Flash - 8 mbit", // FLASH 8Mbit "Flash - 16 mbit", // FLASH 16Mbit ! "Flash - 32 mbit", // FLASH 32Mbit ! "Flash - 64 mbit", // FLASH 64Mbit "Flash - 128 mbit", // FLASH 128Mbit ! "Flash - 256 mbit", // FLASH 256Mbit ! "Flash - 512 mbit" // FLASH 512Mbit ! }; TiXmlDocument *xml = NULL; TiXmlElement *el = NULL; TiXmlElement *el_serial = NULL; TiXmlElement *el_games = NULL; TiXmlElement *el_crc32 = NULL; TiXmlElement *el_saveType = NULL; FILE *fp; u32 crc32 = 0; u32 reserved = 0; printf("Converting DB...\n"); if (getXMLConfig(in_filaname)) { if (!datName) return 0; if (strcmp(datName, _ADVANsCEne_BASE_NAME) != 0) return 0; } fp = fopen(database_path, "wb"); if (!fp) return 0; // Header fwrite(_ADVANsCEne_BASE_ID, 1, strlen(_ADVANsCEne_BASE_ID), fp); fputc(_ADVANsCEne_BASE_VERSION_MAJOR, fp); fputc(_ADVANsCEne_BASE_VERSION_MINOR, fp); if (datVersion) fwrite(datVersion, 1, strlen(datVersion), fp); else fputc(0, fp); time_t __time = time(NULL); fwrite(&__time, 1, sizeof(time_t), fp); xml = new TiXmlDocument(); if (!xml) { fclose(fp); return 0; } if (!xml->LoadFile(in_filaname)) { fclose(fp); return 0; } el = xml->FirstChildElement("dat"); if (!el) { fclose(fp); return 0; } el_games = el->FirstChildElement("games"); if (!el_games) { fclose(fp); return 0; } el = el_games->FirstChildElement("game"); if (!el) { fclose(fp); return 0; } u32 count = 0; while (el) { el_serial = el->FirstChildElement("serial"); if (fwrite(el_serial->GetText(), 1, 8, fp) != 8) { fclose(fp); return 0; } // CRC32 el_crc32 = el->FirstChildElement("files"); sscanf_s(el_crc32->FirstChildElement("romCRC")->GetText(), "%x", &crc32); if (fwrite(&crc32, 1, sizeof(u32), fp) != sizeof(u32)) { fclose(fp); return 0; } // Save type el_saveType = el->FirstChildElement("saveType"); if (el_saveType) { const char *tmp = el_saveType->GetText(); if (tmp) { if (strcmp(tmp, "None") == 0) fputc(0xFE, fp); else { bool bUnknown = true; for (u8 i = 0; i < MAX_SAVE_TYPES; i++) { if (strcmp(saveTypeNames[i], "") == 0) continue; if (strcasecmp(tmp, saveTypeNames[i]) == 0) { fputc(i, fp); bUnknown = false; break; } } if (bUnknown) fputc(0xFF, fp); // Unknown } } else fputc(0xFF, fp); // Unknown } fwrite(&reserved, 1, sizeof(u32), fp); fwrite(&reserved, 1, sizeof(u32), fp); count++; el = el->NextSiblingElement("game"); } delete xml; fclose(fp); if (count > 0) printf("done\n"); else printf("error\n"); printf("ADVANsCEne converter: %i found\n", count); return count; } desmume-0.9.9/src/metaspu/0000755000175000017500000000000012140305317016163 5ustar guillaumeguillaumedesmume-0.9.9/src/metaspu/SndOut.h0000644000175000017500000003502512140261633017557 0ustar guillaumeguillaume/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2 * Developed and maintained by the Pcsx2 Development Team. * * Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz] * * SPU2-X is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * SPU2-X 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with SPU2-X. If not, see . */ #pragma once #include struct StereoOut16; struct StereoOut32; struct StereoOutFloat; struct StereoOut32 { static StereoOut32 Empty; s32 Left; s32 Right; StereoOut32() : Left( 0 ), Right( 0 ) { } StereoOut32( s32 left, s32 right ) : Left( left ), Right( right ) { } StereoOut32( const StereoOut16& src ); explicit StereoOut32( const StereoOutFloat& src ); StereoOut16 DownSample() const; StereoOut32 operator+( const StereoOut32& right ) const { return StereoOut32( Left + right.Left, Right + right.Right ); } StereoOut32 operator/( int src ) const { return StereoOut32( Left / src, Right / src ); } }; // Number of stereo samples per SndOut block. // All drivers must work in units of this size when communicating with // SndOut. static const int SndOutPacketSize = 512; // Overall master volume shift. // Converts the mixer's 32 bit value into a 16 bit value. //static const int SndOutVolumeShift = 13; //edit - zeromus 23-oct-2009 //this is hardcoded differently for metaspu static const int SndOutVolumeShift = 0; // Samplerate of the SPU2. For accurate playback we need to match this // exactly. Trying to scale samplerates and maintain SPU2's Ts timing accuracy // is too problematic. :) //this is hardcoded differently for metaspu //edit - zeromus 23-oct-2009 ////static const int SampleRate = 48000; //static const int SampleRate = 44100; //edit - nitsuja: make it use the global sample rate define #include "../SPU.h" static const int SampleRate = DESMUME_SAMPLE_RATE; extern int FindOutputModuleById( const wchar_t* omodid ); struct StereoOut16 { s16 Left; s16 Right; StereoOut16() : Left( 0 ), Right( 0 ) { } StereoOut16( const StereoOut32& src ) : Left( (s16)src.Left ), Right( (s16)src.Right ) { } StereoOut16( s16 left, s16 right ) : Left( left ), Right( right ) { } StereoOut32 UpSample() const; void ResampleFrom( const StereoOut32& src ) { // Use StereoOut32's built in conversion *this = src.DownSample(); } }; struct StereoOutFloat { float Left; float Right; StereoOutFloat() : Left( 0 ), Right( 0 ) { } explicit StereoOutFloat( const StereoOut32& src ) : Left( src.Left / 2147483647.0f ), Right( src.Right / 2147483647.0f ) { } explicit StereoOutFloat( s32 left, s32 right ) : Left( left / 2147483647.0f ), Right( right / 2147483647.0f ) { } StereoOutFloat( float left, float right ) : Left( left ), Right( right ) { } }; //struct Stereo21Out16 //{ // s16 Left; // s16 Right; // s16 LFE; // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // LFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1); // } //}; // //struct StereoQuadOut16 //{ // s16 Left; // s16 Right; // s16 LeftBack; // s16 RightBack; // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // LeftBack = src.Left >> SndOutVolumeShift; // RightBack = src.Right >> SndOutVolumeShift; // } //}; // //struct Stereo41Out16 //{ // s16 Left; // s16 Right; // s16 LFE; // s16 LeftBack; // s16 RightBack; // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // LFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1); // LeftBack = src.Left >> SndOutVolumeShift; // RightBack = src.Right >> SndOutVolumeShift; // } //}; // //struct Stereo51Out16 //{ // s16 Left; // s16 Right; // s16 Center; // s16 LFE; // s16 LeftBack; // s16 RightBack; // // // Implementation Note: Center and Subwoofer/LFE --> // // This method is simple and sounds nice. It relies on the speaker/soundcard // // systems do to their own low pass / crossover. Manual lowpass is wasted effort // // and can't match solid state results anyway. // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // Center = (src.Left + src.Right) >> (SndOutVolumeShift + 1); // LFE = Center; // LeftBack = src.Left >> SndOutVolumeShift; // RightBack = src.Right >> SndOutVolumeShift; // } //}; // //struct Stereo51Out16DplII //{ // s16 Left; // s16 Right; // s16 Center; // s16 LFE; // s16 LeftBack; // s16 RightBack; // // void ResampleFrom( const StereoOut32& src ) // { // static const u8 sLogTable[256] = { // 0x00,0x3C,0x60,0x78,0x8C,0x9C,0xA8,0xB4,0xBE,0xC8,0xD0,0xD8,0xDE,0xE4,0xEA,0xF0, // 0xF6,0xFA,0xFE,0x04,0x08,0x0C,0x10,0x14,0x16,0x1A,0x1E,0x20,0x24,0x26,0x2A,0x2C, // 0x2E,0x32,0x34,0x36,0x38,0x3A,0x3E,0x40,0x42,0x44,0x46,0x48,0x4A,0x4C,0x4E,0x50, // 0x50,0x52,0x54,0x56,0x58,0x5A,0x5A,0x5C,0x5E,0x60,0x60,0x62,0x64,0x66,0x66,0x68, // 0x6A,0x6A,0x6C,0x6E,0x6E,0x70,0x70,0x72,0x74,0x74,0x76,0x76,0x78,0x7A,0x7A,0x7C, // 0x7C,0x7E,0x7E,0x80,0x80,0x82,0x82,0x84,0x84,0x86,0x86,0x88,0x88,0x8A,0x8A,0x8C, // 0x8C,0x8C,0x8E,0x8E,0x90,0x90,0x92,0x92,0x92,0x94,0x94,0x96,0x96,0x96,0x98,0x98, // 0x9A,0x9A,0x9A,0x9C,0x9C,0x9C,0x9E,0x9E,0xA0,0xA0,0xA0,0xA2,0xA2,0xA2,0xA4,0xA4, // 0xA4,0xA6,0xA6,0xA6,0xA8,0xA8,0xA8,0xAA,0xAA,0xAA,0xAC,0xAC,0xAC,0xAC,0xAE,0xAE, // 0xAE,0xB0,0xB0,0xB0,0xB2,0xB2,0xB2,0xB2,0xB4,0xB4,0xB4,0xB6,0xB6,0xB6,0xB6,0xB8, // 0xB8,0xB8,0xB8,0xBA,0xBA,0xBA,0xBC,0xBC,0xBC,0xBC,0xBE,0xBE,0xBE,0xBE,0xC0,0xC0, // 0xC0,0xC0,0xC2,0xC2,0xC2,0xC2,0xC2,0xC4,0xC4,0xC4,0xC4,0xC6,0xC6,0xC6,0xC6,0xC8, // 0xC8,0xC8,0xC8,0xC8,0xCA,0xCA,0xCA,0xCA,0xCC,0xCC,0xCC,0xCC,0xCC,0xCE,0xCE,0xCE, // 0xCE,0xCE,0xD0,0xD0,0xD0,0xD0,0xD0,0xD2,0xD2,0xD2,0xD2,0xD2,0xD4,0xD4,0xD4,0xD4, // 0xD4,0xD6,0xD6,0xD6,0xD6,0xD6,0xD8,0xD8,0xD8,0xD8,0xD8,0xD8,0xDA,0xDA,0xDA,0xDA, // 0xDA,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xE0,0xE0,0xE0, // }; // // static s32 Gfl=0,Gfr=0; // static s32 LMax=0,RMax=0; // // static s32 LAccum; // static s32 RAccum; // static s32 ANum; // // s32 ValL = src.Left >> (SndOutVolumeShift-8); // s32 ValR = src.Right >> (SndOutVolumeShift-8); // // s32 XL = abs(ValL>>8); // s32 XR = abs(ValR>>8); // // if(XL>LMax) LMax = XL; // if(XR>RMax) RMax = XR; // // ANum++; // if(ANum>=128) // { // ANum=0; // LAccum = 1+((LAccum * 224 + LMax * 31)>>8); // RAccum = 1+((RAccum * 224 + RMax * 31)>>8); // // LMax = 0; // RMax = 0; // // s32 Tfl=(RAccum)*255/(LAccum); // s32 Tfr=(LAccum)*255/(RAccum); // // int gMax = std::max(Tfl,Tfr); // Tfl = Tfl*255/gMax; // Tfr = Tfr*255/gMax; // // if(Tfl>255) Tfl=255; // if(Tfr>255) Tfr=255; // if(Tfl<1) Tfl=1; // if(Tfr<1) Tfr=1; // // Gfl = (Gfl * 200 + Tfl * 56)>>8; // Gfr = (Gfr * 200 + Tfr * 56)>>8; // // } // // s32 L,R,C,SUB,SL,SR; // // C=(ValL+ValR)>>1; //16.8 // // ValL-=C;//16.8 // ValR-=C;//16.8 // // L=ValL>>8; //16.0 // R=ValR>>8; //16.0 // C=C>>8; //16.0 // SUB = C; // // { // s32 Cfl = 1+sLogTable[Gfl]; // s32 Cfr = 1+sLogTable[Gfr]; // // s32 VL=(ValL>>4) * Cfl; //16.12 // s32 VR=(ValR>>4) * Cfr; // // //s32 SC = (VL-VR)>>15; // // SL = (((VR/148 - VL/209)>>4)*Cfr)>>8; // SR = (((VR/209 - VL/148)>>4)*Cfl)>>8; // // } // // // Random-ish values to get it to compile // int GainL = 200; // int GainR = 200; // int GainC = 180; // int GainSL = 230; // int GainSR = 230; // int GainLFE = 200; // int AddCLR = 55; // // int AddCX = (C * AddCLR)>>8; // // Left = (((L * GainL ))>>8) + AddCX; // Right = (((R * GainR ))>>8) + AddCX; // Center = (((C * GainC ))>>8); // LFE = (((SUB * GainLFE))>>8); // LeftBack = (((SL * GainSL ))>>8); // RightBack = (((SR * GainSR ))>>8); // } //}; // //struct Stereo71Out16 //{ // s16 Left; // s16 Right; // s16 Center; // s16 LFE; // s16 LeftBack; // s16 RightBack; // s16 LeftSide; // s16 RightSide; // // void ResampleFrom( const StereoOut32& src ) // { // Left = src.Left >> SndOutVolumeShift; // Right = src.Right >> SndOutVolumeShift; // Center = (src.Left + src.Right) >> (SndOutVolumeShift + 1); // LFE = Center; // LeftBack = src.Left >> SndOutVolumeShift; // RightBack = src.Right >> SndOutVolumeShift; // // LeftSide = src.Left >> (SndOutVolumeShift+1); // RightSide = src.Right >> (SndOutVolumeShift+1); // } //}; // //struct Stereo21Out32 //{ // s32 Left; // s32 Right; // s32 LFE; //}; // //struct Stereo41Out32 //{ // s32 Left; // s32 Right; // s32 LFE; // s32 LeftBack; // s32 RightBack; //}; // //struct Stereo51Out32 //{ // s32 Left; // s32 Right; // s32 Center; // s32 LFE; // s32 LeftBack; // s32 RightBack; //}; // Developer Note: This is a static class only (all static members). class SndBuffer { private: static bool m_underrun_freeze; static s32 m_predictData; static float lastPct; static StereoOut32* sndTempBuffer; static StereoOut16* sndTempBuffer16; static int sndTempProgress; static int m_dsp_progress; static int m_timestretch_progress; static int m_timestretch_writepos; static StereoOut32 *m_buffer; static s32 m_size; static s32 m_rpos; static s32 m_wpos; static s32 m_data; static float lastEmergencyAdj; static float cTempo; static float eTempo; static int freezeTempo; static int ssFreeze; static void _InitFail(); static void _WriteSamples(StereoOut32* bData, int nSamples); static bool CheckUnderrunStatus( int& nSamples, int& quietSampleCount ); static void soundtouchInit(); static void soundtouchClearContents(); static void soundtouchCleanup(); static void timeStretchWrite(); static void timeStretchUnderrun(); static s32 timeStretchOverrun(); static void PredictDataWrite( int samples ); static float GetStatusPct(); static void UpdateTempoChange(); public: static void Init(); static void Cleanup(); static void Write( const StereoOut32& Sample ); static s32 Test(); static void ClearContents(); // Note: When using with 32 bit output buffers, the user of this function is responsible // for shifting the values to where they need to be manually. The fixed point depth of // the sample output is determined by the SndOutVolumeShift, which is the number of bits // to shift right to get a 16 bit result. template< typename T > static void ReadSamples( T* bData ) { int nSamples = SndOutPacketSize; // Problem: // If the SPU2 gets even the least bit out of sync with the SndOut device, // the readpos of the circular buffer will overtake the writepos, // leading to a prolonged period of hopscotching read/write accesses (ie, // lots of staticy crap sound for several seconds). // // Fix: // If the read position overtakes the write position, abort the // transfer immediately and force the SndOut driver to wait until // the read buffer has filled up again before proceeding. // This will cause one brief hiccup that can never exceed the user's // set buffer length in duration. int quietSamples; if( CheckUnderrunStatus( nSamples, quietSamples ) ) { assert( nSamples <= SndOutPacketSize ); // [Air] [TODO]: This loop is probably a candidate for SSE2 optimization. const int endPos = m_rpos + nSamples; const int secondCopyLen = endPos - m_size; const StereoOut32* rposbuffer = &m_buffer[m_rpos]; m_data -= nSamples; if( secondCopyLen > 0 ) { nSamples -= secondCopyLen; for( int i=0; i #include #include //for pcsx2 method #if defined(_MSC_VER) || defined(HAVE_LIBSOUNDTOUCH) || defined(DESMUME_COCOA) #include "SndOut.h" #endif template inline T _abs(T val) { if(val<0) return -val; else return val; } template inline T moveValueTowards(T val, T target, T incr) { incr = _abs(incr); T delta = _abs(target-val); if(valtarget) val -= incr; T newDelta = _abs(target-val); if(newDelta >= delta) val = target; return val; } class ZeromusSynchronizer : public ISynchronizingAudioBuffer { public: ZeromusSynchronizer() : mixqueue_go(false) , #ifdef NDEBUG adjustobuf(200,1000) #else adjustobuf(22000,44000) #endif { } bool mixqueue_go; virtual void enqueue_samples(s16* buf, int samples_provided) { for(int i=0;i 200) mixqueue_go = true; } else { for(int i=0;i buffer; int size; s16 curr[2]; std::queue statsHistory; void enqueue(s16 left, s16 right) { buffer.push(left); buffer.push(right); size++; } s64 rollingTotalSize; u32 kAverageSize; void addStatistic() { statsHistory.push(size); rollingTotalSize += size; if(statsHistory.size()>kAverageSize) { rollingTotalSize -= statsHistory.front(); statsHistory.pop(); float averageSize = (float)(rollingTotalSize / kAverageSize); //static int ctr=0; ctr++; if((ctr&127)==0) printf("avg size: %f curr size: %d rate: %f\n",averageSize,size,rate); { float targetRate; if(averageSize < targetLatency) { targetRate = 1.0f - (targetLatency-averageSize)/kAverageSize; } else if(averageSize > targetLatency) { targetRate = 1.0f + (averageSize-targetLatency)/kAverageSize; } else targetRate = 1.0f; //rate = moveValueTowards(rate,targetRate,0.001f); rate = targetRate; } } } void dequeue(s16& left, s16& right) { left = right = 0; addStatistic(); if(size==0) { return; } cursor += rate; while(cursor>1.0f) { cursor -= 1.0f; if(size>0) { curr[0] = buffer.front(); buffer.pop(); curr[1] = buffer.front(); buffer.pop(); size--; } } left = curr[0]; right = curr[1]; } } adjustobuf; }; class NitsujaSynchronizer : public ISynchronizingAudioBuffer { private: struct ssamp { s16 l, r; ssamp() {} ssamp(s16 ll, s16 rr) : l(ll), r(rr) {} }; std::vector sampleQueue; // returns values going between 0 and y-1 in a saw wave pattern, based on x static FORCEINLINE int pingpong(int x, int y) { x %= 2*y; if(x >= y) x = 2*y - x - 1; return x; // in case we want to switch to odd buffer sizes for more sharpness //x %= 2*(y-1); //if(x >= y) // x = 2*(y-1) - x; //return x; } static FORCEINLINE ssamp crossfade (ssamp lhs, ssamp rhs, int cur, int start, int end) { if(cur <= start) return lhs; if(cur >= end) return rhs; // in case we want sine wave interpolation instead of linear here //float ang = 3.14159f * (float)(cur - start) / (float)(end - start); //cur = start + (int)((1-cosf(ang))*0.5f * (end - start)); int inNum = cur - start; int outNum = end - cur; int denom = end - start; int lrv = ((int)lhs.l * outNum + (int)rhs.l * inNum) / denom; int rrv = ((int)lhs.r * outNum + (int)rhs.r * inNum) / denom; return ssamp(lrv,rrv); } static FORCEINLINE void emit_sample(s16*& outbuf, ssamp sample) { *outbuf++ = sample.l; *outbuf++ = sample.r; } static FORCEINLINE void emit_samples(s16*& outbuf, const ssamp* samplebuf, int samples) { for(int i=0;i 0x200 && audiosize > 0) // is there any work to do? { // are we going at normal speed? // or more precisely, are the input and output queues/buffers of similar size? if(queued > 900 || audiosize > queued * 2) { // not normal speed. we have to resample it somehow in this case. if(audiosize <= queued) { // fast forward speed // this is the easy case, just crossfade it and it sounds ok for(int i = 0; i < audiosize; i++) { int j = i + queued - audiosize; ssamp outsamp = crossfade(sampleQueue[i],sampleQueue[j], i,0,audiosize); emit_sample(buf,outsamp); } } else { // slow motion speed // here we take a very different approach, // instead of crossfading it, we select a single sample from the queue // and make sure that the index we use to select a sample is constantly moving // and that it starts at the first sample in the queue and ends on the last one. // // hopefully the index doesn't move discontinuously or we'll get slight crackling // (there might still be a minor bug here that causes this occasionally) // // here's a diagram of how the index we sample from moves: // // queued (this axis represents the index we sample from. the top means the end of the queue) // ^ // | --> audiosize (this axis represents the output index we write to, right meaning forward in output time/position) // | A C C end // A A B C C C // A A A B C C C // A A A B C C // A A C // start // // yes, this means we are spending some stretches of time playing the sound backwards, // but the stretches are short enough that this doesn't sound weird. // this lets us avoid most crackling problems due to the endpoints matching up. // first calculate a shorter-than-full window // that has minimal slope at the endpoints // (to further reduce crackling, especially in sine waves) int beststart = 0, extraAtEnd = 0; { int bestend = queued; static const int worstdiff = 99999999; int beststartdiff = worstdiff; int bestenddiff = worstdiff; for(int i = 0; i < 128; i+=2) { int diff = abs(sampleQueue[i].l - sampleQueue[i+1].l) + abs(sampleQueue[i].r - sampleQueue[i+1].r); if(diff < beststartdiff) { beststartdiff = diff; beststart = i; } } for(int i = queued-3; i > queued-3-128; i-=2) { int diff = abs(sampleQueue[i].l - sampleQueue[i+1].l) + abs(sampleQueue[i].r - sampleQueue[i+1].r); if(diff < bestenddiff) { bestenddiff = diff; bestend = i+1; } } extraAtEnd = queued - bestend; queued = bestend - beststart; int oksize = queued; while(oksize + queued*2 + beststart + extraAtEnd <= samples_requested) oksize += queued*2; audiosize = oksize; for(int x = 0; x < beststart; x++) { emit_sample(buf,sampleQueue[x]); } sampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + beststart); } int midpointX = audiosize >> 1; int midpointY = queued >> 1; // all we need to do here is calculate the X position of the leftmost "B" in the above diagram. // TODO: we should calculate it with a simple equation like // midpointXOffset = min(something,somethingElse); // but it's a little difficult to work it out exactly // so here's a stupid search for the value for now: int prevA = 999999; int midpointXOffset = queued/2; while(true) { int a = abs(pingpong(midpointX - midpointXOffset, queued) - midpointY) - midpointXOffset; if(((a > 0) != (prevA > 0) || (a < 0) != (prevA < 0)) && prevA != 999999) { if((a + prevA)&1) // there's some sort of off-by-one problem with this search since we're moving diagonally... midpointXOffset++; // but this fixes it most of the time... break; // found it } prevA = a; midpointXOffset--; if(midpointXOffset < 0) { midpointXOffset = 0; break; // failed to find it. the two sides probably meet exactly in the center. } } int leftMidpointX = midpointX - midpointXOffset; int rightMidpointX = midpointX + midpointXOffset; int leftMidpointY = pingpong(leftMidpointX, queued); int rightMidpointY = (queued-1) - pingpong((int)audiosize-1 - rightMidpointX + queued*2, queued); // output the left almost-half of the sound (section "A") for(int x = 0; x < leftMidpointX; x++) { int i = pingpong(x, queued); emit_sample(buf,sampleQueue[i]); } // output the middle stretch (section "B") int y = leftMidpointY; int dyMidLeft = (leftMidpointY < midpointY) ? 1 : -1; int dyMidRight = (rightMidpointY > midpointY) ? 1 : -1; for(int x = leftMidpointX; x < midpointX; x++, y+=dyMidLeft) emit_sample(buf,sampleQueue[y]); for(int x = midpointX; x < rightMidpointX; x++, y+=dyMidRight) emit_sample(buf,sampleQueue[y]); // output the end of the queued sound (section "C") for(int x = rightMidpointX; x < audiosize; x++) { int i = (queued-1) - pingpong((int)audiosize-1 - x + queued*2, queued); emit_sample(buf,sampleQueue[i]); } for(int x = 0; x < extraAtEnd; x++) { int i = queued + x; emit_sample(buf,sampleQueue[i]); } queued += extraAtEnd; audiosize += beststart + extraAtEnd; } //end else sampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + queued); return audiosize; } else { // normal speed // just output the samples straightforwardly. // // at almost-full speeds (like 50/60 FPS) // what will happen is that we rapidly fluctuate between entering this branch // and entering the "slow motion speed" branch above. // but that's ok! because all of these branches sound similar enough that we can get away with it. // so the two cases actually complement each other. if(audiosize >= queued) { emit_samples(buf,&sampleQueue[0],queued); sampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + queued); return queued; } else { emit_samples(buf,&sampleQueue[0],audiosize); sampleQueue.erase(sampleQueue.begin(), sampleQueue.begin()+audiosize); return audiosize; } } //end normal speed } //end if there is any work to do else { return 0; } } //output_samples private: }; //NitsujaSynchronizer #if defined(_MSC_VER) || defined(HAVE_LIBSOUNDTOUCH) || defined(DESMUME_COCOA) class PCSX2Synchronizer : public ISynchronizingAudioBuffer { public: std::queue readySamples; PCSX2Synchronizer() { SndBuffer::Init(); } virtual void enqueue_samples(s16* buf, int samples_provided) { for(int i=0;i. */ //#include "Global.h" #include #include "types.h" #include "SndOut.h" //#include "SoundTouch/WavFile.h" #ifdef HAVE_LIBSOUNDTOUCH #include #else #include "SoundTouch/SoundTouch.h" #endif #ifdef _WINDOWS #include "win32/Dialogs.h" #endif static soundtouch::SoundTouch* pSoundTouch = NULL; static int ts_stats_stretchblocks = 0; static int ts_stats_normalblocks = 0; static int ts_stats_logcounter = 0; // data prediction amount, used to "commit" data that hasn't // finished timestretch processing. s32 SndBuffer::m_predictData; // records last buffer status (fill %, range -100 to 100, with 0 being 50% full) float SndBuffer::lastPct; float SndBuffer::lastEmergencyAdj; float SndBuffer::cTempo = 1; float SndBuffer::eTempo = 1; int SndBuffer::freezeTempo = 0; void SndBuffer::PredictDataWrite( int samples ) { m_predictData += samples; } // Calculate the buffer status percentage. // Returns range from -1.0 to 1.0 // 1.0 = buffer overflow! // 0.0 = buffer nominal (50% full) // -1.0 = buffer underflow! float SndBuffer::GetStatusPct() { // Get the buffer status of the output driver too, so that we can // obtain a more accurate overall buffer status. int drvempty = 0; //int drvempty = mods[OutputModule]->GetEmptySampleCount(); // / 2; //TODO //ConLog( "Data %d >>> driver: %d predict: %d\n", data, drvempty, predictData ); float result = (float)(m_data + m_predictData - drvempty) - (m_size/2); result /= (m_size/2); return result; } void SndBuffer::UpdateTempoChange() { if( --freezeTempo > 0 ) { return; } float statusPct = GetStatusPct(); float pctChange = statusPct - lastPct; float tempoChange; float emergencyAdj = 0; float newcee = cTempo; // workspace var. for cTempo // IMPORTANT! // If you plan to tweak these values, make sure you're using a release build // OUTSIDE THE DEBUGGER to test it! The Visual Studio debugger can really cause // erratic behavior in the audio buffers, and makes the timestretcher seem a // lot more inconsistent than it really is. // We have two factors. // * Distance from nominal buffer status (50% full) // * The change from previous update to this update. // Prediction based on the buffer change: // (linear seems to work better here) tempoChange = pctChange * 0.75f; if( statusPct * tempoChange < 0.0f ) { // only apply tempo change if it is in synch with the buffer status. // In other words, if the buffer is high (over 0%), and is decreasing, // ignore it. It'll just muck things up. tempoChange = 0; } // Sudden spikes in framerate can cause the nominal buffer status // to go critical, in which case we have to enact an emergency // stretch. The following cubic formulas do that. Values near // the extremeites give much larger results than those near 0. // And the value is added only this time, and does not accumulate. // (otherwise a large value like this would cause problems down the road) // Constants: // Weight - weights the statusPct's "emergency" consideration. // higher values here will make the buffer perform more drastic // compensations at the outer edges of the buffer (at -75 or +75% // or beyond, for example). // Range - scales the adjustment to the given range (more or less). // The actual range is dependent on the weight used, so if you increase // Weight you'll usually want to decrease Range somewhat to compensate. // Prediction based on the buffer fill status: const float statusWeight = 2.99f; const float statusRange = 0.068f; // "non-emergency" deadzone: In this area stretching will be strongly discouraged. // Note: due tot he nature of timestretch latency, it's always a wee bit harder to // cope with low fps (underruns) than it is high fps (overruns). So to help out a // little, the low-end portions of this check are less forgiving than the high-sides. if( cTempo < 0.965f || cTempo > 1.060f || pctChange < -0.38f || pctChange > 0.54f || statusPct < -0.32f || statusPct > 0.39f || eTempo < 0.89f || eTempo > 1.19f ) { emergencyAdj = ( pow( statusPct*statusWeight, 3.0f ) * statusRange); } // Smooth things out by factoring our previous adjustment into this one. // It helps make the system 'feel' a little smarter by giving it at least // one packet worth of history to help work off of: emergencyAdj = (emergencyAdj * 0.75f) + (lastEmergencyAdj * 0.25f ); lastEmergencyAdj = emergencyAdj; lastPct = statusPct; // Accumulate a fraction of the tempo change into the tempo itself. // This helps the system run "smarter" to games that run consistently // fast or slow by altering the base tempo to something closer to the // game's active speed. In tests most games normalize within 2 seconds // at 100ms latency, which is pretty good (larger buffers normalize even // quicker). newcee += newcee * (tempoChange+emergencyAdj) * 0.03f; // Apply tempoChange as a scale of cTempo. That way the effect is proportional // to the current tempo. (otherwise tempos rate of change at the extremes would // be too drastic) float newTempo = newcee + ( emergencyAdj * cTempo ); // ... and as a final optimization, only stretch if the new tempo is outside // a nominal threshold. Keep this threshold check small, because it could // cause some serious side effects otherwise. (enlarging the cTempo check above // is usually better/safer) if( newTempo < 0.970f || newTempo > 1.045f ) { cTempo = (float)newcee; if( newTempo < 0.10f ) newTempo = 0.10f; else if( newTempo > 10.0f ) newTempo = 10.0f; if( cTempo < 0.15f ) cTempo = 0.15f; else if( cTempo > 7.5f ) cTempo = 7.5f; pSoundTouch->setTempo( eTempo = (float)newTempo ); ts_stats_stretchblocks++; /*ConLog(" * SPU2: [Nominal %d%%] [Emergency: %d%%] (baseTempo: %d%% ) (newTempo: %d%%) (buffer: %d%%)\n", //(relation < 0.0) ? "Normalize" : "", (int)(tempoChange * 100.0 * 0.03), (int)(emergencyAdj * 100.0), (int)(cTempo * 100.0), (int)(newTempo * 100.0), (int)(statusPct * 100.0) );*/ } else { // Nominal operation -- turn off stretching. // note: eTempo 'slides' toward 1.0 for smoother audio and better // protection against spikes. if( cTempo != 1.0f ) { cTempo = 1.0f; eTempo = ( 1.0f + eTempo ) * 0.5f; pSoundTouch->setTempo( eTempo ); } else { if( eTempo != cTempo ) pSoundTouch->setTempo( eTempo=cTempo ); ts_stats_normalblocks++; } } } void SndBuffer::timeStretchUnderrun() { // timeStretcher failed it's job. We need to slow down the audio some. cTempo -= (cTempo * 0.12f); eTempo -= (eTempo * 0.30f); if( eTempo < 0.1f ) eTempo = 0.1f; pSoundTouch->setTempo( eTempo ); } s32 SndBuffer::timeStretchOverrun() { // If we overran it means the timestretcher failed. We need to speed // up audio playback. cTempo += cTempo * 0.12f; eTempo += eTempo * 0.40f; if( eTempo > 7.5f ) eTempo = 7.5f; pSoundTouch->setTempo( eTempo ); // Throw out just a little bit (two packets worth) to help // give the TS some room to work: return SndOutPacketSize*2; } static void CvtPacketToFloat( StereoOut32* srcdest ) { StereoOutFloat* dest = (StereoOutFloat*)srcdest; const StereoOut32* src = (StereoOut32*)srcdest; for( uint i=0; iputSamples( (float*)sndTempBuffer, SndOutPacketSize ); int tempProgress; while( tempProgress = pSoundTouch->receiveSamples( (float*)sndTempBuffer, SndOutPacketSize), tempProgress != 0 ) { // Hint: It's assumed that pSoundTouch will return chunks of 128 bytes (it always does as // long as the SSE optimizations are enabled), which means we can do our own SSE opts here. CvtPacketToInt( sndTempBuffer, tempProgress ); _WriteSamples( sndTempBuffer, tempProgress ); progress = true; } UpdateTempoChange(); //TODO //if( MsgOverruns() ) { if( progress ) { if( ++ts_stats_logcounter > 300 ) { ts_stats_logcounter = 0; printf( " * SPU2 > Timestretch Stats > %d%% of packets stretched.\n", ( ts_stats_stretchblocks * 100 ) / ( ts_stats_normalblocks + ts_stats_stretchblocks ) ); ts_stats_normalblocks = 0; ts_stats_stretchblocks = 0; } } } } void SndBuffer::soundtouchInit() { pSoundTouch = new soundtouch::SoundTouch(); pSoundTouch->setSampleRate(SampleRate); pSoundTouch->setChannels(2); pSoundTouch->setSetting( SETTING_USE_QUICKSEEK, 0 ); pSoundTouch->setSetting( SETTING_USE_AA_FILTER, 0 ); #ifdef _WINDOWS SoundtouchCfg::ApplySettings( *pSoundTouch ); #endif pSoundTouch->setTempo(1); // some timestretch management vars: cTempo = 1.0; eTempo = 1.0; lastPct = 0; lastEmergencyAdj = 0; // just freeze tempo changes for a while at startup. // the driver buffers are bogus anyway. freezeTempo = 16; m_predictData = 0; } // reset timestretch management vars, and delay updates a bit: void SndBuffer::soundtouchClearContents() { if( pSoundTouch == NULL ) return; pSoundTouch->clear(); pSoundTouch->setTempo(1); cTempo = 1.0; eTempo = 1.0; lastPct = 0; lastEmergencyAdj = 0; freezeTempo = 16; m_predictData = 0; } void SndBuffer::soundtouchCleanup() { //safe_delete( pSoundTouch ); delete pSoundTouch; } desmume-0.9.9/src/metaspu/SndOut.cpp0000644000175000017500000002336512140261633020116 0ustar guillaumeguillaume/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2 * Developed and maintained by the Pcsx2 Development Team. * * Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz] * * SPU2-X is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * SPU2-X 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with SPU2-X. If not, see . */ //#include "Global.h" #include "types.h" #include "SndOut.h" #include //---------------- int SndOutLatencyMS = 160; bool timeStretchDisabled = false; //---------------- StereoOut32 StereoOut32::Empty( 0, 0 ); StereoOut32::StereoOut32( const StereoOut16& src ) : Left( src.Left ), Right( src.Right ) { } StereoOut32::StereoOut32( const StereoOutFloat& src ) : Left( (s32)(src.Left * 2147483647.0f) ), Right( (s32)(src.Right * 2147483647.0f) ) { } StereoOut16 StereoOut32::DownSample() const { return StereoOut16( Left >> SndOutVolumeShift, Right >> SndOutVolumeShift ); } StereoOut32 StereoOut16::UpSample() const { return StereoOut32( Left << SndOutVolumeShift, Right << SndOutVolumeShift ); } //class NullOutModule: public SndOutModule //{ //public: // s32 Init() { return 0; } // void Close() { } // s32 Test() const { return 0; } // void Configure(uptr parent) { } // bool Is51Out() const { return false; } // int GetEmptySampleCount() const { return 0; } // // const wchar_t* GetIdent() const // { // return L"nullout"; // } // // const wchar_t* GetLongName() const // { // return L"No Sound (Emulate SPU2 only)"; // } // // void ReadSettings() // { // } // // void WriteSettings() const // { // } // //} NullOut; // //SndOutModule* mods[]= //{ // &NullOut, //#ifdef _MSC_VER // XAudio2Out, // DSoundOut, // WaveOut, //#endif // NULL // signals the end of our list //}; // //int FindOutputModuleById( const wchar_t* omodid ) //{ // int modcnt = 0; // while( mods[modcnt] != NULL ) // { // if( wcscmp( mods[modcnt]->GetIdent(), omodid ) == 0 ) // break; // ++modcnt; // } // return modcnt; //} StereoOut32 *SndBuffer::m_buffer; s32 SndBuffer::m_size; s32 SndBuffer::m_rpos; s32 SndBuffer::m_wpos; s32 SndBuffer::m_data; bool SndBuffer::m_underrun_freeze; StereoOut32* SndBuffer::sndTempBuffer = NULL; StereoOut16* SndBuffer::sndTempBuffer16 = NULL; int SndBuffer::sndTempProgress = 0; static int GetAlignedBufferSize( int comp ) { return (comp + SndOutPacketSize-1) & ~(SndOutPacketSize-1); } // Returns TRUE if there is data to be output, or false if no data // is available to be copied. bool SndBuffer::CheckUnderrunStatus( int& nSamples, int& quietSampleCount ) { quietSampleCount = 0; if( m_underrun_freeze ) { int toFill = (int)(m_size * ( timeStretchDisabled ? 0.50f : 0.1f ) ); toFill = GetAlignedBufferSize( toFill ); // toFill is now aligned to a SndOutPacket if( m_data < toFill ) { quietSampleCount = nSamples; return false; } m_underrun_freeze = false; //TODO //if( MsgOverruns() ) printf(" * SPU2 > Underrun compensation (%d packets buffered)\n", toFill / SndOutPacketSize ); lastPct = 0.0; // normalize timestretcher } else if( m_data < nSamples ) { nSamples = m_data; quietSampleCount = SndOutPacketSize - m_data; m_underrun_freeze = true; if( !timeStretchDisabled ) timeStretchUnderrun(); return nSamples != 0; } return true; } void SndBuffer::_InitFail() { // If a failure occurs, just initialize the NoSound driver. This'll allow // the game to emulate properly (hopefully), albeit without sound. //OutputModule = FindOutputModuleById( NullOut.GetIdent() ); //mods[OutputModule]->Init(); } void SndBuffer::_WriteSamples(StereoOut32 *bData, int nSamples) { int free = m_size-m_data; m_predictData = 0; assert( m_data <= m_size ); // Problem: // If the SPU2 gets out of sync with the SndOut device, the writepos of the // circular buffer will overtake the readpos, leading to a prolonged period // of hopscotching read/write accesses (ie, lots of staticy crap sound for // several seconds). // // Compromise: // When an overrun occurs, we adapt by discarding a portion of the buffer. // The older portion of the buffer is discarded rather than incoming data, // so that the overall audio synchronization is better. if( free < nSamples ) { // Buffer overrun! // Dump samples from the read portion of the buffer instead of dropping // the newly written stuff. s32 comp; if( !timeStretchDisabled ) { comp = timeStretchOverrun(); } else { // Toss half the buffer plus whatever's being written anew: comp = GetAlignedBufferSize( (m_size + nSamples ) / 2 ); if( comp > (m_size-SndOutPacketSize) ) comp = m_size-SndOutPacketSize; } m_data -= comp; m_rpos = (m_rpos+comp) % m_size; //TODO //if( MsgOverruns() ) printf(" * SPU2 > Overrun Compensation (%d packets tossed)\n", comp / SndOutPacketSize ); lastPct = 0.0; // normalize the timestretcher } // copy in two phases, since there's a chance the packet // wraps around the buffer (it'd be nice to deal in packets only, but // the timestretcher and DSP options require flexibility). const int endPos = m_wpos + nSamples; const int secondCopyLen = endPos - m_size; StereoOut32* wposbuffer = &m_buffer[m_wpos]; m_data += nSamples; if( secondCopyLen > 0 ) { nSamples -= secondCopyLen; memcpy( m_buffer, &bData[nSamples], secondCopyLen * sizeof( *bData ) ); m_wpos = secondCopyLen; } else m_wpos += nSamples; memcpy( wposbuffer, bData, nSamples * sizeof( *bData ) ); } void SndBuffer::Init() { //if( mods[OutputModule] == NULL ) //{ // _InitFail(); // return; //} // initialize sound buffer // Buffer actually attempts to run ~50%, so allocate near double what // the requested latency is: m_rpos = 0; m_wpos = 0; m_data = 0; try { const float latencyMS = SndOutLatencyMS * (timeStretchDisabled ? 1.5f : 2.0f ); m_size = GetAlignedBufferSize( (int)(latencyMS * SampleRate / 1000.0f ) ); m_buffer = new StereoOut32[m_size]; m_underrun_freeze = false; sndTempBuffer = new StereoOut32[SndOutPacketSize]; sndTempBuffer16 = new StereoOut16[SndOutPacketSize]; } catch( std::bad_alloc& ) { // out of memory exception (most likely) printf( "Out of memory error occurred while initializing SPU2." ); _InitFail(); return; } // clear buffers! // Fixes loopy sounds on emu resets. memset( sndTempBuffer, 0, sizeof(StereoOut32) * SndOutPacketSize ); memset( sndTempBuffer16, 0, sizeof(StereoOut16) * SndOutPacketSize ); sndTempProgress = 0; soundtouchInit(); // initializes the timestretching // some crap //spdif_set51(mods[OutputModule]->Is51Out()); // initialize module //if( mods[OutputModule]->Init() == -1 ) _InitFail(); } void SndBuffer::Cleanup() { //mods[OutputModule]->Close(); soundtouchCleanup(); //safe_delete_array( m_buffer ); //safe_delete_array( sndTempBuffer ); //safe_delete_array( sndTempBuffer16 ); delete[] m_buffer; delete[] sndTempBuffer; delete[] sndTempBuffer16; } int SndBuffer::m_dsp_progress = 0; int SndBuffer::m_timestretch_progress = 0; int SndBuffer::ssFreeze = 0; void SndBuffer::ClearContents() { SndBuffer::soundtouchClearContents(); SndBuffer::ssFreeze = 30; //Delays sound output for about half a second. } void SndBuffer::Write( const StereoOut32& Sample ) { // Log final output to wavefile. //WaveDump::WriteCore( 1, CoreSrc_External, Sample.DownSample() ); //RecordWrite( Sample.DownSample() ); //if(mods[OutputModule] == &NullOut) // null output doesn't need buffering or stretching! :p // return; sndTempBuffer[sndTempProgress++] = Sample; // If we haven't accumulated a full packet yet, do nothing more: if(sndTempProgress < SndOutPacketSize) return; sndTempProgress = 0; //Don't play anything directly after loading a savestate, avoids static killing your speakers. // if ( ssFreeze > 0 ) // { // ssFreeze--; // return; // } //#ifndef __LINUX__ // else if( dspPluginEnabled ) // { // // Convert in, send to winamp DSP, and convert out. // // for( int i=0; i= SndOutPacketSize ) // { // for( int i=0; i 0 ) // { // memcpy( &sndTempBuffer16[ei], sndTempBuffer16, // sizeof(sndTempBuffer16[0]) * m_dsp_progress // ); // } // } //#endif // else { if( !timeStretchDisabled ) timeStretchWrite(); else _WriteSamples(sndTempBuffer, SndOutPacketSize); } } s32 SndBuffer::Test() { //if( mods[OutputModule] == NULL ) // return -1; //return mods[OutputModule]->Test(); return 0; } desmume-0.9.9/src/metaspu/metaspu.h0000644000175000017500000000342312140261633020016 0ustar guillaumeguillaume/* Copyright 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ //------------------------- //this file contains the METASPU system //which is designed to handle the task of audio synchronization //and is designed to be as portable between multiple emulators //------------------------- #ifndef _METASPU_H_ #define _METASPU_H_ #include template< typename T > static FORCEINLINE void Clampify( T& src, T min, T max ) { src = std::min( std::max( src, min ), max ); } template< typename T > static FORCEINLINE T GetClamped( T src, T min, T max ) { return std::min( std::max( src, min ), max ); } class ISynchronizingAudioBuffer { public: virtual void enqueue_samples(s16* buf, int samples_provided) = 0; //returns the number of samples actually supplied, which may not match the number requested virtual int output_samples(s16* buf, int samples_requested) = 0; }; enum ESynchMode { ESynchMode_DualSynchAsynch, ESynchMode_Synchronous }; enum ESynchMethod { ESynchMethod_N, //nitsuja's ESynchMethod_Z, //zero's ESynchMethod_P, //PCSX2 spu2-x }; ISynchronizingAudioBuffer* metaspu_construct(ESynchMethod method); #endif desmume-0.9.9/src/instruction_tabdef.inc0000644000175000017500000077016412140261633021107 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ /* 0000 0000 0000 */ TABDECL(OP_AND_LSL_IMM), // OP_AND_LSL_IMM /* 0000 0000 0001 */ TABDECL(OP_AND_LSL_REG), // OP_AND_LSL_REG /* 0000 0000 0010 */ TABDECL(OP_AND_LSR_IMM), // OP_AND_LSR_IMM /* 0000 0000 0011 */ TABDECL(OP_AND_LSR_REG), // OP_AND_LSR_REG /* 0000 0000 0100 */ TABDECL(OP_AND_ASR_IMM), // OP_AND_ASR_IMM /* 0000 0000 0101 */ TABDECL(OP_AND_ASR_REG), // OP_AND_ASR_REG /* 0000 0000 0110 */ TABDECL(OP_AND_ROR_IMM), // OP_AND_ROR_IMM /* 0000 0000 0111 */ TABDECL(OP_AND_ROR_REG), // OP_AND_ROR_REG /* 0000 0000 1000 */ TABDECL(OP_AND_LSL_IMM), // OP_AND_LSL_IMM /* 0000 0000 1001 */ TABDECL(OP_MUL), // OP_MUL /* 0000 0000 1010 */ TABDECL(OP_AND_LSR_IMM), // OP_AND_LSR_IMM /* 0000 0000 1011 */ TABDECL(OP_STRH_POS_INDE_M_REG_OFF), // OP_STRH_POS_INDE_M_REG_OFF /* 0000 0000 1100 */ TABDECL(OP_AND_ASR_IMM), // OP_AND_ASR_IMM /* 0000 0000 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 0000 1110 */ TABDECL(OP_AND_ROR_IMM), // OP_AND_ROR_IMM /* 0000 0000 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 0001 0000 */ TABDECL(OP_AND_S_LSL_IMM), // OP_AND_S_LSL_IMM /* 0000 0001 0001 */ TABDECL(OP_AND_S_LSL_REG), // OP_AND_S_LSL_REG /* 0000 0001 0010 */ TABDECL(OP_AND_S_LSR_IMM), // OP_AND_S_LSR_IMM /* 0000 0001 0011 */ TABDECL(OP_AND_S_LSR_REG), // OP_AND_S_LSR_REG /* 0000 0001 0100 */ TABDECL(OP_AND_S_ASR_IMM), // OP_AND_S_ASR_IMM /* 0000 0001 0101 */ TABDECL(OP_AND_S_ASR_REG), // OP_AND_S_ASR_REG /* 0000 0001 0110 */ TABDECL(OP_AND_S_ROR_IMM), // OP_AND_S_ROR_IMM /* 0000 0001 0111 */ TABDECL(OP_AND_S_ROR_REG), // OP_AND_S_ROR_REG /* 0000 0001 1000 */ TABDECL(OP_AND_S_LSL_IMM), // OP_AND_S_LSL_IMM /* 0000 0001 1001 */ TABDECL(OP_MUL_S), // OP_MUL_S /* 0000 0001 1010 */ TABDECL(OP_AND_S_LSR_IMM), // OP_AND_S_LSR_IMM /* 0000 0001 1011 */ TABDECL(OP_LDRH_POS_INDE_M_REG_OFF), // OP_LDRH_POS_INDE_M_REG_OFF /* 0000 0001 1100 */ TABDECL(OP_AND_S_ASR_IMM), // OP_AND_S_ASR_IMM /* 0000 0001 1101 */ TABDECL(OP_LDRSB_POS_INDE_M_REG_OFF), // OP_LDRSB_POS_INDE_M_REG_OFF /* 0000 0001 1110 */ TABDECL(OP_AND_S_ROR_IMM), // OP_AND_S_ROR_IMM /* 0000 0001 1111 */ TABDECL(OP_LDRSH_POS_INDE_M_REG_OFF), // OP_LDRSH_POS_INDE_M_REG_OFF /* 0000 0010 0000 */ TABDECL(OP_EOR_LSL_IMM), // OP_EOR_LSL_IMM /* 0000 0010 0001 */ TABDECL(OP_EOR_LSL_REG), // OP_EOR_LSL_REG /* 0000 0010 0010 */ TABDECL(OP_EOR_LSR_IMM), // OP_EOR_LSR_IMM /* 0000 0010 0011 */ TABDECL(OP_EOR_LSR_REG), // OP_EOR_LSR_REG /* 0000 0010 0100 */ TABDECL(OP_EOR_ASR_IMM), // OP_EOR_ASR_IMM /* 0000 0010 0101 */ TABDECL(OP_EOR_ASR_REG), // OP_EOR_ASR_REG /* 0000 0010 0110 */ TABDECL(OP_EOR_ROR_IMM), // OP_EOR_ROR_IMM /* 0000 0010 0111 */ TABDECL(OP_EOR_ROR_REG), // OP_EOR_ROR_REG /* 0000 0010 1000 */ TABDECL(OP_EOR_LSL_IMM), // OP_EOR_LSL_IMM /* 0000 0010 1001 */ TABDECL(OP_MLA), // OP_MLA /* 0000 0010 1010 */ TABDECL(OP_EOR_LSR_IMM), // OP_EOR_LSR_IMM /* 0000 0010 1011 */ TABDECL(OP_UND), /* 0000 0010 1100 */ TABDECL(OP_EOR_ASR_IMM), // OP_EOR_ASR_IMM /* 0000 0010 1101 */ TABDECL(OP_UND), /* 0000 0010 1110 */ TABDECL(OP_EOR_ROR_IMM), // OP_EOR_ROR_IMM /* 0000 0010 1111 */ TABDECL(OP_UND), /* 0000 0011 0000 */ TABDECL(OP_EOR_S_LSL_IMM), // OP_EOR_S_LSL_IMM /* 0000 0011 0001 */ TABDECL(OP_EOR_S_LSL_REG), // OP_EOR_S_LSL_REG /* 0000 0011 0010 */ TABDECL(OP_EOR_S_LSR_IMM), // OP_EOR_S_LSR_IMM /* 0000 0011 0011 */ TABDECL(OP_EOR_S_LSR_REG), // OP_EOR_S_LSR_REG /* 0000 0011 0100 */ TABDECL(OP_EOR_S_ASR_IMM), // OP_EOR_S_ASR_IMM /* 0000 0011 0101 */ TABDECL(OP_EOR_S_ASR_REG), // OP_EOR_S_ASR_REG /* 0000 0011 0110 */ TABDECL(OP_EOR_S_ROR_IMM), // OP_EOR_S_ROR_IMM /* 0000 0011 0111 */ TABDECL(OP_EOR_S_ROR_REG), // OP_EOR_S_ROR_REG /* 0000 0011 1000 */ TABDECL(OP_EOR_S_LSL_IMM), // OP_EOR_S_LSL_IMM /* 0000 0011 1001 */ TABDECL(OP_MLA_S), // OP_MLA_S /* 0000 0011 1010 */ TABDECL(OP_EOR_S_LSR_IMM), // OP_EOR_S_LSR_IMM /* 0000 0011 1011 */ TABDECL(OP_UND), /* 0000 0011 1100 */ TABDECL(OP_EOR_S_ASR_IMM), // OP_EOR_S_ASR_IMM /* 0000 0011 1101 */ TABDECL(OP_UND), /* 0000 0011 1110 */ TABDECL(OP_EOR_S_ROR_IMM), // OP_EOR_S_ROR_IMM /* 0000 0011 1111 */ TABDECL(OP_UND), /* 0000 0100 0000 */ TABDECL(OP_SUB_LSL_IMM), // OP_SUB_LSL_IMM /* 0000 0100 0001 */ TABDECL(OP_SUB_LSL_REG), // OP_SUB_LSL_REG /* 0000 0100 0010 */ TABDECL(OP_SUB_LSR_IMM), // OP_SUB_LSR_IMM /* 0000 0100 0011 */ TABDECL(OP_SUB_LSR_REG), // OP_SUB_LSR_REG /* 0000 0100 0100 */ TABDECL(OP_SUB_ASR_IMM), // OP_SUB_ASR_IMM /* 0000 0100 0101 */ TABDECL(OP_SUB_ASR_REG), // OP_SUB_ASR_REG /* 0000 0100 0110 */ TABDECL(OP_SUB_ROR_IMM), // OP_SUB_ROR_IMM /* 0000 0100 0111 */ TABDECL(OP_SUB_ROR_REG), // OP_SUB_ROR_REG /* 0000 0100 1000 */ TABDECL(OP_SUB_LSL_IMM), // OP_SUB_LSL_IMM /* 0000 0100 1001 */ TABDECL(OP_UND), /* 0000 0100 1010 */ TABDECL(OP_SUB_LSR_IMM), // OP_SUB_LSR_IMM /* 0000 0100 1011 */ TABDECL(OP_STRH_POS_INDE_M_IMM_OFF), // OP_STRH_POS_INDE_M_IMM_OFF /* 0000 0100 1100 */ TABDECL(OP_SUB_ASR_IMM), // OP_SUB_ASR_IMM /* 0000 0100 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 0100 1110 */ TABDECL(OP_SUB_ROR_IMM), // OP_SUB_ROR_IMM /* 0000 0100 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 0101 0000 */ TABDECL(OP_SUB_S_LSL_IMM), // OP_SUB_S_LSL_IMM /* 0000 0101 0001 */ TABDECL(OP_SUB_S_LSL_REG), // OP_SUB_S_LSL_REG /* 0000 0101 0010 */ TABDECL(OP_SUB_S_LSR_IMM), // OP_SUB_S_LSR_IMM /* 0000 0101 0011 */ TABDECL(OP_SUB_S_LSR_REG), // OP_SUB_S_LSR_REG /* 0000 0101 0100 */ TABDECL(OP_SUB_S_ASR_IMM), // OP_SUB_S_ASR_IMM /* 0000 0101 0101 */ TABDECL(OP_SUB_S_ASR_REG), // OP_SUB_S_ASR_REG /* 0000 0101 0110 */ TABDECL(OP_SUB_S_ROR_IMM), // OP_SUB_S_ROR_IMM /* 0000 0101 0111 */ TABDECL(OP_SUB_S_ROR_REG), // OP_SUB_S_ROR_REG /* 0000 0101 1000 */ TABDECL(OP_SUB_S_LSL_IMM), // OP_SUB_S_LSL_IMM /* 0000 0101 1001 */ TABDECL(OP_UND), /* 0000 0101 1010 */ TABDECL(OP_SUB_S_LSR_IMM), // OP_SUB_S_LSR_IMM /* 0000 0101 1011 */ TABDECL(OP_LDRH_POS_INDE_M_IMM_OFF), // OP_LDRH_POS_INDE_M_IMM_OFF /* 0000 0101 1100 */ TABDECL(OP_SUB_S_ASR_IMM), // OP_SUB_S_ASR_IMM /* 0000 0101 1101 */ TABDECL(OP_LDRSB_POS_INDE_M_IMM_OFF), // OP_LDRSB_POS_INDE_M_IMM_OFF /* 0000 0101 1110 */ TABDECL(OP_SUB_S_ROR_IMM), // OP_SUB_S_ROR_IMM /* 0000 0101 1111 */ TABDECL(OP_LDRSH_POS_INDE_M_IMM_OFF), // OP_LDRSH_POS_INDE_M_IMM_OFF /* 0000 0110 0000 */ TABDECL(OP_RSB_LSL_IMM), // OP_RSB_LSL_IMM /* 0000 0110 0001 */ TABDECL(OP_RSB_LSL_REG), // OP_RSB_LSL_REG /* 0000 0110 0010 */ TABDECL(OP_RSB_LSR_IMM), // OP_RSB_LSR_IMM /* 0000 0110 0011 */ TABDECL(OP_RSB_LSR_REG), // OP_RSB_LSR_REG /* 0000 0110 0100 */ TABDECL(OP_RSB_ASR_IMM), // OP_RSB_ASR_IMM /* 0000 0110 0101 */ TABDECL(OP_RSB_ASR_REG), // OP_RSB_ASR_REG /* 0000 0110 0110 */ TABDECL(OP_RSB_ROR_IMM), // OP_RSB_ROR_IMM /* 0000 0110 0111 */ TABDECL(OP_RSB_ROR_REG), // OP_RSB_ROR_REG /* 0000 0110 1000 */ TABDECL(OP_RSB_LSL_IMM), // OP_RSB_LSL_IMM /* 0000 0110 1001 */ TABDECL(OP_UND), /* 0000 0110 1010 */ TABDECL(OP_RSB_LSR_IMM), // OP_RSB_LSR_IMM /* 0000 0110 1011 */ TABDECL(OP_UND), /* 0000 0110 1100 */ TABDECL(OP_RSB_ASR_IMM), // OP_RSB_ASR_IMM /* 0000 0110 1101 */ TABDECL(OP_UND), /* 0000 0110 1110 */ TABDECL(OP_RSB_ROR_IMM), // OP_RSB_ROR_IMM /* 0000 0110 1111 */ TABDECL(OP_UND), /* 0000 0111 0000 */ TABDECL(OP_RSB_S_LSL_IMM), // OP_RSB_S_LSL_IMM /* 0000 0111 0001 */ TABDECL(OP_RSB_S_LSL_REG), // OP_RSB_S_LSL_REG /* 0000 0111 0010 */ TABDECL(OP_RSB_S_LSR_IMM), // OP_RSB_S_LSR_IMM /* 0000 0111 0011 */ TABDECL(OP_RSB_S_LSR_REG), // OP_RSB_S_LSR_REG /* 0000 0111 0100 */ TABDECL(OP_RSB_S_ASR_IMM), // OP_RSB_S_ASR_IMM /* 0000 0111 0101 */ TABDECL(OP_RSB_S_ASR_REG), // OP_RSB_S_ASR_REG /* 0000 0111 0110 */ TABDECL(OP_RSB_S_ROR_IMM), // OP_RSB_S_ROR_IMM /* 0000 0111 0111 */ TABDECL(OP_RSB_S_ROR_REG), // OP_RSB_S_ROR_REG /* 0000 0111 1000 */ TABDECL(OP_RSB_S_LSL_IMM), // OP_RSB_S_LSL_IMM /* 0000 0111 1001 */ TABDECL(OP_UND), /* 0000 0111 1010 */ TABDECL(OP_RSB_S_LSR_IMM), // OP_RSB_S_LSR_IMM /* 0000 0111 1011 */ TABDECL(OP_UND), /* 0000 0111 1100 */ TABDECL(OP_RSB_S_ASR_IMM), // OP_RSB_S_ASR_IMM /* 0000 0111 1101 */ TABDECL(OP_UND), /* 0000 0111 1110 */ TABDECL(OP_RSB_S_ROR_IMM), // OP_RSB_S_ROR_IMM /* 0000 0111 1111 */ TABDECL(OP_UND), /* 0000 1000 0000 */ TABDECL(OP_ADD_LSL_IMM), // OP_ADD_LSL_IMM /* 0000 1000 0001 */ TABDECL(OP_ADD_LSL_REG), // OP_ADD_LSL_REG /* 0000 1000 0010 */ TABDECL(OP_ADD_LSR_IMM), // OP_ADD_LSR_IMM /* 0000 1000 0011 */ TABDECL(OP_ADD_LSR_REG), // OP_ADD_LSR_REG /* 0000 1000 0100 */ TABDECL(OP_ADD_ASR_IMM), // OP_ADD_ASR_IMM /* 0000 1000 0101 */ TABDECL(OP_ADD_ASR_REG), // OP_ADD_ASR_REG /* 0000 1000 0110 */ TABDECL(OP_ADD_ROR_IMM), // OP_ADD_ROR_IMM /* 0000 1000 0111 */ TABDECL(OP_ADD_ROR_REG), // OP_ADD_ROR_REG /* 0000 1000 1000 */ TABDECL(OP_ADD_LSL_IMM), // OP_ADD_LSL_IMM /* 0000 1000 1001 */ TABDECL(OP_UMULL), // OP_UMULL /* 0000 1000 1010 */ TABDECL(OP_ADD_LSR_IMM), // OP_ADD_LSR_IMM /* 0000 1000 1011 */ TABDECL(OP_STRH_POS_INDE_P_REG_OFF), // OP_STRH_POS_INDE_P_REG_OFF /* 0000 1000 1100 */ TABDECL(OP_ADD_ASR_IMM), // OP_ADD_ASR_IMM /* 0000 1000 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 1000 1110 */ TABDECL(OP_ADD_ROR_IMM), // OP_ADD_ROR_IMM /* 0000 1000 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 1001 0000 */ TABDECL(OP_ADD_S_LSL_IMM), // OP_ADD_S_LSL_IMM /* 0000 1001 0001 */ TABDECL(OP_ADD_S_LSL_REG), // OP_ADD_S_LSL_REG /* 0000 1001 0010 */ TABDECL(OP_ADD_S_LSR_IMM), // OP_ADD_S_LSR_IMM /* 0000 1001 0011 */ TABDECL(OP_ADD_S_LSR_REG), // OP_ADD_S_LSR_REG /* 0000 1001 0100 */ TABDECL(OP_ADD_S_ASR_IMM), // OP_ADD_S_ASR_IMM /* 0000 1001 0101 */ TABDECL(OP_ADD_S_ASR_REG), // OP_ADD_S_ASR_REG /* 0000 1001 0110 */ TABDECL(OP_ADD_S_ROR_IMM), // OP_ADD_S_ROR_IMM /* 0000 1001 0111 */ TABDECL(OP_ADD_S_ROR_REG), // OP_ADD_S_ROR_REG /* 0000 1001 1000 */ TABDECL(OP_ADD_S_LSL_IMM), // OP_ADD_S_LSL_IMM /* 0000 1001 1001 */ TABDECL(OP_UMULL_S), // OP_UMULL_S /* 0000 1001 1010 */ TABDECL(OP_ADD_S_LSR_IMM), // OP_ADD_S_LSR_IMM /* 0000 1001 1011 */ TABDECL(OP_LDRH_POS_INDE_P_REG_OFF), // OP_LDRH_POS_INDE_P_REG_OFF /* 0000 1001 1100 */ TABDECL(OP_ADD_S_ASR_IMM), // OP_ADD_S_ASR_IMM /* 0000 1001 1101 */ TABDECL(OP_LDRSB_POS_INDE_P_REG_OFF), // OP_LDRSB_POS_INDE_P_REG_OFF /* 0000 1001 1110 */ TABDECL(OP_ADD_S_ROR_IMM), // OP_ADD_S_ROR_IMM /* 0000 1001 1111 */ TABDECL(OP_LDRSH_POS_INDE_P_REG_OFF), // OP_LDRSH_POS_INDE_P_REG_OFF /* 0000 1010 0000 */ TABDECL(OP_ADC_LSL_IMM), // OP_ADC_LSL_IMM /* 0000 1010 0001 */ TABDECL(OP_ADC_LSL_REG), // OP_ADC_LSL_REG /* 0000 1010 0010 */ TABDECL(OP_ADC_LSR_IMM), // OP_ADC_LSR_IMM /* 0000 1010 0011 */ TABDECL(OP_ADC_LSR_REG), // OP_ADC_LSR_REG /* 0000 1010 0100 */ TABDECL(OP_ADC_ASR_IMM), // OP_ADC_ASR_IMM /* 0000 1010 0101 */ TABDECL(OP_ADC_ASR_REG), // OP_ADC_ASR_REG /* 0000 1010 0110 */ TABDECL(OP_ADC_ROR_IMM), // OP_ADC_ROR_IMM /* 0000 1010 0111 */ TABDECL(OP_ADC_ROR_REG), // OP_ADC_ROR_REG /* 0000 1010 1000 */ TABDECL(OP_ADC_LSL_IMM), // OP_ADC_LSL_IMM /* 0000 1010 1001 */ TABDECL(OP_UMLAL), // OP_UMLAL /* 0000 1010 1010 */ TABDECL(OP_ADC_LSR_IMM), // OP_ADC_LSR_IMM /* 0000 1010 1011 */ TABDECL(OP_UND), /* 0000 1010 1100 */ TABDECL(OP_ADC_ASR_IMM), // OP_ADC_ASR_IMM /* 0000 1010 1101 */ TABDECL(OP_UND), /* 0000 1010 1110 */ TABDECL(OP_ADC_ROR_IMM), // OP_ADC_ROR_IMM /* 0000 1010 1111 */ TABDECL(OP_UND), /* 0000 1011 0000 */ TABDECL(OP_ADC_S_LSL_IMM), // OP_ADC_S_LSL_IMM /* 0000 1011 0001 */ TABDECL(OP_ADC_S_LSL_REG), // OP_ADC_S_LSL_REG /* 0000 1011 0010 */ TABDECL(OP_ADC_S_LSR_IMM), // OP_ADC_S_LSR_IMM /* 0000 1011 0011 */ TABDECL(OP_ADC_S_LSR_REG), // OP_ADC_S_LSR_REG /* 0000 1011 0100 */ TABDECL(OP_ADC_S_ASR_IMM), // OP_ADC_S_ASR_IMM /* 0000 1011 0101 */ TABDECL(OP_ADC_S_ASR_REG), // OP_ADC_S_ASR_REG /* 0000 1011 0110 */ TABDECL(OP_ADC_S_ROR_IMM), // OP_ADC_S_ROR_IMM /* 0000 1011 0111 */ TABDECL(OP_ADC_S_ROR_REG), // OP_ADC_S_ROR_REG /* 0000 1011 1000 */ TABDECL(OP_ADC_S_LSL_IMM), // OP_ADC_S_LSL_IMM /* 0000 1011 1001 */ TABDECL(OP_UMLAL_S), // OP_UMLAL_S /* 0000 1011 1010 */ TABDECL(OP_ADC_S_LSR_IMM), // OP_ADC_S_LSR_IMM /* 0000 1011 1011 */ TABDECL(OP_UND), /* 0000 1011 1100 */ TABDECL(OP_ADC_S_ASR_IMM), // OP_ADC_S_ASR_IMM /* 0000 1011 1101 */ TABDECL(OP_UND), /* 0000 1011 1110 */ TABDECL(OP_ADC_S_ROR_IMM), // OP_ADC_S_ROR_IMM /* 0000 1011 1111 */ TABDECL(OP_UND), /* 0000 1100 0000 */ TABDECL(OP_SBC_LSL_IMM), // OP_SBC_LSL_IMM /* 0000 1100 0001 */ TABDECL(OP_SBC_LSL_REG), // OP_SBC_LSL_REG /* 0000 1100 0010 */ TABDECL(OP_SBC_LSR_IMM), // OP_SBC_LSR_IMM /* 0000 1100 0011 */ TABDECL(OP_SBC_LSR_REG), // OP_SBC_LSR_REG /* 0000 1100 0100 */ TABDECL(OP_SBC_ASR_IMM), // OP_SBC_ASR_IMM /* 0000 1100 0101 */ TABDECL(OP_SBC_ASR_REG), // OP_SBC_ASR_REG /* 0000 1100 0110 */ TABDECL(OP_SBC_ROR_IMM), // OP_SBC_ROR_IMM /* 0000 1100 0111 */ TABDECL(OP_SBC_ROR_REG), // OP_SBC_ROR_REG /* 0000 1100 1000 */ TABDECL(OP_SBC_LSL_IMM), // OP_SBC_LSL_IMM /* 0000 1100 1001 */ TABDECL(OP_SMULL), // OP_SMULL /* 0000 1100 1010 */ TABDECL(OP_SBC_LSR_IMM), // OP_SBC_LSR_IMM /* 0000 1100 1011 */ TABDECL(OP_STRH_POS_INDE_P_IMM_OFF), // OP_STRH_POS_INDE_P_IMM_OFF /* 0000 1100 1100 */ TABDECL(OP_SBC_ASR_IMM), // OP_SBC_ASR_IMM /* 0000 1100 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 1100 1110 */ TABDECL(OP_SBC_ROR_IMM), // OP_SBC_ROR_IMM /* 0000 1100 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX), // OP_LDRD_STRD_POST_INDEX /* 0000 1101 0000 */ TABDECL(OP_SBC_S_LSL_IMM), // OP_SBC_S_LSL_IMM /* 0000 1101 0001 */ TABDECL(OP_SBC_S_LSL_REG), // OP_SBC_S_LSL_REG /* 0000 1101 0010 */ TABDECL(OP_SBC_S_LSR_IMM), // OP_SBC_S_LSR_IMM /* 0000 1101 0011 */ TABDECL(OP_SBC_S_LSR_REG), // OP_SBC_S_LSR_REG /* 0000 1101 0100 */ TABDECL(OP_SBC_S_ASR_IMM), // OP_SBC_S_ASR_IMM /* 0000 1101 0101 */ TABDECL(OP_SBC_S_ASR_REG), // OP_SBC_S_ASR_REG /* 0000 1101 0110 */ TABDECL(OP_SBC_S_ROR_IMM), // OP_SBC_S_ROR_IMM /* 0000 1101 0111 */ TABDECL(OP_SBC_S_ROR_REG), // OP_SBC_S_ROR_REG /* 0000 1101 1000 */ TABDECL(OP_SBC_S_LSL_IMM), // OP_SBC_S_LSL_IMM /* 0000 1101 1001 */ TABDECL(OP_SMULL_S), // OP_SMULL_S /* 0000 1101 1010 */ TABDECL(OP_SBC_S_LSR_IMM), // OP_SBC_S_LSR_IMM /* 0000 1101 1011 */ TABDECL(OP_LDRH_POS_INDE_P_IMM_OFF), // OP_LDRH_POS_INDE_P_IMM_OFF /* 0000 1101 1100 */ TABDECL(OP_SBC_S_ASR_IMM), // OP_SBC_S_ASR_IMM /* 0000 1101 1101 */ TABDECL(OP_LDRSB_POS_INDE_P_IMM_OFF), // OP_LDRSB_POS_INDE_P_IMM_OFF /* 0000 1101 1110 */ TABDECL(OP_SBC_S_ROR_IMM), // OP_SBC_S_ROR_IMM /* 0000 1101 1111 */ TABDECL(OP_LDRSH_POS_INDE_P_IMM_OFF), // OP_LDRSH_POS_INDE_P_IMM_OFF /* 0000 1110 0000 */ TABDECL(OP_RSC_LSL_IMM), // OP_RSC_LSL_IMM /* 0000 1110 0001 */ TABDECL(OP_RSC_LSL_REG), // OP_RSC_LSL_REG /* 0000 1110 0010 */ TABDECL(OP_RSC_LSR_IMM), // OP_RSC_LSR_IMM /* 0000 1110 0011 */ TABDECL(OP_RSC_LSR_REG), // OP_RSC_LSR_REG /* 0000 1110 0100 */ TABDECL(OP_RSC_ASR_IMM), // OP_RSC_ASR_IMM /* 0000 1110 0101 */ TABDECL(OP_RSC_ASR_REG), // OP_RSC_ASR_REG /* 0000 1110 0110 */ TABDECL(OP_RSC_ROR_IMM), // OP_RSC_ROR_IMM /* 0000 1110 0111 */ TABDECL(OP_RSC_ROR_REG), // OP_RSC_ROR_REG /* 0000 1110 1000 */ TABDECL(OP_RSC_LSL_IMM), // OP_RSC_LSL_IMM /* 0000 1110 1001 */ TABDECL(OP_SMLAL), // OP_SMLAL /* 0000 1110 1010 */ TABDECL(OP_RSC_LSR_IMM), // OP_RSC_LSR_IMM /* 0000 1110 1011 */ TABDECL(OP_UND), /* 0000 1110 1100 */ TABDECL(OP_RSC_ASR_IMM), // OP_RSC_ASR_IMM /* 0000 1110 1101 */ TABDECL(OP_UND), /* 0000 1110 1110 */ TABDECL(OP_RSC_ROR_IMM), // OP_RSC_ROR_IMM /* 0000 1110 1111 */ TABDECL(OP_UND), /* 0000 1111 0000 */ TABDECL(OP_RSC_S_LSL_IMM), // OP_RSC_S_LSL_IMM /* 0000 1111 0001 */ TABDECL(OP_RSC_S_LSL_REG), // OP_RSC_S_LSL_REG /* 0000 1111 0010 */ TABDECL(OP_RSC_S_LSR_IMM), // OP_RSC_S_LSR_IMM /* 0000 1111 0011 */ TABDECL(OP_RSC_S_LSR_REG), // OP_RSC_S_LSR_REG /* 0000 1111 0100 */ TABDECL(OP_RSC_S_ASR_IMM), // OP_RSC_S_ASR_IMM /* 0000 1111 0101 */ TABDECL(OP_RSC_S_ASR_REG), // OP_RSC_S_ASR_REG /* 0000 1111 0110 */ TABDECL(OP_RSC_S_ROR_IMM), // OP_RSC_S_ROR_IMM /* 0000 1111 0111 */ TABDECL(OP_RSC_S_ROR_REG), // OP_RSC_S_ROR_REG /* 0000 1111 1000 */ TABDECL(OP_RSC_S_LSL_IMM), // OP_RSC_S_LSL_IMM /* 0000 1111 1001 */ TABDECL(OP_SMLAL_S), // OP_SMLAL_S /* 0000 1111 1010 */ TABDECL(OP_RSC_S_LSR_IMM), // OP_RSC_S_LSR_IMM /* 0000 1111 1011 */ TABDECL(OP_UND), /* 0000 1111 1100 */ TABDECL(OP_RSC_S_ASR_IMM), // OP_RSC_S_ASR_IMM /* 0000 1111 1101 */ TABDECL(OP_UND), /* 0000 1111 1110 */ TABDECL(OP_RSC_S_ROR_IMM), // OP_RSC_S_ROR_IMM /* 0000 1111 1111 */ TABDECL(OP_UND), /* 0001 0000 0000 */ TABDECL(OP_MRS_CPSR), // OP_MRS_CPSR /* 0001 0000 0001 */ TABDECL(OP_UND), /* 0001 0000 0010 */ TABDECL(OP_UND), /* 0001 0000 0011 */ TABDECL(OP_UND), /* 0001 0000 0100 */ TABDECL(OP_UND), /* 0001 0000 0101 */ TABDECL(OP_QADD), // OP_QADD /* 0001 0000 0110 */ TABDECL(OP_UND), /* 0001 0000 0111 */ TABDECL(OP_UND), /* 0001 0000 1000 */ TABDECL(OP_SMLA_B_B), // OP_SMLA_B_B /* 0001 0000 1001 */ TABDECL(OP_SWP), // OP_SWP /* 0001 0000 1010 */ TABDECL(OP_SMLA_T_B), // OP_SMLA_T_B /* 0001 0000 1011 */ TABDECL(OP_STRH_M_REG_OFF), // OP_STRH_M_REG_OFF /* 0001 0000 1100 */ TABDECL(OP_SMLA_B_T), // OP_SMLA_B_T /* 0001 0000 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0000 1110 */ TABDECL(OP_SMLA_T_T), // OP_SMLA_T_T /* 0001 0000 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0001 0000 */ TABDECL(OP_TST_LSL_IMM), // OP_TST_LSL_IMM /* 0001 0001 0001 */ TABDECL(OP_TST_LSL_REG), // OP_TST_LSL_REG /* 0001 0001 0010 */ TABDECL(OP_TST_LSR_IMM), // OP_TST_LSR_IMM /* 0001 0001 0011 */ TABDECL(OP_TST_LSR_REG), // OP_TST_LSR_REG /* 0001 0001 0100 */ TABDECL(OP_TST_ASR_IMM), // OP_TST_ASR_IMM /* 0001 0001 0101 */ TABDECL(OP_TST_ASR_REG), // OP_TST_ASR_REG /* 0001 0001 0110 */ TABDECL(OP_TST_ROR_IMM), // OP_TST_ROR_IMM /* 0001 0001 0111 */ TABDECL(OP_TST_ROR_REG), // OP_TST_ROR_REG /* 0001 0001 1000 */ TABDECL(OP_TST_LSL_IMM), // OP_TST_LSL_IMM /* 0001 0001 1001 */ TABDECL(OP_UND), /* 0001 0001 1010 */ TABDECL(OP_TST_LSR_IMM), // OP_TST_LSR_IMM /* 0001 0001 1011 */ TABDECL(OP_LDRH_M_REG_OFF), // OP_LDRH_M_REG_OFF /* 0001 0001 1100 */ TABDECL(OP_TST_ASR_IMM), // OP_TST_ASR_IMM /* 0001 0001 1101 */ TABDECL(OP_LDRSB_M_REG_OFF), // OP_LDRSB_M_REG_OFF /* 0001 0001 1110 */ TABDECL(OP_TST_ROR_IMM), // OP_TST_ROR_IMM /* 0001 0001 1111 */ TABDECL(OP_LDRSH_M_REG_OFF), // OP_LDRSH_M_REG_OFF /* 0001 0010 0000 */ TABDECL(OP_MSR_CPSR), // OP_MSR_CPSR /* 0001 0010 0001 */ TABDECL(OP_BX), // OP_BX /* 0001 0010 0010 */ TABDECL(OP_UND), /* 0001 0010 0011 */ TABDECL(OP_BLX_REG), // OP_BLX_REG /* 0001 0010 0100 */ TABDECL(OP_UND), /* 0001 0010 0101 */ TABDECL(OP_QSUB), // OP_QSUB /* 0001 0010 0110 */ TABDECL(OP_UND), /* 0001 0010 0111 */ TABDECL(OP_BKPT), // OP_BKPT /* 0001 0010 1000 */ TABDECL(OP_SMLAW_B), // OP_SMLAW_B /* 0001 0010 1001 */ TABDECL(OP_UND), /* 0001 0010 1010 */ TABDECL(OP_SMULW_B), // OP_SMULW_B /* 0001 0010 1011 */ TABDECL(OP_STRH_PRE_INDE_M_REG_OFF), // OP_STRH_PRE_INDE_M_REG_OFF /* 0001 0010 1100 */ TABDECL(OP_SMLAW_T), // OP_SMLAW_T /* 0001 0010 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0010 1110 */ TABDECL(OP_SMULW_T), // OP_SMULW_T /* 0001 0010 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0011 0000 */ TABDECL(OP_TEQ_LSL_IMM), // OP_TEQ_LSL_IMM /* 0001 0011 0001 */ TABDECL(OP_TEQ_LSL_REG), // OP_TEQ_LSL_REG /* 0001 0011 0010 */ TABDECL(OP_TEQ_LSR_IMM), // OP_TEQ_LSR_IMM /* 0001 0011 0011 */ TABDECL(OP_TEQ_LSR_REG), // OP_TEQ_LSR_REG /* 0001 0011 0100 */ TABDECL(OP_TEQ_ASR_IMM), // OP_TEQ_ASR_IMM /* 0001 0011 0101 */ TABDECL(OP_TEQ_ASR_REG), // OP_TEQ_ASR_REG /* 0001 0011 0110 */ TABDECL(OP_TEQ_ROR_IMM), // OP_TEQ_ROR_IMM /* 0001 0011 0111 */ TABDECL(OP_TEQ_ROR_REG), // OP_TEQ_ROR_REG /* 0001 0011 1000 */ TABDECL(OP_TEQ_LSL_IMM), // OP_TEQ_LSL_IMM /* 0001 0011 1001 */ TABDECL(OP_UND), /* 0001 0011 1010 */ TABDECL(OP_TEQ_LSR_IMM), // OP_TEQ_LSR_IMM /* 0001 0011 1011 */ TABDECL(OP_LDRH_PRE_INDE_M_REG_OFF), // OP_LDRH_PRE_INDE_M_REG_OFF /* 0001 0011 1100 */ TABDECL(OP_TEQ_ASR_IMM), // OP_TEQ_ASR_IMM /* 0001 0011 1101 */ TABDECL(OP_LDRSB_PRE_INDE_M_REG_OFF), // OP_LDRSB_PRE_INDE_M_REG_OFF /* 0001 0011 1110 */ TABDECL(OP_TEQ_ROR_IMM), // OP_TEQ_ROR_IMM /* 0001 0011 1111 */ TABDECL(OP_LDRSH_PRE_INDE_M_REG_OFF), // OP_LDRSH_PRE_INDE_M_REG_OFF /* 0001 0100 0000 */ TABDECL(OP_MRS_SPSR), // OP_MRS_SPSR /* 0001 0100 0001 */ TABDECL(OP_UND), /* 0001 0100 0010 */ TABDECL(OP_UND), /* 0001 0100 0011 */ TABDECL(OP_UND), /* 0001 0100 0100 */ TABDECL(OP_UND), /* 0001 0100 0101 */ TABDECL(OP_QDADD), // OP_QDADD /* 0001 0100 0110 */ TABDECL(OP_UND), /* 0001 0100 0111 */ TABDECL(OP_UND), /* 0001 0100 1000 */ TABDECL(OP_SMLAL_B_B), // OP_SMLAL_B_B /* 0001 0100 1001 */ TABDECL(OP_SWPB), // OP_SWPB /* 0001 0100 1010 */ TABDECL(OP_SMLAL_T_B), // OP_SMLAL_T_B /* 0001 0100 1011 */ TABDECL(OP_STRH_M_IMM_OFF), // OP_STRH_M_IMM_OFF /* 0001 0100 1100 */ TABDECL(OP_SMLAL_B_T), // OP_SMLAL_B_T /* 0001 0100 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0100 1110 */ TABDECL(OP_SMLAL_T_T), // OP_SMLAL_T_T /* 0001 0100 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0101 0000 */ TABDECL(OP_CMP_LSL_IMM), // OP_CMP_LSL_IMM /* 0001 0101 0001 */ TABDECL(OP_CMP_LSL_REG), // OP_CMP_LSL_REG /* 0001 0101 0010 */ TABDECL(OP_CMP_LSR_IMM), // OP_CMP_LSR_IMM /* 0001 0101 0011 */ TABDECL(OP_CMP_LSR_REG), // OP_CMP_LSR_REG /* 0001 0101 0100 */ TABDECL(OP_CMP_ASR_IMM), // OP_CMP_ASR_IMM /* 0001 0101 0101 */ TABDECL(OP_CMP_ASR_REG), // OP_CMP_ASR_REG /* 0001 0101 0110 */ TABDECL(OP_CMP_ROR_IMM), // OP_CMP_ROR_IMM /* 0001 0101 0111 */ TABDECL(OP_CMP_ROR_REG), // OP_CMP_ROR_REG /* 0001 0101 1000 */ TABDECL(OP_CMP_LSL_IMM), // OP_CMP_LSL_IMM /* 0001 0101 1001 */ TABDECL(OP_UND), /* 0001 0101 1010 */ TABDECL(OP_CMP_LSR_IMM), // OP_CMP_LSR_IMM /* 0001 0101 1011 */ TABDECL(OP_LDRH_M_IMM_OFF), // OP_LDRH_M_IMM_OFF /* 0001 0101 1100 */ TABDECL(OP_CMP_ASR_IMM), // OP_CMP_ASR_IMM /* 0001 0101 1101 */ TABDECL(OP_LDRSB_M_IMM_OFF), // OP_LDRSB_M_IMM_OFF /* 0001 0101 1110 */ TABDECL(OP_CMP_ROR_IMM), // OP_CMP_ROR_IMM /* 0001 0101 1111 */ TABDECL(OP_LDRSH_M_IMM_OFF), // OP_LDRSH_M_IMM_OFF /* 0001 0110 0000 */ TABDECL(OP_MSR_SPSR), // OP_MSR_SPSR /* 0001 0110 0001 */ TABDECL(OP_CLZ), // OP_CLZ /* 0001 0110 0010 */ TABDECL(OP_UND), /* 0001 0110 0011 */ TABDECL(OP_UND), /* 0001 0110 0100 */ TABDECL(OP_UND), /* 0001 0110 0101 */ TABDECL(OP_QDSUB), // OP_QDSUB /* 0001 0110 0110 */ TABDECL(OP_UND), /* 0001 0110 0111 */ TABDECL(OP_UND), /* 0001 0110 1000 */ TABDECL(OP_SMUL_B_B), // OP_SMUL_B_B /* 0001 0110 1001 */ TABDECL(OP_UND), /* 0001 0110 1010 */ TABDECL(OP_SMUL_T_B), // OP_SMUL_T_B /* 0001 0110 1011 */ TABDECL(OP_STRH_PRE_INDE_M_IMM_OFF), // OP_STRH_PRE_INDE_M_IMM_OFF /* 0001 0110 1100 */ TABDECL(OP_SMUL_B_T), // OP_SMUL_B_T /* 0001 0110 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0110 1110 */ TABDECL(OP_SMUL_T_T), // OP_SMUL_T_T /* 0001 0110 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 0111 0000 */ TABDECL(OP_CMN_LSL_IMM), // OP_CMN_LSL_IMM /* 0001 0111 0001 */ TABDECL(OP_CMN_LSL_REG), // OP_CMN_LSL_REG /* 0001 0111 0010 */ TABDECL(OP_CMN_LSR_IMM), // OP_CMN_LSR_IMM /* 0001 0111 0011 */ TABDECL(OP_CMN_LSR_REG), // OP_CMN_LSR_REG /* 0001 0111 0100 */ TABDECL(OP_CMN_ASR_IMM), // OP_CMN_ASR_IMM /* 0001 0111 0101 */ TABDECL(OP_CMN_ASR_REG), // OP_CMN_ASR_REG /* 0001 0111 0110 */ TABDECL(OP_CMN_ROR_IMM), // OP_CMN_ROR_IMM /* 0001 0111 0111 */ TABDECL(OP_CMN_ROR_REG), // OP_CMN_ROR_REG /* 0001 0111 1000 */ TABDECL(OP_CMN_LSL_IMM), // OP_CMN_LSL_IMM /* 0001 0111 1001 */ TABDECL(OP_UND), /* 0001 0111 1010 */ TABDECL(OP_CMN_LSR_IMM), // OP_CMN_LSR_IMM /* 0001 0111 1011 */ TABDECL(OP_LDRH_PRE_INDE_M_IMM_OFF), // OP_LDRH_PRE_INDE_M_IMM_OFF /* 0001 0111 1100 */ TABDECL(OP_CMN_ASR_IMM), // OP_CMN_ASR_IMM /* 0001 0111 1101 */ TABDECL(OP_LDRSB_PRE_INDE_M_IMM_OFF), // OP_LDRSB_PRE_INDE_M_IMM_OFF /* 0001 0111 1110 */ TABDECL(OP_CMN_ROR_IMM), // OP_CMN_ROR_IMM /* 0001 0111 1111 */ TABDECL(OP_LDRSH_PRE_INDE_M_IMM_OFF), // OP_LDRSH_PRE_INDE_M_IMM_OFF /* 0001 1000 0000 */ TABDECL(OP_ORR_LSL_IMM), // OP_ORR_LSL_IMM /* 0001 1000 0001 */ TABDECL(OP_ORR_LSL_REG), // OP_ORR_LSL_REG /* 0001 1000 0010 */ TABDECL(OP_ORR_LSR_IMM), // OP_ORR_LSR_IMM /* 0001 1000 0011 */ TABDECL(OP_ORR_LSR_REG), // OP_ORR_LSR_REG /* 0001 1000 0100 */ TABDECL(OP_ORR_ASR_IMM), // OP_ORR_ASR_IMM /* 0001 1000 0101 */ TABDECL(OP_ORR_ASR_REG), // OP_ORR_ASR_REG /* 0001 1000 0110 */ TABDECL(OP_ORR_ROR_IMM), // OP_ORR_ROR_IMM /* 0001 1000 0111 */ TABDECL(OP_ORR_ROR_REG), // OP_ORR_ROR_REG /* 0001 1000 1000 */ TABDECL(OP_ORR_LSL_IMM), // OP_ORR_LSL_IMM /* 0001 1000 1001 */ TABDECL(OP_STREX), // OP_STREX /* 0001 1000 1010 */ TABDECL(OP_ORR_LSR_IMM), // OP_ORR_LSR_IMM /* 0001 1000 1011 */ TABDECL(OP_STRH_P_REG_OFF), // OP_STRH_P_REG_OFF /* 0001 1000 1100 */ TABDECL(OP_ORR_ASR_IMM), // OP_ORR_ASR_IMM /* 0001 1000 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1000 1110 */ TABDECL(OP_ORR_ROR_IMM), // OP_ORR_ROR_IMM /* 0001 1000 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1001 0000 */ TABDECL(OP_ORR_S_LSL_IMM), // OP_ORR_S_LSL_IMM /* 0001 1001 0001 */ TABDECL(OP_ORR_S_LSL_REG), // OP_ORR_S_LSL_REG /* 0001 1001 0010 */ TABDECL(OP_ORR_S_LSR_IMM), // OP_ORR_S_LSR_IMM /* 0001 1001 0011 */ TABDECL(OP_ORR_S_LSR_REG), // OP_ORR_S_LSR_REG /* 0001 1001 0100 */ TABDECL(OP_ORR_S_ASR_IMM), // OP_ORR_S_ASR_IMM /* 0001 1001 0101 */ TABDECL(OP_ORR_S_ASR_REG), // OP_ORR_S_ASR_REG /* 0001 1001 0110 */ TABDECL(OP_ORR_S_ROR_IMM), // OP_ORR_S_ROR_IMM /* 0001 1001 0111 */ TABDECL(OP_ORR_S_ROR_REG), // OP_ORR_S_ROR_REG /* 0001 1001 1000 */ TABDECL(OP_ORR_S_LSL_IMM), // OP_ORR_S_LSL_IMM /* 0001 1001 1001 */ TABDECL(OP_LDREX), // OP_LDREX /* 0001 1001 1010 */ TABDECL(OP_ORR_S_LSR_IMM), // OP_ORR_S_LSR_IMM /* 0001 1001 1011 */ TABDECL(OP_LDRH_P_REG_OFF), // OP_LDRH_P_REG_OFF /* 0001 1001 1100 */ TABDECL(OP_ORR_S_ASR_IMM), // OP_ORR_S_ASR_IMM /* 0001 1001 1101 */ TABDECL(OP_LDRSB_P_REG_OFF), // OP_LDRSB_P_REG_OFF /* 0001 1001 1110 */ TABDECL(OP_ORR_S_ROR_IMM), // OP_ORR_S_ROR_IMM /* 0001 1001 1111 */ TABDECL(OP_LDRSH_P_REG_OFF), // OP_LDRSH_P_REG_OFF /* 0001 1010 0000 */ TABDECL(OP_MOV_LSL_IMM), // OP_MOV_LSL_IMM /* 0001 1010 0001 */ TABDECL(OP_MOV_LSL_REG), // OP_MOV_LSL_REG /* 0001 1010 0010 */ TABDECL(OP_MOV_LSR_IMM), // OP_MOV_LSR_IMM /* 0001 1010 0011 */ TABDECL(OP_MOV_LSR_REG), // OP_MOV_LSR_REG /* 0001 1010 0100 */ TABDECL(OP_MOV_ASR_IMM), // OP_MOV_ASR_IMM /* 0001 1010 0101 */ TABDECL(OP_MOV_ASR_REG), // OP_MOV_ASR_REG /* 0001 1010 0110 */ TABDECL(OP_MOV_ROR_IMM), // OP_MOV_ROR_IMM /* 0001 1010 0111 */ TABDECL(OP_MOV_ROR_REG), // OP_MOV_ROR_REG /* 0001 1010 1000 */ TABDECL(OP_MOV_LSL_IMM), // OP_MOV_LSL_IMM /* 0001 1010 1001 */ TABDECL(OP_UND), /* 0001 1010 1010 */ TABDECL(OP_MOV_LSR_IMM), // OP_MOV_LSR_IMM /* 0001 1010 1011 */ TABDECL(OP_STRH_PRE_INDE_P_REG_OFF), // OP_STRH_PRE_INDE_P_REG_OFF /* 0001 1010 1100 */ TABDECL(OP_MOV_ASR_IMM), // OP_MOV_ASR_IMM /* 0001 1010 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1010 1110 */ TABDECL(OP_MOV_ROR_IMM), // OP_MOV_ROR_IMM /* 0001 1010 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1011 0000 */ TABDECL(OP_MOV_S_LSL_IMM), // OP_MOV_S_LSL_IMM /* 0001 1011 0001 */ TABDECL(OP_MOV_S_LSL_REG), // OP_MOV_S_LSL_REG /* 0001 1011 0010 */ TABDECL(OP_MOV_S_LSR_IMM), // OP_MOV_S_LSR_IMM /* 0001 1011 0011 */ TABDECL(OP_MOV_S_LSR_REG), // OP_MOV_S_LSR_REG /* 0001 1011 0100 */ TABDECL(OP_MOV_S_ASR_IMM), // OP_MOV_S_ASR_IMM /* 0001 1011 0101 */ TABDECL(OP_MOV_S_ASR_REG), // OP_MOV_S_ASR_REG /* 0001 1011 0110 */ TABDECL(OP_MOV_S_ROR_IMM), // OP_MOV_S_ROR_IMM /* 0001 1011 0111 */ TABDECL(OP_MOV_S_ROR_REG), // OP_MOV_S_ROR_REG /* 0001 1011 1000 */ TABDECL(OP_MOV_S_LSL_IMM), // OP_MOV_S_LSL_IMM /* 0001 1011 1001 */ TABDECL(OP_UND), /* 0001 1011 1010 */ TABDECL(OP_MOV_S_LSR_IMM), // OP_MOV_S_LSR_IMM /* 0001 1011 1011 */ TABDECL(OP_LDRH_PRE_INDE_P_REG_OFF), // OP_LDRH_PRE_INDE_P_REG_OFF /* 0001 1011 1100 */ TABDECL(OP_MOV_S_ASR_IMM), // OP_MOV_S_ASR_IMM /* 0001 1011 1101 */ TABDECL(OP_LDRSB_PRE_INDE_P_REG_OFF), // OP_LDRSB_PRE_INDE_P_REG_OFF /* 0001 1011 1110 */ TABDECL(OP_MOV_S_ROR_IMM), // OP_MOV_S_ROR_IMM /* 0001 1011 1111 */ TABDECL(OP_LDRSH_PRE_INDE_P_REG_OFF), // OP_LDRSH_PRE_INDE_P_REG_OFF /* 0001 1100 0000 */ TABDECL(OP_BIC_LSL_IMM), // OP_BIC_LSL_IMM /* 0001 1100 0001 */ TABDECL(OP_BIC_LSL_REG), // OP_BIC_LSL_REG /* 0001 1100 0010 */ TABDECL(OP_BIC_LSR_IMM), // OP_BIC_LSR_IMM /* 0001 1100 0011 */ TABDECL(OP_BIC_LSR_REG), // OP_BIC_LSR_REG /* 0001 1100 0100 */ TABDECL(OP_BIC_ASR_IMM), // OP_BIC_ASR_IMM /* 0001 1100 0101 */ TABDECL(OP_BIC_ASR_REG), // OP_BIC_ASR_REG /* 0001 1100 0110 */ TABDECL(OP_BIC_ROR_IMM), // OP_BIC_ROR_IMM /* 0001 1100 0111 */ TABDECL(OP_BIC_ROR_REG), // OP_BIC_ROR_REG /* 0001 1100 1000 */ TABDECL(OP_BIC_LSL_IMM), // OP_BIC_LSL_IMM /* 0001 1100 1001 */ TABDECL(OP_UND), /* 0001 1100 1010 */ TABDECL(OP_BIC_LSR_IMM), // OP_BIC_LSR_IMM /* 0001 1100 1011 */ TABDECL(OP_STRH_P_IMM_OFF), // OP_STRH_P_IMM_OFF /* 0001 1100 1100 */ TABDECL(OP_BIC_ASR_IMM), // OP_BIC_ASR_IMM /* 0001 1100 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1100 1110 */ TABDECL(OP_BIC_ROR_IMM), // OP_BIC_ROR_IMM /* 0001 1100 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1101 0000 */ TABDECL(OP_BIC_S_LSL_IMM), // OP_BIC_S_LSL_IMM /* 0001 1101 0001 */ TABDECL(OP_BIC_S_LSL_REG), // OP_BIC_S_LSL_REG /* 0001 1101 0010 */ TABDECL(OP_BIC_S_LSR_IMM), // OP_BIC_S_LSR_IMM /* 0001 1101 0011 */ TABDECL(OP_BIC_S_LSR_REG), // OP_BIC_S_LSR_REG /* 0001 1101 0100 */ TABDECL(OP_BIC_S_ASR_IMM), // OP_BIC_S_ASR_IMM /* 0001 1101 0101 */ TABDECL(OP_BIC_S_ASR_REG), // OP_BIC_S_ASR_REG /* 0001 1101 0110 */ TABDECL(OP_BIC_S_ROR_IMM), // OP_BIC_S_ROR_IMM /* 0001 1101 0111 */ TABDECL(OP_BIC_S_ROR_REG), // OP_BIC_S_ROR_REG /* 0001 1101 1000 */ TABDECL(OP_BIC_S_LSL_IMM), // OP_BIC_S_LSL_IMM /* 0001 1101 1001 */ TABDECL(OP_UND), /* 0001 1101 1010 */ TABDECL(OP_BIC_S_LSR_IMM), // OP_BIC_S_LSR_IMM /* 0001 1101 1011 */ TABDECL(OP_LDRH_P_IMM_OFF), // OP_LDRH_P_IMM_OFF /* 0001 1101 1100 */ TABDECL(OP_BIC_S_ASR_IMM), // OP_BIC_S_ASR_IMM /* 0001 1101 1101 */ TABDECL(OP_LDRSB_P_IMM_OFF), // OP_LDRSB_P_IMM_OFF /* 0001 1101 1110 */ TABDECL(OP_BIC_S_ROR_IMM), // OP_BIC_S_ROR_IMM /* 0001 1101 1111 */ TABDECL(OP_LDRSH_P_IMM_OFF), // OP_LDRSH_P_IMM_OFF /* 0001 1110 0000 */ TABDECL(OP_MVN_LSL_IMM), // OP_MVN_LSL_IMM /* 0001 1110 0001 */ TABDECL(OP_MVN_LSL_REG), // OP_MVN_LSL_REG /* 0001 1110 0010 */ TABDECL(OP_MVN_LSR_IMM), // OP_MVN_LSR_IMM /* 0001 1110 0011 */ TABDECL(OP_MVN_LSR_REG), // OP_MVN_LSR_REG /* 0001 1110 0100 */ TABDECL(OP_MVN_ASR_IMM), // OP_MVN_ASR_IMM /* 0001 1110 0101 */ TABDECL(OP_MVN_ASR_REG), // OP_MVN_ASR_REG /* 0001 1110 0110 */ TABDECL(OP_MVN_ROR_IMM), // OP_MVN_ROR_IMM /* 0001 1110 0111 */ TABDECL(OP_MVN_ROR_REG), // OP_MVN_ROR_REG /* 0001 1110 1000 */ TABDECL(OP_MVN_LSL_IMM), // OP_MVN_LSL_IMM /* 0001 1110 1001 */ TABDECL(OP_UND), /* 0001 1110 1010 */ TABDECL(OP_MVN_LSR_IMM), // OP_MVN_LSR_IMM /* 0001 1110 1011 */ TABDECL(OP_STRH_PRE_INDE_P_IMM_OFF), // OP_STRH_PRE_INDE_P_IMM_OFF /* 0001 1110 1100 */ TABDECL(OP_MVN_ASR_IMM), // OP_MVN_ASR_IMM /* 0001 1110 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1110 1110 */ TABDECL(OP_MVN_ROR_IMM), // OP_MVN_ROR_IMM /* 0001 1110 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX), // OP_LDRD_STRD_OFFSET_PRE_INDEX /* 0001 1111 0000 */ TABDECL(OP_MVN_S_LSL_IMM), // OP_MVN_S_LSL_IMM /* 0001 1111 0001 */ TABDECL(OP_MVN_S_LSL_REG), // OP_MVN_S_LSL_REG /* 0001 1111 0010 */ TABDECL(OP_MVN_S_LSR_IMM), // OP_MVN_S_LSR_IMM /* 0001 1111 0011 */ TABDECL(OP_MVN_S_LSR_REG), // OP_MVN_S_LSR_REG /* 0001 1111 0100 */ TABDECL(OP_MVN_S_ASR_IMM), // OP_MVN_S_ASR_IMM /* 0001 1111 0101 */ TABDECL(OP_MVN_S_ASR_REG), // OP_MVN_S_ASR_REG /* 0001 1111 0110 */ TABDECL(OP_MVN_S_ROR_IMM), // OP_MVN_S_ROR_IMM /* 0001 1111 0111 */ TABDECL(OP_MVN_S_ROR_REG), // OP_MVN_S_ROR_REG /* 0001 1111 1000 */ TABDECL(OP_MVN_S_LSL_IMM), // OP_MVN_S_LSL_IMM /* 0001 1111 1001 */ TABDECL(OP_UND), /* 0001 1111 1010 */ TABDECL(OP_MVN_S_LSR_IMM), // OP_MVN_S_LSR_IMM /* 0001 1111 1011 */ TABDECL(OP_LDRH_PRE_INDE_P_IMM_OFF), // OP_LDRH_PRE_INDE_P_IMM_OFF /* 0001 1111 1100 */ TABDECL(OP_MVN_S_ASR_IMM), // OP_MVN_S_ASR_IMM /* 0001 1111 1101 */ TABDECL(OP_LDRSB_PRE_INDE_P_IMM_OFF), // OP_LDRSB_PRE_INDE_P_IMM_OFF /* 0001 1111 1110 */ TABDECL(OP_MVN_S_ROR_IMM), // OP_MVN_S_ROR_IMM /* 0001 1111 1111 */ TABDECL(OP_LDRSH_PRE_INDE_P_IMM_OFF), // OP_LDRSH_PRE_INDE_P_IMM_OFF /* 0010 0000 0000 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0001 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0010 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0011 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0100 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0101 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0110 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 0111 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1000 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1001 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1010 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1011 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1100 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1101 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1110 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0000 1111 */ TABDECL(OP_AND_IMM_VAL), // OP_AND_IMM_VAL /* 0010 0001 0000 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0001 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0010 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0011 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0100 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0101 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0110 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 0111 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1000 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1001 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1010 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1011 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1100 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1101 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1110 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0001 1111 */ TABDECL(OP_AND_S_IMM_VAL), // OP_AND_S_IMM_VAL /* 0010 0010 0000 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0001 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0010 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0011 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0100 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0101 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0110 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 0111 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1000 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1001 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1010 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1011 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1100 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1101 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1110 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0010 1111 */ TABDECL(OP_EOR_IMM_VAL), // OP_EOR_IMM_VAL /* 0010 0011 0000 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0001 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0010 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0011 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0100 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0101 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0110 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 0111 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1000 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1001 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1010 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1011 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1100 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1101 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1110 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0011 1111 */ TABDECL(OP_EOR_S_IMM_VAL), // OP_EOR_S_IMM_VAL /* 0010 0100 0000 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0001 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0010 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0011 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0100 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0101 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0110 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 0111 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1000 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1001 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1010 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1011 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1100 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1101 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1110 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0100 1111 */ TABDECL(OP_SUB_IMM_VAL), // OP_SUB_IMM_VAL /* 0010 0101 0000 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0001 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0010 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0011 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0100 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0101 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0110 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 0111 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1000 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1001 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1010 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1011 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1100 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1101 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1110 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0101 1111 */ TABDECL(OP_SUB_S_IMM_VAL), // OP_SUB_S_IMM_VAL /* 0010 0110 0000 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0001 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0010 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0011 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0100 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0101 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0110 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 0111 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1000 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1001 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1010 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1011 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1100 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1101 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1110 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0110 1111 */ TABDECL(OP_RSB_IMM_VAL), // OP_RSB_IMM_VAL /* 0010 0111 0000 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0001 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0010 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0011 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0100 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0101 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0110 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 0111 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1000 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1001 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1010 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1011 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1100 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1101 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1110 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 0111 1111 */ TABDECL(OP_RSB_S_IMM_VAL), // OP_RSB_S_IMM_VAL /* 0010 1000 0000 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0001 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0010 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0011 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0100 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0101 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0110 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 0111 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1000 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1001 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1010 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1011 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1100 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1101 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1110 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1000 1111 */ TABDECL(OP_ADD_IMM_VAL), // OP_ADD_IMM_VAL /* 0010 1001 0000 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0001 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0010 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0011 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0100 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0101 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0110 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 0111 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1000 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1001 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1010 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1011 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1100 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1101 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1110 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1001 1111 */ TABDECL(OP_ADD_S_IMM_VAL), // OP_ADD_S_IMM_VAL /* 0010 1010 0000 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0001 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0010 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0011 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0100 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0101 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0110 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 0111 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1000 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1001 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1010 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1011 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1100 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1101 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1110 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1010 1111 */ TABDECL(OP_ADC_IMM_VAL), // OP_ADC_IMM_VAL /* 0010 1011 0000 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0001 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0010 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0011 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0100 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0101 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0110 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 0111 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1000 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1001 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1010 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1011 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1100 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1101 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1110 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1011 1111 */ TABDECL(OP_ADC_S_IMM_VAL), // OP_ADC_S_IMM_VAL /* 0010 1100 0000 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0001 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0010 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0011 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0100 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0101 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0110 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 0111 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1000 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1001 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1010 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1011 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1100 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1101 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1110 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1100 1111 */ TABDECL(OP_SBC_IMM_VAL), // OP_SBC_IMM_VAL /* 0010 1101 0000 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0001 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0010 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0011 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0100 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0101 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0110 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 0111 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1000 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1001 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1010 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1011 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1100 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1101 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1110 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1101 1111 */ TABDECL(OP_SBC_S_IMM_VAL), // OP_SBC_S_IMM_VAL /* 0010 1110 0000 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0001 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0010 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0011 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0100 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0101 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0110 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 0111 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1000 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1001 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1010 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1011 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1100 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1101 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1110 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1110 1111 */ TABDECL(OP_RSC_IMM_VAL), // OP_RSC_IMM_VAL /* 0010 1111 0000 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0001 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0010 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0011 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0100 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0101 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0110 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 0111 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1000 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1001 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1010 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1011 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1100 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1101 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1110 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0010 1111 1111 */ TABDECL(OP_RSC_S_IMM_VAL), // OP_RSC_S_IMM_VAL /* 0011 0000 0000 */ TABDECL(OP_UND), /* 0011 0000 0001 */ TABDECL(OP_UND), /* 0011 0000 0010 */ TABDECL(OP_UND), /* 0011 0000 0011 */ TABDECL(OP_UND), /* 0011 0000 0100 */ TABDECL(OP_UND), /* 0011 0000 0101 */ TABDECL(OP_UND), /* 0011 0000 0110 */ TABDECL(OP_UND), /* 0011 0000 0111 */ TABDECL(OP_UND), /* 0011 0000 1000 */ TABDECL(OP_UND), /* 0011 0000 1001 */ TABDECL(OP_UND), /* 0011 0000 1010 */ TABDECL(OP_UND), /* 0011 0000 1011 */ TABDECL(OP_UND), /* 0011 0000 1100 */ TABDECL(OP_UND), /* 0011 0000 1101 */ TABDECL(OP_UND), /* 0011 0000 1110 */ TABDECL(OP_UND), /* 0011 0000 1111 */ TABDECL(OP_UND), /* 0011 0001 0000 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0001 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0010 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0011 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0100 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0101 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0110 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 0111 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1000 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1001 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1010 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1011 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1100 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1101 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1110 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0001 1111 */ TABDECL(OP_TST_IMM_VAL), // OP_TST_IMM_VAL /* 0011 0010 0000 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0001 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0010 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0011 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0100 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0101 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0110 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 0111 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1000 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1001 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1010 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1011 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1100 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1101 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1110 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0010 1111 */ TABDECL(OP_MSR_CPSR_IMM_VAL), // OP_MSR_CPSR_IMM_VAL /* 0011 0011 0000 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0001 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0010 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0011 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0100 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0101 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0110 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 0111 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1000 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1001 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1010 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1011 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1100 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1101 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1110 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0011 1111 */ TABDECL(OP_TEQ_IMM_VAL), // OP_TEQ_IMM_VAL /* 0011 0100 0000 */ TABDECL(OP_UND), /* 0011 0100 0001 */ TABDECL(OP_UND), /* 0011 0100 0010 */ TABDECL(OP_UND), /* 0011 0100 0011 */ TABDECL(OP_UND), /* 0011 0100 0100 */ TABDECL(OP_UND), /* 0011 0100 0101 */ TABDECL(OP_UND), /* 0011 0100 0110 */ TABDECL(OP_UND), /* 0011 0100 0111 */ TABDECL(OP_UND), /* 0011 0100 1000 */ TABDECL(OP_UND), /* 0011 0100 1001 */ TABDECL(OP_UND), /* 0011 0100 1010 */ TABDECL(OP_UND), /* 0011 0100 1011 */ TABDECL(OP_UND), /* 0011 0100 1100 */ TABDECL(OP_UND), /* 0011 0100 1101 */ TABDECL(OP_UND), /* 0011 0100 1110 */ TABDECL(OP_UND), /* 0011 0100 1111 */ TABDECL(OP_UND), /* 0011 0101 0000 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0001 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0010 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0011 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0100 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0101 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0110 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 0111 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1000 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1001 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1010 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1011 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1100 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1101 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1110 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0101 1111 */ TABDECL(OP_CMP_IMM_VAL), // OP_CMP_IMM_VAL /* 0011 0110 0000 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0001 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0010 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0011 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0100 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0101 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0110 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 0111 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1000 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1001 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1010 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1011 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1100 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1101 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1110 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0110 1111 */ TABDECL(OP_MSR_SPSR_IMM_VAL), // OP_MSR_SPSR_IMM_VAL /* 0011 0111 0000 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0001 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0010 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0011 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0100 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0101 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0110 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 0111 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1000 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1001 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1010 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1011 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1100 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1101 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1110 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 0111 1111 */ TABDECL(OP_CMN_IMM_VAL), // OP_CMN_IMM_VAL /* 0011 1000 0000 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0001 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0010 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0011 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0100 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0101 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0110 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 0111 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1000 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1001 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1010 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1011 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1100 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1101 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1110 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1000 1111 */ TABDECL(OP_ORR_IMM_VAL), // OP_ORR_IMM_VAL /* 0011 1001 0000 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0001 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0010 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0011 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0100 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0101 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0110 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 0111 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1000 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1001 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1010 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1011 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1100 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1101 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1110 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1001 1111 */ TABDECL(OP_ORR_S_IMM_VAL), // OP_ORR_S_IMM_VAL /* 0011 1010 0000 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0001 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0010 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0011 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0100 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0101 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0110 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 0111 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1000 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1001 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1010 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1011 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1100 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1101 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1110 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1010 1111 */ TABDECL(OP_MOV_IMM_VAL), // OP_MOV_IMM_VAL /* 0011 1011 0000 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0001 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0010 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0011 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0100 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0101 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0110 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 0111 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1000 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1001 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1010 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1011 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1100 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1101 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1110 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1011 1111 */ TABDECL(OP_MOV_S_IMM_VAL), // OP_MOV_S_IMM_VAL /* 0011 1100 0000 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0001 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0010 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0011 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0100 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0101 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0110 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 0111 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1000 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1001 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1010 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1011 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1100 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1101 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1110 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1100 1111 */ TABDECL(OP_BIC_IMM_VAL), // OP_BIC_IMM_VAL /* 0011 1101 0000 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0001 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0010 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0011 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0100 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0101 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0110 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 0111 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1000 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1001 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1010 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1011 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1100 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1101 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1110 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1101 1111 */ TABDECL(OP_BIC_S_IMM_VAL), // OP_BIC_S_IMM_VAL /* 0011 1110 0000 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0001 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0010 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0011 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0100 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0101 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0110 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 0111 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1000 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1001 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1010 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1011 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1100 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1101 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1110 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1110 1111 */ TABDECL(OP_MVN_IMM_VAL), // OP_MVN_IMM_VAL /* 0011 1111 0000 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0001 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0010 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0011 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0100 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0101 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0110 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 0111 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1000 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1001 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1010 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1011 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1100 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1101 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1110 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0011 1111 1111 */ TABDECL(OP_MVN_S_IMM_VAL), // OP_MVN_S_IMM_VAL /* 0100 0000 0000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 0111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0000 1111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0001 0000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 0111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0001 1111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0010 0000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 0001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 0010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 0011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 0100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 0101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 0110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 0111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 1000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 1001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 1010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 1011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 1100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 1101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 1110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0010 1111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND), // OP_STR_M_IMM_OFF_POSTIND /* 0100 0011 0000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 0001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 0010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 0011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 0100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 0101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 0110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 0111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 1000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 1001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 1010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 1011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 1100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 1101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 1110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0011 1111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND), // OP_LDR_M_IMM_OFF_POSTIND /* 0100 0100 0000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 0111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0100 1111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0101 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0101 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0110 0000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 0001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 0010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 0011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 0100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 0101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 0110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 0111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 1000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 1001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 1010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 1011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 1100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 1101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 1110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0110 1111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND), // OP_STRB_M_IMM_OFF_POSTIND /* 0100 0111 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 0111 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND), // OP_LDRB_M_IMM_OFF_POSTIND /* 0100 1000 0000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 0111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1000 1111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1001 0000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 0111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1001 1111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1010 0000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 0111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1010 1111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND), // OP_STR_P_IMM_OFF_POSTIND /* 0100 1011 0000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 0001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 0010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 0011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 0100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 0101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 0110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 0111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 1000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 1001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 1010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 1011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 1100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 1101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 1110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1011 1111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND), // OP_LDR_P_IMM_OFF_POSTIND /* 0100 1100 0000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 0111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1100 1111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1101 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1101 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1110 0000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 0111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1110 1111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND), // OP_STRB_P_IMM_OFF_POSTIND /* 0100 1111 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0100 1111 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND), // OP_LDRB_P_IMM_OFF_POSTIND /* 0101 0000 0000 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0001 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0010 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0011 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0100 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0101 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0110 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 0111 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1000 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1001 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1010 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1011 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1100 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1101 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1110 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0000 1111 */ TABDECL(OP_STR_M_IMM_OFF), // OP_STR_M_IMM_OFF /* 0101 0001 0000 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0001 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0010 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0011 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0100 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0101 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0110 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 0111 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1000 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1001 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1010 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1011 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1100 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1101 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1110 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0001 1111 */ TABDECL(OP_LDR_M_IMM_OFF), // OP_LDR_M_IMM_OFF /* 0101 0010 0000 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0001 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0010 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0011 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0100 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0101 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0110 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 0111 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1000 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1001 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1010 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1011 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1100 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1101 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1110 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0010 1111 */ TABDECL(OP_STR_M_IMM_OFF_PREIND), // OP_STR_M_IMM_OFF_PREIND /* 0101 0011 0000 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0001 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0010 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0011 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0100 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0101 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0110 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 0111 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1000 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1001 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1010 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1011 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1100 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1101 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1110 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0011 1111 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND), // OP_LDR_M_IMM_OFF_PREIND /* 0101 0100 0000 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0001 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0010 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0011 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0100 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0101 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0110 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 0111 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1000 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1001 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1010 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1011 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1100 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1101 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1110 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0100 1111 */ TABDECL(OP_STRB_M_IMM_OFF), // OP_STRB_M_IMM_OFF /* 0101 0101 0000 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0001 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0010 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0011 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0100 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0101 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0110 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 0111 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1000 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1001 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1010 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1011 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1100 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1101 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1110 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0101 1111 */ TABDECL(OP_LDRB_M_IMM_OFF), // OP_LDRB_M_IMM_OFF /* 0101 0110 0000 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0001 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0010 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0011 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0100 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0101 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0110 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 0111 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1000 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1001 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1010 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1011 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1100 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1101 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1110 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0110 1111 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND), // OP_STRB_M_IMM_OFF_PREIND /* 0101 0111 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 0111 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND), // OP_LDRB_M_IMM_OFF_PREIND /* 0101 1000 0000 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0001 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0010 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0011 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0100 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0101 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0110 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 0111 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1000 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1001 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1010 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1011 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1100 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1101 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1110 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1000 1111 */ TABDECL(OP_STR_P_IMM_OFF), // OP_STR_P_IMM_OFF /* 0101 1001 0000 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0001 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0010 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0011 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0100 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0101 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0110 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 0111 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1000 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1001 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1010 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1011 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1100 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1101 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1110 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1001 1111 */ TABDECL(OP_LDR_P_IMM_OFF), // OP_LDR_P_IMM_OFF /* 0101 1010 0000 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0001 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0010 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0011 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0100 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0101 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0110 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 0111 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1000 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1001 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1010 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1011 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1100 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1101 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1110 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1010 1111 */ TABDECL(OP_STR_P_IMM_OFF_PREIND), // OP_STR_P_IMM_OFF_PREIND /* 0101 1011 0000 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0001 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0010 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0011 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0100 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0101 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0110 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 0111 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1000 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1001 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1010 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1011 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1100 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1101 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1110 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1011 1111 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND), // OP_LDR_P_IMM_OFF_PREIND /* 0101 1100 0000 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0001 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0010 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0011 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0100 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0101 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0110 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 0111 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1000 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1001 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1010 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1011 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1100 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1101 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1110 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1100 1111 */ TABDECL(OP_STRB_P_IMM_OFF), // OP_STRB_P_IMM_OFF /* 0101 1101 0000 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0001 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0010 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0011 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0100 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0101 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0110 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 0111 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1000 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1001 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1010 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1011 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1100 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1101 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1110 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1101 1111 */ TABDECL(OP_LDRB_P_IMM_OFF), // OP_LDRB_P_IMM_OFF /* 0101 1110 0000 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0001 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0010 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0011 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0100 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0101 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0110 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 0111 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1000 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1001 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1010 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1011 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1100 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1101 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1110 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1110 1111 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND), // OP_STRB_P_IMM_OFF_PREIND /* 0101 1111 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0101 1111 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND), // OP_LDRB_P_IMM_OFF_PREIND /* 0110 0000 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND), // OP_STR_M_LSL_IMM_OFF_POSTIND /* 0110 0000 0001 */ TABDECL(OP_UND), /* 0110 0000 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND), // OP_STR_M_LSR_IMM_OFF_POSTIND /* 0110 0000 0011 */ TABDECL(OP_UND), /* 0110 0000 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND), // OP_STR_M_ASR_IMM_OFF_POSTIND /* 0110 0000 0101 */ TABDECL(OP_UND), /* 0110 0000 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND), // OP_STR_M_ROR_IMM_OFF_POSTIND /* 0110 0000 0111 */ TABDECL(OP_UND), /* 0110 0000 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND), // OP_STR_M_LSL_IMM_OFF_POSTIND /* 0110 0000 1001 */ TABDECL(OP_UND), /* 0110 0000 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND), // OP_STR_M_LSR_IMM_OFF_POSTIND /* 0110 0000 1011 */ TABDECL(OP_UND), /* 0110 0000 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND), // OP_STR_M_ASR_IMM_OFF_POSTIND /* 0110 0000 1101 */ TABDECL(OP_UND), /* 0110 0000 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND), // OP_STR_M_ROR_IMM_OFF_POSTIND /* 0110 0000 1111 */ TABDECL(OP_UND), /* 0110 0001 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND), // OP_LDR_M_LSL_IMM_OFF_POSTIND /* 0110 0001 0001 */ TABDECL(OP_UND), /* 0110 0001 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND), // OP_LDR_M_LSR_IMM_OFF_POSTIND /* 0110 0001 0011 */ TABDECL(OP_UND), /* 0110 0001 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND), // OP_LDR_M_ASR_IMM_OFF_POSTIND /* 0110 0001 0101 */ TABDECL(OP_UND), /* 0110 0001 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND), // OP_LDR_M_ROR_IMM_OFF_POSTIND /* 0110 0001 0111 */ TABDECL(OP_UND), /* 0110 0001 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND), // OP_LDR_M_LSL_IMM_OFF_POSTIND /* 0110 0001 1001 */ TABDECL(OP_UND), /* 0110 0001 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND), // OP_LDR_M_LSR_IMM_OFF_POSTIND /* 0110 0001 1011 */ TABDECL(OP_UND), /* 0110 0001 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND), // OP_LDR_M_ASR_IMM_OFF_POSTIND /* 0110 0001 1101 */ TABDECL(OP_UND), /* 0110 0001 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND), // OP_LDR_M_ROR_IMM_OFF_POSTIND /* 0110 0001 1111 */ TABDECL(OP_UND), /* 0110 0010 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND), // OP_STR_M_LSL_IMM_OFF_POSTIND /* 0110 0010 0001 */ TABDECL(OP_UND), /* 0110 0010 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND), // OP_STR_M_LSR_IMM_OFF_POSTIND /* 0110 0010 0011 */ TABDECL(OP_UND), /* 0110 0010 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND), // OP_STR_M_ASR_IMM_OFF_POSTIND /* 0110 0010 0101 */ TABDECL(OP_UND), /* 0110 0010 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND), // OP_STR_M_ROR_IMM_OFF_POSTIND /* 0110 0010 0111 */ TABDECL(OP_UND), /* 0110 0010 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND), // OP_STR_M_LSL_IMM_OFF_POSTIND /* 0110 0010 1001 */ TABDECL(OP_UND), /* 0110 0010 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND), // OP_STR_M_LSR_IMM_OFF_POSTIND /* 0110 0010 1011 */ TABDECL(OP_UND), /* 0110 0010 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND), // OP_STR_M_ASR_IMM_OFF_POSTIND /* 0110 0010 1101 */ TABDECL(OP_UND), /* 0110 0010 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND), // OP_STR_M_ROR_IMM_OFF_POSTIND /* 0110 0010 1111 */ TABDECL(OP_UND), /* 0110 0011 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND), // OP_LDR_M_LSL_IMM_OFF_POSTIND /* 0110 0011 0001 */ TABDECL(OP_UND), /* 0110 0011 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND), // OP_LDR_M_LSR_IMM_OFF_POSTIND /* 0110 0011 0011 */ TABDECL(OP_UND), /* 0110 0011 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND), // OP_LDR_M_ASR_IMM_OFF_POSTIND /* 0110 0011 0101 */ TABDECL(OP_UND), /* 0110 0011 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND), // OP_LDR_M_ROR_IMM_OFF_POSTIND /* 0110 0011 0111 */ TABDECL(OP_UND), /* 0110 0011 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND), // OP_LDR_M_LSL_IMM_OFF_POSTIND /* 0110 0011 1001 */ TABDECL(OP_UND), /* 0110 0011 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND), // OP_LDR_M_LSR_IMM_OFF_POSTIND /* 0110 0011 1011 */ TABDECL(OP_UND), /* 0110 0011 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND), // OP_LDR_M_ASR_IMM_OFF_POSTIND /* 0110 0011 1101 */ TABDECL(OP_UND), /* 0110 0011 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND), // OP_LDR_M_ROR_IMM_OFF_POSTIND /* 0110 0011 1111 */ TABDECL(OP_UND), /* 0110 0100 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND), // OP_STRB_M_LSL_IMM_OFF_POSTIND /* 0110 0100 0001 */ TABDECL(OP_UND), /* 0110 0100 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND), // OP_STRB_M_LSR_IMM_OFF_POSTIND /* 0110 0100 0011 */ TABDECL(OP_UND), /* 0110 0100 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND), // OP_STRB_M_ASR_IMM_OFF_POSTIND /* 0110 0100 0101 */ TABDECL(OP_UND), /* 0110 0100 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND), // OP_STRB_M_ROR_IMM_OFF_POSTIND /* 0110 0100 0111 */ TABDECL(OP_UND), /* 0110 0100 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND), // OP_STRB_M_LSL_IMM_OFF_POSTIND /* 0110 0100 1001 */ TABDECL(OP_UND), /* 0110 0100 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND), // OP_STRB_M_LSR_IMM_OFF_POSTIND /* 0110 0100 1011 */ TABDECL(OP_UND), /* 0110 0100 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND), // OP_STRB_M_ASR_IMM_OFF_POSTIND /* 0110 0100 1101 */ TABDECL(OP_UND), /* 0110 0100 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND), // OP_STRB_M_ROR_IMM_OFF_POSTIND /* 0110 0100 1111 */ TABDECL(OP_UND), /* 0110 0101 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND), // OP_LDRB_M_LSL_IMM_OFF_POSTIND /* 0110 0101 0001 */ TABDECL(OP_UND), /* 0110 0101 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND), // OP_LDRB_M_LSR_IMM_OFF_POSTIND /* 0110 0101 0011 */ TABDECL(OP_UND), /* 0110 0101 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND), // OP_LDRB_M_ASR_IMM_OFF_POSTIND /* 0110 0101 0101 */ TABDECL(OP_UND), /* 0110 0101 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND), // OP_LDRB_M_ROR_IMM_OFF_POSTIND /* 0110 0101 0111 */ TABDECL(OP_UND), /* 0110 0101 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND), // OP_LDRB_M_LSL_IMM_OFF_POSTIND /* 0110 0101 1001 */ TABDECL(OP_UND), /* 0110 0101 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND), // OP_LDRB_M_LSR_IMM_OFF_POSTIND /* 0110 0101 1011 */ TABDECL(OP_UND), /* 0110 0101 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND), // OP_LDRB_M_ASR_IMM_OFF_POSTIND /* 0110 0101 1101 */ TABDECL(OP_UND), /* 0110 0101 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND), // OP_LDRB_M_ROR_IMM_OFF_POSTIND /* 0110 0101 1111 */ TABDECL(OP_UND), /* 0110 0110 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND), // OP_STRB_M_LSL_IMM_OFF_POSTIND /* 0110 0110 0001 */ TABDECL(OP_UND), /* 0110 0110 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND), // OP_STRB_M_LSR_IMM_OFF_POSTIND /* 0110 0110 0011 */ TABDECL(OP_UND), /* 0110 0110 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND), // OP_STRB_M_ASR_IMM_OFF_POSTIND /* 0110 0110 0101 */ TABDECL(OP_UND), /* 0110 0110 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND), // OP_STRB_M_ROR_IMM_OFF_POSTIND /* 0110 0110 0111 */ TABDECL(OP_UND), /* 0110 0110 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND), // OP_STRB_M_LSL_IMM_OFF_POSTIND /* 0110 0110 1001 */ TABDECL(OP_UND), /* 0110 0110 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND), // OP_STRB_M_LSR_IMM_OFF_POSTIND /* 0110 0110 1011 */ TABDECL(OP_UND), /* 0110 0110 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND), // OP_STRB_M_ASR_IMM_OFF_POSTIND /* 0110 0110 1101 */ TABDECL(OP_UND), /* 0110 0110 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND), // OP_STRB_M_ROR_IMM_OFF_POSTIND /* 0110 0110 1111 */ TABDECL(OP_UND), /* 0110 0111 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND), // OP_LDRB_M_LSL_IMM_OFF_POSTIND /* 0110 0111 0001 */ TABDECL(OP_UND), /* 0110 0111 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND), // OP_LDRB_M_LSR_IMM_OFF_POSTIND /* 0110 0111 0011 */ TABDECL(OP_UND), /* 0110 0111 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND), // OP_LDRB_M_ASR_IMM_OFF_POSTIND /* 0110 0111 0101 */ TABDECL(OP_UND), /* 0110 0111 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND), // OP_LDRB_M_ROR_IMM_OFF_POSTIND /* 0110 0111 0111 */ TABDECL(OP_UND), /* 0110 0111 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND), // OP_LDRB_M_LSL_IMM_OFF_POSTIND /* 0110 0111 1001 */ TABDECL(OP_UND), /* 0110 0111 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND), // OP_LDRB_M_LSR_IMM_OFF_POSTIND /* 0110 0111 1011 */ TABDECL(OP_UND), /* 0110 0111 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND), // OP_LDRB_M_ASR_IMM_OFF_POSTIND /* 0110 0111 1101 */ TABDECL(OP_UND), /* 0110 0111 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND), // OP_LDRB_M_ROR_IMM_OFF_POSTIND /* 0110 0111 1111 */ TABDECL(OP_UND), /* 0110 1000 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND), // OP_STR_P_LSL_IMM_OFF_POSTIND /* 0110 1000 0001 */ TABDECL(OP_UND), /* 0110 1000 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND), // OP_STR_P_LSR_IMM_OFF_POSTIND /* 0110 1000 0011 */ TABDECL(OP_UND), /* 0110 1000 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND), // OP_STR_P_ASR_IMM_OFF_POSTIND /* 0110 1000 0101 */ TABDECL(OP_UND), /* 0110 1000 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND), // OP_STR_P_ROR_IMM_OFF_POSTIND /* 0110 1000 0111 */ TABDECL(OP_UND), /* 0110 1000 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND), // OP_STR_P_LSL_IMM_OFF_POSTIND /* 0110 1000 1001 */ TABDECL(OP_UND), /* 0110 1000 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND), // OP_STR_P_LSR_IMM_OFF_POSTIND /* 0110 1000 1011 */ TABDECL(OP_UND), /* 0110 1000 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND), // OP_STR_P_ASR_IMM_OFF_POSTIND /* 0110 1000 1101 */ TABDECL(OP_UND), /* 0110 1000 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND), // OP_STR_P_ROR_IMM_OFF_POSTIND /* 0110 1000 1111 */ TABDECL(OP_UND), /* 0110 1001 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1001 0001 */ TABDECL(OP_UND), /* 0110 1001 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_POSTIND), // OP_LDR_P_LSR_IMM_OFF_POSTIND /* 0110 1001 0011 */ TABDECL(OP_UND), /* 0110 1001 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_POSTIND), // OP_LDR_P_ASR_IMM_OFF_POSTIND /* 0110 1001 0101 */ TABDECL(OP_UND), /* 0110 1001 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_POSTIND), // OP_LDR_P_ROR_IMM_OFF_POSTIND /* 0110 1001 0111 */ TABDECL(OP_UND), /* 0110 1001 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1001 1001 */ TABDECL(OP_UND), /* 0110 1001 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_POSTIND), // OP_LDR_P_LSR_IMM_OFF_POSTIND /* 0110 1001 1011 */ TABDECL(OP_UND), /* 0110 1001 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_POSTIND), // OP_LDR_P_ASR_IMM_OFF_POSTIND /* 0110 1001 1101 */ TABDECL(OP_UND), /* 0110 1001 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_POSTIND), // OP_LDR_P_ROR_IMM_OFF_POSTIND /* 0110 1001 1111 */ TABDECL(OP_UND), /* 0110 1010 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND), // OP_STR_P_LSL_IMM_OFF_POSTIND /* 0110 1010 0001 */ TABDECL(OP_UND), /* 0110 1010 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND), // OP_STR_P_LSR_IMM_OFF_POSTIND /* 0110 1010 0011 */ TABDECL(OP_UND), /* 0110 1010 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND), // OP_STR_P_ASR_IMM_OFF_POSTIND /* 0110 1010 0101 */ TABDECL(OP_UND), /* 0110 1010 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND), // OP_STR_P_ROR_IMM_OFF_POSTIND /* 0110 1010 0111 */ TABDECL(OP_UND), /* 0110 1010 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND), // OP_STR_P_LSL_IMM_OFF_POSTIND /* 0110 1010 1001 */ TABDECL(OP_UND), /* 0110 1010 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND), // OP_STR_P_LSR_IMM_OFF_POSTIND /* 0110 1010 1011 */ TABDECL(OP_UND), /* 0110 1010 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND), // OP_STR_P_ASR_IMM_OFF_POSTIND /* 0110 1010 1101 */ TABDECL(OP_UND), /* 0110 1010 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND), // OP_STR_P_ROR_IMM_OFF_POSTIND /* 0110 1010 1111 */ TABDECL(OP_UND), /* 0110 1011 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1011 0001 */ TABDECL(OP_UND), /* 0110 1011 0010 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1011 0011 */ TABDECL(OP_UND), /* 0110 1011 0100 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1011 0101 */ TABDECL(OP_UND), /* 0110 1011 0110 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1011 0111 */ TABDECL(OP_UND), /* 0110 1011 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1011 1001 */ TABDECL(OP_UND), /* 0110 1011 1010 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1011 1011 */ TABDECL(OP_UND), /* 0110 1011 1100 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1011 1101 */ TABDECL(OP_UND), /* 0110 1011 1110 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND), // OP_LDR_P_LSL_IMM_OFF_POSTIND /* 0110 1011 1111 */ TABDECL(OP_UND), /* 0110 1100 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND), // OP_STRB_P_LSL_IMM_OFF_POSTIND /* 0110 1100 0001 */ TABDECL(OP_UND), /* 0110 1100 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND), // OP_STRB_P_LSR_IMM_OFF_POSTIND /* 0110 1100 0011 */ TABDECL(OP_UND), /* 0110 1100 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND), // OP_STRB_P_ASR_IMM_OFF_POSTIND /* 0110 1100 0101 */ TABDECL(OP_UND), /* 0110 1100 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND), // OP_STRB_P_ROR_IMM_OFF_POSTIND /* 0110 1100 0111 */ TABDECL(OP_UND), /* 0110 1100 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND), // OP_STRB_P_LSL_IMM_OFF_POSTIND /* 0110 1100 1001 */ TABDECL(OP_UND), /* 0110 1100 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND), // OP_STRB_P_LSR_IMM_OFF_POSTIND /* 0110 1100 1011 */ TABDECL(OP_UND), /* 0110 1100 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND), // OP_STRB_P_ASR_IMM_OFF_POSTIND /* 0110 1100 1101 */ TABDECL(OP_UND), /* 0110 1100 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND), // OP_STRB_P_ROR_IMM_OFF_POSTIND /* 0110 1100 1111 */ TABDECL(OP_UND), /* 0110 1101 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND), // OP_LDRB_P_LSL_IMM_OFF_POSTIND /* 0110 1101 0001 */ TABDECL(OP_UND), /* 0110 1101 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND), // OP_LDRB_P_LSR_IMM_OFF_POSTIND /* 0110 1101 0011 */ TABDECL(OP_UND), /* 0110 1101 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND), // OP_LDRB_P_ASR_IMM_OFF_POSTIND /* 0110 1101 0101 */ TABDECL(OP_UND), /* 0110 1101 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND), // OP_LDRB_P_ROR_IMM_OFF_POSTIND /* 0110 1101 0111 */ TABDECL(OP_UND), /* 0110 1101 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND), // OP_LDRB_P_LSL_IMM_OFF_POSTIND /* 0110 1101 1001 */ TABDECL(OP_UND), /* 0110 1101 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND), // OP_LDRB_P_LSR_IMM_OFF_POSTIND /* 0110 1101 1011 */ TABDECL(OP_UND), /* 0110 1101 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND), // OP_LDRB_P_ASR_IMM_OFF_POSTIND /* 0110 1101 1101 */ TABDECL(OP_UND), /* 0110 1101 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND), // OP_LDRB_P_ROR_IMM_OFF_POSTIND /* 0110 1101 1111 */ TABDECL(OP_UND), /* 0110 1110 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND), // OP_STRB_P_LSL_IMM_OFF_POSTIND /* 0110 1110 0001 */ TABDECL(OP_UND), /* 0110 1110 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND), // OP_STRB_P_LSR_IMM_OFF_POSTIND /* 0110 1110 0011 */ TABDECL(OP_UND), /* 0110 1110 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND), // OP_STRB_P_ASR_IMM_OFF_POSTIND /* 0110 1110 0101 */ TABDECL(OP_UND), /* 0110 1110 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND), // OP_STRB_P_ROR_IMM_OFF_POSTIND /* 0110 1110 0111 */ TABDECL(OP_UND), /* 0110 1110 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND), // OP_STRB_P_LSL_IMM_OFF_POSTIND /* 0110 1110 1001 */ TABDECL(OP_UND), /* 0110 1110 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND), // OP_STRB_P_LSR_IMM_OFF_POSTIND /* 0110 1110 1011 */ TABDECL(OP_UND), /* 0110 1110 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND), // OP_STRB_P_ASR_IMM_OFF_POSTIND /* 0110 1110 1101 */ TABDECL(OP_UND), /* 0110 1110 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND), // OP_STRB_P_ROR_IMM_OFF_POSTIND /* 0110 1110 1111 */ TABDECL(OP_UND), /* 0110 1111 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND), // OP_LDRB_P_LSL_IMM_OFF_POSTIND /* 0110 1111 0001 */ TABDECL(OP_UND), /* 0110 1111 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND), // OP_LDRB_P_LSR_IMM_OFF_POSTIND /* 0110 1111 0011 */ TABDECL(OP_UND), /* 0110 1111 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND), // OP_LDRB_P_ASR_IMM_OFF_POSTIND /* 0110 1111 0101 */ TABDECL(OP_UND), /* 0110 1111 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND), // OP_LDRB_P_ROR_IMM_OFF_POSTIND /* 0110 1111 0111 */ TABDECL(OP_UND), /* 0110 1111 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND), // OP_LDRB_P_LSL_IMM_OFF_POSTIND /* 0110 1111 1001 */ TABDECL(OP_UND), /* 0110 1111 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND), // OP_LDRB_P_LSR_IMM_OFF_POSTIND /* 0110 1111 1011 */ TABDECL(OP_UND), /* 0110 1111 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND), // OP_LDRB_P_ASR_IMM_OFF_POSTIND /* 0110 1111 1101 */ TABDECL(OP_UND), /* 0110 1111 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND), // OP_LDRB_P_ROR_IMM_OFF_POSTIND /* 0110 1111 1111 */ TABDECL(OP_UND), /* 0111 0000 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF), // OP_STR_M_LSL_IMM_OFF /* 0111 0000 0001 */ TABDECL(OP_UND), /* 0111 0000 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF), // OP_STR_M_LSR_IMM_OFF /* 0111 0000 0011 */ TABDECL(OP_UND), /* 0111 0000 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF), // OP_STR_M_ASR_IMM_OFF /* 0111 0000 0101 */ TABDECL(OP_UND), /* 0111 0000 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF), // OP_STR_M_ROR_IMM_OFF /* 0111 0000 0111 */ TABDECL(OP_UND), /* 0111 0000 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF), // OP_STR_M_LSL_IMM_OFF /* 0111 0000 1001 */ TABDECL(OP_UND), /* 0111 0000 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF), // OP_STR_M_LSR_IMM_OFF /* 0111 0000 1011 */ TABDECL(OP_UND), /* 0111 0000 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF), // OP_STR_M_ASR_IMM_OFF /* 0111 0000 1101 */ TABDECL(OP_UND), /* 0111 0000 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF), // OP_STR_M_ROR_IMM_OFF /* 0111 0000 1111 */ TABDECL(OP_UND), /* 0111 0001 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF), // OP_LDR_M_LSL_IMM_OFF /* 0111 0001 0001 */ TABDECL(OP_UND), /* 0111 0001 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF), // OP_LDR_M_LSR_IMM_OFF /* 0111 0001 0011 */ TABDECL(OP_UND), /* 0111 0001 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF), // OP_LDR_M_ASR_IMM_OFF /* 0111 0001 0101 */ TABDECL(OP_UND), /* 0111 0001 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF), // OP_LDR_M_ROR_IMM_OFF /* 0111 0001 0111 */ TABDECL(OP_UND), /* 0111 0001 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF), // OP_LDR_M_LSL_IMM_OFF /* 0111 0001 1001 */ TABDECL(OP_UND), /* 0111 0001 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF), // OP_LDR_M_LSR_IMM_OFF /* 0111 0001 1011 */ TABDECL(OP_UND), /* 0111 0001 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF), // OP_LDR_M_ASR_IMM_OFF /* 0111 0001 1101 */ TABDECL(OP_UND), /* 0111 0001 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF), // OP_LDR_M_ROR_IMM_OFF /* 0111 0001 1111 */ TABDECL(OP_UND), /* 0111 0010 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_PREIND), // OP_STR_M_LSL_IMM_OFF_PREIND /* 0111 0010 0001 */ TABDECL(OP_UND), /* 0111 0010 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_PREIND), // OP_STR_M_LSR_IMM_OFF_PREIND /* 0111 0010 0011 */ TABDECL(OP_UND), /* 0111 0010 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_PREIND), // OP_STR_M_ASR_IMM_OFF_PREIND /* 0111 0010 0101 */ TABDECL(OP_UND), /* 0111 0010 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_PREIND), // OP_STR_M_ROR_IMM_OFF_PREIND /* 0111 0010 0111 */ TABDECL(OP_UND), /* 0111 0010 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_PREIND), // OP_STR_M_LSL_IMM_OFF_PREIND /* 0111 0010 1001 */ TABDECL(OP_UND), /* 0111 0010 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_PREIND), // OP_STR_M_LSR_IMM_OFF_PREIND /* 0111 0010 1011 */ TABDECL(OP_UND), /* 0111 0010 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_PREIND), // OP_STR_M_ASR_IMM_OFF_PREIND /* 0111 0010 1101 */ TABDECL(OP_UND), /* 0111 0010 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_PREIND), // OP_STR_M_ROR_IMM_OFF_PREIND /* 0111 0010 1111 */ TABDECL(OP_UND), /* 0111 0011 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_PREIND), // OP_LDR_M_LSL_IMM_OFF_PREIND /* 0111 0011 0001 */ TABDECL(OP_UND), /* 0111 0011 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_PREIND), // OP_LDR_M_LSR_IMM_OFF_PREIND /* 0111 0011 0011 */ TABDECL(OP_UND), /* 0111 0011 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_PREIND), // OP_LDR_M_ASR_IMM_OFF_PREIND /* 0111 0011 0101 */ TABDECL(OP_UND), /* 0111 0011 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_PREIND), // OP_LDR_M_ROR_IMM_OFF_PREIND /* 0111 0011 0111 */ TABDECL(OP_UND), /* 0111 0011 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_PREIND), // OP_LDR_M_LSL_IMM_OFF_PREIND /* 0111 0011 1001 */ TABDECL(OP_UND), /* 0111 0011 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_PREIND), // OP_LDR_M_LSR_IMM_OFF_PREIND /* 0111 0011 1011 */ TABDECL(OP_UND), /* 0111 0011 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_PREIND), // OP_LDR_M_ASR_IMM_OFF_PREIND /* 0111 0011 1101 */ TABDECL(OP_UND), /* 0111 0011 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_PREIND), // OP_LDR_M_ROR_IMM_OFF_PREIND /* 0111 0011 1111 */ TABDECL(OP_UND), /* 0111 0100 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF), // OP_STRB_M_LSL_IMM_OFF /* 0111 0100 0001 */ TABDECL(OP_UND), /* 0111 0100 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF), // OP_STRB_M_LSR_IMM_OFF /* 0111 0100 0011 */ TABDECL(OP_UND), /* 0111 0100 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF), // OP_STRB_M_ASR_IMM_OFF /* 0111 0100 0101 */ TABDECL(OP_UND), /* 0111 0100 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF), // OP_STRB_M_ROR_IMM_OFF /* 0111 0100 0111 */ TABDECL(OP_UND), /* 0111 0100 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF), // OP_STRB_M_LSL_IMM_OFF /* 0111 0100 1001 */ TABDECL(OP_UND), /* 0111 0100 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF), // OP_STRB_M_LSR_IMM_OFF /* 0111 0100 1011 */ TABDECL(OP_UND), /* 0111 0100 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF), // OP_STRB_M_ASR_IMM_OFF /* 0111 0100 1101 */ TABDECL(OP_UND), /* 0111 0100 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF), // OP_STRB_M_ROR_IMM_OFF /* 0111 0100 1111 */ TABDECL(OP_UND), /* 0111 0101 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF), // OP_LDRB_M_LSL_IMM_OFF /* 0111 0101 0001 */ TABDECL(OP_UND), /* 0111 0101 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF), // OP_LDRB_M_LSR_IMM_OFF /* 0111 0101 0011 */ TABDECL(OP_UND), /* 0111 0101 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF), // OP_LDRB_M_ASR_IMM_OFF /* 0111 0101 0101 */ TABDECL(OP_UND), /* 0111 0101 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF), // OP_LDRB_M_ROR_IMM_OFF /* 0111 0101 0111 */ TABDECL(OP_UND), /* 0111 0101 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF), // OP_LDRB_M_LSL_IMM_OFF /* 0111 0101 1001 */ TABDECL(OP_UND), /* 0111 0101 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF), // OP_LDRB_M_LSR_IMM_OFF /* 0111 0101 1011 */ TABDECL(OP_UND), /* 0111 0101 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF), // OP_LDRB_M_ASR_IMM_OFF /* 0111 0101 1101 */ TABDECL(OP_UND), /* 0111 0101 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF), // OP_LDRB_M_ROR_IMM_OFF /* 0111 0101 1111 */ TABDECL(OP_UND), /* 0111 0110 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_PREIND), // OP_STRB_M_LSL_IMM_OFF_PREIND /* 0111 0110 0001 */ TABDECL(OP_UND), /* 0111 0110 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_PREIND), // OP_STRB_M_LSR_IMM_OFF_PREIND /* 0111 0110 0011 */ TABDECL(OP_UND), /* 0111 0110 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_PREIND), // OP_STRB_M_ASR_IMM_OFF_PREIND /* 0111 0110 0101 */ TABDECL(OP_UND), /* 0111 0110 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_PREIND), // OP_STRB_M_ROR_IMM_OFF_PREIND /* 0111 0110 0111 */ TABDECL(OP_UND), /* 0111 0110 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_PREIND), // OP_STRB_M_LSL_IMM_OFF_PREIND /* 0111 0110 1001 */ TABDECL(OP_UND), /* 0111 0110 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_PREIND), // OP_STRB_M_LSR_IMM_OFF_PREIND /* 0111 0110 1011 */ TABDECL(OP_UND), /* 0111 0110 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_PREIND), // OP_STRB_M_ASR_IMM_OFF_PREIND /* 0111 0110 1101 */ TABDECL(OP_UND), /* 0111 0110 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_PREIND), // OP_STRB_M_ROR_IMM_OFF_PREIND /* 0111 0110 1111 */ TABDECL(OP_UND), /* 0111 0111 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_PREIND), // OP_LDRB_M_LSL_IMM_OFF_PREIND /* 0111 0111 0001 */ TABDECL(OP_UND), /* 0111 0111 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_PREIND), // OP_LDRB_M_LSR_IMM_OFF_PREIND /* 0111 0111 0011 */ TABDECL(OP_UND), /* 0111 0111 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_PREIND), // OP_LDRB_M_ASR_IMM_OFF_PREIND /* 0111 0111 0101 */ TABDECL(OP_UND), /* 0111 0111 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_PREIND), // OP_LDRB_M_ROR_IMM_OFF_PREIND /* 0111 0111 0111 */ TABDECL(OP_UND), /* 0111 0111 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_PREIND), // OP_LDRB_M_LSL_IMM_OFF_PREIND /* 0111 0111 1001 */ TABDECL(OP_UND), /* 0111 0111 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_PREIND), // OP_LDRB_M_LSR_IMM_OFF_PREIND /* 0111 0111 1011 */ TABDECL(OP_UND), /* 0111 0111 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_PREIND), // OP_LDRB_M_ASR_IMM_OFF_PREIND /* 0111 0111 1101 */ TABDECL(OP_UND), /* 0111 0111 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_PREIND), // OP_LDRB_M_ROR_IMM_OFF_PREIND /* 0111 0111 1111 */ TABDECL(OP_UND), /* 0111 1000 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF), // OP_STR_P_LSL_IMM_OFF /* 0111 1000 0001 */ TABDECL(OP_UND), /* 0111 1000 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF), // OP_STR_P_LSR_IMM_OFF /* 0111 1000 0011 */ TABDECL(OP_UND), /* 0111 1000 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF), // OP_STR_P_ASR_IMM_OFF /* 0111 1000 0101 */ TABDECL(OP_UND), /* 0111 1000 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF), // OP_STR_P_ROR_IMM_OFF /* 0111 1000 0111 */ TABDECL(OP_UND), /* 0111 1000 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF), // OP_STR_P_LSL_IMM_OFF /* 0111 1000 1001 */ TABDECL(OP_UND), /* 0111 1000 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF), // OP_STR_P_LSR_IMM_OFF /* 0111 1000 1011 */ TABDECL(OP_UND), /* 0111 1000 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF), // OP_STR_P_ASR_IMM_OFF /* 0111 1000 1101 */ TABDECL(OP_UND), /* 0111 1000 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF), // OP_STR_P_ROR_IMM_OFF /* 0111 1000 1111 */ TABDECL(OP_UND), /* 0111 1001 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF), // OP_LDR_P_LSL_IMM_OFF /* 0111 1001 0001 */ TABDECL(OP_UND), /* 0111 1001 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF), // OP_LDR_P_LSR_IMM_OFF /* 0111 1001 0011 */ TABDECL(OP_UND), /* 0111 1001 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF), // OP_LDR_P_ASR_IMM_OFF /* 0111 1001 0101 */ TABDECL(OP_UND), /* 0111 1001 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF), // OP_LDR_P_ROR_IMM_OFF /* 0111 1001 0111 */ TABDECL(OP_UND), /* 0111 1001 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF), // OP_LDR_P_LSL_IMM_OFF /* 0111 1001 1001 */ TABDECL(OP_UND), /* 0111 1001 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF), // OP_LDR_P_LSR_IMM_OFF /* 0111 1001 1011 */ TABDECL(OP_UND), /* 0111 1001 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF), // OP_LDR_P_ASR_IMM_OFF /* 0111 1001 1101 */ TABDECL(OP_UND), /* 0111 1001 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF), // OP_LDR_P_ROR_IMM_OFF /* 0111 1001 1111 */ TABDECL(OP_UND), /* 0111 1010 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_PREIND), // OP_STR_P_LSL_IMM_OFF_PREIND /* 0111 1010 0001 */ TABDECL(OP_UND), /* 0111 1010 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_PREIND), // OP_STR_P_LSR_IMM_OFF_PREIND /* 0111 1010 0011 */ TABDECL(OP_UND), /* 0111 1010 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_PREIND), // OP_STR_P_ASR_IMM_OFF_PREIND /* 0111 1010 0101 */ TABDECL(OP_UND), /* 0111 1010 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_PREIND), // OP_STR_P_ROR_IMM_OFF_PREIND /* 0111 1010 0111 */ TABDECL(OP_UND), /* 0111 1010 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_PREIND), // OP_STR_P_LSL_IMM_OFF_PREIND /* 0111 1010 1001 */ TABDECL(OP_UND), /* 0111 1010 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_PREIND), // OP_STR_P_LSR_IMM_OFF_PREIND /* 0111 1010 1011 */ TABDECL(OP_UND), /* 0111 1010 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_PREIND), // OP_STR_P_ASR_IMM_OFF_PREIND /* 0111 1010 1101 */ TABDECL(OP_UND), /* 0111 1010 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_PREIND), // OP_STR_P_ROR_IMM_OFF_PREIND /* 0111 1010 1111 */ TABDECL(OP_UND), /* 0111 1011 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_PREIND), // OP_LDR_P_LSL_IMM_OFF_PREIND /* 0111 1011 0001 */ TABDECL(OP_UND), /* 0111 1011 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_PREIND), // OP_LDR_P_LSR_IMM_OFF_PREIND /* 0111 1011 0011 */ TABDECL(OP_UND), /* 0111 1011 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_PREIND), // OP_LDR_P_ASR_IMM_OFF_PREIND /* 0111 1011 0101 */ TABDECL(OP_UND), /* 0111 1011 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_PREIND), // OP_LDR_P_ROR_IMM_OFF_PREIND /* 0111 1011 0111 */ TABDECL(OP_UND), /* 0111 1011 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_PREIND), // OP_LDR_P_LSL_IMM_OFF_PREIND /* 0111 1011 1001 */ TABDECL(OP_UND), /* 0111 1011 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_PREIND), // OP_LDR_P_LSR_IMM_OFF_PREIND /* 0111 1011 1011 */ TABDECL(OP_UND), /* 0111 1011 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_PREIND), // OP_LDR_P_ASR_IMM_OFF_PREIND /* 0111 1011 1101 */ TABDECL(OP_UND), /* 0111 1011 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_PREIND), // OP_LDR_P_ROR_IMM_OFF_PREIND /* 0111 1011 1111 */ TABDECL(OP_UND), /* 0111 1100 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF), // OP_STRB_P_LSL_IMM_OFF /* 0111 1100 0001 */ TABDECL(OP_UND), /* 0111 1100 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF), // OP_STRB_P_LSR_IMM_OFF /* 0111 1100 0011 */ TABDECL(OP_UND), /* 0111 1100 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF), // OP_STRB_P_ASR_IMM_OFF /* 0111 1100 0101 */ TABDECL(OP_UND), /* 0111 1100 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF), // OP_STRB_P_ROR_IMM_OFF /* 0111 1100 0111 */ TABDECL(OP_UND), /* 0111 1100 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF), // OP_STRB_P_LSL_IMM_OFF /* 0111 1100 1001 */ TABDECL(OP_UND), /* 0111 1100 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF), // OP_STRB_P_LSR_IMM_OFF /* 0111 1100 1011 */ TABDECL(OP_UND), /* 0111 1100 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF), // OP_STRB_P_ASR_IMM_OFF /* 0111 1100 1101 */ TABDECL(OP_UND), /* 0111 1100 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF), // OP_STRB_P_ROR_IMM_OFF /* 0111 1100 1111 */ TABDECL(OP_UND), /* 0111 1101 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF), // OP_LDRB_P_LSL_IMM_OFF /* 0111 1101 0001 */ TABDECL(OP_UND), /* 0111 1101 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF), // OP_LDRB_P_LSR_IMM_OFF /* 0111 1101 0011 */ TABDECL(OP_UND), /* 0111 1101 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF), // OP_LDRB_P_ASR_IMM_OFF /* 0111 1101 0101 */ TABDECL(OP_UND), /* 0111 1101 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF), // OP_LDRB_P_ROR_IMM_OFF /* 0111 1101 0111 */ TABDECL(OP_UND), /* 0111 1101 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF), // OP_LDRB_P_LSL_IMM_OFF /* 0111 1101 1001 */ TABDECL(OP_UND), /* 0111 1101 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF), // OP_LDRB_P_LSR_IMM_OFF /* 0111 1101 1011 */ TABDECL(OP_UND), /* 0111 1101 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF), // OP_LDRB_P_ASR_IMM_OFF /* 0111 1101 1101 */ TABDECL(OP_UND), /* 0111 1101 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF), // OP_LDRB_P_ROR_IMM_OFF /* 0111 1101 1111 */ TABDECL(OP_UND), /* 0111 1110 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_PREIND), // OP_STRB_P_LSL_IMM_OFF_PREIND /* 0111 1110 0001 */ TABDECL(OP_UND), /* 0111 1110 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_PREIND), // OP_STRB_P_LSR_IMM_OFF_PREIND /* 0111 1110 0011 */ TABDECL(OP_UND), /* 0111 1110 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_PREIND), // OP_STRB_P_ASR_IMM_OFF_PREIND /* 0111 1110 0101 */ TABDECL(OP_UND), /* 0111 1110 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_PREIND), // OP_STRB_P_ROR_IMM_OFF_PREIND /* 0111 1110 0111 */ TABDECL(OP_UND), /* 0111 1110 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_PREIND), // OP_STRB_P_LSL_IMM_OFF_PREIND /* 0111 1110 1001 */ TABDECL(OP_UND), /* 0111 1110 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_PREIND), // OP_STRB_P_LSR_IMM_OFF_PREIND /* 0111 1110 1011 */ TABDECL(OP_UND), /* 0111 1110 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_PREIND), // OP_STRB_P_ASR_IMM_OFF_PREIND /* 0111 1110 1101 */ TABDECL(OP_UND), /* 0111 1110 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_PREIND), // OP_STRB_P_ROR_IMM_OFF_PREIND /* 0111 1110 1111 */ TABDECL(OP_UND), /* 0111 1111 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_PREIND), // OP_LDRB_P_LSL_IMM_OFF_PREIND /* 0111 1111 0001 */ TABDECL(OP_UND), /* 0111 1111 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_PREIND), // OP_LDRB_P_LSR_IMM_OFF_PREIND /* 0111 1111 0011 */ TABDECL(OP_UND), /* 0111 1111 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_PREIND), // OP_LDRB_P_ASR_IMM_OFF_PREIND /* 0111 1111 0101 */ TABDECL(OP_UND), /* 0111 1111 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_PREIND), // OP_LDRB_P_ROR_IMM_OFF_PREIND /* 0111 1111 0111 */ TABDECL(OP_UND), /* 0111 1111 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_PREIND), // OP_LDRB_P_LSL_IMM_OFF_PREIND /* 0111 1111 1001 */ TABDECL(OP_UND), /* 0111 1111 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_PREIND), // OP_LDRB_P_LSR_IMM_OFF_PREIND /* 0111 1111 1011 */ TABDECL(OP_UND), /* 0111 1111 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_PREIND), // OP_LDRB_P_ASR_IMM_OFF_PREIND /* 0111 1111 1101 */ TABDECL(OP_UND), /* 0111 1111 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_PREIND), // OP_LDRB_P_ROR_IMM_OFF_PREIND /* 0111 1111 1111 */ TABDECL(OP_UND), /* 1000 0000 0000 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0001 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0010 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0011 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0100 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0101 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0110 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 0111 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1000 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1001 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1010 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1011 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1100 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1101 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1110 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0000 1111 */ TABDECL(OP_STMDA), // OP_STMDA /* 1000 0001 0000 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0001 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0010 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0011 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0100 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0101 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0110 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 0111 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1000 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1001 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1010 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1011 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1100 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1101 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1110 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0001 1111 */ TABDECL(OP_LDMDA), // OP_LDMDA /* 1000 0010 0000 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0001 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0010 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0011 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0100 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0101 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0110 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 0111 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1000 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1001 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1010 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1011 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1100 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1101 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1110 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0010 1111 */ TABDECL(OP_STMDA_W), // OP_STMDA_W /* 1000 0011 0000 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0001 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0010 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0011 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0100 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0101 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0110 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 0111 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1000 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1001 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1010 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1011 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1100 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1101 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1110 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0011 1111 */ TABDECL(OP_LDMDA_W), // OP_LDMDA_W /* 1000 0100 0000 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0001 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0010 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0011 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0100 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0101 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0110 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 0111 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1000 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1001 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1010 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1011 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1100 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1101 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1110 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0100 1111 */ TABDECL(OP_STMDA2), // OP_STMDA2 /* 1000 0101 0000 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0001 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0010 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0011 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0100 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0101 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0110 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 0111 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1000 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1001 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1010 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1011 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1100 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1101 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1110 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0101 1111 */ TABDECL(OP_LDMDA2), // OP_LDMDA2 /* 1000 0110 0000 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0001 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0010 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0011 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0100 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0101 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0110 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 0111 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1000 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1001 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1010 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1011 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1100 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1101 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1110 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0110 1111 */ TABDECL(OP_STMDA2_W), // OP_STMDA2_W /* 1000 0111 0000 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0001 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0010 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0011 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0100 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0101 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0110 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 0111 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1000 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1001 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1010 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1011 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1100 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1101 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1110 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 0111 1111 */ TABDECL(OP_LDMDA2_W), // OP_LDMDA2_W /* 1000 1000 0000 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0001 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0010 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0011 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0100 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0101 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0110 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 0111 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1000 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1001 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1010 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1011 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1100 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1101 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1110 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1000 1111 */ TABDECL(OP_STMIA), // OP_STMIA /* 1000 1001 0000 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0001 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0010 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0011 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0100 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0101 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0110 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 0111 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1000 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1001 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1010 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1011 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1100 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1101 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1110 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1001 1111 */ TABDECL(OP_LDMIA), // OP_LDMIA /* 1000 1010 0000 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0001 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0010 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0011 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0100 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0101 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0110 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 0111 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1000 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1001 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1010 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1011 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1100 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1101 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1110 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1010 1111 */ TABDECL(OP_STMIA_W), // OP_STMIA_W /* 1000 1011 0000 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0001 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0010 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0011 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0100 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0101 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0110 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 0111 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1000 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1001 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1010 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1011 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1100 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1101 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1110 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1011 1111 */ TABDECL(OP_LDMIA_W), // OP_LDMIA_W /* 1000 1100 0000 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0001 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0010 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0011 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0100 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0101 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0110 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 0111 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1000 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1001 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1010 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1011 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1100 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1101 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1110 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1100 1111 */ TABDECL(OP_STMIA2), // OP_STMIA2 /* 1000 1101 0000 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0001 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0010 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0011 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0100 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0101 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0110 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 0111 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1000 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1001 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1010 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1011 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1100 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1101 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1110 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1101 1111 */ TABDECL(OP_LDMIA2), // OP_LDMIA2 /* 1000 1110 0000 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0001 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0010 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0011 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0100 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0101 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0110 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 0111 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1000 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1001 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1010 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1011 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1100 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1101 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1110 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1110 1111 */ TABDECL(OP_STMIA2_W), // OP_STMIA2_W /* 1000 1111 0000 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0001 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0010 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0011 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0100 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0101 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0110 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 0111 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1000 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1001 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1010 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1011 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1100 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1101 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1110 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1000 1111 1111 */ TABDECL(OP_LDMIA2_W), // OP_LDMIA2_W /* 1001 0000 0000 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0001 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0010 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0011 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0100 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0101 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0110 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 0111 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1000 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1001 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1010 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1011 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1100 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1101 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1110 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0000 1111 */ TABDECL(OP_STMDB), // OP_STMDB /* 1001 0001 0000 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0001 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0010 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0011 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0100 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0101 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0110 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 0111 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1000 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1001 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1010 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1011 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1100 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1101 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1110 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0001 1111 */ TABDECL(OP_LDMDB), // OP_LDMDB /* 1001 0010 0000 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0001 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0010 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0011 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0100 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0101 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0110 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 0111 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1000 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1001 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1010 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1011 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1100 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1101 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1110 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0010 1111 */ TABDECL(OP_STMDB_W), // OP_STMDB_W /* 1001 0011 0000 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0001 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0010 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0011 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0100 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0101 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0110 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 0111 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1000 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1001 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1010 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1011 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1100 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1101 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1110 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0011 1111 */ TABDECL(OP_LDMDB_W), // OP_LDMDB_W /* 1001 0100 0000 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0001 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0010 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0011 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0100 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0101 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0110 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 0111 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1000 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1001 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1010 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1011 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1100 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1101 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1110 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0100 1111 */ TABDECL(OP_STMDB2), // OP_STMDB2 /* 1001 0101 0000 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0001 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0010 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0011 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0100 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0101 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0110 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 0111 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1000 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1001 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1010 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1011 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1100 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1101 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1110 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0101 1111 */ TABDECL(OP_LDMDB2), // OP_LDMDB2 /* 1001 0110 0000 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0001 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0010 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0011 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0100 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0101 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0110 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 0111 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1000 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1001 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1010 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1011 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1100 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1101 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1110 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0110 1111 */ TABDECL(OP_STMDB2_W), // OP_STMDB2_W /* 1001 0111 0000 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0001 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0010 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0011 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0100 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0101 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0110 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 0111 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1000 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1001 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1010 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1011 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1100 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1101 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1110 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 0111 1111 */ TABDECL(OP_LDMDB2_W), // OP_LDMDB2_W /* 1001 1000 0000 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0001 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0010 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0011 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0100 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0101 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0110 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 0111 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1000 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1001 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1010 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1011 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1100 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1101 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1110 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1000 1111 */ TABDECL(OP_STMIB), // OP_STMIB /* 1001 1001 0000 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0001 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0010 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0011 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0100 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0101 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0110 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 0111 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1000 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1001 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1010 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1011 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1100 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1101 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1110 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1001 1111 */ TABDECL(OP_LDMIB), // OP_LDMIB /* 1001 1010 0000 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0001 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0010 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0011 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0100 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0101 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0110 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 0111 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1000 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1001 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1010 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1011 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1100 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1101 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1110 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1010 1111 */ TABDECL(OP_STMIB_W), // OP_STMIB_W /* 1001 1011 0000 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0001 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0010 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0011 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0100 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0101 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0110 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 0111 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1000 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1001 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1010 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1011 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1100 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1101 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1110 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1011 1111 */ TABDECL(OP_LDMIB_W), // OP_LDMIB_W /* 1001 1100 0000 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0001 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0010 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0011 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0100 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0101 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0110 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 0111 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1000 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1001 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1010 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1011 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1100 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1101 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1110 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1100 1111 */ TABDECL(OP_STMIB2), // OP_STMIB2 /* 1001 1101 0000 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0001 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0010 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0011 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0100 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0101 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0110 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 0111 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1000 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1001 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1010 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1011 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1100 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1101 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1110 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1101 1111 */ TABDECL(OP_LDMIB2), // OP_LDMIB2 /* 1001 1110 0000 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0001 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0010 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0011 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0100 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0101 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0110 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 0111 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1000 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1001 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1010 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1011 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1100 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1101 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1110 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1110 1111 */ TABDECL(OP_STMIB2_W), // OP_STMIB2_W /* 1001 1111 0000 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0001 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0010 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0011 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0100 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0101 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0110 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 0111 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1000 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1001 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1010 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1011 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1100 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1101 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1110 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1001 1111 1111 */ TABDECL(OP_LDMIB2_W), // OP_LDMIB2_W /* 1010 0000 0000 */ TABDECL(OP_B), // OP_B /* 1010 0000 0001 */ TABDECL(OP_B), // OP_B /* 1010 0000 0010 */ TABDECL(OP_B), // OP_B /* 1010 0000 0011 */ TABDECL(OP_B), // OP_B /* 1010 0000 0100 */ TABDECL(OP_B), // OP_B /* 1010 0000 0101 */ TABDECL(OP_B), // OP_B /* 1010 0000 0110 */ TABDECL(OP_B), // OP_B /* 1010 0000 0111 */ TABDECL(OP_B), // OP_B /* 1010 0000 1000 */ TABDECL(OP_B), // OP_B /* 1010 0000 1001 */ TABDECL(OP_B), // OP_B /* 1010 0000 1010 */ TABDECL(OP_B), // OP_B /* 1010 0000 1011 */ TABDECL(OP_B), // OP_B /* 1010 0000 1100 */ TABDECL(OP_B), // OP_B /* 1010 0000 1101 */ TABDECL(OP_B), // OP_B /* 1010 0000 1110 */ TABDECL(OP_B), // OP_B /* 1010 0000 1111 */ TABDECL(OP_B), // OP_B /* 1010 0001 0000 */ TABDECL(OP_B), // OP_B /* 1010 0001 0001 */ TABDECL(OP_B), // OP_B /* 1010 0001 0010 */ TABDECL(OP_B), // OP_B /* 1010 0001 0011 */ TABDECL(OP_B), // OP_B /* 1010 0001 0100 */ TABDECL(OP_B), // OP_B /* 1010 0001 0101 */ TABDECL(OP_B), // OP_B /* 1010 0001 0110 */ TABDECL(OP_B), // OP_B /* 1010 0001 0111 */ TABDECL(OP_B), // OP_B /* 1010 0001 1000 */ TABDECL(OP_B), // OP_B /* 1010 0001 1001 */ TABDECL(OP_B), // OP_B /* 1010 0001 1010 */ TABDECL(OP_B), // OP_B /* 1010 0001 1011 */ TABDECL(OP_B), // OP_B /* 1010 0001 1100 */ TABDECL(OP_B), // OP_B /* 1010 0001 1101 */ TABDECL(OP_B), // OP_B /* 1010 0001 1110 */ TABDECL(OP_B), // OP_B /* 1010 0001 1111 */ TABDECL(OP_B), // OP_B /* 1010 0010 0000 */ TABDECL(OP_B), // OP_B /* 1010 0010 0001 */ TABDECL(OP_B), // OP_B /* 1010 0010 0010 */ TABDECL(OP_B), // OP_B /* 1010 0010 0011 */ TABDECL(OP_B), // OP_B /* 1010 0010 0100 */ TABDECL(OP_B), // OP_B /* 1010 0010 0101 */ TABDECL(OP_B), // OP_B /* 1010 0010 0110 */ TABDECL(OP_B), // OP_B /* 1010 0010 0111 */ TABDECL(OP_B), // OP_B /* 1010 0010 1000 */ TABDECL(OP_B), // OP_B /* 1010 0010 1001 */ TABDECL(OP_B), // OP_B /* 1010 0010 1010 */ TABDECL(OP_B), // OP_B /* 1010 0010 1011 */ TABDECL(OP_B), // OP_B /* 1010 0010 1100 */ TABDECL(OP_B), // OP_B /* 1010 0010 1101 */ TABDECL(OP_B), // OP_B /* 1010 0010 1110 */ TABDECL(OP_B), // OP_B /* 1010 0010 1111 */ TABDECL(OP_B), // OP_B /* 1010 0011 0000 */ TABDECL(OP_B), // OP_B /* 1010 0011 0001 */ TABDECL(OP_B), // OP_B /* 1010 0011 0010 */ TABDECL(OP_B), // OP_B /* 1010 0011 0011 */ TABDECL(OP_B), // OP_B /* 1010 0011 0100 */ TABDECL(OP_B), // OP_B /* 1010 0011 0101 */ TABDECL(OP_B), // OP_B /* 1010 0011 0110 */ TABDECL(OP_B), // OP_B /* 1010 0011 0111 */ TABDECL(OP_B), // OP_B /* 1010 0011 1000 */ TABDECL(OP_B), // OP_B /* 1010 0011 1001 */ TABDECL(OP_B), // OP_B /* 1010 0011 1010 */ TABDECL(OP_B), // OP_B /* 1010 0011 1011 */ TABDECL(OP_B), // OP_B /* 1010 0011 1100 */ TABDECL(OP_B), // OP_B /* 1010 0011 1101 */ TABDECL(OP_B), // OP_B /* 1010 0011 1110 */ TABDECL(OP_B), // OP_B /* 1010 0011 1111 */ TABDECL(OP_B), // OP_B /* 1010 0100 0000 */ TABDECL(OP_B), // OP_B /* 1010 0100 0001 */ TABDECL(OP_B), // OP_B /* 1010 0100 0010 */ TABDECL(OP_B), // OP_B /* 1010 0100 0011 */ TABDECL(OP_B), // OP_B /* 1010 0100 0100 */ TABDECL(OP_B), // OP_B /* 1010 0100 0101 */ TABDECL(OP_B), // OP_B /* 1010 0100 0110 */ TABDECL(OP_B), // OP_B /* 1010 0100 0111 */ TABDECL(OP_B), // OP_B /* 1010 0100 1000 */ TABDECL(OP_B), // OP_B /* 1010 0100 1001 */ TABDECL(OP_B), // OP_B /* 1010 0100 1010 */ TABDECL(OP_B), // OP_B /* 1010 0100 1011 */ TABDECL(OP_B), // OP_B /* 1010 0100 1100 */ TABDECL(OP_B), // OP_B /* 1010 0100 1101 */ TABDECL(OP_B), // OP_B /* 1010 0100 1110 */ TABDECL(OP_B), // OP_B /* 1010 0100 1111 */ TABDECL(OP_B), // OP_B /* 1010 0101 0000 */ TABDECL(OP_B), // OP_B /* 1010 0101 0001 */ TABDECL(OP_B), // OP_B /* 1010 0101 0010 */ TABDECL(OP_B), // OP_B /* 1010 0101 0011 */ TABDECL(OP_B), // OP_B /* 1010 0101 0100 */ TABDECL(OP_B), // OP_B /* 1010 0101 0101 */ TABDECL(OP_B), // OP_B /* 1010 0101 0110 */ TABDECL(OP_B), // OP_B /* 1010 0101 0111 */ TABDECL(OP_B), // OP_B /* 1010 0101 1000 */ TABDECL(OP_B), // OP_B /* 1010 0101 1001 */ TABDECL(OP_B), // OP_B /* 1010 0101 1010 */ TABDECL(OP_B), // OP_B /* 1010 0101 1011 */ TABDECL(OP_B), // OP_B /* 1010 0101 1100 */ TABDECL(OP_B), // OP_B /* 1010 0101 1101 */ TABDECL(OP_B), // OP_B /* 1010 0101 1110 */ TABDECL(OP_B), // OP_B /* 1010 0101 1111 */ TABDECL(OP_B), // OP_B /* 1010 0110 0000 */ TABDECL(OP_B), // OP_B /* 1010 0110 0001 */ TABDECL(OP_B), // OP_B /* 1010 0110 0010 */ TABDECL(OP_B), // OP_B /* 1010 0110 0011 */ TABDECL(OP_B), // OP_B /* 1010 0110 0100 */ TABDECL(OP_B), // OP_B /* 1010 0110 0101 */ TABDECL(OP_B), // OP_B /* 1010 0110 0110 */ TABDECL(OP_B), // OP_B /* 1010 0110 0111 */ TABDECL(OP_B), // OP_B /* 1010 0110 1000 */ TABDECL(OP_B), // OP_B /* 1010 0110 1001 */ TABDECL(OP_B), // OP_B /* 1010 0110 1010 */ TABDECL(OP_B), // OP_B /* 1010 0110 1011 */ TABDECL(OP_B), // OP_B /* 1010 0110 1100 */ TABDECL(OP_B), // OP_B /* 1010 0110 1101 */ TABDECL(OP_B), // OP_B /* 1010 0110 1110 */ TABDECL(OP_B), // OP_B /* 1010 0110 1111 */ TABDECL(OP_B), // OP_B /* 1010 0111 0000 */ TABDECL(OP_B), // OP_B /* 1010 0111 0001 */ TABDECL(OP_B), // OP_B /* 1010 0111 0010 */ TABDECL(OP_B), // OP_B /* 1010 0111 0011 */ TABDECL(OP_B), // OP_B /* 1010 0111 0100 */ TABDECL(OP_B), // OP_B /* 1010 0111 0101 */ TABDECL(OP_B), // OP_B /* 1010 0111 0110 */ TABDECL(OP_B), // OP_B /* 1010 0111 0111 */ TABDECL(OP_B), // OP_B /* 1010 0111 1000 */ TABDECL(OP_B), // OP_B /* 1010 0111 1001 */ TABDECL(OP_B), // OP_B /* 1010 0111 1010 */ TABDECL(OP_B), // OP_B /* 1010 0111 1011 */ TABDECL(OP_B), // OP_B /* 1010 0111 1100 */ TABDECL(OP_B), // OP_B /* 1010 0111 1101 */ TABDECL(OP_B), // OP_B /* 1010 0111 1110 */ TABDECL(OP_B), // OP_B /* 1010 0111 1111 */ TABDECL(OP_B), // OP_B /* 1010 1000 0000 */ TABDECL(OP_B), // OP_B /* 1010 1000 0001 */ TABDECL(OP_B), // OP_B /* 1010 1000 0010 */ TABDECL(OP_B), // OP_B /* 1010 1000 0011 */ TABDECL(OP_B), // OP_B /* 1010 1000 0100 */ TABDECL(OP_B), // OP_B /* 1010 1000 0101 */ TABDECL(OP_B), // OP_B /* 1010 1000 0110 */ TABDECL(OP_B), // OP_B /* 1010 1000 0111 */ TABDECL(OP_B), // OP_B /* 1010 1000 1000 */ TABDECL(OP_B), // OP_B /* 1010 1000 1001 */ TABDECL(OP_B), // OP_B /* 1010 1000 1010 */ TABDECL(OP_B), // OP_B /* 1010 1000 1011 */ TABDECL(OP_B), // OP_B /* 1010 1000 1100 */ TABDECL(OP_B), // OP_B /* 1010 1000 1101 */ TABDECL(OP_B), // OP_B /* 1010 1000 1110 */ TABDECL(OP_B), // OP_B /* 1010 1000 1111 */ TABDECL(OP_B), // OP_B /* 1010 1001 0000 */ TABDECL(OP_B), // OP_B /* 1010 1001 0001 */ TABDECL(OP_B), // OP_B /* 1010 1001 0010 */ TABDECL(OP_B), // OP_B /* 1010 1001 0011 */ TABDECL(OP_B), // OP_B /* 1010 1001 0100 */ TABDECL(OP_B), // OP_B /* 1010 1001 0101 */ TABDECL(OP_B), // OP_B /* 1010 1001 0110 */ TABDECL(OP_B), // OP_B /* 1010 1001 0111 */ TABDECL(OP_B), // OP_B /* 1010 1001 1000 */ TABDECL(OP_B), // OP_B /* 1010 1001 1001 */ TABDECL(OP_B), // OP_B /* 1010 1001 1010 */ TABDECL(OP_B), // OP_B /* 1010 1001 1011 */ TABDECL(OP_B), // OP_B /* 1010 1001 1100 */ TABDECL(OP_B), // OP_B /* 1010 1001 1101 */ TABDECL(OP_B), // OP_B /* 1010 1001 1110 */ TABDECL(OP_B), // OP_B /* 1010 1001 1111 */ TABDECL(OP_B), // OP_B /* 1010 1010 0000 */ TABDECL(OP_B), // OP_B /* 1010 1010 0001 */ TABDECL(OP_B), // OP_B /* 1010 1010 0010 */ TABDECL(OP_B), // OP_B /* 1010 1010 0011 */ TABDECL(OP_B), // OP_B /* 1010 1010 0100 */ TABDECL(OP_B), // OP_B /* 1010 1010 0101 */ TABDECL(OP_B), // OP_B /* 1010 1010 0110 */ TABDECL(OP_B), // OP_B /* 1010 1010 0111 */ TABDECL(OP_B), // OP_B /* 1010 1010 1000 */ TABDECL(OP_B), // OP_B /* 1010 1010 1001 */ TABDECL(OP_B), // OP_B /* 1010 1010 1010 */ TABDECL(OP_B), // OP_B /* 1010 1010 1011 */ TABDECL(OP_B), // OP_B /* 1010 1010 1100 */ TABDECL(OP_B), // OP_B /* 1010 1010 1101 */ TABDECL(OP_B), // OP_B /* 1010 1010 1110 */ TABDECL(OP_B), // OP_B /* 1010 1010 1111 */ TABDECL(OP_B), // OP_B /* 1010 1011 0000 */ TABDECL(OP_B), // OP_B /* 1010 1011 0001 */ TABDECL(OP_B), // OP_B /* 1010 1011 0010 */ TABDECL(OP_B), // OP_B /* 1010 1011 0011 */ TABDECL(OP_B), // OP_B /* 1010 1011 0100 */ TABDECL(OP_B), // OP_B /* 1010 1011 0101 */ TABDECL(OP_B), // OP_B /* 1010 1011 0110 */ TABDECL(OP_B), // OP_B /* 1010 1011 0111 */ TABDECL(OP_B), // OP_B /* 1010 1011 1000 */ TABDECL(OP_B), // OP_B /* 1010 1011 1001 */ TABDECL(OP_B), // OP_B /* 1010 1011 1010 */ TABDECL(OP_B), // OP_B /* 1010 1011 1011 */ TABDECL(OP_B), // OP_B /* 1010 1011 1100 */ TABDECL(OP_B), // OP_B /* 1010 1011 1101 */ TABDECL(OP_B), // OP_B /* 1010 1011 1110 */ TABDECL(OP_B), // OP_B /* 1010 1011 1111 */ TABDECL(OP_B), // OP_B /* 1010 1100 0000 */ TABDECL(OP_B), // OP_B /* 1010 1100 0001 */ TABDECL(OP_B), // OP_B /* 1010 1100 0010 */ TABDECL(OP_B), // OP_B /* 1010 1100 0011 */ TABDECL(OP_B), // OP_B /* 1010 1100 0100 */ TABDECL(OP_B), // OP_B /* 1010 1100 0101 */ TABDECL(OP_B), // OP_B /* 1010 1100 0110 */ TABDECL(OP_B), // OP_B /* 1010 1100 0111 */ TABDECL(OP_B), // OP_B /* 1010 1100 1000 */ TABDECL(OP_B), // OP_B /* 1010 1100 1001 */ TABDECL(OP_B), // OP_B /* 1010 1100 1010 */ TABDECL(OP_B), // OP_B /* 1010 1100 1011 */ TABDECL(OP_B), // OP_B /* 1010 1100 1100 */ TABDECL(OP_B), // OP_B /* 1010 1100 1101 */ TABDECL(OP_B), // OP_B /* 1010 1100 1110 */ TABDECL(OP_B), // OP_B /* 1010 1100 1111 */ TABDECL(OP_B), // OP_B /* 1010 1101 0000 */ TABDECL(OP_B), // OP_B /* 1010 1101 0001 */ TABDECL(OP_B), // OP_B /* 1010 1101 0010 */ TABDECL(OP_B), // OP_B /* 1010 1101 0011 */ TABDECL(OP_B), // OP_B /* 1010 1101 0100 */ TABDECL(OP_B), // OP_B /* 1010 1101 0101 */ TABDECL(OP_B), // OP_B /* 1010 1101 0110 */ TABDECL(OP_B), // OP_B /* 1010 1101 0111 */ TABDECL(OP_B), // OP_B /* 1010 1101 1000 */ TABDECL(OP_B), // OP_B /* 1010 1101 1001 */ TABDECL(OP_B), // OP_B /* 1010 1101 1010 */ TABDECL(OP_B), // OP_B /* 1010 1101 1011 */ TABDECL(OP_B), // OP_B /* 1010 1101 1100 */ TABDECL(OP_B), // OP_B /* 1010 1101 1101 */ TABDECL(OP_B), // OP_B /* 1010 1101 1110 */ TABDECL(OP_B), // OP_B /* 1010 1101 1111 */ TABDECL(OP_B), // OP_B /* 1010 1110 0000 */ TABDECL(OP_B), // OP_B /* 1010 1110 0001 */ TABDECL(OP_B), // OP_B /* 1010 1110 0010 */ TABDECL(OP_B), // OP_B /* 1010 1110 0011 */ TABDECL(OP_B), // OP_B /* 1010 1110 0100 */ TABDECL(OP_B), // OP_B /* 1010 1110 0101 */ TABDECL(OP_B), // OP_B /* 1010 1110 0110 */ TABDECL(OP_B), // OP_B /* 1010 1110 0111 */ TABDECL(OP_B), // OP_B /* 1010 1110 1000 */ TABDECL(OP_B), // OP_B /* 1010 1110 1001 */ TABDECL(OP_B), // OP_B /* 1010 1110 1010 */ TABDECL(OP_B), // OP_B /* 1010 1110 1011 */ TABDECL(OP_B), // OP_B /* 1010 1110 1100 */ TABDECL(OP_B), // OP_B /* 1010 1110 1101 */ TABDECL(OP_B), // OP_B /* 1010 1110 1110 */ TABDECL(OP_B), // OP_B /* 1010 1110 1111 */ TABDECL(OP_B), // OP_B /* 1010 1111 0000 */ TABDECL(OP_B), // OP_B /* 1010 1111 0001 */ TABDECL(OP_B), // OP_B /* 1010 1111 0010 */ TABDECL(OP_B), // OP_B /* 1010 1111 0011 */ TABDECL(OP_B), // OP_B /* 1010 1111 0100 */ TABDECL(OP_B), // OP_B /* 1010 1111 0101 */ TABDECL(OP_B), // OP_B /* 1010 1111 0110 */ TABDECL(OP_B), // OP_B /* 1010 1111 0111 */ TABDECL(OP_B), // OP_B /* 1010 1111 1000 */ TABDECL(OP_B), // OP_B /* 1010 1111 1001 */ TABDECL(OP_B), // OP_B /* 1010 1111 1010 */ TABDECL(OP_B), // OP_B /* 1010 1111 1011 */ TABDECL(OP_B), // OP_B /* 1010 1111 1100 */ TABDECL(OP_B), // OP_B /* 1010 1111 1101 */ TABDECL(OP_B), // OP_B /* 1010 1111 1110 */ TABDECL(OP_B), // OP_B /* 1010 1111 1111 */ TABDECL(OP_B), // OP_B /* 1011 0000 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0000 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0001 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0010 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0011 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0100 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0101 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0110 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 0111 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1000 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1001 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1010 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1011 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1100 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1101 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1110 1111 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0000 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0001 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0010 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0011 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0100 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0101 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0110 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 0111 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1000 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1001 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1010 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1011 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1100 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1101 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1110 */ TABDECL(OP_BL), // OP_BL /* 1011 1111 1111 */ TABDECL(OP_BL), // OP_BL /* 1100 0000 0000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 0111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0000 1111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0001 0000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 0111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0001 1111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0010 0000 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0001 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0010 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0011 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0100 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0101 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0110 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 0111 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1000 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1001 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1010 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1011 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1100 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1101 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1110 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0010 1111 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0011 0000 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0001 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0010 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0011 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0100 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0101 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0110 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 0111 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1000 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1001 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1010 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1011 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1100 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1101 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1110 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0011 1111 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0100 0000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 0111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0100 1111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 0101 0000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 0111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0101 1111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 0110 0000 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0001 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0010 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0011 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0100 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0101 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0110 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 0111 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1000 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1001 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1010 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1011 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1100 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1101 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1110 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0110 1111 */ TABDECL(OP_STC_M_POSTIND), // OP_STC_M_POSTIND /* 1100 0111 0000 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0001 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0010 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0011 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0100 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0101 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0110 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 0111 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1000 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1001 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1010 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1011 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1100 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1101 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1110 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 0111 1111 */ TABDECL(OP_LDC_M_POSTIND), // OP_LDC_M_POSTIND /* 1100 1000 0000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 0111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1000 1111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1001 0000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 0111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1001 1111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1010 0000 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0001 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0010 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0011 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0100 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0101 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0110 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 0111 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1000 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1001 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1010 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1011 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1100 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1101 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1110 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1010 1111 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1011 0000 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0001 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0010 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0011 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0100 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0101 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0110 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 0111 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1000 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1001 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1010 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1011 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1100 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1101 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1110 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1011 1111 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1100 0000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 0111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1000 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1001 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1010 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1011 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1100 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1101 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1110 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1100 1111 */ TABDECL(OP_STC_OPTION), // OP_STC_OPTION /* 1100 1101 0000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 0111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1000 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1001 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1010 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1011 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1100 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1101 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1110 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1101 1111 */ TABDECL(OP_LDC_OPTION), // OP_LDC_OPTION /* 1100 1110 0000 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0001 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0010 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0011 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0100 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0101 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0110 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 0111 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1000 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1001 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1010 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1011 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1100 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1101 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1110 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1110 1111 */ TABDECL(OP_STC_P_POSTIND), // OP_STC_P_POSTIND /* 1100 1111 0000 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0001 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0010 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0011 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0100 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0101 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0110 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 0111 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1000 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1001 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1010 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1011 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1100 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1101 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1110 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1100 1111 1111 */ TABDECL(OP_LDC_P_POSTIND), // OP_LDC_P_POSTIND /* 1101 0000 0000 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0001 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0010 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0011 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0100 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0101 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0110 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 0111 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1000 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1001 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1010 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1011 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1100 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1101 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1110 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0000 1111 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0001 0000 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0001 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0010 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0011 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0100 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0101 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0110 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 0111 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1000 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1001 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1010 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1011 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1100 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1101 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1110 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0001 1111 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0010 0000 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0001 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0010 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0011 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0100 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0101 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0110 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 0111 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1000 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1001 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1010 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1011 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1100 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1101 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1110 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0010 1111 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0011 0000 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0001 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0010 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0011 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0100 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0101 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0110 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 0111 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1000 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1001 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1010 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1011 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1100 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1101 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1110 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0011 1111 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0100 0000 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0001 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0010 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0011 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0100 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0101 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0110 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 0111 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1000 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1001 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1010 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1011 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1100 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1101 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1110 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0100 1111 */ TABDECL(OP_STC_M_IMM_OFF), // OP_STC_M_IMM_OFF /* 1101 0101 0000 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0001 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0010 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0011 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0100 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0101 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0110 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 0111 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1000 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1001 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1010 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1011 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1100 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1101 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1110 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0101 1111 */ TABDECL(OP_LDC_M_IMM_OFF), // OP_LDC_M_IMM_OFF /* 1101 0110 0000 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0001 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0010 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0011 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0100 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0101 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0110 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 0111 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1000 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1001 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1010 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1011 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1100 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1101 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1110 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0110 1111 */ TABDECL(OP_STC_M_PREIND), // OP_STC_M_PREIND /* 1101 0111 0000 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0001 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0010 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0011 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0100 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0101 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0110 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 0111 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1000 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1001 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1010 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1011 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1100 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1101 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1110 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 0111 1111 */ TABDECL(OP_LDC_M_PREIND), // OP_LDC_M_PREIND /* 1101 1000 0000 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0001 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0010 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0011 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0100 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0101 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0110 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 0111 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1000 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1001 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1010 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1011 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1100 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1101 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1110 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1000 1111 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1001 0000 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0001 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0010 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0011 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0100 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0101 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0110 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 0111 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1000 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1001 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1010 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1011 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1100 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1101 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1110 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1001 1111 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1010 0000 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0001 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0010 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0011 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0100 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0101 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0110 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 0111 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1000 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1001 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1010 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1011 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1100 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1101 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1110 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1010 1111 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1011 0000 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0001 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0010 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0011 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0100 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0101 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0110 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 0111 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1000 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1001 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1010 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1011 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1100 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1101 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1110 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1011 1111 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1100 0000 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0001 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0010 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0011 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0100 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0101 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0110 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 0111 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1000 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1001 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1010 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1011 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1100 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1101 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1110 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1100 1111 */ TABDECL(OP_STC_P_IMM_OFF), // OP_STC_P_IMM_OFF /* 1101 1101 0000 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0001 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0010 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0011 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0100 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0101 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0110 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 0111 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1000 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1001 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1010 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1011 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1100 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1101 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1110 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1101 1111 */ TABDECL(OP_LDC_P_IMM_OFF), // OP_LDC_P_IMM_OFF /* 1101 1110 0000 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0001 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0010 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0011 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0100 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0101 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0110 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 0111 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1000 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1001 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1010 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1011 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1100 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1101 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1110 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1110 1111 */ TABDECL(OP_STC_P_PREIND), // OP_STC_P_PREIND /* 1101 1111 0000 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0001 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0010 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0011 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0100 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0101 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0110 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 0111 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1000 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1001 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1010 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1011 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1100 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1101 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1110 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1101 1111 1111 */ TABDECL(OP_LDC_P_PREIND), // OP_LDC_P_PREIND /* 1110 0000 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0000 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0000 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0001 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0001 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0001 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0010 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0010 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0010 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0011 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0011 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0011 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0100 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0100 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0100 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0101 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0101 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0101 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0110 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0110 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0110 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 0111 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 0111 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 0111 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1000 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1000 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1000 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1001 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1001 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1001 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1010 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1010 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1010 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1011 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1011 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1011 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1100 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1100 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1100 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1101 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1101 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1101 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1110 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 0001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 0011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 0101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 0111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 1001 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 1011 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 1101 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1110 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1110 1111 */ TABDECL(OP_MCR), // OP_MCR /* 1110 1111 0000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 0001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 0010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 0011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 0100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 0101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 0110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 0111 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 1000 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 1001 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 1010 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 1011 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 1100 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 1101 */ TABDECL(OP_MRC), // OP_MRC /* 1110 1111 1110 */ TABDECL(OP_CDP), // OP_CDP /* 1110 1111 1111 */ TABDECL(OP_MRC), // OP_MRC /* 1111 0000 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0000 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0001 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0010 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0011 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0100 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0101 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0110 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 0111 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1000 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1001 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1010 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1011 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1100 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1101 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1110 1111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 0111 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1000 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1001 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1010 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1011 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1100 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1101 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1110 */ TABDECL(OP_SWI), // OP_SWI /* 1111 1111 1111 */ TABDECL(OP_SWI), // OP_SWI desmume-0.9.9/src/gtk/0000755000175000017500000000000012140305320015264 5ustar guillaumeguillaumedesmume-0.9.9/src/gtk/doc/0000755000175000017500000000000012140305320016031 5ustar guillaumeguillaumedesmume-0.9.9/src/gtk/doc/Makefile.am0000644000175000017500000000003212140260632020066 0ustar guillaumeguillaumedist_man_MANS = desmume.1 desmume-0.9.9/src/gtk/doc/desmume.10000644000175000017500000000646212140260632017570 0ustar guillaumeguillaume.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH DESMUME 1 "June 26, 2007" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME desmume \- Nintendo DS emulator .SH SYNOPSIS .B desmume .RI [ options ] " files" ... .SH DESCRIPTION This manual page documents briefly the .B desmume program .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBdesmume\fP is a Nintendo DS emulator running homebrew demos and commercial games. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-\-load-slot=NUM Loads savegame from slot NUM .TP .B \-\-opengl-2d Enables using OpenGL for screen rendering .TP .B \-\-soft-convert Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. .TP .B \-\-3d-engine=ENGINE Select available 3d emulation: .RS 0 = 3d disabled .RE .RS 1 = internal desmume software rasterizer (default) .RE .RS 2 = osmesa or gtkglext opengl (if available, depending on compilation options, see desmume \-\-help) .RE .TP .B \-\-disable-sound Disables the sound emulation .TP .B \-\-disable-limiter Disables the 60 fps limiter .TP .B \-\-arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port .TP .B \-\-arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port .TP .B \-\-save-type=TYPE Select savetype from the following: .RS 0 = Autodetect .RE .RS 1 = EEPROM 4kbit .RE .RS 2 = EEPROM 64kbit .RE .RS 3 = EEPROM 512kbit .RE .RS 4 = FRAM 256kbit .RE .RS 5 = FLASH 2mbit .RE .RS 6 = FLASH 4mbit .RE .TP .B \-\-fwlang=LANG Set the language in the firmware, LANG as follows: .RS 0 = Japanese .RE .RS 1 = English .RE .RS 2 = French .RE .RS 3 = German .RE .RS 4 = Italian .RE .RS 5 = Spanish .RE .TP .B \-\-cflash=PATH_TO_DISK_IMAGE Enable disk image GBAMP compact flash emulation .TP .B \-h, \-\-help Show summary of options. .TP .B \-v, \-\-version Show version of program. .SH INPUT Mouse cursor acts as stylus, mouse click replaces stylus touch. .PP Keyboard can be configured and by default works as follows: .RS F1-F10 load savegame from slot 1-10 .RE .RS Shift+F1-F10 save game to slot 1-10 .RE .RS Non-keypad arrows act as d-pad .RE .RS z = A .RE .RS x = B .RE .RS a = Y .RE .RS s = X .RE .RS q = L .RE .RS w = R .RE .RS Enter = START .RE .RS Left Shift = SELECT .RE .PP Desmume accepts joystick events, which can be configured by user. .SH AUTHOR desmume was written by DeSmuME team (http://sourceforge.net/projects/desmume). .PP This manual page was written by Reinhard Tartler and modified by Pascal Giard , for the Debian project (but may be used by others). desmume-0.9.9/src/gtk/doc/Makefile.in0000644000175000017500000003717512140304540020116 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/gtk/doc DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(dist_man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = desmume.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gtk/doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gtk/doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/gtk/desmume.cpp0000644000175000017500000000431212140260633017436 0ustar guillaumeguillaume/* desmume.c - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "types.h" #include "NDSSystem.h" #include "SPU.h" #include "sndsdl.h" #include "ctrlssdl.h" #include "desmume.h" #include "movie.h" volatile bool execute = false; BOOL click = FALSE; void desmume_init( struct armcpu_memory_iface *arm9_mem_if, struct armcpu_ctrl_iface **arm9_ctrl_iface, struct armcpu_memory_iface *arm7_mem_if, struct armcpu_ctrl_iface **arm7_ctrl_iface, int disable_sound) { #ifdef GDB_STUB NDS_Init( arm9_mem_if, arm9_ctrl_iface, arm7_mem_if, arm7_ctrl_iface); #else NDS_Init(); #endif if ( !disable_sound) { SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); } execute = false; } void desmume_free( void) { execute = false; NDS_DeInit(); } void desmume_pause( void) { execute = false; SPU_Pause(1); } void desmume_resume( void) { execute = true; SPU_Pause(0); } void desmume_toggle( void) { execute ^= true; } bool desmume_running( void) { return execute; } void desmume_cycle( void) { u16 keypad; /* Joystick events */ /* Retrieve old value: can use joysticks w/ another device (from our side) */ keypad = get_keypad(); /* Look for queued events */ process_joystick_events( &keypad); /* Update keypad value */ update_keypad(keypad); FCEUMOV_AddInputState(); NDS_exec(); SPU_Emulate_user(); } desmume-0.9.9/src/gtk/cheatsGTK.cpp0000644000175000017500000003273212140260633017623 0ustar guillaumeguillaume/* cheats.cpp - this file is part of DeSmuME * * Copyright (C) 2006-2009 DeSmuME Team * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "cheatsGTK.h" #include "cheatSystem.h" #include "main.h" #include "desmume.h" #undef GPOINTER_TO_INT #define GPOINTER_TO_INT(p) ((gint) (glong) (p)) enum { COLUMN_ENABLED, COLUMN_SIZE, COLUMN_HI, COLUMN_LO, COLUMN_DESC, NUM_COL }; enum { COLUMN_SIZE_TEXT, NUM_SIZE_COLUMNS }; enum { TYPE_TOGGLE, TYPE_COMBO, TYPE_STRING }; static struct { const gchar *caption; gint type; gint column; } columnTable[]={ { "Enabled", TYPE_TOGGLE, COLUMN_ENABLED}, { "Size", TYPE_COMBO, COLUMN_SIZE}, { "Offset", TYPE_STRING, COLUMN_HI}, { "Value", TYPE_STRING, COLUMN_LO}, { "Description", TYPE_STRING, COLUMN_DESC} }; static GtkWidget *win = NULL; static BOOL shouldBeRunning = FALSE; // --------------------------------------------------------------------------------- // SEARCH // --------------------------------------------------------------------------------- static void enabled_toggled(GtkCellRendererToggle * cell, gchar * path_str, gpointer data) { GtkTreeModel *model = (GtkTreeModel *) data; GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string(path_str); gboolean enabled; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, COLUMN_ENABLED, &enabled, -1); enabled ^= 1; CHEATS_LIST cheat; u32 ii; GtkTreePath *path1; path1 = gtk_tree_model_get_path (model, &iter); ii = gtk_tree_path_get_indices (path)[0]; cheats->get(&cheat, ii); cheats->update(cheat.size, cheat.code[0][0], cheat.code[0][1], cheat.description, enabled, ii); gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_ENABLED, enabled, -1); gtk_tree_path_free(path); } static void cheat_list_modify_cheat(GtkCellRendererText * cell, const gchar * path_string, const gchar * new_text, gpointer data) { GtkTreeModel *model = (GtkTreeModel *) data; GtkTreePath *path = gtk_tree_path_new_from_string(path_string); GtkTreeIter iter; gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column")); gtk_tree_model_get_iter(model, &iter, path); { u32 ii; GtkTreePath *path1; CHEATS_LIST cheat; path1 = gtk_tree_model_get_path (model, &iter); ii = gtk_tree_path_get_indices (path)[0]; cheats->get(&cheat, ii); gtk_tree_path_free (path1); if (column == COLUMN_LO || column == COLUMN_HI || column == COLUMN_SIZE) { u32 v = atoi(new_text); switch (column) { case COLUMN_SIZE: cheats->update(v-1, cheat.code[0][0], cheat.code[0][1], cheat.description, cheat.enabled, ii); break; case COLUMN_HI: cheats->update(cheat.size, v, cheat.code[0][1], cheat.description, cheat.enabled, ii); break; case COLUMN_LO: cheats->update(cheat.size, cheat.code[0][0], v, cheat.description, cheat.enabled, ii); break; } gtk_list_store_set(GTK_LIST_STORE(model), &iter, column, atoi(new_text), -1); } else if (column == COLUMN_DESC){ cheats->update(cheat.size, cheat.code[0][0], cheat.code[0][1], g_strdup(new_text), cheat.enabled, ii); gtk_list_store_set(GTK_LIST_STORE(model), &iter, column, g_strdup(new_text), -1); } } } static void cheat_list_remove_cheat(GtkWidget * widget, gpointer data) { GtkTreeView *tree = (GtkTreeView *) data; GtkTreeSelection *selection = gtk_tree_view_get_selection (tree); GtkTreeModel *model = gtk_tree_view_get_model (tree); GtkTreeIter iter; if (gtk_tree_selection_get_selected (selection, NULL, &iter)){ u32 ii; GtkTreePath *path; path = gtk_tree_model_get_path (model, &iter); ii = gtk_tree_path_get_indices (path)[0]; gtk_list_store_remove(GTK_LIST_STORE(model), &iter); cheats->remove(ii); gtk_tree_path_free (path); } } static void cheat_list_add_cheat(GtkWidget * widget, gpointer data) { #define NEW_DESC "New cheat" GtkListStore *store = (GtkListStore *) data; GtkTreeIter iter; cheats->add(1, 0, 0, g_strdup(NEW_DESC), FALSE); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, COLUMN_ENABLED, FALSE, COLUMN_SIZE, 1, COLUMN_HI, 0, COLUMN_LO, 0, COLUMN_DESC, NEW_DESC, -1); #undef NEW_DESC } static GtkTreeModel * create_numbers_model (void) { #define N_NUMBERS 4 gint i = 0; GtkListStore *model; GtkTreeIter iter; /* create list store */ model = gtk_list_store_new (NUM_SIZE_COLUMNS, G_TYPE_STRING, G_TYPE_INT); /* add numbers */ for (i = 1; i < N_NUMBERS+1; i++) { char str[2]; str[0] = '0' + i; str[1] = '\0'; gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, COLUMN_SIZE_TEXT, str, -1); } return GTK_TREE_MODEL (model); #undef N_NUMBERS } static void cheat_list_add_columns(GtkTreeView * tree, GtkListStore * store) { GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree)); static GtkTreeModel * size_model; for (u32 ii = 0; ii < sizeof(columnTable) / sizeof(columnTable[0]); ii++) { GtkCellRenderer *renderer = NULL; GtkTreeViewColumn *column; const gchar *attrib = NULL; switch (columnTable[ii].type) { case TYPE_TOGGLE: renderer = gtk_cell_renderer_toggle_new(); g_signal_connect(renderer, "toggled", G_CALLBACK(enabled_toggled), model); attrib = "active"; break; case TYPE_STRING: renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "editable", TRUE, NULL); g_signal_connect(renderer, "edited", G_CALLBACK(cheat_list_modify_cheat), store); attrib = "text"; break; case TYPE_COMBO: renderer = gtk_cell_renderer_combo_new(); size_model = create_numbers_model(); g_object_set(renderer, "model", size_model, "text-column", COLUMN_SIZE_TEXT, "editable", TRUE, "has-entry", FALSE, NULL); g_object_unref(size_model); g_signal_connect(renderer, "edited", G_CALLBACK(cheat_list_modify_cheat), store); attrib = "text"; break; } column = gtk_tree_view_column_new_with_attributes(columnTable[ii]. caption, renderer, attrib, columnTable[ii].column, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(columnTable[ii].column)); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); } } static void cheatListEnd() { cheats->save(); if(shouldBeRunning) Launch(); } static GtkListStore *cheat_list_populate() { GtkListStore *store = gtk_list_store_new (5, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING); CHEATS_LIST cheat; u32 chsize = cheats->getSize(); for(u32 ii = 0; ii < chsize; ii++){ GtkTreeIter iter; cheats->get(&cheat, ii); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, COLUMN_ENABLED, cheat.enabled, COLUMN_SIZE, cheat.size+1, COLUMN_HI, cheat.code[0][0], COLUMN_LO, cheat.code[0][1], COLUMN_DESC, cheat.description, -1); } return store; } static GtkWidget *cheat_list_create_ui() { GtkListStore *store = cheat_list_populate(); GtkWidget *tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); GtkWidget *vbox = gtk_vbox_new(FALSE, 1); GtkWidget *hbbox = gtk_hbutton_box_new(); GtkWidget *button; gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(tree)); gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(hbbox)); gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); button = gtk_button_new_with_label("add cheat"); g_signal_connect (button, "clicked", G_CALLBACK (cheat_list_add_cheat), store); gtk_container_add(GTK_CONTAINER(hbbox),button); button = gtk_button_new_with_label("Remove cheat"); g_signal_connect (button, "clicked", G_CALLBACK (cheat_list_remove_cheat), tree); gtk_container_add(GTK_CONTAINER(hbbox),button); cheat_list_add_columns(GTK_TREE_VIEW(tree), store); /* Setup the selection handler */ GtkTreeSelection *select; select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)); gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); return tree; } void CheatList () { shouldBeRunning = desmume_running(); Pause(); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win),"Cheat List"); gtk_window_set_modal(GTK_WINDOW(win), TRUE); g_signal_connect(G_OBJECT(win), "destroy", cheatListEnd, NULL); cheat_list_create_ui(); gtk_widget_show_all(win); } // --------------------------------------------------------------------------------- // SEARCH // --------------------------------------------------------------------------------- static void cheat_search_create_ui() { GtkWidget *button; GtkWidget *vbox = gtk_vbox_new(FALSE, 1); GtkWidget *hbbox = gtk_hbutton_box_new(); GtkWidget *b; gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); { b = gtk_hbox_new(FALSE, 1); gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(b)); { GtkTreeModel * size_model; GtkWidget *w; w = gtk_label_new("size"); gtk_container_add(GTK_CONTAINER(b), w); size_model = create_numbers_model(); w = gtk_combo_box_new_with_model(size_model); g_object_unref(size_model); GtkCellRenderer * renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), renderer, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), renderer, "text", COLUMN_SIZE_TEXT, NULL); gtk_combo_box_set_active (GTK_COMBO_BOX (w), 0); gtk_container_add(GTK_CONTAINER(b), w); } b = gtk_hbox_new(FALSE, 1); gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(b)); { GtkWidget *w; w = gtk_label_new("signedness"); gtk_container_add(GTK_CONTAINER(b), w); // m = create_sign_model(); w = gtk_combo_box_new(); // w = gtk_combo_box_new_with_model(size_model); // g_object_unref(size_model); // size_model = NULL; GtkCellRenderer * renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), renderer, TRUE); // gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), renderer, // "text", COLUMN_SIZE_TEXT, // NULL); gtk_combo_box_set_active (GTK_COMBO_BOX (w), 0); gtk_container_add(GTK_CONTAINER(b), w); } } // BUTTONS: gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(hbbox)); button = gtk_button_new_with_label("add cheats"); // g_signal_connect (button, "clicked", g_callback (cheat_list_add_cheat), store); gtk_container_add(GTK_CONTAINER(hbbox),button); button = gtk_button_new_with_label("search"); // g_signal_connect (button, "clicked", g_callback (cheat_list_add_cheat), store); gtk_container_add(GTK_CONTAINER(hbbox),button); // GtkWidget *vbox = gtk_vbox_new(FALSE, 1); // gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); } static void cheatSearchEnd() { } void CheatSearch () { shouldBeRunning = desmume_running(); Pause(); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win),"Cheat Search"); gtk_window_set_modal(GTK_WINDOW(win), TRUE); g_signal_connect(G_OBJECT(win), "destroy", cheatSearchEnd, NULL); cheat_search_create_ui(); gtk_widget_show_all(win); } desmume-0.9.9/src/gtk/Makefile.am0000644000175000017500000000261512140260633017333 0ustar guillaumeguillaumeSUBDIRS = doc include $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += $(SDL_CFLAGS) $(GTK_CFLAGS) $(GTHREAD_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) Applicationsdir = $(datadir)/applications Applications_DATA = desmume.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = DeSmuME.xpm EXTRA_DIST = DeSmuME.xpm desmume.desktop bin_PROGRAMS = desmume desmume_SOURCES = \ desmume.h desmume.cpp \ dTool.h dToolsList.cpp \ tools/ioregsView.cpp tools/ioregsView.h \ ../sndsdl.cpp \ ../ctrlssdl.h ../ctrlssdl.cpp \ ../driver.h ../driver.cpp \ osmesa_3Demu.cpp osmesa_3Demu.h \ cheatsGTK.h cheatsGTK.cpp \ ../filter/hq2x.cpp ../filter/hq2x.h \ ../filter/hq4x.cpp ../filter/hq4x.h \ ../filter/2xsai.cpp ../filter/bilinear.cpp \ ../filter/epx.cpp ../filter/lq2x.cpp \ ../filter/scanline.cpp \ ../filter/videofilter.cpp ../filter/videofilter.h \ main.cpp main.h desmume_LDADD = ../libdesmume.a \ $(SDL_LIBS) $(GTK_LIBS) $(GTHREAD_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) $(LIBSOUNDTOUCH_LIBS) if HAVE_GDB_STUB desmume_LDADD += ../gdbstub/libgdbstub.a endif if HAVE_LIBOSMESA desmume_LDADD += $(OSMESA_LIBS) endif UPDATE_DESKTOP = \ appsdir=$(DESTDIR)$(datadir)/applications ; \ if [ -f $$appsdir/mimeinfo.cache ] ; then \ if test ! "x$(UPDATEDESKTOP)" = "x" ; then \ $(UPDATEDESKTOP) $$appsdir ; \ fi \ fi install-data-hook: $(UPDATE_DESKTOP) uninstall-hook: $(UPDATE_DESKTOP) desmume-0.9.9/src/gtk/desmume.h0000644000175000017500000000266512140260633017114 0ustar guillaumeguillaume/* desmume.h - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __DESMUME_H__ #define __DESMUME_H__ extern void desmume_init( struct armcpu_memory_iface *arm9_mem_if, struct armcpu_ctrl_iface **arm9_ctrl_iface, struct armcpu_memory_iface *arm7_mem_if, struct armcpu_ctrl_iface **arm7_ctrl_iface, int disable_sound); extern void desmume_free( void); extern void desmume_pause( void); extern void desmume_resume( void); extern void desmume_toggle( void); extern bool desmume_running( void); extern void desmume_cycle( void); #endif /*__DESMUME_H__*/ desmume-0.9.9/src/gtk/main.h0000644000175000017500000000014412140260633016367 0ustar guillaumeguillaume#ifndef __DESMUME_GTK_MAIN_H__ #define __DESMUME_GTK_MAIN_H__ void Pause(); void Launch(); #endif desmume-0.9.9/src/gtk/osmesa_3Demu.cpp0000644000175000017500000000260112140260633020322 0ustar guillaumeguillaume/* Copyright (C) 2009 Guillaume Duhamel This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_LIBOSMESA #include #include #include "../OGLRender.h" #include "osmesa_3Demu.h" static bool osmesa_beginOpenGL(void) { return 1; } static void osmesa_endOpenGL(void) { } static bool osmesa_init(void) { return true; } int init_osmesa_3Demu(void) { void * buffer; OSMesaContext ctx; ctx = OSMesaCreateContext(OSMESA_RGBA, NULL); buffer = malloc(256 * 192 * 4); OSMesaMakeCurrent(ctx, buffer, GL_UNSIGNED_BYTE, 256, 192); oglrender_init = osmesa_init; oglrender_beginOpenGL = osmesa_beginOpenGL; oglrender_endOpenGL = osmesa_endOpenGL; return 1; } #endif desmume-0.9.9/src/gtk/osmesa_3Demu.h0000644000175000017500000000152112140260633017767 0ustar guillaumeguillaume/* Copyright (C) 2009 Guillaume Duhamel This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_LIBOSMESA int init_osmesa_3Demu( void); #endif desmume-0.9.9/src/gtk/dToolsList.cpp0000644000175000017500000000165712140260633020110 0ustar guillaumeguillaume/* dToolsList.cpp * * Copyright (C) 2006 Thoduv * * This file is part of DeSmuME * * DeSmuME 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. * * DeSmuME 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 DeSmuME; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dTool.h" #include "tools/ioregsView.h" dTool_t *dTools_list[] = { &dTool_ioregsView }; int dTools_list_size = ARRAY_SIZE(dTools_list); desmume-0.9.9/src/gtk/DeSmuME.xpm0000644000175000017500000000263512140260633017266 0ustar guillaumeguillaume/* XPM */ static const char * DeSmuME_xpm[] = { "32 32 15 1", " c None", ". c #000000", "+ c #F6F6FB", "@ c #ECECF6", "# c #E2E2F1", "$ c #D8D8EC", "% c #CFCFE7", "& c #C5C5E2", "* c #BBBBDE", "= c #B1B1D9", "- c #A8A8D4", "; c #9E9ECF", "> c #9494CA", ", c #8A8AC5", "' c #8080C0", " .................... ", " .................... ", ".....++..+++++..+++++.. ", ".....++..++.....++..... ", "..@@@@@..@@@@@..@@@@@.. ", "..@@.@@..@@........@@.. ", "..##.##..##.##..##.##.. ", "..##.##..##.##..##.##.. ", "..$$.$$..$$.$$..$$.$$.. ", "..$$.$$..$$.$$..$$.$$.. ", "..%%.%%..%%.%%..%%.%%.. ", "..%%.%%..%%.%%..%%.%%.. ", "..&&&&&..&&&&&..&&&&&.. ", "....................... ", ".......********.**.**.. ", " ..==.==.==.==.==.. ", " ..==.==.==.==.==.. ", " ..--.--.--.--.--.. ", " ..--.--.--.--.--.. ", " ..;;.;;.;;.;;;;;.. ", " ..................... ", " ..................... ", " ..>>>>>>>>.>>>>>.. ", " ..>>.>>.>>.>>..... ", " ..,,.,,.,,.,,,,,.. ", " ..,,.,,.,,.,,..... ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.''.''.. ", " ..''.''.''.'''''.. ", " .................. ", " .................. "}; desmume-0.9.9/src/gtk/main.cpp0000644000175000017500000023640512140260633016735 0ustar guillaumeguillaume/* main.cpp - this file is part of DeSmuME * * Copyright (C) 2006-2009 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef GTK_UI #define GTK_UI #endif #include #include #include #include #include #include #include "types.h" #include "firmware.h" #include "armcpu.h" #include "NDSSystem.h" #include "sndsdl.h" #include "ctrlssdl.h" #include "MMU.h" #include "render3D.h" #include "desmume.h" #include "debug.h" #include "rasterize.h" #include "saves.h" #include "mic.h" #include "movie.h" #include "dTool.h" #include "desmume_config.h" #include "cheatsGTK.h" #include "GPU_osd.h" #include "commandline.h" #include "addons.h" #include "filter/videofilter.h" #ifdef GDB_STUB #include "gdbstub.h" #endif #ifdef HAVE_LIBOSMESA #include #include #include "OGLRender.h" #include "osmesa_3Demu.h" #endif #include "DeSmuME.xpm" #undef GPOINTER_TO_INT #define GPOINTER_TO_INT(p) ((gint) (glong) (p)) #undef GPOINTER_TO_UINT #define GPOINTER_TO_UINT(p) ((guint) (glong) (p)) #define EMULOOP_PRIO (G_PRIORITY_HIGH_IDLE + 20) #define SCREENS_PIXEL_SIZE (256*192*2) #define SCREEN_BYTES_PER_PIXEL 3 #define GAP_SIZE 50 #define FPS_LIMITER_FRAME_PERIOD 8 static SDL_sem *fps_limiter_semaphore; static int gtk_fps_limiter_disabled; extern int _scanline_filter_a, _scanline_filter_b, _scanline_filter_c, _scanline_filter_d; VideoFilter video(256, 384, VideoFilterTypeID_HQ2XS, 4); enum { MAIN_BG_0 = 0, MAIN_BG_1, MAIN_BG_2, MAIN_BG_3, MAIN_OBJ, SUB_BG_0, SUB_BG_1, SUB_BG_2, SUB_BG_3, SUB_OBJ }; gboolean EmuLoop(gpointer data); static void DoQuit(); static void RecordMovieDialog(); static void PlayMovieDialog(); static void StopMovie(); static void OpenNdsDialog(); static void SaveStateDialog(); static void LoadStateDialog(); void Launch(); void Pause(); static void Printscreen(); static void Reset(); static void Edit_Controls(); static void Edit_Joystick_Controls(); static void MenuSave(GtkMenuItem *item, gpointer slot); static void MenuLoad(GtkMenuItem *item, gpointer slot); static void About(); static void ToggleMenuVisible(GtkToggleAction *action); static void ToggleStatusbarVisible(GtkToggleAction *action); static void ToggleToolbarVisible(GtkToggleAction *action); static void ToggleFullscreen (GtkToggleAction *action); static void ToggleAudio (GtkToggleAction *action); #ifdef FAKE_MIC static void ToggleMicNoise (GtkToggleAction *action); #endif static void ToggleSwapScreens(GtkToggleAction *action); static void ToggleGap (GtkToggleAction *action); static void SetRotation(GtkAction *action, GtkRadioAction *current); static void SetOrientation(GtkAction *action, GtkRadioAction *current); static void ToggleLayerVisibility(GtkToggleAction* action, gpointer data); #ifdef DESMUME_GTK_FIRMWARE_BROKEN static void SelectFirmwareFile(); #endif static const char *ui_description = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " #ifdef GTK_DESMUME_FIRMWARE_BROKEN " " #endif " " " " " " " " " " " " " " " " " " " " " " " " " " #ifdef FAKE_MIC " " #endif " " " " " " " " #ifdef HAVE_LIBSOUNDTOUCH " " #endif " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; static const GtkActionEntry action_entries[] = { { "FileMenu", NULL, "_File" }, { "open", "gtk-open", "_Open", "o", NULL, OpenNdsDialog }, { "RecentMenu", NULL, "Open _recent" }, { "savestateto", NULL, "Save state _to ...", NULL, NULL, SaveStateDialog }, { "loadstatefrom", NULL, "Load state _from ...", NULL, NULL, LoadStateDialog }, { "recordmovie", NULL, "Record movie _to ...", NULL, NULL, RecordMovieDialog }, { "playmovie", NULL, "Play movie _from ...", NULL, NULL, PlayMovieDialog }, { "stopmovie", NULL, "Stop movie", NULL, NULL, StopMovie }, { "SavestateMenu", NULL, "_Save state" }, { "LoadstateMenu", NULL, "_Load state" }, #ifdef DESMUME_GTK_FIRMWARE_BROKEN { "loadfirmware","gtk-open", "Load Firm_ware file", "l", NULL, SelectFirmwareFile }, #endif { "printscreen","gtk-media-record", "Take a _screenshot", "s", NULL, Printscreen }, { "quit", "gtk-quit", "_Quit", "q", NULL, DoQuit }, { "EmulationMenu", NULL, "_Emulation" }, { "run", "gtk-media-play", "_Run", "r", NULL, Launch }, { "pause", "gtk-media-pause", "_Pause", "p", NULL, Pause }, { "reset", "gtk-refresh", "Re_set", NULL, NULL, Reset }, { "SPUModeMenu", NULL, "_SPU Mode" }, { "FrameskipMenu", NULL, "_Frameskip" }, { "LayersMenu", NULL, "_Layers" }, { "CheatMenu", NULL, "_Cheat" }, { "cheatsearch", NULL, "_Search", NULL, NULL, CheatSearch }, { "cheatlist", NULL, "_List", NULL, NULL, CheatList }, { "ConfigMenu", NULL, "_Config" }, { "ConfigSaveMenu", NULL, "_Saves" }, { "editctrls", NULL, "_Edit controls",NULL, NULL, Edit_Controls }, { "editjoyctrls", NULL, "Edit _Joystick controls",NULL, NULL, Edit_Joystick_Controls }, { "RotationMenu", NULL, "_Rotation" }, { "OrientationMenu", NULL, "_Orientation" }, { "PriInterpolationMenu", NULL, "Primary _Interpolation" }, { "InterpolationMenu", NULL, "Secondary _Interpolation" }, { "ViewMenu", NULL, "_View" }, { "ToolsMenu", NULL, "_Tools" }, { "HelpMenu", NULL, "_Help" }, { "about", "gtk-about", "_About", NULL, NULL, About } }; static const GtkToggleActionEntry toggle_entries[] = { { "enableaudio", NULL, "_Enable audio", NULL, NULL, G_CALLBACK(ToggleAudio), TRUE}, #ifdef FAKE_MIC { "micnoise", NULL, "Fake mic _noise", NULL, NULL, G_CALLBACK(ToggleMicNoise), FALSE}, #endif { "gap", NULL, "_Gap", NULL, NULL, G_CALLBACK(ToggleGap), FALSE}, { "view_menu", NULL, "View _menu", NULL, NULL, G_CALLBACK(ToggleMenuVisible), TRUE}, { "view_toolbar", NULL, "View _toolbar", NULL, NULL, G_CALLBACK(ToggleToolbarVisible), TRUE}, { "view_statusbar", NULL, "View _statusbar", NULL, NULL, G_CALLBACK(ToggleStatusbarVisible), TRUE}, { "orient_swapscreens", NULL, "S_wap screens", "space", NULL, G_CALLBACK(ToggleSwapScreens), FALSE}, { "fullscreen", NULL, "Fullscreen", "f", NULL, G_CALLBACK(ToggleFullscreen), FALSE}, }; static const GtkRadioActionEntry pri_interpolation_entries[] = { { "pri_interp_none", NULL, VideoFilterAttributesList[VideoFilterTypeID_None].typeString, NULL, NULL, VideoFilterTypeID_None}, { "pri_interp_nearest2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_Nearest2X].typeString, NULL, NULL, VideoFilterTypeID_Nearest2X}, { "pri_interp_lq2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_LQ2X].typeString, NULL, NULL, VideoFilterTypeID_LQ2X}, { "pri_interp_lq2xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_LQ2XS].typeString, NULL, NULL, VideoFilterTypeID_LQ2XS}, { "pri_interp_hq2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ2X].typeString, NULL, NULL, VideoFilterTypeID_HQ2X}, { "pri_interp_hq4x", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ4X].typeString, NULL, NULL, VideoFilterTypeID_HQ4X}, { "pri_interp_hq2xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ2XS].typeString, NULL, NULL, VideoFilterTypeID_HQ2XS}, { "pri_interp_2xsai", NULL, VideoFilterAttributesList[VideoFilterTypeID_2xSaI].typeString, NULL, NULL, VideoFilterTypeID_2xSaI}, { "pri_interp_super2xsai", NULL, VideoFilterAttributesList[VideoFilterTypeID_Super2xSaI].typeString, NULL, NULL, VideoFilterTypeID_Super2xSaI}, { "pri_interp_supereagle", NULL, VideoFilterAttributesList[VideoFilterTypeID_SuperEagle].typeString, NULL, NULL, VideoFilterTypeID_SuperEagle}, { "pri_interp_scanline", NULL, VideoFilterAttributesList[VideoFilterTypeID_Scanline].typeString, NULL, NULL, VideoFilterTypeID_Scanline}, { "pri_interp_bilinear", NULL, VideoFilterAttributesList[VideoFilterTypeID_Bilinear].typeString, NULL, NULL, VideoFilterTypeID_Bilinear}, { "pri_interp_epx", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPX].typeString, NULL, NULL, VideoFilterTypeID_EPX}, { "pri_interp_epxplus", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPXPlus].typeString, NULL, NULL, VideoFilterTypeID_EPXPlus}, { "pri_interp_epx_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPX1_5X].typeString, NULL, NULL, VideoFilterTypeID_EPX1_5X}, { "pri_interp_epxplus_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPXPlus1_5X].typeString, NULL, NULL, VideoFilterTypeID_EPXPlus1_5X}, { "pri_interp_nearest_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_Nearest1_5X].typeString, NULL, NULL, VideoFilterTypeID_Nearest1_5X}, { "pri_interp_nearestplus_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_NearestPlus1_5X].typeString, NULL, NULL, VideoFilterTypeID_NearestPlus1_5X}, }; static const GtkRadioActionEntry interpolation_entries[] = { { "interp_nearest", NULL, "_Nearest", NULL, NULL, GDK_INTERP_NEAREST}, { "interp_tiles", NULL, "_Tiles", NULL, NULL, GDK_INTERP_TILES}, { "interp_bilinear", NULL, "_Bilinear", NULL, NULL, GDK_INTERP_BILINEAR}, { "interp_hyper", NULL, "_Hyper", NULL, NULL, GDK_INTERP_HYPER}, }; static const GtkRadioActionEntry rotation_entries[] = { { "rotate_0", "gtk-orientation-portrait", "_0", NULL, NULL, 0 }, { "rotate_90", "gtk-orientation-landscape", "_90", NULL, NULL, 90 }, { "rotate_180", "gtk-orientation-reverse-portrait", "_180",NULL, NULL, 180 }, { "rotate_270", "gtk-orientation-reverse-landscape", "_270",NULL, NULL, 270 }, }; /* When adding modes here remember to add the relevent entry to screen_size */ enum orientation_enum { ORIENT_VERTICAL = 0, ORIENT_HORIZONTAL = 1, ORIENT_SINGLE = 2, ORIENT_N }; static const GtkRadioActionEntry orientation_entries[] = { { "orient_vertical", NULL, "_Vertical", "1", NULL, ORIENT_VERTICAL }, { "orient_horizontal", NULL, "_Horizontal", "2", NULL, ORIENT_HORIZONTAL }, { "orient_single", NULL, "_Single screen", "0", NULL, ORIENT_SINGLE }, }; struct screen_size_t { gint width; gint height; }; const struct screen_size_t screen_size[ORIENT_N] = { {256, 384}, {512, 192}, {256, 192} }; enum spumode_enum { SPUMODE_DUALASYNC = 0, SPUMODE_SYNCN = 1, SPUMODE_SYNCZ = 2, SPUMODE_SYNCP = 3 }; static const GtkRadioActionEntry spumode_entries[] = { { "SPUModeSyncN", NULL, "Synchronous (N)", NULL, NULL, SPUMODE_SYNCN}, { "SPUModeSyncZ", NULL, "Synchronous (Z)", NULL, NULL, SPUMODE_SYNCZ}, #ifdef HAVE_LIBSOUNDTOUCH { "SPUModeSyncP", NULL, "Synchronous (P)", NULL, NULL, SPUMODE_SYNCP}, #endif { "SPUModeDualASync", NULL, "Dual Asynchronous", NULL, NULL, SPUMODE_DUALASYNC} }; enum frameskip_enum { FRAMESKIP_0 = 0, FRAMESKIP_1 = 1, FRAMESKIP_2 = 2, FRAMESKIP_3 = 3, FRAMESKIP_AUTO }; static const GtkRadioActionEntry frameskip_entries[] = { { "frameskipA", NULL, "_Auto", NULL, NULL, FRAMESKIP_AUTO}, { "frameskip0", NULL, "_0", NULL, NULL, FRAMESKIP_0}, { "frameskip1", NULL, "_1", NULL, NULL, FRAMESKIP_1}, { "frameskip2", NULL, "_2", NULL, NULL, FRAMESKIP_2}, { "frameskip3", NULL, "_3", NULL, NULL, FRAMESKIP_3}, }; static const GtkRadioActionEntry savet_entries[] = { { "save_t0", NULL, "_0 Autodetect", NULL, NULL, 0}, { "save_t1", NULL, "_1 EEPROM 4kbit", NULL, NULL, 1}, { "save_t2", NULL, "_2 EEPROM 64kbit", NULL, NULL, 2}, { "save_t3", NULL, "_3 EEPROM 512kbit", NULL, NULL, 3}, { "save_t4", NULL, "_4 FRAM 256kbit", NULL, NULL, 4}, { "save_t5", NULL, "_5 FLASH 2mbit", NULL, NULL, 5}, { "save_t6", NULL, "_6 FLASH 4mbit", NULL, NULL, 6} }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDSDL, NULL }; GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize #if defined(HAVE_LIBOSMESA) , &gpu3Dgl #endif }; static const u16 gtk_kb_cfg[NB_KEYS] = { GDK_x, // A GDK_z, // B GDK_Shift_R, // select GDK_Return, // start GDK_Right, // Right GDK_Left, // Left GDK_Up, // Up GDK_Down, // Down GDK_w, // R GDK_q, // L GDK_s, // X GDK_a, // Y GDK_p, // DEBUG GDK_o // BOOST }; GKeyFile *keyfile; struct modify_key_ctx { gint mk_key_chosen; GtkWidget *label; u8 key_id; }; static u16 Cur_Keypad = 0; static u16 gdk_shift_pressed = 0; u16 Keypad_Temp[NB_KEYS]; class configured_features : public CommandLine { public: int engine_3d; int savetype; int firmware_language; int timeout; }; static void init_configured_features( class configured_features *config) { config->engine_3d = 1; config->savetype = 0; config->timeout = 0; /* use the default language */ config->firmware_language = -1; } static int fill_configured_features( class configured_features *config, int argc, char ** argv) { GOptionEntry options[] = { { "3d-engine", 0, 0, G_OPTION_ARG_INT, &config->engine_3d, "Select 3d rendering engine. Available engines:\n" "\t\t\t\t 0 = 3d disabled\n" "\t\t\t\t 1 = internal rasterizer (default)\n" #ifdef HAVE_LIBOSMESA "\t\t\t\t 2 = osmesa opengl\n" #endif ,"ENGINE"}, { "save-type", 0, 0, G_OPTION_ARG_INT, &config->savetype, "Select savetype from the following:\n" "\t\t\t\t 0 = Autodetect (default)\n" "\t\t\t\t 1 = EEPROM 4kbit\n" "\t\t\t\t 2 = EEPROM 64kbit\n" "\t\t\t\t 3 = EEPROM 512kbit\n" "\t\t\t\t 4 = FRAM 256kbit\n" "\t\t\t\t 5 = FLASH 2mbit\n" "\t\t\t\t 6 = FLASH 4mbit\n", "SAVETYPE"}, { "fwlang", 0, 0, G_OPTION_ARG_INT, &config->firmware_language, "Set the language in the firmware, LANG as follows:\n" "\t\t\t\t 0 = Japanese\n" "\t\t\t\t 1 = English\n" "\t\t\t\t 2 = French\n" "\t\t\t\t 3 = German\n" "\t\t\t\t 4 = Italian\n" "\t\t\t\t 5 = Spanish\n", "LANG"}, { "timeout", 0, 0, G_OPTION_ARG_INT, &config->timeout, "Quit desmume after the specified seconds for testing purpose.", "SECONDS"}, { NULL } }; config->loadCommonOptions(); g_option_context_add_main_entries (config->ctx, options, "options"); g_option_context_add_group (config->ctx, gtk_get_option_group (TRUE)); config->parse(argc,argv); if(!config->validate()) goto error; if (config->savetype < 0 || config->savetype > 6) { g_printerr("Accepted savetypes are from 0 to 6.\n"); return false; } if (config->firmware_language < -1 || config->firmware_language > 5) { g_printerr("Firmware language must be set to a value from 0 to 5.\n"); goto error; } if (config->engine_3d != 0 && config->engine_3d != 1 #if defined(HAVE_LIBOSMESA) && config->engine_3d != 2 #endif ) { g_printerr("Currently available ENGINES: 0, 1" #if defined(HAVE_LIBOSMESA) ", 2" #endif "\n"); goto error; } #ifdef GDB_STUB if (config->arm9_gdb_port != 0 && (config->arm9_gdb_port < 1 || config->arm9_gdb_port > 65535)) { g_printerr("ARM9 GDB stub port must be in the range 1 to 65535\n"); goto error; } if (config->arm7_gdb_port != 0 && (config->arm7_gdb_port < 1 || config->arm7_gdb_port > 65535)) { g_printerr("ARM7 GDB stub port must be in the range 1 to 65535\n"); goto error; } #endif return 1; error: config->errorHelp(argv[0]); return 0; } /* * The thread handling functions needed by the GDB stub code. */ #ifdef GDB_STUB void * createThread_gdb( void (*thread_function)( void *data), void *thread_data) { GThread *new_thread = g_thread_create( (GThreadFunc)thread_function, thread_data, TRUE, NULL); return new_thread; } void joinThread_gdb( void *thread_handle) { g_thread_join( (GThread *)thread_handle); } #endif /************************ GTK *******************************/ uint SPUMode = SPUMODE_DUALASYNC; uint Frameskip = 0; bool autoframeskip = false; GdkInterpType Interpolation = GDK_INTERP_NEAREST; static GtkWidget *pWindow; static GtkWidget *pStatusBar; static GtkWidget *pDrawingArea; static GtkActionGroup * action_group; static GtkUIManager *ui_manager; struct nds_screen_t { guint gap_size; gint rotation_angle; guint orientation; gint touch_x; gint touch_y; gint touch_width; gint touch_height; gboolean swap; }; struct nds_screen_t nds_screen; static BOOL regMainLoop = FALSE; static inline void UpdateStatusBar (const char *message) { gint pStatusBar_Ctx; pStatusBar_Ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(pStatusBar), "Global"); gtk_statusbar_pop(GTK_STATUSBAR(pStatusBar), pStatusBar_Ctx); gtk_statusbar_push(GTK_STATUSBAR(pStatusBar), pStatusBar_Ctx, message); } static void About() { GdkPixbuf * pixbuf = gdk_pixbuf_new_from_xpm_data(DeSmuME_xpm); gtk_show_about_dialog(GTK_WINDOW(pWindow), "name", "DeSmuME", "version", VERSION, "website", "http://desmume.org", "logo", pixbuf, "comments", "Nintendo DS emulator based on work by Yopyop", NULL); g_object_unref(pixbuf); } static void ToggleMenuVisible(GtkToggleAction *action) { GtkWidget *pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); if (gtk_toggle_action_get_active(action) == TRUE) gtk_widget_show(pMenuBar); else gtk_widget_hide(pMenuBar); } static void ToggleToolbarVisible(GtkToggleAction *action) { GtkWidget *pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); if (gtk_toggle_action_get_active(action) == TRUE) gtk_widget_show(pToolBar); else gtk_widget_hide(pToolBar); } static void ToggleStatusbarVisible(GtkToggleAction *action) { if (gtk_toggle_action_get_active(action) == TRUE) gtk_widget_show(pStatusBar); else gtk_widget_hide(pStatusBar); } static void ToggleFullscreen(GtkToggleAction *action) { GtkWidget *pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); GtkWidget *pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); if (gtk_toggle_action_get_active(action) == TRUE) { gtk_widget_hide(pMenuBar); gtk_widget_hide(pToolBar); gtk_widget_hide(pStatusBar); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_menu"), FALSE); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_toolbar"), FALSE); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_statusbar"), FALSE); gtk_window_fullscreen(GTK_WINDOW(pWindow)); } else { gtk_widget_show(pMenuBar); gtk_widget_show(pToolBar); gtk_widget_show(pStatusBar); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_menu"), TRUE); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_toolbar"), TRUE); gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_statusbar"), TRUE); gtk_window_unfullscreen(GTK_WINDOW(pWindow)); } } static int Open(const char *filename) { int res; res = NDS_LoadROM( filename ); if(res > 0) gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), TRUE); return res; } void Launch() { GtkWidget *pause; desmume_resume(); if(!regMainLoop) { g_idle_add_full(EMULOOP_PRIO, &EmuLoop, pWindow, NULL); regMainLoop = TRUE; } UpdateStatusBar("Running ..."); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), TRUE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "reset"), TRUE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), TRUE); pause = gtk_bin_get_child(GTK_BIN(gtk_ui_manager_get_widget(ui_manager, "/ToolBar/pause"))); gtk_widget_grab_focus(pause); } void Pause() { GtkWidget *run; desmume_pause(); UpdateStatusBar("Paused"); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); run = gtk_bin_get_child(GTK_BIN(gtk_ui_manager_get_widget(ui_manager, "/ToolBar/run"))); gtk_widget_grab_focus(run); } static void LoadStateDialog() { GtkFileFilter *pFilter_ds, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); gtk_file_filter_set_name(pFilter_ds, "DeSmuME binary (.ds*)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Load State From ...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_ds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(savestate_load(sPath) == false ) { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to load :\n%s", sPath); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); } g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void RecordMovieDialog() { GtkFileFilter *pFilter_dsm, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); gtk_file_filter_set_name(pFilter_dsm, "DeSmuME movie file (.dsm*)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Save Movie To ...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsm); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); FCEUI_SaveMovie(sPath,L"",0,"", FCEUI_MovieGetRTCDefault()); g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void StopMovie() { FCEUI_StopMovie(); } static void PlayMovieDialog() { GtkFileFilter *pFilter_dsm, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); gtk_file_filter_set_name(pFilter_dsm, "DeSmuME movie file (.dsm*)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Play movie from...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsm); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); FCEUI_LoadMovie(sPath,true,false,-1); g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void SaveStateDialog() { GtkFileFilter *pFilter_ds, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); gtk_file_filter_set_name(pFilter_ds, "DeSmuME binary (.ds*)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Save State To ...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_ds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(savestate_save(sPath) == false ) { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to save :\n%s", sPath); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); } g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void OpenNdsDialog() { GtkFileFilter *pFilter_nds, *pFilter_dsgba, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; if (desmume_running()) Pause(); pParent = GTK_WIDGET(pWindow); pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS]"); #ifdef HAVE_LIBZ gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS].gz"); #endif #ifdef HAVE_LIBZZIP gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS].zip"); #endif gtk_file_filter_set_name(pFilter_nds, "Nds binary (.nds)"); pFilter_dsgba = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsgba, "*.ds.gba"); gtk_file_filter_set_name(pFilter_dsgba, "Nds binary with loader (.ds.gba)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ pFileSelection = gtk_file_chooser_dialog_new("Open...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); /* Only the dialog window is accepting events: */ gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_nds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsgba); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(pFileSelection), g_get_home_dir()); /* Showing the window */ switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); if(Open((const char*)sPath) < 0) { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to load :\n%s", sPath); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { GtkRecentData recentData; gchar *uri; memset(&recentData, 0, sizeof(GtkRecentData)); recentData.mime_type = g_strdup("application/x-nintendo-ds-rom"); recentData.app_name = (gchar *) g_get_application_name (); recentData.app_exec = g_strjoin (" ", g_get_prgname (), "%f", NULL); GtkRecentManager *manager; manager = gtk_recent_manager_get_default (); uri = g_filename_to_uri (sPath, NULL, NULL); gtk_recent_manager_add_full (manager, uri, &recentData); g_free(uri); g_free(recentData.app_name); g_free(recentData.app_exec); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); Launch(); } g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); } static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) { GtkRecentManager *recent_manager = gtk_recent_manager_get_default(); gchar *uri, *romname; int ret; if (desmume_running()) Pause(); uri = gtk_recent_chooser_get_current_uri(chooser); romname = g_filename_from_uri(uri, NULL, NULL); ret = Open(romname); if (ret > 0) { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); Launch(); } else { gtk_recent_manager_remove_item(recent_manager, uri, NULL); GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Unable to load :\n%s", uri); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } g_free(uri); g_free(romname); } static void Reset() { NDS_Reset(); Launch(); } /////////////////////////////// DRAWING SCREEN ////////////////////////////////// static void UpdateDrawingAreaAspect() { gint H, W; if (nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) { W = screen_size[nds_screen.orientation].width; H = screen_size[nds_screen.orientation].height; } else { W = screen_size[nds_screen.orientation].height; H = screen_size[nds_screen.orientation].width; } if (nds_screen.orientation != ORIENT_SINGLE) { if ((nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) ^ (nds_screen.orientation == ORIENT_HORIZONTAL)) { H += nds_screen.gap_size; } else { W += nds_screen.gap_size; } } video.SetSourceSize(W, H); gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W, H); } static void ToggleGap(GtkToggleAction* action) { nds_screen.gap_size = gtk_toggle_action_get_active(action) ? GAP_SIZE : 0; UpdateDrawingAreaAspect(); } static void SetRotation(GtkAction *action, GtkRadioAction *current) { nds_screen.rotation_angle = gtk_radio_action_get_current_value(current); UpdateDrawingAreaAspect(); } static void SetOrientation(GtkAction *action, GtkRadioAction *current) { nds_screen.orientation = gtk_radio_action_get_current_value(current); UpdateDrawingAreaAspect(); } static void ToggleSwapScreens(GtkToggleAction *action) { nds_screen.swap = gtk_toggle_action_get_active(action); } static int ConfigureDrawingArea(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { return TRUE; } static inline void gpu_screen_to_rgb(guchar * rgb, int size, int pixelsize) { gint rot = nds_screen.rotation_angle; gint height, width; u16 gpu_pixel; u32 offset; width = screen_size[nds_screen.orientation].width; height = screen_size[nds_screen.orientation].height; for (gint i = 0; i < width; i++) { for (gint j = 0; j < height; j++) { gint row = j, col = i; if (i >= 256) { col = i - 256; row = j + 192; } if (nds_screen.swap) row = (row + 192) % 384; gpu_pixel = *((u16 *) & GPU_screen[(col + row * 256) << 1]); if (rot == 0 || rot == 180) offset = i * pixelsize + j * pixelsize * width; else offset = j * pixelsize + (width - i - 1) * pixelsize * height; if (rot == 90 || rot == 180) offset = size - offset - pixelsize; *(rgb + offset + 0) = ((gpu_pixel >> 0) & 0x1f) << 3; *(rgb + offset + 1) = ((gpu_pixel >> 5) & 0x1f) << 3; *(rgb + offset + 2) = ((gpu_pixel >> 10) & 0x1f) << 3; } } } /* Drawing callback */ static gboolean ExposeDrawingArea (GtkWidget *widget, GdkEventExpose *event, gpointer data) { GdkPixbuf *resizedPixbuf, *drawPixbuf; cairo_t *cr; GdkWindow *window; gfloat vratio, hratio, nscreen_ratio; gint daW, daH, imgW, imgH, screenW, screenH, gapW, gapH; gint primaryOffsetX, primaryOffsetY, secondaryOffsetX, secondaryOffsetY; const gboolean gap_vertical = ((nds_screen.orientation == ORIENT_VERTICAL) ^ (nds_screen.rotation_angle == 90 || nds_screen.rotation_angle == 270)); window = gtk_widget_get_window(GTK_WIDGET(pDrawingArea)); #if GTK_CHECK_VERSION(2,24,0) daW = gdk_window_get_width(window); daH = gdk_window_get_height(window); #else gdk_drawable_get_size(window, &daW, &daH); #endif if (nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) { imgW = screen_size[nds_screen.orientation].width; imgH = screen_size[nds_screen.orientation].height; } else { imgH = screen_size[nds_screen.orientation].width; imgW = screen_size[nds_screen.orientation].height; } if (nds_screen.orientation == ORIENT_SINGLE) { gapH = 0; gapW = 0; } else if (gap_vertical) { gapH = nds_screen.gap_size; gapW = 0; } else { gapH = 0; gapW = nds_screen.gap_size; } hratio = (float)(daW - gapW) / (float)imgW; vratio = (float)(daH - gapH) / (float)imgH; hratio = MIN(hratio, vratio); vratio = hratio; primaryOffsetX = (daW-(int)(hratio*(float)imgW)-gapW)/2; primaryOffsetY = (daH-(int)(vratio*(float)imgH)-gapH)/2; nscreen_ratio = nds_screen.orientation == ORIENT_SINGLE ? 1 : 0.5; if (gap_vertical) { screenW = (int)(hratio*(float)imgW); screenH = (int)(vratio*(float)imgH*nscreen_ratio); secondaryOffsetX = primaryOffsetX; secondaryOffsetY = primaryOffsetY + screenH + gapH; } else { screenW = (int)(hratio*(float)imgW*nscreen_ratio); screenH = (int)(vratio*(float)imgH); secondaryOffsetX = primaryOffsetX + screenW + gapW; secondaryOffsetY = primaryOffsetY; } if ((nds_screen.swap) ^ ((nds_screen.orientation == ORIENT_VERTICAL && (nds_screen.rotation_angle == 90 || nds_screen.rotation_angle == 180)) || (nds_screen.orientation == ORIENT_HORIZONTAL && (nds_screen.rotation_angle == 180 || nds_screen.rotation_angle == 270)))) { nds_screen.touch_x = primaryOffsetX; nds_screen.touch_y = primaryOffsetY; } else if (nds_screen.orientation != ORIENT_SINGLE) { nds_screen.touch_x = secondaryOffsetX; nds_screen.touch_y = secondaryOffsetY; } else { nds_screen.touch_x = -1; nds_screen.touch_y = -1; } nds_screen.touch_width = screenW; nds_screen.touch_height = screenH; osd->update(); DrawHUD(); gpu_screen_to_rgb((u8*)video.GetSrcBufferPtr(), imgW*imgH*4, 4); u32* fbuf = video.RunFilter(); int dstW = video.GetDstWidth(); int dstH = video.GetDstHeight(); //Convert to 24-bit guchar dsurf24[dstW*dstH*SCREEN_BYTES_PER_PIXEL]; gint k=0; for (gint i=0; iwindow); gdk_cairo_set_source_pixbuf(cr, drawPixbuf, 0, 0); if (nds_screen.orientation != ORIENT_SINGLE) { gdk_cairo_set_source_pixbuf(cr, drawPixbuf, primaryOffsetX, primaryOffsetY); } g_object_unref(drawPixbuf); //drawPixbuf was never unref'd, so its ref count stayed above 0 and it was never freed cairo_paint(cr); cairo_destroy(cr); return TRUE; } /////////////////////////////// KEYS AND STYLUS UPDATE /////////////////////////////////////// static gboolean rotoscaled_touchpos(gint x, gint y, gboolean start) { u16 EmuX, EmuY; gint X, Y; if (nds_screen.touch_x == -1 || nds_screen.touch_y == -1) { return FALSE; } if (nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) { X = (x - nds_screen.touch_x) * 256 / nds_screen.touch_width; Y = (y - nds_screen.touch_y) * 192 / nds_screen.touch_height; } else { X = (y - nds_screen.touch_y) * 256 / nds_screen.touch_height; Y = (x - nds_screen.touch_x) * 192 / nds_screen.touch_width; } if (nds_screen.rotation_angle == 180 || nds_screen.rotation_angle == 270) { X = 255 - X; } if (nds_screen.rotation_angle == 90 || nds_screen.rotation_angle == 180) { Y = 191 - Y; } LOG("X=%d, Y=%d\n",x,y); if (!start || (X >= 0 && Y >= 0 && X < 256 && Y < 192)) { EmuX = CLAMP(X, 0, 255); EmuY = CLAMP(Y, 0, 191); NDS_setTouchPos(EmuX, EmuY); return TRUE; } return FALSE; } static gboolean Stylus_Move(GtkWidget *w, GdkEventMotion *e, gpointer data) { GdkModifierType state; gint x,y; if(click) { if(e->is_hint) gdk_window_get_pointer(w->window, &x, &y, &state); else { x= (gint)e->x; y= (gint)e->y; state=(GdkModifierType)e->state; } if(state & GDK_BUTTON1_MASK) rotoscaled_touchpos(x, y, FALSE); } return TRUE; } static gboolean Stylus_Press(GtkWidget * w, GdkEventButton * e, gpointer data) { GdkModifierType state; gint x, y; if (e->button == 3) { GtkWidget * pMenu = gtk_menu_item_get_submenu ( GTK_MENU_ITEM( gtk_ui_manager_get_widget (ui_manager, "/MainMenu/ConfigMenu/ViewMenu"))); gtk_menu_popup(GTK_MENU(pMenu), NULL, NULL, NULL, NULL, 3, e->time); } if( !desmume_running()) return TRUE; if (e->button == 1) { gdk_window_get_pointer(w->window, &x, &y, &state); if(state & GDK_BUTTON1_MASK) if (rotoscaled_touchpos(x, y, TRUE)) click = TRUE; } return TRUE; } static gboolean Stylus_Release(GtkWidget *w, GdkEventButton *e, gpointer data) { if(click) NDS_releaseTouch(); click = FALSE; return TRUE; } static void loadgame(int num){ if (desmume_running()) { Pause(); loadstate_slot(num); Launch(); } else loadstate_slot(num); } static void savegame(int num){ if (desmume_running()) { Pause(); savestate_slot(num); Launch(); } else savestate_slot(num); } static void MenuLoad(GtkMenuItem *item, gpointer slot) { loadgame(GPOINTER_TO_INT(slot)); } static void MenuSave(GtkMenuItem *item, gpointer slot) { savegame(GPOINTER_TO_INT(slot)); } static gint Key_Press(GtkWidget *w, GdkEventKey *e, gpointer data) { if (e->keyval == GDK_Shift_L){ gdk_shift_pressed |= 1; return 1; } if (e->keyval == GDK_Shift_R){ gdk_shift_pressed |= 2; return 1; } if( e->keyval >= GDK_F1 && e->keyval <= GDK_F10 ){ if(!gdk_shift_pressed) loadgame(e->keyval - GDK_F1 + 1); else savegame(e->keyval - GDK_F1 + 1); return 1; } guint mask; mask = gtk_accelerator_get_default_mod_mask (); if( (e->state & mask) == 0){ u16 Key = lookup_key(e->keyval); if(Key){ ADD_KEY( Cur_Keypad, Key ); if(desmume_running()) update_keypad(Cur_Keypad); return 1; } } #ifdef PROFILE_MEMORY_ACCESS if ( e->keyval == GDK_Tab) { print_memory_profiling(); return 1; } #endif return 0; } static gint Key_Release(GtkWidget *w, GdkEventKey *e, gpointer data) { if (e->keyval == GDK_Shift_L){ gdk_shift_pressed &= ~1; return 1; } if (e->keyval == GDK_Shift_R){ gdk_shift_pressed &= ~2; return 1; } u16 Key = lookup_key(e->keyval); RM_KEY( Cur_Keypad, Key ); if(desmume_running()) update_keypad(Cur_Keypad); return 1; } /////////////////////////////// CONTROLS EDIT ////////////////////////////////////// static void AcceptNewInputKey(GtkWidget *w, GdkEventKey *e, struct modify_key_ctx *ctx) { gchar *YouPressed; ctx->mk_key_chosen = e->keyval; YouPressed = g_strdup_printf("You pressed : %s\nClick OK to keep this key.", gdk_keyval_name(e->keyval)); gtk_label_set_text(GTK_LABEL(ctx->label), YouPressed); g_free(YouPressed); } static void Modify_Key(GtkWidget* widget, gpointer data) { struct modify_key_ctx ctx; GtkWidget *mkDialog; gchar *Key_Label; gchar *Title; gint Key; Key = GPOINTER_TO_INT(data); ctx.mk_key_chosen = 0; Title = g_strdup_printf("Press \"%s\" key ...\n", key_names[Key]); mkDialog = gtk_dialog_new_with_buttons(Title, GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK,GTK_RESPONSE_OK, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, NULL); ctx.label = gtk_label_new(Title); g_free(Title); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(mkDialog)->vbox), ctx.label, TRUE, FALSE, 0); g_signal_connect(G_OBJECT(mkDialog), "key_press_event", G_CALLBACK(AcceptNewInputKey), &ctx); gtk_widget_show_all(GTK_DIALOG(mkDialog)->vbox); switch(gtk_dialog_run(GTK_DIALOG(mkDialog))) { case GTK_RESPONSE_OK: Keypad_Temp[Key] = ctx.mk_key_chosen; Key_Label = g_strdup_printf("%s (%s)", key_names[Key], gdk_keyval_name(Keypad_Temp[Key])); gtk_button_set_label(GTK_BUTTON(widget), Key_Label); g_free(Key_Label); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: ctx.mk_key_chosen = 0; break; } gtk_widget_destroy(mkDialog); } static void Edit_Controls() { GtkWidget *ecDialog; GtkWidget *ecKey; gchar *Key_Label; int i; memcpy(&Keypad_Temp, &keyboard_cfg, sizeof(keyboard_cfg)); ecDialog = gtk_dialog_new_with_buttons("Edit controls", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK,GTK_RESPONSE_OK, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, NULL); for(i = 0; i < NB_KEYS; i++) { Key_Label = g_strdup_printf("%s (%s)", key_names[i], gdk_keyval_name(Keypad_Temp[i])); ecKey = gtk_button_new_with_label(Key_Label); g_free(Key_Label); g_signal_connect(G_OBJECT(ecKey), "clicked", G_CALLBACK(Modify_Key), GINT_TO_POINTER(i)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ecDialog)->vbox), ecKey,TRUE, FALSE, 0); } gtk_widget_show_all(GTK_DIALOG(ecDialog)->vbox); switch (gtk_dialog_run(GTK_DIALOG(ecDialog))) { case GTK_RESPONSE_OK: memcpy(&keyboard_cfg, &Keypad_Temp, sizeof(keyboard_cfg)); desmume_config_update_keys(keyfile); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: break; } gtk_widget_destroy(ecDialog); } static void AcceptNewJoyKey(GtkWidget *w, GdkEventFocus *e, struct modify_key_ctx *ctx) { gchar *YouPressed; ctx->mk_key_chosen = get_joy_key(ctx->key_id); YouPressed = g_strdup_printf("You pressed : %d\nClick OK to keep this key.", ctx->mk_key_chosen); gtk_label_set_text(GTK_LABEL(ctx->label), YouPressed); g_free(YouPressed); } static void Modify_JoyKey(GtkWidget* widget, gpointer data) { struct modify_key_ctx ctx; GtkWidget *mkDialog; gchar *Key_Label; gchar *Title; gint Key; Key = GPOINTER_TO_INT(data); /* Joypad keys start at 1 */ ctx.key_id = Key+1; ctx.mk_key_chosen = 0; Title = g_strdup_printf("Press \"%s\" key ...\n", key_names[Key]); mkDialog = gtk_dialog_new_with_buttons(Title, GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK,GTK_RESPONSE_OK, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, NULL); ctx.label = gtk_label_new(Title); g_free(Title); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(mkDialog)->vbox), ctx.label, TRUE, FALSE, 0); gtk_widget_show_all(GTK_DIALOG(mkDialog)->vbox); g_signal_connect(G_OBJECT(mkDialog), "focus_in_event", G_CALLBACK(AcceptNewJoyKey), &ctx); switch(gtk_dialog_run(GTK_DIALOG(mkDialog))) { case GTK_RESPONSE_OK: Keypad_Temp[Key] = ctx.mk_key_chosen; Key_Label = g_strdup_printf("%s (%d)", key_names[Key], Keypad_Temp[Key]); gtk_button_set_label(GTK_BUTTON(widget), Key_Label); g_free(Key_Label); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: ctx.mk_key_chosen = 0; break; } gtk_widget_destroy(mkDialog); } static void Edit_Joystick_Controls() { GtkWidget *ecDialog; GtkWidget *ecKey; gchar *Key_Label; int i; memcpy(&Keypad_Temp, &joypad_cfg, sizeof(joypad_cfg)); ecDialog = gtk_dialog_new_with_buttons("Edit controls", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK,GTK_RESPONSE_OK, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, NULL); for(i = 0; i < NB_KEYS; i++) { Key_Label = g_strdup_printf("%s (%d)", key_names[i], Keypad_Temp[i]); ecKey = gtk_button_new_with_label(Key_Label); g_free(Key_Label); g_signal_connect(G_OBJECT(ecKey), "clicked", G_CALLBACK(Modify_JoyKey), GINT_TO_POINTER(i)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ecDialog)->vbox), ecKey,TRUE, FALSE, 0); } gtk_widget_show_all(GTK_DIALOG(ecDialog)->vbox); switch (gtk_dialog_run(GTK_DIALOG(ecDialog))) { case GTK_RESPONSE_OK: memcpy(&joypad_cfg, &Keypad_Temp, sizeof(keyboard_cfg)); desmume_config_update_joykeys(keyfile); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: break; } gtk_widget_destroy(ecDialog); } static void ToggleLayerVisibility(GtkToggleAction* action, gpointer data) { guint Layer = GPOINTER_TO_UINT(data); gboolean active; // FIXME: make it work after resume if (!desmume_running()) return; active = gtk_toggle_action_get_active(action); switch (Layer) { case MAIN_BG_0: case MAIN_BG_1: case MAIN_BG_2: case MAIN_BG_3: case MAIN_OBJ: if(active == TRUE) { GPU_addBack(MainScreen.gpu, Layer); } else { GPU_remove(MainScreen.gpu, Layer); } break; case SUB_BG_0: case SUB_BG_1: case SUB_BG_2: case SUB_BG_3: case SUB_OBJ: if(active == TRUE) { GPU_addBack(SubScreen.gpu, Layer-SUB_BG_0); } else { GPU_remove(SubScreen.gpu, Layer-SUB_BG_0); } break; default: break; } } static void Printscreen() { GdkPixbuf *screenshot; gchar *filename, *filen; GError *error = NULL; u8 *rgb; static int seq = 0; gint H, W; rgb = (u8 *) malloc(SCREENS_PIXEL_SIZE*SCREEN_BYTES_PER_PIXEL); if (!rgb) return; if (nds_screen.rotation_angle == 0 || nds_screen.rotation_angle == 180) { W = screen_size[nds_screen.orientation].width; H = screen_size[nds_screen.orientation].height; } else { W = screen_size[nds_screen.orientation].height; H = screen_size[nds_screen.orientation].width; } gpu_screen_to_rgb(rgb, W*H*SCREEN_BYTES_PER_PIXEL, 3); screenshot = gdk_pixbuf_new_from_data(rgb, GDK_COLORSPACE_RGB, FALSE, 8, W, H, W*SCREEN_BYTES_PER_PIXEL, NULL, NULL); filen = g_strdup_printf("desmume-screenshot-%d.png", seq); filename = g_build_filename(g_get_user_special_dir(G_USER_DIRECTORY_PICTURES), filen, NULL); gdk_pixbuf_save(screenshot, filename, "png", &error, NULL); if (error) { g_error_free (error); g_printerr("Failed to save %s", filename); } else { seq++; } free(rgb); g_object_unref(screenshot); g_free(filename); g_free(filen); } #ifdef DESMUME_GTK_FIRMWARE_BROKEN static void SelectFirmwareFile() { GtkFileFilter *pFilter_nds, *pFilter_bin, *pFilter_any; GtkWidget *pFileSelection; GtkWidget *pParent; gchar *sPath; BOOL oldState = desmume_running(); Pause(); pParent = GTK_WIDGET(pWindow); pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.nds"); gtk_file_filter_set_name(pFilter_nds, "Nds binary (.nds)"); pFilter_bin = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_bin, "*.bin"); gtk_file_filter_set_name(pFilter_bin, "Binary file (.bin)"); pFilter_any = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); pFileSelection = gtk_file_chooser_dialog_new("Load firmware...", GTK_WINDOW(pParent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_nds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_bin); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { case GTK_RESPONSE_OK: sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); CommonSettings.UseExtFirmware = true; strncpy(CommonSettings.Firmware, (const char*)sPath, g_utf8_strlen(sPath, -1)); g_free(sPath); break; default: break; } gtk_widget_destroy(pFileSelection); if(oldState) Launch(); } #endif static void Modify_PriInterpolation(GtkAction *action, GtkRadioAction *current) { uint filter = gtk_radio_action_get_current_value(current) ; video.ChangeFilterByID((VideoFilterTypeID)filter); } static void Modify_Interpolation(GtkAction *action, GtkRadioAction *current) { Interpolation = (GdkInterpType)gtk_radio_action_get_current_value(current); } static void Modify_SPUMode(GtkAction *action, GtkRadioAction *current) { const uint mode = gtk_radio_action_get_current_value(current); switch (mode) { case SPUMODE_SYNCN: case SPUMODE_SYNCZ: #ifdef HAVE_LIBSOUNDTOUCH case SPUMODE_SYNCP: #endif SPUMode = mode; SPU_SetSynchMode(1, mode-1); break; case SPUMODE_DUALASYNC: default: SPUMode = SPUMODE_DUALASYNC; SPU_SetSynchMode(0, 0); break; } } static void Modify_Frameskip(GtkAction *action, GtkRadioAction *current) { Frameskip = gtk_radio_action_get_current_value(current) ; autoframeskip = Frameskip == FRAMESKIP_AUTO; } /////////////////////////////// TOOLS MANAGEMENT /////////////////////////////// extern const dTool_t *dTools_list[]; extern const int dTools_list_size; BOOL *dTools_running; static void Start_dTool(GtkWidget *widget, gpointer data) { int tool = GPOINTER_TO_INT(data); if(dTools_running == NULL || dTools_running[tool]) return; dTools_list[tool]->open(tool); dTools_running[tool] = TRUE; } void dTool_CloseCallback(int tool) { if (dTools_running == NULL) return; dTools_running[tool] = FALSE; } static inline void _updateDTools() { if (dTools_running == NULL) return; for(int i = 0; i < dTools_list_size; i++) { if(dTools_running[i]) { dTools_list[i]->update(); } } } /////////////////////////////// MAIN EMULATOR LOOP /////////////////////////////// class GtkDriver : public UnixDriver { public: virtual void EMU_DebugIdleUpdate() { usleep(1000); _updateDTools(); while (gtk_events_pending()) gtk_main_iteration(); } }; static void DoQuit() { emu_halt(); gtk_main_quit(); } gboolean EmuLoop(gpointer data) { static Uint32 fps_SecStart, next_fps_SecStart, fps_FrameCount, skipped_frames; static int limiter_frame_counter; unsigned int i; gchar Title[20]; if (!desmume_running()) { regMainLoop = FALSE; return FALSE; } /* If desmume is currently running */ if (!fps_SecStart) fps_SecStart = SDL_GetTicks(); /* don't count autoframeskip as real frameskip */ if (Frameskip == FRAMESKIP_AUTO) Frameskip = 0; fps_FrameCount += Frameskip + 1; next_fps_SecStart = SDL_GetTicks(); if ((next_fps_SecStart - fps_SecStart) >= 1000) { fps_SecStart = next_fps_SecStart; snprintf(Title, sizeof(Title), "Desmume - %dfps", fps_FrameCount); gtk_window_set_title(GTK_WINDOW(pWindow), Title); float emu_ratio = fps_FrameCount / 60.0; if (autoframeskip) { if (emu_ratio < 1 && (fps_FrameCount - skipped_frames) > skipped_frames) Frameskip = MIN(Frameskip+1, FRAMESKIP_AUTO-1); if (emu_ratio > 1 || skipped_frames >= fps_FrameCount-Frameskip) Frameskip = Frameskip ? Frameskip-1 : 0; } LOG("auto: %d fps: %u skipped: %u emu_ratio: %f Frameskip: %u\n", autoframeskip, fps_FrameCount, skipped_frames, emu_ratio, Frameskip); fps_FrameCount = 0; skipped_frames = 0; } desmume_cycle(); /* Emule ! */ for (i = 0; i < Frameskip; i++) { NDS_SkipNextFrame(); desmume_cycle(); skipped_frames++; } _updateDTools(); gtk_widget_queue_draw( pDrawingArea ); osd->clear(); if (!gtk_fps_limiter_disabled) { limiter_frame_counter += 1; if (limiter_frame_counter >= FPS_LIMITER_FRAME_PERIOD) { limiter_frame_counter = 0; /* wait for the timer to expire */ SDL_SemWait( fps_limiter_semaphore); } } return TRUE; } /** * A SDL timer callback function. Signals the supplied SDL semaphore * if its value is small. * * @param interval The interval since the last call (in ms) * @param param The pointer to the semaphore. * * @return The interval to the next call (required by SDL) */ static Uint32 fps_limiter_fn(Uint32 interval, void *param) { SDL_sem *sdl_semaphore = (SDL_sem *)param; /* signal the semaphore if it is getting low */ if ( SDL_SemValue( sdl_semaphore) < 4) { SDL_SemPost( sdl_semaphore); } return interval; } static void desmume_try_adding_ui(GtkUIManager *self, const char *ui_descr){ GError *error; error = NULL; if (!gtk_ui_manager_add_ui_from_string (self, ui_descr, -1, &error)) { g_message ("building menus failed: %s", error->message); g_error_free (error); exit (EXIT_FAILURE); } } static void dui_set_accel_group(gpointer action, gpointer group) { gtk_action_set_accel_group((GtkAction *)action, (GtkAccelGroup *)group); } static void desmume_gtk_menu_file_saveload_slot (GtkActionGroup *ag) { for(guint i = 1; i <= 10; i++){ GtkAction *act; char label[64], name[64]; snprintf(label, 60, "_%d", i); snprintf(name, 60, "savestate%d", i); act = gtk_action_new(name, label, NULL, NULL); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuSave), GUINT_TO_POINTER(i)); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), NULL); snprintf(name, 60, "loadstate%d", i); act = gtk_action_new(name, label, NULL, NULL); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuLoad), GUINT_TO_POINTER(i)); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), NULL); } } static void changesavetype(GtkAction *action, GtkRadioAction *current) { backup_setManualBackupType( gtk_radio_action_get_current_value(current)); } static void desmume_gtk_menu_emulation_layers (GtkActionGroup *ag) { const char *Layers_Menu[10][2] = { {"layermainbg0","_0 Main BG 0"}, {"layermainbg1","_1 Main BG 1"}, {"layermainbg2","_2 Main BG 2"}, {"layermainbg3","_3 Main BG 3"}, {"layermainobj","_4 Main OBJ"}, {"layersubbg0", "_5 SUB BG 0"}, {"layersubbg1", "_6 SUB BG 1"}, {"layersubbg2", "_7 SUB BG 2"}, {"layersubbg3", "_8 SUB BG 3"}, {"layersubobj", "_9 SUB OBJ"} }; guint i; GtkToggleAction *act; for(i = 0; i< 10; i++){ act = gtk_toggle_action_new(Layers_Menu[i][0],Layers_Menu[i][1],NULL,NULL); gtk_toggle_action_set_active(act, TRUE); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(ToggleLayerVisibility), GUINT_TO_POINTER(i)); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), NULL); } } static void ToggleAudio (GtkToggleAction *action) { if (gtk_toggle_action_get_active(action) == TRUE) { SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); osd->addLine("Audio enabled"); } else { SPU_ChangeSoundCore(0, 0); osd->addLine("Audio disabled"); } } #ifdef FAKE_MIC static void ToggleMicNoise (GtkToggleAction *action) { BOOL doNoise = (BOOL)gtk_toggle_action_get_active(action); Mic_DoNoise(doNoise); if (doNoise) osd->addLine("Fake mic enabled"); else osd->addLine("Fake mic disabled"); } #endif static void desmume_gtk_menu_tools (GtkActionGroup *ag) { gint i; for(i = 0; i < dTools_list_size; i++) { GtkAction *act; act = gtk_action_new(dTools_list[i]->shortname, dTools_list[i]->name, NULL, NULL); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(Start_dTool), GINT_TO_POINTER(i)); gtk_action_group_add_action(ag, GTK_ACTION(act)); } } static gboolean timeout_exit_cb(gpointer data) { DoQuit(); INFO("Quit after %d seconds timeout\n", GPOINTER_TO_INT(data)); return FALSE; } static int common_gtk_main( class configured_features *my_config) { driver = new GtkDriver(); SDL_TimerID limiter_timer = NULL; GtkAccelGroup * accel_group; GtkWidget *pVBox; GtkWidget *pMenuBar; GtkWidget *pToolBar; #ifdef GDB_STUB gdbstub_handle_t arm9_gdb_stub; gdbstub_handle_t arm7_gdb_stub; #endif struct armcpu_memory_iface *arm9_memio = &arm9_base_memory_iface; struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface; struct armcpu_ctrl_iface *arm9_ctrl_iface; struct armcpu_ctrl_iface *arm7_ctrl_iface; /* the firmware settings */ struct NDS_fw_config_data fw_config; /* default the firmware settings, they may get changed later */ NDS_FillDefaultFirmwareConfigData( &fw_config); /* use any language set on the command line */ if ( my_config->firmware_language != -1) { fw_config.language = my_config->firmware_language; } //------------------addons---------- my_config->process_addonCommands(); addon_type = NDS_ADDON_NONE; if (my_config->is_cflash_configured) addon_type = NDS_ADDON_CFLASH; if(my_config->gbaslot_rom != "") { addon_type = NDS_ADDON_GBAGAME; strncpy(GBAgameName, my_config->gbaslot_rom.c_str(), MAX_PATH); } switch (addon_type) { case NDS_ADDON_CFLASH: case NDS_ADDON_RUMBLEPAK: case NDS_ADDON_NONE: case NDS_ADDON_GBAGAME: break; default: addon_type = NDS_ADDON_NONE; break; } addonsChangePak (addon_type); #ifdef GDB_STUB if ( my_config->arm9_gdb_port != 0) { arm9_gdb_stub = createStub_gdb( my_config->arm9_gdb_port, &arm9_memio, &arm9_base_memory_iface); if ( arm9_gdb_stub == NULL) { g_printerr("Failed to create ARM9 gdbstub on port %d\n", my_config->arm9_gdb_port); exit( -1); } } if ( my_config->arm7_gdb_port != 0) { arm7_gdb_stub = createStub_gdb( my_config->arm7_gdb_port, &arm7_memio, &arm7_base_memory_iface); if ( arm7_gdb_stub == NULL) { g_printerr("Failed to create ARM7 gdbstub on port %d\n", my_config->arm7_gdb_port); exit( -1); } } #endif /* FIXME: SDL_INIT_VIDEO is needed for joystick support to work!? * Perhaps it needs a "window" to catch events...? */ if(SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) == -1) { g_printerr("Error trying to initialize SDL: %s\n", SDL_GetError()); return 1; } desmume_init( arm9_memio, &arm9_ctrl_iface, arm7_memio, &arm7_ctrl_iface, my_config->disable_sound); /* Init the hud / osd stuff */ #ifdef HAVE_LIBAGG Desmume_InitOnce(); Hud.reset(); aggDraw.hud->attach(GPU_screen, 256, 384, 512); #endif /* * Activate the GDB stubs * This has to come after the NDS_Init (called in desmume_init) * where the cpus are set up. */ #ifdef GDB_STUB if ( my_config->arm9_gdb_port != 0) { activateStub_gdb( arm9_gdb_stub, arm9_ctrl_iface); } if ( my_config->arm7_gdb_port != 0) { activateStub_gdb( arm7_gdb_stub, arm7_ctrl_iface); } #endif /* Create the dummy firmware */ NDS_CreateDummyFirmware( &fw_config); /* Initialize joysticks */ if(!init_joy()) return 1; dTools_running = (BOOL*)malloc(sizeof(BOOL) * dTools_list_size); if (dTools_running != NULL) memset(dTools_running, FALSE, sizeof(BOOL) * dTools_list_size); keyfile = desmume_config_read_file(gtk_kb_cfg); memset(&nds_screen, 0, sizeof(nds_screen)); nds_screen.orientation = ORIENT_VERTICAL; /* Create the window */ pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(pWindow), "Desmume"); gtk_window_set_resizable(GTK_WINDOW (pWindow), TRUE); gtk_window_set_icon(GTK_WINDOW (pWindow), gdk_pixbuf_new_from_xpm_data(DeSmuME_xpm)); g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(DoQuit), NULL); g_signal_connect(G_OBJECT(pWindow), "key_press_event", G_CALLBACK(Key_Press), NULL); g_signal_connect(G_OBJECT(pWindow), "key_release_event", G_CALLBACK(Key_Release), NULL); /* Create the GtkVBox */ pVBox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(pWindow), pVBox); ui_manager = gtk_ui_manager_new (); accel_group = gtk_accel_group_new(); action_group = gtk_action_group_new("dui"); gtk_action_group_add_actions(action_group, action_entries, G_N_ELEMENTS(action_entries), NULL); gtk_action_group_add_toggle_actions(action_group, toggle_entries, G_N_ELEMENTS(toggle_entries), NULL); /* Update audio toggle status */ if (my_config->disable_sound) { GtkAction *action = gtk_action_group_get_action(action_group, "enableaudio"); if (action) gtk_toggle_action_set_active((GtkToggleAction *)action, FALSE); } desmume_gtk_menu_emulation_layers(action_group); desmume_gtk_menu_file_saveload_slot(action_group); desmume_gtk_menu_tools(action_group); gtk_action_group_add_radio_actions(action_group, savet_entries, G_N_ELEMENTS(savet_entries), my_config->savetype, G_CALLBACK(changesavetype), NULL); gtk_action_group_add_radio_actions(action_group, interpolation_entries, G_N_ELEMENTS(interpolation_entries), GDK_INTERP_NEAREST, G_CALLBACK(Modify_Interpolation), NULL); gtk_action_group_add_radio_actions(action_group, pri_interpolation_entries, G_N_ELEMENTS(pri_interpolation_entries), VideoFilterTypeID_HQ2XS, G_CALLBACK(Modify_PriInterpolation), NULL); gtk_action_group_add_radio_actions(action_group, spumode_entries, G_N_ELEMENTS(spumode_entries), 0, G_CALLBACK(Modify_SPUMode), NULL); gtk_action_group_add_radio_actions(action_group, frameskip_entries, G_N_ELEMENTS(frameskip_entries), 0, G_CALLBACK(Modify_Frameskip), NULL); gtk_action_group_add_radio_actions(action_group, rotation_entries, G_N_ELEMENTS(rotation_entries), 0, G_CALLBACK(SetRotation), NULL); gtk_action_group_add_radio_actions(action_group, orientation_entries, G_N_ELEMENTS(orientation_entries), 0, G_CALLBACK(SetOrientation), NULL); { GList * list = gtk_action_group_list_actions(action_group); g_list_foreach(list, dui_set_accel_group, accel_group); } gtk_window_add_accel_group(GTK_WINDOW(pWindow), accel_group); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "reset"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), FALSE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatsearch"), FALSE); gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); accel_group = gtk_ui_manager_get_accel_group (ui_manager); gtk_window_add_accel_group (GTK_WINDOW (pWindow), accel_group); desmume_try_adding_ui(ui_manager, ui_description); pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); gtk_box_pack_start (GTK_BOX (pVBox), pMenuBar, FALSE, FALSE, 0); pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); gtk_box_pack_start (GTK_BOX(pVBox), pToolBar, FALSE, FALSE, 0); { GtkWidget * recentMenu = gtk_ui_manager_get_widget (ui_manager, "/MainMenu/FileMenu/RecentMenu"); GtkWidget * recentFiles = gtk_recent_chooser_menu_new(); GtkRecentFilter * recentFilter = gtk_recent_filter_new(); gtk_recent_filter_add_mime_type(recentFilter, "application/x-nintendo-ds-rom"); gtk_recent_chooser_set_filter(GTK_RECENT_CHOOSER(recentFiles), recentFilter); gtk_menu_item_set_submenu(GTK_MENU_ITEM(recentMenu), recentFiles); g_signal_connect(G_OBJECT(recentFiles), "item-activated", G_CALLBACK(OpenRecent), NULL); } /* Creating the place for showing DS screens */ pDrawingArea = gtk_drawing_area_new(); gtk_container_add (GTK_CONTAINER (pVBox), pDrawingArea); gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), 256, 384); gtk_widget_set_events(pDrawingArea, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_KEY_PRESS_MASK ); g_signal_connect(G_OBJECT(pDrawingArea), "button_press_event", G_CALLBACK(Stylus_Press), NULL); g_signal_connect(G_OBJECT(pDrawingArea), "button_release_event", G_CALLBACK(Stylus_Release), NULL); g_signal_connect(G_OBJECT(pDrawingArea), "motion_notify_event", G_CALLBACK(Stylus_Move), NULL); g_signal_connect(G_OBJECT(pDrawingArea), "expose_event", G_CALLBACK(ExposeDrawingArea), NULL ) ; g_signal_connect(G_OBJECT(pDrawingArea), "configure_event", G_CALLBACK(ConfigureDrawingArea), NULL ) ; /* Status bar */ pStatusBar = gtk_statusbar_new(); UpdateStatusBar("Desmume"); gtk_box_pack_end(GTK_BOX(pVBox), pStatusBar, FALSE, FALSE, 0); gtk_widget_show_all(pWindow); gtk_fps_limiter_disabled = my_config->disable_limiter; if ( !gtk_fps_limiter_disabled) { /* create the semaphore used for fps limiting */ fps_limiter_semaphore = SDL_CreateSemaphore( 1); /* start a SDL timer for every FPS_LIMITER_FRAME_PERIOD frames to keep us at 60 fps */ limiter_timer = SDL_AddTimer( 16 * FPS_LIMITER_FRAME_PERIOD, fps_limiter_fn, fps_limiter_semaphore); if ( limiter_timer == NULL) { g_printerr("Error trying to start FPS limiter timer: %s\n", SDL_GetError()); return 1; } } //Set the 3D emulation to use unsigned core = my_config->engine_3d; // setup the gdk 3D emulation; #if defined(HAVE_LIBOSMESA) if(my_config->engine_3d == 2){ core = init_osmesa_3Demu() ? 2 : GPU3D_NULL; } #endif NDS_3D_ChangeCore(core); if(my_config->engine_3d != 0 && gpu3D == &gpu3DNull) { g_printerr("Failed to initialise openGL 3D emulation; " "removing 3D support\n"); } backup_setManualBackupType(my_config->savetype); // Command line arg if( my_config->nds_file != "") { if(Open( my_config->nds_file.c_str()) >= 0) { my_config->process_movieCommands(); if(my_config->load_slot != -1){ int todo = my_config->load_slot; if(todo == 10) todo = 0; loadstate_slot(my_config->load_slot); } Launch(); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Unable to load :\n%s", my_config->nds_file.c_str()); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } } if (my_config->timeout > 0) { g_timeout_add_seconds(my_config->timeout, timeout_exit_cb, GINT_TO_POINTER(my_config->timeout)); } /* Video filter parameters */ video.SetFilterParameteri(VF_PARAM_SCANLINE_A, _scanline_filter_a); video.SetFilterParameteri(VF_PARAM_SCANLINE_B, _scanline_filter_b); video.SetFilterParameteri(VF_PARAM_SCANLINE_C, _scanline_filter_c); video.SetFilterParameteri(VF_PARAM_SCANLINE_D, _scanline_filter_d); /* Main loop */ gtk_main(); desmume_free(); if ( !gtk_fps_limiter_disabled) { /* tidy up the FPS limiter timer and semaphore */ SDL_RemoveTimer( limiter_timer); SDL_DestroySemaphore( fps_limiter_semaphore); } /* Unload joystick */ uninit_joy(); SDL_Quit(); desmume_config_dispose(keyfile); #ifdef GDB_STUB if ( my_config->arm9_gdb_port != 0) { destroyStub_gdb( arm9_gdb_stub); } if ( my_config->arm7_gdb_port != 0) { destroyStub_gdb( arm7_gdb_stub); } #endif return EXIT_SUCCESS; } int main (int argc, char *argv[]) { configured_features my_config; init_configured_features( &my_config); if (!g_thread_supported()) g_thread_init( NULL); gtk_init(&argc, &argv); if ( !fill_configured_features( &my_config, argc, argv)) { exit(0); } return common_gtk_main( &my_config); } #ifdef WIN32 int WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { int argc = 0; char *argv[] = NULL; /* * FIXME: * Emulate the argc and argv main parameters. Could do this using * CommandLineToArgvW and then convert the wide chars to thin chars. * Or parse the wide chars directly and call common_gtk_main with a * filled configuration structure. */ main( argc, argv); } #endif desmume-0.9.9/src/gtk/desmume.desktop0000644000175000017500000000032312140260633020323 0ustar guillaumeguillaume[Desktop Entry] Version=1.0 Type=Application Name=DeSmuME (Gtk) Comment=Nintento DS emulator TryExec=desmume Exec=desmume Icon=DeSmuME Categories=GNOME;GTK;Game;Emulator; MimeType=application/x-nintendo-ds-rom; desmume-0.9.9/src/gtk/Makefile.in0000644000175000017500000014126412140304540017344 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk bin_PROGRAMS = desmume$(EXEEXT) @HAVE_GDB_STUB_TRUE@am__append_1 = ../gdbstub/libgdbstub.a @HAVE_LIBOSMESA_TRUE@am__append_2 = $(OSMESA_LIBS) subdir = src/gtk ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" \ "$(DESTDIR)$(pixmapdir)" PROGRAMS = $(bin_PROGRAMS) am_desmume_OBJECTS = desmume.$(OBJEXT) dToolsList.$(OBJEXT) \ ioregsView.$(OBJEXT) sndsdl.$(OBJEXT) ctrlssdl.$(OBJEXT) \ driver.$(OBJEXT) osmesa_3Demu.$(OBJEXT) cheatsGTK.$(OBJEXT) \ hq2x.$(OBJEXT) hq4x.$(OBJEXT) 2xsai.$(OBJEXT) \ bilinear.$(OBJEXT) epx.$(OBJEXT) lq2x.$(OBJEXT) \ scanline.$(OBJEXT) videofilter.$(OBJEXT) main.$(OBJEXT) desmume_OBJECTS = $(am_desmume_OBJECTS) am__DEPENDENCIES_1 = @HAVE_LIBOSMESA_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) desmume_DEPENDENCIES = ../libdesmume.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__append_1) $(am__DEPENDENCIES_2) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(desmume_SOURCES) DIST_SOURCES = $(desmume_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(Applications_DATA) $(pixmap_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(GTK_CFLAGS) \ $(GTHREAD_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) AM_LDFLAGS = Applicationsdir = $(datadir)/applications Applications_DATA = desmume.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = DeSmuME.xpm EXTRA_DIST = DeSmuME.xpm desmume.desktop desmume_SOURCES = \ desmume.h desmume.cpp \ dTool.h dToolsList.cpp \ tools/ioregsView.cpp tools/ioregsView.h \ ../sndsdl.cpp \ ../ctrlssdl.h ../ctrlssdl.cpp \ ../driver.h ../driver.cpp \ osmesa_3Demu.cpp osmesa_3Demu.h \ cheatsGTK.h cheatsGTK.cpp \ ../filter/hq2x.cpp ../filter/hq2x.h \ ../filter/hq4x.cpp ../filter/hq4x.h \ ../filter/2xsai.cpp ../filter/bilinear.cpp \ ../filter/epx.cpp ../filter/lq2x.cpp \ ../filter/scanline.cpp \ ../filter/videofilter.cpp ../filter/videofilter.h \ main.cpp main.h desmume_LDADD = ../libdesmume.a $(SDL_LIBS) $(GTK_LIBS) \ $(GTHREAD_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) \ $(LIBSOUNDTOUCH_LIBS) $(am__append_1) $(am__append_2) UPDATE_DESKTOP = \ appsdir=$(DESTDIR)$(datadir)/applications ; \ if [ -f $$appsdir/mimeinfo.cache ] ; then \ if test ! "x$(UPDATEDESKTOP)" = "x" ; then \ $(UPDATEDESKTOP) $$appsdir ; \ fi \ fi all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gtk/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/gtk/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) desmume$(EXEEXT): $(desmume_OBJECTS) $(desmume_DEPENDENCIES) $(EXTRA_desmume_DEPENDENCIES) @rm -f desmume$(EXEEXT) $(CXXLINK) $(desmume_OBJECTS) $(desmume_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/2xsai.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bilinear.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheatsGTK.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrlssdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dToolsList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desmume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hq2x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hq4x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioregsView.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lq2x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osmesa_3Demu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scanline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sndsdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/videofilter.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ioregsView.o: tools/ioregsView.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ioregsView.o -MD -MP -MF $(DEPDIR)/ioregsView.Tpo -c -o ioregsView.o `test -f 'tools/ioregsView.cpp' || echo '$(srcdir)/'`tools/ioregsView.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ioregsView.Tpo $(DEPDIR)/ioregsView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tools/ioregsView.cpp' object='ioregsView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ioregsView.o `test -f 'tools/ioregsView.cpp' || echo '$(srcdir)/'`tools/ioregsView.cpp ioregsView.obj: tools/ioregsView.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ioregsView.obj -MD -MP -MF $(DEPDIR)/ioregsView.Tpo -c -o ioregsView.obj `if test -f 'tools/ioregsView.cpp'; then $(CYGPATH_W) 'tools/ioregsView.cpp'; else $(CYGPATH_W) '$(srcdir)/tools/ioregsView.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ioregsView.Tpo $(DEPDIR)/ioregsView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tools/ioregsView.cpp' object='ioregsView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ioregsView.obj `if test -f 'tools/ioregsView.cpp'; then $(CYGPATH_W) 'tools/ioregsView.cpp'; else $(CYGPATH_W) '$(srcdir)/tools/ioregsView.cpp'; fi` sndsdl.o: ../sndsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sndsdl.o -MD -MP -MF $(DEPDIR)/sndsdl.Tpo -c -o sndsdl.o `test -f '../sndsdl.cpp' || echo '$(srcdir)/'`../sndsdl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/sndsdl.Tpo $(DEPDIR)/sndsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../sndsdl.cpp' object='sndsdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sndsdl.o `test -f '../sndsdl.cpp' || echo '$(srcdir)/'`../sndsdl.cpp sndsdl.obj: ../sndsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sndsdl.obj -MD -MP -MF $(DEPDIR)/sndsdl.Tpo -c -o sndsdl.obj `if test -f '../sndsdl.cpp'; then $(CYGPATH_W) '../sndsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../sndsdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/sndsdl.Tpo $(DEPDIR)/sndsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../sndsdl.cpp' object='sndsdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sndsdl.obj `if test -f '../sndsdl.cpp'; then $(CYGPATH_W) '../sndsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../sndsdl.cpp'; fi` ctrlssdl.o: ../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ctrlssdl.o -MD -MP -MF $(DEPDIR)/ctrlssdl.Tpo -c -o ctrlssdl.o `test -f '../ctrlssdl.cpp' || echo '$(srcdir)/'`../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ctrlssdl.Tpo $(DEPDIR)/ctrlssdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ctrlssdl.cpp' object='ctrlssdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ctrlssdl.o `test -f '../ctrlssdl.cpp' || echo '$(srcdir)/'`../ctrlssdl.cpp ctrlssdl.obj: ../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ctrlssdl.obj -MD -MP -MF $(DEPDIR)/ctrlssdl.Tpo -c -o ctrlssdl.obj `if test -f '../ctrlssdl.cpp'; then $(CYGPATH_W) '../ctrlssdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../ctrlssdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ctrlssdl.Tpo $(DEPDIR)/ctrlssdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ctrlssdl.cpp' object='ctrlssdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ctrlssdl.obj `if test -f '../ctrlssdl.cpp'; then $(CYGPATH_W) '../ctrlssdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../ctrlssdl.cpp'; fi` driver.o: ../driver.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT driver.o -MD -MP -MF $(DEPDIR)/driver.Tpo -c -o driver.o `test -f '../driver.cpp' || echo '$(srcdir)/'`../driver.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/driver.Tpo $(DEPDIR)/driver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../driver.cpp' object='driver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o driver.o `test -f '../driver.cpp' || echo '$(srcdir)/'`../driver.cpp driver.obj: ../driver.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT driver.obj -MD -MP -MF $(DEPDIR)/driver.Tpo -c -o driver.obj `if test -f '../driver.cpp'; then $(CYGPATH_W) '../driver.cpp'; else $(CYGPATH_W) '$(srcdir)/../driver.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/driver.Tpo $(DEPDIR)/driver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../driver.cpp' object='driver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o driver.obj `if test -f '../driver.cpp'; then $(CYGPATH_W) '../driver.cpp'; else $(CYGPATH_W) '$(srcdir)/../driver.cpp'; fi` hq2x.o: ../filter/hq2x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hq2x.o -MD -MP -MF $(DEPDIR)/hq2x.Tpo -c -o hq2x.o `test -f '../filter/hq2x.cpp' || echo '$(srcdir)/'`../filter/hq2x.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hq2x.Tpo $(DEPDIR)/hq2x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/hq2x.cpp' object='hq2x.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hq2x.o `test -f '../filter/hq2x.cpp' || echo '$(srcdir)/'`../filter/hq2x.cpp hq2x.obj: ../filter/hq2x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hq2x.obj -MD -MP -MF $(DEPDIR)/hq2x.Tpo -c -o hq2x.obj `if test -f '../filter/hq2x.cpp'; then $(CYGPATH_W) '../filter/hq2x.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/hq2x.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hq2x.Tpo $(DEPDIR)/hq2x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/hq2x.cpp' object='hq2x.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hq2x.obj `if test -f '../filter/hq2x.cpp'; then $(CYGPATH_W) '../filter/hq2x.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/hq2x.cpp'; fi` hq4x.o: ../filter/hq4x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hq4x.o -MD -MP -MF $(DEPDIR)/hq4x.Tpo -c -o hq4x.o `test -f '../filter/hq4x.cpp' || echo '$(srcdir)/'`../filter/hq4x.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hq4x.Tpo $(DEPDIR)/hq4x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/hq4x.cpp' object='hq4x.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hq4x.o `test -f '../filter/hq4x.cpp' || echo '$(srcdir)/'`../filter/hq4x.cpp hq4x.obj: ../filter/hq4x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hq4x.obj -MD -MP -MF $(DEPDIR)/hq4x.Tpo -c -o hq4x.obj `if test -f '../filter/hq4x.cpp'; then $(CYGPATH_W) '../filter/hq4x.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/hq4x.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hq4x.Tpo $(DEPDIR)/hq4x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/hq4x.cpp' object='hq4x.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hq4x.obj `if test -f '../filter/hq4x.cpp'; then $(CYGPATH_W) '../filter/hq4x.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/hq4x.cpp'; fi` 2xsai.o: ../filter/2xsai.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT 2xsai.o -MD -MP -MF $(DEPDIR)/2xsai.Tpo -c -o 2xsai.o `test -f '../filter/2xsai.cpp' || echo '$(srcdir)/'`../filter/2xsai.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/2xsai.Tpo $(DEPDIR)/2xsai.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/2xsai.cpp' object='2xsai.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o 2xsai.o `test -f '../filter/2xsai.cpp' || echo '$(srcdir)/'`../filter/2xsai.cpp 2xsai.obj: ../filter/2xsai.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT 2xsai.obj -MD -MP -MF $(DEPDIR)/2xsai.Tpo -c -o 2xsai.obj `if test -f '../filter/2xsai.cpp'; then $(CYGPATH_W) '../filter/2xsai.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/2xsai.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/2xsai.Tpo $(DEPDIR)/2xsai.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/2xsai.cpp' object='2xsai.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o 2xsai.obj `if test -f '../filter/2xsai.cpp'; then $(CYGPATH_W) '../filter/2xsai.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/2xsai.cpp'; fi` bilinear.o: ../filter/bilinear.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bilinear.o -MD -MP -MF $(DEPDIR)/bilinear.Tpo -c -o bilinear.o `test -f '../filter/bilinear.cpp' || echo '$(srcdir)/'`../filter/bilinear.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/bilinear.Tpo $(DEPDIR)/bilinear.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/bilinear.cpp' object='bilinear.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bilinear.o `test -f '../filter/bilinear.cpp' || echo '$(srcdir)/'`../filter/bilinear.cpp bilinear.obj: ../filter/bilinear.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bilinear.obj -MD -MP -MF $(DEPDIR)/bilinear.Tpo -c -o bilinear.obj `if test -f '../filter/bilinear.cpp'; then $(CYGPATH_W) '../filter/bilinear.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/bilinear.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/bilinear.Tpo $(DEPDIR)/bilinear.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/bilinear.cpp' object='bilinear.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bilinear.obj `if test -f '../filter/bilinear.cpp'; then $(CYGPATH_W) '../filter/bilinear.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/bilinear.cpp'; fi` epx.o: ../filter/epx.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT epx.o -MD -MP -MF $(DEPDIR)/epx.Tpo -c -o epx.o `test -f '../filter/epx.cpp' || echo '$(srcdir)/'`../filter/epx.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/epx.Tpo $(DEPDIR)/epx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/epx.cpp' object='epx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o epx.o `test -f '../filter/epx.cpp' || echo '$(srcdir)/'`../filter/epx.cpp epx.obj: ../filter/epx.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT epx.obj -MD -MP -MF $(DEPDIR)/epx.Tpo -c -o epx.obj `if test -f '../filter/epx.cpp'; then $(CYGPATH_W) '../filter/epx.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/epx.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/epx.Tpo $(DEPDIR)/epx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/epx.cpp' object='epx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o epx.obj `if test -f '../filter/epx.cpp'; then $(CYGPATH_W) '../filter/epx.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/epx.cpp'; fi` lq2x.o: ../filter/lq2x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lq2x.o -MD -MP -MF $(DEPDIR)/lq2x.Tpo -c -o lq2x.o `test -f '../filter/lq2x.cpp' || echo '$(srcdir)/'`../filter/lq2x.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/lq2x.Tpo $(DEPDIR)/lq2x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/lq2x.cpp' object='lq2x.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lq2x.o `test -f '../filter/lq2x.cpp' || echo '$(srcdir)/'`../filter/lq2x.cpp lq2x.obj: ../filter/lq2x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lq2x.obj -MD -MP -MF $(DEPDIR)/lq2x.Tpo -c -o lq2x.obj `if test -f '../filter/lq2x.cpp'; then $(CYGPATH_W) '../filter/lq2x.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/lq2x.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/lq2x.Tpo $(DEPDIR)/lq2x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/lq2x.cpp' object='lq2x.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lq2x.obj `if test -f '../filter/lq2x.cpp'; then $(CYGPATH_W) '../filter/lq2x.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/lq2x.cpp'; fi` scanline.o: ../filter/scanline.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scanline.o -MD -MP -MF $(DEPDIR)/scanline.Tpo -c -o scanline.o `test -f '../filter/scanline.cpp' || echo '$(srcdir)/'`../filter/scanline.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/scanline.Tpo $(DEPDIR)/scanline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/scanline.cpp' object='scanline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scanline.o `test -f '../filter/scanline.cpp' || echo '$(srcdir)/'`../filter/scanline.cpp scanline.obj: ../filter/scanline.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scanline.obj -MD -MP -MF $(DEPDIR)/scanline.Tpo -c -o scanline.obj `if test -f '../filter/scanline.cpp'; then $(CYGPATH_W) '../filter/scanline.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/scanline.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/scanline.Tpo $(DEPDIR)/scanline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/scanline.cpp' object='scanline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scanline.obj `if test -f '../filter/scanline.cpp'; then $(CYGPATH_W) '../filter/scanline.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/scanline.cpp'; fi` videofilter.o: ../filter/videofilter.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT videofilter.o -MD -MP -MF $(DEPDIR)/videofilter.Tpo -c -o videofilter.o `test -f '../filter/videofilter.cpp' || echo '$(srcdir)/'`../filter/videofilter.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/videofilter.Tpo $(DEPDIR)/videofilter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/videofilter.cpp' object='videofilter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o videofilter.o `test -f '../filter/videofilter.cpp' || echo '$(srcdir)/'`../filter/videofilter.cpp videofilter.obj: ../filter/videofilter.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT videofilter.obj -MD -MP -MF $(DEPDIR)/videofilter.Tpo -c -o videofilter.obj `if test -f '../filter/videofilter.cpp'; then $(CYGPATH_W) '../filter/videofilter.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/videofilter.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/videofilter.Tpo $(DEPDIR)/videofilter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../filter/videofilter.cpp' object='videofilter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o videofilter.obj `if test -f '../filter/videofilter.cpp'; then $(CYGPATH_W) '../filter/videofilter.cpp'; else $(CYGPATH_W) '$(srcdir)/../filter/videofilter.cpp'; fi` install-ApplicationsDATA: $(Applications_DATA) @$(NORMAL_INSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(Applicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(Applicationsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(Applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(Applicationsdir)" || exit $$?; \ done uninstall-ApplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(Applicationsdir)'; $(am__uninstall_files_from_dir) install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \ done uninstall-pixmapDATA: @$(NORMAL_UNINSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(Applicationsdir)" "$(DESTDIR)$(pixmapdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-ApplicationsDATA install-pixmapDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-ApplicationsDATA uninstall-binPROGRAMS \ uninstall-pixmapDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-data-am install-strip tags-recursive \ uninstall-am .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install \ install-ApplicationsDATA install-am install-binPROGRAMS \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pixmapDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-ApplicationsDATA uninstall-am \ uninstall-binPROGRAMS uninstall-hook uninstall-pixmapDATA install-data-hook: $(UPDATE_DESKTOP) uninstall-hook: $(UPDATE_DESKTOP) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/gtk/tools/0000755000175000017500000000000012140305320016424 5ustar guillaumeguillaumedesmume-0.9.9/src/gtk/tools/ioregsView.h0000644000175000017500000000167212140260632020734 0ustar guillaumeguillaume/* ioregsview.h - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __IOREGSVIEW_H__ #define __IOREGSVIEW_H__ #include "../dTool.h" extern dTool_t dTool_ioregsView; #endif /*__IOREGSVIEW_H__*/ desmume-0.9.9/src/gtk/tools/ioregsView.cpp0000644000175000017500000003572012140260632021270 0ustar guillaumeguillaume/* ioregsView.cpp - this file is part of DeSmuME * * Copyright (C) 2006 Thoduv * Copyright (C) 2006,2007 DeSmuME Team * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "../dTool.h" #include "../MMU.h" #undef GPOINTER_TO_INT #define GPOINTER_TO_INT(p) ((gint) (glong) (p)) #define SHORTNAME "ioregs" #define TOOL_NAME "IO regs view" #if !GTK_CHECK_VERSION(2,24,0) #define gtk_combo_box_text_new gtk_combo_box_new_text #define gtk_combo_box_text_append_text gtk_combo_box_append_text #define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX #endif BOOL CPUS [2] = {TRUE, TRUE}; static GtkWidget *mWin[2]; static GtkWidget *mVbox0[2]; static GtkWidget *mIoRegCombo[2]; static GtkWidget *mRegInfos[2]; typedef void (*reg_dispFn)(int c); typedef u32 (*reg_valFn)(int c); typedef struct { char name[64]; u32 adress; int size; reg_dispFn create; reg_dispFn update; reg_dispFn destroy; reg_valFn value; } reg_t; static reg_t *current_reg[2] = {NULL, NULL}; #define REGFN_BEGIN(reg) \ GtkWidget **_wl_ = Widgets_##reg [c]; #define BIT_CHECK(w, n, s) { \ char _bit_check_buf[64]; \ snprintf(_bit_check_buf, ARRAY_SIZE(_bit_check_buf), "Bit %d: %s", n,s); \ _wl_[w] = gtk_check_button_new_with_label(_bit_check_buf ); \ gtk_box_pack_start(GTK_BOX(mVbox0[c]), _wl_[w], FALSE, FALSE, 0); } #define BIT_COMBO(w,n,s) { \ _wl_[w] = gtk_hbox_new(FALSE, 0); \ gtk_box_pack_start(GTK_BOX(mVbox0[c]), _wl_[w], FALSE, FALSE, 0); } \ char _bit_combo_buf[64]; \ snprintf(_bit_combo_buf, ARRAY_SIZE(_bit_combo_buf), "Bits %s: %s", n,s); \ GtkWidget *__combo_lbl_tmp = gtk_label_new(_bit_combo_buf); \ GtkWidget *__combo_tmp = gtk_combo_box_text_new(); \ #define BIT_COMBO_ADD(w, s) { \ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(__combo_tmp), s); } #define BIT_COMBO_GET(w) (GTK_WIDGET(g_list_first(gtk_container_get_children(GTK_CONTAINER(_wl_[w])))->data)) #define BIT_COMBO_END(w) \ gtk_box_pack_start(GTK_BOX(_wl_[w]), __combo_tmp, FALSE, FALSE, 0); \ gtk_box_pack_start(GTK_BOX(_wl_[w]), __combo_lbl_tmp, FALSE, FALSE, 0); #define CREA_END() \ gtk_widget_show_all(mWin[c]); /////////////////////////////// REG_IME /////////////////////////////// static GtkWidget *Widgets_REG_IME[2][1]; static void crea_REG_IME(int c) { REGFN_BEGIN(REG_IME); BIT_CHECK(0, 0, "Master interrupt enable"); CREA_END(); } static void updt_REG_IME(int c) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_REG_IME[c][0]), MMU.reg_IME[c] ? 1 : 0); } static void dest_REG_IME(int c) { gtk_widget_destroy(Widgets_REG_IME[c][0]); } static u32 val_REG_IME(int c) { return MMU.reg_IME[c]; } /////////////////////////////// REG_IE /////////////////////////////// static const char *interrupt_strings[25] = { "LCD VBlank", // 0 "LCD HBlank", // 1 "LCD VCount", // 2 "Timer0 overflow", // 3 "Timer1 overflow", "Timer2 overflow", "Timer3 overflow", "Serial communication (RTC)", // 7 "DMA0", // 8 "DMA1", "DMA2", "DMA3", "Keypad", // 12 "Game Pak (GBA slot)", // 13 "", // 14 "", // 15 "IPC Sync", // 16 "IPC Send FIFO empty", // 17 "IPC Recv FIFO not empty", // 18 "Card Data Transfer Completion (DS-card slot)", // 19 "Card IREQ_MC (DS-card slot)", // 20 "Geometry (3D) command FIFO", // 21 "Screens unfolding", // 22 "SPI bus", // 23 "Wifi" // 24 }; #define INTERRUPT_SKIP(c) if(i == 14 || i == 15 || (c == 0 && (i == 7 || i == 22 || i == 23 || i == 24)) || (c == 1 && i == 21))continue; static GtkWidget *Widgets_REG_IE[2][32]; static void crea_REG_IE(int c) { REGFN_BEGIN(REG_IE); int i; for(i = 0; i < 24; i++) { INTERRUPT_SKIP(c); BIT_CHECK(i, i, interrupt_strings[i]); } CREA_END(); } static void updt_REG_IE(int c) { int i; for(i = 0; i < 24; i++) { INTERRUPT_SKIP(c); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_REG_IE[c][i]), (MMU.reg_IE[c] & (1<():MMU.gen_IF<1>()) & (1<():MMU.gen_IF<1>()); } /////////////////////////////// REG_IPCFIFOCNT /////////////////////////////// static const char *fifocnt_strings[] = { "Send FIFO empty", "Send FIFO full", "Send FIFO empty IRQ", "Send FIFO clear (flush)", "","","","", "Receive FIFO empty", "Receive FIFO full", "Receive FIFO not empty IRQ", "","","", "Error (read when empty/write when full)", "Enable FIFOs" }; #define FIFOCNT_SKIP(c) if(i==4||i==5||i==6||i==11||i==12||i==13)continue; static GtkWidget *Widgets_REG_IPCFIFOCNT[2][16]; static void crea_REG_IPCFIFOCNT(int c) { REGFN_BEGIN(REG_IPCFIFOCNT); int i; for(i = 0; i < 16; i++) { FIFOCNT_SKIP(c); BIT_CHECK(i, i, fifocnt_strings[i]); } CREA_END(); } static void updt_REG_IPCFIFOCNT(int c) { int i; for(i = 0; i < 16; i++) { FIFOCNT_SKIP(c); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_REG_IPCFIFOCNT[c][i]), (((u16 *)(MMU.MMU_MEM[c][0x40]))[0x184>>1]&(1<>1]; } /////////////////////////////// POWER_CR /////////////////////////////// static const char *powercr9_strings[] = { "Enable LCD", "2D A engine", "3D render engine", "3D geometry engine (matrix)", "", "", "", "", "", "2D B engine", "", "", "", "", "", "Swap LCD" }; static const char *powercr7_strings[] = { "Sound speakers", "Wifi system" }; #define POWER_CR_SKIP(c) if(i==4||i==5||i==6||i==7||i==8||i==10||i==11||i==12||i==13||i==14)continue; #define POWER_CR_SIZE(c) ((c==0)?16:2) static GtkWidget *Widgets_POWER_CR[2][16]; static void crea_POWER_CR(int c) { REGFN_BEGIN(POWER_CR); int i; for(i = 0; i < POWER_CR_SIZE(c); i++) { POWER_CR_SKIP(c); BIT_CHECK(i, i, (c==0?powercr9_strings:powercr7_strings)[i]); } CREA_END(); } static void updt_POWER_CR(int c) { int i; for(i = 0; i < POWER_CR_SIZE(c); i++) { POWER_CR_SKIP(c); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_POWER_CR[c][i]), (((u16 *)(MMU.MMU_MEM[c][0x40]))[0x304>>1]&(1<>1]; } /////////////////////////////// REG_SPICNT /////////////////////////////// static const char *spicnt_strings[16] = { "Baudrate", "","","","","","", "Busy flag", "Device", "", "Transfer size", "Chipselect Hold", "Unknown", "Unknown", "Interrupt request", "Enable SPI bus", }; // 0-1 Baudrate (0=4MHz/Firmware, 1=2MHz/Touchscr, 2=1MHz/Powerman., 3=512KHz) // 2-6 Not used (Zero) // 7 Busy Flag (0=Ready, 1=Busy) (presumably Read-only) // 8-9 Device Select (0=Powerman., 1=Firmware, 2=Touchscr, 3=Reserved) // 10 Transfer Size (0=8bit, 1=16bit) // 11 Chipselect Hold (0=Deselect after transfer, 1=Keep selected) // 12 Unknown (usually 0) (set equal to Bit11 when BIOS accesses firmware) // 13 Unknown (usually 0) (set to 1 when BIOS accesses firmware) // 14 Interrupt Request (0=Disable, 1=Enable) // 15 SPI Bus Enable (0=Disable, 1=Enable) #define REG_SPICNT_SKIP(c) if(i==1||i==2||i==3||i==4||i==5||i==6||i==9)continue; #define REG_SPICNT_ISCHECK(c) (i==7||i==11||i==14||i==15||i==12||i==13) static GtkWidget *Widgets_REG_SPICNT[2][16]; static void crea_REG_SPICNT(int c) { REGFN_BEGIN(REG_SPICNT); int i; for(i = 0; i < 16; i++) { REG_SPICNT_SKIP(c); if(REG_SPICNT_ISCHECK(c)) { BIT_CHECK(i, i, spicnt_strings[i]); } else if(i == 0) { BIT_COMBO(i, "0-1", spicnt_strings[0]); BIT_COMBO_ADD(i, "0= 4Mhz"); BIT_COMBO_ADD(i, "1= 2Mhz"); BIT_COMBO_ADD(i, "2= 1Mhz"); BIT_COMBO_ADD(i, "3= 512Khz"); BIT_COMBO_END(i); } else if(i == 8) { BIT_COMBO(i, "8-9", spicnt_strings[8]); BIT_COMBO_ADD(i, "0= Power management device"); BIT_COMBO_ADD(i, "1= Firmware"); BIT_COMBO_ADD(i, "2= Touchscreen/Microphone"); BIT_COMBO_ADD(i, "3= Reserved/Prohibited"); BIT_COMBO_END(i); } else if(i == 10) { BIT_COMBO(i, "10", spicnt_strings[10]); BIT_COMBO_ADD(i, "0= 8 bits"); BIT_COMBO_ADD(i, "1= 16 bits"); BIT_COMBO_END(i); } } CREA_END(); } static u32 val_REG_SPICNT(int c) { return ((u16 *)(MMU.MMU_MEM[c][0x40]))[0x1C0>>1]; } static void updt_REG_SPICNT(int c) { REGFN_BEGIN(REG_SPICNT); u16 val = val_REG_SPICNT(c); int i; for(i = 0; i < 16; i++) { REG_SPICNT_SKIP(c); if(REG_SPICNT_ISCHECK(c)) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Widgets_REG_SPICNT[c][i]), (((u16 *)(MMU.MMU_MEM[c][0x40]))[0x1C0>>1]&(1<>8)&3); } else if(i == 10) { gtk_combo_box_set_active(GTK_COMBO_BOX(BIT_COMBO_GET(i)) , (val>>10)&1); } } } static void dest_REG_SPICNT(int c) { int i; for(i = 0; i < 16; i++) { REG_SPICNT_SKIP(c); gtk_widget_destroy(Widgets_REG_SPICNT[c][i]); } } /////////////////////////////// LIST /////////////////////////////// #define BITS_8 1 #define BITS_16 2 #define BITS_32 4 static const char *bits_strings[5] = {"0", "8", "16", "24", "32"}; #define REG_STR(r, s) {#r, r, s, &crea_##r, &updt_##r, &dest_##r, &val_##r} #define REG_FNS(r) &crea_##r, &updt_##r, &dest_##r, &val_##r //////// ARM9 //////// #define REG_LIST_SIZE_ARM9 5 static const reg_t regs_list_9[] = { {"REG_IME", REG_IME, BITS_16, REG_FNS(REG_IME)}, {"REG_IE", REG_IE, BITS_32, REG_FNS(REG_IE)}, {"REG_IF", REG_IF, BITS_32, REG_FNS(REG_IF)}, {"REG_IPCFIFOCNT", 0x04000184, BITS_16, REG_FNS(REG_IPCFIFOCNT)}, {"POWER_CR", REG_POWCNT1, BITS_16, REG_FNS(POWER_CR)} }; //////// ARM7 //////// #define REG_LIST_SIZE_ARM7 6 static const reg_t regs_list_7[] = { {"REG_IME", REG_IME, BITS_16, REG_FNS(REG_IME)}, {"REG_IE", REG_IE, BITS_32, REG_FNS(REG_IE)}, {"REG_IF", REG_IF, BITS_32, REG_FNS(REG_IF)}, {"REG_IPCFIFOCNT", 0x04000184, BITS_16, REG_FNS(REG_IPCFIFOCNT)}, {"POWER_CR", REG_POWCNT1, BITS_16, REG_FNS(POWER_CR)}, {"REG_SPICNT", REG_SPICNT, BITS_16, REG_FNS(REG_SPICNT)} }; #define GET_REG_LIST_SIZE(i) ((i==0)?REG_LIST_SIZE_ARM9:REG_LIST_SIZE_ARM7) #define GET_REG_LIST(i) ((i==0)?regs_list_9:regs_list_7) static void _clearContainer(GtkWidget *widget, gpointer data) { if(widget == mRegInfos[0] || widget == mRegInfos[1]) return; if(widget == mIoRegCombo[0] || widget == mIoRegCombo[1]) return; gtk_container_remove(GTK_CONTAINER((GtkWidget*)data), widget); // gtk_widget_destroy(widget); // gtk_object_destroy(GTK_OBJECT(widget)); } static void selected_reg(GtkWidget* widget, gpointer data) { int c = GPOINTER_TO_INT(data); gchar *regInfosBuffer; guint active = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); if(current_reg[c]) current_reg[c]->destroy(c); gtk_container_foreach(GTK_CONTAINER(mVbox0[c]), _clearContainer, (gpointer)mVbox0[c]); current_reg[c] = (reg_t*)&(GET_REG_LIST(c)[active]); // gtk_box_pack_start(GTK_BOX(mVbox0[c]), mIoRegCombo[c], FALSE, FALSE, 0); switch (current_reg[c]->size) { case BITS_8: regInfosBuffer = g_strdup_printf("0x%02X", current_reg[c]->value(c)); break; case BITS_16: regInfosBuffer = g_strdup_printf("0x%04X", current_reg[c]->value(c)); break; default: regInfosBuffer = g_strdup_printf("0x%08X", current_reg[c]->value(c)); } // gtk_box_pack_start(GTK_BOX(mVbox0[c]), mRegInfos[c], FALSE, FALSE, 0); gtk_label_set_label(GTK_LABEL(mRegInfos[c]), regInfosBuffer); g_free(regInfosBuffer); current_reg[c]->create(c); current_reg[c]->update(c); } /////////////////////////////// TOOL /////////////////////////////// static int DTOOL_ID; static void close() { memset(current_reg, 0, sizeof(current_reg)); dTool_CloseCallback(DTOOL_ID); } static void _closeOne(GtkWidget *widget, gpointer data) { int c = GPOINTER_TO_INT(data); CPUS[c] = FALSE; if(c == 0 && !CPUS[1]) close(); if(c == 1 && !CPUS[0]) close(); gtk_widget_destroy(mRegInfos[c]); gtk_widget_destroy(mIoRegCombo[c]); gtk_widget_destroy(mVbox0[c]); // gtk_widget_destroy(mWin[c]); } static void update() { int c; for(c = 0; c < 2; c++) { if(!CPUS[c]) continue; current_reg[c]->update(c); } } static void open(int ID) { int c, i; DTOOL_ID = ID; for(c = 0; c < 2; c++) { CPUS[c] = TRUE; mWin[c]= gtk_window_new(GTK_WINDOW_TOPLEVEL); if(c == 0) gtk_window_set_title(GTK_WINDOW(mWin[c]), TOOL_NAME " : ARM9"); else gtk_window_set_title(GTK_WINDOW(mWin[c]), TOOL_NAME " : ARM7"); g_signal_connect(G_OBJECT(mWin[c]), "destroy", G_CALLBACK(&_closeOne), GINT_TO_POINTER(c)); mVbox0[c] = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(mWin[c]), mVbox0[c]); mIoRegCombo[c] = gtk_combo_box_text_new(); mRegInfos[c] = gtk_label_new(""); for(i = 0; i < GET_REG_LIST_SIZE(c); i++) { gchar *reg_name_buffer; reg_name_buffer = g_strdup_printf("0x%08X : %s (%s)", GET_REG_LIST(c)[i].adress, GET_REG_LIST(c)[i].name, bits_strings[GET_REG_LIST(c)[i].size]); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mIoRegCombo[c]), reg_name_buffer); g_free(reg_name_buffer); } gtk_combo_box_set_active(GTK_COMBO_BOX(mIoRegCombo[c]), 0); g_signal_connect(G_OBJECT(mIoRegCombo[c]), "changed", G_CALLBACK(selected_reg), GINT_TO_POINTER(c)); gtk_box_pack_start(GTK_BOX(mVbox0[c]), mIoRegCombo[c], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(mVbox0[c]), mRegInfos[c], FALSE, FALSE, 0); selected_reg(mIoRegCombo[c], GINT_TO_POINTER(c)); gtk_widget_show_all(mWin[c]); } } /////////////////////////////// TOOL DEFINITION /////////////////////////////// dTool_t dTool_ioregsView = { SHORTNAME, TOOL_NAME, &open, &update, &close }; desmume-0.9.9/src/gtk/dTool.h0000644000175000017500000000072712140260633016533 0ustar guillaumeguillaume#ifndef __DTOOL_H__ #define __DTOOL_H__ #include "../types.h" #include "../registers.h" typedef void (*dTool_openFn)(int id); typedef void (*dTool_updateFn)(); typedef void (*dTool_closeFn)(); typedef struct { /* this should be the same name of the action in the gui xml */ const char shortname[16]; const char name[32]; dTool_openFn open; dTool_updateFn update; dTool_closeFn close; } dTool_t; extern void dTool_CloseCallback(int id); #endif /*__DTOOL_H__*/ desmume-0.9.9/src/gtk/cheatsGTK.h0000644000175000017500000000171312140260633017263 0ustar guillaumeguillaume/* cheatsGtk.h - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __CHEATS_H__ #define __CHEATS_H__ void CheatSearch (); void CheatList (); #endif /*__CHEATS_H__*/ desmume-0.9.9/src/path.cpp0000644000175000017500000000711612140261633016154 0ustar guillaumeguillaume/* Copyright (C) 2009-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "types.h" #include "path.h" #include //----------------------------------- //This is taken from mono Path.cs static const char InvalidPathChars[] = { '\x22', '\x3C', '\x3E', '\x7C', '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F' }; //but it is sort of windows-specific. Does it work in linux? Maybe we'll have to make it smarter static const char VolumeSeparatorChar = ':'; static const char AltDirectorySeparatorChar = '/'; static bool dirEqualsVolume = (DIRECTORY_DELIMITER_CHAR == VolumeSeparatorChar); bool Path::IsPathRooted (const std::string &path) { if (path.empty()) { return false; } if (path.find_first_of(InvalidPathChars) != std::string::npos) { return false; } char c = path[0]; return (c == DIRECTORY_DELIMITER_CHAR || c == AltDirectorySeparatorChar || (!dirEqualsVolume && path.size() > 1 && path[1] == VolumeSeparatorChar)); } std::string Path::GetFileDirectoryPath(std::string filePath) { if (filePath.empty()) { return ""; } size_t i = filePath.find_last_of(DIRECTORY_DELIMITER_CHAR); if (i == std::string::npos) { return filePath; } return filePath.substr(0, i); } std::string Path::GetFileNameFromPath(std::string filePath) { if (filePath.empty()) { return ""; } size_t i = filePath.find_last_of(DIRECTORY_DELIMITER_CHAR); if (i == std::string::npos) { return filePath; } return filePath.substr(i + 1); } std::string Path::GetFileNameWithoutExt(std::string fileName) { if (fileName.empty()) { return ""; } size_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR); if (i == std::string::npos) { return fileName; } return fileName.substr(0, i); } std::string Path::GetFileNameFromPathWithoutExt(std::string filePath) { if (filePath.empty()) { return ""; } std::string fileName = GetFileNameFromPath(filePath); return GetFileNameWithoutExt(fileName); } std::string Path::GetFileExt(std::string fileName) { if (fileName.empty()) { return ""; } size_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR); if (i == std::string::npos) { return fileName; } return fileName.substr(i + 1); } //----------------------------------- #ifdef _WINDOWS void FCEUD_MakePathDirs(const char *fname) { char path[MAX_PATH]; const char* div = fname; do { const char* fptr = strchr(div, '\\'); if(!fptr) { fptr = strchr(div, '/'); } if(!fptr) { break; } int off = fptr - fname; strncpy(path, fname, off); path[off] = '\0'; mkdir(path); div = fptr + 1; while(div[0] == '\\' || div[0] == '/') { div++; } } while(1); } #endif //------------------------------desmume-0.9.9/src/cli/0000755000175000017500000000000012140305320015246 5ustar guillaumeguillaumedesmume-0.9.9/src/cli/doc/0000755000175000017500000000000012140305320016013 5ustar guillaumeguillaumedesmume-0.9.9/src/cli/doc/Makefile.am0000644000175000017500000000003612140261632020055 0ustar guillaumeguillaumedist_man_MANS = desmume-cli.1 desmume-0.9.9/src/cli/doc/Makefile.in0000644000175000017500000003720112140304537020074 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/cli/doc DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(dist_man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = desmume-cli.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cli/doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/cli/doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/cli/doc/desmume-cli.10000644000175000017500000000624112140261632020313 0ustar guillaumeguillaume.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH DESMUME 1 "June 26, 2007" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME desmume-cli \- Nintendo DS emulator .SH SYNOPSIS .B desmume-cli .RI [ options ] " files" ... .SH DESCRIPTION This manual page documents briefly the .B desmume-cli program .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBdesmume\fP is a Nintendo DS emulator running homebrew demos and commercial games. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-\-load-slot=NUM Loads savegame from slot NUM .TP .B \-\-disable-sound Disables the sound emulation .TP .B \-\-disable-limiter Disables the 60 fps limiter .TP .B \-\-3d-engine=ENGINE Select available 3d emulation: .RS 0 = 3d disabled .RE .RS 1 = internal desmume software rasterizer (default) .RE .TP .B \-\-opengl-2d Enables using OpenGL for screen rendering .TP .B \-\-soft-convert Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware. .TP .B \-\-arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port .TP .B \-\-arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port .TP .B \-\-save-type=TYPE Select savetype from the following: .RS 0 = Autodetect .RE .RS 1 = EEPROM 4kbit .RE .RS 2 = EEPROM 64kbit .RE .RS 3 = EEPROM 512kbit .RE .RS 4 = FRAM 256kbit .RE .RS 5 = FLASH 2mbit .RE .RS 6 = FLASH 4mbit .RE .TP .B \-\-fwlang=LANG Set the language in the firmware, LANG as follows: .RS 0 = Japanese .RE .RS 1 = English .RE .RS 2 = French .RE .RS 3 = German .RE .RS 4 = Italian .RE .RS 5 = Spanish .RE .TP .B \-\-cflash=PATH_TO_DISK_IMAGE Enable disk image GBAMP compact flash emulation .TP .B \-\-help Show summary of options. .TP .B \-\-version Show version of program. .PP Some options may be unavailable, depending on compile-time configuration, for instance gdb stubs and opengl. .SH INPUT Mouse cursor acts as stylus, mouse click replaces stylus touch. .PP Keyboard is configured as follows: .RS F1-F10 load savegame from slot 1-10 .RE .RS Shift+F1-F10 save game to slot 1-10 .RE .RS Non-keypad arrows act as d-pad .RE .RS z = A .RE .RS x = B .RE .RS a = Y .RE .RS s = X .RE .RS q = L .RE .RS w = R .RE .RS Enter = START .RE .RS Left Shift = SELECT .RE .SH AUTHOR desmume was written by DeSmuME team (http://sourceforge.net/projects/desmume). .PP This manual page was written by Pascal Giard , for the Debian project (but may be used by others). desmume-0.9.9/src/cli/Makefile.am0000644000175000017500000000075612140261632017321 0ustar guillaumeguillaumeSUBDIRS = doc include $(top_srcdir)/src/desmume.mk AM_CPPFLAGS += $(SDL_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) $(GLIB_CFLAGS) $(GTHREAD_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS) bin_PROGRAMS = desmume-cli desmume_cli_SOURCES = main.cpp ../sndsdl.cpp ../ctrlssdl.h ../ctrlssdl.cpp ../driver.h ../driver.cpp desmume_cli_LDADD = ../libdesmume.a $(SDL_LIBS) $(ALSA_LIBS) $(LIBAGG_LIBS) $(GLIB_LIBS) $(GTHREAD_LIBS) $(LIBSOUNDTOUCH_LIBS) if HAVE_GDB_STUB desmume_cli_LDADD += ../gdbstub/libgdbstub.a endif desmume-0.9.9/src/cli/main.cpp0000644000175000017500000004777112140261632016725 0ustar guillaumeguillaume/* main.c - this file is part of DeSmuME * * Copyright (C) 2006,2007 DeSmuME Team * Copyright (C) 2007 Pascal Giard (evilynux) * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include #ifndef VERSION #define VERSION "Unknown version" #endif /* * FIXME: Not sure how to detect OpenGL in a platform portable way. */ #ifdef HAVE_GL_GL_H #define INCLUDE_OPENGL_2D #endif #ifdef INCLUDE_OPENGL_2D #include #include #endif #ifndef CLI_UI #define CLI_UI #endif #include "MMU.h" #include "NDSSystem.h" #include "debug.h" #include "sndsdl.h" #include "ctrlssdl.h" #include "render3D.h" #include "rasterize.h" #include "saves.h" #include "firmware.h" #include "GPU_osd.h" #include "desmume_config.h" #include "commandline.h" #include "addons.h" #ifdef GDB_STUB #include "gdbstub.h" #endif volatile bool execute = false; static float nds_screen_size_ratio = 1.0f; #define DISPLAY_FPS #ifdef DISPLAY_FPS #define NUM_FRAMES_TO_TIME 60 #endif #define FPS_LIMITER_FPS 60 static SDL_Surface * surface; /* Flags to pass to SDL_SetVideoMode */ static int sdl_videoFlags; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDDummy, &SNDSDL, NULL }; GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize, NULL }; const char * save_type_names[] = { "Autodetect", "EEPROM 4kbit", "EEPROM 64kbit", "EEPROM 512kbit", "FRAM 256kbit", "FLASH 2mbit", "FLASH 4mbit", NULL }; /* Our keyboard config is different because of the directional keys */ /* Please note that m is used for fake microphone */ const u16 cli_kb_cfg[NB_KEYS] = { SDLK_x, // A SDLK_z, // B SDLK_RSHIFT, // select SDLK_RETURN, // start SDLK_RIGHT, // Right SDLK_LEFT, // Left SDLK_UP, // Up SDLK_DOWN, // Down SDLK_w, // R SDLK_q, // L SDLK_s, // X SDLK_a, // Y SDLK_p, // DEBUG SDLK_o // BOOST }; class configured_features : public CommandLine { public: int auto_pause; int frameskip; int engine_3d; int savetype; #ifdef INCLUDE_OPENGL_2D int opengl_2d; int soft_colour_convert; #endif int firmware_language; }; static void init_config( class configured_features *config) { config->auto_pause = 0; config->frameskip = 0; config->engine_3d = 1; config->savetype = 0; #ifdef INCLUDE_OPENGL_2D config->opengl_2d = 0; config->soft_colour_convert = 0; #endif /* use the default language */ config->firmware_language = -1; } static int fill_config( class configured_features *config, int argc, char ** argv) { GOptionEntry options[] = { { "auto-pause", 0, 0, G_OPTION_ARG_NONE, &config->auto_pause, "Pause emulation if focus is lost", NULL}, { "frameskip", 0, 0, G_OPTION_ARG_INT, &config->frameskip, "Set frameskip", "FRAMESKIP"}, { "3d-engine", 0, 0, G_OPTION_ARG_INT, &config->engine_3d, "Select 3d rendering engine. Available engines:\n" "\t\t\t\t\t\t 0 = 3d disabled\n" "\t\t\t\t\t\t 1 = internal rasterizer (default)\n" ,"ENGINE"}, { "save-type", 0, 0, G_OPTION_ARG_INT, &config->savetype, "Select savetype from the following:\n" "\t\t\t\t\t\t 0 = Autodetect (default)\n" "\t\t\t\t\t\t 1 = EEPROM 4kbit\n" "\t\t\t\t\t\t 2 = EEPROM 64kbit\n" "\t\t\t\t\t\t 3 = EEPROM 512kbit\n" "\t\t\t\t\t\t 4 = FRAM 256kbit\n" "\t\t\t\t\t\t 5 = FLASH 2mbit\n" "\t\t\t\t\t\t 6 = FLASH 4mbit\n", "SAVETYPE"}, #ifdef INCLUDE_OPENGL_2D { "opengl-2d", 0, 0, G_OPTION_ARG_NONE, &config->opengl_2d, "Enables using OpenGL for screen rendering", NULL}, { "soft-convert", 0, 0, G_OPTION_ARG_NONE, &config->soft_colour_convert, "Use software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware.", NULL}, #endif { "fwlang", 0, 0, G_OPTION_ARG_INT, &config->firmware_language, "Set the language in the firmware, LANG as follows:\n" "\t\t\t\t\t\t 0 = Japanese\n" "\t\t\t\t\t\t 1 = English\n" "\t\t\t\t\t\t 2 = French\n" "\t\t\t\t\t\t 3 = German\n" "\t\t\t\t\t\t 4 = Italian\n" "\t\t\t\t\t\t 5 = Spanish\n", "LANG"}, { NULL } }; config->loadCommonOptions(); g_option_context_add_main_entries (config->ctx, options, "options"); config->parse(argc,argv); if(!config->validate()) goto error; if (config->savetype < 0 || config->savetype > 6) { g_printerr("Accepted savetypes are from 0 to 6.\n"); return false; } if (config->firmware_language < -1 || config->firmware_language > 5) { g_printerr("Firmware language must be set to a value from 0 to 5.\n"); goto error; } if (config->engine_3d != 0 && config->engine_3d != 1) { g_printerr("Currently available engines: 0, 1.\n"); goto error; } if (config->frameskip < 0) { g_printerr("Frameskip must be >= 0.\n"); goto error; } if (config->nds_file == "") { g_printerr("Need to specify file to load.\n"); goto error; } #ifdef GDB_STUB if (config->arm9_gdb_port != 0 && (config->arm9_gdb_port < 1 || config->arm9_gdb_port > 65535)) { g_printerr("ARM9 GDB stub port must be in the range 1 to 65535\n"); goto error; } if (config->arm7_gdb_port != 0 && (config->arm7_gdb_port < 1 || config->arm7_gdb_port > 65535)) { g_printerr("ARM7 GDB stub port must be in the range 1 to 65535\n"); goto error; } #endif return 1; error: config->errorHelp(argv[0]); return 0; } /* * The thread handling functions needed by the GDB stub code. */ #ifdef GDB_STUB void * createThread_gdb( void (*thread_function)( void *data), void *thread_data) { SDL_Thread *new_thread = SDL_CreateThread( (int (*)(void *data))thread_function, thread_data); return new_thread; } void joinThread_gdb( void *thread_handle) { int ignore; SDL_WaitThread( (SDL_Thread*)thread_handle, &ignore); } #endif #ifdef INCLUDE_OPENGL_2D /* initialization openGL function */ static int initGL( GLuint *screen_texture) { GLenum errCode; u16 blank_texture[256 * 512]; memset(blank_texture, 0x001f, sizeof(blank_texture)); /* Enable Texture Mapping */ glEnable( GL_TEXTURE_2D ); /* Set the background black */ glClearColor( 0.0f, 0.0f, 0.0f, 0.5f ); /* Depth buffer setup */ glClearDepth( 1.0f ); /* Enables Depth Testing */ glEnable( GL_DEPTH_TEST ); /* The Type Of Depth Test To Do */ glDepthFunc( GL_LEQUAL ); /* Create The Texture */ glGenTextures( 1, &screen_texture[0]); glBindTexture( GL_TEXTURE_2D, screen_texture[0]); /* Generate The Texture */ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 256, 512, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, blank_texture); /* Linear Filtering */ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); if ((errCode = glGetError()) != GL_NO_ERROR) { const GLubyte *errString; errString = gluErrorString(errCode); fprintf( stderr, "Failed to init GL: %s\n", errString); return 0; } return 1; } static void resizeWindow( u16 width, u16 height, GLuint *screen_texture) { int comp_width = 3 * width; int comp_height = 2 * height; GLenum errCode; surface = SDL_SetVideoMode(width, height, 32, sdl_videoFlags); initGL(screen_texture); #ifdef HAVE_LIBAGG Hud.reset(); #endif if ( comp_width > comp_height) { width = 2*height/3; } height = 3*width/2; nds_screen_size_ratio = 256.0 / (double)width; /* Setup our viewport. */ glViewport( 0, 0, ( GLint )width, ( GLint )height ); /* * change to the projection matrix and set * our viewing volume. */ glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); gluOrtho2D( 0.0, 256.0, 384.0, 0.0); /* Make sure we're chaning the model view and not the projection */ glMatrixMode( GL_MODELVIEW ); /* Reset The View */ glLoadIdentity( ); if ((errCode = glGetError()) != GL_NO_ERROR) { const GLubyte *errString; errString = gluErrorString(errCode); fprintf( stderr, "GL resize failed: %s\n", errString); } } static void opengl_Draw( GLuint *texture, int software_convert) { GLenum errCode; /* Clear The Screen And The Depth Buffer */ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); /* Move Into The Screen 5 Units */ glLoadIdentity( ); /* Select screen Texture */ glBindTexture( GL_TEXTURE_2D, texture[0]); if ( software_convert) { int i; u8 converted[256 * 384 * 3]; for ( i = 0; i < (256 * 384); i++) { converted[(i * 3) + 0] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 0) & 0x1f) << 3; converted[(i * 3) + 1] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 5) & 0x1f) << 3; converted[(i * 3) + 2] = ((*((u16 *)&GPU_screen[(i<<1)]) >> 10) & 0x1f) << 3; } glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 384, GL_RGB, GL_UNSIGNED_BYTE, converted); } else { glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 384, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, &GPU_screen); } if ((errCode = glGetError()) != GL_NO_ERROR) { const GLubyte *errString; errString = gluErrorString(errCode); fprintf( stderr, "GL subimage failed: %s\n", errString); } /* Draw the screen as a textured quad */ glBegin( GL_QUADS); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 0.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 256.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 0.75f ); glVertex3f( 256.0f, 384.0f, 0.0f ); glTexCoord2f( 0.0f, 0.75f ); glVertex3f( 0.0f, 384.0f, 0.0f ); glEnd( ); if ((errCode = glGetError()) != GL_NO_ERROR) { const GLubyte *errString; errString = gluErrorString(errCode); fprintf( stderr, "GL draw failed: %s\n", errString); } /* Draw it to the screen */ SDL_GL_SwapBuffers( ); } #endif /* this is a stub for resizeWindow_stub in the case of no gl headers or no opengl 2d */ #ifdef INCLUDE_OPENGL_2D static void resizeWindow_stub (u16 width, u16 height, GLuint *screen_texture) { } #else static void resizeWindow_stub (u16 width, u16 height, void *screen_texture) { } #endif static void Draw( void) { SDL_Surface *rawImage; rawImage = SDL_CreateRGBSurfaceFrom((void*)&GPU_screen, 256, 384, 16, 512, 0x001F, 0x03E0, 0x7C00, 0); if(rawImage == NULL) return; SDL_BlitSurface(rawImage, 0, surface, 0); SDL_UpdateRect(surface, 0, 0, 0, 0); SDL_FreeSurface(rawImage); return; } static void desmume_cycle(struct ctrls_event_config * cfg) { SDL_Event event; cfg->nds_screen_size_ratio = nds_screen_size_ratio; /* Look for queued events and update keypad status */ /* IMPORTANT: Reenable joystick events iif needed. */ if(SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE) SDL_JoystickEventState(SDL_ENABLE); /* There's an event waiting to be processed? */ while ( !cfg->sdl_quit && (SDL_PollEvent(&event) || (!cfg->focused && SDL_WaitEvent(&event)))) { process_ctrls_event( event, cfg); } /* Update mouse position and click */ if(mouse.down) NDS_setTouchPos(mouse.x, mouse.y); if(mouse.click) { NDS_releaseTouch(); mouse.click = FALSE; } update_keypad(cfg->keypad); /* Update keypad */ NDS_exec(); SPU_Emulate_user(); } int main(int argc, char ** argv) { class configured_features my_config; struct ctrls_event_config ctrls_cfg; #ifdef GDB_STUB gdbstub_handle_t arm9_gdb_stub; gdbstub_handle_t arm7_gdb_stub; struct armcpu_memory_iface *arm9_memio = &arm9_base_memory_iface; struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface; struct armcpu_ctrl_iface *arm9_ctrl_iface; struct armcpu_ctrl_iface *arm7_ctrl_iface; #endif int limiter_frame_counter = 0; int limiter_tick0 = 0; int error; GKeyFile *keyfile; int now; #ifdef DISPLAY_FPS u32 fps_timing = 0; u32 fps_frame_counter = 0; u32 fps_previous_time = 0; #endif #ifdef INCLUDE_OPENGL_2D GLuint screen_texture[1]; #endif /* this holds some info about our display */ const SDL_VideoInfo *videoInfo; /* the firmware settings */ struct NDS_fw_config_data fw_config; /* default the firmware settings, they may get changed later */ NDS_FillDefaultFirmwareConfigData( &fw_config); init_config( &my_config); if ( !fill_config( &my_config, argc, argv)) { exit(1); } /* use any language set on the command line */ if ( my_config.firmware_language != -1) { fw_config.language = my_config.firmware_language; } /* addons */ my_config.process_addonCommands(); addon_type = NDS_ADDON_NONE; if (my_config.is_cflash_configured) addon_type = NDS_ADDON_CFLASH; if(my_config.gbaslot_rom != "") { addon_type = NDS_ADDON_GBAGAME; strncpy(GBAgameName, my_config.gbaslot_rom.c_str(), MAX_PATH); } switch (addon_type) { case NDS_ADDON_CFLASH: case NDS_ADDON_RUMBLEPAK: case NDS_ADDON_NONE: case NDS_ADDON_GBAGAME: break; default: addon_type = NDS_ADDON_NONE; break; } addonsChangePak (addon_type); if ( !g_thread_supported()) { g_thread_init( NULL); } driver = new UnixDriver(); #ifdef GDB_STUB if ( my_config.arm9_gdb_port != 0) { arm9_gdb_stub = createStub_gdb( my_config.arm9_gdb_port, &arm9_memio, &arm9_direct_memory_iface); if ( arm9_gdb_stub == NULL) { fprintf( stderr, "Failed to create ARM9 gdbstub on port %d\n", my_config.arm9_gdb_port); exit( 1); } } if ( my_config.arm7_gdb_port != 0) { arm7_gdb_stub = createStub_gdb( my_config.arm7_gdb_port, &arm7_memio, &arm7_base_memory_iface); if ( arm7_gdb_stub == NULL) { fprintf( stderr, "Failed to create ARM7 gdbstub on port %d\n", my_config.arm7_gdb_port); exit( 1); } } #endif #ifdef GDB_STUB NDS_Init( arm9_memio, &arm9_ctrl_iface, arm7_memio, &arm7_ctrl_iface); #else NDS_Init(); #endif /* Create the dummy firmware */ NDS_CreateDummyFirmware( &fw_config); if ( !my_config.disable_sound) { SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); } NDS_3D_ChangeCore(my_config.engine_3d); backup_setManualBackupType(my_config.savetype); error = NDS_LoadROM( my_config.nds_file.c_str() ); if (error < 0) { fprintf(stderr, "error while loading %s\n", my_config.nds_file.c_str()); exit(-1); } /* * Activate the GDB stubs * This has to come after the NDS_Init where the cpus are set up. */ #ifdef GDB_STUB if ( my_config.arm9_gdb_port != 0) { activateStub_gdb( arm9_gdb_stub, arm9_ctrl_iface); } if ( my_config.arm7_gdb_port != 0) { activateStub_gdb( arm7_gdb_stub, arm7_ctrl_iface); } #endif execute = true; if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { fprintf(stderr, "Error trying to initialize SDL: %s\n", SDL_GetError()); return 1; } SDL_WM_SetCaption("Desmume SDL", NULL); /* Fetch the video info */ videoInfo = SDL_GetVideoInfo( ); if ( !videoInfo ) { fprintf( stderr, "Video query failed: %s\n", SDL_GetError( ) ); exit( -1); } /* This checks if hardware blits can be done */ if ( videoInfo->blit_hw ) sdl_videoFlags |= SDL_HWACCEL; #ifdef INCLUDE_OPENGL_2D if ( my_config.opengl_2d) { /* the flags to pass to SDL_SetVideoMode */ sdl_videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ sdl_videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ sdl_videoFlags |= SDL_RESIZABLE; /* Enable window resizing */ /* This checks to see if surfaces can be stored in memory */ if ( videoInfo->hw_available ) sdl_videoFlags |= SDL_HWSURFACE; else sdl_videoFlags |= SDL_SWSURFACE; /* Sets up OpenGL double buffering */ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); surface = SDL_SetVideoMode( 256, 192 * 2, 32, sdl_videoFlags ); /* Verify there is a surface */ if ( !surface ) { fprintf( stderr, "Video mode set failed: %s\n", SDL_GetError( ) ); exit( -1); } /* initialize OpenGL */ if ( !initGL( screen_texture)) { fprintf( stderr, "Failed to init GL, fall back to software render\n"); my_config.opengl_2d = 0; } } if ( !my_config.opengl_2d) { #endif sdl_videoFlags |= SDL_SWSURFACE; surface = SDL_SetVideoMode(256, 384, 32, sdl_videoFlags); if ( !surface ) { fprintf( stderr, "Video mode set failed: %s\n", SDL_GetError( ) ); exit( -1); } #ifdef INCLUDE_OPENGL_2D } /* set the initial window size */ if ( my_config.opengl_2d) { resizeWindow( 256, 192*2, screen_texture); } #endif /* Initialize joysticks */ if(!init_joy()) return 1; /* Load keyboard and joystick configuration */ keyfile = desmume_config_read_file(cli_kb_cfg); desmume_config_dispose(keyfile); /* Since gtk has a different mapping the keys stop to work with the saved configuration :| */ load_default_config(cli_kb_cfg); if(my_config.load_slot != -1){ loadstate_slot(my_config.load_slot); } #ifdef HAVE_LIBAGG Desmume_InitOnce(); Hud.reset(); aggDraw.hud->attach(GPU_screen, 256, 384, 512); #endif ctrls_cfg.boost = 0; ctrls_cfg.sdl_quit = 0; ctrls_cfg.auto_pause = my_config.auto_pause; ctrls_cfg.focused = 1; ctrls_cfg.fake_mic = 0; ctrls_cfg.keypad = 0; #ifdef INCLUDE_OPENGL_2D ctrls_cfg.screen_texture = screen_texture; #else ctrls_cfg.screen_texture = NULL; #endif ctrls_cfg.resize_cb = &resizeWindow_stub; while(!ctrls_cfg.sdl_quit) { desmume_cycle(&ctrls_cfg); osd->update(); DrawHUD(); #ifdef INCLUDE_OPENGL_2D if ( my_config.opengl_2d) { opengl_Draw( screen_texture, my_config.soft_colour_convert); ctrls_cfg.resize_cb = &resizeWindow; } else #endif Draw(); osd->clear(); for ( int i = 0; i < my_config.frameskip; i++ ) { NDS_SkipNextFrame(); desmume_cycle(&ctrls_cfg); } #ifdef DISPLAY_FPS now = SDL_GetTicks(); #endif if ( !my_config.disable_limiter && !ctrls_cfg.boost) { #ifndef DISPLAY_FPS now = SDL_GetTicks(); #endif int delay = (limiter_tick0 + limiter_frame_counter*1000/FPS_LIMITER_FPS) - now; if (delay < -500 || delay > 100) { // reset if we fall too far behind don't want to run super fast until we catch up limiter_tick0 = now; limiter_frame_counter = 0; } else if (delay > 0) { SDL_Delay(delay); } } // always count frames, we'll mess up if the limiter gets turned on later otherwise limiter_frame_counter += 1 + my_config.frameskip; #ifdef DISPLAY_FPS fps_frame_counter += 1; fps_timing += now - fps_previous_time; fps_previous_time = now; if ( fps_frame_counter == NUM_FRAMES_TO_TIME) { char win_title[20]; float fps = NUM_FRAMES_TO_TIME * 1000.f / fps_timing; fps_frame_counter = 0; fps_timing = 0; snprintf( win_title, sizeof(win_title), "Desmume %f", fps); SDL_WM_SetCaption( win_title, NULL); } #endif } /* Unload joystick */ uninit_joy(); SDL_Quit(); NDS_DeInit(); #ifdef GDB_STUB if ( my_config.arm9_gdb_port != 0) { destroyStub_gdb( arm9_gdb_stub); } if ( my_config.arm7_gdb_port != 0) { destroyStub_gdb( arm7_gdb_stub); } #endif return 0; } desmume-0.9.9/src/cli/Makefile.in0000644000175000017500000007060712140304537017336 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk bin_PROGRAMS = desmume-cli$(EXEEXT) @HAVE_GDB_STUB_TRUE@am__append_1 = ../gdbstub/libgdbstub.a subdir = src/cli ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_desmume_cli_OBJECTS = main.$(OBJEXT) sndsdl.$(OBJEXT) \ ctrlssdl.$(OBJEXT) driver.$(OBJEXT) desmume_cli_OBJECTS = $(am_desmume_cli_OBJECTS) am__DEPENDENCIES_1 = desmume_cli_DEPENDENCIES = ../libdesmume.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__append_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(desmume_cli_SOURCES) DIST_SOURCES = $(desmume_cli_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(ALSA_CFLAGS) \ $(LIBAGG_CFLAGS) $(GLIB_CFLAGS) $(GTHREAD_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) AM_LDFLAGS = desmume_cli_SOURCES = main.cpp ../sndsdl.cpp ../ctrlssdl.h ../ctrlssdl.cpp ../driver.h ../driver.cpp desmume_cli_LDADD = ../libdesmume.a $(SDL_LIBS) $(ALSA_LIBS) \ $(LIBAGG_LIBS) $(GLIB_LIBS) $(GTHREAD_LIBS) \ $(LIBSOUNDTOUCH_LIBS) $(am__append_1) all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cli/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/cli/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) desmume-cli$(EXEEXT): $(desmume_cli_OBJECTS) $(desmume_cli_DEPENDENCIES) $(EXTRA_desmume_cli_DEPENDENCIES) @rm -f desmume-cli$(EXEEXT) $(CXXLINK) $(desmume_cli_OBJECTS) $(desmume_cli_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrlssdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sndsdl.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` sndsdl.o: ../sndsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sndsdl.o -MD -MP -MF $(DEPDIR)/sndsdl.Tpo -c -o sndsdl.o `test -f '../sndsdl.cpp' || echo '$(srcdir)/'`../sndsdl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/sndsdl.Tpo $(DEPDIR)/sndsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../sndsdl.cpp' object='sndsdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sndsdl.o `test -f '../sndsdl.cpp' || echo '$(srcdir)/'`../sndsdl.cpp sndsdl.obj: ../sndsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sndsdl.obj -MD -MP -MF $(DEPDIR)/sndsdl.Tpo -c -o sndsdl.obj `if test -f '../sndsdl.cpp'; then $(CYGPATH_W) '../sndsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../sndsdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/sndsdl.Tpo $(DEPDIR)/sndsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../sndsdl.cpp' object='sndsdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sndsdl.obj `if test -f '../sndsdl.cpp'; then $(CYGPATH_W) '../sndsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../sndsdl.cpp'; fi` ctrlssdl.o: ../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ctrlssdl.o -MD -MP -MF $(DEPDIR)/ctrlssdl.Tpo -c -o ctrlssdl.o `test -f '../ctrlssdl.cpp' || echo '$(srcdir)/'`../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ctrlssdl.Tpo $(DEPDIR)/ctrlssdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ctrlssdl.cpp' object='ctrlssdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ctrlssdl.o `test -f '../ctrlssdl.cpp' || echo '$(srcdir)/'`../ctrlssdl.cpp ctrlssdl.obj: ../ctrlssdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ctrlssdl.obj -MD -MP -MF $(DEPDIR)/ctrlssdl.Tpo -c -o ctrlssdl.obj `if test -f '../ctrlssdl.cpp'; then $(CYGPATH_W) '../ctrlssdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../ctrlssdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ctrlssdl.Tpo $(DEPDIR)/ctrlssdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ctrlssdl.cpp' object='ctrlssdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ctrlssdl.obj `if test -f '../ctrlssdl.cpp'; then $(CYGPATH_W) '../ctrlssdl.cpp'; else $(CYGPATH_W) '$(srcdir)/../ctrlssdl.cpp'; fi` driver.o: ../driver.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT driver.o -MD -MP -MF $(DEPDIR)/driver.Tpo -c -o driver.o `test -f '../driver.cpp' || echo '$(srcdir)/'`../driver.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/driver.Tpo $(DEPDIR)/driver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../driver.cpp' object='driver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o driver.o `test -f '../driver.cpp' || echo '$(srcdir)/'`../driver.cpp driver.obj: ../driver.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT driver.obj -MD -MP -MF $(DEPDIR)/driver.Tpo -c -o driver.obj `if test -f '../driver.cpp'; then $(CYGPATH_W) '../driver.cpp'; else $(CYGPATH_W) '$(srcdir)/../driver.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/driver.Tpo $(DEPDIR)/driver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../driver.cpp' object='driver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o driver.obj `if test -f '../driver.cpp'; then $(CYGPATH_W) '../driver.cpp'; else $(CYGPATH_W) '$(srcdir)/../driver.cpp'; fi` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/Disassembler.cpp0000644000175000017500000033170012140261633017634 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include "Disassembler.h" #include "bits.h" #define ROR(i, j) ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j)))) const char Condition[16][3] = { "EQ", "NE", "CS", "CC", "MI", "PL", "VS", "VC", "HI", "LS", "GE", "LT", "GT", "LE", "", "" }; const char Registre[16][4] = { "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R12", "SP", "LR", "PC", }; const char MSR_FIELD[16][5] = { "", "c", "x", "xc", "s", "sc", "sx", "sxc", "f", "fc", "fx", "fxc", "fs", "fsc", "fsx", "fsxc" }; #define DATAPROC_LSL_IMM(nom, s) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", LSL #%X", (int)((i>>7)&0x1F));\ sprintf(txt, "%s%s%s %s, %s, %s%s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ Registre[REG_POS(i,0)],\ tmp); #define DATAPROC_ROR_IMM(nom, s) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", RRX");\ sprintf(txt, "%s%s%s %s, %s, %s%s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ Registre[REG_POS(i,0)],\ tmp\ ); #define DATAPROC_REG_SHIFT(nom, shift,s) sprintf(txt, "%s%s%s %s, %s, %s, %s %s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ Registre[REG_POS(i,0)],\ #shift,\ Registre[REG_POS(i,8)]\ ); #define DATAPROC_IMM_SHIFT(nom, shift, s) sprintf(txt, "%s%s%s %s, %s, %s, %s #%X",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ Registre[REG_POS(i,0)],\ #shift,\ (int)((i>>7)&0x1F)\ ); #define DATAPROC_IMM_VALUE(nom,s) u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E);\ sprintf(txt, "%s%s%s %s, %s, #%X",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ (int)shift_op\ ); #define DATAPROC_ONE_OP_LSL_IMM(nom, s, v) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", LSL #%X", (int)((i>>7)&0x1F));\ sprintf(txt, "%s%s%s %s, %s%s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ Registre[REG_POS(i,0)],\ tmp); #define DATAPROC_ONE_OP_ROR_IMM(nom, s, v) char tmp[10] = "";\ if(((i>>7)&0x1F)==0)\ sprintf(tmp, ", RRX");\ else\ sprintf(tmp, ", ROR %d", (int)((i>>7)&0x1F));\ sprintf(txt, "%s%s%s %s, %s%s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ Registre[REG_POS(i,0)],\ tmp\ ); #define DATAPROC_ONE_OP_REG_SHIFT(nom, shift,s, v) sprintf(txt, "%s%s%s %s, %s, %s %s",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ Registre[REG_POS(i,0)],\ #shift,\ Registre[REG_POS(i,8)]\ ); #define DATAPROC_ONE_OP_IMM_SHIFT(nom, shift, s, v) sprintf(txt, "%s%s%s %s, %s, %s #%X",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ Registre[REG_POS(i,0)],\ #shift,\ (int)((i>>7)&0x1F)\ ); #define DATAPROC_ONE_OP_IMM_VALUE(nom, s, v)\ u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E);\ sprintf(txt, "%s%s%s %s, #%X",\ #nom,\ Condition[CONDITION(i)],\ s,\ Registre[REG_POS(i,v)],\ (int)shift_op\ ); #define SIGNEXTEND_24(i) (((i)&0xFFFFFF)|(0xFF000000*BIT23(i))) #define LDRSTR_LSL_IMM(nom, op, op2, op3) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", LSL #%X", (int)((i>>7)&0x1F));\ sprintf(txt, "%s%s %s, [%s%s, %s%s%s%s",\ #nom,\ Condition[CONDITION(i)],\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ op2,\ op,\ Registre[REG_POS(i,0)],\ tmp,\ op3); #define LDRSTR_ROR_IMM(nom, op, op2, op3) char tmp[10] = "";\ if(((i>>7)&0x1F)!=0)\ sprintf(tmp, ", RRX");\ sprintf(txt, "%s%s %s, [%s%s, %s%s%s%s",\ #nom,\ Condition[CONDITION(i)],\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ op2,\ op,\ Registre[REG_POS(i,0)],\ tmp,\ op3\ ); #define LDRSTR_IMM_SHIFT(nom, shift, op, op2, op3)\ sprintf(txt, "%s%s %s, [%s%s, %s%s, %s #%X%s",\ #nom,\ Condition[CONDITION(i)],\ Registre[REG_POS(i,12)],\ Registre[REG_POS(i,16)],\ op2,\ op,\ Registre[REG_POS(i,0)],\ #shift,\ (int)((i>>7)&0x1F),\ op3\ ); #define RegList(nb) char lreg[100] = "";\ int prec = 0;\ int j;\ for(j = 0; j < nb; j++)\ {\ if(prec)\ {\ if((!BIT_N(i, j+1))||(j==nb-1))\ {\ sprintf(lreg + strlen(lreg), "%s,", Registre[j]);\ prec = 0;\ }\ }\ else\ {\ if(BIT_N(i, j))\ {\ if((BIT_N(i, j+1))&&(j!=nb-1))\ {\ sprintf(lreg + strlen(lreg), "%s-", Registre[j]);\ prec = 1;\ }\ else\ sprintf(lreg + strlen(lreg), "%s,", Registre[j]);\ }\ }\ }\ if(*lreg) lreg[strlen(lreg)-1]='\0'; static char * OP_UND(u32 adr, u32 i, char * txt) { sprintf(txt, "----"); return txt; } //-----------------------AND------------------------------------ static char * OP_AND_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(AND, ""); return txt; } static char * OP_AND_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, LSL, ""); return txt; } static char * OP_AND_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(AND, LSR, ""); return txt; } static char * OP_AND_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, LSR, ""); return txt; } static char * OP_AND_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(AND, ASR, ""); return txt; } static char * OP_AND_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, ASR, ""); return txt; } static char * OP_AND_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(AND, ""); return txt; } static char * OP_AND_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, ROR, ""); return txt; } static char * OP_AND_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(AND, ""); return txt; } static char * OP_AND_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(AND, "S"); return txt; } static char * OP_AND_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, LSL, "S"); return txt; } static char * OP_AND_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(AND, LSR, "S"); return txt; } static char * OP_AND_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, LSR, "S"); return txt; } static char * OP_AND_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(AND, ASR, "S"); return txt; } static char * OP_AND_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, ASR, "S"); return txt; } static char * OP_AND_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(AND, "S"); return txt; } static char * OP_AND_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(AND, ROR, "S"); return txt; } static char * OP_AND_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(AND, "S"); return txt; } //--------------EOR------------------------------ static char * OP_EOR_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(EOR, ""); return txt; } static char * OP_EOR_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, LSL, ""); return txt; } static char * OP_EOR_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(EOR, LSR, ""); return txt; } static char * OP_EOR_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, LSR, ""); return txt; } static char * OP_EOR_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(EOR, ASR, ""); return txt; } static char * OP_EOR_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, ASR, ""); return txt; } static char * OP_EOR_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(EOR, ""); return txt; } static char * OP_EOR_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, ROR, ""); return txt; } static char * OP_EOR_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(EOR, ""); return txt; } static char * OP_EOR_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(EOR, "S"); return txt; } static char * OP_EOR_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, LSL, "S"); return txt; } static char * OP_EOR_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(EOR, LSR, "S"); return txt; } static char * OP_EOR_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, LSR, "S"); return txt; } static char * OP_EOR_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(EOR, ASR, "S"); return txt; } static char * OP_EOR_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, ASR, "S"); return txt; } static char * OP_EOR_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(EOR, "S"); return txt; } static char * OP_EOR_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(EOR, ROR, "S"); return txt; } static char * OP_EOR_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(EOR, "S"); return txt; } //-------------SUB------------------------------------- static char * OP_SUB_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(SUB, ""); return txt; } static char * OP_SUB_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, LSL, ""); return txt; } static char * OP_SUB_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SUB, LSR, ""); return txt; } static char * OP_SUB_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, LSR, ""); return txt; } static char * OP_SUB_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SUB, ASR, ""); return txt; } static char * OP_SUB_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, ASR, ""); return txt;} static char * OP_SUB_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(SUB, ""); return txt;} static char * OP_SUB_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, ROR, ""); return txt;} static char * OP_SUB_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(SUB, ""); return txt;} static char * OP_SUB_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(SUB, "S"); return txt;} static char * OP_SUB_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, LSL, "S"); return txt;} static char * OP_SUB_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SUB, LSR, "S"); return txt;} static char * OP_SUB_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, LSR, "S"); return txt;} static char * OP_SUB_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SUB, ASR, "S"); return txt;} static char * OP_SUB_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, ASR, "S"); return txt;} static char * OP_SUB_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(SUB, "S"); return txt;} static char * OP_SUB_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SUB, ROR, "S"); return txt;} static char * OP_SUB_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(SUB, "S"); return txt;} //------------------RSB------------------------ static char * OP_RSB_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(RSB, ""); return txt;} static char * OP_RSB_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, LSL, ""); return txt;} static char * OP_RSB_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSB, LSR, ""); return txt;} static char * OP_RSB_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, LSR, ""); return txt;} static char * OP_RSB_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSB, ASR, ""); return txt;} static char * OP_RSB_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, ASR, ""); return txt;} static char * OP_RSB_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(RSB, ""); return txt;} static char * OP_RSB_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, ROR, ""); return txt;} static char * OP_RSB_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(RSB, ""); return txt;} static char * OP_RSB_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(RSB, "S"); return txt;} static char * OP_RSB_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, LSL, "S"); return txt;} static char * OP_RSB_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSB, LSR, "S"); return txt;} static char * OP_RSB_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, LSR, "S"); return txt;} static char * OP_RSB_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSB, ASR, "S"); return txt;} static char * OP_RSB_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, ASR, "S"); return txt;} static char * OP_RSB_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(RSB, "S"); return txt;} static char * OP_RSB_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSB, ROR, "S"); return txt;} static char * OP_RSB_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(RSB, "S"); return txt;} //------------------ADD----------------------------------- static char * OP_ADD_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ADD, ""); return txt;} static char * OP_ADD_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, LSL, ""); return txt;} static char * OP_ADD_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADD, LSR, ""); return txt;} static char * OP_ADD_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, LSR, ""); return txt;} static char * OP_ADD_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADD, ASR, ""); return txt;} static char * OP_ADD_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, ASR, ""); return txt;} static char * OP_ADD_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ADD, ""); return txt;} static char * OP_ADD_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, ROR, ""); return txt;} static char * OP_ADD_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ADD, ""); return txt;} static char * OP_ADD_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ADD, "S"); return txt;} static char * OP_ADD_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, LSL, "S"); return txt;} static char * OP_ADD_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADD, LSR, "S"); return txt;} static char * OP_ADD_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, LSR, "S"); return txt;} static char * OP_ADD_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADD, ASR, "S"); return txt;} static char * OP_ADD_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, ASR, "S"); return txt;} static char * OP_ADD_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ADD, "S"); return txt;} static char * OP_ADD_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADD, ROR, "S"); return txt;} static char * OP_ADD_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ADD, "S"); return txt;} //------------------ADC----------------------------------- static char * OP_ADC_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ADC, ""); return txt;} static char * OP_ADC_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, LSL, ""); return txt;} static char * OP_ADC_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADC, LSR, ""); return txt;} static char * OP_ADC_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, LSR, ""); return txt;} static char * OP_ADC_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADC, ASR, ""); return txt;} static char * OP_ADC_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, ASR, ""); return txt;} static char * OP_ADC_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ADC, ""); return txt;} static char * OP_ADC_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, ROR, ""); return txt;} static char * OP_ADC_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ADC, ""); return txt;} static char * OP_ADC_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ADC, "S"); return txt;} static char * OP_ADC_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, LSL, "S"); return txt;} static char * OP_ADC_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADC, LSR, "S"); return txt;} static char * OP_ADC_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, LSR, "S"); return txt;} static char * OP_ADC_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ADC, ASR, "S"); return txt;} static char * OP_ADC_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, ASR, "S"); return txt;} static char * OP_ADC_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ADC, "S"); return txt;} static char * OP_ADC_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ADC, ROR, "S"); return txt;} static char * OP_ADC_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ADC, "S"); return txt;} //-------------SBC------------------------------------- static char * OP_SBC_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(SBC, ""); return txt;} static char * OP_SBC_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, LSL, ""); return txt;} static char * OP_SBC_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SBC, LSR, ""); return txt;} static char * OP_SBC_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, LSR, ""); return txt;} static char * OP_SBC_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SBC, ASR, ""); return txt;} static char * OP_SBC_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, ASR, ""); return txt;} static char * OP_SBC_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(SBC, ""); return txt;} static char * OP_SBC_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, ROR, ""); return txt;} static char * OP_SBC_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(SBC, ""); return txt;} static char * OP_SBC_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(SBC, "S"); return txt;} static char * OP_SBC_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, LSL, "S"); return txt;} static char * OP_SBC_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SBC, LSR, "S"); return txt;} static char * OP_SBC_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, LSR, "S"); return txt;} static char * OP_SBC_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(SBC, ASR, "S"); return txt;} static char * OP_SBC_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, ASR, "S"); return txt;} static char * OP_SBC_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(SBC, "S"); return txt;} static char * OP_SBC_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(SBC, ROR, "S"); return txt;} static char * OP_SBC_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(SBC, "S"); return txt;} //---------------RSC---------------------------------- static char * OP_RSC_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(RSC, ""); return txt;} static char * OP_RSC_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, LSL, ""); return txt;} static char * OP_RSC_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSC, LSR, ""); return txt;} static char * OP_RSC_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, LSR, ""); return txt;} static char * OP_RSC_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSC, ASR, ""); return txt;} static char * OP_RSC_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, ASR, ""); return txt;} static char * OP_RSC_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(RSC, ""); return txt;} static char * OP_RSC_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, ROR, ""); return txt;} static char * OP_RSC_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(RSC, ""); return txt;} static char * OP_RSC_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(RSC, "S"); return txt;} static char * OP_RSC_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, LSL, "S"); return txt;} static char * OP_RSC_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSC, LSR, "S"); return txt;} static char * OP_RSC_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, LSR, "S"); return txt;} static char * OP_RSC_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(RSC, ASR, "S"); return txt;} static char * OP_RSC_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, ASR, "S"); return txt;} static char * OP_RSC_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(RSC, "S"); return txt;} static char * OP_RSC_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(RSC, ROR, "S"); return txt;} static char * OP_RSC_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(RSC, "S"); return txt;} //-------------------TST---------------------------- static char * OP_TST_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(TST, "", 16); return txt;} static char * OP_TST_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TST, LSL, "", 16); return txt;} static char * OP_TST_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(TST, LSR, "", 16); return txt;} static char * OP_TST_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TST, LSR, "", 16); return txt;} static char * OP_TST_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(TST, ASR, "", 16); return txt;} static char * OP_TST_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TST, ASR, "", 16); return txt;} static char * OP_TST_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(TST, "", 16); return txt;} static char * OP_TST_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TST, ROR, "", 16); return txt;} static char * OP_TST_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(TST, "", 16); return txt;} //-------------------TEQ---------------------------- static char * OP_TEQ_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(TEQ, "", 16); return txt;} static char * OP_TEQ_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TEQ, LSL, "", 16); return txt;} static char * OP_TEQ_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(TEQ, LSR, "", 16); return txt;} static char * OP_TEQ_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TEQ, LSR, "", 16); return txt;} static char * OP_TEQ_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(TEQ, ASR, "", 16); return txt;} static char * OP_TEQ_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TEQ, ASR, "", 16); return txt;} static char * OP_TEQ_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(TEQ, "", 16); return txt;} static char * OP_TEQ_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(TEQ, ROR, "", 16); return txt;} static char * OP_TEQ_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(TEQ, "", 16); return txt;} //-------------CMP------------------------------------- static char * OP_CMP_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(CMP, "", 16); return txt;} static char * OP_CMP_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMP, LSL, "", 16); return txt;} static char * OP_CMP_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(CMP, LSR, "", 16); return txt;} static char * OP_CMP_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMP, LSR, "", 16); return txt;} static char * OP_CMP_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(CMP, ASR, "", 16); return txt;} static char * OP_CMP_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMP, ASR, "", 16); return txt;} static char * OP_CMP_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(CMP, "", 16); return txt;} static char * OP_CMP_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMP, ROR, "", 16); return txt;} static char * OP_CMP_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(CMP, "", 16); return txt;} //---------------CMN--------------------------- static char * OP_CMN_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(CMN, "", 16); return txt;} static char * OP_CMN_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMN, LSL, "", 16); return txt;} static char * OP_CMN_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(CMP, ASR, "", 16); return txt;} static char * OP_CMN_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMN, LSR, "", 16); return txt;} static char * OP_CMN_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(CMN, ASR, "", 16); return txt;} static char * OP_CMN_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMN, ASR, "", 16); return txt;} static char * OP_CMN_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(CMN, "", 16); return txt;} static char * OP_CMN_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(CMN, ROR, "", 16); return txt;} static char * OP_CMN_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(CMN, "", 16); return txt;} //------------------ORR------------------- static char * OP_ORR_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ORR, ""); return txt;} static char * OP_ORR_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, LSL, ""); return txt;} static char * OP_ORR_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ORR, LSR, ""); return txt;} static char * OP_ORR_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, LSR, ""); return txt;} static char * OP_ORR_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ORR, ASR, ""); return txt;} static char * OP_ORR_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, ASR, ""); return txt;} static char * OP_ORR_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ORR, ""); return txt;} static char * OP_ORR_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, ROR, ""); return txt;} static char * OP_ORR_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ORR, ""); return txt;} static char * OP_ORR_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(ORR, "S"); return txt;} static char * OP_ORR_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, LSL, "S"); return txt;} static char * OP_ORR_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ORR, LSR, "S"); return txt;} static char * OP_ORR_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, LSR, "S"); return txt;} static char * OP_ORR_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(ORR, ASR, "S"); return txt;} static char * OP_ORR_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, ASR, "S"); return txt;} static char * OP_ORR_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(ORR, "S"); return txt;} static char * OP_ORR_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(ORR, ROR, "S"); return txt;} static char * OP_ORR_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(ORR, "S"); return txt;} //------------------MOV------------------- static char * OP_MOV_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(MOV, "", 12); return txt;} static char * OP_MOV_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, LSL, "", 12); return txt;} static char * OP_MOV_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, LSR, "", 12); return txt;} static char * OP_MOV_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, LSR, "", 12); return txt;} static char * OP_MOV_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, "", 12); return txt;} static char * OP_MOV_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, ASR, "", 12); return txt;} static char * OP_MOV_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(MOV, "", 12); return txt;} static char * OP_MOV_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, ROR, "", 12); return txt;} static char * OP_MOV_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(MOV, "", 12); return txt;} static char * OP_MOV_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(MOV, "S", 12); return txt;} static char * OP_MOV_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, LSL, "S", 12); return txt;} static char * OP_MOV_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, LSR, "S", 12); return txt;} static char * OP_MOV_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, LSR, "S", 12); return txt;} static char * OP_MOV_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, "S", 12); return txt;} static char * OP_MOV_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, ASR, "S", 12); return txt;} static char * OP_MOV_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(MOV, "S", 12); return txt;} static char * OP_MOV_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MOV, ROR, "S", 12); return txt;} static char * OP_MOV_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(MOV, "S", 12); return txt;} //------------------BIC------------------- static char * OP_BIC_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(BIC, ""); return txt;} static char * OP_BIC_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, LSL, ""); return txt;} static char * OP_BIC_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(BIC, LSR, ""); return txt;} static char * OP_BIC_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, LSR, ""); return txt;} static char * OP_BIC_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(BIC, ASR, ""); return txt;} static char * OP_BIC_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, ASR, ""); return txt;} static char * OP_BIC_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(BIC, ""); return txt;} static char * OP_BIC_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, ROR, ""); return txt;} static char * OP_BIC_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(BIC, ""); return txt;} static char * OP_BIC_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_LSL_IMM(BIC, "S"); return txt;} static char * OP_BIC_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, LSL, "S"); return txt;} static char * OP_BIC_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(BIC, LSR, "S"); return txt;} static char * OP_BIC_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, LSR, "S"); return txt;} static char * OP_BIC_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_IMM_SHIFT(BIC, ASR, "S"); return txt;} static char * OP_BIC_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, ASR, "S"); return txt;} static char * OP_BIC_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ROR_IMM(BIC, "S"); return txt;} static char * OP_BIC_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_REG_SHIFT(BIC, ROR, "S"); return txt;} static char * OP_BIC_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_IMM_VALUE(BIC, "S"); return txt;} //------------------MVN------------------- static char * OP_MVN_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(MVN, "", 12); return txt;} static char * OP_MVN_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, LSL, "", 12); return txt;} static char * OP_MVN_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MVN, LSR, "", 12); return txt;} static char * OP_MVN_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, LSR, "", 12); return txt;} static char * OP_MVN_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MVN, ASR, "", 12); return txt;} static char * OP_MVN_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, ASR, "", 12); return txt;} static char * OP_MVN_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(MVN, "", 12); return txt;} static char * OP_MVN_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, ROR, "", 12); return txt;} static char * OP_MVN_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(MVN, "", 12); return txt;} static char * OP_MVN_S_LSL_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_LSL_IMM(MVN, "S", 12); return txt;} static char * OP_MVN_S_LSL_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, LSL, "S", 12); return txt;} static char * OP_MVN_S_LSR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MVN, LSR, "S", 12); return txt;} static char * OP_MVN_S_LSR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, LSR, "S", 12); return txt;} static char * OP_MVN_S_ASR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, "S", 12); return txt;} static char * OP_MVN_S_ASR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, ASR, "S", 12); return txt;} static char * OP_MVN_S_ROR_IMM(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_ROR_IMM(MVN, "S", 12); return txt;} static char * OP_MVN_S_ROR_REG(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_REG_SHIFT(MVN, ROR, "S", 12); return txt;} static char * OP_MVN_S_IMM_VAL(u32 adr, u32 i, char * txt) { DATAPROC_ONE_OP_IMM_VALUE(MVN, "S", 12); return txt;} //-------------MUL------------------------ static char * OP_MUL(u32 adr, u32 i, char * txt) { sprintf(txt, "MUL%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_MLA(u32 adr, u32 i, char * txt) { sprintf(txt, "MLA%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_MUL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "MUL%sS %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_MLA_S(u32 adr, u32 i, char * txt) { sprintf(txt, "MLA%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} //----------UMUL-------------------------- static char * OP_UMULL(u32 adr, u32 i, char * txt) { sprintf(txt, "UMULL%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_UMLAL(u32 adr, u32 i, char * txt) { sprintf(txt, "UMLAL%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_UMULL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "UMULL%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_UMLAL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "UMLAL%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //----------SMUL-------------------------- static char * OP_SMULL(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULL%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLAL%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMULL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULL%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL_S(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLAL%sS %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //---------------SWP------------------------------ static char * OP_SWP(u32 adr, u32 i, char * txt) { sprintf(txt, "SWP%s %s, %s, [%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_SWPB(u32 adr, u32 i, char * txt) { sprintf(txt, "SWPB%s %s, %s, [%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} //------------LDRH----------------------------- static char * OP_LDRH_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, %s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, -%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, %s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s, -%s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s], #%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s], -#%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s], %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH%s %s, [%s], -%s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} //------------STRH----------------------------- static char * OP_STRH_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, %s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, -%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, %s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s, -%s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s], #%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s], -#%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_STRH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s], %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_STRH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH%s %s, [%s], -%s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} //----------------LDRSH-------------------------- static char * OP_LDRSH_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, %s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, -%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, %s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s, -%s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s], #%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s], -#%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s], %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH%s %s, [%s], -%s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} //----------------------LDRSB---------------------- static char * OP_LDRSB_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, %s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, -%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, %s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s, -%s]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s], #%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s], -#%X", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF))); return txt;} static char * OP_LDRSB_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s], %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_LDRSB_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB%s %s, [%s], -%s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} //--------------MRS-------------------------------- static char * OP_MRS_CPSR(u32 adr, u32 i, char * txt) { sprintf(txt, "MRS%s %s, CPSR", Condition[CONDITION(i)], Registre[REG_POS(i,12)]); return txt;} static char * OP_MRS_SPSR(u32 adr, u32 i, char * txt) { sprintf(txt, "MRS%s %s, SPSR", Condition[CONDITION(i)], Registre[REG_POS(i,12)]); return txt;} //--------------MSR-------------------------------- static char * OP_MSR_CPSR(u32 adr, u32 i, char * txt) { sprintf(txt, "MSR%s CPSR_%s, %s", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_MSR_SPSR(u32 adr, u32 i, char * txt) { sprintf(txt, "MSR%s SPSR_%s, %s", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], Registre[REG_POS(i,0)]); return txt;} static char * OP_MSR_CPSR_IMM_VAL(u32 adr, u32 i, char * txt) { sprintf(txt, "MSR%s CPSR_%s, #%X", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], (int)ROR((i&0xFF), ((i>>7)&0x1E))); return txt;} static char * OP_MSR_SPSR_IMM_VAL(u32 adr, u32 i, char * txt) { sprintf(txt, "MSR%s SPSR_%s, #%X", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], (int)ROR((i&0xFF), (i>>7)&0x1E)); return txt;} //-----------------BRANCH-------------------------- static char * OP_BX(u32 adr, u32 i, char * txt) { sprintf(txt, "BX%s %s", Condition[CONDITION(i)], Registre[REG_POS(i,0)]); return txt;} static char * OP_BLX_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "BLX%s %s", Condition[CONDITION(i)], Registre[REG_POS(i,0)]); return txt;} static char * OP_B(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "BLX%s %08X", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8)); return txt;} sprintf(txt, "B%s %08X", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8)); return txt;} static char * OP_BL(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "BLX%s %08X", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+10)); return txt;} sprintf(txt, "BL%s %08X", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8)); return txt;} //----------------CLZ------------------------------- static char * OP_CLZ(u32 adr, u32 i, char * txt) { sprintf(txt, "CLZ%s %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)]); return txt;} //--------------------QADD--QSUB------------------------------ static char * OP_QADD(u32 adr, u32 i, char * txt) { sprintf(txt, "QADD%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_QSUB(u32 adr, u32 i, char * txt) { sprintf(txt, "QSUB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_QDADD(u32 adr, u32 i, char * txt) { sprintf(txt, "QDADD%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_QDSUB(u32 adr, u32 i, char * txt) { sprintf(txt, "QDSUB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} //-----------------SMUL------------------------------- static char * OP_SMUL_B_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULBB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMUL_B_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULBT%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMUL_T_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULTB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMUL_T_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULTT%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //-----------SMLA---------------------------- static char * OP_SMLA_B_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLABB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_SMLA_B_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLABT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_SMLA_T_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLATB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_SMLA_T_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLATT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} //--------------SMLAL--------------------------------------- static char * OP_SMLAL_B_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLABB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL_B_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLABT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL_T_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLATB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMLAL_T_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLATT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //--------------SMULW-------------------- static char * OP_SMULW_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULWB%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} static char * OP_SMULW_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMULWT%s %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]); return txt;} //--------------SMLAW------------------- static char * OP_SMLAW_B(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLAWB%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} static char * OP_SMLAW_T(u32 adr, u32 i, char * txt) { sprintf(txt, "SMLAWT%s %s, %s, %s, %s", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]); return txt;} //------------LDR--------------------------- static char * OP_LDR_P_IMM_OFF(u32 adr, u32 i, char * txt) { if(REG_POS(i,16) == 15) sprintf(txt, "LDR%s %s, [%08X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 + (int)(i&0x7FF))); else sprintf(txt, "LDR%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_M_IMM_OFF(u32 adr, u32 i, char * txt) { if(REG_POS(i,16) == 15) sprintf(txt, "LDR%s %s, [%08X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 - (int)(i&0x7FF))); else sprintf(txt, "LDR%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDREX(u32 adr, u32 i, char * txt) { sprintf(txt, "LDREX%s %s, [%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)]); return txt;} static char * OP_LDR_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "", "", "]"); return txt;} static char * OP_LDR_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "-", "", "]"); return txt;} static char * OP_LDR_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "", "", "]"); return txt;} static char * OP_LDR_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "M", "", "]"); return txt;} static char * OP_LDR_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "", "", "]"); return txt;} static char * OP_LDR_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "-", "", "]"); return txt;} static char * OP_LDR_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "", "", "]"); return txt;} static char * OP_LDR_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "-", "", "]"); return txt;} static char * OP_LDR_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "", "", "]!"); return txt;} static char * OP_LDR_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "-", "", "]!"); return txt;} static char * OP_LDR_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "", "", "]!"); return txt;} static char * OP_LDR_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "-", "", "]!"); return txt;} static char * OP_LDR_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "", "", "]!"); return txt;} static char * OP_LDR_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "-", "", "]!"); return txt;} static char * OP_LDR_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "", "", "]!"); return txt;} static char * OP_LDR_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "-", "", "]!"); return txt;} static char * OP_LDR_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_P_IMM_OFF_POSTIND2(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDR_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "", "]", ""); return txt;} static char * OP_LDR_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDR, "-", "]", ""); return txt;} static char * OP_LDR_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "", "]", ""); return txt;} static char * OP_LDR_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, LSR, "-", "]", ""); return txt;} static char * OP_LDR_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "", "]", ""); return txt;} static char * OP_LDR_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDR, ASR, "-", "]", ""); return txt;} static char * OP_LDR_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "", "]", ""); return txt;} static char * OP_LDR_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDR, "-", "]", ""); return txt;} //-----------------LDRB------------------------------------------- static char * OP_LDRB_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "", "", "]"); return txt;} static char * OP_LDRB_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "-", "", "]"); return txt;} static char * OP_LDRB_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "", "", "]"); return txt;} static char * OP_LDRB_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "M", "", "]"); return txt;} static char * OP_LDRB_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "", "", "]"); return txt;} static char * OP_LDRB_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "-", "", "]"); return txt;} static char * OP_LDRB_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "", "", "]"); return txt;} static char * OP_LDRB_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "-", "", "]"); return txt;} static char * OP_LDRB_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "", "", "]!"); return txt;} static char * OP_LDRB_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "-", "", "]!"); return txt;} static char * OP_LDRB_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "", "", "]!"); return txt;} static char * OP_LDRB_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "-", "", "]!"); return txt;} static char * OP_LDRB_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "", "", "]!"); return txt;} static char * OP_LDRB_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "-", "", "]!"); return txt;} static char * OP_LDRB_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "", "", "]!"); return txt;} static char * OP_LDRB_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "-", "", "]!"); return txt;} static char * OP_LDRB_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRB_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "", "]", ""); return txt;} static char * OP_LDRB_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRB, "-", "]", ""); return txt;} static char * OP_LDRB_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "", "]", ""); return txt;} static char * OP_LDRB_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, LSR, "-", "]", ""); return txt;} static char * OP_LDRB_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "", "]", ""); return txt;} static char * OP_LDRB_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRB, ASR, "-", "]", ""); return txt;} static char * OP_LDRB_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "", "]", ""); return txt;} static char * OP_LDRB_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRB, "-", "]", ""); return txt;} //----------------------STR-------------------------------- static char * OP_STR_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STREX(u32 adr, u32 i, char * txt) { sprintf(txt, "STREX%s %s, %s, [%s]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]); return txt;} static char * OP_STR_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "", "", "]"); return txt;} static char * OP_STR_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "-", "", "]"); return txt;} static char * OP_STR_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "", "", "]"); return txt;} static char * OP_STR_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "M", "", "]"); return txt;} static char * OP_STR_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "", "", "]"); return txt;} static char * OP_STR_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "-", "", "]"); return txt;} static char * OP_STR_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "", "", "]"); return txt;} static char * OP_STR_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "-", "", "]"); return txt;} static char * OP_STR_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "", "", "]!"); return txt;} static char * OP_STR_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "-", "", "]!"); return txt;} static char * OP_STR_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "", "", "]!"); return txt;} static char * OP_STR_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "-", "", "]!"); return txt;} static char * OP_STR_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "", "", "]!"); return txt;} static char * OP_STR_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "-", "", "]!"); return txt;} static char * OP_STR_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "", "", "]!"); return txt;} static char * OP_STR_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "-", "", "]!"); return txt;} static char * OP_STR_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STR%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STR_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "", "]", ""); return txt;} static char * OP_STR_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STR, "-", "]", ""); return txt;} static char * OP_STR_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "", "]", ""); return txt;} static char * OP_STR_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, LSR, "-", "]", ""); return txt;} static char * OP_STR_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "", "]", ""); return txt;} static char * OP_STR_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STR, ASR, "-", "]", ""); return txt;} static char * OP_STR_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "", "]", ""); return txt;} static char * OP_STR_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STR, "-", "]", ""); return txt;} //-----------------------STRB------------------------------------- static char * OP_STRB_P_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_M_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "", "", "]"); return txt;} static char * OP_STRB_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "-", "", "]"); return txt;} static char * OP_STRB_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "", "", "]"); return txt;} static char * OP_STRB_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "M", "", "]"); return txt;} static char * OP_STRB_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "", "", "]"); return txt;} static char * OP_STRB_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "-", "", "]"); return txt;} static char * OP_STRB_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "", "", "]"); return txt;} static char * OP_STRB_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "-", "", "]"); return txt;} static char * OP_STRB_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "", "", "]!"); return txt;} static char * OP_STRB_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "-", "", "]!"); return txt;} static char * OP_STRB_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "", "", "]!"); return txt;} static char * OP_STRB_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "-", "", "]!"); return txt;} static char * OP_STRB_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "", "", "]!"); return txt;} static char * OP_STRB_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "-", "", "]!"); return txt;} static char * OP_STRB_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "", "", "]!"); return txt;} static char * OP_STRB_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "-", "", "]!"); return txt;} static char * OP_STRB_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRB_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "", "]", ""); return txt;} static char * OP_STRB_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRB, "-", "]", ""); return txt;} static char * OP_STRB_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "", "]", ""); return txt;} static char * OP_STRB_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, LSR, "-", "]", ""); return txt;} static char * OP_STRB_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "", "]", ""); return txt;} static char * OP_STRB_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRB, ASR, "-", "]", ""); return txt;} static char * OP_STRB_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "", "]", ""); return txt;} static char * OP_STRB_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRB, "-", "]", ""); return txt;} //-----------------------LDRBT------------------------------------- #if 0 static char * OP_LDRBT_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRBT%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRBT_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRBT%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_LDRBT_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRBT, "", "]", ""); return txt;} static char * OP_LDRBT_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(LDRBT, "-", "]", ""); return txt;} static char * OP_LDRBT_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRBT, LSR, "", "]", ""); return txt;} static char * OP_LDRBT_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRBT, LSR, "-", "]", ""); return txt;} static char * OP_LDRBT_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRBT, ASR, "", "]", ""); return txt;} static char * OP_LDRBT_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(LDRBT, ASR, "-", "]", ""); return txt;} static char * OP_LDRBT_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRBT, "", "]", ""); return txt;} static char * OP_LDRBT_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(LDRBT, "-", "]", ""); return txt;} //----------------------STRBT---------------------------- static char * OP_STRBT_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRBT%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRBT_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { sprintf(txt, "STRBT%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF)); return txt;} static char * OP_STRBT_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRBT, "", "]", ""); return txt;} static char * OP_STRBT_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_LSL_IMM(STRBT, "-", "]", ""); return txt;} static char * OP_STRBT_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRBT, LSR, "", "]", ""); return txt;} static char * OP_STRBT_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRBT, LSR, "-", "]", ""); return txt;} static char * OP_STRBT_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRBT, ASR, "", "]", ""); return txt;} static char * OP_STRBT_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_IMM_SHIFT(STRBT, ASR, "-", "]", ""); return txt;} static char * OP_STRBT_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRBT, "", "]", ""); return txt;} static char * OP_STRBT_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt) { LDRSTR_ROR_IMM(STRBT, "-", "]", ""); return txt;} #endif //---------------------LDM----------------------------- static char * OP_LDMIA(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIA%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIB(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIB%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDA(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDA%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDB(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDB%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIA_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIA%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIB_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIB%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDA_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDA%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDB_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDB%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIA2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIA%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIB2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIB%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDA2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDA%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMDB2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDB%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_LDMIA2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIA%s %s!, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); if(BIT15(i)==0) sprintf(txt, "%s ?????", txt); return txt;} static char * OP_LDMIB2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMIB%s %s!, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); if(BIT15(i)==0) sprintf(txt, "%s ?????", txt); return txt;} static char * OP_LDMDA2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDA%s %s!, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); if(BIT15(i)==0) sprintf(txt, "%s ?????", txt); return txt;} static char * OP_LDMDB2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "LDMDB%s %s!, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); if(BIT15(i)==0) sprintf(txt, "%s ?????", txt); return txt;} //------------------------------STM---------------------------------- static char * OP_STMIA(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIA%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIB(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIB%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDA(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDA%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDB(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDB%s %s, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIA_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIA%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIB_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIB%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDA_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDA%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDB_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDB%s %s!, {%s}", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIA2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIA%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIB2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIB%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDA2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDA%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDB2(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDB%s %s, {%s}^", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIA2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIA%s %s!, {%s}^ ?????", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMIB2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMIB%s %s!, {%s}^ ?????", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt;} static char * OP_STMDA2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDA%s %s!, {%s}^ ?????", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt; } static char * OP_STMDB2_W(u32 adr, u32 i, char * txt) { RegList(16); sprintf(txt, "STMDB%s %s!, {%s}^ ?????", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg); return txt; } //---------------------STC---------------------------------- static char * OP_STC_P_IMM_OFF(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s, #%X]", (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s %X, CP%X, [%s, #%X]",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2)); return txt; } static char * OP_STC_M_IMM_OFF(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s, #-%X]",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s, #-%X]",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_P_PREIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s, #%X]!",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s, #%X]!",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_M_PREIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s, #-%X]!",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s, #-%X]!",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_P_POSTIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s], #%X",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s], #%X",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_M_POSTIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s], #-%X",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s], #-%X",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STC_OPTION(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "STC2 CP%X, CR%X, [%s], {%X}",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF)); return txt; } sprintf(txt, "STC%s CP%X, CR%X, [%s], {%X}",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF)); return txt; } //---------------------LDC---------------------------------- static char * OP_LDC_P_IMM_OFF(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s, #%X]",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s, #%X]",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_M_IMM_OFF(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s, #-%X]",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s, #-%X]",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_P_PREIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s, #%X]!",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s, #%X]!",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_M_PREIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s, #-%X]!",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s, #-%X]!",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_P_POSTIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s], #%X",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s], #%X",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_M_POSTIND(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s], #-%X", (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s], #-%X",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDC_OPTION(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "LDC2 CP%X, CR%X, [%s], {%X}", (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF)); return txt; } sprintf(txt, "LDC%s CP%X, CR%X, [%s], {%X}",Condition[CONDITION(i)], (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF)); return txt; } /* * * The Enhanced DSP Extension LDRD and STRD instructions. * */ static char * OP_LDRD_STRD_POST_INDEX(u32 adr, u32 i, char * txt) { const char *direction = BIT5(i) ? "STR" : "LDR"; /* U bit - set = add, clear = sub */ char sign = BIT23(i) ? '+' : '-'; int txt_index = 0; txt_index += sprintf( &txt[txt_index], "%s%sD R%d, [R%d], ", direction, Condition[CONDITION(i)], (int)REG_POS(i, 12), (int)REG_POS(i, 16)); /* I bit - set = immediate, clear = reg */ if ( BIT22(i)) { sprintf( &txt[txt_index], "#%c%d", sign, (int)(((i>>4) & 0xF0) | (i&0xF)) ); } else { sprintf( &txt[txt_index], "%cR%d", sign, (int)REG_POS(i, 0)); } return txt; } static char * OP_LDRD_STRD_OFFSET_PRE_INDEX(u32 adr, u32 i, char * txt) { const char *direction = BIT5(i) ? "STR" : "LDR"; /* U bit - set = add, clear = sub */ char sign = BIT23(i) ? '+' : '-'; int txt_index = 0; txt_index += sprintf( &txt[txt_index], "%s%sD R%d, [R%d, ", direction, Condition[CONDITION(i)], (int)REG_POS(i, 12), (int)REG_POS(i, 16)); /* I bit - set = immediate, clear = reg */ if ( BIT22(i)) { if ( BIT21(i)) { /* pre-index */ sprintf( &txt[txt_index], "#%c%d]!", sign, (int)(((i>>4)&0xF0)|(i&0xF))); } else { /* offset */ sprintf( &txt[txt_index], "#%c%d]", sign, (int)(((i>>4)&0xF0)|(i&0xF))); } } else { if ( BIT21(i)) { /* pre-index */ sprintf( &txt[txt_index], "%c%d]!", sign, (int)REG_POS(i, 0)); } else { /* offset */ sprintf( &txt[txt_index], "%c%d]", sign, (int)REG_POS(i, 0)); } } return txt; } //----------------MCR----------------------- static char * OP_MCR(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "MCR2 CP%d, %X, %s, CR%d, CR%d, %X",(int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7)); return txt; } sprintf(txt, "MCR%s CP%d, %X, %s, CR%d, CR%d, %X",Condition[CONDITION(i)], (int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7)); return txt; } //----------------MRC----------------------- static char * OP_MRC(u32 adr, u32 i, char * txt) { if(CONDITION(i)==0xF) { sprintf(txt, "MRC2 CP%d, %X, %s, CR%d, CR%d, %X",(int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7)); return txt; } sprintf(txt, "MRC%s CP%d, %X, %s, CR%d, CR%d, %X",Condition[CONDITION(i)], (int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7)); return txt; } //--------------SWI-------------------------- static char * OP_SWI(u32 adr, u32 i, char * txt) { sprintf(txt, "SWI%s %X",Condition[CONDITION(i)], (int)((i&0xFFFFFF)>>16)); return txt; } //----------------BKPT------------------------- static char * OP_BKPT(u32 adr, u32 i, char * txt) { sprintf(txt, "BKPT #%X",(int)(((i>>4)&0xFFF)|(i&0xF))); return txt; } //----------------CDP----------------------- static char * OP_CDP(u32 adr, u32 i, char * txt) { sprintf(txt, "CDP-------------------------------"); return txt; } //------------------------------------------------------------ // THUMB //------------------------------------------------------------ #define REG_NUM(i, n) (((i)>>n)&0x7) static char * OP_UND_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "----"); return txt; } static char * OP_LSL_0(u32 adr, u32 i, char * txt) { sprintf(txt, "LSL %s, %s, #0", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_LSL(u32 adr, u32 i, char * txt) { sprintf(txt, "LSL %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F)); return txt; } static char * OP_LSR_0(u32 adr, u32 i, char * txt) { sprintf(txt, "LSR %s, %s, #0", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_LSR(u32 adr, u32 i, char * txt) { sprintf(txt, "LSR %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F)); return txt; } static char * OP_ASR_0(u32 adr, u32 i, char * txt) { sprintf(txt, "ASR %s, %s, #0", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ASR(u32 adr, u32 i, char * txt) { sprintf(txt, "ASR %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F)); return txt; } static char * OP_ADD_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_SUB_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "SUB %s, %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_ADD_IMM3(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)REG_NUM(i, 6)); return txt; } static char * OP_SUB_IMM3(u32 adr, u32 i, char * txt) { sprintf(txt, "SUB %s, %s, #%X", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)REG_NUM(i, 6)); return txt; } static char * OP_MOV_IMM8(u32 adr, u32 i, char * txt) { sprintf(txt, "MOV %s, #%X", Registre[REG_NUM(i, 8)], (int)(i&0xFF)); return txt; } static char * OP_CMP_IMM8(u32 adr, u32 i, char * txt) { sprintf(txt, "CMP %s, #%X", Registre[REG_NUM(i, 8)], (int)(i&0xFF)); return txt; } static char * OP_ADD_IMM8(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, #%X", Registre[REG_NUM(i, 8)], (int)(i&0xFF)); return txt; } static char * OP_SUB_IMM8(u32 adr, u32 i, char * txt) { sprintf(txt, "SUB %s, #%X", Registre[REG_NUM(i, 8)], (int)(i&0xFF)); return txt; } static char * OP_AND(u32 adr, u32 i, char * txt) { sprintf(txt, "AND %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_EOR(u32 adr, u32 i, char * txt) { sprintf(txt, "EOR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_LSL_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "LSL %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_LSR_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "LSR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ASR_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "ASR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ADC_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "ADC %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_SBC_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "SBC %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ROR_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "ROR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_TST(u32 adr, u32 i, char * txt) { sprintf(txt, "TST %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_NEG(u32 adr, u32 i, char * txt) { sprintf(txt, "NEG %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_CMP(u32 adr, u32 i, char * txt) { sprintf(txt, "CMP %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_CMN(u32 adr, u32 i, char * txt) { sprintf(txt, "CMN %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ORR(u32 adr, u32 i, char * txt) { sprintf(txt, "ORR %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_MUL_REG(u32 adr, u32 i, char * txt) { sprintf(txt, "MUL %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_BIC(u32 adr, u32 i, char * txt) { sprintf(txt, "BIC %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_MVN(u32 adr, u32 i, char * txt) { sprintf(txt, "MVN %s, %s", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]); return txt; } static char * OP_ADD_SPE(u32 adr, u32 i, char * txt) { u8 Rd = (i&7) | ((i>>4)&8); sprintf(txt, "ADD %s, %s", Registre[Rd], Registre[REG_POS(i, 3)]); return txt; } static char * OP_CMP_SPE(u32 adr, u32 i, char * txt) { u8 Rd = (i&7) | ((i>>4)&8); sprintf(txt, "CMP %s, %s", Registre[Rd], Registre[REG_POS(i, 3)]); return txt; } static char * OP_MOV_SPE(u32 adr, u32 i, char * txt) { u8 Rd = (i&7) | ((i>>4)&8); sprintf(txt, "MOV %s, %s", Registre[Rd], Registre[REG_POS(i, 3)]); return txt; } static char * OP_BX_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "BX %s", Registre[REG_POS(i, 3)]); return txt; } static char * OP_BLX_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "BLX %s", Registre[REG_POS(i, 3)]); return txt; } static char * OP_LDR_PCREL(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR %s, [PC, #%X]", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_STR_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STR %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_STRH_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_STRB_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDRSB_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSB %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDR_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDRH_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDRB_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_LDRSH_REG_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRSH %s, [%s, %s]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]); return txt; } static char * OP_STR_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STR %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>4)&0x7C)); return txt; } static char * OP_LDR_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>4)&0x7C)); return txt; } static char * OP_STRB_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRB %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6)&0x1F)); return txt; } static char * OP_LDRB_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRB %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6)&0x1F)); return txt; } static char * OP_STRH_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "STRH %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>5)&0x3E)); return txt; } static char * OP_LDRH_IMM_OFF(u32 adr, u32 i, char * txt) { sprintf(txt, "LDRH %s, [%s, #%X]", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>5)&0x3E)); return txt; } static char * OP_STR_SPREL(u32 adr, u32 i, char * txt) { sprintf(txt, "STR %s, [SP, #%X]", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_LDR_SPREL(u32 adr, u32 i, char * txt) { sprintf(txt, "LDR %s, [SP, #%X]", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_ADD_2PC(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, PC, #%X", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_ADD_2SP(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD %s, SP, #%X", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2)); return txt; } static char * OP_ADJUST_P_SP(u32 adr, u32 i, char * txt) { sprintf(txt, "ADD SP, #%X", (int)((i&0x7F)<<2)); return txt; } static char * OP_ADJUST_M_SP(u32 adr, u32 i, char * txt) { sprintf(txt, "SUB SP, #%X", (int)((i&0x7F)<<2)); return txt; } static char * OP_PUSH(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "PUSH {%s}", lreg); return txt; } static char * OP_PUSH_LR(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "PUSH {%s, LR}", lreg); return txt; } static char * OP_POP(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "POP {%s}", lreg); return txt; } static char * OP_POP_PC(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "POP {%s, PC}", lreg); return txt; } static char * OP_BKPT_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "BKPT"); return txt; } static char * OP_STMIA_THUMB(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "STMIA %s!, {%s}", Registre[REG_NUM(i, 8)], lreg); return txt; } static char * OP_LDMIA_THUMB(u32 adr, u32 i, char * txt) { RegList(8); sprintf(txt, "LDMIA %s!, {%s}", Registre[REG_NUM(i, 8)], lreg); return txt; } static char * OP_B_COND(u32 adr, u32 i, char * txt) { sprintf(txt, "B%s #%X", Condition[(i>>8)&0xF], (int)(adr+(((s32)((signed char)(i&0xFF)))<<1)+4)); return txt; } static char * OP_SWI_THUMB(u32 adr, u32 i, char * txt) { sprintf(txt, "SWI #%X", (int)(i & 0xFF)); return txt; } #define SIGNEEXT_IMM11(i) (((i)&0x7FF) | (BIT10(i) * 0xFFFFF800)) static char * OP_B_UNCOND(u32 adr, u32 i, char * txt) { sprintf(txt, "B #%X", (int)(adr+(SIGNEEXT_IMM11(i)<<1)+4)); return txt; } u32 part = 0; static char * OP_BLX(u32 adr, u32 i, char * txt) { sprintf(txt, "BLX #%X", (int)(part + ((i&0x7FF)<<1))&0xFFFFFFFC); return txt; } static char * OP_BL_10(u32 adr, u32 i, char * txt) { part = adr+4 + (SIGNEEXT_IMM11(i)<<12); sprintf(txt, "calculating high part of the address"); return txt; } static char * OP_BL_11(u32 adr, u32 i, char * txt) { sprintf(txt, "BL #%X", (int)(part + ((i&0x7FF)<<1))&0xFFFFFFFC); return txt; } #define TABDECL(x) x const DisasmOpFunc des_arm_instructions_set[4096] = { #include "instruction_tabdef.inc" }; const DisasmOpFunc des_thumb_instructions_set[1024] = { #include "thumb_tabdef.inc" }; desmume-0.9.9/src/armcpu.h0000644000175000017500000002104512140261633016151 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef ARM_CPU #define ARM_CPU #include "types.h" #include "bits.h" #include "MMU.h" #include "common.h" #include "instructions.h" #include "cp15.h" #define CODE(i) (((i)>>25)&0x7) #define OPCODE(i) (((i)>>21)&0xF) #define SIGNEBIT(i) BIT_N(i,20) #define EXCEPTION_RESET 0x00 #define EXCEPTION_UNDEFINED_INSTRUCTION 0x04 #define EXCEPTION_SWI 0x08 #define EXCEPTION_PREFETCH_ABORT 0x0C #define EXCEPTION_DATA_ABORT 0x10 #define EXCEPTION_RESERVED_0x14 0x14 #define EXCEPTION_IRQ 0x18 #define EXCEPTION_FAST_IRQ 0x1C #define INSTRUCTION_INDEX(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF)) inline u32 ROR(u32 i, u32 j) { return ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j)))); } template inline T UNSIGNED_OVERFLOW(T a,T b,T c) { return BIT31(((a)&(b)) | (((a)|(b))&(~c))); } template inline T UNSIGNED_UNDERFLOW(T a,T b,T c) { return BIT31(((~a)&(b)) | (((~a)|(b))&(c))); } template inline T SIGNED_OVERFLOW(T a,T b,T c) { return BIT31(((a)&(b)&(~c)) | ((~a)&(~(b))&(c))); } template inline T SIGNED_UNDERFLOW(T a,T b,T c) { return BIT31(((a)&(~(b))&(~c)) | ((~a)&(b)&(c))); } // ============================= CPRS flags funcs inline bool CarryFrom(s32 left, s32 right) { u32 res = (0xFFFFFFFFU - (u32)left); return ((u32)right > res); } inline bool BorrowFrom(s32 left, s32 right) { return ((u32)right > (u32)left); } inline bool OverflowFromADD(s32 alu_out, s32 left, s32 right) { return ((left >= 0 && right >= 0) || (left < 0 && right < 0)) && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0)); } inline bool OverflowFromSUB(s32 alu_out, s32 left, s32 right) { return ((left < 0 && right >= 0) || (left >= 0 && right < 0)) && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0)); } //zero 15-feb-2009 - these werent getting used and they were getting in my way //#define EQ 0x0 //#define NE 0x1 //#define CS 0x2 //#define CC 0x3 //#define MI 0x4 //#define PL 0x5 //#define VS 0x6 //#define VC 0x7 //#define HI 0x8 //#define LS 0x9 //#define GE 0xA //#define LT 0xB //#define GT 0xC //#define LE 0xD //#define AL 0xE static const u8 arm_cond_table[16*16] = { // N=0, Z=0, C=0, V=0 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF, // 0x00 0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x20, // 0x00 // N=0, Z=0, C=0, V=1 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x00, // 0x10 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=0, Z=0, C=1, V=0 0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF, // 0x20 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x20, // N=0, Z=0, C=1, V=1 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00, // 0x30 0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=0, Z=1, C=0, V=0 0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF, // 0x40 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20, // N=0, Z=1, C=0, V=1 0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00, // 0x50 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=0, Z=1, C=1, V=0 0xFF,0x00,0xFF,0x00,0x00,0xFF,0x00,0xFF, // 0x60 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20, // N=0, Z=1, C=1, V=1 0xFF,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00, // 0x70 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=0, C=0, V=0 0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0xFF, // 0x80 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=0, C=0, V=1 0x00,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0x00, // 0x90 0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x20, // N=1, Z=0, C=1, V=0 0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0xFF, // 0xA0 0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=0, C=1, V=1 0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x00, // 0xB0 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x20, // N=1, Z=1, C=0, V=0 0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF, // 0xC0 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=1, C=0, V=1 0xFF,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00, // 0xD0 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20, // N=1, Z=1, C=1, V=0 0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0xFF, // 0xE0 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20, // N=1, Z=1, C=1, V=1 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00, // 0xF0 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20 }; #define TEST_COND(cond, inst, CPSR) ((arm_cond_table[((CPSR.val >> 24) & 0xf0)|(cond)]) & (1 << (inst))) enum Mode { USR = 0x10, FIQ = 0x11, IRQ = 0x12, SVC = 0x13, ABT = 0x17, UND = 0x1B, SYS = 0x1F }; #ifdef WORDS_BIGENDIAN typedef union { struct { u32 N : 1, Z : 1, C : 1, V : 1, Q : 1, RAZ : 19, I : 1, F : 1, T : 1, mode : 5; } bits; u32 val; } Status_Reg; #else typedef union { struct { u32 mode : 5, T : 1, F : 1, I : 1, RAZ : 19, Q : 1, V : 1, C : 1, Z : 1, N : 1; } bits; u32 val; } Status_Reg; #endif /** * The control interface to a CPU */ struct armcpu_ctrl_iface { /** stall the processor */ void (*stall)( void *instance); /** unstall the processor */ void (*unstall)( void *instance); /** read a register value */ u32 (*read_reg)( void *instance, u32 reg_num); /** set a register value */ void (*set_reg)( void *instance, u32 reg_num, u32 value); /** install the post execute function */ void (*install_post_ex_fn)( void *instance, void (*fn)( void *, u32 adr, int thumb), void *fn_data); /** remove the post execute function */ void (*remove_post_ex_fn)( void *instance); /** the private data passed to all interface functions */ void *data; }; typedef void* armcp_t; struct armcpu_t { u32 proc_ID; u32 instruction; //4 u32 instruct_adr; //8 u32 next_instruction; //12 u32 R[16]; //16 Status_Reg CPSR; //80 Status_Reg SPSR; void changeCPSR(); u32 R13_usr, R14_usr; u32 R13_svc, R14_svc; u32 R13_abt, R14_abt; u32 R13_und, R14_und; u32 R13_irq, R14_irq; u32 R8_fiq, R9_fiq, R10_fiq, R11_fiq, R12_fiq, R13_fiq, R14_fiq; Status_Reg SPSR_svc, SPSR_abt, SPSR_und, SPSR_irq, SPSR_fiq; u32 intVector; u8 LDTBit; //1 : ARMv5 style 0 : non ARMv5 (earlier) BOOL waitIRQ; BOOL halt_IE_and_IF; //the cpu is halted, waiting for IE&IF to signal something u8 intrWaitARM_state; BOOL BIOS_loaded; u32 (* *swi_tab)(); // flag indicating if the processor is stalled (for debugging) int stalled; #if defined(_M_X64) || defined(__x86_64__) u8 cond_table[16*16]; #endif #ifdef GDB_STUB /** there is a pending irq for the cpu */ int irq_flag; /** the post executed function (if installed) */ void (*post_ex_fn)( void *, u32 adr, int thumb); /** data for the post executed function */ void *post_ex_fn_data; /** the memory interface */ struct armcpu_memory_iface *mem_if; /** the ctrl interface */ struct armcpu_ctrl_iface ctrl_iface; #endif }; #ifdef GDB_STUB int armcpu_new( armcpu_t *armcpu, u32 id, struct armcpu_memory_iface *mem_if, struct armcpu_ctrl_iface **ctrl_iface_ret); #else int armcpu_new( armcpu_t *armcpu, u32 id); #endif void armcpu_init(armcpu_t *armcpu, u32 adr); u32 armcpu_switchMode(armcpu_t *armcpu, u8 mode); BOOL armcpu_irqException(armcpu_t *armcpu); BOOL armcpu_flagIrq( armcpu_t *armcpu); void armcpu_exception(armcpu_t *cpu, u32 number); u32 TRAPUNDEF(armcpu_t* cpu); u32 armcpu_Wait4IRQ(armcpu_t *cpu); extern armcpu_t NDS_ARM7; extern armcpu_t NDS_ARM9; template u32 armcpu_exec(); #ifdef HAVE_JIT template u32 armcpu_exec(); #endif static INLINE void setIF(int PROCNUM, u32 flag) { //don't set generated bits!!! assert(!(flag&0x00200000)); MMU.reg_IF_bits[PROCNUM] |= flag; extern void NDS_Reschedule(); NDS_Reschedule(); } static INLINE void NDS_makeIrq(int PROCNUM, u32 num) { setIF(PROCNUM,1<> 6); strcpy(txt, intToBin((u16)tmp)+6); } else { tmp = ((instr >> 16) & 0x0FF0) | ((instr >> 4) & 0x0F); strcpy(txt, intToBin((u32)tmp)+20); } return strdup(txt); } #endif desmume-0.9.9/src/commandline.cpp0000644000175000017500000002706612140261633017514 0ustar guillaumeguillaume/* Copyright (C) 2009-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ //windows note: make sure this file gets compiled with _cdecl #include #include #include #include "commandline.h" #include "types.h" #include "movie.h" #include "addons.h" #include "slot1.h" #include "NDSSystem.h" #include "utils/xstring.h" int _scanline_filter_a = 0, _scanline_filter_b = 2, _scanline_filter_c = 2, _scanline_filter_d = 4; int _commandline_linux_nojoy = 0; CommandLine::CommandLine() : is_cflash_configured(false) , error(NULL) , ctx(g_option_context_new ("")) , _play_movie_file(0) , _record_movie_file(0) , _cflash_image(0) , _cflash_path(0) , _gbaslot_rom(0) , _bios_arm9(NULL) , _bios_arm7(NULL) , _bios_swi(0) , _spu_advanced(0) , _num_cores(-1) , _rigorous_timing(0) , _advanced_timing(-1) , _slot1(NULL) , _slot1_fat_dir(NULL) #ifdef HAVE_JIT , _cpu_mode(-1) , _jit_size(-1) #endif , _console_type(NULL) , depth_threshold(-1) , load_slot(-1) , arm9_gdb_port(0) , arm7_gdb_port(0) , start_paused(FALSE) , autodetect_method(-1) { #ifndef _MSC_VER disable_sound = 0; disable_limiter = 0; #endif } CommandLine::~CommandLine() { if(error) g_error_free (error); g_option_context_free (ctx); } void CommandLine::loadCommonOptions() { //these options should be available in every port. //my advice is, do not be afraid of using #ifdef here if it makes sense. //but also see the gtk port for an example of how to combine this with other options //(you may need to use ifdefs to cause options to be entered in the desired order) static const GOptionEntry options[] = { { "load-slot", 0, 0, G_OPTION_ARG_INT, &load_slot, "Loads savegame from slot NUM", "NUM"}, { "play-movie", 0, 0, G_OPTION_ARG_FILENAME, &_play_movie_file, "Specifies a dsm format movie to play", "PATH_TO_PLAY_MOVIE"}, { "record-movie", 0, 0, G_OPTION_ARG_FILENAME, &_record_movie_file, "Specifies a path to a new dsm format movie", "PATH_TO_RECORD_MOVIE"}, { "start-paused", 0, 0, G_OPTION_ARG_NONE, &start_paused, "Indicates that emulation should start paused", "START_PAUSED"}, { "cflash-image", 0, 0, G_OPTION_ARG_FILENAME, &_cflash_image, "Requests cflash in gbaslot with fat image at this path", "CFLASH_IMAGE"}, { "cflash-path", 0, 0, G_OPTION_ARG_FILENAME, &_cflash_path, "Requests cflash in gbaslot with filesystem rooted at this path", "CFLASH_PATH"}, { "gbaslot-rom", 0, 0, G_OPTION_ARG_FILENAME, &_gbaslot_rom, "Requests this GBA rom in gbaslot", "GBASLOT_ROM"}, { "bios-arm9", 0, 0, G_OPTION_ARG_FILENAME, &_bios_arm9, "Uses the arm9 bios provided at the specified path", "BIOS_ARM9_PATH"}, { "bios-arm7", 0, 0, G_OPTION_ARG_FILENAME, &_bios_arm7, "Uses the arm7 bios provided at the specified path", "BIOS_ARM7_PATH"}, { "bios-swi", 0, 0, G_OPTION_ARG_INT, &_bios_swi, "Uses SWI from the provided bios files", "BIOS_SWI"}, { "spu-advanced", 0, 0, G_OPTION_ARG_INT, &_spu_advanced, "Uses advanced SPU capture functions", "SPU_ADVANCED"}, { "num-cores", 0, 0, G_OPTION_ARG_INT, &_num_cores, "Override numcores detection and use this many", "NUM_CORES"}, { "scanline-filter-a", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_a, "Intensity of fadeout for scanlines filter (topleft) (default 0)", "SCANLINE_FILTER_A"}, { "scanline-filter-b", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_b, "Intensity of fadeout for scanlines filter (topright) (default 2)", "SCANLINE_FILTER_B"}, { "scanline-filter-c", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_c, "Intensity of fadeout for scanlines filter (bottomleft) (default 2)", "SCANLINE_FILTER_C"}, { "scanline-filter-d", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_d, "Intensity of fadeout for scanlines filter (bottomright) (default 4)", "SCANLINE_FILTER_D"}, { "rigorous-timing", 0, 0, G_OPTION_ARG_INT, &_rigorous_timing, "Use some rigorous timings instead of unrealistically generous (default 0)", "RIGOROUS_TIMING"}, { "advanced-timing", 0, 0, G_OPTION_ARG_INT, &_advanced_timing, "Use advanced BUS-level timing (default 1)", "ADVANCED_TIMING"}, { "slot1", 0, 0, G_OPTION_ARG_STRING, &_slot1, "Device to load in slot 1 (default retail)", "SLOT1"}, { "slot1-fat-dir", 0, 0, G_OPTION_ARG_STRING, &_slot1_fat_dir, "Directory to scan for slot 1", "SLOT1_DIR"}, { "depth-threshold", 0, 0, G_OPTION_ARG_INT, &depth_threshold, "Depth comparison threshold (default 0)", "DEPTHTHRESHOLD"}, { "console-type", 0, 0, G_OPTION_ARG_STRING, &_console_type, "Select console type: {fat,lite,ique,debug,dsi}", "CONSOLETYPE" }, #ifdef HAVE_JIT { "cpu-mode", 0, 0, G_OPTION_ARG_INT, &_cpu_mode, "ARM CPU emulation mode: 0 - interpreter, 1 - dynarec (default 1)", NULL}, { "jit-size", 0, 0, G_OPTION_ARG_INT, &_jit_size, "ARM JIT block size: 1..100 (1 - accuracy, 100 - faster) (default 100)", NULL}, #endif #ifndef _MSC_VER { "disable-sound", 0, 0, G_OPTION_ARG_NONE, &disable_sound, "Disables the sound emulation", NULL}, { "disable-limiter", 0, 0, G_OPTION_ARG_NONE, &disable_limiter, "Disables the 60fps limiter", NULL}, { "nojoy", 0, 0, G_OPTION_ARG_INT, &_commandline_linux_nojoy, "Disables joystick support", "NOJOY"}, #endif #ifdef GDB_STUB { "arm9gdb", 0, 0, G_OPTION_ARG_INT, &arm9_gdb_port, "Enable the ARM9 GDB stub on the given port", "PORT_NUM"}, { "arm7gdb", 0, 0, G_OPTION_ARG_INT, &arm7_gdb_port, "Enable the ARM7 GDB stub on the given port", "PORT_NUM"}, #endif { "autodetect_method", 0, 0, G_OPTION_ARG_INT, &autodetect_method, "Autodetect backup method (0 - internal, 1 - from database)", "AUTODETECT_METHOD"}, { NULL } }; g_option_context_add_main_entries (ctx, options, "options"); } static char mytoupper(char c) { return ::toupper(c); } static std::string strtoupper(const std::string& str) { std::string ret = str; std::transform(ret.begin(), ret.end(), ret.begin(), ::mytoupper); return ret; } bool CommandLine::parse(int argc,char **argv) { g_option_context_parse (ctx, &argc, &argv, &error); if (error) { g_printerr("Error parsing command line arguments: %s\n", error->message); return false; } if(_slot1_fat_dir) slot1_fat_dir = _slot1_fat_dir; if(_slot1) slot1 = _slot1; slot1 = strtoupper(slot1); if(_console_type) console_type = _console_type; if(_play_movie_file) play_movie_file = _play_movie_file; if(_record_movie_file) record_movie_file = _record_movie_file; if(_cflash_image) cflash_image = _cflash_image; if(_cflash_path) cflash_path = _cflash_path; if(_gbaslot_rom) gbaslot_rom = _gbaslot_rom; if(_num_cores != -1) CommonSettings.num_cores = _num_cores; if(_rigorous_timing) CommonSettings.rigorous_timing = true; if(_advanced_timing != -1) CommonSettings.advanced_timing = _advanced_timing==1; #ifdef HAVE_JIT if(_cpu_mode != -1) CommonSettings.use_jit = (_cpu_mode==1); if(_jit_size != -1) { if ((_jit_size < 1) || (_jit_size > 100)) CommonSettings.jit_max_block_size = 100; else CommonSettings.jit_max_block_size = _jit_size; } #endif if(depth_threshold != -1) CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = depth_threshold; //process console type CommonSettings.DebugConsole = false; CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT; console_type = strtoupper(console_type); if(console_type == "") {} else if(console_type == "FAT") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT; else if(console_type == "LITE") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_LITE; else if(console_type == "IQUE") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_IQUE; else if(console_type == "DSI") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_DSI; else if(console_type == "DEBUG") { CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT; CommonSettings.DebugConsole = true; } if (autodetect_method != -1) CommonSettings.autodetectBackupMethod = autodetect_method; //TODO NOT MAX PRIORITY! change ARM9BIOS etc to be a std::string if(_bios_arm9) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM9BIOS,_bios_arm9); } if(_bios_arm7) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM7BIOS,_bios_arm7); } if(_bios_swi) CommonSettings.SWIFromBIOS = true; if(_spu_advanced) CommonSettings.spu_advanced = true; if (argc == 2) nds_file = argv[1]; if (argc > 2) return false; return true; } bool CommandLine::validate() { if(slot1 != "") { if(slot1 != "R4" && slot1 != "RETAIL" && slot1 != "NONE" && slot1 != "RETAILNAND") { g_printerr("Invalid slot1 device specified.\n"); return false; } } if (load_slot < -1 || load_slot > 10) { g_printerr("I only know how to load from slots 0-10; -1 means 'do not load savegame' and is default\n"); return false; } if(play_movie_file != "" && record_movie_file != "") { g_printerr("Cannot both play and record a movie.\n"); return false; } if(record_movie_file != "" && load_slot != -1) { g_printerr("Cannot both record a movie and load a savestate.\n"); return false; } if(cflash_path != "" && cflash_image != "") { g_printerr("Cannot specify both cflash-image and cflash-path.\n"); return false; } if((_bios_arm9 && !_bios_arm7) || (_bios_arm7 && !_bios_arm9)) { g_printerr("If either bios-arm7 or bios-arm9 are specified, both must be.\n"); return false; } if(_bios_swi && (!_bios_arm7 || !_bios_arm9)) { g_printerr("If either bios-swi is used, bios-arm9 and bios-arm7 must be specified.\n"); } if((_cflash_image && _gbaslot_rom) || (_cflash_path && _gbaslot_rom)) { g_printerr("Cannot specify both cflash and gbaslot rom (both occupy SLOT-2)\n"); } if (autodetect_method < -1 || autodetect_method > 1) { g_printerr("Invalid autodetect save method (0 - internal, 1 - from database)\n"); } #ifdef HAVE_JIT if (_cpu_mode < -1 || _cpu_mode > 1) { g_printerr("Invalid cpu mode emulation (0 - interpreter, 1 - dynarec)\n"); } if (_jit_size < -1 && (_jit_size == 0 || _jit_size > 100)) { g_printerr("Invalid jit block size [1..100]. set to 100\n"); } #endif return true; } void CommandLine::errorHelp(const char* binName) { //TODO - strip this down to just the filename g_printerr("USAGE: %s [options] [nds-file]\n", binName); g_printerr("USAGE: %s --help - for help\n", binName); } void CommandLine::process_movieCommands() { if(play_movie_file != "") { FCEUI_LoadMovie(play_movie_file.c_str(),true,false,-1); } else if(record_movie_file != "") { FCEUI_SaveMovie(record_movie_file.c_str(), L"", 0, NULL, FCEUI_MovieGetRTCDefault()); } } void CommandLine::process_addonCommands() { if (cflash_image != "") { CFlash_Mode = ADDON_CFLASH_MODE_File; CFlash_Path = cflash_image; is_cflash_configured = true; } if (cflash_path != "") { CFlash_Mode = ADDON_CFLASH_MODE_Path; CFlash_Path = cflash_path; is_cflash_configured = true; } if(slot1_fat_dir != "") slot1SetFatDir(slot1_fat_dir); if(slot1 == "RETAIL") slot1Change(NDS_SLOT1_RETAIL); else if(slot1 == "R4") slot1Change(NDS_SLOT1_R4); else if(slot1 == "RETAILNAND") slot1Change(NDS_SLOT1_RETAIL_NAND); } desmume-0.9.9/src/SPU.h0000644000175000017500000001405712140261633015336 0ustar guillaumeguillaume/* Copyright 2006 Theo Berkau Copyright (C) 2006-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef SPU_H #define SPU_H #include #include #include #include "types.h" #include "matrix.h" #include "emufile.h" #include "metaspu/metaspu.h" #define SNDCORE_DEFAULT -1 #define SNDCORE_DUMMY 0 #define CHANSTAT_STOPPED 0 #define CHANSTAT_PLAY 1 //who made these static? theyre used in multiple places. FORCEINLINE u32 sputrunc(float f) { return u32floor(f); } FORCEINLINE u32 sputrunc(double d) { return u32floor(d); } FORCEINLINE s32 spumuldiv7(s32 val, u8 multiplier) { assert(multiplier <= 127); return (multiplier == 127) ? val : ((val * multiplier) >> 7); } enum SPUInterpolationMode { SPUInterpolation_None = 0, SPUInterpolation_Linear = 1, SPUInterpolation_Cosine = 2 }; struct SoundInterface_struct { int id; const char *Name; int (*Init)(int buffersize); void (*DeInit)(); void (*UpdateAudio)(s16 *buffer, u32 num_samples); u32 (*GetAudioSpace)(); void (*MuteAudio)(); void (*UnMuteAudio)(); void (*SetVolume)(int volume); void (*ClearBuffer)(); void (*FetchSamples)(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t (*PostProcessSamples)(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); }; extern SoundInterface_struct SNDDummy; extern SoundInterface_struct SNDFile; extern int SPU_currentCoreNum; struct channel_struct { channel_struct() {} u32 num; u8 vol; u8 datashift; u8 hold; u8 pan; u8 waveduty; u8 repeat; u8 format; u8 keyon; u8 status; u32 addr; u16 timer; u16 loopstart; u32 length; u32 totlength; double double_totlength_shifted; double sampcnt; double sampinc; // ADPCM specific u32 lastsampcnt; s16 pcm16b, pcm16b_last; s16 loop_pcm16b; int index; int loop_index; u16 x; s16 psgnoise_last; }; class SPUFifo { public: SPUFifo(); void enqueue(s16 val); s16 dequeue(); s16 buffer[16]; s32 head,tail,size; void save(EMUFILE* fp); bool load(EMUFILE* fp); void reset(); }; class SPU_struct { public: SPU_struct(int buffersize); u32 bufpos; u32 buflength; s32 *sndbuf; s32 lastdata; //the last sample that a channel generated s16 *outbuf; u32 bufsize; channel_struct channels[16]; //registers struct REGS { REGS() : mastervol(0) , ctl_left(0) , ctl_right(0) , ctl_ch1bypass(0) , ctl_ch3bypass(0) , masteren(0) , soundbias(0) {} u8 mastervol; u8 ctl_left, ctl_right; u8 ctl_ch1bypass, ctl_ch3bypass; u8 masteren; u16 soundbias; enum LeftOutputMode { LOM_LEFT_MIXER=0, LOM_CH1=1, LOM_CH3=2, LOM_CH1_PLUS_CH3=3 }; enum RightOutputMode { ROM_RIGHT_MIXER=0, ROM_CH1=1, ROM_CH3=2, ROM_CH1_PLUS_CH3=3 }; struct CAP { CAP() : add(0), source(0), oneshot(0), bits8(0), active(0), dad(0), len(0) {} u8 add, source, oneshot, bits8, active; u32 dad; u16 len; struct Runtime { Runtime() : running(0), curdad(0), maxdad(0) {} u8 running; u32 curdad; u32 maxdad; double sampcnt; SPUFifo fifo; } runtime; } cap[2]; } regs; void reset(); ~SPU_struct(); void KeyOff(int channel); void KeyOn(int channel); void KeyProbe(int channel); void ProbeCapture(int which); void WriteByte(u32 addr, u8 val); u8 ReadByte(u32 addr); u16 ReadWord(u32 addr); u32 ReadLong(u32 addr); void WriteWord(u32 addr, u16 val); void WriteLong(u32 addr, u32 val); //kills all channels but leaves SPU otherwise running normally void ShutUp(); }; int SPU_ChangeSoundCore(int coreid, int buffersize); SoundInterface_struct *SPU_SoundCore(); void SPU_ReInit(); int SPU_Init(int coreid, int buffersize); void SPU_Pause(int pause); void SPU_SetVolume(int volume); void SPU_SetSynchMode(int mode, int method); void SPU_ClearOutputBuffer(void); void SPU_Reset(void); void SPU_DeInit(void); void SPU_KeyOn(int channel); void SPU_WriteByte(u32 addr, u8 val); void SPU_WriteWord(u32 addr, u16 val); void SPU_WriteLong(u32 addr, u32 val); u8 SPU_ReadByte(u32 addr); u16 SPU_ReadWord(u32 addr); u32 SPU_ReadLong(u32 addr); void SPU_Emulate_core(void); void SPU_Emulate_user(bool mix = true); void SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); extern SPU_struct *SPU_core, *SPU_user; extern int spu_core_samples; void spu_savestate(EMUFILE* os); bool spu_loadstate(EMUFILE* is, int size); enum WAVMode { WAVMODE_ANY = -1, WAVMODE_CORE = 0, WAVMODE_USER = 1 }; class WavWriter { public: WavWriter(); bool open(const std::string & fname); void close(); void update(void* soundData, int numSamples); bool isRecording() const; WAVMode mode; private: FILE *spufp; }; void WAV_End(); bool WAV_Begin(const char* fname, WAVMode mode=WAVMODE_CORE); bool WAV_IsRecording(WAVMode mode=WAVMODE_ANY); void WAV_WavSoundUpdate(void* soundData, int numSamples, WAVMode mode=WAVMODE_CORE); // we should make this configurable eventually // but at least defining it somewhere is probably a step in the right direction #define DESMUME_SAMPLE_RATE 44100 //#define DESMUME_SAMPLE_RATE 48000 #endif desmume-0.9.9/src/gdbstub.h0000644000175000017500000000262612140261633016320 0ustar guillaumeguillaume/* Copyright (C) 2006 Ben Jaques Copyright (C) 2008-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _GDBSTUB_H_ #define _GDBSTUB_H_ 1 #include "types.h" typedef void *gdbstub_handle_t; /* * The function interface */ gdbstub_handle_t createStub_gdb( u16 port, struct armcpu_memory_iface **cpu_memio, struct armcpu_memory_iface *direct_memio); void destroyStub_gdb( gdbstub_handle_t stub); void activateStub_gdb( gdbstub_handle_t stub, struct armcpu_ctrl_iface *cpu_ctrl); /* * An implementation of the following functions is required * for the GDB stub to function. */ void * createThread_gdb( void (WINAPI *thread_function)( void *data), void *thread_data); void joinThread_gdb( void *thread_handle); #endif /* End of _GDBSTUB_H_ */ desmume-0.9.9/src/path.h0000644000175000017500000002417612140261633015626 0ustar guillaumeguillaume/* Copyright (C) 2009-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #ifdef _MSC_VER #define mkdir _mkdir #endif #if defined(_WINDOWS) #include #include #include #include "winutil.h" #include "common.h" #if !defined(WXPORT) #include "resource.h" #else #include #endif /* !WXPORT */ #elif !defined(DESMUME_COCOA) #include #endif /* _WINDOWS */ #include "time.h" #include "utils/xstring.h" #ifdef _WINDOWS #define FILE_EXT_DELIMITER_CHAR '.' #define DIRECTORY_DELIMITER_CHAR '\\' #else #define FILE_EXT_DELIMITER_CHAR '.' #define DIRECTORY_DELIMITER_CHAR '/' #endif #ifdef _WINDOWS void FCEUD_MakePathDirs(const char *fname); #endif class Path { public: static bool IsPathRooted (const std::string &path); static std::string GetFileDirectoryPath(std::string filePath); static std::string GetFileNameFromPath(std::string filePath); static std::string GetFileNameWithoutExt(std::string fileName); static std::string GetFileNameFromPathWithoutExt(std::string filePath); static std::string GetFileExt(std::string fileName); }; class PathInfo { public: std::string path; std::string RomName; std::string RomDirectory; #define MAX_FORMAT 20 #define SECTION "PathSettings" #define ROMKEY "Roms" #define BATTERYKEY "Battery" #define STATEKEY "States" #define SCREENSHOTKEY "Screenshots" #define AVIKEY "AviFiles" #define CHEATKEY "Cheats" #define R4FORMATKEY "R4format" #define SOUNDKEY "SoundSamples" #define FIRMWAREKEY "Firmware" #define FORMATKEY "format" #define DEFAULTFORMATKEY "defaultFormat" #define NEEDSSAVINGKEY "needsSaving" #define LASTVISITKEY "lastVisit" #define LUAKEY "Lua" char screenshotFormat[MAX_FORMAT]; bool savelastromvisit; enum KnownPath { FIRSTKNOWNPATH = 0, ROMS = 0, BATTERY, STATES, SCREENSHOTS, AVI_FILES, CHEATS, SOUNDS, FIRMWARE, MODULE, MAXKNOWNPATH = MODULE }; char pathToRoms[MAX_PATH]; char pathToBattery[MAX_PATH]; char pathToStates[MAX_PATH]; char pathToScreenshots[MAX_PATH]; char pathToAviFiles[MAX_PATH]; char pathToCheats[MAX_PATH]; char pathToSounds[MAX_PATH]; char pathToFirmware[MAX_PATH]; char pathToModule[MAX_PATH]; char pathToLua[MAX_PATH]; void init(const char *filename) { path = std::string(filename); //extract the internal part of the logical rom name std::vector parts = tokenize_str(filename,"|"); SetRomName(parts[parts.size()-1].c_str()); LoadModulePath(); #if !defined(WIN32) && !defined(DESMUME_COCOA) ReadPathSettings(); #endif } void LoadModulePath() { #if defined(_WINDOWS) char *p; ZeroMemory(pathToModule, sizeof(pathToModule)); GetModuleFileName(NULL, pathToModule, sizeof(pathToModule)); p = pathToModule + lstrlen(pathToModule); while (p >= pathToModule && *p != DIRECTORY_DELIMITER_CHAR) p--; if (++p >= pathToModule) *p = 0; #elif defined(DESMUME_COCOA) std::string pathStr = Path::GetFileDirectoryPath(path); strncpy(pathToModule, pathStr.c_str(), MAX_PATH); #else char *cwd = g_build_filename(g_get_user_config_dir(), "desmume", NULL); g_mkdir_with_parents(cwd, 0755); strncpy(pathToModule, cwd, MAX_PATH); g_free(cwd); #endif } enum Action { GET, SET }; void GetDefaultPath(char *pathToDefault, const char *key, int maxCount) { #ifdef _WINDOWS std::string temp = (std::string)"." + DIRECTORY_DELIMITER_CHAR + pathToDefault; strncpy(pathToDefault, temp.c_str(), maxCount); #else strncpy(pathToDefault, pathToModule, maxCount); #endif } void ReadKey(char *pathToRead, const char *key) { #ifdef _WINDOWS GetPrivateProfileString(SECTION, key, key, pathToRead, MAX_PATH, IniName); if(strcmp(pathToRead, key) == 0) { //since the variables are all intialized in this file they all use MAX_PATH GetDefaultPath(pathToRead, key, MAX_PATH); } #else //since the variables are all intialized in this file they all use MAX_PATH GetDefaultPath(pathToRead, key, MAX_PATH); #endif } void ReadPathSettings() { if( ( strcmp(pathToModule, "") == 0) || !pathToModule) LoadModulePath(); ReadKey(pathToRoms, ROMKEY); ReadKey(pathToBattery, BATTERYKEY); ReadKey(pathToStates, STATEKEY); ReadKey(pathToScreenshots, SCREENSHOTKEY); ReadKey(pathToAviFiles, AVIKEY); ReadKey(pathToCheats, CHEATKEY); ReadKey(pathToSounds, SOUNDKEY); ReadKey(pathToFirmware, FIRMWAREKEY); ReadKey(pathToLua, LUAKEY); #ifdef _WINDOWS GetPrivateProfileString(SECTION, FORMATKEY, "%f_%s_%r", screenshotFormat, MAX_FORMAT, IniName); savelastromvisit = GetPrivateProfileBool(SECTION, LASTVISITKEY, true, IniName); currentimageformat = (ImageFormat)GetPrivateProfileInt(SECTION, DEFAULTFORMATKEY, PNG, IniName); r4Format = (R4Format)GetPrivateProfileInt(SECTION, R4FORMATKEY, R4_CHEAT_DAT, IniName); #endif /* needsSaving = GetPrivateProfileInt(SECTION, NEEDSSAVINGKEY, TRUE, IniName); if(needsSaving) { needsSaving = FALSE; WritePathSettings(); }*/ } void SwitchPath(Action action, KnownPath path, char *buffer) { char *pathToCopy = 0; switch(path) { case ROMS: pathToCopy = pathToRoms; break; case BATTERY: pathToCopy = pathToBattery; break; case STATES: pathToCopy = pathToStates; break; case SCREENSHOTS: pathToCopy = pathToScreenshots; break; case AVI_FILES: pathToCopy = pathToAviFiles; break; case CHEATS: pathToCopy = pathToCheats; break; case SOUNDS: pathToCopy = pathToSounds; break; case FIRMWARE: pathToCopy = pathToFirmware; break; case MODULE: pathToCopy = pathToModule; break; } if(action == GET) { std::string thePath = pathToCopy; std::string relativePath = (std::string)"." + DIRECTORY_DELIMITER_CHAR; int len = (int)thePath.size()-1; if(len == -1) thePath = relativePath; else if(thePath[len] != DIRECTORY_DELIMITER_CHAR) thePath += DIRECTORY_DELIMITER_CHAR; if(!Path::IsPathRooted(thePath)) { thePath = (std::string)pathToModule + thePath; } strncpy(buffer, thePath.c_str(), MAX_PATH); #ifdef _WINDOWS FCEUD_MakePathDirs(buffer); #endif } else if(action == SET) { int len = strlen(buffer)-1; if(buffer[len] == DIRECTORY_DELIMITER_CHAR) buffer[len] = '\0'; strncpy(pathToCopy, buffer, MAX_PATH); } } std::string getpath(KnownPath path) { char temp[MAX_PATH]; SwitchPath(GET, path, temp); return temp; } void getpath(KnownPath path, char *buffer) { SwitchPath(GET, path, buffer); } void setpath(KnownPath path, char *buffer) { SwitchPath(SET, path, buffer); } void getfilename(char *buffer, int maxCount) { strcpy(buffer,noextension().c_str()); } void getpathnoext(KnownPath path, char *buffer) { getpath(path, buffer); strcat(buffer, GetRomNameWithoutExtension().c_str()); } std::string extension() { return Path::GetFileExt(path); } std::string noextension() { std::string romNameWithPath = Path::GetFileDirectoryPath(path) + DIRECTORY_DELIMITER_CHAR + Path::GetFileNameWithoutExt(RomName); return romNameWithPath; } void formatname(char *output) { std::string file; time_t now = time(NULL); tm *time_struct = localtime(&now); srand((unsigned int)now); for(int i = 0; i < MAX_FORMAT;i++) { char *c = &screenshotFormat[i]; char tmp[MAX_PATH] = {0}; if(*c == '%') { c = &screenshotFormat[++i]; switch(*c) { case 'f': strcat(tmp, GetRomNameWithoutExtension().c_str()); break; case 'D': strftime(tmp, MAX_PATH, "%d", time_struct); break; case 'M': strftime(tmp, MAX_PATH, "%m", time_struct); break; case 'Y': strftime(tmp, MAX_PATH, "%Y", time_struct); break; case 'h': strftime(tmp, MAX_PATH, "%H", time_struct); break; case 'm': strftime(tmp, MAX_PATH, "%M", time_struct); break; case 's': strftime(tmp, MAX_PATH, "%S", time_struct); break; case 'r': sprintf(tmp, "%d", rand() % RAND_MAX); break; } } else { int j; for(j=i;j. */ #ifndef _INSTRUCIONS_H_ #define _INSTRUCIONS_H_ typedef u32 (FASTCALL* OpFunc)(const u32 i); extern const OpFunc arm_instructions_set[2][4096]; extern const char* arm_instruction_names[4096]; extern const OpFunc thumb_instructions_set[2][1024]; extern const char* thumb_instruction_names[1024]; #endif desmume-0.9.9/src/gfx3d.cpp0000644000175000017500000024232112140261633016232 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ //This file implements the geometry engine hardware component. //This handles almost all of the work of 3d rendering, leaving the renderer //plugin responsible only for drawing primitives. //#define FLUSHMODE_HACK //--------------- //TODO TODO TODO TODO //make up mind once and for all whether fog, toon, etc. should reside in memory buffers (for easier handling in MMU) //if they do, then we need to copy them out in doFlush!!! //--------------- #include #include #include #include #include "armcpu.h" #include "debug.h" #include "gfx3d.h" #include "matrix.h" #include "bits.h" #include "MMU.h" #include "render3D.h" #include "mem.h" #include "types.h" #include "saves.h" #include "NDSSystem.h" #include "readwrite.h" #include "FIFO.h" #include "movie.h" //only for currframecounter which really ought to be moved into the core emu.... #include //#define _SHOW_VTX_COUNTERS // show polygon/vertex counters on screen #ifdef _SHOW_VTX_COUNTERS u32 max_polys, max_verts; #include "GPU_OSD.h" #endif /* thoughts on flush timing: I think a flush is supposed to queue up and wait to happen during vblank sometime. But, we have some games that continue to do work after a flush but before a vblank. Since our timing is bad anyway, and we're not sure when the flush is really supposed to happen, then this leaves us in a bad situation. What makes it worse is that if flush is supposed to be deferred, then we have to queue these errant geometry commands. That would require a better gxfifo we have now, and some mechanism to block while the geometry engine is stalled (which doesnt exist). Since these errant games are nevertheless using flush command to represent the end of a frame, we deem this a good time to execute an actual flush. I think we originally didnt do this because we found some game that it glitched, but that may have been resolved since then by deferring actual rendering to the next vcount=0 (giving textures enough time to upload). But since we're not sure how we'll eventually want this, I am leaving it sort of reconfigurable, doing all the work in this function: */ static void gfx3d_doFlush(); #define GFX_NOARG_COMMAND 0x00 #define GFX_INVALID_COMMAND 0xFF #define GFX_UNDEFINED_COMMAND 0xCC static const u8 gfx3d_commandTypes[] = { /* 00 */ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //invalid commands; no parameters /* 10 */ 0x01,0x00,0x01,0x01,0x01,0x00,0x10,0x0C, 0x10,0x0C,0x09,0x03,0x03,0xCC,0xCC,0xCC, //matrix commands /* 20 */ 0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0xCC,0xCC,0xCC,0xCC, //vertex and per-vertex material commands /* 30 */ 0x01,0x01,0x01,0x01,0x20,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //lighting engine material commands /* 40 */ 0x01,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //begin and end /* 50 */ 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //swapbuffers /* 60 */ 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //viewport /* 70 */ 0x03,0x02,0x01,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //tests //0x80: /* 80 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* 90 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* A0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* B0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* C0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* D0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* E0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, /* F0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC }; class GXF_Hardware { public: GXF_Hardware() { reset(); } void reset() { countdown = 0; commandCursor = 4; for(int i=0;i<4;i++) { commandsPending[i].command = 0; commandsPending[i].countdown = 0; } size = 0; } void receive(u32 val) { if (size > 0) { GFX_FIFOsend(front().command, val); front().countdown--; if (front().countdown == 0) { size--; if (size == 0) return; dequeue(); while (gfx3d_commandTypes[front().command] == GFX_NOARG_COMMAND) { GFX_FIFOsend(front().command, 0); size--; if (size == 0) break; dequeue(); } } } else { if (val == 0) return; // nop const u8 commands[] = { val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF, (val>>24)&0xFF }; const u8 commandTypes[] = { gfx3d_commandTypes[commands[0]], gfx3d_commandTypes[commands[1]], gfx3d_commandTypes[commands[2]], gfx3d_commandTypes[commands[3]] }; commandCursor = 0; size = 0; // A "command without parameters" is one of the four following commands: // - PushMatrix // - LoadIdentity // - End // - Commands undefined within the region between 0x10 and 0xFF for (u8 i = 0; i < 4; i++) { if (commandTypes[i] == GFX_INVALID_COMMAND) { //printf("gfx3D: invalid command (%02X)\n", commands[i]); continue; } if (commandTypes[i] == GFX_UNDEFINED_COMMAND) { //printf("gfx3D: undefined command (%02X)\n", commands[i]); continue; } commandsPending[size].command = commands[i]; commandsPending[size].countdown = commandTypes[i]; //printf("%i: CMD %02X size %i\n", i, commands[i], commandsPending[size].countdown); if ((commandsPending[size].countdown == 0) && (size == 0)) // cmd 0x11, 0x15, 0x41 - no params { GFX_FIFOsend(commands[i], 0); while ((i < 4) && commands[i+1] != 0 && gfx3d_commandTypes[commands[i+1]] == GFX_NOARG_COMMAND) GFX_FIFOsend(commands[++i], 0); } else size++; } } } struct CommandItem { u8 command, countdown; } commandsPending[4]; u32 commandCursor; u8 countdown; private: void dequeue() { commandCursor++; } CommandItem& front() { return commandsPending[commandCursor]; } u32 size; public: void savestate(EMUFILE *f) { //TODO - next time we invalidate savestates, simplify this format. write32le(1,f); //version write32le(size,f); write32le(commandCursor,f); for(u32 i=0;i<4;i++) write8le(commandsPending[i].command,f); for(u32 i=0;i<4;i++) write8le(commandsPending[i].countdown,f); write8le(countdown,f); } bool loadstate(EMUFILE *f) { u32 version; if(read32le(&version,f) != 1) return false; if(version > 1) return false; if (version == 0) { read32le(&size,f); commandCursor = 4-size; for(u32 i=commandCursor;i<4;i++) read8le(&commandsPending[i-commandCursor].command,f); read32le(&size,f); size = 4-commandCursor; for(u32 i=commandCursor;i<4;i++) read8le(&commandsPending[i-commandCursor].countdown,f); } else if (version == 1) { read32le(&size,f); read32le(&commandCursor,f); for(u32 i=0;i<4;i++) read8le(&commandsPending[i].command,f); for(u32 i=0;i<4;i++) read8le(&commandsPending[i].countdown,f); } read8le(&countdown,f); return true; } } gxf_hardware; //these were 4 for the longest time (this is MUCH, MUCH less than their theoretical values) //but it was changed to 1 for strawberry shortcake, which was issuing direct commands //while the fifo was full, apparently expecting the fifo not to be full by that time. //in general we are finding that 3d takes less time than we think.... //although maybe the true culprit was charging the cpu less time for the dma. #define GFX_DELAY(x) NDS_RescheduleGXFIFO(1); #define GFX_DELAY_M2(x) NDS_RescheduleGXFIFO(1); using std::max; using std::min; GFX3D gfx3d; Viewer3d_State* viewer3d_state = NULL; static GFX3D_Clipper boxtestClipper; //tables that are provided to anyone CACHE_ALIGN u32 color_15bit_to_24bit_reverse[32768]; CACHE_ALIGN u32 color_15bit_to_24bit[32768]; CACHE_ALIGN u16 color_15bit_to_16bit_reverse[32768]; CACHE_ALIGN u8 mixTable555[32][32][32]; CACHE_ALIGN u32 dsDepthExtend_15bit_to_24bit[32768]; //is this a crazy idea? this table spreads 5 bits evenly over 31 from exactly 0 to INT_MAX CACHE_ALIGN const int material_5bit_to_31bit[] = { 0x00000000, 0x04210842, 0x08421084, 0x0C6318C6, 0x10842108, 0x14A5294A, 0x18C6318C, 0x1CE739CE, 0x21084210, 0x25294A52, 0x294A5294, 0x2D6B5AD6, 0x318C6318, 0x35AD6B5A, 0x39CE739C, 0x3DEF7BDE, 0x42108421, 0x46318C63, 0x4A5294A5, 0x4E739CE7, 0x5294A529, 0x56B5AD6B, 0x5AD6B5AD, 0x5EF7BDEF, 0x6318C631, 0x6739CE73, 0x6B5AD6B5, 0x6F7BDEF7, 0x739CE739, 0x77BDEF7B, 0x7BDEF7BD, 0x7FFFFFFF }; CACHE_ALIGN const u8 material_5bit_to_6bit[] = { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x19, 0x1A, 0x1C, 0x1E, 0x21, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D, 0x2F, 0x31, 0x33, 0x35, 0x37, 0x39, 0x3B, 0x3D, 0x3F }; CACHE_ALIGN const u8 material_5bit_to_8bit[] = { 0x00, 0x08, 0x10, 0x18, 0x21, 0x29, 0x31, 0x39, 0x42, 0x4A, 0x52, 0x5A, 0x63, 0x6B, 0x73, 0x7B, 0x84, 0x8C, 0x94, 0x9C, 0xA5, 0xAD, 0xB5, 0xBD, 0xC6, 0xCE, 0xD6, 0xDE, 0xE7, 0xEF, 0xF7, 0xFF }; CACHE_ALIGN const u8 material_3bit_to_8bit[] = { 0x00, 0x24, 0x49, 0x6D, 0x92, 0xB6, 0xDB, 0xFF }; //maybe not very precise CACHE_ALIGN const u8 material_3bit_to_5bit[] = { 0, 4, 8, 13, 17, 22, 26, 31 }; //TODO - generate this in the static init method more accurately CACHE_ALIGN const u8 material_3bit_to_6bit[] = { 0, 8, 16, 26, 34, 44, 52, 63 }; //private acceleration tables static float float16table[65536]; static float float10Table[1024]; static float float10RelTable[1024]; static float normalTable[1024]; #define fix2float(v) (((float)((s32)(v))) / (float)(1<<12)) #define fix10_2float(v) (((float)((s32)(v))) / (float)(1<<9)) CACHE_ALIGN u8 gfx3d_convertedScreen[256*192*4]; // Matrix stack handling CACHE_ALIGN MatrixStack mtxStack[4] = { MatrixStack(1, 0), // Projection stack MatrixStack(31, 1), // Coordinate stack MatrixStack(31, 2), // Directional stack MatrixStack(1, 3), // Texture stack }; int _hack_getMatrixStackLevel(int which) { return mtxStack[which].position; } static CACHE_ALIGN s32 mtxCurrent [4][16]; static CACHE_ALIGN s32 mtxTemporal[16]; static u32 mode = 0; // Indexes for matrix loading/multiplication static u8 ML4x4ind = 0; static u8 ML4x3ind = 0; static u8 MM4x4ind = 0; static u8 MM4x3ind = 0; static u8 MM3x3ind = 0; // Data for vertex submission static CACHE_ALIGN s16 s16coord[4] = {0, 0, 0, 0}; static char coordind = 0; static u32 vtxFormat = GFX3D_TRIANGLES; static BOOL inBegin = FALSE; // Data for basic transforms static CACHE_ALIGN s32 trans[4] = {0, 0, 0, 0}; static int transind = 0; static CACHE_ALIGN s32 scale[4] = {0, 0, 0, 0}; static int scaleind = 0; static u32 viewport = 0; //various other registers static s32 _t=0, _s=0; static s32 last_t, last_s; static u32 clCmd = 0; static u32 clInd = 0; static u32 clInd2 = 0; BOOL isSwapBuffers = FALSE; static u32 BTind = 0; static u32 PTind = 0; static CACHE_ALIGN u16 BTcoords[6] = {0, 0, 0, 0, 0, 0}; static CACHE_ALIGN float PTcoords[4] = {0.0, 0.0, 0.0, 1.0}; //raw ds format poly attributes static u32 polyAttr=0,textureFormat=0, texturePalette=0, polyAttrPending=0; //the current vertex color, 5bit values static u8 colorRGB[4] = { 31,31,31,31 }; u32 control = 0; //light state: static u32 lightColor[4] = {0,0,0,0}; static s32 lightDirection[4] = {0,0,0,0}; //material state: static u16 dsDiffuse, dsAmbient, dsSpecular, dsEmission; //used for indexing the shininess table during parameters to shininess command static int shininessInd = 0; //-----------cached things: //these dont need to go into the savestate. they can be regenerated from HW registers //from polygonattr: static unsigned int cullingMask=0; static u32 envMode=0; static u32 lightMask=0; //other things: static int texCoordinateTransform = 0; static CACHE_ALIGN s32 cacheLightDirection[4][4]; static CACHE_ALIGN s32 cacheHalfVector[4][4]; //------------------ #define RENDER_FRONT_SURFACE 0x80 #define RENDER_BACK_SURFACE 0X40 //-------------poly and vertex lists and such things POLYLIST* polylists = NULL; POLYLIST* polylist = NULL; VERTLIST* vertlists = NULL; VERTLIST* vertlist = NULL; int polygonListCompleted = 0; int listTwiddle = 1; int triStripToggle; //list-building state struct tmpVertInfo { //the number of verts registered in this list int count; //indices to the main vert list int map[4]; //indicates that the first poly in a list has been completed BOOL first; } tempVertInfo; static void twiddleLists() { listTwiddle++; listTwiddle &= 1; polylist = &polylists[listTwiddle]; vertlist = &vertlists[listTwiddle]; polylist->count = 0; vertlist->count = 0; } static BOOL flushPending = FALSE; static BOOL drawPending = FALSE; //------------------------------------------------------------ static void makeTables() { //produce the color bits of a 24bpp color from a DS RGB15 using bit logic (internal use only) #define RGB15TO24_BITLOGIC(col) ( (material_5bit_to_8bit[((col)>>10)&0x1F]<<16) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<8) | material_5bit_to_8bit[(col)&0x1F] ) //produce the color bits of a 24bpp color from a DS RGB15 using bit logic (internal use only). RGB are reverse of usual #define RGB15TO24_BITLOGIC_REVERSE(col) ( (material_5bit_to_8bit[(col)&0x1F]<<16) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<8) | material_5bit_to_8bit[((col)>>10)&0x1F] ) for(u16 i=0;i<32768;i++) { color_15bit_to_24bit[i] = LE_TO_LOCAL_32( RGB15TO24_BITLOGIC(i) ); color_15bit_to_24bit_reverse[i] = LE_TO_LOCAL_32( RGB15TO24_BITLOGIC_REVERSE(i) ); color_15bit_to_16bit_reverse[i] = (((i & 0x001F) << 11) | (material_5bit_to_6bit[(i & 0x03E0) >> 5] << 5) | ((i & 0x7C00) >> 10)); // 15-bit to 24-bit depth formula from http://nocash.emubase.de/gbatek.htm#ds3drearplane dsDepthExtend_15bit_to_24bit[i] = LE_TO_LOCAL_32( (i*0x200)+((i+1)>>15)*0x01FF ); } for (int i = 0; i < 65536; i++) float16table[i] = fix2float((signed short)i); for (int i = 0; i < 1024; i++) float10Table[i] = ((signed short)(i<<6)) / (float)(1<<12); for (int i = 0; i < 1024; i++) float10RelTable[i] = ((signed short)(i<<6)) / (float)(1<<18); for (int i = 0; i < 1024; i++) normalTable[i] = ((signed short)(i<<6)) / (float)(1<<15); for(int r=0;r<=31;r++) for(int oldr=0;oldr<=31;oldr++) for(int a=0;a<=31;a++) { int temp = (r*a + oldr*(31-a)) / 31; mixTable555[a][r][oldr] = temp; } } void gfx3d_init() { gxf_hardware.reset(); //gxf_hardware.test(); int zzz=9; //DWORD start = timeGetTime(); //for(int i=0;i<1000000000;i++) // MatrixMultVec4x4(mtxCurrent[0],mtxCurrent[1]); //DWORD end = timeGetTime(); //DWORD diff = end-start; //start = timeGetTime(); //for(int i=0;i<1000000000;i++) // MatrixMultVec4x4_b(mtxCurrent[0],mtxCurrent[1]); //end = timeGetTime(); //DWORD diff2 = end-start; //printf("SPEED TEST %d %d\n",diff,diff2); if(polylists == NULL) { polylists = new POLYLIST[2]; polylist = &polylists[0]; } if(vertlists == NULL) { vertlists = new VERTLIST[2]; vertlist = &vertlists[0]; } makeTables(); gfx3d_reset(); } void gfx3d_reset() { gpu3D->NDS_3D_RenderFinish(); #ifdef _SHOW_VTX_COUNTERS max_polys = max_verts = 0; #endif reconstruct(&gfx3d); delete viewer3d_state; viewer3d_state = new Viewer3d_State(); gxf_hardware.reset(); control = 0; drawPending = FALSE; flushPending = FALSE; memset(polylists, 0, sizeof(POLYLIST)*2); memset(vertlists, 0, sizeof(VERTLIST)*2); gfx3d.state.invalidateToon = true; listTwiddle = 1; twiddleLists(); gfx3d.polylist = polylist; gfx3d.vertlist = vertlist; polyAttr = 0; textureFormat = 0; texturePalette = 0; polyAttrPending = 0; mode = 0; s16coord[0] = s16coord[1] = s16coord[2] = s16coord[3] = 0; coordind = 0; vtxFormat = GFX3D_TRIANGLES; memset(trans, 0, sizeof(trans)); transind = 0; memset(scale, 0, sizeof(scale)); scaleind = 0; viewport = 0; memset(gxPIPE.cmd, 0, sizeof(gxPIPE.cmd)); memset(gxPIPE.param, 0, sizeof(gxPIPE.param)); memset(colorRGB, 0, sizeof(colorRGB)); memset(&tempVertInfo, 0, sizeof(tempVertInfo)); MatrixInit (mtxCurrent[0]); MatrixInit (mtxCurrent[1]); MatrixInit (mtxCurrent[2]); MatrixInit (mtxCurrent[3]); MatrixInit (mtxTemporal); MatrixStackInit(&mtxStack[0]); MatrixStackInit(&mtxStack[1]); MatrixStackInit(&mtxStack[2]); MatrixStackInit(&mtxStack[3]); clCmd = 0; clInd = 0; ML4x4ind = 0; ML4x3ind = 0; MM4x4ind = 0; MM4x3ind = 0; MM3x3ind = 0; BTind = 0; PTind = 0; _t=0; _s=0; last_t = 0; last_s = 0; viewport = 0xBFFF0000; memset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedScreen)); gfx3d.state.clearDepth = DS_DEPTH15TO24(0x7FFF); clInd2 = 0; isSwapBuffers = FALSE; GFX_PIPEclear(); GFX_FIFOclear(); } //================================================================================= Geometry Engine //================================================================================= //================================================================================= inline float vec3dot(float* a, float* b) { return (((a[0]) * (b[0])) + ((a[1]) * (b[1])) + ((a[2]) * (b[2]))); } FORCEINLINE s32 mul_fixed32(s32 a, s32 b) { return fx32_shiftdown(fx32_mul(a,b)); } FORCEINLINE s32 vec3dot_fixed32(const s32* a, const s32* b) { return fx32_shiftdown(fx32_mul(a[0],b[0]) + fx32_mul(a[1],b[1]) + fx32_mul(a[2],b[2])); } #define SUBMITVERTEX(ii, nn) polylist->list[polylist->count].vertIndexes[ii] = tempVertInfo.map[nn]; //Submit a vertex to the GE static void SetVertex() { s32 coord[3] = { s16coord[0], s16coord[1], s16coord[2] }; DS_ALIGN(16) s32 coordTransformed[4] = { coord[0], coord[1], coord[2], (1<<12) }; if (texCoordinateTransform == 3) { //Tested by: Eledees The Adventures of Kai and Zero (E) [title screen and frontend menus] last_s = (s32)(((s64)s16coord[0] * mtxCurrent[3][0] + (s64)s16coord[1] * mtxCurrent[3][4] + (s64)s16coord[2] * mtxCurrent[3][8] + (((s64)(_s))<<24))>>24); last_t = (s32)(((s64)s16coord[0] * mtxCurrent[3][1] + (s64)s16coord[1] * mtxCurrent[3][5] + (s64)s16coord[2] * mtxCurrent[3][9] + (((s64)(_t))<<24))>>24); } //refuse to do anything if we have too many verts or polys polygonListCompleted = 0; if(vertlist->count >= VERTLIST_SIZE) return; if(polylist->count >= POLYLIST_SIZE) return; //TODO - think about keeping the clip matrix concatenated, //so that we only have to multiply one matrix here //(we could lazy cache the concatenated clip matrix and only generate it //when we need to) MatrixMultVec4x4_M2(mtxCurrent[0], coordTransformed); //printf("%f %f %f\n",s16coord[0]/4096.0f,s16coord[1]/4096.0f,s16coord[2]/4096.0f); //printf("x %f %f %f %f\n",mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f); //printf(" = %f %f %f %f\n",coordTransformed[0]/4096.0f,coordTransformed[1]/4096.0f,coordTransformed[2]/4096.0f,coordTransformed[3]/4096.0f); //TODO - culling should be done here. //TODO - viewport transform? int continuation = 0; if(vtxFormat==GFX3D_TRIANGLE_STRIP && !tempVertInfo.first) continuation = 2; else if(vtxFormat==GFX3D_QUAD_STRIP && !tempVertInfo.first) continuation = 2; //record the vertex //VERT &vert = tempVertList.list[tempVertList.count]; int vertIndex = vertlist->count + tempVertInfo.count - continuation; if(vertIndex<0) { printf("wtf\n"); } VERT &vert = vertlist->list[vertIndex]; //printf("%f %f %f\n",coordTransformed[0],coordTransformed[1],coordTransformed[2]); //if(coordTransformed[1] > 20) // coordTransformed[1] = 20; //printf("y-> %f\n",coord[1]); //if(mtxCurrent[1][14]>15) { // printf("ACK!\n"); // printf("----> modelview 1 state for that ack:\n"); // //MatrixPrint(mtxCurrent[1]); //} vert.texcoord[0] = last_s/16.0f; vert.texcoord[1] = last_t/16.0f; vert.coord[0] = coordTransformed[0]/4096.0f; vert.coord[1] = coordTransformed[1]/4096.0f; vert.coord[2] = coordTransformed[2]/4096.0f; vert.coord[3] = coordTransformed[3]/4096.0f; vert.color[0] = GFX3D_5TO6(colorRGB[0]); vert.color[1] = GFX3D_5TO6(colorRGB[1]); vert.color[2] = GFX3D_5TO6(colorRGB[2]); tempVertInfo.map[tempVertInfo.count] = vertlist->count + tempVertInfo.count - continuation; tempVertInfo.count++; //possibly complete a polygon { polygonListCompleted = 2; switch(vtxFormat) { case GFX3D_TRIANGLES: if(tempVertInfo.count!=3) break; polygonListCompleted = 1; //vertlist->list[polylist->list[polylist->count].vertIndexes[i] = vertlist->count++] = tempVertList.list[n]; SUBMITVERTEX(0,0); SUBMITVERTEX(1,1); SUBMITVERTEX(2,2); vertlist->count+=3; polylist->list[polylist->count].type = 3; tempVertInfo.count = 0; break; case GFX3D_QUADS: if(tempVertInfo.count!=4) break; polygonListCompleted = 1; SUBMITVERTEX(0,0); SUBMITVERTEX(1,1); SUBMITVERTEX(2,2); SUBMITVERTEX(3,3); vertlist->count+=4; polylist->list[polylist->count].type = 4; tempVertInfo.count = 0; break; case GFX3D_TRIANGLE_STRIP: if(tempVertInfo.count!=3) break; polygonListCompleted = 1; SUBMITVERTEX(0,0); SUBMITVERTEX(1,1); SUBMITVERTEX(2,2); polylist->list[polylist->count].type = 3; if(triStripToggle) tempVertInfo.map[1] = vertlist->count+2-continuation; else tempVertInfo.map[0] = vertlist->count+2-continuation; if(tempVertInfo.first) vertlist->count+=3; else vertlist->count+=1; triStripToggle ^= 1; tempVertInfo.first = false; tempVertInfo.count = 2; break; case GFX3D_QUAD_STRIP: if(tempVertInfo.count!=4) break; polygonListCompleted = 1; SUBMITVERTEX(0,0); SUBMITVERTEX(1,1); SUBMITVERTEX(2,3); SUBMITVERTEX(3,2); polylist->list[polylist->count].type = 4; tempVertInfo.map[0] = vertlist->count+2-continuation; tempVertInfo.map[1] = vertlist->count+3-continuation; if(tempVertInfo.first) vertlist->count+=4; else vertlist->count+=2; tempVertInfo.first = false; tempVertInfo.count = 2; break; default: return; } if(polygonListCompleted == 1) { POLY &poly = polylist->list[polylist->count]; poly.vtxFormat = vtxFormat; // Line segment detect // Tested" Castlevania POR - warp stone, trajectory of ricochet, "Eye of Decay" if (!(textureFormat & (7 << 26))) // no texture { bool duplicated = false; VERT &vert0 = vertlist->list[poly.vertIndexes[0]]; VERT &vert1 = vertlist->list[poly.vertIndexes[1]]; VERT &vert2 = vertlist->list[poly.vertIndexes[2]]; if ( (vert0.x == vert1.x) && (vert0.y == vert1.y) ) duplicated = true; else if ( (vert1.x == vert2.x) && (vert1.y == vert2.y) ) duplicated = true; else if ( (vert0.y == vert1.y) && (vert1.y == vert2.y) ) duplicated = true; else if ( (vert0.x == vert1.x) && (vert1.x == vert2.x) ) duplicated = true; if (duplicated) { //printf("Line Segmet detected (poly type %i, mode %i, texparam %08X)\n", poly.type, poly.vtxFormat, textureFormat); poly.vtxFormat = vtxFormat + 4; } } poly.polyAttr = polyAttr; poly.texParam = textureFormat; poly.texPalette = texturePalette; poly.viewport = viewport; polylist->count++; } } } static void gfx3d_glPolygonAttrib_cache() { // Light enable/disable lightMask = (polyAttr&0xF); // texture environment envMode = (polyAttr&0x30)>>4; // back face culling cullingMask = (polyAttr>>6)&3; } static void gfx3d_glTexImage_cache() { texCoordinateTransform = (textureFormat>>30); } static void gfx3d_glLightDirection_cache(int index) { s32 v = lightDirection[index]; s16 x = ((v<<22)>>22)<<3; s16 y = ((v<<12)>>22)<<3; s16 z = ((v<<2)>>22)<<3; cacheLightDirection[index][0] = x; cacheLightDirection[index][1] = y; cacheLightDirection[index][2] = z; cacheLightDirection[index][3] = 0; //Multiply the vector by the directional matrix MatrixMultVec3x3_fixed(mtxCurrent[2], cacheLightDirection[index]); //Calculate the half angle vector s32 lineOfSight[4] = {0, 0, (-1)<<12, 0}; for(int i = 0; i < 4; i++) { cacheHalfVector[index][i] = ((cacheLightDirection[index][i] + lineOfSight[i])); } //normalize the half angle vector //can't believe the hardware really does this... but yet it seems... s32 halfLength = ((s32)(sqrt((double)vec3dot_fixed32(cacheHalfVector[index],cacheHalfVector[index]))))<<6; if(halfLength!=0) { halfLength = abs(halfLength); halfLength >>= 6; for(int i = 0; i < 4; i++) { s32 temp = cacheHalfVector[index][i]; temp <<= 6; temp /= halfLength; cacheHalfVector[index][i] = temp; } } } //=============================================================================== static void gfx3d_glMatrixMode(u32 v) { mode = (v&3); GFX_DELAY(1); } static void gfx3d_glPushMatrix() { //this command always works on both pos and vector when either pos or pos-vector are the current mtx mode short mymode = (mode==1?2:mode); MatrixStackPushMatrix(&mtxStack[mymode], mtxCurrent[mymode]); GFX_DELAY(17); if(mymode==2) MatrixStackPushMatrix (&mtxStack[1], mtxCurrent[1]); } static void gfx3d_glPopMatrix(s32 i) { // The stack has only one level (at address 0) in projection mode, // in that mode, the parameter value is ignored, the offset is always +1 in that mode. if (mode == 0) i = 1; //this command always works on both pos and vector when either pos or pos-vector are the current mtx mode short mymode = (mode==1?2:mode); //i = (i<<26)>>26; //previously, we sign extended here. that isnt really necessary since the stacks are apparently modularly addressed. so i am somewhat doubtful that this is a real concept. //example: //suppose we had a -30 that would be %100010. //which is the same as adding 34. if our stack was at 17 then one way is 17-30(+32)=19 and the other way is 17+34(-32)=19 //please note that our ability to skip treating this as signed is dependent on the modular addressing later. if that ever changes, we need to change this back. MatrixStackPopMatrix(mtxCurrent[mymode], &mtxStack[mymode], i); GFX_DELAY(36); if (mymode == 2) MatrixStackPopMatrix(mtxCurrent[1], &mtxStack[1], i); } static void gfx3d_glStoreMatrix(u32 v) { //this command always works on both pos and vector when either pos or pos-vector are the current mtx mode short mymode = (mode==1?2:mode); //limit height of these stacks. //without the mymode==3 namco classics galaxian will try to use pos=1 and overrun the stack, corrupting emu if(mymode==0 || mymode==3) v = 0; v &= 31; //according to gbatek, 31 works but sets the stack overflow flag //spider-man 2 tests this on the spiderman model (and elsewhere) //i am somewhat skeptical of this, but we'll leave it this way for now. //a test shouldnt be too hard if(v==31) MMU_new.gxstat.se = 1; MatrixStackLoadMatrix (&mtxStack[mymode], v, mtxCurrent[mymode]); GFX_DELAY(17); if(mymode==2) MatrixStackLoadMatrix (&mtxStack[1], v, mtxCurrent[1]); } static void gfx3d_glRestoreMatrix(u32 v) { //this command always works on both pos and vector when either pos or pos-vector are the current mtx mode short mymode = (mode==1?2:mode); //limit height of these stacks //without the mymode==3 namco classics galaxian will try to use pos=1 and overrun the stack, corrupting emu if(mymode==0 || mymode==3) v = 0; v &= 31; //according to gbatek, 31 works but sets the stack overflow flag //spider-man 2 tests this on the spiderman model (and elsewhere) //i am somewhat skeptical of this, but we'll leave it this way for now. //a test shouldnt be too hard if(v==31) MMU_new.gxstat.se = 1; MatrixCopy (mtxCurrent[mymode], MatrixStackGetPos(&mtxStack[mymode], v)); GFX_DELAY(36); if (mymode == 2) MatrixCopy (mtxCurrent[1], MatrixStackGetPos(&mtxStack[1], v)); } static void gfx3d_glLoadIdentity() { MatrixIdentity (mtxCurrent[mode]); GFX_DELAY(19); if (mode == 2) MatrixIdentity (mtxCurrent[1]); //printf("identity: %d to: \n",mode); MatrixPrint(mtxCurrent[1]); } static BOOL gfx3d_glLoadMatrix4x4(s32 v) { mtxCurrent[mode][ML4x4ind] = v; ++ML4x4ind; if(ML4x4ind<16) return FALSE; ML4x4ind = 0; GFX_DELAY(19); //vector_fix2float<4>(mtxCurrent[mode], 4096.f); if (mode == 2) MatrixCopy (mtxCurrent[1], mtxCurrent[2]); //printf("load4x4: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); return TRUE; } static BOOL gfx3d_glLoadMatrix4x3(s32 v) { mtxCurrent[mode][ML4x3ind] = v; ML4x3ind++; if((ML4x3ind & 0x03) == 3) ML4x3ind++; if(ML4x3ind<16) return FALSE; ML4x3ind = 0; //vector_fix2float<4>(mtxCurrent[mode], 4096.f); //fill in the unusued matrix values mtxCurrent[mode][3] = mtxCurrent[mode][7] = mtxCurrent[mode][11] = 0; mtxCurrent[mode][15] = (1<<12); GFX_DELAY(30); if (mode == 2) MatrixCopy (mtxCurrent[1], mtxCurrent[2]); //printf("load4x3: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); return TRUE; } static BOOL gfx3d_glMultMatrix4x4(s32 v) { mtxTemporal[MM4x4ind] = v; MM4x4ind++; if(MM4x4ind<16) return FALSE; MM4x4ind = 0; GFX_DELAY(35); //vector_fix2float<4>(mtxTemporal, 4096.f); MatrixMultiply (mtxCurrent[mode], mtxTemporal); if (mode == 2) { MatrixMultiply (mtxCurrent[1], mtxTemporal); GFX_DELAY_M2(30); } //printf("mult4x4: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); MatrixIdentity (mtxTemporal); return TRUE; } static BOOL gfx3d_glMultMatrix4x3(s32 v) { mtxTemporal[MM4x3ind] = v; MM4x3ind++; if((MM4x3ind & 0x03) == 3) MM4x3ind++; if(MM4x3ind<16) return FALSE; MM4x3ind = 0; GFX_DELAY(31); //vector_fix2float<4>(mtxTemporal, 4096.f); //fill in the unusued matrix values mtxTemporal[3] = mtxTemporal[7] = mtxTemporal[11] = 0; mtxTemporal[15] = 1<<12; MatrixMultiply (mtxCurrent[mode], mtxTemporal); if (mode == 2) { MatrixMultiply (mtxCurrent[1], mtxTemporal); GFX_DELAY_M2(30); } //printf("mult4x3: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); //does this really need to be done? MatrixIdentity (mtxTemporal); return TRUE; } static BOOL gfx3d_glMultMatrix3x3(s32 v) { mtxTemporal[MM3x3ind] = v; MM3x3ind++; if((MM3x3ind & 0x03) == 3) MM3x3ind++; if(MM3x3ind<12) return FALSE; MM3x3ind = 0; GFX_DELAY(28); //vector_fix2float<3>(mtxTemporal, 4096.f); //fill in the unusued matrix values mtxTemporal[3] = mtxTemporal[7] = mtxTemporal[11] = 0; mtxTemporal[15] = 1<<12; mtxTemporal[12] = mtxTemporal[13] = mtxTemporal[14] = 0; MatrixMultiply (mtxCurrent[mode], mtxTemporal); if (mode == 2) { MatrixMultiply (mtxCurrent[1], mtxTemporal); GFX_DELAY_M2(30); } //printf("mult3x3: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); //does this really need to be done? MatrixIdentity (mtxTemporal); return TRUE; } static BOOL gfx3d_glScale(s32 v) { scale[scaleind] = v; ++scaleind; if(scaleind<3) return FALSE; scaleind = 0; MatrixScale (mtxCurrent[(mode==2?1:mode)], scale); //printf("scale: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); GFX_DELAY(22); //note: pos-vector mode should not cause both matrices to scale. //the whole purpose is to keep the vector matrix orthogonal //so, I am leaving this commented out as an example of what not to do. //if (mode == 2) // MatrixScale (mtxCurrent[1], scale); return TRUE; } static BOOL gfx3d_glTranslate(s32 v) { trans[transind] = v; ++transind; if(transind<3) return FALSE; transind = 0; MatrixTranslate (mtxCurrent[mode], trans); GFX_DELAY(22); if (mode == 2) { MatrixTranslate (mtxCurrent[1], trans); GFX_DELAY_M2(30); } //printf("translate: matrix %d to: \n",mode); MatrixPrint(mtxCurrent[1]); return TRUE; } static void gfx3d_glColor3b(u32 v) { colorRGB[0] = (v&0x1F); colorRGB[1] = ((v>>5)&0x1F); colorRGB[2] = ((v>>10)&0x1F); GFX_DELAY(1); } static void gfx3d_glNormal(s32 v) { s16 nx = ((v<<22)>>22)<<3; s16 ny = ((v<<12)>>22)<<3; s16 nz = ((v<<2)>>22)<<3; CACHE_ALIGN s32 normal[4] = { nx,ny,nz,(1<<12) }; if (texCoordinateTransform == 2) { //SM64 highlight rendered star in main menu tests this //also smackdown 2010 player textures tested this (needed cast on _s and _t) last_s = (s32)(((s64)normal[0] * mtxCurrent[3][0] + (s64)normal[1] * mtxCurrent[3][4] + (s64)normal[2] * mtxCurrent[3][8] + (((s64)_s)<<24))>>24); last_t = (s32)(((s64)normal[0] * mtxCurrent[3][1] + (s64)normal[1] * mtxCurrent[3][5] + (s64)normal[2] * mtxCurrent[3][9] + (((s64)_t)<<24))>>24); } MatrixMultVec3x3_fixed(mtxCurrent[2],normal); //apply lighting model u8 diffuse[3] = { (dsDiffuse)&0x1F, (dsDiffuse>>5)&0x1F, (dsDiffuse>>10)&0x1F }; u8 ambient[3] = { (dsAmbient)&0x1F, (dsAmbient>>5)&0x1F, (dsAmbient>>10)&0x1F }; u8 emission[3] = { (dsEmission)&0x1F, (dsEmission>>5)&0x1F, (dsEmission>>10)&0x1F }; u8 specular[3] = { (dsSpecular)&0x1F, (dsSpecular>>5)&0x1F, (dsSpecular>>10)&0x1F }; int vertexColor[3] = { emission[0], emission[1], emission[2] }; for(int i=0; i<4; i++) { if(!((lightMask>>i)&1)) continue; u8 _lightColor[3] = { (lightColor[i])&0x1F, (lightColor[i]>>5)&0x1F, (lightColor[i]>>10)&0x1F }; //This formula is the one used by the DS //Reference : http://nocash.emubase.de/gbatek.htm#ds3dpolygonlightparameters s32 fixed_diffuse = std::max(0,-vec3dot_fixed32(cacheLightDirection[i],normal)); //todo - this could be cached in this form s32 fixedTempNegativeHalf[] = {-cacheHalfVector[i][0],-cacheHalfVector[i][1],-cacheHalfVector[i][2],-cacheHalfVector[i][3]}; s32 dot = vec3dot_fixed32(fixedTempNegativeHalf, normal); s32 fixedshininess = 0; if(dot>0) //prevent shininess on opposite side { //we have cos(a). it seems that we need cos(2a). trig identity is a fast way to get it. //cos^2(a)=(1/2)(1+cos(2a)) //2*cos^2(a)-1=cos(2a) fixedshininess = 2*mul_fixed32(dot,dot)-4096; //gbatek is almost right but not quite! } //this seems to need to be saturated, or else the table will overflow. //even without a table, failure to saturate is bad news fixedshininess = std::min(fixedshininess,4095); fixedshininess = std::max(fixedshininess,0); if(dsSpecular & 0x8000) { //shininess is 20.12 fixed point, so >>5 gives us .7 which is 128 entries //the entries are 8bits each so <<4 gives us .12 again, compatible with the lighting formulas below //(according to other normal nds procedures, we might should fill the bottom bits with 1 or 0 according to rules...) fixedshininess = gfx3d.state.shininessTable[fixedshininess>>5]<<4; } for(int c = 0; c < 3; c++) { s32 specComp = ((specular[c] * _lightColor[c] * fixedshininess)>>17); //5 bits for color*color and 12 bits for the shininess s32 diffComp = ((diffuse[c] * _lightColor[c] * fixed_diffuse)>>17); //5bits for the color*color and 12 its for the diffuse s32 ambComp = ((ambient[c] * _lightColor[c])>>5); //5bits for color*color vertexColor[c] += specComp + diffComp + ambComp; } } for(int c=0;c<3;c++) { colorRGB[c] = std::min(31,vertexColor[c]); } GFX_DELAY(9); GFX_DELAY_M2((lightMask) & 0x01); GFX_DELAY_M2((lightMask>>1) & 0x01); GFX_DELAY_M2((lightMask>>2) & 0x01); GFX_DELAY_M2((lightMask>>3) & 0x01); } static void gfx3d_glTexCoord(s32 val) { _s = ((val<<16)>>16); _t = (val>>16); if (texCoordinateTransform == 1) { //dragon quest 4 overworld will test this last_s = (s32)(((s64)(_s<<12) * mtxCurrent[3][0] + (s64)(_t<<12) * mtxCurrent[3][4] + ((s64)mtxCurrent[3][8]<<12) + ((s64)mtxCurrent[3][12]<<12))>>24); last_t = (s32)(((s64)(_s<<12) * mtxCurrent[3][1] + (s64)(_t<<12) * mtxCurrent[3][5] + ((s64)mtxCurrent[3][9]<<12) + ((s64)mtxCurrent[3][13]<<12))>>24); } else if(texCoordinateTransform == 0) { last_s=_s; last_t=_t; } GFX_DELAY(1); } static BOOL gfx3d_glVertex16b(s32 v) { if(coordind==0) { s16coord[0] = (v<<16)>>16; s16coord[1] = (v>>16)&0xFFFF; ++coordind; return FALSE; } s16coord[2] = (v<<16)>>16; coordind = 0; SetVertex (); GFX_DELAY(9); return TRUE; } static void gfx3d_glVertex10b(s32 v) { //TODO TODO TODO - contemplate the sign extension - shift in zeroes or ones? zeroes is certainly more normal.. s16coord[0] = ((v<<22)>>22)<<6; s16coord[1] = ((v<<12)>>22)<<6; s16coord[2] = ((v<<2)>>22)<<6; GFX_DELAY(8); SetVertex (); } template static void gfx3d_glVertex3_cord(s32 v) { s16coord[ONE] = (v<<16)>>16; s16coord[TWO] = (v>>16); SetVertex (); GFX_DELAY(8); } static void gfx3d_glVertex_rel(s32 v) { s16 x = ((v<<22)>>22); s16 y = ((v<<12)>>22); s16 z = ((v<<2)>>22); s16coord[0] += x; s16coord[1] += y; s16coord[2] += z; SetVertex (); GFX_DELAY(8); } static void gfx3d_glPolygonAttrib (u32 val) { if(inBegin) { //PROGINFO("Set polyattr in the middle of a begin/end pair.\n (This won't be activated until the next begin)\n"); //TODO - we need some some similar checking for teximageparam etc. } polyAttrPending = val; GFX_DELAY(1); } static void gfx3d_glTexImage(u32 val) { textureFormat = val; gfx3d_glTexImage_cache(); GFX_DELAY(1); } static void gfx3d_glTexPalette(u32 val) { texturePalette = val; GFX_DELAY(1); } /* 0-4 Diffuse Reflection Red 5-9 Diffuse Reflection Green 10-14 Diffuse Reflection Blue 15 Set Vertex Color (0=No, 1=Set Diffuse Reflection Color as Vertex Color) 16-20 Ambient Reflection Red 21-25 Ambient Reflection Green 26-30 Ambient Reflection Blue */ static void gfx3d_glMaterial0(u32 val) { dsDiffuse = val&0xFFFF; dsAmbient = val>>16; if (BIT15(val)) { colorRGB[0] = (val)&0x1F; colorRGB[1] = (val>>5)&0x1F; colorRGB[2] = (val>>10)&0x1F; } GFX_DELAY(4); } static void gfx3d_glMaterial1(u32 val) { dsSpecular = val&0xFFFF; dsEmission = val>>16; GFX_DELAY(4); } /* 0-9 Directional Vector's X component (1bit sign + 9bit fractional part) 10-19 Directional Vector's Y component (1bit sign + 9bit fractional part) 20-29 Directional Vector's Z component (1bit sign + 9bit fractional part) 30-31 Light Number (0..3) */ static void gfx3d_glLightDirection (u32 v) { int index = v>>30; lightDirection[index] = (s32)(v&0x3FFFFFFF); gfx3d_glLightDirection_cache(index); GFX_DELAY(6); } static void gfx3d_glLightColor (u32 v) { int index = v>>30; lightColor[index] = v; GFX_DELAY(1); } static BOOL gfx3d_glShininess (u32 val) { gfx3d.state.shininessTable[shininessInd++] = ((val & 0xFF)); gfx3d.state.shininessTable[shininessInd++] = (((val >> 8) & 0xFF)); gfx3d.state.shininessTable[shininessInd++] = (((val >> 16) & 0xFF)); gfx3d.state.shininessTable[shininessInd++] = (((val >> 24) & 0xFF)); if (shininessInd < 128) return FALSE; shininessInd = 0; GFX_DELAY(32); return TRUE; } static void gfx3d_glBegin(u32 v) { inBegin = TRUE; vtxFormat = v&0x03; triStripToggle = 0; tempVertInfo.count = 0; tempVertInfo.first = true; polyAttr = polyAttrPending; gfx3d_glPolygonAttrib_cache(); GFX_DELAY(1); } static void gfx3d_glEnd(void) { tempVertInfo.count = 0; inBegin = FALSE; GFX_DELAY(1); } // swap buffers - skipped static void gfx3d_glViewPort(u32 v) { viewport = v; GFX_DELAY(1); } static BOOL gfx3d_glBoxTest(u32 v) { //printf("boxtest\n"); MMU_new.gxstat.tr = 0; // clear boxtest bit MMU_new.gxstat.tb = 1; // busy BTcoords[BTind++] = v & 0xFFFF; BTcoords[BTind++] = v >> 16; if (BTind < 5) return FALSE; BTind = 0; MMU_new.gxstat.tb = 0; // clear busy GFX_DELAY(103); #if 0 INFO("BoxTEST: x %f y %f width %f height %f depth %f\n", BTcoords[0], BTcoords[1], BTcoords[2], BTcoords[3], BTcoords[4], BTcoords[5]); /*for (int i = 0; i < 16; i++) { INFO("mtx1[%i] = %f ", i, mtxCurrent[1][i]); if ((i+1) % 4 == 0) INFO("\n"); } INFO("\n");*/ #endif //(crafted to be clear, not fast.) //nanostray title, ff4, ice age 3 depend on this and work //garfields nightmare and strawberry shortcake DO DEPEND on the overflow behavior. u16 ux = BTcoords[0]; u16 uy = BTcoords[1]; u16 uz = BTcoords[2]; u16 uw = BTcoords[3]; u16 uh = BTcoords[4]; u16 ud = BTcoords[5]; //craft the coords by adding extents to startpoint float x = float16table[ux]; float y = float16table[uy]; float z = float16table[uz]; float xw = float16table[(ux+uw)&0xFFFF]; //&0xFFFF not necessary for u16+u16 addition but added for emphasis float yh = float16table[(uy+uh)&0xFFFF]; float zd = float16table[(uz+ud)&0xFFFF]; //eight corners of cube VERT verts[8]; verts[0].set_coord(x,y,z,1); verts[1].set_coord(xw,y,z,1); verts[2].set_coord(xw,yh,z,1); verts[3].set_coord(x,yh,z,1); verts[4].set_coord(x,y,zd,1); verts[5].set_coord(xw,y,zd,1); verts[6].set_coord(xw,yh,zd,1); verts[7].set_coord(x,yh,zd,1); //craft the faces of the box (clockwise) POLY polys[6]; polys[0].setVertIndexes(7,6,5,4); //near polys[1].setVertIndexes(0,1,2,3); //far polys[2].setVertIndexes(0,3,7,4); //left polys[3].setVertIndexes(6,2,1,5); //right polys[4].setVertIndexes(3,2,6,7); //top polys[5].setVertIndexes(0,4,5,1); //bottom //setup the clipper GFX3D_Clipper::TClippedPoly tempClippedPoly; boxtestClipper.clippedPolys = &tempClippedPoly; boxtestClipper.reset(); ////----------------------------- ////awesome hack: ////emit the box as geometry for testing //for(int i=0;i<6;i++) //{ // POLY* poly = &polys[i]; // VERT* vertTable[4] = { // &verts[poly->vertIndexes[0]], // &verts[poly->vertIndexes[1]], // &verts[poly->vertIndexes[2]], // &verts[poly->vertIndexes[3]] // }; // gfx3d_glBegin(1); // for(int i=0;i<4;i++) { // coord[0] = vertTable[i]->x; // coord[1] = vertTable[i]->y; // coord[2] = vertTable[i]->z; // SetVertex(); // } // gfx3d_glEnd(); //} ////--------------------- //transform all coords for(int i=0;i<8;i++) { //MatrixMultVec4x4_M2(mtxCurrent[0], verts[i].coord); CACHE_ALIGN float temp1[16] = {mtxCurrent[1][0]/4096.0f,mtxCurrent[1][1]/4096.0f,mtxCurrent[1][2]/4096.0f,mtxCurrent[1][3]/4096.0f,mtxCurrent[1][4]/4096.0f,mtxCurrent[1][5]/4096.0f,mtxCurrent[1][6]/4096.0f,mtxCurrent[1][7]/4096.0f,mtxCurrent[1][8]/4096.0f,mtxCurrent[1][9]/4096.0f,mtxCurrent[1][10]/4096.0f,mtxCurrent[1][11]/4096.0f,mtxCurrent[1][12]/4096.0f,mtxCurrent[1][13]/4096.0f,mtxCurrent[1][14]/4096.0f,mtxCurrent[1][15]/4096.0f}; CACHE_ALIGN float temp0[16] = {mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f,mtxCurrent[0][4]/4096.0f,mtxCurrent[0][5]/4096.0f,mtxCurrent[0][6]/4096.0f,mtxCurrent[0][7]/4096.0f,mtxCurrent[0][8]/4096.0f,mtxCurrent[0][9]/4096.0f,mtxCurrent[0][10]/4096.0f,mtxCurrent[0][11]/4096.0f,mtxCurrent[0][12]/4096.0f,mtxCurrent[0][13]/4096.0f,mtxCurrent[0][14]/4096.0f,mtxCurrent[0][15]/4096.0f}; _NOSSE_MatrixMultVec4x4(temp1,verts[i].coord); _NOSSE_MatrixMultVec4x4(temp0,verts[i].coord); } //clip each poly for(int i=0;i<6;i++) { POLY* poly = &polys[i]; VERT* vertTable[4] = { &verts[poly->vertIndexes[0]], &verts[poly->vertIndexes[1]], &verts[poly->vertIndexes[2]], &verts[poly->vertIndexes[3]] }; boxtestClipper.clipPoly(poly,vertTable); //if any portion of this poly was retained, then the test passes. if(boxtestClipper.clippedPolyCounter>0) { //printf("%06d PASS %d\n",boxcounter,gxFIFO.size); MMU_new.gxstat.tr = 1; break; } } if(MMU_new.gxstat.tr == 0) { //printf("%06d FAIL %d\n",boxcounter,gxFIFO.size); } return TRUE; } static BOOL gfx3d_glPosTest(u32 v) { //printf("postest\n"); //this is apparently tested by transformers decepticons and ultimate spiderman //printf("POSTEST\n"); MMU_new.gxstat.tb = 1; PTcoords[PTind++] = float16table[v & 0xFFFF]; PTcoords[PTind++] = float16table[v >> 16]; if (PTind < 3) return FALSE; PTind = 0; PTcoords[3] = 1.0f; CACHE_ALIGN float temp1[16] = {mtxCurrent[1][0]/4096.0f,mtxCurrent[1][1]/4096.0f,mtxCurrent[1][2]/4096.0f,mtxCurrent[1][3]/4096.0f,mtxCurrent[1][4]/4096.0f,mtxCurrent[1][5]/4096.0f,mtxCurrent[1][6]/4096.0f,mtxCurrent[1][7]/4096.0f,mtxCurrent[1][8]/4096.0f,mtxCurrent[1][9]/4096.0f,mtxCurrent[1][10]/4096.0f,mtxCurrent[1][11]/4096.0f,mtxCurrent[1][12]/4096.0f,mtxCurrent[1][13]/4096.0f,mtxCurrent[1][14]/4096.0f,mtxCurrent[1][15]/4096.0f}; CACHE_ALIGN float temp0[16] = {mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f,mtxCurrent[0][4]/4096.0f,mtxCurrent[0][5]/4096.0f,mtxCurrent[0][6]/4096.0f,mtxCurrent[0][7]/4096.0f,mtxCurrent[0][8]/4096.0f,mtxCurrent[0][9]/4096.0f,mtxCurrent[0][10]/4096.0f,mtxCurrent[0][11]/4096.0f,mtxCurrent[0][12]/4096.0f,mtxCurrent[0][13]/4096.0f,mtxCurrent[0][14]/4096.0f,mtxCurrent[0][15]/4096.0f}; MatrixMultVec4x4(temp1, PTcoords); MatrixMultVec4x4(temp0, PTcoords); MMU_new.gxstat.tb = 0; GFX_DELAY(9); return TRUE; } static void gfx3d_glVecTest(u32 v) { //printf("vectest\n"); GFX_DELAY(5); //this is tested by phoenix wright in its evidence inspector modelviewer //i am not sure exactly what it is doing, maybe it is testing to ensure //that the normal vector for the point of interest is camera-facing. CACHE_ALIGN float normal[4] = { normalTable[v&1023], normalTable[(v>>10)&1023], normalTable[(v>>20)&1023], 0}; CACHE_ALIGN float temp[16] = {mtxCurrent[2][0]/4096.0f,mtxCurrent[2][1]/4096.0f,mtxCurrent[2][2]/4096.0f,mtxCurrent[2][3]/4096.0f,mtxCurrent[2][4]/4096.0f,mtxCurrent[2][5]/4096.0f,mtxCurrent[2][6]/4096.0f,mtxCurrent[2][7]/4096.0f,mtxCurrent[2][8]/4096.0f,mtxCurrent[2][9]/4096.0f,mtxCurrent[2][10]/4096.0f,mtxCurrent[2][11]/4096.0f,mtxCurrent[2][12]/4096.0f,mtxCurrent[2][13]/4096.0f,mtxCurrent[2][14]/4096.0f,mtxCurrent[2][15]/4096.0f}; MatrixMultVec4x4(temp, normal); s16 x = (s16)(normal[0]*4096); s16 y = (s16)(normal[1]*4096); s16 z = (s16)(normal[2]*4096); MMU_new.gxstat.tb = 0; // clear busy T1WriteWord(MMU.MMU_MEM[0][0x40], 0x630, x); T1WriteWord(MMU.MMU_MEM[0][0x40], 0x632, y); T1WriteWord(MMU.MMU_MEM[0][0x40], 0x634, z); } //================================================================================= Geometry Engine //================================================================================= (end) //================================================================================= void VIEWPORT::decode(u32 v) { x = (v&0xFF); y = std::min(191,(int)(((v>>8)&0xFF))); width = (((v>>16)&0xFF)+1)-(v&0xFF); height = ((v>>24)+1)-((v>>8)&0xFF); } void gfx3d_glFogColor(u32 v) { gfx3d.state.fogColor = v; } void gfx3d_glFogOffset (u32 v) { gfx3d.state.fogOffset = (v&0x7fff); } void gfx3d_glClearDepth(u32 v) { gfx3d.state.clearDepth = DS_DEPTH15TO24(v); } // Ignored for now void gfx3d_glSwapScreen(unsigned int screen) { } int gfx3d_GetNumPolys() { //so is this in the currently-displayed or currently-built list? return (polylists[listTwiddle].count); } int gfx3d_GetNumVertex() { //so is this in the currently-displayed or currently-built list? return (vertlists[listTwiddle].count); } void gfx3d_UpdateToonTable(u8 offset, u16 val) { gfx3d.state.invalidateToon = true; gfx3d.state.u16ToonTable[offset] = val; //printf("toon %d set to %04X\n",offset,val); } void gfx3d_UpdateToonTable(u8 offset, u32 val) { //C.O.P. sets toon table via this method gfx3d.state.invalidateToon = true; gfx3d.state.u16ToonTable[offset] = val & 0xFFFF; gfx3d.state.u16ToonTable[offset+1] = val >> 16; //printf("toon %d set to %04X\n",offset,gfx3d.state.u16ToonTable[offset]); //printf("toon %d set to %04X\n",offset+1,gfx3d.state.u16ToonTable[offset+1]); } s32 gfx3d_GetClipMatrix (unsigned int index) { s32 val = MatrixGetMultipliedIndex (index, mtxCurrent[0], mtxCurrent[1]); //printf("reading clip matrix: %d\n",index); return (s32)val; } s32 gfx3d_GetDirectionalMatrix (unsigned int index) { int _index = (((index / 3) * 4) + (index % 3)); //return (s32)(mtxCurrent[2][_index]*(1<<12)); return mtxCurrent[2][_index]; } void gfx3d_glAlphaFunc(u32 v) { gfx3d.state.alphaTestRef = v&31; } unsigned int gfx3d_glGetPosRes(unsigned int index) { return (unsigned int)(PTcoords[index] * 4096.0f); } //#define _3D_LOG_EXEC #ifdef _3D_LOG_EXEC static void log3D(u8 cmd, u32 param) { INFO("3D command 0x%02X: ", cmd); switch (cmd) { case 0x10: // MTX_MODE - Set Matrix Mode (W) printf("MTX_MODE(%08X)", param); break; case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W) printf("MTX_PUSH()\t"); break; case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) printf("MTX_POP(%08X)", param); break; case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) printf("MTX_STORE(%08X)", param); break; case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) printf("MTX_RESTORE(%08X)", param); break; case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W) printf("MTX_IDENTIFY()\t"); break; case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) printf("MTX_LOAD_4x4(%08X)", param); break; case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) printf("MTX_LOAD_4x3(%08X)", param); break; case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) printf("MTX_MULT_4x4(%08X)", param); break; case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) printf("MTX_MULT_4x3(%08X)", param); break; case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) printf("MTX_MULT_3x3(%08X)", param); break; case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) printf("MTX_SCALE(%08X)", param); break; case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) printf("MTX_TRANS(%08X)", param); break; case 0x20: // COLOR - Directly Set Vertex Color (W) printf("COLOR(%08X)", param); break; case 0x21: // NORMAL - Set Normal Vector (W) printf("NORMAL(%08X)", param); break; case 0x22: // TEXCOORD - Set Texture Coordinates (W) printf("TEXCOORD(%08X)", param); break; case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) printf("VTX_16(%08X)", param); break; case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) printf("VTX_10(%08X)", param); break; case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) printf("VTX_XY(%08X)", param); break; case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) printf("VTX_XZ(%08X)", param); break; case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) printf("VTX_YZ(%08X)", param); break; case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) printf("VTX_DIFF(%08X)", param); break; case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) printf("POLYGON_ATTR(%08X)", param); break; case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) printf("TEXIMAGE_PARAM(%08X)", param); break; case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) printf("PLTT_BASE(%08X)", param); break; case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) printf("DIF_AMB(%08X)", param); break; case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) printf("SPE_EMI(%08X)", param); break; case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) printf("LIGHT_VECTOR(%08X)", param); break; case 0x33: // LIGHT_COLOR - Set Light Color (W) printf("LIGHT_COLOR(%08X)", param); break; case 0x34: // SHININESS - Specular Reflection Shininess Table (W) printf("SHININESS(%08X)", param); break; case 0x40: // BEGIN_VTXS - Start of Vertex List (W) printf("BEGIN_VTXS(%08X)", param); break; case 0x41: // END_VTXS - End of Vertex List (W) printf("END_VTXS()\t"); break; case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) printf("SWAP_BUFFERS(%08X)", param); break; case 0x60: // VIEWPORT - Set Viewport (W) printf("VIEWPORT(%08X)", param); break; case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) printf("BOX_TEST(%08X)", param); break; case 0x71: // POS_TEST - Set Position Coordinates for Test (W) printf("POS_TEST(%08X)", param); break; case 0x72: // VEC_TEST - Set Directional Vector for Test (W) printf("VEC_TEST(%08X)", param); break; default: INFO("!!! Unknown(%08X)", param); break; } printf("\t\t(FIFO size %i)\n", gxFIFO.size); } #endif static void gfx3d_execute(u8 cmd, u32 param) { #ifdef _3D_LOG_EXEC log3D(cmd, param); #endif switch (cmd) { case 0x10: // MTX_MODE - Set Matrix Mode (W) gfx3d_glMatrixMode(param); break; case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W) gfx3d_glPushMatrix(); break; case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) gfx3d_glPopMatrix(param); break; case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) gfx3d_glStoreMatrix(param); break; case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) gfx3d_glRestoreMatrix(param); break; case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W) gfx3d_glLoadIdentity(); break; case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) gfx3d_glLoadMatrix4x4(param); break; case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) gfx3d_glLoadMatrix4x3(param); break; case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) gfx3d_glMultMatrix4x4(param); break; case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) gfx3d_glMultMatrix4x3(param); break; case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) gfx3d_glMultMatrix3x3(param); break; case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) gfx3d_glScale(param); break; case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) gfx3d_glTranslate(param); break; case 0x20: // COLOR - Directly Set Vertex Color (W) gfx3d_glColor3b(param); break; case 0x21: // NORMAL - Set Normal Vector (W) gfx3d_glNormal(param); break; case 0x22: // TEXCOORD - Set Texture Coordinates (W) gfx3d_glTexCoord(param); break; case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) gfx3d_glVertex16b(param); break; case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) gfx3d_glVertex10b(param); break; case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) gfx3d_glVertex3_cord<0,1>(param); break; case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) gfx3d_glVertex3_cord<0,2>(param); break; case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) gfx3d_glVertex3_cord<1,2>(param); break; case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) gfx3d_glVertex_rel(param); break; case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) gfx3d_glPolygonAttrib(param); break; case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) gfx3d_glTexImage(param); break; case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) gfx3d_glTexPalette(param); break; case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) gfx3d_glMaterial0(param); break; case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) gfx3d_glMaterial1(param); break; case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) gfx3d_glLightDirection(param); break; case 0x33: // LIGHT_COLOR - Set Light Color (W) gfx3d_glLightColor(param); break; case 0x34: // SHININESS - Specular Reflection Shininess Table (W) gfx3d_glShininess(param); break; case 0x40: // BEGIN_VTXS - Start of Vertex List (W) gfx3d_glBegin(param); break; case 0x41: // END_VTXS - End of Vertex List (W) gfx3d_glEnd(); break; case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) gfx3d_glFlush(param); break; case 0x60: // VIEWPORT - Set Viewport (W) gfx3d_glViewPort(param); break; case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) gfx3d_glBoxTest(param); break; case 0x71: // POS_TEST - Set Position Coordinates for Test (W) gfx3d_glPosTest(param); break; case 0x72: // VEC_TEST - Set Directional Vector for Test (W) gfx3d_glVecTest(param); break; default: INFO("Unknown execute FIFO 3D command 0x%02X with param 0x%08X\n", cmd, param); break; } } void gfx3d_execute3D() { u8 cmd = 0; u32 param = 0; #ifndef FLUSHMODE_HACK if (isSwapBuffers) return; #endif //this is a SPEED HACK //fifo is currently emulated more accurately than it probably needs to be. //without this batch size the emuloop will escape way too often to run fast. const int HACK_FIFO_BATCH_SIZE = 64; for(int i=0;ilist[num1]; const POLY &poly2 = polylist->list[num2]; //this may be verified by checking the game create menus in harvest moon island of happiness //also the buttons in the knights in the nightmare frontend depend on this and the perspective division if (poly1.maxy < poly2.maxy) return true; if (poly1.maxy > poly2.maxy) return false; if (poly1.miny < poly2.miny) return true; if (poly1.miny > poly2.miny) return false; //notably, the main shop interface in harvest moon will not have a correct RTN button //i think this is due to a math error rounding its position to one pixel too high and it popping behind //the bar that it sits on. //everything else in all the other menus that I could find looks right.. //make sure we respect the game's ordering in cases of complete ties //this makes it a stable sort. //this must be a stable sort or else advance wars DOR will flicker in the main map mode if (num1 < num2) return true; else return false; } static void gfx3d_doFlush() { gfx3d.frameCtr++; //the renderer will get the lists we just built gfx3d.polylist = polylist; gfx3d.vertlist = vertlist; //and also our current render state if(BIT1(control)) gfx3d.state.shading = GFX3D_State::HIGHLIGHT; else gfx3d.state.shading = GFX3D_State::TOON; gfx3d.state.enableTexturing = BIT0(control); gfx3d.state.enableAlphaTest = BIT2(control); gfx3d.state.enableAlphaBlending = BIT3(control); gfx3d.state.enableAntialiasing = BIT4(control); gfx3d.state.enableEdgeMarking = BIT5(control); gfx3d.state.enableFogAlphaOnly = BIT6(control); gfx3d.state.enableFog = BIT7(control); gfx3d.state.enableClearImage = BIT14(control); gfx3d.state.fogShift = (control>>8)&0xF; gfx3d.state.sortmode = BIT0(gfx3d.state.activeFlushCommand); gfx3d.state.wbuffer = BIT1(gfx3d.state.activeFlushCommand); gfx3d.renderState = gfx3d.state; // Override render states per user settings if(!CommonSettings.GFX3D_Texture) gfx3d.renderState.enableTexturing = false; if(!CommonSettings.GFX3D_EdgeMark) gfx3d.renderState.enableEdgeMarking = false; if(!CommonSettings.GFX3D_Fog) gfx3d.renderState.enableFog = false; gfx3d.state.activeFlushCommand = gfx3d.state.pendingFlushCommand; int polycount = polylist->count; #ifdef _SHOW_VTX_COUNTERS max_polys = max((u32)polycount, max_polys); max_verts = max((u32)vertlist->count, max_verts); osd->addFixed(180, 20, "%i/%i", polycount, vertlist->count); // current osd->addFixed(180, 35, "%i/%i", max_polys, max_verts); // max #endif //find the min and max y values for each poly. //TODO - this could be a small waste of time if we are manual sorting the translucent polys //TODO - this _MUST_ be moved later in the pipeline, after clipping. //the w-division here is just an approximation to fix the shop in harvest moon island of happiness //also the buttons in the knights in the nightmare frontend depend on this for(int i=0; ilist[i]; float verty = vertlist->list[poly.vertIndexes[0]].y; float vertw = vertlist->list[poly.vertIndexes[0]].w; verty = 1.0f-(verty+vertw)/(2*vertw); poly.miny = poly.maxy = verty; for(int j=1; jlist[poly.vertIndexes[j]].y; vertw = vertlist->list[poly.vertIndexes[j]].w; verty = 1.0f-(verty+vertw)/(2*vertw); poly.miny = min(poly.miny, verty); poly.maxy = max(poly.maxy, verty); } } //we need to sort the poly list with alpha polys last //first, look for opaque polys int ctr=0; for(int i=0;ilist[i]; if(!poly.isTranslucent()) gfx3d.indexlist.list[ctr++] = i; } int opaqueCount = ctr; //then look for translucent polys for(int i=0;ilist[i]; if(poly.isTranslucent()) gfx3d.indexlist.list[ctr++] = i; } //now we have to sort the opaque polys by y-value. //(test case: harvest moon island of happiness character cretor UI) //should this be done after clipping?? std::sort(gfx3d.indexlist.list, gfx3d.indexlist.list + opaqueCount, gfx3d_ysort_compare); if(!gfx3d.state.sortmode) { //if we are autosorting translucent polys, we need to do this also //TODO - this is unverified behavior. need a test case std::sort(gfx3d.indexlist.list + opaqueCount, gfx3d.indexlist.list + polycount, gfx3d_ysort_compare); } //switch to the new lists twiddleLists(); if(driver->view3d->IsRunning()) { viewer3d_state->frameNumber = currFrameCounter; viewer3d_state->state = gfx3d.state; viewer3d_state->polylist = *gfx3d.polylist; viewer3d_state->vertlist = *gfx3d.vertlist; viewer3d_state->indexlist = gfx3d.indexlist; driver->view3d->NewFrame(); } drawPending = TRUE; } void gfx3d_VBlankSignal() { if (isSwapBuffers) { #ifndef FLUSHMODE_HACK gfx3d_doFlush(); #endif GFX_DELAY(392); isSwapBuffers = FALSE; } } void gfx3d_VBlankEndSignal(bool skipFrame) { if (!drawPending) return; if(skipFrame) return; drawPending = FALSE; if(!CommonSettings.showGpu.main) { memset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedScreen)); return; } gpu3D->NDS_3D_Render(); } //#define _3D_LOG void gfx3d_sendCommandToFIFO(u32 val) { //printf("gxFIFO: send val=0x%08X, size=%03i (fifo)\n", val, gxFIFO.size); gxf_hardware.receive(val); } void gfx3d_sendCommand(u32 cmd, u32 param) { cmd = (cmd & 0x01FF) >> 2; //printf("gxFIFO: send 0x%02X: val=0x%08X, size=%03i (direct)\n", cmd, param, gxFIFO.size); #ifdef _3D_LOG INFO("gxFIFO: send 0x%02X: val=0x%08X, pipe %02i, fifo %03i (direct)\n", cmd, param, gxPIPE.tail, gxFIFO.tail); #endif switch (cmd) { case 0x10: // MTX_MODE - Set Matrix Mode (W) case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W) case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W) case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) case 0x20: // COLOR - Directly Set Vertex Color (W) case 0x21: // NORMAL - Set Normal Vector (W) case 0x22: // TEXCOORD - Set Texture Coordinates (W) case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) case 0x33: // LIGHT_COLOR - Set Light Color (W) case 0x34: // SHININESS - Specular Reflection Shininess Table (W) case 0x40: // BEGIN_VTXS - Start of Vertex List (W) case 0x41: // END_VTXS - End of Vertex List (W) case 0x60: // VIEWPORT - Set Viewport (W) case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) case 0x71: // POS_TEST - Set Position Coordinates for Test (W) case 0x72: // VEC_TEST - Set Directional Vector for Test (W) //printf("mmu: sending %02X: %08X\n", cmd,param); GFX_FIFOsend(cmd, param); break; case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) //printf("mmu: sending %02X: %08X\n", cmd,param); GFX_FIFOsend(cmd, param); break; default: INFO("Unknown 3D command %03X with param 0x%08X (directport)\n", cmd, param); break; } } void gfx3d_Control(u32 v) { control = v; } //-------------- //other misc stuff void gfx3d_glGetMatrix(unsigned int m_mode, int index, float* dest) { //if(index == -1) //{ // MatrixCopy(dest, mtxCurrent[m_mode]); // return; //} //MatrixCopy(dest, MatrixStackGetPos(&mtxStack[m_mode], index)); s32* src; if(index==-1) src = mtxCurrent[m_mode]; else src=MatrixStackGetPos(&mtxStack[m_mode],index); for(int i=0;i<16;i++) dest[i] = src[i]/4096.0f; } void gfx3d_glGetLightDirection(unsigned int index, unsigned int* dest) { *dest = lightDirection[index]; } void gfx3d_glGetLightColor(unsigned int index, unsigned int* dest) { *dest = lightColor[index]; } void gfx3d_GetLineData(int line, u8** dst) { gpu3D->NDS_3D_RenderFinish(); *dst = gfx3d_convertedScreen+((line)<<(8+2)); } void gfx3d_GetLineData15bpp(int line, u16** dst) { //TODO - this is not very thread safe!!! static u16 buf[256]; *dst = buf; u8* lineData; gfx3d_GetLineData(line, &lineData); for(int i=0;i<256;i++) { const u8 r = lineData[i*4+0]; const u8 g = lineData[i*4+1]; const u8 b = lineData[i*4+2]; const u8 a = lineData[i*4+3]; buf[i] = R6G6B6TORGB15(r,g,b) | (a==0?0:0x8000); } } //http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node17.html //talks about the state required to process verts in quadlists etc. helpful ideas. //consider building a little state structure that looks exactly like this describes SFORMAT SF_GFX3D[]={ { "GCTL", 4, 1, &control}, // no longer regenerated indirectly, see comment in loadstate() { "GPAT", 4, 1, &polyAttr}, { "GPAP", 4, 1, &polyAttrPending}, { "GINB", 4, 1, &inBegin}, { "GTFM", 4, 1, &textureFormat}, { "GTPA", 4, 1, &texturePalette}, { "GMOD", 4, 1, &mode}, { "GMTM", 4,16, mtxTemporal}, { "GMCU", 4,64, mtxCurrent}, { "ML4I", 1, 1, &ML4x4ind}, { "ML3I", 1, 1, &ML4x3ind}, { "MM4I", 1, 1, &MM4x4ind}, { "MM3I", 1, 1, &MM4x3ind}, { "MMxI", 1, 1, &MM3x3ind}, { "GSCO", 4, 1, s16coord}, { "GCOI", 1, 1, &coordind}, { "GVFM", 4, 1, &vtxFormat}, { "GTRN", 4, 4, trans}, { "GTRI", 1, 1, &transind}, { "GSCA", 4, 4, scale}, { "GSCI", 1, 1, &scaleind}, { "G_T_", 4, 1, &_t}, { "G_S_", 4, 1, &_s}, { "GL_T", 4, 1, &last_t}, { "GL_S", 4, 1, &last_s}, { "GLCM", 4, 1, &clCmd}, { "GLIN", 4, 1, &clInd}, { "GLI2", 4, 1, &clInd2}, { "GLSB", 4, 1, &isSwapBuffers}, { "GLBT", 4, 1, &BTind}, { "GLPT", 4, 1, &PTind}, { "GLPC", 4, 4, PTcoords}, { "GBTC", 2, 6, &BTcoords[0]}, { "GFHE", 4, 1, &gxFIFO.head}, { "GFTA", 4, 1, &gxFIFO.tail}, { "GFSZ", 4, 1, &gxFIFO.size}, { "GFMS", 4, 1, &gxFIFO.matrix_stack_op_size}, { "GFCM", 1, HACK_GXIFO_SIZE, &gxFIFO.cmd[0]}, { "GFPM", 4, HACK_GXIFO_SIZE, &gxFIFO.param[0]}, { "GPHE", 1, 1, &gxPIPE.head}, { "GPTA", 1, 1, &gxPIPE.tail}, { "GPSZ", 1, 1, &gxPIPE.size}, { "GPCM", 1, 4, &gxPIPE.cmd[0]}, { "GPPM", 4, 4, &gxPIPE.param[0]}, { "GCOL", 1, 4, &colorRGB[0]}, { "GLCO", 4, 4, lightColor}, { "GLDI", 4, 4, lightDirection}, { "GMDI", 2, 1, &dsDiffuse}, { "GMAM", 2, 1, &dsAmbient}, { "GMSP", 2, 1, &dsSpecular}, { "GMEM", 2, 1, &dsEmission}, { "GFLP", 4, 1, &flushPending}, { "GDRP", 4, 1, &drawPending}, { "GSET", 4, 1, &gfx3d.state.enableTexturing}, { "GSEA", 4, 1, &gfx3d.state.enableAlphaTest}, { "GSEB", 4, 1, &gfx3d.state.enableAlphaBlending}, { "GSEX", 4, 1, &gfx3d.state.enableAntialiasing}, { "GSEE", 4, 1, &gfx3d.state.enableEdgeMarking}, { "GSEC", 4, 1, &gfx3d.state.enableClearImage}, { "GSEF", 4, 1, &gfx3d.state.enableFog}, { "GSEO", 4, 1, &gfx3d.state.enableFogAlphaOnly}, { "GFSH", 4, 1, &gfx3d.state.fogShift}, { "GSSH", 4, 1, &gfx3d.state.shading}, { "GSWB", 4, 1, &gfx3d.state.wbuffer}, { "GSSM", 4, 1, &gfx3d.state.sortmode}, { "GSAR", 1, 1, &gfx3d.state.alphaTestRef}, { "GSVP", 4, 1, &viewport}, { "GSCC", 4, 1, &gfx3d.state.clearColor}, { "GSCD", 4, 1, &gfx3d.state.clearDepth}, { "GSFC", 4, 4, &gfx3d.state.fogColor}, { "GSFO", 4, 1, &gfx3d.state.fogOffset}, { "GST4", 2, 32, gfx3d.state.u16ToonTable}, { "GSSU", 1, 128, &gfx3d.state.shininessTable[0]}, { "GSSI", 4, 1, &shininessInd}, { "GSAF", 4, 1, &gfx3d.state.activeFlushCommand}, { "GSPF", 4, 1, &gfx3d.state.pendingFlushCommand}, //------------------------ { "GTST", 4, 1, &triStripToggle}, { "GTVC", 4, 1, &tempVertInfo.count}, { "GTVM", 4, 4, tempVertInfo.map}, { "GTVF", 4, 1, &tempVertInfo.first}, { "G3CX", 1, 4*256*192, gfx3d_convertedScreen}, { 0 } }; //-------------savestate void gfx3d_savestate(EMUFILE* os) { gpu3D->NDS_3D_RenderFinish(); //version write32le(4,os); //dump the render lists OSWRITE(vertlist->count); for(int i=0;icount;i++) vertlist->list[i].save(os); OSWRITE(polylist->count); for(int i=0;icount;i++) polylist->list[i].save(os); for(int i=0;i<4;i++) { OSWRITE(mtxStack[i].position); for(int j=0;j=1) { OSREAD(vertlist->count); for(int i=0;icount;i++) vertlist->list[i].load(is); OSREAD(polylist->count); for(int i=0;icount;i++) polylist->list[i].load(is); } if(version>=2) { for(int i=0;i<4;i++) { OSREAD(mtxStack[i].position); for(int j=0;j=3) { gxf_hardware.loadstate(is); } gfx3d.polylist = &polylists[listTwiddle^1]; gfx3d.vertlist = &vertlists[listTwiddle^1]; gfx3d.polylist->count=0; gfx3d.vertlist->count=0; if(version >= 4) { OSREAD(cacheLightDirection); OSREAD(cacheHalfVector); } return true; } //------------------- //clipping //------------------- // this is optional for now in case someone has trouble with the new method // or wants to toggle it to compare #define OPTIMIZED_CLIPPING_METHOD //#define CLIPLOG(X) printf(X); //#define CLIPLOG2(X,Y,Z) printf(X,Y,Z); #define CLIPLOG(X) #define CLIPLOG2(X,Y,Z) template static T interpolate(const float ratio, const T& x0, const T& x1) { return (T)(x0 + (float)(x1-x0) * (ratio)); } //http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/as6/discussion.shtml #ifdef OPTIMIZED_CLIPPING_METHOD template static FORCEINLINE VERT clipPoint(bool hirez, VERT* inside, VERT* outside) #else static FORCEINLINE VERT clipPoint(VERT* inside, VERT* outside, int coord, int which) #endif { VERT ret; float coord_inside = inside->coord[coord]; float coord_outside = outside->coord[coord]; float w_inside = inside->coord[3]; float w_outside = outside->coord[3]; float t; if(which==-1) { w_outside = -w_outside; w_inside = -w_inside; } t = (coord_inside - w_inside)/ ((w_outside-w_inside) - (coord_outside-coord_inside)); #define INTERP(X) ret . X = interpolate(t, inside-> X ,outside-> X ) INTERP(coord[0]); INTERP(coord[1]); INTERP(coord[2]); INTERP(coord[3]); INTERP(texcoord[0]); INTERP(texcoord[1]); //if(CommonSettings.GFX3D_HighResolutionInterpolateColor) if(hirez) { INTERP(fcolor[0]); INTERP(fcolor[1]); INTERP(fcolor[2]); } else { INTERP(color[0]); INTERP(color[1]); INTERP(color[2]); ret.color_to_float(); } //this seems like a prudent measure to make sure that math doesnt make a point pop back out //of the clip volume through interpolation if(which==-1) ret.coord[coord] = -ret.coord[3]; else ret.coord[coord] = ret.coord[3]; return ret; } #ifdef OPTIMIZED_CLIPPING_METHOD #define MAX_SCRATCH_CLIP_VERTS (4*6 + 40) static VERT scratchClipVerts [MAX_SCRATCH_CLIP_VERTS]; static int numScratchClipVerts = 0; template class ClipperPlane { public: ClipperPlane(Next& next) : m_next(next) {} void init(VERT* verts) { m_prevVert = NULL; m_firstVert = NULL; m_next.init(verts); } void clipVert(bool hirez, VERT* vert) { if(m_prevVert) this->clipSegmentVsPlane(hirez, m_prevVert, vert); else m_firstVert = vert; m_prevVert = vert; } // closes the loop and returns the number of clipped output verts int finish(bool hirez) { this->clipVert(hirez, m_firstVert); return m_next.finish(hirez); } private: VERT* m_prevVert; VERT* m_firstVert; Next& m_next; FORCEINLINE void clipSegmentVsPlane(bool hirez, VERT* vert0, VERT* vert1) { float* vert0coord = vert0->coord; float* vert1coord = vert1->coord; bool out0, out1; if(which==-1) out0 = vert0coord[coord] < -vert0coord[3]; else out0 = vert0coord[coord] > vert0coord[3]; if(which==-1) out1 = vert1coord[coord] < -vert1coord[3]; else out1 = vert1coord[coord] > vert1coord[3]; //CONSIDER: should we try and clip things behind the eye? does this code even successfully do it? not sure. //if(coord==2 && which==1) { // out0 = vert0coord[2] < 0; // out1 = vert1coord[2] < 0; //} //both outside: insert no points if(out0 && out1) { CLIPLOG(" both outside\n"); } //both inside: insert the next point if(!out0 && !out1) { CLIPLOG(" both inside\n"); m_next.clipVert(hirez,vert1); } //exiting volume: insert the clipped point if(!out0 && out1) { CLIPLOG(" exiting\n"); assert((u32)numScratchClipVerts < MAX_SCRATCH_CLIP_VERTS); scratchClipVerts[numScratchClipVerts] = clipPoint(hirez,vert0,vert1); m_next.clipVert(hirez,&scratchClipVerts[numScratchClipVerts++]); } //entering volume: insert clipped point and the next (interior) point if(out0 && !out1) { CLIPLOG(" entering\n"); assert((u32)numScratchClipVerts < MAX_SCRATCH_CLIP_VERTS); scratchClipVerts[numScratchClipVerts] = clipPoint(hirez,vert1,vert0); m_next.clipVert(hirez,&scratchClipVerts[numScratchClipVerts++]); m_next.clipVert(hirez,vert1); } } }; class ClipperOutput { public: void init(VERT* verts) { m_nextDestVert = verts; m_numVerts = 0; } void clipVert(bool hirez, VERT* vert) { assert((u32)m_numVerts < MAX_CLIPPED_VERTS); *m_nextDestVert++ = *vert; m_numVerts++; } int finish(bool hirez) { return m_numVerts; } private: VERT* m_nextDestVert; int m_numVerts; }; // see "Template juggling with Sutherland-Hodgman" http://www.codeguru.com/cpp/misc/misc/graphics/article.php/c8965__2/ // for the idea behind setting things up like this. static ClipperOutput clipperOut; typedef ClipperPlane<2, 1,ClipperOutput> Stage6; static Stage6 clipper6 (clipperOut); // back plane //TODO - we need to parameterize back plane clipping typedef ClipperPlane<2,-1,Stage6> Stage5; static Stage5 clipper5 (clipper6); // front plane typedef ClipperPlane<1, 1,Stage5> Stage4; static Stage4 clipper4 (clipper5); // top plane typedef ClipperPlane<1,-1,Stage4> Stage3; static Stage3 clipper3 (clipper4); // bottom plane typedef ClipperPlane<0, 1,Stage3> Stage2; static Stage2 clipper2 (clipper3); // right plane typedef ClipperPlane<0,-1,Stage2> Stage1; static Stage1 clipper (clipper2); // left plane template void GFX3D_Clipper::clipPoly(POLY* poly, VERT** verts) { CLIPLOG("==Begin poly==\n"); int type = poly->type; numScratchClipVerts = 0; clipper.init(clippedPolys[clippedPolyCounter].clipVerts); for(int i=0;i(POLY* poly, VERT** verts); template void GFX3D_Clipper::clipPoly(POLY* poly, VERT** verts); void GFX3D_Clipper::clipSegmentVsPlane(VERT** verts, const int coord, int which) { // not used (it's probably ok to delete this function) assert(0); } void GFX3D_Clipper::clipPolyVsPlane(const int coord, int which) { // not used (it's probably ok to delete this function) assert(0); } #else // if not OPTIMIZED_CLIPPING_METHOD: FORCEINLINE void GFX3D_Clipper::clipSegmentVsPlane(VERT** verts, const int coord, int which) { bool out0, out1; if(which==-1) out0 = verts[0]->coord[coord] < -verts[0]->coord[3]; else out0 = verts[0]->coord[coord] > verts[0]->coord[3]; if(which==-1) out1 = verts[1]->coord[coord] < -verts[1]->coord[3]; else out1 = verts[1]->coord[coord] > verts[1]->coord[3]; //CONSIDER: should we try and clip things behind the eye? does this code even successfully do it? not sure. //if(coord==2 && which==1) { // out0 = verts[0]->coord[2] < 0; // out1 = verts[1]->coord[2] < 0; //} //both outside: insert no points if(out0 && out1) { CLIPLOG(" both outside\n"); } //both inside: insert the first point if(!out0 && !out1) { CLIPLOG(" both inside\n"); outClippedPoly.clipVerts[outClippedPoly.type++] = *verts[1]; } //exiting volume: insert the clipped point and the first (interior) point if(!out0 && out1) { CLIPLOG(" exiting\n"); outClippedPoly.clipVerts[outClippedPoly.type++] = clipPoint(verts[0],verts[1], coord, which); } //entering volume: insert clipped point if(out0 && !out1) { CLIPLOG(" entering\n"); outClippedPoly.clipVerts[outClippedPoly.type++] = clipPoint(verts[1],verts[0], coord, which); outClippedPoly.clipVerts[outClippedPoly.type++] = *verts[1]; } } FORCEINLINE void GFX3D_Clipper::clipPolyVsPlane(const int coord, int which) { outClippedPoly.type = 0; CLIPLOG2("Clipping coord %d against %f\n",coord,x); for(int i=0;itype; CLIPLOG("==Begin poly==\n"); tempClippedPoly.clipVerts[0] = *verts[0]; tempClippedPoly.clipVerts[1] = *verts[1]; tempClippedPoly.clipVerts[2] = *verts[2]; if(type==4) tempClippedPoly.clipVerts[3] = *verts[3]; tempClippedPoly.type = type; clipPolyVsPlane(0, -1); clipPolyVsPlane(0, 1); clipPolyVsPlane(1, -1); clipPolyVsPlane(1, 1); clipPolyVsPlane(2, -1); clipPolyVsPlane(2, 1); //TODO - we need to parameterize back plane clipping if(tempClippedPoly.type < 3) { //a totally clipped poly. discard it. //or, a degenerate poly. we're not handling these right now } else { //TODO - build right in this list instead of copying clippedPolys[clippedPolyCounter] = tempClippedPoly; clippedPolys[clippedPolyCounter].poly = poly; clippedPolyCounter++; } } #endif desmume-0.9.9/src/thumb_tabdef.inc0000644000175000017500000016477612140261633017653 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ /* 00 0000 0000 */ TABDECL(OP_LSL_0), // OP_LSL_0 /* 00 0000 0001 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0010 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0011 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0100 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0101 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0110 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 0111 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1000 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1001 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1010 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1011 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1100 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1101 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1110 */ TABDECL(OP_LSL), // OP_LSL /* 00 0000 1111 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0000 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0001 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0010 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0011 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0100 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0101 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0110 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 0111 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1000 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1001 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1010 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1011 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1100 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1101 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1110 */ TABDECL(OP_LSL), // OP_LSL /* 00 0001 1111 */ TABDECL(OP_LSL), // OP_LSL /* 00 0010 0000 */ TABDECL(OP_LSR_0), // OP_LSR_0 /* 00 0010 0001 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0010 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0011 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0100 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0101 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0110 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 0111 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1000 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1001 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1010 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1011 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1100 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1101 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1110 */ TABDECL(OP_LSR), // OP_LSR /* 00 0010 1111 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0000 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0001 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0010 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0011 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0100 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0101 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0110 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 0111 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1000 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1001 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1010 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1011 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1100 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1101 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1110 */ TABDECL(OP_LSR), // OP_LSR /* 00 0011 1111 */ TABDECL(OP_LSR), // OP_LSR /* 00 0100 0000 */ TABDECL(OP_ASR_0), // OP_ASR_0 /* 00 0100 0001 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0010 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0011 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0100 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0101 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0110 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 0111 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1000 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1001 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1010 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1011 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1100 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1101 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1110 */ TABDECL(OP_ASR), // OP_ASR /* 00 0100 1111 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0000 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0001 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0010 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0011 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0100 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0101 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0110 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 0111 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1000 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1001 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1010 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1011 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1100 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1101 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1110 */ TABDECL(OP_ASR), // OP_ASR /* 00 0101 1111 */ TABDECL(OP_ASR), // OP_ASR /* 00 0110 0000 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0001 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0010 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0011 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0100 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0101 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0110 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 0111 */ TABDECL(OP_ADD_REG), // OP_ADD_REG /* 00 0110 1000 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1001 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1010 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1011 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1100 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1101 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1110 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0110 1111 */ TABDECL(OP_SUB_REG), // OP_SUB_REG /* 00 0111 0000 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0001 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0010 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0011 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0100 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0101 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0110 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 0111 */ TABDECL(OP_ADD_IMM3), // OP_ADD_IMM3 /* 00 0111 1000 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1001 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1010 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1011 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1100 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1101 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1110 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 0111 1111 */ TABDECL(OP_SUB_IMM3), // OP_SUB_IMM3 /* 00 1000 0000 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0001 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0010 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0011 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0100 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0101 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0110 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 0111 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1000 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1001 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1010 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1011 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1100 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1101 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1110 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1000 1111 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0000 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0001 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0010 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0011 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0100 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0101 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0110 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 0111 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1000 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1001 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1010 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1011 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1100 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1101 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1110 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1001 1111 */ TABDECL(OP_MOV_IMM8), // OP_MOV_IMM8 /* 00 1010 0000 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0001 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0010 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0011 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0100 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0101 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0110 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 0111 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1000 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1001 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1010 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1011 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1100 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1101 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1110 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1010 1111 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0000 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0001 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0010 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0011 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0100 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0101 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0110 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 0111 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1000 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1001 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1010 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1011 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1100 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1101 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1110 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1011 1111 */ TABDECL(OP_CMP_IMM8), // OP_CMP_IMM8 /* 00 1100 0000 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0001 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0010 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0011 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0100 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0101 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0110 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 0111 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1000 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1001 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1010 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1011 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1100 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1101 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1110 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1100 1111 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0000 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0001 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0010 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0011 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0100 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0101 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0110 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 0111 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1000 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1001 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1010 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1011 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1100 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1101 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1110 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1101 1111 */ TABDECL(OP_ADD_IMM8), // OP_ADD_IMM8 /* 00 1110 0000 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0001 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0010 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0011 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0100 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0101 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0110 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 0111 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1000 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1001 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1010 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1011 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1100 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1101 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1110 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1110 1111 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0000 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0001 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0010 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0011 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0100 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0101 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0110 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 0111 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1000 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1001 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1010 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1011 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1100 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1101 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1110 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 00 1111 1111 */ TABDECL(OP_SUB_IMM8), // OP_SUB_IMM8 /* 01 0000 0000 */ TABDECL(OP_AND), // OP_AND /* 01 0000 0001 */ TABDECL(OP_EOR), // OP_EOR /* 01 0000 0010 */ TABDECL(OP_LSL_REG), // OP_LSL_REG /* 01 0000 0011 */ TABDECL(OP_LSR_REG), // OP_LSR_REG /* 01 0000 0100 */ TABDECL(OP_ASR_REG), // OP_ASR_REG /* 01 0000 0101 */ TABDECL(OP_ADC_REG), // OP_ADC_REG /* 01 0000 0110 */ TABDECL(OP_SBC_REG), // OP_SBC_REG /* 01 0000 0111 */ TABDECL(OP_ROR_REG), // OP_ROR_REG /* 01 0000 1000 */ TABDECL(OP_TST), // OP_TST /* 01 0000 1001 */ TABDECL(OP_NEG), // OP_NEG /* 01 0000 1010 */ TABDECL(OP_CMP), // OP_CMP /* 01 0000 1011 */ TABDECL(OP_CMN), // OP_CMN /* 01 0000 1100 */ TABDECL(OP_ORR), // OP_ORR /* 01 0000 1101 */ TABDECL(OP_MUL_REG), // OP_MUL_REG /* 01 0000 1110 */ TABDECL(OP_BIC), // OP_BIC /* 01 0000 1111 */ TABDECL(OP_MVN), // OP_MVN /* 01 0001 0000 */ TABDECL(OP_ADD_SPE), // OP_ADD_SPE /* 01 0001 0001 */ TABDECL(OP_ADD_SPE), // OP_ADD_SPE /* 01 0001 0010 */ TABDECL(OP_ADD_SPE), // OP_ADD_SPE /* 01 0001 0011 */ TABDECL(OP_ADD_SPE), // OP_ADD_SPE /* 01 0001 0100 */ TABDECL(OP_CMP_SPE), // OP_CMP_SPE /* 01 0001 0101 */ TABDECL(OP_CMP_SPE), // OP_CMP_SPE /* 01 0001 0110 */ TABDECL(OP_CMP_SPE), // OP_CMP_SPE /* 01 0001 0111 */ TABDECL(OP_CMP_SPE), // OP_CMP_SPE /* 01 0001 1000 */ TABDECL(OP_MOV_SPE), // OP_MOV_SPE /* 01 0001 1001 */ TABDECL(OP_MOV_SPE), // OP_MOV_SPE /* 01 0001 1010 */ TABDECL(OP_MOV_SPE), // OP_MOV_SPE /* 01 0001 1011 */ TABDECL(OP_MOV_SPE), // OP_MOV_SPE /* 01 0001 1100 */ TABDECL(OP_BX_THUMB), // OP_BX_THUMB /* 01 0001 1101 */ TABDECL(OP_BX_THUMB), // OP_BX_THUMB /* 01 0001 1110 */ TABDECL(OP_BLX_THUMB), // OP_BLX_THUMB /* 01 0001 1111 */ TABDECL(OP_BLX_THUMB), // OP_BLX_THUMB /* 01 0010 0000 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0001 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0010 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0011 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0100 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0101 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0110 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 0111 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1000 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1001 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1010 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1011 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1100 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1101 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1110 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0010 1111 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0000 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0001 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0010 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0011 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0100 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0101 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0110 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 0111 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1000 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1001 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1010 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1011 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1100 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1101 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1110 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0011 1111 */ TABDECL(OP_LDR_PCREL), // OP_LDR_PCREL /* 01 0100 0000 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0001 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0010 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0011 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0100 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0101 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0110 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 0111 */ TABDECL(OP_STR_REG_OFF), // OP_STR_REG_OFF /* 01 0100 1000 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1001 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1010 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1011 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1100 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1101 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1110 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0100 1111 */ TABDECL(OP_STRH_REG_OFF), // OP_STRH_REG_OFF /* 01 0101 0000 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0001 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0010 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0011 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0100 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0101 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0110 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 0111 */ TABDECL(OP_STRB_REG_OFF), // OP_STRB_REG_OFF /* 01 0101 1000 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1001 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1010 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1011 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1100 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1101 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1110 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0101 1111 */ TABDECL(OP_LDRSB_REG_OFF), // OP_LDRSB_REG_OFF /* 01 0110 0000 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0001 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0010 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0011 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0100 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0101 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0110 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 0111 */ TABDECL(OP_LDR_REG_OFF), // OP_LDR_REG_OFF /* 01 0110 1000 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1001 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1010 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1011 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1100 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1101 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1110 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0110 1111 */ TABDECL(OP_LDRH_REG_OFF), // OP_LDRH_REG_OFF /* 01 0111 0000 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0001 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0010 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0011 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0100 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0101 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0110 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 0111 */ TABDECL(OP_LDRB_REG_OFF), // OP_LDRB_REG_OFF /* 01 0111 1000 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1001 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1010 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1011 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1100 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1101 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1110 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 0111 1111 */ TABDECL(OP_LDRSH_REG_OFF), // OP_LDRSH_REG_OFF /* 01 1000 0000 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0001 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0010 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0011 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0100 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0101 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0110 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 0111 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1000 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1001 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1010 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1011 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1100 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1101 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1110 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1000 1111 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0000 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0001 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0010 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0011 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0100 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0101 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0110 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 0111 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1000 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1001 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1010 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1011 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1100 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1101 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1110 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1001 1111 */ TABDECL(OP_STR_IMM_OFF), // OP_STR_IMM_OFF /* 01 1010 0000 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0001 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0010 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0011 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0100 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0101 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0110 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 0111 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1000 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1001 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1010 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1011 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1100 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1101 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1110 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1010 1111 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0000 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0001 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0010 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0011 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0100 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0101 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0110 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 0111 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1000 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1001 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1010 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1011 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1100 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1101 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1110 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1011 1111 */ TABDECL(OP_LDR_IMM_OFF), // OP_LDR_IMM_OFF /* 01 1100 0000 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0001 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0010 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0011 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0100 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0101 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0110 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 0111 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1000 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1001 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1010 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1011 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1100 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1101 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1110 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1100 1111 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0000 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0001 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0010 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0011 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0100 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0101 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0110 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 0111 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1000 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1001 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1010 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1011 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1100 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1101 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1110 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1101 1111 */ TABDECL(OP_STRB_IMM_OFF), // OP_STRB_IMM_OFF /* 01 1110 0000 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0001 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0010 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0011 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0100 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0101 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0110 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 0111 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1000 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1001 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1010 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1011 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1100 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1101 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1110 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1110 1111 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0000 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0001 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0010 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0011 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0100 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0101 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0110 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 0111 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1000 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1001 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1010 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1011 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1100 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1101 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1110 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 01 1111 1111 */ TABDECL(OP_LDRB_IMM_OFF), // OP_LDRB_IMM_OFF /* 10 0000 0000 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0001 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0010 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0011 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0100 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0101 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0110 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 0111 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1000 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1001 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1010 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1011 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1100 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1101 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1110 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0000 1111 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0000 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0001 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0010 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0011 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0100 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0101 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0110 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 0111 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1000 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1001 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1010 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1011 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1100 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1101 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1110 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0001 1111 */ TABDECL(OP_STRH_IMM_OFF), // OP_STRH_IMM_OFF /* 10 0010 0000 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0001 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0010 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0011 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0100 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0101 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0110 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 0111 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1000 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1001 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1010 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1011 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1100 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1101 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1110 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0010 1111 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0000 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0001 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0010 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0011 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0100 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0101 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0110 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 0111 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1000 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1001 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1010 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1011 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1100 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1101 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1110 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0011 1111 */ TABDECL(OP_LDRH_IMM_OFF), // OP_LDRH_IMM_OFF /* 10 0100 0000 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0001 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0010 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0011 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0100 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0101 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0110 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 0111 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1000 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1001 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1010 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1011 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1100 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1101 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1110 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0100 1111 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0000 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0001 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0010 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0011 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0100 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0101 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0110 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 0111 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1000 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1001 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1010 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1011 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1100 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1101 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1110 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0101 1111 */ TABDECL(OP_STR_SPREL), // OP_STR_SPREL /* 10 0110 0000 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0001 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0010 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0011 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0100 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0101 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0110 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 0111 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1000 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1001 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1010 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1011 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1100 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1101 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1110 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0110 1111 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0000 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0001 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0010 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0011 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0100 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0101 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0110 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 0111 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1000 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1001 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1010 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1011 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1100 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1101 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1110 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 0111 1111 */ TABDECL(OP_LDR_SPREL), // OP_LDR_SPREL /* 10 1000 0000 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0001 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0010 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0011 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0100 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0101 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0110 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 0111 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1000 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1001 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1010 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1011 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1100 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1101 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1110 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1000 1111 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0000 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0001 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0010 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0011 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0100 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0101 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0110 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 0111 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1000 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1001 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1010 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1011 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1100 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1101 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1110 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1001 1111 */ TABDECL(OP_ADD_2PC), // OP_ADD_2PC /* 10 1010 0000 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0001 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0010 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0011 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0100 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0101 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0110 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 0111 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1000 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1001 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1010 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1011 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1100 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1101 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1110 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1010 1111 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0000 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0001 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0010 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0011 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0100 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0101 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0110 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 0111 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1000 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1001 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1010 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1011 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1100 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1101 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1110 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1011 1111 */ TABDECL(OP_ADD_2SP), // OP_ADD_2SP /* 10 1100 0000 */ TABDECL(OP_ADJUST_P_SP), // OP_ADJUST_P_SP /* 10 1100 0001 */ TABDECL(OP_ADJUST_P_SP), // OP_ADJUST_P_SP /* 10 1100 0010 */ TABDECL(OP_ADJUST_M_SP), // OP_ADJUST_M_SP /* 10 1100 0011 */ TABDECL(OP_ADJUST_M_SP), // OP_ADJUST_M_SP /* 10 1100 0100 */ TABDECL(OP_UND_THUMB), /* 10 1100 0101 */ TABDECL(OP_UND_THUMB), /* 10 1100 0110 */ TABDECL(OP_UND_THUMB), /* 10 1100 0111 */ TABDECL(OP_UND_THUMB), /* 10 1100 1000 */ TABDECL(OP_UND_THUMB), /* 10 1100 1001 */ TABDECL(OP_UND_THUMB), /* 10 1100 1010 */ TABDECL(OP_UND_THUMB), /* 10 1100 1011 */ TABDECL(OP_UND_THUMB), /* 10 1100 1100 */ TABDECL(OP_UND_THUMB), /* 10 1100 1101 */ TABDECL(OP_UND_THUMB), /* 10 1100 1110 */ TABDECL(OP_UND_THUMB), /* 10 1100 1111 */ TABDECL(OP_UND_THUMB), /* 10 1101 0000 */ TABDECL(OP_PUSH), // OP_PUSH /* 10 1101 0001 */ TABDECL(OP_PUSH), // OP_PUSH /* 10 1101 0010 */ TABDECL(OP_PUSH), // OP_PUSH /* 10 1101 0011 */ TABDECL(OP_PUSH), // OP_PUSH /* 10 1101 0100 */ TABDECL(OP_PUSH_LR), // OP_PUSH_LR /* 10 1101 0101 */ TABDECL(OP_PUSH_LR), // OP_PUSH_LR /* 10 1101 0110 */ TABDECL(OP_PUSH_LR), // OP_PUSH_LR /* 10 1101 0111 */ TABDECL(OP_PUSH_LR), // OP_PUSH_LR /* 10 1101 1000 */ TABDECL(OP_UND_THUMB), /* 10 1101 1001 */ TABDECL(OP_UND_THUMB), /* 10 1101 1010 */ TABDECL(OP_UND_THUMB), /* 10 1101 1011 */ TABDECL(OP_UND_THUMB), /* 10 1101 1100 */ TABDECL(OP_UND_THUMB), /* 10 1101 1101 */ TABDECL(OP_UND_THUMB), /* 10 1101 1110 */ TABDECL(OP_UND_THUMB), /* 10 1101 1111 */ TABDECL(OP_UND_THUMB), /* 10 1110 0000 */ TABDECL(OP_UND_THUMB), /* 10 1110 0001 */ TABDECL(OP_UND_THUMB), /* 10 1110 0010 */ TABDECL(OP_UND_THUMB), /* 10 1110 0011 */ TABDECL(OP_UND_THUMB), /* 10 1110 0100 */ TABDECL(OP_UND_THUMB), /* 10 1110 0101 */ TABDECL(OP_UND_THUMB), /* 10 1110 0110 */ TABDECL(OP_UND_THUMB), /* 10 1110 0111 */ TABDECL(OP_UND_THUMB), /* 10 1110 1000 */ TABDECL(OP_UND_THUMB), /* 10 1110 1001 */ TABDECL(OP_UND_THUMB), /* 10 1110 1010 */ TABDECL(OP_UND_THUMB), /* 10 1110 1011 */ TABDECL(OP_UND_THUMB), /* 10 1110 1100 */ TABDECL(OP_UND_THUMB), /* 10 1110 1101 */ TABDECL(OP_UND_THUMB), /* 10 1110 1110 */ TABDECL(OP_UND_THUMB), /* 10 1110 1111 */ TABDECL(OP_UND_THUMB), /* 10 1111 0000 */ TABDECL(OP_POP), // OP_POP /* 10 1111 0001 */ TABDECL(OP_POP), // OP_POP /* 10 1111 0010 */ TABDECL(OP_POP), // OP_POP /* 10 1111 0011 */ TABDECL(OP_POP), // OP_POP /* 10 1111 0100 */ TABDECL(OP_POP_PC), // OP_POP_PC /* 10 1111 0101 */ TABDECL(OP_POP_PC), // OP_POP_PC /* 10 1111 0110 */ TABDECL(OP_POP_PC), // OP_POP_PC /* 10 1111 0111 */ TABDECL(OP_POP_PC), // OP_POP_PC /* 10 1111 1000 */ TABDECL(OP_BKPT_THUMB), // OP_BKPT_THUMB /* 10 1111 1001 */ TABDECL(OP_BKPT_THUMB), // OP_BKPT_THUMB /* 10 1111 1010 */ TABDECL(OP_BKPT_THUMB), // OP_BKPT_THUMB /* 10 1111 1011 */ TABDECL(OP_BKPT_THUMB), // OP_BKPT_THUMB /* 10 1111 1100 */ TABDECL(OP_UND_THUMB), /* 10 1111 1101 */ TABDECL(OP_UND_THUMB), /* 10 1111 1110 */ TABDECL(OP_UND_THUMB), /* 10 1111 1111 */ TABDECL(OP_UND_THUMB), /* 11 0000 0000 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0001 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0010 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0011 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0100 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0101 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0110 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 0111 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1000 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1001 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1010 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1011 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1100 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1101 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1110 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0000 1111 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0000 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0001 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0010 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0011 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0100 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0101 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0110 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 0111 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1000 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1001 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1010 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1011 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1100 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1101 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1110 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0001 1111 */ TABDECL(OP_STMIA_THUMB), // OP_STMIA_THUMB /* 11 0010 0000 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0001 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0010 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0011 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0100 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0101 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0110 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 0111 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1000 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1001 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1010 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1011 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1100 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1101 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1110 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0010 1111 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0000 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0001 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0010 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0011 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0100 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0101 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0110 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 0111 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1000 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1001 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1010 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1011 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1100 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1101 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1110 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0011 1111 */ TABDECL(OP_LDMIA_THUMB), // OP_LDMIA_THUMB /* 11 0100 0000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 0111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0100 1111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 0111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0101 1111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 0111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0110 1111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0100 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0101 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0110 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 0111 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1000 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1001 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1010 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1011 */ TABDECL(OP_B_COND), // OP_B_COND /* 11 0111 1100 */ TABDECL(OP_SWI_THUMB), // OP_SWI_THUMB /* 11 0111 1101 */ TABDECL(OP_SWI_THUMB), // OP_SWI_THUMB /* 11 0111 1110 */ TABDECL(OP_SWI_THUMB), // OP_SWI_THUMB /* 11 0111 1111 */ TABDECL(OP_SWI_THUMB), // OP_SWI_THUMB /* 11 1000 0000 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0001 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0010 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0011 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0100 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0101 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0110 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 0111 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1000 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1001 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1010 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1011 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1100 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1101 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1110 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1000 1111 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0000 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0001 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0010 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0011 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0100 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0101 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0110 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 0111 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1000 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1001 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1010 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1011 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1100 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1101 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1110 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1001 1111 */ TABDECL(OP_B_UNCOND), // OP_B_UNCOND /* 11 1010 0000 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0001 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0010 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0011 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0100 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0101 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0110 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 0111 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1000 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1001 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1010 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1011 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1100 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1101 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1110 */ TABDECL(OP_BLX), // OP_BLX /* 11 1010 1111 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0000 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0001 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0010 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0011 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0100 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0101 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0110 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 0111 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1000 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1001 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1010 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1011 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1100 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1101 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1110 */ TABDECL(OP_BLX), // OP_BLX /* 11 1011 1111 */ TABDECL(OP_BLX), // OP_BLX /* 11 1100 0000 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0001 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0010 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0011 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0100 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0101 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0110 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 0111 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1000 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1001 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1010 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1011 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1100 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1101 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1110 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1100 1111 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0000 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0001 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0010 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0011 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0100 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0101 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0110 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 0111 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1000 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1001 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1010 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1011 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1100 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1101 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1110 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1101 1111 */ TABDECL(OP_BL_10), // OP_BL_10 /* 11 1110 0000 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0001 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0010 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0011 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0100 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0101 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0110 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 0111 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1000 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1001 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1010 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1011 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1100 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1101 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1110 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1110 1111 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0000 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0001 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0010 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0011 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0100 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0101 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0110 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 0111 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1000 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1001 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1010 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1011 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1100 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1101 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1110 */ TABDECL(OP_BL_11), // OP_BL_11 /* 11 1111 1111 */ TABDECL(OP_BL_11), // OP_BL_11 desmume-0.9.9/src/registers.h0000644000175000017500000004664012140261633016701 0ustar guillaumeguillaume/* Copyright (C) 2006 Theo Berkau Copyright (C) 2006-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef REGISTERS_H #define REGISTERS_H #define REG_REGION_MASK 0x0FFFEF80 #define REG_BASE_DISPx 0x04000000 #define REG_BASE_DISPA 0x04000000 #define REG_BASE_DISPB 0x04001000 #define REG_BASE_DMA 0x04000080 #define REG_BASE_SIORTCTIMERS 0x04000100 #define REG_BASE_ROMIPC 0x04000180 #define REG_BASE_MEMIRQ 0x04000200 #define REG_BASE_MATH 0x04000280 #define REG_BASE_OTHER 0x04000300 #define REG_BASE_RCVPORTS 0x04100000 // Display Engine A #define REG_DISPA_DISPCNT 0x04000000 #define REG_DISPA_VCOUNT 0x04000006 #define REG_DISPA_BG0CNT 0x04000008 #define REG_DISPA_BG1CNT 0x0400000A #define REG_DISPA_BG2CNT 0x0400000C #define REG_DISPA_BG3CNT 0x0400000E #define REG_DISPA_BG0HOFS 0x04000010 #define REG_DISPA_BG0VOFS 0x04000012 #define REG_DISPA_BG1HOFS 0x04000014 #define REG_DISPA_BG1VOFS 0x04000016 #define REG_DISPA_BG2HOFS 0x04000018 #define REG_DISPA_BG2VOFS 0x0400001A #define REG_DISPA_BG3HOFS 0x0400001C #define REG_DISPA_BG3VOFS 0x0400001E #define REG_DISPA_BG2PA 0x04000020 #define REG_DISPA_BG2PB 0x04000022 #define REG_DISPA_BG2PC 0x04000024 #define REG_DISPA_BG2PD 0x04000026 #define REG_DISPA_BG2XL 0x04000028 #define REG_DISPA_BG2XH 0x0400002A #define REG_DISPA_BG2YL 0x0400002C #define REG_DISPA_BG2YH 0x0400002E #define REG_DISPA_BG3PA 0x04000030 #define REG_DISPA_BG3PB 0x04000032 #define REG_DISPA_BG3PC 0x04000034 #define REG_DISPA_BG3PD 0x04000036 #define REG_DISPA_BG3XL 0x04000038 #define REG_DISPA_BG3XH 0x0400003A #define REG_DISPA_BG3YL 0x0400003C #define REG_DISPA_BG3YH 0x0400003E #define REG_DISPA_WIN0H 0x04000040 #define REG_DISPA_WIN1H 0x04000042 #define REG_DISPA_WIN0V 0x04000044 #define REG_DISPA_WIN1V 0x04000046 #define REG_DISPA_WININ 0x04000048 #define REG_DISPA_WINOUT 0x0400004A #define REG_DISPA_MOSAIC 0x0400004C #define REG_DISPA_BLDCNT 0x04000050 #define REG_DISPA_BLDALPHA 0x04000052 #define REG_DISPA_BLDY 0x04000054 #define REG_DISPA_MASTERBRIGHT 0x0400006C // DMA #define _REG_DMA_CONTROL_MIN 0x040000B0 #define REG_DMA0SAD 0x040000B0 #define REG_DMA0SADL 0x040000B0 #define REG_DMA0SADH 0x040000B2 #define REG_DMA0DAD 0x040000B4 #define REG_DMA0DADL 0x040000B4 #define REG_DMA0DADH 0x040000B6 #define REG_DMA0CNTL 0x040000B8 #define REG_DMA0CNTH 0x040000BA #define REG_DMA1SAD 0x040000BC #define REG_DMA1SADL 0x040000BC #define REG_DMA1SADH 0x040000BE #define REG_DMA1DAD 0x040000C0 #define REG_DMA1DADL 0x040000C0 #define REG_DMA1DADH 0x040000C2 #define REG_DMA1CNTL 0x040000C4 #define REG_DMA1CNTH 0x040000C6 #define REG_DMA2SAD 0x040000C8 #define REG_DMA2SADL 0x040000C8 #define REG_DMA2SADH 0x040000CA #define REG_DMA2DAD 0x040000CC #define REG_DMA2DADL 0x040000CC #define REG_DMA2DADH 0x040000CE #define REG_DMA2CNTL 0x040000D0 #define REG_DMA2CNTH 0x040000D2 #define REG_DMA3SAD 0x040000D4 #define REG_DMA3SADL 0x040000D4 #define REG_DMA3SADH 0x040000D6 #define REG_DMA3DAD 0x040000D8 #define REG_DMA3DADL 0x040000D8 #define REG_DMA3DADH 0x040000DA #define REG_DMA3CNTL 0x040000DC #define REG_DMA3CNTH 0x040000DE #define _REG_DMA_CONTROL_MAX 0x040000DF #define REG_DMA0FILL 0x040000E0 #define REG_DMA1FILL 0x040000E4 #define REG_DMA2FILL 0x040000E8 #define REG_DMA3FILL 0x040000EC // Timers #define REG_TM0CNTL 0x04000100 #define REG_TM0CNTH 0x04000102 #define REG_TM1CNTL 0x04000104 #define REG_TM1CNTH 0x04000106 #define REG_TM2CNTL 0x04000108 #define REG_TM2CNTH 0x0400010A #define REG_TM3CNTL 0x0400010C #define REG_TM3CNTH 0x0400010E // SIO/Keypad Input/RTC #define REG_SIODATA32 0x04000120 #define REG_SIOCNT 0x04000128 #define REG_KEYINPUT 0x04000130 #define REG_KEYCNT 0x04000132 #define REG_RCNT 0x04000134 #define REG_EXTKEYIN 0x04000136 #define REG_RTC 0x04000138 // IPC #define REG_IPCSYNC 0x04000180 #define REG_IPCFIFOCNT 0x04000184 #define REG_IPCFIFOSEND 0x04000188 // ROM #define REG_AUXSPICNT 0x040001A0 #define REG_AUXSPIDATA 0x040001A2 #define REG_GCROMCTRL 0x040001A4 #define REG_GCCMDOUT 0x040001A8 #define REG_ENCSEED0L 0x040001B0 #define REG_ENCSEED1L 0x040001B4 #define REG_ENCSEED0H 0x040001B8 #define REG_ENCSEED1H 0x040001BC #define REG_SPICNT 0x040001C0 #define REG_SPIDATA 0x040001C2 // Memory/IRQ #define REG_EXMEMCNT 0x04000204 #define REG_WIFIWAITCNT 0x04000206 #define REG_IME 0x04000208 #define REG_IE 0x04000210 #define REG_IF 0x04000214 #define REG_VRAMCNTA 0x04000240 #define REG_VRAMSTAT 0x04000240 #define REG_VRAMCNTB 0x04000241 #define REG_WRAMSTAT 0x04000241 #define REG_VRAMCNTC 0x04000242 #define REG_VRAMCNTD 0x04000243 #define REG_VRAMCNTE 0x04000244 #define REG_VRAMCNTF 0x04000245 #define REG_VRAMCNTG 0x04000246 #define REG_WRAMCNT 0x04000247 #define REG_VRAMCNTH 0x04000248 #define REG_VRAMCNTI 0x04000249 // Math #define REG_DIVCNT 0x04000280 #define REG_DIVNUMER 0x04000290 #define REG_DIVDENOM 0x04000298 #define REG_DIVRESULT 0x040002A0 #define REG_DIVREMRESULT 0x040002A8 #define REG_SQRTCNT 0x040002B0 #define REG_SQRTRESULT 0x040002B4 #define REG_SQRTPARAM 0x040002B8 // Other #define REG_POSTFLG 0x04000300 #define REG_HALTCNT 0x04000301 #define REG_POWCNT1 0x04000304 #define REG_POWCNT2 0x04000304 #define REG_BIOSPROT 0x04000308 #define REG_DISPB_DISPCNT 0x04001000 #define REG_DISPB_BG0CNT 0x04001008 #define REG_DISPB_BG1CNT 0x0400100A #define REG_DISPB_BG2CNT 0x0400100C #define REG_DISPB_BG3CNT 0x0400100E #define REG_DISPB_BG0HOFS 0x04001010 #define REG_DISPB_BG0VOFS 0x04001012 #define REG_DISPB_BG1HOFS 0x04001014 #define REG_DISPB_BG1VOFS 0x04001016 #define REG_DISPB_BG2HOFS 0x04001018 #define REG_DISPB_BG2VOFS 0x0400101A #define REG_DISPB_BG3HOFS 0x0400101C #define REG_DISPB_BG3VOFS 0x0400101E #define REG_DISPB_BG2PA 0x04001020 #define REG_DISPB_BG2PB 0x04001022 #define REG_DISPB_BG2PC 0x04001024 #define REG_DISPB_BG2PD 0x04001026 #define REG_DISPB_BG2XL 0x04001028 #define REG_DISPB_BG2XH 0x0400102A #define REG_DISPB_BG2YL 0x0400102C #define REG_DISPB_BG2YH 0x0400102E #define REG_DISPB_BG3PA 0x04001030 #define REG_DISPB_BG3PB 0x04001032 #define REG_DISPB_BG3PC 0x04001034 #define REG_DISPB_BG3PD 0x04001036 #define REG_DISPB_BG3XL 0x04001038 #define REG_DISPB_BG3XH 0x0400103A #define REG_DISPB_BG3YL 0x0400103C #define REG_DISPB_BG3YH 0x0400103E #define REG_DISPB_WIN0H 0x04001040 #define REG_DISPB_WIN1H 0x04001042 #define REG_DISPB_WIN0V 0x04001044 #define REG_DISPB_WIN1V 0x04001046 #define REG_DISPB_WININ 0x04001048 #define REG_DISPB_WINOUT 0x0400104A #define REG_DISPB_MOSAIC 0x0400104C #define REG_DISPB_BLDCNT 0x04001050 #define REG_DISPB_BLDALPHA 0x04001052 #define REG_DISPB_BLDY 0x04001054 #define REG_DISPB_MASTERBRIGHT 0x0400106C // Receive ports #define REG_IPCFIFORECV 0x04100000 #define REG_GCDATAIN 0x04100010 #define REG_DISPB 0x00001000 // core A and B specific #define REG_DISPx_DISPCNT 0x04000000 #define REG_DISPx_VCOUNT 0x04000006 #define REG_DISPx_BG0CNT 0x04000008 #define REG_DISPx_BG1CNT 0x0400000A #define REG_DISPx_BG2CNT 0x0400000C #define REG_DISPx_BG3CNT 0x0400000E #define REG_DISPx_BG0HOFS 0x04000010 #define REG_DISPx_BG0VOFS 0x04000012 #define REG_DISPx_BG1HOFS 0x04000014 #define REG_DISPx_BG1VOFS 0x04000016 #define REG_DISPx_BG2HOFS 0x04000018 #define REG_DISPx_BG2VOFS 0x0400001A #define REG_DISPx_BG3HOFS 0x0400001C #define REG_DISPx_BG3VOFS 0x0400001E #define REG_DISPx_BG2PA 0x04000020 #define REG_DISPx_BG2PB 0x04000022 #define REG_DISPx_BG2PC 0x04000024 #define REG_DISPx_BG2PD 0x04000026 #define REG_DISPx_BG2XL 0x04000028 #define REG_DISPx_BG2XH 0x0400002A #define REG_DISPx_BG2YL 0x0400002C #define REG_DISPx_BG2YH 0x0400002E #define REG_DISPx_BG3PA 0x04000030 #define REG_DISPx_BG3PB 0x04000032 #define REG_DISPx_BG3PC 0x04000034 #define REG_DISPx_BG3PD 0x04000036 #define REG_DISPx_BG3XL 0x04000038 #define REG_DISPx_BG3XH 0x0400003A #define REG_DISPx_BG3YL 0x0400003C #define REG_DISPx_BG3YH 0x0400003E #define REG_DISPx_WIN0H 0x04000040 #define REG_DISPx_WIN1H 0x04000042 #define REG_DISPx_WIN0V 0x04000044 #define REG_DISPx_WIN1V 0x04000046 #define REG_DISPx_WININ 0x04000048 #define REG_DISPx_WINOUT 0x0400004A #define REG_DISPx_MOSAIC 0x0400004C #define REG_DISPx_BLDCNT 0x04000050 #define REG_DISPx_BLDALPHA 0x04000052 #define REG_DISPx_BLDY 0x04000054 #define REG_DISPx_MASTERBRIGHT 0x0400006C // core A specific #define REG_DISPA_DISPSTAT 0x04000004 #define REG_DISPA_DISP3DCNT 0x04000060 #define REG_DISPA_DISPCAPCNT 0x04000064 #define REG_DISPA_DISPMMEMFIFO 0x04000068 #define REG_DISPA_DISP3DCNT_BIT_RDLINES_UNDERFLOW 0x1000 #define REG_DISPA_DISP3DCNT_BIT_RAM_OVERFLOW 0x2000 #define REG_DISPA_DISP3DCNT_BITS_ACK (REG_DISPA_DISP3DCNT_BIT_RDLINES_UNDERFLOW|REG_DISPA_DISP3DCNT_BIT_RAM_OVERFLOW) #define eng_3D_RDLINES_COUNT 0x04000320 #define eng_3D_EDGE_COLOR 0x04000330 #define eng_3D_ALPHA_TEST_REF 0x04000340 #define eng_3D_CLEAR_COLOR 0x04000350 #define eng_3D_CLEAR_DEPTH 0x04000354 #define eng_3D_CLRIMAGE_OFFSET 0x04000356 #define eng_3D_FOG_COLOR 0x04000358 #define eng_3D_FOG_OFFSET 0x0400035C #define eng_3D_FOG_TABLE 0x04000360 #define eng_3D_TOON_TABLE 0x04000380 #define eng_3D_GXFIFO 0x04000400 // 3d commands #define cmd_3D_MTX_MODE 0x04000440 #define cmd_3D_MTX_PUSH 0x04000444 #define cmd_3D_MTX_POP 0x04000448 #define cmd_3D_MTX_STORE 0x0400044C #define cmd_3D_MTX_RESTORE 0x04000450 #define cmd_3D_MTX_IDENTITY 0x04000454 #define cmd_3D_MTX_LOAD_4x4 0x04000458 #define cmd_3D_MTX_LOAD_4x3 0x0400045C #define cmd_3D_MTX_MULT_4x4 0x04000460 #define cmd_3D_MTX_MULT_4x3 0x04000464 #define cmd_3D_MTX_MULT_3x3 0x04000468 #define cmd_3D_MTX_SCALE 0x0400046C #define cmd_3D_MTX_TRANS 0x04000470 #define cmd_3D_COLOR 0x04000480 #define cmd_3D_NORMA 0x04000484 #define cmd_3D_TEXCOORD 0x04000488 #define cmd_3D_VTX_16 0x0400048C #define cmd_3D_VTX_10 0x04000490 #define cmd_3D_VTX_XY 0x04000494 #define cmd_3D_VTX_XZ 0x04000498 #define cmd_3D_VTX_YZ 0x0400049C #define cmd_3D_VTX_DIFF 0x040004A0 #define cmd_3D_POLYGON_ATTR 0x040004A4 #define cmd_3D_TEXIMAGE_PARAM 0x040004A8 #define cmd_3D_PLTT_BASE 0x040004AC #define cmd_3D_DIF_AMB 0x040004C0 #define cmd_3D_SPE_EMI 0x040004C4 #define cmd_3D_LIGHT_VECTOR 0x040004C8 #define cmd_3D_LIGHT_COLOR 0x040004CC #define cmd_3D_SHININESS 0x040004D0 #define cmd_3D_BEGIN_VTXS 0x04000500 #define cmd_3D_END_VTXS 0x04000504 #define cmd_3D_SWAP_BUFFERS 0x04000540 #define cmd_3D_VIEWPORT 0x04000580 #define cmd_3D_BOX_TEST 0x040005C0 #define cmd_3D_POS_TEST 0x040005C4 #define cmd_3D_VEC_TEST 0x040005C8 #define eng_3D_GXSTAT 0x04000600 #define eng_3D_RAM_COUNT 0x04000604 #define eng_3D_DISP_1DOT_DEPTH 0x04000610 #define eng_3D_POS_RESULT 0x04000620 #define eng_3D_VEC_RESULT 0x04000630 #define eng_3D_CLIPMTX_RESULT 0x04000640 #define eng_3D_VECMTX_RESULT 0x04000680 //DSI #define REG_DSIMODE 0x04004000 #define IPCFIFOCNT_SENDEMPTY 0x0001 #define IPCFIFOCNT_SENDFULL 0x0002 #define IPCFIFOCNT_SENDIRQEN 0x0004 #define IPCFIFOCNT_SENDCLEAR 0x0008 #define IPCFIFOCNT_RECVEMPTY 0x0100 #define IPCFIFOCNT_RECVFULL 0x0200 #define IPCFIFOCNT_RECVIRQEN 0x0400 #define IPCFIFOCNT_FIFOERROR 0x4000 #define IPCFIFOCNT_FIFOENABLE 0x8000 #define IPCFIFOCNT_WRITEABLE (IPCFIFOCNT_SENDIRQEN | IPCFIFOCNT_RECVIRQEN | IPCFIFOCNT_FIFOENABLE) #define IPCSYNC_IRQ_SEND 0x2000 #define IPCSYNC_IRQ_RECV 0x4000 #define IRQ_BIT_LCD_VBLANK 0 #define IRQ_BIT_LCD_HBLANK 1 #define IRQ_BIT_LCD_VMATCH 2 #define IRQ_BIT_TIMER_0 3 #define IRQ_BIT_TIMER_1 4 #define IRQ_BIT_TIMER_2 5 #define IRQ_BIT_TIMER_3 6 #define IRQ_BIT_ARM7_SIO 7 #define IRQ_BIT_DMA_0 8 #define IRQ_BIT_DMA_2 9 #define IRQ_BIT_DMA_3 10 #define IRQ_BIT_DMA_4 11 #define IRQ_BIT_KEYPAD 12 #define IRQ_BIT_GAMEPAK 13 #define IRQ_BIT_IPCSYNC 16 #define IRQ_BIT_IPCFIFO_SENDEMPTY 17 #define IRQ_BIT_IPCFIFO_RECVNONEMPTY 18 #define IRQ_BIT_GC_TRANSFER_COMPLETE 19 #define IRQ_BIT_GC_IREQ_MC 20 #define IRQ_BIT_ARM9_GXFIFO 21 #define IRQ_BIT_ARM7_FOLD 22 #define IRQ_BIT_ARM7_SPI 23 #define IRQ_BIT_ARM7_WIFI 24 #define IRQ_MASK_LCD_VBLANK (1<<0) #define IRQ_MASK_LCD_HBLANK (1<<1) #define IRQ_MASK_LCD_VMATCH (1<<2) #define IRQ_MASK_TIMER_0 (1<<3) #define IRQ_MASK_TIMER_1 (1<<4) #define IRQ_MASK_TIMER_2 (1<<5) #define IRQ_MASK_TIMER_3 (1<<6) #define IRQ_MASK_ARM7_SIO (1<<7) #define IRQ_MASK_DMA_0 (1<<8) #define IRQ_MASK_DMA_2 (1<<9) #define IRQ_MASK_DMA_3 (1<<10) #define IRQ_MASK_DMA_4 (1<<11) #define IRQ_MASK_KEYPAD (1<<12) #define IRQ_MASK_GAMEPAK (1<<13) #define IRQ_MASK_IPCSYNC (1<<16) #define IRQ_MASK_IPCFIFO_SENDEMPTY (1<<17) #define IRQ_MASK_IPCFIFO_RECVNONEMPTY (1<<18) #define IRQ_MASK_GC_TRANSFER_COMPLETE (1<<19) #define IRQ_MASK_GC_IREQ_MC (1<<20) #define IRQ_MASK_ARM9_GXFIFO (1<<21) #define IRQ_MASK_ARM7_FOLD (1<<22) #define IRQ_MASK_ARM7_SPI (1<<23) #define IRQ_MASK_ARM7_WIFI (1<<24) #define TSC_MEASURE_TEMP1 0 #define TSC_MEASURE_Y 1 #define TSC_MEASURE_BATTERY 2 #define TSC_MEASURE_Z1 3 #define TSC_MEASURE_Z2 4 #define TSC_MEASURE_X 5 #define TSC_MEASURE_AUX 6 #define TSC_MEASURE_TEMP2 7 #define EXMEMCNT_MASK_SLOT2_ARM7 (1<<7) #define EXMEMCNT_MASK_SLOT2_SRAM_TIME (3) #define EXMEMCNT_MASK_SLOT2_ROM_1ST_TIME (3<<2) #define EXMEMCNT_MASK_SLOT2_ROM_2ND_TIME (1<<4) #define EXMEMCNT_MASK_SLOT2_CLOCKRATE (3<<5) #endif desmume-0.9.9/src/gfx3d.h0000644000175000017500000005431112140261633015677 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2008-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _GFX3D_H_ #define _GFX3D_H_ #include #include #include #include "types.h" #include "emufile.h" //geometry engine command numbers #define GFX3D_NOP 0x00 #define GFX3D_MTX_MODE 0x10 #define GFX3D_MTX_PUSH 0x11 #define GFX3D_MTX_POP 0x12 #define GFX3D_MTX_STORE 0x13 #define GFX3D_MTX_RESTORE 0x14 #define GFX3D_MTX_IDENTITY 0x15 #define GFX3D_MTX_LOAD_4x4 0x16 #define GFX3D_MTX_LOAD_4x3 0x17 #define GFX3D_MTX_MULT_4x4 0x18 #define GFX3D_MTX_MULT_4x3 0x19 #define GFX3D_MTX_MULT_3x3 0x1A #define GFX3D_MTX_SCALE 0x1B #define GFX3D_MTX_TRANS 0x1C #define GFX3D_COLOR 0x20 #define GFX3D_NORMAL 0x21 #define GFX3D_TEXCOORD 0x22 #define GFX3D_VTX_16 0x23 #define GFX3D_VTX_10 0x24 #define GFX3D_XY 0x25 #define GFX3D_XZ 0x26 #define GFX3D_YZ 0x27 #define GFX3D_DIFF 0x28 #define GFX3D_POLYGON_ATTR 0x29 #define GFX3D_TEXIMAGE_PARAM 0x2A #define GFX3D_PLTT_BASE 0x2B #define GFX3D_DIF_AMB 0x30 #define GFX3D_SPE_EMI 0x31 #define GFX3D_LIGHT_VECTOR 0x32 #define GFX3D_LIGHT_COLOR 0x33 #define GFX3D_SHININESS 0x34 #define GFX3D_BEGIN_VTXS 0x40 #define GFX3D_END_VTXS 0x41 #define GFX3D_SWAP_BUFFERS 0x50 #define GFX3D_VIEWPORT 0x60 #define GFX3D_BOX_TEST 0x70 #define GFX3D_POS_TEST 0x71 #define GFX3D_VEC_TEST 0x72 #define GFX3D_NOP_NOARG_HACK 0xDD //produce a 32bpp color from a DS RGB16 #ifdef WORDS_BIGENDIAN #define RGB16TO32(col,alpha) ( (alpha) | ((((col) & 0x7C00)>>7)<<8) | ((((col) & 0x03E0)>>2)<<16) | ((((col) & 0x001F)<<3)<<24) ) #else #define RGB16TO32(col,alpha) ( ((alpha)<<24) | ((((col) & 0x7C00)>>7)<<16) | ((((col) & 0x03E0)>>2)<<8) | (((col) & 0x001F)<<3) ) #endif //produce a 32bpp color from a ds RGB15, using a table #define RGB15TO32_NOALPHA(col) ( color_15bit_to_24bit[col&0x7FFF] ) //produce a 32bpp color from a ds RGB15 plus an 8bit alpha, using a table #ifdef WORDS_BIGENDIAN #define RGB15TO32(col,alpha8) ( (alpha8) | color_15bit_to_24bit[(col)&0x7FFF] ) #else #define RGB15TO32(col,alpha8) ( ((alpha8)<<24) | color_15bit_to_24bit[(col)&0x7FFF] ) #endif //produce a 5555 32bit color from a ds RGB15 plus an 5bit alpha #ifdef WORDS_BIGENDIAN #define RGB15TO5555(col,alpha5) ( (alpha5) | ((((col) & 0x7C00)>>10)<<8) | ((((col) & 0x03E0)>>5)<<16) | (((col) & 0x001F)<<24) ) #else #define RGB15TO5555(col,alpha5) ( ((alpha5)<<24) | ((((col) & 0x7C00)>>10)<<16) | ((((col) & 0x03E0)>>5)<<8) | ((col) & 0x001F) ) #endif //produce a 6665 32bit color from a ds RGB15 plus an 5bit alpha inline u32 RGB15TO6665(u16 col, u8 alpha5) { const u16 r = (col&0x001F)>>0; const u16 g = (col&0x03E0)>>5; const u16 b = (col&0x7C00)>>10; #ifdef WORDS_BIGENDIAN const u32 ret = alpha5 | (((b<<1)+1)<<8) | (((g<<1)+1)<<16) | (((r<<1)+1)<<24); #else const u32 ret = (alpha5<<24) | (((b<<1)+1)<<16) | (((g<<1)+1)<<8) | ((r<<1)+1); #endif return ret; } //produce a 24bpp color from a ds RGB15, using a table #define RGB15TO24_REVERSE(col) ( color_15bit_to_24bit_reverse[(col)&0x7FFF] ) //produce a 16bpp color from a ds RGB15, using a table #define RGB15TO16_REVERSE(col) ( color_15bit_to_16bit_reverse[(col)&0x7FFF] ) //produce a 32bpp color from a ds RGB15 plus an 8bit alpha, not using a table (but using other tables) #ifdef WORDS_BIGENDIAN #define RGB15TO32_DIRECT(col,alpha8) ( (alpha8) | (material_5bit_to_8bit[((col)>>10)&0x1F] << 8) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<16) | (material_5bit_to_8bit[(col)&0x1F]<<24) ) #else #define RGB15TO32_DIRECT(col,alpha8) ( ((alpha8)<<24) | (material_5bit_to_8bit[((col)>>10)&0x1F]<<16) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<8) | material_5bit_to_8bit[(col)&0x1F] ) #endif //produce a 15bpp color from individual 5bit components #define R5G5B5TORGB15(r,g,b) ( (r) | ((g)<<5) | ((b)<<10) ) //produce a 16bpp color from individual 5bit components #define R6G6B6TORGB15(r,g,b) ( ((r)>>1) | (((g)&0x3E)<<4) | (((b)&0x3E)<<9) ) #define GFX3D_5TO6(x) ((x)?(((x)<<1)+1):0) // 15-bit to 24-bit depth formula from http://nocash.emubase.de/gbatek.htm#ds3drearplane #define DS_DEPTH15TO24(depth) ( dsDepthExtend_15bit_to_24bit[(depth) & 0x7FFF] ) // POLYGON PRIMITIVE TYPES enum { GFX3D_TRIANGLES = 0, GFX3D_QUADS = 1, GFX3D_TRIANGLE_STRIP = 2, GFX3D_QUAD_STRIP = 3, GFX3D_LINE = 4 }; // POLYGON ATTRIBUTES - BIT LOCATIONS enum { POLYGON_ATTR_ENABLE_LIGHT0_BIT = 0, POLYGON_ATTR_ENABLE_LIGHT1_BIT = 1, POLYGON_ATTR_ENABLE_LIGHT2_BIT = 2, POLYGON_ATTR_ENABLE_LIGHT3_BIT = 3, POLYGON_ATTR_MODE_BIT = 4, // Bits 4 - 5 POLYGON_ATTR_ENABLE_BACK_SURFACE_BIT = 6, POLYGON_ATTR_ENABLE_FRONT_SURFACE_BIT = 7, // Bits 8 - 10 unused POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_BIT = 11, POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_BIT = 12, POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_BIT = 13, POLYGON_ATTR_ENABLE_DEPTH_TEST_BIT = 14, POLYGON_ATTR_ENABLE_FOG_BIT = 15, POLYGON_ATTR_ALPHA_BIT = 16, // Bits 16 - 20 // Bits 21 - 23 unused POLYGON_ATTR_POLYGON_ID_BIT = 24, // Bits 24 - 29 // Bits 30 - 31 unused }; // POLYGON ATTRIBUTES - BIT MASKS enum { POLYGON_ATTR_ENABLE_LIGHT0_MASK = 0x01 << POLYGON_ATTR_ENABLE_LIGHT0_BIT, POLYGON_ATTR_ENABLE_LIGHT1_MASK = 0x01 << POLYGON_ATTR_ENABLE_LIGHT1_BIT, POLYGON_ATTR_ENABLE_LIGHT2_MASK = 0x01 << POLYGON_ATTR_ENABLE_LIGHT2_BIT, POLYGON_ATTR_ENABLE_LIGHT3_MASK = 0x01 << POLYGON_ATTR_ENABLE_LIGHT3_BIT, POLYGON_ATTR_MODE_MASK = 0x03 << POLYGON_ATTR_MODE_BIT, POLYGON_ATTR_ENABLE_BACK_SURFACE_MASK = 0x01 << POLYGON_ATTR_ENABLE_BACK_SURFACE_BIT, POLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK = 0x01 << POLYGON_ATTR_ENABLE_FRONT_SURFACE_BIT, POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_MASK = 0x01 << POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_BIT, POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_MASK = 0x01 << POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_BIT, POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_MASK = 0x01 << POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_BIT, POLYGON_ATTR_ENABLE_DEPTH_TEST_MASK = 0x01 << POLYGON_ATTR_ENABLE_DEPTH_TEST_BIT, POLYGON_ATTR_ENABLE_FOG_MASK = 0x01 << POLYGON_ATTR_ENABLE_FOG_BIT, POLYGON_ATTR_ALPHA_MASK = 0x1F << POLYGON_ATTR_ALPHA_BIT, POLYGON_ATTR_POLYGON_ID_MASK = 0x3F << POLYGON_ATTR_POLYGON_ID_BIT }; // TEXTURE PARAMETERS - BIT LOCATIONS enum { TEXTURE_PARAM_VRAM_OFFSET_BIT = 0, // Bits 0 - 15 TEXTURE_PARAM_ENABLE_REPEAT_S_BIT = 16, TEXTURE_PARAM_ENABLE_REPEAT_T_BIT = 17, TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_BIT = 18, TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_BIT = 19, TEXTURE_PARAM_SIZE_S_BIT = 20, // Bits 20 - 22 TEXTURE_PARAM_SIZE_T_BIT = 23, // Bits 23 - 25 TEXTURE_PARAM_FORMAT_BIT = 26, // Bits 26 - 28 TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_BIT = 29, TEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT = 30 // Bits 30 - 31 }; // TEXTURE PARAMETERS - BIT MASKS enum { TEXTURE_PARAM_VRAM_OFFSET_MASK = 0xFFFF << TEXTURE_PARAM_VRAM_OFFSET_BIT, TEXTURE_PARAM_ENABLE_REPEAT_S_MASK = 0x01 << TEXTURE_PARAM_ENABLE_REPEAT_S_BIT, TEXTURE_PARAM_ENABLE_REPEAT_T_MASK = 0x01 << TEXTURE_PARAM_ENABLE_REPEAT_T_BIT, TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_MASK = 0x01 << TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_BIT, TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_MASK = 0x01 << TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_BIT, TEXTURE_PARAM_SIZE_S_MASK = 0x07 << TEXTURE_PARAM_SIZE_S_BIT, TEXTURE_PARAM_SIZE_T_MASK = 0x07 << TEXTURE_PARAM_SIZE_T_BIT, TEXTURE_PARAM_FORMAT_MASK = 0x07 << TEXTURE_PARAM_FORMAT_BIT, TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_MASK = 0x01 << TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_BIT, TEXTURE_PARAM_COORD_TRANSFORM_MODE_MASK = 0x03 << TEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT }; // TEXTURE PARAMETERS - FORMAT ID enum { TEXMODE_NONE = 0, TEXMODE_A3I5 = 1, TEXMODE_I2 = 2, TEXMODE_I4 = 3, TEXMODE_I8 = 4, TEXMODE_4X4 = 5, TEXMODE_A5I3 = 6, TEXMODE_16BPP = 7 }; void gfx3d_init(); void gfx3d_reset(); #define OSWRITE(x) os->fwrite((char*)&(x),sizeof((x))); #define OSREAD(x) is->fread((char*)&(x),sizeof((x))); typedef struct { u8 enableLightFlags; bool enableLight0; bool enableLight1; bool enableLight2; bool enableLight3; u8 polygonMode; u8 surfaceCullingMode; bool enableRenderBackSurface; bool enableRenderFrontSurface; bool enableAlphaDepthWrite; bool enableRenderOnFarPlaneIntersect; bool enableRenderOneDot; bool enableDepthTest; bool enableRenderFog; bool isWireframe; bool isOpaque; bool isTranslucent; u8 alpha; u8 polygonID; } PolygonAttributes; typedef struct { u16 VRAMOffset; bool enableRepeatS; bool enableRepeatT; bool enableMirroredRepeatS; bool enableMirroredRepeatT; u8 sizeS; u8 sizeT; u8 texFormat; bool enableTransparentColor0; u8 coordTransformMode; } PolygonTexParams; struct POLY { int type; //tri or quad u8 vtxFormat; u16 vertIndexes[4]; //up to four verts can be referenced by this poly u32 polyAttr, texParam, texPalette; //the hardware rendering params u32 viewport; float miny, maxy; void setVertIndexes(int a, int b, int c, int d=-1) { vertIndexes[0] = a; vertIndexes[1] = b; vertIndexes[2] = c; if(d != -1) { vertIndexes[3] = d; type = 4; } else type = 3; } u8 getAttributeEnableLightFlags() const { return ((polyAttr & (POLYGON_ATTR_ENABLE_LIGHT0_MASK | POLYGON_ATTR_ENABLE_LIGHT1_MASK | POLYGON_ATTR_ENABLE_LIGHT2_MASK | POLYGON_ATTR_ENABLE_LIGHT3_MASK)) >> POLYGON_ATTR_ENABLE_LIGHT0_BIT); } bool getAttributeEnableLight0() const { return ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT0_MASK) > 0); } bool getAttributeEnableLight1() const { return ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT1_MASK) > 0); } bool getAttributeEnableLight2() const { return ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT2_MASK) > 0); } bool getAttributeEnableLight3() const { return ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT3_MASK) > 0); } u8 getAttributePolygonMode() const { return ((polyAttr & POLYGON_ATTR_MODE_MASK) >> POLYGON_ATTR_MODE_BIT); } u8 getAttributeEnableFaceCullingFlags() const { return ((polyAttr & (POLYGON_ATTR_ENABLE_BACK_SURFACE_MASK | POLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK)) >> POLYGON_ATTR_ENABLE_BACK_SURFACE_BIT); } bool getAttributeEnableBackSurface() const { return ((polyAttr & POLYGON_ATTR_ENABLE_BACK_SURFACE_MASK) > 0); } bool getAttributeEnableFrontSurface() const { return ((polyAttr & POLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK) > 0); } bool getAttributeEnableAlphaDepthWrite() const { return ((polyAttr & POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_MASK) > 0); } bool getAttributeEnableRenderOnFarPlaneIntersect() const { return ((polyAttr & POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_MASK) > 0); } bool getAttributeEnableOneDotRender() const { return ((polyAttr & POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_MASK) > 0); } bool getAttributeEnableDepthTest() const { return ((polyAttr & POLYGON_ATTR_ENABLE_DEPTH_TEST_MASK) > 0); } bool getAttributeEnableFog() const { return ((polyAttr & POLYGON_ATTR_ENABLE_FOG_MASK) > 0); } u8 getAttributeAlpha() const { return ((polyAttr & POLYGON_ATTR_ALPHA_MASK) >> POLYGON_ATTR_ALPHA_BIT); } u8 getAttributePolygonID() const { return ((polyAttr & POLYGON_ATTR_POLYGON_ID_MASK) >> POLYGON_ATTR_POLYGON_ID_BIT); } PolygonAttributes getAttributes() const { PolygonAttributes theAttr; theAttr.enableLightFlags = this->getAttributeEnableLightFlags(); theAttr.enableLight0 = this->getAttributeEnableLight0(); theAttr.enableLight1 = this->getAttributeEnableLight1(); theAttr.enableLight2 = this->getAttributeEnableLight2(); theAttr.enableLight3 = this->getAttributeEnableLight3(); theAttr.polygonMode = this->getAttributePolygonMode(); theAttr.surfaceCullingMode = this->getAttributeEnableFaceCullingFlags(); theAttr.enableRenderBackSurface = this->getAttributeEnableBackSurface(); theAttr.enableRenderFrontSurface = this->getAttributeEnableFrontSurface(); theAttr.enableAlphaDepthWrite = this->getAttributeEnableAlphaDepthWrite(); theAttr.enableRenderOnFarPlaneIntersect = this->getAttributeEnableRenderOnFarPlaneIntersect(); theAttr.enableRenderOneDot = this->getAttributeEnableOneDotRender(); theAttr.enableDepthTest = this->getAttributeEnableDepthTest(); theAttr.enableRenderFog = this->getAttributeEnableFog(); theAttr.alpha = this->getAttributeAlpha(); theAttr.isWireframe = this->isWireframe(); theAttr.isOpaque = this->isOpaque(); theAttr.isTranslucent = this->isTranslucent(); theAttr.polygonID = this->getAttributePolygonID(); return theAttr; } u16 getTexParamVRAMOffset() const { return ((texParam & TEXTURE_PARAM_VRAM_OFFSET_MASK) >> TEXTURE_PARAM_VRAM_OFFSET_BIT); } bool getTexParamEnableRepeatS() const { return ((texParam & TEXTURE_PARAM_ENABLE_REPEAT_S_MASK) > 0); } bool getTexParamEnableRepeatT() const { return ((texParam & TEXTURE_PARAM_ENABLE_REPEAT_T_MASK) > 0); } bool getTexParamEnableMirroredRepeatS() const { return ((texParam & TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_MASK) > 0); } bool getTexParamEnableMirroredRepeatT() const { return ((texParam & TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_MASK) > 0); } u8 getTexParamSizeS() const { return ((texParam & TEXTURE_PARAM_SIZE_S_MASK) >> TEXTURE_PARAM_SIZE_S_BIT); } u8 getTexParamSizeT() const { return ((texParam & TEXTURE_PARAM_SIZE_T_MASK) >> TEXTURE_PARAM_SIZE_T_BIT); } u8 getTexParamTexFormat() const { return ((texParam & TEXTURE_PARAM_FORMAT_MASK) >> TEXTURE_PARAM_FORMAT_BIT); } bool getTexParamEnableTransparentColor0() const { return ((texParam & TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_MASK) > 0); } u8 getTexParamCoordTransformMode() const { return ((texParam & TEXTURE_PARAM_COORD_TRANSFORM_MODE_MASK) >> TEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT); } PolygonTexParams getTexParams() const { PolygonTexParams theTexParams; theTexParams.VRAMOffset = this->getTexParamVRAMOffset(); theTexParams.enableRepeatS = this->getTexParamEnableRepeatS(); theTexParams.enableRepeatT = this->getTexParamEnableRepeatT(); theTexParams.enableMirroredRepeatS = this->getTexParamEnableMirroredRepeatS(); theTexParams.enableMirroredRepeatT = this->getTexParamEnableMirroredRepeatT(); theTexParams.sizeS = this->getTexParamSizeS(); theTexParams.sizeT = this->getTexParamSizeT(); theTexParams.texFormat = this->getTexParamTexFormat(); theTexParams.enableTransparentColor0 = this->getTexParamEnableTransparentColor0(); theTexParams.coordTransformMode = this->getTexParamCoordTransformMode(); return theTexParams; } bool isWireframe() const { return (this->getAttributeAlpha() == 0); } bool isOpaque() const { return (this->getAttributeAlpha() == 31); } bool isTranslucent() const { // First, check if the polygon is wireframe or opaque. // If neither, then it must be translucent. if (!this->isWireframe() && !this->isOpaque()) { return true; } // Also check for translucent texture format. u8 texFormat = this->getTexParamTexFormat(); //a5i3 or a3i5 -> translucent if(texFormat == TEXMODE_A3I5 || texFormat == TEXMODE_A5I3) return true; return false; } void save(EMUFILE* os) { OSWRITE(type); OSWRITE(vertIndexes[0]); OSWRITE(vertIndexes[1]); OSWRITE(vertIndexes[2]); OSWRITE(vertIndexes[3]); OSWRITE(polyAttr); OSWRITE(texParam); OSWRITE(texPalette); OSWRITE(viewport); OSWRITE(miny); OSWRITE(maxy); } void load(EMUFILE* is) { OSREAD(type); OSREAD(vertIndexes[0]); OSREAD(vertIndexes[1]); OSREAD(vertIndexes[2]); OSREAD(vertIndexes[3]); OSREAD(polyAttr); OSREAD(texParam); OSREAD(texPalette); OSREAD(viewport); OSREAD(miny); OSREAD(maxy); } }; #define POLYLIST_SIZE 100000 struct POLYLIST { POLY list[POLYLIST_SIZE]; int count; }; struct VERT { union { float coord[4]; struct { float x,y,z,w; }; }; union { float texcoord[2]; struct { float u,v; }; }; void set_coord(float x, float y, float z, float w) { this->x = x; this->y = y; this->z = z; this->w = w; } void set_coord(float* coords) { x = coords[0]; y = coords[1]; z = coords[2]; w = coords[3]; } u8 color[3]; float fcolor[3]; void color_to_float() { fcolor[0] = color[0]; fcolor[1] = color[1]; fcolor[2] = color[2]; } void save(EMUFILE* os) { OSWRITE(x); OSWRITE(y); OSWRITE(z); OSWRITE(w); OSWRITE(u); OSWRITE(v); OSWRITE(color[0]); OSWRITE(color[1]); OSWRITE(color[2]); OSWRITE(fcolor[0]); OSWRITE(fcolor[1]); OSWRITE(fcolor[2]); } void load(EMUFILE* is) { OSREAD(x); OSREAD(y); OSREAD(z); OSREAD(w); OSREAD(u); OSREAD(v); OSREAD(color[0]); OSREAD(color[1]); OSREAD(color[2]); OSREAD(fcolor[0]); OSREAD(fcolor[1]); OSREAD(fcolor[2]); } }; #define VERTLIST_SIZE 400000 //#define VERTLIST_SIZE 10000 struct VERTLIST { VERT list[VERTLIST_SIZE]; int count; }; struct INDEXLIST { int list[POLYLIST_SIZE]; }; struct VIEWPORT { int x, y, width, height; void decode(u32 v); }; //ok, imagine the plane that cuts diagonally across a cube such that it clips //out to be a hexagon. within that plane, draw a quad such that it cuts off //four corners of the hexagon, and you will observe a decagon #define MAX_CLIPPED_VERTS 10 class GFX3D_Clipper { public: struct TClippedPoly { int type; //otherwise known as "count" of verts POLY* poly; VERT clipVerts[MAX_CLIPPED_VERTS]; }; //the entry point for poly clipping template void clipPoly(POLY* poly, VERT** verts); //the output of clipping operations goes into here. //be sure you init it before clipping! TClippedPoly *clippedPolys; int clippedPolyCounter; void reset() { clippedPolyCounter=0; } private: TClippedPoly tempClippedPoly; TClippedPoly outClippedPoly; FORCEINLINE void clipSegmentVsPlane(VERT** verts, const int coord, int which); FORCEINLINE void clipPolyVsPlane(const int coord, int which); }; //used to communicate state to the renderer struct GFX3D_State { GFX3D_State() : enableTexturing(true) , enableAlphaTest(true) , enableAlphaBlending(true) , enableAntialiasing(false) , enableEdgeMarking(false) , enableClearImage(false) , enableFog(false) , enableFogAlphaOnly(false) , shading(TOON) , alphaTestRef(0) , activeFlushCommand(0) , pendingFlushCommand(0) , clearDepth(1) , clearColor(0) , fogColor(0) , fogOffset(0) , fogShift(0) , invalidateToon(true) { for(u32 i=0;i #ifdef AGG2D_USE_VECTORFONTS #ifdef AGG2D_USE_FREETYPE #ifndef WIN32 #include "agg_font_freetype.h" #else #include "../font_freetype/agg_font_freetype.h" #endif #else #include "../font_win32_tt/agg_font_win32_tt.h" #endif #endif #include "agg_pixfmt_rgba.h" //+ JME #include "agg_image_accessors.h" #define AGG2D_TEMPLATE template #define AGG2D_TEMPLATE_WITH_IMAGE template #define AGG2D_TEMPLATE_ARG #define AGG2D_IMAGE_TEMPLATE template #define AGG2D_IMAGE_TEMPLATE_ARG #define TIMAGE Agg2DBase :: Image AGG2D_IMAGE_TEMPLATE_ARG template class PixFormatSetDeclaration { public: typedef Main PixFormat; typedef Pre PixFormatPre; typedef SG SpanGenerator; }; class Agg2DBase { public: // JME //typedef agg::rect Rect; typedef agg::rect_i Rect; typedef agg::rect_d RectD; typedef agg::trans_affine Affine; enum LineJoin { JOIN_MITER = agg::miter_join, JOIN_ROUND = agg::round_join, JOIN_BEVEL = agg::bevel_join }; enum LineCap { CAP_BUTT = agg::butt_cap, CAP_SQUARE = agg::square_cap, CAP_ROUND = agg::round_cap }; enum TextAlignment { AlignLeft, AlignRight, AlignCenter, AlignBaseline, AlignTop = AlignRight, AlignBottom = AlignLeft }; enum DrawPathFlag { FillOnly, StrokeOnly, FillAndStroke, FillWithLineColor }; enum ViewportOption { Anisotropic, XMinYMin, XMidYMin, XMaxYMin, XMinYMid, XMidYMid, XMaxYMid, XMinYMax, XMidYMax, XMaxYMax }; enum WindowFitLogic { WindowFitLogic_meet, WindowFitLogic_slice }; struct Transformations { double affineMatrix[6]; }; AGG2D_IMAGE_TEMPLATE struct Image { agg::rendering_buffer renBuf; Image(const agg::rendering_buffer& srcBuf) : renBuf(srcBuf) {} Image(unsigned char* buf, unsigned width, unsigned height, int stride) : renBuf(buf, width, height, stride) {} void attach(unsigned char* buf, unsigned width, unsigned height, int stride) { renBuf.attach(buf, width, height, stride); } int width() const { return renBuf.width(); } int height() const { return renBuf.height(); } AGG2D_TEMPLATE void premultiply() { typename PixFormatSet::PixFormat pixf(renBuf); pixf.premultiply(); } AGG2D_TEMPLATE void demultiply() { typename PixFormatSet::PixFormat pixf(renBuf); pixf.demultiply(); } }; enum ImageFilter { NoFilter, Bilinear, Hanning, Hermite, Quadric, Bicubic, Catrom, Spline16, Spline36, Blackman144 }; enum ImageResample { NoResample, ResampleAlways, ResampleOnZoomOut }; enum FontCacheType { RasterFontCache, VectorFontCache }; enum BlendMode { BlendAlpha = agg::end_of_comp_op_e, BlendClear = agg::comp_op_clear, BlendSrc = agg::comp_op_src, BlendDst = agg::comp_op_dst, BlendSrcOver = agg::comp_op_src_over, BlendDstOver = agg::comp_op_dst_over, BlendSrcIn = agg::comp_op_src_in, BlendDstIn = agg::comp_op_dst_in, BlendSrcOut = agg::comp_op_src_out, BlendDstOut = agg::comp_op_dst_out, BlendSrcAtop = agg::comp_op_src_atop, BlendDstAtop = agg::comp_op_dst_atop, BlendXor = agg::comp_op_xor, BlendAdd = agg::comp_op_plus, BlendSub = agg::comp_op_minus, BlendMultiply = agg::comp_op_multiply, BlendScreen = agg::comp_op_screen, BlendOverlay = agg::comp_op_overlay, BlendDarken = agg::comp_op_darken, BlendLighten = agg::comp_op_lighten, BlendColorDodge = agg::comp_op_color_dodge, BlendColorBurn = agg::comp_op_color_burn, BlendHardLight = agg::comp_op_hard_light, BlendSoftLight = agg::comp_op_soft_light, BlendDifference = agg::comp_op_difference, BlendExclusion = agg::comp_op_exclusion, BlendContrast = agg::comp_op_contrast }; enum Direction { CW, CCW }; }; template class Agg2DRenderer; template class Agg2D : public Agg2DBase { public: typedef typename PixFormatSet::PixFormat PixFormat; typedef Image MyImage; typedef agg::order_bgra ComponentOrder; // Platform dependent! typedef agg::rgba8 ColorType; typedef agg::blender_rgba Blender; typedef agg::comp_op_adaptor_rgba BlenderComp; typedef agg::blender_rgba_pre BlenderPre; typedef agg::comp_op_adaptor_rgba_pre BlenderCompPre; // JME //typedef agg::pixel_formats_rgba PixFormat; //typedef agg::pixfmt_bgra32 PixFormat; // JME //typedef agg::pixfmt_custom_blend_rgba PixFormatComp; typedef agg::pixfmt_custom_blend_rgba PixFormatComp; // JME //typedef agg::pixel_formats_rgba PixFormatPre; typedef typename PixFormatSet::PixFormatPre PixFormatPre; // JME //typedef agg::pixfmt_custom_blend_rgba PixFormatCompPre; typedef agg::pixfmt_custom_blend_rgba PixFormatCompPre; typedef agg::renderer_base RendererBase; typedef agg::renderer_base RendererBaseComp; typedef agg::renderer_base RendererBasePre; typedef agg::renderer_base RendererBaseCompPre; typedef agg::renderer_scanline_aa_solid RendererSolid; typedef agg::renderer_scanline_aa_solid RendererSolidComp; typedef agg::span_allocator SpanAllocator; typedef agg::pod_auto_array GradientArray; typedef agg::span_gradient, agg::gradient_x, GradientArray> LinearGradientSpan; typedef agg::span_gradient, agg::gradient_circle, GradientArray> RadialGradientSpan; #ifdef AGG2D_USE_VECTORFONTS #ifdef AGG2D_USE_FREETYPE typedef agg::font_engine_freetype_int32 FontEngine; #else typedef agg::font_engine_win32_tt_int32 FontEngine; #endif typedef agg::font_cache_manager FontCacheManager; typedef FontCacheManager::gray8_adaptor_type FontRasterizer; typedef FontCacheManager::gray8_scanline_type FontScanline; #endif typedef agg::conv_curve ConvCurve; typedef agg::conv_stroke ConvStroke; typedef agg::conv_transform PathTransform; typedef agg::conv_transform StrokeTransform; enum Gradient { Solid, Linear, Radial }; public: template friend class Agg2DRenderer; typedef ColorType Color; struct State { RectD m_clipBox; BlendMode m_blendMode; BlendMode m_imageBlendMode; Color m_imageBlendColor; double m_masterAlpha; double m_antiAliasGamma; const agg::int8u* m_font; Color m_fillColor; Color m_lineColor; GradientArray m_fillGradient; GradientArray m_lineGradient; LineCap m_lineCap; LineJoin m_lineJoin; Gradient m_fillGradientFlag; Gradient m_lineGradientFlag; agg::trans_affine m_fillGradientMatrix; agg::trans_affine m_lineGradientMatrix; double m_fillGradientD1; double m_lineGradientD1; double m_fillGradientD2; double m_lineGradientD2; double m_textAngle; TextAlignment m_textAlignX; TextAlignment m_textAlignY; bool m_textHints; double m_fontHeight; double m_fontAscent; double m_fontDescent; FontCacheType m_fontCacheType; double m_lineWidth; bool m_evenOddFlag; agg::trans_affine m_transform; agg::trans_affine m_affine; }; ~Agg2D(); Agg2D(); // Setup //----------------------- void attach(unsigned char* buf, unsigned width, unsigned height, int stride); void attach(MyImage& img); void clipBox(double x1, double y1, double x2, double y2); RectD clipBox() const; void clearAll(Color c); void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255); void clearClipBox(Color c); void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255); unsigned width() const { return m_rbuf.width(); } unsigned height() const { return m_rbuf.height(); } unsigned stride() const { return m_rbuf.stride(); } // Conversions //----------------------- void worldToScreen(double& x, double& y) const; void screenToWorld(double& x, double& y) const; double worldToScreen(double scalar) const; double screenToWorld(double scalar) const; void alignPoint(double& x, double& y) const; bool inBox(double worldX, double worldY) const; // General Attributes //----------------------- void blendMode(BlendMode m); BlendMode blendMode() const; void imageBlendMode(BlendMode m); BlendMode imageBlendMode() const; void imageBlendColor(Color c); void imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255); Color imageBlendColor() const; void masterAlpha(double a); double masterAlpha() const; void antiAliasGamma(double g); double antiAliasGamma() const; void font(const agg::int8u* font) { m_font = font; } const agg::int8u* font() { return m_font; } void fillColor(Color c); void fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255); void noFill(); void lineColor(Color c); void lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255); void noLine(); Color fillColor() const; Color lineColor() const; void fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0); void lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0); void fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0); void lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0); void fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3); void lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3); void fillRadialGradient(double x, double y, double r); void lineRadialGradient(double x, double y, double r); void lineWidth(double w); double lineWidth() const; void lineCap(LineCap cap); LineCap lineCap() const; void lineJoin(LineJoin join); LineJoin lineJoin() const; void fillEvenOdd(bool evenOddFlag); bool fillEvenOdd() const; // Transformations //----------------------- Transformations transformations() const; void transformations(const Transformations& tr); const Affine& affine() const; void affine(const Affine&); void resetTransformations(); void matrix(const Affine& tr); void matrix(const Transformations& tr); void rotate(double angle); void rotate(double angle, double cx, double cy); void scale(double s); void scale(double sx, double sy); void skew(double sx, double sy); void translate(double x, double y); void parallelogram(double x1, double y1, double x2, double y2, const double* para); void viewport(double worldX1, double worldY1, double worldX2, double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, ViewportOption opt=XMidYMid, WindowFitLogic fl = WindowFitLogic_meet); // Basic Shapes //----------------------- void line(double x1, double y1, double x2, double y2); void triangle(double x1, double y1, double x2, double y2, double x3, double y3); void rectangle(double x1, double y1, double x2, double y2); void roundedRect(double x1, double y1, double x2, double y2, double r); void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry); void roundedRect(double x1, double y1, double x2, double y2, double rxBottom, double ryBottom, double rxTop, double ryTop); void ellipse(double cx, double cy, double rx, double ry); void arc(double cx, double cy, double rx, double ry, double start, double sweep); void star(double cx, double cy, double r1, double r2, double startAngle, int numRays); void curve(double x1, double y1, double x2, double y2, double x3, double y3); void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); void polygon(double* xy, int numPoints); void polyline(double* xy, int numPoints); // Text //----------------------- #ifdef AGG2D_USE_VECTORFONTS void flipText(bool flip); void font(const char* fileName, double height, bool bold = false, bool italic = false, FontCacheType ch = RasterFontCache, double angle = 0.0); double fontHeight() const; double fontAscent() const; void textAlignment(TextAlignment alignX, TextAlignment alignY); bool textHints() const; void textHints(bool hints); double textWidth(const char* str, unsigned int len); double textWidth(const wchar_t* str, unsigned int len); void text(double x, double y, const char* str, unsigned int len, bool roundOff=false, double dx=0.0, double dy=0.0); void text(double x, double y, const wchar_t* str, unsigned int len, bool roundOff=false, double dx=0.0, double dy=0.0); double textWidth(const char* str); void text(double x, double y, const char* str, bool roundOff=false, double dx=0.0, double dy=0.0); #endif // Path commands //----------------------- void resetPath(); void moveTo(double x, double y); void moveRel(double dx, double dy); void lineTo(double x, double y); void lineRel(double dx, double dy); void horLineTo(double x); void horLineRel(double dx); void verLineTo(double y); void verLineRel(double dy); void arcTo(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double x, double y); void arcRel(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double dx, double dy); void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo); void quadricCurveRel(double dxCtrl, double dyCtrl, double dxTo, double dyTo); void quadricCurveTo(double xTo, double yTo); void quadricCurveRel(double dxTo, double dyTo); void cubicCurveTo(double xCtrl1, double yCtrl1, double xCtrl2, double yCtrl2, double xTo, double yTo); void cubicCurveRel(double dxCtrl1, double dyCtrl1, double dxCtrl2, double dyCtrl2, double dxTo, double dyTo); void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo); void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo); void addEllipse(double cx, double cy, double rx, double ry, Direction dir); void closePolygon(); void drawPath(DrawPathFlag flag = FillAndStroke); void drawPathNoTransform(DrawPathFlag flag = FillAndStroke); // Image Transformations //----------------------- void imageFilter(ImageFilter f); ImageFilter imageFilter() const; void imageResample(ImageResample f); ImageResample imageResample() const; //--------- //if anyone can figure out how to put these in the .inl file, theyre more than welcome to. I couldnt declare them correctly to match //the .h file declaration AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, double dstX1, double dstY1, double dstX2, double dstY2) { resetPath(); moveTo(dstX1, dstY1); lineTo(dstX2, dstY1); lineTo(dstX2, dstY2); lineTo(dstX1, dstY2); closePolygon(); double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; renderImage (img, imgX1, imgY1, imgX2, imgY2, parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, double dstX1, double dstY1, double dstX2, double dstY2) { resetPath(); moveTo(dstX1, dstY1); lineTo(dstX2, dstY1); lineTo(dstX2, dstY2); lineTo(dstX1, dstY2); closePolygon(); double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, const double* parallelogram) { resetPath(); moveTo(parallelogram[0], parallelogram[1]); lineTo(parallelogram[2], parallelogram[3]); lineTo(parallelogram[4], parallelogram[5]); lineTo(parallelogram[0] + parallelogram[4] - parallelogram[2], parallelogram[1] + parallelogram[5] - parallelogram[3]); closePolygon(); renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, const double* parallelogram) { resetPath(); moveTo(parallelogram[0], parallelogram[1]); lineTo(parallelogram[2], parallelogram[3]); lineTo(parallelogram[4], parallelogram[5]); lineTo(parallelogram[0] + parallelogram[4] - parallelogram[2], parallelogram[1] + parallelogram[5] - parallelogram[3]); closePolygon(); renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, double dstX1, double dstY1, double dstX2, double dstY2) { double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, double dstX1, double dstY1, double dstX2, double dstY2) { double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, const double* parallelogram) { renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); } AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, const double* parallelogram) { renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); } // Image Blending (no transformations available) AGG2D_IMAGE_TEMPLATE void blendImage(TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, double dstX, double dstY, unsigned alpha=255) { worldToScreen(dstX, dstY); PixFormat pixF(img.renBuf); // JME //agg::rect r(imgX1, imgY1, imgX2, imgY2); Rect r(imgX1, imgY1, imgX2, imgY2); if(m_blendMode == BlendAlpha) { m_renBasePre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha); } else { m_renBaseCompPre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha); } } void renderText(double dstX, double dstY, const std::string& str) { worldToScreen(dstX, dstY); PixFormat pixF(m_rbuf); //Rect r(imgX1, imgY1, imgX2, imgY2); typedef agg::glyph_raster_bin glyph_gen; glyph_gen glyph(0); if(m_blendMode == BlendAlpha) { typedef agg::renderer_base ren_base; agg::renderer_raster_htext_solid rt(m_renBasePre,glyph); rt.color(m_lineColor); glyph.font(m_font); rt.render_text(dstX, dstY, str.c_str(), true); //flipy } else { typedef agg::renderer_base ren_base; agg::renderer_raster_htext_solid rt(m_renBaseCompPre,glyph); rt.color(m_lineColor); glyph.font(m_font); rt.render_text(dstX, dstY, str.c_str(), true); //flipy } } AGG2D_IMAGE_TEMPLATE void blendImage(TIMAGE& img, double dstX, double dstY, unsigned alpha=255) { worldToScreen(dstX, dstY); PixFormat pixF(img.renBuf); m_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); if(m_blendMode == BlendAlpha) { m_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); } else { m_renBaseCompPre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); } } // Copy image directly, together with alpha-channel AGG2D_IMAGE_TEMPLATE void copyImage(TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, double dstX, double dstY) { worldToScreen(dstX, dstY); // JME //agg::rect r(imgX1, imgY1, imgX2, imgY2); Rect r(imgX1, imgY1, imgX2, imgY2); m_renBase.copy_from(img.renBuf, &r, int(dstX)-imgX1, int(dstY)-imgY1); } AGG2D_IMAGE_TEMPLATE void copyImage(TIMAGE& img, double dstX, double dstY) { worldToScreen(dstX, dstY); m_renBase.copy_from(img.renBuf, 0, int(dstX), int(dstY)); } // State //----------------------- void saveStateTo(State& st); void restoreStateFrom(const State& st); // Auxiliary //----------------------- static double pi() { return agg::pi; } static double deg2Rad(double v) { return v * agg::pi / 180.0; } static double rad2Deg(double v) { return v * 180.0 / agg::pi; } PixFormat & pixFormat() { return m_pixFormat; } agg::rendering_buffer & buf() { return m_rbuf; } private: void render(bool fillColor); #ifdef AGG2D_USE_VECTORFONTS #if !defined( UNDER_CE ) void render(FontRasterizer& ras, FontScanline& sl); #endif #endif void addLine(double x1, double y1, double x2, double y2); void updateRasterizerGamma(); AGG2D_IMAGE_TEMPLATE void renderImage(const TIMAGE& img, int x1, int y1, int x2, int y2, const double* parl) { agg::trans_affine mtx((double)x1, (double)y1, (double)x2, (double)y2, parl); mtx *= m_transform; mtx.invert(); m_rasterizer.reset(); m_rasterizer.add_path(m_pathTransform); typedef agg::span_interpolator_linear Interpolator; Interpolator interpolator(mtx); if(m_blendMode == BlendAlpha) { // JME audit - Agg2DRenderer::renderImage(*this, img, m_renBasePre, interpolator); } else { Agg2DRenderer::renderImage(*this, img, m_renBaseCompPre, interpolator); } } void updateTransformations(); agg::rendering_buffer m_rbuf; PixFormat m_pixFormat; PixFormatComp m_pixFormatComp; PixFormatPre m_pixFormatPre; PixFormatCompPre m_pixFormatCompPre; RendererBase m_renBase; RendererBaseComp m_renBaseComp; RendererBasePre m_renBasePre; RendererBaseCompPre m_renBaseCompPre; RendererSolid m_renSolid; RendererSolidComp m_renSolidComp; SpanAllocator m_allocator; RectD m_clipBox; BlendMode m_blendMode; BlendMode m_imageBlendMode; Color m_imageBlendColor; agg::scanline_u8 m_scanline; agg::rasterizer_scanline_aa<> m_rasterizer; double m_masterAlpha; double m_antiAliasGamma; const agg::int8u* m_font; Color m_fillColor; Color m_lineColor; GradientArray m_fillGradient; GradientArray m_lineGradient; LineCap m_lineCap; LineJoin m_lineJoin; Gradient m_fillGradientFlag; Gradient m_lineGradientFlag; agg::trans_affine m_fillGradientMatrix; agg::trans_affine m_lineGradientMatrix; double m_fillGradientD1; double m_lineGradientD1; double m_fillGradientD2; double m_lineGradientD2; double m_textAngle; TextAlignment m_textAlignX; TextAlignment m_textAlignY; bool m_textHints; double m_fontHeight; double m_fontAscent; double m_fontDescent; FontCacheType m_fontCacheType; ImageFilter m_imageFilter; ImageResample m_imageResample; agg::image_filter_lut m_imageFilterLut; agg::span_interpolator_linear<> m_fillGradientInterpolator; agg::span_interpolator_linear<> m_lineGradientInterpolator; agg::gradient_x m_linearGradientFunction; agg::gradient_circle m_radialGradientFunction; double m_lineWidth; bool m_evenOddFlag; double m_start_x; double m_start_y; agg::path_storage m_path; agg::trans_affine m_transform; agg::trans_affine m_viewport; agg::trans_affine m_affine; ConvCurve m_convCurve; ConvStroke m_convStroke; PathTransform m_pathTransform; StrokeTransform m_strokeTransform; #ifdef AGG2D_USE_VECTORFONTS #ifndef AGG2D_USE_FREETYPE HDC m_fontDC; #endif FontEngine m_fontEngine; FontCacheManager m_fontCacheManager; #endif }; #include "agg2d.inl" #endif desmume-0.9.9/src/desmume_config.cpp0000644000175000017500000001015512140261633020201 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include "ctrlssdl.h" #include "desmume_config.h" static const gchar *desmume_old_config_file = ".desmume.ini"; static const gchar *desmume_config_dir = "desmume"; static const gchar *desmume_config_file = "config"; GKeyFile *desmume_config_read_file(const u16 *kb_cfg) { gchar *config_file, *config_dir, *old_config_file; GKeyFile *keyfile; GError *error = NULL; gboolean ret; old_config_file = g_build_filename(g_get_home_dir(), desmume_old_config_file, NULL); config_file = g_build_filename(g_get_user_config_dir(), desmume_config_dir, desmume_config_file, NULL); config_dir = g_build_filename(g_get_user_config_dir(), desmume_config_dir, NULL); g_mkdir_with_parents(config_dir, 0755); if (!g_file_test(config_file, G_FILE_TEST_IS_REGULAR) && g_file_test(old_config_file, G_FILE_TEST_IS_REGULAR)) { ret = g_rename(old_config_file, config_file); if (ret) { g_printerr("Failed to move old config file %s to new location %s \n", old_config_file, config_file); } } keyfile = g_key_file_new(); ret = g_key_file_load_from_file(keyfile, config_file, G_KEY_FILE_NONE, &error); if (!ret) { g_error_free(error); } g_free(config_file); g_free(config_dir); g_free(old_config_file); load_default_config(kb_cfg); desmume_config_read_keys(keyfile); desmume_config_read_joykeys(keyfile); return keyfile; } void desmume_config_dispose(GKeyFile *keyfile) { g_key_file_free(keyfile); } static gboolean desmume_config_write_file(GKeyFile *keyfile) { gchar *config_file; gchar *config_dir; gchar *data; GError *error = NULL; gsize length; gboolean ret = TRUE; config_dir = g_build_filename(g_get_user_config_dir(), desmume_config_dir, NULL); g_mkdir_with_parents(config_dir, 0755); config_file = g_build_filename(g_get_user_config_dir(), desmume_config_dir, desmume_config_file, NULL); data = g_key_file_to_data(keyfile, &length, NULL); ret = g_file_set_contents(config_file, data, length, &error); if (!ret) { g_error_free(error); } g_free(config_file); g_free(config_dir); g_free(data); return ret; } gboolean desmume_config_update_keys(GKeyFile *keyfile) { for(int i = 0; i < NB_KEYS; i++) { g_key_file_set_integer(keyfile, "KEYS", key_names[i], keyboard_cfg[i]); } return desmume_config_write_file(keyfile); } gboolean desmume_config_update_joykeys(GKeyFile *keyfile) { for(int i = 0; i < NB_KEYS; i++) { g_key_file_set_integer(keyfile, "JOYKEYS", key_names[i], joypad_cfg[i]); } return desmume_config_write_file(keyfile); } gboolean desmume_config_read_keys(GKeyFile *keyfile) { GError *error = NULL; if (!g_key_file_has_group(keyfile, "KEYS")) return TRUE; for (int i = 0; i < NB_KEYS; i++) { keyboard_cfg[i] = g_key_file_get_integer(keyfile, "KEYS", key_names[i], &error); if (error != NULL) { g_error_free(error); return FALSE; } } return TRUE; } gboolean desmume_config_read_joykeys(GKeyFile *keyfile) { GError *error = NULL; if (!g_key_file_has_group(keyfile, "JOYKEYS")) return TRUE; for (int i = 0; i < NB_KEYS; i++) { joypad_cfg[i] = g_key_file_get_integer(keyfile, "JOYKEYS", key_names[i], &error); if (error != NULL) { g_error_free(error); return FALSE; } } return TRUE; } desmume-0.9.9/src/thumb_instructions.cpp0000644000175000017500000007750712140261633021176 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2008 shash Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "bios.h" #include "debug.h" #include "MMU.h" #include "NDSSystem.h" #include "MMU_timing.h" #include #define cpu (&ARMPROC) #define TEMPLATE template #define REG_NUM(i, n) (((i)>>n)&0x7) //----------------------------------------------------------------------------- // Undefined instruction //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_UND_THUMB(const u32 i) { INFO("THUMB%c: Undefined instruction: 0x%08X (%s) PC=0x%08X\n", cpu->proc_ID?'7':'9', cpu->instruction, decodeIntruction(true, cpu->instruction), cpu->instruct_adr); TRAPUNDEF(cpu); return 1; } //----------------------------------------------------------------------------- // LSL //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LSL_0(const u32 i) { cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_LSL(const u32 i) { u32 v = (i>>6) & 0x1F; cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], 32-v); cpu->R[REG_NUM(i, 0)] = (cpu->R[REG_NUM(i, 3)] << v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_LSL_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)] & 0xFF; if(v == 0) { cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v<32) { cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], 32-v); cpu->R[REG_NUM(i, 0)] <<= v; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v==32) cpu->CPSR.bits.C = BIT0(cpu->R[REG_NUM(i, 0)]); else cpu->CPSR.bits.C = 0; cpu->R[REG_NUM(i, 0)] = 0; cpu->CPSR.bits.N = 0; cpu->CPSR.bits.Z = 1; return 2; } //----------------------------------------------------------------------------- // LSR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LSR_0(const u32 i) { cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 3)]); cpu->R[REG_NUM(i, 0)] = 0; cpu->CPSR.bits.N = 0; cpu->CPSR.bits.Z = 1; return 1; } TEMPLATE static u32 FASTCALL OP_LSR(const u32 i) { u32 v = (i>>6) & 0x1F; cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], v-1); cpu->R[REG_NUM(i, 0)] = (cpu->R[REG_NUM(i, 3)] >> v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_LSR_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)] & 0xFF; if(v == 0) { cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v<32) { cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1); cpu->R[REG_NUM(i, 0)] >>= v; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v==32) cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]); else cpu->CPSR.bits.C = 0; cpu->R[REG_NUM(i, 0)] = 0; cpu->CPSR.bits.N = 0; cpu->CPSR.bits.Z = 1; return 2; } //----------------------------------------------------------------------------- // ASR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ASR_0(const u32 i) { cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 3)]); cpu->R[REG_NUM(i, 0)] = BIT31(cpu->R[REG_NUM(i, 3)])*0xFFFFFFFF; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_ASR(const u32 i) { u32 v = (i>>6) & 0x1F; cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], v-1); cpu->R[REG_NUM(i, 0)] = (u32)(((s32)cpu->R[REG_NUM(i, 3)]) >> v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_ASR_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)] & 0xFF; if(v == 0) { cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } if(v<32) { cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1); cpu->R[REG_NUM(i, 0)] = (u32)(((s32)cpu->R[REG_NUM(i, 0)]) >> v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->R[REG_NUM(i, 0)] = BIT31(cpu->R[REG_NUM(i, 0)])*0xFFFFFFFF; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } //----------------------------------------------------------------------------- // ADD //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ADD_IMM3(const u32 i) { u32 imm3 = (i >> 6) & 0x07; u32 Rn = cpu->R[REG_NUM(i, 3)]; if (imm3 == 0) // mov 2 { cpu->R[REG_NUM(i, 0)] = Rn; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; cpu->CPSR.bits.C = 0; cpu->CPSR.bits.V = 0; return 1; } cpu->R[REG_NUM(i, 0)] = Rn + imm3; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; cpu->CPSR.bits.C = CarryFrom(Rn, imm3); cpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 0)], Rn, imm3); return 1; } TEMPLATE static u32 FASTCALL OP_ADD_IMM8(const u32 i) { u32 imm8 = (i & 0xFF); u32 Rd = cpu->R[REG_NUM(i, 8)]; cpu->R[REG_NUM(i, 8)] = Rd + imm8; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 8)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 8)] == 0); cpu->CPSR.bits.C = CarryFrom(Rd, imm8); cpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 8)], Rd, imm8); return 1; } TEMPLATE static u32 FASTCALL OP_ADD_REG(const u32 i) { u32 Rn = cpu->R[REG_NUM(i, 3)]; u32 Rm = cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = Rn + Rm; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; cpu->CPSR.bits.C = CarryFrom(Rn, Rm); cpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 0)], Rn, Rm); return 1; } TEMPLATE static u32 FASTCALL OP_ADD_SPE(const u32 i) { u32 Rd = REG_NUM(i, 0) | ((i>>4)&8); cpu->R[Rd] += cpu->R[REG_POS(i, 3)]; if(Rd==15) { cpu->next_instruction = cpu->R[15]; return 3; } return 1; } TEMPLATE static u32 FASTCALL OP_ADD_2PC(const u32 i) { cpu->R[REG_NUM(i, 8)] = (cpu->R[15]&0xFFFFFFFC) + ((i&0xFF)<<2); return 1; } TEMPLATE static u32 FASTCALL OP_ADD_2SP(const u32 i) { cpu->R[REG_NUM(i, 8)] = cpu->R[13] + ((i&0xFF)<<2); return 1; } //----------------------------------------------------------------------------- // SUB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SUB_IMM3(const u32 i) { u32 imm3 = (i>>6) & 0x07; u32 Rn = cpu->R[REG_NUM(i, 3)]; u32 tmp = Rn - imm3; cpu->R[REG_NUM(i, 0)] = tmp; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = (tmp == 0); cpu->CPSR.bits.C = !BorrowFrom(Rn, imm3); cpu->CPSR.bits.V = OverflowFromSUB(tmp, Rn, imm3); return 1; } TEMPLATE static u32 FASTCALL OP_SUB_IMM8(const u32 i) { u32 imm8 = (i & 0xFF); u32 Rd = cpu->R[REG_NUM(i, 8)]; u32 tmp = Rd - imm8; cpu->R[REG_NUM(i, 8)] = tmp; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = (tmp == 0); cpu->CPSR.bits.C = !BorrowFrom(Rd, imm8); cpu->CPSR.bits.V = OverflowFromSUB(tmp, Rd, imm8); return 1; } TEMPLATE static u32 FASTCALL OP_SUB_REG(const u32 i) { u32 Rn = cpu->R[REG_NUM(i, 3)]; u32 Rm = cpu->R[REG_NUM(i, 6)]; u32 tmp = Rn - Rm; cpu->R[REG_NUM(i, 0)] = tmp; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = (tmp == 0); cpu->CPSR.bits.C = !BorrowFrom(Rn, Rm); cpu->CPSR.bits.V = OverflowFromSUB(tmp, Rn, Rm); return 1; } //----------------------------------------------------------------------------- // MOV //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_MOV_IMM8(const u32 i) { cpu->R[REG_NUM(i, 8)] = (i & 0xFF); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 8)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 8)] == 0; return 1; } TEMPLATE static u32 FASTCALL OP_MOV_SPE(const u32 i) { u32 Rd = REG_NUM(i, 0) | ((i>>4)&8); cpu->R[Rd] = cpu->R[REG_POS(i, 3)]; if(Rd==15) { cpu->next_instruction = cpu->R[15]; return 3; } return 1; } //----------------------------------------------------------------------------- // CMP //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_CMP_IMM8(const u32 i) { u32 tmp = cpu->R[REG_NUM(i, 8)] - (i & 0xFF); cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = tmp == 0; cpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_NUM(i, 8)], (i & 0xFF)); cpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_NUM(i, 8)], (i & 0xFF)); return 1; } TEMPLATE static u32 FASTCALL OP_CMP(const u32 i) { u32 tmp = cpu->R[REG_NUM(i, 0)] - cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = tmp == 0; cpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]); cpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]); return 1; } TEMPLATE static u32 FASTCALL OP_CMP_SPE(const u32 i) { u32 Rn = (i&7) | ((i>>4)&8); u32 tmp = cpu->R[Rn] - cpu->R[REG_POS(i, 3)]; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = tmp == 0; cpu->CPSR.bits.C = !BorrowFrom(cpu->R[Rn], cpu->R[REG_POS(i, 3)]); cpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[Rn], cpu->R[REG_POS(i, 3)]); return 1; } //----------------------------------------------------------------------------- // AND //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_AND(const u32 i) { cpu->R[REG_NUM(i, 0)] &= cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } //----------------------------------------------------------------------------- // EOR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_EOR(const u32 i) { cpu->R[REG_NUM(i, 0)] ^= cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } //----------------------------------------------------------------------------- // ADC //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ADC_REG(const u32 i) { u32 Rd = cpu->R[REG_NUM(i, 0)]; u32 Rm = cpu->R[REG_NUM(i, 3)]; if (!cpu->CPSR.bits.C) { cpu->R[REG_NUM(i, 0)] = Rd + Rm; cpu->CPSR.bits.C = cpu->R[REG_NUM(i, 0)] < Rm; } else { cpu->R[REG_NUM(i, 0)] = Rd + Rm + 1; cpu->CPSR.bits.C = cpu->R[REG_NUM(i, 0)] <= Rm; } cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); cpu->CPSR.bits.V = BIT31((Rd ^ Rm ^ -1) & (Rd ^ cpu->R[REG_NUM(i, 0)])); return 1; } //----------------------------------------------------------------------------- // SBC //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SBC_REG(const u32 i) { u32 Rd = cpu->R[REG_NUM(i, 0)]; u32 Rm = cpu->R[REG_NUM(i, 3)]; if (!cpu->CPSR.bits.C) { cpu->R[REG_NUM(i, 0)] = Rd - Rm - 1; cpu->CPSR.bits.C = Rd > Rm; } else { cpu->R[REG_NUM(i, 0)] = Rd - Rm; cpu->CPSR.bits.C = Rd >= Rm; } cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); cpu->CPSR.bits.V = BIT31((Rd ^ Rm) & (Rd ^ cpu->R[REG_NUM(i, 0)])); return 1; } //----------------------------------------------------------------------------- // ROR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ROR_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)] & 0xFF; if(v == 0) { cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } v &= 0x1F; if(v == 0) { cpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } cpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1); cpu->R[REG_NUM(i, 0)] = ROR(cpu->R[REG_NUM(i, 0)], v); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 2; } //----------------------------------------------------------------------------- // TST //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_TST(const u32 i) { u32 tmp = cpu->R[REG_NUM(i, 0)] & cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = (tmp == 0); return 1; } //----------------------------------------------------------------------------- // NEG //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_NEG(const u32 i) { u32 Rm = cpu->R[REG_NUM(i, 3)]; cpu->R[REG_NUM(i, 0)] = (u32)((s32)0 - (s32)Rm); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); cpu->CPSR.bits.C = !BorrowFrom(0, Rm); cpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_NUM(i, 0)], 0, Rm); return 1; } //----------------------------------------------------------------------------- // CMN //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_CMN(const u32 i) { u32 tmp = cpu->R[REG_NUM(i, 0)] + cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(tmp); cpu->CPSR.bits.Z = tmp == 0; cpu->CPSR.bits.C = CarryFrom(cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]); cpu->CPSR.bits.V = OverflowFromADD(tmp, cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]); return 1; } //----------------------------------------------------------------------------- // ORR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ORR(const u32 i) { cpu->R[REG_NUM(i, 0)] |= cpu->R[REG_NUM(i, 3)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); return 1; } //----------------------------------------------------------------------------- // BIC //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_BIC(const u32 i) { cpu->R[REG_NUM(i, 0)] &= (~cpu->R[REG_NUM(i, 3)]); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0); return 1; } //----------------------------------------------------------------------------- // MVN //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_MVN(const u32 i) { cpu->R[REG_NUM(i, 0)] = (~cpu->R[REG_NUM(i, 3)]); cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; return 1; } //----------------------------------------------------------------------------- // MUL //----------------------------------------------------------------------------- #define MUL_Mxx_END_THUMB(c) \ v >>= 8; \ if((v==0)||(v==0xFFFFFF)) \ return c+1; \ v >>= 8; \ if((v==0)||(v==0xFFFF)) \ return c+2; \ v >>= 8; \ if((v==0)||(v==0xFF)) \ return c+3; \ return c+4; \ TEMPLATE static u32 FASTCALL OP_MUL_REG(const u32 i) { u32 v = cpu->R[REG_NUM(i, 3)]; // FIXME: //------ Rd = (Rm * Rd)[31:0] //------ u64 res = ((u64)cpu->R[REG_NUM(i, 0)] * (u64)v)); //------ cpu->R[REG_NUM(i, 0)] = (u32)(res & 0xFFFFFFFF); //------ cpu->R[REG_NUM(i, 0)] *= v; cpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]); cpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0; //The MUL instruction is defined to leave the C flag unchanged in ARMv5 and above. //In earlier versions of the architecture, the value of the C flag was UNPREDICTABLE //after a MUL instruction. if (PROCNUM == 1) // ARM4T 1S + mI, m = 3 return 4; MUL_Mxx_END_THUMB(1); } //----------------------------------------------------------------------------- // STRB / LDRB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STRB_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>6)&0x1F); WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDRB_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>6)&0x1F); cpu->R[REG_NUM(i, 0)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_STRB_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDRB_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // LDRSB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRSB_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = (u32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // STRH / LDRH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STRH_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>5)&0x3E); WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDRH_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>5)&0x3E); cpu->R[REG_NUM(i, 0)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_STRH_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; WRITE16(cpu->mem_if->data, adr, ((u16)cpu->R[REG_NUM(i, 0)])); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDRH_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // LDRSH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRSH_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; cpu->R[REG_NUM(i, 0)] = (u32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // STR / LDR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STR_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>4)&0x7C); WRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDR_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>4)&0x7C); u32 tempValue = READ32(cpu->mem_if->data, adr); adr = (adr&3)*8; tempValue = (tempValue>>adr) | (tempValue<<(32-adr)); cpu->R[REG_NUM(i, 0)] = tempValue; return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_STR_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 6)] + cpu->R[REG_NUM(i, 3)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 0)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDR_REG_OFF(const u32 i) { u32 adr = (cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]); u32 tempValue = READ32(cpu->mem_if->data, adr); adr = (adr&3)*8; tempValue = (tempValue>>adr) | (tempValue<<(32-adr)); cpu->R[REG_NUM(i, 0)] = tempValue; return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_STR_SPREL(const u32 i) { u32 adr = cpu->R[13] + ((i&0xFF)<<2); WRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 8)]); return MMU_aluMemAccessCycles(2, adr); } TEMPLATE static u32 FASTCALL OP_LDR_SPREL(const u32 i) { u32 adr = cpu->R[13] + ((i&0xFF)<<2); cpu->R[REG_NUM(i, 8)] = READ32(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } TEMPLATE static u32 FASTCALL OP_LDR_PCREL(const u32 i) { u32 adr = (cpu->R[15]&0xFFFFFFFC) + ((i&0xFF)<<2); cpu->R[REG_NUM(i, 8)] = READ32(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3, adr); } //----------------------------------------------------------------------------- // Adjust SP //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_ADJUST_P_SP(const u32 i) { cpu->R[13] += ((i&0x7F)<<2); return 1; } TEMPLATE static u32 FASTCALL OP_ADJUST_M_SP(const u32 i) { cpu->R[13] -= ((i&0x7F)<<2); return 1; } //----------------------------------------------------------------------------- // PUSH / POP //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_PUSH(const u32 i) { u32 adr = cpu->R[13] - 4; u32 c = 0, j; for(j = 0; j<8; j++) if(BIT_N(i, 7-j)) { WRITE32(cpu->mem_if->data, adr, cpu->R[7-j]); c += MMU_memAccessCycles(adr); adr -= 4; } cpu->R[13] = adr + 4; return MMU_aluMemCycles(3, c); } TEMPLATE static u32 FASTCALL OP_PUSH_LR(const u32 i) { u32 adr = cpu->R[13] - 4; u32 c = 0, j; WRITE32(cpu->mem_if->data, adr, cpu->R[14]); c += MMU_memAccessCycles(adr); adr -= 4; for(j = 0; j<8; j++) if(BIT_N(i, 7-j)) { WRITE32(cpu->mem_if->data, adr, cpu->R[7-j]); c += MMU_memAccessCycles(adr); adr -= 4; } cpu->R[13] = adr + 4; return MMU_aluMemCycles(4, c); } TEMPLATE static u32 FASTCALL OP_POP(const u32 i) { u32 adr = cpu->R[13]; u32 c = 0, j; for(j = 0; j<8; j++) if(BIT_N(i, j)) { cpu->R[j] = READ32(cpu->mem_if->data, adr); c += MMU_memAccessCycles(adr); adr += 4; } cpu->R[13] = adr; return MMU_aluMemCycles(2, c); } // In ARMv5 and above, bit[0] of the loaded value // determines whether execution continues after this branch in ARM state or in Thumb state, as though the // following instruction had been executed: // BX (loaded_value) // In T variants of ARMv4, bit[0] of the loaded value is ignored and execution continues in Thumb state, as // though the following instruction had been executed: // MOV PC,(loaded_value) TEMPLATE static u32 FASTCALL OP_POP_PC(const u32 i) { u32 adr = cpu->R[13]; u32 c = 0, j; u32 v = 0; for(j = 0; j<8; j++) if(BIT_N(i, j)) { cpu->R[j] = READ32(cpu->mem_if->data, adr); c += MMU_memAccessCycles(adr); adr += 4; } v = READ32(cpu->mem_if->data, adr); c += MMU_memAccessCycles(adr); if(PROCNUM==0) cpu->CPSR.bits.T = BIT0(v); cpu->R[15] = v & 0xFFFFFFFE; cpu->next_instruction = cpu->R[15]; cpu->R[13] = adr + 4; return MMU_aluMemCycles(5, c); } //----------------------------------------------------------------------------- // STMIA / LDMIA //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STMIA_THUMB(const u32 i) { u32 adr = cpu->R[REG_NUM(i, 8)]; u32 c = 0, j; u32 erList = 1; //Empty Register List // ------ ARM_REF: // ------ If is specified in : // ------ * If is the lowest-numbered register specified in , the original value of is stored. // ------ * Otherwise, the stored value of is UNPREDICTABLE. if (BIT_N(i, REG_NUM(i, 8))) printf("STMIA with Rb in Rlist\n"); for(j = 0; j<8; j++) { if(BIT_N(i, j)) { WRITE32(cpu->mem_if->data, adr, cpu->R[j]); c += MMU_memAccessCycles(adr); adr += 4; erList = 0; //Register List isnt empty } } if (erList) printf("STMIA with Empty Rlist\n"); cpu->R[REG_NUM(i, 8)] = adr; return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIA_THUMB(const u32 i) { u32 regIndex = REG_NUM(i, 8); u32 adr = cpu->R[regIndex]; u32 c = 0, j; u32 erList = 1; //Empty Register List //if (BIT_N(i, regIndex)) // printf("LDMIA with Rb in Rlist at %08X\n",cpu->instruct_adr); for(j = 0; j<8; j++) { if(BIT_N(i, j)) { cpu->R[j] = READ32(cpu->mem_if->data, adr); c += MMU_memAccessCycles(adr); adr += 4; erList = 0; //Register List isnt empty } } if (erList) printf("LDMIA with Empty Rlist\n"); // ARM_REF: THUMB: Causes base register write-back, and is not optional // ARM_REF: If the base register is specified in , the final value of is the loaded value // (not the written-back value). if (!BIT_N(i, regIndex)) cpu->R[regIndex] = adr; return MMU_aluMemCycles(3, c); } //----------------------------------------------------------------------------- // BKPT //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_BKPT_THUMB(const u32 i) { printf("THUMB%c: OP_BKPT triggered\n", PROCNUM?'7':'9'); Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, ABT); // enter abt mode cpu->R[14] = cpu->instruct_adr + 4; cpu->SPSR = tmp; // save old CPSR as new SPSR cpu->CPSR.bits.T = 0; // handle as ARM32 code cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + 0x0C; cpu->next_instruction = cpu->R[15]; return 1; } //----------------------------------------------------------------------------- // SWI //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SWI_THUMB(const u32 i) { u32 swinum = i & 0xFF; //ideas-style debug prints (execute this SWI with the null terminated string address in R0) if(swinum==0xFC) { IdeasLog(cpu); return 0; } //if the user has changed the intVector to point away from the nds bioses, //then it doesn't really make any sense to use the builtin SWI's since //the bios ones aren't getting called anyway bool bypassBuiltinSWI = (cpu->intVector == 0x00000000 && PROCNUM==0) || (cpu->intVector == 0xFFFF0000 && PROCNUM==1); if(cpu->swi_tab && !bypassBuiltinSWI) { //zero 25-dec-2008 - in arm, we were masking to 0x1F. //this is probably safer since an invalid opcode could crash the emu //zero 30-jun-2009 - but they say that the ideas 0xFF should crash the device... //u32 swinum = cpu->instruction & 0xFF; swinum &= 0x1F; //printf("%d ARM SWI %d\n",PROCNUM,swinum); return cpu->swi_tab[swinum]() + 3; } else { /* we use an irq thats not in the irq tab, as it was replaced due to a changed intVector */ Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, SVC); /* enter svc mode */ cpu->R[14] = cpu->next_instruction; /* jump to swi Vector */ cpu->SPSR = tmp; /* save old CPSR as new SPSR */ cpu->CPSR.bits.T = 0; /* handle as ARM32 code */ cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + 0x08; cpu->next_instruction = cpu->R[15]; return 3; } } //----------------------------------------------------------------------------- // Branch //----------------------------------------------------------------------------- #define SIGNEEXT_IMM11(i) (((i)&0x7FF) | (BIT10(i) * 0xFFFFF800)) #define SIGNEXTEND_11(i) (((s32)i<<21)>>21) TEMPLATE static u32 FASTCALL OP_B_COND(const u32 i) { if(!TEST_COND((i>>8)&0xF, 0, cpu->CPSR)) return 1; cpu->R[15] += (u32)((s8)(i&0xFF))<<1; cpu->next_instruction = cpu->R[15]; return 3; } TEMPLATE static u32 FASTCALL OP_B_UNCOND(const u32 i) { //nocash message detection const u16 last = _MMU_read16(cpu->instruct_adr-2); const u16 next = _MMU_read16(cpu->instruct_adr+2); static const u16 mov_r12_r12 = 0x46E4; if(last == mov_r12_r12 && next == 0x6464) { NocashMessage(cpu,6); } cpu->R[15] += (SIGNEEXT_IMM11(i)<<1); cpu->next_instruction = cpu->R[15]; return 1; } TEMPLATE static u32 FASTCALL OP_BLX(const u32 i) { cpu->R[15] = (cpu->R[14] + ((i&0x7FF)<<1))&0xFFFFFFFC; cpu->R[14] = cpu->next_instruction | 1; cpu->next_instruction = cpu->R[15]; cpu->CPSR.bits.T = 0; return 3; } TEMPLATE static u32 FASTCALL OP_BL_10(const u32 i) { cpu->R[14] = cpu->R[15] + (SIGNEXTEND_11(i)<<12); return 1; } TEMPLATE static u32 FASTCALL OP_BL_11(const u32 i) { cpu->R[15] = (cpu->R[14] + ((i&0x7FF)<<1)); cpu->R[14] = cpu->next_instruction | 1; cpu->next_instruction = cpu->R[15]; return 4; } TEMPLATE static u32 FASTCALL OP_BX_THUMB(const u32 i) { // When using PC as operand with BX opcode, switch to ARM state and jump to (instruct_adr+4) // Reference: http://nocash.emubase.de/gbatek.htm#thumb5hiregisteroperationsbranchexchange #if 0 if (REG_POS(i, 3) == 15) { cpu->CPSR.bits.T = 0; cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; } else { u32 Rm = cpu->R[REG_POS(i, 3)]; cpu->CPSR.bits.T = BIT0(Rm); cpu->R[15] = (Rm & 0xFFFFFFFE); cpu->next_instruction = cpu->R[15]; } #else u32 Rm = cpu->R[REG_POS(i, 3)]; //----- ARM_REF: //----- Register 15 can be specified for . If this is done, R15 is read as normal for Thumb code, //----- that is, it is the address of the BX instruction itself plus 4. If the BX instruction is at a //----- word-aligned address, this results in a branch to the next word, executing in ARM state. //----- However, if the BX instruction is not at a word-aligned address, this means that the results of //----- the instruction are UNPREDICTABLE (because the value read for R15 has bits[1:0]==0b10). if (Rm == 15) { //printf("THUMB%c: BX using PC as operand\n", PROCNUM?'7':'9'); //emu_halt(); } cpu->CPSR.bits.T = BIT0(Rm); cpu->R[15] = (Rm & (0xFFFFFFFC|(1<CPSR.bits.T))); cpu->next_instruction = cpu->R[15]; #endif return 3; } TEMPLATE static u32 FASTCALL OP_BLX_THUMB(const u32 i) { u32 Rm = cpu->R[REG_POS(i, 3)]; cpu->CPSR.bits.T = BIT0(Rm); cpu->R[15] = Rm & 0xFFFFFFFE; cpu->R[14] = cpu->next_instruction | 1; cpu->next_instruction = cpu->R[15]; return 4; } //----------------------------------------------------------------------------- // The End //----------------------------------------------------------------------------- const OpFunc thumb_instructions_set[2][1024] = {{ #define TABDECL(x) x<0> #include "thumb_tabdef.inc" #undef TABDECL },{ #define TABDECL(x) x<1> #include "thumb_tabdef.inc" #undef TABDECL }}; #define TABDECL(x) #x const char* thumb_instruction_names[1024] = { #include "thumb_tabdef.inc" }; #undef TABDECL desmume-0.9.9/src/fs-windows.cpp0000644000175000017500000000456612140261633017326 0ustar guillaumeguillaume/* Copyright (C) 2006 Guillaume Duhamel Copyright (C) 2006-2009 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "fs.h" #include #include #include #include const char FS_SEPARATOR = '\\'; void * FsReadFirst(const char * p, FsEntry * entry) { WIN32_FIND_DATA FindFileData; HANDLE hFind; HANDLE * ret; char path[1024]; if (strlen(p)+3 >sizeof(path)) return NULL ; sprintf(path, "%s\\*", p); hFind = FindFirstFile(path, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) return NULL; strncpy(entry->cFileName, FindFileData.cFileName,256); entry->cFileName[255] = 0 ; strncpy(entry->cAlternateFileName, FindFileData.cAlternateFileName,14); entry->cAlternateFileName[13] = 0 ; entry->flags = 0; if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { entry->flags = FS_IS_DIR; entry->fileSize = 0; } else { entry->fileSize = FindFileData.nFileSizeLow; } ret = (void**)malloc(sizeof(HANDLE)); *ret = hFind; return ret; } int FsReadNext(void * search, FsEntry * entry) { WIN32_FIND_DATA FindFileData; HANDLE * h = (HANDLE *) search; int ret; ret = FindNextFile(*h, &FindFileData); strncpy(entry->cFileName, FindFileData.cFileName,256); entry->cFileName[255] = 0 ; strncpy(entry->cAlternateFileName, FindFileData.cAlternateFileName,14); entry->cAlternateFileName[13] = 0 ; entry->flags = 0; if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { entry->flags = FS_IS_DIR; entry->fileSize = 0; } else { entry->fileSize = FindFileData.nFileSizeLow; } return ret; } void FsClose(void * search) { FindClose(*((HANDLE *) search)); } int FsError(void) { if (GetLastError() == ERROR_NO_MORE_FILES) return FS_ERR_NO_MORE_FILES; return FS_ERR_UNKNOWN; } desmume-0.9.9/src/Makefile.in0000644000175000017500000056434612140304537016577 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/src/desmume.mk @HAVE_JIT_TRUE@am__append_1 = \ @HAVE_JIT_TRUE@ arm_jit.cpp arm_jit.h instruction_attributes.h \ @HAVE_JIT_TRUE@ utils/AsmJit/AsmJit.h \ @HAVE_JIT_TRUE@ utils/AsmJit/Config.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/apibegin.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/apiend.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assembler.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assembler.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assert.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/assert.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/buffer.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/buffer.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/build.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compiler.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compiler.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilercontext.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilercontext.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilerfunc.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compilerfunc.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compileritem.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/compileritem.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/context.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/context.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/cpuinfo.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/cpuinfo.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/defs.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/defs.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/func.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/func.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/intutil.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/lock.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/logger.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/logger.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymanager.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymanager.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymarker.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/memorymarker.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/operand.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/operand.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/podvector.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringbuilder.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringbuilder.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringutil.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/stringutil.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/virtualmemory.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/virtualmemory.h \ @HAVE_JIT_TRUE@ utils/AsmJit/core/zonememory.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/core/zonememory.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86assembler.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86assembler.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compiler.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compiler.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilercontext.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilercontext.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilerfunc.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compilerfunc.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compileritem.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86compileritem.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86cpuinfo.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86cpuinfo.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86defs.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86defs.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86func.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86func.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86operand.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86operand.h \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86util.cpp \ @HAVE_JIT_TRUE@ utils/AsmJit/x86/x86util.h @HAVE_GL_TRUE@am__append_2 = OGLRender.cpp @HAVE_OPENAL_TRUE@am__append_3 = mic_openal.cpp @HAVE_ALSA_TRUE@@HAVE_OPENAL_FALSE@am__append_4 = mic_alsa.cpp @HAVE_ALSA_FALSE@@HAVE_OPENAL_FALSE@am__append_5 = mic.cpp @HAVE_LIBSOUNDTOUCH_TRUE@am__append_6 = metaspu/SndOut.cpp metaspu/SndOut.h metaspu/Timestretcher.cpp @HAVE_LIBAGG_TRUE@am__append_7 = aggdraw.cpp aggdraw.h GPU_osd.cpp @HAVE_LIBAGG_FALSE@am__append_8 = GPU_osd_stub.cpp @HAVE_LUA_TRUE@am__append_9 = $(LUA_CFLAGS) @HAVE_LUA_TRUE@am__append_10 = lua-engine.cpp @HAVE_GDB_STUB_TRUE@am__append_11 = gdbstub.h subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libdesmume_a_AR = $(AR) $(ARFLAGS) libdesmume_a_DEPENDENCIES = fs-$(desmume_arch).$(OBJEXT) am__libdesmume_a_SOURCES_DIST = armcpu.cpp armcpu.h \ arm_instructions.cpp agg2d.h agg2d.inl bios.cpp bios.h bits.h \ cp15.cpp cp15.h commandline.h commandline.cpp common.cpp \ common.h debug.cpp debug.h Disassembler.cpp Disassembler.h \ emufile.h emufile.cpp emufile_types.h FIFO.cpp FIFO.h \ firmware.cpp firmware.h GPU.cpp GPU.h fs.h GPU_osd.h \ instructions.h mem.h mc.cpp mc.h path.cpp path.h readwrite.cpp \ readwrite.h wifi.cpp wifi.h mic.h MMU.cpp MMU.h MMU_timing.h \ NDSSystem.cpp NDSSystem.h registers.h OGLRender.h \ ROMReader.cpp ROMReader.h render3D.cpp render3D.h rtc.cpp \ rtc.h saves.cpp saves.h slot1.cpp slot1.h SPU.cpp SPU.h \ matrix.cpp matrix.h gfx3d.cpp gfx3d.h thumb_instructions.cpp \ types.h shaders.h movie.cpp movie.h PACKED.h PACKED_END.h \ utils/datetime.cpp utils/datetime.h utils/ConvertUTF.c \ utils/ConvertUTF.h utils/guid.cpp utils/guid.h \ utils/emufat.cpp utils/emufat.h utils/emufat_types.h \ utils/md5.cpp utils/md5.h utils/valuearray.h utils/xstring.cpp \ utils/xstring.h utils/decrypt/crc.cpp utils/decrypt/crc.h \ utils/decrypt/decrypt.cpp utils/decrypt/decrypt.h \ utils/decrypt/header.cpp utils/decrypt/header.h utils/task.cpp \ utils/task.h utils/vfat.h utils/vfat.cpp utils/dlditool.cpp \ utils/libfat/bit_ops.h utils/libfat/cache.cpp \ utils/libfat/cache.h utils/libfat/common.h \ utils/libfat/directory.cpp utils/libfat/directory.h \ utils/libfat/disc.cpp utils/libfat/disc.h \ utils/libfat/disc_io.h utils/libfat/fat.h \ utils/libfat/fatdir.cpp utils/libfat/fatdir.h \ utils/libfat/fatfile.cpp utils/libfat/fatfile.h \ utils/libfat/filetime.cpp utils/libfat/filetime.h \ utils/libfat/file_allocation_table.cpp \ utils/libfat/file_allocation_table.h utils/libfat/libfat.cpp \ utils/libfat/libfat_pc.h utils/libfat/libfat_public_api.cpp \ utils/libfat/libfat_public_api.h utils/libfat/lock.cpp \ utils/libfat/lock.h utils/libfat/mem_allocate.h \ utils/libfat/partition.cpp utils/libfat/partition.h \ utils/tinyxml/tinystr.cpp utils/tinyxml/tinystr.h \ utils/tinyxml/tinyxml.cpp utils/tinyxml/tinyxml.h \ utils/tinyxml/tinyxmlerror.cpp utils/tinyxml/tinyxmlparser.cpp \ addons.cpp addons.h addons/slot2_mpcf.cpp \ addons/slot2_paddle.cpp addons/slot2_gbagame.cpp \ addons/slot2_none.cpp addons/slot2_rumblepak.cpp \ addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp \ addons/slot2_piano.cpp addons/slot1_none.cpp \ addons/slot1_r4.cpp addons/slot1_retail.cpp \ addons/slot1_retail_nand.cpp cheatSystem.cpp cheatSystem.h \ texcache.cpp texcache.h rasterize.cpp rasterize.h \ metaspu/metaspu.cpp metaspu/metaspu.h filter/2xsai.cpp \ filter/bilinear.cpp filter/epx.cpp filter/filter.h \ filter/hq2x.cpp filter/hq2x.h filter/hq4x.cpp filter/hq4x.dat \ filter/hq4x.h filter/interp.h filter/lq2x.cpp filter/lq2x.h \ filter/scanline.cpp filter/videofilter.cpp \ filter/videofilter.h version.cpp version.h desmume_config.cpp \ desmume_config.h arm_jit.cpp arm_jit.h \ instruction_attributes.h utils/AsmJit/AsmJit.h \ utils/AsmJit/Config.h utils/AsmJit/core.h utils/AsmJit/x86.h \ utils/AsmJit/core/apibegin.h utils/AsmJit/core/apiend.h \ utils/AsmJit/core/assembler.cpp utils/AsmJit/core/assembler.h \ utils/AsmJit/core/assert.cpp utils/AsmJit/core/assert.h \ utils/AsmJit/core/buffer.cpp utils/AsmJit/core/buffer.h \ utils/AsmJit/core/build.h utils/AsmJit/core/compiler.cpp \ utils/AsmJit/core/compiler.h \ utils/AsmJit/core/compilercontext.cpp \ utils/AsmJit/core/compilercontext.h \ utils/AsmJit/core/compilerfunc.cpp \ utils/AsmJit/core/compilerfunc.h \ utils/AsmJit/core/compileritem.cpp \ utils/AsmJit/core/compileritem.h utils/AsmJit/core/context.cpp \ utils/AsmJit/core/context.h utils/AsmJit/core/cpuinfo.cpp \ utils/AsmJit/core/cpuinfo.h utils/AsmJit/core/defs.cpp \ utils/AsmJit/core/defs.h utils/AsmJit/core/func.cpp \ utils/AsmJit/core/func.h utils/AsmJit/core/intutil.h \ utils/AsmJit/core/lock.h utils/AsmJit/core/logger.cpp \ utils/AsmJit/core/logger.h utils/AsmJit/core/memorymanager.cpp \ utils/AsmJit/core/memorymanager.h \ utils/AsmJit/core/memorymarker.cpp \ utils/AsmJit/core/memorymarker.h utils/AsmJit/core/operand.cpp \ utils/AsmJit/core/operand.h utils/AsmJit/core/podvector.h \ utils/AsmJit/core/stringbuilder.cpp \ utils/AsmJit/core/stringbuilder.h \ utils/AsmJit/core/stringutil.cpp \ utils/AsmJit/core/stringutil.h \ utils/AsmJit/core/virtualmemory.cpp \ utils/AsmJit/core/virtualmemory.h \ utils/AsmJit/core/zonememory.cpp \ utils/AsmJit/core/zonememory.h \ utils/AsmJit/x86/x86assembler.cpp \ utils/AsmJit/x86/x86assembler.h \ utils/AsmJit/x86/x86compiler.cpp \ utils/AsmJit/x86/x86compiler.h \ utils/AsmJit/x86/x86compilercontext.cpp \ utils/AsmJit/x86/x86compilercontext.h \ utils/AsmJit/x86/x86compilerfunc.cpp \ utils/AsmJit/x86/x86compilerfunc.h \ utils/AsmJit/x86/x86compileritem.cpp \ utils/AsmJit/x86/x86compileritem.h \ utils/AsmJit/x86/x86cpuinfo.cpp utils/AsmJit/x86/x86cpuinfo.h \ utils/AsmJit/x86/x86defs.cpp utils/AsmJit/x86/x86defs.h \ utils/AsmJit/x86/x86func.cpp utils/AsmJit/x86/x86func.h \ utils/AsmJit/x86/x86operand.cpp utils/AsmJit/x86/x86operand.h \ utils/AsmJit/x86/x86util.cpp utils/AsmJit/x86/x86util.h \ OGLRender.cpp mic_openal.cpp mic_alsa.cpp mic.cpp \ metaspu/SndOut.cpp metaspu/SndOut.h metaspu/Timestretcher.cpp \ aggdraw.cpp aggdraw.h GPU_osd.cpp GPU_osd_stub.cpp \ lua-engine.cpp gdbstub.h @HAVE_JIT_TRUE@am__objects_1 = arm_jit.$(OBJEXT) assembler.$(OBJEXT) \ @HAVE_JIT_TRUE@ assert.$(OBJEXT) buffer.$(OBJEXT) \ @HAVE_JIT_TRUE@ compiler.$(OBJEXT) compilercontext.$(OBJEXT) \ @HAVE_JIT_TRUE@ compilerfunc.$(OBJEXT) compileritem.$(OBJEXT) \ @HAVE_JIT_TRUE@ context.$(OBJEXT) cpuinfo.$(OBJEXT) \ @HAVE_JIT_TRUE@ defs.$(OBJEXT) func.$(OBJEXT) logger.$(OBJEXT) \ @HAVE_JIT_TRUE@ memorymanager.$(OBJEXT) memorymarker.$(OBJEXT) \ @HAVE_JIT_TRUE@ operand.$(OBJEXT) stringbuilder.$(OBJEXT) \ @HAVE_JIT_TRUE@ stringutil.$(OBJEXT) virtualmemory.$(OBJEXT) \ @HAVE_JIT_TRUE@ zonememory.$(OBJEXT) x86assembler.$(OBJEXT) \ @HAVE_JIT_TRUE@ x86compiler.$(OBJEXT) \ @HAVE_JIT_TRUE@ x86compilercontext.$(OBJEXT) \ @HAVE_JIT_TRUE@ x86compilerfunc.$(OBJEXT) \ @HAVE_JIT_TRUE@ x86compileritem.$(OBJEXT) x86cpuinfo.$(OBJEXT) \ @HAVE_JIT_TRUE@ x86defs.$(OBJEXT) x86func.$(OBJEXT) \ @HAVE_JIT_TRUE@ x86operand.$(OBJEXT) x86util.$(OBJEXT) @HAVE_GL_TRUE@am__objects_2 = OGLRender.$(OBJEXT) @HAVE_OPENAL_TRUE@am__objects_3 = mic_openal.$(OBJEXT) @HAVE_ALSA_TRUE@@HAVE_OPENAL_FALSE@am__objects_4 = mic_alsa.$(OBJEXT) @HAVE_ALSA_FALSE@@HAVE_OPENAL_FALSE@am__objects_5 = mic.$(OBJEXT) @HAVE_LIBSOUNDTOUCH_TRUE@am__objects_6 = SndOut.$(OBJEXT) \ @HAVE_LIBSOUNDTOUCH_TRUE@ Timestretcher.$(OBJEXT) @HAVE_LIBAGG_TRUE@am__objects_7 = aggdraw.$(OBJEXT) GPU_osd.$(OBJEXT) @HAVE_LIBAGG_FALSE@am__objects_8 = GPU_osd_stub.$(OBJEXT) @HAVE_LUA_TRUE@am__objects_9 = lua-engine.$(OBJEXT) am__objects_10 = am_libdesmume_a_OBJECTS = armcpu.$(OBJEXT) arm_instructions.$(OBJEXT) \ bios.$(OBJEXT) cp15.$(OBJEXT) commandline.$(OBJEXT) \ common.$(OBJEXT) debug.$(OBJEXT) Disassembler.$(OBJEXT) \ emufile.$(OBJEXT) FIFO.$(OBJEXT) firmware.$(OBJEXT) \ GPU.$(OBJEXT) mc.$(OBJEXT) path.$(OBJEXT) readwrite.$(OBJEXT) \ wifi.$(OBJEXT) MMU.$(OBJEXT) NDSSystem.$(OBJEXT) \ ROMReader.$(OBJEXT) render3D.$(OBJEXT) rtc.$(OBJEXT) \ saves.$(OBJEXT) slot1.$(OBJEXT) SPU.$(OBJEXT) matrix.$(OBJEXT) \ gfx3d.$(OBJEXT) thumb_instructions.$(OBJEXT) movie.$(OBJEXT) \ datetime.$(OBJEXT) ConvertUTF.$(OBJEXT) guid.$(OBJEXT) \ emufat.$(OBJEXT) md5.$(OBJEXT) xstring.$(OBJEXT) crc.$(OBJEXT) \ decrypt.$(OBJEXT) header.$(OBJEXT) task.$(OBJEXT) \ vfat.$(OBJEXT) dlditool.$(OBJEXT) cache.$(OBJEXT) \ directory.$(OBJEXT) disc.$(OBJEXT) fatdir.$(OBJEXT) \ fatfile.$(OBJEXT) filetime.$(OBJEXT) \ file_allocation_table.$(OBJEXT) libfat.$(OBJEXT) \ libfat_public_api.$(OBJEXT) lock.$(OBJEXT) partition.$(OBJEXT) \ tinystr.$(OBJEXT) tinyxml.$(OBJEXT) tinyxmlerror.$(OBJEXT) \ tinyxmlparser.$(OBJEXT) addons.$(OBJEXT) slot2_mpcf.$(OBJEXT) \ slot2_paddle.$(OBJEXT) slot2_gbagame.$(OBJEXT) \ slot2_none.$(OBJEXT) slot2_rumblepak.$(OBJEXT) \ slot2_guitarGrip.$(OBJEXT) slot2_expMemory.$(OBJEXT) \ slot2_piano.$(OBJEXT) slot1_none.$(OBJEXT) slot1_r4.$(OBJEXT) \ slot1_retail.$(OBJEXT) slot1_retail_nand.$(OBJEXT) \ cheatSystem.$(OBJEXT) texcache.$(OBJEXT) rasterize.$(OBJEXT) \ metaspu.$(OBJEXT) 2xsai.$(OBJEXT) bilinear.$(OBJEXT) \ epx.$(OBJEXT) hq2x.$(OBJEXT) hq4x.$(OBJEXT) lq2x.$(OBJEXT) \ scanline.$(OBJEXT) videofilter.$(OBJEXT) version.$(OBJEXT) \ desmume_config.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) $(am__objects_8) \ $(am__objects_9) $(am__objects_10) libdesmume_a_OBJECTS = $(am_libdesmume_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libdesmume_a_SOURCES) DIST_SOURCES = $(am__libdesmume_a_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(GTHREAD_CFLAGS) \ $(X_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) \ $(LIBSOUNDTOUCH_CFLAGS) $(am__append_9) AM_LDFLAGS = EXTRA_DIST = build.bat instruction_tabdef.inc thumb_tabdef.inc fs-linux.cpp fs-windows.cpp cocoa @HAVE_GDB_STUB_FALSE@SUBDIRS = . $(UI_DIR) @HAVE_GDB_STUB_TRUE@SUBDIRS = . gdbstub $(UI_DIR) DIST_SUBDIRS = . gdbstub cli gtk gtk-glade wx noinst_LIBRARIES = libdesmume.a libdesmume_a_SOURCES = armcpu.cpp armcpu.h arm_instructions.cpp \ agg2d.h agg2d.inl bios.cpp bios.h bits.h cp15.cpp cp15.h \ commandline.h commandline.cpp common.cpp common.h debug.cpp \ debug.h Disassembler.cpp Disassembler.h emufile.h emufile.cpp \ emufile_types.h FIFO.cpp FIFO.h firmware.cpp firmware.h \ GPU.cpp GPU.h fs.h GPU_osd.h instructions.h mem.h mc.cpp mc.h \ path.cpp path.h readwrite.cpp readwrite.h wifi.cpp wifi.h \ mic.h MMU.cpp MMU.h MMU_timing.h NDSSystem.cpp NDSSystem.h \ registers.h OGLRender.h ROMReader.cpp ROMReader.h render3D.cpp \ render3D.h rtc.cpp rtc.h saves.cpp saves.h slot1.cpp slot1.h \ SPU.cpp SPU.h matrix.cpp matrix.h gfx3d.cpp gfx3d.h \ thumb_instructions.cpp types.h shaders.h movie.cpp movie.h \ PACKED.h PACKED_END.h utils/datetime.cpp utils/datetime.h \ utils/ConvertUTF.c utils/ConvertUTF.h utils/guid.cpp \ utils/guid.h utils/emufat.cpp utils/emufat.h \ utils/emufat_types.h utils/md5.cpp utils/md5.h \ utils/valuearray.h utils/xstring.cpp utils/xstring.h \ utils/decrypt/crc.cpp utils/decrypt/crc.h \ utils/decrypt/decrypt.cpp utils/decrypt/decrypt.h \ utils/decrypt/header.cpp utils/decrypt/header.h utils/task.cpp \ utils/task.h utils/vfat.h utils/vfat.cpp utils/dlditool.cpp \ utils/libfat/bit_ops.h utils/libfat/cache.cpp \ utils/libfat/cache.h utils/libfat/common.h \ utils/libfat/directory.cpp utils/libfat/directory.h \ utils/libfat/disc.cpp utils/libfat/disc.h \ utils/libfat/disc_io.h utils/libfat/fat.h \ utils/libfat/fatdir.cpp utils/libfat/fatdir.h \ utils/libfat/fatfile.cpp utils/libfat/fatfile.h \ utils/libfat/filetime.cpp utils/libfat/filetime.h \ utils/libfat/file_allocation_table.cpp \ utils/libfat/file_allocation_table.h utils/libfat/libfat.cpp \ utils/libfat/libfat_pc.h utils/libfat/libfat_public_api.cpp \ utils/libfat/libfat_public_api.h utils/libfat/lock.cpp \ utils/libfat/lock.h utils/libfat/mem_allocate.h \ utils/libfat/partition.cpp utils/libfat/partition.h \ utils/tinyxml/tinystr.cpp utils/tinyxml/tinystr.h \ utils/tinyxml/tinyxml.cpp utils/tinyxml/tinyxml.h \ utils/tinyxml/tinyxmlerror.cpp utils/tinyxml/tinyxmlparser.cpp \ addons.cpp addons.h addons/slot2_mpcf.cpp \ addons/slot2_paddle.cpp addons/slot2_gbagame.cpp \ addons/slot2_none.cpp addons/slot2_rumblepak.cpp \ addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp \ addons/slot2_piano.cpp addons/slot1_none.cpp \ addons/slot1_r4.cpp addons/slot1_retail.cpp \ addons/slot1_retail_nand.cpp cheatSystem.cpp cheatSystem.h \ texcache.cpp texcache.h rasterize.cpp rasterize.h \ metaspu/metaspu.cpp metaspu/metaspu.h filter/2xsai.cpp \ filter/bilinear.cpp filter/epx.cpp filter/filter.h \ filter/hq2x.cpp filter/hq2x.h filter/hq4x.cpp filter/hq4x.dat \ filter/hq4x.h filter/interp.h filter/lq2x.cpp filter/lq2x.h \ filter/scanline.cpp filter/videofilter.cpp \ filter/videofilter.h version.cpp version.h desmume_config.cpp \ desmume_config.h $(am__append_1) $(am__append_2) \ $(am__append_3) $(am__append_4) $(am__append_5) \ $(am__append_6) $(am__append_7) $(am__append_8) \ $(am__append_10) $(am__append_11) libdesmume_a_LIBADD = fs-$(desmume_arch).$(OBJEXT) all: all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src/desmume.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libdesmume.a: $(libdesmume_a_OBJECTS) $(libdesmume_a_DEPENDENCIES) $(EXTRA_libdesmume_a_DEPENDENCIES) -rm -f libdesmume.a $(libdesmume_a_AR) libdesmume.a $(libdesmume_a_OBJECTS) $(libdesmume_a_LIBADD) $(RANLIB) libdesmume.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/2xsai.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConvertUTF.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Disassembler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FIFO.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU_osd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU_osd_stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MMU.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NDSSystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OGLRender.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ROMReader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SPU.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SndOut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Timestretcher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aggdraw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_instructions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_jit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/armcpu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assembler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bilinear.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bios.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheatSystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commandline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compiler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compilercontext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compilerfunc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compileritem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp15.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpuinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datetime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decrypt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desmume_config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlditool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emufat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emufile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fatdir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fatfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file_allocation_table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filetime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/firmware.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/func.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx3d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hq2x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hq4x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfat_public_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lq2x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua-engine.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memorymanager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memorymarker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metaspu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic_alsa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic_openal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movie.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/operand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rasterize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readwrite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render3D.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/saves.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scanline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1_none.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1_r4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1_retail.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1_retail_nand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_expMemory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_gbagame.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_guitarGrip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_mpcf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_none.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_paddle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_piano.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_rumblepak.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stringbuilder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stringutil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texcache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumb_instructions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinystr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxmlerror.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxmlparser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/videofilter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virtualmemory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wifi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86assembler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86compiler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86compilercontext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86compilerfunc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86compileritem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86cpuinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86defs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86func.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86operand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zonememory.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ConvertUTF.o: utils/ConvertUTF.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ConvertUTF.o -MD -MP -MF $(DEPDIR)/ConvertUTF.Tpo -c -o ConvertUTF.o `test -f 'utils/ConvertUTF.c' || echo '$(srcdir)/'`utils/ConvertUTF.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ConvertUTF.Tpo $(DEPDIR)/ConvertUTF.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utils/ConvertUTF.c' object='ConvertUTF.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ConvertUTF.o `test -f 'utils/ConvertUTF.c' || echo '$(srcdir)/'`utils/ConvertUTF.c ConvertUTF.obj: utils/ConvertUTF.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ConvertUTF.obj -MD -MP -MF $(DEPDIR)/ConvertUTF.Tpo -c -o ConvertUTF.obj `if test -f 'utils/ConvertUTF.c'; then $(CYGPATH_W) 'utils/ConvertUTF.c'; else $(CYGPATH_W) '$(srcdir)/utils/ConvertUTF.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ConvertUTF.Tpo $(DEPDIR)/ConvertUTF.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utils/ConvertUTF.c' object='ConvertUTF.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ConvertUTF.obj `if test -f 'utils/ConvertUTF.c'; then $(CYGPATH_W) 'utils/ConvertUTF.c'; else $(CYGPATH_W) '$(srcdir)/utils/ConvertUTF.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` datetime.o: utils/datetime.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT datetime.o -MD -MP -MF $(DEPDIR)/datetime.Tpo -c -o datetime.o `test -f 'utils/datetime.cpp' || echo '$(srcdir)/'`utils/datetime.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/datetime.Tpo $(DEPDIR)/datetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/datetime.cpp' object='datetime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o datetime.o `test -f 'utils/datetime.cpp' || echo '$(srcdir)/'`utils/datetime.cpp datetime.obj: utils/datetime.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT datetime.obj -MD -MP -MF $(DEPDIR)/datetime.Tpo -c -o datetime.obj `if test -f 'utils/datetime.cpp'; then $(CYGPATH_W) 'utils/datetime.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/datetime.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/datetime.Tpo $(DEPDIR)/datetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/datetime.cpp' object='datetime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o datetime.obj `if test -f 'utils/datetime.cpp'; then $(CYGPATH_W) 'utils/datetime.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/datetime.cpp'; fi` guid.o: utils/guid.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT guid.o -MD -MP -MF $(DEPDIR)/guid.Tpo -c -o guid.o `test -f 'utils/guid.cpp' || echo '$(srcdir)/'`utils/guid.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/guid.Tpo $(DEPDIR)/guid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/guid.cpp' object='guid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o guid.o `test -f 'utils/guid.cpp' || echo '$(srcdir)/'`utils/guid.cpp guid.obj: utils/guid.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT guid.obj -MD -MP -MF $(DEPDIR)/guid.Tpo -c -o guid.obj `if test -f 'utils/guid.cpp'; then $(CYGPATH_W) 'utils/guid.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/guid.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/guid.Tpo $(DEPDIR)/guid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/guid.cpp' object='guid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o guid.obj `if test -f 'utils/guid.cpp'; then $(CYGPATH_W) 'utils/guid.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/guid.cpp'; fi` emufat.o: utils/emufat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT emufat.o -MD -MP -MF $(DEPDIR)/emufat.Tpo -c -o emufat.o `test -f 'utils/emufat.cpp' || echo '$(srcdir)/'`utils/emufat.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/emufat.Tpo $(DEPDIR)/emufat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/emufat.cpp' object='emufat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o emufat.o `test -f 'utils/emufat.cpp' || echo '$(srcdir)/'`utils/emufat.cpp emufat.obj: utils/emufat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT emufat.obj -MD -MP -MF $(DEPDIR)/emufat.Tpo -c -o emufat.obj `if test -f 'utils/emufat.cpp'; then $(CYGPATH_W) 'utils/emufat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/emufat.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/emufat.Tpo $(DEPDIR)/emufat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/emufat.cpp' object='emufat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o emufat.obj `if test -f 'utils/emufat.cpp'; then $(CYGPATH_W) 'utils/emufat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/emufat.cpp'; fi` md5.o: utils/md5.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT md5.o -MD -MP -MF $(DEPDIR)/md5.Tpo -c -o md5.o `test -f 'utils/md5.cpp' || echo '$(srcdir)/'`utils/md5.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/md5.Tpo $(DEPDIR)/md5.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/md5.cpp' object='md5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o md5.o `test -f 'utils/md5.cpp' || echo '$(srcdir)/'`utils/md5.cpp md5.obj: utils/md5.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT md5.obj -MD -MP -MF $(DEPDIR)/md5.Tpo -c -o md5.obj `if test -f 'utils/md5.cpp'; then $(CYGPATH_W) 'utils/md5.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/md5.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/md5.Tpo $(DEPDIR)/md5.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/md5.cpp' object='md5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o md5.obj `if test -f 'utils/md5.cpp'; then $(CYGPATH_W) 'utils/md5.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/md5.cpp'; fi` xstring.o: utils/xstring.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xstring.o -MD -MP -MF $(DEPDIR)/xstring.Tpo -c -o xstring.o `test -f 'utils/xstring.cpp' || echo '$(srcdir)/'`utils/xstring.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xstring.Tpo $(DEPDIR)/xstring.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/xstring.cpp' object='xstring.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xstring.o `test -f 'utils/xstring.cpp' || echo '$(srcdir)/'`utils/xstring.cpp xstring.obj: utils/xstring.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xstring.obj -MD -MP -MF $(DEPDIR)/xstring.Tpo -c -o xstring.obj `if test -f 'utils/xstring.cpp'; then $(CYGPATH_W) 'utils/xstring.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/xstring.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xstring.Tpo $(DEPDIR)/xstring.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/xstring.cpp' object='xstring.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xstring.obj `if test -f 'utils/xstring.cpp'; then $(CYGPATH_W) 'utils/xstring.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/xstring.cpp'; fi` crc.o: utils/decrypt/crc.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT crc.o -MD -MP -MF $(DEPDIR)/crc.Tpo -c -o crc.o `test -f 'utils/decrypt/crc.cpp' || echo '$(srcdir)/'`utils/decrypt/crc.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/crc.Tpo $(DEPDIR)/crc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/decrypt/crc.cpp' object='crc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o crc.o `test -f 'utils/decrypt/crc.cpp' || echo '$(srcdir)/'`utils/decrypt/crc.cpp crc.obj: utils/decrypt/crc.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT crc.obj -MD -MP -MF $(DEPDIR)/crc.Tpo -c -o crc.obj `if test -f 'utils/decrypt/crc.cpp'; then $(CYGPATH_W) 'utils/decrypt/crc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/crc.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/crc.Tpo $(DEPDIR)/crc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/decrypt/crc.cpp' object='crc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o crc.obj `if test -f 'utils/decrypt/crc.cpp'; then $(CYGPATH_W) 'utils/decrypt/crc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/crc.cpp'; fi` decrypt.o: utils/decrypt/decrypt.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT decrypt.o -MD -MP -MF $(DEPDIR)/decrypt.Tpo -c -o decrypt.o `test -f 'utils/decrypt/decrypt.cpp' || echo '$(srcdir)/'`utils/decrypt/decrypt.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/decrypt.Tpo $(DEPDIR)/decrypt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/decrypt/decrypt.cpp' object='decrypt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o decrypt.o `test -f 'utils/decrypt/decrypt.cpp' || echo '$(srcdir)/'`utils/decrypt/decrypt.cpp decrypt.obj: utils/decrypt/decrypt.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT decrypt.obj -MD -MP -MF $(DEPDIR)/decrypt.Tpo -c -o decrypt.obj `if test -f 'utils/decrypt/decrypt.cpp'; then $(CYGPATH_W) 'utils/decrypt/decrypt.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/decrypt.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/decrypt.Tpo $(DEPDIR)/decrypt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/decrypt/decrypt.cpp' object='decrypt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o decrypt.obj `if test -f 'utils/decrypt/decrypt.cpp'; then $(CYGPATH_W) 'utils/decrypt/decrypt.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/decrypt.cpp'; fi` header.o: utils/decrypt/header.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT header.o -MD -MP -MF $(DEPDIR)/header.Tpo -c -o header.o `test -f 'utils/decrypt/header.cpp' || echo '$(srcdir)/'`utils/decrypt/header.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/header.Tpo $(DEPDIR)/header.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/decrypt/header.cpp' object='header.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o header.o `test -f 'utils/decrypt/header.cpp' || echo '$(srcdir)/'`utils/decrypt/header.cpp header.obj: utils/decrypt/header.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT header.obj -MD -MP -MF $(DEPDIR)/header.Tpo -c -o header.obj `if test -f 'utils/decrypt/header.cpp'; then $(CYGPATH_W) 'utils/decrypt/header.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/header.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/header.Tpo $(DEPDIR)/header.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/decrypt/header.cpp' object='header.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o header.obj `if test -f 'utils/decrypt/header.cpp'; then $(CYGPATH_W) 'utils/decrypt/header.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/header.cpp'; fi` task.o: utils/task.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT task.o -MD -MP -MF $(DEPDIR)/task.Tpo -c -o task.o `test -f 'utils/task.cpp' || echo '$(srcdir)/'`utils/task.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/task.Tpo $(DEPDIR)/task.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/task.cpp' object='task.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o task.o `test -f 'utils/task.cpp' || echo '$(srcdir)/'`utils/task.cpp task.obj: utils/task.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT task.obj -MD -MP -MF $(DEPDIR)/task.Tpo -c -o task.obj `if test -f 'utils/task.cpp'; then $(CYGPATH_W) 'utils/task.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/task.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/task.Tpo $(DEPDIR)/task.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/task.cpp' object='task.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o task.obj `if test -f 'utils/task.cpp'; then $(CYGPATH_W) 'utils/task.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/task.cpp'; fi` vfat.o: utils/vfat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vfat.o -MD -MP -MF $(DEPDIR)/vfat.Tpo -c -o vfat.o `test -f 'utils/vfat.cpp' || echo '$(srcdir)/'`utils/vfat.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/vfat.Tpo $(DEPDIR)/vfat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/vfat.cpp' object='vfat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vfat.o `test -f 'utils/vfat.cpp' || echo '$(srcdir)/'`utils/vfat.cpp vfat.obj: utils/vfat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vfat.obj -MD -MP -MF $(DEPDIR)/vfat.Tpo -c -o vfat.obj `if test -f 'utils/vfat.cpp'; then $(CYGPATH_W) 'utils/vfat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/vfat.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/vfat.Tpo $(DEPDIR)/vfat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/vfat.cpp' object='vfat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vfat.obj `if test -f 'utils/vfat.cpp'; then $(CYGPATH_W) 'utils/vfat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/vfat.cpp'; fi` dlditool.o: utils/dlditool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dlditool.o -MD -MP -MF $(DEPDIR)/dlditool.Tpo -c -o dlditool.o `test -f 'utils/dlditool.cpp' || echo '$(srcdir)/'`utils/dlditool.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/dlditool.Tpo $(DEPDIR)/dlditool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/dlditool.cpp' object='dlditool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dlditool.o `test -f 'utils/dlditool.cpp' || echo '$(srcdir)/'`utils/dlditool.cpp dlditool.obj: utils/dlditool.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dlditool.obj -MD -MP -MF $(DEPDIR)/dlditool.Tpo -c -o dlditool.obj `if test -f 'utils/dlditool.cpp'; then $(CYGPATH_W) 'utils/dlditool.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/dlditool.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/dlditool.Tpo $(DEPDIR)/dlditool.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/dlditool.cpp' object='dlditool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dlditool.obj `if test -f 'utils/dlditool.cpp'; then $(CYGPATH_W) 'utils/dlditool.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/dlditool.cpp'; fi` cache.o: utils/libfat/cache.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cache.o -MD -MP -MF $(DEPDIR)/cache.Tpo -c -o cache.o `test -f 'utils/libfat/cache.cpp' || echo '$(srcdir)/'`utils/libfat/cache.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cache.Tpo $(DEPDIR)/cache.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/cache.cpp' object='cache.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cache.o `test -f 'utils/libfat/cache.cpp' || echo '$(srcdir)/'`utils/libfat/cache.cpp cache.obj: utils/libfat/cache.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cache.obj -MD -MP -MF $(DEPDIR)/cache.Tpo -c -o cache.obj `if test -f 'utils/libfat/cache.cpp'; then $(CYGPATH_W) 'utils/libfat/cache.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/cache.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cache.Tpo $(DEPDIR)/cache.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/cache.cpp' object='cache.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cache.obj `if test -f 'utils/libfat/cache.cpp'; then $(CYGPATH_W) 'utils/libfat/cache.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/cache.cpp'; fi` directory.o: utils/libfat/directory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT directory.o -MD -MP -MF $(DEPDIR)/directory.Tpo -c -o directory.o `test -f 'utils/libfat/directory.cpp' || echo '$(srcdir)/'`utils/libfat/directory.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/directory.Tpo $(DEPDIR)/directory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/directory.cpp' object='directory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o directory.o `test -f 'utils/libfat/directory.cpp' || echo '$(srcdir)/'`utils/libfat/directory.cpp directory.obj: utils/libfat/directory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT directory.obj -MD -MP -MF $(DEPDIR)/directory.Tpo -c -o directory.obj `if test -f 'utils/libfat/directory.cpp'; then $(CYGPATH_W) 'utils/libfat/directory.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/directory.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/directory.Tpo $(DEPDIR)/directory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/directory.cpp' object='directory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o directory.obj `if test -f 'utils/libfat/directory.cpp'; then $(CYGPATH_W) 'utils/libfat/directory.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/directory.cpp'; fi` disc.o: utils/libfat/disc.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT disc.o -MD -MP -MF $(DEPDIR)/disc.Tpo -c -o disc.o `test -f 'utils/libfat/disc.cpp' || echo '$(srcdir)/'`utils/libfat/disc.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/disc.Tpo $(DEPDIR)/disc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/disc.cpp' object='disc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o disc.o `test -f 'utils/libfat/disc.cpp' || echo '$(srcdir)/'`utils/libfat/disc.cpp disc.obj: utils/libfat/disc.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT disc.obj -MD -MP -MF $(DEPDIR)/disc.Tpo -c -o disc.obj `if test -f 'utils/libfat/disc.cpp'; then $(CYGPATH_W) 'utils/libfat/disc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/disc.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/disc.Tpo $(DEPDIR)/disc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/disc.cpp' object='disc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o disc.obj `if test -f 'utils/libfat/disc.cpp'; then $(CYGPATH_W) 'utils/libfat/disc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/disc.cpp'; fi` fatdir.o: utils/libfat/fatdir.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fatdir.o -MD -MP -MF $(DEPDIR)/fatdir.Tpo -c -o fatdir.o `test -f 'utils/libfat/fatdir.cpp' || echo '$(srcdir)/'`utils/libfat/fatdir.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/fatdir.Tpo $(DEPDIR)/fatdir.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/fatdir.cpp' object='fatdir.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fatdir.o `test -f 'utils/libfat/fatdir.cpp' || echo '$(srcdir)/'`utils/libfat/fatdir.cpp fatdir.obj: utils/libfat/fatdir.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fatdir.obj -MD -MP -MF $(DEPDIR)/fatdir.Tpo -c -o fatdir.obj `if test -f 'utils/libfat/fatdir.cpp'; then $(CYGPATH_W) 'utils/libfat/fatdir.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/fatdir.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/fatdir.Tpo $(DEPDIR)/fatdir.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/fatdir.cpp' object='fatdir.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fatdir.obj `if test -f 'utils/libfat/fatdir.cpp'; then $(CYGPATH_W) 'utils/libfat/fatdir.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/fatdir.cpp'; fi` fatfile.o: utils/libfat/fatfile.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fatfile.o -MD -MP -MF $(DEPDIR)/fatfile.Tpo -c -o fatfile.o `test -f 'utils/libfat/fatfile.cpp' || echo '$(srcdir)/'`utils/libfat/fatfile.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/fatfile.Tpo $(DEPDIR)/fatfile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/fatfile.cpp' object='fatfile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fatfile.o `test -f 'utils/libfat/fatfile.cpp' || echo '$(srcdir)/'`utils/libfat/fatfile.cpp fatfile.obj: utils/libfat/fatfile.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fatfile.obj -MD -MP -MF $(DEPDIR)/fatfile.Tpo -c -o fatfile.obj `if test -f 'utils/libfat/fatfile.cpp'; then $(CYGPATH_W) 'utils/libfat/fatfile.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/fatfile.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/fatfile.Tpo $(DEPDIR)/fatfile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/fatfile.cpp' object='fatfile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fatfile.obj `if test -f 'utils/libfat/fatfile.cpp'; then $(CYGPATH_W) 'utils/libfat/fatfile.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/fatfile.cpp'; fi` filetime.o: utils/libfat/filetime.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT filetime.o -MD -MP -MF $(DEPDIR)/filetime.Tpo -c -o filetime.o `test -f 'utils/libfat/filetime.cpp' || echo '$(srcdir)/'`utils/libfat/filetime.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/filetime.Tpo $(DEPDIR)/filetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/filetime.cpp' object='filetime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o filetime.o `test -f 'utils/libfat/filetime.cpp' || echo '$(srcdir)/'`utils/libfat/filetime.cpp filetime.obj: utils/libfat/filetime.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT filetime.obj -MD -MP -MF $(DEPDIR)/filetime.Tpo -c -o filetime.obj `if test -f 'utils/libfat/filetime.cpp'; then $(CYGPATH_W) 'utils/libfat/filetime.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/filetime.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/filetime.Tpo $(DEPDIR)/filetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/filetime.cpp' object='filetime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o filetime.obj `if test -f 'utils/libfat/filetime.cpp'; then $(CYGPATH_W) 'utils/libfat/filetime.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/filetime.cpp'; fi` file_allocation_table.o: utils/libfat/file_allocation_table.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT file_allocation_table.o -MD -MP -MF $(DEPDIR)/file_allocation_table.Tpo -c -o file_allocation_table.o `test -f 'utils/libfat/file_allocation_table.cpp' || echo '$(srcdir)/'`utils/libfat/file_allocation_table.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/file_allocation_table.Tpo $(DEPDIR)/file_allocation_table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/file_allocation_table.cpp' object='file_allocation_table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o file_allocation_table.o `test -f 'utils/libfat/file_allocation_table.cpp' || echo '$(srcdir)/'`utils/libfat/file_allocation_table.cpp file_allocation_table.obj: utils/libfat/file_allocation_table.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT file_allocation_table.obj -MD -MP -MF $(DEPDIR)/file_allocation_table.Tpo -c -o file_allocation_table.obj `if test -f 'utils/libfat/file_allocation_table.cpp'; then $(CYGPATH_W) 'utils/libfat/file_allocation_table.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/file_allocation_table.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/file_allocation_table.Tpo $(DEPDIR)/file_allocation_table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/file_allocation_table.cpp' object='file_allocation_table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o file_allocation_table.obj `if test -f 'utils/libfat/file_allocation_table.cpp'; then $(CYGPATH_W) 'utils/libfat/file_allocation_table.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/file_allocation_table.cpp'; fi` libfat.o: utils/libfat/libfat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libfat.o -MD -MP -MF $(DEPDIR)/libfat.Tpo -c -o libfat.o `test -f 'utils/libfat/libfat.cpp' || echo '$(srcdir)/'`utils/libfat/libfat.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libfat.Tpo $(DEPDIR)/libfat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/libfat.cpp' object='libfat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libfat.o `test -f 'utils/libfat/libfat.cpp' || echo '$(srcdir)/'`utils/libfat/libfat.cpp libfat.obj: utils/libfat/libfat.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libfat.obj -MD -MP -MF $(DEPDIR)/libfat.Tpo -c -o libfat.obj `if test -f 'utils/libfat/libfat.cpp'; then $(CYGPATH_W) 'utils/libfat/libfat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/libfat.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libfat.Tpo $(DEPDIR)/libfat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/libfat.cpp' object='libfat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libfat.obj `if test -f 'utils/libfat/libfat.cpp'; then $(CYGPATH_W) 'utils/libfat/libfat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/libfat.cpp'; fi` libfat_public_api.o: utils/libfat/libfat_public_api.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libfat_public_api.o -MD -MP -MF $(DEPDIR)/libfat_public_api.Tpo -c -o libfat_public_api.o `test -f 'utils/libfat/libfat_public_api.cpp' || echo '$(srcdir)/'`utils/libfat/libfat_public_api.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libfat_public_api.Tpo $(DEPDIR)/libfat_public_api.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/libfat_public_api.cpp' object='libfat_public_api.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libfat_public_api.o `test -f 'utils/libfat/libfat_public_api.cpp' || echo '$(srcdir)/'`utils/libfat/libfat_public_api.cpp libfat_public_api.obj: utils/libfat/libfat_public_api.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libfat_public_api.obj -MD -MP -MF $(DEPDIR)/libfat_public_api.Tpo -c -o libfat_public_api.obj `if test -f 'utils/libfat/libfat_public_api.cpp'; then $(CYGPATH_W) 'utils/libfat/libfat_public_api.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/libfat_public_api.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libfat_public_api.Tpo $(DEPDIR)/libfat_public_api.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/libfat_public_api.cpp' object='libfat_public_api.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libfat_public_api.obj `if test -f 'utils/libfat/libfat_public_api.cpp'; then $(CYGPATH_W) 'utils/libfat/libfat_public_api.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/libfat_public_api.cpp'; fi` lock.o: utils/libfat/lock.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lock.o -MD -MP -MF $(DEPDIR)/lock.Tpo -c -o lock.o `test -f 'utils/libfat/lock.cpp' || echo '$(srcdir)/'`utils/libfat/lock.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/lock.Tpo $(DEPDIR)/lock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/lock.cpp' object='lock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lock.o `test -f 'utils/libfat/lock.cpp' || echo '$(srcdir)/'`utils/libfat/lock.cpp lock.obj: utils/libfat/lock.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lock.obj -MD -MP -MF $(DEPDIR)/lock.Tpo -c -o lock.obj `if test -f 'utils/libfat/lock.cpp'; then $(CYGPATH_W) 'utils/libfat/lock.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/lock.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/lock.Tpo $(DEPDIR)/lock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/lock.cpp' object='lock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lock.obj `if test -f 'utils/libfat/lock.cpp'; then $(CYGPATH_W) 'utils/libfat/lock.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/lock.cpp'; fi` partition.o: utils/libfat/partition.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT partition.o -MD -MP -MF $(DEPDIR)/partition.Tpo -c -o partition.o `test -f 'utils/libfat/partition.cpp' || echo '$(srcdir)/'`utils/libfat/partition.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/partition.Tpo $(DEPDIR)/partition.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/partition.cpp' object='partition.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o partition.o `test -f 'utils/libfat/partition.cpp' || echo '$(srcdir)/'`utils/libfat/partition.cpp partition.obj: utils/libfat/partition.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT partition.obj -MD -MP -MF $(DEPDIR)/partition.Tpo -c -o partition.obj `if test -f 'utils/libfat/partition.cpp'; then $(CYGPATH_W) 'utils/libfat/partition.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/partition.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/partition.Tpo $(DEPDIR)/partition.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/libfat/partition.cpp' object='partition.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o partition.obj `if test -f 'utils/libfat/partition.cpp'; then $(CYGPATH_W) 'utils/libfat/partition.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/partition.cpp'; fi` tinystr.o: utils/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinystr.o -MD -MP -MF $(DEPDIR)/tinystr.Tpo -c -o tinystr.o `test -f 'utils/tinyxml/tinystr.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tinystr.Tpo $(DEPDIR)/tinystr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/tinyxml/tinystr.cpp' object='tinystr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinystr.o `test -f 'utils/tinyxml/tinystr.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinystr.cpp tinystr.obj: utils/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinystr.obj -MD -MP -MF $(DEPDIR)/tinystr.Tpo -c -o tinystr.obj `if test -f 'utils/tinyxml/tinystr.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinystr.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tinystr.Tpo $(DEPDIR)/tinystr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/tinyxml/tinystr.cpp' object='tinystr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinystr.obj `if test -f 'utils/tinyxml/tinystr.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinystr.cpp'; fi` tinyxml.o: utils/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxml.o -MD -MP -MF $(DEPDIR)/tinyxml.Tpo -c -o tinyxml.o `test -f 'utils/tinyxml/tinyxml.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tinyxml.Tpo $(DEPDIR)/tinyxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/tinyxml/tinyxml.cpp' object='tinyxml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxml.o `test -f 'utils/tinyxml/tinyxml.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxml.cpp tinyxml.obj: utils/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxml.obj -MD -MP -MF $(DEPDIR)/tinyxml.Tpo -c -o tinyxml.obj `if test -f 'utils/tinyxml/tinyxml.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxml.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tinyxml.Tpo $(DEPDIR)/tinyxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/tinyxml/tinyxml.cpp' object='tinyxml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxml.obj `if test -f 'utils/tinyxml/tinyxml.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxml.cpp'; fi` tinyxmlerror.o: utils/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlerror.o -MD -MP -MF $(DEPDIR)/tinyxmlerror.Tpo -c -o tinyxmlerror.o `test -f 'utils/tinyxml/tinyxmlerror.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tinyxmlerror.Tpo $(DEPDIR)/tinyxmlerror.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/tinyxml/tinyxmlerror.cpp' object='tinyxmlerror.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlerror.o `test -f 'utils/tinyxml/tinyxmlerror.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxmlerror.cpp tinyxmlerror.obj: utils/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlerror.obj -MD -MP -MF $(DEPDIR)/tinyxmlerror.Tpo -c -o tinyxmlerror.obj `if test -f 'utils/tinyxml/tinyxmlerror.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxmlerror.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tinyxmlerror.Tpo $(DEPDIR)/tinyxmlerror.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/tinyxml/tinyxmlerror.cpp' object='tinyxmlerror.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlerror.obj `if test -f 'utils/tinyxml/tinyxmlerror.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxmlerror.cpp'; fi` tinyxmlparser.o: utils/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlparser.o -MD -MP -MF $(DEPDIR)/tinyxmlparser.Tpo -c -o tinyxmlparser.o `test -f 'utils/tinyxml/tinyxmlparser.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tinyxmlparser.Tpo $(DEPDIR)/tinyxmlparser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/tinyxml/tinyxmlparser.cpp' object='tinyxmlparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlparser.o `test -f 'utils/tinyxml/tinyxmlparser.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxmlparser.cpp tinyxmlparser.obj: utils/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlparser.obj -MD -MP -MF $(DEPDIR)/tinyxmlparser.Tpo -c -o tinyxmlparser.obj `if test -f 'utils/tinyxml/tinyxmlparser.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxmlparser.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/tinyxmlparser.Tpo $(DEPDIR)/tinyxmlparser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/tinyxml/tinyxmlparser.cpp' object='tinyxmlparser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlparser.obj `if test -f 'utils/tinyxml/tinyxmlparser.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxmlparser.cpp'; fi` slot2_mpcf.o: addons/slot2_mpcf.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_mpcf.o -MD -MP -MF $(DEPDIR)/slot2_mpcf.Tpo -c -o slot2_mpcf.o `test -f 'addons/slot2_mpcf.cpp' || echo '$(srcdir)/'`addons/slot2_mpcf.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_mpcf.Tpo $(DEPDIR)/slot2_mpcf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_mpcf.cpp' object='slot2_mpcf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_mpcf.o `test -f 'addons/slot2_mpcf.cpp' || echo '$(srcdir)/'`addons/slot2_mpcf.cpp slot2_mpcf.obj: addons/slot2_mpcf.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_mpcf.obj -MD -MP -MF $(DEPDIR)/slot2_mpcf.Tpo -c -o slot2_mpcf.obj `if test -f 'addons/slot2_mpcf.cpp'; then $(CYGPATH_W) 'addons/slot2_mpcf.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_mpcf.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_mpcf.Tpo $(DEPDIR)/slot2_mpcf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_mpcf.cpp' object='slot2_mpcf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_mpcf.obj `if test -f 'addons/slot2_mpcf.cpp'; then $(CYGPATH_W) 'addons/slot2_mpcf.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_mpcf.cpp'; fi` slot2_paddle.o: addons/slot2_paddle.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_paddle.o -MD -MP -MF $(DEPDIR)/slot2_paddle.Tpo -c -o slot2_paddle.o `test -f 'addons/slot2_paddle.cpp' || echo '$(srcdir)/'`addons/slot2_paddle.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_paddle.Tpo $(DEPDIR)/slot2_paddle.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_paddle.cpp' object='slot2_paddle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_paddle.o `test -f 'addons/slot2_paddle.cpp' || echo '$(srcdir)/'`addons/slot2_paddle.cpp slot2_paddle.obj: addons/slot2_paddle.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_paddle.obj -MD -MP -MF $(DEPDIR)/slot2_paddle.Tpo -c -o slot2_paddle.obj `if test -f 'addons/slot2_paddle.cpp'; then $(CYGPATH_W) 'addons/slot2_paddle.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_paddle.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_paddle.Tpo $(DEPDIR)/slot2_paddle.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_paddle.cpp' object='slot2_paddle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_paddle.obj `if test -f 'addons/slot2_paddle.cpp'; then $(CYGPATH_W) 'addons/slot2_paddle.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_paddle.cpp'; fi` slot2_gbagame.o: addons/slot2_gbagame.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_gbagame.o -MD -MP -MF $(DEPDIR)/slot2_gbagame.Tpo -c -o slot2_gbagame.o `test -f 'addons/slot2_gbagame.cpp' || echo '$(srcdir)/'`addons/slot2_gbagame.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_gbagame.Tpo $(DEPDIR)/slot2_gbagame.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_gbagame.cpp' object='slot2_gbagame.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_gbagame.o `test -f 'addons/slot2_gbagame.cpp' || echo '$(srcdir)/'`addons/slot2_gbagame.cpp slot2_gbagame.obj: addons/slot2_gbagame.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_gbagame.obj -MD -MP -MF $(DEPDIR)/slot2_gbagame.Tpo -c -o slot2_gbagame.obj `if test -f 'addons/slot2_gbagame.cpp'; then $(CYGPATH_W) 'addons/slot2_gbagame.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_gbagame.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_gbagame.Tpo $(DEPDIR)/slot2_gbagame.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_gbagame.cpp' object='slot2_gbagame.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_gbagame.obj `if test -f 'addons/slot2_gbagame.cpp'; then $(CYGPATH_W) 'addons/slot2_gbagame.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_gbagame.cpp'; fi` slot2_none.o: addons/slot2_none.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_none.o -MD -MP -MF $(DEPDIR)/slot2_none.Tpo -c -o slot2_none.o `test -f 'addons/slot2_none.cpp' || echo '$(srcdir)/'`addons/slot2_none.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_none.Tpo $(DEPDIR)/slot2_none.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_none.cpp' object='slot2_none.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_none.o `test -f 'addons/slot2_none.cpp' || echo '$(srcdir)/'`addons/slot2_none.cpp slot2_none.obj: addons/slot2_none.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_none.obj -MD -MP -MF $(DEPDIR)/slot2_none.Tpo -c -o slot2_none.obj `if test -f 'addons/slot2_none.cpp'; then $(CYGPATH_W) 'addons/slot2_none.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_none.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_none.Tpo $(DEPDIR)/slot2_none.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_none.cpp' object='slot2_none.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_none.obj `if test -f 'addons/slot2_none.cpp'; then $(CYGPATH_W) 'addons/slot2_none.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_none.cpp'; fi` slot2_rumblepak.o: addons/slot2_rumblepak.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_rumblepak.o -MD -MP -MF $(DEPDIR)/slot2_rumblepak.Tpo -c -o slot2_rumblepak.o `test -f 'addons/slot2_rumblepak.cpp' || echo '$(srcdir)/'`addons/slot2_rumblepak.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_rumblepak.Tpo $(DEPDIR)/slot2_rumblepak.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_rumblepak.cpp' object='slot2_rumblepak.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_rumblepak.o `test -f 'addons/slot2_rumblepak.cpp' || echo '$(srcdir)/'`addons/slot2_rumblepak.cpp slot2_rumblepak.obj: addons/slot2_rumblepak.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_rumblepak.obj -MD -MP -MF $(DEPDIR)/slot2_rumblepak.Tpo -c -o slot2_rumblepak.obj `if test -f 'addons/slot2_rumblepak.cpp'; then $(CYGPATH_W) 'addons/slot2_rumblepak.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_rumblepak.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_rumblepak.Tpo $(DEPDIR)/slot2_rumblepak.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_rumblepak.cpp' object='slot2_rumblepak.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_rumblepak.obj `if test -f 'addons/slot2_rumblepak.cpp'; then $(CYGPATH_W) 'addons/slot2_rumblepak.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_rumblepak.cpp'; fi` slot2_guitarGrip.o: addons/slot2_guitarGrip.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_guitarGrip.o -MD -MP -MF $(DEPDIR)/slot2_guitarGrip.Tpo -c -o slot2_guitarGrip.o `test -f 'addons/slot2_guitarGrip.cpp' || echo '$(srcdir)/'`addons/slot2_guitarGrip.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_guitarGrip.Tpo $(DEPDIR)/slot2_guitarGrip.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_guitarGrip.cpp' object='slot2_guitarGrip.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_guitarGrip.o `test -f 'addons/slot2_guitarGrip.cpp' || echo '$(srcdir)/'`addons/slot2_guitarGrip.cpp slot2_guitarGrip.obj: addons/slot2_guitarGrip.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_guitarGrip.obj -MD -MP -MF $(DEPDIR)/slot2_guitarGrip.Tpo -c -o slot2_guitarGrip.obj `if test -f 'addons/slot2_guitarGrip.cpp'; then $(CYGPATH_W) 'addons/slot2_guitarGrip.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_guitarGrip.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_guitarGrip.Tpo $(DEPDIR)/slot2_guitarGrip.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_guitarGrip.cpp' object='slot2_guitarGrip.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_guitarGrip.obj `if test -f 'addons/slot2_guitarGrip.cpp'; then $(CYGPATH_W) 'addons/slot2_guitarGrip.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_guitarGrip.cpp'; fi` slot2_expMemory.o: addons/slot2_expMemory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_expMemory.o -MD -MP -MF $(DEPDIR)/slot2_expMemory.Tpo -c -o slot2_expMemory.o `test -f 'addons/slot2_expMemory.cpp' || echo '$(srcdir)/'`addons/slot2_expMemory.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_expMemory.Tpo $(DEPDIR)/slot2_expMemory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_expMemory.cpp' object='slot2_expMemory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_expMemory.o `test -f 'addons/slot2_expMemory.cpp' || echo '$(srcdir)/'`addons/slot2_expMemory.cpp slot2_expMemory.obj: addons/slot2_expMemory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_expMemory.obj -MD -MP -MF $(DEPDIR)/slot2_expMemory.Tpo -c -o slot2_expMemory.obj `if test -f 'addons/slot2_expMemory.cpp'; then $(CYGPATH_W) 'addons/slot2_expMemory.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_expMemory.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_expMemory.Tpo $(DEPDIR)/slot2_expMemory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_expMemory.cpp' object='slot2_expMemory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_expMemory.obj `if test -f 'addons/slot2_expMemory.cpp'; then $(CYGPATH_W) 'addons/slot2_expMemory.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_expMemory.cpp'; fi` slot2_piano.o: addons/slot2_piano.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_piano.o -MD -MP -MF $(DEPDIR)/slot2_piano.Tpo -c -o slot2_piano.o `test -f 'addons/slot2_piano.cpp' || echo '$(srcdir)/'`addons/slot2_piano.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_piano.Tpo $(DEPDIR)/slot2_piano.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_piano.cpp' object='slot2_piano.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_piano.o `test -f 'addons/slot2_piano.cpp' || echo '$(srcdir)/'`addons/slot2_piano.cpp slot2_piano.obj: addons/slot2_piano.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_piano.obj -MD -MP -MF $(DEPDIR)/slot2_piano.Tpo -c -o slot2_piano.obj `if test -f 'addons/slot2_piano.cpp'; then $(CYGPATH_W) 'addons/slot2_piano.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_piano.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot2_piano.Tpo $(DEPDIR)/slot2_piano.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot2_piano.cpp' object='slot2_piano.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_piano.obj `if test -f 'addons/slot2_piano.cpp'; then $(CYGPATH_W) 'addons/slot2_piano.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_piano.cpp'; fi` slot1_none.o: addons/slot1_none.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_none.o -MD -MP -MF $(DEPDIR)/slot1_none.Tpo -c -o slot1_none.o `test -f 'addons/slot1_none.cpp' || echo '$(srcdir)/'`addons/slot1_none.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot1_none.Tpo $(DEPDIR)/slot1_none.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot1_none.cpp' object='slot1_none.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_none.o `test -f 'addons/slot1_none.cpp' || echo '$(srcdir)/'`addons/slot1_none.cpp slot1_none.obj: addons/slot1_none.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_none.obj -MD -MP -MF $(DEPDIR)/slot1_none.Tpo -c -o slot1_none.obj `if test -f 'addons/slot1_none.cpp'; then $(CYGPATH_W) 'addons/slot1_none.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_none.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot1_none.Tpo $(DEPDIR)/slot1_none.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot1_none.cpp' object='slot1_none.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_none.obj `if test -f 'addons/slot1_none.cpp'; then $(CYGPATH_W) 'addons/slot1_none.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_none.cpp'; fi` slot1_r4.o: addons/slot1_r4.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_r4.o -MD -MP -MF $(DEPDIR)/slot1_r4.Tpo -c -o slot1_r4.o `test -f 'addons/slot1_r4.cpp' || echo '$(srcdir)/'`addons/slot1_r4.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot1_r4.Tpo $(DEPDIR)/slot1_r4.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot1_r4.cpp' object='slot1_r4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_r4.o `test -f 'addons/slot1_r4.cpp' || echo '$(srcdir)/'`addons/slot1_r4.cpp slot1_r4.obj: addons/slot1_r4.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_r4.obj -MD -MP -MF $(DEPDIR)/slot1_r4.Tpo -c -o slot1_r4.obj `if test -f 'addons/slot1_r4.cpp'; then $(CYGPATH_W) 'addons/slot1_r4.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_r4.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot1_r4.Tpo $(DEPDIR)/slot1_r4.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot1_r4.cpp' object='slot1_r4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_r4.obj `if test -f 'addons/slot1_r4.cpp'; then $(CYGPATH_W) 'addons/slot1_r4.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_r4.cpp'; fi` slot1_retail.o: addons/slot1_retail.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_retail.o -MD -MP -MF $(DEPDIR)/slot1_retail.Tpo -c -o slot1_retail.o `test -f 'addons/slot1_retail.cpp' || echo '$(srcdir)/'`addons/slot1_retail.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot1_retail.Tpo $(DEPDIR)/slot1_retail.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot1_retail.cpp' object='slot1_retail.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_retail.o `test -f 'addons/slot1_retail.cpp' || echo '$(srcdir)/'`addons/slot1_retail.cpp slot1_retail.obj: addons/slot1_retail.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_retail.obj -MD -MP -MF $(DEPDIR)/slot1_retail.Tpo -c -o slot1_retail.obj `if test -f 'addons/slot1_retail.cpp'; then $(CYGPATH_W) 'addons/slot1_retail.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_retail.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot1_retail.Tpo $(DEPDIR)/slot1_retail.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot1_retail.cpp' object='slot1_retail.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_retail.obj `if test -f 'addons/slot1_retail.cpp'; then $(CYGPATH_W) 'addons/slot1_retail.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_retail.cpp'; fi` slot1_retail_nand.o: addons/slot1_retail_nand.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_retail_nand.o -MD -MP -MF $(DEPDIR)/slot1_retail_nand.Tpo -c -o slot1_retail_nand.o `test -f 'addons/slot1_retail_nand.cpp' || echo '$(srcdir)/'`addons/slot1_retail_nand.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot1_retail_nand.Tpo $(DEPDIR)/slot1_retail_nand.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot1_retail_nand.cpp' object='slot1_retail_nand.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_retail_nand.o `test -f 'addons/slot1_retail_nand.cpp' || echo '$(srcdir)/'`addons/slot1_retail_nand.cpp slot1_retail_nand.obj: addons/slot1_retail_nand.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_retail_nand.obj -MD -MP -MF $(DEPDIR)/slot1_retail_nand.Tpo -c -o slot1_retail_nand.obj `if test -f 'addons/slot1_retail_nand.cpp'; then $(CYGPATH_W) 'addons/slot1_retail_nand.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_retail_nand.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/slot1_retail_nand.Tpo $(DEPDIR)/slot1_retail_nand.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addons/slot1_retail_nand.cpp' object='slot1_retail_nand.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_retail_nand.obj `if test -f 'addons/slot1_retail_nand.cpp'; then $(CYGPATH_W) 'addons/slot1_retail_nand.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_retail_nand.cpp'; fi` metaspu.o: metaspu/metaspu.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT metaspu.o -MD -MP -MF $(DEPDIR)/metaspu.Tpo -c -o metaspu.o `test -f 'metaspu/metaspu.cpp' || echo '$(srcdir)/'`metaspu/metaspu.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/metaspu.Tpo $(DEPDIR)/metaspu.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='metaspu/metaspu.cpp' object='metaspu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o metaspu.o `test -f 'metaspu/metaspu.cpp' || echo '$(srcdir)/'`metaspu/metaspu.cpp metaspu.obj: metaspu/metaspu.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT metaspu.obj -MD -MP -MF $(DEPDIR)/metaspu.Tpo -c -o metaspu.obj `if test -f 'metaspu/metaspu.cpp'; then $(CYGPATH_W) 'metaspu/metaspu.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/metaspu.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/metaspu.Tpo $(DEPDIR)/metaspu.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='metaspu/metaspu.cpp' object='metaspu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o metaspu.obj `if test -f 'metaspu/metaspu.cpp'; then $(CYGPATH_W) 'metaspu/metaspu.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/metaspu.cpp'; fi` 2xsai.o: filter/2xsai.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT 2xsai.o -MD -MP -MF $(DEPDIR)/2xsai.Tpo -c -o 2xsai.o `test -f 'filter/2xsai.cpp' || echo '$(srcdir)/'`filter/2xsai.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/2xsai.Tpo $(DEPDIR)/2xsai.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/2xsai.cpp' object='2xsai.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o 2xsai.o `test -f 'filter/2xsai.cpp' || echo '$(srcdir)/'`filter/2xsai.cpp 2xsai.obj: filter/2xsai.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT 2xsai.obj -MD -MP -MF $(DEPDIR)/2xsai.Tpo -c -o 2xsai.obj `if test -f 'filter/2xsai.cpp'; then $(CYGPATH_W) 'filter/2xsai.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/2xsai.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/2xsai.Tpo $(DEPDIR)/2xsai.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/2xsai.cpp' object='2xsai.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o 2xsai.obj `if test -f 'filter/2xsai.cpp'; then $(CYGPATH_W) 'filter/2xsai.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/2xsai.cpp'; fi` bilinear.o: filter/bilinear.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bilinear.o -MD -MP -MF $(DEPDIR)/bilinear.Tpo -c -o bilinear.o `test -f 'filter/bilinear.cpp' || echo '$(srcdir)/'`filter/bilinear.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/bilinear.Tpo $(DEPDIR)/bilinear.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/bilinear.cpp' object='bilinear.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bilinear.o `test -f 'filter/bilinear.cpp' || echo '$(srcdir)/'`filter/bilinear.cpp bilinear.obj: filter/bilinear.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bilinear.obj -MD -MP -MF $(DEPDIR)/bilinear.Tpo -c -o bilinear.obj `if test -f 'filter/bilinear.cpp'; then $(CYGPATH_W) 'filter/bilinear.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/bilinear.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/bilinear.Tpo $(DEPDIR)/bilinear.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/bilinear.cpp' object='bilinear.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bilinear.obj `if test -f 'filter/bilinear.cpp'; then $(CYGPATH_W) 'filter/bilinear.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/bilinear.cpp'; fi` epx.o: filter/epx.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT epx.o -MD -MP -MF $(DEPDIR)/epx.Tpo -c -o epx.o `test -f 'filter/epx.cpp' || echo '$(srcdir)/'`filter/epx.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/epx.Tpo $(DEPDIR)/epx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/epx.cpp' object='epx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o epx.o `test -f 'filter/epx.cpp' || echo '$(srcdir)/'`filter/epx.cpp epx.obj: filter/epx.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT epx.obj -MD -MP -MF $(DEPDIR)/epx.Tpo -c -o epx.obj `if test -f 'filter/epx.cpp'; then $(CYGPATH_W) 'filter/epx.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/epx.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/epx.Tpo $(DEPDIR)/epx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/epx.cpp' object='epx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o epx.obj `if test -f 'filter/epx.cpp'; then $(CYGPATH_W) 'filter/epx.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/epx.cpp'; fi` hq2x.o: filter/hq2x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hq2x.o -MD -MP -MF $(DEPDIR)/hq2x.Tpo -c -o hq2x.o `test -f 'filter/hq2x.cpp' || echo '$(srcdir)/'`filter/hq2x.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hq2x.Tpo $(DEPDIR)/hq2x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/hq2x.cpp' object='hq2x.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hq2x.o `test -f 'filter/hq2x.cpp' || echo '$(srcdir)/'`filter/hq2x.cpp hq2x.obj: filter/hq2x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hq2x.obj -MD -MP -MF $(DEPDIR)/hq2x.Tpo -c -o hq2x.obj `if test -f 'filter/hq2x.cpp'; then $(CYGPATH_W) 'filter/hq2x.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/hq2x.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hq2x.Tpo $(DEPDIR)/hq2x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/hq2x.cpp' object='hq2x.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hq2x.obj `if test -f 'filter/hq2x.cpp'; then $(CYGPATH_W) 'filter/hq2x.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/hq2x.cpp'; fi` hq4x.o: filter/hq4x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hq4x.o -MD -MP -MF $(DEPDIR)/hq4x.Tpo -c -o hq4x.o `test -f 'filter/hq4x.cpp' || echo '$(srcdir)/'`filter/hq4x.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hq4x.Tpo $(DEPDIR)/hq4x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/hq4x.cpp' object='hq4x.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hq4x.o `test -f 'filter/hq4x.cpp' || echo '$(srcdir)/'`filter/hq4x.cpp hq4x.obj: filter/hq4x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hq4x.obj -MD -MP -MF $(DEPDIR)/hq4x.Tpo -c -o hq4x.obj `if test -f 'filter/hq4x.cpp'; then $(CYGPATH_W) 'filter/hq4x.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/hq4x.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hq4x.Tpo $(DEPDIR)/hq4x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/hq4x.cpp' object='hq4x.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hq4x.obj `if test -f 'filter/hq4x.cpp'; then $(CYGPATH_W) 'filter/hq4x.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/hq4x.cpp'; fi` lq2x.o: filter/lq2x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lq2x.o -MD -MP -MF $(DEPDIR)/lq2x.Tpo -c -o lq2x.o `test -f 'filter/lq2x.cpp' || echo '$(srcdir)/'`filter/lq2x.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/lq2x.Tpo $(DEPDIR)/lq2x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/lq2x.cpp' object='lq2x.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lq2x.o `test -f 'filter/lq2x.cpp' || echo '$(srcdir)/'`filter/lq2x.cpp lq2x.obj: filter/lq2x.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lq2x.obj -MD -MP -MF $(DEPDIR)/lq2x.Tpo -c -o lq2x.obj `if test -f 'filter/lq2x.cpp'; then $(CYGPATH_W) 'filter/lq2x.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/lq2x.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/lq2x.Tpo $(DEPDIR)/lq2x.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/lq2x.cpp' object='lq2x.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lq2x.obj `if test -f 'filter/lq2x.cpp'; then $(CYGPATH_W) 'filter/lq2x.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/lq2x.cpp'; fi` scanline.o: filter/scanline.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scanline.o -MD -MP -MF $(DEPDIR)/scanline.Tpo -c -o scanline.o `test -f 'filter/scanline.cpp' || echo '$(srcdir)/'`filter/scanline.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/scanline.Tpo $(DEPDIR)/scanline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/scanline.cpp' object='scanline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scanline.o `test -f 'filter/scanline.cpp' || echo '$(srcdir)/'`filter/scanline.cpp scanline.obj: filter/scanline.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scanline.obj -MD -MP -MF $(DEPDIR)/scanline.Tpo -c -o scanline.obj `if test -f 'filter/scanline.cpp'; then $(CYGPATH_W) 'filter/scanline.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/scanline.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/scanline.Tpo $(DEPDIR)/scanline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/scanline.cpp' object='scanline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scanline.obj `if test -f 'filter/scanline.cpp'; then $(CYGPATH_W) 'filter/scanline.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/scanline.cpp'; fi` videofilter.o: filter/videofilter.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT videofilter.o -MD -MP -MF $(DEPDIR)/videofilter.Tpo -c -o videofilter.o `test -f 'filter/videofilter.cpp' || echo '$(srcdir)/'`filter/videofilter.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/videofilter.Tpo $(DEPDIR)/videofilter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/videofilter.cpp' object='videofilter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o videofilter.o `test -f 'filter/videofilter.cpp' || echo '$(srcdir)/'`filter/videofilter.cpp videofilter.obj: filter/videofilter.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT videofilter.obj -MD -MP -MF $(DEPDIR)/videofilter.Tpo -c -o videofilter.obj `if test -f 'filter/videofilter.cpp'; then $(CYGPATH_W) 'filter/videofilter.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/videofilter.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/videofilter.Tpo $(DEPDIR)/videofilter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='filter/videofilter.cpp' object='videofilter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o videofilter.obj `if test -f 'filter/videofilter.cpp'; then $(CYGPATH_W) 'filter/videofilter.cpp'; else $(CYGPATH_W) '$(srcdir)/filter/videofilter.cpp'; fi` assembler.o: utils/AsmJit/core/assembler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT assembler.o -MD -MP -MF $(DEPDIR)/assembler.Tpo -c -o assembler.o `test -f 'utils/AsmJit/core/assembler.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/assembler.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/assembler.Tpo $(DEPDIR)/assembler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/assembler.cpp' object='assembler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o assembler.o `test -f 'utils/AsmJit/core/assembler.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/assembler.cpp assembler.obj: utils/AsmJit/core/assembler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT assembler.obj -MD -MP -MF $(DEPDIR)/assembler.Tpo -c -o assembler.obj `if test -f 'utils/AsmJit/core/assembler.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/assembler.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/assembler.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/assembler.Tpo $(DEPDIR)/assembler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/assembler.cpp' object='assembler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o assembler.obj `if test -f 'utils/AsmJit/core/assembler.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/assembler.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/assembler.cpp'; fi` assert.o: utils/AsmJit/core/assert.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT assert.o -MD -MP -MF $(DEPDIR)/assert.Tpo -c -o assert.o `test -f 'utils/AsmJit/core/assert.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/assert.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/assert.Tpo $(DEPDIR)/assert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/assert.cpp' object='assert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o assert.o `test -f 'utils/AsmJit/core/assert.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/assert.cpp assert.obj: utils/AsmJit/core/assert.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT assert.obj -MD -MP -MF $(DEPDIR)/assert.Tpo -c -o assert.obj `if test -f 'utils/AsmJit/core/assert.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/assert.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/assert.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/assert.Tpo $(DEPDIR)/assert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/assert.cpp' object='assert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o assert.obj `if test -f 'utils/AsmJit/core/assert.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/assert.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/assert.cpp'; fi` buffer.o: utils/AsmJit/core/buffer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT buffer.o -MD -MP -MF $(DEPDIR)/buffer.Tpo -c -o buffer.o `test -f 'utils/AsmJit/core/buffer.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/buffer.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/buffer.Tpo $(DEPDIR)/buffer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/buffer.cpp' object='buffer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o buffer.o `test -f 'utils/AsmJit/core/buffer.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/buffer.cpp buffer.obj: utils/AsmJit/core/buffer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT buffer.obj -MD -MP -MF $(DEPDIR)/buffer.Tpo -c -o buffer.obj `if test -f 'utils/AsmJit/core/buffer.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/buffer.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/buffer.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/buffer.Tpo $(DEPDIR)/buffer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/buffer.cpp' object='buffer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o buffer.obj `if test -f 'utils/AsmJit/core/buffer.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/buffer.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/buffer.cpp'; fi` compiler.o: utils/AsmJit/core/compiler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT compiler.o -MD -MP -MF $(DEPDIR)/compiler.Tpo -c -o compiler.o `test -f 'utils/AsmJit/core/compiler.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/compiler.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/compiler.Tpo $(DEPDIR)/compiler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/compiler.cpp' object='compiler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o compiler.o `test -f 'utils/AsmJit/core/compiler.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/compiler.cpp compiler.obj: utils/AsmJit/core/compiler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT compiler.obj -MD -MP -MF $(DEPDIR)/compiler.Tpo -c -o compiler.obj `if test -f 'utils/AsmJit/core/compiler.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/compiler.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/compiler.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/compiler.Tpo $(DEPDIR)/compiler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/compiler.cpp' object='compiler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o compiler.obj `if test -f 'utils/AsmJit/core/compiler.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/compiler.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/compiler.cpp'; fi` compilercontext.o: utils/AsmJit/core/compilercontext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT compilercontext.o -MD -MP -MF $(DEPDIR)/compilercontext.Tpo -c -o compilercontext.o `test -f 'utils/AsmJit/core/compilercontext.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/compilercontext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/compilercontext.Tpo $(DEPDIR)/compilercontext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/compilercontext.cpp' object='compilercontext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o compilercontext.o `test -f 'utils/AsmJit/core/compilercontext.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/compilercontext.cpp compilercontext.obj: utils/AsmJit/core/compilercontext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT compilercontext.obj -MD -MP -MF $(DEPDIR)/compilercontext.Tpo -c -o compilercontext.obj `if test -f 'utils/AsmJit/core/compilercontext.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/compilercontext.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/compilercontext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/compilercontext.Tpo $(DEPDIR)/compilercontext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/compilercontext.cpp' object='compilercontext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o compilercontext.obj `if test -f 'utils/AsmJit/core/compilercontext.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/compilercontext.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/compilercontext.cpp'; fi` compilerfunc.o: utils/AsmJit/core/compilerfunc.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT compilerfunc.o -MD -MP -MF $(DEPDIR)/compilerfunc.Tpo -c -o compilerfunc.o `test -f 'utils/AsmJit/core/compilerfunc.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/compilerfunc.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/compilerfunc.Tpo $(DEPDIR)/compilerfunc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/compilerfunc.cpp' object='compilerfunc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o compilerfunc.o `test -f 'utils/AsmJit/core/compilerfunc.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/compilerfunc.cpp compilerfunc.obj: utils/AsmJit/core/compilerfunc.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT compilerfunc.obj -MD -MP -MF $(DEPDIR)/compilerfunc.Tpo -c -o compilerfunc.obj `if test -f 'utils/AsmJit/core/compilerfunc.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/compilerfunc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/compilerfunc.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/compilerfunc.Tpo $(DEPDIR)/compilerfunc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/compilerfunc.cpp' object='compilerfunc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o compilerfunc.obj `if test -f 'utils/AsmJit/core/compilerfunc.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/compilerfunc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/compilerfunc.cpp'; fi` compileritem.o: utils/AsmJit/core/compileritem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT compileritem.o -MD -MP -MF $(DEPDIR)/compileritem.Tpo -c -o compileritem.o `test -f 'utils/AsmJit/core/compileritem.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/compileritem.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/compileritem.Tpo $(DEPDIR)/compileritem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/compileritem.cpp' object='compileritem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o compileritem.o `test -f 'utils/AsmJit/core/compileritem.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/compileritem.cpp compileritem.obj: utils/AsmJit/core/compileritem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT compileritem.obj -MD -MP -MF $(DEPDIR)/compileritem.Tpo -c -o compileritem.obj `if test -f 'utils/AsmJit/core/compileritem.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/compileritem.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/compileritem.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/compileritem.Tpo $(DEPDIR)/compileritem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/compileritem.cpp' object='compileritem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o compileritem.obj `if test -f 'utils/AsmJit/core/compileritem.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/compileritem.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/compileritem.cpp'; fi` context.o: utils/AsmJit/core/context.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT context.o -MD -MP -MF $(DEPDIR)/context.Tpo -c -o context.o `test -f 'utils/AsmJit/core/context.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/context.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/context.Tpo $(DEPDIR)/context.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/context.cpp' object='context.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o context.o `test -f 'utils/AsmJit/core/context.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/context.cpp context.obj: utils/AsmJit/core/context.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT context.obj -MD -MP -MF $(DEPDIR)/context.Tpo -c -o context.obj `if test -f 'utils/AsmJit/core/context.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/context.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/context.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/context.Tpo $(DEPDIR)/context.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/context.cpp' object='context.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o context.obj `if test -f 'utils/AsmJit/core/context.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/context.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/context.cpp'; fi` cpuinfo.o: utils/AsmJit/core/cpuinfo.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cpuinfo.o -MD -MP -MF $(DEPDIR)/cpuinfo.Tpo -c -o cpuinfo.o `test -f 'utils/AsmJit/core/cpuinfo.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/cpuinfo.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cpuinfo.Tpo $(DEPDIR)/cpuinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/cpuinfo.cpp' object='cpuinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cpuinfo.o `test -f 'utils/AsmJit/core/cpuinfo.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/cpuinfo.cpp cpuinfo.obj: utils/AsmJit/core/cpuinfo.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cpuinfo.obj -MD -MP -MF $(DEPDIR)/cpuinfo.Tpo -c -o cpuinfo.obj `if test -f 'utils/AsmJit/core/cpuinfo.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/cpuinfo.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/cpuinfo.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cpuinfo.Tpo $(DEPDIR)/cpuinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/cpuinfo.cpp' object='cpuinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cpuinfo.obj `if test -f 'utils/AsmJit/core/cpuinfo.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/cpuinfo.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/cpuinfo.cpp'; fi` defs.o: utils/AsmJit/core/defs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT defs.o -MD -MP -MF $(DEPDIR)/defs.Tpo -c -o defs.o `test -f 'utils/AsmJit/core/defs.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/defs.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/defs.Tpo $(DEPDIR)/defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/defs.cpp' object='defs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o defs.o `test -f 'utils/AsmJit/core/defs.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/defs.cpp defs.obj: utils/AsmJit/core/defs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT defs.obj -MD -MP -MF $(DEPDIR)/defs.Tpo -c -o defs.obj `if test -f 'utils/AsmJit/core/defs.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/defs.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/defs.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/defs.Tpo $(DEPDIR)/defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/defs.cpp' object='defs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o defs.obj `if test -f 'utils/AsmJit/core/defs.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/defs.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/defs.cpp'; fi` func.o: utils/AsmJit/core/func.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT func.o -MD -MP -MF $(DEPDIR)/func.Tpo -c -o func.o `test -f 'utils/AsmJit/core/func.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/func.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/func.Tpo $(DEPDIR)/func.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/func.cpp' object='func.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o func.o `test -f 'utils/AsmJit/core/func.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/func.cpp func.obj: utils/AsmJit/core/func.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT func.obj -MD -MP -MF $(DEPDIR)/func.Tpo -c -o func.obj `if test -f 'utils/AsmJit/core/func.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/func.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/func.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/func.Tpo $(DEPDIR)/func.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/func.cpp' object='func.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o func.obj `if test -f 'utils/AsmJit/core/func.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/func.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/func.cpp'; fi` logger.o: utils/AsmJit/core/logger.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT logger.o -MD -MP -MF $(DEPDIR)/logger.Tpo -c -o logger.o `test -f 'utils/AsmJit/core/logger.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/logger.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/logger.Tpo $(DEPDIR)/logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/logger.cpp' object='logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o logger.o `test -f 'utils/AsmJit/core/logger.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/logger.cpp logger.obj: utils/AsmJit/core/logger.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT logger.obj -MD -MP -MF $(DEPDIR)/logger.Tpo -c -o logger.obj `if test -f 'utils/AsmJit/core/logger.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/logger.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/logger.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/logger.Tpo $(DEPDIR)/logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/logger.cpp' object='logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o logger.obj `if test -f 'utils/AsmJit/core/logger.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/logger.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/logger.cpp'; fi` memorymanager.o: utils/AsmJit/core/memorymanager.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT memorymanager.o -MD -MP -MF $(DEPDIR)/memorymanager.Tpo -c -o memorymanager.o `test -f 'utils/AsmJit/core/memorymanager.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/memorymanager.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/memorymanager.Tpo $(DEPDIR)/memorymanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/memorymanager.cpp' object='memorymanager.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o memorymanager.o `test -f 'utils/AsmJit/core/memorymanager.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/memorymanager.cpp memorymanager.obj: utils/AsmJit/core/memorymanager.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT memorymanager.obj -MD -MP -MF $(DEPDIR)/memorymanager.Tpo -c -o memorymanager.obj `if test -f 'utils/AsmJit/core/memorymanager.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/memorymanager.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/memorymanager.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/memorymanager.Tpo $(DEPDIR)/memorymanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/memorymanager.cpp' object='memorymanager.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o memorymanager.obj `if test -f 'utils/AsmJit/core/memorymanager.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/memorymanager.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/memorymanager.cpp'; fi` memorymarker.o: utils/AsmJit/core/memorymarker.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT memorymarker.o -MD -MP -MF $(DEPDIR)/memorymarker.Tpo -c -o memorymarker.o `test -f 'utils/AsmJit/core/memorymarker.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/memorymarker.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/memorymarker.Tpo $(DEPDIR)/memorymarker.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/memorymarker.cpp' object='memorymarker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o memorymarker.o `test -f 'utils/AsmJit/core/memorymarker.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/memorymarker.cpp memorymarker.obj: utils/AsmJit/core/memorymarker.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT memorymarker.obj -MD -MP -MF $(DEPDIR)/memorymarker.Tpo -c -o memorymarker.obj `if test -f 'utils/AsmJit/core/memorymarker.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/memorymarker.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/memorymarker.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/memorymarker.Tpo $(DEPDIR)/memorymarker.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/memorymarker.cpp' object='memorymarker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o memorymarker.obj `if test -f 'utils/AsmJit/core/memorymarker.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/memorymarker.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/memorymarker.cpp'; fi` operand.o: utils/AsmJit/core/operand.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operand.o -MD -MP -MF $(DEPDIR)/operand.Tpo -c -o operand.o `test -f 'utils/AsmJit/core/operand.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/operand.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/operand.Tpo $(DEPDIR)/operand.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/operand.cpp' object='operand.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operand.o `test -f 'utils/AsmJit/core/operand.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/operand.cpp operand.obj: utils/AsmJit/core/operand.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operand.obj -MD -MP -MF $(DEPDIR)/operand.Tpo -c -o operand.obj `if test -f 'utils/AsmJit/core/operand.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/operand.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/operand.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/operand.Tpo $(DEPDIR)/operand.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/operand.cpp' object='operand.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operand.obj `if test -f 'utils/AsmJit/core/operand.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/operand.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/operand.cpp'; fi` stringbuilder.o: utils/AsmJit/core/stringbuilder.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT stringbuilder.o -MD -MP -MF $(DEPDIR)/stringbuilder.Tpo -c -o stringbuilder.o `test -f 'utils/AsmJit/core/stringbuilder.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/stringbuilder.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/stringbuilder.Tpo $(DEPDIR)/stringbuilder.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/stringbuilder.cpp' object='stringbuilder.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o stringbuilder.o `test -f 'utils/AsmJit/core/stringbuilder.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/stringbuilder.cpp stringbuilder.obj: utils/AsmJit/core/stringbuilder.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT stringbuilder.obj -MD -MP -MF $(DEPDIR)/stringbuilder.Tpo -c -o stringbuilder.obj `if test -f 'utils/AsmJit/core/stringbuilder.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/stringbuilder.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/stringbuilder.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/stringbuilder.Tpo $(DEPDIR)/stringbuilder.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/stringbuilder.cpp' object='stringbuilder.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o stringbuilder.obj `if test -f 'utils/AsmJit/core/stringbuilder.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/stringbuilder.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/stringbuilder.cpp'; fi` stringutil.o: utils/AsmJit/core/stringutil.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT stringutil.o -MD -MP -MF $(DEPDIR)/stringutil.Tpo -c -o stringutil.o `test -f 'utils/AsmJit/core/stringutil.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/stringutil.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/stringutil.Tpo $(DEPDIR)/stringutil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/stringutil.cpp' object='stringutil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o stringutil.o `test -f 'utils/AsmJit/core/stringutil.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/stringutil.cpp stringutil.obj: utils/AsmJit/core/stringutil.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT stringutil.obj -MD -MP -MF $(DEPDIR)/stringutil.Tpo -c -o stringutil.obj `if test -f 'utils/AsmJit/core/stringutil.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/stringutil.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/stringutil.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/stringutil.Tpo $(DEPDIR)/stringutil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/stringutil.cpp' object='stringutil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o stringutil.obj `if test -f 'utils/AsmJit/core/stringutil.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/stringutil.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/stringutil.cpp'; fi` virtualmemory.o: utils/AsmJit/core/virtualmemory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT virtualmemory.o -MD -MP -MF $(DEPDIR)/virtualmemory.Tpo -c -o virtualmemory.o `test -f 'utils/AsmJit/core/virtualmemory.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/virtualmemory.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/virtualmemory.Tpo $(DEPDIR)/virtualmemory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/virtualmemory.cpp' object='virtualmemory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o virtualmemory.o `test -f 'utils/AsmJit/core/virtualmemory.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/virtualmemory.cpp virtualmemory.obj: utils/AsmJit/core/virtualmemory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT virtualmemory.obj -MD -MP -MF $(DEPDIR)/virtualmemory.Tpo -c -o virtualmemory.obj `if test -f 'utils/AsmJit/core/virtualmemory.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/virtualmemory.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/virtualmemory.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/virtualmemory.Tpo $(DEPDIR)/virtualmemory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/virtualmemory.cpp' object='virtualmemory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o virtualmemory.obj `if test -f 'utils/AsmJit/core/virtualmemory.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/virtualmemory.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/virtualmemory.cpp'; fi` zonememory.o: utils/AsmJit/core/zonememory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zonememory.o -MD -MP -MF $(DEPDIR)/zonememory.Tpo -c -o zonememory.o `test -f 'utils/AsmJit/core/zonememory.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/zonememory.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zonememory.Tpo $(DEPDIR)/zonememory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/zonememory.cpp' object='zonememory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zonememory.o `test -f 'utils/AsmJit/core/zonememory.cpp' || echo '$(srcdir)/'`utils/AsmJit/core/zonememory.cpp zonememory.obj: utils/AsmJit/core/zonememory.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zonememory.obj -MD -MP -MF $(DEPDIR)/zonememory.Tpo -c -o zonememory.obj `if test -f 'utils/AsmJit/core/zonememory.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/zonememory.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/zonememory.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/zonememory.Tpo $(DEPDIR)/zonememory.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/core/zonememory.cpp' object='zonememory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zonememory.obj `if test -f 'utils/AsmJit/core/zonememory.cpp'; then $(CYGPATH_W) 'utils/AsmJit/core/zonememory.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/core/zonememory.cpp'; fi` x86assembler.o: utils/AsmJit/x86/x86assembler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86assembler.o -MD -MP -MF $(DEPDIR)/x86assembler.Tpo -c -o x86assembler.o `test -f 'utils/AsmJit/x86/x86assembler.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86assembler.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86assembler.Tpo $(DEPDIR)/x86assembler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86assembler.cpp' object='x86assembler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86assembler.o `test -f 'utils/AsmJit/x86/x86assembler.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86assembler.cpp x86assembler.obj: utils/AsmJit/x86/x86assembler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86assembler.obj -MD -MP -MF $(DEPDIR)/x86assembler.Tpo -c -o x86assembler.obj `if test -f 'utils/AsmJit/x86/x86assembler.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86assembler.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86assembler.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86assembler.Tpo $(DEPDIR)/x86assembler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86assembler.cpp' object='x86assembler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86assembler.obj `if test -f 'utils/AsmJit/x86/x86assembler.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86assembler.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86assembler.cpp'; fi` x86compiler.o: utils/AsmJit/x86/x86compiler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86compiler.o -MD -MP -MF $(DEPDIR)/x86compiler.Tpo -c -o x86compiler.o `test -f 'utils/AsmJit/x86/x86compiler.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86compiler.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86compiler.Tpo $(DEPDIR)/x86compiler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86compiler.cpp' object='x86compiler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86compiler.o `test -f 'utils/AsmJit/x86/x86compiler.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86compiler.cpp x86compiler.obj: utils/AsmJit/x86/x86compiler.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86compiler.obj -MD -MP -MF $(DEPDIR)/x86compiler.Tpo -c -o x86compiler.obj `if test -f 'utils/AsmJit/x86/x86compiler.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86compiler.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86compiler.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86compiler.Tpo $(DEPDIR)/x86compiler.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86compiler.cpp' object='x86compiler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86compiler.obj `if test -f 'utils/AsmJit/x86/x86compiler.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86compiler.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86compiler.cpp'; fi` x86compilercontext.o: utils/AsmJit/x86/x86compilercontext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86compilercontext.o -MD -MP -MF $(DEPDIR)/x86compilercontext.Tpo -c -o x86compilercontext.o `test -f 'utils/AsmJit/x86/x86compilercontext.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86compilercontext.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86compilercontext.Tpo $(DEPDIR)/x86compilercontext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86compilercontext.cpp' object='x86compilercontext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86compilercontext.o `test -f 'utils/AsmJit/x86/x86compilercontext.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86compilercontext.cpp x86compilercontext.obj: utils/AsmJit/x86/x86compilercontext.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86compilercontext.obj -MD -MP -MF $(DEPDIR)/x86compilercontext.Tpo -c -o x86compilercontext.obj `if test -f 'utils/AsmJit/x86/x86compilercontext.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86compilercontext.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86compilercontext.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86compilercontext.Tpo $(DEPDIR)/x86compilercontext.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86compilercontext.cpp' object='x86compilercontext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86compilercontext.obj `if test -f 'utils/AsmJit/x86/x86compilercontext.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86compilercontext.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86compilercontext.cpp'; fi` x86compilerfunc.o: utils/AsmJit/x86/x86compilerfunc.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86compilerfunc.o -MD -MP -MF $(DEPDIR)/x86compilerfunc.Tpo -c -o x86compilerfunc.o `test -f 'utils/AsmJit/x86/x86compilerfunc.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86compilerfunc.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86compilerfunc.Tpo $(DEPDIR)/x86compilerfunc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86compilerfunc.cpp' object='x86compilerfunc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86compilerfunc.o `test -f 'utils/AsmJit/x86/x86compilerfunc.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86compilerfunc.cpp x86compilerfunc.obj: utils/AsmJit/x86/x86compilerfunc.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86compilerfunc.obj -MD -MP -MF $(DEPDIR)/x86compilerfunc.Tpo -c -o x86compilerfunc.obj `if test -f 'utils/AsmJit/x86/x86compilerfunc.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86compilerfunc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86compilerfunc.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86compilerfunc.Tpo $(DEPDIR)/x86compilerfunc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86compilerfunc.cpp' object='x86compilerfunc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86compilerfunc.obj `if test -f 'utils/AsmJit/x86/x86compilerfunc.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86compilerfunc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86compilerfunc.cpp'; fi` x86compileritem.o: utils/AsmJit/x86/x86compileritem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86compileritem.o -MD -MP -MF $(DEPDIR)/x86compileritem.Tpo -c -o x86compileritem.o `test -f 'utils/AsmJit/x86/x86compileritem.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86compileritem.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86compileritem.Tpo $(DEPDIR)/x86compileritem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86compileritem.cpp' object='x86compileritem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86compileritem.o `test -f 'utils/AsmJit/x86/x86compileritem.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86compileritem.cpp x86compileritem.obj: utils/AsmJit/x86/x86compileritem.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86compileritem.obj -MD -MP -MF $(DEPDIR)/x86compileritem.Tpo -c -o x86compileritem.obj `if test -f 'utils/AsmJit/x86/x86compileritem.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86compileritem.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86compileritem.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86compileritem.Tpo $(DEPDIR)/x86compileritem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86compileritem.cpp' object='x86compileritem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86compileritem.obj `if test -f 'utils/AsmJit/x86/x86compileritem.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86compileritem.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86compileritem.cpp'; fi` x86cpuinfo.o: utils/AsmJit/x86/x86cpuinfo.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86cpuinfo.o -MD -MP -MF $(DEPDIR)/x86cpuinfo.Tpo -c -o x86cpuinfo.o `test -f 'utils/AsmJit/x86/x86cpuinfo.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86cpuinfo.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86cpuinfo.Tpo $(DEPDIR)/x86cpuinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86cpuinfo.cpp' object='x86cpuinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86cpuinfo.o `test -f 'utils/AsmJit/x86/x86cpuinfo.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86cpuinfo.cpp x86cpuinfo.obj: utils/AsmJit/x86/x86cpuinfo.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86cpuinfo.obj -MD -MP -MF $(DEPDIR)/x86cpuinfo.Tpo -c -o x86cpuinfo.obj `if test -f 'utils/AsmJit/x86/x86cpuinfo.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86cpuinfo.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86cpuinfo.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86cpuinfo.Tpo $(DEPDIR)/x86cpuinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86cpuinfo.cpp' object='x86cpuinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86cpuinfo.obj `if test -f 'utils/AsmJit/x86/x86cpuinfo.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86cpuinfo.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86cpuinfo.cpp'; fi` x86defs.o: utils/AsmJit/x86/x86defs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86defs.o -MD -MP -MF $(DEPDIR)/x86defs.Tpo -c -o x86defs.o `test -f 'utils/AsmJit/x86/x86defs.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86defs.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86defs.Tpo $(DEPDIR)/x86defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86defs.cpp' object='x86defs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86defs.o `test -f 'utils/AsmJit/x86/x86defs.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86defs.cpp x86defs.obj: utils/AsmJit/x86/x86defs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86defs.obj -MD -MP -MF $(DEPDIR)/x86defs.Tpo -c -o x86defs.obj `if test -f 'utils/AsmJit/x86/x86defs.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86defs.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86defs.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86defs.Tpo $(DEPDIR)/x86defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86defs.cpp' object='x86defs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86defs.obj `if test -f 'utils/AsmJit/x86/x86defs.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86defs.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86defs.cpp'; fi` x86func.o: utils/AsmJit/x86/x86func.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86func.o -MD -MP -MF $(DEPDIR)/x86func.Tpo -c -o x86func.o `test -f 'utils/AsmJit/x86/x86func.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86func.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86func.Tpo $(DEPDIR)/x86func.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86func.cpp' object='x86func.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86func.o `test -f 'utils/AsmJit/x86/x86func.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86func.cpp x86func.obj: utils/AsmJit/x86/x86func.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86func.obj -MD -MP -MF $(DEPDIR)/x86func.Tpo -c -o x86func.obj `if test -f 'utils/AsmJit/x86/x86func.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86func.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86func.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86func.Tpo $(DEPDIR)/x86func.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86func.cpp' object='x86func.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86func.obj `if test -f 'utils/AsmJit/x86/x86func.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86func.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86func.cpp'; fi` x86operand.o: utils/AsmJit/x86/x86operand.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86operand.o -MD -MP -MF $(DEPDIR)/x86operand.Tpo -c -o x86operand.o `test -f 'utils/AsmJit/x86/x86operand.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86operand.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86operand.Tpo $(DEPDIR)/x86operand.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86operand.cpp' object='x86operand.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86operand.o `test -f 'utils/AsmJit/x86/x86operand.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86operand.cpp x86operand.obj: utils/AsmJit/x86/x86operand.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86operand.obj -MD -MP -MF $(DEPDIR)/x86operand.Tpo -c -o x86operand.obj `if test -f 'utils/AsmJit/x86/x86operand.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86operand.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86operand.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86operand.Tpo $(DEPDIR)/x86operand.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86operand.cpp' object='x86operand.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86operand.obj `if test -f 'utils/AsmJit/x86/x86operand.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86operand.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86operand.cpp'; fi` x86util.o: utils/AsmJit/x86/x86util.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86util.o -MD -MP -MF $(DEPDIR)/x86util.Tpo -c -o x86util.o `test -f 'utils/AsmJit/x86/x86util.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86util.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86util.Tpo $(DEPDIR)/x86util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86util.cpp' object='x86util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86util.o `test -f 'utils/AsmJit/x86/x86util.cpp' || echo '$(srcdir)/'`utils/AsmJit/x86/x86util.cpp x86util.obj: utils/AsmJit/x86/x86util.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT x86util.obj -MD -MP -MF $(DEPDIR)/x86util.Tpo -c -o x86util.obj `if test -f 'utils/AsmJit/x86/x86util.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86util.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86util.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/x86util.Tpo $(DEPDIR)/x86util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='utils/AsmJit/x86/x86util.cpp' object='x86util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o x86util.obj `if test -f 'utils/AsmJit/x86/x86util.cpp'; then $(CYGPATH_W) 'utils/AsmJit/x86/x86util.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/AsmJit/x86/x86util.cpp'; fi` SndOut.o: metaspu/SndOut.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SndOut.o -MD -MP -MF $(DEPDIR)/SndOut.Tpo -c -o SndOut.o `test -f 'metaspu/SndOut.cpp' || echo '$(srcdir)/'`metaspu/SndOut.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SndOut.Tpo $(DEPDIR)/SndOut.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='metaspu/SndOut.cpp' object='SndOut.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SndOut.o `test -f 'metaspu/SndOut.cpp' || echo '$(srcdir)/'`metaspu/SndOut.cpp SndOut.obj: metaspu/SndOut.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SndOut.obj -MD -MP -MF $(DEPDIR)/SndOut.Tpo -c -o SndOut.obj `if test -f 'metaspu/SndOut.cpp'; then $(CYGPATH_W) 'metaspu/SndOut.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/SndOut.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SndOut.Tpo $(DEPDIR)/SndOut.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='metaspu/SndOut.cpp' object='SndOut.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SndOut.obj `if test -f 'metaspu/SndOut.cpp'; then $(CYGPATH_W) 'metaspu/SndOut.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/SndOut.cpp'; fi` Timestretcher.o: metaspu/Timestretcher.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Timestretcher.o -MD -MP -MF $(DEPDIR)/Timestretcher.Tpo -c -o Timestretcher.o `test -f 'metaspu/Timestretcher.cpp' || echo '$(srcdir)/'`metaspu/Timestretcher.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/Timestretcher.Tpo $(DEPDIR)/Timestretcher.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='metaspu/Timestretcher.cpp' object='Timestretcher.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Timestretcher.o `test -f 'metaspu/Timestretcher.cpp' || echo '$(srcdir)/'`metaspu/Timestretcher.cpp Timestretcher.obj: metaspu/Timestretcher.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Timestretcher.obj -MD -MP -MF $(DEPDIR)/Timestretcher.Tpo -c -o Timestretcher.obj `if test -f 'metaspu/Timestretcher.cpp'; then $(CYGPATH_W) 'metaspu/Timestretcher.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/Timestretcher.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/Timestretcher.Tpo $(DEPDIR)/Timestretcher.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='metaspu/Timestretcher.cpp' object='Timestretcher.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Timestretcher.obj `if test -f 'metaspu/Timestretcher.cpp'; then $(CYGPATH_W) 'metaspu/Timestretcher.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/Timestretcher.cpp'; fi` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/src/ROMReader.h0000644000175000017500000000253412140261633016444 0ustar guillaumeguillaume/* Copyright (C) 2007 Guillaume Duhamel Copyright (C) 2007 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifdef HAVE_LIBZ #include #endif #include #include "types.h" #define ROMREADER_DEFAULT -1 #define ROMREADER_STD 0 #define ROMREADER_GZIP 1 #define ROMREADER_ZIP 2 typedef struct { int id; const char * Name; void * (*Init)(const char * filename); void (*DeInit)(void * file); u32 (*Size)(void * file); int (*Seek)(void * file, int offset, int whence); int (*Read)(void * file, void * buffer, u32 size); } ROMReader_struct; extern ROMReader_struct STDROMReader; #ifdef HAVE_LIBZ extern ROMReader_struct GZIPROMReader; #endif #ifdef HAVE_LIBZZIP extern ROMReader_struct ZIPROMReader; #endif ROMReader_struct * ROMReaderInit(char ** filename); desmume-0.9.9/src/arm_instructions.cpp0000644000175000017500000043540412140261633020630 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ // ARM core TODO: // - Check all the LDM/STM opcodes: quirks when Rb included in Rlist; opcodes // operating on user registers (LDMXX2/STMXX2) // - Force User mode memory access for LDRx/STRx opcodes with bit24=0 and bit21=1 // (has to be done at memory side; once the PU is emulated well enough) // - Check LDMxx2/STMxx2 (those opcodes that act on User mode registers instead // of current ones) //#define UNTESTEDOPCODEDEBUG #include "cp15.h" #include "debug.h" #include "MMU.h" #include "armcpu.h" #include "NDSSystem.h" #include "MMU_timing.h" #define cpu (&ARMPROC) #define TEMPLATE template //----------------------------------------------------------------------------- // Shifting macros //----------------------------------------------------------------------------- #define LSL_IMM \ u32 shift_op = cpu->R[REG_POS(i,0)]<<((i>>7)&0x1F); #define S_LSL_IMM \ u32 shift_op = ((i>>7)&0x1F); \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], 32-shift_op); \ shift_op = cpu->R[REG_POS(i,0)]<R[REG_POS(i,8)])&0xFF; \ if(shift_op>=32) \ shift_op=0; \ else \ shift_op=cpu->R[REG_POS(i,0)]<R[REG_POS(i,8)])&0xFF; \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ if(shift_op<32) \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], 32-shift_op); \ shift_op = cpu->R[REG_POS(i,0)]<R[REG_POS(i,0)]); \ } \ else \ { \ shift_op = 0; \ c = 0; \ } #define LSR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ if(shift_op!=0) \ shift_op = cpu->R[REG_POS(i,0)]>>shift_op; #define S_LSR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ { \ c = BIT31(cpu->R[REG_POS(i,0)]); \ } \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = cpu->R[REG_POS(i,0)]>>shift_op; \ } #define LSR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ if(shift_op>=32) \ shift_op = 0; \ else \ shift_op = cpu->R[REG_POS(i,0)]>>shift_op; #define S_LSR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ { \ shift_op = cpu->R[REG_POS(i,0)]; \ } \ else \ if(shift_op<32) \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = cpu->R[REG_POS(i,0)]>>shift_op; \ } \ else \ if(shift_op==32) \ { \ c = BIT31(cpu->R[REG_POS(i,0)]); \ shift_op = 0; \ } \ else \ { \ c = 0; \ shift_op = 0; \ } #define ASR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ if(shift_op==0) \ shift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \ else \ shift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); #define S_ASR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ { \ shift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \ c = BIT31(cpu->R[REG_POS(i,0)]); \ } \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \ } #define ASR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ if(shift_op<32) \ shift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \ else \ shift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; #define S_ASR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ if(shift_op<32) \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \ } \ else \ { \ c = BIT31(cpu->R[REG_POS(i,0)]); \ shift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \ } #define ROR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ if(shift_op==0) \ { \ shift_op = ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1); \ } \ else \ shift_op = ROR(cpu->R[REG_POS(i,0)],shift_op); #define S_ROR_IMM \ u32 shift_op = ((i>>7)&0x1F); \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ { \ shift_op = ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1); \ c = BIT0(cpu->R[REG_POS(i,0)]); \ } \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = ROR(cpu->R[REG_POS(i,0)],shift_op); \ } #define ROR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ if((shift_op==0)||((shift_op&0x1F)==0)) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ shift_op = ROR(cpu->R[REG_POS(i,0)],(shift_op&0x1F)); #define S_ROR_REG \ u32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \ u32 c = cpu->CPSR.bits.C; \ if(shift_op==0) \ shift_op=cpu->R[REG_POS(i,0)]; \ else \ { \ shift_op&=0x1F; \ if(shift_op==0) \ { \ shift_op=cpu->R[REG_POS(i,0)]; \ c = BIT31(cpu->R[REG_POS(i,0)]); \ } \ else \ { \ c = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \ shift_op = ROR(cpu->R[REG_POS(i,0)],shift_op); \ } \ } #define IMM_VALUE \ u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E); #define S_IMM_VALUE \ u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E); \ u32 c = cpu->CPSR.bits.C; \ if((i>>8)&0xF) \ c = BIT31(shift_op); #define IMM_OFF (((i>>4)&0xF0)+(i&0xF)) #define IMM_OFF_12 ((i)&0xFFF) //----------------------------------------------------------------------------- // Undefined instruction //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_UND(const u32 i) { TRAPUNDEF(cpu); return 1; } //----------------------------------------------------------------------------- // AND / ANDS // Timing: OK //----------------------------------------------------------------------------- #define OP_AND(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_ANDS(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_AND_LSL_IMM(const u32 i) { LSL_IMM; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_LSL_REG(const u32 i) { LSL_REG; OP_AND(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_LSR_IMM(const u32 i) { LSR_IMM; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_LSR_REG(const u32 i) { LSR_REG; OP_AND(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_ASR_IMM(const u32 i) { ASR_IMM; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_ASR_REG(const u32 i) { ASR_REG; OP_AND(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_ROR_IMM(const u32 i) { ROR_IMM; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_ROR_REG(const u32 i) { ROR_REG; OP_AND(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_IMM_VAL(const u32 i) { IMM_VALUE; OP_AND(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_ANDS(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_LSL_REG(const u32 i) { S_LSL_REG; OP_ANDS(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_ANDS(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_LSR_REG(const u32 i) { S_LSR_REG; OP_ANDS(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_ANDS(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_ASR_REG(const u32 i) { S_ASR_REG; OP_ANDS(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_ANDS(1, 3); } TEMPLATE static u32 FASTCALL OP_AND_S_ROR_REG(const u32 i) { S_ROR_REG; OP_ANDS(2, 4); } TEMPLATE static u32 FASTCALL OP_AND_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_ANDS(1, 3); } //----------------------------------------------------------------------------- // EOR / EORS //----------------------------------------------------------------------------- #define OP_EOR(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] ^ shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_EORS(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] ^ shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_EOR_LSL_IMM(const u32 i) { LSL_IMM; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_LSL_REG(const u32 i) { LSL_REG; OP_EOR(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_LSR_IMM(const u32 i) { LSR_IMM; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_LSR_REG(const u32 i) { LSR_REG; OP_EOR(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_ASR_IMM(const u32 i) { ASR_IMM; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_ASR_REG(const u32 i) { ASR_REG; OP_EOR(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_ROR_IMM(const u32 i) { ROR_IMM; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_ROR_REG(const u32 i) { ROR_REG; OP_EOR(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_IMM_VAL(const u32 i) { IMM_VALUE; OP_EOR(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_EORS(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_LSL_REG(const u32 i) { S_LSL_REG; OP_EORS(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_EORS(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_LSR_REG(const u32 i) { S_LSR_REG; OP_EORS(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_EORS(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_ASR_REG(const u32 i) { S_ASR_REG; OP_EORS(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_EORS(1, 3); } TEMPLATE static u32 FASTCALL OP_EOR_S_ROR_REG(const u32 i) { S_ROR_REG; OP_EORS(2, 4); } TEMPLATE static u32 FASTCALL OP_EOR_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_EORS(1, 3); } //----------------------------------------------------------------------------- // SUB / SUBS //----------------------------------------------------------------------------- #define OP_SUB(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] - shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_SUBS(a, b) \ cpu->R[REG_POS(i,12)] = v - shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.C = !BorrowFrom(v, shift_op); \ cpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_POS(i,12)], v, shift_op); \ return a; TEMPLATE static u32 FASTCALL OP_SUB_LSL_IMM(const u32 i) { LSL_IMM; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_LSL_REG(const u32 i) { LSL_REG; OP_SUB(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_LSR_IMM(const u32 i) { LSR_IMM; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_LSR_REG(const u32 i) { LSR_REG; OP_SUB(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_ASR_IMM(const u32 i) { ASR_IMM; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_ASR_REG(const u32 i) { ASR_REG; OP_SUB(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_ROR_IMM(const u32 i) { ROR_IMM; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_ROR_REG(const u32 i) { ROR_REG; OP_SUB(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_IMM_VAL(const u32 i) { IMM_VALUE; OP_SUB(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_SUBS(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_SUBS(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_SUBS(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_SUBS(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_SUBS(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_SUBS(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_SUBS(1, 3); } TEMPLATE static u32 FASTCALL OP_SUB_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_SUBS(2, 4); } TEMPLATE static u32 FASTCALL OP_SUB_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_SUBS(1, 3); } //----------------------------------------------------------------------------- // RSB / RSBS //----------------------------------------------------------------------------- #define OP_RSB(a, b) \ cpu->R[REG_POS(i,12)] = shift_op - cpu->R[REG_POS(i,16)]; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_RSBS(a, b) \ cpu->R[REG_POS(i,12)] = shift_op - v; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.C = !BorrowFrom(shift_op, v); \ cpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_POS(i,12)], shift_op, v); \ return a; TEMPLATE static u32 FASTCALL OP_RSB_LSL_IMM(const u32 i) { LSL_IMM; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_LSL_REG(const u32 i) { LSL_REG; OP_RSB(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_LSR_IMM(const u32 i) { LSR_IMM; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_LSR_REG(const u32 i) { LSR_REG; OP_RSB(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_ASR_IMM(const u32 i) { ASR_IMM; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_ASR_REG(const u32 i) { ASR_REG; OP_RSB(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_ROR_IMM(const u32 i) { ROR_IMM; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_ROR_REG(const u32 i) { ROR_REG; OP_RSB(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_IMM_VAL(const u32 i) { IMM_VALUE; OP_RSB(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_RSBS(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_RSBS(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_RSBS(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_RSBS(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_RSBS(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_RSBS(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_RSBS(1, 3); } TEMPLATE static u32 FASTCALL OP_RSB_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_RSBS(2, 4); } TEMPLATE static u32 FASTCALL OP_RSB_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_RSBS(1, 3); } //----------------------------------------------------------------------------- // ADD / ADDS //----------------------------------------------------------------------------- #define OP_ADD(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] + shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_ADDS(a, b) \ cpu->R[REG_POS(i,12)] = v + shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.C = CarryFrom(v, shift_op); \ cpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_POS(i,12)], v, shift_op); \ return a; TEMPLATE static u32 FASTCALL OP_ADD_LSL_IMM(const u32 i) { LSL_IMM; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_LSL_REG(const u32 i) { LSL_REG; OP_ADD(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_LSR_IMM(const u32 i) { LSR_IMM; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_LSR_REG(const u32 i) { LSR_REG; OP_ADD(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_ASR_IMM(const u32 i) { ASR_IMM; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_ASR_REG(const u32 i) { ASR_REG; OP_ADD(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_ROR_IMM(const u32 i) { ROR_IMM; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_ROR_REG(const u32 i) { ROR_REG; OP_ADD(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_IMM_VAL(const u32 i) { IMM_VALUE; OP_ADD(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_ADDS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_ADDS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_ADDS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_ADDS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_ADDS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_ADDS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_ADDS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADD_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_ADDS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADD_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_ADDS(1, 3); } //----------------------------------------------------------------------------- // ADC / ADCS //----------------------------------------------------------------------------- #define OP_ADC(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] + shift_op + cpu->CPSR.bits.C; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_ADCS(a, b) \ { \ if(REG_POS(i,12)==15) \ { \ cpu->R[REG_POS(i,12)] = v + shift_op + cpu->CPSR.bits.C; \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ if (!cpu->CPSR.bits.C) \ { \ cpu->R[REG_POS(i,12)] = v + shift_op; \ cpu->CPSR.bits.C = cpu->R[REG_POS(i,12)] < v; \ } \ else \ { \ cpu->R[REG_POS(i,12)] = v + shift_op + 1; \ cpu->CPSR.bits.C = cpu->R[REG_POS(i,12)] <= v; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.V = BIT31((v ^ shift_op ^ -1) & (v ^ cpu->R[REG_POS(i, 12)]));\ return a; \ } TEMPLATE static u32 FASTCALL OP_ADC_LSL_IMM(const u32 i) { LSL_IMM; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_LSL_REG(const u32 i) { LSL_REG; OP_ADC(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_LSR_IMM(const u32 i) { LSR_IMM; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_LSR_REG(const u32 i) { LSR_REG; OP_ADC(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_ASR_IMM(const u32 i) { ASR_IMM; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_ASR_REG(const u32 i) { ASR_REG; OP_ADC(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_ROR_IMM(const u32 i) { ROR_IMM; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_ROR_REG(const u32 i) { ROR_REG; OP_ADC(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_IMM_VAL(const u32 i) { IMM_VALUE; OP_ADC(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_ADCS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_ADCS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_ADCS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_ADCS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_ADCS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_ADCS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_ADCS(1, 3); } TEMPLATE static u32 FASTCALL OP_ADC_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_ADCS(2, 4); } TEMPLATE static u32 FASTCALL OP_ADC_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_ADCS(1, 3); } //----------------------------------------------------------------------------- // SBC / SBCS //----------------------------------------------------------------------------- #define OP_SBC(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] - shift_op - !cpu->CPSR.bits.C; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_SBCS(a, b) \ { \ if(REG_POS(i,12)==15) \ { \ cpu->R[REG_POS(i,12)] = v - shift_op - !cpu->CPSR.bits.C; \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ if (!cpu->CPSR.bits.C) \ { \ cpu->R[REG_POS(i,12)] = v - shift_op - 1; \ cpu->CPSR.bits.C = v > shift_op; \ } \ else \ { \ cpu->R[REG_POS(i,12)] = v - shift_op; \ cpu->CPSR.bits.C = v >= shift_op; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.V = BIT31((v ^ shift_op) & (v ^ cpu->R[REG_POS(i, 12)])); \ return a; \ } TEMPLATE static u32 FASTCALL OP_SBC_LSL_IMM(const u32 i) { LSL_IMM; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_LSL_REG(const u32 i) { LSL_REG; OP_SBC(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_LSR_IMM(const u32 i) { LSR_IMM; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_LSR_REG(const u32 i) { LSR_REG; OP_SBC(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_ASR_IMM(const u32 i) { ASR_IMM; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_ASR_REG(const u32 i) { ASR_REG; OP_SBC(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_ROR_IMM(const u32 i) { ROR_IMM; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_ROR_REG(const u32 i) { ROR_REG; OP_SBC(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_IMM_VAL(const u32 i) { IMM_VALUE; OP_SBC(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_SBCS(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_SBCS(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_SBCS(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_SBCS(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_SBCS(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_SBCS(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_SBCS(1, 3); } TEMPLATE static u32 FASTCALL OP_SBC_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_SBCS(2, 4); } TEMPLATE static u32 FASTCALL OP_SBC_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_SBCS(1, 3); } //----------------------------------------------------------------------------- // RSC / RSCS //----------------------------------------------------------------------------- #define OP_RSC(a, b) \ cpu->R[REG_POS(i,12)] = shift_op - cpu->R[REG_POS(i,16)] + cpu->CPSR.bits.C - 1; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_RSCS(a, b) \ { \ if(REG_POS(i,12)==15) \ { \ cpu->R[REG_POS(i,12)] = shift_op - v - !cpu->CPSR.bits.C; \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ if (!cpu->CPSR.bits.C) \ { \ cpu->R[REG_POS(i,12)] = shift_op - v - 1; \ cpu->CPSR.bits.C = shift_op > v; \ } \ else \ { \ cpu->R[REG_POS(i,12)] = shift_op - v; \ cpu->CPSR.bits.C = shift_op >= v; \ } \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ cpu->CPSR.bits.V = BIT31((shift_op ^ v) & (shift_op ^ cpu->R[REG_POS(i, 12)])); \ return a; \ } TEMPLATE static u32 FASTCALL OP_RSC_LSL_IMM(const u32 i) { LSL_IMM; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_LSL_REG(const u32 i) { LSL_REG; OP_RSC(2, 4); } TEMPLATE static u32 FASTCALL OP_RSC_LSR_IMM(const u32 i) { LSR_IMM; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_LSR_REG(const u32 i) { LSR_REG; OP_RSC(2, 4); } TEMPLATE static u32 FASTCALL OP_RSC_ASR_IMM(const u32 i) { ASR_IMM; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_ASR_REG(const u32 i) { ASR_REG; OP_RSC(2, 4); } TEMPLATE static u32 FASTCALL OP_RSC_ROR_IMM(const u32 i) { ROR_IMM; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_ROR_REG(const u32 i) { ROR_REG; OP_RSC(2, 4); } TEMPLATE static u32 FASTCALL OP_RSC_IMM_VAL(const u32 i) { IMM_VALUE; OP_RSC(1, 3); } TEMPLATE static u32 FASTCALL OP_RSC_S_LSL_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_IMM; OP_RSCS(1,3); } TEMPLATE static u32 FASTCALL OP_RSC_S_LSL_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSL_REG; OP_RSCS(2,4); } TEMPLATE static u32 FASTCALL OP_RSC_S_LSR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_IMM; OP_RSCS(1,3); } TEMPLATE static u32 FASTCALL OP_RSC_S_LSR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; LSR_REG; OP_RSCS(2,4); } TEMPLATE static u32 FASTCALL OP_RSC_S_ASR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_IMM; OP_RSCS(1,3); } TEMPLATE static u32 FASTCALL OP_RSC_S_ASR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ASR_REG; OP_RSCS(2,4); } TEMPLATE static u32 FASTCALL OP_RSC_S_ROR_IMM(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_IMM; OP_RSCS(1,3); } TEMPLATE static u32 FASTCALL OP_RSC_S_ROR_REG(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; ROR_REG; OP_RSCS(2,4); } TEMPLATE static u32 FASTCALL OP_RSC_S_IMM_VAL(const u32 i) { u32 v = cpu->R[REG_POS(i,16)]; IMM_VALUE; OP_RSCS(1,3); } //----------------------------------------------------------------------------- // TST //----------------------------------------------------------------------------- #define OP_TST(a) \ { \ u32 tmp = cpu->R[REG_POS(i,16)] & shift_op; \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(tmp); \ cpu->CPSR.bits.Z = (tmp==0); \ return a; \ } TEMPLATE static u32 FASTCALL OP_TST_LSL_IMM(const u32 i) { S_LSL_IMM; OP_TST(1); } TEMPLATE static u32 FASTCALL OP_TST_LSL_REG(const u32 i) { S_LSL_REG; OP_TST(2); } TEMPLATE static u32 FASTCALL OP_TST_LSR_IMM(const u32 i) { S_LSR_IMM; OP_TST(1); } TEMPLATE static u32 FASTCALL OP_TST_LSR_REG(const u32 i) { S_LSR_REG; OP_TST(2); } TEMPLATE static u32 FASTCALL OP_TST_ASR_IMM(const u32 i) { S_ASR_IMM; OP_TST(1); } TEMPLATE static u32 FASTCALL OP_TST_ASR_REG(const u32 i) { S_ASR_REG; OP_TST(2); } TEMPLATE static u32 FASTCALL OP_TST_ROR_IMM(const u32 i) { S_ROR_IMM; OP_TST(1); } TEMPLATE static u32 FASTCALL OP_TST_ROR_REG(const u32 i) { S_ROR_REG; OP_TST(2); } TEMPLATE static u32 FASTCALL OP_TST_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_TST(1); } //----------------------------------------------------------------------------- // TEQ //----------------------------------------------------------------------------- #define OP_TEQ(a) \ { \ unsigned tmp = cpu->R[REG_POS(i,16)] ^ shift_op; \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(tmp); \ cpu->CPSR.bits.Z = (tmp==0); \ return a; \ } TEMPLATE static u32 FASTCALL OP_TEQ_LSL_IMM(const u32 i) { S_LSL_IMM; OP_TEQ(1); } TEMPLATE static u32 FASTCALL OP_TEQ_LSL_REG(const u32 i) { S_LSL_REG; OP_TEQ(2); } TEMPLATE static u32 FASTCALL OP_TEQ_LSR_IMM(const u32 i) { S_LSR_IMM; OP_TEQ(1); } TEMPLATE static u32 FASTCALL OP_TEQ_LSR_REG(const u32 i) { S_LSR_REG; OP_TEQ(2); } TEMPLATE static u32 FASTCALL OP_TEQ_ASR_IMM(const u32 i) { S_ASR_IMM; OP_TEQ(1); } TEMPLATE static u32 FASTCALL OP_TEQ_ASR_REG(const u32 i) { S_ASR_REG; OP_TEQ(2); } TEMPLATE static u32 FASTCALL OP_TEQ_ROR_IMM(const u32 i) { S_ROR_IMM; OP_TEQ(1); } TEMPLATE static u32 FASTCALL OP_TEQ_ROR_REG(const u32 i) { S_ROR_REG; OP_TEQ(2); } TEMPLATE static u32 FASTCALL OP_TEQ_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_TEQ(1); } //----------------------------------------------------------------------------- // CMP //----------------------------------------------------------------------------- #define OP_CMP(a) \ { \ u32 tmp = cpu->R[REG_POS(i,16)] - shift_op; \ cpu->CPSR.bits.N = BIT31(tmp); \ cpu->CPSR.bits.Z = (tmp==0); \ cpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_POS(i,16)], shift_op); \ cpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_POS(i,16)], shift_op); \ return a; \ } TEMPLATE static u32 FASTCALL OP_CMP_LSL_IMM(const u32 i) { LSL_IMM; OP_CMP(1); } TEMPLATE static u32 FASTCALL OP_CMP_LSL_REG(const u32 i) { LSL_REG; OP_CMP(2); } TEMPLATE static u32 FASTCALL OP_CMP_LSR_IMM(const u32 i) { LSR_IMM; OP_CMP(1); } TEMPLATE static u32 FASTCALL OP_CMP_LSR_REG(const u32 i) { LSR_REG; OP_CMP(2); } TEMPLATE static u32 FASTCALL OP_CMP_ASR_IMM(const u32 i) { ASR_IMM; OP_CMP(1); } TEMPLATE static u32 FASTCALL OP_CMP_ASR_REG(const u32 i) { ASR_REG; OP_CMP(2); } TEMPLATE static u32 FASTCALL OP_CMP_ROR_IMM(const u32 i) { ROR_IMM; OP_CMP(1); } TEMPLATE static u32 FASTCALL OP_CMP_ROR_REG(const u32 i) { ROR_REG; OP_CMP(2); } TEMPLATE static u32 FASTCALL OP_CMP_IMM_VAL(const u32 i) { IMM_VALUE; OP_CMP(1); } //----------------------------------------------------------------------------- // CMN //----------------------------------------------------------------------------- #define OP_CMN(a) \ { \ u32 tmp = cpu->R[REG_POS(i,16)] + shift_op; \ cpu->CPSR.bits.N = BIT31(tmp); \ cpu->CPSR.bits.Z = (tmp==0); \ cpu->CPSR.bits.C = CarryFrom(cpu->R[REG_POS(i,16)], shift_op); \ cpu->CPSR.bits.V = OverflowFromADD(tmp, cpu->R[REG_POS(i,16)], shift_op); \ return a; \ } TEMPLATE static u32 FASTCALL OP_CMN_LSL_IMM(const u32 i) { LSL_IMM; OP_CMN(1); } TEMPLATE static u32 FASTCALL OP_CMN_LSL_REG(const u32 i) { LSL_REG; OP_CMN(2); } TEMPLATE static u32 FASTCALL OP_CMN_LSR_IMM(const u32 i) { LSR_IMM; OP_CMN(1); } TEMPLATE static u32 FASTCALL OP_CMN_LSR_REG(const u32 i) { LSR_REG; OP_CMN(2); } TEMPLATE static u32 FASTCALL OP_CMN_ASR_IMM(const u32 i) { ASR_IMM; OP_CMN(1); } TEMPLATE static u32 FASTCALL OP_CMN_ASR_REG(const u32 i) { ASR_REG; OP_CMN(2); } TEMPLATE static u32 FASTCALL OP_CMN_ROR_IMM(const u32 i) { ROR_IMM; OP_CMN(1); } TEMPLATE static u32 FASTCALL OP_CMN_ROR_REG(const u32 i) { ROR_REG; OP_CMN(2); } TEMPLATE static u32 FASTCALL OP_CMN_IMM_VAL(const u32 i) { IMM_VALUE; OP_CMN(1); } //----------------------------------------------------------------------------- // ORR / ORRS //----------------------------------------------------------------------------- #define OP_ORR(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] | shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_ORRS(a,b) \ { \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] | shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; \ } TEMPLATE static u32 FASTCALL OP_ORR_LSL_IMM(const u32 i) { LSL_IMM; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_LSL_REG(const u32 i) { LSL_REG; OP_ORR(2, 4); } TEMPLATE static u32 FASTCALL OP_ORR_LSR_IMM(const u32 i) { LSR_IMM; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_LSR_REG(const u32 i) { LSR_REG; OP_ORR(2, 4); } TEMPLATE static u32 FASTCALL OP_ORR_ASR_IMM(const u32 i) { ASR_IMM; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_ASR_REG(const u32 i) { ASR_REG; OP_ORR(2, 4); } TEMPLATE static u32 FASTCALL OP_ORR_ROR_IMM(const u32 i) { ROR_IMM; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_ROR_REG(const u32 i) { ROR_REG; OP_ORR(2, 4); } TEMPLATE static u32 FASTCALL OP_ORR_IMM_VAL(const u32 i) { IMM_VALUE; OP_ORR(1, 3); } TEMPLATE static u32 FASTCALL OP_ORR_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_ORRS(1,3); } TEMPLATE static u32 FASTCALL OP_ORR_S_LSL_REG(const u32 i) { S_LSL_REG; OP_ORRS(2,4); } TEMPLATE static u32 FASTCALL OP_ORR_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_ORRS(1,3); } TEMPLATE static u32 FASTCALL OP_ORR_S_LSR_REG(const u32 i) { S_LSR_REG; OP_ORRS(2,4); } TEMPLATE static u32 FASTCALL OP_ORR_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_ORRS(1,3); } TEMPLATE static u32 FASTCALL OP_ORR_S_ASR_REG(const u32 i) { S_ASR_REG; OP_ORRS(2,4); } TEMPLATE static u32 FASTCALL OP_ORR_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_ORRS(1,3); } TEMPLATE static u32 FASTCALL OP_ORR_S_ROR_REG(const u32 i) { S_ROR_REG; OP_ORRS(2,4); } TEMPLATE static u32 FASTCALL OP_ORR_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_ORRS(1,3); } //----------------------------------------------------------------------------- // MOV / MOVS //----------------------------------------------------------------------------- #define OP_MOV(a, b) \ cpu->R[REG_POS(i,12)] = shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = shift_op; \ return b; \ } \ return a; #define OP_MOVS(a, b) \ cpu->R[REG_POS(i,12)] = shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_MOV_LSL_IMM(const u32 i) { if (i == 0xE1A00000) // nop: MOV R0, R0 return 1; LSL_IMM; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_LSL_REG(const u32 i) { LSL_REG; if (REG_POS(i,0) == 15) shift_op += 4; OP_MOV(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_LSR_IMM(const u32 i) { LSR_IMM; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_LSR_REG(const u32 i) { LSR_REG; if (REG_POS(i,0) == 15) shift_op += 4; OP_MOV(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_ASR_IMM(const u32 i) { ASR_IMM; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_ASR_REG(const u32 i) { ASR_REG; OP_MOV(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_ROR_IMM(const u32 i) { ROR_IMM; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_ROR_REG(const u32 i) { ROR_REG; OP_MOV(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_IMM_VAL(const u32 i) { IMM_VALUE; OP_MOV(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_MOVS(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_LSL_REG(const u32 i) { S_LSL_REG; if (REG_POS(i,0) == 15) shift_op += 4; OP_MOVS(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_MOVS(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_LSR_REG(const u32 i) { S_LSR_REG; if (REG_POS(i,0) == 15) shift_op += 4; OP_MOVS(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_MOVS(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_ASR_REG(const u32 i) { S_ASR_REG; OP_MOVS(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_MOVS(1,3); } TEMPLATE static u32 FASTCALL OP_MOV_S_ROR_REG(const u32 i) { S_ROR_REG; OP_MOVS(2,4); } TEMPLATE static u32 FASTCALL OP_MOV_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_MOVS(1,3); } //----------------------------------------------------------------------------- // BIC / BICS //----------------------------------------------------------------------------- #define OP_BIC(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & (~shift_op); \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_BICS(a, b) \ cpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & (~shift_op); \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_BIC_LSL_IMM(const u32 i) { LSL_IMM; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_LSL_REG(const u32 i) { LSL_REG; OP_BIC(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_LSR_IMM(const u32 i) { LSR_IMM; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_LSR_REG(const u32 i) { LSR_REG; OP_BIC(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_ASR_IMM(const u32 i) { ASR_IMM; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_ASR_REG(const u32 i) { ASR_REG; OP_BIC(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_ROR_IMM(const u32 i) { ROR_IMM; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_ROR_REG(const u32 i) { ROR_REG; OP_BIC(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_IMM_VAL(const u32 i) { IMM_VALUE; OP_BIC(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_BICS(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_LSL_REG(const u32 i) { S_LSL_REG; OP_BICS(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_BICS(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_LSR_REG(const u32 i) { S_LSR_REG; OP_BICS(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_BICS(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_ASR_REG(const u32 i) { S_ASR_REG; OP_BICS(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_BICS(1,3); } TEMPLATE static u32 FASTCALL OP_BIC_S_ROR_REG(const u32 i) { S_ROR_REG; OP_BICS(2,4); } TEMPLATE static u32 FASTCALL OP_BIC_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_BICS(1,3); } //----------------------------------------------------------------------------- // MVN / MVNS //----------------------------------------------------------------------------- #define OP_MVN(a, b) \ cpu->R[REG_POS(i,12)] = ~shift_op; \ if(REG_POS(i,12)==15) \ { \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ return a; #define OP_MVNS(a, b) \ cpu->R[REG_POS(i,12)] = ~shift_op; \ if(REG_POS(i,12)==15) \ { \ Status_Reg SPSR = cpu->SPSR; \ armcpu_switchMode(cpu, SPSR.bits.mode); \ cpu->CPSR=SPSR; \ cpu->changeCPSR(); \ cpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \ cpu->next_instruction = cpu->R[15]; \ return b; \ } \ cpu->CPSR.bits.C = c; \ cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \ cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \ return a; TEMPLATE static u32 FASTCALL OP_MVN_LSL_IMM(const u32 i) { LSL_IMM; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_LSL_REG(const u32 i) { LSL_REG; OP_MVN(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_LSR_IMM(const u32 i) { LSR_IMM; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_LSR_REG(const u32 i) { LSR_REG; OP_MVN(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_ASR_IMM(const u32 i) { ASR_IMM; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_ASR_REG(const u32 i) { ASR_REG; OP_MVN(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_ROR_IMM(const u32 i) { ROR_IMM; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_ROR_REG(const u32 i) { ROR_REG; OP_MVN(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_IMM_VAL(const u32 i) { IMM_VALUE; OP_MVN(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_LSL_IMM(const u32 i) { S_LSL_IMM; OP_MVNS(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_LSL_REG(const u32 i) { S_LSL_REG; OP_MVNS(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_S_LSR_IMM(const u32 i) { S_LSR_IMM; OP_MVNS(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_LSR_REG(const u32 i) { S_LSR_REG; OP_MVNS(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_S_ASR_IMM(const u32 i) { S_ASR_IMM; OP_MVNS(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_ASR_REG(const u32 i) { S_ASR_REG; OP_MVNS(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_S_ROR_IMM(const u32 i) { S_ROR_IMM; OP_MVNS(1,3); } TEMPLATE static u32 FASTCALL OP_MVN_S_ROR_REG(const u32 i) { S_ROR_REG; OP_MVNS(2,4); } TEMPLATE static u32 FASTCALL OP_MVN_S_IMM_VAL(const u32 i) { S_IMM_VALUE; OP_MVNS(1,3); } //----------------------------------------------------------------------------- // MUL / MULS / MLA / MLAS //----------------------------------------------------------------------------- #define MUL_Mxx_END(c) \ v >>= 8; \ if((v==0)||(v==0xFFFFFF)) \ return c+1; \ v >>= 8; \ if((v==0)||(v==0xFFFF)) \ return c+2; \ v >>= 8; \ if((v==0)||(v==0xFF)) \ return c+3; \ return c+4; \ TEMPLATE static u32 FASTCALL OP_MUL(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; cpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v; MUL_Mxx_END(1); } TEMPLATE static u32 FASTCALL OP_MLA(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; cpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v + cpu->R[REG_POS(i,12)]; MUL_Mxx_END(2); } TEMPLATE static u32 FASTCALL OP_MUL_S(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; cpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v; cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0); MUL_Mxx_END(1); } TEMPLATE static u32 FASTCALL OP_MLA_S(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; cpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v + cpu->R[REG_POS(i,12)]; cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0); MUL_Mxx_END(2); } //----------------------------------------------------------------------------- // UMULL / UMULLS / UMLAL / UMLALS //----------------------------------------------------------------------------- #define MUL_UMxxL_END(c) \ v >>= 8; \ if(v==0) \ return c+1; \ v >>= 8; \ if(v==0) \ return c+2; \ v >>= 8; \ if(v==0) \ return c+3; \ return c+4; \ TEMPLATE static u32 FASTCALL OP_UMULL(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; u64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v; cpu->R[REG_POS(i,12)] = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32); MUL_UMxxL_END(2); } TEMPLATE static u32 FASTCALL OP_UMLAL(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; u64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v; // RdLo = (Rm * Rs)[31:0] + RdLo /* Unsigned multiplication */ // RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo) u32 tmp = (u32)res; // low cpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,12)] += tmp; MUL_UMxxL_END(3); } TEMPLATE static u32 FASTCALL OP_UMULL_S(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; u64 res = ((u64)cpu->R[REG_POS(i,0)] * (u64)v); cpu->R[REG_POS(i,12)] = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32); cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) && (cpu->R[REG_POS(i,12)]==0); MUL_UMxxL_END(2); } TEMPLATE static u32 FASTCALL OP_UMLAL_S(const u32 i) { u32 v = cpu->R[REG_POS(i,8)]; u64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v; // RdLo = (Rm * Rs)[31:0] + RdLo /* Unsigned multiplication */ // RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo) u32 tmp = (u32)res; // low cpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,12)] += tmp; cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0); MUL_UMxxL_END(3); } //----------------------------------------------------------------------------- // SMULL / SMULLS / SMLAL / SMLALS //----------------------------------------------------------------------------- #define MUL_SMxxL_END(c) \ v &= 0xFFFFFFFF; \ v >>= 8; \ if((v==0)||(v==0xFFFFFF)) \ return c+1; \ v >>= 8; \ if((v==0)||(v==0xFFFF)) \ return c+2; \ v >>= 8; \ if((v==0)||(v==0xFF)) \ return c+3; \ return c+4; \ TEMPLATE static u32 FASTCALL OP_SMULL(const u32 i) { s64 v = (s32)cpu->R[REG_POS(i,8)]; s64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32); MUL_SMxxL_END(2); } TEMPLATE static u32 FASTCALL OP_SMLAL(const u32 i) { s64 v = (s32)cpu->R[REG_POS(i,8)]; s64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)]; //LOG("%08X * %08X + %08X%08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], cpu->R[REG_POS(i,16)], cpu->R[REG_POS(i,12)]); u32 tmp = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,12)] += tmp; //LOG("= %08X%08X %08X%08X\n", cpu->R[REG_POS(i,16)], cpu->R[REG_POS(i,12)], res); MUL_SMxxL_END(3); } TEMPLATE static u32 FASTCALL OP_SMULL_S(const u32 i) { s64 v = (s32)cpu->R[REG_POS(i,8)]; s64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32); cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0); MUL_SMxxL_END(2); } TEMPLATE static u32 FASTCALL OP_SMLAL_S(const u32 i) { s64 v = (s32)cpu->R[REG_POS(i,8)]; s64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)]; u32 tmp = (u32)res; cpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,12)] += tmp; cpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]); cpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0); MUL_SMxxL_END(3); } //----------------------------------------------------------------------------- // SWP / SWPB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SWP(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; u32 tmp = ROR(READ32(cpu->mem_if->data, adr), (adr & 3)<<3); WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,0)]); cpu->R[REG_POS(i,12)] = tmp; u32 c = MMU_memAccessCycles(adr); c += MMU_memAccessCycles(adr); return MMU_aluMemCycles(4, c); } TEMPLATE static u32 FASTCALL OP_SWPB(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; u8 tmp = READ8(cpu->mem_if->data, adr); WRITE8(cpu->mem_if->data, adr, (u8)(cpu->R[REG_POS(i,0)]&0xFF)); cpu->R[REG_POS(i,12)] = tmp; u32 c = MMU_memAccessCycles(adr); c += MMU_memAccessCycles(adr); return MMU_aluMemCycles(4, c); } //----------------------------------------------------------------------------- // LDRH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRH_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_PRE_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_PRE_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_PRE_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] =(u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_PRE_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_POS_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += IMM_OFF; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_POS_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= IMM_OFF; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_POS_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRH_POS_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // STRH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STRH_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_PRE_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,16)] = adr; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_PRE_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,16)] = adr; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_PRE_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_PRE_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_POS_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] += IMM_OFF; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_POS_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] -= IMM_OFF; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_POS_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)]; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRH_POS_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)]; return MMU_aluMemAccessCycles(2,adr); } //----------------------------------------------------------------------------- // LDRSH //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRSH_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_PRE_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_PRE_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_PRE_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_PRE_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_POS_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_POS_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_POS_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSH_POS_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // LDRSB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRSB_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_PRE_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_PRE_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_PRE_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_PRE_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_POS_INDE_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_POS_INDE_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= IMM_OFF; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_POS_INDE_P_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRSB_POS_INDE_M_REG_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)]; cpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr)); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // MRS / MSR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_MRS_CPSR(const u32 i) { cpu->R[REG_POS(i,12)] = cpu->CPSR.val; return 1; } TEMPLATE static u32 FASTCALL OP_MRS_SPSR(const u32 i) { cpu->R[REG_POS(i,12)] = cpu->SPSR.val; return 1; } #define OP_MSR_CPSR_(operand) \ u32 byte_mask = (cpu->CPSR.bits.mode == USR)?(BIT19(i)?0xFF000000:0x00000000): \ (BIT16(i)?0x000000FF:0x00000000) | \ (BIT17(i)?0x0000FF00:0x00000000) | \ (BIT18(i)?0x00FF0000:0x00000000) | \ (BIT19(i)?0xFF000000:0x00000000); \ if(cpu->CPSR.bits.mode != USR && BIT16(i)) \ { armcpu_switchMode(cpu, operand & 0x1F); } \ cpu->CPSR.val = (cpu->CPSR.val & ~byte_mask) | (operand & byte_mask); \ cpu->changeCPSR(); #define OP_MSR_SPSR_(operand) \ if(cpu->CPSR.bits.mode == USR || cpu->CPSR.bits.mode == SYS) return 1; \ u32 byte_mask = (BIT16(i)?0x000000FF:0x00000000) | \ (BIT17(i)?0x0000FF00:0x00000000) | \ (BIT18(i)?0x00FF0000:0x00000000) | \ (BIT19(i)?0xFF000000:0x00000000); \ cpu->SPSR.val = (cpu->SPSR.val & ~byte_mask) | (operand & byte_mask); \ cpu->changeCPSR(); //#define __NEW_MSR #ifdef __NEW_MSR #define v4T_UNALLOC_MASK 0x0FFFFF00 #define v4T_USER_MASK 0xF0000000 #define v4T_PRIV_MASK 0x0000000F #define v4T_STATE_MASK 0x00000020 #define v5TE_UNALLOC_MASK 0x07FFFF00 #define v5TE_USER_MASK 0xF8000000 #define v5TE_PRIV_MASK 0x0000000F #define v5TE_STATE_MASK 0x00000020 #endif TEMPLATE static u32 FASTCALL OP_MSR_CPSR(const u32 i) { u32 operand = cpu->R[REG_POS(i,0)]; #ifdef __NEW_MSR u32 mask = 0; u32 byte_mask = (BIT16(i)?0x000000FF:0x00000000) | (BIT17(i)?0x0000FF00:0x00000000) | (BIT18(i)?0x00FF0000:0x00000000) | (BIT19(i)?0xFF000000:0x00000000); const u32 unallocMask = PROCNUM?v4T_UNALLOC_MASK: v5TE_UNALLOC_MASK; const u32 userMask = PROCNUM?v4T_USER_MASK : v5TE_USER_MASK; const u32 privMask = PROCNUM?v4T_PRIV_MASK : v5TE_PRIV_MASK; const u32 stateMask = PROCNUM?v4T_STATE_MASK : v5TE_STATE_MASK; if ((operand & unallocMask) != 0) printf("ARM%c: MSR_CPSR_REG UNPREDICTABLE UNALLOC (operand %08X)\n", PROCNUM?'7':'9', operand); if (cpu->CPSR.bits.mode != USR) // Privileged mode { if (BIT16(i)) armcpu_switchMode(cpu, operand & 0x1F); if ((operand & stateMask) != 0) printf("ARM%c: MSR_CPSR_REG UNPREDICTABLE STATE (operand %08X)\n", PROCNUM?'7':'9', operand); else mask = byte_mask & (userMask | privMask); } else mask = byte_mask & userMask; u32 new_val = ((cpu->CPSR.val & (~mask)) | (operand & mask)); cpu->CPSR.val = ((cpu->CPSR.val & (~mask)) | (operand & mask)); cpu->changeCPSR(); #else OP_MSR_CPSR_(operand); #endif return 1; } TEMPLATE static u32 FASTCALL OP_MSR_SPSR(const u32 i) { //printf("OP_MSR_SPSR\n"); u32 operand = cpu->R[REG_POS(i,0)]; OP_MSR_SPSR_(operand); return 1; } TEMPLATE static u32 FASTCALL OP_MSR_CPSR_IMM_VAL(const u32 i) { //printf("OP_MSR_CPSR_IMM_VAL\n"); IMM_VALUE; OP_MSR_CPSR_(shift_op); return 1; } TEMPLATE static u32 FASTCALL OP_MSR_SPSR_IMM_VAL(const u32 i) { //printf("OP_MSR_SPSR_IMM_VAL\n"); IMM_VALUE; OP_MSR_SPSR_(shift_op); return 1; } //----------------------------------------------------------------------------- // Branch //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_BX(const u32 i) { u32 tmp = cpu->R[REG_POS(i, 0)]; if (REG_POS(i, 0) == 15) { //printf("ARM%c: BX using PC as operand\n", PROCNUM?'7':'9'); //emu_halt(); } cpu->CPSR.bits.T = BIT0(tmp); cpu->R[15] = tmp & (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; return 3; } TEMPLATE static u32 FASTCALL OP_BLX_REG(const u32 i) { u32 tmp = cpu->R[REG_POS(i, 0)]; cpu->R[14] = cpu->next_instruction; cpu->CPSR.bits.T = BIT0(tmp); cpu->R[15] = tmp & (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; return 3; } #define SIGNEXTEND_24(i) (((s32)i<<8)>>8) TEMPLATE static u32 FASTCALL OP_B(const u32 i) { static const u32 mov_r12_r12 = 0xE1A0C00C; const u32 last = _MMU_read32(cpu->instruct_adr-4); if(last == mov_r12_r12) { const u32 next = _MMU_read16(cpu->instruct_adr+4); if(next == 0x6464) NocashMessage(cpu, 8); } u32 off = SIGNEXTEND_24(i); if(CONDITION(i)==0xF) { cpu->R[14] = cpu->next_instruction; cpu->CPSR.bits.T = 1; } cpu->R[15] += (off<<2); cpu->R[15] &= (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; return 3; } TEMPLATE static u32 FASTCALL OP_BL(const u32 i) { u32 off = SIGNEXTEND_24(i); if(CONDITION(i)==0xF) { cpu->CPSR.bits.T = 1; cpu->R[15] += 2; } cpu->R[14] = cpu->next_instruction; cpu->R[15] += (off<<2); cpu->R[15] &= (0xFFFFFFFC|(cpu->CPSR.bits.T<<1)); cpu->next_instruction = cpu->R[15]; return 3; } //----------------------------------------------------------------------------- // CLZ //----------------------------------------------------------------------------- const u8 CLZ_TAB[16]= { 0, // 0000 1, // 0001 2, 2, // 001X 3, 3, 3, 3, // 01XX 4, 4, 4, 4, 4, 4, 4, 4 // 1XXX }; TEMPLATE static u32 FASTCALL OP_CLZ(const u32 i) { u32 Rm = cpu->R[REG_POS(i,0)]; u32 pos; if(Rm==0) { cpu->R[REG_POS(i,12)]=32; return 2; } Rm |= (Rm >>1); Rm |= (Rm >>2); Rm |= (Rm >>4); Rm |= (Rm >>8); Rm |= (Rm >>16); pos = CLZ_TAB[Rm&0xF] + CLZ_TAB[(Rm>>4)&0xF] + CLZ_TAB[(Rm>>8)&0xF] + CLZ_TAB[(Rm>>12)&0xF] + CLZ_TAB[(Rm>>16)&0xF] + CLZ_TAB[(Rm>>20)&0xF] + CLZ_TAB[(Rm>>24)&0xF] + CLZ_TAB[(Rm>>28)&0xF]; cpu->R[REG_POS(i,12)]=32 - pos; return 2; } //----------------------------------------------------------------------------- // QADD / QDADD / QSUB / QDSUB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_QADD(const u32 i) { u32 res = cpu->R[REG_POS(i,16)]+cpu->R[REG_POS(i,0)]; //LOG("spe add\n"); if(SIGNED_OVERFLOW(cpu->R[REG_POS(i,16)],cpu->R[REG_POS(i,0)], res)) { cpu->CPSR.bits.Q=1; cpu->R[REG_POS(i,12)]=0x80000000-BIT31(res); return 2; } cpu->R[REG_POS(i,12)]=res; if(REG_POS(i,12)==15) { cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; return 3; } return 2; } TEMPLATE static u32 FASTCALL OP_QSUB(const u32 i) { u32 res = cpu->R[REG_POS(i,0)]-cpu->R[REG_POS(i,16)]; //LOG("spe add\n"); if(SIGNED_UNDERFLOW(cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,16)], res)) { cpu->CPSR.bits.Q=1; cpu->R[REG_POS(i,12)]=0x80000000-BIT31(res); return 2; } cpu->R[REG_POS(i,12)]=res; if(REG_POS(i,12)==15) { cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; return 3; } return 2; } TEMPLATE static u32 FASTCALL OP_QDADD(const u32 i) { u32 mul = cpu->R[REG_POS(i,16)]<<1; u32 res; //LOG("spe add\n"); if(BIT31(cpu->R[REG_POS(i,16)])!=BIT31(mul)) { cpu->CPSR.bits.Q=1; mul = 0x80000000-BIT31(mul); } res = mul + cpu->R[REG_POS(i,0)]; if(SIGNED_OVERFLOW(cpu->R[REG_POS(i,0)],mul, res)) { cpu->CPSR.bits.Q=1; cpu->R[REG_POS(i,12)]=0x80000000-BIT31(res); return 2; } cpu->R[REG_POS(i,12)]=res; if(REG_POS(i,12)==15) { cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; return 3; } return 2; } TEMPLATE static u32 FASTCALL OP_QDSUB(const u32 i) { u32 mul = cpu->R[REG_POS(i,16)]<<1; u32 res; //LOG("spe add\n"); if(BIT31(cpu->R[REG_POS(i,16)])!=BIT31(mul)) { cpu->CPSR.bits.Q=1; mul = 0x80000000-BIT31(mul); } res = cpu->R[REG_POS(i,0)] - mul; if(SIGNED_UNDERFLOW(cpu->R[REG_POS(i,0)], mul, res)) { cpu->CPSR.bits.Q=1; cpu->R[REG_POS(i,12)]=0x80000000-BIT31(res); return 2; } cpu->R[REG_POS(i,12)]=res; if(REG_POS(i,12)==15) { cpu->R[15] &= 0xFFFFFFFC; cpu->next_instruction = cpu->R[15]; return 3; } return 2; } //----------------------------------------------------------------------------- // SMUL //----------------------------------------------------------------------------- #define HWORD(i) ((s32)(((s32)(i))>>16)) #define LWORD(i) (s32)(((s32)((i)<<16))>>16) TEMPLATE static u32 FASTCALL OP_SMUL_B_B(const u32 i) { // checked //INFO("SMUL_B_B\n"); cpu->R[REG_POS(i,16)] = (u32)(LWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)])); return 2; } TEMPLATE static u32 FASTCALL OP_SMUL_B_T(const u32 i) { //INFO("SMUL_B_T\n"); cpu->R[REG_POS(i,16)] = (u32)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); return 2; } TEMPLATE static u32 FASTCALL OP_SMUL_T_B(const u32 i) { //INFO("SMUL_T_B\n"); cpu->R[REG_POS(i,16)] = (u32)(HWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)])); return 2; } TEMPLATE static u32 FASTCALL OP_SMUL_T_T(const u32 i) { //INFO("SMUL_T_T\n"); cpu->R[REG_POS(i,16)] = (u32)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); return 2; } //----------------------------------------------------------------------------- // SMLA //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SMLA_B_B(const u32 i) { u32 tmp = (u32)((s16)cpu->R[REG_POS(i,0)]* (s16)cpu->R[REG_POS(i,8)]); cpu->R[REG_POS(i,16)] = tmp + cpu->R[REG_POS(i,12)]; if (OverflowFromADD(cpu->R[REG_POS(i,16)], tmp, cpu->R[REG_POS(i,12)])) cpu->CPSR.bits.Q = 1; //INFO("SMLABB %08X * %08X + %08X = %08X\n", (s16)cpu->R[REG_POS(i,0)], (s16)cpu->R[REG_POS(i,8)], cpu->R[REG_POS(i,12)], (s32)cpu->R[REG_POS(i,16)]); return 2; } TEMPLATE static u32 FASTCALL OP_SMLA_B_T(const u32 i) { u32 tmp = (u32)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLABT R%d:%08X * R%d:%08X + R%d:%08X = %08X\n", REG_POS(i,0), cpu->R[REG_POS(i,0)], REG_POS(i,8), cpu->R[REG_POS(i,8)], REG_POS(i,12), a, tmp + a); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } TEMPLATE static u32 FASTCALL OP_SMLA_T_B(const u32 i) { u32 tmp = (u32)(HWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)])); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLATB %08X * %08X + %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, tmp + a); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } TEMPLATE static u32 FASTCALL OP_SMLA_T_T(const u32 i) { u32 tmp = (u32)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLATT %08X * %08X + %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, tmp + a); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } //----------------------------------------------------------------------------- // SMLAL //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SMLAL_B_B(const u32 i) { s64 tmp = (s64)(LWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)])); u64 res = (u64)tmp + cpu->R[REG_POS(i,12)]; //INFO("SMLALBB %08X * %08X + %08X%08X = %08X%08X\n", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + (res + ((tmp<0)*0xFFFFFFFF))), (int)(u32) res); cpu->R[REG_POS(i,12)] = (u32) res; cpu->R[REG_POS(i,16)] += (res + ((tmp<0)*0xFFFFFFFF)); return 2; } TEMPLATE static u32 FASTCALL OP_SMLAL_B_T(const u32 i) { s64 tmp = (s64)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); u64 res = (u64)tmp + cpu->R[REG_POS(i,12)]; //INFO("SMLALBT %08X * %08X + %08X%08X = %08X%08X\n", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res); cpu->R[REG_POS(i,12)] = (u32) res; cpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF); return 2; } TEMPLATE static u32 FASTCALL OP_SMLAL_T_B(const u32 i) { s64 tmp = (s64)(HWORD(cpu->R[REG_POS(i,0)])* (s64)LWORD(cpu->R[REG_POS(i,8)])); u64 res = (u64)tmp + cpu->R[REG_POS(i,12)]; //INFO("SMLALTB %08X * %08X + %08X%08X = %08X%08X\n", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res); cpu->R[REG_POS(i,12)] = (u32) res; cpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF); return 2; } TEMPLATE static u32 FASTCALL OP_SMLAL_T_T(const u32 i) { s64 tmp = (s64)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)])); u64 res = (u64)tmp + cpu->R[REG_POS(i,12)]; //INFO("SMLALTT %08X * %08X + %08X%08X = %08X%08X\n", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res); cpu->R[REG_POS(i,12)] = (u32) res; cpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF); return 2; } //----------------------------------------------------------------------------- // SMULW //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SMULW_B(const u32 i) { s64 tmp = (s64)LWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]); //INFO("SMULWB %08X * %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], ((tmp>>16)&0xFFFFFFFF)); cpu->R[REG_POS(i,16)] = ((tmp>>16)&0xFFFFFFFF); return 2; } TEMPLATE static u32 FASTCALL OP_SMULW_T(const u32 i) { s64 tmp = (s64)HWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]); //INFO("SMULWT %08X * %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], ((tmp>>16)&0xFFFFFFFF)); cpu->R[REG_POS(i,16)] = ((tmp>>16)&0xFFFFFFFF); return 2; } //----------------------------------------------------------------------------- // SMLAW //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SMLAW_B(const u32 i) { s64 tmp = (s64)LWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLAWB %08X * %08X + %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, (tmp>>16) + a); tmp = (tmp>>16); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW((u32)tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } TEMPLATE static u32 FASTCALL OP_SMLAW_T(const u32 i) { s64 tmp = (s64)HWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]); u32 a = cpu->R[REG_POS(i,12)]; //INFO("SMLAWT %08X * %08X + %08X = %08X\n", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, ((tmp>>16)&0xFFFFFFFF) + a); tmp = ((tmp>>16)&0xFFFFFFFF); cpu->R[REG_POS(i,16)] = tmp + a; if(SIGNED_OVERFLOW((u32)tmp, a, cpu->R[REG_POS(i,16)])) cpu->CPSR.bits.Q = 1; return 2; } //----------------------------------------------------------------------------- // LDR //----------------------------------------------------------------------------- #define OP_LDR(a, b) \ cpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \ \ if(REG_POS(i,12)==15) \ { \ if (PROCNUM == 0) \ { \ cpu->CPSR.bits.T = BIT0(cpu->R[15]); \ cpu->R[15] &= 0xFFFFFFFE; \ } \ else \ { \ cpu->R[15] &= 0xFFFFFFFC; \ } \ cpu->next_instruction = cpu->R[15]; \ return MMU_aluMemAccessCycles(b,adr); \ } \ \ return MMU_aluMemAccessCycles(a,adr); // PRE #define OP_LDR_W(a, b) \ cpu->R[REG_POS(i,16)] = adr;\ cpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \ \ if(REG_POS(i,12)==15) \ { \ if (PROCNUM == 0) \ { \ cpu->CPSR.bits.T = BIT0(cpu->R[15]); \ cpu->R[15] &= 0xFFFFFFFE; \ } \ else \ { \ cpu->R[15] &= 0xFFFFFFFC; \ } \ cpu->next_instruction = cpu->R[15]; \ return MMU_aluMemAccessCycles(b,adr); \ } \ \ return MMU_aluMemAccessCycles(a,adr); // POST #define OP_LDR_W2(a, b, c) \ u32 adr = cpu->R[REG_POS(i,16)]; \ cpu->R[REG_POS(i,16)] = adr + c;\ cpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \ \ if(REG_POS(i,12)==15) \ { \ if (PROCNUM == 0) \ { \ cpu->CPSR.bits.T = BIT0(cpu->R[15]); \ cpu->R[15] &= 0xFFFFFFFE; \ } \ else \ { \ cpu->R[15] &= 0xFFFFFFFC; \ } \ cpu->next_instruction = cpu->R[15]; \ return MMU_aluMemAccessCycles(b,adr); \ } \ \ return MMU_aluMemAccessCycles(a,adr); TEMPLATE static u32 FASTCALL OP_LDR_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_M_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; OP_LDR_W(3, 5); } TEMPLATE static u32 FASTCALL OP_LDR_P_IMM_OFF_POSTIND(const u32 i) { OP_LDR_W2(3, 5, IMM_OFF_12); } TEMPLATE static u32 FASTCALL OP_LDR_M_IMM_OFF_POSTIND(const u32 i) { OP_LDR_W2(3, 5, -IMM_OFF_12); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; OP_LDR_W2(3, 5, shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; OP_LDR_W2(3, 5, -shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_P_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; OP_LDR_W2(3, 5, shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_M_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; OP_LDR_W2(3, 5, -shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_P_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; OP_LDR_W2(3, 5, shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_M_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; OP_LDR_W2(3, 5, -shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_P_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; OP_LDR_W2(3, 5, shift_op); } TEMPLATE static u32 FASTCALL OP_LDR_M_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; OP_LDR_W2(3, 5, -shift_op); } //----------------------------------------------------------------------------- // LDREX //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDREX(const u32 i) { printf("LDREX\n"); u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // LDRB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRB_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);; return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,12)] = READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);; return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + IMM_OFF_12; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - IMM_OFF_12; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr + shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } TEMPLATE static u32 FASTCALL OP_LDRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; cpu->R[REG_POS(i,16)] = adr - shift_op; cpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } //----------------------------------------------------------------------------- // STR //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STR_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + IMM_OFF_12; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - IMM_OFF_12; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_P_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STR_M_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } //----------------------------------------------------------------------------- // STREX //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STREX(const u32 i) { printf("STREX\n"); u32 adr = cpu->R[REG_POS(i,16)]; WRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,0)]); cpu->R[REG_POS(i,12)] = 0; return MMU_aluMemAccessCycles(2,adr); } //----------------------------------------------------------------------------- // STRB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STRB_P_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_IMM_OFF(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSL_IMM_OFF(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSR_IMM_OFF(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ASR_IMM_OFF(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ROR_IMM_OFF(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_IMM_OFF_PREIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSL_IMM_OFF_PREIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSR_IMM_OFF_PREIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ASR_IMM_OFF_PREIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] + shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ROR_IMM_OFF_PREIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)] - shift_op; cpu->R[REG_POS(i,16)] = adr; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + IMM_OFF_12; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_IMM_OFF_POSTIND(const u32 i) { u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - IMM_OFF_12; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { LSL_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { LSR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { ASR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr + shift_op; return MMU_aluMemAccessCycles(2,adr); } TEMPLATE static u32 FASTCALL OP_STRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { ROR_IMM; u32 adr = cpu->R[REG_POS(i,16)]; WRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]); cpu->R[REG_POS(i,16)] = adr - shift_op; return MMU_aluMemAccessCycles(2,adr); } //----------------------------------------------------------------------------- // LDMIA / LDMIB / LDMDA / LDMDB //----------------------------------------------------------------------------- #define OP_L_IA(reg, adr) if(BIT##reg(i)) \ { \ registres[reg] = READ32(cpu->mem_if->data, start); \ c += MMU_memAccessCycles(start); \ adr += 4; \ } #define OP_L_IB(reg, adr) if(BIT##reg(i)) \ { \ adr += 4; \ registres[reg] = READ32(cpu->mem_if->data, start); \ c += MMU_memAccessCycles(start); \ } #define OP_L_DA(reg, adr) if(BIT##reg(i)) \ { \ registres[reg] = READ32(cpu->mem_if->data, start); \ c += MMU_memAccessCycles(start); \ adr -= 4; \ } #define OP_L_DB(reg, adr) if(BIT##reg(i)) \ { \ adr -= 4; \ registres[reg] = READ32(cpu->mem_if->data, start); \ c += MMU_memAccessCycles(start); \ } TEMPLATE static u32 FASTCALL OP_LDMIA(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres = cpu->R; OP_L_IA(0, start); OP_L_IA(1, start); OP_L_IA(2, start); OP_L_IA(3, start); OP_L_IA(4, start); OP_L_IA(5, start); OP_L_IA(6, start); OP_L_IA(7, start); OP_L_IA(8, start); OP_L_IA(9, start); OP_L_IA(10, start); OP_L_IA(11, start); OP_L_IA(12, start); OP_L_IA(13, start); OP_L_IA(14, start); if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); // TODO // The general-purpose registers loaded can include the PC. If they do, the word loaded for the PC is treated // as an address and a branch occurs to that address. In ARMv5 and above, bit[0] of the loaded value // determines whether execution continues after this branch in ARM state or in Thumb state, as though a BX // (loaded_value) instruction had been executed (but see also The T and J bits on page A2-15 for operation on // non-T variants of ARMv5). In earlier versions of the architecture, bits[1:0] of the loaded value are ignored // and execution continues in ARM state, as though the instruction MOV PC,(loaded_value) had been executed. // //value = Memory[address,4] //if (architecture version 5 or above) then // pc = value AND 0xFFFFFFFE // T Bit = value[0] //else // pc = value AND 0xFFFFFFFC if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; //start += 4; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIB(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres = cpu->R; OP_L_IB(0, start); OP_L_IB(1, start); OP_L_IB(2, start); OP_L_IB(3, start); OP_L_IB(4, start); OP_L_IB(5, start); OP_L_IB(6, start); OP_L_IB(7, start); OP_L_IB(8, start); OP_L_IB(9, start); OP_L_IB(10, start); OP_L_IB(11, start); OP_L_IB(12, start); OP_L_IB(13, start); OP_L_IB(14, start); if(BIT15(i)) { start += 4; c += MMU_memAccessCycles(start); u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; return MMU_aluMemCycles(4, c); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDA(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres = cpu->R; if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; } OP_L_DA(14, start); OP_L_DA(13, start); OP_L_DA(12, start); OP_L_DA(11, start); OP_L_DA(10, start); OP_L_DA(9, start); OP_L_DA(8, start); OP_L_DA(7, start); OP_L_DA(6, start); OP_L_DA(5, start); OP_L_DA(4, start); OP_L_DA(3, start); OP_L_DA(2, start); OP_L_DA(1, start); OP_L_DA(0, start); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDB(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres = cpu->R; if(BIT15(i)) { start -= 4; u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } OP_L_DB(14, start); OP_L_DB(13, start); OP_L_DB(12, start); OP_L_DB(11, start); OP_L_DB(10, start); OP_L_DB(9, start); OP_L_DB(8, start); OP_L_DB(7, start); OP_L_DB(6, start); OP_L_DB(5, start); OP_L_DB(4, start); OP_L_DB(3, start); OP_L_DB(2, start); OP_L_DB(1, start); OP_L_DB(0, start); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIA_W(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; u32 * registres = cpu->R; OP_L_IA(0, start); OP_L_IA(1, start); OP_L_IA(2, start); OP_L_IA(3, start); OP_L_IA(4, start); OP_L_IA(5, start); OP_L_IA(6, start); OP_L_IA(7, start); OP_L_IA(8, start); OP_L_IA(9, start); OP_L_IA(10, start); OP_L_IA(11, start); OP_L_IA(12, start); OP_L_IA(13, start); OP_L_IA(14, start); if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; c += MMU_memAccessCycles(start); start += 4; cpu->next_instruction = registres[15]; } if(i & (1 << REG_POS(i,16))) { if(i & bitList) cpu->R[REG_POS(i,16)] = start; } else cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(BIT15(i)?4:2, c); } TEMPLATE static u32 FASTCALL OP_LDMIB_W(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; u32 * registres = cpu->R; OP_L_IB(0, start); OP_L_IB(1, start); OP_L_IB(2, start); OP_L_IB(3, start); OP_L_IB(4, start); OP_L_IB(5, start); OP_L_IB(6, start); OP_L_IB(7, start); OP_L_IB(8, start); OP_L_IB(9, start); OP_L_IB(10, start); OP_L_IB(11, start); OP_L_IB(12, start); OP_L_IB(13, start); OP_L_IB(14, start); if(BIT15(i)) { u32 tmp; start += 4; c += MMU_memAccessCycles(start); tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; } if(i & (1 << REG_POS(i,16))) { if(i & bitList) cpu->R[REG_POS(i,16)] = start; } else cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(BIT15(i)?4:2, c); } TEMPLATE static u32 FASTCALL OP_LDMDA_W(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; u32 * registres = cpu->R; if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; } OP_L_DA(14, start); OP_L_DA(13, start); OP_L_DA(12, start); OP_L_DA(11, start); OP_L_DA(10, start); OP_L_DA(9, start); OP_L_DA(8, start); OP_L_DA(7, start); OP_L_DA(6, start); OP_L_DA(5, start); OP_L_DA(4, start); OP_L_DA(3, start); OP_L_DA(2, start); OP_L_DA(1, start); OP_L_DA(0, start); if(i & (1 << REG_POS(i,16))) { if(i & bitList) cpu->R[REG_POS(i,16)] = start; } else cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDB_W(const u32 i) { u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; u32 * registres = cpu->R; if(BIT15(i)) { u32 tmp; start -= 4; tmp = READ32(cpu->mem_if->data, start); if (PROCNUM == 0) { cpu->CPSR.bits.T = BIT0(tmp); registres[15] = tmp & 0xFFFFFFFE; } else registres[15] = tmp & 0xFFFFFFFC; cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } OP_L_DB(14, start); OP_L_DB(13, start); OP_L_DB(12, start); OP_L_DB(11, start); OP_L_DB(10, start); OP_L_DB(9, start); OP_L_DB(8, start); OP_L_DB(7, start); OP_L_DB(6, start); OP_L_DB(5, start); OP_L_DB(4, start); OP_L_DB(3, start); OP_L_DB(2, start); OP_L_DB(1, start); OP_L_DB(0, start); if(i & (1 << REG_POS(i,16))) { if(i & bitList) cpu->R[REG_POS(i,16)] = start; } else cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIA2(const u32 i) { u32 oldmode = 0; u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; OP_L_IA(0, start); OP_L_IA(1, start); OP_L_IA(2, start); OP_L_IA(3, start); OP_L_IA(4, start); OP_L_IA(5, start); OP_L_IA(6, start); OP_L_IA(7, start); OP_L_IA(8, start); OP_L_IA(9, start); OP_L_IA(10, start); OP_L_IA(11, start); OP_L_IA(12, start); OP_L_IA(13, start); OP_L_IA(14, start); if(BIT15(i) == 0) { armcpu_switchMode(cpu, oldmode); } else { u32 tmp = READ32(cpu->mem_if->data, start); Status_Reg SPSR; cpu->R[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); //start += 4; cpu->next_instruction = cpu->R[15]; c += MMU_memAccessCycles(start); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIB2(const u32 i) { u32 oldmode = 0; u32 c = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; UNTESTEDOPCODELOG("Untested opcode: OP_LDMIB2 \n"); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; OP_L_IB(0, start); OP_L_IB(1, start); OP_L_IB(2, start); OP_L_IB(3, start); OP_L_IB(4, start); OP_L_IB(5, start); OP_L_IB(6, start); OP_L_IB(7, start); OP_L_IB(8, start); OP_L_IB(9, start); OP_L_IB(10, start); OP_L_IB(11, start); OP_L_IB(12, start); OP_L_IB(13, start); OP_L_IB(14, start); if(BIT15(i) == 0) { armcpu_switchMode(cpu, oldmode); } else { u32 tmp; Status_Reg SPSR; start += 4; tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDA2(const u32 i) { u32 oldmode = 0; u32 c = 0; u32 * registres; u32 start = cpu->R[REG_POS(i,16)]; UNTESTEDOPCODELOG("Untested opcode: OP_LDMDA2 \n"); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; if(BIT15(i)) { u32 tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); cpu->CPSR = cpu->SPSR; cpu->changeCPSR(); c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; } OP_L_DA(14, start); OP_L_DA(13, start); OP_L_DA(12, start); OP_L_DA(11, start); OP_L_DA(10, start); OP_L_DA(9, start); OP_L_DA(8, start); OP_L_DA(7, start); OP_L_DA(6, start); OP_L_DA(5, start); OP_L_DA(4, start); OP_L_DA(3, start); OP_L_DA(2, start); OP_L_DA(1, start); OP_L_DA(0, start); if(BIT15(i)==0) { armcpu_switchMode(cpu, oldmode); } else { Status_Reg SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDB2(const u32 i) { u32 oldmode = 0; u32 c = 0; u32 * registres; u32 start = cpu->R[REG_POS(i,16)]; if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; if(BIT15(i)) { u32 tmp; start -= 4; tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); cpu->CPSR = cpu->SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); } OP_L_DB(14, start); OP_L_DB(13, start); OP_L_DB(12, start); OP_L_DB(11, start); OP_L_DB(10, start); OP_L_DB(9, start); OP_L_DB(8, start); OP_L_DB(7, start); OP_L_DB(6, start); OP_L_DB(5, start); OP_L_DB(4, start); OP_L_DB(3, start); OP_L_DB(2, start); OP_L_DB(1, start); OP_L_DB(0, start); if(BIT15(i)==0) { armcpu_switchMode(cpu, oldmode); } else { Status_Reg SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); } return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIA2_W(const u32 i) { u32 c = 0; u32 oldmode = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; u32 tmp; Status_Reg SPSR; // emu_halt(); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; OP_L_IA(0, start); OP_L_IA(1, start); OP_L_IA(2, start); OP_L_IA(3, start); OP_L_IA(4, start); OP_L_IA(5, start); OP_L_IA(6, start); OP_L_IA(7, start); OP_L_IA(8, start); OP_L_IA(9, start); OP_L_IA(10, start); OP_L_IA(11, start); OP_L_IA(12, start); OP_L_IA(13, start); OP_L_IA(14, start); if(BIT15(i)==0) { if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(2, c); } if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start + 4; tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; c += MMU_memAccessCycles(start); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMIB2_W(const u32 i) { u32 c = 0; u32 oldmode = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; u32 tmp; Status_Reg SPSR; if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; OP_L_IB(0, start); OP_L_IB(1, start); OP_L_IB(2, start); OP_L_IB(3, start); OP_L_IB(4, start); OP_L_IB(5, start); OP_L_IB(6, start); OP_L_IB(7, start); OP_L_IB(8, start); OP_L_IB(9, start); OP_L_IB(10, start); OP_L_IB(11, start); OP_L_IB(12, start); OP_L_IB(13, start); OP_L_IB(14, start); if(BIT15(i)==0) { if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(2, c); } if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start + 4; tmp = READ32(cpu->mem_if->data, start + 4); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); cpu->CPSR = cpu->SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); c += MMU_memAccessCycles(start); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDA2_W(const u32 i) { u32 c = 0; u32 oldmode = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; Status_Reg SPSR; // emu_halt(); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; if(BIT15(i)) { if (BIT_N(i, REG_POS(i,16))) printf("error1_1\n"); u32 tmp = READ32(cpu->mem_if->data, start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); c += MMU_memAccessCycles(start); start -= 4; cpu->next_instruction = registres[15]; } OP_L_DA(14, start); OP_L_DA(13, start); OP_L_DA(12, start); OP_L_DA(11, start); OP_L_DA(10, start); OP_L_DA(9, start); OP_L_DA(8, start); OP_L_DA(7, start); OP_L_DA(6, start); OP_L_DA(5, start); OP_L_DA(4, start); OP_L_DA(3, start); OP_L_DA(2, start); OP_L_DA(1, start); OP_L_DA(0, start); if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start; if(BIT15(i)==0) { armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(2, c); } SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); return MMU_aluMemCycles(2, c); } TEMPLATE static u32 FASTCALL OP_LDMDB2_W(const u32 i) { u32 c = 0; u32 oldmode = 0; u32 start = cpu->R[REG_POS(i,16)]; u32 * registres; Status_Reg SPSR; // emu_halt(); if(BIT15(i)==0) { if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } oldmode = armcpu_switchMode(cpu, SYS); } registres = cpu->R; if(BIT15(i)) { if (BIT_N(i, REG_POS(i,16))) printf("error1_2\n"); u32 tmp; start -= 4; tmp = READ32(cpu->mem_if->data, start); c += MMU_memAccessCycles(start); registres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1)); cpu->CPSR = cpu->SPSR; cpu->changeCPSR(); cpu->next_instruction = registres[15]; } OP_L_DB(14, start); OP_L_DB(13, start); OP_L_DB(12, start); OP_L_DB(11, start); OP_L_DB(10, start); OP_L_DB(9, start); OP_L_DB(8, start); OP_L_DB(7, start); OP_L_DB(6, start); OP_L_DB(5, start); OP_L_DB(4, start); OP_L_DB(3, start); OP_L_DB(2, start); OP_L_DB(1, start); OP_L_DB(0, start); if (!BIT_N(i, REG_POS(i,16))) registres[REG_POS(i,16)] = start; if(BIT15(i)==0) { armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(2, c); } SPSR = cpu->SPSR; armcpu_switchMode(cpu, SPSR.bits.mode); cpu->CPSR=SPSR; cpu->changeCPSR(); return MMU_aluMemCycles(2, c); } //----------------------------------------------------------------------------- // STMIA / STMIB / STMDA / STMDB //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STMIA(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, b)) { WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); start += 4; } } return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIB(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, b)) { start += 4; WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); } } return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDA(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); start -= 4; } } return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDB(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { start -= 4; WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); } } return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIA_W(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, b)) { WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); start += 4; } } cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIB_W(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, b)) { start += 4; WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); } } cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDA_W(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); start -= 4; } } cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDB_W(const u32 i) { u32 c = 0, b; u32 start = cpu->R[REG_POS(i,16)]; for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { start -= 4; WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); } } cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIA2(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMIA2 \n"); for(b=0; b<16; b++) { if(BIT_N(i, b)) { WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); start += 4; } } armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIB2(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMIB2 \n"); for(b=0; b<16; b++) { if(BIT_N(i, b)) { start += 4; WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); } } armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDA2(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMDA2 \n"); for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); start -= 4; } } armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDB2(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c=0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { start -= 4; WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); } } armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIA2_W(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c=0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMIA2_W \n"); for(b=0; b<16; b++) { if(BIT_N(i, b)) { WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); start += 4; } } cpu->R[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMIB2_W(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c=0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); for(b=0; b<16; b++) { if(BIT_N(i, b)) { start += 4; WRITE32(cpu->mem_if->data, start, cpu->R[b]); c += MMU_memAccessCycles(start); } } armcpu_switchMode(cpu, oldmode); cpu->R[REG_POS(i,16)] = start; return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDA2_W(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMDA2_W \n"); for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); start -= 4; } } cpu->R[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } TEMPLATE static u32 FASTCALL OP_STMDB2_W(const u32 i) { u32 c, b; u32 start; u32 oldmode; if(cpu->CPSR.bits.mode==USR) return 2; c = 0; start = cpu->R[REG_POS(i,16)]; oldmode = armcpu_switchMode(cpu, SYS); UNTESTEDOPCODELOG("Untested opcode: OP_STMDB2_W \n"); for(b=0; b<16; b++) { if(BIT_N(i, 15-b)) { start -= 4; WRITE32(cpu->mem_if->data, start, cpu->R[15-b]); c += MMU_memAccessCycles(start); } } cpu->R[REG_POS(i,16)] = start; armcpu_switchMode(cpu, oldmode); return MMU_aluMemCycles(1, c); } //----------------------------------------------------------------------------- // LDRD / STRD //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDRD_STRD_POST_INDEX(const u32 i) { u32 Rd_num = REG_POS( i, 12); u32 addr = cpu->R[REG_POS(i,16)]; u32 index; //printf("%s POST\n", BIT5(i)?"STRD":"LDRD"); /* I bit - immediate or register */ if ( BIT22(i)) index = IMM_OFF; else index = cpu->R[REG_POS(i,0)]; // U bit - add or subtract if ( BIT23(i)) cpu->R[REG_POS(i,16)] += index; else cpu->R[REG_POS(i,16)] -= index; u32 c = 0; if ( !(Rd_num & 0x1)) { // Store/Load if ( BIT5(i)) { WRITE32(cpu->mem_if->data, addr, cpu->R[Rd_num]); WRITE32(cpu->mem_if->data, addr + 4, cpu->R[Rd_num + 1]); c += MMU_memAccessCycles(addr); c += MMU_memAccessCycles(addr + 4); } else { cpu->R[Rd_num] = READ32(cpu->mem_if->data, addr); cpu->R[Rd_num + 1] = READ32(cpu->mem_if->data, addr + 4); c += MMU_memAccessCycles(addr); c += MMU_memAccessCycles(addr + 4); } } return MMU_aluMemCycles(3, c); } TEMPLATE static u32 FASTCALL OP_LDRD_STRD_OFFSET_PRE_INDEX(const u32 i) { u32 Rd_num = REG_POS( i, 12); u32 addr = cpu->R[REG_POS(i,16)]; u32 index; //printf("%s PRE\n", BIT5(i)?"STRD":"LDRD"); // I bit - immediate or register if ( BIT22(i)) index = IMM_OFF; else index = cpu->R[REG_POS(i,0)]; // U bit - add or subtract if ( BIT23(i)) addr += index; else addr -= index; u32 c = 0; if ( !(Rd_num & 0x1)) { // Store/Load if ( BIT5(i)) { WRITE32(cpu->mem_if->data, addr, cpu->R[Rd_num]); WRITE32(cpu->mem_if->data, addr + 4, cpu->R[Rd_num + 1]); c += MMU_memAccessCycles(addr); c += MMU_memAccessCycles(addr + 4); // W bit - writeback if ( BIT21(i)) cpu->R[REG_POS(i,16)] = addr; } else { // W bit - writeback if ( BIT21(i)) cpu->R[REG_POS(i,16)] = addr; cpu->R[Rd_num] = READ32(cpu->mem_if->data, addr); cpu->R[Rd_num + 1] = READ32(cpu->mem_if->data, addr + 4); c += MMU_memAccessCycles(addr); c += MMU_memAccessCycles(addr + 4); } } return MMU_aluMemCycles(3, c); } //----------------------------------------------------------------------------- // STC // the NDS has no coproc that responses to a STC, no feedback is given to the arm //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_STC_P_IMM_OFF(const u32 i) { //INFO("OP_STC_P_IMM_OFF\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_M_IMM_OFF(const u32 i) { //INFO("OP_STC_M_IMM_OFF\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_P_PREIND(const u32 i) { //INFO("OP_STC_P_PREIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_M_PREIND(const u32 i) { //INFO("OP_STC_M_PREIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_P_POSTIND(const u32 i) { //INFO("OP_STC_P_POSTIND: cp_num %i\n", (i>>8)&0x0F); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_M_POSTIND(const u32 i) { //INFO("OP_STC_M_POSTIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_STC_OPTION(const u32 i) { //INFO("OP_STC_OPTION\n"); return TRAPUNDEF(cpu); } //----------------------------------------------------------------------------- // LDC // the NDS has no coproc that responses to a LDC, no feedback is given to the arm //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_LDC_P_IMM_OFF(const u32 i) { //INFO("OP_LDC_P_IMM_OFF\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_M_IMM_OFF(const u32 i) { //INFO("OP_LDC_M_IMM_OFF\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_P_PREIND(const u32 i) { //INFO("OP_LDC_P_PREIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_M_PREIND(const u32 i) { //INFO("OP_LDC_M_PREIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_P_POSTIND(const u32 i) { //INFO("OP_LDC_P_POSTIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_M_POSTIND(const u32 i) { //INFO("OP_LDC_M_POSTIND\n"); return TRAPUNDEF(cpu); } TEMPLATE static u32 FASTCALL OP_LDC_OPTION(const u32 i) { //INFO("OP_LDC_OPTION\n"); return TRAPUNDEF(cpu); } //----------------------------------------------------------------------------- // MCR / MRC //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_MCR(const u32 i) { u32 cpnum = REG_POS(i, 8); if(cpnum != 15) { //emu_halt(); //INFO("Stopped (OP_MCR) \n"); INFO("ARM%c: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\n", PROCNUM?'7':'9', cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } cp15.moveARM2CP(cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } TEMPLATE static u32 FASTCALL OP_MRC(const u32 i) { //if (PROCNUM != 0) return 1; u32 cpnum = REG_POS(i, 8); if(cpnum != 15) { //emu_halt(); //INFO("Stopped (OP_MRC) \n"); INFO("ARM%c: MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\n", PROCNUM?'7':'9', cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } // ARM REF: //data = value from Coprocessor[cp_num] //if Rd is R15 then // N flag = data[31] // Z flag = data[30] // C flag = data[29] // V flag = data[28] //else /* Rd is not R15 */ // Rd = data u32 data = 0; cp15.moveCP2ARM(&data, REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); if (REG_POS(i, 12) == 15) { cpu->CPSR.bits.N = BIT31(data); cpu->CPSR.bits.Z = BIT30(data); cpu->CPSR.bits.C = BIT29(data); cpu->CPSR.bits.V = BIT28(data); } else cpu->R[REG_POS(i, 12)] = data; //cpu->coproc[cpnum]->moveCP2ARM(&cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&7, (i>>5)&7); return 4; } //----------------------------------------------------------------------------- // SWI //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_SWI(const u32 i) { u32 swinum = (i>>16)&0xFF; //ideas-style debug prints (execute this SWI with the null terminated string address in R0) if(swinum==0xFC) { IdeasLog(cpu); return 0; } //if the user has changed the intVector to point away from the nds bioses, //then it doesn't really make any sense to use the builtin SWI's since //the bios ones aren't getting called anyway bool bypassBuiltinSWI = (cpu->intVector == 0x00000000 && PROCNUM==0) || (cpu->intVector == 0xFFFF0000 && PROCNUM==1); if(cpu->swi_tab && !bypassBuiltinSWI) { swinum &= 0x1F; //printf("%d ARM SWI %d \n",PROCNUM,swinum); return cpu->swi_tab[swinum]() + 3; } else { /* TODO (#1#): translocated SWI vectors */ /* we use an irq thats not in the irq tab, as it was replaced duie to a changed intVector */ Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, SVC); /* enter svc mode */ cpu->R[14] = cpu->next_instruction; cpu->SPSR = tmp; /* save old CPSR as new SPSR */ cpu->CPSR.bits.T = 0; /* handle as ARM32 code */ cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + 0x08; cpu->next_instruction = cpu->R[15]; return 3; } } //----------------------------------------------------------------------------- // BKPT //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_BKPT(const u32 i) { /* ARM-ref if (not overridden by debug hardware) R14_abt = address of BKPT instruction + 4 SPSR_abt = CPSR CPSR[4:0] = 0b10111 // Enter Abort mode CPSR[5] = 0 // Execute in ARM state // CPSR[6] is unchanged CPSR[7] = 1 // Disable normal interrupts CPSR[8] = 1 // Disable imprecise aborts - v6 only CPSR[9] = CP15_reg1_EEbit if high vectors configured then PC = 0xFFFF000C else PC = 0x0000000C */ /* static u32 last_bkpt = 0xFFFFFFFF; if(i != last_bkpt) printf("ARM OP_BKPT triggered\n"); last_bkpt = i; //this is not 100% correctly emulated, but it does the job cpu->next_instruction = cpu->instruct_adr; return 4; */ printf("ARM OP_BKPT triggered\n"); Status_Reg tmp = cpu->CPSR; armcpu_switchMode(cpu, ABT); // enter abt mode cpu->R[14] = cpu->instruct_adr + 4; cpu->SPSR = tmp; // save old CPSR as new SPSR cpu->CPSR.bits.T = 0; // handle as ARM32 code cpu->CPSR.bits.I = 1; cpu->changeCPSR(); cpu->R[15] = cpu->intVector + 0x0C; cpu->next_instruction = cpu->R[15]; return 4; } //----------------------------------------------------------------------------- // CDP //----------------------------------------------------------------------------- TEMPLATE static u32 FASTCALL OP_CDP(const u32 i) { //INFO("Stopped (OP_CDP) \n"); return TRAPUNDEF(cpu); } //----------------------------------------------------------------------------- // The End //----------------------------------------------------------------------------- const OpFunc arm_instructions_set[2][4096] = {{ #define TABDECL(x) x<0> #include "instruction_tabdef.inc" #undef TABDECL },{ #define TABDECL(x) x<1> #include "instruction_tabdef.inc" #undef TABDECL }}; #define TABDECL(x) #x const char* arm_instruction_names[4096] = { #include "instruction_tabdef.inc" }; #undef TABDECL desmume-0.9.9/src/arm_jit.cpp0000644000175000017500000044030712140261633016650 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2011 Loren Merritt Copyright (C) 2012 DeSmuME team This file 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 3 of the License, or (at your option) any later version. This file 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 the this software. If not, see . */ #include "types.h" #ifdef HAVE_JIT #if !defined(__x86_64__) && !defined(__LP64) && !defined(__IA64__) && !defined(_M_X64) && !defined(_WIN64) && !defined(_M_IX86) && !defined(__INTEL__) && !defined(__i386__) #error "ERROR: JIT compiler - unsupported target platform" #endif #ifdef _WINDOWS // **** Windows port #else #include #include #include #include #define HAVE_STATIC_CODE_BUFFER #endif #include "instructions.h" #include "instruction_attributes.h" #include "Disassembler.h" #include "MMU.h" #include "MMU_timing.h" #include "utils/AsmJit/AsmJit.h" #include "arm_jit.h" #include "bios.h" #define LOG_JIT_LEVEL 0 #define PROFILER_JIT_LEVEL 0 #if (PROFILER_JIT_LEVEL > 0) #include #endif using namespace AsmJit; #if (LOG_JIT_LEVEL > 0) #define LOG_JIT 1 #define JIT_COMMENT(...) c.comment(__VA_ARGS__) #define printJIT(buf, val) { \ JIT_COMMENT("printJIT(\""##buf"\", val);"); \ GpVar txt = c.newGpVar(kX86VarTypeGpz); \ GpVar data = c.newGpVar(kX86VarTypeGpz); \ GpVar io = c.newGpVar(kX86VarTypeGpd); \ c.lea(io, dword_ptr_abs(stdout)); \ c.lea(txt, dword_ptr_abs(&buf)); \ c.mov(data, *(GpVar*)&val); \ X86CompilerFuncCall* prn = c.call((uintptr_t)fprintf); \ prn->setPrototype(ASMJIT_CALL_CONV, FuncBuilder3()); \ prn->setArgument(0, io); \ prn->setArgument(1, txt); \ prn->setArgument(2, data); \ X86CompilerFuncCall* prn_flush = c.call((uintptr_t)fflush); \ prn_flush->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); \ prn_flush->setArgument(0, io); \ } #else #define LOG_JIT 0 #define JIT_COMMENT(...) #define printJIT(buf, val) #endif #ifdef MAPPED_JIT_FUNCS CACHE_ALIGN JIT_struct JIT; uintptr_t *JIT_struct::JIT_MEM[2][0x4000] = {{0}}; static uintptr_t *JIT_MEM[2][32] = { //arm9 { /* 0X*/ DUP2(JIT.ARM9_ITCM), /* 1X*/ DUP2(JIT.ARM9_ITCM), // mirror /* 2X*/ DUP2(JIT.MAIN_MEM), /* 3X*/ DUP2(JIT.SWIRAM), /* 4X*/ DUP2(NULL), /* 5X*/ DUP2(NULL), /* 6X*/ NULL, JIT.ARM9_LCDC, // Plain ARM9-CPU Access (LCDC mode) (max 656KB) /* 7X*/ DUP2(NULL), /* 8X*/ DUP2(NULL), /* 9X*/ DUP2(NULL), /* AX*/ DUP2(NULL), /* BX*/ DUP2(NULL), /* CX*/ DUP2(NULL), /* DX*/ DUP2(NULL), /* EX*/ DUP2(NULL), /* FX*/ DUP2(JIT.ARM9_BIOS) }, //arm7 { /* 0X*/ DUP2(JIT.ARM7_BIOS), /* 1X*/ DUP2(NULL), /* 2X*/ DUP2(JIT.MAIN_MEM), /* 3X*/ JIT.SWIRAM, JIT.ARM7_ERAM, /* 4X*/ NULL, JIT.ARM7_WIRAM, /* 5X*/ DUP2(NULL), /* 6X*/ JIT.ARM7_WRAM, // VRAM allocated as Work RAM to ARM7 (max. 256K) NULL, /* 7X*/ DUP2(NULL), /* 8X*/ DUP2(NULL), /* 9X*/ DUP2(NULL), /* AX*/ DUP2(NULL), /* BX*/ DUP2(NULL), /* CX*/ DUP2(NULL), /* DX*/ DUP2(NULL), /* EX*/ DUP2(NULL), /* FX*/ DUP2(NULL) } }; static u32 JIT_MASK[2][32] = { //arm9 { /* 0X*/ DUP2(0x00007FFF), /* 1X*/ DUP2(0x00007FFF), /* 2X*/ DUP2(0x003FFFFF), // FIXME _MMU_MAIN_MEM_MASK /* 3X*/ DUP2(0x00007FFF), /* 4X*/ DUP2(0x00000000), /* 5X*/ DUP2(0x00000000), /* 6X*/ 0x00000000, 0x000FFFFF, /* 7X*/ DUP2(0x00000000), /* 8X*/ DUP2(0x00000000), /* 9X*/ DUP2(0x00000000), /* AX*/ DUP2(0x00000000), /* BX*/ DUP2(0x00000000), /* CX*/ DUP2(0x00000000), /* DX*/ DUP2(0x00000000), /* EX*/ DUP2(0x00000000), /* FX*/ DUP2(0x00007FFF) }, //arm7 { /* 0X*/ DUP2(0x00003FFF), /* 1X*/ DUP2(0x00000000), /* 2X*/ DUP2(0x003FFFFF), /* 3X*/ 0x00007FFF, 0x0000FFFF, /* 4X*/ 0x00000000, 0x0000FFFF, /* 5X*/ DUP2(0x00000000), /* 6X*/ 0x0003FFFF, 0x00000000, /* 7X*/ DUP2(0x00000000), /* 8X*/ DUP2(0x00000000), /* 9X*/ DUP2(0x00000000), /* AX*/ DUP2(0x00000000), /* BX*/ DUP2(0x00000000), /* CX*/ DUP2(0x00000000), /* DX*/ DUP2(0x00000000), /* EX*/ DUP2(0x00000000), /* FX*/ DUP2(0x00000000) } }; static void init_jit_mem() { static bool inited = false; if(inited) return; inited = true; for(int proc=0; proc<2; proc++) for(int i=0; i<0x4000; i++) JIT.JIT_MEM[proc][i] = JIT_MEM[proc][i>>9] + (((i<<14) & JIT_MASK[proc][i>>9]) >> 1); } #else DS_ALIGN(4096) uintptr_t compiled_funcs[1<<26] = {0}; #endif static u8 recompile_counts[(1<<26)/16]; #ifdef HAVE_STATIC_CODE_BUFFER // On x86_64, allocate jitted code from a static buffer to ensure that it's within 2GB of .text // Allows call instructions to use pcrel offsets, as opposed to slower indirect calls. // Reduces memory needed for function pointers. // FIXME win64 needs this too, x86_32 doesn't DS_ALIGN(4096) static u8 scratchpad[1<<25]; static u8 *scratchptr; struct ASMJIT_API StaticCodeGenerator : public Context { StaticCodeGenerator() { scratchptr = scratchpad; int align = (uintptr_t)scratchpad & (sysconf(_SC_PAGESIZE) - 1); int err = mprotect(scratchpad-align, sizeof(scratchpad)+align, PROT_READ|PROT_WRITE|PROT_EXEC); if(err) { fprintf(stderr, "mprotect failed: %s\n", strerror(errno)); abort(); } } uint32_t generate(void** dest, Assembler* assembler) { uintptr_t size = assembler->getCodeSize(); if(size == 0) { *dest = NULL; return kErrorNoFunction; } if(size > (uintptr_t)(scratchpad+sizeof(scratchpad)-scratchptr)) { fprintf(stderr, "Out of memory for asmjit. Clearing code cache.\n"); arm_jit_reset(1); // If arm_jit_reset didn't involve recompiling op_cmp, we could keep the current function. *dest = NULL; return kErrorOk; } void *p = scratchptr; size = assembler->relocCode(p); scratchptr += size; *dest = p; return kErrorOk; } }; static StaticCodeGenerator codegen; static X86Compiler c(&codegen); #else static X86Compiler c; #endif static void emit_branch(int cond, Label to); static void _armlog(u8 proc, u32 addr, u32 opcode); static FileLogger logger(stderr); static int PROCNUM; static int *PROCNUM_ptr = &PROCNUM; static int bb_opcodesize; static int bb_adr; static bool bb_thumb; static GpVar bb_cpu; static GpVar bb_cycles; static GpVar bb_total_cycles; static u32 bb_constant_cycles; #define cpu (&ARMPROC) #define bb_next_instruction (bb_adr + bb_opcodesize) #define bb_r15 (bb_adr + 2 * bb_opcodesize) #define cpu_ptr(x) dword_ptr(bb_cpu, offsetof(armcpu_t, x)) #define cpu_ptr_byte(x, y) byte_ptr(bb_cpu, offsetof(armcpu_t, x) + y) #define flags_ptr cpu_ptr_byte(CPSR.val, 3) #define reg_ptr(x) dword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*(x)) #define reg_pos_ptr(x) dword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x))) #define reg_pos_ptrL(x) word_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x))) #define reg_pos_ptrH(x) word_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x)) + 2) #define reg_pos_ptrB(x) byte_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x))) #define reg_pos_thumb(x) dword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*((i>>(x))&0x7)) #define reg_pos_thumbB(x) byte_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*((i>>(x))&0x7)) #define cp15_ptr(x) dword_ptr(bb_cp15, offsetof(armcp15_t, x)) #define mmu_ptr(x) dword_ptr(bb_mmu, offsetof(MMU_struct, x)) #define mmu_ptr_byte(x) byte_ptr(bb_mmu, offsetof(MMU_struct, x)) #define _REG_NUM(i, n) ((i>>(n))&0x7) #ifndef ASMJIT_X64 #define r64 r32 #endif // sequencer.reschedule = true; #define changeCPSR { \ X86CompilerFuncCall* ctxCPSR = c.call((void*)NDS_Reschedule); \ ctxCPSR->setPrototype(ASMJIT_CALL_CONV, FuncBuilder0()); \ } #if (PROFILER_JIT_LEVEL > 0) struct PROFILER_COUNTER_INFO { u64 count; char name[64]; }; struct JIT_PROFILER { JIT_PROFILER::JIT_PROFILER() { memset(&arm_count[0], 0, sizeof(arm_count)); memset(&thumb_count[0], 0, sizeof(thumb_count)); } u64 arm_count[4096]; u64 thumb_count[1024]; } profiler_counter[2]; static GpVar bb_profiler; #define profiler_counter_arm(opcode) qword_ptr(bb_profiler, offsetof(JIT_PROFILER, arm_count[INSTRUCTION_INDEX(opcode)])) #define profiler_counter_thumb(opcode) qword_ptr(bb_profiler, offsetof(JIT_PROFILER, thumb_count[opcode>>6])) #if (PROFILER_JIT_LEVEL > 1) struct PROFILER_ENTRY { u32 addr; u32 cycles; } profiler_entry[2][1<<26]; static GpVar bb_profiler_entry; #endif #endif //----------------------------------------------------------------------------- // Shifting macros //----------------------------------------------------------------------------- #define SET_NZCV(sign) { \ JIT_COMMENT("SET_NZCV"); \ GpVar x = c.newGpVar(kX86VarTypeGpd); \ GpVar y = c.newGpVar(kX86VarTypeGpd); \ c.sets(x.r8Lo()); \ c.setz(y.r8Lo()); \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ if (sign) { c.setnc(y.r8Lo()); } else { c.setc(y.r8Lo()); } \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ c.seto(y.r8Lo()); \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ c.movzx(y, flags_ptr); \ c.shl(x, 4); \ c.and_(y, 0xF); \ c.or_(x, y); \ c.mov(flags_ptr, x.r8Lo()); \ c.unuse(x); \ c.unuse(y); \ JIT_COMMENT("end SET_NZCV"); \ } #define SET_NZC { \ JIT_COMMENT("SET_NZC"); \ GpVar x = c.newGpVar(kX86VarTypeGpd); \ GpVar y = c.newGpVar(kX86VarTypeGpd); \ c.sets(x.r8Lo()); \ c.setz(y.r8Lo()); \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ if (cf_change) { c.lea(x, ptr(rcf.r64(), x.r64(), kScale2Times)); c.unuse(rcf); } \ c.movzx(y, flags_ptr); \ c.shl(x, 6 - cf_change); \ c.and_(y, cf_change?0x1F:0x3F); \ c.or_(x, y); \ c.mov(flags_ptr, x.r8Lo()); \ JIT_COMMENT("end SET_NZC"); \ } #define SET_NZC_SHIFTS_ZERO(cf) { \ JIT_COMMENT("SET_NZC_SHIFTS_ZERO"); \ c.and_(flags_ptr, 0x1F); \ if(cf) \ { \ c.shl(rcf, 5); \ c.or_(rcf, (1<<6)); \ c.or_(flags_ptr, rcf.r8Lo()); \ } \ else \ c.or_(flags_ptr, (1<<6)); \ JIT_COMMENT("end SET_NZC_SHIFTS_ZERO"); \ } #define SET_NZ(clear_cv) { \ JIT_COMMENT("SET_NZ"); \ GpVar x = c.newGpVar(kX86VarTypeGpz); \ GpVar y = c.newGpVar(kX86VarTypeGpz); \ c.sets(x.r8Lo()); \ c.setz(y.r8Lo()); \ c.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \ c.movzx(y, flags_ptr); \ c.and_(y, clear_cv?0x0F:0x3F); \ c.shl(x, 6); \ c.or_(x, y); \ c.mov(flags_ptr, x.r8Lo()); \ JIT_COMMENT("end SET_NZ"); \ } #define SET_Q { \ JIT_COMMENT("SET_Q"); \ GpVar x = c.newGpVar(kX86VarTypeGpz); \ c.seto(x.r8Lo()); \ c.shl(x, 3); \ c.or_(flags_ptr, x.r8Lo()); \ JIT_COMMENT("end SET_Q"); \ } #define S_DST_R15 { \ JIT_COMMENT("S_DST_R15"); \ GpVar SPSR = c.newGpVar(kX86VarTypeGpd); \ GpVar tmp = c.newGpVar(kX86VarTypeGpd); \ c.mov(SPSR, cpu_ptr(SPSR.val)); \ c.mov(tmp, SPSR); \ c.and_(tmp, 0x1F); \ X86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, bb_cpu); \ ctx->setArgument(1, tmp); \ c.mov(cpu_ptr(CPSR.val), SPSR); \ c.and_(SPSR, (1<<5)); \ c.shr(SPSR, 5); \ c.lea(tmp, ptr_abs((void*)0xFFFFFFFC, SPSR.r64(), kScale2Times)); \ c.and_(tmp, reg_ptr(15)); \ c.mov(cpu_ptr(next_instruction), tmp); \ c.unuse(tmp); \ JIT_COMMENT("end S_DST_R15"); \ } // ============================================================================================= IMM #define LSL_IMM \ JIT_COMMENT("LSL_IMM"); \ bool rhs_is_imm = false; \ u32 imm = ((i>>7)&0x1F); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(rhs, reg_pos_ptr(0)); \ if(imm) c.shl(rhs, imm); \ u32 rhs_first = cpu->R[REG_POS(i,0)] << imm; #define S_LSL_IMM \ JIT_COMMENT("S_LSL_IMM"); \ bool rhs_is_imm = false; \ u8 cf_change = 0; \ GpVar rcf; \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ u32 imm = ((i>>7)&0x1F); \ c.mov(rhs, reg_pos_ptr(0)); \ if (imm) \ { \ cf_change = 1; \ c.shl(rhs, imm); \ rcf = c.newGpVar(kX86VarTypeGpd); \ c.setc(rcf.r8Lo()); \ } #define LSR_IMM \ JIT_COMMENT("LSR_IMM"); \ bool rhs_is_imm = false; \ u32 imm = ((i>>7)&0x1F); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ if(imm) \ { \ c.mov(rhs, reg_pos_ptr(0)); \ c.shr(rhs, imm); \ } \ else \ c.mov(rhs, 0); \ u32 rhs_first = imm ? cpu->R[REG_POS(i,0)] >> imm : 0; #define S_LSR_IMM \ JIT_COMMENT("S_LSR_IMM"); \ bool rhs_is_imm = false; \ u8 cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ u32 imm = ((i>>7)&0x1F); \ c.mov(rhs, reg_pos_ptr(0)); \ if (!imm) \ { \ c.test(rhs, (1 << 31)); \ c.setnz(rcf.r8Lo()); \ c.xor_(rhs, rhs); \ } \ else \ { \ c.shr(rhs, imm); \ c.setc(rcf.r8Lo()); \ } #define ASR_IMM \ JIT_COMMENT("ASR_IMM"); \ bool rhs_is_imm = false; \ u32 imm = ((i>>7)&0x1F); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(rhs, reg_pos_ptr(0)); \ if(!imm) imm = 31; \ c.sar(rhs, imm); \ u32 rhs_first = (s32)cpu->R[REG_POS(i,0)] >> imm; #define S_ASR_IMM \ JIT_COMMENT("S_ASR_IMM"); \ bool rhs_is_imm = false; \ u8 cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ u32 imm = ((i>>7)&0x1F); \ c.mov(rhs, reg_pos_ptr(0)); \ if (!imm) imm = 31; \ c.sar(rhs, imm); \ imm==31?c.sets(rcf.r8Lo()):c.setc(rcf.r8Lo()); #define ROR_IMM \ JIT_COMMENT("ROR_IMM"); \ bool rhs_is_imm = false; \ u32 imm = ((i>>7)&0x1F); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(rhs, reg_pos_ptr(0)); \ if (!imm) \ { \ c.bt(flags_ptr, 5); \ c.rcr(rhs, 1); \ } \ else \ c.ror(rhs, imm); \ u32 rhs_first = imm?ROR(cpu->R[REG_POS(i,0)], imm) : ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1); #define S_ROR_IMM \ JIT_COMMENT("S_ROR_IMM"); \ bool rhs_is_imm = false; \ u8 cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ u32 imm = ((i>>7)&0x1F); \ c.mov(rhs, reg_pos_ptr(0)); \ if (!imm) \ { \ c.bt(flags_ptr, 5); \ c.rcr(rhs, 1); \ } \ else \ c.ror(rhs, imm); \ c.setc(rcf.r8Lo()); #define REG_OFF \ JIT_COMMENT("REG_OFF"); \ bool rhs_is_imm = false; \ Mem rhs = reg_pos_ptr(0); \ u32 rhs_first = cpu->R[REG_POS(i,0)]; #define IMM_VAL \ JIT_COMMENT("IMM_VAL"); \ bool rhs_is_imm = true; \ u32 rhs = ROR((i&0xFF), (i>>7)&0x1E); \ u32 rhs_first = rhs; #define S_IMM_VAL \ JIT_COMMENT("S_IMM_VAL"); \ bool rhs_is_imm = true; \ u8 cf_change = 0; \ GpVar rcf; \ u32 rhs = ROR((i&0xFF), (i>>7)&0x1E); \ if ((i>>8)&0xF) \ { \ cf_change = 1; \ rcf = c.newGpVar(kX86VarTypeGpd); \ c.mov(rcf, BIT31(rhs)); \ } \ u32 rhs_first = rhs; #define IMM_OFF \ JIT_COMMENT("IMM_OFF"); \ bool rhs_is_imm = true; \ u32 rhs = ((i>>4)&0xF0)+(i&0xF); \ u32 rhs_first = rhs; #define IMM_OFF_12 \ JIT_COMMENT("IMM_OFF_12"); \ bool rhs_is_imm = true; \ u32 rhs = i&0xFFF; \ u32 rhs_first = rhs; // ============================================================================================= REG #define LSX_REG(name, x86inst, sign) \ JIT_COMMENT(#name); \ bool rhs_is_imm = false; \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ GpVar tmp = c.newGpVar(kX86VarTypeGpz); \ if(sign) c.mov(tmp, 31); \ else c.mov(tmp, 0); \ c.movzx(imm, reg_pos_ptrB(8)); \ c.mov(rhs, reg_pos_ptr(0)); \ c.cmp(imm, 31); \ if(sign) c.cmovg(imm, tmp); \ else c.cmovg(rhs, tmp); \ c.x86inst(rhs, imm); \ c.unuse(tmp); #define S_LSX_REG(name, x86inst, sign) \ JIT_COMMENT(#name); \ bool rhs_is_imm = false; \ u8 cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ Label __zero = c.newLabel(); \ Label __lt32 = c.newLabel(); \ Label __done = c.newLabel(); \ c.mov(imm, reg_pos_ptr(8)); \ c.mov(rhs, reg_pos_ptr(0)); \ c.and_(imm, 0xFF); \ c.jz(__zero); \ c.cmp(imm, 32); \ c.jl(__lt32); \ if(!sign) \ { \ Label __eq32 = c.newLabel(); \ c.je(__eq32); \ /* imm > 32 */ \ c.mov(rhs, 0); \ c.mov(rcf, 0); \ c.jmp(__done); \ /* imm == 32 */ \ c.bind(__eq32); \ } \ c.x86inst(rhs, 31); \ c.x86inst(rhs, 1); \ c.setc(rcf.r8Lo()); \ c.jmp(__done); \ /* imm == 0 */ \ c.bind(__zero); \ c.test(flags_ptr, (1 << 5)); \ c.setnz(rcf.r8Lo()); \ c.jmp(__done); \ /* imm < 32 */ \ c.bind(__lt32); \ c.x86inst(rhs, imm); \ c.setc(rcf.r8Lo()); \ /* done */ \ c.bind(__done); #define LSL_REG LSX_REG(LSL_REG, shl, 0) #define LSR_REG LSX_REG(LSR_REG, shr, 0) #define ASR_REG LSX_REG(ASR_REG, sar, 1) #define S_LSL_REG S_LSX_REG(S_LSL_REG, shl, 0) #define S_LSR_REG S_LSX_REG(S_LSR_REG, shr, 0) #define S_ASR_REG S_LSX_REG(S_ASR_REG, sar, 1) #define ROR_REG \ JIT_COMMENT("ROR_REG"); \ bool rhs_is_imm = false; \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ c.mov(rhs, reg_pos_ptr(0)); \ c.mov(imm, reg_pos_ptrB(8)); \ c.ror(rhs, imm.r8Lo()); #define S_ROR_REG \ JIT_COMMENT("S_ROR_REG"); \ bool rhs_is_imm = false; \ bool cf_change = 1; \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ Label __zero = c.newLabel(); \ Label __zero_1F = c.newLabel(); \ Label __done = c.newLabel(); \ c.mov(imm, reg_pos_ptr(8)); \ c.mov(rhs, reg_pos_ptr(0)); \ c.and_(imm, 0xFF); \ c.jz(__zero);\ c.and_(imm, 0x1F); \ c.jz(__zero_1F);\ /* imm&0x1F != 0 */ \ c.ror(rhs, imm); \ c.setc(rcf.r8Lo()); \ c.jmp(__done); \ /* imm&0x1F == 0 */ \ c.bind(__zero_1F); \ c.test(rhs, (1 << 31)); \ c.setnz(rcf.r8Lo()); \ c.jmp(__done); \ /* imm == 0 */ \ c.bind(__zero); \ c.test(flags_ptr, (1 << 5)); \ c.setnz(rcf.r8Lo()); \ /* done */ \ c.bind(__done); //==================================================================== common funcs static void emit_MMU_aluMemCycles(int alu_cycles, GpVar mem_cycles, int population) { if(PROCNUM==ARMCPU_ARM9) { if(population < alu_cycles) { GpVar x = c.newGpVar(kX86VarTypeGpd); c.mov(x, alu_cycles); c.cmp(mem_cycles, alu_cycles); c.cmovl(mem_cycles, x); } } else c.add(mem_cycles, alu_cycles); } //----------------------------------------------------------------------------- // OPs //----------------------------------------------------------------------------- #define OP_ARITHMETIC(arg, x86inst, symmetric, flags) \ arg; \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ if(REG_POS(i,12) == REG_POS(i,16)) \ c.x86inst(reg_pos_ptr(12), rhs); \ else if(symmetric && !rhs_is_imm) \ { \ c.x86inst(*(GpVar*)&rhs, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), rhs); \ } \ else \ { \ c.mov(lhs, reg_pos_ptr(16)); \ c.x86inst(lhs, rhs); \ c.mov(reg_pos_ptr(12), lhs); \ } \ if(flags) \ { \ if(REG_POS(i,12)==15) \ { \ S_DST_R15; \ c.add(bb_total_cycles, 2); \ return 1; \ } \ SET_NZCV(!symmetric); \ } \ else \ { \ if(REG_POS(i,12)==15) \ { \ GpVar tmp = c.newGpVar(kX86VarTypeGpd); \ c.mov(tmp, reg_ptr(15)); \ c.mov(cpu_ptr(next_instruction), tmp); \ c.add(bb_total_cycles, 2); \ } \ } \ return 1; #define OP_ARITHMETIC_R(arg, x86inst, flags) \ arg; \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(lhs, rhs); \ c.x86inst(lhs, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), lhs); \ if(flags) \ { \ if(REG_POS(i,12)==15) \ { \ S_DST_R15; \ c.add(bb_total_cycles, 2); \ return 1; \ } \ SET_NZCV(1); \ } \ else \ { \ if(REG_POS(i,12)==15) \ { \ GpVar tmp = c.newGpVar(kX86VarTypeGpd); \ c.mov(cpu_ptr(next_instruction), lhs); \ c.add(bb_total_cycles, 2); \ } \ } \ return 1; #define OP_ARITHMETIC_S(arg, x86inst, symmetric) \ arg; \ if(REG_POS(i,12) == REG_POS(i,16)) \ c.x86inst(reg_pos_ptr(12), rhs); \ else if(symmetric && !rhs_is_imm) \ { \ c.x86inst(*(GpVar*)&rhs, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), rhs); \ } \ else \ { \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(lhs, reg_pos_ptr(16)); \ c.x86inst(lhs, rhs); \ c.mov(reg_pos_ptr(12), lhs); \ } \ if(REG_POS(i,12)==15) \ { \ S_DST_R15; \ c.add(bb_total_cycles, 2); \ return 1; \ } \ SET_NZC; \ return 1; #define GET_CARRY(invert) { \ c.bt(flags_ptr, 5); \ if (invert) c.cmc(); } static int OP_AND_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, and_, 1, 0); } static int OP_AND_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, and_, 1, 0); } static int OP_AND_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, and_, 1, 0); } static int OP_AND_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, and_, 1, 0); } static int OP_AND_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, and_, 1, 0); } static int OP_AND_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, and_, 1, 0); } static int OP_AND_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, and_, 1, 0); } static int OP_AND_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, and_, 1, 0); } static int OP_AND_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, and_, 1, 0); } static int OP_EOR_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, xor_, 1, 0); } static int OP_EOR_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, xor_, 1, 0); } static int OP_EOR_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, xor_, 1, 0); } static int OP_EOR_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, xor_, 1, 0); } static int OP_EOR_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, xor_, 1, 0); } static int OP_EOR_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, xor_, 1, 0); } static int OP_EOR_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, xor_, 1, 0); } static int OP_EOR_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, xor_, 1, 0); } static int OP_EOR_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, xor_, 1, 0); } static int OP_ORR_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, or_, 1, 0); } static int OP_ORR_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, or_, 1, 0); } static int OP_ORR_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, or_, 1, 0); } static int OP_ORR_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, or_, 1, 0); } static int OP_ORR_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, or_, 1, 0); } static int OP_ORR_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, or_, 1, 0); } static int OP_ORR_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, or_, 1, 0); } static int OP_ORR_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, or_, 1, 0); } static int OP_ORR_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, or_, 1, 0); } static int OP_ADD_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, add, 1, 0); } static int OP_ADD_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, add, 1, 0); } static int OP_ADD_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, add, 1, 0); } static int OP_ADD_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, add, 1, 0); } static int OP_ADD_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, add, 1, 0); } static int OP_ADD_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, add, 1, 0); } static int OP_ADD_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, add, 1, 0); } static int OP_ADD_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, add, 1, 0); } static int OP_ADD_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, add, 1, 0); } static int OP_SUB_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, sub, 0, 0); } static int OP_SUB_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, sub, 0, 0); } static int OP_SUB_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, sub, 0, 0); } static int OP_SUB_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, sub, 0, 0); } static int OP_SUB_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, sub, 0, 0); } static int OP_SUB_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, sub, 0, 0); } static int OP_SUB_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, sub, 0, 0); } static int OP_SUB_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, sub, 0, 0); } static int OP_SUB_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, sub, 0, 0); } static int OP_RSB_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM, sub, 0); } static int OP_RSB_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG, sub, 0); } static int OP_RSB_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM, sub, 0); } static int OP_RSB_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG, sub, 0); } static int OP_RSB_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM, sub, 0); } static int OP_RSB_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG, sub, 0); } static int OP_RSB_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM, sub, 0); } static int OP_RSB_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG, sub, 0); } static int OP_RSB_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL, sub, 0); } // ================================ S instructions static int OP_AND_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, and_, 1); } static int OP_AND_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, and_, 1); } static int OP_AND_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, and_, 1); } static int OP_AND_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, and_, 1); } static int OP_AND_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, and_, 1); } static int OP_AND_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, and_, 1); } static int OP_AND_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, and_, 1); } static int OP_AND_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, and_, 1); } static int OP_AND_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, and_, 1); } static int OP_EOR_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, xor_, 1); } static int OP_EOR_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, xor_, 1); } static int OP_EOR_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, xor_, 1); } static int OP_EOR_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, xor_, 1); } static int OP_EOR_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, xor_, 1); } static int OP_EOR_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, xor_, 1); } static int OP_EOR_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, xor_, 1); } static int OP_EOR_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, xor_, 1); } static int OP_EOR_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, xor_, 1); } static int OP_ORR_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, or_, 1); } static int OP_ORR_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, or_, 1); } static int OP_ORR_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, or_, 1); } static int OP_ORR_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, or_, 1); } static int OP_ORR_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, or_, 1); } static int OP_ORR_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, or_, 1); } static int OP_ORR_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, or_, 1); } static int OP_ORR_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, or_, 1); } static int OP_ORR_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, or_, 1); } static int OP_ADD_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, add, 1, 1); } static int OP_ADD_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, add, 1, 1); } static int OP_ADD_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, add, 1, 1); } static int OP_ADD_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, add, 1, 1); } static int OP_ADD_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, add, 1, 1); } static int OP_ADD_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, add, 1, 1); } static int OP_ADD_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, add, 1, 1); } static int OP_ADD_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, add, 1, 1); } static int OP_ADD_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, add, 1, 1); } static int OP_SUB_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, sub, 0, 1); } static int OP_SUB_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, sub, 0, 1); } static int OP_SUB_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, sub, 0, 1); } static int OP_SUB_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, sub, 0, 1); } static int OP_SUB_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, sub, 0, 1); } static int OP_SUB_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, sub, 0, 1); } static int OP_SUB_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, sub, 0, 1); } static int OP_SUB_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, sub, 0, 1); } static int OP_SUB_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, sub, 0, 1); } static int OP_RSB_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM, sub, 1); } static int OP_RSB_S_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG, sub, 1); } static int OP_RSB_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM, sub, 1); } static int OP_RSB_S_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG, sub, 1); } static int OP_RSB_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM, sub, 1); } static int OP_RSB_S_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG, sub, 1); } static int OP_RSB_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM, sub, 1); } static int OP_RSB_S_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG, sub, 1); } static int OP_RSB_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL, sub, 1); } static int OP_ADC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(0), adc, 1, 0); } static int OP_ADC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(0), adc, 1, 1); } static int OP_ADC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(0), adc, 1, 1); } static int OP_SBC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(1), sbb, 0, 0); } static int OP_SBC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(1), sbb, 0, 1); } static int OP_SBC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(1), sbb, 0, 1); } static int OP_RSC_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM; GET_CARRY(1), sbb, 0); } static int OP_RSC_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG; GET_CARRY(1), sbb, 0); } static int OP_RSC_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM; GET_CARRY(1), sbb, 0); } static int OP_RSC_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG; GET_CARRY(1), sbb, 0); } static int OP_RSC_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM; GET_CARRY(1), sbb, 0); } static int OP_RSC_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG; GET_CARRY(1), sbb, 0); } static int OP_RSC_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM; GET_CARRY(1), sbb, 0); } static int OP_RSC_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG; GET_CARRY(1), sbb, 0); } static int OP_RSC_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL; GET_CARRY(1), sbb, 0); } static int OP_RSC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG; GET_CARRY(1), sbb, 1); } static int OP_RSC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL; GET_CARRY(1), sbb, 1); } static int OP_BIC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; c.not_(rhs), and_, 1, 0); } static int OP_BIC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; c.not_(rhs), and_, 1, 0); } static int OP_BIC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; c.not_(rhs), and_, 1, 0); } static int OP_BIC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; c.not_(rhs), and_, 1, 0); } static int OP_BIC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; c.not_(rhs), and_, 1, 0); } static int OP_BIC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; c.not_(rhs), and_, 1, 0); } static int OP_BIC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; c.not_(rhs), and_, 1, 0); } static int OP_BIC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; c.not_(rhs), and_, 1, 0); } static int OP_BIC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; rhs = ~rhs, and_, 1, 0); } static int OP_BIC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM; c.not_(rhs), and_, 1); } static int OP_BIC_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG; c.not_(rhs), and_, 1); } static int OP_BIC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM; c.not_(rhs), and_, 1); } static int OP_BIC_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG; c.not_(rhs), and_, 1); } static int OP_BIC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM; c.not_(rhs), and_, 1); } static int OP_BIC_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG; c.not_(rhs), and_, 1); } static int OP_BIC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM; c.not_(rhs), and_, 1); } static int OP_BIC_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG; c.not_(rhs), and_, 1); } static int OP_BIC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL; rhs = ~rhs, and_, 1); } //----------------------------------------------------------------------------- // TST //----------------------------------------------------------------------------- #define OP_TST_(arg) \ arg; \ c.test(reg_pos_ptr(16), rhs); \ SET_NZC; \ return 1; static int OP_TST_LSL_IMM(const u32 i) { OP_TST_(S_LSL_IMM); } static int OP_TST_LSL_REG(const u32 i) { OP_TST_(S_LSL_REG); } static int OP_TST_LSR_IMM(const u32 i) { OP_TST_(S_LSR_IMM); } static int OP_TST_LSR_REG(const u32 i) { OP_TST_(S_LSR_REG); } static int OP_TST_ASR_IMM(const u32 i) { OP_TST_(S_ASR_IMM); } static int OP_TST_ASR_REG(const u32 i) { OP_TST_(S_ASR_REG); } static int OP_TST_ROR_IMM(const u32 i) { OP_TST_(S_ROR_IMM); } static int OP_TST_ROR_REG(const u32 i) { OP_TST_(S_ROR_REG); } static int OP_TST_IMM_VAL(const u32 i) { OP_TST_(S_IMM_VAL); } //----------------------------------------------------------------------------- // TEQ //----------------------------------------------------------------------------- #define OP_TEQ_(arg) \ arg; \ if (!rhs_is_imm) \ c.xor_(*(GpVar*)&rhs, reg_pos_ptr(16)); \ else \ { \ GpVar x = c.newGpVar(kX86VarTypeGpd); \ c.mov(x, rhs); \ c.xor_(x, reg_pos_ptr(16)); \ } \ SET_NZC; \ return 1; static int OP_TEQ_LSL_IMM(const u32 i) { OP_TEQ_(S_LSL_IMM); } static int OP_TEQ_LSL_REG(const u32 i) { OP_TEQ_(S_LSL_REG); } static int OP_TEQ_LSR_IMM(const u32 i) { OP_TEQ_(S_LSR_IMM); } static int OP_TEQ_LSR_REG(const u32 i) { OP_TEQ_(S_LSR_REG); } static int OP_TEQ_ASR_IMM(const u32 i) { OP_TEQ_(S_ASR_IMM); } static int OP_TEQ_ASR_REG(const u32 i) { OP_TEQ_(S_ASR_REG); } static int OP_TEQ_ROR_IMM(const u32 i) { OP_TEQ_(S_ROR_IMM); } static int OP_TEQ_ROR_REG(const u32 i) { OP_TEQ_(S_ROR_REG); } static int OP_TEQ_IMM_VAL(const u32 i) { OP_TEQ_(S_IMM_VAL); } //----------------------------------------------------------------------------- // CMP //----------------------------------------------------------------------------- #define OP_CMP(arg) \ arg; \ c.cmp(reg_pos_ptr(16), rhs); \ SET_NZCV(1); \ return 1; static int OP_CMP_LSL_IMM(const u32 i) { OP_CMP(LSL_IMM); } static int OP_CMP_LSL_REG(const u32 i) { OP_CMP(LSL_REG); } static int OP_CMP_LSR_IMM(const u32 i) { OP_CMP(LSR_IMM); } static int OP_CMP_LSR_REG(const u32 i) { OP_CMP(LSR_REG); } static int OP_CMP_ASR_IMM(const u32 i) { OP_CMP(ASR_IMM); } static int OP_CMP_ASR_REG(const u32 i) { OP_CMP(ASR_REG); } static int OP_CMP_ROR_IMM(const u32 i) { OP_CMP(ROR_IMM); } static int OP_CMP_ROR_REG(const u32 i) { OP_CMP(ROR_REG); } static int OP_CMP_IMM_VAL(const u32 i) { OP_CMP(IMM_VAL); } #undef OP_CMP //----------------------------------------------------------------------------- // CMN //----------------------------------------------------------------------------- #define OP_CMN(arg) \ arg; \ u32 rhs_imm = *(u32*)&rhs; \ int sign = rhs_is_imm && (rhs_imm != -rhs_imm); \ if(sign) \ c.cmp(reg_pos_ptr(16), -rhs_imm); \ else \ { \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(lhs, reg_pos_ptr(16)); \ c.add(lhs, rhs); \ } \ SET_NZCV(sign); \ return 1; static int OP_CMN_LSL_IMM(const u32 i) { OP_CMN(LSL_IMM); } static int OP_CMN_LSL_REG(const u32 i) { OP_CMN(LSL_REG); } static int OP_CMN_LSR_IMM(const u32 i) { OP_CMN(LSR_IMM); } static int OP_CMN_LSR_REG(const u32 i) { OP_CMN(LSR_REG); } static int OP_CMN_ASR_IMM(const u32 i) { OP_CMN(ASR_IMM); } static int OP_CMN_ASR_REG(const u32 i) { OP_CMN(ASR_REG); } static int OP_CMN_ROR_IMM(const u32 i) { OP_CMN(ROR_IMM); } static int OP_CMN_ROR_REG(const u32 i) { OP_CMN(ROR_REG); } static int OP_CMN_IMM_VAL(const u32 i) { OP_CMN(IMM_VAL); } #undef OP_CMN //----------------------------------------------------------------------------- // MOV //----------------------------------------------------------------------------- #define OP_MOV(arg) \ arg; \ c.mov(reg_pos_ptr(12), rhs); \ if(REG_POS(i,12)==15) \ { \ c.mov(cpu_ptr(next_instruction), rhs); \ return 1; \ } \ return 1; static int OP_MOV_LSL_IMM(const u32 i) { if (i == 0xE1A00000) { /* nop */ JIT_COMMENT("nop"); return 1; } OP_MOV(LSL_IMM); } static int OP_MOV_LSL_REG(const u32 i) { OP_MOV(LSL_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); } static int OP_MOV_LSR_IMM(const u32 i) { OP_MOV(LSR_IMM); } static int OP_MOV_LSR_REG(const u32 i) { OP_MOV(LSR_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); } static int OP_MOV_ASR_IMM(const u32 i) { OP_MOV(ASR_IMM); } static int OP_MOV_ASR_REG(const u32 i) { OP_MOV(ASR_REG); } static int OP_MOV_ROR_IMM(const u32 i) { OP_MOV(ROR_IMM); } static int OP_MOV_ROR_REG(const u32 i) { OP_MOV(ROR_REG); } static int OP_MOV_IMM_VAL(const u32 i) { OP_MOV(IMM_VAL); } #define OP_MOV_S(arg) \ arg; \ c.mov(reg_pos_ptr(12), rhs); \ if(REG_POS(i,12)==15) \ { \ S_DST_R15; \ c.add(bb_total_cycles, 2); \ return 1; \ } \ if(!rhs_is_imm) \ c.cmp(*(GpVar*)&rhs, 0); \ else \ c.cmp(reg_pos_ptr(12), 0); \ SET_NZC; \ return 1; static int OP_MOV_S_LSL_IMM(const u32 i) { OP_MOV_S(S_LSL_IMM); } static int OP_MOV_S_LSL_REG(const u32 i) { OP_MOV_S(S_LSL_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); } static int OP_MOV_S_LSR_IMM(const u32 i) { OP_MOV_S(S_LSR_IMM); } static int OP_MOV_S_LSR_REG(const u32 i) { OP_MOV_S(S_LSR_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); } static int OP_MOV_S_ASR_IMM(const u32 i) { OP_MOV_S(S_ASR_IMM); } static int OP_MOV_S_ASR_REG(const u32 i) { OP_MOV_S(S_ASR_REG); } static int OP_MOV_S_ROR_IMM(const u32 i) { OP_MOV_S(S_ROR_IMM); } static int OP_MOV_S_ROR_REG(const u32 i) { OP_MOV_S(S_ROR_REG); } static int OP_MOV_S_IMM_VAL(const u32 i) { OP_MOV_S(S_IMM_VAL); } //----------------------------------------------------------------------------- // MVN //----------------------------------------------------------------------------- static int OP_MVN_LSL_IMM(const u32 i) { OP_MOV(LSL_IMM; c.not_(rhs)); } static int OP_MVN_LSL_REG(const u32 i) { OP_MOV(LSL_REG; c.not_(rhs)); } static int OP_MVN_LSR_IMM(const u32 i) { OP_MOV(LSR_IMM; c.not_(rhs)); } static int OP_MVN_LSR_REG(const u32 i) { OP_MOV(LSR_REG; c.not_(rhs)); } static int OP_MVN_ASR_IMM(const u32 i) { OP_MOV(ASR_IMM; c.not_(rhs)); } static int OP_MVN_ASR_REG(const u32 i) { OP_MOV(ASR_REG; c.not_(rhs)); } static int OP_MVN_ROR_IMM(const u32 i) { OP_MOV(ROR_IMM; c.not_(rhs)); } static int OP_MVN_ROR_REG(const u32 i) { OP_MOV(ROR_REG; c.not_(rhs)); } static int OP_MVN_IMM_VAL(const u32 i) { OP_MOV(IMM_VAL; rhs = ~rhs); } static int OP_MVN_S_LSL_IMM(const u32 i) { OP_MOV_S(S_LSL_IMM; c.not_(rhs)); } static int OP_MVN_S_LSL_REG(const u32 i) { OP_MOV_S(S_LSL_REG; c.not_(rhs)); } static int OP_MVN_S_LSR_IMM(const u32 i) { OP_MOV_S(S_LSR_IMM; c.not_(rhs)); } static int OP_MVN_S_LSR_REG(const u32 i) { OP_MOV_S(S_LSR_REG; c.not_(rhs)); } static int OP_MVN_S_ASR_IMM(const u32 i) { OP_MOV_S(S_ASR_IMM; c.not_(rhs)); } static int OP_MVN_S_ASR_REG(const u32 i) { OP_MOV_S(S_ASR_REG; c.not_(rhs)); } static int OP_MVN_S_ROR_IMM(const u32 i) { OP_MOV_S(S_ROR_IMM; c.not_(rhs)); } static int OP_MVN_S_ROR_REG(const u32 i) { OP_MOV_S(S_ROR_REG; c.not_(rhs)); } static int OP_MVN_S_IMM_VAL(const u32 i) { OP_MOV_S(S_IMM_VAL; rhs = ~rhs); } //----------------------------------------------------------------------------- // QADD / QDADD / QSUB / QDSUB //----------------------------------------------------------------------------- // TODO static int OP_QADD(const u32 i) { printf("JIT: unimplemented OP_QADD\n"); return 0; } static int OP_QSUB(const u32 i) { printf("JIT: unimplemented OP_QSUB\n"); return 0; } static int OP_QDADD(const u32 i) { printf("JIT: unimplemented OP_QDADD\n"); return 0; } static int OP_QDSUB(const u32 i) { printf("JIT: unimplemented OP_QDSUB\n"); return 0; } //----------------------------------------------------------------------------- // MUL //----------------------------------------------------------------------------- static void MUL_Mxx_END(GpVar x, bool sign, int cycles) { if(sign) { GpVar y = c.newGpVar(kX86VarTypeGpd); c.mov(y, x); c.sar(x, 31); c.xor_(x, y); } c.or_(x, 1); c.bsr(bb_cycles, x); c.shr(bb_cycles, 3); c.add(bb_cycles, cycles+1); } #define OP_MUL_(op, width, sign, accum, flags) \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar hi; \ if (width) \ { \ hi = c.newGpVar(kX86VarTypeGpd); \ c.xor_(hi, hi); \ } \ c.mov(lhs, reg_pos_ptr(0)); \ c.mov(rhs, reg_pos_ptr(8)); \ op; \ if(width && accum) \ { \ if(flags) \ { \ c.add(lhs, reg_pos_ptr(12)); \ c.adc(hi, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), lhs); \ c.mov(reg_pos_ptr(16), hi); \ c.cmp(hi, lhs); SET_NZ(0); \ } \ else \ { \ c.add(reg_pos_ptr(12), lhs); \ c.adc(reg_pos_ptr(16), hi); \ } \ } \ else if(width) \ { \ c.mov(reg_pos_ptr(12), lhs); \ c.mov(reg_pos_ptr(16), hi); \ if(flags) { c.cmp(hi, lhs); SET_NZ(0); } \ } \ else \ { \ if(accum) c.add(lhs, reg_pos_ptr(12)); \ c.mov(reg_pos_ptr(16), lhs); \ if(flags) { c.cmp(lhs, 0); SET_NZ(0); }\ } \ MUL_Mxx_END(rhs, sign, 1+width+accum); \ return 1; static int OP_MUL(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 0, 0); } static int OP_MLA(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 1, 0); } static int OP_UMULL(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 0, 0); } static int OP_UMLAL(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 1, 0); } static int OP_SMULL(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 0, 0); } static int OP_SMLAL(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 1, 0); } static int OP_MUL_S(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 0, 1); } static int OP_MLA_S(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 1, 1); } static int OP_UMULL_S(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 0, 1); } static int OP_UMLAL_S(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 1, 1); } static int OP_SMULL_S(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 0, 1); } static int OP_SMLAL_S(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 1, 1); } #define OP_MULxy_(op, x, y, width, accum, flags) \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar hi; \ c.movsx(lhs, reg_pos_ptr##x(0)); \ c.movsx(rhs, reg_pos_ptr##y(8)); \ if (width) \ { \ hi = c.newGpVar(kX86VarTypeGpd); \ } \ op; \ if(width && accum) \ { \ if(flags) \ { \ c.add(lhs, reg_pos_ptr(12)); \ c.adc(hi, reg_pos_ptr(16)); \ c.mov(reg_pos_ptr(12), lhs); \ c.mov(reg_pos_ptr(16), hi); \ SET_Q; \ } \ else \ { \ c.add(reg_pos_ptr(12), lhs); \ c.adc(reg_pos_ptr(16), hi); \ } \ } \ else \ if(width) \ { \ c.mov(reg_pos_ptr(12), lhs); \ c.mov(reg_pos_ptr(16), hi); \ if(flags) { SET_Q; }\ } \ else \ { \ if (accum) c.add(lhs, reg_pos_ptr(12)); \ c.mov(reg_pos_ptr(16), lhs); \ if(flags) { SET_Q; }\ } \ return 1; //----------------------------------------------------------------------------- // SMUL //----------------------------------------------------------------------------- static int OP_SMUL_B_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, L, 0, 0, 0); } static int OP_SMUL_B_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, H, 0, 0, 0); } static int OP_SMUL_T_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, L, 0, 0, 0); } static int OP_SMUL_T_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, H, 0, 0, 0); } //----------------------------------------------------------------------------- // SMLA //----------------------------------------------------------------------------- static int OP_SMLA_B_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, L, 0, 1, 1); } static int OP_SMLA_B_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, H, 0, 1, 1); } static int OP_SMLA_T_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, L, 0, 1, 1); } static int OP_SMLA_T_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, H, 0, 1, 1); } //----------------------------------------------------------------------------- // SMLAL //----------------------------------------------------------------------------- static int OP_SMLAL_B_B(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), L, L, 1, 1, 1); } static int OP_SMLAL_B_T(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), L, H, 1, 1, 1); } static int OP_SMLAL_T_B(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), H, L, 1, 1, 1); } static int OP_SMLAL_T_T(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), H, H, 1, 1, 1); } //----------------------------------------------------------------------------- // SMULW / SMLAW //----------------------------------------------------------------------------- #ifdef ASMJIT_X64 #define OP_SMxxW_(x, accum, flags) \ GpVar lhs = c.newGpVar(kX86VarTypeGpz); \ GpVar rhs = c.newGpVar(kX86VarTypeGpz); \ c.movsx(lhs, reg_pos_ptr##x(8)); \ c.movsxd(rhs, reg_pos_ptr(0)); \ c.imul(lhs, rhs); \ c.sar(lhs, 16); \ if (accum) c.add(lhs, reg_pos_ptr(12)); \ c.mov(reg_pos_ptr(16), lhs.r32()); \ if (flags) { SET_Q; } \ return 1; #else #define OP_SMxxW_(x, accum, flags) \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ GpVar hi = c.newGpVar(kX86VarTypeGpd); \ c.xor_(hi, hi); \ c.movsx(lhs, reg_pos_ptr##x(8)); \ c.mov(rhs, reg_pos_ptr(0)); \ c.imul(hi, lhs, rhs); \ c.mov(lhs.r16(), hi.r16()); \ c.ror(lhs, 16); \ if (accum) c.add(lhs, reg_pos_ptr(12)); \ c.mov(reg_pos_ptr(16), lhs); \ if (flags) { SET_Q; } \ return 1; #endif static int OP_SMULW_B(const u32 i) { OP_SMxxW_(L, 0, 0); } static int OP_SMULW_T(const u32 i) { OP_SMxxW_(H, 0, 0); } static int OP_SMLAW_B(const u32 i) { OP_SMxxW_(L, 1, 1); } static int OP_SMLAW_T(const u32 i) { OP_SMxxW_(H, 1, 1); } //----------------------------------------------------------------------------- // MRS / MSR //----------------------------------------------------------------------------- static int OP_MRS_CPSR(const u32 i) { GpVar x = c.newGpVar(kX86VarTypeGpd); c.mov(x, cpu_ptr(CPSR)); c.mov(reg_pos_ptr(12), x); return 1; } static int OP_MRS_SPSR(const u32 i) { GpVar x = c.newGpVar(kX86VarTypeGpd); c.mov(x, cpu_ptr(SPSR)); c.mov(reg_pos_ptr(12), x); return 1; } // TODO: SPSR: if(cpu->CPSR.bits.mode == USR || cpu->CPSR.bits.mode == SYS) return 1; #define OP_MSR_(reg, args, sw) \ GpVar operand = c.newGpVar(kX86VarTypeGpd); \ args; \ c.mov(operand, rhs); \ switch (((i>>16) & 0xF)) \ { \ case 0x1: /* bit 16 */ \ { \ GpVar mode = c.newGpVar(kX86VarTypeGpd); \ Label __skip = c.newLabel(); \ c.mov(mode, cpu_ptr(CPSR)); \ c.and_(mode, 0x1F); \ c.cmp(mode, USR); \ c.je(__skip); \ if (sw) \ { \ c.mov(mode, rhs); \ c.and_(mode, 0x1F); \ X86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, bb_cpu); \ ctx->setArgument(1, mode); \ } \ Mem xPSR_memB = cpu_ptr_byte(reg, 0); \ c.mov(xPSR_memB, operand.r8Lo()); \ changeCPSR; \ c.bind(__skip); \ } \ return 1; \ case 0x2: /* bit 17 */ \ { \ GpVar mode = c.newGpVar(kX86VarTypeGpd); \ Label __skip = c.newLabel(); \ c.mov(mode, cpu_ptr(CPSR)); \ c.and_(mode, 0x1F); \ c.cmp(mode, USR); \ c.je(__skip); \ Mem xPSR_memB = cpu_ptr_byte(reg, 1); \ c.shr(operand, 8); \ c.mov(xPSR_memB, operand.r8Lo()); \ changeCPSR; \ c.bind(__skip); \ } \ return 1; \ case 0x4: /* bit 18 */ \ { \ GpVar mode = c.newGpVar(kX86VarTypeGpd); \ Label __skip = c.newLabel(); \ c.mov(mode, cpu_ptr(CPSR)); \ c.and_(mode, 0x1F); \ c.cmp(mode, USR); \ c.je(__skip); \ Mem xPSR_memB = cpu_ptr_byte(reg, 2); \ c.shr(operand, 16); \ c.mov(xPSR_memB, operand.r8Lo()); \ changeCPSR; \ c.bind(__skip); \ } \ return 1; \ case 0x8: /* bit 19 */ \ { \ Mem xPSR_memB = cpu_ptr_byte(reg, 3); \ c.shr(operand, 24); \ c.mov(xPSR_memB, operand.r8Lo()); \ changeCPSR; \ } \ return 1; \ default: \ break; \ } \ \ static u32 byte_mask = (BIT16(i)?0x000000FF:0x00000000) | \ (BIT17(i)?0x0000FF00:0x00000000) | \ (BIT18(i)?0x00FF0000:0x00000000) | \ (BIT19(i)?0xFF000000:0x00000000); \ static u32 byte_mask_USR = (BIT19(i)?0xFF000000:0x00000000); \ \ Mem xPSR_mem = cpu_ptr(reg.val); \ GpVar xPSR = c.newGpVar(kX86VarTypeGpd); \ GpVar mode = c.newGpVar(kX86VarTypeGpd); \ Label __USR = c.newLabel(); \ Label __done = c.newLabel(); \ c.mov(mode, cpu_ptr(CPSR.val)); \ c.and_(mode, 0x1F); \ c.cmp(mode, USR); \ c.je(__USR); \ /* mode != USR */ \ if (sw && BIT16(i)) \ { \ /* armcpu_switchMode */ \ c.mov(mode, rhs); \ c.and_(mode, 0x1F); \ X86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, bb_cpu); \ ctx->setArgument(1, mode); \ } \ /* cpu->CPSR.val = (cpu->CPSR.val & ~byte_mask) | (operand & byte_mask); */ \ c.mov(xPSR, xPSR_mem); \ c.and_(operand, byte_mask); \ c.and_(xPSR, ~byte_mask); \ c.or_(xPSR, operand); \ c.mov(xPSR_mem, xPSR); \ c.jmp(__done); \ /* mode == USR */ \ c.bind(__USR); \ c.mov(xPSR, xPSR_mem); \ c.and_(operand, byte_mask_USR); \ c.and_(xPSR, ~byte_mask_USR); \ c.or_(xPSR, operand); \ c.mov(xPSR_mem, xPSR); \ c.bind(__done); \ changeCPSR; \ return 1; static int OP_MSR_CPSR(const u32 i) { OP_MSR_(CPSR, REG_OFF, 1); } static int OP_MSR_SPSR(const u32 i) { OP_MSR_(SPSR, REG_OFF, 0); } static int OP_MSR_CPSR_IMM_VAL(const u32 i) { OP_MSR_(CPSR, IMM_VAL, 1); } static int OP_MSR_SPSR_IMM_VAL(const u32 i) { OP_MSR_(SPSR, IMM_VAL, 0); } //----------------------------------------------------------------------------- // LDR //----------------------------------------------------------------------------- typedef u32 (FASTCALL* OpLDR)(u32, u32*); // 98% of all memory accesses land in the same region as the first execution of // that instruction, so keep multiple copies with different fastpaths. // The copies don't need to differ in any way; the point is merely to cooperate // with x86 branch prediction. enum { MEMTYPE_GENERIC = 0, // no assumptions MEMTYPE_MAIN = 1, MEMTYPE_DTCM = 2, MEMTYPE_ERAM = 3, MEMTYPE_SWIRAM = 4, MEMTYPE_OTHER = 5, // memory that is known to not be MAIN, DTCM, ERAM, or SWIRAM }; static u32 classify_adr(u32 adr, bool store) { if(PROCNUM==ARMCPU_ARM9 && (adr & ~0x3FFF) == MMU.DTCMRegion) return MEMTYPE_DTCM; else if((adr & 0x0F000000) == 0x02000000) return MEMTYPE_MAIN; else if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03800000) return MEMTYPE_ERAM; else if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03000000) return MEMTYPE_SWIRAM; else return MEMTYPE_GENERIC; } template static u32 FASTCALL OP_LDR(u32 adr, u32 *dstreg) { u32 data = READ32(cpu->mem_if->data, adr); if(adr&3) data = ROR(data, 8*(adr&3)); *dstreg = data; return MMU_aluMemAccessCycles(3,adr); } template static u32 FASTCALL OP_LDRH(u32 adr, u32 *dstreg) { *dstreg = READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } template static u32 FASTCALL OP_LDRSH(u32 adr, u32 *dstreg) { *dstreg = (s16)READ16(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } template static u32 FASTCALL OP_LDRB(u32 adr, u32 *dstreg) { *dstreg = READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } template static u32 FASTCALL OP_LDRSB(u32 adr, u32 *dstreg) { *dstreg = (s8)READ8(cpu->mem_if->data, adr); return MMU_aluMemAccessCycles(3,adr); } #define T(op) op<0,0>, op<0,1>, op<0,2>, NULL, NULL, op<1,0>, op<1,1>, NULL, op<1,3>, op<1,4> static const OpLDR LDR_tab[2][5] = { T(OP_LDR) }; static const OpLDR LDRH_tab[2][5] = { T(OP_LDRH) }; static const OpLDR LDRSH_tab[2][5] = { T(OP_LDRSH) }; static const OpLDR LDRB_tab[2][5] = { T(OP_LDRB) }; static const OpLDR LDRSB_tab[2][5] = { T(OP_LDRSB) }; #undef T static u32 add(u32 lhs, u32 rhs) { return lhs + rhs; } static u32 sub(u32 lhs, u32 rhs) { return lhs - rhs; } #define OP_LDR_(mem_op, arg, sign_op, writeback) \ GpVar adr = c.newGpVar(kX86VarTypeGpd); \ GpVar dst = c.newGpVar(kX86VarTypeGpz); \ c.mov(adr, reg_pos_ptr(16)); \ c.lea(dst, reg_pos_ptr(12)); \ arg; \ if(!rhs_is_imm || *(u32*)&rhs) \ { \ if(writeback == 0) \ c.sign_op(adr, rhs); \ else if(writeback < 0) \ { \ c.sign_op(adr, rhs); \ c.mov(reg_pos_ptr(16), adr); \ } \ else if(writeback > 0) \ { \ GpVar tmp_reg = c.newGpVar(kX86VarTypeGpd); \ c.mov(tmp_reg, adr); \ c.sign_op(tmp_reg, rhs); \ c.mov(reg_pos_ptr(16), tmp_reg); \ } \ } \ u32 adr_first = sign_op(cpu->R[REG_POS(i,16)], rhs_first); \ X86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,0)]); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, adr); \ ctx->setArgument(1, dst); \ ctx->setReturn(bb_cycles); \ if(REG_POS(i,12)==15) \ { \ GpVar tmp = c.newGpVar(kX86VarTypeGpd); \ c.mov(tmp, reg_ptr(15)); \ if (PROCNUM == 0) \ { \ GpVar thumb = c.newGpVar(kX86VarTypeGpz); \ c.movzx(thumb, reg_pos_ptrB(16)); \ c.and_(thumb, 1); \ c.shl(thumb, 5); \ c.or_(cpu_ptr(CPSR), thumb.r64()); \ c.and_(tmp, 0xFFFFFFFE); \ } \ else \ { \ c.and_(tmp, 0xFFFFFFFC); \ } \ c.mov(cpu_ptr(next_instruction), tmp); \ } \ return 1; // LDR static int OP_LDR_P_IMM_OFF(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, 0); } static int OP_LDR_M_IMM_OFF(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, 0); } static int OP_LDR_P_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, 0); } static int OP_LDR_M_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, 0); } static int OP_LDR_P_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, 0); } static int OP_LDR_M_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, 0); } static int OP_LDR_P_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, 0); } static int OP_LDR_M_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, 0); } static int OP_LDR_P_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, 0); } static int OP_LDR_M_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, 0); } static int OP_LDR_P_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, -1); } static int OP_LDR_M_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, -1); } static int OP_LDR_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, -1); } static int OP_LDR_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, -1); } static int OP_LDR_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, -1); } static int OP_LDR_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, -1); } static int OP_LDR_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, -1); } static int OP_LDR_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, -1); } static int OP_LDR_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, -1); } static int OP_LDR_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, -1); } static int OP_LDR_P_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, 1); } static int OP_LDR_M_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, 1); } static int OP_LDR_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, 1); } static int OP_LDR_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, 1); } static int OP_LDR_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, 1); } static int OP_LDR_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, 1); } static int OP_LDR_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, 1); } static int OP_LDR_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, 1); } static int OP_LDR_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, 1); } static int OP_LDR_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, 1); } // LDRH static int OP_LDRH_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, 0); } static int OP_LDRH_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, 0); } static int OP_LDRH_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, 0); } static int OP_LDRH_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, 0); } static int OP_LDRH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, -1); } static int OP_LDRH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, -1); } static int OP_LDRH_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, -1); } static int OP_LDRH_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, -1); } static int OP_LDRH_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, 1); } static int OP_LDRH_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, 1); } static int OP_LDRH_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, 1); } static int OP_LDRH_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, 1); } // LDRSH static int OP_LDRSH_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, 0); } static int OP_LDRSH_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, 0); } static int OP_LDRSH_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, 0); } static int OP_LDRSH_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, 0); } static int OP_LDRSH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, -1); } static int OP_LDRSH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, -1); } static int OP_LDRSH_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, -1); } static int OP_LDRSH_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, -1); } static int OP_LDRSH_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, 1); } static int OP_LDRSH_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, 1); } static int OP_LDRSH_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, 1); } static int OP_LDRSH_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, 1); } // LDRB static int OP_LDRB_P_IMM_OFF(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, 0); } static int OP_LDRB_M_IMM_OFF(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, 0); } static int OP_LDRB_P_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, 0); } static int OP_LDRB_M_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, 0); } static int OP_LDRB_P_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, 0); } static int OP_LDRB_M_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, 0); } static int OP_LDRB_P_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, 0); } static int OP_LDRB_M_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, 0); } static int OP_LDRB_P_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, 0); } static int OP_LDRB_M_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, 0); } static int OP_LDRB_P_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, -1); } static int OP_LDRB_M_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, -1); } static int OP_LDRB_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, -1); } static int OP_LDRB_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, -1); } static int OP_LDRB_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, -1); } static int OP_LDRB_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, -1); } static int OP_LDRB_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, -1); } static int OP_LDRB_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, -1); } static int OP_LDRB_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, -1); } static int OP_LDRB_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, -1); } static int OP_LDRB_P_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, 1); } static int OP_LDRB_M_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, 1); } static int OP_LDRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, 1); } static int OP_LDRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, 1); } static int OP_LDRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, 1); } static int OP_LDRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, 1); } static int OP_LDRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, 1); } static int OP_LDRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, 1); } static int OP_LDRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, 1); } static int OP_LDRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, 1); } // LDRSB static int OP_LDRSB_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, 0); } static int OP_LDRSB_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, 0); } static int OP_LDRSB_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, 0); } static int OP_LDRSB_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, 0); } static int OP_LDRSB_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, -1); } static int OP_LDRSB_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, -1); } static int OP_LDRSB_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, -1); } static int OP_LDRSB_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, -1); } static int OP_LDRSB_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, 1); } static int OP_LDRSB_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, 1); } static int OP_LDRSB_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, 1); } static int OP_LDRSB_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, 1); } //----------------------------------------------------------------------------- // STR //----------------------------------------------------------------------------- template static u32 FASTCALL OP_STR(u32 adr, u32 data) { WRITE32(cpu->mem_if->data, adr, data); return MMU_aluMemAccessCycles(2,adr); } template static u32 FASTCALL OP_STRH(u32 adr, u32 data) { WRITE16(cpu->mem_if->data, adr, data); return MMU_aluMemAccessCycles(2,adr); } template static u32 FASTCALL OP_STRB(u32 adr, u32 data) { WRITE8(cpu->mem_if->data, adr, data); return MMU_aluMemAccessCycles(2,adr); } typedef u32 (FASTCALL* OpSTR)(u32, u32); #define T(op) op<0,0>, op<0,1>, op<0,2>, op<1,0>, op<1,1>, NULL static const OpSTR STR_tab[2][3] = { T(OP_STR) }; static const OpSTR STRH_tab[2][3] = { T(OP_STRH) }; static const OpSTR STRB_tab[2][3] = { T(OP_STRB) }; #undef T #define OP_STR_(mem_op, arg, sign_op, writeback) \ GpVar adr = c.newGpVar(kX86VarTypeGpd); \ GpVar data = c.newGpVar(kX86VarTypeGpd); \ c.mov(adr, reg_pos_ptr(16)); \ c.mov(data, reg_pos_ptr(12)); \ arg; \ if(!rhs_is_imm || *(u32*)&rhs) \ { \ if(writeback == 0) \ c.sign_op(adr, rhs); \ else if(writeback < 0) \ { \ c.sign_op(adr, rhs); \ c.mov(reg_pos_ptr(16), adr); \ } \ else if(writeback > 0) \ { \ GpVar tmp_reg = c.newGpVar(kX86VarTypeGpd); \ c.mov(tmp_reg, adr); \ c.sign_op(tmp_reg, rhs); \ c.mov(reg_pos_ptr(16), tmp_reg); \ } \ } \ u32 adr_first = sign_op(cpu->R[REG_POS(i,16)], rhs_first); \ X86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,1)]); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, adr); \ ctx->setArgument(1, data); \ ctx->setReturn(bb_cycles); \ return 1; static int OP_STR_P_IMM_OFF(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, 0); } static int OP_STR_M_IMM_OFF(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, 0); } static int OP_STR_P_LSL_IMM_OFF(const u32 i) { OP_STR_(STR, LSL_IMM, add, 0); } static int OP_STR_M_LSL_IMM_OFF(const u32 i) { OP_STR_(STR, LSL_IMM, sub, 0); } static int OP_STR_P_LSR_IMM_OFF(const u32 i) { OP_STR_(STR, LSR_IMM, add, 0); } static int OP_STR_M_LSR_IMM_OFF(const u32 i) { OP_STR_(STR, LSR_IMM, sub, 0); } static int OP_STR_P_ASR_IMM_OFF(const u32 i) { OP_STR_(STR, ASR_IMM, add, 0); } static int OP_STR_M_ASR_IMM_OFF(const u32 i) { OP_STR_(STR, ASR_IMM, sub, 0); } static int OP_STR_P_ROR_IMM_OFF(const u32 i) { OP_STR_(STR, ROR_IMM, add, 0); } static int OP_STR_M_ROR_IMM_OFF(const u32 i) { OP_STR_(STR, ROR_IMM, sub, 0); } static int OP_STR_P_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, -1); } static int OP_STR_M_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, -1); } static int OP_STR_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSL_IMM, add, -1); } static int OP_STR_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSL_IMM, sub, -1); } static int OP_STR_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSR_IMM, add, -1); } static int OP_STR_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSR_IMM, sub, -1); } static int OP_STR_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ASR_IMM, add, -1); } static int OP_STR_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ASR_IMM, sub, -1); } static int OP_STR_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ROR_IMM, add, -1); } static int OP_STR_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ROR_IMM, sub, -1); } static int OP_STR_P_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, 1); } static int OP_STR_M_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, 1); } static int OP_STR_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSL_IMM, add, 1); } static int OP_STR_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSL_IMM, sub, 1); } static int OP_STR_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSR_IMM, add, 1); } static int OP_STR_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSR_IMM, sub, 1); } static int OP_STR_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ASR_IMM, add, 1); } static int OP_STR_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ASR_IMM, sub, 1); } static int OP_STR_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ROR_IMM, add, 1); } static int OP_STR_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ROR_IMM, sub, 1); } static int OP_STRH_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, 0); } static int OP_STRH_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, 0); } static int OP_STRH_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, 0); } static int OP_STRH_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, 0); } static int OP_STRH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, -1); } static int OP_STRH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, -1); } static int OP_STRH_PRE_INDE_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, -1); } static int OP_STRH_PRE_INDE_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, -1); } static int OP_STRH_POS_INDE_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, 1); } static int OP_STRH_POS_INDE_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, 1); } static int OP_STRH_POS_INDE_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, 1); } static int OP_STRH_POS_INDE_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, 1); } static int OP_STRB_P_IMM_OFF(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, 0); } static int OP_STRB_M_IMM_OFF(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, 0); } static int OP_STRB_P_LSL_IMM_OFF(const u32 i) { OP_STR_(STRB, LSL_IMM, add, 0); } static int OP_STRB_M_LSL_IMM_OFF(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, 0); } static int OP_STRB_P_LSR_IMM_OFF(const u32 i) { OP_STR_(STRB, LSR_IMM, add, 0); } static int OP_STRB_M_LSR_IMM_OFF(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, 0); } static int OP_STRB_P_ASR_IMM_OFF(const u32 i) { OP_STR_(STRB, ASR_IMM, add, 0); } static int OP_STRB_M_ASR_IMM_OFF(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, 0); } static int OP_STRB_P_ROR_IMM_OFF(const u32 i) { OP_STR_(STRB, ROR_IMM, add, 0); } static int OP_STRB_M_ROR_IMM_OFF(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, 0); } static int OP_STRB_P_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, -1); } static int OP_STRB_M_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, -1); } static int OP_STRB_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSL_IMM, add, -1); } static int OP_STRB_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, -1); } static int OP_STRB_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSR_IMM, add, -1); } static int OP_STRB_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, -1); } static int OP_STRB_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ASR_IMM, add, -1); } static int OP_STRB_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, -1); } static int OP_STRB_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ROR_IMM, add, -1); } static int OP_STRB_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, -1); } static int OP_STRB_P_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, 1); } static int OP_STRB_M_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, 1); } static int OP_STRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSL_IMM, add, 1); } static int OP_STRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, 1); } static int OP_STRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSR_IMM, add, 1); } static int OP_STRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, 1); } static int OP_STRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ASR_IMM, add, 1); } static int OP_STRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, 1); } static int OP_STRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ROR_IMM, add, 1); } static int OP_STRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, 1); } //----------------------------------------------------------------------------- // LDRD / STRD //----------------------------------------------------------------------------- typedef u32 FASTCALL (*LDRD_STRD_REG)(u32); template static u32 FASTCALL OP_LDRD_REG(u32 adr) { cpu->R[Rnum] = READ32(cpu->mem_if->data, adr); cpu->R[Rnum+1] = READ32(cpu->mem_if->data, adr+4); return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr+4)); } template static u32 FASTCALL OP_STRD_REG(u32 adr) { WRITE32(cpu->mem_if->data, adr, cpu->R[Rnum]); WRITE32(cpu->mem_if->data, adr + 4, cpu->R[Rnum + 1]); return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr+4)); } #define T(op, proc) op, op, op, op, op, op, op, op, op, op, op, op, op, op, op, op static const LDRD_STRD_REG op_ldrd_tab[2][16] = { {T(OP_LDRD_REG, 0)}, {T(OP_LDRD_REG, 1)} }; static const LDRD_STRD_REG op_strd_tab[2][16] = { {T(OP_STRD_REG, 0)}, {T(OP_STRD_REG, 1)} }; #undef T static int OP_LDRD_STRD_POST_INDEX(const u32 i) { u8 Rd_num = REG_POS(i, 12); if (Rd_num == 14) { printf("OP_LDRD_STRD_POST_INDEX: use R14!!!!\n"); return 0; // TODO: exception } if (Rd_num & 0x1) { printf("OP_LDRD_STRD_POST_INDEX: ERROR!!!!\n"); return 0; // TODO: exception } GpVar Rd = c.newGpVar(kX86VarTypeGpd); GpVar addr = c.newGpVar(kX86VarTypeGpd); c.mov(Rd, reg_pos_ptr(16)); c.mov(addr, reg_pos_ptr(16)); // I bit - immediate or register if (BIT22(i)) { IMM_OFF; BIT23(i)?c.add(reg_pos_ptr(16), rhs):c.sub(reg_pos_ptr(16), rhs); } else { GpVar idx = c.newGpVar(kX86VarTypeGpd); c.mov(idx, reg_pos_ptr(0)); BIT23(i)?c.add(reg_pos_ptr(16), idx):c.sub(reg_pos_ptr(16), idx); } X86CompilerFuncCall *ctx = c.call((void*)(BIT5(i) ? op_strd_tab[PROCNUM][Rd_num] : op_ldrd_tab[PROCNUM][Rd_num])); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); ctx->setArgument(0, addr); ctx->setReturn(bb_cycles); emit_MMU_aluMemCycles(3, bb_cycles, 0); return 1; } static int OP_LDRD_STRD_OFFSET_PRE_INDEX(const u32 i) { u8 Rd_num = REG_POS(i, 12); if (Rd_num == 14) { printf("OP_LDRD_STRD_OFFSET_PRE_INDEX: use R14!!!!\n"); return 0; // TODO: exception } if (Rd_num & 0x1) { printf("OP_LDRD_STRD_OFFSET_PRE_INDEX: ERROR!!!!\n"); return 0; // TODO: exception } GpVar Rd = c.newGpVar(kX86VarTypeGpd); GpVar addr = c.newGpVar(kX86VarTypeGpd); c.mov(Rd, reg_pos_ptr(16)); c.mov(addr, reg_pos_ptr(16)); // I bit - immediate or register if (BIT22(i)) { IMM_OFF; BIT23(i)?c.add(addr, rhs):c.sub(addr, rhs); } else BIT23(i)?c.add(addr, reg_pos_ptr(0)):c.sub(addr, reg_pos_ptr(0)); if (BIT5(i)) // Store { X86CompilerFuncCall *ctx = c.call((void*)op_strd_tab[PROCNUM][Rd_num]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); ctx->setArgument(0, addr); ctx->setReturn(bb_cycles); if (BIT21(i)) // W bit - writeback c.mov(reg_pos_ptr(16), addr); emit_MMU_aluMemCycles(3, bb_cycles, 0); } else // Load { if (BIT21(i)) // W bit - writeback c.mov(reg_pos_ptr(16), addr); X86CompilerFuncCall *ctx = c.call((void*)op_ldrd_tab[PROCNUM][Rd_num]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); ctx->setArgument(0, addr); ctx->setReturn(bb_cycles); emit_MMU_aluMemCycles(3, bb_cycles, 0); } return 1; } //----------------------------------------------------------------------------- // SWP/SWPB //----------------------------------------------------------------------------- template static u32 FASTCALL op_swp(u32 adr, u32 *Rd, u32 Rs) { u32 tmp = ROR(READ32(cpu->mem_if->data, adr), (adr & 3)<<3); WRITE32(cpu->mem_if->data, adr, Rs); *Rd = tmp; return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr)); } template static u32 FASTCALL op_swpb(u32 adr, u32 *Rd, u32 Rs) { u32 tmp = READ8(cpu->mem_if->data, adr); WRITE8(cpu->mem_if->data, adr, Rs); *Rd = tmp; return (MMU_memAccessCycles(adr) + MMU_memAccessCycles(adr)); } typedef u32 FASTCALL (*OP_SWP_SWPB)(u32, u32*, u32); static const OP_SWP_SWPB op_swp_tab[2][2] = {{ op_swp<0>, op_swp<1> }, { op_swpb<0>, op_swpb<1> }}; static int op_swp_(const u32 i, int b) { GpVar addr = c.newGpVar(kX86VarTypeGpd); GpVar Rd = c.newGpVar(kX86VarTypeGpz); GpVar Rs = c.newGpVar(kX86VarTypeGpd); c.mov(addr, reg_pos_ptr(16)); c.lea(Rd, reg_pos_ptr(12)); if(b) c.movzx(Rs, reg_pos_ptrB(0)); else c.mov(Rs, reg_pos_ptr(0)); X86CompilerFuncCall *ctx = c.call((void*)op_swp_tab[b][PROCNUM]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder3()); ctx->setArgument(0, addr); ctx->setArgument(1, Rd); ctx->setArgument(2, Rs); ctx->setReturn(bb_cycles); emit_MMU_aluMemCycles(4, bb_cycles, 0); return 1; } static int OP_SWP(const u32 i) { return op_swp_(i, 0); } static int OP_SWPB(const u32 i) { return op_swp_(i, 1); } //----------------------------------------------------------------------------- // LDMIA / LDMIB / LDMDA / LDMDB / STMIA / STMIB / STMDA / STMDB //----------------------------------------------------------------------------- static u32 popcount(u32 x) { uint32_t pop = 0; for(; x; x>>=1) pop += x&1; return pop; } static u64 get_reg_list(u32 reg_mask, int dir) { u64 regs = 0; for(int j=0; j<16; j++) { int k = dir<0 ? j : 15-j; if(BIT_N(reg_mask,k)) regs = (regs << 4) | k; } return regs; } #ifdef ASMJIT_X64 // generic needs to spill regs and main doesn't; if it's inlined gcc isn't smart enough to keep the spills out of the common case. #define LDM_INLINE NOINLINE #else // spills either way, and we might as well save codesize by not having separate functions #define LDM_INLINE INLINE #endif template static LDM_INLINE FASTCALL u32 OP_LDM_STM_generic(u32 adr, u64 regs, int n) { u32 cycles = 0; adr &= ~3; do { if(store) _MMU_write32(adr, cpu->R[regs&0xF]); else cpu->R[regs&0xF] = _MMU_read32(adr); cycles += MMU_memAccessCycles(adr); adr += 4*dir; regs >>= 4; } while(--n > 0); return cycles; } #ifdef ENABLE_ADVANCED_TIMING #define ADV_CYCLES cycles += MMU_memAccessCycles(adr); #else #define ADV_CYCLES #endif template static LDM_INLINE FASTCALL u32 OP_LDM_STM_other(u32 adr, u64 regs, int n) { u32 cycles = 0; adr &= ~3; #ifndef ENABLE_ADVANCED_TIMING cycles = n * MMU_memAccessCycles(adr); #endif do { if(PROCNUM==ARMCPU_ARM9) if(store) _MMU_ARM9_write32(adr, cpu->R[regs&0xF]); else cpu->R[regs&0xF] = _MMU_ARM9_read32(adr); else if(store) _MMU_ARM7_write32(adr, cpu->R[regs&0xF]); else cpu->R[regs&0xF] = _MMU_ARM7_read32(adr); ADV_CYCLES; adr += 4*dir; regs >>= 4; } while(--n > 0); return cycles; } template static FORCEINLINE FASTCALL u32 OP_LDM_STM_main(u32 adr, u64 regs, int n, u8 *ptr, u32 cycles) { #ifdef ENABLE_ADVANCED_TIMING cycles = 0; #endif uintptr_t *func = (uintptr_t *)&JIT_COMPILED_FUNC(adr, PROCNUM); #define OP(j) { \ /* no need to zero functions in DTCM, since we can't execute from it */ \ if(null_compiled && store) \ { \ *func = 0; \ *(func+1) = 0; \ } \ int Rd = ((uintptr_t)regs >> (j*4)) & 0xF; \ if(store) *(u32*)ptr = cpu->R[Rd]; \ else cpu->R[Rd] = *(u32*)ptr; \ ADV_CYCLES; \ func += 2*dir; \ adr += 4*dir; \ ptr += 4*dir; } do { OP(0); if(n == 1) break; OP(1); if(n == 2) break; OP(2); if(n == 3) break; OP(3); regs >>= 16; n -= 4; } while(n > 0); return cycles; #undef OP #undef ADV_CYCLES } template static u32 FASTCALL OP_LDM_STM(u32 adr, u64 regs, int n) { // TODO use classify_adr? u32 cycles; u8 *ptr; if((adr ^ (adr + (dir>0 ? (n-1)*4 : -15*4))) & ~0x3FFF) // a little conservative, but we don't want to run too many comparisons { // the memory region spans a page boundary, so we can't factor the address translation out of the loop return OP_LDM_STM_generic(adr, regs, n); } else if(PROCNUM==ARMCPU_ARM9 && (adr & ~0x3FFF) == MMU.DTCMRegion) { // don't special-case DTCM cycles, even though that would be both faster and more accurate, // because that wouldn't match the non-jitted version with !ACCOUNT_FOR_DATA_TCM_SPEED ptr = MMU.ARM9_DTCM + (adr & 0x3FFC); cycles = n * MMU_memAccessCycles(adr); if(store) return OP_LDM_STM_main(adr, regs, n, ptr, cycles); } else if((adr & 0x0F000000) == 0x02000000) { ptr = MMU.MAIN_MEM + (adr & _MMU_MAIN_MEM_MASK32); cycles = n * ((PROCNUM==ARMCPU_ARM9) ? 4 : 2); } else if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03800000) { ptr = MMU.ARM7_ERAM + (adr & 0xFFFC); cycles = n; } else if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03000000) { ptr = MMU.SWIRAM + (adr & 0x7FFC); cycles = n; } else return OP_LDM_STM_other(adr, regs, n); return OP_LDM_STM_main(adr, regs, n, ptr, cycles); } typedef u32 FASTCALL (*LDMOpFunc)(u32,u64,int); static const LDMOpFunc op_ldm_stm_tab[2][2][2] = {{ { OP_LDM_STM<0,0,-1>, OP_LDM_STM<0,0,+1> }, { OP_LDM_STM<0,1,-1>, OP_LDM_STM<0,1,+1> }, },{ { OP_LDM_STM<1,0,-1>, OP_LDM_STM<1,0,+1> }, { OP_LDM_STM<1,1,-1>, OP_LDM_STM<1,1,+1> }, }}; static void call_ldm_stm(GpVar adr, u32 bitmask, bool store, int dir) { if(bitmask) { GpVar n = c.newGpVar(kX86VarTypeGpd); c.mov(n, popcount(bitmask)); #ifdef ASMJIT_X64 GpVar regs = c.newGpVar(kX86VarTypeGpz); c.mov(regs, get_reg_list(bitmask, dir)); X86CompilerFuncCall *ctx = c.call((void*)op_ldm_stm_tab[PROCNUM][store][dir>0]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder3()); ctx->setArgument(0, adr); ctx->setArgument(1, regs); ctx->setArgument(2, n); #else // same prototype, but we have to handle splitting of a u64 arg manually GpVar regs_lo = c.newGpVar(kX86VarTypeGpd); GpVar regs_hi = c.newGpVar(kX86VarTypeGpd); c.mov(regs_lo, (u32)get_reg_list(bitmask, dir)); c.mov(regs_hi, get_reg_list(bitmask, dir) >> 32); X86CompilerFuncCall *ctx = c.call((void*)op_ldm_stm_tab[PROCNUM][store][dir>0]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder4()); ctx->setArgument(0, adr); ctx->setArgument(1, regs_lo); ctx->setArgument(2, regs_hi); ctx->setArgument(3, n); #endif ctx->setReturn(bb_cycles); } else bb_constant_cycles++; } static int op_bx(Mem srcreg, bool blx, bool test_thumb); static int op_bx_thumb(Mem srcreg, bool blx, bool test_thumb); static int op_ldm_stm(u32 i, bool store, int dir, bool before, bool writeback) { u32 bitmask = i & 0xFFFF; u32 pop = popcount(bitmask); GpVar adr = c.newGpVar(kX86VarTypeGpd); c.mov(adr, reg_pos_ptr(16)); if(before) c.add(adr, 4*dir); call_ldm_stm(adr, bitmask, store, dir); if(BIT15(i) && !store) { op_bx(reg_ptr(15), 0, PROCNUM == ARMCPU_ARM9); } if(writeback) { if(store || !(i & (1 << REG_POS(i,16)))) { JIT_COMMENT("--- writeback"); c.add(reg_pos_ptr(16), 4*dir*pop); } else { u32 bitlist = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; if(i & bitlist) { JIT_COMMENT("--- writeback"); c.add(adr, 4*dir*(pop-before)); c.mov(reg_pos_ptr(16), adr); } } } emit_MMU_aluMemCycles(store ? 1 : 2, bb_cycles, pop); return 1; } static int OP_LDMIA(const u32 i) { return op_ldm_stm(i, 0, +1, 0, 0); } static int OP_LDMIB(const u32 i) { return op_ldm_stm(i, 0, +1, 1, 0); } static int OP_LDMDA(const u32 i) { return op_ldm_stm(i, 0, -1, 0, 0); } static int OP_LDMDB(const u32 i) { return op_ldm_stm(i, 0, -1, 1, 0); } static int OP_LDMIA_W(const u32 i) { return op_ldm_stm(i, 0, +1, 0, 1); } static int OP_LDMIB_W(const u32 i) { return op_ldm_stm(i, 0, +1, 1, 1); } static int OP_LDMDA_W(const u32 i) { return op_ldm_stm(i, 0, -1, 0, 1); } static int OP_LDMDB_W(const u32 i) { return op_ldm_stm(i, 0, -1, 1, 1); } static int OP_STMIA(const u32 i) { return op_ldm_stm(i, 1, +1, 0, 0); } static int OP_STMIB(const u32 i) { return op_ldm_stm(i, 1, +1, 1, 0); } static int OP_STMDA(const u32 i) { return op_ldm_stm(i, 1, -1, 0, 0); } static int OP_STMDB(const u32 i) { return op_ldm_stm(i, 1, -1, 1, 0); } static int OP_STMIA_W(const u32 i) { return op_ldm_stm(i, 1, +1, 0, 1); } static int OP_STMIB_W(const u32 i) { return op_ldm_stm(i, 1, +1, 1, 1); } static int OP_STMDA_W(const u32 i) { return op_ldm_stm(i, 1, -1, 0, 1); } static int OP_STMDB_W(const u32 i) { return op_ldm_stm(i, 1, -1, 1, 1); } static int op_ldm_stm2(u32 i, bool store, int dir, bool before, bool writeback) { u32 bitmask = i & 0xFFFF; u32 pop = popcount(bitmask); bool bit15 = BIT15(i); //printf("ARM%c: %s R%d:%08X, bitmask %02X\n", PROCNUM?'7':'9', (store?"STM":"LDM"), REG_POS(i, 16), cpu->R[REG_POS(i, 16)], bitmask); u32 adr_first = cpu->R[REG_POS(i, 16)]; GpVar adr = c.newGpVar(kX86VarTypeGpd); GpVar oldmode = c.newGpVar(kX86VarTypeGpd); c.mov(adr, reg_pos_ptr(16)); if(before) c.add(adr, 4*dir); if (!bit15 || store) { //if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf("ERROR1\n"); return 1; } //oldmode = armcpu_switchMode(cpu, SYS); c.mov(oldmode, SYS); X86CompilerFuncCall *ctx = c.call((void*)armcpu_switchMode); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, bb_cpu); ctx->setArgument(1, oldmode); ctx->setReturn(oldmode); } call_ldm_stm(adr, bitmask, store, dir); if(!bit15 || store) { //armcpu_switchMode(cpu, oldmode); X86CompilerFuncCall *ctx = c.call((void*)armcpu_switchMode); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, bb_cpu); ctx->setArgument(1, oldmode); } else { S_DST_R15; } // FIXME if(writeback) { if(store || !(i & (1 << REG_POS(i,16)))) c.add(reg_pos_ptr(16), 4*dir*pop); else { u32 bitlist = (~((2 << REG_POS(i,16))-1)) & 0xFFFF; if(i & bitlist) { c.add(adr, 4*dir*(pop-before)); c.mov(reg_pos_ptr(16), adr); } } } emit_MMU_aluMemCycles(store ? 1 : 2, bb_cycles, pop); return 1; } static int OP_LDMIA2(const u32 i) { return op_ldm_stm2(i, 0, +1, 0, 0); } static int OP_LDMIB2(const u32 i) { return op_ldm_stm2(i, 0, +1, 1, 0); } static int OP_LDMDA2(const u32 i) { return op_ldm_stm2(i, 0, -1, 0, 0); } static int OP_LDMDB2(const u32 i) { return op_ldm_stm2(i, 0, -1, 1, 0); } static int OP_LDMIA2_W(const u32 i) { return op_ldm_stm2(i, 0, +1, 0, 1); } static int OP_LDMIB2_W(const u32 i) { return op_ldm_stm2(i, 0, +1, 1, 1); } static int OP_LDMDA2_W(const u32 i) { return op_ldm_stm2(i, 0, -1, 0, 1); } static int OP_LDMDB2_W(const u32 i) { return op_ldm_stm2(i, 0, -1, 1, 1); } static int OP_STMIA2(const u32 i) { return op_ldm_stm2(i, 1, +1, 0, 0); } static int OP_STMIB2(const u32 i) { return op_ldm_stm2(i, 1, +1, 1, 0); } static int OP_STMDA2(const u32 i) { return op_ldm_stm2(i, 1, -1, 0, 0); } static int OP_STMDB2(const u32 i) { return op_ldm_stm2(i, 1, -1, 1, 0); } static int OP_STMIA2_W(const u32 i) { return op_ldm_stm2(i, 1, +1, 0, 1); } static int OP_STMIB2_W(const u32 i) { return op_ldm_stm2(i, 1, +1, 1, 1); } static int OP_STMDA2_W(const u32 i) { return op_ldm_stm2(i, 1, -1, 0, 1); } static int OP_STMDB2_W(const u32 i) { return op_ldm_stm2(i, 1, -1, 1, 1); } //----------------------------------------------------------------------------- // Branch //----------------------------------------------------------------------------- #define SIGNEXTEND_11(i) (((s32)i<<21)>>21) #define SIGNEXTEND_24(i) (((s32)i<<8)>>8) static int op_b(u32 i, bool bl) { u32 dst = bb_r15 + (SIGNEXTEND_24(i) << 2); if(CONDITION(i)==0xF) { if(bl) dst += 2; c.or_(cpu_ptr_byte(CPSR, 0), 1<<5); } if(bl || CONDITION(i)==0xF) c.mov(reg_ptr(14), bb_next_instruction); c.mov(cpu_ptr(instruct_adr), dst); return 1; } static int OP_B(const u32 i) { return op_b(i, 0); } static int OP_BL(const u32 i) { return op_b(i, 1); } static int op_bx(Mem srcreg, bool blx, bool test_thumb) { GpVar dst = c.newGpVar(kX86VarTypeGpd); c.mov(dst, srcreg); if(test_thumb) { GpVar mask = c.newGpVar(kX86VarTypeGpd); GpVar thumb = dst; dst = c.newGpVar(kX86VarTypeGpd); c.mov(dst, thumb); c.and_(thumb, 1); c.lea(mask, ptr_abs((void*)0xFFFFFFFC, thumb.r64(), kScale2Times)); c.shl(thumb, 5); c.or_(cpu_ptr_byte(CPSR, 0), thumb.r8Lo()); c.and_(dst, mask); } else c.and_(dst, 0xFFFFFFFC); if(blx) c.mov(reg_ptr(14), bb_next_instruction); c.mov(cpu_ptr(instruct_adr), dst); return 1; } //TODO: exeption when Rm=PC static int OP_BX(const u32 i) { return op_bx(reg_pos_ptr(0), 0, 1); } static int OP_BLX_REG(const u32 i) { return op_bx(reg_pos_ptr(0), 1, 1); } //----------------------------------------------------------------------------- // CLZ //----------------------------------------------------------------------------- static int OP_CLZ(const u32 i) { GpVar res = c.newGpVar(kX86VarTypeGpd); c.mov(res, 0x3F); c.bsr(res, reg_pos_ptr(0)); c.xor_(res, 0x1F); c.mov(reg_pos_ptr(12), res); return 1; } //----------------------------------------------------------------------------- // MCR / MRC //----------------------------------------------------------------------------- #define maskPrecalc \ { \ X86CompilerFuncCall* ctxM = c.call((void*)maskPrecalc); \ ctxM->setPrototype(ASMJIT_CALL_CONV, FuncBuilder0()); \ } static int OP_MCR(const u32 i) { if (PROCNUM == ARMCPU_ARM7) return 0; u32 cpnum = REG_POS(i, 8); if(cpnum != 15) { // TODO - exception? printf("JIT: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\n", cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } if (REG_POS(i, 12) == 15) { printf("JIT: MCR Rd=R15\n"); return 2; } u8 CRn = REG_POS(i, 16); // Cn u8 CRm = REG_POS(i, 0); // Cm u8 opcode1 = ((i>>21)&0x7); // opcode1 u8 opcode2 = ((i>>5)&0x7); // opcode2 GpVar bb_cp15 = c.newGpVar(kX86VarTypeGpz); GpVar data = c.newGpVar(kX86VarTypeGpd); c.mov(data, reg_pos_ptr(12)); c.mov(bb_cp15, (uintptr_t)&cp15); bool bUnknown = false; switch(CRn) { case 1: if((opcode1==0) && (opcode2==0) && (CRm==0)) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); // On the NDS bit0,2,7,12..19 are R/W, Bit3..6 are always set, all other bits are always zero. //MMU.ARM9_RW_MODE = BIT7(val); GpVar bb_mmu = c.newGpVar(kX86VarTypeGpz); c.mov(bb_mmu, (uintptr_t)&MMU); Mem rwmode = mmu_ptr_byte(ARM9_RW_MODE); Mem ldtbit = cpu_ptr_byte(LDTBit, 0); c.test(data, (1<<7)); c.setnz(rwmode); //cpu->intVector = 0xFFFF0000 * (BIT13(val)); GpVar vec = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, 0xFFFF0000); c.xor_(vec, vec); c.test(data, (1 << 13)); c.cmovnz(vec, tmp); c.mov(cpu_ptr(intVector), vec); //cpu->LDTBit = !BIT15(val); //TBit c.test(data, (1 << 15)); c.setz(ldtbit); //ctrl = (val & 0x000FF085) | 0x00000078; c.and_(data, 0x000FF085); c.or_(data, 0x00000078); c.mov(cp15_ptr(ctrl), data); break; } bUnknown = true; break; case 2: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 0: // DCConfig = val; c.mov(cp15_ptr(DCConfig), data); break; case 1: // ICConfig = val; c.mov(cp15_ptr(ICConfig), data); break; default: bUnknown = true; break; } break; } bUnknown = true; break; case 3: if((opcode1==0) && (opcode2==0) && (CRm==0)) { //writeBuffCtrl = val; c.mov(cp15_ptr(writeBuffCtrl), data); break; } bUnknown = true; break; case 5: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 2: //DaccessPerm = val; c.mov(cp15_ptr(DaccessPerm), data); maskPrecalc; break; case 3: //IaccessPerm = val; c.mov(cp15_ptr(IaccessPerm), data); maskPrecalc; break; default: bUnknown = true; break; } } bUnknown = true; break; case 6: if((opcode1==0) && (opcode2==0)) { switch(CRm) { case 0: //protectBaseSize0 = val; c.mov(cp15_ptr(protectBaseSize0), data); maskPrecalc; break; case 1: //protectBaseSize1 = val; c.mov(cp15_ptr(protectBaseSize1), data); maskPrecalc; break; case 2: //protectBaseSize2 = val; c.mov(cp15_ptr(protectBaseSize2), data); maskPrecalc; break; case 3: //protectBaseSize3 = val; c.mov(cp15_ptr(protectBaseSize3), data); maskPrecalc; break; case 4: //protectBaseSize4 = val; c.mov(cp15_ptr(protectBaseSize4), data); maskPrecalc; break; case 5: //protectBaseSize5 = val; c.mov(cp15_ptr(protectBaseSize5), data); maskPrecalc; break; case 6: //protectBaseSize6 = val; c.mov(cp15_ptr(protectBaseSize6), data); maskPrecalc; break; case 7: //protectBaseSize7 = val; c.mov(cp15_ptr(protectBaseSize7), data); maskPrecalc; break; default: bUnknown = true; break; } } bUnknown = true; break; case 7: if((CRm==0)&&(opcode1==0)&&((opcode2==4))) { //CP15wait4IRQ; c.mov(cpu_ptr(waitIRQ), true); c.mov(cpu_ptr(halt_IE_and_IF), true); //IME set deliberately omitted: only SWI sets IME to 1 break; } bUnknown = true; break; case 9: if((opcode1==0)) { switch(CRm) { case 0: switch(opcode2) { case 0: //DcacheLock = val; c.mov(cp15_ptr(DcacheLock), data); break; case 1: //IcacheLock = val; c.mov(cp15_ptr(IcacheLock), data); break; default: bUnknown = true; break; } case 1: switch(opcode2) { case 0: { //MMU.DTCMRegion = DTCMRegion = val & 0x0FFFF000; c.and_(data, 0x0FFFF000); GpVar bb_mmu = c.newGpVar(kX86VarTypeGpz); c.mov(bb_mmu, (uintptr_t)&MMU); c.mov(mmu_ptr(DTCMRegion), data); c.mov(cp15_ptr(DTCMRegion), data); } break; case 1: { //ITCMRegion = val; //ITCM base is not writeable! GpVar bb_mmu = c.newGpVar(kX86VarTypeGpz); c.mov(bb_mmu, (uintptr_t)&MMU); c.mov(mmu_ptr(ITCMRegion), 0); c.mov(cp15_ptr(ITCMRegion), data); } break; default: bUnknown = true; break; } } break; } bUnknown = true; break; case 13: bUnknown = true; break; case 15: bUnknown = true; break; default: bUnknown = true; break; } if (bUnknown) { //printf("Unknown MCR command: MRC P15, 0, R%i, C%i, C%i, %i, %i\n", REG_POS(i, 12), CRn, CRm, opcode1, opcode2); return 1; } return 1; } static int OP_MRC(const u32 i) { if (PROCNUM == ARMCPU_ARM7) return 0; u32 cpnum = REG_POS(i, 8); if(cpnum != 15) { printf("MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\n", cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7); return 2; } u8 CRn = REG_POS(i, 16); // Cn u8 CRm = REG_POS(i, 0); // Cm u8 opcode1 = ((i>>21)&0x7); // opcode1 u8 opcode2 = ((i>>5)&0x7); // opcode2 GpVar bb_cp15 = c.newGpVar(kX86VarTypeGpz); GpVar data = c.newGpVar(kX86VarTypeGpd); c.mov(bb_cp15, (uintptr_t)&cp15); bool bUnknown = false; switch(CRn) { case 0: if((opcode1 == 0)&&(CRm==0)) { switch(opcode2) { case 1: // *R = cacheType; c.mov(data, cp15_ptr(cacheType)); break; case 2: // *R = TCMSize; c.mov(data, cp15_ptr(TCMSize)); break; default: // FIXME // *R = IDCode; c.mov(data, cp15_ptr(IDCode)); break; } break; } bUnknown = true; break; case 1: if((opcode1==0) && (opcode2==0) && (CRm==0)) { // *R = ctrl; c.mov(data, cp15_ptr(ctrl)); break; } bUnknown = true; break; case 2: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 0: // *R = DCConfig; c.mov(data, cp15_ptr(DCConfig)); break; case 1: // *R = ICConfig; c.mov(data, cp15_ptr(ICConfig)); break; default: bUnknown = true; break; } break; } bUnknown = true; break; case 3: if((opcode1==0) && (opcode2==0) && (CRm==0)) { // *R = writeBuffCtrl; c.mov(data, cp15_ptr(writeBuffCtrl)); break; } bUnknown = true; break; case 5: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 2: // *R = DaccessPerm; c.mov(data, cp15_ptr(DaccessPerm)); break; case 3: // *R = IaccessPerm; c.mov(data, cp15_ptr(IaccessPerm)); break; default: bUnknown = true; break; } break; } bUnknown = true; break; case 6: if((opcode1==0) && (opcode2==0)) { switch(CRm) { case 0: // *R = protectBaseSize0; c.mov(data, cp15_ptr(protectBaseSize0)); break; case 1: // *R = protectBaseSize1; c.mov(data, cp15_ptr(protectBaseSize1)); break; case 2: // *R = protectBaseSize2; c.mov(data, cp15_ptr(protectBaseSize2)); break; case 3: // *R = protectBaseSize3; c.mov(data, cp15_ptr(protectBaseSize3)); break; case 4: // *R = protectBaseSize4; c.mov(data, cp15_ptr(protectBaseSize4)); break; case 5: // *R = protectBaseSize5; c.mov(data, cp15_ptr(protectBaseSize5)); break; case 6: // *R = protectBaseSize6; c.mov(data, cp15_ptr(protectBaseSize6)); break; case 7: // *R = protectBaseSize7; c.mov(data, cp15_ptr(protectBaseSize7)); break; default: bUnknown = true; break; } break; } bUnknown = true; break; case 7: bUnknown = true; break; case 9: if(opcode1 == 0) { switch(CRm) { case 0: switch(opcode2) { case 0: //*R = DcacheLock; c.mov(data, cp15_ptr(DcacheLock)); break; case 1: //*R = IcacheLock; c.mov(data, cp15_ptr(IcacheLock)); break; default: bUnknown = true; break; } case 1: switch(opcode2) { case 0: //*R = DTCMRegion; c.mov(data, cp15_ptr(DTCMRegion)); break; case 1: //*R = ITCMRegion; c.mov(data, cp15_ptr(ITCMRegion)); break; default: bUnknown = true; break; } } // break; } bUnknown = true; break; case 13: bUnknown = true; break; case 15: bUnknown = true; break; default: bUnknown = true; break; } if (bUnknown) { //printf("Unknown MRC command: MRC P15, 0, R%i, C%i, C%i, %i, %i\n", REG_POS(i, 12), CRn, CRm, opcode1, opcode2); return 1; } if (REG_POS(i, 12) == 15) // set NZCV { //CPSR.bits.N = BIT31(data); //CPSR.bits.Z = BIT30(data); //CPSR.bits.C = BIT29(data); //CPSR.bits.V = BIT28(data); c.and_(data, 0xF0000000); c.and_(cpu_ptr(CPSR), 0x0FFFFFFF); c.or_(cpu_ptr(CPSR), data); } else c.mov(reg_pos_ptr(12), data); return 1; } u32 op_swi(u8 swinum) { if(cpu->swi_tab) { #if defined(_M_X64) || defined(__x86_64__) // TODO: return 0; #else X86CompilerFuncCall *ctx = c.call((void*)ARM_swi_tab[PROCNUM][swinum]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder0()); ctx->setReturn(bb_cycles); c.add(bb_cycles, 3); return 1; #endif } GpVar oldCPSR = c.newGpVar(kX86VarTypeGpd); GpVar mode = c.newGpVar(kX86VarTypeGpd); Mem CPSR = cpu_ptr(CPSR.val); JIT_COMMENT("store CPSR to x86 stack"); c.mov(oldCPSR, CPSR); JIT_COMMENT("enter SVC mode"); c.mov(mode, imm(SVC)); X86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, bb_cpu); ctx->setArgument(1, mode); c.unuse(mode); JIT_COMMENT("store next instruction address to R14"); c.mov(reg_ptr(14), bb_next_instruction); JIT_COMMENT("save old CPSR as new SPSR"); c.mov(cpu_ptr(SPSR.val), oldCPSR); JIT_COMMENT("CPSR: clear T, set I"); GpVar _cpsr = c.newGpVar(kX86VarTypeGpd); c.mov(_cpsr, CPSR); c.and_(_cpsr, ~(1 << 5)); /* clear T */ c.or_(_cpsr, (1 << 7)); /* set I */ c.mov(CPSR, _cpsr); c.unuse(_cpsr); JIT_COMMENT("set next instruction"); c.mov(cpu_ptr(next_instruction), imm(cpu->intVector+0x08)); return 1; } static int OP_SWI(const u32 i) { return op_swi((i >> 16) & 0x1F); } //----------------------------------------------------------------------------- // BKPT //----------------------------------------------------------------------------- static int OP_BKPT(const u32 i) { printf("JIT: unimplemented OP_BKPT\n"); return 0; } //----------------------------------------------------------------------------- // THUMB //----------------------------------------------------------------------------- #define OP_SHIFTS_IMM(x86inst) \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ u8 cf_change = 1; \ const u32 rhs = ((i>>6) & 0x1F); \ if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) \ c.x86inst(reg_pos_thumb(0), rhs); \ else \ { \ GpVar lhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(lhs, reg_pos_thumb(3)); \ c.x86inst(lhs, rhs); \ c.mov(reg_pos_thumb(0), lhs); \ c.unuse(lhs); \ } \ c.setc(rcf.r8Lo()); \ SET_NZC; \ return 1; #define OP_SHIFTS_REG(x86inst, bit) \ u8 cf_change = 1; \ GpVar imm = c.newGpVar(kX86VarTypeGpz); \ GpVar rcf = c.newGpVar(kX86VarTypeGpd); \ Label __eq32 = c.newLabel(); \ Label __ls32 = c.newLabel(); \ Label __zero = c.newLabel(); \ Label __done = c.newLabel(); \ \ c.mov(imm, reg_pos_thumb(3)); \ c.and_(imm, 0xFF); \ c.jz(__zero); \ c.cmp(imm, 32); \ c.jl(__ls32); \ c.je(__eq32); \ /* imm > 32 */ \ c.mov(reg_pos_thumb(0), 0); \ SET_NZC_SHIFTS_ZERO(0); \ c.jmp(__done); \ /* imm == 32 */ \ c.bind(__eq32); \ c.test(reg_pos_thumb(0), (1 << bit)); \ c.setnz(rcf.r8Lo()); \ c.mov(reg_pos_thumb(0), 0); \ SET_NZC_SHIFTS_ZERO(1); \ c.jmp(__done); \ /* imm == 0 */ \ c.bind(__zero); \ c.cmp(reg_pos_thumb(0), 0); \ SET_NZ(0); \ c.jmp(__done); \ /* imm < 32 */ \ c.bind(__ls32); \ c.x86inst(reg_pos_thumb(0), imm); \ c.setc(rcf.r8Lo()); \ SET_NZC; \ c.bind(__done); \ return 1; #define OP_LOGIC(x86inst, _conv) \ GpVar rhs = c.newGpVar(kX86VarTypeGpd); \ c.mov(rhs, reg_pos_thumb(3)); \ if (_conv==1) c.not_(rhs); \ c.x86inst(reg_pos_thumb(0), rhs); \ SET_NZ(0); \ return 1; //----------------------------------------------------------------------------- // LSL / LSR / ASR / ROR //----------------------------------------------------------------------------- static int OP_LSL_0(const u32 i) { if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) c.cmp(reg_pos_thumb(0), 0); else { GpVar rhs = c.newGpVar(kX86VarTypeGpd); c.mov(rhs, reg_pos_thumb(3)); c.mov(reg_pos_thumb(0), rhs); c.cmp(rhs, 0); } SET_NZ(0); return 1; } static int OP_LSL(const u32 i) { OP_SHIFTS_IMM(shl); } static int OP_LSL_REG(const u32 i) { OP_SHIFTS_REG(shl, 0); } static int OP_LSR_0(const u32 i) { GpVar rcf = c.newGpVar(kX86VarTypeGpd); c.test(reg_pos_thumb(3), (1 << 31)); c.setnz(rcf.r8Lo()); SET_NZC_SHIFTS_ZERO(1); c.mov(reg_pos_thumb(0), 0); return 1; } static int OP_LSR(const u32 i) { OP_SHIFTS_IMM(shr); } static int OP_LSR_REG(const u32 i) { OP_SHIFTS_REG(shr, 31); } static int OP_ASR_0(const u32 i) { u8 cf_change = 1; GpVar rcf = c.newGpVar(kX86VarTypeGpd); GpVar rhs = c.newGpVar(kX86VarTypeGpd); if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) c.sar(reg_pos_thumb(0), 31); else { c.mov(rhs, reg_pos_thumb(3)); c.sar(rhs, 31); c.mov(reg_pos_thumb(0), rhs); } c.sets(rcf.r8Lo()); SET_NZC; return 1; } static int OP_ASR(const u32 i) { OP_SHIFTS_IMM(sar); } static int OP_ASR_REG(const u32 i) { u8 cf_change = 1; Label __gr0 = c.newLabel(); Label __lt32 = c.newLabel(); Label __done = c.newLabel(); Label __setFlags = c.newLabel(); GpVar imm = c.newGpVar(kX86VarTypeGpz); GpVar rcf = c.newGpVar(kX86VarTypeGpd); c.mov(imm, reg_pos_thumb(3)); c.and_(imm, 0xFF); c.jnz(__gr0); /* imm == 0 */ c.cmp(reg_pos_thumb(0), 0); SET_NZ(0); c.jmp(__done); /* imm > 0 */ c.bind(__gr0); c.cmp(imm, 32); c.jl(__lt32); /* imm > 31 */ c.sar(reg_pos_thumb(0), 31); c.sets(rcf.r8Lo()); c.jmp(__setFlags); /* imm < 32 */ c.bind(__lt32); c.sar(reg_pos_thumb(0), imm); c.setc(rcf.r8Lo()); c.bind(__setFlags); SET_NZC; c.bind(__done); return 1; } //----------------------------------------------------------------------------- // ROR //----------------------------------------------------------------------------- static int OP_ROR_REG(const u32 i) { u8 cf_change = 1; GpVar imm = c.newGpVar(kX86VarTypeGpz); GpVar rcf = c.newGpVar(kX86VarTypeGpd); Label __zero = c.newLabel(); Label __zero_1F = c.newLabel(); Label __done = c.newLabel(); c.mov(imm, reg_pos_thumb(3)); c.and_(imm, 0xFF); c.jz(__zero); c.and_(imm, 0x1F); c.jz(__zero_1F); c.ror(reg_pos_thumb(0), imm); c.setc(rcf.r8Lo()); SET_NZC; c.jmp(__done); /* imm & 0x1F == 0 */ c.bind(__zero_1F); c.cmp(reg_pos_thumb(0), 0); c.sets(rcf.r8Lo()); SET_NZC; c.jmp(__done); /* imm == 0 */ c.bind(__zero); c.cmp(reg_pos_thumb(0), 0); SET_NZ(0); c.bind(__done); return 1; } //----------------------------------------------------------------------------- // AND / ORR / EOR / BIC //----------------------------------------------------------------------------- static int OP_AND(const u32 i) { OP_LOGIC(and_, 0); } static int OP_ORR(const u32 i) { OP_LOGIC(or_, 0); } static int OP_EOR(const u32 i) { OP_LOGIC(xor_, 0); } static int OP_BIC(const u32 i) { OP_LOGIC(and_, 1); } //----------------------------------------------------------------------------- // NEG //----------------------------------------------------------------------------- static int OP_NEG(const u32 i) { if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) c.neg(reg_pos_thumb(0)); else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.neg(tmp); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(1); return 1; } //----------------------------------------------------------------------------- // ADD //----------------------------------------------------------------------------- static int OP_ADD_IMM3(const u32 i) { u32 imm3 = (i >> 6) & 0x07; if (imm3 == 0) // mov 2 { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.mov(reg_pos_thumb(0), tmp); c.cmp(tmp, 0); SET_NZ(1); return 1; } if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) { c.add(reg_pos_thumb(0), imm3); } else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.add(tmp, imm3); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(0); return 1; } static int OP_ADD_IMM8(const u32 i) { c.add(reg_pos_thumb(8), (i & 0xFF)); SET_NZCV(0); return 1; } static int OP_ADD_REG(const u32 i) { //cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]; if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(6)); c.add(reg_pos_thumb(0), tmp); } else if (_REG_NUM(i, 0) == _REG_NUM(i, 6)) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.add(reg_pos_thumb(0), tmp); } else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.add(tmp, reg_pos_thumb(6)); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(0); return 1; } static int OP_ADD_SPE(const u32 i) { u32 Rd = _REG_NUM(i, 0) | ((i>>4)&8); //cpu->R[Rd] += cpu->R[REG_POS(i, 3)]; GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_ptr(Rd)); c.add(tmp, reg_pos_ptr(3)); c.mov(reg_ptr(Rd), tmp); if(Rd==15) c.mov(cpu_ptr(next_instruction), tmp); return 1; } static int OP_ADD_2PC(const u32 i) { u32 imm = ((i&0xFF)<<2); c.mov(reg_pos_thumb(8), (bb_r15 & 0xFFFFFFFC) + imm); return 1; } static int OP_ADD_2SP(const u32 i) { u32 imm = ((i&0xFF)<<2); //cpu->R[REG_NUM(i, 8)] = cpu->R[13] + ((i&0xFF)<<2); GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_ptr(13)); if (imm) c.add(tmp, imm); c.mov(reg_pos_thumb(8), tmp); return 1; } //----------------------------------------------------------------------------- // SUB //----------------------------------------------------------------------------- static int OP_SUB_IMM3(const u32 i) { u32 imm3 = (i >> 6) & 0x07; // cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] - imm3; if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) { c.sub(reg_pos_thumb(0), imm3); } else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.sub(tmp, imm3); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(1); return 1; } static int OP_SUB_IMM8(const u32 i) { //cpu->R[REG_NUM(i, 8)] -= imm8; c.sub(reg_pos_thumb(8), (i & 0xFF)); SET_NZCV(1); return 1; } static int OP_SUB_REG(const u32 i) { // cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] - cpu->R[REG_NUM(i, 6)]; if (_REG_NUM(i, 0) == _REG_NUM(i, 3)) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(6)); c.sub(reg_pos_thumb(0), tmp); } else { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.sub(tmp, reg_pos_thumb(6)); c.mov(reg_pos_thumb(0), tmp); } SET_NZCV(1); return 1; } //----------------------------------------------------------------------------- // ADC //----------------------------------------------------------------------------- static int OP_ADC_REG(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); GET_CARRY(0); c.adc(reg_pos_thumb(0), tmp); SET_NZCV(0); return 1; } //----------------------------------------------------------------------------- // SBC //----------------------------------------------------------------------------- static int OP_SBC_REG(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); GET_CARRY(1); c.sbb(reg_pos_thumb(0), tmp); SET_NZCV(1); return 1; } //----------------------------------------------------------------------------- // MOV / MVN //----------------------------------------------------------------------------- static int OP_MOV_IMM8(const u32 i) { c.mov(reg_pos_thumb(8), (i & 0xFF)); c.cmp(reg_pos_thumb(8), 0); SET_NZ(0); return 1; } static int OP_MOV_SPE(const u32 i) { u32 Rd = _REG_NUM(i, 0) | ((i>>4)&8); //cpu->R[Rd] = cpu->R[REG_POS(i, 3)]; GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_ptr(3)); c.mov(reg_ptr(Rd), tmp); if(Rd == 15) { c.mov(cpu_ptr(next_instruction), tmp); bb_constant_cycles += 2; } return 1; } static int OP_MVN(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.not_(tmp); c.cmp(tmp, 0); c.mov(reg_pos_thumb(0), tmp); SET_NZ(0); return 1; } //----------------------------------------------------------------------------- // MUL //----------------------------------------------------------------------------- static int OP_MUL_REG(const u32 i) { GpVar lhs = c.newGpVar(kX86VarTypeGpd); c.mov(lhs, reg_pos_thumb(0)); c.imul(lhs, reg_pos_thumb(3)); c.cmp(lhs, 0); c.mov(reg_pos_thumb(0), lhs); SET_NZ(0); if (PROCNUM == ARMCPU_ARM7) c.mov(bb_cycles, 4); else MUL_Mxx_END(lhs, 0, 1); return 1; } //----------------------------------------------------------------------------- // CMP / CMN //----------------------------------------------------------------------------- static int OP_CMP_IMM8(const u32 i) { c.cmp(reg_pos_thumb(8), (i & 0xFF)); SET_NZCV(1); return 1; } static int OP_CMP(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.cmp(reg_pos_thumb(0), tmp); SET_NZCV(1); return 1; } static int OP_CMP_SPE(const u32 i) { u32 Rn = (i&7) | ((i>>4)&8); GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_ptr(3)); c.cmp(reg_ptr(Rn), tmp); SET_NZCV(1); return 1; } static int OP_CMN(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(0)); c.add(tmp, reg_pos_thumb(3)); SET_NZCV(0); return 1; } //----------------------------------------------------------------------------- // TST //----------------------------------------------------------------------------- static int OP_TST(const u32 i) { GpVar tmp = c.newGpVar(kX86VarTypeGpd); c.mov(tmp, reg_pos_thumb(3)); c.test(reg_pos_thumb(0), tmp); SET_NZ(0); return 1; } //----------------------------------------------------------------------------- // STR / LDR / STRB / LDRB //----------------------------------------------------------------------------- #define STR_THUMB(mem_op, offset) \ GpVar addr = c.newGpVar(kX86VarTypeGpd); \ GpVar data = c.newGpVar(kX86VarTypeGpd); \ u32 adr_first = cpu->R[_REG_NUM(i, 3)]; \ \ c.mov(addr, reg_pos_thumb(3)); \ if ((offset) != -1) \ { \ if ((offset) != 0) \ { \ c.add(addr, (u32)(offset)); \ adr_first += (u32)(offset); \ } \ } \ else \ { \ c.add(addr, reg_pos_thumb(6)); \ adr_first += cpu->R[_REG_NUM(i, 6)]; \ } \ c.mov(data, reg_pos_thumb(0)); \ X86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,1)]); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, addr); \ ctx->setArgument(1, data); \ ctx->setReturn(bb_cycles); \ return 1; #define LDR_THUMB(mem_op, offset) \ GpVar addr = c.newGpVar(kX86VarTypeGpd); \ GpVar data = c.newGpVar(kX86VarTypeGpz); \ u32 adr_first = cpu->R[_REG_NUM(i, 3)]; \ \ c.mov(addr, reg_pos_thumb(3)); \ if ((offset) != -1) \ { \ if ((offset) != 0) \ { \ c.add(addr, (u32)(offset)); \ adr_first += (u32)(offset); \ } \ } \ else \ { \ c.add(addr, reg_pos_thumb(6)); \ adr_first += cpu->R[_REG_NUM(i, 6)]; \ } \ c.lea(data, reg_pos_thumb(0)); \ X86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,0)]); \ ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); \ ctx->setArgument(0, addr); \ ctx->setArgument(1, data); \ ctx->setReturn(bb_cycles); \ return 1; static int OP_STRB_IMM_OFF(const u32 i) { STR_THUMB(STRB, ((i>>6)&0x1F)); } static int OP_LDRB_IMM_OFF(const u32 i) { LDR_THUMB(LDRB, ((i>>6)&0x1F)); } static int OP_STRB_REG_OFF(const u32 i) { STR_THUMB(STRB, -1); } static int OP_LDRB_REG_OFF(const u32 i) { LDR_THUMB(LDRB, -1); } static int OP_LDRSB_REG_OFF(const u32 i) { LDR_THUMB(LDRSB, -1); } static int OP_STRH_IMM_OFF(const u32 i) { STR_THUMB(STRH, ((i>>5)&0x3E)); } static int OP_LDRH_IMM_OFF(const u32 i) { LDR_THUMB(LDRH, ((i>>5)&0x3E)); } static int OP_STRH_REG_OFF(const u32 i) { STR_THUMB(STRH, -1); } static int OP_LDRH_REG_OFF(const u32 i) { LDR_THUMB(LDRH, -1); } static int OP_LDRSH_REG_OFF(const u32 i) { LDR_THUMB(LDRSH, -1); } static int OP_STR_IMM_OFF(const u32 i) { STR_THUMB(STR, ((i>>4)&0x7C)); } static int OP_LDR_IMM_OFF(const u32 i) { LDR_THUMB(LDR, ((i>>4)&0x7C)); } // FIXME: tempValue = (tempValue>>adr) | (tempValue<<(32-adr)); static int OP_STR_REG_OFF(const u32 i) { STR_THUMB(STR, -1); } static int OP_LDR_REG_OFF(const u32 i) { LDR_THUMB(LDR, -1); } static int OP_STR_SPREL(const u32 i) { u32 imm = ((i&0xFF)<<2); u32 adr_first = cpu->R[13] + imm; GpVar addr = c.newGpVar(kX86VarTypeGpd); c.mov(addr, reg_ptr(13)); if (imm) c.add(addr, imm); GpVar data = c.newGpVar(kX86VarTypeGpd); c.mov(data, reg_pos_thumb(8)); X86CompilerFuncCall *ctx = c.call((void*)STR_tab[PROCNUM][classify_adr(adr_first,1)]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, addr); ctx->setArgument(1, data); ctx->setReturn(bb_cycles); return 1; } static int OP_LDR_SPREL(const u32 i) { u32 imm = ((i&0xFF)<<2); u32 adr_first = cpu->R[13] + imm; GpVar addr = c.newGpVar(kX86VarTypeGpd); c.mov(addr, reg_ptr(13)); if (imm) c.add(addr, imm); GpVar data = c.newGpVar(kX86VarTypeGpz); c.lea(data, reg_pos_thumb(8)); X86CompilerFuncCall *ctx = c.call((void*)LDR_tab[PROCNUM][classify_adr(adr_first,0)]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, addr); ctx->setArgument(1, data); ctx->setReturn(bb_cycles); return 1; } static int OP_LDR_PCREL(const u32 i) { u32 imm = ((i&0xFF)<<2); u32 adr_first = (bb_r15 & 0xFFFFFFFC) + imm; GpVar addr = c.newGpVar(kX86VarTypeGpd); GpVar data = c.newGpVar(kX86VarTypeGpz); c.mov(addr, adr_first); c.lea(data, reg_pos_thumb(8)); X86CompilerFuncCall *ctx = c.call((void*)LDR_tab[PROCNUM][classify_adr(adr_first,0)]); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2()); ctx->setArgument(0, addr); ctx->setArgument(1, data); ctx->setReturn(bb_cycles); return 1; } //----------------------------------------------------------------------------- // STMIA / LDMIA //----------------------------------------------------------------------------- static int op_ldm_stm_thumb(u32 i, bool store) { u32 bitmask = i & 0xFF; u32 pop = popcount(bitmask); //if (BIT_N(i, _REG_NUM(i, 8))) // printf("WARNING - %sIA with Rb in Rlist (THUMB)\n", store?"STM":"LDM"); GpVar adr = c.newGpVar(kX86VarTypeGpd); c.mov(adr, reg_pos_thumb(8)); call_ldm_stm(adr, bitmask, store, 1); // ARM_REF: THUMB: Causes base register write-back, and is not optional // ARM_REF: If the base register is specified in , the final value of is the loaded value // (not the written-back value). if (store) c.add(reg_pos_thumb(8), 4*pop); else { if (!BIT_N(i, _REG_NUM(i, 8))) c.add(reg_pos_thumb(8), 4*pop); } emit_MMU_aluMemCycles(store ? 2 : 3, bb_cycles, pop); return 1; } static int OP_LDMIA_THUMB(const u32 i) { return op_ldm_stm_thumb(i, 0); } static int OP_STMIA_THUMB(const u32 i) { return op_ldm_stm_thumb(i, 1); } //----------------------------------------------------------------------------- // Adjust SP //----------------------------------------------------------------------------- static int OP_ADJUST_P_SP(const u32 i) { c.add(reg_ptr(13), ((i&0x7F)<<2)); return 1; } static int OP_ADJUST_M_SP(const u32 i) { c.sub(reg_ptr(13), ((i&0x7F)<<2)); return 1; } //----------------------------------------------------------------------------- // PUSH / POP //----------------------------------------------------------------------------- static int op_push_pop(u32 i, bool store, bool pc_lr) { u32 bitmask = (i & 0xFF); bitmask |= pc_lr << (store ? 14 : 15); u32 pop = popcount(bitmask); int dir = store ? -1 : 1; GpVar adr = c.newGpVar(kX86VarTypeGpd); c.mov(adr, reg_ptr(13)); if(store) c.sub(adr, 4); call_ldm_stm(adr, bitmask, store, dir); if(pc_lr && !store) op_bx_thumb(reg_ptr(15), 0, PROCNUM == ARMCPU_ARM9); c.add(reg_ptr(13), 4*dir*pop); emit_MMU_aluMemCycles(store ? (pc_lr?4:3) : (pc_lr?5:2), bb_cycles, pop); return 1; } static int OP_PUSH(const u32 i) { return op_push_pop(i, 1, 0); } static int OP_PUSH_LR(const u32 i) { return op_push_pop(i, 1, 1); } static int OP_POP(const u32 i) { return op_push_pop(i, 0, 0); } static int OP_POP_PC(const u32 i) { return op_push_pop(i, 0, 1); } //----------------------------------------------------------------------------- // Branch //----------------------------------------------------------------------------- static int OP_B_COND(const u32 i) { Label skip = c.newLabel(); u32 dst = bb_r15 + ((u32)((s8)(i&0xFF))<<1); c.mov(cpu_ptr(instruct_adr), bb_next_instruction); emit_branch((i>>8)&0xF, skip); c.mov(cpu_ptr(instruct_adr), dst); c.add(bb_total_cycles, 2); c.bind(skip); return 1; } static int OP_B_UNCOND(const u32 i) { u32 dst = bb_r15 + (SIGNEXTEND_11(i)<<1); c.mov(cpu_ptr(instruct_adr), dst); return 1; } static int OP_BLX(const u32 i) { GpVar dst = c.newGpVar(kX86VarTypeGpd); c.mov(dst, reg_ptr(14)); c.add(dst, (i&0x7FF) << 1); c.and_(dst, 0xFFFFFFFC); c.mov(cpu_ptr(instruct_adr), dst); c.mov(reg_ptr(14), bb_next_instruction | 1); // reset T bit c.and_(cpu_ptr_byte(CPSR, 0), ~(1<<5)); return 1; } static int OP_BL_10(const u32 i) { u32 dst = bb_r15 + (SIGNEXTEND_11(i)<<12); c.mov(reg_ptr(14), dst); return 1; } static int OP_BL_11(const u32 i) { GpVar dst = c.newGpVar(kX86VarTypeGpd); c.mov(dst, reg_ptr(14)); c.add(dst, (i&0x7FF) << 1); c.mov(cpu_ptr(instruct_adr), dst); c.mov(reg_ptr(14), bb_next_instruction | 1); return 1; } static int op_bx_thumb(Mem srcreg, bool blx, bool test_thumb) { GpVar dst = c.newGpVar(kX86VarTypeGpd); GpVar thumb = c.newGpVar(kX86VarTypeGpd); c.mov(dst, srcreg); c.mov(thumb, dst); // * cpu->CPSR.bits.T = BIT0(Rm); c.and_(thumb, 1); // * if (blx) c.mov(reg_ptr(14), bb_next_instruction | 1); if(test_thumb) { GpVar mask = c.newGpVar(kX86VarTypeGpd); c.lea(mask, ptr_abs((void*)0xFFFFFFFC, thumb.r64(), kScale2Times)); c.and_(dst, mask); } else c.and_(dst, 0xFFFFFFFE); GpVar tmp = c.newGpVar(kX86VarTypeGpd); // * c.mov(tmp, cpu_ptr_byte(CPSR, 0)); // * c.and_(tmp, ~(1<< 5)); // * c.shl(thumb, 5); // * c.or_(tmp, thumb); // * c.mov(cpu_ptr_byte(CPSR, 0), tmp.r8Lo()); // ****************************** c.mov(cpu_ptr(instruct_adr), dst); return 1; } static int OP_BX_THUMB(const u32 i) { if (REG_POS(i, 3) == 15) c.mov(reg_ptr(15), bb_r15); return op_bx_thumb(reg_pos_ptr(3), 0, 0); } static int OP_BLX_THUMB(const u32 i) { return op_bx_thumb(reg_pos_ptr(3), 1, 1); } static int OP_SWI_THUMB(const u32 i) { return op_swi(i & 0x1F); } //----------------------------------------------------------------------------- // Unimplemented; fall back to the C versions //----------------------------------------------------------------------------- #define OP_UND NULL #define OP_LDREX NULL #define OP_STREX NULL #define OP_LDC_P_IMM_OFF NULL #define OP_LDC_M_IMM_OFF NULL #define OP_LDC_P_PREIND NULL #define OP_LDC_M_PREIND NULL #define OP_LDC_P_POSTIND NULL #define OP_LDC_M_POSTIND NULL #define OP_LDC_OPTION NULL #define OP_STC_P_IMM_OFF NULL #define OP_STC_M_IMM_OFF NULL #define OP_STC_P_PREIND NULL #define OP_STC_M_PREIND NULL #define OP_STC_P_POSTIND NULL #define OP_STC_M_POSTIND NULL #define OP_STC_OPTION NULL #define OP_CDP NULL #define OP_UND_THUMB NULL #define OP_BKPT_THUMB NULL //----------------------------------------------------------------------------- // Dispatch table //----------------------------------------------------------------------------- typedef int (*ArmOpCompiler)(u32); static const ArmOpCompiler arm_instruction_compilers[4096] = { #define TABDECL(x) x #include "instruction_tabdef.inc" #undef TABDECL }; static const ArmOpCompiler thumb_instruction_compilers[1024] = { #define TABDECL(x) x #include "thumb_tabdef.inc" #undef TABDECL }; //----------------------------------------------------------------------------- // Generic instruction wrapper //----------------------------------------------------------------------------- template static u32 FASTCALL OP_DECODE() { u32 cycles; u32 adr = cpu->instruct_adr; if(thumb) { cpu->next_instruction = adr + 2; cpu->R[15] = adr + 4; u32 opcode = _MMU_read16(adr); _armlog(PROCNUM, adr, opcode); cycles = thumb_instructions_set[PROCNUM][opcode>>6](opcode); } else { cpu->next_instruction = adr + 4; cpu->R[15] = adr + 8; u32 opcode = _MMU_read32(adr); _armlog(PROCNUM, adr, opcode); if(CONDITION(opcode) == 0xE || TEST_COND(CONDITION(opcode), CODE(opcode), cpu->CPSR)) cycles = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)](opcode); else cycles = 1; } cpu->instruct_adr = cpu->next_instruction; return cycles; } static const ArmOpCompiled op_decode[2][2] = { OP_DECODE<0,0>, OP_DECODE<0,1>, OP_DECODE<1,0>, OP_DECODE<1,1> }; //----------------------------------------------------------------------------- // Compiler //----------------------------------------------------------------------------- static u32 instr_attributes(u32 opcode) { return bb_thumb ? thumb_attributes[opcode>>6] : instruction_attributes[INSTRUCTION_INDEX(opcode)]; } static bool instr_is_branch(u32 opcode) { u32 x = instr_attributes(opcode); if(bb_thumb) return (x & BRANCH_ALWAYS) || ((x & BRANCH_POS0) && ((opcode&7) | ((opcode>>4)&8)) == 15) || (x & BRANCH_SWI) || (x & JIT_BYPASS); else return (x & BRANCH_ALWAYS) || ((x & BRANCH_POS12) && REG_POS(opcode,12) == 15) || ((x & BRANCH_LDM) && BIT15(opcode)) || (x & BRANCH_SWI) || (x & JIT_BYPASS); } static bool instr_uses_r15(u32 opcode) { u32 x = instr_attributes(opcode); if(bb_thumb) return ((x & SRCREG_POS0) && ((opcode&7) | ((opcode>>4)&8)) == 15) || ((x & SRCREG_POS3) && REG_POS(opcode,3) == 15) || (x & JIT_BYPASS); else return ((x & SRCREG_POS0) && REG_POS(opcode,0) == 15) || ((x & SRCREG_POS8) && REG_POS(opcode,8) == 15) || ((x & SRCREG_POS12) && REG_POS(opcode,12) == 15) || ((x & SRCREG_POS16) && REG_POS(opcode,16) == 15) || ((x & SRCREG_STM) && BIT15(opcode)) || (x & JIT_BYPASS); } static bool instr_is_conditional(u32 opcode) { if(bb_thumb) return false; return !(CONDITION(opcode) == 0xE || (CONDITION(opcode) == 0xF && CODE(opcode) == 5)); } static int instr_cycles(u32 opcode) { u32 x = instr_attributes(opcode); u32 c = (x & INSTR_CYCLES_MASK); if(c == INSTR_CYCLES_VARIABLE) { if ((x & BRANCH_SWI) && !cpu->swi_tab) return 3; return 0; } if(instr_is_branch(opcode) && !(instr_attributes(opcode) & (BRANCH_ALWAYS|BRANCH_LDM))) c += 2; return c; } static bool instr_does_prefetch(u32 opcode) { u32 x = instr_attributes(opcode); if(bb_thumb) return thumb_instruction_compilers[opcode>>6] && (x & BRANCH_ALWAYS); else return instr_is_branch(opcode) && arm_instruction_compilers[INSTRUCTION_INDEX(opcode)] && ((x & BRANCH_ALWAYS) || (x & BRANCH_LDM)); } static const char *disassemble(u32 opcode) { if(bb_thumb) return thumb_instruction_names[opcode>>6]; static char str[100]; strcpy(str, arm_instruction_names[INSTRUCTION_INDEX(opcode)]); static const char *conds[16] = {"EQ","NE","CS","CC","MI","PL","VS","VC","HI","LS","GE","LT","GT","LE","AL","NV"}; if(instr_is_conditional(opcode)) { strcat(str, "."); strcat(str, conds[CONDITION(opcode)]); } return str; } static void sync_r15(u32 opcode, bool is_last, bool force) { if(instr_does_prefetch(opcode)) { assert(!instr_uses_r15(opcode)); if(force) { JIT_COMMENT("sync_r15: force instruct_adr %08Xh (PREFETCH)", bb_adr); c.mov(cpu_ptr(instruct_adr), bb_next_instruction); } } else { if(force || (instr_attributes(opcode) & JIT_BYPASS) || (instr_attributes(opcode) & BRANCH_SWI) || (is_last && !instr_is_branch(opcode))) { JIT_COMMENT("sync_r15: next_instruction %08Xh - %s%s%s%s", bb_next_instruction, force?" FORCE":"", (instr_attributes(opcode) & JIT_BYPASS)?" BYPASS":"", (instr_attributes(opcode) & BRANCH_SWI)?" SWI":"", (is_last && !instr_is_branch(opcode))?" LAST":"" ); c.mov(cpu_ptr(next_instruction), bb_next_instruction); } if(instr_uses_r15(opcode)) { JIT_COMMENT("sync_r15: R15 %08Xh (USES R15)", bb_r15); c.mov(reg_ptr(15), bb_r15); } if(instr_attributes(opcode) & JIT_BYPASS) { JIT_COMMENT("sync_r15: instruct_adr %08Xh (JIT_BYPASS)", bb_adr); c.mov(cpu_ptr(instruct_adr), bb_adr); } } } static void emit_branch(int cond, Label to) { JIT_COMMENT("emit_branch cond %02X", cond); static const u8 cond_bit[] = {0x40, 0x40, 0x20, 0x20, 0x80, 0x80, 0x10, 0x10}; if(cond < 8) { c.test(flags_ptr, cond_bit[cond]); (cond & 1)?c.jnz(to):c.jz(to); } else { GpVar x = c.newGpVar(kX86VarTypeGpz); c.movzx(x, flags_ptr); c.and_(x, 0xF0); #if defined(_M_X64) || defined(__x86_64__) c.add(x, offsetof(armcpu_t,cond_table) + cond); c.test(byte_ptr(bb_cpu, x), 1); #else c.test(byte_ptr_abs((void*)(arm_cond_table + cond), x, kScaleNone), 1); #endif c.unuse(x); c.jz(to); } } static void emit_armop_call(u32 opcode) { ArmOpCompiler fc = bb_thumb? thumb_instruction_compilers[opcode>>6]: arm_instruction_compilers[INSTRUCTION_INDEX(opcode)]; if (fc && fc(opcode)) return; JIT_COMMENT("call interpreter"); GpVar arg = c.newGpVar(kX86VarTypeGpd); c.mov(arg, opcode); OpFunc f = bb_thumb ? thumb_instructions_set[PROCNUM][opcode>>6] : arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)]; X86CompilerFuncCall* ctx = c.call((void*)f); ctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1()); ctx->setArgument(0, arg); ctx->setReturn(bb_cycles); } static void _armlog(u8 proc, u32 addr, u32 opcode) { #if 0 #if 0 fprintf(stderr, "\t\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\n\t\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\n", cpu->R[0], cpu->R[1], cpu->R[2], cpu->R[3], cpu->R[4], cpu->R[5], cpu->R[6], cpu->R[7], cpu->R[8], cpu->R[9], cpu->R[10], cpu->R[11], cpu->R[12], cpu->R[13], cpu->R[14], cpu->R[15], cpu->next_instruction, cpu->CPSR.bits.N, cpu->CPSR.bits.Z, cpu->CPSR.bits.C, cpu->CPSR.bits.V); #endif #define INDEX22(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF)) char dasmbuf[4096]; if(cpu->CPSR.bits.T) des_thumb_instructions_set[((opcode)>>6)&1023](addr, opcode, dasmbuf); else des_arm_instructions_set[INDEX22(opcode)](addr, opcode, dasmbuf); #undef INDEX22 fprintf(stderr, "%s%c %08X\t%08X \t%s\n", cpu->CPSR.bits.T?"THUMB":"ARM", proc?'7':'9', addr, opcode, dasmbuf); #else return; #endif } template static u32 compile_basicblock() { #if LOG_JIT bool has_variable_cycles = FALSE; #endif u32 interpreted_cycles = 0; u32 start_adr = cpu->instruct_adr; u32 opcode = 0; bb_thumb = cpu->CPSR.bits.T; bb_opcodesize = bb_thumb ? 2 : 4; if (!JIT_MAPPED(start_adr & 0x0FFFFFFF, PROCNUM)) { printf("JIT: use unmapped memory address %08X\n", start_adr); execute = false; return 1; } #if LOG_JIT fprintf(stderr, "adr %08Xh %s%c\n", start_adr, ARMPROC.CPSR.bits.T ? "THUMB":"ARM", PROCNUM?'7':'9'); #endif c.clear(); c.newFunc(ASMJIT_CALL_CONV, FuncBuilder0()); c.getFunc()->setHint(kFuncHintNaked, true); c.getFunc()->setHint(kX86FuncHintPushPop, true); JIT_COMMENT("CPU ptr"); bb_cpu = c.newGpVar(kX86VarTypeGpz); c.mov(bb_cpu, (uintptr_t)&ARMPROC); JIT_COMMENT("reset bb_total_cycles"); bb_total_cycles = c.newGpVar(kX86VarTypeGpz); c.mov(bb_total_cycles, 0); #if (PROFILER_JIT_LEVEL > 0) JIT_COMMENT("Profiler ptr"); bb_profiler = c.newGpVar(kX86VarTypeGpz); c.mov(bb_profiler, (uintptr_t)&profiler_counter[PROCNUM]); #endif bb_constant_cycles = 0; for(u32 i=0, bEndBlock = 0; bEndBlock == 0; i++) { bb_adr = start_adr + (i * bb_opcodesize); if(bb_thumb) opcode = _MMU_read16(bb_adr); else opcode = _MMU_read32(bb_adr); #if LOG_JIT char dasmbuf[1024] = {0}; if(bb_thumb) des_thumb_instructions_set[opcode>>6](bb_adr, opcode, dasmbuf); else des_arm_instructions_set[INSTRUCTION_INDEX(opcode)](bb_adr, opcode, dasmbuf); fprintf(stderr, "%08X\t%s\t\t; %s \n", bb_adr, dasmbuf, disassemble(opcode)); #endif u32 cycles = instr_cycles(opcode); bEndBlock = (i >= (CommonSettings.jit_max_block_size - 1)) || instr_is_branch(opcode); #if LOG_JIT if (instr_is_conditional(opcode) && (cycles > 1) || (cycles == 0)) has_variable_cycles = TRUE; #endif bb_cycles = c.newGpVar(kX86VarTypeGpz); bb_constant_cycles += instr_is_conditional(opcode) ? 1 : cycles; JIT_COMMENT("%s (PC:%08X)", disassemble(opcode), bb_adr); #if (PROFILER_JIT_LEVEL > 0) JIT_COMMENT("*** profiler - counter"); if (bb_thumb) c.add(profiler_counter_thumb(opcode), 1); else c.add(profiler_counter_arm(opcode), 1); #endif if(instr_is_conditional(opcode)) { // 25% of conditional instructions are immediately followed by // another with the same condition, but merging them into a // single branch has negligible effect on speed. if(bEndBlock) sync_r15(opcode, 1, 1); Label skip = c.newLabel(); emit_branch(CONDITION(opcode), skip); if(!bEndBlock) sync_r15(opcode, 0, 0); emit_armop_call(opcode); if(cycles == 0) { JIT_COMMENT("variable cycles"); c.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), bb_cycles.r64(), kScaleNone, -1)); } else if (cycles > 1) { JIT_COMMENT("cycles (%d)", cycles); c.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), -1)); } c.bind(skip); } else { sync_r15(opcode, bEndBlock, 0); emit_armop_call(opcode); if(cycles == 0) { JIT_COMMENT("variable cycles"); c.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), bb_cycles.r64(), kScaleNone)); } } interpreted_cycles += op_decode[PROCNUM][bb_thumb](); } if(!instr_does_prefetch(opcode)) { JIT_COMMENT("!instr_does_prefetch: copy next_instruction (%08X) to instruct_adr (%08X)", cpu->next_instruction, cpu->instruct_adr); GpVar x = c.newGpVar(kX86VarTypeGpd); c.mov(x, cpu_ptr(next_instruction)); c.mov(cpu_ptr(instruct_adr), x); c.unuse(x); //c.mov(cpu_ptr(instruct_adr), bb_adr); //c.mov(cpu_ptr(instruct_adr), bb_next_instruction); } JIT_COMMENT("total cycles (block)"); if (bb_constant_cycles > 0) c.add(bb_total_cycles, bb_constant_cycles); #if (PROFILER_JIT_LEVEL > 1) JIT_COMMENT("*** profiler - cycles"); u32 padr = ((start_adr & 0x07FFFFFE) >> 1); bb_profiler_entry = c.newGpVar(kX86VarTypeGpz); c.mov(bb_profiler_entry, (uintptr_t)&profiler_entry[PROCNUM][padr]); c.add(dword_ptr(bb_profiler_entry, offsetof(PROFILER_ENTRY, cycles)), bb_total_cycles); profiler_entry[PROCNUM][padr].addr = start_adr; #endif c.ret(bb_total_cycles); #if LOG_JIT fprintf(stderr, "cycles %d%s\n", bb_constant_cycles, has_variable_cycles ? " + variable" : ""); #endif c.endFunc(); ArmOpCompiled f = (ArmOpCompiled)c.make(); if(c.getError()) { fprintf(stderr, "JIT error at %s%c-%08X: %s\n", bb_thumb?"THUMB":"ARM", PROCNUM?'7':'9', start_adr, getErrorString(c.getError())); f = op_decode[PROCNUM][bb_thumb]; } #if LOG_JIT uintptr_t baddr = (uintptr_t)f; fprintf(stderr, "Block address %08lX\n\n", baddr); fflush(stderr); #endif JIT_COMPILED_FUNC(start_adr, PROCNUM) = (uintptr_t)f; return interpreted_cycles; } template u32 arm_jit_compile() { *PROCNUM_ptr = PROCNUM; // prevent endless recompilation of self-modifying code, which would be a memleak since we only free code all at once. // also allows us to clear compiled_funcs[] while leaving it sparsely allocated, if the OS does memory overcommit. u32 adr = cpu->instruct_adr; u32 mask_adr = (adr & 0x07FFFFFE) >> 4; if(((recompile_counts[mask_adr >> 1] >> 4*(mask_adr & 1)) & 0xF) > 8) { ArmOpCompiled f = op_decode[PROCNUM][cpu->CPSR.bits.T]; JIT_COMPILED_FUNC(adr, PROCNUM) = (uintptr_t)f; return f(); } recompile_counts[mask_adr >> 1] += 1 << 4*(mask_adr & 1); return compile_basicblock(); } template u32 arm_jit_compile<0>(); template u32 arm_jit_compile<1>(); void arm_jit_reset(bool enable) { #if LOG_JIT c.setLogger(&logger); #ifdef _WINDOWS freopen("\\desmume_jit.log", "w", stderr); #endif #endif #ifdef HAVE_STATIC_CODE_BUFFER scratchptr = scratchpad; #endif printf("CPU mode: %s\n", enable?"JIT":"Interpreter"); if (enable) { printf("JIT: max block size %d instruction(s)\n", CommonSettings.jit_max_block_size); #ifdef MAPPED_JIT_FUNCS //these pointers are allocated by asmjit and need freeing #define JITFREE(x) for(int iii=0;iiifree((void*)x[iii]); memset(x,0,sizeof(x)); JITFREE(JIT.MAIN_MEM); JITFREE(JIT.SWIRAM); JITFREE(JIT.ARM9_ITCM); JITFREE(JIT.ARM9_LCDC); JITFREE(JIT.ARM9_BIOS); JITFREE(JIT.ARM7_BIOS); JITFREE(JIT.ARM7_ERAM); JITFREE(JIT.ARM7_WIRAM); JITFREE(JIT.ARM7_WRAM); #undef JITFREE memset(recompile_counts, 0, sizeof(recompile_counts)); init_jit_mem(); #else for(int i=0; i 0) reconstruct(&profiler_counter[0]); reconstruct(&profiler_counter[1]); #if (PROFILER_JIT_LEVEL > 1) for (u8 t = 0; t < 2; t++) { for (u32 i = 0; i < (1<<26); i++) memset(&profiler_entry[t][i], 0, sizeof(PROFILER_ENTRY)); } #endif #endif } #if (PROFILER_JIT_LEVEL > 0) static int pcmp(PROFILER_COUNTER_INFO *info1, PROFILER_COUNTER_INFO *info2) { return (int)(info2->count - info1->count); } #if (PROFILER_JIT_LEVEL > 1) static int pcmp_entry(PROFILER_ENTRY *info1, PROFILER_ENTRY *info2) { return (int)(info1->cycles - info2->cycles); } #endif #endif void arm_jit_close() { #if (PROFILER_JIT_LEVEL > 0) printf("Generating profile report..."); for (u8 proc = 0; proc < 2; proc++) { extern GameInfo gameInfo; u16 last[2] = {0}; PROFILER_COUNTER_INFO *arm_info = NULL; PROFILER_COUNTER_INFO *thumb_info = NULL; arm_info = new PROFILER_COUNTER_INFO[4096]; thumb_info = new PROFILER_COUNTER_INFO[1024]; memset(arm_info, 0, sizeof(PROFILER_COUNTER_INFO) * 4096); memset(thumb_info, 0, sizeof(PROFILER_COUNTER_INFO) * 1024); // ARM last[0] = 0; for (u16 i=0; i < 4096; i++) { u16 t = 0; if (profiler_counter[proc].arm_count[i] == 0) continue; for (t = 0; t < last[0]; t++) { if (strcmp(arm_instruction_names[i], arm_info[t].name) == 0) { arm_info[t].count += profiler_counter[proc].arm_count[i]; break; } } if (t == last[0]) { strcpy(arm_info[last[0]++].name, arm_instruction_names[i]); arm_info[t].count = profiler_counter[proc].arm_count[i]; } } // THUMB last[1] = 0; for (u16 i=0; i < 1024; i++) { u16 t = 0; if (profiler_counter[proc].thumb_count[i] == 0) continue; for (t = 0; t < last[1]; t++) { if (strcmp(thumb_instruction_names[i], thumb_info[t].name) == 0) { thumb_info[t].count += profiler_counter[proc].thumb_count[i]; break; } } if (t == last[1]) { strcpy(thumb_info[last[1]++].name, thumb_instruction_names[i]); thumb_info[t].count = profiler_counter[proc].thumb_count[i]; } } std::qsort(arm_info, last[0], sizeof(PROFILER_COUNTER_INFO), (int (*)(const void *, const void *))pcmp); std::qsort(thumb_info, last[1], sizeof(PROFILER_COUNTER_INFO), (int (*)(const void *, const void *))pcmp); char buf[MAX_PATH] = {0}; sprintf(buf, "\\desmume_jit%c_counter.profiler", proc==0?'9':'7'); FILE *fp = fopen(buf, "w"); if (fp) { if (!gameInfo.isHomebrew) { fprintf(fp, "Name: %s\n", gameInfo.ROMname); fprintf(fp, "Serial: %s\n", gameInfo.ROMserial); } else fprintf(fp, "Homebrew\n"); fprintf(fp, "CPU: ARM%c\n\n", proc==0?'9':'7'); if (last[0]) { fprintf(fp, "========================================== ARM ==========================================\n"); for (int i=0; i < last[0]; i++) fprintf(fp, "%30s: %20ld\n", arm_info[i].name, arm_info[i].count); fprintf(fp, "\n"); } if (last[1]) { fprintf(fp, "========================================== THUMB ==========================================\n"); for (int i=0; i < last[1]; i++) fprintf(fp, "%30s: %20ld\n", thumb_info[i].name, thumb_info[i].count); fprintf(fp, "\n"); } fclose(fp); } delete [] arm_info; arm_info = NULL; delete [] thumb_info; thumb_info = NULL; #if (PROFILER_JIT_LEVEL > 1) sprintf(buf, "\\desmume_jit%c_entry.profiler", proc==0?'9':'7'); fp = fopen(buf, "w"); if (fp) { u32 count = 0; PROFILER_ENTRY *tmp = NULL; fprintf(fp, "Entrypoints (cycles):\n"); tmp = new PROFILER_ENTRY[1<<26]; memset(tmp, 0, sizeof(PROFILER_ENTRY) * (1<<26)); for (u32 i = 0; i < (1<<26); i++) { if (profiler_entry[proc][i].cycles == 0) continue; memcpy(&tmp[count++], &profiler_entry[proc][i], sizeof(PROFILER_ENTRY)); } std::qsort(tmp, count, sizeof(PROFILER_ENTRY), (int (*)(const void *, const void *))pcmp_entry); if (!gameInfo.isHomebrew) { fprintf(fp, "Name: %s\n", gameInfo.ROMname); fprintf(fp, "Serial: %s\n", gameInfo.ROMserial); } else fprintf(fp, "Homebrew\n"); fprintf(fp, "CPU: ARM%c\n\n", proc==0?'9':'7'); while ((count--) > 0) fprintf(fp, "%08X: %20ld\n", tmp[count].addr, tmp[count].cycles); delete [] tmp; tmp = NULL; fclose(fp); } #endif } printf(" done.\n"); #endif } #endif // HAVE_JIT desmume-0.9.9/src/agg2d.inl0000644000175000017500000020166512140261633016211 0ustar guillaumeguillaume//---------------------------------------------------------------------------- // Agg2D - Version 1.0 // Based on Anti-Grain Geometry // Copyright (C) 2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // // 25 Jan 2007 - Ported to AGG 2.4 Jerry Evans (jerry@novadsp.com) // 11 Jul 2009 - significant refactors for introduction to desmume // //---------------------------------------------------------------------------- #include "agg2d.h" static const double g_approxScale = 2.0; #define TAGG2D Agg2D AGG2D_TEMPLATE_ARG #define TAGG2DRENDERER Agg2DRenderer //AGG2D_TEMPLATE inline bool operator == (const TAGG2D::Color& c1, const TAGG2D::Color& c2) //{ // return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a; //} // //AGG2D_TEMPLATE inline bool operator != (const Agg2D::Color& c1, const Agg2D::Color& c2) //{ // return !(c1 == c2); //} AGG2D_TEMPLATE inline TAGG2D::~Agg2D() { #ifdef AGG2D_USE_VECTORFONTS #ifndef AGG2D_USE_FREETYPE ::ReleaseDC(0, m_fontDC); #endif #endif } AGG2D_TEMPLATE inline TAGG2D::Agg2D() : m_rbuf(), m_pixFormat(m_rbuf), m_pixFormatComp(m_rbuf), m_pixFormatPre(m_rbuf), m_pixFormatCompPre(m_rbuf), m_renBase(m_pixFormat), m_renBaseComp(m_pixFormatComp), m_renBasePre(m_pixFormatPre), m_renBaseCompPre(m_pixFormatCompPre), m_renSolid(m_renBase), m_renSolidComp(m_renBaseComp), m_allocator(), m_clipBox(0,0,0,0), m_blendMode(BlendAlpha), m_imageBlendMode(BlendDst), m_imageBlendColor(0,0,0), m_scanline(), m_rasterizer(), m_masterAlpha(1.0), m_antiAliasGamma(1.0), m_font(agg::gse4x6), m_fillColor(255, 255, 255), m_lineColor(0, 0, 0), m_fillGradient(), m_lineGradient(), m_lineCap(CAP_ROUND), m_lineJoin(JOIN_ROUND), m_fillGradientFlag(Solid), m_lineGradientFlag(Solid), m_fillGradientMatrix(), m_lineGradientMatrix(), m_fillGradientD1(0.0), m_lineGradientD1(0.0), m_fillGradientD2(100.0), m_lineGradientD2(100.0), m_textAngle(0.0), m_textAlignX(AlignLeft), m_textAlignY(AlignBottom), m_textHints(true), m_fontHeight(0.0), m_fontAscent(0.0), m_fontDescent(0.0), m_fontCacheType(RasterFontCache), //m_imageFilter(Bilinear), //less quality more speed m_imageFilter(NoFilter), m_imageResample(NoResample), m_imageFilterLut(agg::image_filter_bilinear(), true), m_fillGradientInterpolator(m_fillGradientMatrix), m_lineGradientInterpolator(m_lineGradientMatrix), m_linearGradientFunction(), m_radialGradientFunction(), m_lineWidth(1), m_evenOddFlag(false), m_start_x(0.0), m_start_y(0.0), m_path(), m_transform(), m_convCurve(m_path), m_convStroke(m_convCurve), m_pathTransform(m_convCurve, m_transform), m_strokeTransform(m_convStroke, m_transform) #ifdef AGG2D_USE_VECTORFONTS #ifdef AGG2D_USE_FREETYPE , m_fontEngine(), #else m_fontDC(::GetDC(0)), m_fontEngine(m_fontDC), #endif m_fontCacheManager(m_fontEngine) #endif { lineCap(m_lineCap); lineJoin(m_lineJoin); } AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::saveStateTo(State& st) { st.m_clipBox = m_clipBox; st.m_blendMode = m_blendMode; st.m_imageBlendMode = m_imageBlendMode; st.m_imageBlendColor = m_imageBlendColor; st.m_masterAlpha = m_masterAlpha; st.m_antiAliasGamma = m_antiAliasGamma; st.m_font = m_font; st.m_fillColor = m_fillColor; st.m_lineColor = m_lineColor; st.m_fillGradient = m_fillGradient; st.m_lineGradient = m_lineGradient; st.m_lineCap = m_lineCap; st.m_lineJoin = m_lineJoin; st.m_fillGradientFlag = m_fillGradientFlag; st.m_lineGradientFlag = m_lineGradientFlag; st.m_fillGradientMatrix = m_fillGradientMatrix; st.m_lineGradientMatrix = m_lineGradientMatrix; st.m_fillGradientD1 = m_fillGradientD1; st.m_lineGradientD1 = m_lineGradientD1; st.m_fillGradientD2 = m_fillGradientD2; st.m_lineGradientD2 = m_lineGradientD2; st.m_textAngle = m_textAngle; st.m_textAlignX = m_textAlignX; st.m_textAlignY = m_textAlignY; st.m_textHints = m_textHints; st.m_fontHeight = m_fontHeight; st.m_fontAscent = m_fontAscent; st.m_fontDescent = m_fontDescent; st.m_fontCacheType = m_fontCacheType; st.m_lineWidth = m_lineWidth; st.m_evenOddFlag = m_evenOddFlag; st.m_transform = m_transform; st.m_affine = m_affine; } AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::restoreStateFrom(const State& st) { m_clipBox = st.m_clipBox; m_blendMode = st.m_blendMode; m_imageBlendMode = st.m_imageBlendMode; m_imageBlendColor = st.m_imageBlendColor; m_masterAlpha = st.m_masterAlpha; m_antiAliasGamma = st.m_antiAliasGamma; m_font = st.m_font; m_fillColor = st.m_fillColor; m_lineColor = st.m_lineColor; m_fillGradient = st.m_fillGradient; m_lineGradient = st.m_lineGradient; m_lineCap = st.m_lineCap; m_lineJoin = st.m_lineJoin; m_fillGradientFlag = st.m_fillGradientFlag; m_lineGradientFlag = st.m_lineGradientFlag; m_fillGradientMatrix = st.m_fillGradientMatrix; m_lineGradientMatrix = st.m_lineGradientMatrix; m_fillGradientD1 = st.m_fillGradientD1; m_lineGradientD1 = st.m_lineGradientD1; m_fillGradientD2 = st.m_fillGradientD2; m_lineGradientD2 = st.m_lineGradientD2; m_textAngle = st.m_textAngle; m_textAlignX = st.m_textAlignX; m_textAlignY = st.m_textAlignY; m_textHints = st.m_textHints; m_fontHeight = st.m_fontHeight; m_fontAscent = st.m_fontAscent; m_fontDescent = st.m_fontDescent; m_fontCacheType = st.m_fontCacheType; m_lineWidth = st.m_lineWidth; m_evenOddFlag = st.m_evenOddFlag; m_affine = st.m_affine; m_transform = st.m_transform; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(unsigned char* buf, unsigned width, unsigned height, int stride) { m_rbuf.attach(buf, width, height, stride); m_renBase.reset_clipping(true); m_renBaseComp.reset_clipping(true); m_renBasePre.reset_clipping(true); m_renBaseCompPre.reset_clipping(true); //why is all this reset here???? seems silly. resetTransformations(); lineWidth(1.0), lineColor(0,0,0); fillColor(255,255,255); clipBox(0, 0, width, height); lineCap(CAP_ROUND); lineJoin(JOIN_ROUND); #ifdef AGG2D_USE_VECTORFONTS textAlignment(AlignLeft, AlignBottom); flipText(false); #endif //imageFilter(Bilinear); //less quality more speed imageFilter(NoFilter); imageResample(NoResample); m_masterAlpha = 1.0; m_antiAliasGamma = 1.0; m_rasterizer.gamma(agg::gamma_none()); m_blendMode = BlendAlpha; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(MyImage& img) { attach(img.renBuf.buf(), img.renBuf.width(), img.renBuf.height(), img.renBuf.stride()); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clipBox(double x1, double y1, double x2, double y2) { m_viewport.transform(&x1, &y1); // m_viewport.transform(&x2, &y2); // see: http://article.gmane.org/gmane.comp.graphics.agg/3543 m_clipBox = RectD(x1, y1, x2, y2); int rx1 = int(x1); int ry1 = int(y1); int rx2 = int(x2); int ry2 = int(y2); m_renBase.clip_box(rx1, ry1, rx2, ry2); m_renBaseComp.clip_box(rx1, ry1, rx2, ry2); m_renBasePre.clip_box(rx1, ry1, rx2, ry2); m_renBaseCompPre.clip_box(rx1, ry1, rx2, ry2); // m_rasterizer.clip_box(x1, y1, x2, y2); m_rasterizer.clip_box(m_renBase.xmin(), m_renBase.ymin(), m_renBase.xmax()+1, m_renBase.ymax()+1); // see link above } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::blendMode(BlendMode m) { m_blendMode = m; m_pixFormatComp.comp_op(m); m_pixFormatCompPre.comp_op(m); } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::BlendMode Agg2D AGG2D_TEMPLATE_ARG ::blendMode() const { return m_blendMode; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendMode(BlendMode m) { m_imageBlendMode = m; } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::BlendMode Agg2D AGG2D_TEMPLATE_ARG ::imageBlendMode() const { return m_imageBlendMode; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor(Color c) { m_imageBlendColor = c; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a) { imageBlendColor(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::Color Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor() const { return m_imageBlendColor; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::masterAlpha(double a) { m_masterAlpha = a; updateRasterizerGamma(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::masterAlpha() const { return m_masterAlpha; } //------------------------------------------------------------------------+ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::antiAliasGamma(double g) { m_antiAliasGamma = g; updateRasterizerGamma(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::antiAliasGamma() const { return m_antiAliasGamma; } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::RectD Agg2D AGG2D_TEMPLATE_ARG ::clipBox() const { return m_clipBox; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearAll(Color c) { m_renBase.clear(c); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearAll(unsigned r, unsigned g, unsigned b, unsigned a) { clearAll(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearClipBox(Color c) { m_renBase.copy_bar(0, 0, m_renBase.width(), m_renBase.height(), c); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a) { clearClipBox(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::worldToScreen(double& x, double& y) const { m_transform.transform(&x, &y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::screenToWorld(double& x, double& y) const { m_transform.inverse_transform(&x, &y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::worldToScreen(double scalar) const { double x1 = 0; double y1 = 0; double x2 = scalar; double y2 = scalar; worldToScreen(x1, y1); worldToScreen(x2, y2); return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * 0.7071068; } //------------------------------------------------------------------------ AGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::screenToWorld(double scalar) const { double x1 = 0; double y1 = 0; double x2 = scalar; double y2 = scalar; screenToWorld(x1, y1); screenToWorld(x2, y2); return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * 0.7071068; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::alignPoint(double& x, double& y) const { worldToScreen(x, y); x = floor(x) + 0.5; y = floor(y) + 0.5; screenToWorld(x, y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE bool Agg2D AGG2D_TEMPLATE_ARG ::inBox(double worldX, double worldY) const { worldToScreen(worldX, worldY); return m_renBase.inbox(int(worldX), int(worldY)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::Transformations Agg2D AGG2D_TEMPLATE_ARG ::transformations() const { Transformations tr; m_transform.store_to(tr.affineMatrix); return tr; } //------------------------------------------------------------------------ AGG2D_TEMPLATE const Agg2DBase::Affine& Agg2D AGG2D_TEMPLATE_ARG ::affine() const { return m_affine; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::affine(const Affine& af) { m_affine = af; updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::transformations(const Transformations& tr) { m_transform.load_from(tr.affineMatrix); m_convCurve.approximation_scale(worldToScreen(1.0) * g_approxScale); m_convStroke.approximation_scale(worldToScreen(1.0) * g_approxScale); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::resetTransformations() { m_transform.reset(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::updateTransformations() { m_transform = m_affine; m_transform *= m_viewport; m_convCurve.approximation_scale(worldToScreen(1.0) * g_approxScale); m_convStroke.approximation_scale(worldToScreen(1.0) * g_approxScale); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::rotate(double angle) { m_affine.premultiply(agg::trans_affine_rotation(angle)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::rotate(double angle, double cx, double cy) { agg::trans_affine_translation m(-cx, -cy); m *= agg::trans_affine_rotation(angle); m *= agg::trans_affine_translation(cx, cy); m_affine.premultiply(m); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::skew(double sx, double sy) { m_affine.premultiply(agg::trans_affine_skewing(sx, sy)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::translate(double x, double y) { m_affine.premultiply(agg::trans_affine_translation(x, y)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::matrix(const Affine& tr) { m_affine.premultiply(tr); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::matrix(const Transformations& tr) { matrix(agg::trans_affine(tr.affineMatrix[0], tr.affineMatrix[1], tr.affineMatrix[2], tr.affineMatrix[3], tr.affineMatrix[4], tr.affineMatrix[5])); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::scale(double s) { m_affine.premultiply(agg::trans_affine_scaling(s)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::scale(double sx, double sy) { m_affine.premultiply(agg::trans_affine_scaling(sx, sy)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::parallelogram(double x1, double y1, double x2, double y2, const double* para) { m_affine.premultiply(agg::trans_affine(x1, y1, x2, y2, para)); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::viewport(double worldX1, double worldY1, double worldX2, double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, ViewportOption opt, WindowFitLogic fl) { agg::trans_viewport vp; agg::aspect_ratio_e ar = (fl == WindowFitLogic_meet) ? agg::aspect_ratio_meet : agg::aspect_ratio_slice; switch(opt) { case Anisotropic: vp.preserve_aspect_ratio(0.0, 0.0, agg::aspect_ratio_stretch); break; case XMinYMin: vp.preserve_aspect_ratio(0.0, 0.0, ar); break; case XMidYMin: vp.preserve_aspect_ratio(0.5, 0.0, ar); break; case XMaxYMin: vp.preserve_aspect_ratio(1.0, 0.0, ar); break; case XMinYMid: vp.preserve_aspect_ratio(0.0, 0.5, ar); break; case XMidYMid: vp.preserve_aspect_ratio(0.5, 0.5, ar); break; case XMaxYMid: vp.preserve_aspect_ratio(1.0, 0.5, ar); break; case XMinYMax: vp.preserve_aspect_ratio(0.0, 1.0, ar); break; case XMidYMax: vp.preserve_aspect_ratio(0.5, 1.0, ar); break; case XMaxYMax: vp.preserve_aspect_ratio(1.0, 1.0, ar); break; } vp.world_viewport(worldX1, worldY1, worldX2, worldY2); vp.device_viewport(screenX1, screenY1, screenX2, screenY2); m_viewport = vp.to_affine(); updateTransformations(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::fillColor(Color c) { m_fillColor = c; m_fillGradientFlag = Solid; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::fillColor(unsigned r, unsigned g, unsigned b, unsigned a) { fillColor(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::noFill() { fillColor(Color(0, 0, 0, 0)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::lineColor(Color c) { m_lineColor = c; m_lineGradientFlag = Solid; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::lineColor(unsigned r, unsigned g, unsigned b, unsigned a) { lineColor(Color(r, g, b, a)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::noLine() { lineColor(Color(0, 0, 0, 0)); } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename TAGG2D::Color TAGG2D::fillColor() const { return m_fillColor; } //------------------------------------------------------------------------ AGG2D_TEMPLATE typename TAGG2D::Color TAGG2D::lineColor() const { return m_lineColor; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile) { int i; int startGradient = 128 - int(profile * 127.0); int endGradient = 128 + int(profile * 127.0); if (endGradient <= startGradient) endGradient = startGradient + 1; double k = 1.0 / double(endGradient - startGradient); for (i = 0; i < startGradient; i++) { m_fillGradient[i] = c1; } for (; i < endGradient; i++) { m_fillGradient[i] = c1.gradient(c2, double(i - startGradient) * k); } for (; i < 256; i++) { m_fillGradient[i] = c2; } double angle = atan2(y2-y1, x2-x1); m_fillGradientMatrix.reset(); m_fillGradientMatrix *= agg::trans_affine_rotation(angle); m_fillGradientMatrix *= agg::trans_affine_translation(x1, y1); m_fillGradientMatrix *= m_transform; m_fillGradientMatrix.invert(); m_fillGradientD1 = 0.0; m_fillGradientD2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1)); m_fillGradientFlag = Linear; m_fillColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile) { int i; int startGradient = 128 - int(profile * 128.0); int endGradient = 128 + int(profile * 128.0); if (endGradient <= startGradient) endGradient = startGradient + 1; double k = 1.0 / double(endGradient - startGradient); for (i = 0; i < startGradient; i++) { m_lineGradient[i] = c1; } for (; i < endGradient; i++) { m_lineGradient[i] = c1.gradient(c2, double(i - startGradient) * k); } for (; i < 256; i++) { m_lineGradient[i] = c2; } double angle = atan2(y2-y1, x2-x1); m_lineGradientMatrix.reset(); m_lineGradientMatrix *= agg::trans_affine_rotation(angle); m_lineGradientMatrix *= agg::trans_affine_translation(x1, y1); m_fillGradientMatrix *= m_transform; m_lineGradientMatrix.invert(); m_lineGradientD1 = 0; m_lineGradientD2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1)); m_lineGradientFlag = Linear; m_lineColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile) { int i; int startGradient = 128 - int(profile * 127.0); int endGradient = 128 + int(profile * 127.0); if (endGradient <= startGradient) endGradient = startGradient + 1; double k = 1.0 / double(endGradient - startGradient); for (i = 0; i < startGradient; i++) { m_fillGradient[i] = c1; } for (; i < endGradient; i++) { m_fillGradient[i] = c1.gradient(c2, double(i - startGradient) * k); } for (; i < 256; i++) { m_fillGradient[i] = c2; } m_fillGradientD2 = worldToScreen(r); worldToScreen(x, y); m_fillGradientMatrix.reset(); m_fillGradientMatrix *= agg::trans_affine_translation(x, y); m_fillGradientMatrix.invert(); m_fillGradientD1 = 0; m_fillGradientFlag = Radial; m_fillColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile) { int i; int startGradient = 128 - int(profile * 128.0); int endGradient = 128 + int(profile * 128.0); if (endGradient <= startGradient) endGradient = startGradient + 1; double k = 1.0 / double(endGradient - startGradient); for (i = 0; i < startGradient; i++) { m_lineGradient[i] = c1; } for (; i < endGradient; i++) { m_lineGradient[i] = c1.gradient(c2, double(i - startGradient) * k); } for (; i < 256; i++) { m_lineGradient[i] = c2; } m_lineGradientD2 = worldToScreen(r); worldToScreen(x, y); m_lineGradientMatrix.reset(); m_lineGradientMatrix *= agg::trans_affine_translation(x, y); m_lineGradientMatrix.invert(); m_lineGradientD1 = 0; m_lineGradientFlag = Radial; m_lineColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3) { int i; for (i = 0; i < 128; i++) { m_fillGradient[i] = c1.gradient(c2, double(i) / 127.0); } for (; i < 256; i++) { m_fillGradient[i] = c2.gradient(c3, double(i - 128) / 127.0); } m_fillGradientD2 = worldToScreen(r); worldToScreen(x, y); m_fillGradientMatrix.reset(); m_fillGradientMatrix *= agg::trans_affine_translation(x, y); m_fillGradientMatrix.invert(); m_fillGradientD1 = 0; m_fillGradientFlag = Radial; m_fillColor = Color(0,0,0); // Set some real color } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3) { int i; for (i = 0; i < 128; i++) { m_lineGradient[i] = c1.gradient(c2, double(i) / 127.0); } for (; i < 256; i++) { m_lineGradient[i] = c2.gradient(c3, double(i - 128) / 127.0); } m_lineGradientD2 = worldToScreen(r); worldToScreen(x, y); m_lineGradientMatrix.reset(); m_lineGradientMatrix *= agg::trans_affine_translation(x, y); m_lineGradientMatrix.invert(); m_lineGradientD1 = 0; m_lineGradientFlag = Radial; m_lineColor = Color(0,0,0); // Set some real color } AGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r) { m_fillGradientD2 = worldToScreen(r); worldToScreen(x, y); m_fillGradientMatrix.reset(); m_fillGradientMatrix *= agg::trans_affine_translation(x, y); m_fillGradientMatrix.invert(); m_fillGradientD1 = 0; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r) { m_lineGradientD2 = worldToScreen(r); worldToScreen(x, y); m_lineGradientMatrix.reset(); m_lineGradientMatrix *= agg::trans_affine_translation(x, y); m_lineGradientMatrix.invert(); m_lineGradientD1 = 0; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineWidth(double w) { m_lineWidth = w; m_convStroke.width(w); } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::lineWidth() const { return m_lineWidth; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::fillEvenOdd(bool evenOddFlag) { m_evenOddFlag = evenOddFlag; m_rasterizer.filling_rule(evenOddFlag ? agg::fill_even_odd : agg::fill_non_zero); } //------------------------------------------------------------------------ AGG2D_TEMPLATE bool TAGG2D::fillEvenOdd() const { return m_evenOddFlag; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineCap(LineCap cap) { m_lineCap = cap; m_convStroke.line_cap((agg::line_cap_e)cap); } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::LineCap TAGG2D::lineCap() const { return m_lineCap; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineJoin(LineJoin join) { m_lineJoin = join; m_convStroke.line_join((agg::line_join_e)join); } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::LineJoin TAGG2D::lineJoin() const { return m_lineJoin; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::addLine(double x1, double y1, double x2, double y2) { m_path.move_to(x1, y1); m_path.line_to(x2, y2); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::line(double x1, double y1, double x2, double y2) { m_path.remove_all(); addLine(x1, y1, x2, y2); drawPath(StrokeOnly); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::triangle(double x1, double y1, double x2, double y2, double x3, double y3) { m_path.remove_all(); m_path.move_to(x1, y1); m_path.line_to(x2, y2); m_path.line_to(x3, y3); m_path.close_polygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::rectangle(double x1, double y1, double x2, double y2) { m_path.remove_all(); m_path.move_to(x1, y1); m_path.line_to(x2, y1); m_path.line_to(x2, y2); m_path.line_to(x1, y2); m_path.close_polygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2, double r) { m_path.remove_all(); agg::rounded_rect rc(x1, y1, x2, y2, r); rc.normalize_radius(); rc.approximation_scale(worldToScreen(1.0) * g_approxScale); // JME audit //m_path.add_path(rc, 0, false); m_path.concat_path(rc,0); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) { m_path.remove_all(); agg::rounded_rect rc; rc.rect(x1, y1, x2, y2); rc.radius(rx, ry); rc.normalize_radius(); //m_path.add_path(rc, 0, false); m_path.concat_path(rc,0); // JME drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2, double rx_bottom, double ry_bottom, double rx_top, double ry_top) { m_path.remove_all(); agg::rounded_rect rc; rc.rect(x1, y1, x2, y2); rc.radius(rx_bottom, ry_bottom, rx_top, ry_top); rc.normalize_radius(); rc.approximation_scale(worldToScreen(1.0) * g_approxScale); //m_path.add_path(rc, 0, false); m_path.concat_path(rc,0); // JME drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::ellipse(double cx, double cy, double rx, double ry) { m_path.remove_all(); agg::bezier_arc arc(cx, cy, rx, ry, 0, 2*pi()); //m_path.add_path(arc, 0, false); m_path.concat_path(arc,0); // JME m_path.close_polygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::arc(double cx, double cy, double rx, double ry, double start, double sweep) { m_path.remove_all(); agg::bezier_arc arc(cx, cy, rx, ry, start, sweep); //m_path.add_path(arc, 0, false); m_path.concat_path(arc,0); // JME drawPath(StrokeOnly); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::star(double cx, double cy, double r1, double r2, double startAngle, int numRays) { m_path.remove_all(); double da = agg::pi / double(numRays); double a = startAngle; int i; for (i = 0; i < numRays; i++) { double x = cos(a) * r2 + cx; double y = sin(a) * r2 + cy; if (i) m_path.line_to(x, y); else m_path.move_to(x, y); a += da; m_path.line_to(cos(a) * r1 + cx, sin(a) * r1 + cy); a += da; } closePolygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::curve(double x1, double y1, double x2, double y2, double x3, double y3) { m_path.remove_all(); m_path.move_to(x1, y1); m_path.curve3(x2, y2, x3, y3); drawPath(StrokeOnly); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { m_path.remove_all(); m_path.move_to(x1, y1); m_path.curve4(x2, y2, x3, y3, x4, y4); drawPath(StrokeOnly); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::polygon(double* xy, int numPoints) { m_path.remove_all(); //m_path.add_poly(xy, numPoints); m_path.concat_poly(xy,numPoints,true); // JME, AF closePolygon(); drawPath(FillAndStroke); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::polyline(double* xy, int numPoints) { m_path.remove_all(); //m_path.add_poly(xy, numPoints); m_path.concat_poly(xy,numPoints,true); // JME, AF drawPath(StrokeOnly); } //------------------------------------------------------------------------ #ifdef AGG2D_USE_VECTORFONTS AGG2D_TEMPLATE void TAGG2D::flipText(bool flip) { m_fontEngine.flip_y(flip); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::font(const char* fontName, double height, bool bold, bool italic, FontCacheType ch, double angle) { m_textAngle = angle; m_fontHeight = height; m_fontCacheType = ch; #ifdef AGG2D_USE_FREETYPE m_fontEngine.load_font(fontName, 0, (ch == VectorFontCache) ? agg::glyph_ren_outline : agg::glyph_ren_agg_gray8); m_fontEngine.hinting(m_textHints); m_fontEngine.height((ch == VectorFontCache) ? height : worldToScreen(height)); #else m_fontEngine.hinting(m_textHints); m_fontEngine.create_font(fontName, (ch == VectorFontCache) ? agg::glyph_ren_outline : agg::glyph_ren_agg_gray8, (ch == VectorFontCache) ? height : worldToScreen(height), 0.0, bold ? 700 : 400, italic); #endif } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::fontHeight() const { return m_fontHeight; } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::fontAscent() const { return m_fontAscent; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::textAlignment(TextAlignment alignX, TextAlignment alignY) { m_textAlignX = alignX; m_textAlignY = alignY; } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::textWidth(const char* str, unsigned int len) { #if defined( UNDER_CE ) return 0; #else double x = 0; double y = 0; bool first = true; while(*str && len) { const agg::glyph_cache* glyph = m_fontCacheManager.glyph(*str); if(glyph) { if(!first) m_fontCacheManager.add_kerning(&x, &y); x += glyph->advance_x; y += glyph->advance_y; first = true; } ++str; --len; } return (m_fontCacheType == VectorFontCache) ? x : screenToWorld(x); #endif } //------------------------------------------------------------------------ AGG2D_TEMPLATE double TAGG2D::textWidth(const wchar_t* str, unsigned int len) { #if defined( UNDER_CE ) return 0; #else double x = 0; double y = 0; bool first = true; while(*str && len) { const agg::glyph_cache* glyph = m_fontCacheManager.glyph(*str); if(glyph) { if(!first) m_fontCacheManager.add_kerning(&x, &y); x += glyph->advance_x; y += glyph->advance_y; first = true; } ++str; --len; } return (m_fontCacheType == VectorFontCache) ? x : screenToWorld(x); #endif } //------------------------------------------------------------------------ AGG2D_TEMPLATE bool TAGG2D::textHints() const { return m_textHints; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::textHints(bool hints) { m_textHints = hints; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::text(double x, double y, const char* str, unsigned int len, bool roundOff, double ddx, double ddy) { double dx = 0.0; double dy = 0.0; switch(m_textAlignX) { case AlignCenter: dx = -textWidth(str,len) * 0.5; break; case AlignRight: dx = -textWidth(str,len); break; default: break; } double asc = fontHeight(); const agg::glyph_cache* glyph = m_fontCacheManager.glyph('H'); if(glyph) { asc = glyph->bounds.y2 - glyph->bounds.y1; } if(m_fontCacheType == RasterFontCache) { asc = screenToWorld(asc); } switch(m_textAlignY) { case AlignCenter: dy = -asc * 0.5; break; case AlignTop: dy = -asc; break; case AlignBaseline: dy = -fontAscent(); break; default: break; } if(m_fontEngine.flip_y()) dy = -dy; agg::trans_affine mtx; double start_x = x + dx; double start_y = y + dy; if (roundOff) { start_x = int(start_x); start_y = int(start_y); } start_x += ddx; start_y += ddy; mtx *= agg::trans_affine_translation(-x, -y); mtx *= agg::trans_affine_rotation(m_textAngle); mtx *= agg::trans_affine_translation(x, y); agg::conv_transform tr(m_fontCacheManager.path_adaptor(), mtx); if(m_fontCacheType == RasterFontCache) { worldToScreen(start_x, start_y); } unsigned int i; for (i = 0; i < len && str[i]; i++) { glyph = m_fontCacheManager.glyph(str[i]); if(glyph) { if(i) m_fontCacheManager.add_kerning(&x, &y); m_fontCacheManager.init_embedded_adaptors(glyph, start_x, start_y); if(glyph->data_type == agg::glyph_data_outline) { m_path.remove_all(); m_path.concat_path(tr, 0); drawPath(); } if(glyph->data_type == agg::glyph_data_gray8) { render(m_fontCacheManager.gray8_adaptor(), m_fontCacheManager.gray8_scanline()); } start_x += glyph->advance_x; start_y += glyph->advance_y; } } } AGG2D_TEMPLATE void TAGG2D::text(double x, double y, const wchar_t* str, unsigned int len, bool roundOff, double ddx, double ddy) { double dx = 0.0; double dy = 0.0; switch(m_textAlignX) { case AlignCenter: dx = -textWidth(str,len) * 0.5; break; case AlignRight: dx = -textWidth(str,len); break; default: break; } double asc = fontHeight(); const agg::glyph_cache* glyph = m_fontCacheManager.glyph('H'); if(glyph) { asc = glyph->bounds.y2 - glyph->bounds.y1; } if(m_fontCacheType == RasterFontCache) { asc = screenToWorld(asc); } switch(m_textAlignY) { case AlignCenter: dy = -asc * 0.5; break; case AlignTop: dy = -asc; break; case AlignBaseline: dy = -fontAscent(); break; default: break; } if(m_fontEngine.flip_y()) dy = -dy; agg::trans_affine mtx; double start_x = x + dx; double start_y = y + dy; if (roundOff) { start_x = int(start_x); start_y = int(start_y); } start_x += ddx; start_y += ddy; mtx *= agg::trans_affine_translation(-x, -y); mtx *= agg::trans_affine_rotation(m_textAngle); mtx *= agg::trans_affine_translation(x, y); agg::conv_transform tr(m_fontCacheManager.path_adaptor(), mtx); if(m_fontCacheType == RasterFontCache) { worldToScreen(start_x, start_y); } unsigned int i; for (i = 0; i < len && str[i]; i++) { glyph = m_fontCacheManager.glyph(str[i]); if(glyph) { if(i) m_fontCacheManager.add_kerning(&x, &y); m_fontCacheManager.init_embedded_adaptors(glyph, start_x, start_y); if(glyph->data_type == agg::glyph_data_outline) { m_path.remove_all(); //m_path.add_path(tr, 0, false); m_path.concat_path(tr,0); // JME drawPath(); } if(glyph->data_type == agg::glyph_data_gray8) { render(m_fontCacheManager.gray8_adaptor(), m_fontCacheManager.gray8_scanline()); } start_x += glyph->advance_x; start_y += glyph->advance_y; } } } #endif //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::resetPath() { m_path.remove_all(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::moveTo(double x, double y) { m_start_x = x; m_start_y = y; m_path.move_to(x, y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::moveRel(double dx, double dy) { if(m_path.vertices().total_vertices()) { double x2; double y2; m_path.vertices().last_vertex(&x2, &y2); dx += x2; dy += y2; } moveTo(dx, dy); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineTo(double x, double y) { m_path.line_to(x, y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::lineRel(double dx, double dy) { m_path.line_rel(dx, dy); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::horLineTo(double x) { m_path.hline_to(x); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::horLineRel(double dx) { m_path.hline_rel(dx); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::verLineTo(double y) { m_path.vline_to(y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::verLineRel(double dy) { m_path.vline_rel(dy); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::arcTo(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double x, double y) { m_path.arc_to(rx, ry, angle, largeArcFlag, sweepFlag, x, y); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::arcRel(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double dx, double dy) { m_path.arc_rel(rx, ry, angle, largeArcFlag, sweepFlag, dx, dy); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo) { m_path.curve3(xCtrl, yCtrl, xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::quadricCurveRel(double dxCtrl, double dyCtrl, double dxTo, double dyTo) { m_path.curve3_rel(dxCtrl, dyCtrl, dxTo, dyTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::quadricCurveTo(double xTo, double yTo) { m_path.curve3(xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::quadricCurveRel(double dxTo, double dyTo) { m_path.curve3_rel(dxTo, dyTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::cubicCurveTo(double xCtrl1, double yCtrl1, double xCtrl2, double yCtrl2, double xTo, double yTo) { m_path.curve4(xCtrl1, yCtrl1, xCtrl2, yCtrl2, xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::cubicCurveRel(double dxCtrl1, double dyCtrl1, double dxCtrl2, double dyCtrl2, double dxTo, double dyTo) { m_path.curve4_rel(dxCtrl1, dyCtrl1, dxCtrl2, dyCtrl2, dxTo, dyTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo) { m_path.curve4(xCtrl2, yCtrl2, xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo) { m_path.curve4_rel(xCtrl2, yCtrl2, xTo, yTo); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::addEllipse(double cx, double cy, double rx, double ry, Direction dir) { agg::bezier_arc arc(cx, cy, rx, ry, 0, (dir == CCW) ? 2*pi() : -2*pi()); //m_path.add_path(arc, 0, false); m_path.concat_path(arc,0); // JME m_path.close_polygon(); } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::closePolygon() { if(agg::is_vertex(m_path.vertices().last_command())) { m_path.vertices().add_vertex(m_start_x, m_start_y, agg::path_cmd_end_poly | agg::path_flags_close); } } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::imageFilter(ImageFilter f) { m_imageFilter = f; switch(f) { case NoFilter: break; case Bilinear: m_imageFilterLut.calculate(agg::image_filter_bilinear(), true); break; case Hanning: m_imageFilterLut.calculate(agg::image_filter_hanning(), true); break; case Hermite: m_imageFilterLut.calculate(agg::image_filter_hermite(), true); break; case Quadric: m_imageFilterLut.calculate(agg::image_filter_quadric(), true); break; case Bicubic: m_imageFilterLut.calculate(agg::image_filter_bicubic(), true); break; case Catrom: m_imageFilterLut.calculate(agg::image_filter_catrom(), true); break; case Spline16: m_imageFilterLut.calculate(agg::image_filter_spline16(), true); break; case Spline36: m_imageFilterLut.calculate(agg::image_filter_spline36(), true); break; case Blackman144: m_imageFilterLut.calculate(agg::image_filter_blackman144(), true); break; } } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::ImageFilter TAGG2D::imageFilter() const { return m_imageFilter; } //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::imageResample(ImageResample f) { m_imageResample = f; } //------------------------------------------------------------------------ AGG2D_TEMPLATE Agg2DBase::ImageResample TAGG2D::imageResample() const { return m_imageResample; } //==============moved to .h file=========== //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::drawPath(DrawPathFlag flag) { m_rasterizer.reset(); switch(flag) { case FillOnly: if (m_fillColor.a) { m_rasterizer.add_path(m_pathTransform); render(true); } break; case StrokeOnly: if (m_lineColor.a && m_lineWidth > 0.0) { m_rasterizer.add_path(m_strokeTransform); render(false); } break; case FillAndStroke: if (m_fillColor.a) { m_rasterizer.add_path(m_pathTransform); render(true); } if (m_lineColor.a && m_lineWidth > 0.0) { m_rasterizer.add_path(m_strokeTransform); render(false); } break; case FillWithLineColor: if (m_lineColor.a) { m_rasterizer.add_path(m_pathTransform); render(false); } break; } } //------------------------------------------------------------------------ AGG2D_TEMPLATE_WITH_IMAGE class Agg2DRenderer { public: typedef typename TAGG2D::Color Color; typedef typename TIMAGE Image; //-------------------------------------------------------------------- template void static render(TAGG2D& gr, BaseRenderer& renBase, SolidRenderer& renSolid, bool fillColor) { // JME typedef agg::span_allocator span_allocator_type; //- typedef agg::renderer_scanline_aa RendererLinearGradient; typedef agg::renderer_scanline_aa RendererLinearGradient; //- typedef agg::renderer_scanline_aa RendererRadialGradient; typedef agg::renderer_scanline_aa RendererRadialGradient; if ((fillColor && gr.m_fillGradientFlag == TAGG2D::Linear) || (!fillColor && gr.m_lineGradientFlag == TAGG2D::Linear)) { if (fillColor) { typename TAGG2D::LinearGradientSpan span(/*gr.m_allocator, */ gr.m_fillGradientInterpolator, gr.m_linearGradientFunction, gr.m_fillGradient, gr.m_fillGradientD1, gr.m_fillGradientD2); //-RendererLinearGradient ren(renBase,span); RendererLinearGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren); } else { typename TAGG2D::LinearGradientSpan span(/*gr.m_allocator,*/ gr.m_lineGradientInterpolator, gr.m_linearGradientFunction, gr.m_lineGradient, gr.m_lineGradientD1, gr.m_lineGradientD2); //- RendererLinearGradient ren(renBase, span); RendererLinearGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren); } } else { if ((fillColor && gr.m_fillGradientFlag == TAGG2D::Radial) || (!fillColor && gr.m_lineGradientFlag == TAGG2D::Radial)) { if (fillColor) { typename TAGG2D::RadialGradientSpan span(/*gr.m_allocator, */ gr.m_fillGradientInterpolator, gr.m_radialGradientFunction, gr.m_fillGradient, gr.m_fillGradientD1, gr.m_fillGradientD2); //-RendererRadialGradient ren(renBase, span); RendererRadialGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren); } else { typename TAGG2D::RadialGradientSpan span(/*gr.m_allocator,*/ gr.m_lineGradientInterpolator, gr.m_radialGradientFunction, gr.m_lineGradient, gr.m_lineGradientD1, gr.m_lineGradientD2); //-RendererRadialGradient ren(renBase, span); RendererRadialGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren); } } else { renSolid.color(fillColor ? gr.m_fillColor : gr.m_lineColor); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, renSolid); } } } //-------------------------------------------------------------------- class SpanConvImageBlend { public: SpanConvImageBlend(Agg2DBase::BlendMode m, Color c) : m_mode(m), m_color(c) {} void convert(Color* span, int x, int y, unsigned len) const { unsigned l2; typename TAGG2D::Color* s2; if(m_mode != TAGG2D::BlendDst) { l2 = len; s2 = span; typedef agg::comp_op_adaptor_clip_to_dst_rgba_pre OpType; do { OpType::blend_pix(m_mode, (typename TAGG2D::Color::value_type*)s2, m_color.r, m_color.g, m_color.b, TAGG2D::Color::base_mask, agg::cover_full); ++s2; } while(--l2); } if(m_color.a < TAGG2D::Color::base_mask) { l2 = len; s2 = span; unsigned a = m_color.a; do { s2->r = (s2->r * a) >> TAGG2D::Color::base_shift; s2->g = (s2->g * a) >> TAGG2D::Color::base_shift; s2->b = (s2->b * a) >> TAGG2D::Color::base_shift; s2->a = (s2->a * a) >> TAGG2D::Color::base_shift; ++s2; } while(--l2); } } private: Agg2DBase::BlendMode m_mode; Color m_color; }; //-------------------------------------------------------------------- template void static render(TAGG2D& gr, BaseRenderer& renBase, SolidRenderer& renSolid, Rasterizer& ras, Scanline& sl) { // JME typedef agg::span_allocator span_allocator_type; typedef agg::renderer_scanline_aa RendererLinearGradient; typedef agg::renderer_scanline_aa RendererRadialGradient; if(gr.m_fillGradientFlag == TAGG2D::Linear) { typename TAGG2D::LinearGradientSpan span( gr.m_fillGradientInterpolator, gr.m_linearGradientFunction, gr.m_fillGradient, gr.m_fillGradientD1, gr.m_fillGradientD2); RendererLinearGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(ras, sl, ren); } else { if(gr.m_fillGradientFlag == TAGG2D::Radial) { typename TAGG2D::RadialGradientSpan span( gr.m_fillGradientInterpolator, gr.m_radialGradientFunction, gr.m_fillGradient, gr.m_fillGradientD1, gr.m_fillGradientD2); RendererRadialGradient ren(renBase,gr.m_allocator,span); agg::render_scanlines(ras, sl, ren); } else { renSolid.color(gr.m_fillColor); agg::render_scanlines(ras, sl, renSolid); } } } //-------------------------------------------------------------------- //! JME - this is where the bulk of the changes have taken place. template static void renderImage(TAGG2D& gr, const TIMAGE& img, BaseRenderer& renBase, Interpolator& interpolator) { //! JME - have not quite figured which part of this is not const-correct // hence the cast. Image& imgc = const_cast(img); typename ImagePixFormatSet::PixFormat img_pixf(imgc.renBuf); typedef agg::image_accessor_clone img_source_type; img_source_type source(img_pixf); SpanConvImageBlend blend(gr.m_imageBlendMode, gr.m_imageBlendColor); if(gr.m_imageFilter == TAGG2D::NoFilter) { //original way typedef agg::span_image_filter_rgba_nn SpanGenType; typedef agg::renderer_scanline_aa RendererType; SpanGenType sg(source,interpolator); RendererType ri(renBase,gr.m_allocator,sg); agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); //our way, using our own span generator to support 555 //but, it isnt working yet //typedef ImagePixFormatSet::SpanGenerator SpanGenType; //typedef agg::renderer_scanline_aa RendererType; //SpanGenType sg(imgc.renBuf); //RendererType ri(renBase,gr.m_allocator,sg); //agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); } //else // { // bool resample = (gr.m_imageResample == TAGG2D::ResampleAlways); // if(gr.m_imageResample == TAGG2D::ResampleOnZoomOut) // { // double sx, sy; // interpolator.transformer().scaling_abs(&sx, &sy); // if (sx > 1.125 || sy > 1.125) // { // resample = true; // } // } // if(resample) // { // typedef agg::span_image_resample_rgba_affine SpanGenType; // typedef agg::span_converter SpanConvType; // typedef agg::renderer_scanline_aa RendererType; // SpanGenType sg(source,interpolator,gr.m_imageFilterLut); // SpanConvType sc(sg, blend); // RendererType ri(renBase,gr.m_allocator,sg); // agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); // } // else // { //// this is the AGG2D default // if(gr.m_imageFilter == TAGG2D::Bilinear) // { // typedef agg::span_image_filter_rgba_bilinear SpanGenType; // typedef agg::span_converter SpanConvType; // typedef agg::renderer_scanline_aa RendererType; // SpanGenType sg(source,interpolator); // SpanConvType sc(sg, blend); // RendererType ri(renBase,gr.m_allocator,sg); // agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); // } // else // { // if(gr.m_imageFilterLut.diameter() == 2) // { // typedef agg::span_image_filter_rgba_2x2 SpanGenType; // typedef agg::span_converter SpanConvType; // typedef agg::renderer_scanline_aa RendererType; // SpanGenType sg(source,interpolator,gr.m_imageFilterLut); // SpanConvType sc(sg, blend); // RendererType ri(renBase,gr.m_allocator,sg); // agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); // } // else // { // typedef agg::span_image_filter_rgba SpanGenType; // typedef agg::span_converter SpanConvType; // typedef agg::renderer_scanline_aa RendererType; // SpanGenType sg(source,interpolator,gr.m_imageFilterLut); // SpanConvType sc(sg, blend); // RendererType ri(renBase,gr.m_allocator,sg); // agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri); // } // } // } // } } }; //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::render(bool fillColor) { if(m_blendMode == BlendAlpha) { TAGG2DRENDERER::render(*this, m_renBase, m_renSolid, fillColor); } else { TAGG2DRENDERER::render(*this, m_renBaseComp, m_renSolidComp, fillColor); } } #ifdef AGG2D_USE_VECTORFONTS #if !defined( UNDER_CE ) //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::render(FontRasterizer& ras, FontScanline& sl) { if(m_blendMode == BlendAlpha) { Agg2DRenderer::render(*this, m_renBase, m_renSolid, ras, sl); } else { Agg2DRenderer::render(*this, m_renBaseComp, m_renSolidComp, ras, sl); } } #endif #endif //------------------------------------------------------------------------ struct Agg2DRasterizerGamma { Agg2DRasterizerGamma(double alpha, double gamma) : m_alpha(alpha), m_gamma(gamma) {} double operator() (double x) const { return m_alpha(m_gamma(x)); } agg::gamma_multiply m_alpha; agg::gamma_power m_gamma; }; //------------------------------------------------------------------------ AGG2D_TEMPLATE void TAGG2D::updateRasterizerGamma() { m_rasterizer.gamma(Agg2DRasterizerGamma(m_masterAlpha, m_antiAliasGamma)); } desmume-0.9.9/src/aggdraw.h0000644000175000017500000007525512140261633016312 0ustar guillaumeguillaume/* The MIT License Copyright (C) 2009-2010 DeSmuME team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ //This file contains code designed to be used by hud and lua systems in any emulator #ifndef _AGGDRAW_H_ #define _AGGDRAW_H_ #include "agg_color_rgba.h" #include "agg_rendering_buffer.h" #include "agg_renderer_base.h" #include "agg_renderer_primitives.h" #include "agg_renderer_scanline.h" #include "agg_bounding_rect.h" #include "agg_renderer_mclip.h" #include "agg_renderer_outline_aa.h" #include "agg_renderer_markers.h" #include "agg_pixfmt_rgb.h" #include "agg_pixfmt_rgba.h" #include "agg_pixfmt_rgb_packed.h" #include "agg2d.h" typedef agg::rgba8 AggColor; namespace agg { //NOTE - these blenders are necessary to change the rgb order from the defaults, which are incorrect for us //this custom blender does more correct blending math than the default //which is necessary or else drawing transparent pixels on (31,31,31) will yield (30,30,30) struct my_blender_rgb555_pre { typedef rgba8 color_type; typedef color_type::value_type value_type; typedef color_type::calc_type calc_type; typedef int16u pixel_type; static AGG_INLINE void blend_pix(pixel_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { //not sure whether this is right... alpha = color_type::base_mask - alpha; pixel_type rgb = *p; calc_type b = (rgb >> 10) & 31; calc_type g = (rgb >> 5) & 31; calc_type r = (rgb ) & 31; b = ((b+1)*(alpha+1) + (cb)*(cover)-1)>>8; g = ((g+1)*(alpha+1) + (cg)*(cover)-1)>>8; r = ((r+1)*(alpha+1) + (cr)*(cover)-1)>>8; *p = (b<<10)|(g<<5)|r; } static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) { return (pixel_type)(((b & 0xF8) << 7) | ((g & 0xF8) << 2) | (r >> 3) | 0x8000); } static AGG_INLINE color_type make_color(pixel_type p) { return color_type((p << 3) & 0xF8, (p >> 2) & 0xF8, (p >> 7) & 0xF8); } }; struct my_blender_rgb555 { typedef rgba8 color_type; typedef color_type::value_type value_type; typedef color_type::calc_type calc_type; typedef int16u pixel_type; static AGG_INLINE void blend_pix(pixel_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned) { pixel_type rgb = *p; calc_type b = (rgb >> 7) & 0xF8; calc_type g = (rgb >> 2) & 0xF8; calc_type r = (rgb << 3) & 0xF8; *p = (pixel_type) (((((cb - b) * alpha + (b << 8)) >> 1) & 0x7C00) | ((((cg - g) * alpha + (g << 8)) >> 6) & 0x03E0) | (((cr - r) * alpha + (r << 8)) >> 11) | 0x8000); } static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) { return (pixel_type)(((b & 0xF8) << 7) | ((g & 0xF8) << 2) | (r >> 3) | 0x8000); } static AGG_INLINE color_type make_color(pixel_type p) { return color_type((p << 3) & 0xF8, (p >> 2) & 0xF8, (p >> 7) & 0xF8); } }; //this is a prototype span generator which should be able to generate 8888 and 555 spans //it would be used in agg2d.inl renderImage() //but it isn't being used yet. //this will need to be completed before we can use 555 as a source imge template class span_simple_blur_rgb24 { public: //-------------------------------------------------------------------- typedef rgba8 color_type; //-------------------------------------------------------------------- span_simple_blur_rgb24() : m_source_image(0) {} //-------------------------------------------------------------------- span_simple_blur_rgb24(const rendering_buffer& src) : m_source_image(&src) {} //-------------------------------------------------------------------- void source_image(const rendering_buffer& src) { m_source_image = &src; } const rendering_buffer& source_image() const { return *m_source_image; } //-------------------------------------------------------------------- void prepare() {} //-------------------------------------------------------------------- void generate(color_type* span, int x, int y, int len) { if(y < 1 || y >= int(m_source_image->height() - 1)) { do { *span++ = rgba8(0,0,0,0); } while(--len); return; } do { int color[4]; color[0] = color[1] = color[2] = color[3] = 0; if(x > 0 && x < int(m_source_image->width()-1)) { int i = 3; do { const int8u* ptr = m_source_image->row_ptr(y - i + 2) + (x - 1) * 3; color[0] += *ptr++; color[1] += *ptr++; color[2] += *ptr++; color[3] += 255; color[0] += *ptr++; color[1] += *ptr++; color[2] += *ptr++; color[3] += 255; color[0] += *ptr++; color[1] += *ptr++; color[2] += *ptr++; color[3] += 255; } while(--i); color[0] /= 9; color[1] /= 9; color[2] /= 9; color[3] /= 9; } *span++ = rgba8(color[Order::R], color[Order::G], color[Order::B], color[3]); ++x; } while(--len); } private: const rendering_buffer* m_source_image; }; typedef pixfmt_alpha_blend_rgb_packed my_pixfmt_rgb555_pre; //----pixfmt_rgb555_pre typedef pixfmt_alpha_blend_rgb_packed my_pixfmt_rgb555; //----pixfmt_rgb555_pre } typedef PixFormatSetDeclaration > T_AGG_PF_RGB555; typedef PixFormatSetDeclaration > T_AGG_PF_RGBA; class AggDrawTarget { public: AggDrawTarget() : empty(true) { } protected: void dirty() { empty = false; } void undirty() { empty = true; } public: bool empty; virtual void clear() = 0; virtual agg::rendering_buffer & buf() = 0; //returns an image for this target. you must provide the pixel type, but if it is wrong, //then you have just created trouble for yourself AGG2D_IMAGE_TEMPLATE TIMAGE image() { return TIMAGE(buf()); } // Setup virtual void attach(unsigned char* buf, unsigned width, unsigned height, int stride) = 0; // virtual void attach(Agg2DBase::Image& img) {attach(img);}; virtual void clipBox(double x1, double y1, double x2, double y2) = 0; virtual Agg2DBase::RectD clipBox() const = 0; virtual void clearAll(AggColor c) = 0; virtual void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; virtual void clearClipBox(AggColor c) = 0; virtual void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; // virtual unsigned width() const { return Agg2DBase::m_rbuf.width(); } // virtual unsigned height() const { return Agg2DBase::m_rbuf.height(); } // Conversions virtual void worldToScreen(double& x, double& y) const = 0; virtual void screenToWorld(double& x, double& y) const = 0; virtual double worldToScreen(double scalar) const = 0; virtual double screenToWorld(double scalar) const = 0; virtual void alignPoint(double& x, double& y) const = 0; virtual bool inBox(double worldX, double worldY) const = 0; // General Attributes virtual void blendMode(Agg2DBase::BlendMode m) = 0; virtual Agg2DBase::BlendMode blendMode() = 0; virtual void imageBlendMode(Agg2DBase::BlendMode m) = 0; virtual Agg2DBase::BlendMode imageBlendMode() = 0; virtual void imageBlendColor(AggColor c) = 0; virtual void imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; virtual AggColor imageBlendColor() = 0; virtual void masterAlpha(double a) = 0; virtual double masterAlpha() = 0; virtual void antiAliasGamma(double g) = 0; virtual double antiAliasGamma() = 0; // virtual void font(const agg::int8u* font) { m_font = font; } // const agg::int8u* font() { return m_font; } virtual void fillColor(AggColor c) = 0; virtual void fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; virtual void noFill() = 0; virtual void lineColor(AggColor c) = 0; virtual void lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0; virtual void noLine() = 0; virtual void transformImage(const Agg2DBase::Image &img, double dstX1, double dstY1, double dstX2, double dstY2) = 0; //virtual void transformImage(const Agg2DBase::Image &img, double dstX1, double dstY1, double dstX2, double dstY2) = 0; virtual AggColor fillColor() = 0; virtual AggColor lineColor() = 0; virtual void fillLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) = 0; virtual void lineLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) = 0; virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) = 0; virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) = 0; virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) = 0; virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) = 0; virtual void fillRadialGradient(double x, double y, double r) = 0; virtual void lineRadialGradient(double x, double y, double r) = 0; virtual void lineWidth(double w) = 0; virtual double lineWidth() = 0; virtual void lineCap(Agg2DBase::LineCap cap) = 0; virtual Agg2DBase::LineCap lineCap() = 0; virtual void lineJoin(Agg2DBase::LineJoin join) = 0; virtual Agg2DBase::LineJoin lineJoin() = 0; virtual void fillEvenOdd(bool evenOddFlag) = 0; virtual bool fillEvenOdd() = 0; // Transformations virtual Agg2DBase::Transformations transformations() = 0; virtual void transformations(const Agg2DBase::Transformations& tr) = 0; virtual const Agg2DBase::Affine& affine() = 0; // virtual void affine(const Agg2DBase::Affine&) = 0; virtual void resetTransformations() = 0; virtual void matrix(const Agg2DBase::Affine& tr) = 0; virtual void matrix(const Agg2DBase::Transformations& tr) = 0; virtual void rotate(double angle) = 0; virtual void rotate(double angle, double cx, double cy) = 0; virtual void scale(double s) = 0; virtual void scale(double sx, double sy) = 0; virtual void skew(double sx, double sy) = 0; virtual void translate(double x, double y) = 0; virtual void parallelogram(double x1, double y1, double x2, double y2, const double* para) = 0; virtual void viewport(double worldX1, double worldY1, double worldX2, double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, Agg2DBase::ViewportOption opt=Agg2DBase::XMidYMid, Agg2DBase::WindowFitLogic fl = Agg2DBase::WindowFitLogic_meet) = 0; // Basic Shapes virtual void line(double x1, double y1, double x2, double y2) = 0; virtual void triangle(double x1, double y1, double x2, double y2, double x3, double y3) = 0; virtual void rectangle(double x1, double y1, double x2, double y2) = 0; virtual void roundedRect(double x1, double y1, double x2, double y2, double r) = 0; virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) = 0; virtual void roundedRect(double x1, double y1, double x2, double y2, double rxBottom, double ryBottom, double rxTop, double ryTop) = 0; virtual void ellipse(double cx, double cy, double rx, double ry) = 0; virtual void arc(double cx, double cy, double rx, double ry, double start, double sweep) = 0; virtual void star(double cx, double cy, double r1, double r2, double startAngle, int numRays) = 0; virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3) = 0; virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) = 0; virtual void polygon(double* xy, int numPoints) = 0; virtual void polyline(double* xy, int numPoints) = 0; // Path commands virtual void resetPath() = 0; virtual void moveTo(double x, double y)= 0; virtual void moveRel(double dx, double dy) = 0; virtual void lineTo(double x, double y) = 0; virtual void lineRel(double dx, double dy) = 0; virtual void horLineTo(double x) = 0; virtual void horLineRel(double dx) = 0; virtual void verLineTo(double y) = 0; virtual void verLineRel(double dy) = 0; virtual void arcTo(double rx, double ry,double angle, bool largeArcFlag,bool sweepFlag,double x, double y) = 0; virtual void arcRel(double rx, double ry,double angle, bool largeArcFlag,bool sweepFlag,double dx, double dy) = 0; virtual void quadricCurveTo(double xCtrl, double yCtrl,double xTo, double yTo) = 0; virtual void quadricCurveRel(double dxCtrl, double dyCtrl,double dxTo, double dyTo) = 0; virtual void quadricCurveTo(double xTo, double yTo) = 0; virtual void quadricCurveRel(double dxTo, double dyTo) = 0; virtual void cubicCurveTo(double xCtrl1, double yCtrl1,double xCtrl2, double yCtrl2,double xTo, double yTo) = 0; virtual void cubicCurveRel(double dxCtrl1, double dyCtrl1,double dxCtrl2, double dyCtrl2,double dxTo, double dyTo) = 0; virtual void cubicCurveTo(double xCtrl2, double yCtrl2,double xTo, double yTo) = 0; virtual void cubicCurveRel(double xCtrl2, double yCtrl2,double xTo, double yTo) = 0; virtual void addEllipse(double cx, double cy, double rx, double ry, Agg2DBase::Direction dir) = 0; virtual void closePolygon() = 0; virtual void drawPath(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) = 0; // virtual void drawPathNoTransform(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) = 0; // Image Transformations virtual void imageFilter(Agg2DBase::ImageFilter f) = 0; virtual Agg2DBase::ImageFilter imageFilter() = 0; virtual void imageResample(Agg2DBase::ImageResample f) = 0; virtual Agg2DBase::ImageResample imageResample() = 0; static const agg::int8u* lookupFont(const std::string& name); virtual void setFont(const std::string& name) = 0; virtual void renderText(double dstX, double dstY, const std::string& str) = 0; virtual void renderTextDropshadowed(double dstX, double dstY, const std::string& str) { AggColor lineColorOld = lineColor(); if(lineColorOld.r+lineColorOld.g+lineColorOld.b<192) lineColor(255-lineColorOld.r,255-lineColorOld.g,255-lineColorOld.b); else lineColor(0,0,0); renderText(dstX-1,dstY-1,str); renderText(dstX,dstY-1,str); renderText(dstX+1,dstY-1,str); renderText(dstX-1,dstY,str); renderText(dstX+1,dstY,str); renderText(dstX-1,dstY+1,str); renderText(dstX,dstY+1,str); renderText(dstX+1,dstY+1,str); lineColor(lineColorOld); renderText(dstX,dstY,str); } // Auxiliary virtual double pi() { return agg::pi; } virtual double deg2Rad(double v) { return v * agg::pi / 180.0; } virtual double rad2Deg(double v) { return v * 180.0 / agg::pi; } }; template class AggDrawTargetImplementation : public AggDrawTarget, public Agg2D { public: typedef typename PixFormatSet::PixFormat pixfmt; typedef typename pixfmt::color_type color_type; typedef Agg2D BASE; AggDrawTargetImplementation(agg::int8u* buf, int width, int height, int stride) { BASE::attach(buf,width,height,stride); BASE::viewport(0, 0, width-1, height-1, 0, 0, width-1, height-1, TAGG2D::Anisotropic); } virtual void clear() { if(!empty) { BASE::clearAll(0,0,0,0); undirty(); } } virtual agg::rendering_buffer & buf() { dirty(); return BASE::buf(); } // buf() might not always require calling dirty() typename BASE::MyImage image() { return BASE::MyImage(buf()); } // Setup virtual void attach(unsigned char* buf, unsigned width, unsigned height, int stride) {BASE::attach(buf, width, height, stride);}; // virtual void attach(Agg2DBase::Image& img) {attach(img);}; virtual void clipBox(double x1, double y1, double x2, double y2) { BASE::clipBox(x1,y1,x2,y2); } virtual Agg2DBase::RectD clipBox() const {return BASE::clipBox();}; virtual void clearAll(AggColor c) {BASE::clearAll(c);}; virtual void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::clearAll(r, g, b, a);}; virtual void clearClipBox(AggColor c) {BASE::clearClipBox(c);}; virtual void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::clearClipBox(r, g, b, a);}; // virtual unsigned width() const { return Agg2DBase::m_rbuf.width(); } // virtual unsigned height() const { return Agg2DBase::m_rbuf.height(); } // Conversions virtual void worldToScreen(double& x, double& y) const {BASE::worldToScreen(x, y);}; virtual void screenToWorld(double& x, double& y) const {BASE::screenToWorld(x, y);}; virtual double worldToScreen(double scalar) const {return BASE::worldToScreen(scalar);}; virtual double screenToWorld(double scalar) const {return BASE::screenToWorld(scalar);}; virtual void alignPoint(double& x, double& y) const {BASE::alignPoint(x, y);}; virtual bool inBox(double worldX, double worldY) const {return BASE::inBox(worldX, worldY);}; // General Attributes virtual void blendMode(Agg2DBase::BlendMode m) {BASE::blendMode(m);}; virtual Agg2DBase::BlendMode blendMode() {return BASE::blendMode();}; virtual void imageBlendMode(Agg2DBase::BlendMode m) {BASE::imageBlendMode(m);}; virtual Agg2DBase::BlendMode imageBlendMode() {return BASE::imageBlendMode();}; virtual void imageBlendColor(AggColor c) {BASE::imageBlendColor(c);}; virtual void imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::imageBlendColor(r, g, b, a);}; virtual AggColor imageBlendColor() {return BASE::imageBlendColor();}; virtual void masterAlpha(double a) {BASE::masterAlpha(a);}; virtual double masterAlpha() {return BASE::masterAlpha();}; virtual void antiAliasGamma(double g) {BASE::antiAliasGamma(g);}; virtual double antiAliasGamma() {return BASE::antiAliasGamma();}; // virtual void font(const agg::int8u* font) { m_font = font; } // const agg::int8u* font() { return m_font; } virtual void fillColor(AggColor c) {BASE::fillColor(c);}; virtual void fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::fillColor(r,g,b,a);}; virtual void noFill() {BASE::noFill();}; virtual void lineColor(AggColor c) {BASE::lineColor(c);}; virtual void lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::lineColor(r,g,b,a);}; virtual void noLine() {BASE::noLine();}; virtual AggColor fillColor() {return BASE::fillColor();}; virtual AggColor lineColor() {return BASE::lineColor();}; virtual void fillLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::fillLinearGradient(x1, y1, x2, y2, c1, c2, profile);}; virtual void lineLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::lineLinearGradient(x1, y1, x2, y2, c1, c2, profile);}; virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::fillRadialGradient(x, y, r, c1, c2, profile);}; virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::lineRadialGradient(x, y, r, c1, c2, profile);}; virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) {dirty(); BASE::fillRadialGradient(x, y, r, c1, c2, c3);}; virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) {dirty(); BASE::lineRadialGradient(x, y, r, c1, c2, c3);}; virtual void fillRadialGradient(double x, double y, double r) {dirty(); BASE::fillRadialGradient(x, y, r);}; virtual void lineRadialGradient(double x, double y, double r) {dirty(); BASE::lineRadialGradient(x, y, r);}; virtual void lineWidth(double w) {BASE::lineWidth(w);}; virtual double lineWidth() {return BASE::lineWidth();}; virtual void lineCap(Agg2DBase::LineCap cap) {BASE::lineCap(cap);}; virtual Agg2DBase::LineCap lineCap() {return BASE::lineCap();}; virtual void lineJoin(Agg2DBase::LineJoin join) {BASE::lineJoin(join);}; virtual Agg2DBase::LineJoin lineJoin() {return BASE::lineJoin();}; virtual void fillEvenOdd(bool evenOddFlag) {BASE::fillEvenOdd(evenOddFlag);}; virtual bool fillEvenOdd() {return BASE::fillEvenOdd();}; virtual void transformImage(const Agg2DBase::Image& img, double dstX1, double dstY1, double dstX2, double dstY2) { BASE::transformImage(img,dstX1,dstY1,dstX2,dstY2); } //virtual void transformImage(const Agg2DBase::Image &img, double dstX1, double dstY1, double dstX2, double dstY2) { BASE::transformImage(img,dstX1,dstY1,dstX2,dstY2); } // Transformations virtual Agg2DBase::Transformations transformations() {return BASE::transformations();}; virtual void transformations(const Agg2DBase::Transformations& tr) {BASE::transformations(tr);}; virtual const Agg2DBase::Affine& affine() {return BASE::affine();}; // virtual void affine(const Agg2DBase::Affine&) {BASE::affine();}; virtual void resetTransformations() {BASE::resetTransformations();}; virtual void matrix(const Agg2DBase::Affine& tr) {BASE::matrix(tr);}; virtual void matrix(const Agg2DBase::Transformations& tr) {BASE::matrix(tr);}; virtual void rotate(double angle) {BASE::rotate(angle);}; virtual void rotate(double angle, double cx, double cy) {BASE::rotate(angle, cx, cy);}; virtual void scale(double s) {BASE::scale(s);}; virtual void scale(double sx, double sy) {BASE::scale(sx, sy);}; virtual void skew(double sx, double sy) {BASE::skew(sx, sy);}; virtual void translate(double x, double y) {BASE::translate(x, y);}; virtual void parallelogram(double x1, double y1, double x2, double y2, const double* para) {BASE::parallelogram(x1, y1, x2, y2, para);}; virtual void viewport(double worldX1, double worldY1, double worldX2, double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, Agg2DBase::ViewportOption opt=Agg2DBase::XMidYMid, Agg2DBase::WindowFitLogic fl = Agg2DBase::WindowFitLogic_meet) {BASE::viewport(worldX1, worldY1, worldX2, worldY2, screenX1, screenY1, screenX2, screenY2, opt, fl);}; // Basic Shapes virtual void line(double x1, double y1, double x2, double y2) {dirty(); BASE::line(x1, y1, x2, y2);}; virtual void triangle(double x1, double y1, double x2, double y2, double x3, double y3) {dirty(); BASE::triangle(x1, y1, x2, y2, x3, y3);}; virtual void rectangle(double x1, double y1, double x2, double y2) {dirty(); BASE::rectangle(x1, y1, x2, y2);}; virtual void roundedRect(double x1, double y1, double x2, double y2, double r) { dirty(); BASE::roundedRect(x1,y1,x2,y2,r); } virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) { dirty(); BASE::roundedRect(x1,y1,x2,y2,rx,ry); } virtual void roundedRect(double x1, double y1, double x2, double y2,double rx_bottom, double ry_bottom,double rx_top,double ry_top) { dirty(); BASE::roundedRect(x1,y1,x2,y2,rx_bottom,ry_bottom,rx_top,ry_top); } virtual void ellipse(double cx, double cy, double rx, double ry) {dirty(); BASE::ellipse(cx, cy, rx, ry);} virtual void arc(double cx, double cy, double rx, double ry, double start, double sweep) {dirty(); BASE::arc(cx, cy, rx, ry, start, sweep);}; virtual void star(double cx, double cy, double r1, double r2, double startAngle, int numRays) {dirty(); BASE::star(cx, cy, r1, r2, startAngle, numRays);}; virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3) {dirty(); BASE::curve(x1, y1, x2, y2, x3, y3);}; virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {dirty(); BASE::curve(x1, y1, x2, y2, x3, y3, x4, y4);}; virtual void polygon(double* xy, int numPoints) {dirty(); BASE::polygon(xy, numPoints);}; virtual void polyline(double* xy, int numPoints) {dirty(); BASE::polyline(xy, numPoints);}; virtual void setFont(const std::string& name) { BASE::font(lookupFont(name)); } virtual void renderText(double dstX, double dstY, const std::string& str) { dirty(); int height = BASE::font()[0]; int base = BASE::font()[1]; int offset = height-base*2; BASE::renderText(dstX, dstY + offset, str); } // Path commands virtual void resetPath() {BASE::resetPath();}; virtual void moveTo(double x, double y) {BASE::moveTo(x, y);} virtual void moveRel(double dx, double dy) {BASE::moveRel(dx,dy);}; virtual void lineTo(double x, double y) {BASE::lineTo(x, y);}; virtual void lineRel(double dx, double dy) {BASE::lineRel(dx, dy);}; virtual void horLineTo(double x) {BASE::horLineTo(x);}; virtual void horLineRel(double dx) {BASE::horLineRel(dx);}; virtual void verLineTo(double y) {BASE::verLineTo(y);}; virtual void verLineRel(double dy) {BASE::verLineRel(dy);}; virtual void arcTo(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double x, double y) {BASE::arcTo(rx, ry, angle, largeArcFlag, sweepFlag, x, y);}; virtual void arcRel(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double dx, double dy) {BASE::arcRel(rx, ry, angle, largeArcFlag, sweepFlag, dx, dy);}; virtual void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo) {BASE::quadricCurveTo(xCtrl, yCtrl, xTo, yTo);}; virtual void quadricCurveRel(double dxCtrl, double dyCtrl, double dxTo, double dyTo) {BASE::quadricCurveRel(dxCtrl, dyCtrl, dxTo, dyTo);}; virtual void quadricCurveTo(double xTo, double yTo) {BASE::quadricCurveTo(xTo, yTo);}; virtual void quadricCurveRel(double dxTo, double dyTo) {BASE::quadricCurveRel(dxTo, dyTo);}; virtual void cubicCurveTo(double xCtrl1, double yCtrl1, double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveTo(xCtrl1, yCtrl1, xCtrl2, yCtrl2, xTo, yTo);}; virtual void cubicCurveRel(double dxCtrl1, double dyCtrl1, double dxCtrl2, double dyCtrl2, double dxTo, double dyTo) {BASE::cubicCurveRel(dxCtrl1, dyCtrl1, dxCtrl2, dyCtrl2, dxTo, dyTo);}; virtual void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveTo(xCtrl2, yCtrl2, xTo, yTo);}; virtual void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveRel(xCtrl2, yCtrl2, xTo, yTo);}; virtual void addEllipse(double cx, double cy, double rx, double ry, Agg2DBase::Direction dir) {BASE::addEllipse(cx, cy, rx, ry, dir);}; virtual void closePolygon() {BASE::closePolygon();}; virtual void drawPath(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) {dirty(); BASE::drawPath(flag);}; // virtual void drawPathNoTransform(DrawPathFlag flag = FillAndStroke) {dirty(); BASE::drawPathNoTransform(flag);}; // Image Transformations virtual void imageFilter(Agg2DBase::ImageFilter f) {BASE::imageFilter(f);}; virtual Agg2DBase::ImageFilter imageFilter() {return BASE::imageFilter();}; virtual void imageResample(Agg2DBase::ImageResample f) {BASE::imageResample(f);}; virtual Agg2DBase::ImageResample imageResample() {return BASE::imageResample();}; // Auxiliary virtual double pi() { return agg::pi; } virtual double deg2Rad(double v) { return v * agg::pi / 180.0; } virtual double rad2Deg(double v) { return v * 180.0 / agg::pi; } }; //the main aggdraw targets for different pixel formats typedef AggDrawTargetImplementation T_AGG_RGB555; typedef AggDrawTargetImplementation T_AGG_RGBA; class AggDraw { public: AggDraw() : target(NULL) {} AggDrawTarget *target; }; enum AggTarget { AggTarget_Screen = 0, AggTarget_Hud = 1, AggTarget_Lua = 2, }; //specialized instance for desmume; should eventually move to another file class AggDraw_Desmume : public AggDraw { public: void setTarget(AggTarget newTarget); //void composite(void* dest); AggDrawTarget *screen, *hud, *lua; }; extern AggDraw_Desmume aggDraw; void Agg_init(); struct font_type { const agg::int8u* font; const char* name; }; extern font_type fonts_list[]; extern int font_Nums; #endif desmume-0.9.9/src/MMU.cpp0000644000175000017500000042342212140261633015660 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2007 shash Copyright (C) 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include #include #include #include "common.h" #include "debug.h" #include "NDSSystem.h" #include "cp15.h" #include "wifi.h" #include "registers.h" #include "render3D.h" #include "gfx3d.h" #include "rtc.h" #include "mc.h" #include "addons.h" #include "slot1.h" #include "mic.h" #include "movie.h" #include "readwrite.h" #include "MMU_timing.h" #ifdef DO_ASSERT_UNALIGNED #define ASSERT_UNALIGNED(x) assert(x) #else #define ASSERT_UNALIGNED(x) #endif //http://home.utah.edu/~nahaj/factoring/isqrt.c.html static u64 isqrt (u64 x) { u64 squaredbit, remainder, root; if (x<1) return 0; /* Load the binary constant 01 00 00 ... 00, where the number * of zero bits to the right of the single one bit * is even, and the one bit is as far left as is consistant * with that condition.) */ squaredbit = (u64) ((((u64) ~0LL) >> 1) & ~(((u64) ~0LL) >> 2)); /* This portable load replaces the loop that used to be * here, and was donated by legalize@xmission.com */ /* Form bits of the answer. */ remainder = x; root = 0; while (squaredbit > 0) { if (remainder >= (squaredbit | root)) { remainder -= (squaredbit | root); root >>= 1; root |= squaredbit; } else { root >>= 1; } squaredbit >>= 2; } return root; } u32 partie = 1; u32 _MMU_MAIN_MEM_MASK = 0x3FFFFF; u32 _MMU_MAIN_MEM_MASK16 = 0x3FFFFF & ~1; u32 _MMU_MAIN_MEM_MASK32 = 0x3FFFFF & ~3; //#define _MMU_DEBUG #ifdef _MMU_DEBUG #include void mmu_log_debug_ARM9(u32 adr, const char *fmt, ...) { if (adr < 0x4000000) return; // if (adr > 0x4100014) return; //#if 1 if (adr >= 0x4000000 && adr <= 0x400006E) return; // Display Engine A if (adr >= 0x40000B0 && adr <= 0x4000134) return; // DMA, Timers and Keypad if (adr >= 0x4000180 && adr <= 0x40001BC) return; // IPC/ROM if (adr >= 0x4000204 && adr <= 0x400024A) return; // Memory & IRQ control if (adr >= 0x4000280 && adr <= 0x4000306) return; // Maths if (adr >= 0x4000320 && adr <= 0x40006A3) return; // 3D dispaly engine if (adr >= 0x4001000 && adr <= 0x400106E) return; // Display Engine B if (adr >= 0x4100000 && adr <= 0x4100014) return; // IPC/ROM //#endif va_list list; char msg[512]; memset(msg,0,512); va_start(list,fmt); _vsnprintf(msg,511,fmt,list); va_end(list); INFO("MMU ARM9 0x%08X: %s\n", adr, msg); } void mmu_log_debug_ARM7(u32 adr, const char *fmt, ...) { if (adr < 0x4000004) return; if (adr > 0x4808FFF) return; #if 1 if (adr >= 0x4000004 && adr < 0x4000180) return; // ARM7 I/O Map if (adr >= 0x4000180 && adr <= 0x40001C4) return; // IPC/ROM if (adr >= 0x4000204 && adr <= 0x400030C) return; // Memory and IRQ Control if (adr >= 0x4000400 && adr <= 0x400051E) return; // Sound Registers if (adr >= 0x4100000 && adr <= 0x4100014) return; // IPC/ROM if (adr >= 0x4800000 && adr <= 0x4808FFF) return; // WLAN Registers #endif va_list list; char msg[512]; memset(msg,0,512); va_start(list,fmt); _vsnprintf(msg,511,fmt,list); va_end(list); INFO("MMU ARM7 0x%08X: %s\n", adr, msg); } #else #define mmu_log_debug_ARM9(...) #define mmu_log_debug_ARM7(...) #endif //#define LOG_CARD //#define LOG_GPU //#define LOG_DMA //#define LOG_DMA2 //#define LOG_DIV MMU_struct MMU; MMU_struct_new MMU_new; MMU_struct_timing MMU_timing; u8 * MMU_struct::MMU_MEM[2][256] = { //arm9 { /* 0X*/ DUP16(MMU.ARM9_ITCM), /* 1X*/ //DUP16(MMU.ARM9_ITCM) /* 1X*/ DUP16(MMU.UNUSED_RAM), /* 2X*/ DUP16(MMU.MAIN_MEM), /* 3X*/ DUP16(MMU.SWIRAM), /* 4X*/ DUP16(MMU.ARM9_REG), /* 5X*/ DUP16(MMU.ARM9_VMEM), /* 6X*/ DUP16(MMU.ARM9_LCD), /* 7X*/ DUP16(MMU.ARM9_OAM), /* 8X*/ DUP16(NULL), /* 9X*/ DUP16(NULL), /* AX*/ DUP16(MMU.UNUSED_RAM), /* BX*/ DUP16(MMU.UNUSED_RAM), /* CX*/ DUP16(MMU.UNUSED_RAM), /* DX*/ DUP16(MMU.UNUSED_RAM), /* EX*/ DUP16(MMU.UNUSED_RAM), /* FX*/ DUP16(MMU.ARM9_BIOS) }, //arm7 { /* 0X*/ DUP16(MMU.ARM7_BIOS), /* 1X*/ DUP16(MMU.UNUSED_RAM), /* 2X*/ DUP16(MMU.MAIN_MEM), /* 3X*/ DUP8(MMU.SWIRAM), DUP8(MMU.ARM7_ERAM), /* 4X*/ DUP8(MMU.ARM7_REG), DUP8(MMU.ARM7_WIRAM), /* 5X*/ DUP16(MMU.UNUSED_RAM), /* 6X*/ DUP16(MMU.ARM9_LCD), /* 7X*/ DUP16(MMU.UNUSED_RAM), /* 8X*/ DUP16(NULL), /* 9X*/ DUP16(NULL), /* AX*/ DUP16(MMU.UNUSED_RAM), /* BX*/ DUP16(MMU.UNUSED_RAM), /* CX*/ DUP16(MMU.UNUSED_RAM), /* DX*/ DUP16(MMU.UNUSED_RAM), /* EX*/ DUP16(MMU.UNUSED_RAM), /* FX*/ DUP16(MMU.UNUSED_RAM) } }; u32 MMU_struct::MMU_MASK[2][256] = { //arm9 { /* 0X*/ DUP16(0x00007FFF), /* 1X*/ //DUP16(0x00007FFF) /* 1X*/ DUP16(0x00000003), /* 2X*/ DUP16(0x003FFFFF), /* 3X*/ DUP16(0x00007FFF), /* 4X*/ DUP16(0x00FFFFFF), /* 5X*/ DUP16(0x000007FF), /* 6X*/ DUP16(0x00FFFFFF), /* 7X*/ DUP16(0x000007FF), /* 8X*/ DUP16(0x00000003), /* 9X*/ DUP16(0x00000003), /* AX*/ DUP16(0x00000003), /* BX*/ DUP16(0x00000003), /* CX*/ DUP16(0x00000003), /* DX*/ DUP16(0x00000003), /* EX*/ DUP16(0x00000003), /* FX*/ DUP16(0x00007FFF) }, //arm7 { /* 0X*/ DUP16(0x00003FFF), /* 1X*/ DUP16(0x00000003), /* 2X*/ DUP16(0x003FFFFF), /* 3X*/ DUP8(0x00007FFF), DUP8(0x0000FFFF), /* 4X*/ DUP8(0x00FFFFFF), DUP8(0x0000FFFF), /* 5X*/ DUP16(0x00000003), /* 6X*/ DUP16(0x00FFFFFF), /* 7X*/ DUP16(0x00000003), /* 8X*/ DUP16(0x00000003), /* 9X*/ DUP16(0x00000003), /* AX*/ DUP16(0x00000003), /* BX*/ DUP16(0x00000003), /* CX*/ DUP16(0x00000003), /* DX*/ DUP16(0x00000003), /* EX*/ DUP16(0x00000003), /* FX*/ DUP16(0x00000003) } }; // this logic was moved to MMU_timing.h //CACHE_ALIGN //TWaitState MMU_struct::MMU_WAIT16[2][16] = { // { 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1 }, //arm9 // { 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1 }, //arm7 //}; // //CACHE_ALIGN //TWaitState MMU_struct::MMU_WAIT32[2][16] = { // { 1, 1, 1, 1, 1, 2, 2, 1, 8, 8, 5, 1, 1, 1, 1, 1 }, //arm9 // { 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 5, 1, 1, 1, 1, 1 }, //arm7 //}; ////////////////////////////////////////////////////////////// //------------- //VRAM MEMORY MAPPING //------------- //(Everything is mapped through to ARM9_LCD in blocks of 16KB) //for all of the below, values = 41 indicate unmapped memory #define VRAM_PAGE_UNMAPPED 41 #define VRAM_LCDC_PAGES 41 u8 vram_lcdc_map[VRAM_LCDC_PAGES]; //in the range of 0x06000000 - 0x06800000 in 16KB pages (the ARM9 vram mappable area) //this maps to 16KB pages in the LCDC buffer which is what will actually contain the data u8 vram_arm9_map[VRAM_ARM9_PAGES]; //this chooses which banks are mapped in the 128K banks starting at 0x06000000 in ARM7 u8 vram_arm7_map[2]; //-----> //consider these later, for better recordkeeping, instead of using the u8* in MMU ////for each 128KB texture slot, this maps to a 16KB starting page in the LCDC buffer //#define VRAM_TEX_SLOTS 4 //u8 vram_tex_map[VRAM_TEX_SLOTS]; // ////for each 16KB tex palette slot, this maps to a 16KB starting page in the LCDC buffer //#define VRAM_TEX_PALETTE_SLOTS 6 //u8 vram_tex_palette_map[VRAM_TEX_PALETTE_SLOTS]; //<--------- void MMU_VRAM_unmap_all(); struct TVramBankInfo { u8 page_addr, num_pages; }; static const TVramBankInfo vram_bank_info[VRAM_BANKS] = { {0,8}, {8,8}, {16,8}, {24,8}, {32,4}, {36,1}, {37,1}, {38,2}, {40,1} }; //this is to remind you that the LCDC mapping returns a strange value (not 0x06800000) as you would expect //in order to play nicely with the MMU address and mask tables #define LCDC_HACKY_LOCATION 0x06000000 #define ARM7_HACKY_IWRAM_LOCATION 0x03800000 #define ARM7_HACKY_SIWRAM_LOCATION 0x03000000 //maps an ARM9 BG/OBJ or LCDC address into an LCDC address, and informs the caller of whether it isn't mapped //TODO - in cases where this does some mapping work, we could bypass the logic at the end of the _read* and _write* routines //this is a good optimization to consider //NOTE - this whole approach is probably fundamentally wrong. //according to dasShiny research, its possible to map multiple banks to the same addresses. something more sophisticated would be needed. //however, it hasnt proven necessary yet for any known test case. template static FORCEINLINE u32 MMU_LCDmap(u32 addr, bool& unmapped, bool& restricted) { unmapped = false; restricted = false; //this will track whether 8bit writes are allowed //handle SIWRAM and non-shared IWRAM in here too, since it is quite similar to vram. //in fact it is probably implemented with the same pieces of hardware. //its sort of like arm7 non-shared IWRAM is lowest priority, and then SIWRAM goes on top. //however, we implement it differently than vram in emulator for historical reasons. //instead of keeping a page map like we do vram, we just have a list of all possible page maps (there are only 4 each for arm9 and arm7) if(addr >= 0x03000000 && addr < 0x04000000) { //blocks 0,1,2,3 is arm7 non-shared IWRAM and blocks 4,5 is SIWRAM, and block 8 is un-mapped zeroes int iwram_block_16k; int iwram_offset = addr & 0x3FFF; addr &= 0x00FFFFFF; if(PROCNUM == ARMCPU_ARM7) { static const int arm7_siwram_blocks[2][4][4] = { { {0,1,2,3}, //WRAMCNT = 0 -> map to IWRAM {4,4,4,4}, //WRAMCNT = 1 -> map to SIWRAM block 0 {5,5,5,5}, //WRAMCNT = 2 -> map to SIWRAM block 1 {4,5,4,5}, //WRAMCNT = 3 -> map to SIWRAM blocks 0,1 }, //high region; always maps to non-shared IWRAM { {0,1,2,3}, {0,1,2,3}, {0,1,2,3}, {0,1,2,3} } }; int region = (addr >> 23)&1; int block = (addr >> 14)&3; assert(region<2); assert(block<4); iwram_block_16k = arm7_siwram_blocks[region][MMU.WRAMCNT][block]; } //PROCNUM == ARMCPU_ARM7 else { //PROCNUM == ARMCPU_ARM9 static const int arm9_siwram_blocks[4][4] = { {4,5,4,5}, //WRAMCNT = 0 -> map to SIWRAM blocks 0,1 {5,5,5,5}, //WRAMCNT = 1 -> map to SIWRAM block 1 {4,4,4,4}, //WRAMCNT = 2 -> map to SIWRAM block 0 {8,8,8,8}, //WRAMCNT = 3 -> unmapped }; int block = (addr >> 14)&3; assert(block<4); iwram_block_16k = arm9_siwram_blocks[MMU.WRAMCNT][block]; } switch(iwram_block_16k>>2) { case 0: //arm7 non-shared IWRAM return ARM7_HACKY_IWRAM_LOCATION + (iwram_block_16k<<14) + iwram_offset; case 1: //SIWRAM return ARM7_HACKY_SIWRAM_LOCATION + ((iwram_block_16k&3)<<14) + iwram_offset; case 2: //zeroes CASE2: unmapped = true; return 0; default: assert(false); //how did this happen? goto CASE2; } } //in case the address is entirely outside of the interesting VRAM ranges if(addr < 0x06000000) return addr; if(addr >= 0x07000000) return addr; //shared wram mapping for arm7 if(PROCNUM==ARMCPU_ARM7) { //necessary? not sure //addr &= 0x3FFFF; //addr += 0x06000000; u32 ofs = addr & 0x1FFFF; u32 bank = (addr >> 17)&1; if(vram_arm7_map[bank] == VRAM_PAGE_UNMAPPED) { unmapped = true; return 0; } return LCDC_HACKY_LOCATION + (vram_arm7_map[bank]<<14) + ofs; } restricted = true; //handle LCD memory mirroring //TODO - this is gross! this should be renovated if the vram mapping is ever done in a more sophisticated way taking into account dasShiny research if(addr>=0x068A4000) addr = 0x06800000 + //(addr%0xA4000); //yuck!! is this even how it mirrors? but we have to keep from overrunning the buffer somehow (addr&0x80000); //just as likely to be right (I have no clue how it should work) but faster. u32 vram_page; u32 ofs = addr & 0x3FFF; //return addresses in LCDC range if(addr>=0x06800000) { //already in LCDC range. just look it up to see whether it is unmapped vram_page = (addr>>14)&63; assert(vram_page>14)&(VRAM_ARM9_PAGES-1); assert(vram_page= VRAM_BANK_H) block++; u8 VRAMBankCnt = T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x240 + block); //do nothing if the bank isnt enabled u8 en = VRAMBankCnt & 0x80; if(!en) return; int mst,ofs=0; switch(bank) { case VRAM_BANK_A: case VRAM_BANK_B: mst = VRAMBankCnt & 3; ofs = (VRAMBankCnt>>3) & 3; switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; case 1: //ABG vramConfiguration.banks[bank].purpose = VramConfiguration::ABG; MMU_vram_arm9(bank,VRAM_PAGE_ABG+ofs*8); break; case 2: //AOBJ vramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ; switch(ofs) { case 0: case 1: MMU_vram_arm9(bank,VRAM_PAGE_AOBJ+ofs*8); break; default: PROGINFO("Unsupported ofs setting %d for engine A OBJ vram bank %c\n", ofs, 'A'+bank); } break; case 3: //texture vramConfiguration.banks[bank].purpose = VramConfiguration::TEX; MMU.texInfo.textureSlotAddr[ofs] = MMU_vram_physical(vram_bank_info[bank].page_addr); break; default: goto unsupported_mst; } break; case VRAM_BANK_C: case VRAM_BANK_D: mst = VRAMBankCnt & 7; ofs = (VRAMBankCnt>>3) & 3; switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; case 1: //ABG vramConfiguration.banks[bank].purpose = VramConfiguration::ABG; MMU_vram_arm9(bank,VRAM_PAGE_ABG+ofs*8); break; case 2: //arm7 vramConfiguration.banks[bank].purpose = VramConfiguration::ARM7; if(bank == 2) T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240, T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240) | 1); if(bank == 3) T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240, T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240) | 2); //printf("DING!\n"); switch(ofs) { case 0: case 1: vram_arm7_map[ofs] = vram_bank_info[bank].page_addr; break; default: PROGINFO("Unsupported ofs setting %d for arm7 vram bank %c\n", ofs, 'A'+bank); } break; case 3: //texture vramConfiguration.banks[bank].purpose = VramConfiguration::TEX; MMU.texInfo.textureSlotAddr[ofs] = MMU_vram_physical(vram_bank_info[bank].page_addr); break; case 4: //BGB or BOBJ if(bank == VRAM_BANK_C) { vramConfiguration.banks[bank].purpose = VramConfiguration::BBG; MMU_vram_arm9(bank,VRAM_PAGE_BBG); //BBG } else { vramConfiguration.banks[bank].purpose = VramConfiguration::BOBJ; MMU_vram_arm9(bank,VRAM_PAGE_BOBJ); //BOBJ } if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; default: goto unsupported_mst; } break; case VRAM_BANK_E: mst = VRAMBankCnt & 7; if(((VRAMBankCnt>>3)&3) != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); break; case 1: //ABG vramConfiguration.banks[bank].purpose = VramConfiguration::ABG; MMU_vram_arm9(bank,VRAM_PAGE_ABG); break; case 2: //AOBJ vramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ; MMU_vram_arm9(bank,VRAM_PAGE_AOBJ); break; case 3: //texture palette vramConfiguration.banks[bank].purpose = VramConfiguration::TEXPAL; MMU.texInfo.texPalSlot[0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.texInfo.texPalSlot[1] = MMU_vram_physical(vram_bank_info[bank].page_addr+1); MMU.texInfo.texPalSlot[2] = MMU_vram_physical(vram_bank_info[bank].page_addr+2); MMU.texInfo.texPalSlot[3] = MMU_vram_physical(vram_bank_info[bank].page_addr+3); break; case 4: //A BG extended palette vramConfiguration.banks[bank].purpose = VramConfiguration::ABGEXTPAL; MMU.ExtPal[0][0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ExtPal[0][1] = MMU.ExtPal[0][0] + ADDRESS_STEP_8KB; MMU.ExtPal[0][2] = MMU.ExtPal[0][1] + ADDRESS_STEP_8KB; MMU.ExtPal[0][3] = MMU.ExtPal[0][2] + ADDRESS_STEP_8KB; break; default: goto unsupported_mst; } break; case VRAM_BANK_F: case VRAM_BANK_G: { mst = VRAMBankCnt & 7; ofs = (VRAMBankCnt>>3) & 3; const int pageofslut[] = {0,1,4,5}; const int pageofs = pageofslut[ofs]; switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; case 1: //ABG vramConfiguration.banks[bank].purpose = VramConfiguration::ABG; MMU_vram_arm9(bank,VRAM_PAGE_ABG+pageofs); MMU_vram_arm9(bank,VRAM_PAGE_ABG+pageofs+2); //unexpected mirroring (required by spyro eternal night) break; case 2: //AOBJ vramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ; MMU_vram_arm9(bank,VRAM_PAGE_AOBJ+pageofs); MMU_vram_arm9(bank,VRAM_PAGE_AOBJ+pageofs+2); //unexpected mirroring - I have no proof, but it is inferred from the ABG above break; case 3: //texture palette vramConfiguration.banks[bank].purpose = VramConfiguration::TEXPAL; MMU.texInfo.texPalSlot[pageofs] = MMU_vram_physical(vram_bank_info[bank].page_addr); break; case 4: //A BG extended palette switch(ofs) { case 0: case 1: vramConfiguration.banks[bank].purpose = VramConfiguration::ABGEXTPAL; MMU.ExtPal[0][ofs*2] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ExtPal[0][ofs*2+1] = MMU.ExtPal[0][ofs*2] + ADDRESS_STEP_8KB; break; default: vramConfiguration.banks[bank].purpose = VramConfiguration::INVALID; PROGINFO("Unsupported ofs setting %d for engine A bgextpal vram bank %c\n", ofs, 'A'+bank); break; } break; case 5: //A OBJ extended palette vramConfiguration.banks[bank].purpose = VramConfiguration::AOBJEXTPAL; MMU.ObjExtPal[0][0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ObjExtPal[0][1] = MMU.ObjExtPal[0][1] + ADDRESS_STEP_8KB; if(ofs != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); break; default: goto unsupported_mst; } break; } case VRAM_BANK_H: mst = VRAMBankCnt & 3; if(((VRAMBankCnt>>3)&3) != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); break; case 1: //BBG vramConfiguration.banks[bank].purpose = VramConfiguration::BBG; MMU_vram_arm9(bank,VRAM_PAGE_BBG); MMU_vram_arm9(bank,VRAM_PAGE_BBG + 4); //unexpected mirroring break; case 2: //B BG extended palette vramConfiguration.banks[bank].purpose = VramConfiguration::BBGEXTPAL; MMU.ExtPal[1][0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ExtPal[1][1] = MMU.ExtPal[1][0] + ADDRESS_STEP_8KB; MMU.ExtPal[1][2] = MMU.ExtPal[1][1] + ADDRESS_STEP_8KB; MMU.ExtPal[1][3] = MMU.ExtPal[1][2] + ADDRESS_STEP_8KB; break; default: goto unsupported_mst; } break; case VRAM_BANK_I: mst = VRAMBankCnt & 3; if(((VRAMBankCnt>>3)&3) != 0) PROGINFO("Bank %i: MST %i OFS %i\n", mst, ofs); switch(mst) { case 0: //LCDC vramConfiguration.banks[bank].purpose = VramConfiguration::LCDC; MMU_vram_lcdc(bank); break; case 1: //BBG vramConfiguration.banks[bank].purpose = VramConfiguration::BBG; MMU_vram_arm9(bank,VRAM_PAGE_BBG+2); MMU_vram_arm9(bank,VRAM_PAGE_BBG+3); //unexpected mirroring break; case 2: //BOBJ vramConfiguration.banks[bank].purpose = VramConfiguration::BOBJ; MMU_vram_arm9(bank,VRAM_PAGE_BOBJ); MMU_vram_arm9(bank,VRAM_PAGE_BOBJ+1); //FF3 end scene (lens flare sprite) needs this as it renders a sprite off the end of the 16KB and back around break; case 3: //B OBJ extended palette vramConfiguration.banks[bank].purpose = VramConfiguration::BOBJEXTPAL; MMU.ObjExtPal[1][0] = MMU_vram_physical(vram_bank_info[bank].page_addr); MMU.ObjExtPal[1][1] = MMU.ObjExtPal[1][1] + ADDRESS_STEP_8KB; break; default: goto unsupported_mst; } break; } //switch(bank) vramConfiguration.banks[bank].ofs = ofs; return; unsupported_mst: vramConfiguration.banks[bank].purpose = VramConfiguration::INVALID; PROGINFO("Unsupported mst setting %d for vram bank %c\n", mst, 'A'+bank); } void MMU_VRAM_unmap_all() { vramConfiguration.clear(); vram_arm7_map[0] = VRAM_PAGE_UNMAPPED; vram_arm7_map[1] = VRAM_PAGE_UNMAPPED; for(int i=0;iNDS_3D_VramReconfigureSignal(); } //------------------------------- //set up arm9 mirrorings //these are probably not entirely accurate. more study will be necessary. //in general, we find that it is not uncommon at all for games to accidentally do this. // //being able to easily do these experiments was one of the primary motivations for this remake of the vram mapping system //see the "unexpected mirroring" comments above for some more mirroring //so far "unexpected mirrorings" are tested by combining these games: //despereaux - storybook subtitles //NSMB - world map sub screen //drill spirits EU - mission select (just for control purposes, as it doesnt use H or I) //... //note that the "unexpected mirroring" items above may at some point rely on being executed in a certain order. //(sequentially A..I) const int types[] = {VRAM_PAGE_ABG,VRAM_PAGE_BBG,VRAM_PAGE_AOBJ,VRAM_PAGE_BOBJ}; const int sizes[] = {32,8,16,8}; for(int t=0;t<4;t++) { //the idea here is to pad out the mirrored space with copies of the mappable area, //without respect to what is mapped within that mappable area. //we hope that this is correct in all cases //required for driller spirits in mission select (mapping is simple A,B,C,D to each purpose) const int size = sizes[t]; const int mask = size-1; const int type = types[t]; for(int i=size;i<128;i++) { const int page = type + i; vram_arm9_map[page] = vram_arm9_map[type+(i&mask)]; } //attempt #1: screen corruption in drill spirits EU //it seems like these shouldnt pad out 128K banks (space beyond those should have remained unmapped) //int mirrorMask = -1; //int type = types[t]; ////if(type==VRAM_PAGE_BOBJ) continue; //if(type==VRAM_PAGE_AOBJ) continue; //for(int i=0;i<128;i++) //{ // int page = type + i; // if(vram_arm9_map[page] == VRAM_PAGE_UNMAPPED) // { // if(i==0) break; //can't mirror anything if theres nothing mapped! // if(mirrorMask == -1) // mirrorMask = i-1; // vram_arm9_map[page] = vram_arm9_map[type+(i&mirrorMask)]; // } //} } //------------------------------- } ////////////////////////////////////////////////////////////// //end vram ////////////////////////////////////////////////////////////// void MMU_Init(void) { LOG("MMU init\n"); memset(&MMU, 0, sizeof(MMU_struct)); MMU.CART_ROM = MMU.UNUSED_RAM; //MMU.DTCMRegion = 0x027C0000; //even though apps may change dtcm immediately upon startup, this is the correct hardware starting value: MMU.DTCMRegion = 0x08000000; MMU.ITCMRegion = 0x00000000; IPC_FIFOinit(ARMCPU_ARM9); IPC_FIFOinit(ARMCPU_ARM7); GFX_PIPEclear(); GFX_FIFOclear(); DISP_FIFOinit(); new(&MMU_new) MMU_struct_new; mc_init(&MMU.fw, MC_TYPE_FLASH); /* init fw device */ mc_alloc(&MMU.fw, NDS_FW_SIZE_V1); MMU.fw.fp = NULL; MMU.fw.isFirmware = true; // Init Backup Memory device, this should really be done when the rom is loaded //mc_init(&MMU.bupmem, MC_TYPE_AUTODETECT); //mc_alloc(&MMU.bupmem, 1); //MMU.bupmem.fp = NULL; rtcInit(); addonsInit(); slot1Init(); if(Mic_Init() == FALSE) INFO("Microphone init failed.\n"); else INFO("Microphone successfully inited.\n"); } void MMU_DeInit(void) { LOG("MMU deinit\n"); if (MMU.fw.fp) fclose(MMU.fw.fp); mc_free(&MMU.fw); //if (MMU.bupmem.fp) // fclose(MMU.bupmem.fp); //mc_free(&MMU.bupmem); addonsClose(); slot1Close(); Mic_DeInit(); } void MMU_Reset() { memset(MMU.ARM9_DTCM, 0, sizeof(MMU.ARM9_DTCM)); memset(MMU.ARM9_ITCM, 0, sizeof(MMU.ARM9_ITCM)); memset(MMU.ARM9_LCD, 0, sizeof(MMU.ARM9_LCD)); memset(MMU.ARM9_OAM, 0, sizeof(MMU.ARM9_OAM)); memset(MMU.ARM9_REG, 0, sizeof(MMU.ARM9_REG)); memset(MMU.ARM9_VMEM, 0, sizeof(MMU.ARM9_VMEM)); memset(MMU.MAIN_MEM, 0, sizeof(MMU.MAIN_MEM)); memset(MMU.blank_memory, 0, sizeof(MMU.blank_memory)); memset(MMU.UNUSED_RAM, 0, sizeof(MMU.UNUSED_RAM)); memset(MMU.MORE_UNUSED_RAM, 0, sizeof(MMU.UNUSED_RAM)); memset(MMU.ARM7_ERAM, 0, sizeof(MMU.ARM7_ERAM)); memset(MMU.ARM7_REG, 0, sizeof(MMU.ARM7_REG)); memset(MMU.ARM7_WIRAM, 0, sizeof(MMU.ARM7_WIRAM)); memset(MMU.SWIRAM, 0, sizeof(MMU.SWIRAM)); IPC_FIFOinit(ARMCPU_ARM9); IPC_FIFOinit(ARMCPU_ARM7); GFX_PIPEclear(); GFX_FIFOclear(); DISP_FIFOinit(); MMU.DTCMRegion = 0x027C0000; MMU.ITCMRegion = 0x00000000; memset(MMU.timer, 0, sizeof(u16) * 2 * 4); memset(MMU.timerMODE, 0, sizeof(s32) * 2 * 4); memset(MMU.timerON, 0, sizeof(u32) * 2 * 4); memset(MMU.timerRUN, 0, sizeof(u32) * 2 * 4); memset(MMU.timerReload, 0, sizeof(u16) * 2 * 4); memset(MMU.reg_IME, 0, sizeof(u32) * 2); memset(MMU.reg_IE, 0, sizeof(u32) * 2); memset(MMU.reg_IF_bits, 0, sizeof(u32) * 2); memset(MMU.reg_IF_pending, 0, sizeof(u32) * 2); memset(MMU.dscard, 0, sizeof(nds_dscard) * 2); MMU.divRunning = 0; MMU.divResult = 0; MMU.divMod = 0; MMU.divCycles = 0; MMU.sqrtRunning = 0; MMU.sqrtResult = 0; MMU.sqrtCycles = 0; MMU.SPI_CNT = 0; MMU.AUX_SPI_CNT = 0; MMU.WRAMCNT = 0; // Enable the sound speakers T1WriteWord(MMU.ARM7_REG, 0x304, 0x0001); MainScreen.offset = 0; SubScreen.offset = 192; MMU_VRAM_unmap_all(); MMU.powerMan_CntReg = 0x00; MMU.powerMan_CntRegWritten = FALSE; MMU.powerMan_Reg[0] = 0x0B; MMU.powerMan_Reg[1] = 0x00; MMU.powerMan_Reg[2] = 0x01; MMU.powerMan_Reg[3] = 0x00; rtcInit(); partie = 1; addonsReset(); slot1Reset(); Mic_Reset(); MMU.gfx3dCycles = 0; memset(MMU.dscard[ARMCPU_ARM9].command, 0, 8); MMU.dscard[ARMCPU_ARM9].address = 0; MMU.dscard[ARMCPU_ARM9].transfer_count = 0; MMU.dscard[ARMCPU_ARM9].mode = CardMode_Normal; memset(MMU.dscard[ARMCPU_ARM7].command, 0, 8); MMU.dscard[ARMCPU_ARM7].address = 0; MMU.dscard[ARMCPU_ARM7].transfer_count = 0; MMU.dscard[ARMCPU_ARM7].mode = CardMode_Normal; //HACK!!! //until we improve all our session tracking stuff, we need to save the backup memory filename std::string bleh = MMU_new.backupDevice.getFilename(); BackupDevice tempBackupDevice; bool bleh2 = MMU_new.backupDevice.isMovieMode; if(bleh2) tempBackupDevice = MMU_new.backupDevice; reconstruct(&MMU_new); if(bleh2) { MMU_new.backupDevice = tempBackupDevice; MMU_new.backupDevice.reset_hardware(); } else MMU_new.backupDevice.load_rom(bleh.c_str()); MMU_timing.arm7codeFetch.Reset(); MMU_timing.arm7dataFetch.Reset(); MMU_timing.arm9codeFetch.Reset(); MMU_timing.arm9dataFetch.Reset(); MMU_timing.arm9codeCache.Reset(); MMU_timing.arm9dataCache.Reset(); } void SetupMMU(bool debugConsole, bool dsi) { if(debugConsole) _MMU_MAIN_MEM_MASK = 0x7FFFFF; else _MMU_MAIN_MEM_MASK = 0x3FFFFF; if(dsi) _MMU_MAIN_MEM_MASK = 0xFFFFFF; _MMU_MAIN_MEM_MASK16 = _MMU_MAIN_MEM_MASK & ~1; _MMU_MAIN_MEM_MASK32 = _MMU_MAIN_MEM_MASK & ~3; } void MMU_setRom(u8 * rom, u32 mask) { MMU.CART_ROM = rom; } void MMU_unsetRom() { MMU.CART_ROM=MMU.UNUSED_RAM; } static void execsqrt() { u32 ret; u8 mode = MMU_new.sqrt.mode; MMU_new.sqrt.busy = 1; if (mode) { u64 v = T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8); ret = (u32)isqrt(v); } else { u32 v = T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8); ret = (u32)isqrt(v); } //clear the result while the sqrt unit is busy //todo - is this right? is it reasonable? T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B4, 0); MMU.sqrtCycles = nds_timer + 26; MMU.sqrtResult = ret; MMU.sqrtRunning = TRUE; NDS_Reschedule(); } static void execdiv() { s64 num,den; s64 res,mod; u8 mode = MMU_new.div.mode; MMU_new.div.busy = 1; MMU_new.div.div0 = 0; switch(mode) { case 0: // 32/32 num = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290); den = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298); MMU.divCycles = nds_timer + 36; break; case 1: // 64/32 case 3: //gbatek says this is same as mode 1 num = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290); den = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298); MMU.divCycles = nds_timer + 68; break; case 2: // 64/64 default: num = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290); den = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298); MMU.divCycles = nds_timer + 68; break; } if(den==0) { res = ((num < 0) ? 1 : -1); mod = num; // the DIV0 flag in DIVCNT is set only if the full 64bit DIV_DENOM value is zero, even in 32bit mode if ((u64)T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298) == 0) MMU_new.div.div0 = 1; } else { res = num / den; mod = num % den; } DIVLOG("DIV %08X%08X / %08X%08X = %08X%08X\r\n", (u32)(num>>32), (u32)num, (u32)(den>>32), (u32)den, (u32)(res>>32), (u32)res); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, 0); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A4, 0); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, 0); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2AC, 0); MMU.divResult = res; MMU.divMod = mod; MMU.divRunning = TRUE; NDS_Reschedule(); } DSI_TSC::DSI_TSC() { for(int i=0;i>1)&0x7F; read_flag = val&1; state = 1; return read16(); case 1: if(read_flag) { } else { registers[reg_selection] = (u8)val; } ret = read16(); reg_selection++; reg_selection &= 0x7F; return ret; } return 0; } u16 DSI_TSC::read16() { u8 page = registers[0]; switch(page) { case 3: //page 3 switch(reg_selection) { case 9: if(nds.isTouch) return 0; else return 0x40; break; case 14: if(nds.isTouch) return 0; else return 0x02; break; } break; case 252: //page 252 switch(reg_selection) { //high byte of X: case 1: case 3: case 5: case 7: case 9: return (nds.scr_touchX>>8)&0xFF; //low byte of X: case 2: case 4: case 6: case 8: case 10: return nds.scr_touchX&0xFF; //high byte of Y: case 11: case 13: case 15: case 17: case 19: return (nds.scr_touchY>>8)&0xFF; //low byte of Y: case 12: case 14: case 16: case 18: case 20: return nds.scr_touchY&0xFF; default: return 0xFF; } break; } //switch(page) //unknown page or register return 0xFF; } bool DSI_TSC::save_state(EMUFILE* os) { u32 version = 0; write32le(version,os); write8le(reg_selection,os); write8le(read_flag,os); write32le(state,os); write32le(readcount,os); for(int i=0;i void FASTCALL MMU_writeToGCControl(u32 val) { const int TEST_PROCNUM = PROCNUM; nds_dscard& card = MMU.dscard[TEST_PROCNUM]; memcpy(&card.command[0], &MMU.MMU_MEM[TEST_PROCNUM][0x40][0x1A8], 8); card.blocklen = 0; slot1_device.write32(PROCNUM,0xFFFFFFFF,val); //Special case for some flashcarts if(card.blocklen==0x01020304) return; if(!(val & 0x80000000)) { card.address = 0; card.transfer_count = 0; val &= 0x7F7FFFFF; T1WriteLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4, val); return; } u32 shift = (val>>24&7); if(shift == 7) card.transfer_count = 1; else if(shift == 0) card.transfer_count = 0; else card.transfer_count = (0x100< u32 MMU_readFromGC() { const int TEST_PROCNUM = PROCNUM; nds_dscard& card = MMU.dscard[TEST_PROCNUM]; u32 val = 0; if(card.transfer_count == 0) return 0; switch(card.command[0]) { case 0x9F: //Dummy val = 0xFFFFFFFF; break; case 0x3C: //Switch to KEY1 mode val = 0xFFFFFFFF; break; default: val = slot1_device.read32(TEST_PROCNUM, REG_GCDATAIN); break; } card.address += 4; // increment address card.transfer_count--; // update transfer counter if(card.transfer_count) // if transfer is not ended return val; // return data // transfer is done T1WriteLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4, T1ReadLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4) & 0x7F7FFFFF); // if needed, throw irq for the end of transfer if(MMU.AUX_SPI_CNT & 0x4000) NDS_makeIrq(TEST_PROCNUM, IRQ_BIT_GC_TRANSFER_COMPLETE); return val; } //does some validation on the game's choice of IF value, correcting it if necessary static void validateIF_arm9() { } template static void REG_IF_WriteByte(u32 addr, u8 val) { //the following bits are generated from logic and should not be affected here //Bit 21 NDS9 only: Geometry Command FIFO //arm9: IF &= ~0x00200000; //arm7: IF &= ~0x00000000; //UPDATE IN setIF() ALSO!!!!!!!!!!!!!!!! //UPDATE IN mmu_loadstate ALSO!!!!!!!!!!!! if (addr==2) { if(PROCNUM==ARMCPU_ARM9) val &= ~0x20; else val &= ~0x00; } //ZERO 01-dec-2010 : I am no longer sure this approach is correct.. it proved to be wrong for IPC fifo....... //it seems as if IF bits should always be cached (only the user can clear them) MMU.reg_IF_bits[PROCNUM] &= (~(((u32)val)<<(addr<<3))); NDS_Reschedule(); } template static void REG_IF_WriteWord(u32 addr,u16 val) { REG_IF_WriteByte(addr,val&0xFF); REG_IF_WriteByte(addr+1,(val>>8)&0xFF); } template static void REG_IF_WriteLong(u32 val) { REG_IF_WriteByte(0,val&0xFF); REG_IF_WriteByte(1,(val>>8)&0xFF); REG_IF_WriteByte(2,(val>>16)&0xFF); REG_IF_WriteByte(3,(val>>24)&0xFF); } template u32 MMU_struct::gen_IF() { u32 IF = reg_IF_bits[PROCNUM]; if(PROCNUM==ARMCPU_ARM9) { //according to gbatek, these flags are forced on until the condition is removed. //no proof of this though... switch(MMU_new.gxstat.gxfifo_irq) { case 0: //never break; case 1: //less than half full if(MMU_new.gxstat.fifo_low) IF |= IRQ_MASK_ARM9_GXFIFO; break; case 2: //empty if(MMU_new.gxstat.fifo_empty) IF |= IRQ_MASK_ARM9_GXFIFO; break; case 3: //reserved/unknown break; } } return IF; } static void writereg_DISP3DCNT(const int size, const u32 adr, const u32 val) { //UGH. rewrite this shite to use individual values and reconstruct the return value instead of packing things in this !@#)ing register //nanostray2 cutscene will test this vs old desmumes by using some kind of 32bit access for setting up this reg for cutscenes switch(size) { case 8: switch(adr) { case REG_DISPA_DISP3DCNT: MMU.reg_DISP3DCNT_bits &= 0xFFFFFF00; MMU.reg_DISP3DCNT_bits |= val; gfx3d_Control(MMU.reg_DISP3DCNT_bits); break; case REG_DISPA_DISP3DCNT+1: { u32 myval = (val & ~0x30) | (~val & ((MMU.reg_DISP3DCNT_bits>>8) & 0x30)); // bits 12,13 are ack bits myval &= 0x7F; //top bit isnt connected MMU.reg_DISP3DCNT_bits = MMU.reg_DISP3DCNT_bits&0xFFFF00FF; MMU.reg_DISP3DCNT_bits |= (myval<<8); gfx3d_Control(MMU.reg_DISP3DCNT_bits); } break; } break; case 16: case 32: writereg_DISP3DCNT(8,adr,val&0xFF); writereg_DISP3DCNT(8,adr+1,(val>>8)&0xFF); break; } } static u32 readreg_DISP3DCNT(const int size, const u32 adr) { //UGH. rewrite this shite to use individual values and reconstruct the return value instead of packing things in this !@#)ing register switch(size) { case 8: switch(adr) { case REG_DISPA_DISP3DCNT: return MMU.reg_DISP3DCNT_bits & 0xFF; case REG_DISPA_DISP3DCNT+1: return ((MMU.reg_DISP3DCNT_bits)>>8)& 0xFF; } break; case 16: case 32: return readreg_DISP3DCNT(8,adr)|(readreg_DISP3DCNT(8,adr+1)<<8); } assert(false); return 0; } static u32 readreg_POWCNT1(const int size, const u32 adr) { switch(size) { case 8: switch(adr) { case REG_POWCNT1: { u8 ret = 0; ret |= nds.power1.lcd?BIT(0):0; ret |= nds.power1.gpuMain?BIT(1):0; ret |= nds.power1.gfx3d_render?BIT(2):0; ret |= nds.power1.gfx3d_geometry?BIT(3):0; return ret; } case REG_POWCNT1+1: { u8 ret = 0; ret |= nds.power1.gpuSub?BIT(1):0; ret |= nds.power1.dispswap?BIT(7):0; return ret; } default: return 0; } case 16: case 32: return readreg_POWCNT1(8,adr)|(readreg_POWCNT1(8,adr+1)<<8); } assert(false); return 0; } static void writereg_POWCNT1(const int size, const u32 adr, const u32 val) { switch(size) { case 8: switch(adr) { case REG_POWCNT1: nds.power1.lcd = BIT0(val); nds.power1.gpuMain = BIT1(val); nds.power1.gfx3d_render = BIT2(val); nds.power1.gfx3d_geometry = BIT3(val); break; case REG_POWCNT1+1: nds.power1.gpuSub = BIT1(val); nds.power1.dispswap = BIT7(val); if(nds.power1.dispswap) { //printf("Main core on top (vcount=%d)\n",nds.VCount); MainScreen.offset = 0; SubScreen.offset = 192; } else { //printf("Main core on bottom (vcount=%d)\n",nds.VCount); MainScreen.offset = 192; SubScreen.offset = 0; } break; } break; case 16: case 32: writereg_POWCNT1(8,adr,val&0xFF); writereg_POWCNT1(8,adr+1,(val>>8)&0xFF); break; } } static INLINE void MMU_IPCSync(u8 proc, u32 val) { //INFO("IPC%s sync 0x%04X (0x%02X|%02X)\n", proc?"7":"9", val, val >> 8, val & 0xFF); u32 sync_l = T1ReadLong(MMU.MMU_MEM[proc][0x40], 0x180) & 0xFFFF; u32 sync_r = T1ReadLong(MMU.MMU_MEM[proc^1][0x40], 0x180) & 0xFFFF; sync_l = ( sync_l & 0x000F ) | ( val & 0x0F00 ); sync_r = ( sync_r & 0x6F00 ) | ( (val >> 8) & 0x000F ); sync_l |= val & 0x6000; if(nds.ensataEmulation && proc==1 && nds.ensataIpcSyncCounter<9) { u32 iteration = (val&0x0F00)>>8; if(iteration==8-nds.ensataIpcSyncCounter) nds.ensataIpcSyncCounter++; else printf("ERROR: ENSATA IPC SYNC HACK FAILED; BAD THINGS MAY HAPPEN\n"); //for some reason, the arm9 doesn't handshake when ensata is detected. //so we complete the protocol here, which is to mirror the values 8..0 back to //the arm7 as they are written by the arm7 sync_r &= 0xF0FF; sync_r |= (iteration<<8); sync_l &= 0xFFF0; sync_l |= iteration; } T1WriteLong(MMU.MMU_MEM[proc][0x40], 0x180, sync_l); T1WriteLong(MMU.MMU_MEM[proc^1][0x40], 0x180, sync_r); if ((sync_l & IPCSYNC_IRQ_SEND) && (sync_r & IPCSYNC_IRQ_RECV)) NDS_makeIrq(proc^1, IRQ_BIT_IPCSYNC); NDS_Reschedule(); } static INLINE u16 read_timer(int proc, int timerIndex) { //chained timers are always up to date if(MMU.timerMODE[proc][timerIndex] == 0xFFFF) return MMU.timer[proc][timerIndex]; //sometimes a timer will be read when it is not enabled. //we should have the value cached if(!MMU.timerON[proc][timerIndex]) return MMU.timer[proc][timerIndex]; //for unchained timers, we do not keep the timer up to date. its value will need to be calculated here s32 diff = (s32)(nds.timerCycle[proc][timerIndex] - nds_timer); assert(diff>=0); if(diff<0) printf("NEW EMULOOP BAD NEWS PLEASE REPORT: TIME READ DIFF < 0 (%d) (%d) (%d)\n",diff,timerIndex,MMU.timerMODE[proc][timerIndex]); s32 units = diff / (1<65536) { printf("NEW EMULOOP BAD NEWS PLEASE REPORT: UNITS %d:%d = %d\n",proc,timerIndex,units); ret = 0; } else ret = 65535 - units; return ret; } static INLINE void write_timer(int proc, int timerIndex, u16 val) { #if 0 int mask = ((val&0x80)>>7) << timerIndex; MMU.CheckTimers = (MMU.CheckTimers & (~mask)) | mask; #endif if(val&0x80) MMU.timer[proc][timerIndex] = MMU.timerReload[proc][timerIndex]; else { if(MMU.timerON[proc][timerIndex]) //read the timer value one last time MMU.timer[proc][timerIndex] = read_timer(proc,timerIndex); } MMU.timerON[proc][timerIndex] = val & 0x80; switch(val&7) { case 0 : MMU.timerMODE[proc][timerIndex] = 0+1; break; case 1 : MMU.timerMODE[proc][timerIndex] = 6+1; break; case 2 : MMU.timerMODE[proc][timerIndex] = 8+1; break; case 3 : MMU.timerMODE[proc][timerIndex] = 10+1; break; default : MMU.timerMODE[proc][timerIndex] = 0xFFFF; break; } int remain = 65536 - MMU.timerReload[proc][timerIndex]; nds.timerCycle[proc][timerIndex] = nds_timer + (remain<=255) ret |= BIT(24); //fifo full if(gxFIFO.size<128) ret |= BIT(25); //fifo half if(gxFIFO.size==0) ret |= BIT(26); //fifo empty //determine busy flag. //if we're waiting for a flush, we're busy if(isSwapBuffers) ret |= BIT(27); //if fifo is nonempty, we're busy if(gxFIFO.size!=0) ret |= BIT(27); //printf("[%d] %d %d %d\n",currFrameCounter,se,sb,gxFIFO.size!=0); ret |= ((gxfifo_irq & 0x3) << 30); //user's irq flags //printf("vc=%03d Returning gxstat read: %08X (isSwapBuffers=%d)\n",nds.VCount,ret,isSwapBuffers); //ret = (2 << 8); //INFO("gxSTAT 0x%08X (proj %i, pos %i)\n", ret, _hack_getMatrixStackLevel(1), _hack_getMatrixStackLevel(2)); return ret; } void TGXSTAT::write32(const u32 val) { gxfifo_irq = (val>>30)&3; if(BIT15(val)) { // Writing "1" to Bit15 does reset the Error Flag (Bit15), // and additionally resets the Projection Stack Pointer (Bit13) mtxStack[0].position = 0; se = 0; //clear stack error flag } //printf("gxstat write: %08X while gxfifo.size=%d\n",val,gxFIFO.size); //if (val & (1<<29)) // clear? (only in homebrew?) //{ // GFX_PIPEclear(); // GFX_FIFOclear(); // return; //} } void TGXSTAT::savestate(EMUFILE *f) { write32le(1,f); //version write8le(tb,f); write8le(tr,f); write8le(se,f); write8le(gxfifo_irq,f); write8le(sb,f); } bool TGXSTAT::loadstate(EMUFILE *f) { u32 version; if(read32le(&version,f) != 1) return false; if(version > 1) return false; read8le(&tb,f); read8le(&tr,f); read8le(&se,f); read8le(&gxfifo_irq,f); if (version >= 1) read8le(&sb,f); return true; } //this could be inlined... void MMU_struct_new::write_dma(const int proc, const int size, const u32 _adr, const u32 val) { //printf("%08lld -- write_dma: %d %d %08X %08X\n",nds_timer,proc,size,_adr,val); const u32 adr = _adr - _REG_DMA_CONTROL_MIN; const u32 chan = adr/12; const u32 regnum = (adr - chan*12)>>2; MMU_new.dma[proc][chan].regs[regnum]->write(size,adr,val); } //this could be inlined... u32 MMU_struct_new::read_dma(const int proc, const int size, const u32 _adr) { const u32 adr = _adr - _REG_DMA_CONTROL_MIN; const u32 chan = adr/12; const u32 regnum = (adr - chan*12)>>2; const u32 temp = MMU_new.dma[proc][chan].regs[regnum]->read(size,adr); //printf("%08lld -- read_dma: %d %d %08X = %08X\n",nds_timer,proc,size,_adr,temp); return temp; } MMU_struct_new::MMU_struct_new() { for(int i=0;i<2;i++) for(int j=0;j<4;j++) { dma[i][j].procnum = i; dma[i][j].chan = j; } } bool DmaController::loadstate(EMUFILE* f) { u32 version; if(read32le(&version,f) != 1) return false; if(version >1) return false; read8le(&enable,f); read8le(&irq,f); read8le(&repeatMode,f); read8le(&_startmode,f); read8le(&userEnable,f); read32le(&wordcount,f); u8 temp; read8le(&temp,f); startmode = (EDMAMode)temp; read8le(&temp,f); bitWidth = (EDMABitWidth)temp; read8le(&temp,f); sar = (EDMASourceUpdate)temp; read8le(&temp,f); dar = (EDMADestinationUpdate)temp; read32le(&saddr,f); read32le(&daddr,f); read32le(&dmaCheck,f); read32le(&running,f); read32le(&paused,f); read32le(&triggered,f); read64le(&nextEvent,f); if(version==1) { read32le(&saddr_user,f); read32le(&daddr_user,f); } return true; } void DmaController::savestate(EMUFILE *f) { write32le(1,f); //version write8le(enable,f); write8le(irq,f); write8le(repeatMode,f); write8le(_startmode,f); write8le(userEnable,f); write32le(wordcount,f); write8le(startmode,f); write8le(bitWidth,f); write8le(sar,f); write8le(dar,f); write32le(saddr,f); write32le(daddr,f); write32le(dmaCheck,f); write32le(running,f); write32le(paused,f); write32le(triggered,f); write64le(nextEvent,f); write32le(saddr_user,f); write32le(daddr_user,f); } void DmaController::write32(const u32 val) { if(running) { //desp triggers this a lot. figure out whats going on //printf("thats weird..user edited dma control while it was running\n"); } //printf("dma %d,%d WRITE %08X\n",procnum,chan,val); wordcount = val&0x1FFFFF; u8 wasRepeatMode = repeatMode; u8 wasEnable = enable; u32 valhi = val>>16; dar = (EDMADestinationUpdate)((valhi>>5)&3); sar = (EDMASourceUpdate)((valhi>>7)&3); repeatMode = BIT9(valhi); bitWidth = (EDMABitWidth)BIT10(valhi); _startmode = (valhi>>11)&7; if(procnum==ARMCPU_ARM7) _startmode &= 6; irq = BIT14(valhi); enable = BIT15(valhi); //if(irq) printf("!!!!!!!!!!!!IRQ!!!!!!!!!!!!!\n"); //make sure we don't get any old triggers if(!wasEnable && enable) triggered = FALSE; if(enable) { //address registers are reloaded from user's settings whenever dma is enabled //this is tested well by contra4 classic games, which use this to hdma scroll registers //specifically in the fit-screen mode. saddr = saddr_user; daddr = daddr_user; } //printf("dma %d,%d set to startmode %d with wordcount set to: %08X\n",procnum,chan,_startmode,wordcount); if (enable && procnum==1 && (!(chan&1)) && _startmode==6) printf("!!!---!!! WIFI DMA: %08X TO %08X, %i WORDS !!!---!!!\n", saddr, daddr, wordcount); //analyze enabling and startmode. //note that we only do this if the dma was freshly enabled. //we should probably also only be latching these other regs in that case too.. //but for now just this one will do (otherwise the dma repeat stop procedure (in this case the ff4 title menu load with gamecard dma) will fail) //if(!running) enable = userEnable; //if we were previously in a triggered mode, and were already enabled, //then don't re-trigger now. this is rather confusing.. //we really only want to auto-trigger gxfifo and immediate modes. //but we don't know what mode we're in yet. //so this is our workaround //(otherwise the dma repeat stop procedure (in this case the ff4 title menu load with gamecard dma) will fail) bool doNotStart = false; if(startmode != EDMAMode_Immediate && startmode != EDMAMode_GXFifo && wasEnable) doNotStart = true; //this dma may need to trigger now, so give it a chance //if(!(wasRepeatMode && !repeatMode)) //this was an older test if(!doNotStart) doSchedule(); driver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA); } void DmaController::exec() { //this function runs when the DMA ends. the dma start actually queues this event after some kind of guess as to how long the DMA should take //we'll need to unfreeze the arm9 bus now if(procnum==ARMCPU_ARM9) nds.freezeBus &= ~(1<<(chan+1)); dmaCheck = FALSE; if(running) { switch(startmode) { case EDMAMode_GXFifo: //this dma mode won't finish always its job when it gets signalled //sometimes it will have words left to transfer. //if(!paused) printf("gxfifo dma ended with %d remaining\n",wordcount); //only print this once if(wordcount>0) { doPause(); break; } default: doStop(); driver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA); return; } } if(enable) { //analyze startmode (this only gets latched when a dma begins) if(procnum==ARMCPU_ARM9) startmode = (EDMAMode)_startmode; else { //arm7 startmode analysis: static const EDMAMode lookup[] = {EDMAMode_Immediate,EDMAMode_VBlank,EDMAMode_Card,EDMAMode7_Wifi}; //arm7 has a slightly different startmode encoding startmode = lookup[_startmode>>1]; if(startmode == EDMAMode7_Wifi && (chan==1 || chan==3)) startmode = EDMAMode7_GBASlot; } //make it run, if it is triggered //but first, scan for triggering conditions switch(startmode) { case EDMAMode_Immediate: triggered = TRUE; break; case EDMAMode_GXFifo: if(gxFIFO.size<=127) triggered = TRUE; break; default: break; } if(triggered) { //if(procnum==0) printf("vc=%03d %08lld trig type %d dma#%d w/words %d at src:%08X dst:%08X gxf:%d",nds.VCount,nds_timer,startmode,chan,wordcount,saddr,daddr,gxFIFO.size); running = TRUE; paused = FALSE; if(procnum == ARMCPU_ARM9) doCopy(); else doCopy(); //printf(";%d\n",gxFIFO.size); } } driver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA); } template void DmaController::doCopy() { //generate a copy count depending on various copy mode's behavior u32 todo = wordcount; if(PROCNUM == ARMCPU_ARM9) if(todo == 0) todo = 0x200000; //according to gbatek.. we've verified this behaviour on the arm7 if(startmode == EDMAMode_MemDisplay) { todo = 128; //this is a hack. maybe an alright one though. it should be 4 words at a time. this is a whole scanline //apparently this dma turns off after it finishes a frame if(nds.VCount==191) enable = 0; } if(startmode == EDMAMode_Card) todo *= 0x80; if(startmode == EDMAMode_GXFifo) todo = std::min(todo,(u32)112); //determine how we're going to copy bool bogarted = false; u32 sz = (bitWidth==EDMABitWidth_16)?2:4; u32 dstinc,srcinc; switch(dar) { case EDMADestinationUpdate_Increment : dstinc = sz; break; case EDMADestinationUpdate_Decrement : dstinc = (u32)-(s32)sz; break; case EDMADestinationUpdate_Fixed : dstinc = 0; break; case EDMADestinationUpdate_IncrementReload : dstinc = sz; break; default: bogarted = true; break; } switch(sar) { case EDMASourceUpdate_Increment : srcinc = sz; break; case EDMASourceUpdate_Decrement : srcinc = (u32)-(s32)sz; break; case EDMASourceUpdate_Fixed : srcinc = 0; break; case EDMASourceUpdate_Invalid : bogarted = true; break; default: bogarted = true; break; } //need to figure out what to do about this if(bogarted) { printf("YOUR GAME IS BOGARTED!!! PLEASE REPORT!!!\n"); assert(false); return; } u32 src = saddr; u32 dst = daddr; //if these do not use MMU_AT_DMA and the corresponding code in the read/write routines, //then danny phantom title screen will be filled with a garbage char which is made by //dmaing from 0x00000000 to 0x06000000 //TODO - these might be losing out a lot by not going through the templated version anymore. //we might make another function to do just the raw copy op which can use them with checks //outside the loop int time_elapsed = 0; if(sz==4) { for(s32 i=(s32)todo; i>0; i--) { time_elapsed += _MMU_accesstime(src,true); time_elapsed += _MMU_accesstime(dst,true); u32 temp = _MMU_read32(procnum,MMU_AT_DMA,src); _MMU_write32(procnum,MMU_AT_DMA,dst, temp); dst += dstinc; src += srcinc; } } else { for(s32 i=(s32)todo; i>0; i--) { time_elapsed += _MMU_accesstime(src,true); time_elapsed += _MMU_accesstime(dst,true); u16 temp = _MMU_read16(procnum,MMU_AT_DMA,src); _MMU_write16(procnum,MMU_AT_DMA,dst, temp); dst += dstinc; src += srcinc; } } //printf("ARM%c dma of size %d from 0x%08X to 0x%08X took %d cycles\n",PROCNUM==0?'9':'7',todo*sz,saddr,daddr,time_elapsed); //reschedule an event for the end of this dma, and figure out how much it cost us doSchedule(); nextEvent += time_elapsed; //freeze the ARM9 bus for the duration of this DMA //thats not entirely accurate if(procnum==ARMCPU_ARM9) nds.freezeBus |= (1<<(chan+1)); //write back the addresses saddr = src; if(dar != EDMADestinationUpdate_IncrementReload) //but dont write back dst if we were supposed to reload daddr = dst; //do wordcount accounting if(startmode == EDMAMode_Card) todo /= 0x80; //divide this funky one back down before subtracting it if(!repeatMode) wordcount -= todo; } void triggerDma(EDMAMode mode) { MACRODO2(0, { const int i=X; MACRODO4(0, { const int j=X; MMU_new.dma[i][j].tryTrigger(mode); }); }); } void DmaController::tryTrigger(EDMAMode mode) { if(startmode != mode) return; if(!enable) return; //hmm dont trigger it if its already running! //but paused things need triggers to continue if(running && !paused) return; triggered = TRUE; doSchedule(); } void DmaController::doSchedule() { dmaCheck = TRUE; nextEvent = nds_timer; NDS_RescheduleDMA(); } void DmaController::doPause() { triggered = FALSE; paused = TRUE; } void DmaController::doStop() { //if(procnum==0) printf("%08lld stop type %d dma#%d\n",nds_timer,startmode,chan); running = FALSE; if(!repeatMode) enable = FALSE; if(irq) { NDS_makeIrq(procnum,IRQ_BIT_DMA_0+chan); } } u32 DmaController::read32() { u32 ret = 0; ret |= enable<<31; ret |= irq<<30; ret |= _startmode<<27; ret |= bitWidth<<26; ret |= repeatMode<<25; ret |= sar<<23; ret |= dar<<21; ret |= wordcount; //printf("dma %d,%d READ %08X\n",procnum,chan,ret); return ret; } static INLINE void write_auxspicnt(const int proc, const int size, const int adr, const int val) { //why val==0 to reset? is it a particular bit? its not bit 6... switch(size) { case 16: MMU.AUX_SPI_CNT = val; if (val == 0) MMU_new.backupDevice.reset_command(); break; case 8: switch(adr) { case 0: T1WriteByte((u8*)&MMU.AUX_SPI_CNT,0,val); if (val == 0) MMU_new.backupDevice.reset_command(); break; case 1: T1WriteByte((u8*)&MMU.AUX_SPI_CNT,1,val); break; } } } //================================================================================================== ARM9 * //========================================================================================================= //========================================================================================================= //================================================= MMU write 08 void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val) { adr &= 0x0FFFFFFF; mmu_log_debug_ARM9(adr, "(write08) 0x%02X", val); if(adr < 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0; #endif T1WriteByte(MMU.ARM9_ITCM, adr & 0x7FFF, val); return; } if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); if(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7) {} //prohibited else addon.write08(ARMCPU_ARM9, adr, val); return; } //block 8bit writes to OAM and palette memory if((adr&0x0F000000)==0x07000000) return; if((adr&0x0F000000)==0x05000000) return; if (adr >> 24 == 4) { // TODO: add pal reg if (nds.power1.gpuMain == 0) if ((adr >= 0x04000008) && (adr<=0x0400005F)) return; if (nds.power1.gpuSub == 0) if ((adr >= 0x04001008) && (adr<=0x0400105F)) return; if (nds.power1.gfx3d_geometry == 0) if ((adr >= 0x04000400) && (adr<=0x040006FF)) return; if (nds.power1.gfx3d_render == 0) if ((adr >= 0x04000320) && (adr<=0x040003FF)) return; if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM9,8,adr,val); return; } switch(adr) { case REG_SQRTCNT: printf("ERROR 8bit SQRTCNT WRITE\n"); return; case REG_SQRTCNT+1: printf("ERROR 8bit SQRTCNT1 WRITE\n"); return; case REG_SQRTCNT+2: printf("ERROR 8bit SQRTCNT2 WRITE\n"); return; case REG_SQRTCNT+3: printf("ERROR 8bit SQRTCNT3 WRITE\n"); return; #if 1 case REG_DIVCNT: printf("ERROR 8bit DIVCNT WRITE\n"); return; case REG_DIVCNT+1: printf("ERROR 8bit DIVCNT+1 WRITE\n"); return; case REG_DIVCNT+2: printf("ERROR 8bit DIVCNT+2 WRITE\n"); return; case REG_DIVCNT+3: printf("ERROR 8bit DIVCNT+3 WRITE\n"); return; #endif //fog table: only write bottom 7 bits case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x01: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x03: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x05: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x07: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x09: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0B: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0D: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x0F: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x11: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x13: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x15: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x17: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x19: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1B: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1D: case eng_3D_FOG_TABLE+0x1E: case eng_3D_FOG_TABLE+0x1F: val &= 0x7F; break; //ensata putchar port case 0x04FFF000: if(nds.ensataEmulation) { printf("%c",val); fflush(stdout); } break; case eng_3D_GXSTAT: MMU_new.gxstat.write(8,adr,val); break; case REG_DISPA_WIN0H: GPU_setWIN0_H1(MainScreen.gpu, val); break ; case REG_DISPA_WIN0H+1: GPU_setWIN0_H0 (MainScreen.gpu, val); break ; case REG_DISPA_WIN1H: GPU_setWIN1_H1 (MainScreen.gpu,val); break ; case REG_DISPA_WIN1H+1: GPU_setWIN1_H0 (MainScreen.gpu,val); break ; case REG_DISPB_WIN0H: GPU_setWIN0_H1(SubScreen.gpu,val); break ; case REG_DISPB_WIN0H+1: GPU_setWIN0_H0(SubScreen.gpu,val); break ; case REG_DISPB_WIN1H: GPU_setWIN1_H1(SubScreen.gpu,val); break ; case REG_DISPB_WIN1H+1: GPU_setWIN1_H0(SubScreen.gpu,val); break ; case REG_DISPA_WIN0V: GPU_setWIN0_V1(MainScreen.gpu,val) ; break ; case REG_DISPA_WIN0V+1: GPU_setWIN0_V0(MainScreen.gpu,val) ; break ; case REG_DISPA_WIN1V: GPU_setWIN1_V1(MainScreen.gpu,val) ; break ; case REG_DISPA_WIN1V+1: GPU_setWIN1_V0(MainScreen.gpu,val) ; break ; case REG_DISPB_WIN0V: GPU_setWIN0_V1(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN0V+1: GPU_setWIN0_V0(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN1V: GPU_setWIN1_V1(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN1V+1: GPU_setWIN1_V0(SubScreen.gpu,val) ; break ; case REG_DISPA_WININ: GPU_setWININ0(MainScreen.gpu,val) ; break ; case REG_DISPA_WININ+1: GPU_setWININ1(MainScreen.gpu,val) ; break ; case REG_DISPA_WINOUT: GPU_setWINOUT(MainScreen.gpu,val) ; break ; case REG_DISPA_WINOUT+1: GPU_setWINOBJ(MainScreen.gpu,val); break ; case REG_DISPB_WININ: GPU_setWININ0(SubScreen.gpu,val) ; break ; case REG_DISPB_WININ+1: GPU_setWININ1(SubScreen.gpu,val) ; break ; case REG_DISPB_WINOUT: GPU_setWINOUT(SubScreen.gpu,val) ; break ; case REG_DISPB_WINOUT+1: GPU_setWINOBJ(SubScreen.gpu,val) ; break ; case REG_DISPA_BLDCNT: GPU_setBLDCNT_HIGH(MainScreen.gpu,val); break; case REG_DISPA_BLDCNT+1: GPU_setBLDCNT_LOW (MainScreen.gpu,val); break; case REG_DISPB_BLDCNT: GPU_setBLDCNT_HIGH (SubScreen.gpu,val); break; case REG_DISPB_BLDCNT+1: GPU_setBLDCNT_LOW (SubScreen.gpu,val); break; case REG_DISPA_BLDALPHA: MainScreen.gpu->setBLDALPHA_EVA(val); break; case REG_DISPA_BLDALPHA+1: MainScreen.gpu->setBLDALPHA_EVB(val); break; case REG_DISPB_BLDALPHA: SubScreen.gpu->setBLDALPHA_EVA(val); break; case REG_DISPB_BLDALPHA+1: SubScreen.gpu->setBLDALPHA_EVB(val); break; case REG_DISPA_BLDY: GPU_setBLDY_EVY(MainScreen.gpu,val) ; break ; case REG_DISPB_BLDY: GPU_setBLDY_EVY(SubScreen.gpu,val) ; break; case REG_AUXSPICNT: write_auxspicnt(9,8,0,val); return; case REG_AUXSPICNT+1: write_auxspicnt(9,8,1,val); return; case REG_AUXSPIDATA: if(val!=0) MMU.AUX_SPI_CMD = val & 0xFF; T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM9)); MMU.AUX_SPI_CNT &= ~0x80; //remove busy flag return; case REG_POWCNT1: writereg_POWCNT1(8,adr,val); break; case REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(8,adr,val); return; case REG_DISPA_DISP3DCNT+1: writereg_DISP3DCNT(8,adr,val); return; case REG_IF: REG_IF_WriteByte(0,val); break; case REG_IF+1: REG_IF_WriteByte(1,val); break; case REG_IF+2: REG_IF_WriteByte(2,val); break; case REG_IF+3: REG_IF_WriteByte(3,val); break; case eng_3D_CLEAR_COLOR+0: case eng_3D_CLEAR_COLOR+1: case eng_3D_CLEAR_COLOR+2: case eng_3D_CLEAR_COLOR+3: T1WriteByte((u8*)&gfx3d.state.clearColor,adr-eng_3D_CLEAR_COLOR,val); break; case REG_VRAMCNTA: case REG_VRAMCNTB: case REG_VRAMCNTC: case REG_VRAMCNTD: case REG_VRAMCNTE: case REG_VRAMCNTF: case REG_VRAMCNTG: case REG_WRAMCNT: case REG_VRAMCNTH: case REG_VRAMCNTI: MMU_VRAMmapControl(adr-REG_VRAMCNTA, val); break; case REG_DISPA_DISPMMEMFIFO: { DISP_FIFOsend(val); return; } #ifdef LOG_CARD case 0x040001A0 : /* TODO (clear): ??? */ case 0x040001A1 : case 0x040001A2 : case 0x040001A8 : case 0x040001A9 : case 0x040001AA : case 0x040001AB : case 0x040001AC : case 0x040001AD : case 0x040001AE : case 0x040001AF : LOG("%08X : %02X\r\n", adr, val); #endif } MMU.MMU_MEM[ARMCPU_ARM9][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]]=val; return; } bool unmapped, restricted; adr = MMU_LCDmap(adr, unmapped, restricted); if(unmapped) return; if(restricted) return; //block 8bit vram writes #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM9)) JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM9, 0) = 0; #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] MMU.MMU_MEM[ARMCPU_ARM9][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]]=val; } //================================================= MMU ARM9 write 16 void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val) { adr &= 0x0FFFFFFE; mmu_log_debug_ARM9(adr, "(write16) 0x%04X", val); if (adr < 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0; #endif T1WriteWord(MMU.ARM9_ITCM, adr & 0x7FFF, val); return; } if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); if(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7) {} //prohibited else addon.write16(ARMCPU_ARM9, adr, val); return; } if((adr >> 24) == 4) { // TODO: add pal reg if (nds.power1.gpuMain == 0) if ((adr >= 0x04000008) && (adr<=0x0400005F)) return; if (nds.power1.gpuSub == 0) if ((adr >= 0x04001008) && (adr<=0x0400105F)) return; if (nds.power1.gfx3d_geometry == 0) if ((adr >= 0x04000400) && (adr<=0x040006FF)) return; if (nds.power1.gfx3d_render == 0) if ((adr >= 0x04000320) && (adr<=0x040003FF)) return; if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM9,16,adr,val); return; } switch (adr >> 4) { //toon table case 0x0400038: case 0x0400039: case 0x040003A: case 0x040003B: ((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF)>>1] = val; gfx3d_UpdateToonTable((adr & 0x3F) >> 1, val); return; } // Address is an IO register switch(adr) { case eng_3D_GXSTAT: MMU_new.gxstat.write(16,adr,val); break; //fog table: only write bottom 7 bits case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1E: val &= 0x7F7F; break; case REG_DISPA_BG2XL: MainScreen.gpu->setAffineStartWord(2,0,val,0); break; case REG_DISPA_BG2XH: MainScreen.gpu->setAffineStartWord(2,0,val,1); break; case REG_DISPA_BG2YL: MainScreen.gpu->setAffineStartWord(2,1,val,0); break; case REG_DISPA_BG2YH: MainScreen.gpu->setAffineStartWord(2,1,val,1); break; case REG_DISPA_BG3XL: MainScreen.gpu->setAffineStartWord(3,0,val,0); break; case REG_DISPA_BG3XH: MainScreen.gpu->setAffineStartWord(3,0,val,1); break; case REG_DISPA_BG3YL: MainScreen.gpu->setAffineStartWord(3,1,val,0); break; case REG_DISPA_BG3YH: MainScreen.gpu->setAffineStartWord(3,1,val,1); break; case REG_DISPB_BG2XL: SubScreen.gpu->setAffineStartWord(2,0,val,0); break; case REG_DISPB_BG2XH: SubScreen.gpu->setAffineStartWord(2,0,val,1); break; case REG_DISPB_BG2YL: SubScreen.gpu->setAffineStartWord(2,1,val,0); break; case REG_DISPB_BG2YH: SubScreen.gpu->setAffineStartWord(2,1,val,1); break; case REG_DISPB_BG3XL: SubScreen.gpu->setAffineStartWord(3,0,val,0); break; case REG_DISPB_BG3XH: SubScreen.gpu->setAffineStartWord(3,0,val,1); break; case REG_DISPB_BG3YL: SubScreen.gpu->setAffineStartWord(3,1,val,0); break; case REG_DISPB_BG3YH: SubScreen.gpu->setAffineStartWord(3,1,val,1); break; case REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(16,adr,val); return; // Alpha test reference value - Parameters:1 case eng_3D_ALPHA_TEST_REF: { ((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x340>>1] = val; gfx3d_glAlphaFunc(val); return; } case eng_3D_CLEAR_COLOR: case eng_3D_CLEAR_COLOR+2: { T1WriteWord((u8*)&gfx3d.state.clearColor,adr-eng_3D_CLEAR_COLOR,val); break; } // Clear background depth setup - Parameters:2 case eng_3D_CLEAR_DEPTH: { ((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x354>>1] = val; gfx3d_glClearDepth(val); return; } // Fog Color - Parameters:4b case eng_3D_FOG_COLOR: { ((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x358>>1] = val; gfx3d_glFogColor(val); return; } case eng_3D_FOG_OFFSET: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x35C>>1] = val; gfx3d_glFogOffset(val); return; } case REG_DIVCNT: MMU_new.div.write16(val); execdiv(); return; #if 1 case REG_DIVNUMER: case REG_DIVNUMER+2: case REG_DIVNUMER+4: printf("DIV: 16 write NUMER %08X. PLEASE REPORT! \n", val); break; case REG_DIVDENOM: case REG_DIVDENOM+2: case REG_DIVDENOM+4: printf("DIV: 16 write DENOM %08X. PLEASE REPORT! \n", val); break; #endif case REG_SQRTCNT: MMU_new.sqrt.write16(val); execsqrt(); return; case REG_DISPA_BLDCNT: GPU_setBLDCNT(MainScreen.gpu,val) ; break ; case REG_DISPB_BLDCNT: GPU_setBLDCNT(SubScreen.gpu,val) ; break ; case REG_DISPA_BLDALPHA: MainScreen.gpu->setBLDALPHA(val); break ; case REG_DISPB_BLDALPHA: SubScreen.gpu->setBLDALPHA(val); break ; case REG_DISPA_BLDY: GPU_setBLDY_EVY(MainScreen.gpu,val) ; break ; case REG_DISPB_BLDY: GPU_setBLDY_EVY(SubScreen.gpu,val) ; break; case REG_DISPA_MASTERBRIGHT: GPU_setMasterBrightness (MainScreen.gpu, val); break; /* case REG_DISPA_MOSAIC: GPU_setMOSAIC(MainScreen.gpu,val) ; break ; case REG_DISPB_MOSAIC: GPU_setMOSAIC(SubScreen.gpu,val) ; break ; */ //case REG_DISPA_BG0HOFS: // GPU_setBGxHOFS(0, MainScreen.gpu, val); // break; //case REG_DISPA_BG0VOFS: // GPU_setBGxVOFS(0, MainScreen.gpu, val); // break; //case REG_DISPA_BG1HOFS: // GPU_setBGxHOFS(1, MainScreen.gpu, val); // break; //case REG_DISPA_BG1VOFS: // GPU_setBGxVOFS(1, MainScreen.gpu, val); // break; //case REG_DISPA_BG2HOFS: // GPU_setBGxHOFS(2, MainScreen.gpu, val); // break; //case REG_DISPA_BG2VOFS: // GPU_setBGxVOFS(2, MainScreen.gpu, val); // break; //case REG_DISPA_BG3HOFS: // GPU_setBGxHOFS(3, MainScreen.gpu, val); // break; //case REG_DISPA_BG3VOFS: // GPU_setBGxVOFS(3, MainScreen.gpu, val); // break; case REG_DISPA_WIN0H: GPU_setWIN0_H (MainScreen.gpu,val) ; break ; case REG_DISPA_WIN1H: GPU_setWIN1_H(MainScreen.gpu,val) ; break ; case REG_DISPB_WIN0H: GPU_setWIN0_H(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN1H: GPU_setWIN1_H(SubScreen.gpu,val) ; break ; case REG_DISPA_WIN0V: GPU_setWIN0_V(MainScreen.gpu,val) ; break ; case REG_DISPA_WIN1V: GPU_setWIN1_V(MainScreen.gpu,val) ; break ; case REG_DISPB_WIN0V: GPU_setWIN0_V(SubScreen.gpu,val) ; break ; case REG_DISPB_WIN1V: GPU_setWIN1_V(SubScreen.gpu,val) ; break ; case REG_DISPA_WININ: GPU_setWININ(MainScreen.gpu, val) ; break ; case REG_DISPA_WINOUT: GPU_setWINOUT16(MainScreen.gpu, val) ; break ; /* case REG_DISPB_BG0HOFS: GPU_setBGxHOFS(0, SubScreen.gpu, val); break; case REG_DISPB_BG0VOFS: GPU_setBGxVOFS(0, SubScreen.gpu, val); break; case REG_DISPB_BG1HOFS: GPU_setBGxHOFS(1, SubScreen.gpu, val); break; case REG_DISPB_BG1VOFS: GPU_setBGxVOFS(1, SubScreen.gpu, val); break; case REG_DISPB_BG2HOFS: GPU_setBGxHOFS(2, SubScreen.gpu, val); break; case REG_DISPB_BG2VOFS: GPU_setBGxVOFS(2, SubScreen.gpu, val); break; case REG_DISPB_BG3HOFS: GPU_setBGxHOFS(3, SubScreen.gpu, val); break; case REG_DISPB_BG3VOFS: GPU_setBGxVOFS(3, SubScreen.gpu, val); break;*/ case REG_DISPB_WININ: GPU_setWININ(SubScreen.gpu, val) ; break ; case REG_DISPB_WINOUT: GPU_setWINOUT16(SubScreen.gpu, val) ; break ; case REG_DISPB_MASTERBRIGHT: GPU_setMasterBrightness (SubScreen.gpu, val); break; case REG_POWCNT1: writereg_POWCNT1(16,adr,val); return; case REG_EXMEMCNT: { u16 remote_proc = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204, (val & 0xFF80) | (remote_proc & 0x7F)); return; } case REG_AUXSPICNT: write_auxspicnt(9,16,0,val); return; case REG_AUXSPIDATA: if(val!=0) MMU.AUX_SPI_CMD = val & 0xFF; //T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, bm_transfer(&MMU.bupmem, val)); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM9)); MMU.AUX_SPI_CNT &= ~0x80; //remove busy flag return; case REG_DISPA_BG0CNT : //GPULOG("MAIN BG0 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 0, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x8, val); return; case REG_DISPA_BG1CNT : //GPULOG("MAIN BG1 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 1, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xA, val); return; case REG_DISPA_BG2CNT : //GPULOG("MAIN BG2 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 2, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xC, val); return; case REG_DISPA_BG3CNT : //GPULOG("MAIN BG3 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 3, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xE, val); return; case REG_DISPB_BG0CNT : //GPULOG("SUB BG0 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 0, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1008, val); return; case REG_DISPB_BG1CNT : //GPULOG("SUB BG1 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 1, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100A, val); return; case REG_DISPB_BG2CNT : //GPULOG("SUB BG2 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 2, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100C, val); return; case REG_DISPB_BG3CNT : //GPULOG("SUB BG3 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 3, val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100E, val); return; case REG_VRAMCNTA: case REG_VRAMCNTC: case REG_VRAMCNTE: case REG_VRAMCNTG: case REG_VRAMCNTH: MMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+1, val >> 8); break; case REG_IME: NDS_Reschedule(); MMU.reg_IME[ARMCPU_ARM9] = val & 0x01; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x208, val); return; case REG_IE : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM9] = (MMU.reg_IE[ARMCPU_ARM9]&0xFFFF0000) | val; return; case REG_IE + 2 : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM9] = (MMU.reg_IE[ARMCPU_ARM9]&0xFFFF) | (((u32)val)<<16); return; case REG_IF: REG_IF_WriteWord(0,val); return; case REG_IF+2: REG_IF_WriteWord(2,val); return; case REG_IPCSYNC: MMU_IPCSync(ARMCPU_ARM9, val); return; case REG_IPCFIFOCNT: IPC_FIFOcnt(ARMCPU_ARM9, val); return; case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : MMU.timerReload[ARMCPU_ARM9][(adr>>2)&3] = val; return; case REG_TM0CNTH : case REG_TM1CNTH : case REG_TM2CNTH : case REG_TM3CNTH : { int timerIndex = ((adr-2)>>2)&0x3; write_timer(ARMCPU_ARM9, timerIndex, val); return; } case REG_DISPA_DISPCNT : { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0) & 0xFFFF0000) | val; GPU_setVideoProp(MainScreen.gpu, v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, v); return; } case REG_DISPA_DISPCNT+2 : { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0) & 0xFFFF) | ((u32) val << 16); GPU_setVideoProp(MainScreen.gpu, v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, v); } return; case REG_DISPA_DISPCAPCNT : { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64) & 0xFFFF0000) | val; GPU_set_DISPCAPCNT(v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64, v); return; } case REG_DISPA_DISPCAPCNT + 2: { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64) & 0xFFFF) | ((u32)val << 16); GPU_set_DISPCAPCNT(v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64, v); return; } case REG_DISPB_DISPCNT : { u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000) & 0xFFFF0000) | val; GPU_setVideoProp(SubScreen.gpu, v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, v); return; } case REG_DISPB_DISPCNT+2 : { //emu_halt(); u32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000) & 0xFFFF) | ((u32) val << 16); GPU_setVideoProp(SubScreen.gpu, v); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, v); return; } case REG_DISPA_DISPMMEMFIFO: { DISP_FIFOsend(val); return; } case REG_GCROMCTRL : MMU_writeToGCControl( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1A4) & 0xFFFF0000) | val); return; case REG_GCROMCTRL+2 : MMU_writeToGCControl( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1A4) & 0xFFFF) | ((u32) val << 16)); return; } T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); return; } bool unmapped, restricted; adr = MMU_LCDmap(adr, unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM9)) JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM9, 0) = 0; #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); } //================================================= MMU ARM9 write 32 void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) { adr &= 0x0FFFFFFC; mmu_log_debug_ARM9(adr, "(write32) 0x%08X", val); if(adr<0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0; JIT_COMPILED_FUNC_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 1) = 0; #endif T1WriteLong(MMU.ARM9_ITCM, adr & 0x7FFF, val); return ; } if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); if(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7) {} //prohibited else addon.write32(ARMCPU_ARM9, adr, val); return; } #if 0 if ((adr & 0xFF800000) == 0x04800000) { // access to non regular hw registers // return to not overwrite valid data return ; } #endif if((adr>>24)==4) { // TODO: add pal reg if (nds.power1.gpuMain == 0) if ((adr >= 0x04000008) && (adr<=0x0400005F)) return; if (nds.power1.gpuSub == 0) if ((adr >= 0x04001008) && (adr<=0x0400105F)) return; if (nds.power1.gfx3d_geometry == 0) if ((adr >= 0x04000400) && (adr<=0x040006FF)) return; if (nds.power1.gfx3d_render == 0) if ((adr >= 0x04000320) && (adr<=0x040003FF)) return; // MightyMax: no need to do several ifs, when only one can happen // switch/case instead // both comparison >=,< per if can be replaced by one bit comparison since // they are 2^4 aligned and 2^4n wide // this looks ugly but should reduce load on register writes, they are done as // lookups by the compiler switch (adr >> 4) { case 0x400033: //edge color table ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val; return; case 0x400038: case 0x400039: case 0x40003A: case 0x40003B: //toon table ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val; gfx3d_UpdateToonTable((adr & 0x3F) >> 1, val); return; case 0x400040: case 0x400041: case 0x400042: case 0x400043: // FIFO Commands ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val; gfx3d_sendCommandToFIFO(val); return; case 0x400044: case 0x400045: case 0x400046: case 0x400047: case 0x400048: case 0x400049: case 0x40004A: case 0x40004B: case 0x40004C: case 0x40004D: case 0x40004E: case 0x40004F: case 0x400050: case 0x400051: case 0x400052: case 0x400053: case 0x400054: case 0x400055: case 0x400056: case 0x400057: case 0x400058: case 0x400059: case 0x40005A: case 0x40005B: case 0x40005C: // Individual Commands if (gxFIFO.size > 254) nds.freezeBus |= 1; ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val; gfx3d_sendCommand(adr, val); return; default: break; } if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM9,32,adr,val); return; } switch(adr) { case REG_SQRTCNT: MMU_new.sqrt.write16((u16)val); return; case REG_DIVCNT: MMU_new.div.write16((u16)val); return; case REG_POWCNT1: writereg_POWCNT1(32,adr,val); break; //fog table: only write bottom 7 bits case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1C: val &= 0x7F7F7F7F; break; //ensata handshaking port? case 0x04FFF010: if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_ack && val == 0x13579bdf) nds.ensataHandshake = ENSATA_HANDSHAKE_confirm; if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_confirm && val == 0xfdb97531) { printf("ENSATA HANDSHAKE COMPLETE\n"); nds.ensataHandshake = ENSATA_HANDSHAKE_complete; } break; //todo - these are usually write only regs (these and 1000 more) //shouldnt we block them from getting written? ugh case eng_3D_CLIPMTX_RESULT: if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_none && val==0x2468ace0) { printf("ENSATA HANDSHAKE BEGIN\n"); nds.ensataHandshake = ENSATA_HANDSHAKE_query; } break; case eng_3D_GXSTAT: MMU_new.gxstat.write32(val); break; case REG_DISPA_BG2XL: MainScreen.gpu->setAffineStart(2,0,val); return; case REG_DISPA_BG2YL: MainScreen.gpu->setAffineStart(2,1,val); return; case REG_DISPB_BG2XL: SubScreen.gpu->setAffineStart(2,0,val); return; case REG_DISPB_BG2YL: SubScreen.gpu->setAffineStart(2,1,val); return; case REG_DISPA_BG3XL: MainScreen.gpu->setAffineStart(3,0,val); return; case REG_DISPA_BG3YL: MainScreen.gpu->setAffineStart(3,1,val); return; case REG_DISPB_BG3XL: SubScreen.gpu->setAffineStart(3,0,val); return; case REG_DISPB_BG3YL: SubScreen.gpu->setAffineStart(3,1,val); return; // Alpha test reference value - Parameters:1 case eng_3D_ALPHA_TEST_REF: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x340>>2] = val; gfx3d_glAlphaFunc(val); return; } case eng_3D_CLEAR_COLOR: T1WriteLong((u8*)&gfx3d.state.clearColor,0,val); break; // Clear background depth setup - Parameters:2 case eng_3D_CLEAR_DEPTH: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x354>>2] = val; gfx3d_glClearDepth(val); return; } // Fog Color - Parameters:4b case 0x04000358: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x358>>2] = val; gfx3d_glFogColor(val); return; } case 0x0400035C: { ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x35C>>2] = val; gfx3d_glFogOffset(val); return; } //case REG_DISPA_BG0HOFS: // GPU_setBGxHOFS(0, MainScreen.gpu, val&0xFFFF); // GPU_setBGxVOFS(0, MainScreen.gpu, (val>>16)); // break; case REG_DISPA_WININ: { GPU_setWININ(MainScreen.gpu, val & 0xFFFF) ; GPU_setWINOUT16(MainScreen.gpu, (val >> 16) & 0xFFFF) ; break; } case REG_DISPB_WININ: { GPU_setWININ(SubScreen.gpu, val & 0xFFFF) ; GPU_setWINOUT16(SubScreen.gpu, (val >> 16) & 0xFFFF) ; break; } case REG_DISPA_WIN0H: { GPU_setWIN0_H(MainScreen.gpu, val&0xFFFF); GPU_setWIN1_H(MainScreen.gpu, val>>16); break; } case REG_DISPA_WIN0V: { GPU_setWIN0_V(MainScreen.gpu, val&0xFFFF); GPU_setWIN1_V(MainScreen.gpu, val>>16); break; } case REG_DISPB_WIN0H: { GPU_setWIN0_H(SubScreen.gpu, val&0xFFFF); GPU_setWIN1_H(SubScreen.gpu, val>>16); break; } case REG_DISPB_WIN0V: { GPU_setWIN0_V(SubScreen.gpu, val&0xFFFF); GPU_setWIN1_V(SubScreen.gpu, val>>16); break; } case REG_DISPA_MASTERBRIGHT: GPU_setMasterBrightness(MainScreen.gpu, val & 0xFFFF); break; case REG_DISPB_MASTERBRIGHT: GPU_setMasterBrightness(SubScreen.gpu, val & 0xFFFF); break; case REG_DISPA_BLDCNT: { GPU_setBLDCNT (MainScreen.gpu,val&0xffff); MainScreen.gpu->setBLDALPHA(val>>16); break; } case REG_DISPB_BLDCNT: { GPU_setBLDCNT (SubScreen.gpu,val&0xffff); SubScreen.gpu->setBLDALPHA(val>>16); break; } case REG_DISPA_BLDY: GPU_setBLDY_EVY(MainScreen.gpu,val&0xFFFF) ; break ; case REG_DISPB_BLDY: GPU_setBLDY_EVY(SubScreen.gpu,val&0xFFFF); break; case REG_DISPA_DISPCNT : GPU_setVideoProp(MainScreen.gpu, val); //GPULOG("MAIN INIT 32B %08X\r\n", val); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, val); return; case REG_DISPB_DISPCNT : GPU_setVideoProp(SubScreen.gpu, val); //GPULOG("SUB INIT 32B %08X\r\n", val); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, val); return; case REG_VRAMCNTA: case REG_VRAMCNTE: MMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+1, (val >> 8) & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+2, (val >> 16) & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+3, (val >> 24) & 0xFF); break; case REG_VRAMCNTH: MMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF); MMU_VRAMmapControl(adr-REG_VRAMCNTA+1, (val >> 8) & 0xFF); break; case REG_IME : NDS_Reschedule(); MMU.reg_IME[ARMCPU_ARM9] = val & 0x01; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x208, val); return; case REG_IE : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM9] = val; return; case REG_IF: REG_IF_WriteLong(val); return; case REG_TM0CNTL: case REG_TM1CNTL: case REG_TM2CNTL: case REG_TM3CNTL: { int timerIndex = (adr>>2)&0x3; MMU.timerReload[ARMCPU_ARM9][timerIndex] = (u16)val; T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & 0xFFF, val); write_timer(ARMCPU_ARM9, timerIndex, val>>16); return; } case REG_DIVNUMER: T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290, val); execdiv(); return; case REG_DIVNUMER+4: T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x294, val); execdiv(); return; case REG_DIVDENOM : { T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298, val); execdiv(); return; } case REG_DIVDENOM+4 : { T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x29C, val); execdiv(); return; } case REG_SQRTPARAM : { T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8, val); execsqrt(); return; } case REG_SQRTPARAM+4 : T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2BC, val); execsqrt(); return; case REG_IPCSYNC: MMU_IPCSync(ARMCPU_ARM9, val); return; case REG_IPCFIFOCNT: IPC_FIFOcnt(ARMCPU_ARM9, val); return; case REG_IPCFIFOSEND: IPC_FIFOsend(ARMCPU_ARM9, val); return; case REG_GCROMCTRL : MMU_writeToGCControl(val); return; case REG_DISPA_DISPCAPCNT : //INFO("MMU write32: REG_DISPA_DISPCAPCNT 0x%X\n", val); GPU_set_DISPCAPCNT(val); T1WriteLong(MMU.ARM9_REG, 0x64, val); return; case REG_DISPA_BG0CNT : GPU_setBGProp(MainScreen.gpu, 0, (val&0xFFFF)); GPU_setBGProp(MainScreen.gpu, 1, (val>>16)); //if((val>>16)==0x400) emu_halt(); T1WriteLong(MMU.ARM9_REG, 8, val); return; case REG_DISPA_BG2CNT : GPU_setBGProp(MainScreen.gpu, 2, (val&0xFFFF)); GPU_setBGProp(MainScreen.gpu, 3, (val>>16)); T1WriteLong(MMU.ARM9_REG, 0xC, val); return; case REG_DISPB_BG0CNT : GPU_setBGProp(SubScreen.gpu, 0, (val&0xFFFF)); GPU_setBGProp(SubScreen.gpu, 1, (val>>16)); T1WriteLong(MMU.ARM9_REG, 0x1008, val); return; case REG_DISPB_BG2CNT : GPU_setBGProp(SubScreen.gpu, 2, (val&0xFFFF)); GPU_setBGProp(SubScreen.gpu, 3, (val>>16)); T1WriteLong(MMU.ARM9_REG, 0x100C, val); return; case REG_DISPA_DISPMMEMFIFO: { DISP_FIFOsend(val); return; } case REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(32,adr,val); return; case REG_GCDATAIN: slot1_device.write32(ARMCPU_ARM9, REG_GCDATAIN,val); return; } T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); return; } bool unmapped, restricted; adr = MMU_LCDmap(adr, unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM9)) { JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM9, 0) = 0; JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM9, 1) = 0; } #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); } //================================================= MMU ARM9 read 08 u8 FASTCALL _MMU_ARM9_read08(u32 adr) { adr &= 0x0FFFFFFF; mmu_log_debug_ARM9(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]]); if(adr<0x02000000) return T1ReadByte(MMU.ARM9_ITCM, adr&0x7FFF); if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); if(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7) return 0; //prohibited else return addon.read08(ARMCPU_ARM9, adr); } if (adr >> 24 == 4) { //Address is an IO register if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,8,adr); switch(adr) { case REG_IF: return MMU.gen_IF(); case REG_IF+1: return (MMU.gen_IF()>>8); case REG_IF+2: return (MMU.gen_IF()>>16); case REG_IF+3: return (MMU.gen_IF()>>24); case REG_WRAMCNT: return MMU.WRAMCNT; case REG_DISPA_DISPSTAT: break; case REG_DISPA_DISPSTAT+1: break; case REG_DISPx_VCOUNT: return nds.VCount & 0xFF; case REG_DISPx_VCOUNT+1: return (nds.VCount>>8) & 0xFF; case REG_SQRTCNT: return (MMU_new.sqrt.read16() & 0xFF); case REG_SQRTCNT+1: return ((MMU_new.sqrt.read16()>>8) & 0xFF); //sqrtcnt isnt big enough for these to exist. but they'd probably return 0 so its ok case REG_SQRTCNT+2: printf("ERROR 8bit SQRTCNT+2 READ\n"); return 0; case REG_SQRTCNT+3: printf("ERROR 8bit SQRTCNT+3 READ\n"); return 0; //Nostalgia's options menu requires that these work case REG_DIVCNT: return (MMU_new.div.read16() & 0xFF); case REG_DIVCNT+1: return ((MMU_new.div.read16()>>8) & 0xFF); //divcnt isnt big enough for these to exist. but they'd probably return 0 so its ok case REG_DIVCNT+2: printf("ERROR 8bit DIVCNT+2 READ\n"); return 0; case REG_DIVCNT+3: printf("ERROR 8bit DIVCNT+3 READ\n"); return 0; //fog table: write only case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x01: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x03: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x05: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x07: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x09: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0B: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0D: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x0F: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x11: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x13: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x15: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x17: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x19: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1B: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1D: case eng_3D_FOG_TABLE+0x1E: case eng_3D_FOG_TABLE+0x1F: return 0; case REG_POWCNT1: case REG_POWCNT1+1: case REG_POWCNT1+2: case REG_POWCNT1+3: return readreg_POWCNT1(8,adr); case eng_3D_GXSTAT: return MMU_new.gxstat.read(8,adr); case REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(8,adr); case REG_DISPA_DISP3DCNT+1: return readreg_DISP3DCNT(8,adr); case REG_DISPA_DISP3DCNT+2: return readreg_DISP3DCNT(8,adr); case REG_DISPA_DISP3DCNT+3: return readreg_DISP3DCNT(8,adr); case REG_KEYINPUT: LagFrameFlag=0; break; } } bool unmapped, restricted; adr = MMU_LCDmap(adr, unmapped, restricted); if(unmapped) return 0; return MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]]; } //================================================= MMU ARM9 read 16 u16 FASTCALL _MMU_ARM9_read16(u32 adr) { adr &= 0x0FFFFFFE; mmu_log_debug_ARM9(adr, "(read16) 0x%04X", T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20])); if(adr<0x02000000) return T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, adr & 0x7FFE); if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); if(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7) return 0; //prohibited else return addon.read16(ARMCPU_ARM9, adr); } if (adr >> 24 == 4) { if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,16,adr); // Address is an IO register switch(adr) { case REG_DISPA_DISPSTAT: break; case REG_SQRTCNT: return MMU_new.sqrt.read16(); //sqrtcnt isnt big enough for this to exist. but it'd probably return 0 so its ok case REG_SQRTCNT+2: printf("ERROR 16bit SQRTCNT+2 READ\n"); return 0; case REG_DIVCNT: return MMU_new.div.read16(); //divcnt isnt big enough for this to exist. but it'd probably return 0 so its ok case REG_DIVCNT+2: printf("ERROR 16bit DIVCNT+2 READ\n"); return 0; case eng_3D_GXSTAT: return MMU_new.gxstat.read(16,adr); case REG_DISPA_VCOUNT: if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_query) { nds.ensataHandshake = ENSATA_HANDSHAKE_ack; return 270; } else return nds.VCount; // ============================================= 3D case eng_3D_RAM_COUNT: return 0; //almost worthless for now //return (gfx3d_GetNumPolys()); case eng_3D_RAM_COUNT+2: return 0; //almost worthless for now //return (gfx3d_GetNumVertex()); // ============================================= 3D end case REG_IME : return (u16)MMU.reg_IME[ARMCPU_ARM9]; //WRAMCNT is readable but VRAMCNT is not, so just return WRAM's value case REG_VRAMCNTG: return MMU.WRAMCNT << 8; case REG_IE : return (u16)MMU.reg_IE[ARMCPU_ARM9]; case REG_IE + 2 : return (u16)(MMU.reg_IE[ARMCPU_ARM9]>>16); case REG_IF: return MMU.gen_IF(); case REG_IF+2: return MMU.gen_IF()>>16; case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : return read_timer(ARMCPU_ARM9,(adr&0xF)>>2); case REG_AUXSPICNT: return MMU.AUX_SPI_CNT; case REG_POWCNT1: case REG_POWCNT1+2: return readreg_POWCNT1(16,adr); case REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(16,adr); case REG_DISPA_DISP3DCNT+2: return readreg_DISP3DCNT(16,adr); case REG_KEYINPUT: LagFrameFlag=0; break; //fog table: write only case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1E: return 0; } return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]); } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20]); } //================================================= MMU ARM9 read 32 u32 FASTCALL _MMU_ARM9_read32(u32 adr) { adr &= 0x0FFFFFFC; mmu_log_debug_ARM9(adr, "(read32) 0x%08X", T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20])); if(adr<0x02000000) return T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, adr&0x7FFC); if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); if(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7) return 0; //prohibited else return addon.read32(ARMCPU_ARM9, adr); } // Address is an IO register if((adr >> 24) == 4) { if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,32,adr); switch(adr) { case REG_DSIMODE: if(!nds.Is_DSI()) break; return 1; case 0x04004008: if(!nds.Is_DSI()) break; return 0x8000; case REG_DISPA_DISPSTAT: break; case REG_DISPx_VCOUNT: return nds.VCount; //WRAMCNT is readable but VRAMCNT is not, so just return WRAM's value case REG_VRAMCNTE: return MMU.WRAMCNT << 24; //despite these being 16bit regs, //Dolphin Island Underwater Adventures uses this amidst seemingly reasonable divs so we're going to emulate it. //well, it's pretty reasonable to read them as 32bits though, isnt it? case REG_DIVCNT: return MMU_new.div.read16(); case REG_SQRTCNT: return MMU_new.sqrt.read16(); //I guess we'll do this also //fog table: write only case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1C: return 0; case eng_3D_CLIPMTX_RESULT: case eng_3D_CLIPMTX_RESULT+4: case eng_3D_CLIPMTX_RESULT+8: case eng_3D_CLIPMTX_RESULT+12: case eng_3D_CLIPMTX_RESULT+16: case eng_3D_CLIPMTX_RESULT+20: case eng_3D_CLIPMTX_RESULT+24: case eng_3D_CLIPMTX_RESULT+28: case eng_3D_CLIPMTX_RESULT+32: case eng_3D_CLIPMTX_RESULT+36: case eng_3D_CLIPMTX_RESULT+40: case eng_3D_CLIPMTX_RESULT+44: case eng_3D_CLIPMTX_RESULT+48: case eng_3D_CLIPMTX_RESULT+52: case eng_3D_CLIPMTX_RESULT+56: case eng_3D_CLIPMTX_RESULT+60: { //LOG("4000640h..67Fh - CLIPMTX_RESULT - Read Current Clip Coordinates Matrix (R)"); return gfx3d_GetClipMatrix ((adr-0x04000640)/4); } case eng_3D_VECMTX_RESULT: case eng_3D_VECMTX_RESULT+4: case eng_3D_VECMTX_RESULT+8: case eng_3D_VECMTX_RESULT+12: case eng_3D_VECMTX_RESULT+16: case eng_3D_VECMTX_RESULT+20: case eng_3D_VECMTX_RESULT+24: case eng_3D_VECMTX_RESULT+28: case eng_3D_VECMTX_RESULT+32: { //LOG("4000680h..6A3h - VECMTX_RESULT - Read Current Directional Vector Matrix (R)"); return gfx3d_GetDirectionalMatrix ((adr-0x04000680)/4); } case eng_3D_RAM_COUNT: { return (gfx3d_GetNumPolys()) | ((gfx3d_GetNumVertex()) << 16); //LOG ("read32 - RAM_COUNT -> 0x%X", ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF]))[(adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF])>>2]); } case eng_3D_POS_RESULT: case eng_3D_POS_RESULT+4: case eng_3D_POS_RESULT+8: case eng_3D_POS_RESULT+12: { return gfx3d_glGetPosRes((adr & 0xF) >> 2); } case eng_3D_GXSTAT: return MMU_new.gxstat.read(32,adr); // ======================================== 3D end case REG_IME : return MMU.reg_IME[ARMCPU_ARM9]; case REG_IE : return MMU.reg_IE[ARMCPU_ARM9]; case REG_IF: return MMU.gen_IF(); case REG_IPCFIFORECV : return IPC_FIFOrecv(ARMCPU_ARM9); case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : { u32 val = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], (adr + 2) & 0xFFF); return MMU.timer[ARMCPU_ARM9][(adr&0xF)>>2] | (val<<16); } case REG_GCDATAIN: return MMU_readFromGC(); case REG_POWCNT1: return readreg_POWCNT1(32,adr); case REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(32,adr); case REG_KEYINPUT: LagFrameFlag=0; break; } return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]); } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [zeromus, inspired by shash] return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]); } //================================================================================================== ARM7 * //========================================================================================================= //========================================================================================================= //================================================= MMU ARM7 write 08 void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val) { adr &= 0x0FFFFFFF; mmu_log_debug_ARM7(adr, "(write08) 0x%02X", val); if (adr < 0x02000000) return; //can't write to bios or entire area below main memory if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); if(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)) {} //prohibited else addon.write08(ARMCPU_ARM7,adr, val); return; } if ((adr>=0x04000400)&&(adr<0x04000520)) { SPU_WriteByte(adr, val); return; } if ((adr & 0xFFFF0000) == 0x04800000) { /* is wifi hardware, dont intermix with regular hardware registers */ // 8-bit writes to wifi I/O and RAM are ignored // Reference: http://nocash.emubase.de/gbatek.htm#dswifiiomap return; } if (adr >> 24 == 4) { if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,8,adr,val); return; } switch(adr) { case REG_IF: REG_IF_WriteByte(0,val); break; case REG_IF+1: REG_IF_WriteByte(1,val); break; case REG_IF+2: REG_IF_WriteByte(2,val); break; case REG_IF+3: REG_IF_WriteByte(3,val); break; case REG_POSTFLG: //The NDS7 register can be written to only from code executed in BIOS. if (NDS_ARM7.instruct_adr > 0x3FFF) return; // hack for patched firmwares if (val == 1) { if (_MMU_ARM7_read08(REG_POSTFLG) != 0) break; _MMU_write32(0x27FFE24, gameInfo.header.ARM9exe); _MMU_write32(0x27FFE34, gameInfo.header.ARM7exe); } break; case REG_HALTCNT: //printf("halt 0x%02X\n", val); switch(val) { case 0xC0: NDS_Sleep(); break; case 0x80: armcpu_Wait4IRQ(&NDS_ARM7); break; default: break; } break; case REG_RTC: rtcWrite(val); return; case REG_AUXSPICNT: write_auxspicnt(9,8,0,val); return; case REG_AUXSPICNT+1: write_auxspicnt(9,8,1,val); return; case REG_AUXSPIDATA: if(val!=0) MMU.AUX_SPI_CMD = val & 0xFF; T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM7)); MMU.AUX_SPI_CNT &= ~0x80; //remove busy flag return; } MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val; return; } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM7)) JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM7, 0) = 0; #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val; } static void CalculateTouchPressure(int pressurePercent, u16 &z1, u16& z2) { bool touch = nds.isTouch!=0; if(!touch) { z1 = z2 = 0; return; } int y = nds.scr_touchY; int x = nds.scr_touchX; float u = (x/256.0f); float v = (y/192.0f); //these coefficients float fPressurePercent = pressurePercent/100.0f; //z1 goes up as pressure goes up { float b0 = (96-80)*fPressurePercent + 80; float b1 = (970-864)*fPressurePercent + 864; float b2 = (192-136)*fPressurePercent + 136; float b3 = (1560-1100)*fPressurePercent + 1100; z1 = (u16)(int)(b0 + (b1-b0)*u + (b2-b0)*v + (b3-b2-b1+b0)*u*v); } //z2 goes down as pressure goes up { float b0=(1976-2300)*fPressurePercent + 2300; float b1=(2360-2600)*fPressurePercent + 2600; float b2=(3840-3900)*fPressurePercent + 3900; float b3=(3912-3950)*fPressurePercent + 3950; z2 = (u16)(int)(b0 + (b1-b0)*u + (b2-b0)*v + (b3-b2-b1+b0)*u*v); } } //================================================= MMU ARM7 write 16 void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val) { adr &= 0x0FFFFFFE; mmu_log_debug_ARM7(adr, "(write16) 0x%04X", val); if (adr < 0x02000000) return; //can't write to bios or entire area below main memory if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); if(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)) {} //prohibited else addon.write16(ARMCPU_ARM7,adr, val); return; } //wifi mac access if ((adr & 0xFFFF0000) == 0x04800000) { WIFI_write16(adr,val); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x48], adr&MMU.MMU_MASK[ARMCPU_ARM7][0x48], val); return; } if ((adr>=0x04000400)&&(adr<0x04000520)) { SPU_WriteWord(adr, val); return; } if((adr >> 24) == 4) { if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,16,adr,val); return; } //Address is an IO register switch(adr) { case REG_DISPA_VCOUNT: if (nds.VCount >= 202 && nds.VCount <= 212) { printf("VCOUNT set to %i (previous value %i)\n", val, nds.VCount); nds.VCount = val; } else printf("Attempt to set VCOUNT while not within 202-212 (%i), ignored\n", nds.VCount); return; case REG_RTC: rtcWrite(val); break; case REG_EXMEMCNT: { u16 remote_proc = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204, (val & 0x7F) | (remote_proc & 0xFF80)); } return; case REG_EXTKEYIN: //readonly return; case REG_POWCNT2: { nds.power2.speakers = BIT0(val); nds.power2.wifi = BIT0(val); } return; case REG_AUXSPICNT: write_auxspicnt(7,16,0,val); return; case REG_AUXSPIDATA: if(val!=0) MMU.AUX_SPI_CMD = val & 0xFF; //T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, bm_transfer(&MMU.bupmem, val)); T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM7)); MMU.AUX_SPI_CNT &= ~0x80; //remove busy flag return; case REG_SPICNT : { int reset_firmware = 1; if ( ((MMU.SPI_CNT >> 8) & 0x3) == 1) { if ( ((val >> 8) & 0x3) == 1) { if ( BIT11(MMU.SPI_CNT)) { // select held reset_firmware = 0; } } } //MMU.fw.com == 0; // reset fw device communication if ( reset_firmware) { // reset fw device communication fw_reset_com(&MMU.fw); } MMU.SPI_CNT = val; T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPICNT >> 20) & 0xff], REG_SPICNT & 0xfff, val); } return; case REG_SPIDATA : { u16 spicnt; if(val!=0) MMU.SPI_CMD = val; spicnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPICNT >> 20) & 0xff], REG_SPICNT & 0xfff); switch((spicnt >> 8) & 0x3) { case 0 : { if(!MMU.powerMan_CntRegWritten) { MMU.powerMan_CntReg = (val & 0xFF); MMU.powerMan_CntRegWritten = TRUE; } else { u16 reg = MMU.powerMan_CntReg&0x7F; reg &= 0x7; if(reg==5 || reg==6 || reg==7) reg = 4; //(let's start with emulating a DS lite, since it is the more complex case) if(MMU.powerMan_CntReg & 0x80) { //read val = MMU.powerMan_Reg[reg]; } else { //write MMU.powerMan_Reg[reg] = (u8)val; enum PM_Bits //from libnds { PM_SOUND_AMP = BIT(0) , /*!< \brief Power the sound hardware (needed to hear stuff in GBA mode too) */ PM_SOUND_MUTE = BIT(1), /*!< \brief Mute the main speakers, headphone output will still work. */ PM_BACKLIGHT_BOTTOM = BIT(2), /*!< \brief Enable the top backlight if set */ PM_BACKLIGHT_TOP = BIT(3) , /*!< \brief Enable the bottom backlight if set */ PM_SYSTEM_PWR = BIT(6) , /*!< \brief Turn the power *off* if set */ }; //our totally pathetic register handling, only the one thing we've wanted so far if(MMU.powerMan_Reg[0]&PM_SYSTEM_PWR) { printf("SYSTEM POWERED OFF VIA ARM7 SPI POWER DEVICE\n"); printf("Did your main() return?\n"); emu_halt(); } } MMU.powerMan_CntRegWritten = FALSE; } } break; case 1 : /* firmware memory device */ if((spicnt & 0x3) != 0) /* check SPI baudrate (must be 4mhz) */ { T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPIDATA >> 20) & 0xff], REG_SPIDATA & 0xfff, 0); break; } T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPIDATA >> 20) & 0xff], REG_SPIDATA & 0xfff, fw_transfer(&MMU.fw, (u8)val)); return; case 2: { if(nds.Is_DSI()) { //pass data to TSC val = MMU_new.dsi_tsc.write16(val); //apply reset command if appropriate if(!BIT11(MMU.SPI_CNT)) MMU_new.dsi_tsc.reset_command(); break; } int channel = (MMU.SPI_CMD&0x70)>>4; //printf("%08X\n",channel); switch(channel) { case TSC_MEASURE_TEMP1: if(spicnt & 0x800) { if(partie) { val = ((716<<3)&0x7FF); partie = 0; break; } val = (716>>5); partie = 1; break; } val = ((716<<3)&0x7FF); partie = 1; break; case TSC_MEASURE_TEMP2: if(spicnt & 0x800) { if(partie) { val = ((865<<3)&0x7FF); partie = 0; break; } val = (865>>5); partie = 1; break; } val = ((865<<3)&0x7FF); partie = 1; break; case TSC_MEASURE_Y: { //counter the number of adc touch coord reads and jitter it after a while to simulate a shaky human hand or multiple reads nds.adc_jitterctr++; if(nds.adc_jitterctr == 25) { nds.adc_jitterctr = 0; if (nds.stylusJitter) { nds.adc_touchY ^= 16; nds.adc_touchX ^= 16; } } if(MMU.SPI_CNT&(1<<11)) { if(partie) { val = (nds.adc_touchY<<3) & 0xFF; partie = 0; break; } val = (nds.adc_touchY>>5) & 0xFF; partie = 1; break; } val = (nds.adc_touchY<<3)&0xFF; partie = 1; break; } case TSC_MEASURE_Z1: //Z1 //used for pressure calculation - must be nonzero or else some softwares will think the stylus is up. //something is wrong in here and some of these LSB dont make it back to libnds... whatever. { u16 scratch; CalculateTouchPressure(CommonSettings.StylusPressure,val,scratch); } if(spicnt & 0x800) { if(partie) { val = ((val<<3)&0x7FF); partie = 0; break; } val = (val>>5); partie = 1; break; } val = ((val<<3)&0x7FF); partie = 1; break; case TSC_MEASURE_Z2: //Z2 //used for pressure calculation - must be nonzero or else some softwares will think the stylus is up. //something is wrong in here and some of these LSB dont make it back to libnds... whatever. { u16 scratch; CalculateTouchPressure(CommonSettings.StylusPressure,scratch,val); } if(spicnt & 0x800) { if(partie) { val = ((val<<3)&0x7FF); partie = 0; break; } val = (val>>5); partie = 1; break; } val = ((val<<3)&0x7FF); partie = 1; break; case TSC_MEASURE_X: if(spicnt & 0x800) { if(partie) { val = (nds.adc_touchX << 3) & 0xFF; partie = 0; break; } val = (nds.adc_touchX>>5) & 0xFF; partie = 1; break; } val = (nds.adc_touchX<<3) & 0xFF; partie = 1; break; case TSC_MEASURE_AUX: if(!(val & 0x80)) val = (Mic_ReadSample() & 0xFF); else val = 0; break; } break; } case 3 : /* NOTICE: Device 3 of SPI is reserved (unused and unusable) */ break; } } T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPIDATA >> 20) & 0xff], REG_SPIDATA & 0xfff, val); return; /* NOTICE: Perhaps we have to use gbatek-like reg names instead of libnds-like ones ...*/ case REG_IME : NDS_Reschedule(); MMU.reg_IME[ARMCPU_ARM7] = val & 0x01; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x208, val); return; case REG_IE : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM7] = (MMU.reg_IE[ARMCPU_ARM7]&0xFFFF0000) | val; return; case REG_IE + 2 : NDS_Reschedule(); //emu_halt(); MMU.reg_IE[ARMCPU_ARM7] = (MMU.reg_IE[ARMCPU_ARM7]&0xFFFF) | (((u32)val)<<16); return; case REG_IF: REG_IF_WriteWord(0,val); return; case REG_IF+2: REG_IF_WriteWord(2,val); return; case REG_IPCSYNC: MMU_IPCSync(ARMCPU_ARM7, val); return; case REG_IPCFIFOCNT: IPC_FIFOcnt(ARMCPU_ARM7, val); return; case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : MMU.timerReload[ARMCPU_ARM7][(adr>>2)&3] = val; return; case REG_TM0CNTH : case REG_TM1CNTH : case REG_TM2CNTH : case REG_TM3CNTH : { int timerIndex = ((adr-2)>>2)&0x3; write_timer(ARMCPU_ARM7, timerIndex, val); return; } case REG_GCROMCTRL : MMU_writeToGCControl( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x1A4) & 0xFFFF0000) | val); return; case REG_GCROMCTRL+2 : MMU_writeToGCControl( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x1A4) & 0xFFFF) | ((u32) val << 16)); return; } T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); return; } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM7)) JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM7, 0) = 0; #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); } //================================================= MMU ARM7 write 32 void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val) { adr &= 0x0FFFFFFC; mmu_log_debug_ARM7(adr, "(write32) 0x%08X", val); if (adr < 0x02000000) return; //can't write to bios or entire area below main memory if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); if(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)) {} //prohibited else addon.write32(ARMCPU_ARM7,adr, val); return; } if ((adr & 0xFFFF0000) == 0x04800000) { WIFI_write16(adr, val & 0xFFFF); WIFI_write16(adr+2, val >> 16); T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x48], adr&MMU.MMU_MASK[ARMCPU_ARM7][0x48], val); return; } if ((adr>=0x04000400)&&(adr<0x04000520)) { SPU_WriteLong(adr, val); return; } if((adr>>24)==4) { if(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,32,adr,val); return; } switch(adr) { case REG_RTC: rtcWrite((u16)val); break; case REG_IME : NDS_Reschedule(); MMU.reg_IME[ARMCPU_ARM7] = val & 0x01; T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x208, val); return; case REG_IE : NDS_Reschedule(); MMU.reg_IE[ARMCPU_ARM7] = val; return; case REG_IF: REG_IF_WriteLong(val); return; case REG_TM0CNTL: case REG_TM1CNTL: case REG_TM2CNTL: case REG_TM3CNTL: { int timerIndex = (adr>>2)&0x3; MMU.timerReload[ARMCPU_ARM7][timerIndex] = (u16)val; T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr & 0xFFF, val); write_timer(ARMCPU_ARM7, timerIndex, val>>16); return; } case REG_IPCSYNC: MMU_IPCSync(ARMCPU_ARM7, val); return; case REG_IPCFIFOCNT: IPC_FIFOcnt(ARMCPU_ARM7, val); return; case REG_IPCFIFOSEND: IPC_FIFOsend(ARMCPU_ARM7, val); return; case REG_GCROMCTRL : MMU_writeToGCControl(val); return; case REG_GCDATAIN: slot1_device.write32(ARMCPU_ARM7, REG_GCDATAIN,val); return; } T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); return; } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return; #ifdef HAVE_JIT if (JIT_MAPPED(adr, ARMCPU_ARM7)) { JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM7, 0) = 0; JIT_COMPILED_FUNC_PREMASKED(adr, ARMCPU_ARM7, 1) = 0; } #endif // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash] T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); } //================================================= MMU ARM7 read 08 u8 FASTCALL _MMU_ARM7_read08(u32 adr) { adr &= 0x0FFFFFFF; mmu_log_debug_ARM7(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]]); if (adr < 0x4000) { //u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]); //if (prot) INFO("MMU7 read 08 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\n", adr, NDS_ARM7.R[15], prot); //How accurate is this? our R[15] may not be exactly what the hardware uses (may use something less by up to 0x08) //This may be inaccurate at the very edge cases. if (NDS_ARM7.instruct_adr > 0x3FFF) return 0xFF; } // wifi mac access if ((adr & 0xFFFF0000) == 0x04800000) { if (adr & 1) return (WIFI_read16(adr-1) >> 8) & 0xFF; else return WIFI_read16(adr) & 0xFF; } if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); if(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)) return 0; //prohibited else return addon.read08(ARMCPU_ARM7,adr); } if ((adr>=0x04000400)&&(adr<0x04000520)) { return SPU_ReadByte(adr); } if (adr == REG_RTC) return (u8)rtcRead(); if (adr >> 24 == 4) { if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,8,adr); // Address is an IO register switch(adr) { case REG_IF: return MMU.gen_IF(); case REG_IF+1: return (MMU.gen_IF()>>8); case REG_IF+2: return (MMU.gen_IF()>>16); case REG_IF+3: return (MMU.gen_IF()>>24); case REG_DISPx_VCOUNT: return nds.VCount&0xFF; case REG_DISPx_VCOUNT+1: return (nds.VCount>>8)&0xFF; case REG_WRAMSTAT: return MMU.WRAMCNT; } return MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]; } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; return MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]; } //================================================= MMU ARM7 read 16 u16 FASTCALL _MMU_ARM7_read16(u32 adr) { adr &= 0x0FFFFFFE; mmu_log_debug_ARM7(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF])); if (adr < 0x4000) { //u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]); //if (prot) INFO("MMU7 read 16 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\n", adr, NDS_ARM7.R[15], prot); if (NDS_ARM7.instruct_adr > 0x3FFF) return 0xFFFF; } //wifi mac access if ((adr & 0xFFFF0000) == 0x04800000) return WIFI_read16(adr) ; if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); if(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)) return 0; //prohibited else return addon.read16(ARMCPU_ARM7,adr); } if ((adr>=0x04000400)&&(adr<0x04000520)) { return SPU_ReadWord(adr); } if(adr>>24==4) { //Address is an IO register if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,16,adr); switch(adr) { case REG_POWCNT2: { u16 ret = 0; ret |= nds.power2.speakers?BIT(0):0; ret |= nds.power2.wifi?BIT(1):0; return ret; } case REG_DISPx_VCOUNT: return nds.VCount; case REG_RTC: return rtcRead(); case REG_IME: return (u16)MMU.reg_IME[ARMCPU_ARM7]; case REG_IE: return (u16)MMU.reg_IE[ARMCPU_ARM7]; case REG_IE + 2: return (u16)(MMU.reg_IE[ARMCPU_ARM7]>>16); case REG_IF: return MMU.gen_IF(); case REG_IF+2: return MMU.gen_IF()>>16; case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : return read_timer(ARMCPU_ARM7,(adr&0xF)>>2); case REG_VRAMSTAT: //make sure WRAMSTAT is stashed and then fallthrough to return the value from memory. i know, gross. T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, MMU.WRAMCNT); break; case REG_AUXSPICNT: return MMU.AUX_SPI_CNT; case REG_KEYINPUT: //here is an example of what not to do: //since the arm7 polls this (and EXTKEYIN) every frame, we shouldnt count this as an input check //LagFrameFlag=0; break; case REG_EXTKEYIN: { //this is gross. we should generate this whole reg instead of poking it in ndssystem u16 ret = MMU.ARM7_REG[0x136]; if(nds.isTouch) ret &= ~64; else ret |= 64; return ret; } } return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]); } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; /* Returns data from memory */ // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]); } //================================================= MMU ARM7 read 32 u32 FASTCALL _MMU_ARM7_read32(u32 adr) { adr &= 0x0FFFFFFC; mmu_log_debug_ARM7(adr, "(read32) 0x%08X", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF])); if (adr < 0x4000) { //u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]); //if (prot) INFO("MMU7 read 32 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\n", adr, NDS_ARM7.R[15], prot); if (NDS_ARM7.instruct_adr > 0x3FFF) return 0xFFFFFFFF; } //wifi mac access if ((adr & 0xFFFF0000) == 0x04800000) return (WIFI_read16(adr) | (WIFI_read16(adr+2) << 16)); if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { u16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); if(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)) return 0; //prohibited else return addon.read32(ARMCPU_ARM7,adr); } if ((adr>=0x04000400)&&(adr<0x04000520)) { return SPU_ReadLong(adr); } if((adr >> 24) == 4) { //Address is an IO register if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,32,adr); switch(adr) { case REG_RTC: return (u32)rtcRead(); case REG_DISPx_VCOUNT: return nds.VCount; case REG_IME : return MMU.reg_IME[ARMCPU_ARM7]; case REG_IE : return MMU.reg_IE[ARMCPU_ARM7]; case REG_IF: return MMU.gen_IF(); case REG_IPCFIFORECV : return IPC_FIFOrecv(ARMCPU_ARM7); case REG_TM0CNTL : case REG_TM1CNTL : case REG_TM2CNTL : case REG_TM3CNTL : { u32 val = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], (adr + 2) & 0xFFF); return MMU.timer[ARMCPU_ARM7][(adr&0xF)>>2] | (val<<16); } case REG_GCROMCTRL: { //INFO("arm7 romctrl read\n"); break; } case REG_GCDATAIN: return MMU_readFromGC(); case REG_VRAMSTAT: //make sure WRAMSTAT is stashed and then fallthrough return the value from memory. i know, gross. T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, MMU.WRAMCNT); break; } return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]); } bool unmapped, restricted; adr = MMU_LCDmap(adr,unmapped, restricted); if(unmapped) return 0; //Returns data from memory // Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [zeromus, inspired by shash] return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]); } //========================================================================================================= u32 FASTCALL MMU_read32(u32 proc, u32 adr) { ASSERT_UNALIGNED((adr&3)==0); if(proc==0) return _MMU_ARM9_read32(adr); else return _MMU_ARM7_read32(adr); } u16 FASTCALL MMU_read16(u32 proc, u32 adr) { ASSERT_UNALIGNED((adr&1)==0); if(proc==0) return _MMU_ARM9_read16(adr); else return _MMU_ARM7_read16(adr); } u8 FASTCALL MMU_read8(u32 proc, u32 adr) { if(proc==0) return _MMU_ARM9_read08(adr); else return _MMU_ARM7_read08(adr); } void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val) { ASSERT_UNALIGNED((adr&3)==0); if(proc==0) _MMU_ARM9_write32(adr, val); else _MMU_ARM7_write32(adr,val); } void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val) { ASSERT_UNALIGNED((adr&1)==0); if(proc==0) _MMU_ARM9_write16(adr, val); else _MMU_ARM7_write16(adr,val); } void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) { if(proc==0) _MMU_ARM9_write08(adr, val); else _MMU_ARM7_write08(adr,val); } void FASTCALL MMU_DumpMemBlock(u8 proc, u32 address, u32 size, u8 *buffer) { u32 i; u32 curaddr; for(i = 0, curaddr = address; i < size; i++, curaddr++) { buffer[i] = _MMU_read08(proc,MMU_AT_DEBUG,curaddr); } } //these templates needed to be instantiated manually template u32 MMU_struct::gen_IF(); template u32 MMU_struct::gen_IF(); //////////////////////////////////////////////////////////// //function pointer handlers for gdb stub stuff static u16 FASTCALL arm9_prefetch16( void *data, u32 adr) { return _MMU_read16(adr); } static u32 FASTCALL arm9_prefetch32( void *data, u32 adr) { return _MMU_read32(adr); } static u8 FASTCALL arm9_read8( void *data, u32 adr) { return _MMU_read08(adr); } static u16 FASTCALL arm9_read16( void *data, u32 adr) { return _MMU_read16(adr); } static u32 FASTCALL arm9_read32( void *data, u32 adr) { return _MMU_read32(adr); } static void FASTCALL arm9_write8(void *data, u32 adr, u8 val) { _MMU_write08(adr, val); } static void FASTCALL arm9_write16(void *data, u32 adr, u16 val) { _MMU_write16(adr, val); } static void FASTCALL arm9_write32(void *data, u32 adr, u32 val) { _MMU_write32(adr, val); } static u16 FASTCALL arm7_prefetch16( void *data, u32 adr) { return _MMU_read16(adr); } static u32 FASTCALL arm7_prefetch32( void *data, u32 adr) { return _MMU_read32(adr); } static u8 FASTCALL arm7_read8( void *data, u32 adr) { return _MMU_read08(adr); } static u16 FASTCALL arm7_read16( void *data, u32 adr) { return _MMU_read16(adr); } static u32 FASTCALL arm7_read32( void *data, u32 adr) { return _MMU_read32(adr); } static void FASTCALL arm7_write8(void *data, u32 adr, u8 val) { _MMU_write08(adr, val); } static void FASTCALL arm7_write16(void *data, u32 adr, u16 val) { _MMU_write16(adr, val); } static void FASTCALL arm7_write32(void *data, u32 adr, u32 val) { _MMU_write32(adr, val); } /* * the base memory interfaces */ struct armcpu_memory_iface arm9_base_memory_iface = { arm9_prefetch32, arm9_prefetch16, arm9_read8, arm9_read16, arm9_read32, arm9_write8, arm9_write16, arm9_write32 }; struct armcpu_memory_iface arm7_base_memory_iface = { arm7_prefetch32, arm7_prefetch16, arm7_read8, arm7_read16, arm7_read32, arm7_write8, arm7_write16, arm7_write32 }; /* * The direct memory interface for the ARM9. * This avoids the ARM9 protection unit when accessing * memory. */ struct armcpu_memory_iface arm9_direct_memory_iface = { NULL, NULL, arm9_read8, arm9_read16, arm9_read32, arm9_write8, arm9_write16, arm9_write32 }; ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// //#ifdef PROFILE_MEMORY_ACCESS // //#define PROFILE_PREFETCH 0 //#define PROFILE_READ 1 //#define PROFILE_WRITE 2 // //struct mem_access_profile { // u64 num_accesses; // u32 address_mask; // u32 masked_value; //}; // //#define PROFILE_NUM_MEM_ACCESS_PROFILES 4 // //static u64 profile_num_accesses[2][3]; //static u64 profile_unknown_addresses[2][3]; //static struct mem_access_profile //profile_memory_accesses[2][3][PROFILE_NUM_MEM_ACCESS_PROFILES]; // //static void //setup_profiling( void) { // int i; // // for ( i = 0; i < 2; i++) { // int access_type; // // for ( access_type = 0; access_type < 3; access_type++) { // profile_num_accesses[i][access_type] = 0; // profile_unknown_addresses[i][access_type] = 0; // // /* // * Setup the access testing structures // */ // profile_memory_accesses[i][access_type][0].address_mask = 0x0e000000; // profile_memory_accesses[i][access_type][0].masked_value = 0x00000000; // profile_memory_accesses[i][access_type][0].num_accesses = 0; // // /* main memory */ // profile_memory_accesses[i][access_type][1].address_mask = 0x0f000000; // profile_memory_accesses[i][access_type][1].masked_value = 0x02000000; // profile_memory_accesses[i][access_type][1].num_accesses = 0; // // /* shared memory */ // profile_memory_accesses[i][access_type][2].address_mask = 0x0f800000; // profile_memory_accesses[i][access_type][2].masked_value = 0x03000000; // profile_memory_accesses[i][access_type][2].num_accesses = 0; // // /* arm7 memory */ // profile_memory_accesses[i][access_type][3].address_mask = 0x0f800000; // profile_memory_accesses[i][access_type][3].masked_value = 0x03800000; // profile_memory_accesses[i][access_type][3].num_accesses = 0; // } // } //} // //static void //profile_memory_access( int arm9, u32 adr, int access_type) { // static int first = 1; // int mem_profile; // int address_found = 0; // // if ( first) { // setup_profiling(); // first = 0; // } // // profile_num_accesses[arm9][access_type] += 1; // // for ( mem_profile = 0; // mem_profile < PROFILE_NUM_MEM_ACCESS_PROFILES && // !address_found; // mem_profile++) { // if ( (adr & profile_memory_accesses[arm9][access_type][mem_profile].address_mask) == // profile_memory_accesses[arm9][access_type][mem_profile].masked_value) { // /*printf( "adr %08x mask %08x res %08x expected %08x\n", // adr, // profile_memory_accesses[arm9][access_type][mem_profile].address_mask, // adr & profile_memory_accesses[arm9][access_type][mem_profile].address_mask, // profile_memory_accesses[arm9][access_type][mem_profile].masked_value);*/ // address_found = 1; // profile_memory_accesses[arm9][access_type][mem_profile].num_accesses += 1; // } // } // // if ( !address_found) { // profile_unknown_addresses[arm9][access_type] += 1; // } //} // // //static const char *access_type_strings[] = { // "prefetch", // "read ", // "write " //}; // //void //print_memory_profiling( void) { // int arm; // // printf("------ Memory access profile ------\n"); // // for ( arm = 0; arm < 2; arm++) { // int access_type; // // for ( access_type = 0; access_type < 3; access_type++) { // int mem_profile; // printf("ARM%c: num of %s %lld\n", // arm ? '9' : '7', // access_type_strings[access_type], // profile_num_accesses[arm][access_type]); // // for ( mem_profile = 0; // mem_profile < PROFILE_NUM_MEM_ACCESS_PROFILES; // mem_profile++) { // printf( "address %08x: %lld\n", // profile_memory_accesses[arm][access_type][mem_profile].masked_value, // profile_memory_accesses[arm][access_type][mem_profile].num_accesses); // } // // printf( "unknown addresses %lld\n", // profile_unknown_addresses[arm][access_type]); // // printf( "\n"); // } // } // // printf("------ End of Memory access profile ------\n\n"); //} //#else //void //print_memory_profiling( void) { //} //#endif /* End of PROFILE_MEMORY_ACCESS area */ desmume-0.9.9/src/filter/0000755000175000017500000000000012140305317015772 5ustar guillaumeguillaumedesmume-0.9.9/src/filter/videofilter.h0000644000175000017500000001556012140261622020466 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _VIDEOFILTER_ #define _VIDEOFILTER_ #include #include #include #include #include #include "filter.h" #include "../utils/task.h" #define VIDEOFILTERTYPE_UNKNOWN_STRING "Unknown" typedef void (*VideoFilterFunc)(SSurface Src, SSurface Dst); // VIDEO FILTER TYPES enum VideoFilterTypeID { VideoFilterTypeID_None = 0, VideoFilterTypeID_LQ2X, VideoFilterTypeID_LQ2XS, VideoFilterTypeID_HQ2X, VideoFilterTypeID_HQ2XS, VideoFilterTypeID_HQ4X, VideoFilterTypeID_2xSaI, VideoFilterTypeID_Super2xSaI, VideoFilterTypeID_SuperEagle, VideoFilterTypeID_Scanline, VideoFilterTypeID_Bilinear, VideoFilterTypeID_Nearest2X, VideoFilterTypeID_Nearest1_5X, VideoFilterTypeID_NearestPlus1_5X, VideoFilterTypeID_EPX, VideoFilterTypeID_EPXPlus, VideoFilterTypeID_EPX1_5X, VideoFilterTypeID_EPXPlus1_5X, VideoFilterTypeID_HQ4XS, VideoFilterTypeIDCount // Make sure this one is always last }; typedef struct { VideoFilterTypeID typeID; const char *typeString; VideoFilterFunc filterFunction; unsigned int scaleMultiply; unsigned int scaleDivide; } VideoFilterAttributes; // Attributes list of known video filters, indexed using VideoFilterTypeID. const VideoFilterAttributes VideoFilterAttributesList[] = { {VideoFilterTypeID_None, "None", NULL, 1, 1}, {VideoFilterTypeID_LQ2X, "LQ2x", &RenderLQ2X, 2, 1}, {VideoFilterTypeID_LQ2XS, "LQ2xS", &RenderLQ2XS, 2, 1}, {VideoFilterTypeID_HQ2X, "HQ2x", &RenderHQ2X, 2, 1}, {VideoFilterTypeID_HQ2XS, "HQ2xS", &RenderHQ2XS, 2, 1}, {VideoFilterTypeID_HQ4X, "HQ4x", &RenderHQ4X, 4, 1}, {VideoFilterTypeID_2xSaI, "2xSaI", &Render2xSaI, 2, 1}, {VideoFilterTypeID_Super2xSaI, "Super 2xSaI", &RenderSuper2xSaI, 2, 1}, {VideoFilterTypeID_SuperEagle, "Super Eagle", &RenderSuperEagle, 2, 1}, {VideoFilterTypeID_Scanline, "Scanline", &RenderScanline, 2, 1}, {VideoFilterTypeID_Bilinear, "Bilinear", &RenderBilinear, 2, 1}, {VideoFilterTypeID_Nearest2X, "Nearest 2x", &RenderNearest2X, 2, 1}, {VideoFilterTypeID_Nearest1_5X, "Nearest 1.5x", &RenderNearest_1Point5x, 3, 2}, {VideoFilterTypeID_NearestPlus1_5X, "Nearest+ 1.5x", &RenderNearestPlus_1Point5x, 3, 2}, {VideoFilterTypeID_EPX, "EPX", &RenderEPX, 2, 1}, {VideoFilterTypeID_EPXPlus, "EPX+", &RenderEPXPlus, 2, 1}, {VideoFilterTypeID_EPX1_5X, "EPX 1.5x", &RenderEPX_1Point5x, 3, 2}, {VideoFilterTypeID_EPXPlus1_5X, "EPX+ 1.5x", &RenderEPXPlus_1Point5x, 3, 2}, {VideoFilterTypeID_HQ4XS, "HQ4xS", &RenderHQ4XS, 4, 1} }; // VIDEO FILTER PARAMETER DATA TYPES enum VideoFilterParamType { VF_INT = 0, VF_UINT, VF_FLOAT }; // VIDEO FILTER PARAMETERS // These tokens are used with the (Get/Set)FilterParameter family of methods. enum VideoFilterParamID { VF_PARAM_SCANLINE_A = 0, // Must always start at 0 VF_PARAM_SCANLINE_B, VF_PARAM_SCANLINE_C, VF_PARAM_SCANLINE_D, VideoFilterParamIDCount // Make sure this one is always last }; // Parameters struct for IPC typedef struct { SSurface srcSurface; SSurface dstSurface; VideoFilterFunc filterFunction; } VideoFilterThreadParam; typedef struct { Task *task; VideoFilterThreadParam param; } VideoFilterThread; /******************************************************************************************** VideoFilter - C++ CLASS This is a wrapper class for managing the video filter functions from filter.h. The steps to using a video filter are as follows: 1. Instantiate this class. 2. Set the rectangular size of the source image in pixels. (Can be done during instantiation.) 3. Set the video filter type. (Can be done during instantiation.) 4. Fill in the source buffer with pixels in RGBA8888 format. This class provides the GetSrcBufferPtr() accessor for the source buffer pointer. 5. Call RunFilter(). This runs the source buffer pixels through the chosen filter, and then stores the resulting pixels into the destination buffer in RGBA8888 format. 6. At this point, the destination buffer pixels can be used. RunFilter() returns a pointer to the destination buffer. Alternatively, GetDstBufferPtr() can be used to get the pointer. Thread Safety: All methods are thread-safe. ********************************************************************************************/ class VideoFilter { private: VideoFilterTypeID _vfTypeID; std::string _vfTypeString; SSurface _vfSrcSurface; SSurface _vfDstSurface; uint32_t *_vfSrcSurfacePixBuffer; VideoFilterFunc _vfFunc; std::vector _vfThread; bool _isFilterRunning; pthread_mutex_t _mutexSrc; pthread_mutex_t _mutexDst; pthread_mutex_t _mutexTypeID; pthread_mutex_t _mutexTypeString; pthread_cond_t _condRunning; void SetTypeID(VideoFilterTypeID typeID); void SetTypeString(const char *typeString); void SetTypeString(std::string typeString); public: VideoFilter(unsigned int srcWidth, unsigned int srcHeight, VideoFilterTypeID typeID, unsigned int numberThreads); ~VideoFilter(); bool SetSourceSize(const unsigned int width, const unsigned int height); bool ChangeFilterByID(const VideoFilterTypeID typeID); bool ChangeFilterByAttributes(const VideoFilterAttributes *vfAttr); uint32_t* RunFilter(); static void RunFilterCustom(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ dstBuffer, const unsigned int srcWidth, const unsigned int srcHeight, const VideoFilterTypeID typeID); static const char* GetTypeStringByID(const VideoFilterTypeID typeID); VideoFilterTypeID GetTypeID(); const char* GetTypeString(); uint32_t* GetSrcBufferPtr(); uint32_t* GetDstBufferPtr(); unsigned int GetSrcWidth(); unsigned int GetSrcHeight(); unsigned int GetDstWidth(); unsigned int GetDstHeight(); VideoFilterParamType GetFilterParameterType(VideoFilterParamID paramID); int GetFilterParameteri(VideoFilterParamID paramID); unsigned int GetFilterParameterui(VideoFilterParamID paramID); float GetFilterParameterf(VideoFilterParamID paramID); void SetFilterParameteri(VideoFilterParamID paramID, int value); void SetFilterParameterui(VideoFilterParamID paramID, unsigned int value); void SetFilterParameterf(VideoFilterParamID paramID, float value); }; static void* RunVideoFilterTask(void *arg); #endif desmume-0.9.9/src/filter/filter.h0000644000175000017500000000326112140261622017432 0ustar guillaumeguillaume/* Copyright (C) 2009-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ typedef struct { unsigned char *Surface; unsigned int Pitch; unsigned int Width, Height; } SSurface; void RenderNearest2X (SSurface Src, SSurface Dst); void RenderLQ2X (SSurface Src, SSurface Dst); void RenderLQ2XS (SSurface Src, SSurface Dst); void RenderHQ2X (SSurface Src, SSurface Dst); void RenderHQ4X (SSurface Src, SSurface Dst); void RenderHQ4XS (SSurface Src, SSurface Dst); void RenderHQ2XS (SSurface Src, SSurface Dst); void Render2xSaI (SSurface Src, SSurface Dst); void RenderSuper2xSaI (SSurface Src, SSurface Dst); void RenderSuperEagle (SSurface Src, SSurface Dst); void RenderScanline( SSurface Src, SSurface Dst); void RenderBilinear( SSurface Src, SSurface Dst); void RenderEPX( SSurface Src, SSurface Dst); void RenderEPXPlus( SSurface Src, SSurface Dst); void RenderEPX_1Point5x( SSurface Src, SSurface Dst); void RenderEPXPlus_1Point5x( SSurface Src, SSurface Dst); void RenderNearest_1Point5x( SSurface Src, SSurface Dst); void RenderNearestPlus_1Point5x( SSurface Src, SSurface Dst); desmume-0.9.9/src/filter/lq2x.cpp0000644000175000017500000004062012140261622017366 0ustar guillaumeguillaume/* * This file is part of the Advance project. * * Copyright (C) 2003 Andrea Mazzoleni * * 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #include "filter.h" #include "interp.h" //static void lq2x_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count) //{ // unsigned i; // // for(i=0;i0) { // c[0] = src0[-1]; // c[3] = src1[-1]; // c[6] = src2[-1]; // } else { // c[0] = c[1]; // c[3] = c[4]; // c[6] = c[7]; // } // // if (i0) { // c[0] = src0[-1]; // c[3] = src1[-1]; // c[6] = src2[-1]; // } else { // c[0] = c[1]; // c[3] = c[4]; // c[6] = c[7]; // } // // if (i> 8; // const int r = (int)((c[j] & 0xF80000)) >> 16; // const int bright = r+r+r + g+g+g + b+b; // if(bright > maxBright) maxBright = bright; // if(bright < minBright) minBright = bright; // // brightArray[j] = bright; // } // int diffBright = ((maxBright - minBright) * 7) >> 4; // if(diffBright > 7) // { // const int centerBright = brightArray[4]; // if(ABS(brightArray[0] - centerBright) > diffBright) // mask |= 1 << 0; // if(ABS(brightArray[1] - centerBright) > diffBright) // mask |= 1 << 1; // if(ABS(brightArray[2] - centerBright) > diffBright) // mask |= 1 << 2; // if(ABS(brightArray[3] - centerBright) > diffBright) // mask |= 1 << 3; // if(ABS(brightArray[5] - centerBright) > diffBright) // mask |= 1 << 4; // if(ABS(brightArray[6] - centerBright) > diffBright) // mask |= 1 << 5; // if(ABS(brightArray[7] - centerBright) > diffBright) // mask |= 1 << 6; // if(ABS(brightArray[8] - centerBright) > diffBright) // mask |= 1 << 7; // } // //#define P0 dst0[0] //#define P1 dst0[1] //#define P2 dst1[0] //#define P3 dst1[1] //#define MUR false //#define MDR false //#define MDL false //#define MUL false //#define IC(p0) c[p0] //#define I11(p0,p1) interp_16_11(c[p0], c[p1]) //#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2]) //#define I31(p0,p1) interp_16_31(c[p0], c[p1]) //#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2]) //#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2]) //#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2]) //#define I53(p0,p1) interp_16_53(c[p0], c[p1]) //#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2]) //#define I71(p0,p1) interp_16_71(c[p0], c[p1]) //#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2]) //#define I97(p0,p1) interp_16_97(c[p0], c[p1]) //#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2]) //#define I151(p0,p1) interp_16_151(c[p0], c[p1]) // // switch (mask) { //#include "lq2x.h" // } // //#undef P0 //#undef P1 //#undef P2 //#undef P3 //#undef MUR //#undef MDR //#undef MDL //#undef MUL //#undef IC //#undef I11 //#undef I211 //#undef I31 //#undef I332 //#undef I431 //#undef I521 //#undef I53 //#undef I611 //#undef I71 //#undef I772 //#undef I97 //#undef I1411 //#undef I151 // // src0 += 1; // src1 += 1; // src2 += 1; // dst0 += 2; // dst1 += 2; // } //} static void lq2x_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count) { unsigned i; for(i=0;i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = c[1]; c[3] = c[4]; c[6] = c[7]; } if (i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = c[1]; c[3] = c[4]; c[6] = c[7]; } if (i> 8; const int r = (int)((c[j] & 0xF80000)) >> 16; const int bright = r+r+r + g+g+g + b+b; if(bright > maxBright) maxBright = bright; if(bright < minBright) minBright = bright; brightArray[j] = bright; } int diffBright = ((maxBright - minBright) * 7) >> 4; if(diffBright > 7) { const int centerBright = brightArray[4]; if(ABS(brightArray[0] - centerBright) > diffBright) mask |= 1 << 0; if(ABS(brightArray[1] - centerBright) > diffBright) mask |= 1 << 1; if(ABS(brightArray[2] - centerBright) > diffBright) mask |= 1 << 2; if(ABS(brightArray[3] - centerBright) > diffBright) mask |= 1 << 3; if(ABS(brightArray[5] - centerBright) > diffBright) mask |= 1 << 4; if(ABS(brightArray[6] - centerBright) > diffBright) mask |= 1 << 5; if(ABS(brightArray[7] - centerBright) > diffBright) mask |= 1 << 6; if(ABS(brightArray[8] - centerBright) > diffBright) mask |= 1 << 7; } #define P0 dst0[0] #define P1 dst0[1] #define P2 dst1[0] #define P3 dst1[1] #define MUR false #define MDR false #define MDL false #define MUL false #define IC(p0) c[p0] #define I11(p0,p1) interp_32_11(c[p0], c[p1]) #define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2]) #define I31(p0,p1) interp_32_31(c[p0], c[p1]) #define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2]) #define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2]) #define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2]) #define I53(p0,p1) interp_32_53(c[p0], c[p1]) #define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2]) #define I71(p0,p1) interp_32_71(c[p0], c[p1]) #define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2]) #define I97(p0,p1) interp_32_97(c[p0], c[p1]) #define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2]) #define I151(p0,p1) interp_32_151(c[p0], c[p1]) switch (mask) { #include "lq2x.h" } #undef P0 #undef P1 #undef P2 #undef P3 #undef MUR #undef MDR #undef MDL #undef MUL #undef IC #undef I11 #undef I211 #undef I31 #undef I332 #undef I431 #undef I521 #undef I53 #undef I611 #undef I71 #undef I772 #undef I97 #undef I1411 #undef I151 src0 += 1; src1 += 1; src2 += 1; dst0 += 2; dst1 += 2; } } //void lq2x16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, // u8 *dstPtr, u32 dstPitch, int width, int height) //{ // u16 *dst0 = (u16 *)dstPtr; // u16 *dst1 = dst0 + (dstPitch >> 1); // // u16 *src0 = (u16 *)srcPtr; // u16 *src1 = src0 + (srcPitch >> 1); // u16 *src2 = src1 + (srcPitch >> 1); // // lq2x_16_def(dst0, dst1, src0, src0, src1, width); // if( height == 1 ) return; // // int count = height; // // count -= 2; // while(count>0) { // dst0 += dstPitch; // dst1 += dstPitch; // lq2x_16_def(dst0, dst1, src0, src1, src2, width); // src0 = src1; // src1 = src2; // src2 += srcPitch >> 1; // --count; // } // dst0 += dstPitch; // dst1 += dstPitch; // lq2x_16_def(dst0, dst1, src0, src1, src1, width); //} // //void lq2xS16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, // u8 *dstPtr, u32 dstPitch, int width, int height) //{ // u16 *dst0 = (u16 *)dstPtr; // u16 *dst1 = dst0 + (dstPitch >> 1); // // u16 *src0 = (u16 *)srcPtr; // u16 *src1 = src0 + (srcPitch >> 1); // u16 *src2 = src1 + (srcPitch >> 1); // // int count; // // lq2xS_16_def(dst0, dst1, src0, src0, src1, width); // if( height == 1 ) return; // // count = height; // // count -= 2; // while(count>0) { // dst0 += dstPitch; // dst1 += dstPitch; // lq2x_16_def(dst0, dst1, src0, src1, src2, width); // src0 = src1; // src1 = src2; // src2 += srcPitch >> 1; // --count; // } // dst0 += dstPitch; // dst1 += dstPitch; // lq2xS_16_def(dst0, dst1, src0, src1, src1, width); //} void lq2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); lq2x_32_def(dst0, dst1, src0, src0, src1, width); if( height == 1 ) return; int count = height; count -= 2; while(count>0) { dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; lq2x_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; lq2x_32_def(dst0, dst1, src0, src1, src1, width); } void lq2xS32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); int count; lq2xS_32_def(dst0, dst1, src0, src0, src1, width); if( height == 1 ) return; count = height; count -= 2; while(count>0) { dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; lq2x_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; lq2xS_32_def(dst0, dst1, src0, src1, src1, width); } //void lq2x_init(unsigned bits_per_pixel) //{ // interp_set(bits_per_pixel); //} void RenderLQ2X (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; lq2x32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } void RenderLQ2XS (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; lq2xS32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } desmume-0.9.9/src/filter/bilinear.cpp0000644000175000017500000003124112140261622020264 0ustar guillaumeguillaume/** Code adapted from Exult source code by Forgotten ** Scale.cc - Trying to scale with bilinear interpolation. ** ** Written: 6/14/00 - JSF **/ #include "types.h" int systemRedShift = 16; int systemGreenShift = 8; int systemBlueShift = 0; /* #define RGB1(r,g,b) ((r)>>3) << systemRedShift |\ ((g) >> 3) << systemGreenShift |\ ((b) >> 3) << systemBlueShift\ */ #define RGB1(r,g,b) (((r))<> systemRedShift) & 0x1f) << 3; *row++ = ((color >> systemGreenShift) & 0x1f) << 3; *row++ = ((color >> systemBlueShift) & 0x1f) << 3; } // any remaining elements to be written to 'row' are a replica of the // preceding pixel u8 *p = row-3; while (row < all_stop) { // we're guaranteed three elements per pixel; could unroll the loop // further, especially with a Duff's Device, but the gains would be // probably limited (judging by profiler output) *row++ = *p++; *row++ = *p++; *row++ = *p++; } } static void fill_rgb_row_32(u32 *from, int src_width, u8 *row, int width) { u8 *copy_start = row + src_width*3; u8 *all_stop = row + width*3; while (row < copy_start) { u32 color = *from++; *row++ = ((color >> (systemRedShift)) ) ; *row++ = ((color >> (systemGreenShift)) ) ; *row++ = ((color >> (systemBlueShift)) ) ; } // any remaining elements to be written to 'row' are a replica of the // preceding pixel u8 *p = row-3; while (row < all_stop) { // we're guaranteed three elements per pixel; could unroll the loop // further, especially with a Duff's Device, but the gains would be // probably limited (judging by profiler output) *row++ = *p++; *row++ = *p++; *row++ = *p++; } } void Bilinear(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 row_cur[3*322]; u8 row_next[3*322]; u8 *rgb_row_cur = row_cur; u8 *rgb_row_next = row_next; u16 *to = (u16 *)dstPtr; u16 *to_odd = (u16 *)(dstPtr + dstPitch); int from_width = width; u16 *from = (u16 *)srcPtr; fill_rgb_row_16(from, from_width, rgb_row_cur, width+1); for(int y = 0; y < height; y++) { u16 *from_orig = from; u16 *to_orig = to; if (y+1 < height) fill_rgb_row_16(from+width, from_width, rgb_row_next, width+1); else fill_rgb_row_16(from, from_width, rgb_row_next, width+1); // every pixel in the src region, is extended to 4 pixels in the // destination, arranged in a square 'quad'; if the current src // pixel is 'a', then in what follows 'b' is the src pixel to the // right, 'c' is the src pixel below, and 'd' is the src pixel to // the right and down u8 *cur_row = rgb_row_cur; u8 *next_row = rgb_row_next; u8 *ar = cur_row++; u8 *ag = cur_row++; u8 *ab = cur_row++; u8 *cr = next_row++; u8 *cg = next_row++; u8 *cb = next_row++; for(int x=0; x < width; x++) { u8 *br = cur_row++; u8 *bg = cur_row++; u8 *bb = cur_row++; u8 *dr = next_row++; u8 *dg = next_row++; u8 *db = next_row++; // upper left pixel in quad: just copy it in *to++ = RGB1(*ar, *ag, *ab); // upper right *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1); // lower left *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1); // lower right *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2, (*ag+*bg+*cg+*dg)>>2, (*ab+*bb+*cb+*db)>>2); // 'b' becomes 'a', 'd' becomes 'c' ar = br; ag = bg; ab = bb; cr = dr; cg = dg; cb = db; } // the "next" rgb row becomes the current; the old current rgb row is // recycled and serves as the new "next" row u8 *temp; temp = rgb_row_cur; rgb_row_cur = rgb_row_next; rgb_row_next = temp; // update the pointers for start of next pair of lines from = (u16 *)((u8 *)from_orig + srcPitch); to = (u16 *)((u8 *)to_orig + (dstPitch << 1)); to_odd = (u16 *)((u8 *)to + dstPitch); } } struct SSurface { unsigned char *Surface; unsigned int Pitch; unsigned int Width, Height; }; void BilinearPlus(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 row_cur[3*322]; u8 row_next[3*322]; u8 *rgb_row_cur = row_cur; u8 *rgb_row_next = row_next; u16 *to = (u16 *)dstPtr; u16 *to_odd = (u16 *)(dstPtr + dstPitch); int from_width = width; u16 *from = (u16 *)srcPtr; fill_rgb_row_16(from, from_width, rgb_row_cur, width+1); for(int y = 0; y < height; y++) { u16 *from_orig = from; u16 *to_orig = to; if (y+1 < height) fill_rgb_row_16(from+width, from_width, rgb_row_next, width+1); else fill_rgb_row_16(from, from_width, rgb_row_next, width+1); // every pixel in the src region, is extended to 4 pixels in the // destination, arranged in a square 'quad'; if the current src // pixel is 'a', then in what follows 'b' is the src pixel to the // right, 'c' is the src pixel below, and 'd' is the src pixel to // the right and down u8 *cur_row = rgb_row_cur; u8 *next_row = rgb_row_next; u8 *ar = cur_row++; u8 *ag = cur_row++; u8 *ab = cur_row++; u8 *cr = next_row++; u8 *cg = next_row++; u8 *cb = next_row++; for(int x=0; x < width; x++) { u8 *br = cur_row++; u8 *bg = cur_row++; u8 *bb = cur_row++; u8 *dr = next_row++; u8 *dg = next_row++; u8 *db = next_row++; // upper left pixel in quad: just copy it in //*to++ = manip.rgb(*ar, *ag, *ab); #ifdef USE_ORIGINAL_BILINEAR_PLUS *to++ = RGB( (((*ar)<<2) +((*ar)) + (*cr+*br+*br) )>> 3, (((*ag)<<2) +((*ag)) + (*cg+*bg+*bg) )>> 3, (((*ab)<<2) +((*ab)) + (*cb+*bb+*bb) )>> 3); #else *to++ = RGB1( (((*ar)<<3) +((*ar)<<1) + (*cr+*br+*br+*cr) )>> 4, (((*ag)<<3) +((*ag)<<1) + (*cg+*bg+*bg+*cg) )>> 4, (((*ab)<<3) +((*ab)<<1) + (*cb+*bb+*bb+*cb) )>> 4); #endif // upper right *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1); // lower left *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1); // lower right *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2, (*ag+*bg+*cg+*dg)>>2, (*ab+*bb+*cb+*db)>>2); // 'b' becomes 'a', 'd' becomes 'c' ar = br; ag = bg; ab = bb; cr = dr; cg = dg; cb = db; } // the "next" rgb row becomes the current; the old current rgb row is // recycled and serves as the new "next" row u8 *temp; temp = rgb_row_cur; rgb_row_cur = rgb_row_next; rgb_row_next = temp; // update the pointers for start of next pair of lines from = (u16 *)((u8 *)from_orig + srcPitch); to = (u16 *)((u8 *)to_orig + (dstPitch << 1)); to_odd = (u16 *)((u8 *)to + dstPitch); } } void Bilinear32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 row_cur[3*322]; u8 row_next[3*322]; u8 *rgb_row_cur = row_cur; u8 *rgb_row_next = row_next; u32 *to = (u32 *)dstPtr; u32 *to_odd = (u32 *)(dstPtr + dstPitch); int from_width = width; u32 *from = (u32 *)srcPtr; fill_rgb_row_32(from, from_width, rgb_row_cur, width+1); for(int y = 0; y < height; y++) { u32 *from_orig = from; u32 *to_orig = to; if (y+1 < height) fill_rgb_row_32(from+width+1, from_width, rgb_row_next, width+1); else fill_rgb_row_32(from, from_width, rgb_row_next, width+1); // every pixel in the src region, is extended to 4 pixels in the // destination, arranged in a square 'quad'; if the current src // pixel is 'a', then in what follows 'b' is the src pixel to the // right, 'c' is the src pixel below, and 'd' is the src pixel to // the right and down u8 *cur_row = rgb_row_cur; u8 *next_row = rgb_row_next; u8 *ar = cur_row++; u8 *ag = cur_row++; u8 *ab = cur_row++; u8 *cr = next_row++; u8 *cg = next_row++; u8 *cb = next_row++; for(int x=0; x < width; x++) { u8 *br = cur_row++; u8 *bg = cur_row++; u8 *bb = cur_row++; u8 *dr = next_row++; u8 *dg = next_row++; u8 *db = next_row++; // upper left pixel in quad: just copy it in int m = *ar; int mm = *ag; int mmmm = *ab; int mmm = RGB1(*ar, *ag, *ab); *to++ = RGB1(*ar, *ag, *ab); // upper right *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1); // lower left *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1); // lower right *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2, (*ag+*bg+*cg+*dg)>>2, (*ab+*bb+*cb+*db)>>2); // 'b' becomes 'a', 'd' becomes 'c' ar = br; ag = bg; ab = bb; cr = dr; cg = dg; cb = db; } // the "next" rgb row becomes the current; the old current rgb row is // recycled and serves as the new "next" row u8 *temp; temp = rgb_row_cur; rgb_row_cur = rgb_row_next; rgb_row_next = temp; // update the pointers for start of next pair of lines from = (u32 *)((u8 *)from_orig + srcPitch); to = (u32 *)((u8 *)to_orig + (dstPitch << 1)); to_odd = (u32 *)((u8 *)to + dstPitch); } } void BilinearPlus32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 row_cur[3*322]; u8 row_next[3*322]; u8 *rgb_row_cur = row_cur; u8 *rgb_row_next = row_next; u32 *to = (u32 *)dstPtr; u32 *to_odd = (u32 *)(dstPtr + dstPitch); int from_width = width; u32 *from = (u32 *)srcPtr; fill_rgb_row_32(from, from_width, rgb_row_cur, width+1); for(int y = 0; y < height; y++) { u32 *from_orig = from; u32 *to_orig = to; if (y+1 < height) fill_rgb_row_32(from+width+1, from_width, rgb_row_next, width+1); else fill_rgb_row_32(from, from_width, rgb_row_next, width+1); // every pixel in the src region, is extended to 4 pixels in the // destination, arranged in a square 'quad'; if the current src // pixel is 'a', then in what follows 'b' is the src pixel to the // right, 'c' is the src pixel below, and 'd' is the src pixel to // the right and down u8 *cur_row = rgb_row_cur; u8 *next_row = rgb_row_next; u8 *ar = cur_row++; u8 *ag = cur_row++; u8 *ab = cur_row++; u8 *cr = next_row++; u8 *cg = next_row++; u8 *cb = next_row++; for(int x=0; x < width; x++) { u8 *br = cur_row++; u8 *bg = cur_row++; u8 *bb = cur_row++; u8 *dr = next_row++; u8 *dg = next_row++; u8 *db = next_row++; // upper left pixel in quad: just copy it in //*to++ = manip.rgb(*ar, *ag, *ab); #ifdef USE_ORIGINAL_BILINEAR_PLUS *to++ = RGB( (((*ar)<<2) +((*ar)) + (*cr+*br+*br) )>> 3, (((*ag)<<2) +((*ag)) + (*cg+*bg+*bg) )>> 3, (((*ab)<<2) +((*ab)) + (*cb+*bb+*bb) )>> 3); #else *to++ = RGB1( (((*ar)<<3) +((*ar)<<1) + (*cr+*br+*br+*cr) )>> 4, (((*ag)<<3) +((*ag)<<1) + (*cg+*bg+*bg+*cg) )>> 4, (((*ab)<<3) +((*ab)<<1) + (*cb+*bb+*bb+*cb) )>> 4); #endif // upper right *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1); // lower left *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1); // lower right *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2, (*ag+*bg+*cg+*dg)>>2, (*ab+*bb+*cb+*db)>>2); // 'b' becomes 'a', 'd' becomes 'c' ar = br; ag = bg; ab = bb; cr = dr; cg = dg; cb = db; } // the "next" rgb row becomes the current; the old current rgb row is // recycled and serves as the new "next" row u8 *temp; temp = rgb_row_cur; rgb_row_cur = rgb_row_next; rgb_row_next = temp; // update the pointers for start of next pair of lines from = (u32 *)((u8 *)from_orig + srcPitch); to = (u32 *)((u8 *)to_orig + (dstPitch << 1)); to_odd = (u32 *)((u8 *)to + dstPitch); } } void RenderBilinear (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; Bilinear32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2, Src.Width, Src.Height); } desmume-0.9.9/src/filter/interp.h0000644000175000017500000002664212140261622017456 0ustar guillaumeguillaume/* * This file is part of the Advance project. * * Copyright (C) 2003 Andrea Mazzoleni * * 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #ifndef __INTERP_H #define __INTERP_H #include "types.h" /***************************************************************************/ /* Basic types */ /***************************************************************************/ /* interpolation */ //extern unsigned interp_mask[2]; //extern unsigned interp_bits_per_pixel; // //#define INTERP_16_MASK_1(v) (v & interp_mask[0]) //#define INTERP_16_MASK_2(v) (v & interp_mask[1]) // //static inline u16 interp_16_521(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*2 + INTERP_16_MASK_1(p3)*1) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*2 + INTERP_16_MASK_2(p3)*1) / 8); //} // //static inline u16 interp_16_332(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)*2) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)*2) / 8); //} // //static inline u16 interp_16_611(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*6 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*6 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 8); //} // //static inline u16 interp_16_71(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*7 + INTERP_16_MASK_1(p2)) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*7 + INTERP_16_MASK_2(p2)) / 8); //} // //static inline u16 interp_16_211(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*2 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 4) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*2 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 4); //} // //static inline u16 interp_16_772(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1(((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2))*7 + INTERP_16_MASK_1(p3)*2) / 16) // | INTERP_16_MASK_2(((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2))*7 + INTERP_16_MASK_2(p3)*2) / 16); //} // //static inline u16 interp_16_11(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2)) / 2) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2)) / 2); //} // //static inline u16 interp_16_31(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)) / 4) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)) / 4); //} // //static inline u16 interp_16_1411(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*14 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 16) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*14 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 16); //} // //static inline u16 interp_16_431(u16 p1, u16 p2, u16 p3) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*4 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*4 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)) / 8); //} // //static inline u16 interp_16_53(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*3) / 8) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*3) / 8); //} // //static inline u16 interp_16_151(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*15 + INTERP_16_MASK_1(p2)) / 16) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*15 + INTERP_16_MASK_2(p2)) / 16); //} // //static inline u16 interp_16_97(u16 p1, u16 p2) //{ // return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*9 + INTERP_16_MASK_1(p2)*7) / 16) // | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*9 + INTERP_16_MASK_2(p2)*7) / 16); //} #define INTERP_32_MASK_1(v) (v & 0xFF00FF) #define INTERP_32_MASK_2(v) (v & 0x00FF00) static inline u32 interp_32_521(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*2 + INTERP_32_MASK_1(p3)*1) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*2 + INTERP_32_MASK_2(p3)*1) / 8); } static inline u32 interp_32_332(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)*2) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)*2) / 8); } static inline u32 interp_32_211(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*2 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 4) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*2 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 4); } static inline u32 interp_32_611(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*6 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*6 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 8); } static inline u32 interp_32_71(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*7 + INTERP_32_MASK_1(p2)) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*7 + INTERP_32_MASK_2(p2)) / 8); } static inline u32 interp_32_772(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1(((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2))*7 + INTERP_32_MASK_1(p3)*2) / 16) | INTERP_32_MASK_2(((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2))*7 + INTERP_32_MASK_2(p3)*2) / 16); } static inline u32 interp_32_11(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2)) / 2) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2)) / 2); } static inline u32 interp_32_31(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)) / 4) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)) / 4); } static inline u32 interp_32_1411(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*14 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 16) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*14 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 16); } static inline u32 interp_32_431(u32 p1, u32 p2, u32 p3) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*4 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*4 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)) / 8); } static inline u32 interp_32_53(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*3) / 8) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*3) / 8); } static inline u32 interp_32_151(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*15 + INTERP_32_MASK_1(p2)) / 16) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*15 + INTERP_32_MASK_2(p2)) / 16); } static inline u32 interp_32_97(u32 p1, u32 p2) { return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*9 + INTERP_32_MASK_1(p2)*7) / 16) | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*9 + INTERP_32_MASK_2(p2)*7) / 16); } /***************************************************************************/ /* diff */ #define INTERP_Y_LIMIT (0x30*4) #define INTERP_U_LIMIT (0x07*4) #define INTERP_V_LIMIT (0x06*8) // //static int interp_16_diff(u16 p1, u16 p2) //{ // int r, g, b; // int y, u, v; // // if (p1 == p2) // return 0; // // if (interp_bits_per_pixel == 16) { // b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; // g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3; // r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8; // } else { // b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; // g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2; // r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7; // } // // y = r + g + b; // u = r - b; // v = -r + 2*g - b; // // if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT) // return 1; // // if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT) // return 1; // // if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT) // return 1; // //return 0; //} static int interp_32_diff(u32 p1, u32 p2) { int r, g, b; int y, u, v; if ((p1 & 0xF8F8F8) == (p2 & 0xF8F8F8)) return 0; b = (int)((p1 & 0xFF) - (p2 & 0xFF)); g = (int)((p1 & 0xFF00) - (p2 & 0xFF00)) >> 8; r = (int)((p1 & 0xFF0000) - (p2 & 0xFF0000)) >> 16; y = r + g + b; u = r - b; v = -r + 2*g - b; if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT) return 1; if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT) return 1; if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT) return 1; return 0; } #define INTERP_LIMIT2 (96000) //#define ABS(x) ((x) < 0 ? -(x) : (x)) static FORCEINLINE u32 ABS(s32 x) { return (x+(x>>31))^(x>>31); } // faster #define MAX(x,y) ((x) > (y) ? (x) : (y)) #define MIN(x,y) ((x) < (y) ? (x) : (y)) // //static int interp_16_diff2(u16 p1, u16 p2) //{ // int r, g, b; // int y, u, v; // // if ((p1 & 0xF79E) == (p2 & 0xF79E)) // return 0; // // if (interp_bits_per_pixel == 16) { // b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; // g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3; // r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8; // } else { // b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; // g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2; // r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7; // } // //// yb = 30*r + 58*g + 12*b; // y = 33*r + 36*g + 31*b; // u = -14*r - 29*g + 44*b; // v = 62*r - 51*g - 10*b; // // if (11*ABS(y) + 8*ABS(u) + 6*ABS(v) > INTERP_LIMIT2) // return 1; // return 0; //} static int interp_32_diff2(u32 p1, u32 p2) { int r, g, b; int y, u, v; if ((p1 & 0xF0F0F0) == (p2 & 0xF0F0F0)) return 0; b = (int)((p1 & 0xF8) - (p2 & 0xF8)); g = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8; r = (int)((p1 & 0xF80000) - (p2 & 0xF80000)) >> 16; // y = 30*r + 58*g + 12*b; y = 33*r + 36*g + 31*b; u = -14*r - 29*g + 44*b; v = 62*r - 51*g - 10*b; if (11*ABS(y) + 8*ABS(u) + 6*ABS(v) > INTERP_LIMIT2) return 1; return 0; } // //static void interp_set(unsigned bits_per_pixel) //{ // interp_bits_per_pixel = bits_per_pixel; // // switch (bits_per_pixel) { // case 15 : // interp_mask[0] = 0x7C1F; // interp_mask[1] = 0x03E0; // break; // case 16 : // interp_mask[0] = 0xF81F; // interp_mask[1] = 0x07E0; // break; // case 32 : // interp_mask[0] = 0xFF00FF; // interp_mask[1] = 0x00FF00; // break; // } //} #endif desmume-0.9.9/src/filter/lq2x.h0000644000175000017500000004141612140261622017037 0ustar guillaumeguillaumecase 0 : case 2 : case 4 : case 6 : case 8 : case 12 : case 16 : case 20 : case 24 : case 28 : case 32 : case 34 : case 36 : case 38 : case 40 : case 44 : case 48 : case 52 : case 56 : case 60 : case 64 : case 66 : case 68 : case 70 : case 96 : case 98 : case 100 : case 102 : case 128 : case 130 : case 132 : case 134 : case 136 : case 140 : case 144 : case 148 : case 152 : case 156 : case 160 : case 162 : case 164 : case 166 : case 168 : case 172 : case 176 : case 180 : case 184 : case 188 : case 192 : case 194 : case 196 : case 198 : case 224 : case 226 : case 228 : case 230 : { P0 = IC(0); P1 = IC(0); P2 = IC(0); P3 = IC(0); } break; case 1 : case 5 : case 9 : case 13 : case 17 : case 21 : case 25 : case 29 : case 33 : case 37 : case 41 : case 45 : case 49 : case 53 : case 57 : case 61 : case 65 : case 69 : case 97 : case 101 : case 129 : case 133 : case 137 : case 141 : case 145 : case 149 : case 153 : case 157 : case 161 : case 165 : case 169 : case 173 : case 177 : case 181 : case 185 : case 189 : case 193 : case 197 : case 225 : case 229 : { P0 = IC(1); P1 = IC(1); P2 = IC(1); P3 = IC(1); } break; case 3 : case 35 : case 67 : case 99 : case 131 : case 163 : case 195 : case 227 : { P0 = IC(2); P1 = IC(2); P2 = IC(2); P3 = IC(2); } break; case 7 : case 39 : case 71 : case 103 : case 135 : case 167 : case 199 : case 231 : { P0 = IC(3); P1 = IC(3); P2 = IC(3); P3 = IC(3); } break; case 10 : case 138 : { P1 = IC(0); P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I211(0, 1, 3); } } break; case 11 : case 27 : case 75 : case 139 : case 155 : case 203 : { P1 = IC(2); P2 = IC(2); P3 = IC(2); if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 14 : case 142 : { P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); P1 = IC(0); } else { P0 = I332(1, 3, 0); P1 = I31(0, 1); } } break; case 15 : case 143 : case 207 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); P1 = IC(4); } else { P0 = I332(1, 3, 4); P1 = I31(4, 1); } } break; case 18 : case 22 : case 30 : case 50 : case 54 : case 62 : case 86 : case 118 : { P0 = IC(0); P2 = IC(0); P3 = IC(0); if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 19 : case 51 : { P2 = IC(2); P3 = IC(2); if (MUR) { P0 = IC(2); P1 = IC(2); } else { P0 = I31(2, 1); P1 = I332(1, 5, 2); } } break; case 23 : case 55 : case 119 : { P2 = IC(3); P3 = IC(3); if (MUR) { P0 = IC(3); P1 = IC(3); } else { P0 = I31(3, 1); P1 = I332(1, 5, 3); } } break; case 26 : { P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I211(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 31 : case 95 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 42 : case 170 : { P1 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); P2 = IC(0); } else { P0 = I332(1, 3, 0); P2 = I31(0, 3); } } break; case 43 : case 171 : case 187 : { P1 = IC(2); P3 = IC(2); if (MUL) { P0 = IC(2); P2 = IC(2); } else { P0 = I332(1, 3, 2); P2 = I31(2, 3); } } break; case 46 : case 174 : { P1 = IC(0); P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } } break; case 47 : case 175 : { P1 = IC(4); P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 58 : case 154 : case 186 : { P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 59 : { P2 = IC(2); P3 = IC(2); if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } if (MUR) { P1 = IC(2); } else { P1 = I611(2, 1, 5); } } break; case 63 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 72 : case 76 : case 104 : case 106 : case 108 : case 110 : case 120 : case 124 : { P0 = IC(0); P1 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } } break; case 73 : case 77 : case 105 : case 109 : case 125 : { P1 = IC(1); P3 = IC(1); if (MDL) { P0 = IC(1); P2 = IC(1); } else { P0 = I31(1, 3); P2 = I332(3, 7, 1); } } break; case 74 : { P1 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MUL) { P0 = IC(0); } else { P0 = I211(0, 1, 3); } } break; case 78 : case 202 : case 206 : { P1 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } } break; case 79 : { P1 = IC(4); P3 = IC(4); if (MDL) { P2 = IC(4); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 80 : case 208 : case 210 : case 216 : { P0 = IC(0); P1 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } } break; case 81 : case 209 : case 217 : { P0 = IC(1); P1 = IC(1); P2 = IC(1); if (MDR) { P3 = IC(1); } else { P3 = I211(1, 5, 7); } } break; case 82 : case 214 : case 222 : { P0 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 83 : case 115 : { P0 = IC(2); P2 = IC(2); if (MDR) { P3 = IC(2); } else { P3 = I611(2, 5, 7); } if (MUR) { P1 = IC(2); } else { P1 = I611(2, 1, 5); } } break; case 84 : case 212 : { P0 = IC(0); P2 = IC(0); if (MDR) { P1 = IC(0); P3 = IC(0); } else { P1 = I31(0, 5); P3 = I332(5, 7, 0); } } break; case 85 : case 213 : case 221 : { P0 = IC(1); P2 = IC(1); if (MDR) { P1 = IC(1); P3 = IC(1); } else { P1 = I31(1, 5); P3 = I332(5, 7, 1); } } break; case 87 : { P0 = IC(3); P2 = IC(3); if (MDR) { P3 = IC(3); } else { P3 = I611(3, 5, 7); } if (MUR) { P1 = IC(3); } else { P1 = I211(3, 1, 5); } } break; case 88 : case 248 : case 250 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } } break; case 89 : case 93 : { P0 = IC(1); P1 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I611(1, 3, 7); } if (MDR) { P3 = IC(1); } else { P3 = I611(1, 5, 7); } } break; case 90 : { if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 91 : { if (MDL) { P2 = IC(2); } else { P2 = I611(2, 3, 7); } if (MDR) { P3 = IC(2); } else { P3 = I611(2, 5, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } if (MUR) { P1 = IC(2); } else { P1 = I611(2, 1, 5); } } break; case 92 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } } break; case 94 : { if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 107 : case 123 : { P1 = IC(2); P3 = IC(2); if (MDL) { P2 = IC(2); } else { P2 = I211(2, 3, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 111 : { P1 = IC(4); P3 = IC(4); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 112 : case 240 : { P0 = IC(0); P1 = IC(0); if (MDR) { P2 = IC(0); P3 = IC(0); } else { P2 = I31(0, 7); P3 = I332(5, 7, 0); } } break; case 113 : case 241 : { P0 = IC(1); P1 = IC(1); if (MDR) { P2 = IC(1); P3 = IC(1); } else { P2 = I31(1, 7); P3 = I332(5, 7, 1); } } break; case 114 : { P0 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 116 : { P0 = IC(0); P1 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } } break; case 117 : { P0 = IC(1); P1 = IC(1); P2 = IC(1); if (MDR) { P3 = IC(1); } else { P3 = I611(1, 5, 7); } } break; case 121 : { P0 = IC(1); P1 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I211(1, 3, 7); } if (MDR) { P3 = IC(1); } else { P3 = I611(1, 5, 7); } } break; case 122 : { if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I611(0, 5, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 126 : { P0 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 127 : { P3 = IC(4); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 146 : case 150 : case 178 : case 182 : case 190 : { P0 = IC(0); P2 = IC(0); if (MUR) { P1 = IC(0); P3 = IC(0); } else { P1 = I332(1, 5, 0); P3 = I31(0, 5); } } break; case 147 : case 179 : { P0 = IC(2); P2 = IC(2); P3 = IC(2); if (MUR) { P1 = IC(2); } else { P1 = I611(2, 1, 5); } } break; case 151 : case 183 : { P0 = IC(3); P2 = IC(3); P3 = IC(3); if (MUR) { P1 = IC(3); } else { P1 = I1411(3, 1, 5); } } break; case 158 : { P2 = IC(0); P3 = IC(0); if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 159 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 191 : { P2 = IC(4); P3 = IC(4); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 200 : case 204 : case 232 : case 236 : case 238 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); P3 = IC(0); } else { P2 = I332(3, 7, 0); P3 = I31(0, 7); } } break; case 201 : case 205 : { P0 = IC(1); P1 = IC(1); P3 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I611(1, 3, 7); } } break; case 211 : { P0 = IC(2); P1 = IC(2); P2 = IC(2); if (MDR) { P3 = IC(2); } else { P3 = I211(2, 5, 7); } } break; case 215 : { P0 = IC(3); P2 = IC(3); if (MDR) { P3 = IC(3); } else { P3 = I211(3, 5, 7); } if (MUR) { P1 = IC(3); } else { P1 = I1411(3, 1, 5); } } break; case 218 : { if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 219 : { P1 = IC(2); P2 = IC(2); if (MDR) { P3 = IC(2); } else { P3 = I211(2, 5, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 220 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I611(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } } break; case 223 : { P2 = IC(4); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 233 : case 237 : { P0 = IC(1); P1 = IC(1); P3 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I1411(1, 3, 7); } } break; case 234 : { P1 = IC(0); P3 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MUL) { P0 = IC(0); } else { P0 = I611(0, 1, 3); } } break; case 235 : { P1 = IC(2); P3 = IC(2); if (MDL) { P2 = IC(2); } else { P2 = I1411(2, 3, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 239 : { P1 = IC(4); P3 = IC(4); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 242 : { P0 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I211(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I611(0, 1, 5); } } break; case 243 : { P0 = IC(2); P1 = IC(2); if (MDR) { P2 = IC(2); P3 = IC(2); } else { P2 = I31(2, 7); P3 = I332(5, 7, 2); } } break; case 244 : { P0 = IC(0); P1 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I1411(0, 5, 7); } } break; case 245 : { P0 = IC(1); P1 = IC(1); P2 = IC(1); if (MDR) { P3 = IC(1); } else { P3 = I1411(1, 5, 7); } } break; case 246 : { P0 = IC(0); P2 = IC(0); if (MDR) { P3 = IC(0); } else { P3 = I1411(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 247 : { P0 = IC(3); P2 = IC(3); if (MDR) { P3 = IC(3); } else { P3 = I1411(3, 5, 7); } if (MUR) { P1 = IC(3); } else { P1 = I1411(3, 1, 5); } } break; case 249 : { P0 = IC(1); P1 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I1411(1, 3, 7); } if (MDR) { P3 = IC(1); } else { P3 = I211(1, 5, 7); } } break; case 251 : { P1 = IC(2); if (MDL) { P2 = IC(2); } else { P2 = I1411(2, 3, 7); } if (MDR) { P3 = IC(2); } else { P3 = I211(2, 5, 7); } if (MUL) { P0 = IC(2); } else { P0 = I211(2, 1, 3); } } break; case 252 : { P0 = IC(0); P1 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I1411(0, 5, 7); } } break; case 253 : { P0 = IC(1); P1 = IC(1); if (MDL) { P2 = IC(1); } else { P2 = I1411(1, 3, 7); } if (MDR) { P3 = IC(1); } else { P3 = I1411(1, 5, 7); } } break; case 254 : { P0 = IC(0); if (MDL) { P2 = IC(0); } else { P2 = I211(0, 3, 7); } if (MDR) { P3 = IC(0); } else { P3 = I1411(0, 5, 7); } if (MUR) { P1 = IC(0); } else { P1 = I211(0, 1, 5); } } break; case 255 : { if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; desmume-0.9.9/src/filter/hq4x.dat0000644000175000017500000026161212140261622017360 0ustar guillaumeguillaume/* * This file is part of the Advance project. * * Copyright (C) 2004 Andrea Mazzoleni * * 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ /* * This effect is a rewritten implementation of the hq effect made by Maxim Stepin */ case 0 : case 1 : case 4 : case 5 : case 32 : case 33 : case 36 : case 37 : case 128 : case 129 : case 132 : case 133 : case 160 : case 161 : case 164 : case 165 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 2 : case 34 : case 130 : case 162 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 3 : case 35 : case 131 : case 163 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 6 : case 38 : case 134 : case 166 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 7 : case 39 : case 135 : case 167 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 8 : case 12 : case 136 : case 140 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 9 : case 13 : case 137 : case 141 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 10 : case 138 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); P(1, 1) = I1(4); } } break; case 11 : case 139 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 14 : case 142 : { P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(5, 3, 1, 3); P(2, 0) = I2(3, 1, 1, 4); P(3, 0) = I2(3, 1, 4, 1); P(0, 1) = I3(2, 1, 1, 3, 1, 4); P(1, 1) = I3(6, 1, 1, 4, 1, 3); } } break; case 15 : case 143 : { P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(5, 3, 1, 3); P(2, 0) = I2(3, 1, 1, 4); P(3, 0) = I2(3, 1, 4, 1); P(0, 1) = I3(2, 1, 1, 3, 1, 4); P(1, 1) = I3(6, 1, 1, 4, 1, 3); } } break; case 16 : case 17 : case 48 : case 49 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 18 : case 50 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(1, 1, 4, 5); } } break; case 19 : case 51 : { P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(0, 0) = I2(3, 1, 4, 1); P(1, 0) = I2(3, 1, 1, 4); P(2, 0) = I2(5, 3, 1, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(2, 1, 1, 5, 1, 4); } } break; case 20 : case 21 : case 52 : case 53 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 22 : case 54 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 23 : case 55 : { P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(3, 0) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); } else { P(0, 0) = I2(3, 1, 4, 1); P(1, 0) = I2(3, 1, 1, 4); P(2, 0) = I2(5, 3, 1, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(2, 1, 1, 5, 1, 4); } } break; case 24 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 25 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 26 : case 31 : { P(1, 1) = I1(4); P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 27 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 28 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 29 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 30 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 40 : case 44 : case 168 : case 172 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 41 : case 45 : case 169 : case 173 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } break; case 42 : case 170 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I3(2, 1, 1, 1, 3, 4); P(0, 1) = I2(5, 3, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(0, 2) = I2(3, 1, 3, 4); P(0, 3) = I2(3, 1, 4, 3); } } break; case 43 : case 171 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I3(2, 1, 1, 1, 3, 4); P(0, 1) = I2(5, 3, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(0, 2) = I2(3, 1, 3, 4); P(0, 3) = I2(3, 1, 4, 3); } } break; case 46 : case 174 : { P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 47 : case 175 : { P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(5, 2, 1, 4, 5, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 5); P(3, 3) = I3(2, 1, 1, 4, 5, 7); if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } } break; case 56 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 57 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 58 : { P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 59 : { P(1, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 60 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 61 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 62 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 63 : { P(1, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I3(5, 2, 1, 4, 7, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 64 : case 65 : case 68 : case 69 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 66 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 67 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 70 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 71 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 72 : case 76 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(1, 1, 3, 4); P(1, 2) = I1(4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 73 : case 77 : { P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 0) = I2(3, 1, 4, 3); P(0, 1) = I2(3, 1, 3, 4); P(0, 2) = I2(5, 3, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I3(2, 1, 1, 7, 3, 4); } } break; case 74 : case 107 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 75 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 78 : { P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 79 : { P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 80 : case 81 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 82 : case 214 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 83 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 84 : case 85 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 0) = I2(5, 3, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(3, 0) = I2(3, 1, 4, 5); P(3, 1) = I2(3, 1, 5, 4); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I2(5, 3, 5, 7); P(2, 3) = I3(2, 1, 1, 7, 4, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 86 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 87 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 88 : case 248 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); P(2, 2) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 89 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 90 : { if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 91 : { P(1, 1) = I1(4); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 92 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 93 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 94 : { P(2, 1) = I1(4); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 95 : { P(1, 1) = I1(4); P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 96 : case 97 : case 100 : case 101 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 98 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 99 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 102 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 103 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } break; case 104 : case 108 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 105 : case 109 : { P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(0, 2) = I1(4); P(1, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 0) = I2(3, 1, 4, 3); P(0, 1) = I2(3, 1, 3, 4); P(0, 2) = I2(5, 3, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I3(2, 1, 1, 7, 3, 4); } } break; case 106 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 110 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 111 : { P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I3(5, 2, 1, 4, 5, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } } break; case 112 : case 113 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(2, 1, 1, 5, 4, 7); P(0, 3) = I2(3, 1, 4, 7); P(1, 3) = I2(3, 1, 7, 4); P(2, 3) = I2(5, 3, 7, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 114 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 115 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 116 : case 117 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 118 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 119 : { P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MUR) { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(3, 0) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); } else { P(0, 0) = I2(3, 1, 4, 1); P(1, 0) = I2(3, 1, 1, 4); P(2, 0) = I2(5, 3, 1, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(2, 1, 1, 5, 1, 4); } } break; case 120 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 121 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 122 : { P(1, 2) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); } else { P(2, 2) = I1(4); P(3, 2) = I2(3, 1, 4, 5); P(2, 3) = I2(3, 1, 4, 7); P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 123 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 124 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } } break; case 125 : { P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(0, 2) = I1(4); P(1, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 0) = I2(3, 1, 4, 3); P(0, 1) = I2(3, 1, 3, 4); P(0, 2) = I2(5, 3, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I3(2, 1, 1, 7, 3, 4); } } break; case 126 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 127 : { P(1, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 8); P(3, 2) = I2(3, 1, 4, 8); P(2, 3) = I2(3, 1, 4, 8); P(3, 3) = I2(5, 3, 4, 8); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 144 : case 145 : case 176 : case 177 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 146 : case 178 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(3, 2) = I2(7, 1, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } else { P(2, 0) = I3(2, 1, 1, 1, 4, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I2(5, 3, 5, 1); P(3, 2) = I2(3, 1, 5, 4); P(3, 3) = I2(3, 1, 4, 5); } } break; case 147 : case 179 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 148 : case 149 : case 180 : case 181 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 150 : case 182 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(3, 2) = I2(7, 1, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } else { P(2, 0) = I3(2, 1, 1, 1, 4, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I2(5, 3, 5, 1); P(3, 2) = I2(3, 1, 5, 4); P(3, 3) = I2(3, 1, 4, 5); } } break; case 151 : case 183 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I3(5, 2, 1, 4, 7, 3); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 152 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 153 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 154 : { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 155 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 156 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 157 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 158 : { P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 159 : { P(2, 0) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I3(5, 2, 1, 4, 7, 6); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 184 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 185 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 186 : { P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 187 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I3(2, 1, 1, 1, 3, 4); P(0, 1) = I2(5, 3, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(0, 2) = I2(3, 1, 3, 4); P(0, 3) = I2(3, 1, 4, 3); } } break; case 188 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 189 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } break; case 190 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(3, 2) = I2(7, 1, 4, 7); P(3, 3) = I2(5, 3, 4, 7); } else { P(2, 0) = I3(2, 1, 1, 1, 4, 5); P(3, 0) = I2(1, 1, 1, 5); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I2(5, 3, 5, 1); P(3, 2) = I2(3, 1, 5, 4); P(3, 3) = I2(3, 1, 4, 5); } } break; case 191 : { P(1, 0) = I1(4); P(2, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I2(7, 1, 4, 7); P(1, 2) = I2(7, 1, 4, 7); P(2, 2) = I2(7, 1, 4, 7); P(3, 2) = I2(7, 1, 4, 7); P(0, 3) = I2(5, 3, 4, 7); P(1, 3) = I2(5, 3, 4, 7); P(2, 3) = I2(5, 3, 4, 7); P(3, 3) = I2(5, 3, 4, 7); if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 192 : case 193 : case 196 : case 197 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 194 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 195 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 198 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 199 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 200 : case 204 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } else { P(0, 2) = I3(2, 1, 1, 3, 4, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(5, 3, 7, 3); P(2, 3) = I2(3, 1, 7, 4); P(3, 3) = I2(3, 1, 4, 7); } } break; case 201 : case 205 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } } break; case 202 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 203 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 206 : { P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 207 : { P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(5, 3, 1, 3); P(2, 0) = I2(3, 1, 1, 4); P(3, 0) = I2(3, 1, 4, 1); P(0, 1) = I3(2, 1, 1, 3, 1, 4); P(1, 1) = I3(6, 1, 1, 4, 1, 3); } } break; case 208 : case 209 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 210 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 211 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 212 : case 213 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 0) = I2(5, 3, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I1(4); P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 0) = I2(3, 1, 4, 5); P(3, 1) = I2(3, 1, 5, 4); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I2(5, 3, 5, 7); P(2, 3) = I3(2, 1, 1, 7, 4, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 215 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I3(5, 2, 1, 4, 3, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 216 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 217 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 218 : { P(2, 2) = I1(4); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 219 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 220 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I1(4); if (MDL) { P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); } else { P(0, 2) = I2(3, 1, 4, 3); P(1, 2) = I1(4); P(0, 3) = I3(2, 1, 1, 4, 3, 7); P(1, 3) = I2(3, 1, 4, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 221 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 0) = I2(5, 3, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(2, 2) = I1(4); P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 0) = I2(3, 1, 4, 5); P(3, 1) = I2(3, 1, 5, 4); P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I2(5, 3, 5, 7); P(2, 3) = I3(2, 1, 1, 7, 4, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 222 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 223 : { P(2, 0) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I2(3, 1, 4, 6); P(1, 2) = I2(7, 1, 4, 6); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 6); P(1, 3) = I2(3, 1, 4, 6); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 224 : case 225 : case 228 : case 229 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 226 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 227 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 230 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 231 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } break; case 232 : case 236 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I1(4); P(1, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } else { P(0, 2) = I3(2, 1, 1, 3, 4, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(5, 3, 7, 3); P(2, 3) = I2(3, 1, 7, 4); P(3, 3) = I2(3, 1, 4, 7); } } break; case 233 : case 237 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 5); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I3(6, 1, 1, 4, 1, 5); P(3, 1) = I3(5, 2, 1, 4, 5, 1); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } } break; case 234 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MUL) { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I2(3, 1, 4, 1); P(0, 1) = I2(3, 1, 4, 3); P(1, 1) = I1(4); } } break; case 235 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I3(5, 2, 1, 4, 5, 2); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 238 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); if (MDL) { P(0, 2) = I1(4); P(1, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); } else { P(0, 2) = I3(2, 1, 1, 3, 4, 7); P(1, 2) = I3(6, 1, 1, 4, 3, 7); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(5, 3, 7, 3); P(2, 3) = I2(3, 1, 7, 4); P(3, 3) = I2(3, 1, 4, 7); } } break; case 239 : { P(1, 0) = I1(4); P(2, 0) = I2(7, 1, 4, 5); P(3, 0) = I2(5, 3, 4, 5); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 5); P(3, 1) = I2(5, 3, 4, 5); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I2(7, 1, 4, 5); P(3, 2) = I2(5, 3, 4, 5); P(1, 3) = I1(4); P(2, 3) = I2(7, 1, 4, 5); P(3, 3) = I2(5, 3, 4, 5); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } } break; case 240 : case 241 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(2, 1, 1, 5, 4, 7); P(0, 3) = I2(3, 1, 4, 7); P(1, 3) = I2(3, 1, 7, 4); P(2, 3) = I2(5, 3, 7, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 242 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUR) { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); } else { P(2, 0) = I2(3, 1, 4, 1); P(3, 0) = I3(2, 1, 1, 4, 1, 5); P(2, 1) = I1(4); P(3, 1) = I2(3, 1, 4, 5); } } break; case 243 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); if (MDR) { P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(2, 2) = I3(6, 1, 1, 4, 5, 7); P(3, 2) = I3(2, 1, 1, 5, 4, 7); P(0, 3) = I2(3, 1, 4, 7); P(1, 3) = I2(3, 1, 7, 4); P(2, 3) = I2(5, 3, 7, 5); P(3, 3) = I2(1, 1, 5, 7); } } break; case 244 : case 245 : { P(0, 0) = I3(2, 1, 1, 4, 1, 3); P(1, 0) = I3(5, 2, 1, 4, 1, 3); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I3(5, 2, 1, 4, 3, 1); P(1, 1) = I3(6, 1, 1, 4, 1, 3); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 246 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I3(5, 2, 1, 4, 3, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 247 : { P(0, 0) = I2(5, 3, 4, 3); P(1, 0) = I2(7, 1, 4, 3); P(2, 0) = I1(4); P(0, 1) = I2(5, 3, 4, 3); P(1, 1) = I2(7, 1, 4, 3); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I2(5, 3, 4, 3); P(1, 2) = I2(7, 1, 4, 3); P(2, 2) = I1(4); P(3, 2) = I1(4); P(0, 3) = I2(5, 3, 4, 3); P(1, 3) = I2(7, 1, 4, 3); P(2, 3) = I1(4); if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; case 249 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I3(5, 2, 1, 4, 1, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(1, 3) = I1(4); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 250 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(1, 2) = I1(4); P(2, 2) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } } break; case 251 : { P(2, 0) = I2(3, 1, 4, 2); P(3, 0) = I2(5, 3, 4, 2); P(1, 1) = I1(4); P(2, 1) = I2(7, 1, 4, 2); P(3, 1) = I2(3, 1, 4, 2); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(1, 3) = I1(4); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MDR) { P(3, 2) = I1(4); P(2, 3) = I1(4); P(3, 3) = I1(4); } else { P(3, 2) = I2(1, 1, 4, 5); P(2, 3) = I2(1, 1, 4, 7); P(3, 3) = I2(1, 1, 5, 7); } if (MUL) { P(0, 0) = I1(4); P(1, 0) = I1(4); P(0, 1) = I1(4); } else { P(0, 0) = I2(1, 1, 1, 3); P(1, 0) = I2(1, 1, 1, 4); P(0, 1) = I2(1, 1, 3, 4); } } break; case 252 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I3(5, 2, 1, 4, 1, 0); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(1, 2) = I1(4); P(2, 2) = I1(4); P(3, 2) = I1(4); P(2, 3) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 253 : { P(0, 0) = I2(5, 3, 4, 1); P(1, 0) = I2(5, 3, 4, 1); P(2, 0) = I2(5, 3, 4, 1); P(3, 0) = I2(5, 3, 4, 1); P(0, 1) = I2(7, 1, 4, 1); P(1, 1) = I2(7, 1, 4, 1); P(2, 1) = I2(7, 1, 4, 1); P(3, 1) = I2(7, 1, 4, 1); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(3, 2) = I1(4); P(1, 3) = I1(4); P(2, 3) = I1(4); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } } break; case 254 : { P(0, 0) = I2(5, 3, 4, 0); P(1, 0) = I2(3, 1, 4, 0); P(0, 1) = I2(3, 1, 4, 0); P(1, 1) = I2(7, 1, 4, 0); P(2, 1) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(3, 2) = I1(4); P(2, 3) = I1(4); if (MDL) { P(0, 2) = I1(4); P(0, 3) = I1(4); P(1, 3) = I1(4); } else { P(0, 2) = I2(1, 1, 3, 4); P(0, 3) = I2(1, 1, 3, 7); P(1, 3) = I2(1, 1, 4, 7); } if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUR) { P(2, 0) = I1(4); P(3, 0) = I1(4); P(3, 1) = I1(4); } else { P(2, 0) = I2(1, 1, 1, 4); P(3, 0) = I2(1, 1, 1, 5); P(3, 1) = I2(1, 1, 4, 5); } } break; case 255 : { P(1, 0) = I1(4); P(2, 0) = I1(4); P(0, 1) = I1(4); P(1, 1) = I1(4); P(2, 1) = I1(4); P(3, 1) = I1(4); P(0, 2) = I1(4); P(1, 2) = I1(4); P(2, 2) = I1(4); P(3, 2) = I1(4); P(1, 3) = I1(4); P(2, 3) = I1(4); if (MDL) { P(0, 3) = I1(4); } else { P(0, 3) = I3(2, 1, 1, 4, 3, 7); } if (MDR) { P(3, 3) = I1(4); } else { P(3, 3) = I3(2, 1, 1, 4, 5, 7); } if (MUL) { P(0, 0) = I1(4); } else { P(0, 0) = I3(2, 1, 1, 4, 1, 3); } if (MUR) { P(3, 0) = I1(4); } else { P(3, 0) = I3(2, 1, 1, 4, 1, 5); } } break; desmume-0.9.9/src/filter/epx.cpp0000644000175000017500000002717112140261622017302 0ustar guillaumeguillaume/* Copyright (C) 2009 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "filter.h" #include "types.h" #include "interp.h" // transforms each 1 pixel into a 2x2 block of output pixels // where each corner is selected based on equivalence of neighboring pixels void RenderEPX (SSurface Src, SSurface Dst) { uint32 *lpSrc; const uint32 srcHeight = Src.Height; const uint32 srcWidth = Src.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; for(uint32 j = 0; j < srcHeight; j++) { uint32* SrcLine = lpSrc + srcPitch*j; uint32* DstLine1 = lpDst + dstPitch*(j*2); uint32* DstLine2 = lpDst + dstPitch*(j*2+1); for(uint32 i = 0; i < srcWidth; i++) { uint32 L = *(SrcLine-1); uint32 C = *(SrcLine); uint32 R = *(SrcLine+1); if(L != R) { uint32 U = *(SrcLine-srcPitch); uint32 D = *(SrcLine+srcPitch); if(U != D) { *DstLine1++ = (U == L) ? U : C; *DstLine1++ = (R == U) ? R : C; *DstLine2++ = (L == D) ? L : C; *DstLine2++ = (D == R) ? D : C; SrcLine++; continue; } } *DstLine1++ = C; *DstLine1++ = C; *DstLine2++ = C; *DstLine2++ = C; SrcLine++; } } } // transforms each 2x2 block of pixels into a 3x3 block of output pixels // where each pixel is selected based on equivalence of neighboring pixels void RenderEPX_1Point5x (SSurface Src, SSurface Dst) { u32 *lpSrc; u32 srcHeight = Src.Height; u32 srcWidth = Src.Width; u32 dstHeight = Dst.Height; u32 dstWidth = Dst.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; u32 *lpDst = (u32*)Dst.Surface; for(uint32 yi=0, yo=0; yi < srcHeight; yi+=2, yo+=3) { u32* SrcLine = lpSrc + srcPitch*yi; u32* DstLine1 = lpDst + dstPitch*(yo); u32* DstLine2 = lpDst + dstPitch*(yo+1); u32* DstLine3 = lpDst + dstPitch*(yo+2); for(uint32 xi=0; xi < srcWidth; xi+=2) { u32 s10 = *(SrcLine-srcPitch), s20 = *(SrcLine-srcPitch+1), s30 = *(SrcLine-srcPitch+2); u32 s01 = *(SrcLine-1), s11 = *(SrcLine), s21 = *(SrcLine+1), s31 = *(SrcLine+2); u32 s02 = *(SrcLine+srcPitch-1), s12 = *(SrcLine+srcPitch), s22 = *(SrcLine+srcPitch+1), s32 = *(SrcLine+srcPitch+2); u32 s03 = *(SrcLine+2*srcPitch-1), s13 = *(SrcLine+2*srcPitch), s23 = *(SrcLine+2*srcPitch+1), s33 = *(SrcLine+2*srcPitch+2); *DstLine1++ = s01==s10 && s10!=s21 && s01!=s12 ? s01:s11; *DstLine1++ = s10==s21 && s10!=s01 && s21!=s12 ? s21:s11; *DstLine1++ = (s11==s20 && s20!=s31 && s11!=s22 && s21!=s30) || (s20==s31 && s20!=s11 && s31!=s22 && s21!=s10) ? s20:s21; *DstLine2++ = s01==s12 && s01!=s10 && s12!=s21 ? s01:s11; *DstLine2++ = s12==s21 && s01!=s12 && s10!=s21 ? s21:s11; *DstLine2++ = (s11==s22 && s11!=s20 && s22!=s31 && s21!=s32) || (s22==s31 && s11!=s22 && s20!=s31 && s21!=s12) ? s22:s21; *DstLine3++ = (s02==s11 && s11!=s22 && s02!=s13 && s12!=s03) || (s02==s13 && s02!=s11 && s13!=s22 && s12!=s01) ? s02:s12; *DstLine3++ = (s11==s22 && s11!=s02 && s22!=s13 && s12!=s23) || (s13==s22 && s02!=s13 && s11!=s22 && s12!=s21) ? s22:s12; *DstLine3++ = s22; SrcLine+=2; } } } static u32 min(u32 a, u32 b) { return (a < b) ? a : b; } static u32 min3(u32 a, u32 b, u32 c) { return min(a,min(b,c)); } static u32 dist(u32 a, u32 b) { return ABS( (a & 0x0000FF) - (b & 0x0000FF))*2 + ABS(((a & 0x00FF00)>>8) - ((b & 0x00FF00)>>8))*3 + ABS(((a & 0xFF0000)>>16) - ((b & 0xFF0000)>>16))*3; } // note: we only use mix to make the arbitrary choice between two almost-equal colors. // this filter doesn't really do much interpolating or have the appearance of doing any. #define mix interp_32_11 // transforms each 1 pixel into a 2x2 block of output pixels // where each corner is selected based on relative equivalence of neighboring pixels void RenderEPXPlus (SSurface Src, SSurface Dst) { uint32 *lpSrc; const uint32 srcHeight = Src.Height; const uint32 srcWidth = Src.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; for(uint32 j = 0; j < srcHeight; j++) { uint32* SrcLine = lpSrc + srcPitch*j; uint32* DstLine1 = lpDst + dstPitch*(j*2); uint32* DstLine2 = lpDst + dstPitch*(j*2+1); for(uint32 i = 0; i < srcWidth; i++) { uint32 L = *(SrcLine-1); uint32 C = *(SrcLine); uint32 R = *(SrcLine+1); uint32 U = *(SrcLine-srcPitch); uint32 D = *(SrcLine+srcPitch); *DstLine1++ = dist(L,U) < min(dist(L,D),dist(R,U)) ? mix(L,U) : C; *DstLine1++ = dist(R,U) < min(dist(L,U),dist(R,D)) ? mix(R,U) : C; *DstLine2++ = dist(L,D) < min(dist(L,U),dist(R,D)) ? mix(L,D) : C; *DstLine2++ = dist(R,D) < min(dist(L,D),dist(R,U)) ? mix(R,D) : C; SrcLine++; } } } // transforms each 2x2 block of pixels into a 3x3 block of output pixels // where each pixel is selected based on relative equivalence of neighboring pixels void RenderEPXPlus_1Point5x (SSurface Src, SSurface Dst) { u32 *lpSrc; u32 srcHeight = Src.Height; u32 srcWidth = Src.Width; u32 dstHeight = Dst.Height; u32 dstWidth = Dst.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; u32 *lpDst = (u32*)Dst.Surface; for(uint32 yi=0, yo=0; yi < srcHeight; yi+=2, yo+=3) { u32* SrcLine = lpSrc + srcPitch*yi; u32* DstLine1 = lpDst + dstPitch*(yo); u32* DstLine2 = lpDst + dstPitch*(yo+1); u32* DstLine3 = lpDst + dstPitch*(yo+2); for(uint32 xi=0; xi < srcWidth; xi+=2) { u32 s10 = *(SrcLine-srcPitch), s20 = *(SrcLine-srcPitch+1), s30 = *(SrcLine-srcPitch+2); u32 s01 = *(SrcLine-1), s11 = *(SrcLine), s21 = *(SrcLine+1), s31 = *(SrcLine+2); u32 s02 = *(SrcLine+srcPitch-1), s12 = *(SrcLine+srcPitch), s22 = *(SrcLine+srcPitch+1), s32 = *(SrcLine+srcPitch+2); u32 s03 = *(SrcLine+2*srcPitch-1), s13 = *(SrcLine+2*srcPitch), s23 = *(SrcLine+2*srcPitch+1), s33 = *(SrcLine+2*srcPitch+2); *DstLine1++ = dist(s01,s10) < min( dist(s10,s21),dist(s01,s12)) ? mix(s01,s10):s11; *DstLine1++ = dist(s10,s21) < min( dist(s10,s01),dist(s21,s12)) ? mix(s10,s21):s11; *DstLine1++ = dist(s11,s20) < min3(dist(s20,s31),dist(s11,s22),dist(s21,s30)) ? mix(s11,s20): dist(s20,s31) < min3(dist(s20,s11),dist(s31,s22),dist(s21,s10)) ? mix(s20,s31):s21; *DstLine2++ = dist(s01,s12) < min( dist(s01,s10),dist(s12,s21)) ? mix(s01,s12):s11; *DstLine2++ = dist(s12,s21) < min( dist(s01,s12),dist(s10,s21)) ? mix(s12,s21):s11; *DstLine2++ = dist(s11,s22) < min3(dist(s11,s20),dist(s22,s31),dist(s21,s32)) ? mix(s11,s22): dist(s22,s31) < min3(dist(s11,s22),dist(s20,s31),dist(s21,s12)) ? mix(s22,s31):s21; *DstLine3++ = dist(s02,s11) < min3(dist(s11,s22),dist(s02,s13),dist(s12,s03)) ? mix(s02,s11): dist(s02,s13) < min3(dist(s02,s11),dist(s13,s22),dist(s12,s01)) ? mix(s02,s13):s12; *DstLine3++ = dist(s11,s22) < min3(dist(s11,s02),dist(s22,s13),dist(s12,s23)) ? mix(s11,s22): dist(s13,s22) < min3(dist(s02,s13),dist(s11,s22),dist(s12,s21)) ? mix(s13,s22):s12; *DstLine3++ = s22; SrcLine+=2; } } } // transforms each 2x2 block of pixels into 3x3 output which is // a 2x2 block that has 1 block of padding on the right and bottom sides // which are selected stupidly from neighboring pixels in the original 2x2 block void RenderNearest_1Point5x (SSurface Src, SSurface Dst) { uint32 *lpSrc; uint32 srcHeight = Src.Height; uint32 srcWidth = Src.Width; uint32 dstHeight = Dst.Height; uint32 dstWidth = Dst.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; for(uint32 yi = 0, yo = 0; yi < srcHeight; yi+=2, yo+=3) { u32* srcPix1 = lpSrc + srcPitch*(yi); u32* srcPix2 = lpSrc + srcPitch*(yi+1); u32* dstPix1 = lpDst + dstPitch*(yo); u32* dstPix2 = lpDst + dstPitch*(yo+1); u32* dstPix3 = lpDst + dstPitch*(yo+2); for(uint32 xi = 0; xi < srcWidth; xi+=2) { *dstPix1++ = *srcPix1++; *dstPix1++ = *srcPix1; *dstPix1++ = *srcPix1++; *dstPix2++ = *srcPix2; *dstPix3++ = *srcPix2++; *dstPix2++ = *srcPix2; *dstPix3++ = *srcPix2; *dstPix2++ = *srcPix2; *dstPix3++ = *srcPix2++; } } } int CLAMP(const int value, const int high) { int low = 0; return value < low ? low : (value >= high ? high-1 : value); } // transforms each 2x2 block of pixels into 3x3 output which is // a 2x2 block that has 1 block of padding on the right and bottom sides // which are selected from neighboring pixels depending on matching diagonals void RenderNearestPlus_1Point5x (SSurface Src, SSurface Dst) { uint32 *lpSrc; uint32 srcHeight = Src.Height; uint32 srcWidth = Src.Width; uint32 dstHeight = Dst.Height; uint32 dstWidth = Dst.Width; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; u32* srcPix = lpSrc; u32* dstPix = lpDst; for(uint32 j = 0, y = 0; j < srcHeight; j+=2, y+=3) { #define GET(dx,dy) *(srcPix+(CLAMP((dy)+j,srcHeight))*srcPitch+(CLAMP((dx)+i,srcWidth))) #define SET(dx,dy,val) *(dstPix+(dy+y)*dstPitch+(dx+x)) = (val) #define BETTER(dx,dy,dx2,dy2) (GET(dx,dy) == GET(dx2,dy2) && GET(dx2,dy) != GET(dx,dy2)) for(uint32 i = 0, x = 0; i < srcWidth; i+=2, x+=3) //, srcPix+=2, dstPix+=3 { SET(0,0,GET(0,0)); SET(1,0,GET(1,0)); SET(2,0,GET(BETTER(2,0,1,-1)? 2:1,0)); SET(0,1,GET(0,1)); SET(1,1,GET(1,1)); SET(2,1,GET(BETTER(1,0, 2,1)? 2:1,1)); SET(0,2,GET(BETTER(0,2,-1,1)?-1:0,1)); SET(1,2,GET(BETTER(0,1, 1,2)? 0:1,1)); SET(2,2,GET(BETTER(2,1, 1,2)? 2:1,1)); } #undef GET #undef SET #undef BETTER } } desmume-0.9.9/src/filter/hq2x.cpp0000644000175000017500000004231412140261622017364 0ustar guillaumeguillaume/* * This file is part of the Advance project. * * Copyright (C) 2003 Andrea Mazzoleni * * 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #include "filter.h" #include "interp.h" // ///***************************************************************************/ ///* HQ2x C implementation */ // ///* // * This effect is a rewritten implementation of the hq2x effect made by Maxim Stepin // */ // //static void hq2x_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count) //{ // unsigned i; // // for(i=0;i0) { // c[0] = src0[-1]; // c[3] = src1[-1]; // c[6] = src2[-1]; // } else { // c[0] = c[1]; // c[3] = c[4]; // c[6] = c[7]; // } // // if (i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = c[1]; c[3] = c[4]; c[6] = c[7]; } if (i0) { // c[0] = src0[-1]; // c[3] = src1[-1]; // c[6] = src2[-1]; // } else { // c[0] = c[1]; // c[3] = c[4]; // c[6] = c[7]; // } // // if (i> 3; // r = (int)((c[j] & 0xF800)) >> 8; // } else { // b = (int)((c[j] & 0x1F)) << 3; // g = (int)((c[j] & 0x3E0)) >> 2; // r = (int)((c[j] & 0x7C00)) >> 7; // } // const int bright = r+r+r + g+g+g + b+b; // if(bright > maxBright) maxBright = bright; // if(bright < minBright) minBright = bright; // // brightArray[j] = bright; // } // int diffBright = ((maxBright - minBright) * 7) >> 4; // if(diffBright > 7) // { // const int centerBright = brightArray[4]; // if(ABS(brightArray[0] - centerBright) > diffBright) // mask |= 1 << 0; // if(ABS(brightArray[1] - centerBright) > diffBright) // mask |= 1 << 1; // if(ABS(brightArray[2] - centerBright) > diffBright) // mask |= 1 << 2; // if(ABS(brightArray[3] - centerBright) > diffBright) // mask |= 1 << 3; // if(ABS(brightArray[5] - centerBright) > diffBright) // mask |= 1 << 4; // if(ABS(brightArray[6] - centerBright) > diffBright) // mask |= 1 << 5; // if(ABS(brightArray[7] - centerBright) > diffBright) // mask |= 1 << 6; // if(ABS(brightArray[8] - centerBright) > diffBright) // mask |= 1 << 7; // } // //#define P0 dst0[0] //#define P1 dst0[1] //#define P2 dst1[0] //#define P3 dst1[1] //#define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right //#define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right //#define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left //#define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left //#define IC(p0) c[p0] //#define I11(p0,p1) interp_16_11(c[p0], c[p1]) //#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2]) //#define I31(p0,p1) interp_16_31(c[p0], c[p1]) //#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2]) //#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2]) //#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2]) //#define I53(p0,p1) interp_16_53(c[p0], c[p1]) //#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2]) //#define I71(p0,p1) interp_16_71(c[p0], c[p1]) //#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2]) //#define I97(p0,p1) interp_16_97(c[p0], c[p1]) //#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2]) //#define I151(p0,p1) interp_16_151(c[p0], c[p1]) // // switch (mask) { //#include "hq2x.h" // } // //#undef P0 //#undef P1 //#undef P2 //#undef P3 //#undef MUR //#undef MDR //#undef MDL //#undef MUL //#undef IC //#undef I11 //#undef I211 //#undef I31 //#undef I332 //#undef I431 //#undef I521 //#undef I53 //#undef I611 //#undef I71 //#undef I772 //#undef I97 //#undef I1411 //#undef I151 // // src0 += 1; // src1 += 1; // src2 += 1; // dst0 += 2; // dst1 += 2; // } //} static void hq2xS_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count) { unsigned i; for(i=0;i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = src0[0]; c[3] = src1[0]; c[6] = src2[0]; } if (i> 8; const int r = (int)((c[j] & 0xF80000)) >> 16; const int bright = r+r+r + g+g+g + b+b; if(bright > maxBright) maxBright = bright; if(bright < minBright) minBright = bright; brightArray[j] = bright; } int diffBright = ((maxBright - minBright) * 7) >> 4; if(diffBright > 7) { const int centerBright = brightArray[4]; if(ABS(brightArray[0] - centerBright) > diffBright) mask |= 1 << 0; if(ABS(brightArray[1] - centerBright) > diffBright) mask |= 1 << 1; if(ABS(brightArray[2] - centerBright) > diffBright) mask |= 1 << 2; if(ABS(brightArray[3] - centerBright) > diffBright) mask |= 1 << 3; if(ABS(brightArray[5] - centerBright) > diffBright) mask |= 1 << 4; if(ABS(brightArray[6] - centerBright) > diffBright) mask |= 1 << 5; if(ABS(brightArray[7] - centerBright) > diffBright) mask |= 1 << 6; if(ABS(brightArray[8] - centerBright) > diffBright) mask |= 1 << 7; } #define P0 dst0[0] #define P1 dst0[1] #define P2 dst1[0] #define P3 dst1[1] #define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right #define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right #define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left #define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left #define IC(p0) c[p0] #define I11(p0,p1) interp_32_11(c[p0], c[p1]) #define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2]) #define I31(p0,p1) interp_32_31(c[p0], c[p1]) #define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2]) #define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2]) #define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2]) #define I53(p0,p1) interp_32_53(c[p0], c[p1]) #define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2]) #define I71(p0,p1) interp_32_71(c[p0], c[p1]) #define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2]) #define I97(p0,p1) interp_32_97(c[p0], c[p1]) #define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2]) #define I151(p0,p1) interp_32_151(c[p0], c[p1]) switch (mask) { #include "hq2x.h" } #undef P0 #undef P1 #undef P2 #undef P3 #undef MUR #undef MDR #undef MDL #undef MUL #undef IC #undef I11 #undef I211 #undef I31 #undef I332 #undef I431 #undef I521 #undef I53 #undef I611 #undef I71 #undef I772 #undef I97 #undef I1411 #undef I151 src0 += 1; src1 += 1; src2 += 1; dst0 += 2; dst1 += 2; } } // //void hq2x(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, // u8 *dstPtr, u32 dstPitch, int width, int height) //{ // u16 *dst0 = (u16 *)dstPtr; // u16 *dst1 = dst0 + (dstPitch >> 1); // // u16 *src0 = (u16 *)srcPtr; // u16 *src1 = src0 + (srcPitch >> 1); // u16 *src2 = src1 + (srcPitch >> 1); // // hq2x_16_def(dst0, dst1, src0, src0, src1, width); // // int count = height; // // count -= 2; // while(count) { // dst0 += dstPitch; // dst1 += dstPitch; // hq2x_16_def(dst0, dst1, src0, src1, src2, width); // src0 = src1; // src1 = src2; // src2 += srcPitch >> 1; // --count; // } // dst0 += dstPitch; // dst1 += dstPitch; // hq2x_16_def(dst0, dst1, src0, src1, src1, width); //} void hq2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); hq2x_32_def(dst0, dst1, src0, src0, src1, width); int count = height; count -= 2; while(count) { dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; hq2x_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; hq2x_32_def(dst0, dst1, src0, src1, src1, width); } // //void hq2xS(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, // u8 *dstPtr, u32 dstPitch, int width, int height) //{ // u16 *dst0 = (u16 *)dstPtr; // u16 *dst1 = dst0 + (dstPitch >> 1); // // u16 *src0 = (u16 *)srcPtr; // u16 *src1 = src0 + (srcPitch >> 1); // u16 *src2 = src1 + (srcPitch >> 1); // // hq2xS_16_def(dst0, dst1, src0, src0, src1, width); // // int count = height; // // count -= 2; // while(count) { // dst0 += dstPitch; // dst1 += dstPitch; // hq2xS_16_def(dst0, dst1, src0, src1, src2, width); // src0 = src1; // src1 = src2; // src2 += srcPitch >> 1; // --count; // } // dst0 += dstPitch; // dst1 += dstPitch; // hq2xS_16_def(dst0, dst1, src0, src1, src1, width); //} void hq2xS32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); hq2xS_32_def(dst0, dst1, src0, src0, src1, width); int count = height; count -= 2; while(count) { dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; hq2xS_32_def(dst0, dst1, src0, src1, src2, width); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch >> 1; dst1 += dstPitch >> 1; hq2xS_32_def(dst0, dst1, src0, src1, src1, width); } //void hq2x_init(unsigned bits_per_pixel) //{ // interp_set(bits_per_pixel); //} void RenderHQ2X (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; hq2x32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } void RenderHQ2XS (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; hq2xS32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } desmume-0.9.9/src/filter/hq4x.cpp0000644000175000017500000001766712140261622017403 0ustar guillaumeguillaume/* * This file is part of the Advance project. * * Copyright (C) 2003, 2008 Andrea Mazzoleni * * 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #include "filter.h" #include "interp.h" /***************************************************************************/ /* HQ4x C implementation */ /* * This effect is a rewritten implementation of the hq4x effect made by Maxim Stepin */ void hq4x_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, const u32* src0, const u32* src1, const u32* src2, unsigned count, unsigned flag) { unsigned i; for(i=0;i 0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = src0[0]; c[3] = src1[0]; c[6] = src2[0]; } if (i < count-1) { c[2] = src0[1]; c[5] = src1[1]; c[8] = src2[1]; } else { c[2] = src0[0]; c[5] = src1[0]; c[8] = src2[0]; } mask = 0; if (interp_32_diff(c[0], c[4])) mask |= 1 << 0; if (interp_32_diff(c[1], c[4])) mask |= 1 << 1; if (interp_32_diff(c[2], c[4])) mask |= 1 << 2; if (interp_32_diff(c[3], c[4])) mask |= 1 << 3; if (interp_32_diff(c[5], c[4])) mask |= 1 << 4; if (interp_32_diff(c[6], c[4])) mask |= 1 << 5; if (interp_32_diff(c[7], c[4])) mask |= 1 << 6; if (interp_32_diff(c[8], c[4])) mask |= 1 << 7; #define P(a, b) dst##b[a] #define MUR interp_32_diff(c[1], c[5]) #define MDR interp_32_diff(c[5], c[7]) #define MDL interp_32_diff(c[7], c[3]) #define MUL interp_32_diff(c[3], c[1]) #define I1(p0) c[p0] #define I2(i0, i1, p0, p1) interp_32_##i0##i1(c[p0], c[p1]) #define I3(i0, i1, i2, p0, p1, p2) interp_32_##i0##i1##i2(c[p0], c[p1], c[p2]) switch (mask) { #include "hq4x.dat" } #undef P #undef MUR #undef MDR #undef MDL #undef MUL #undef I1 #undef I2 #undef I3 src0 += 1; src1 += 1; src2 += 1; dst0 += 4; dst1 += 4; dst2 += 4; dst3 += 4; } } void hq4xS_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, const u32* src0, const u32* src1, const u32* src2, unsigned count, unsigned flag) { unsigned i; for(i=0;i 0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = src0[0]; c[3] = src1[0]; c[6] = src2[0]; } if (i < count-1) { c[2] = src0[1]; c[5] = src1[1]; c[8] = src2[1]; } else { c[2] = src0[0]; c[5] = src1[0]; c[8] = src2[0]; } mask = 0; // hq4xS dynamic edge detection: // simply comparing the center color against its surroundings will give bad results in many cases, // so, instead, compare the center color relative to the max difference in brightness of this 3x3 block int brightArray[9]; int maxBright = 0, minBright = 999999; for(int j = 0 ; j < 9 ; j++) { const int b = (int)((c[j] & 0xF8)); const int g = (int)((c[j] & 0xF800)) >> 8; const int r = (int)((c[j] & 0xF80000)) >> 16; const int bright = r+r+r + g+g+g + b+b; if(bright > maxBright) maxBright = bright; if(bright < minBright) minBright = bright; brightArray[j] = bright; } unsigned int diffBright = ((maxBright - minBright) * 7) >> 4; if(diffBright > 7) { const int centerBright = brightArray[4]; if(ABS(brightArray[0] - centerBright) > diffBright) mask |= 1 << 0; if(ABS(brightArray[1] - centerBright) > diffBright) mask |= 1 << 1; if(ABS(brightArray[2] - centerBright) > diffBright) mask |= 1 << 2; if(ABS(brightArray[3] - centerBright) > diffBright) mask |= 1 << 3; if(ABS(brightArray[5] - centerBright) > diffBright) mask |= 1 << 4; if(ABS(brightArray[6] - centerBright) > diffBright) mask |= 1 << 5; if(ABS(brightArray[7] - centerBright) > diffBright) mask |= 1 << 6; if(ABS(brightArray[8] - centerBright) > diffBright) mask |= 1 << 7; } #define P(a, b) dst##b[a] #define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right #define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right #define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left #define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left #define I1(p0) c[p0] #define I2(i0, i1, p0, p1) interp_32_##i0##i1(c[p0], c[p1]) #define I3(i0, i1, i2, p0, p1, p2) interp_32_##i0##i1##i2(c[p0], c[p1], c[p2]) switch (mask) { #include "hq4x.dat" } #undef P #undef MUR #undef MDR #undef MDL #undef MUL #undef I1 #undef I2 #undef I3 src0 += 1; src1 += 1; src2 += 1; dst0 += 4; dst1 += 4; dst2 += 4; dst3 += 4; } } void hq4x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *dst2 = dst1 + (dstPitch >> 2); u32 *dst3 = dst2 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); hq4x_32_def(dst0, dst1, dst2, dst3, src0, src0, src1, width, 0); int count = height; count -= 2; while(count) { dst0 += dstPitch; dst1 += dstPitch; dst2 += dstPitch; dst3 += dstPitch; hq4x_32_def(dst0, dst1, dst2, dst3, src0, src1, src2, width, 0); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch; dst1 += dstPitch; dst2 += dstPitch; dst3 += dstPitch; hq4x_32_def(dst0, dst1, dst2, dst3, src0, src1, src1, width, 0); } void hq4x32S(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dst0 = (u32 *)dstPtr; u32 *dst1 = dst0 + (dstPitch >> 2); u32 *dst2 = dst1 + (dstPitch >> 2); u32 *dst3 = dst2 + (dstPitch >> 2); u32 *src0 = (u32 *)srcPtr; u32 *src1 = src0 + (srcPitch >> 2); u32 *src2 = src1 + (srcPitch >> 2); hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src0, src1, width, 0); int count = height; count -= 2; while(count) { dst0 += dstPitch; dst1 += dstPitch; dst2 += dstPitch; dst3 += dstPitch; hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src1, src2, width, 0); src0 = src1; src1 = src2; src2 += srcPitch >> 2; --count; } dst0 += dstPitch; dst1 += dstPitch; dst2 += dstPitch; dst3 += dstPitch; hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src1, src1, width, 0); } void RenderHQ4X (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; hq4x32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } void RenderHQ4XS (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; hq4x32S (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2 , Src.Width, Src.Height); } desmume-0.9.9/src/filter/videofilter.cpp0000644000175000017500000004630112140261622021016 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "videofilter.h" #include // Parameters for Scanline filter int scanline_filter_a = 0; int scanline_filter_b = 2; int scanline_filter_c = 2; int scanline_filter_d = 4; // typedef struct { void *index; VideoFilterParamType type; } _VideoFilterParamAttributes; static const _VideoFilterParamAttributes _VideoFilterParamAttributesList[] = { {&scanline_filter_a, VF_INT}, {&scanline_filter_b, VF_INT}, {&scanline_filter_c, VF_INT}, {&scanline_filter_d, VF_INT}, }; /******************************************************************************************** CLASS CONSTRUCTORS ********************************************************************************************/ VideoFilter::VideoFilter(unsigned int srcWidth = 1, unsigned int srcHeight = 1, VideoFilterTypeID typeID = VideoFilterTypeID_None, unsigned int numberThreads = 0) { SSurface newSurface = {NULL, srcWidth*2, srcWidth, srcHeight}; _vfSrcSurface = newSurface; _vfDstSurface = newSurface; _isFilterRunning = false; _vfSrcSurfacePixBuffer = NULL; _vfTypeID = typeID; pthread_mutex_init(&_mutexSrc, NULL); pthread_mutex_init(&_mutexDst, NULL); pthread_mutex_init(&_mutexTypeID, NULL); pthread_mutex_init(&_mutexTypeString, NULL); pthread_cond_init(&_condRunning, NULL); // Create all threads _vfThread.resize(numberThreads); for (unsigned int i = 0; i < numberThreads; i++) { _vfThread[i].param.srcSurface = _vfSrcSurface; _vfThread[i].param.dstSurface = _vfDstSurface; _vfThread[i].param.filterFunction = NULL; _vfThread[i].task = new Task; _vfThread[i].task->start(false); } SetSourceSize(srcWidth, srcHeight); } /******************************************************************************************** CLASS DESTRUCTOR ********************************************************************************************/ VideoFilter::~VideoFilter() { // Destroy all threads first for (unsigned int i = 0; i < _vfThread.size(); i++) { _vfThread[i].task->finish(); _vfThread[i].task->shutdown(); delete _vfThread[i].task; } _vfThread.clear(); // Destroy everything else pthread_mutex_lock(&_mutexSrc); pthread_mutex_lock(&this->_mutexDst); while (this->_isFilterRunning) { pthread_cond_wait(&this->_condRunning, &this->_mutexDst); } free(_vfDstSurface.Surface); _vfDstSurface.Surface = NULL; pthread_mutex_unlock(&_mutexDst); free(_vfSrcSurfacePixBuffer); _vfSrcSurfacePixBuffer = NULL; _vfSrcSurface.Surface = NULL; pthread_mutex_unlock(&_mutexSrc); pthread_mutex_destroy(&_mutexSrc); pthread_mutex_destroy(&_mutexDst); pthread_mutex_destroy(&_mutexTypeID); pthread_mutex_destroy(&_mutexTypeString); pthread_cond_destroy(&_condRunning); } /******************************************************************************************** SetSourceSize() Sets the rectangular size of the source image. This method reallocates memory based on the input size, and therefore returns a bool value upon success or failure of resizing. Takes: width - The width of the source image in pixels. height - The height of the source image in pixels. Returns: A bool that reports if the resizing was successful. A value of true means success, while a value of false means failure. ********************************************************************************************/ bool VideoFilter::SetSourceSize(const unsigned int width, const unsigned int height) { bool result = false; pthread_mutex_lock(&this->_mutexSrc); // Overallocate the source buffer by 8 rows of pixels to account for out-of-bounds // memory reads done by some filters. uint32_t *newPixBuffer = (uint32_t *)calloc(width * (height + 8), sizeof(uint32_t)); if (newPixBuffer == NULL) { return result; } this->_vfSrcSurface.Width = width; this->_vfSrcSurface.Height = height; this->_vfSrcSurface.Pitch = width * 2; // Set the working source buffer pointer so that the working memory block is padded // with 4 pixel rows worth of memory on both sides. this->_vfSrcSurface.Surface = (unsigned char *)(newPixBuffer + (width * 4)); free(this->_vfSrcSurfacePixBuffer); this->_vfSrcSurfacePixBuffer = newPixBuffer; // Update the surfaces on threads. size_t threadCount = this->_vfThread.size(); for (unsigned int i = 0; i < threadCount; i++) { SSurface &threadSrcSurface = this->_vfThread[i].param.srcSurface; threadSrcSurface = this->_vfSrcSurface; threadSrcSurface.Height /= threadCount; if (i > 0) { SSurface &prevThreadSrcSurface = this->_vfThread[i - 1].param.srcSurface; threadSrcSurface.Surface = (unsigned char *)((uint32_t *)prevThreadSrcSurface.Surface + (prevThreadSrcSurface.Width * prevThreadSrcSurface.Height)); } } pthread_mutex_unlock(&this->_mutexSrc); result = this->ChangeFilterByID(this->GetTypeID()); return result; } /******************************************************************************************** ChangeFilterByID() Changes the video filter type using a VideoFilterTypeID. Takes: typeID - The type ID of the video filter. See the VideoFilterTypeID enumeration for possible values. Returns: A bool that reports if the filter change was successful. A value of true means success, while a value of false means failure. ********************************************************************************************/ bool VideoFilter::ChangeFilterByID(const VideoFilterTypeID typeID) { bool result = false; if (typeID >= VideoFilterTypeIDCount) { return result; } return this->ChangeFilterByAttributes(&VideoFilterAttributesList[typeID]); } /******************************************************************************************** ChangeFilterByAttributes() Changes the video filter type using video filter attributes. Takes: vfAttr - The video filter's attributes. Returns: A bool that reports if the filter change was successful. A value of true means success, while a value of false means failure. ********************************************************************************************/ bool VideoFilter::ChangeFilterByAttributes(const VideoFilterAttributes *vfAttr) { bool result = false; if (vfAttr == NULL) { return result; } pthread_mutex_lock(&this->_mutexSrc); const unsigned int srcWidth = this->_vfSrcSurface.Width; const unsigned int srcHeight = this->_vfSrcSurface.Height; pthread_mutex_unlock(&this->_mutexSrc); const VideoFilterTypeID typeID = vfAttr->typeID; const unsigned int dstWidth = srcWidth * vfAttr->scaleMultiply / vfAttr->scaleDivide; const unsigned int dstHeight = srcHeight * vfAttr->scaleMultiply / vfAttr->scaleDivide; const char *typeString = vfAttr->typeString; const VideoFilterFunc filterFunction = vfAttr->filterFunction; pthread_mutex_lock(&this->_mutexDst); uint32_t *newSurfaceBuffer = (uint32_t *)calloc(dstWidth * dstHeight, sizeof(uint32_t)); if (newSurfaceBuffer == NULL) { return result; } this->_vfFunc = filterFunction; this->_vfDstSurface.Width = dstWidth; this->_vfDstSurface.Height = dstHeight; this->_vfDstSurface.Pitch = dstWidth * 2; free(this->_vfDstSurface.Surface); this->_vfDstSurface.Surface = (unsigned char *)newSurfaceBuffer; // Update the surfaces on threads. size_t threadCount = this->_vfThread.size(); for (unsigned int i = 0; i < threadCount; i++) { SSurface &threadDstSurface = this->_vfThread[i].param.dstSurface; threadDstSurface = this->_vfDstSurface; threadDstSurface.Height /= threadCount; if (i > 0) { SSurface &prevThreadDstSurface = this->_vfThread[i - 1].param.dstSurface; threadDstSurface.Surface = (unsigned char *)((uint32_t *)prevThreadDstSurface.Surface + (prevThreadDstSurface.Width * prevThreadDstSurface.Height)); } this->_vfThread[i].param.filterFunction = this->_vfFunc; } pthread_mutex_unlock(&this->_mutexDst); this->SetTypeID(typeID); this->SetTypeString(typeString); result = true; return result; } /******************************************************************************************** RunFilter() Runs the pixels in the source buffer through the video filter, and then stores the resulting pixels into the destination buffer. Takes: Nothing. Returns: A pointer to the destination buffer. ********************************************************************************************/ uint32_t* VideoFilter::RunFilter() { pthread_mutex_lock(&this->_mutexSrc); pthread_mutex_lock(&this->_mutexDst); this->_isFilterRunning = true; uint32_t *destBufPtr = (uint32_t *)this->_vfDstSurface.Surface; if (this->_vfFunc == NULL) { memcpy(this->_vfDstSurface.Surface, this->_vfSrcSurface.Surface, this->_vfDstSurface.Width * this->_vfDstSurface.Height * sizeof(uint32_t)); } else { size_t threadCount = this->_vfThread.size(); if (threadCount > 0) { for (unsigned int i = 0; i < threadCount; i++) { this->_vfThread[i].task->execute(&RunVideoFilterTask, &this->_vfThread[i].param); } for (unsigned int i = 0; i < threadCount; i++) { this->_vfThread[i].task->finish(); } } else { this->_vfFunc(this->_vfSrcSurface, this->_vfDstSurface); } } this->_isFilterRunning = false; pthread_cond_signal(&this->_condRunning); pthread_mutex_unlock(&this->_mutexDst); pthread_mutex_unlock(&this->_mutexSrc); return destBufPtr; } /******************************************************************************************** RunFilterCustom() - STATIC Runs the pixels from srcBuffer through the video filter, and then stores the resulting pixels into dstBuffer. This function is useful for when your source or destination buffers are already established, or when you want to run a filter once without having to instantiate a new filter object. Takes: srcBuffer - A pointer to the source pixel buffer. The caller is responsible for ensuring that this buffer is valid. Also note that certain video filters may do out-of-bounds reads, so the caller is responsible for overallocating this buffer in order to avoid crashing on certain platforms. dstBuffer - A pointer to the destination pixel buffer. The caller is responsible for ensuring that this buffer is valid and large enough to store all of the destination pixels. srcWidth - The source surface width in pixels. srcHeight - The source surface height in pixels. typeID - The type ID of the video filter. See the VideoFilterTypeID enumeration for possible values. Returns: Nothing. ********************************************************************************************/ void VideoFilter::RunFilterCustom(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ dstBuffer, const unsigned int srcWidth, const unsigned int srcHeight, const VideoFilterTypeID typeID) { // Parameter check if (srcBuffer == NULL || dstBuffer == NULL || srcWidth == 0 || srcHeight == 0 || typeID >= VideoFilterTypeIDCount) { return; } // Get the filter attributes const VideoFilterAttributes *vfAttr = &VideoFilterAttributesList[typeID]; const unsigned int dstWidth = srcWidth * vfAttr->scaleMultiply / vfAttr->scaleDivide; const unsigned int dstHeight = srcHeight * vfAttr->scaleMultiply / vfAttr->scaleDivide; const VideoFilterFunc filterFunction = vfAttr->filterFunction; // Assign the surfaces and run the filter SSurface srcSurface = {(unsigned char *)srcBuffer, srcWidth*2, srcWidth, srcHeight}; SSurface dstSurface = {(unsigned char *)dstBuffer, dstWidth*2, dstWidth, dstHeight}; if (filterFunction == NULL) { memcpy(dstBuffer, srcBuffer, dstWidth * dstHeight * sizeof(uint32_t)); } else { filterFunction(srcSurface, dstSurface); } } /******************************************************************************************** GetTypeStringByID() - STATIC Returns a C-string representation of the passed in video filter type. Takes: typeID - The type ID of the video filter. See the VideoFilterTypeID enumeration for possible values. Returns: A C-string that represents the video filter type. If typeID is invalid, this method returns the string "Unknown". ********************************************************************************************/ const char* VideoFilter::GetTypeStringByID(const VideoFilterTypeID typeID) { if (typeID >= VideoFilterTypeIDCount) { return VIDEOFILTERTYPE_UNKNOWN_STRING; } return VideoFilterAttributesList[typeID].typeString; } /******************************************************************************************** ACCESSORS ********************************************************************************************/ VideoFilterTypeID VideoFilter::GetTypeID() { pthread_mutex_lock(&this->_mutexTypeID); VideoFilterTypeID typeID = this->_vfTypeID; pthread_mutex_unlock(&this->_mutexTypeID); return typeID; } void VideoFilter::SetTypeID(const VideoFilterTypeID typeID) { pthread_mutex_lock(&this->_mutexTypeID); this->_vfTypeID = typeID; pthread_mutex_unlock(&this->_mutexTypeID); } const char* VideoFilter::GetTypeString() { pthread_mutex_lock(&this->_mutexTypeString); const char *typeString = this->_vfTypeString.c_str(); pthread_mutex_unlock(&this->_mutexTypeString); return typeString; } void VideoFilter::SetTypeString(const char *typeString) { this->SetTypeString(std::string(typeString)); } void VideoFilter::SetTypeString(std::string typeString) { pthread_mutex_lock(&this->_mutexTypeString); this->_vfTypeString = typeString; pthread_mutex_unlock(&this->_mutexTypeString); } uint32_t* VideoFilter::GetSrcBufferPtr() { pthread_mutex_lock(&this->_mutexSrc); uint32_t *ptr = (uint32_t *)this->_vfSrcSurface.Surface; pthread_mutex_unlock(&this->_mutexSrc); return ptr; } uint32_t* VideoFilter::GetDstBufferPtr() { pthread_mutex_lock(&this->_mutexDst); uint32_t *ptr = (uint32_t *)this->_vfDstSurface.Surface; pthread_mutex_unlock(&this->_mutexDst); return ptr; } unsigned int VideoFilter::GetSrcWidth() { pthread_mutex_lock(&this->_mutexSrc); unsigned int width = this->_vfSrcSurface.Width; pthread_mutex_unlock(&this->_mutexSrc); return width; } unsigned int VideoFilter::GetSrcHeight() { pthread_mutex_lock(&this->_mutexSrc); unsigned int height = this->_vfSrcSurface.Height; pthread_mutex_unlock(&this->_mutexSrc); return height; } unsigned int VideoFilter::GetDstWidth() { pthread_mutex_lock(&this->_mutexDst); unsigned int width = this->_vfDstSurface.Width; pthread_mutex_unlock(&this->_mutexDst); return width; } unsigned int VideoFilter::GetDstHeight() { pthread_mutex_lock(&this->_mutexDst); unsigned int height = this->_vfDstSurface.Height; pthread_mutex_unlock(&this->_mutexDst); return height; } VideoFilterParamType VideoFilter::GetFilterParameterType(VideoFilterParamID paramID) { return _VideoFilterParamAttributesList[paramID].type; } int VideoFilter::GetFilterParameteri(VideoFilterParamID paramID) { int value = 0; pthread_mutex_lock(&this->_mutexDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: value = (int)(*((int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_UINT: value = (int)(*((unsigned int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_FLOAT: value = (int)(*((float *)_VideoFilterParamAttributesList[paramID].index)); break; default: break; } pthread_mutex_unlock(&this->_mutexDst); return value; } unsigned int VideoFilter::GetFilterParameterui(VideoFilterParamID paramID) { unsigned int value = 0; pthread_mutex_lock(&this->_mutexDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: value = (unsigned int)(*((int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_UINT: value = (unsigned int)(*((unsigned int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_FLOAT: value = (unsigned int)(*((float *)_VideoFilterParamAttributesList[paramID].index)); break; default: break; } pthread_mutex_unlock(&this->_mutexDst); return value; } float VideoFilter::GetFilterParameterf(VideoFilterParamID paramID) { float value = 0.0f; pthread_mutex_lock(&this->_mutexDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: value = (float)(*((int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_UINT: value = (float)(*((unsigned int *)_VideoFilterParamAttributesList[paramID].index)); break; case VF_FLOAT: value = (float)(*((float *)_VideoFilterParamAttributesList[paramID].index)); break; default: break; } pthread_mutex_unlock(&this->_mutexDst); return value; } void VideoFilter::SetFilterParameteri(VideoFilterParamID paramID, int value) { if (paramID >= VideoFilterParamIDCount) { return; } pthread_mutex_lock(&this->_mutexDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: *((int *)_VideoFilterParamAttributesList[paramID].index) = (int)value; break; case VF_UINT: *((unsigned int *)_VideoFilterParamAttributesList[paramID].index) = (unsigned int)value; break; case VF_FLOAT: *((float *)_VideoFilterParamAttributesList[paramID].index) = (float)value; break; default: break; } pthread_mutex_unlock(&this->_mutexDst); } void VideoFilter::SetFilterParameterui(VideoFilterParamID paramID, unsigned int value) { if (paramID >= VideoFilterParamIDCount) { return; } pthread_mutex_lock(&this->_mutexDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: *((int *)_VideoFilterParamAttributesList[paramID].index) = (int)value; break; case VF_UINT: *((unsigned int *)_VideoFilterParamAttributesList[paramID].index) = (unsigned int)value; break; case VF_FLOAT: *((float *)_VideoFilterParamAttributesList[paramID].index) = (float)value; break; default: break; } pthread_mutex_unlock(&this->_mutexDst); } void VideoFilter::SetFilterParameterf(VideoFilterParamID paramID, float value) { if (paramID >= VideoFilterParamIDCount) { return; } pthread_mutex_lock(&this->_mutexDst); switch (_VideoFilterParamAttributesList[paramID].type) { case VF_INT: *((int *)_VideoFilterParamAttributesList[paramID].index) = (int)value; break; case VF_UINT: *((unsigned int *)_VideoFilterParamAttributesList[paramID].index) = (unsigned int)value; break; case VF_FLOAT: *((float *)_VideoFilterParamAttributesList[paramID].index) = (float)value; break; default: break; } pthread_mutex_unlock(&this->_mutexDst); } // Task function for multithreaded filtering static void* RunVideoFilterTask(void *arg) { VideoFilterThreadParam *param = (VideoFilterThreadParam *)arg; param->filterFunction(param->srcSurface, param->dstSurface); return NULL; } desmume-0.9.9/src/filter/hq2x.h0000644000175000017500000006006212140261622017031 0ustar guillaumeguillaumecase 0 : case 1 : case 4 : case 5 : case 32 : case 33 : case 36 : case 37 : case 128 : case 129 : case 132 : case 133 : case 160 : case 161 : case 164 : case 165 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 2 : case 34 : case 130 : case 162 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 3 : case 35 : case 131 : case 163 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 6 : case 38 : case 134 : case 166 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 7 : case 39 : case 135 : case 167 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I211(4, 3, 7); P3 = I211(4, 5, 7); } break; case 8 : case 12 : case 136 : case 140 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); P2 = I31(4, 6); P3 = I211(4, 5, 7); } break; case 9 : case 13 : case 137 : case 141 : { P0 = I31(4, 1); P1 = I211(4, 1, 5); P2 = I31(4, 6); P3 = I211(4, 5, 7); } break; case 10 : case 138 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I211(4, 5, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I211(4, 1, 3); } } break; case 11 : case 139 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I211(4, 5, 7); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 14 : case 142 : { P2 = I31(4, 6); P3 = I211(4, 5, 7); if (MUL) { P0 = I31(4, 0); P1 = I31(4, 5); } else { P0 = I332(1, 3, 4); P1 = I521(4, 1, 5); } } break; case 15 : case 143 : { P2 = I31(4, 6); P3 = I211(4, 5, 7); if (MUL) { P0 = IC(4); P1 = I31(4, 5); } else { P0 = I332(1, 3, 4); P1 = I521(4, 1, 5); } } break; case 16 : case 17 : case 48 : case 49 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); P2 = I211(4, 3, 7); P3 = I31(4, 8); } break; case 18 : case 50 : { P0 = I31(4, 0); P2 = I211(4, 3, 7); P3 = I31(4, 8); if (MUR) { P1 = I31(4, 2); } else { P1 = I211(4, 1, 5); } } break; case 19 : case 51 : { P2 = I211(4, 3, 7); P3 = I31(4, 8); if (MUR) { P0 = I31(4, 3); P1 = I31(4, 2); } else { P0 = I521(4, 1, 3); P1 = I332(1, 5, 4); } } break; case 20 : case 21 : case 52 : case 53 : { P0 = I211(4, 1, 3); P1 = I31(4, 1); P2 = I211(4, 3, 7); P3 = I31(4, 8); } break; case 22 : case 54 : { P0 = I31(4, 0); P2 = I211(4, 3, 7); P3 = I31(4, 8); if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 23 : case 55 : { P2 = I211(4, 3, 7); P3 = I31(4, 8); if (MUR) { P0 = I31(4, 3); P1 = IC(4); } else { P0 = I521(4, 1, 3); P1 = I332(1, 5, 4); } } break; case 24 : case 66 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 25 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 26 : case 31 : case 95 : { P2 = I31(4, 6); P3 = I31(4, 8); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 27 : case 75 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 8); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 28 : { P0 = I31(4, 0); P1 = I31(4, 1); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 29 : { P0 = I31(4, 1); P1 = I31(4, 1); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 30 : case 86 : { P0 = I31(4, 0); P2 = I31(4, 6); P3 = I31(4, 8); if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 40 : case 44 : case 168 : case 172 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); P2 = I31(4, 7); P3 = I211(4, 5, 7); } break; case 41 : case 45 : case 169 : case 173 : { P0 = I31(4, 1); P1 = I211(4, 1, 5); P2 = I31(4, 7); P3 = I211(4, 5, 7); } break; case 42 : case 170 : { P1 = I31(4, 2); P3 = I211(4, 5, 7); if (MUL) { P0 = I31(4, 0); P2 = I31(4, 7); } else { P0 = I332(1, 3, 4); P2 = I521(4, 3, 7); } } break; case 43 : case 171 : { P1 = I31(4, 2); P3 = I211(4, 5, 7); if (MUL) { P0 = IC(4); P2 = I31(4, 7); } else { P0 = I332(1, 3, 4); P2 = I521(4, 3, 7); } } break; case 46 : case 174 : { P1 = I31(4, 5); P2 = I31(4, 7); P3 = I211(4, 5, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 47 : case 175 : { P1 = I31(4, 5); P2 = I31(4, 7); P3 = I211(4, 5, 7); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 56 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 7); P3 = I31(4, 8); } break; case 57 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 7); P3 = I31(4, 8); } break; case 58 : { P2 = I31(4, 7); P3 = I31(4, 8); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 59 : { P2 = I31(4, 7); P3 = I31(4, 8); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 60 : { P0 = I31(4, 0); P1 = I31(4, 1); P2 = I31(4, 7); P3 = I31(4, 8); } break; case 61 : { P0 = I31(4, 1); P1 = I31(4, 1); P2 = I31(4, 7); P3 = I31(4, 8); } break; case 62 : { P0 = I31(4, 0); P2 = I31(4, 7); P3 = I31(4, 8); if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 63 : { P2 = I31(4, 7); P3 = I31(4, 8); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 64 : case 65 : case 68 : case 69 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 67 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 70 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 71 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I31(4, 6); P3 = I31(4, 8); } break; case 72 : case 76 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); P3 = I31(4, 8); if (MDL) { P2 = I31(4, 6); } else { P2 = I211(4, 3, 7); } } break; case 73 : case 77 : { P1 = I211(4, 1, 5); P3 = I31(4, 8); if (MDL) { P0 = I31(4, 1); P2 = I31(4, 6); } else { P0 = I521(4, 3, 1); P2 = I332(3, 7, 4); } } break; case 74 : case 107 : case 123 : { P1 = I31(4, 2); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 78 : { P1 = I31(4, 5); P3 = I31(4, 8); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 79 : { P1 = I31(4, 5); P3 = I31(4, 8); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 80 : case 81 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = I31(4, 8); } else { P3 = I211(4, 5, 7); } } break; case 82 : case 214 : case 222 : { P0 = I31(4, 0); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 83 : { P0 = I31(4, 3); P2 = I31(4, 6); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 84 : case 85 : { P0 = I211(4, 1, 3); P2 = I31(4, 6); if (MDR) { P1 = I31(4, 1); P3 = I31(4, 8); } else { P1 = I521(4, 5, 1); P3 = I332(5, 7, 4); } } break; case 87 : { P0 = I31(4, 3); P2 = I31(4, 6); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 88 : case 248 : case 250 : { P0 = I31(4, 0); P1 = I31(4, 2); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 89 : { P0 = I31(4, 1); P1 = I31(4, 2); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 90 : { if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 91 : { if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 92 : { P0 = I31(4, 0); P1 = I31(4, 1); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 93 : { P0 = I31(4, 1); P1 = I31(4, 1); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 94 : { if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 96 : case 97 : case 100 : case 101 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 98 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 99 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 102 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 103 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I31(4, 3); P3 = I31(4, 8); } break; case 104 : case 108 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } } break; case 105 : case 109 : { P1 = I211(4, 1, 5); P3 = I31(4, 8); if (MDL) { P0 = I31(4, 1); P2 = IC(4); } else { P0 = I521(4, 3, 1); P2 = I332(3, 7, 4); } } break; case 106 : case 120 : { P0 = I31(4, 0); P1 = I31(4, 2); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } } break; case 110 : { P0 = I31(4, 0); P1 = I31(4, 5); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } } break; case 111 : { P1 = I31(4, 5); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 112 : case 113 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); if (MDR) { P2 = I31(4, 3); P3 = I31(4, 8); } else { P2 = I521(4, 7, 3); P3 = I332(5, 7, 4); } } break; case 114 : { P0 = I31(4, 0); P2 = I31(4, 3); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 115 : { P0 = I31(4, 3); P2 = I31(4, 3); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 116 : case 117 : { P0 = I211(4, 1, 3); P1 = I31(4, 1); P2 = I31(4, 3); if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 118 : { P0 = I31(4, 0); P2 = I31(4, 3); P3 = I31(4, 8); if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 119 : { P2 = I31(4, 3); P3 = I31(4, 8); if (MUR) { P0 = I31(4, 3); P1 = IC(4); } else { P0 = I521(4, 1, 3); P1 = I332(1, 5, 4); } } break; case 121 : { P0 = I31(4, 1); P1 = I31(4, 2); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } } break; case 122 : { if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = I31(4, 8); } else { P3 = I611(4, 5, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 124 : { P0 = I31(4, 0); P1 = I31(4, 1); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } } break; case 125 : { P1 = I31(4, 1); P3 = I31(4, 8); if (MDL) { P0 = I31(4, 1); P2 = IC(4); } else { P0 = I521(4, 3, 1); P2 = I332(3, 7, 4); } } break; case 126 : { P0 = I31(4, 0); P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 127 : { P3 = I31(4, 8); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 144 : case 145 : case 176 : case 177 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); P2 = I211(4, 3, 7); P3 = I31(4, 7); } break; case 146 : case 178 : { P0 = I31(4, 0); P2 = I211(4, 3, 7); if (MUR) { P1 = I31(4, 2); P3 = I31(4, 7); } else { P1 = I332(1, 5, 4); P3 = I521(4, 5, 7); } } break; case 147 : case 179 : { P0 = I31(4, 3); P2 = I211(4, 3, 7); P3 = I31(4, 7); if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 148 : case 149 : case 180 : case 181 : { P0 = I211(4, 1, 3); P1 = I31(4, 1); P2 = I211(4, 3, 7); P3 = I31(4, 7); } break; case 150 : case 182 : { P0 = I31(4, 0); P2 = I211(4, 3, 7); if (MUR) { P1 = IC(4); P3 = I31(4, 7); } else { P1 = I332(1, 5, 4); P3 = I521(4, 5, 7); } } break; case 151 : case 183 : { P0 = I31(4, 3); P2 = I211(4, 3, 7); P3 = I31(4, 7); if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 152 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 7); } break; case 153 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 7); } break; case 154 : { P2 = I31(4, 6); P3 = I31(4, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 155 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 7); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 156 : { P0 = I31(4, 0); P1 = I31(4, 1); P2 = I31(4, 6); P3 = I31(4, 7); } break; case 157 : { P0 = I31(4, 1); P1 = I31(4, 1); P2 = I31(4, 6); P3 = I31(4, 7); } break; case 158 : { P2 = I31(4, 6); P3 = I31(4, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 159 : { P2 = I31(4, 6); P3 = I31(4, 7); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 184 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 7); P3 = I31(4, 7); } break; case 185 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 7); P3 = I31(4, 7); } break; case 186 : { P2 = I31(4, 7); P3 = I31(4, 7); if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 187 : { P1 = I31(4, 2); P3 = I31(4, 7); if (MUL) { P0 = IC(4); P2 = I31(4, 7); } else { P0 = I332(1, 3, 4); P2 = I521(4, 3, 7); } } break; case 188 : { P0 = I31(4, 0); P1 = I31(4, 1); P2 = I31(4, 7); P3 = I31(4, 7); } break; case 189 : { P0 = I31(4, 1); P1 = I31(4, 1); P2 = I31(4, 7); P3 = I31(4, 7); } break; case 190 : { P0 = I31(4, 0); P2 = I31(4, 7); if (MUR) { P1 = IC(4); P3 = I31(4, 7); } else { P1 = I332(1, 5, 4); P3 = I521(4, 5, 7); } } break; case 191 : { P2 = I31(4, 7); P3 = I31(4, 7); if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 192 : case 193 : case 196 : case 197 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 194 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 195 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 198 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 199 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I31(4, 6); P3 = I31(4, 5); } break; case 200 : case 204 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); if (MDL) { P2 = I31(4, 6); P3 = I31(4, 5); } else { P2 = I332(3, 7, 4); P3 = I521(4, 7, 5); } } break; case 201 : case 205 : { P0 = I31(4, 1); P1 = I211(4, 1, 5); P3 = I31(4, 5); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } } break; case 202 : { P1 = I31(4, 2); P3 = I31(4, 5); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 203 : { P1 = I31(4, 2); P2 = I31(4, 6); P3 = I31(4, 5); if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 206 : { P1 = I31(4, 5); P3 = I31(4, 5); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 207 : { P2 = I31(4, 6); P3 = I31(4, 5); if (MUL) { P0 = IC(4); P1 = I31(4, 5); } else { P0 = I332(1, 3, 4); P1 = I521(4, 1, 5); } } break; case 208 : case 209 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 210 : case 216 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 211 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 212 : case 213 : { P0 = I211(4, 1, 3); P2 = I31(4, 6); if (MDR) { P1 = I31(4, 1); P3 = IC(4); } else { P1 = I521(4, 5, 1); P3 = I332(5, 7, 4); } } break; case 215 : { P0 = I31(4, 3); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 217 : { P0 = I31(4, 1); P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 218 : { if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 219 : { P1 = I31(4, 2); P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 220 : { P0 = I31(4, 0); P1 = I31(4, 1); if (MDL) { P2 = I31(4, 6); } else { P2 = I611(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 221 : { P0 = I31(4, 1); P2 = I31(4, 6); if (MDR) { P1 = I31(4, 1); P3 = IC(4); } else { P1 = I521(4, 5, 1); P3 = I332(5, 7, 4); } } break; case 223 : { P2 = I31(4, 6); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 224 : case 225 : case 228 : case 229 : { P0 = I211(4, 1, 3); P1 = I211(4, 1, 5); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 226 : { P0 = I31(4, 0); P1 = I31(4, 2); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 227 : { P0 = I31(4, 3); P1 = I31(4, 2); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 230 : { P0 = I31(4, 0); P1 = I31(4, 5); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 231 : { P0 = I31(4, 3); P1 = I31(4, 5); P2 = I31(4, 3); P3 = I31(4, 5); } break; case 232 : case 236 : { P0 = I31(4, 0); P1 = I211(4, 1, 5); if (MDL) { P2 = IC(4); P3 = I31(4, 5); } else { P2 = I332(3, 7, 4); P3 = I521(4, 7, 5); } } break; case 233 : case 237 : { P0 = I31(4, 1); P1 = I211(4, 1, 5); P3 = I31(4, 5); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } } break; case 234 : { P1 = I31(4, 2); P3 = I31(4, 5); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MUL) { P0 = I31(4, 0); } else { P0 = I611(4, 1, 3); } } break; case 235 : { P1 = I31(4, 2); P3 = I31(4, 5); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 238 : { P0 = I31(4, 0); P1 = I31(4, 5); if (MDL) { P2 = IC(4); P3 = I31(4, 5); } else { P2 = I332(3, 7, 4); P3 = I521(4, 7, 5); } } break; case 239 : { P1 = I31(4, 5); P3 = I31(4, 5); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } } break; case 240 : case 241 : { P0 = I211(4, 1, 3); P1 = I31(4, 2); if (MDR) { P2 = I31(4, 3); P3 = IC(4); } else { P2 = I521(4, 7, 3); P3 = I332(5, 7, 4); } } break; case 242 : { P0 = I31(4, 0); P2 = I31(4, 3); if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUR) { P1 = I31(4, 2); } else { P1 = I611(4, 1, 5); } } break; case 243 : { P0 = I31(4, 3); P1 = I31(4, 2); if (MDR) { P2 = I31(4, 3); P3 = IC(4); } else { P2 = I521(4, 7, 3); P3 = I332(5, 7, 4); } } break; case 244 : case 245 : { P0 = I211(4, 1, 3); P1 = I31(4, 1); P2 = I31(4, 3); if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } } break; case 246 : { P0 = I31(4, 0); P2 = I31(4, 3); if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 247 : { P0 = I31(4, 3); P2 = I31(4, 3); if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; case 249 : { P0 = I31(4, 1); P1 = I31(4, 2); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } } break; case 251 : { P1 = I31(4, 2); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I211(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I211(4, 1, 3); } } break; case 252 : { P0 = I31(4, 0); P1 = I31(4, 1); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } } break; case 253 : { P0 = I31(4, 1); P1 = I31(4, 1); if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } } break; case 254 : { P0 = I31(4, 0); if (MDL) { P2 = IC(4); } else { P2 = I211(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUR) { P1 = IC(4); } else { P1 = I211(4, 1, 5); } } break; case 255 : { if (MDL) { P2 = IC(4); } else { P2 = I1411(4, 3, 7); } if (MDR) { P3 = IC(4); } else { P3 = I1411(4, 5, 7); } if (MUL) { P0 = IC(4); } else { P0 = I1411(4, 1, 3); } if (MUR) { P1 = IC(4); } else { P1 = I1411(4, 1, 5); } } break; desmume-0.9.9/src/filter/scanline.cpp0000644000175000017500000000544412140261622020301 0ustar guillaumeguillaume/* Copyright (C) 2009 DeSmuME team This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "filter.h" #include "types.h" #include #include typedef u64 uint64; extern int scanline_filter_a, scanline_filter_b, scanline_filter_c, scanline_filter_d; static int fac_a, fac_b, fac_c, fac_d; FORCEINLINE void ScanLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width, int fac_left, int fac_right) { while(Width--) { u8* u8dst = (u8*)lpDst; u8* u8src = (u8*)lpSrc; *u8dst++ = *u8src++ * fac_left / 16; *u8dst++ = *u8src++ * fac_left / 16; *u8dst++ = *u8src++ * fac_left / 16; u8dst++; u8src = (u8*)lpSrc; *u8dst++ = *u8src++ * fac_right / 16; *u8dst++ = *u8src++ * fac_right / 16; *u8dst++ = *u8src++ * fac_right / 16; u8dst++; u8src++; lpDst+=2; lpSrc++; } } FORCEINLINE void DoubleLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width){ while(Width--){ *lpDst++ = *lpSrc; *lpDst++ = *lpSrc++; } } void RenderScanline( SSurface Src, SSurface Dst) { fac_a = (16-scanline_filter_a); fac_b = (16-scanline_filter_b); fac_c = (16-scanline_filter_c); fac_d = (16-scanline_filter_d); unsigned int H; const uint32 srcHeight = Src.Height; const unsigned int srcPitch = Src.Pitch >> 1; u32* lpSrc = (u32*)Src.Surface; const unsigned int dstPitch = Dst.Pitch >> 1; u32 *lpDst = (u32*)Dst.Surface; for (H = 0; H < srcHeight; H++, lpSrc += srcPitch) { ScanLine32(lpDst, lpSrc, Src.Width, fac_a, fac_b); lpDst += dstPitch; ScanLine32(lpDst, lpSrc, Src.Width, fac_c, fac_d); lpDst += dstPitch; } } void RenderNearest2X (SSurface Src, SSurface Dst) { uint32 *lpSrc; unsigned int H; const uint32 srcHeight = Src.Height; const unsigned int srcPitch = Src.Pitch >> 1; lpSrc = reinterpret_cast(Src.Surface); const unsigned int dstPitch = Dst.Pitch >> 1; uint32 *lpDst = (uint32*)Dst.Surface; for (H = 0; H < srcHeight; H++, lpSrc += srcPitch) DoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch, DoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch; } desmume-0.9.9/src/filter/2xsai.cpp0000644000175000017500000010676612140261622017544 0ustar guillaumeguillaume#include "filter.h" #include "types.h" //ref: http://vba-rerecording.googlecode.com/svn/trunk/src/2xsai.cpp static u32 colorMask = 0xfefefe; static u32 lowPixelMask = 0x010101; static u32 qcolorMask = 0xfcfcfc; static u32 qlowpixelMask = 0x030303; static u32 redblueMask = 0xF81F; static u32 greenMask = 0x7E0; int Init_2xSaI(u32 BitFormat, u32 systemColorDepth) { if(systemColorDepth == 16) { if (BitFormat == 565) { colorMask = 0xF7DEF7DE; lowPixelMask = 0x08210821; qcolorMask = 0xE79CE79C; qlowpixelMask = 0x18631863; redblueMask = 0xF81F; greenMask = 0x7E0; } else if (BitFormat == 555) { colorMask = 0x7BDE7BDE; lowPixelMask = 0x04210421; qcolorMask = 0x739C739C; qlowpixelMask = 0x0C630C63; redblueMask = 0x7C1F; greenMask = 0x3E0; } else { return 0; } } else if(systemColorDepth == 32) { colorMask = 0xfefefe; lowPixelMask = 0x010101; qcolorMask = 0xfcfcfc; qlowpixelMask = 0x030303; } else return 0; return 1; } static inline int GetResult1 (u32 A, u32 B, u32 C, u32 D, u32 /* E */) { int x = 0; int y = 0; int r = 0; if (A == C) x += 1; else if (B == C) y += 1; if (A == D) x += 1; else if (B == D) y += 1; if (x <= 1) r += 1; if (y <= 1) r -= 1; return r; } static inline int GetResult2 (u32 A, u32 B, u32 C, u32 D, u32 /* E */) { int x = 0; int y = 0; int r = 0; if (A == C) x += 1; else if (B == C) y += 1; if (A == D) x += 1; else if (B == D) y += 1; if (x <= 1) r -= 1; if (y <= 1) r += 1; return r; } static inline int GetResult (u32 A, u32 B, u32 C, u32 D) { int x = 0; int y = 0; int r = 0; if (A == C) x += 1; else if (B == C) y += 1; if (A == D) x += 1; else if (B == D) y += 1; if (x <= 1) r += 1; if (y <= 1) r -= 1; return r; } static inline u32 INTERPOLATE (u32 A, u32 B) { if (A != B) { return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask)); } else return A; } static inline u32 Q_INTERPOLATE (u32 A, u32 B, u32 C, u32 D) { register u32 x = ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2); register u32 y = (A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask); y = (y >> 2) & qlowpixelMask; return x + y; } #define BLUE_MASK565 0x001F001F #define RED_MASK565 0xF800F800 #define GREEN_MASK565 0x07E007E0 #define BLUE_MASK555 0x001F001F #define RED_MASK555 0x7C007C00 #define GREEN_MASK555 0x03E003E0 void Super2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u16 *bP; u8 *dP; u32 inc_bP; u32 Nextline = srcPitch >> 1; { inc_bP = 1; for (; height; height--) { bP = (u16 *) srcPtr; dP = (u8 *) dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { u32 color4, color5, color6; u32 color1, color2, color3; u32 colorA0, colorA1, colorA2, colorA3, colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; u32 product1a, product1b, product2a, product2b; //--------------------------------------- B1 B2 // 4 5 6 S2 // 1 2 3 S1 // A1 A2 colorB0 = *(bP - Nextline - 1); colorB1 = *(bP - Nextline); colorB2 = *(bP - Nextline + 1); colorB3 = *(bP - Nextline + 2); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA0 = *(bP + Nextline + Nextline - 1); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); colorA3 = *(bP + Nextline + Nextline + 2); //-------------------------------------- if (color2 == color6 && color5 != color3) { product2b = product1b = color2; } else if (color5 == color3 && color2 != color6) { product2b = product1b = color5; } else if (color5 == color3 && color2 == color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) product2b = product1b = color6; else if (r < 0) product2b = product1b = color5; else { product2b = product1b = INTERPOLATE (color5, color6); } } else { if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0) product2b = Q_INTERPOLATE (color3, color3, color3, color2); else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3) product2b = Q_INTERPOLATE (color2, color2, color2, color3); else product2b = INTERPOLATE (color2, color3); if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0) product1b = Q_INTERPOLATE (color6, color6, color6, color5); else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3) product1b = Q_INTERPOLATE (color6, color5, color5, color5); else product1b = INTERPOLATE (color5, color6); } if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2) product2a = INTERPOLATE (color2, color5); else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0) product2a = INTERPOLATE (color2, color5); else product2a = color2; if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2) product1a = INTERPOLATE (color2, color5); else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0) product1a = INTERPOLATE (color2, color5); else product1a = color5; #ifdef WORDS_BIGENDIAN product1a = (product1a << 16) | product1b; product2a = (product2a << 16) | product2b; #else product1a = product1a | (product1b << 16); product2a = product2a | (product2b << 16); #endif *((u32 *) dP) = product1a; *((u32 *) (dP + dstPitch)) = product2a; bP += inc_bP; dP += sizeof (u32); } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (; height; height--) } } void Super2xSaI32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *bP; u32 *dP; u32 inc_bP; u32 Nextline = srcPitch >> 2; inc_bP = 1; for (; height; height--) { bP = (u32 *) srcPtr; dP = (u32 *) dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { u32 color4, color5, color6; u32 color1, color2, color3; u32 colorA0, colorA1, colorA2, colorA3, colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; u32 product1a, product1b, product2a, product2b; //--------------------------------------- B1 B2 // 4 5 6 S2 // 1 2 3 S1 // A1 A2 colorB0 = *(bP - Nextline - 1); colorB1 = *(bP - Nextline); colorB2 = *(bP - Nextline + 1); colorB3 = *(bP - Nextline + 2); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA0 = *(bP + Nextline + Nextline - 1); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); colorA3 = *(bP + Nextline + Nextline + 2); //-------------------------------------- if (color2 == color6 && color5 != color3) { product2b = product1b = color2; } else if (color5 == color3 && color2 != color6) { product2b = product1b = color5; } else if (color5 == color3 && color2 == color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) product2b = product1b = color6; else if (r < 0) product2b = product1b = color5; else { product2b = product1b = INTERPOLATE (color5, color6); } } else { if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0) product2b = Q_INTERPOLATE (color3, color3, color3, color2); else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3) product2b = Q_INTERPOLATE (color2, color2, color2, color3); else product2b = INTERPOLATE (color2, color3); if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0) product1b = Q_INTERPOLATE (color6, color6, color6, color5); else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3) product1b = Q_INTERPOLATE (color6, color5, color5, color5); else product1b = INTERPOLATE (color5, color6); } if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2) product2a = INTERPOLATE (color2, color5); else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0) product2a = INTERPOLATE (color2, color5); else product2a = color2; if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2) product1a = INTERPOLATE (color2, color5); else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0) product1a = INTERPOLATE (color2, color5); else product1a = color5; *(dP) = product1a; *(dP+1) = product1b; *(dP + (dstPitch >> 2)) = product2a; *(dP + (dstPitch >> 2) + 1) = product2b; bP += inc_bP; dP += 2; } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (; height; height--) } void SuperEagle (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 *dP; u16 *bP; // u16 *xP; u32 inc_bP; { inc_bP = 1; u32 Nextline = srcPitch >> 1; for (; height; height--) { bP = (u16 *) srcPtr; // xP = (u16 *) deltaPtr; dP = dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { u32 color4, color5, color6; u32 color1, color2, color3; u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; u32 product1a, product1b, product2a, product2b; colorB1 = *(bP - Nextline); colorB2 = *(bP - Nextline + 1); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); // -------------------------------------- if (color2 == color6 && color5 != color3) { product1b = product2a = color2; if ((color1 == color2) || (color6 == colorB2)) { product1a = INTERPOLATE (color2, color5); product1a = INTERPOLATE (color2, product1a); // product1a = color2; } else { product1a = INTERPOLATE (color5, color6); } if ((color6 == colorS2) || (color2 == colorA1)) { product2b = INTERPOLATE (color2, color3); product2b = INTERPOLATE (color2, product2b); // product2b = color2; } else { product2b = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 != color6) { product2b = product1a = color5; if ((colorB1 == color5) || (color3 == colorS1)) { product1b = INTERPOLATE (color5, color6); product1b = INTERPOLATE (color5, product1b); // product1b = color5; } else { product1b = INTERPOLATE (color5, color6); } if ((color3 == colorA2) || (color4 == color5)) { product2a = INTERPOLATE (color5, color2); product2a = INTERPOLATE (color5, product2a); // product2a = color5; } else { product2a = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 == color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) { product1b = product2a = color2; product1a = product2b = INTERPOLATE (color5, color6); } else if (r < 0) { product2b = product1a = color5; product1b = product2a = INTERPOLATE (color5, color6); } else { product2b = product1a = color5; product1b = product2a = color2; } } else { product2b = product1a = INTERPOLATE (color2, color6); product2b = Q_INTERPOLATE (color3, color3, color3, product2b); product1a = Q_INTERPOLATE (color5, color5, color5, product1a); product2a = product1b = INTERPOLATE (color5, color3); product2a = Q_INTERPOLATE (color2, color2, color2, product2a); product1b = Q_INTERPOLATE (color6, color6, color6, product1b); // product1a = color5; // product1b = color6; // product2a = color2; // product2b = color3; } #ifdef WORDS_BIGENDIAN product1a = (product1a << 16) | product1b; product2a = (product2a << 16) | product2b; #else product1a = product1a | (product1b << 16); product2a = product2a | (product2b << 16); #endif *((u32 *) dP) = product1a; *((u32 *) (dP + dstPitch)) = product2a; // *xP = color5; bP += inc_bP; // xP += inc_bP; dP += sizeof (u32); } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (height; height; height--) } } void SuperEagle32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dP; u32 *bP; // u32 *xP; u32 inc_bP; inc_bP = 1; u32 Nextline = srcPitch >> 2; for (; height; height--) { bP = (u32 *) srcPtr; // xP = (u32 *) deltaPtr; dP = (u32 *)dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { u32 color4, color5, color6; u32 color1, color2, color3; u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; u32 product1a, product1b, product2a, product2b; colorB1 = *(bP - Nextline); colorB2 = *(bP - Nextline + 1); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); // -------------------------------------- if (color2 == color6 && color5 != color3) { product1b = product2a = color2; if ((color1 == color2) || (color6 == colorB2)) { product1a = INTERPOLATE (color2, color5); product1a = INTERPOLATE (color2, product1a); // product1a = color2; } else { product1a = INTERPOLATE (color5, color6); } if ((color6 == colorS2) || (color2 == colorA1)) { product2b = INTERPOLATE (color2, color3); product2b = INTERPOLATE (color2, product2b); // product2b = color2; } else { product2b = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 != color6) { product2b = product1a = color5; if ((colorB1 == color5) || (color3 == colorS1)) { product1b = INTERPOLATE (color5, color6); product1b = INTERPOLATE (color5, product1b); // product1b = color5; } else { product1b = INTERPOLATE (color5, color6); } if ((color3 == colorA2) || (color4 == color5)) { product2a = INTERPOLATE (color5, color2); product2a = INTERPOLATE (color5, product2a); // product2a = color5; } else { product2a = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 == color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) { product1b = product2a = color2; product1a = product2b = INTERPOLATE (color5, color6); } else if (r < 0) { product2b = product1a = color5; product1b = product2a = INTERPOLATE (color5, color6); } else { product2b = product1a = color5; product1b = product2a = color2; } } else { product2b = product1a = INTERPOLATE (color2, color6); product2b = Q_INTERPOLATE (color3, color3, color3, product2b); product1a = Q_INTERPOLATE (color5, color5, color5, product1a); product2a = product1b = INTERPOLATE (color5, color3); product2a = Q_INTERPOLATE (color2, color2, color2, product2a); product1b = Q_INTERPOLATE (color6, color6, color6, product1b); // product1a = color5; // product1b = color6; // product2a = color2; // product2b = color3; } *(dP) = product1a; *(dP+1) = product1b; *(dP + (dstPitch >> 2)) = product2a; *(dP + (dstPitch >> 2) +1) = product2b; // *xP = color5; bP += inc_bP; // xP += inc_bP; dP += 2; } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (height; height; height--) } void _2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u8 *dP; u16 *bP; u32 inc_bP; { inc_bP = 1; u32 Nextline = srcPitch >> 1; for (; height; height--) { bP = (u16 *) srcPtr; dP = dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { register u32 colorA, colorB; u32 colorC, colorD, colorE, colorF, colorG, colorH, colorI, colorJ, colorK, colorL, colorM, colorN, colorO, colorP; u32 product, product1, product2; //--------------------------------------- // Map of the pixels: I|E F|J // G|A B|K // H|C D|L // M|N O|P colorI = *(bP - Nextline - 1); colorE = *(bP - Nextline); colorF = *(bP - Nextline + 1); colorJ = *(bP - Nextline + 2); colorG = *(bP - 1); colorA = *(bP); colorB = *(bP + 1); colorK = *(bP + 2); colorH = *(bP + Nextline - 1); colorC = *(bP + Nextline); colorD = *(bP + Nextline + 1); colorL = *(bP + Nextline + 2); colorM = *(bP + Nextline + Nextline - 1); colorN = *(bP + Nextline + Nextline); colorO = *(bP + Nextline + Nextline + 1); colorP = *(bP + Nextline + Nextline + 2); if ((colorA == colorD) && (colorB != colorC)) { if (((colorA == colorE) && (colorB == colorL)) || ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ))) { product = colorA; } else { product = INTERPOLATE (colorA, colorB); } if (((colorA == colorG) && (colorC == colorO)) || ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM))) { product1 = colorA; } else { product1 = INTERPOLATE (colorA, colorC); } product2 = colorA; } else if ((colorB == colorC) && (colorA != colorD)) { if (((colorB == colorF) && (colorA == colorH)) || ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI))) { product = colorB; } else { product = INTERPOLATE (colorA, colorB); } if (((colorC == colorH) && (colorA == colorF)) || ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI))) { product1 = colorC; } else { product1 = INTERPOLATE (colorA, colorC); } product2 = colorB; } else if ((colorA == colorD) && (colorB == colorC)) { if (colorA == colorB) { product = colorA; product1 = colorA; product2 = colorA; } else { register int r = 0; product1 = INTERPOLATE (colorA, colorC); product = INTERPOLATE (colorA, colorB); r += GetResult1 (colorA, colorB, colorG, colorE, colorI); r += GetResult2 (colorB, colorA, colorK, colorF, colorJ); r += GetResult2 (colorB, colorA, colorH, colorN, colorM); r += GetResult1 (colorA, colorB, colorL, colorO, colorP); if (r > 0) product2 = colorA; else if (r < 0) product2 = colorB; else { product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); } } } else { product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); if ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) { product = colorA; } else if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) { product = colorB; } else { product = INTERPOLATE (colorA, colorB); } if ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) { product1 = colorA; } else if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) { product1 = colorC; } else { product1 = INTERPOLATE (colorA, colorC); } } #ifdef WORDS_BIGENDIAN product = (colorA << 16) | product ; product1 = (product1 << 16) | product2 ; #else product = colorA | (product << 16); product1 = product1 | (product2 << 16); #endif *((s32 *) dP) = product; *((u32 *) (dP + dstPitch)) = product1; bP += inc_bP; dP += sizeof (u32); } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (height; height; height--) } } void _2xSaI32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) { u32 *dP; u32 *bP; u32 inc_bP = 1; u32 Nextline = srcPitch >> 2; for (; height; height--) { bP = (u32 *) srcPtr; dP = (u32 *) dstPtr; for (u32 finish = width; finish; finish -= inc_bP) { register u32 colorA, colorB; u32 colorC, colorD, colorE, colorF, colorG, colorH, colorI, colorJ, colorK, colorL, colorM, colorN, colorO, colorP; u32 product, product1, product2; //--------------------------------------- // Map of the pixels: I|E F|J // G|A B|K // H|C D|L // M|N O|P colorI = *(bP - Nextline - 1); colorE = *(bP - Nextline); colorF = *(bP - Nextline + 1); colorJ = *(bP - Nextline + 2); colorG = *(bP - 1); colorA = *(bP); colorB = *(bP + 1); colorK = *(bP + 2); colorH = *(bP + Nextline - 1); colorC = *(bP + Nextline); colorD = *(bP + Nextline + 1); colorL = *(bP + Nextline + 2); colorM = *(bP + Nextline + Nextline - 1); colorN = *(bP + Nextline + Nextline); colorO = *(bP + Nextline + Nextline + 1); colorP = *(bP + Nextline + Nextline + 2); if ((colorA == colorD) && (colorB != colorC)) { if (((colorA == colorE) && (colorB == colorL)) || ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ))) { product = colorA; } else { product = INTERPOLATE (colorA, colorB); } if (((colorA == colorG) && (colorC == colorO)) || ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM))) { product1 = colorA; } else { product1 = INTERPOLATE (colorA, colorC); } product2 = colorA; } else if ((colorB == colorC) && (colorA != colorD)) { if (((colorB == colorF) && (colorA == colorH)) || ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI))) { product = colorB; } else { product = INTERPOLATE (colorA, colorB); } if (((colorC == colorH) && (colorA == colorF)) || ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI))) { product1 = colorC; } else { product1 = INTERPOLATE (colorA, colorC); } product2 = colorB; } else if ((colorA == colorD) && (colorB == colorC)) { if (colorA == colorB) { product = colorA; product1 = colorA; product2 = colorA; } else { register int r = 0; product1 = INTERPOLATE (colorA, colorC); product = INTERPOLATE (colorA, colorB); r += GetResult1 (colorA, colorB, colorG, colorE, colorI); r += GetResult2 (colorB, colorA, colorK, colorF, colorJ); r += GetResult2 (colorB, colorA, colorH, colorN, colorM); r += GetResult1 (colorA, colorB, colorL, colorO, colorP); if (r > 0) product2 = colorA; else if (r < 0) product2 = colorB; else { product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); } } } else { product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); if ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) { product = colorA; } else if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) { product = colorB; } else { product = INTERPOLATE (colorA, colorB); } if ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) { product1 = colorA; } else if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) { product1 = colorC; } else { product1 = INTERPOLATE (colorA, colorC); } } *(dP) = colorA; *(dP + 1) = product; *(dP + (dstPitch >> 2)) = product1; *(dP + (dstPitch >> 2) + 1) = product2; bP += inc_bP; dP += 2; } // end of for ( finish= width etc..) srcPtr += srcPitch; dstPtr += dstPitch * 2; // deltaPtr += srcPitch; } // endof: for (height; height; height--) } static u32 Bilinear (u32 A, u32 B, u32 x) { unsigned long areaA, areaB; unsigned long result; if (A == B) return A; areaB = (x >> 11) & 0x1f; // reduce 16 bit fraction to 5 bits areaA = 0x20 - areaB; A = (A & redblueMask) | ((A & greenMask) << 16); B = (B & redblueMask) | ((B & greenMask) << 16); result = ((areaA * A) + (areaB * B)) >> 5; return (result & redblueMask) | ((result >> 16) & greenMask); } static u32 Bilinear4 (u32 A, u32 B, u32 C, u32 D, u32 x, u32 y) { unsigned long areaA, areaB, areaC, areaD; unsigned long result, xy; x = (x >> 11) & 0x1f; y = (y >> 11) & 0x1f; xy = (x * y) >> 5; A = (A & redblueMask) | ((A & greenMask) << 16); B = (B & redblueMask) | ((B & greenMask) << 16); C = (C & redblueMask) | ((C & greenMask) << 16); D = (D & redblueMask) | ((D & greenMask) << 16); areaA = 0x20 + xy - x - y; areaB = x - xy; areaC = y - xy; areaD = xy; result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5; return (result & redblueMask) | ((result >> 16) & greenMask); } void Scale_2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, u32 dstWidth, u32 dstHeight, int width, int height) { u8 *dP; u16 *bP; u32 w; u32 h; u32 dw; u32 dh; u32 hfinish; u32 wfinish; u32 Nextline = srcPitch >> 1; wfinish = (width - 1) << 16; // convert to fixed point dw = wfinish / (dstWidth - 1); hfinish = (height - 1) << 16; // convert to fixed point dh = hfinish / (dstHeight - 1); for (h = 0; h < hfinish; h += dh) { u32 y1, y2; y1 = h & 0xffff; // fraction part of fixed point bP = (u16 *) (srcPtr + ((h >> 16) * srcPitch)); dP = dstPtr; y2 = 0x10000 - y1; w = 0; for (; w < wfinish;) { u32 A, B, C, D; u32 E, F, G, H; u32 I, J, K, L; u32 x1, x2, a1, f1, f2; u32 position, product1; position = w >> 16; A = bP[position]; // current pixel B = bP[position + 1]; // next pixel C = bP[position + Nextline]; D = bP[position + Nextline + 1]; E = bP[position - Nextline]; F = bP[position - Nextline + 1]; G = bP[position - 1]; H = bP[position + Nextline - 1]; I = bP[position + 2]; J = bP[position + Nextline + 2]; K = bP[position + Nextline + Nextline]; L = bP[position + Nextline + Nextline + 1]; x1 = w & 0xffff; // fraction part of fixed point x2 = 0x10000 - x1; /*0*/ if (A == B && C == D && A == C) product1 = A; else /*1*/ if (A == D && B != C) { f1 = (x1 >> 1) + (0x10000 >> 2); f2 = (y1 >> 1) + (0x10000 >> 2); if (y1 <= f1 && A == J && A != E) // close to B { a1 = f1 - y1; product1 = Bilinear (A, B, a1); } else if (y1 >= f1 && A == G && A != L) // close to C { a1 = y1 - f1; product1 = Bilinear (A, C, a1); } else if (x1 >= f2 && A == E && A != J) // close to B { a1 = x1 - f2; product1 = Bilinear (A, B, a1); } else if (x1 <= f2 && A == L && A != G) // close to C { a1 = f2 - x1; product1 = Bilinear (A, C, a1); } else if (y1 >= x1) // close to C { a1 = y1 - x1; product1 = Bilinear (A, C, a1); } else if (y1 <= x1) // close to B { a1 = x1 - y1; product1 = Bilinear (A, B, a1); } } else /*2*/ if (B == C && A != D) { f1 = (x1 >> 1) + (0x10000 >> 2); f2 = (y1 >> 1) + (0x10000 >> 2); if (y2 >= f1 && B == H && B != F) // close to A { a1 = y2 - f1; product1 = Bilinear (B, A, a1); } else if (y2 <= f1 && B == I && B != K) // close to D { a1 = f1 - y2; product1 = Bilinear (B, D, a1); } else if (x2 >= f2 && B == F && B != H) // close to A { a1 = x2 - f2; product1 = Bilinear (B, A, a1); } else if (x2 <= f2 && B == K && B != I) // close to D { a1 = f2 - x2; product1 = Bilinear (B, D, a1); } else if (y2 >= x1) // close to A { a1 = y2 - x1; product1 = Bilinear (B, A, a1); } else if (y2 <= x1) // close to D { a1 = x1 - y2; product1 = Bilinear (B, D, a1); } } /*3*/ else { product1 = Bilinear4 (A, B, C, D, x1, y1); } //end First Pixel *(u32 *) dP = product1; dP += 2; w += dw; } dstPtr += dstPitch; } } void Render2xSaI (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; _2xSaI32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2, Src.Width, Src.Height); } void RenderSuper2xSaI (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; Super2xSaI32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2, Src.Width, Src.Height); } void RenderSuperEagle (SSurface Src, SSurface Dst) { unsigned char *lpSrc, *lpDst; lpSrc = Src.Surface; lpDst = Dst.Surface; SuperEagle32 (lpSrc, Src.Pitch*2, lpSrc, lpDst, Dst.Pitch*2, Src.Width, Src.Height); } desmume-0.9.9/src/filter/hq4x.h0000644000175000017500000000354012140261622017031 0ustar guillaumeguillaume/* * This file is part of the Advance project. * * Copyright (C) 2003, 2004, 2008 Andrea Mazzoleni * * 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #ifndef __HQ4X_H #define __HQ4X_H #include "segment.h" void hq4x_16_def(interp_uint16* dst0, interp_uint16* dst1, interp_uint16* dst2, interp_uint16* dst3, const interp_uint16* src0, const interp_uint16* src1, const interp_uint16* src2, unsigned count, unsigned flag); void hq4x_32_def(interp_uint32* dst0, interp_uint32* dst1, interp_uint32* dst2, interp_uint32* dst3, const interp_uint32* src0, const interp_uint32* src1, const interp_uint32* src2, unsigned count, unsigned flag); #endif desmume-0.9.9/src/FIFO.cpp0000644000175000017500000002144312140261633015742 0ustar guillaumeguillaume/* Copyright 2006 yopyop Copyright 2007 shash Copyright 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "FIFO.h" #include #include "armcpu.h" #include "debug.h" #include "mem.h" #include "MMU.h" #include "NDSSystem.h" #include "gfx3d.h" // ========================================================= IPC FIFO IPC_FIFO ipc_fifo[2]; void IPC_FIFOinit(u8 proc) { memset(&ipc_fifo[proc], 0, sizeof(IPC_FIFO)); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, 0x00000101); } void IPC_FIFOsend(u8 proc, u32 val) { u16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184); if (!(cnt_l & IPCFIFOCNT_FIFOENABLE)) return; // FIFO disabled u8 proc_remote = proc ^ 1; if (ipc_fifo[proc].size > 15) { cnt_l |= IPCFIFOCNT_FIFOERROR; T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); return; } u16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc_remote][0x40], 0x184); //LOG("IPC%s send FIFO 0x%08X size %03i (l 0x%X, tail %02i) (r 0x%X, tail %02i)\n", // proc?"7":"9", val, ipc_fifo[proc].size, cnt_l, ipc_fifo[proc].tail, cnt_r, ipc_fifo[proc^1].tail); cnt_l &= 0xBFFC; // clear send empty bit & full cnt_r &= 0xBCFF; // set recv empty bit & full ipc_fifo[proc].buf[ipc_fifo[proc].tail] = val; ipc_fifo[proc].tail++; ipc_fifo[proc].size++; if (ipc_fifo[proc].tail > 15) ipc_fifo[proc].tail = 0; if (ipc_fifo[proc].size > 15) { cnt_l |= IPCFIFOCNT_SENDFULL; // set send full bit cnt_r |= IPCFIFOCNT_RECVFULL; // set recv full bit } T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); T1WriteWord(MMU.MMU_MEM[proc_remote][0x40], 0x184, cnt_r); if(cnt_r&IPCFIFOCNT_RECVIRQEN) NDS_makeIrq(proc_remote, IRQ_BIT_IPCFIFO_RECVNONEMPTY); NDS_Reschedule(); } u32 IPC_FIFOrecv(u8 proc) { u16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184); if (!(cnt_l & IPCFIFOCNT_FIFOENABLE)) return (0); // FIFO disabled u8 proc_remote = proc ^ 1; u32 val = 0; if ( ipc_fifo[proc_remote].size == 0 ) // remote FIFO error { cnt_l |= IPCFIFOCNT_FIFOERROR; T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); return (0); } u16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc_remote][0x40], 0x184); cnt_l &= 0xBCFF; // clear send full bit & empty cnt_r &= 0xBFFC; // set recv full bit & empty val = ipc_fifo[proc_remote].buf[ipc_fifo[proc_remote].head]; ipc_fifo[proc_remote].head++; ipc_fifo[proc_remote].size--; if (ipc_fifo[proc_remote].head > 15) ipc_fifo[proc_remote].head = 0; //LOG("IPC%s recv FIFO 0x%08X size %03i (l 0x%X, tail %02i) (r 0x%X, tail %02i)\n", // proc?"7":"9", val, ipc_fifo[proc].size, cnt_l, ipc_fifo[proc].tail, cnt_r, ipc_fifo[proc^1].tail); if ( ipc_fifo[proc_remote].size == 0 ) // FIFO empty { cnt_l |= IPCFIFOCNT_RECVEMPTY; cnt_r |= IPCFIFOCNT_SENDEMPTY; if(cnt_r&IPCFIFOCNT_SENDIRQEN) NDS_makeIrq(proc_remote, IRQ_BIT_IPCFIFO_SENDEMPTY); } T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); T1WriteWord(MMU.MMU_MEM[proc_remote][0x40], 0x184, cnt_r); NDS_Reschedule(); return (val); } void IPC_FIFOcnt(u8 proc, u16 val) { u16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184); u16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc^1][0x40], 0x184); if (val & IPCFIFOCNT_FIFOERROR) { //at least SPP uses this, maybe every retail game cnt_l &= ~IPCFIFOCNT_FIFOERROR; } if (val & IPCFIFOCNT_SENDCLEAR) { ipc_fifo[proc].head = 0; ipc_fifo[proc].tail = 0; ipc_fifo[proc].size = 0; cnt_l |= IPCFIFOCNT_SENDEMPTY; cnt_r |= IPCFIFOCNT_RECVEMPTY; cnt_l &= ~IPCFIFOCNT_SENDFULL; cnt_r &= ~IPCFIFOCNT_RECVFULL; } cnt_l &= ~IPCFIFOCNT_WRITEABLE; cnt_l |= val & IPCFIFOCNT_WRITEABLE; //IPCFIFOCNT_SENDIRQEN may have been set (and/or the fifo may have been cleared) so we may need to trigger this irq //(this approach is used by libnds fifo system on occasion in fifoInternalSend, and began happening frequently for value32 with r4326) if(cnt_l&IPCFIFOCNT_SENDIRQEN) if(cnt_l & IPCFIFOCNT_SENDEMPTY) NDS_makeIrq(proc, IRQ_BIT_IPCFIFO_SENDEMPTY); //IPCFIFOCNT_RECVIRQEN may have been set so we may need to trigger this irq if(cnt_l&IPCFIFOCNT_RECVIRQEN) if(!(cnt_l & IPCFIFOCNT_RECVEMPTY)) NDS_makeIrq(proc, IRQ_BIT_IPCFIFO_RECVNONEMPTY); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); T1WriteWord(MMU.MMU_MEM[proc^1][0x40], 0x184, cnt_r); NDS_Reschedule(); } // ========================================================= GFX FIFO GFX_PIPE gxPIPE; GFX_FIFO gxFIFO; void GFX_PIPEclear() { gxPIPE.head = 0; gxPIPE.tail = 0; gxPIPE.size = 0; gxFIFO.matrix_stack_op_size = 0; } void GFX_FIFOclear() { gxFIFO.head = 0; gxFIFO.tail = 0; gxFIFO.size = 0; gxFIFO.matrix_stack_op_size = 0; } static void GXF_FIFO_handleEvents() { bool low = gxFIFO.size <= 127; bool lowchange = MMU_new.gxstat.fifo_low ^ low; MMU_new.gxstat.fifo_low = low; if(low) triggerDma(EDMAMode_GXFifo); bool empty = gxFIFO.size == 0; bool emptychange = MMU_new.gxstat.fifo_empty ^ empty; MMU_new.gxstat.fifo_empty = empty; MMU_new.gxstat.sb = gxFIFO.matrix_stack_op_size != 0; if(emptychange||lowchange) NDS_Reschedule(); } static bool IsMatrixStackCommand(u8 cmd) { return cmd == 0x11 || cmd == 0x12; } void GFX_FIFOsend(u8 cmd, u32 param) { //INFO("gxFIFO: send 0x%02X = 0x%08X (size %03i/0x%02X) gxstat 0x%08X\n", cmd, param, gxFIFO.size, gxFIFO.size, gxstat); //printf("fifo recv: %02X: %08X upto:%d\n",cmd,param,gxFIFO.size+1); //TODO - WOAH ! NOT HANDLING A TOO-BIG FIFO RIGHT NOW! //if (gxFIFO.size > 255) //{ // GXF_FIFO_handleEvents(); // //NEED TO HANDLE THIS!!!!!!!!!!!!!!!!!!!!!!!!!! // //gxstat |= 0x08000000; // busy // NDS_RescheduleGXFIFO(1); // //INFO("ERROR: gxFIFO is full (cmd 0x%02X = 0x%08X) (prev cmd 0x%02X = 0x%08X)\n", cmd, param, gxFIFO.cmd[255], gxFIFO.param[255]); // return; //} gxFIFO.cmd[gxFIFO.tail] = cmd; gxFIFO.param[gxFIFO.tail] = param; gxFIFO.tail++; gxFIFO.size++; if (gxFIFO.tail > HACK_GXIFO_SIZE-1) gxFIFO.tail = 0; //if a matrix op is entering the pipeline, do accounting for it //(this is tested by wild west, which will jam a few ops in the fifo and then wait for the matrix stack to be //un-busy so it can read back the current matrix stack position). //it is definitely only pushes and pops which set this flag. //seems like it would be less work in the HW to make a counter than do cmps on all the command bytes, so maybe we're even doing it right. if(IsMatrixStackCommand(cmd)) gxFIFO.matrix_stack_op_size++; if(gxFIFO.size>=HACK_GXIFO_SIZE) { printf("--FIFO FULL-- : %d\n",gxFIFO.size); } //gxstat |= 0x08000000; // set busy flag GXF_FIFO_handleEvents(); NDS_RescheduleGXFIFO(1); } // this function used ONLY in gxFIFO BOOL GFX_PIPErecv(u8 *cmd, u32 *param) { //gxstat &= 0xF7FFFFFF; // clear busy flag if (gxFIFO.size == 0) { GXF_FIFO_handleEvents(); return FALSE; } *cmd = gxFIFO.cmd[gxFIFO.head]; *param = gxFIFO.param[gxFIFO.head]; //see the associated increment in another function if(IsMatrixStackCommand(*cmd)) { gxFIFO.matrix_stack_op_size--; if(gxFIFO.matrix_stack_op_size>0x10000000) printf("bad news disaster in matrix_stack_op_size\n"); } gxFIFO.head++; gxFIFO.size--; if (gxFIFO.head > HACK_GXIFO_SIZE-1) gxFIFO.head = 0; GXF_FIFO_handleEvents(); return (TRUE); } void GFX_FIFOcnt(u32 val) { ////INFO("gxFIFO: write cnt 0x%08X (prev 0x%08X) FIFO size %03i PIPE size %03i\n", val, gxstat, gxFIFO.size, gxPIPE.size); if (val & (1<<29)) // clear? (only in homebrew?) { GFX_PIPEclear(); GFX_FIFOclear(); return; } //zeromus says: what happened to clear stack? //if (val & (1<<15)) // projection stack pointer reset //{ // gfx3d_ClearStack(); // val &= 0xFFFF5FFF; // clear reset (bit15) & stack level (bit13) //} T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600, val); } // ========================================================= DISP FIFO DISP_FIFO disp_fifo; void DISP_FIFOinit() { memset(&disp_fifo, 0, sizeof(DISP_FIFO)); } void DISP_FIFOsend(u32 val) { //INFO("DISP_FIFO send value 0x%08X (head 0x%06X, tail 0x%06X)\n", val, disp_fifo.head, disp_fifo.tail); disp_fifo.buf[disp_fifo.tail] = val; disp_fifo.tail++; if (disp_fifo.tail > 0x5FFF) disp_fifo.tail = 0; } u32 DISP_FIFOrecv() { //if (disp_fifo.tail == disp_fifo.head) return (0); // FIFO is empty u32 val = disp_fifo.buf[disp_fifo.head]; disp_fifo.head++; if (disp_fifo.head > 0x5FFF) disp_fifo.head = 0; return (val); } desmume-0.9.9/src/GPU.h0000644000175000017500000006362012140261633015322 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 Theo Berkau Copyright (C) 2007 shash Copyright (C) 2009-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef GPU_H #define GPU_H #include #include "mem.h" #include "common.h" #include "registers.h" #include "FIFO.h" #include "MMU.h" #include //#undef FORCEINLINE //#define FORCEINLINE void gpu_savestate(EMUFILE* os); bool gpu_loadstate(EMUFILE* is, int size); /******************************************************************************* this structure is for display control, it holds flags for general display *******************************************************************************/ #ifdef WORDS_BIGENDIAN struct _DISPCNT { /* 7*/ u8 ForceBlank:1; // A+B: /* 6*/ u8 OBJ_BMP_mapping:1; // A+B: 0=2D (128KB), 1=1D (128..256KB) /* 5*/ u8 OBJ_BMP_2D_dim:1; // A+B: 0=128x512, 1=256x256 pixels /* 4*/ u8 OBJ_Tile_mapping:1;// A+B: 0=2D (32KB), 1=1D (32..256KB) /* 3*/ u8 BG0_3D:1; // A : 0=2D, 1=3D /* 0*/ u8 BG_Mode:3; // A+B: /*15*/ u8 WinOBJ_Enable:1; // A+B: 0=disable, 1=Enable /*14*/ u8 Win1_Enable:1; // A+B: 0=disable, 1=Enable /*13*/ u8 Win0_Enable:1; // A+B: 0=disable, 1=Enable /*12*/ u8 OBJ_Enable:1; // A+B: 0=disable, 1=Enable /*11*/ u8 BG3_Enable:1; // A+B: 0=disable, 1=Enable /*10*/ u8 BG2_Enable:1; // A+B: 0=disable, 1=Enable /* 9*/ u8 BG1_Enable:1; // A+B: 0=disable, 1=Enable /* 8*/ u8 BG0_Enable:1; // A+B: 0=disable, 1=Enable /*23*/ u8 OBJ_HBlank_process:1; // A+B: OBJ processed during HBlank (GBA bit5) /*22*/ u8 OBJ_BMP_1D_Bound:1; // A : /*20*/ u8 OBJ_Tile_1D_Bound:2; // A+B: /*18*/ u8 VRAM_Block:2; // A : VRAM block (0..3=A..D) /*16*/ u8 DisplayMode:2; // A+B: coreA(0..3) coreB(0..1) GBA(Green Swap) // 0=off (white screen) // 1=on (normal BG & OBJ layers) // 2=VRAM display (coreA only) // 3=RAM display (coreA only, DMA transfers) /*31*/ u8 ExOBJPalette_Enable:1; // A+B: 0=disable, 1=Enable OBJ extended Palette /*30*/ u8 ExBGxPalette_Enable:1; // A+B: 0=disable, 1=Enable BG extended Palette /*27*/ u8 ScreenBase_Block:3; // A : Screen Base (64K step) /*24*/ u8 CharacBase_Block:3; // A : Character Base (64K step) }; #else struct _DISPCNT { /* 0*/ u8 BG_Mode:3; // A+B: /* 3*/ u8 BG0_3D:1; // A : 0=2D, 1=3D /* 4*/ u8 OBJ_Tile_mapping:1; // A+B: 0=2D (32KB), 1=1D (32..256KB) /* 5*/ u8 OBJ_BMP_2D_dim:1; // A+B: 0=128x512, 1=256x256 pixels /* 6*/ u8 OBJ_BMP_mapping:1; // A+B: 0=2D (128KB), 1=1D (128..256KB) // 7-15 same as GBA /* 7*/ u8 ForceBlank:1; // A+B: /* 8*/ u8 BG0_Enable:1; // A+B: 0=disable, 1=Enable /* 9*/ u8 BG1_Enable:1; // A+B: 0=disable, 1=Enable /*10*/ u8 BG2_Enable:1; // A+B: 0=disable, 1=Enable /*11*/ u8 BG3_Enable:1; // A+B: 0=disable, 1=Enable /*12*/ u8 OBJ_Enable:1; // A+B: 0=disable, 1=Enable /*13*/ u8 Win0_Enable:1; // A+B: 0=disable, 1=Enable /*14*/ u8 Win1_Enable:1; // A+B: 0=disable, 1=Enable /*15*/ u8 WinOBJ_Enable:1; // A+B: 0=disable, 1=Enable /*16*/ u8 DisplayMode:2; // A+B: coreA(0..3) coreB(0..1) GBA(Green Swap) // 0=off (white screen) // 1=on (normal BG & OBJ layers) // 2=VRAM display (coreA only) // 3=RAM display (coreA only, DMA transfers) /*18*/ u8 VRAM_Block:2; // A : VRAM block (0..3=A..D) /*20*/ u8 OBJ_Tile_1D_Bound:2; // A+B: /*22*/ u8 OBJ_BMP_1D_Bound:1; // A : /*23*/ u8 OBJ_HBlank_process:1; // A+B: OBJ processed during HBlank (GBA bit5) /*24*/ u8 CharacBase_Block:3; // A : Character Base (64K step) /*27*/ u8 ScreenBase_Block:3; // A : Screen Base (64K step) /*30*/ u8 ExBGxPalette_Enable:1; // A+B: 0=disable, 1=Enable BG extended Palette /*31*/ u8 ExOBJPalette_Enable:1; // A+B: 0=disable, 1=Enable OBJ extended Palette }; #endif typedef union { struct _DISPCNT bits; u32 val; } DISPCNT; #define BGxENABLED(cnt,num) ((num<8)? ((cnt.val>>8) & num):0) enum BlendFunc { NoBlend, Blend, Increase, Decrease }; /******************************************************************************* this structure is for display control of a specific layer, there are 4 background layers their priority indicate which one to draw on top of the other some flags indicate special drawing mode, size, FX *******************************************************************************/ #ifdef WORDS_BIGENDIAN struct _BGxCNT { /* 7*/ u8 Palette_256:1; // 0=16x16, 1=1*256 palette /* 6*/ u8 Mosaic_Enable:1; // 0=disable, 1=Enable mosaic /* 2*/ u8 CharacBase_Block:4; // individual character base offset (n*16KB) /* 0*/ u8 Priority:2; // 0..3=high..low /*14*/ u8 ScreenSize:2; // text : 256x256 512x256 256x512 512x512 // x/rot/s : 128x128 256x256 512x512 1024x1024 // bmp : 128x128 256x256 512x256 512x512 // large : 512x1024 1024x512 - - /*13*/ u8 PaletteSet_Wrap:1; // BG0 extended palette set 0=set0, 1=set2 // BG1 extended palette set 0=set1, 1=set3 // BG2 overflow area wraparound 0=off, 1=wrap // BG3 overflow area wraparound 0=off, 1=wrap /* 8*/ u8 ScreenBase_Block:5; // individual screen base offset (text n*2KB, BMP n*16KB) }; #else struct _BGxCNT { /* 0*/ u8 Priority:2; // 0..3=high..low /* 2*/ u8 CharacBase_Block:4; // individual character base offset (n*16KB) /* 6*/ u8 Mosaic_Enable:1; // 0=disable, 1=Enable mosaic /* 7*/ u8 Palette_256:1; // 0=16x16, 1=1*256 palette /* 8*/ u8 ScreenBase_Block:5; // individual screen base offset (text n*2KB, BMP n*16KB) /*13*/ u8 PaletteSet_Wrap:1; // BG0 extended palette set 0=set0, 1=set2 // BG1 extended palette set 0=set1, 1=set3 // BG2 overflow area wraparound 0=off, 1=wrap // BG3 overflow area wraparound 0=off, 1=wrap /*14*/ u8 ScreenSize:2; // text : 256x256 512x256 256x512 512x512 // x/rot/s : 128x128 256x256 512x512 1024x1024 // bmp : 128x128 256x256 512x256 512x512 // large : 512x1024 1024x512 - - }; #endif typedef union { struct _BGxCNT bits; u16 val; } BGxCNT; /******************************************************************************* this structure is for background offset *******************************************************************************/ typedef struct { u16 BGxHOFS; u16 BGxVOFS; } BGxOFS; /******************************************************************************* this structure is for rotoscale parameters *******************************************************************************/ typedef struct { s16 BGxPA; s16 BGxPB; s16 BGxPC; s16 BGxPD; s32 BGxX; s32 BGxY; } BGxPARMS; /******************************************************************************* these structures are for window description, windows are square regions and can "subclass" background layers or object layers (i.e window controls the layers) screen | +-- Window0/Window1/OBJwindow/OutOfWindows | +-- BG0/BG1/BG2/BG3/OBJ *******************************************************************************/ typedef union { struct { u8 end:8; u8 start:8; } bits ; u16 val; } WINxDIM; #ifdef WORDS_BIGENDIAN typedef struct { /* 6*/ u8 :2; /* 5*/ u8 WINx_Effect_Enable:1; /* 4*/ u8 WINx_OBJ_Enable:1; /* 3*/ u8 WINx_BG3_Enable:1; /* 2*/ u8 WINx_BG2_Enable:1; /* 1*/ u8 WINx_BG1_Enable:1; /* 0*/ u8 WINx_BG0_Enable:1; } WINxBIT; #else typedef struct { /* 0*/ u8 WINx_BG0_Enable:1; /* 1*/ u8 WINx_BG1_Enable:1; /* 2*/ u8 WINx_BG2_Enable:1; /* 3*/ u8 WINx_BG3_Enable:1; /* 4*/ u8 WINx_OBJ_Enable:1; /* 5*/ u8 WINx_Effect_Enable:1; /* 6*/ u8 :2; } WINxBIT; #endif #ifdef WORDS_BIGENDIAN typedef union { struct { WINxBIT win0; WINxBIT win1; } bits; struct { u8 :3; u8 win0_en:5; u8 :3; u8 win1_en:5; } packed_bits; struct { u8 low; u8 high; } bytes; u16 val ; } WINxCNT ; #else typedef union { struct { WINxBIT win0; WINxBIT win1; } bits; struct { u8 win0_en:5; u8 :3; u8 win1_en:5; u8 :3; } packed_bits; struct { u8 low; u8 high; } bytes; u16 val ; } WINxCNT ; #endif /* typedef struct { WINxDIM WIN0H; WINxDIM WIN1H; WINxDIM WIN0V; WINxDIM WIN1V; WINxCNT WININ; WINxCNT WINOUT; } WINCNT; */ /******************************************************************************* this structure is for miscellanous settings //TODO: needs further description *******************************************************************************/ typedef struct { u16 MOSAIC; u16 unused1; u16 unused2;//BLDCNT; u16 unused3;//BLDALPHA; u16 unused4;//BLDY; u16 unused5; /* u16 unused6; u16 unused7; u16 unused8; u16 unused9; */ } MISCCNT; /******************************************************************************* this structure is for 3D settings *******************************************************************************/ struct _DISP3DCNT { /* 0*/ u8 EnableTexMapping:1; // /* 1*/ u8 PolygonShading:1; // 0=Toon Shading, 1=Highlight Shading /* 2*/ u8 EnableAlphaTest:1; // see ALPHA_TEST_REF /* 3*/ u8 EnableAlphaBlending:1; // see various Alpha values /* 4*/ u8 EnableAntiAliasing:1; // /* 5*/ u8 EnableEdgeMarking:1; // see EDGE_COLOR /* 6*/ u8 FogOnlyAlpha:1; // 0=Alpha and Color, 1=Only Alpha (see FOG_COLOR) /* 7*/ u8 EnableFog:1; // Fog Master Enable /* 8*/ u8 FogShiftSHR:4; // 0..10 SHR-Divider (see FOG_OFFSET) /*12*/ u8 AckColorBufferUnderflow:1; // Color Buffer RDLINES Underflow (0=None, 1=Underflow/Acknowledge) /*13*/ u8 AckVertexRAMOverflow:1; // Polygon/Vertex RAM Overflow (0=None, 1=Overflow/Acknowledge) /*14*/ u8 RearPlaneMode:1; // 0=Blank, 1=Bitmap /*15*/ u8 :1; /*16*/ u16 :16; }; typedef union { struct _DISP3DCNT bits; u32 val; } DISP3DCNT; /******************************************************************************* this structure is for capture control (core A only) source: http://nocash.emubase.de/gbatek.htm#dsvideocaptureandmainmemorydisplaymode *******************************************************************************/ struct DISPCAPCNT { enum CAPX { _128, _256 } capx; u32 val; BOOL enabled; u8 EVA; u8 EVB; u8 writeBlock; u8 writeOffset; u16 capy; u8 srcA; u8 srcB; u8 readBlock; u8 readOffset; u8 capSrc; } ; /******************************************************************************* this structure holds everything and should be mapped to * core A : 0x04000000 * core B : 0x04001000 *******************************************************************************/ typedef struct _reg_dispx { DISPCNT dispx_DISPCNT; // 0x0400x000 u16 dispA_DISPSTAT; // 0x04000004 u16 dispx_VCOUNT; // 0x0400x006 BGxCNT dispx_BGxCNT[4]; // 0x0400x008 BGxOFS dispx_BGxOFS[4]; // 0x0400x010 BGxPARMS dispx_BG2PARMS; // 0x0400x020 BGxPARMS dispx_BG3PARMS; // 0x0400x030 u8 filler[12]; // 0x0400x040 MISCCNT dispx_MISC; // 0x0400x04C DISP3DCNT dispA_DISP3DCNT; // 0x04000060 DISPCAPCNT dispA_DISPCAPCNT; // 0x04000064 u32 dispA_DISPMMEMFIFO; // 0x04000068 } REG_DISPx ; typedef BOOL (*fun_gl_Begin) (int screen); typedef void (*fun_gl_End) (int screen); // the GUI should use this function prior to all gl calls // if call to beg succeeds opengl draw void register_gl_fun(fun_gl_Begin beg,fun_gl_End end); #define GPU_MAIN 0 #define GPU_SUB 1 /* human readable bitmask names */ #define ADDRESS_STEP_512B 0x00200 #define ADDRESS_STEP_1KB 0x00400 #define ADDRESS_STEP_2KB 0x00800 #define ADDRESS_STEP_4KB 0x01000 #define ADDRESS_STEP_8KB 0x02000 #define ADDRESS_STEP_16KB 0x04000 #define ADDRESS_STEP_32KB 0x08000 #define ADDRESS_STEP_64KB 0x10000 #define ADDRESS_STEP_128KB 0x20000 #define ADDRESS_STEP_256KB 0x40000 #define ADDRESS_STEP_512KB 0x80000 #define ADDRESS_MASK_256KB (ADDRESS_STEP_256KB-1) #ifdef WORDS_BIGENDIAN struct _TILEENTRY { /*14*/ unsigned Palette:4; /*13*/ unsigned VFlip:1; // VERTICAL FLIP (top<-->bottom) /*12*/ unsigned HFlip:1; // HORIZONTAL FLIP (left<-->right) /* 0*/ unsigned TileNum:10; }; #else struct _TILEENTRY { /* 0*/ unsigned TileNum:10; /*12*/ unsigned HFlip:1; // HORIZONTAL FLIP (left<-->right) /*13*/ unsigned VFlip:1; // VERTICAL FLIP (top<-->bottom) /*14*/ unsigned Palette:4; }; #endif typedef union { struct _TILEENTRY bits; u16 val; } TILEENTRY; struct _ROTOCOORD { u32 Fraction:8; s32 Integer:20; u32 pad:4; }; typedef union { struct _ROTOCOORD bits; s32 val; } ROTOCOORD; /* this structure is for color representation, it holds 5 meaningful bits per color channel (red,green,blue) and 1 meaningful bit for alpha representation this bit can be unused or used for special FX */ struct _COLOR { // abgr x555 #ifdef WORDS_BIGENDIAN unsigned alpha:1; // sometimes it is unused (pad) unsigned blue:5; unsigned green:5; unsigned red:5; #else unsigned red:5; unsigned green:5; unsigned blue:5; unsigned alpha:1; // sometimes it is unused (pad) #endif }; struct _COLORx { // abgr x555 unsigned bgr:15; unsigned alpha:1; // sometimes it is unused (pad) }; typedef union { struct _COLOR bits; struct _COLORx bitx; u16 val; } COLOR; struct _COLOR32 { // ARGB unsigned :3; unsigned blue:5; unsigned :3; unsigned green:5; unsigned :3; unsigned red:5; unsigned :7; unsigned alpha:1; // sometimes it is unused (pad) }; typedef union { struct _COLOR32 bits; u32 val; } COLOR32; #define COLOR_16_32(w,i) \ /* doesnt matter who's 16bit who's 32bit */ \ i.bits.red = w.bits.red; \ i.bits.green = w.bits.green; \ i.bits.blue = w.bits.blue; \ i.bits.alpha = w.bits.alpha; // (00: Normal, 01: Transparent, 10: Object window, 11: Bitmap) enum GPU_OBJ_MODE { GPU_OBJ_MODE_Normal = 0, GPU_OBJ_MODE_Transparent = 1, GPU_OBJ_MODE_Window = 2, GPU_OBJ_MODE_Bitmap = 3 }; struct _OAM_ { //attr0 u8 Y; u8 RotScale; u8 Mode; u8 Mosaic; u8 Depth; u8 Shape; //att1 s16 X; u8 RotScalIndex; u8 HFlip, VFlip; u8 Size; //attr2 u16 TileIndex; u8 Priority; u8 PaletteIndex; //attr3 u16 attr3; }; void SlurpOAM(_OAM_* oam_output, void* oam_buffer, int oam_index); u16 SlurpOAMAffineParam(void* oam_buffer, int oam_index); typedef struct { s16 x; s16 y; } size; #define NB_PRIORITIES 4 #define NB_BG 4 //this structure holds information for rendering. typedef struct { u8 PixelsX[256]; u8 BGs[NB_BG], nbBGs; u8 pad[1]; u16 nbPixelsX; //256+8: u8 pad2[248]; //things were slower when i organized this struct this way. whatever. //u8 PixelsX[256]; //int BGs[NB_BG], nbBGs; //int nbPixelsX; ////<-- 256 + 24 //u8 pad2[256-24]; } itemsForPriority_t; #define MMU_ABG 0x06000000 #define MMU_BBG 0x06200000 #define MMU_AOBJ 0x06400000 #define MMU_BOBJ 0x06600000 #define MMU_LCDC 0x06800000 extern CACHE_ALIGN u8 gpuBlendTable555[17][17][32][32]; enum BGType { BGType_Invalid=0, BGType_Text=1, BGType_Affine=2, BGType_Large8bpp=3, BGType_AffineExt=4, BGType_AffineExt_256x16=5, BGType_AffineExt_256x1=6, BGType_AffineExt_Direct=7 }; extern const BGType GPU_mode2type[8][4]; struct GPU { GPU() : debug(false) {} // some structs are becoming redundant // some functions too (no need to recopy some vars as it is done by MMU) REG_DISPx * dispx_st; //this indicates whether this gpu is handling debug tools bool debug; _BGxCNT & bgcnt(int num) { return (dispx_st)->dispx_BGxCNT[num].bits; } _DISPCNT & dispCnt() { return dispx_st->dispx_DISPCNT.bits; } template void modeRender(int layer); DISPCAPCNT dispCapCnt; BOOL LayersEnable[5]; itemsForPriority_t itemsForPriority[NB_PRIORITIES]; #define BGBmpBB BG_bmp_ram #define BGChBB BG_tile_ram u32 BG_bmp_large_ram[4]; u32 BG_bmp_ram[4]; u32 BG_tile_ram[4]; u32 BG_map_ram[4]; u8 BGExtPalSlot[4]; u32 BGSize[4][2]; BGType BGTypes[4]; struct MosaicColor { u16 bg[4][256]; struct Obj { u16 color; u8 alpha, opaque; } obj[256]; } mosaicColors; u8 sprNum[256]; u8 h_win[2][256]; const u8 *curr_win[2]; void update_winh(int WIN_NUM); bool need_update_winh[2]; template void setup_windows(); u8 core; u8 dispMode; u8 vramBlock; u8 *VRAMaddr; //FIFO fifo; u8 bgPrio[5]; BOOL bg0HasHighestPrio; void * oam; u32 sprMem; u8 sprBoundary; u8 sprBMPBoundary; u8 sprBMPMode; u32 sprEnable; u8 WIN0H0; u8 WIN0H1; u8 WIN0V0; u8 WIN0V1; u8 WIN1H0; u8 WIN1H1; u8 WIN1V0; u8 WIN1V1; u8 WININ0; bool WININ0_SPECIAL; u8 WININ1; bool WININ1_SPECIAL; u8 WINOUT; bool WINOUT_SPECIAL; u8 WINOBJ; bool WINOBJ_SPECIAL; u8 WIN0_ENABLED; u8 WIN1_ENABLED; u8 WINOBJ_ENABLED; u16 BLDCNT; u8 BLDALPHA_EVA; u8 BLDALPHA_EVB; u8 BLDY_EVY; u16 *currentFadeInColors, *currentFadeOutColors; bool blend2[8]; CACHE_ALIGN u16 tempScanlineBuffer[256]; u8 *tempScanline; u8 MasterBrightMode; u32 MasterBrightFactor; CACHE_ALIGN u8 bgPixels[1024]; //yes indeed, this is oversized. map debug tools try to write to it u32 currLine; u8 currBgNum; bool blend1; u8* currDst; u8* _3dColorLine; static struct MosaicLookup { struct TableEntry { u8 begin, trunc; } table[16][256]; MosaicLookup() { for(int m=0;m<16;m++) for(int i=0;i<256;i++) { int mosaic = m+1; TableEntry &te = table[m][i]; te.begin = (i%mosaic==0); te.trunc = i/mosaic*mosaic; } } TableEntry *width, *height; int widthValue, heightValue; } mosaicLookup; bool curr_mosaic_enabled; u16 blend(u16 colA, u16 colB); template FORCEINLINE FASTCALL bool _master_setFinalBGColor(u16 &color, const u32 x); template FORCEINLINE FASTCALL void _master_setFinal3dColor(int dstX, int srcX); int setFinalColorBck_funcNum; int bgFunc; int setFinalColor3d_funcNum; int setFinalColorSpr_funcNum; //Final3DColFunct setFinalColor3D; enum SpriteRenderMode { SPRITE_1D, SPRITE_2D } spriteRenderMode; template void _spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); inline void spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab) { if(spriteRenderMode == SPRITE_1D) _spriteRender(dst,dst_alpha,typeTab, prioTab); else _spriteRender(dst,dst_alpha,typeTab, prioTab); } void setFinalColor3d(int dstX, int srcX); template void setFinalColorBG(u16 color, const u32 x); template FORCEINLINE void __setFinalColorBck(u16 color, const u32 x, const int opaque); template FORCEINLINE void ___setFinalColorBck(u16 color, const u32 x, const int opaque); void setAffineStart(int layer, int xy, u32 val); void setAffineStartWord(int layer, int xy, u16 val, int word); u32 getAffineStart(int layer, int xy); void refreshAffineStartRegs(const int num, const int xy); struct AffineInfo { AffineInfo() : x(0), y(0) {} u32 x, y; } affineInfo[2]; void renderline_checkWindows(u16 x, bool &draw, bool &effect) const; // check whether (x,y) is within the rectangle (including wraparounds) template u8 withinRect(u16 x) const; void setBLDALPHA(u16 val) { BLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f); BLDALPHA_EVB = ((val>>8)&0x1f) > 16 ? 16 : ((val>>8)&0x1f); updateBLDALPHA(); } void setBLDALPHA_EVA(u8 val) { BLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f); updateBLDALPHA(); } void setBLDALPHA_EVB(u8 val) { BLDALPHA_EVB = (val&0x1f) > 16 ? 16 : (val&0x1f); updateBLDALPHA(); } u32 getHOFS(int bg) { return T1ReadWord(&dispx_st->dispx_BGxOFS[bg].BGxHOFS,0) & 0x1FF; } u32 getVOFS(int bg) { return T1ReadWord(&dispx_st->dispx_BGxOFS[bg].BGxVOFS,0) & 0x1FF; } typedef u8 TBlendTable[32][32]; TBlendTable *blendTable; void updateBLDALPHA() { blendTable = (TBlendTable*)&gpuBlendTable555[BLDALPHA_EVA][BLDALPHA_EVB][0][0]; } }; #if 0 // normally should have same addresses static void REG_DISPx_pack_test(GPU * gpu) { REG_DISPx * r = gpu->dispx_st; printf ("%08x %02x\n", (u32)r, (u32)(&r->dispx_DISPCNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispA_DISPSTAT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_VCOUNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_BGxCNT[0]) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_BGxOFS[0]) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_BG2PARMS) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_BG3PARMS) - (u32)r); // printf ("\t%02x\n", (u32)(&r->dispx_WINCNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispx_MISC) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispA_DISP3DCNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispA_DISPCAPCNT) - (u32)r); printf ("\t%02x\n", (u32)(&r->dispA_DISPMMEMFIFO) - (u32)r); } #endif CACHE_ALIGN extern u8 GPU_screen[4*256*192]; GPU * GPU_Init(u8 l); void GPU_Reset(GPU *g, u8 l); void GPU_DeInit(GPU *); //these are functions used by debug tools which want to render layers etc outside the context of the emulation namespace GPU_EXT { void textBG(GPU * gpu, u8 num, u8 * DST); //Draw text based background void rotBG(GPU * gpu, u8 num, u8 * DST); void extRotBG(GPU * gpu, u8 num, u8 * DST); }; void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); extern const size sprSizeTab[4][4]; typedef struct { GPU * gpu; u16 offset; } NDS_Screen; extern NDS_Screen MainScreen; extern NDS_Screen SubScreen; int Screen_Init(); void Screen_Reset(void); void Screen_DeInit(void); extern MMU_struct MMU; void GPU_setVideoProp(GPU *, u32 p); void GPU_setBGProp(GPU *, u16 num, u16 p); void GPU_setBLDCNT(GPU *gpu, u16 v) ; void GPU_setBLDY(GPU *gpu, u16 v) ; void GPU_setMOSAIC(GPU *gpu, u16 v) ; void GPU_remove(GPU *, u8 num); void GPU_addBack(GPU *, u8 num); int GPU_ChangeGraphicsCore(int coreid); void GPU_set_DISPCAPCNT(u32 val) ; void GPU_RenderLine(NDS_Screen * screen, u16 l, bool skip = false) ; void GPU_setMasterBrightness (GPU *gpu, u16 val); inline void GPU_setWIN0_H(GPU* gpu, u16 val) { gpu->WIN0H0 = val >> 8; gpu->WIN0H1 = val&0xFF; gpu->need_update_winh[0] = true; } inline void GPU_setWIN0_H0(GPU* gpu, u8 val) { gpu->WIN0H0 = val; gpu->need_update_winh[0] = true; } inline void GPU_setWIN0_H1(GPU* gpu, u8 val) { gpu->WIN0H1 = val; gpu->need_update_winh[0] = true; } inline void GPU_setWIN0_V(GPU* gpu, u16 val) { gpu->WIN0V0 = val >> 8; gpu->WIN0V1 = val&0xFF;} inline void GPU_setWIN0_V0(GPU* gpu, u8 val) { gpu->WIN0V0 = val; } inline void GPU_setWIN0_V1(GPU* gpu, u8 val) { gpu->WIN0V1 = val; } inline void GPU_setWIN1_H(GPU* gpu, u16 val) {gpu->WIN1H0 = val >> 8; gpu->WIN1H1 = val&0xFF; gpu->need_update_winh[1] = true; } inline void GPU_setWIN1_H0(GPU* gpu, u8 val) { gpu->WIN1H0 = val; gpu->need_update_winh[1] = true; } inline void GPU_setWIN1_H1(GPU* gpu, u8 val) { gpu->WIN1H1 = val; gpu->need_update_winh[1] = true; } inline void GPU_setWIN1_V(GPU* gpu, u16 val) { gpu->WIN1V0 = val >> 8; gpu->WIN1V1 = val&0xFF; } inline void GPU_setWIN1_V0(GPU* gpu, u8 val) { gpu->WIN1V0 = val; } inline void GPU_setWIN1_V1(GPU* gpu, u8 val) { gpu->WIN1V1 = val; } inline void GPU_setWININ(GPU* gpu, u16 val) { gpu->WININ0=val&0x1F; gpu->WININ0_SPECIAL=((val>>5)&1)!=0; gpu->WININ1=(val>>8)&0x1F; gpu->WININ1_SPECIAL=((val>>13)&1)!=0; } inline void GPU_setWININ0(GPU* gpu, u8 val) { gpu->WININ0 = val&0x1F; gpu->WININ0_SPECIAL = (val>>5)&1; } inline void GPU_setWININ1(GPU* gpu, u8 val) { gpu->WININ1 = val&0x1F; gpu->WININ1_SPECIAL = (val>>5)&1; } inline void GPU_setWINOUT16(GPU* gpu, u16 val) { gpu->WINOUT=val&0x1F; gpu->WINOUT_SPECIAL=((val>>5)&1)!=0; gpu->WINOBJ=(val>>8)&0x1F; gpu->WINOBJ_SPECIAL=((val>>13)&1)!=0; } inline void GPU_setWINOUT(GPU* gpu, u8 val) { gpu->WINOUT = val&0x1F; gpu->WINOUT_SPECIAL = (val>>5)&1; } inline void GPU_setWINOBJ(GPU* gpu, u8 val) { gpu->WINOBJ = val&0x1F; gpu->WINOBJ_SPECIAL = (val>>5)&1; } // Blending void SetupFinalPixelBlitter (GPU *gpu); #define GPU_setBLDCNT_LOW(gpu, val) {gpu->BLDCNT = (gpu->BLDCNT&0xFF00) | (val); SetupFinalPixelBlitter (gpu);} #define GPU_setBLDCNT_HIGH(gpu, val) {gpu->BLDCNT = (gpu->BLDCNT&0xFF) | (val<<8); SetupFinalPixelBlitter (gpu);} #define GPU_setBLDCNT(gpu, val) {gpu->BLDCNT = (val); SetupFinalPixelBlitter (gpu);} #define GPU_setBLDY_EVY(gpu, val) {gpu->BLDY_EVY = ((val)&0x1f) > 16 ? 16 : ((val)&0x1f);} //these arent needed right now since the values get poked into memory via default mmu handling and dispx_st //#define GPU_setBGxHOFS(bg, gpu, val) gpu->dispx_st->dispx_BGxOFS[bg].BGxHOFS = ((val) & 0x1FF) //#define GPU_setBGxVOFS(bg, gpu, val) gpu->dispx_st->dispx_BGxOFS[bg].BGxVOFS = ((val) & 0x1FF) void gpu_SetRotateScreen(u16 angle); //#undef FORCEINLINE //#define FORCEINLINE __forceinline #endif desmume-0.9.9/src/bios.cpp0000644000175000017500000010775012140261633016161 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2008-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "cp15.h" #include #include "MMU.h" #include "debug.h" #include "NDSSystem.h" #define cpu (&ARMPROC) #define TEMPLATE template static const u16 getsinetbl[] = { 0x0000, 0x0324, 0x0648, 0x096A, 0x0C8C, 0x0FAB, 0x12C8, 0x15E2, 0x18F9, 0x1C0B, 0x1F1A, 0x2223, 0x2528, 0x2826, 0x2B1F, 0x2E11, 0x30FB, 0x33DF, 0x36BA, 0x398C, 0x3C56, 0x3F17, 0x41CE, 0x447A, 0x471C, 0x49B4, 0x4C3F, 0x4EBF, 0x5133, 0x539B, 0x55F5, 0x5842, 0x5A82, 0x5CB3, 0x5ED7, 0x60EB, 0x62F1, 0x64E8, 0x66CF, 0x68A6, 0x6A6D, 0x6C23, 0x6DC9, 0x6F5E, 0x70E2, 0x7254, 0x73B5, 0x7504, 0x7641, 0x776B, 0x7884, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE3, 0x7D89, 0x7E1D, 0x7E9C, 0x7F09, 0x7F61, 0x7FA6, 0x7FD8, 0x7FF5 }; static const u16 getpitchtbl[] = { 0x0000, 0x003B, 0x0076, 0x00B2, 0x00ED, 0x0128, 0x0164, 0x019F, 0x01DB, 0x0217, 0x0252, 0x028E, 0x02CA, 0x0305, 0x0341, 0x037D, 0x03B9, 0x03F5, 0x0431, 0x046E, 0x04AA, 0x04E6, 0x0522, 0x055F, 0x059B, 0x05D8, 0x0614, 0x0651, 0x068D, 0x06CA, 0x0707, 0x0743, 0x0780, 0x07BD, 0x07FA, 0x0837, 0x0874, 0x08B1, 0x08EF, 0x092C, 0x0969, 0x09A7, 0x09E4, 0x0A21, 0x0A5F, 0x0A9C, 0x0ADA, 0x0B18, 0x0B56, 0x0B93, 0x0BD1, 0x0C0F, 0x0C4D, 0x0C8B, 0x0CC9, 0x0D07, 0x0D45, 0x0D84, 0x0DC2, 0x0E00, 0x0E3F, 0x0E7D, 0x0EBC, 0x0EFA, 0x0F39, 0x0F78, 0x0FB6, 0x0FF5, 0x1034, 0x1073, 0x10B2, 0x10F1, 0x1130, 0x116F, 0x11AE, 0x11EE, 0x122D, 0x126C, 0x12AC, 0x12EB, 0x132B, 0x136B, 0x13AA, 0x13EA, 0x142A, 0x146A, 0x14A9, 0x14E9, 0x1529, 0x1569, 0x15AA, 0x15EA, 0x162A, 0x166A, 0x16AB, 0x16EB, 0x172C, 0x176C, 0x17AD, 0x17ED, 0x182E, 0x186F, 0x18B0, 0x18F0, 0x1931, 0x1972, 0x19B3, 0x19F5, 0x1A36, 0x1A77, 0x1AB8, 0x1AFA, 0x1B3B, 0x1B7D, 0x1BBE, 0x1C00, 0x1C41, 0x1C83, 0x1CC5, 0x1D07, 0x1D48, 0x1D8A, 0x1DCC, 0x1E0E, 0x1E51, 0x1E93, 0x1ED5, 0x1F17, 0x1F5A, 0x1F9C, 0x1FDF, 0x2021, 0x2064, 0x20A6, 0x20E9, 0x212C, 0x216F, 0x21B2, 0x21F5, 0x2238, 0x227B, 0x22BE, 0x2301, 0x2344, 0x2388, 0x23CB, 0x240E, 0x2452, 0x2496, 0x24D9, 0x251D, 0x2561, 0x25A4, 0x25E8, 0x262C, 0x2670, 0x26B4, 0x26F8, 0x273D, 0x2781, 0x27C5, 0x280A, 0x284E, 0x2892, 0x28D7, 0x291C, 0x2960, 0x29A5, 0x29EA, 0x2A2F, 0x2A74, 0x2AB9, 0x2AFE, 0x2B43, 0x2B88, 0x2BCD, 0x2C13, 0x2C58, 0x2C9D, 0x2CE3, 0x2D28, 0x2D6E, 0x2DB4, 0x2DF9, 0x2E3F, 0x2E85, 0x2ECB, 0x2F11, 0x2F57, 0x2F9D, 0x2FE3, 0x302A, 0x3070, 0x30B6, 0x30FD, 0x3143, 0x318A, 0x31D0, 0x3217, 0x325E, 0x32A5, 0x32EC, 0x3332, 0x3379, 0x33C1, 0x3408, 0x344F, 0x3496, 0x34DD, 0x3525, 0x356C, 0x35B4, 0x35FB, 0x3643, 0x368B, 0x36D3, 0x371A, 0x3762, 0x37AA, 0x37F2, 0x383A, 0x3883, 0x38CB, 0x3913, 0x395C, 0x39A4, 0x39ED, 0x3A35, 0x3A7E, 0x3AC6, 0x3B0F, 0x3B58, 0x3BA1, 0x3BEA, 0x3C33, 0x3C7C, 0x3CC5, 0x3D0E, 0x3D58, 0x3DA1, 0x3DEA, 0x3E34, 0x3E7D, 0x3EC7, 0x3F11, 0x3F5A, 0x3FA4, 0x3FEE, 0x4038, 0x4082, 0x40CC, 0x4116, 0x4161, 0x41AB, 0x41F5, 0x4240, 0x428A, 0x42D5, 0x431F, 0x436A, 0x43B5, 0x4400, 0x444B, 0x4495, 0x44E1, 0x452C, 0x4577, 0x45C2, 0x460D, 0x4659, 0x46A4, 0x46F0, 0x473B, 0x4787, 0x47D3, 0x481E, 0x486A, 0x48B6, 0x4902, 0x494E, 0x499A, 0x49E6, 0x4A33, 0x4A7F, 0x4ACB, 0x4B18, 0x4B64, 0x4BB1, 0x4BFE, 0x4C4A, 0x4C97, 0x4CE4, 0x4D31, 0x4D7E, 0x4DCB, 0x4E18, 0x4E66, 0x4EB3, 0x4F00, 0x4F4E, 0x4F9B, 0x4FE9, 0x5036, 0x5084, 0x50D2, 0x5120, 0x516E, 0x51BC, 0x520A, 0x5258, 0x52A6, 0x52F4, 0x5343, 0x5391, 0x53E0, 0x542E, 0x547D, 0x54CC, 0x551A, 0x5569, 0x55B8, 0x5607, 0x5656, 0x56A5, 0x56F4, 0x5744, 0x5793, 0x57E2, 0x5832, 0x5882, 0x58D1, 0x5921, 0x5971, 0x59C1, 0x5A10, 0x5A60, 0x5AB0, 0x5B01, 0x5B51, 0x5BA1, 0x5BF1, 0x5C42, 0x5C92, 0x5CE3, 0x5D34, 0x5D84, 0x5DD5, 0x5E26, 0x5E77, 0x5EC8, 0x5F19, 0x5F6A, 0x5FBB, 0x600D, 0x605E, 0x60B0, 0x6101, 0x6153, 0x61A4, 0x61F6, 0x6248, 0x629A, 0x62EC, 0x633E, 0x6390, 0x63E2, 0x6434, 0x6487, 0x64D9, 0x652C, 0x657E, 0x65D1, 0x6624, 0x6676, 0x66C9, 0x671C, 0x676F, 0x67C2, 0x6815, 0x6869, 0x68BC, 0x690F, 0x6963, 0x69B6, 0x6A0A, 0x6A5E, 0x6AB1, 0x6B05, 0x6B59, 0x6BAD, 0x6C01, 0x6C55, 0x6CAA, 0x6CFE, 0x6D52, 0x6DA7, 0x6DFB, 0x6E50, 0x6EA4, 0x6EF9, 0x6F4E, 0x6FA3, 0x6FF8, 0x704D, 0x70A2, 0x70F7, 0x714D, 0x71A2, 0x71F7, 0x724D, 0x72A2, 0x72F8, 0x734E, 0x73A4, 0x73FA, 0x7450, 0x74A6, 0x74FC, 0x7552, 0x75A8, 0x75FF, 0x7655, 0x76AC, 0x7702, 0x7759, 0x77B0, 0x7807, 0x785E, 0x78B4, 0x790C, 0x7963, 0x79BA, 0x7A11, 0x7A69, 0x7AC0, 0x7B18, 0x7B6F, 0x7BC7, 0x7C1F, 0x7C77, 0x7CCF, 0x7D27, 0x7D7F, 0x7DD7, 0x7E2F, 0x7E88, 0x7EE0, 0x7F38, 0x7F91, 0x7FEA, 0x8042, 0x809B, 0x80F4, 0x814D, 0x81A6, 0x81FF, 0x8259, 0x82B2, 0x830B, 0x8365, 0x83BE, 0x8418, 0x8472, 0x84CB, 0x8525, 0x857F, 0x85D9, 0x8633, 0x868E, 0x86E8, 0x8742, 0x879D, 0x87F7, 0x8852, 0x88AC, 0x8907, 0x8962, 0x89BD, 0x8A18, 0x8A73, 0x8ACE, 0x8B2A, 0x8B85, 0x8BE0, 0x8C3C, 0x8C97, 0x8CF3, 0x8D4F, 0x8DAB, 0x8E07, 0x8E63, 0x8EBF, 0x8F1B, 0x8F77, 0x8FD4, 0x9030, 0x908C, 0x90E9, 0x9146, 0x91A2, 0x91FF, 0x925C, 0x92B9, 0x9316, 0x9373, 0x93D1, 0x942E, 0x948C, 0x94E9, 0x9547, 0x95A4, 0x9602, 0x9660, 0x96BE, 0x971C, 0x977A, 0x97D8, 0x9836, 0x9895, 0x98F3, 0x9952, 0x99B0, 0x9A0F, 0x9A6E, 0x9ACD, 0x9B2C, 0x9B8B, 0x9BEA, 0x9C49, 0x9CA8, 0x9D08, 0x9D67, 0x9DC7, 0x9E26, 0x9E86, 0x9EE6, 0x9F46, 0x9FA6, 0xA006, 0xA066, 0xA0C6, 0xA127, 0xA187, 0xA1E8, 0xA248, 0xA2A9, 0xA30A, 0xA36B, 0xA3CC, 0xA42D, 0xA48E, 0xA4EF, 0xA550, 0xA5B2, 0xA613, 0xA675, 0xA6D6, 0xA738, 0xA79A, 0xA7FC, 0xA85E, 0xA8C0, 0xA922, 0xA984, 0xA9E7, 0xAA49, 0xAAAC, 0xAB0E, 0xAB71, 0xABD4, 0xAC37, 0xAC9A, 0xACFD, 0xAD60, 0xADC3, 0xAE27, 0xAE8A, 0xAEED, 0xAF51, 0xAFB5, 0xB019, 0xB07C, 0xB0E0, 0xB145, 0xB1A9, 0xB20D, 0xB271, 0xB2D6, 0xB33A, 0xB39F, 0xB403, 0xB468, 0xB4CD, 0xB532, 0xB597, 0xB5FC, 0xB662, 0xB6C7, 0xB72C, 0xB792, 0xB7F7, 0xB85D, 0xB8C3, 0xB929, 0xB98F, 0xB9F5, 0xBA5B, 0xBAC1, 0xBB28, 0xBB8E, 0xBBF5, 0xBC5B, 0xBCC2, 0xBD29, 0xBD90, 0xBDF7, 0xBE5E, 0xBEC5, 0xBF2C, 0xBF94, 0xBFFB, 0xC063, 0xC0CA, 0xC132, 0xC19A, 0xC202, 0xC26A, 0xC2D2, 0xC33A, 0xC3A2, 0xC40B, 0xC473, 0xC4DC, 0xC544, 0xC5AD, 0xC616, 0xC67F, 0xC6E8, 0xC751, 0xC7BB, 0xC824, 0xC88D, 0xC8F7, 0xC960, 0xC9CA, 0xCA34, 0xCA9E, 0xCB08, 0xCB72, 0xCBDC, 0xCC47, 0xCCB1, 0xCD1B, 0xCD86, 0xCDF1, 0xCE5B, 0xCEC6, 0xCF31, 0xCF9C, 0xD008, 0xD073, 0xD0DE, 0xD14A, 0xD1B5, 0xD221, 0xD28D, 0xD2F8, 0xD364, 0xD3D0, 0xD43D, 0xD4A9, 0xD515, 0xD582, 0xD5EE, 0xD65B, 0xD6C7, 0xD734, 0xD7A1, 0xD80E, 0xD87B, 0xD8E9, 0xD956, 0xD9C3, 0xDA31, 0xDA9E, 0xDB0C, 0xDB7A, 0xDBE8, 0xDC56, 0xDCC4, 0xDD32, 0xDDA0, 0xDE0F, 0xDE7D, 0xDEEC, 0xDF5B, 0xDFC9, 0xE038, 0xE0A7, 0xE116, 0xE186, 0xE1F5, 0xE264, 0xE2D4, 0xE343, 0xE3B3, 0xE423, 0xE493, 0xE503, 0xE573, 0xE5E3, 0xE654, 0xE6C4, 0xE735, 0xE7A5, 0xE816, 0xE887, 0xE8F8, 0xE969, 0xE9DA, 0xEA4B, 0xEABC, 0xEB2E, 0xEB9F, 0xEC11, 0xEC83, 0xECF5, 0xED66, 0xEDD9, 0xEE4B, 0xEEBD, 0xEF2F, 0xEFA2, 0xF014, 0xF087, 0xF0FA, 0xF16D, 0xF1E0, 0xF253, 0xF2C6, 0xF339, 0xF3AD, 0xF420, 0xF494, 0xF507, 0xF57B, 0xF5EF, 0xF663, 0xF6D7, 0xF74C, 0xF7C0, 0xF834, 0xF8A9, 0xF91E, 0xF992, 0xFA07, 0xFA7C, 0xFAF1, 0xFB66, 0xFBDC, 0xFC51, 0xFCC7, 0xFD3C, 0xFDB2, 0xFE28, 0xFE9E, 0xFF14, 0xFF8A }; static const u8 getvoltbl[] = { 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31, 0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B, 0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x40, 0x40, 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x70, 0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7E, 0x7F }; TEMPLATE static u32 bios_nop() { LOG("SWI: ARM%c Unimplemented BIOS function %02X was used. R0:%08X, R1:%08X, R2:%08X\n", PROCNUM?'7':'9', (cpu->instruction)&0x1F, cpu->R[0], cpu->R[1], cpu->R[2]); return 3; } TEMPLATE static u32 WaitByLoop() { u32 elapsed; //printf("%lld waitbyloop\n",nds_timer); //INFO("ARM%c: SWI 0x03 (WaitByLoop)\n", PROCNUM?'7':'9'); if (PROCNUM == ARMCPU_ARM9) { if (cp15.ctrl & ((1<<16)|(1<<18))) // DTCM or ITCM is on (cache) elapsed = cpu->R[0] * 2; else elapsed = cpu->R[0] * 8; } else elapsed = cpu->R[0] * 4; cpu->R[0] = 0; return elapsed; } TEMPLATE static u32 wait4IRQ() { cpu->waitIRQ = TRUE; cpu->halt_IE_and_IF = TRUE; return 1; } TEMPLATE static u32 intrWaitARM() { //TODO - account for differences between arm7 and arm9 (according to gbatek, the "bug doesn't work") const u32 intrFlagAdr = (PROCNUM == ARMCPU_ARM7) ? 0x380FFF8 : (cp15.DTCMRegion&0xFFFFF000)+0x3FF8; //set IME=1 //without this, no irq handlers can happen (even though IF&IE waits can happily happen) //and so no bits in the OS irq flag variable can get set by the handlers _MMU_write32(0x04000208, 1); //analyze the OS irq flag variable u32 intr = _MMU_read32(intrFlagAdr); u32 intrFlag = (cpu->R[1] & intr); //if the user requested us to discard flags, then clear the flag(s) we're going to be waiting on. //(be sure to only do this only on the first run through. use a little state machine to control that) if(cpu->intrWaitARM_state==0 && cpu->R[0]==1) { intr ^= intrFlag; _MMU_write32(intrFlagAdr, intr); //we want to make sure we wait at least once below intrFlag = 0; } cpu->intrWaitARM_state = 1; //now, if the condition is satisfied (and it won't be the first time through, no matter what, due to cares taken above) if(intrFlag) { //write back the OS irq flags with the ones we were waiting for cleared intr ^= intrFlag; _MMU_write32(intrFlagAdr, intr); cpu->intrWaitARM_state = 0; return 1; } //the condition wasn't satisfied. this means that we need to halt, wait for some enabled interrupt, //and then ensure that we return to this opcode again to check the condition again cpu->waitIRQ = TRUE; cpu->halt_IE_and_IF = TRUE; //(rewire PC to jump back to this opcode) u32 instructAddr = cpu->instruct_adr; cpu->R[15] = instructAddr; cpu->next_instruction = instructAddr; return 1; } TEMPLATE static u32 waitVBlankARM() { cpu->R[0] = 1; cpu->R[1] = 1; return intrWaitARM(); } TEMPLATE static u32 sleep() { _MMU_write08(0x04000301, 0xC0); return 1; } TEMPLATE static u32 divide() { s32 num = (s32)cpu->R[0]; s32 dnum = (s32)cpu->R[1]; if(dnum==0) return 0; s32 res = num / dnum; cpu->R[0] = (u32)res; cpu->R[1] = (u32)(num % dnum); cpu->R[3] = (u32)abs(res); //INFO("ARM%c: SWI 0x09 (divide): in num %i, dnum %i, out R0:%i, R1:%i, R3:%i\n", PROCNUM?'7':'9', num, dnum, cpu->R[0], cpu->R[1], cpu->R[3]); return 6; } TEMPLATE static u32 copy() { u32 src = cpu->R[0]; u32 dst = cpu->R[1]; u32 cnt = cpu->R[2]; //INFO("swi copy from %08X to %08X, cnt=%08X\n", src, dst, cnt); switch(BIT26(cnt)) { case 0: src &= 0xFFFFFFFE; dst &= 0xFFFFFFFE; switch(BIT24(cnt)) { case 0: cnt &= 0x1FFFFF; while(cnt) { _MMU_write16(dst, _MMU_read16(src)); cnt--; dst+=2; src+=2; } break; case 1: { u16 val = _MMU_read16(src); cnt &= 0x1FFFFF; while(cnt) { _MMU_write16(dst, val); cnt--; dst+=2; } } break; } break; case 1: src &= 0xFFFFFFFC; dst &= 0xFFFFFFFC; switch(BIT24(cnt)) { case 0: cnt &= 0x1FFFFF; while(cnt) { _MMU_write32(dst, _MMU_read32(src)); cnt--; dst+=4; src+=4; } break; case 1: { u32 val = _MMU_read32(src); cnt &= 0x1FFFFF; while(cnt) { _MMU_write32(dst, val); cnt--; dst+=4; } } break; } break; } return 1; } TEMPLATE static u32 fastCopy() { u32 src = cpu->R[0] & 0xFFFFFFFC; u32 dst = cpu->R[1] & 0xFFFFFFFC; u32 cnt = cpu->R[2]; //INFO("swi fastcopy from %08X to %08X, cnt=%08X\n", src, dst, cnt); switch(BIT24(cnt)) { case 0: cnt &= 0x1FFFFF; while(cnt) { _MMU_write32(dst, _MMU_read32(src)); cnt--; dst+=4; src+=4; } break; case 1: { u32 val = _MMU_read32(src); cnt &= 0x1FFFFF; while(cnt) { _MMU_write32(dst, val); cnt--; dst+=4; } } break; } return 1; } TEMPLATE static u32 LZ77UnCompVram() { int i1, i2; int byteCount; int byteShift; u32 writeValue; int len; u32 source = cpu->R[0]; u32 dest = cpu->R[1]; u32 header = _MMU_read32(source); source += 4; //INFO("swi lz77uncompvram\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; byteCount = 0; byteShift = 0; writeValue = 0; len = header >> 8; while(len > 0) { u8 d = _MMU_read08(source++); if(d) { for(i1 = 0; i1 < 8; i1++) { if(d & 0x80) { int length; int offset; u32 windowOffset; u16 data = _MMU_read08(source++) << 8; data |= _MMU_read08(source++); length = (data >> 12) + 3; offset = (data & 0x0FFF); windowOffset = dest + byteCount - offset - 1; for(i2 = 0; i2 < length; i2++) { writeValue |= (_MMU_read08(windowOffset++) << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteCount = 0; byteShift = 0; writeValue = 0; } len--; if(len == 0) return 0; } } else { writeValue |= (_MMU_read08(source++) << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteCount = 0; byteShift = 0; writeValue = 0; } len--; if(len == 0) return 0; } d <<= 1; } } else { for(i1 = 0; i1 < 8; i1++) { writeValue |= (_MMU_read08(source++) << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteShift = 0; byteCount = 0; writeValue = 0; } len--; if(len == 0) return 0; } } } return 1; } TEMPLATE static u32 LZ77UnCompWram() { int i1, i2; int len; u32 source = cpu->R[0]; u32 dest = cpu->R[1]; u32 header = _MMU_read32(source); source += 4; //INFO("swi lz77uncompwram\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; len = header >> 8; while(len > 0) { u8 d = _MMU_read08(source++); if(d) { for(i1 = 0; i1 < 8; i1++) { if(d & 0x80) { int length; int offset; u32 windowOffset; u16 data = _MMU_read08(source++) << 8; data |= _MMU_read08(source++); length = (data >> 12) + 3; offset = (data & 0x0FFF); windowOffset = dest - offset - 1; for(i2 = 0; i2 < length; i2++) { _MMU_write08(dest++, _MMU_read08(windowOffset++)); len--; if(len == 0) return 0; } } else { _MMU_write08(dest++, _MMU_read08(source++)); len--; if(len == 0) return 0; } d <<= 1; } } else { for(i1 = 0; i1 < 8; i1++) { _MMU_write08(dest++, _MMU_read08(source++)); len--; if(len == 0) return 0; } } } return 1; } TEMPLATE static u32 RLUnCompVram() { int i; int len; int byteCount; int byteShift; u32 writeValue; u32 source = cpu->R[0]; u32 dest = cpu->R[1]; u32 header = _MMU_read32(source); source += 4; //INFO("swi rluncompvram\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; len = header >> 8; byteCount = 0; byteShift = 0; writeValue = 0; while(len > 0) { u8 d = _MMU_read08(source++); int l = d & 0x7F; if(d & 0x80) { u8 data = _MMU_read08(source++); l += 3; for(i = 0;i < l; i++) { writeValue |= (data << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteCount = 0; byteShift = 0; writeValue = 0; } len--; if(len == 0) return 0; } } else { l++; for(i = 0; i < l; i++) { writeValue |= (_MMU_read08(source++) << byteShift); byteShift += 8; byteCount++; if(byteCount == 2) { _MMU_write16(dest, writeValue); dest += 2; byteCount = 0; byteShift = 0; writeValue = 0; } len--; if(len == 0) return 0; } } } return 1; } TEMPLATE static u32 RLUnCompWram() { int i; int len; u32 source = cpu->R[0]; u32 dest = cpu->R[1]; u32 header = _MMU_read32(source); source += 4; //INFO("swi rluncompwram\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; len = header >> 8; while(len > 0) { u8 d = _MMU_read08(source++); int l = d & 0x7F; if(d & 0x80) { u8 data = _MMU_read08(source++); l += 3; for(i = 0;i < l; i++) { _MMU_write08(dest++, data); len--; if(len == 0) return 0; } } else { l++; for(i = 0; i < l; i++) { _MMU_write08(dest++, _MMU_read08(source++)); len--; if(len == 0) return 0; } } } return 1; } TEMPLATE static u32 UnCompHuffman() { u32 source, dest, writeValue, header, treeStart, mask; u32 data; u8 treeSize, currentNode, rootNode; int byteCount, byteShift, len, pos; int writeData; source = cpu->R[0]; dest = cpu->R[1]; header = _MMU_read08(source); source += 4; //INFO("swi uncomphuffman\n"); if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; treeSize = _MMU_read08(source++); treeStart = source; source += ((treeSize+1)<<1)-1; // minus because we already skipped one byte len = header >> 8; mask = 0x80000000; data = _MMU_read08(source); source += 4; pos = 0; rootNode = _MMU_read08(treeStart); currentNode = rootNode; writeData = 0; byteShift = 0; byteCount = 0; writeValue = 0; if((header & 0x0F) == 8) { while(len > 0) { // take left if(pos == 0) pos++; else pos += (((currentNode & 0x3F)+1)<<1); if(data & mask) { // right if(currentNode & 0x40) writeData = 1; currentNode = _MMU_read08(treeStart+pos+1); } else { // left if(currentNode & 0x80) writeData = 1; currentNode = _MMU_read08(treeStart+pos); } if(writeData) { writeValue |= (currentNode << byteShift); byteCount++; byteShift += 8; pos = 0; currentNode = rootNode; writeData = 0; if(byteCount == 4) { byteCount = 0; byteShift = 0; _MMU_write08(dest, writeValue); writeValue = 0; dest += 4; len -= 4; } } mask >>= 1; if(mask == 0) { mask = 0x80000000; data = _MMU_read08(source); source += 4; } } } else { int halfLen = 0; int value = 0; while(len > 0) { // take left if(pos == 0) pos++; else pos += (((currentNode & 0x3F)+1)<<1); if((data & mask)) { // right if(currentNode & 0x40) writeData = 1; currentNode = _MMU_read08(treeStart+pos+1); } else { // left if(currentNode & 0x80) writeData = 1; currentNode = _MMU_read08(treeStart+pos); } if(writeData) { if(halfLen == 0) value |= currentNode; else value |= (currentNode<<4); halfLen += 4; if(halfLen == 8) { writeValue |= (value << byteShift); byteCount++; byteShift += 8; halfLen = 0; value = 0; if(byteCount == 4) { byteCount = 0; byteShift = 0; _MMU_write08(dest, writeValue); dest += 4; writeValue = 0; len -= 4; } } pos = 0; currentNode = rootNode; writeData = 0; } mask >>= 1; if(mask == 0) { mask = 0x80000000; data = _MMU_read08(source); source += 4; } } } return 1; } TEMPLATE static u32 BitUnPack() { u32 source,dest,header,base,d,temp; int len,bits,revbits,dataSize,data,bitwritecount,mask,bitcount,addBase; u8 b; source = cpu->R[0]; dest = cpu->R[1]; header = cpu->R[2]; len = _MMU_read16(header); bits = _MMU_read08(header+2); switch (bits) { case 1: case 2: case 4: case 8: break; default: return (0); // error } dataSize = _MMU_read08(header+3); switch (dataSize) { case 1: case 2: case 4: case 8: case 16: case 32: break; default: return (0); // error } revbits = 8 - bits; // u32 value = 0; base = _MMU_read08(header+4); addBase = (base & 0x80000000) ? 1 : 0; base &= 0x7fffffff; //INFO("SWI10: bitunpack src 0x%08X dst 0x%08X hdr 0x%08X (src len %05i src bits %02i dst bits %02i)\n\n", source, dest, header, len, bits, dataSize); data = 0; bitwritecount = 0; while(1) { len -= 1; if(len < 0) break; mask = 0xff >> revbits; b = _MMU_read08(source); source++; bitcount = 0; while(1) { if(bitcount >= 8) break; d = b & mask; temp = d >> bitcount; if(!temp && addBase) { temp += base; } data |= temp << bitwritecount; bitwritecount += dataSize; if(bitwritecount >= 32) { _MMU_write08(dest, data); dest += 4; data = 0; bitwritecount = 0; } mask <<= bits; bitcount += bits; } } return 1; } TEMPLATE static u32 Diff8bitUnFilterWram() { u32 source,dest,header; u8 data,diff; int len; source = cpu->R[0]; dest = cpu->R[1]; header = _MMU_read08(source); source += 4; //INFO("swi diff8bitunfilterwram\n"); if(((source & 0xe000000) == 0) || (( (source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)) return 0; len = header >> 8; data = _MMU_read08(source++); _MMU_write08(dest++, data); len--; while(len > 0) { diff = _MMU_read08(source++); data += diff; _MMU_write08(dest++, data); len--; } return 1; } TEMPLATE static u32 Diff16bitUnFilter() { u32 source,dest,header; u16 data; int len; source = cpu->R[0]; dest = cpu->R[1]; //INFO("swi diff16bitunfilter\n"); header = _MMU_read08(source); source += 4; if(((source & 0xe000000) == 0) || ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) return 0; len = header >> 8; data = _MMU_read16(source); source += 2; _MMU_write16(dest, data); dest += 2; len -= 2; while(len >= 2) { u16 diff = _MMU_read16(source); source += 2; data += diff; _MMU_write16(dest, data); dest += 2; len -= 2; } return 1; } TEMPLATE static u32 bios_sqrt() { cpu->R[0] = (u32)sqrt((double)(cpu->R[0])); return 1; } TEMPLATE static u32 setHaltCR() { _MMU_write08(0x4000300+cpu->proc_ID, cpu->R[0]); return 1; } TEMPLATE static u32 getSineTab() { //ds returns garbage according to gbatek, but we must protect ourselves if(cpu->R[0] >= ARRAY_SIZE(getsinetbl)) { printf("Invalid SWI getSineTab: %08X\n",cpu->R[0]); return 1; } cpu->R[0] = getsinetbl[cpu->R[0]]; return 1; } TEMPLATE static u32 getPitchTab() { //ds returns garbage according to gbatek, but we must protect ourselves if(cpu->R[0] >= ARRAY_SIZE(getpitchtbl)) { printf("Invalid SWI getPitchTab: %08X\n",cpu->R[0]); return 1; } cpu->R[0] = getpitchtbl[cpu->R[0]]; return 1; } TEMPLATE static u32 getVolumeTab() { //ds returns garbage according to gbatek, but we must protect ourselves if(cpu->R[0] >= ARRAY_SIZE(getvoltbl)) { printf("Invalid SWI getVolumeTab: %08X\n",cpu->R[0]); return 1; } cpu->R[0] = getvoltbl[cpu->R[0]]; return 1; } //TEMPLATE static u32 getCRC16_old(u32 crc, u32 datap, u32 size) //{ // unsigned int i,j; // // const u16 val[] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 }; // for(i = 0; i < size; i++) // { // crc = crc ^ _MMU_read08(datap + i); // // for(j = 0; j < 8; j++) { // int do_bit = 0; // // if ( crc & 0x1) // do_bit = 1; // // crc = crc >> 1; // // if ( do_bit) { // crc = crc ^ (val[j] << (7-j)); // } // } // } // return crc; //} TEMPLATE static u32 getCRC16() { //gbatek is wrong. //dawn of sorrow uses this to checksum its save data; //if this implementation is wrong, then it won't match what the real bios returns, //and savefiles created with a bios will be invalid when loaded with non-bios (and vice-versa) //u32 old = getCRC16_old(cpu->R[0],cpu->R[1],cpu->R[2]); u16 crc = (u16)cpu->R[0]; u32 datap = cpu->R[1]; u32 size = cpu->R[2]>>1; u16 currVal = 0; const u16 val[] = { 0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,0xA001,0x6C00,0x7800,0xB401,0x5000,0x9C01,0x8801,0x4400}; for(u32 i = 0; i < size; i++) { currVal = _MMU_read16(datap + i*2); for(int j=0;j<4;j++) { u16 tabVal = val[crc&0xF]; crc >>= 4; crc ^= tabVal; u16 tempVal = currVal >> (4*j); tabVal = val[tempVal&0xF]; crc ^= tabVal; } } cpu->R[0] = crc; // R3 contains the last processed halfword cpu->R[3] = currVal; return 1; } TEMPLATE static u32 isDebugger() { //gbatek has additional specifications which are not emulated here if(nds.Is_DebugConsole()) cpu->R[0] = 1; else cpu->R[0] = 0; return 1; } TEMPLATE static u32 SoundBias() { u32 curBias = _MMU_read32(0x04000504); u32 newBias = (curBias == 0) ? 0x000:0x200; u32 delay = (newBias > curBias) ? (newBias-curBias) : (curBias-newBias); _MMU_write32(0x04000504, newBias); return cpu->R[1] * delay; } TEMPLATE static u32 getBootProcs() { cpu->R[0] = 0x00000A2E; cpu->R[1] = 0x00002C3C; cpu->R[3] = 0x000005FF; return 1; } u32 (* ARM_swi_tab[2][32])()={ { bios_nop, // 0x00 bios_nop, // 0x01 bios_nop, // 0x02 WaitByLoop, // 0x03 intrWaitARM, // 0x04 waitVBlankARM, // 0x05 wait4IRQ, // 0x06 bios_nop, // 0x07 bios_nop, // 0x08 divide, // 0x09 bios_nop, // 0x0A copy, // 0x0B fastCopy, // 0x0C bios_sqrt, // 0x0D getCRC16, // 0x0E isDebugger, // 0x0F BitUnPack, // 0x10 LZ77UnCompWram, // 0x11 LZ77UnCompVram, // 0x12 UnCompHuffman, // 0x13 RLUnCompWram, // 0x14 RLUnCompVram, // 0x15 Diff8bitUnFilterWram, // 0x16 bios_nop, // 0x17 Diff16bitUnFilter, // 0x18 bios_nop, // 0x19 bios_nop, // 0x1A bios_nop, // 0x1B bios_nop, // 0x1C bios_nop, // 0x1D bios_nop, // 0x1E setHaltCR, // 0x1F }, { bios_nop, // 0x00 bios_nop, // 0x01 bios_nop, // 0x02 WaitByLoop, // 0x03 intrWaitARM, // 0x04 waitVBlankARM, // 0x05 wait4IRQ, // 0x06 sleep, // 0x07 SoundBias, // 0x08 divide, // 0x09 bios_nop, // 0x0A copy, // 0x0B fastCopy, // 0x0C bios_sqrt, // 0x0D getCRC16, // 0x0E isDebugger, // 0x0F BitUnPack, // 0x10 LZ77UnCompWram, // 0x11 LZ77UnCompVram, // 0x12 UnCompHuffman, // 0x13 RLUnCompWram, // 0x14 RLUnCompVram, // 0x15 Diff8bitUnFilterWram, // 0x16 bios_nop, // 0x17 bios_nop, // 0x18 bios_nop, // 0x19 getSineTab, // 0x1A getPitchTab, // 0x1B getVolumeTab, // 0x1C getBootProcs, // 0x1D bios_nop, // 0x1E setHaltCR, // 0x1F } }; desmume-0.9.9/src/MMU.h0000644000175000017500000006344312140261633015330 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2007 shash Copyright (C) 2007-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef MMU_H #define MMU_H #include "FIFO.h" #include "mem.h" #include "registers.h" #include "mc.h" #include "bits.h" #include "readwrite.h" #include "debug.h" #ifdef HAVE_LUA #include "lua-engine.h" #endif #ifdef HAVE_JIT #include "arm_jit.h" #endif #define ARMCPU_ARM7 1 #define ARMCPU_ARM9 0 #define ARMPROC (PROCNUM ? NDS_ARM7:NDS_ARM9) typedef const u8 TWaitState; enum EDMAMode { EDMAMode_Immediate = 0, EDMAMode_VBlank = 1, EDMAMode_HBlank = 2, EDMAMode_HStart = 3, EDMAMode_MemDisplay = 4, EDMAMode_Card = 5, EDMAMode_GBASlot = 6, EDMAMode_GXFifo = 7, EDMAMode7_Wifi = 8, EDMAMode7_GBASlot = 9, }; enum EDMABitWidth { EDMABitWidth_16 = 0, EDMABitWidth_32 = 1 }; enum EDMASourceUpdate { EDMASourceUpdate_Increment = 0, EDMASourceUpdate_Decrement = 1, EDMASourceUpdate_Fixed = 2, EDMASourceUpdate_Invalid = 3, }; enum EDMADestinationUpdate { EDMADestinationUpdate_Increment = 0, EDMADestinationUpdate_Decrement = 1, EDMADestinationUpdate_Fixed = 2, EDMADestinationUpdate_IncrementReload = 3, }; //TODO //n.b. this may be a bad idea, for complex registers like the dma control register. //we need to know exactly what part was written to, instead of assuming all 32bits were written. class TRegister_32 { public: virtual u32 read32() = 0; virtual void write32(const u32 val) = 0; void write(const int size, const u32 adr, const u32 val) { if(size==32) write32(val); else { const u32 offset = adr&3; if(size==8) { printf("WARNING! 8BIT DMA ACCESS\n"); u32 mask = 0xFF<<(offset<<3); write32((read32()&~mask)|(val<<(offset<<3))); } else if(size==16) { u32 mask = 0xFFFF<<(offset<<3); write32((read32()&~mask)|(val<<(offset<<3))); } } } u32 read(const int size, const u32 adr) { if(size==32) return read32(); else { const u32 offset = adr&3; if(size==8) { printf("WARNING! 8BIT DMA ACCESS\n"); return (read32()>>(offset<<3))&0xFF; } else return (read32()>>(offset<<3))&0xFFFF; } } }; struct TGXSTAT : public TRegister_32 { TGXSTAT() { gxfifo_irq = se = tr = tb = sb = 0; fifo_empty = true; fifo_low = false; } u8 tb; //test busy u8 tr; //test result u8 se; //stack error u8 sb; //stack busy u8 gxfifo_irq; //irq configuration bool fifo_empty, fifo_low; virtual u32 read32(); virtual void write32(const u32 val); void savestate(EMUFILE *f); bool loadstate(EMUFILE *f); }; void triggerDma(EDMAMode mode); class DivController { public: DivController() : mode(0), busy(0) {} void exec(); u8 mode, busy, div0; u16 read16() { return mode|(busy<<15)|(div0<<14); } void write16(u16 val) { mode = val&3; //todo - do we clear the div0 flag here or is that strictly done by the divider unit? } void savestate(EMUFILE* os) { write8le(&mode,os); write8le(&busy,os); write8le(&div0,os); } bool loadstate(EMUFILE* is, int version) { int ret = 1; ret &= read8le(&mode,is); ret &= read8le(&busy,is); ret &= read8le(&div0,is); return ret==1; } }; class SqrtController { public: SqrtController() : mode(0), busy(0) {} void exec(); u8 mode, busy; u16 read16() { return mode|(busy<<15); } void write16(u16 val) { mode = val&1; } void savestate(EMUFILE* os) { write8le(&mode,os); write8le(&busy,os); } bool loadstate(EMUFILE* is, int version) { int ret=1; ret &= read8le(&mode,is); ret &= read8le(&busy,is); return ret==1; } }; class DmaController { public: u8 enable, irq, repeatMode, _startmode; u8 userEnable; u32 wordcount; EDMAMode startmode; EDMABitWidth bitWidth; EDMASourceUpdate sar; EDMADestinationUpdate dar; u32 saddr, daddr; u32 saddr_user, daddr_user; //indicates whether the dma needs to be checked for triggering BOOL dmaCheck; //indicates whether the dma right now is logically running //(though for now we copy all the data when it triggers) BOOL running; BOOL paused; //this flag will sometimes be set when a start condition is triggered //other conditions may be automatically triggered based on scanning conditions BOOL triggered; u64 nextEvent; int procnum, chan; void savestate(EMUFILE *f); bool loadstate(EMUFILE *f); void exec(); template void doCopy(); void doPause(); void doStop(); void doSchedule(); void tryTrigger(EDMAMode mode); DmaController() : enable(0), irq(0), repeatMode(0), _startmode(0), wordcount(0), startmode(EDMAMode_Immediate), bitWidth(EDMABitWidth_16), sar(EDMASourceUpdate_Increment), dar(EDMADestinationUpdate_Increment), //if saddr isnt cleared then rings of fate will trigger copy protection //by inspecting dma3 saddr when it boots saddr(0), daddr(0), saddr_user(0), daddr_user(0), dmaCheck(FALSE), running(FALSE), paused(FALSE), triggered(FALSE), nextEvent(0), sad(&saddr_user), dad(&daddr_user) { sad.controller = this; dad.controller = this; ctrl.controller = this; regs[0] = &sad; regs[1] = &dad; regs[2] = &ctrl; } class AddressRegister : public TRegister_32 { public: //we pass in a pointer to the controller here so we can alert it if anything changes DmaController* controller; u32 * const ptr; AddressRegister(u32* _ptr) : ptr(_ptr) {} virtual u32 read32() { return *ptr; } virtual void write32(const u32 val) { *ptr = val; } }; class ControlRegister : public TRegister_32 { public: //we pass in a pointer to the controller here so we can alert it if anything changes DmaController* controller; ControlRegister() {} virtual u32 read32() { return controller->read32(); } virtual void write32(const u32 val) { return controller->write32(val); } }; AddressRegister sad, dad; ControlRegister ctrl; TRegister_32* regs[3]; void write32(const u32 val); u32 read32(); }; enum ECardMode { CardMode_Normal = 0, CardMode_KEY1, CardMode_KEY2, }; typedef struct { u8 command[8]; u32 address; u32 transfer_count; ECardMode mode; // NJSD stuff int blocklen; } nds_dscard; #define DUP2(x) x, x #define DUP4(x) x, x, x, x #define DUP8(x) x, x, x, x, x, x, x, x #define DUP16(x) x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x struct MMU_struct { //ARM9 mem u8 ARM9_ITCM[0x8000]; u8 ARM9_DTCM[0x4000]; //u8 MAIN_MEM[4*1024*1024]; //expanded from 4MB to 8MB to support debug consoles //u8 MAIN_MEM[8*1024*1024]; //expanded from 8MB to 16MB to support dsi u8 MAIN_MEM[16*1024*1024]; //expanded from 8MB to 16MB to support dsi u8 ARM9_REG[0x1000000]; //this variable is evil and should be removed by correctly emulating all registers. u8 ARM9_BIOS[0x8000]; u8 ARM9_VMEM[0x800]; #include "PACKED.h" struct { u8 ARM9_LCD[0xA4000]; //an extra 128KB for blank memory, directly after arm9_lcd, so that //we can easily map things to the end of arm9_lcd to represent //an unmapped state u8 blank_memory[0x20000]; }; #include "PACKED_END.h" u8 ARM9_OAM[0x800]; u8* ExtPal[2][4]; u8* ObjExtPal[2][2]; struct TextureInfo { u8* texPalSlot[6]; u8* textureSlotAddr[4]; } texInfo; //ARM7 mem u8 ARM7_BIOS[0x4000]; u8 ARM7_ERAM[0x10000]; //64KB of exclusive WRAM u8 ARM7_REG[0x10000]; u8 ARM7_WIRAM[0x10000]; //WIFI ram // VRAM mapping u8 VRAM_MAP[4][32]; u32 LCD_VRAM_ADDR[10]; u8 LCDCenable[10]; //32KB of shared WRAM - can be switched between ARM7 & ARM9 in two blocks u8 SWIRAM[0x8000]; //Card rom & ram u8 * CART_ROM; //Unused ram u8 UNUSED_RAM[4]; //this is here so that we can trap glitchy emulator code //which is accessing offsets 5,6,7 of unused ram due to unaligned accesses //(also since the emulator doesn't prevent unaligned accesses) u8 MORE_UNUSED_RAM[4]; static u8 * MMU_MEM[2][256]; static u32 MMU_MASK[2][256]; u8 ARM9_RW_MODE; u32 DTCMRegion; u32 ITCMRegion; u16 timer[2][4]; s32 timerMODE[2][4]; u32 timerON[2][4]; u32 timerRUN[2][4]; u16 timerReload[2][4]; u32 reg_IME[2]; u32 reg_IE[2]; //these are the user-controlled IF bits. some IF bits are generated as necessary from hardware conditions u32 reg_IF_bits[2]; //these flags are set occasionally to indicate that an irq should have entered the pipeline, and processing will be deferred a tiny bit to help emulate things u32 reg_IF_pending[2]; u32 reg_DISP3DCNT_bits; template u32 gen_IF(); BOOL divRunning; s64 divResult; s64 divMod; u64 divCycles; BOOL sqrtRunning; u32 sqrtResult; u64 sqrtCycles; u16 SPI_CNT; u16 SPI_CMD; u16 AUX_SPI_CNT; u16 AUX_SPI_CMD; u8 WRAMCNT; u64 gfx3dCycles; u8 powerMan_CntReg; BOOL powerMan_CntRegWritten; u8 powerMan_Reg[5]; memory_chip_t fw; nds_dscard dscard[2]; }; //everything in here is derived from libnds behaviours. no hardware tests yet class DSI_TSC { public: DSI_TSC(); void reset_command(); u16 write16(u16 val); bool save_state(EMUFILE* os); bool load_state(EMUFILE* is); private: u16 read16(); u8 reg_selection; u8 read_flag; s32 state; s32 readcount; //registers[0] contains the current page. //we are going to go ahead and save these out in case we want to change the way this is emulated in the future.. //we may want to poke registers in here at more convenient times and have the TSC dumbly pluck them out, //rather than generate the values on the fly u8 registers[0x80]; }; //this contains things which can't be memzeroed because they are smarter classes struct MMU_struct_new { MMU_struct_new() ; BackupDevice backupDevice; DmaController dma[2][4]; TGXSTAT gxstat; SqrtController sqrt; DivController div; DSI_TSC dsi_tsc; void write_dma(const int proc, const int size, const u32 adr, const u32 val); u32 read_dma(const int proc, const int size, const u32 adr); bool is_dma(const u32 adr) { return adr >= _REG_DMA_CONTROL_MIN && adr <= _REG_DMA_CONTROL_MAX; } }; extern MMU_struct MMU; extern MMU_struct_new MMU_new; struct armcpu_memory_iface { /** the 32 bit instruction prefetch */ u32 FASTCALL (*prefetch32)( void *data, u32 adr); /** the 16 bit instruction prefetch */ u16 FASTCALL (*prefetch16)( void *data, u32 adr); /** read 8 bit data value */ u8 FASTCALL (*read8)( void *data, u32 adr); /** read 16 bit data value */ u16 FASTCALL (*read16)( void *data, u32 adr); /** read 32 bit data value */ u32 FASTCALL (*read32)( void *data, u32 adr); /** write 8 bit data value */ void FASTCALL (*write8)( void *data, u32 adr, u8 val); /** write 16 bit data value */ void FASTCALL (*write16)( void *data, u32 adr, u16 val); /** write 32 bit data value */ void FASTCALL (*write32)( void *data, u32 adr, u32 val); void *data; }; void MMU_Init(void); void MMU_DeInit(void); void MMU_Reset( void); void MMU_setRom(u8 * rom, u32 mask); void MMU_unsetRom( void); void print_memory_profiling( void); // Memory reading/writing (old) u8 FASTCALL MMU_read8(u32 proc, u32 adr); u16 FASTCALL MMU_read16(u32 proc, u32 adr); u32 FASTCALL MMU_read32(u32 proc, u32 adr); void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val); void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val); void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val); //template void FASTCALL MMU_doDMA(u32 num); //The base ARM memory interfaces extern struct armcpu_memory_iface arm9_base_memory_iface; extern struct armcpu_memory_iface arm7_base_memory_iface; extern struct armcpu_memory_iface arm9_direct_memory_iface; #define VRAM_BANKS 9 #define VRAM_BANK_A 0 #define VRAM_BANK_B 1 #define VRAM_BANK_C 2 #define VRAM_BANK_D 3 #define VRAM_BANK_E 4 #define VRAM_BANK_F 5 #define VRAM_BANK_G 6 #define VRAM_BANK_H 7 #define VRAM_BANK_I 8 #define VRAM_PAGE_ABG 0 #define VRAM_PAGE_BBG 128 #define VRAM_PAGE_AOBJ 256 #define VRAM_PAGE_BOBJ 384 struct VramConfiguration { enum Purpose { OFF, INVALID, ABG, BBG, AOBJ, BOBJ, LCDC, ARM7, TEX, TEXPAL, ABGEXTPAL, BBGEXTPAL, AOBJEXTPAL, BOBJEXTPAL }; struct BankInfo { Purpose purpose; int ofs; } banks[VRAM_BANKS]; inline void clear() { for(int i=0;i>14)&(VRAM_ARM9_PAGES-1); u32 ofs = vram_addr & 0x3FFF; vram_page = vram_arm9_map[vram_page]; //blank pages are handled by the extra 16KB of blank memory at the end of ARM9_LCD //and the fact that blank pages are mapped to appear at that location return MMU.ARM9_LCD + (vram_page<<14) + ofs; } template u8 _MMU_read08(u32 addr); template u16 _MMU_read16(u32 addr); template u32 _MMU_read32(u32 addr); template void _MMU_write08(u32 addr, u8 val); template void _MMU_write16(u32 addr, u16 val); template void _MMU_write32(u32 addr, u32 val); template FORCEINLINE u8 _MMU_read08(u32 addr) { return _MMU_read08(addr); } template FORCEINLINE u16 _MMU_read16(u32 addr) { return _MMU_read16(addr); } template FORCEINLINE u32 _MMU_read32(u32 addr) { return _MMU_read32(addr); } template FORCEINLINE void _MMU_write08(u32 addr, u8 val) { _MMU_write08(addr,val); } template FORCEINLINE void _MMU_write16(u32 addr, u16 val) { _MMU_write16(addr,val); } template FORCEINLINE void _MMU_write32(u32 addr, u32 val) { _MMU_write32(addr,val); } void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val); void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val); void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val); u8 FASTCALL _MMU_ARM9_read08(u32 adr); u16 FASTCALL _MMU_ARM9_read16(u32 adr); u32 FASTCALL _MMU_ARM9_read32(u32 adr); void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val); void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val); void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val); u8 FASTCALL _MMU_ARM7_read08(u32 adr); u16 FASTCALL _MMU_ARM7_read16(u32 adr); u32 FASTCALL _MMU_ARM7_read32(u32 adr); extern u32 partie; extern u32 _MMU_MAIN_MEM_MASK; extern u32 _MMU_MAIN_MEM_MASK16; extern u32 _MMU_MAIN_MEM_MASK32; void SetupMMU(bool debugConsole, bool dsi); FORCEINLINE void CheckMemoryDebugEvent(EDEBUG_EVENT event, const MMU_ACCESS_TYPE type, const u32 procnum, const u32 addr, const u32 size, const u32 val) { //TODO - ugh work out a better prefetch event system if(type == MMU_AT_CODE && event == DEBUG_EVENT_READ) event = DEBUG_EVENT_EXECUTE; if(CheckDebugEvent(event)) { DebugEventData.memAccessType = type; DebugEventData.procnum = procnum; DebugEventData.addr = addr; DebugEventData.size = size; DebugEventData.val = val; HandleDebugEvent(event); } } //ALERT!!!!!!!!!!!!!! //the following inline functions dont do the 0x0FFFFFFF mask. //this may result in some unexpected behavior FORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { CheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,8,0); //special handling for DMA: read 0 from TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return 0; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 1, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { //Returns data from DTCM (ARM9 only) return T1ReadByte(MMU.ARM9_DTCM, addr & 0x3FFF); } if ( (addr & 0x0F000000) == 0x02000000) return T1ReadByte( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK); if(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read08(addr); else return _MMU_ARM7_read08(addr); } FORCEINLINE u16 _MMU_read16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { CheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,16,0); //special handling for DMA: read 0 from TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return 0; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 2, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) { if ((addr & 0x0F000000) == 0x02000000) return T1ReadWord_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16); if(addr<0x02000000) return T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, addr&0x7FFE); goto dunno; } if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { //Returns data from DTCM (ARM9 only) return T1ReadWord_guaranteedAligned(MMU.ARM9_DTCM, addr & 0x3FFE); } if ( (addr & 0x0F000000) == 0x02000000) return T1ReadWord_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16); dunno: if(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read16(addr); else return _MMU_ARM7_read16(addr); } FORCEINLINE u32 _MMU_read32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { CheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,32,0); //special handling for DMA: read 0 from TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return 0; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm } #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, /*FIXME*/ 0, LUAMEMHOOK_READ); #endif //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) { if ( (addr & 0x0F000000) == 0x02000000) return T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32); if(addr<0x02000000) return T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, addr&0x7FFC); //what happens when we execute from DTCM? nocash makes it look like we get 0xFFFFFFFF but i can't seem to verify it //historically, desmume would fall through to its old memory map struct //which would return unused memory (0) //it seems the hardware returns 0 or something benign because in actuality 0xFFFFFFFF is an undefined opcode //and we know our handling for that is solid goto dunno; } //special handling for execution from arm7. try reading from main memory first if(PROCNUM==ARMCPU_ARM7) { if ( (addr & 0x0F000000) == 0x02000000) return T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32); } //for other arm9 cases, we have to check from dtcm first because it is patched on top of the main memory range if(PROCNUM==ARMCPU_ARM9) { if((addr&(~0x3FFF)) == MMU.DTCMRegion) { //Returns data from DTCM (ARM9 only) return T1ReadLong_guaranteedAligned(MMU.ARM9_DTCM, addr & 0x3FFC); } if ( (addr & 0x0F000000) == 0x02000000) return T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32); } dunno: if(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read32(addr); else return _MMU_ARM7_read32(addr); } FORCEINLINE void _MMU_write08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u8 val) { CheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,8,val); //special handling for DMA: discard writes to TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteByte(MMU.ARM9_DTCM, addr & 0x3FFF, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); #endif return; } if ( (addr & 0x0F000000) == 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK, 0) = 0; #endif T1WriteByte( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); #endif return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write08(addr,val); else _MMU_ARM7_write08(addr,val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE); #endif } FORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u16 val) { CheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,16,val); //special handling for DMA: discard writes to TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteWord(MMU.ARM9_DTCM, addr & 0x3FFE, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); #endif return; } if ( (addr & 0x0F000000) == 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK16, 0) = 0; #endif T1WriteWord( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); #endif return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write16(addr,val); else _MMU_ARM7_write16(addr,val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE); #endif } FORCEINLINE void _MMU_write32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u32 val) { CheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,32,val); //special handling for DMA: discard writes to TCM if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) { if(addr<0x02000000) return; //itcm if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm } if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { T1WriteLong(MMU.ARM9_DTCM, addr & 0x3FFC, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); #endif return; } if ( (addr & 0x0F000000) == 0x02000000) { #ifdef HAVE_JIT JIT_COMPILED_FUNC_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK32, 0) = 0; JIT_COMPILED_FUNC_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK32, 1) = 0; #endif T1WriteLong( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32, val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); #endif return; } if(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write32(addr,val); else _MMU_ARM7_write32(addr,val); #ifdef HAVE_LUA CallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE); #endif } //#ifdef MMU_ENABLE_ACL // void FASTCALL MMU_write8_acl(u32 proc, u32 adr, u8 val); // void FASTCALL MMU_write16_acl(u32 proc, u32 adr, u16 val); // void FASTCALL MMU_write32_acl(u32 proc, u32 adr, u32 val); // u8 FASTCALL MMU_read8_acl(u32 proc, u32 adr, u32 access); // u16 FASTCALL MMU_read16_acl(u32 proc, u32 adr, u32 access); // u32 FASTCALL MMU_read32_acl(u32 proc, u32 adr, u32 access); //#else // #define MMU_write8_acl(proc, adr, val) _MMU_write08(adr, val) // #define MMU_write16_acl(proc, adr, val) _MMU_write16(adr, val) // #define MMU_write32_acl(proc, adr, val) _MMU_write32(adr, val) // #define MMU_read8_acl(proc,adr,access) _MMU_read08(adr) // #define MMU_read16_acl(proc,adr,access) ((access==CP15_ACCESS_EXECUTE)?_MMU_read16(adr):_MMU_read16(adr)) // #define MMU_read32_acl(proc,adr,access) ((access==CP15_ACCESS_EXECUTE)?_MMU_read32(adr):_MMU_read32(adr)) //#endif // Use this macros for reading/writing, so the GDB stub isn't broken #ifdef GDB_STUB #define READ32(a,b) cpu->mem_if->read32(a,(b) & 0xFFFFFFFC) #define WRITE32(a,b,c) cpu->mem_if->write32(a,(b) & 0xFFFFFFFC,c) #define READ16(a,b) cpu->mem_if->read16(a,(b) & 0xFFFFFFFE) #define WRITE16(a,b,c) cpu->mem_if->write16(a,(b) & 0xFFFFFFFE,c) #define READ8(a,b) cpu->mem_if->read8(a,b) #define WRITE8(a,b,c) cpu->mem_if->write8(a,b,c) #else #define READ32(a,b) _MMU_read32((b) & 0xFFFFFFFC) #define WRITE32(a,b,c) _MMU_write32((b) & 0xFFFFFFFC,c) #define READ16(a,b) _MMU_read16((b) & 0xFFFFFFFE) #define WRITE16(a,b,c) _MMU_write16((b) & 0xFFFFFFFE,c) #define READ8(a,b) _MMU_read08(b) #define WRITE8(a,b,c) _MMU_write08(b, c) #endif template FORCEINLINE u8 _MMU_read08(u32 addr) { return _MMU_read08(PROCNUM, AT, addr); } template FORCEINLINE u16 _MMU_read16(u32 addr) { return _MMU_read16(PROCNUM, AT, addr); } template FORCEINLINE u32 _MMU_read32(u32 addr) { return _MMU_read32(PROCNUM, AT, addr); } template FORCEINLINE void _MMU_write08(u32 addr, u8 val) { _MMU_write08(PROCNUM, AT, addr, val); } template FORCEINLINE void _MMU_write16(u32 addr, u16 val) { _MMU_write16(PROCNUM, AT, addr, val); } template FORCEINLINE void _MMU_write32(u32 addr, u32 val) { _MMU_write32(PROCNUM, AT, addr, val); } void FASTCALL MMU_DumpMemBlock(u8 proc, u32 address, u32 size, u8 *buffer); #endif desmume-0.9.9/src/GPU_osd.h0000644000175000017500000000532612140261633016166 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2008-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef __GPU_OSD_ #define __GPU_OSD_ #include "types.h" #ifdef HAVE_LIBAGG #include #include #include "aggdraw.h" #define OSD_MAX_LINES 4 #define OSD_TIMER_SECS 2 struct HudCoordinates{ int x; int y; int xsize; int ysize; int storedx; int storedy; int clicked; }; struct HudStruct { public: HudStruct() { resetTransient(); } void resetTransient() { fps = 0; fps3d = 0; cpuload[0] = cpuload[1] = 0; cpuloopIterationCount = 0; clicked = false; } HudCoordinates SavestateSlots; HudCoordinates FpsDisplay; HudCoordinates FrameCounter; HudCoordinates InputDisplay; HudCoordinates GraphicalInputDisplay; HudCoordinates LagFrameCounter; HudCoordinates Microphone; HudCoordinates RTCDisplay; HudCoordinates Dummy; HudCoordinates &hud(int i) { return ((HudCoordinates*)this)[i]; } void reset(); int fps, fps3d, cpuload[2], cpuloopIterationCount; bool clicked; }; void EditHud(s32 x, s32 y, HudStruct *hudstruct); void HudClickRelease(HudStruct *hudstruct); void DrawHUD(); extern HudStruct Hud; extern bool HudEditorMode; class OSDCLASS { private: u64 offset; u8 mode; u16 rotAngle; u16 lineText_x; u16 lineText_y; AggColor lineText_color; u8 lastLineText; char *lineText[OSD_MAX_LINES+1]; time_t lineTimer[OSD_MAX_LINES+1]; AggColor lineColor[OSD_MAX_LINES+1]; bool needUpdate; bool checkTimers(); public: char name[7]; // for debuging bool singleScreen; bool swapScreens; OSDCLASS(u8 core); ~OSDCLASS(); void setOffset(u16 ofs); void setRotate(u16 angle); void update(); void clear(); void setListCoord(u16 x, u16 y); void setLineColor(u8 r, u8 b, u8 g); void addLine(const char *fmt, ...); void addFixed(u16 x, u16 y, const char *fmt, ...); void border(bool enabled); }; extern OSDCLASS *osd; #else /* HAVE_LIBAGG */ void DrawHUD(); class OSDCLASS { public: OSDCLASS(u8 core); ~OSDCLASS(); void update(); void clear(); void setLineColor(u8 r, u8 b, u8 g); void addLine(const char *fmt, ...); }; extern OSDCLASS *osd; #endif #endif desmume-0.9.9/src/debug.h0000644000175000017500000001233212140261633015747 0ustar guillaumeguillaume/* Copyright (C) 2006 Guillaume Duhamel Copyright (C) 2006-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef DEBUG_H #define DEBUG_H #include #include #include #include #include "types.h" #include "mem.h" #include "emufile.h" struct DebugStatistics { DebugStatistics(); struct InstructionHits { InstructionHits(); u32 thumb[1024]; u32 arm[4096]; } instructionHits[2]; //one for each cpu s32 sequencerExecutionCounters[32]; void print(); void printSequencerExecutionCounters(); }; extern DebugStatistics DEBUG_statistics; void DEBUG_reset(); void DEBUG_dumpMemory(EMUFILE* fp); struct armcpu_t; class Logger { protected: void (*callback)(const Logger& logger, const char * format); std::ostream * out; unsigned int flags; static std::vector channels; static void fixSize(unsigned int channel); public: Logger(); ~Logger(); void vprintf(const char * format, va_list l, const char * filename, unsigned int line); void setOutput(std::ostream * o); void setCallback(void (*cback)(const Logger& logger, const char * message)); void setFlag(unsigned int flag); std::ostream& getOutput() const; static const int LINE = 1; static const int FILE = 2; static void log(unsigned int channel, const char * file, unsigned int line, const char * format, ...); static void log(unsigned int channel, const char * file, unsigned int line, std::ostream& os); static void log(unsigned int channel, const char * file, unsigned int line, unsigned int flag); static void log(unsigned int channel, const char * file, unsigned int line, void (*callback)(const Logger& logger, const char * message)); }; #if defined(DEBUG) || defined(GPUDEBUG) || defined(DIVDEBUG) || defined(SQRTDEBUG) || defined(DMADEBUG) || defined(DEVELOPER) #define LOGC(channel, ...) Logger::log(channel, __FILE__, __LINE__, __VA_ARGS__) #else #define LOGC(...) {} #endif #ifdef DEBUG #define LOG(...) LOGC(0, __VA_ARGS__) #else #define LOG(...) {} #endif #ifdef GPUDEBUG #define GPULOG(...) LOGC(1, __VA_ARGS__) #else #define GPULOG(...) {} #endif #ifdef DIVDEBUG #define DIVLOG(...) LOGC(2, __VA_ARGS__) #else #define DIVLOG(...) {} #endif #ifdef SQRTDEBUG #define SQRTLOG(...) LOGC(3, __VA_ARGS__) #else #define SQRTLOG(...) {} #endif #ifdef DMADEBUG #define DMALOG(...) LOGC(4, __VA_ARGS__) #else #define DMALOG(...) {} #endif #ifdef CFLASHDEBUG #define CFLASHLOG(...) LOGC(5, __VA_ARGS__) #else #define CFLASHLOG(...) {} #endif #ifdef UNTESTEDOPCODEDEBUG #define UNTESTEDOPCODELOG(...) LOGC(6, __VA_ARGS__) #else #define UNTESTEDOPCODELOG(...) {} #endif #ifdef DEVELOPER #define PROGINFO(...) LOGC(7, __VA_ARGS__) #else #define PROGINFO(...) {} #endif #define INFOC(channel, ...) Logger::log(channel, __FILE__, __LINE__, __VA_ARGS__) #define INFO(...) INFOC(10, __VA_ARGS__) void IdeasLog(armcpu_t* cpu); void NocashMessage(armcpu_t* cpu, int offset); enum EDEBUG_EVENT { DEBUG_EVENT_READ=1, //read from arm9 or arm7 bus, including cpu prefetch DEBUG_EVENT_WRITE=2, //write on arm9 or arm7 bus DEBUG_EVENT_EXECUTE=3, //prefetch on arm9 or arm7, triggered after the read event DEBUG_EVENT_ACL_EXCEPTION=4, //acl exception on arm9 DEBUG_EVENT_CACHE_MISS=5, //cache miss on arm9 }; enum EDEBUG_NOTIFY { DEBUG_NOTIFY_READ_BEYOND_END_OF_CART, DEBUG_NOTIFY_MAX }; class DebugNotify { public: void NextFrame(); void ReadBeyondEndOfCart(u32 addr, u32 romsize); private: std::bitset pingBits; std::bitset enableBits; bool ping(EDEBUG_NOTIFY which); }; extern DebugNotify DEBUG_Notify; struct armcpu_t; //information about a debug event will be stuffed into here by the generator struct TDebugEventData { MMU_ACCESS_TYPE memAccessType; u32 procnum, addr, size, val; armcpu_t* cpu(); }; extern TDebugEventData DebugEventData; //bits in here are set according to what debug handlers are installed? //for now it is just a single bit extern u32 debugFlag; FORCEINLINE bool CheckDebugEvent(EDEBUG_EVENT event) { //for now, debug events are only handled in dev+ builds #ifndef DEVELOPER return false; #endif if(!debugFlag) return false; return true; } void HandleDebugEvent_Read(); void HandleDebugEvent_Write(); void HandleDebugEvent_Execute(); void HandleDebugEvent_ACL_Exception(); void HandleDebugEvent_CacheMiss(); inline void HandleDebugEvent(EDEBUG_EVENT event) { switch(event) { case DEBUG_EVENT_READ: HandleDebugEvent_Read(); return; case DEBUG_EVENT_WRITE: HandleDebugEvent_Write(); return; case DEBUG_EVENT_EXECUTE: HandleDebugEvent_Execute(); return; case DEBUG_EVENT_ACL_EXCEPTION: HandleDebugEvent_ACL_Exception(); return; case DEBUG_EVENT_CACHE_MISS: HandleDebugEvent_CacheMiss(); return; } } #endif desmume-0.9.9/src/desmume.mk0000644000175000017500000000007312140261633016477 0ustar guillaumeguillaumeAM_CFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src AM_LDFLAGS =desmume-0.9.9/src/NDSSystem.h0000644000175000017500000003504612140261633016521 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef NDSSYSTEM_H #define NDSSYSTEM_H #include #include "armcpu.h" #include "MMU.h" #include "driver.h" #include "GPU.h" #include "SPU.h" #include "mem.h" #include "wifi.h" #include "emufile.h" #include "firmware.h" #include "types.h" #include #if defined(_WINDOWS) && !defined(WXPORT) #include "pathsettings.h" #endif template struct buttonstruct { union { struct { // changing the order of these fields would break stuff //fRLDUTSBAYXWEg Type G; // debug Type E; // right shoulder Type W; // left shoulder Type X; Type Y; Type A; Type B; Type S; // start Type T; // select Type U; // up Type D; // down Type L; // left Type R; // right Type F; // lid }; Type array[14]; }; }; extern buttonstruct Turbo; extern buttonstruct TurboTime; extern buttonstruct AutoHold; int NDS_WritePNG(const char *fname); extern volatile bool execute; extern BOOL click; /* * The firmware language values */ #define NDS_FW_LANG_JAP 0 #define NDS_FW_LANG_ENG 1 #define NDS_FW_LANG_FRE 2 #define NDS_FW_LANG_GER 3 #define NDS_FW_LANG_ITA 4 #define NDS_FW_LANG_SPA 5 #define NDS_FW_LANG_CHI 6 #define NDS_FW_LANG_RES 7 //#define LOG_ARM9 //#define LOG_ARM7 struct NDS_header { char gameTile[12]; char gameCode[4]; u16 makerCode; u8 unitCode; u8 deviceCode; u8 cardSize; u8 cardInfo[8]; u8 flags; u8 romversion; u32 ARM9src; u32 ARM9exe; u32 ARM9cpy; u32 ARM9binSize; u32 ARM7src; u32 ARM7exe; u32 ARM7cpy; u32 ARM7binSize; u32 FNameTblOff; u32 FNameTblSize; u32 FATOff; u32 FATSize; u32 ARM9OverlayOff; u32 ARM9OverlaySize; u32 ARM7OverlayOff; u32 ARM7OverlaySize; u32 unknown2a; u32 unknown2b; u32 IconOff; u16 CRC16; u16 ROMtimeout; u32 ARM9unk; u32 ARM7unk; u8 unknown3c[8]; u32 ROMSize; u32 HeaderSize; u8 unknown5[56]; u8 logo[156]; u16 logoCRC16; u16 headerCRC16; u8 reserved[160]; }; extern void debug(); void emu_halt(); extern u64 nds_timer; void NDS_Reschedule(); void NDS_RescheduleGXFIFO(u32 cost); void NDS_RescheduleDMA(); void NDS_RescheduleTimers(); enum ENSATA_HANDSHAKE { ENSATA_HANDSHAKE_none = 0, ENSATA_HANDSHAKE_query = 1, ENSATA_HANDSHAKE_ack = 2, ENSATA_HANDSHAKE_confirm = 3, ENSATA_HANDSHAKE_complete = 4, }; enum NDS_CONSOLE_TYPE { NDS_CONSOLE_TYPE_FAT, NDS_CONSOLE_TYPE_LITE, NDS_CONSOLE_TYPE_IQUE, NDS_CONSOLE_TYPE_DSI }; struct NDSSystem { s32 wifiCycle; s32 cycles; u64 timerCycle[2][4]; u32 VCount; u32 old; //raw adc touch coords for old NDS u16 adc_touchX; u16 adc_touchY; s32 adc_jitterctr; BOOL stylusJitter; //the DSI returns calibrated touch coords from its TSC (?), so we need to save these separately u16 scr_touchX; u16 scr_touchY; BOOL isTouch; u16 pad; u16 paddle; u8 *FW_ARM9BootCode; u8 *FW_ARM7BootCode; u32 FW_ARM9BootCodeAddr; u32 FW_ARM7BootCodeAddr; u32 FW_ARM9BootCodeSize; u32 FW_ARM7BootCodeSize; BOOL sleeping; BOOL cardEjected; u32 freezeBus; //this is not essential NDS runtime state. //it was perhaps a mistake to put it here. //it is far less important than the above. //maybe I should move it. s32 idleCycles[2]; s32 runCycleCollector[2][16]; s32 idleFrameCounter; s32 cpuloopIterationCount; //counts the number of times during a frame that a reschedule happened //console type must be copied in when the system boots. it can't be changed on the fly. int ConsoleType; bool Is_DSI() { return ConsoleType == NDS_CONSOLE_TYPE_DSI; } bool Is_DebugConsole() { return _DebugConsole!=0; } BOOL _DebugConsole; //set if the user requests ensata emulation BOOL ensataEmulation; //there is a hack in the ipc sync for ensata. this tracks its state u32 ensataIpcSyncCounter; //maintains the state of the ensata handshaking protocol u32 ensataHandshake; struct { u8 lcd, gpuMain, gfx3d_render, gfx3d_geometry, gpuSub, dispswap; } power1; //POWCNT1 struct { u8 speakers, wifi /*(initial value=0)*/; } power2; //POWCNT2 bool isInVblank() const { return VCount >= 192; } bool isIn3dVblank() const { return VCount >= 192 && VCount<215; } }; /** /brief A touchscreen calibration point. */ struct NDS_fw_touchscreen_cal { u16 adc_x; u16 adc_y; u8 screen_x; u8 screen_y; }; #define MAX_FW_NICKNAME_LENGTH 10 #define MAX_FW_MESSAGE_LENGTH 26 struct NDS_fw_config_data { NDS_CONSOLE_TYPE ds_type; u8 fav_colour; u8 birth_month; u8 birth_day; u16 nickname[MAX_FW_NICKNAME_LENGTH]; u8 nickname_len; u16 message[MAX_FW_MESSAGE_LENGTH]; u8 message_len; u8 language; //touchscreen calibration NDS_fw_touchscreen_cal touch_cal[2]; }; extern NDSSystem nds; #ifdef GDB_STUB int NDS_Init( struct armcpu_memory_iface *arm9_mem_if, struct armcpu_ctrl_iface **arm9_ctrl_iface, struct armcpu_memory_iface *arm7_mem_if, struct armcpu_ctrl_iface **arm7_ctrl_iface); #else int NDS_Init ( void); #endif void Desmume_InitOnce(); void NDS_DeInit(void); BOOL NDS_SetROM(u8 * rom, u32 mask); NDS_header * NDS_getROMHeader(void); struct RomBanner { RomBanner(bool defaultInit); u16 version; //Version (0001h) u16 crc16; //CRC16 across entries 020h..83Fh u8 reserved[0x1C]; //Reserved (zero-filled) u8 bitmap[0x200]; //Icon Bitmap (32x32 pix) (4x4 tiles, each 4x8 bytes, 4bit depth) u16 palette[0x10]; //Icon Palette (16 colors, 16bit, range 0000h-7FFFh) (Color 0 is transparent, so the 1st palette entry is ignored) enum { NUM_TITLES = 6 }; union { struct { u16 title_jp[0x80]; //Title 0 Japanese (128 characters, 16bit Unicode) u16 title_en[0x80]; //Title 1 English ("") u16 title_fr[0x80]; //Title 2 French ("") u16 title_de[0x80]; //Title 3 German ("") u16 title_it[0x80]; //Title 4 Italian ("") u16 title_es[0x80]; //Title 5 Spanish ("") }; u16 titles[NUM_TITLES][0x80]; }; u8 end0xFF[0x1C0]; //840h ? (Maybe newer/chinese firmware do also support chinese title?) //840h - End of Icon/Title structure (next 1C0h bytes usually FFh-filled) }; struct GameInfo { GameInfo() : romdata(NULL) {} void loadData(char* buf, int size) { resize(size); memcpy(romdata,buf,size); romsize = (u32)size; fillGap(); } void fillGap() { memset(romdata+romsize,0xFF,allocatedSize-romsize); } void resize(int size) { if(romdata != NULL) delete[] romdata; //calculate the necessary mask for the requested size mask = size-1; mask |= (mask >>1); mask |= (mask >>2); mask |= (mask >>4); mask |= (mask >>8); mask |= (mask >>16); //now, we actually need to over-allocate, because bytes from anywhere protected by that mask //could be read from the rom allocatedSize = mask+4; romdata = new char[allocatedSize]; romsize = size; } u32 crc; NDS_header header; char ROMserial[20]; char ROMname[20]; //char ROMfullName[7][0x100]; void populate(); char* romdata; u32 romsize; u32 allocatedSize; u32 mask; const RomBanner& getRomBanner(); bool hasRomBanner(); bool isHomebrew; }; typedef struct TSCalInfo { struct { u16 x1, x2; u16 y1, y2; u16 width; u16 height; } adc; struct { u8 x1, x2; u8 y1, y2; u16 width; u16 height; } scr; } TSCalInfo; extern GameInfo gameInfo; struct UserButtons : buttonstruct { }; struct UserTouch { u16 touchX; u16 touchY; bool isTouch; }; struct UserMicrophone { u32 micButtonPressed; }; struct UserInput { UserButtons buttons; UserTouch touch; UserMicrophone mic; }; // set physical user input // these functions merely request the input to be changed. // the actual change happens later at a specific time during the frame. // this is to minimize the risk of desyncs. void NDS_setTouchPos(u16 x, u16 y); void NDS_releaseTouch(void); void NDS_setPad(bool right,bool left,bool down,bool up,bool select,bool start,bool B,bool A,bool Y,bool X,bool leftShoulder,bool rightShoulder,bool debug, bool lid); void NDS_setMic(bool pressed); // get physical user input // not including the results of autofire/etc. // the effects of calls to "set physical user input" functions will be immediately reflected here though. const UserInput& NDS_getRawUserInput(); const UserInput& NDS_getPrevRawUserInput(); // get final (fully processed) user input // this should match whatever was or would be sent to the game const UserInput& NDS_getFinalUserInput(); // set/get to-be-processed or in-the-middle-of-being-processed user input // to process input, simply call this function and edit the return value. // (applying autofire is one example of processing the input.) // (movie playback is another example.) // this must be done after the raw user input is set // and before that input is sent to the game's memory. UserInput& NDS_getProcessingUserInput(); bool NDS_isProcessingUserInput(); // call once per frame to prepare input for processing void NDS_beginProcessingInput(); // call once per frame to copy the processed input to the final input void NDS_endProcessingInput(); // this is in case something needs reentrancy while processing input void NDS_suspendProcessingInput(bool suspend); int NDS_LoadROM(const char *filename, const char* physicalFilename=0, const char* logicalFilename=0); void NDS_FreeROM(void); void NDS_Reset(); int NDS_ImportSave(const char *filename, u32 force_size = 0); u32 NDS_ImportSaveSize(const char *filename); bool NDS_ExportSave(const char *filename); void nds_savestate(EMUFILE* os); bool nds_loadstate(EMUFILE* is, int size); int NDS_WriteBMP(const char *filename); void NDS_Sleep(); void NDS_TriggerCardEjectIRQ(); void NDS_SkipNextFrame(); #define NDS_SkipFrame(s) if(s) NDS_SkipNext2DFrame(); void NDS_OmitFrameSkip(int force=0); void NDS_debug_break(); void NDS_debug_continue(); void NDS_debug_step(); void execHardware_doAllDma(EDMAMode modeNum); template void NDS_exec(s32 nb = 560190<<1); extern int lagframecounter; static INLINE void NDS_swapScreen(void) { u16 tmp = MainScreen.offset; MainScreen.offset = SubScreen.offset; SubScreen.offset = tmp; } int NDS_WriteBMP_32bppBuffer(int width, int height, const void* buf, const char *filename); extern struct TCommonSettings { TCommonSettings() : GFX3D_HighResolutionInterpolateColor(true) , GFX3D_EdgeMark(true) , GFX3D_Fog(true) , GFX3D_Texture(true) , GFX3D_LineHack(true) , GFX3D_Zelda_Shadow_Depth_Hack(0) , GFX3D_Renderer_Multisample(false) , jit_max_block_size(100) , UseExtBIOS(false) , SWIFromBIOS(false) , PatchSWI3(false) , UseExtFirmware(false) , BootFromFirmware(false) , DebugConsole(false) , EnsataEmulation(false) , cheatsDisable(false) , num_cores(1) , rigorous_timing(false) , advanced_timing(true) , micMode(InternalNoise) , spuInterpolationMode(SPUInterpolation_Linear) , manualBackupType(0) , autodetectBackupMethod(0) , spu_captureMuted(false) , spu_advanced(false) , StylusPressure(50) , ConsoleType(NDS_CONSOLE_TYPE_FAT) , StylusJitter(false) { strcpy(ARM9BIOS, "biosnds9.bin"); strcpy(ARM7BIOS, "biosnds7.bin"); strcpy(Firmware, "firmware.bin"); NDS_FillDefaultFirmwareConfigData(&InternalFirmConf); /* WIFI mode: adhoc = 0, infrastructure = 1 */ wifi.mode = 1; wifi.infraBridgeAdapter = 0; for(int i=0;i<16;i++) spu_muteChannels[i] = false; for(int g=0;g<2;g++) for(int x=0;x<5;x++) dispLayers[g][x]=true; #ifdef HAVE_JIT //zero 06-sep-2012 - shouldnt be defaulting this to true for now, since the jit is buggy. //id rather have people discover a bonus speedhack than discover new bugs in a new version use_jit = false; #else use_jit = false; #endif } bool GFX3D_HighResolutionInterpolateColor; bool GFX3D_EdgeMark; bool GFX3D_Fog; bool GFX3D_Texture; bool GFX3D_LineHack; int GFX3D_Zelda_Shadow_Depth_Hack; bool GFX3D_Renderer_Multisample; bool UseExtBIOS; char ARM9BIOS[256]; char ARM7BIOS[256]; bool SWIFromBIOS; bool PatchSWI3; bool UseExtFirmware; char Firmware[256]; bool BootFromFirmware; struct NDS_fw_config_data InternalFirmConf; NDS_CONSOLE_TYPE ConsoleType; bool DebugConsole; bool EnsataEmulation; bool cheatsDisable; int num_cores; bool single_core() { return num_cores==1; } bool rigorous_timing; int StylusPressure; bool StylusJitter; bool dispLayers[2][5]; FAST_ALIGN bool advanced_timing; bool use_jit; u32 jit_max_block_size; struct _Wifi { int mode; int infraBridgeAdapter; } wifi; enum MicMode { InternalNoise = 0, Sample = 1, Random = 2, Physical = 3, } micMode; SPUInterpolationMode spuInterpolationMode; //this is a temporary hack until we straighten out the flushing logic and/or gxfifo //int gfx3d_flushMode; int autodetectBackupMethod; //this is the user's choice of manual backup type, for cases when the autodetection can't be trusted int manualBackupType; bool spu_muteChannels[16]; bool spu_captureMuted; bool spu_advanced; struct _ShowGpu { _ShowGpu() : main(true), sub(true) {} union { struct { bool main,sub; }; bool screens[2]; }; } showGpu; struct _Hud { _Hud() : ShowInputDisplay(false) , ShowGraphicalInputDisplay(false) , FpsDisplay(false) , FrameCounterDisplay(false) , ShowLagFrameCounter(false) , ShowMicrophone(false) , ShowRTC(false) {} bool ShowInputDisplay, ShowGraphicalInputDisplay, FpsDisplay, FrameCounterDisplay, ShowLagFrameCounter, ShowMicrophone, ShowRTC; } hud; } CommonSettings; extern std::string InputDisplayString; extern int LagFrameFlag; extern int lastLag, TotalLagFrames; void MovieSRAM(); void ClearAutoHold(void); bool ValidateSlot2Access(u32 procnum, u32 demandSRAMSpeed, u32 demand1stROMSpeed, u32 demand2ndROMSpeed, int clockbits); extern ADVANsCEne advsc; #endif desmume-0.9.9/src/common.h0000644000175000017500000000344312140261633016154 0ustar guillaumeguillaume/* Copyright (C) 2008-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ //TODO - dismantle this file #ifndef _COMMON_H_ #define _COMMON_H_ #include #include #include "types.h" #include extern const u8 logo_data[156]; #if defined(WIN32) #include #include #define CLASSNAME "DeSmuME" extern HINSTANCE hAppInst; extern bool romloaded; extern char IniName[MAX_PATH]; extern void GetINIPath(); extern void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file); bool GetPrivateProfileBool(const char* appname, const char* keyname, bool defval, const char* filename); void WritePrivateProfileBool(char* appname, char* keyname, bool val, char* file); #else // non Windows #define sscanf_s sscanf #endif template T reverseBits(T x) { T h = 0; T i = 0; for (i = 0; i < sizeof(T)*8; i++) { h = (h << 1) + (x & 1); x >>= 1; } return h; } template char *intToBin(T val) { char buf[256] = {0}; for (int i = sizeof(T)*8, t = 0; i > 0; --i, t++) { buf[i-1] = (val & (1<. */ #include #include #include #include #include #include "MMU.h" #include "GPU.h" #include "debug.h" #include "render3D.h" #include "gfx3d.h" #include "debug.h" #include "GPU_osd.h" #include "NDSSystem.h" #include "readwrite.h" #ifdef FASTBUILD #undef FORCEINLINE #define FORCEINLINE //compilation speed hack (cuts time exactly in half by cutting out permutations) #define DISABLE_MOSAIC #endif extern BOOL click; NDS_Screen MainScreen; NDS_Screen SubScreen; //instantiate static instance GPU::MosaicLookup GPU::mosaicLookup; //#define DEBUG_TRI CACHE_ALIGN u8 GPU_screen[4*256*192]; CACHE_ALIGN u8 sprWin[256]; u16 gpu_angle = 0; const size sprSizeTab[4][4] = { {{8, 8}, {16, 8}, {8, 16}, {8, 8}}, {{16, 16}, {32, 8}, {8, 32}, {8, 8}}, {{32, 32}, {32, 16}, {16, 32}, {8, 8}}, {{64, 64}, {64, 32}, {32, 64}, {8, 8}}, }; const BGType GPU_mode2type[8][4] = { {BGType_Text, BGType_Text, BGType_Text, BGType_Text}, {BGType_Text, BGType_Text, BGType_Text, BGType_Affine}, {BGType_Text, BGType_Text, BGType_Affine, BGType_Affine}, {BGType_Text, BGType_Text, BGType_Text, BGType_AffineExt}, {BGType_Text, BGType_Text, BGType_Affine, BGType_AffineExt}, {BGType_Text, BGType_Text, BGType_AffineExt, BGType_AffineExt}, {BGType_Invalid, BGType_Invalid, BGType_Large8bpp, BGType_Invalid}, {BGType_Invalid, BGType_Invalid, BGType_Invalid, BGType_Invalid} }; //dont ever think of changing these to bits because you could avoid the multiplies in the main tile blitter. //it doesnt really help any const short sizeTab[8][4][2] = { {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, //Invalid {{256,256}, {512,256}, {256,512}, {512,512}}, //text {{128,128}, {256,256}, {512,512}, {1024,1024}}, //affine {{512,1024}, {1024,512}, {0,0}, {0,0}}, //large 8bpp {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, //affine ext (to be elaborated with another value) {{128,128}, {256,256}, {512,512}, {1024,1024}}, //affine ext 256x16 {{128,128}, {256,256}, {512,256}, {512,512}}, //affine ext 256x1 {{128,128}, {256,256}, {512,256}, {512,512}}, //affine ext direct }; static const CACHE_ALIGN u8 win_empty[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; static CACHE_ALIGN u16 fadeInColors[17][0x8000]; CACHE_ALIGN u16 fadeOutColors[17][0x8000]; //this should be public, because it gets used somewhere else CACHE_ALIGN u8 gpuBlendTable555[17][17][32][32]; /*****************************************************************************/ // INITIALIZATION /*****************************************************************************/ static void GPU_InitFadeColors() { /* NOTE: gbatek (in the reference above) seems to expect 6bit values per component, but as desmume works with 5bit per component, we use 31 as top, instead of 63. Testing it on a few games, using 63 seems to give severe color wraping, and 31 works nicely, so for now we'll just that, until proven wrong. i have seen pics of pokemon ranger getting white with 31, with 63 it is nice. it could be pb of alpha or blending or... MightyMax> created a test NDS to check how the brightness values work, and 31 seems to be correct. FactorEx is a override for max brighten/darken See: http://mightymax.org/gfx_test_brightness.nds The Pokemon Problem could be a problem with 8/32 bit writes not recognized yet, i'll add that so you can check back. */ for(int i = 0; i <= 16; i++) { for(int j = 0x8000; j < 0x10000; j++) { COLOR cur; cur.val = j; cur.bits.red = (cur.bits.red + ((31 - cur.bits.red) * i / 16)); cur.bits.green = (cur.bits.green + ((31 - cur.bits.green) * i / 16)); cur.bits.blue = (cur.bits.blue + ((31 - cur.bits.blue) * i / 16)); cur.bits.alpha = 0; fadeInColors[i][j & 0x7FFF] = cur.val; cur.val = j; cur.bits.red = (cur.bits.red - (cur.bits.red * i / 16)); cur.bits.green = (cur.bits.green - (cur.bits.green * i / 16)); cur.bits.blue = (cur.bits.blue - (cur.bits.blue * i / 16)); cur.bits.alpha = 0; fadeOutColors[i][j & 0x7FFF] = cur.val; } } for(int c0=0;c0<=31;c0++) for(int c1=0;c1<=31;c1++) for(int eva=0;eva<=16;eva++) for(int evb=0;evb<=16;evb++) { int blend = ((c0 * eva) + (c1 * evb) ) / 16; int final = std::min(31,blend); gpuBlendTable555[eva][evb][c0][c1] = final; } } static CACHE_ALIGN GPU GPU_main, GPU_sub; GPU * GPU_Init(u8 l) { GPU * g; if(l==0) g = &GPU_main; else g = &GPU_sub; GPU_Reset(g, l); GPU_InitFadeColors(); g->curr_win[0] = win_empty; g->curr_win[1] = win_empty; g->need_update_winh[0] = true; g->need_update_winh[1] = true; g->setFinalColorBck_funcNum = 0; g->setFinalColor3d_funcNum = 0; g->setFinalColorSpr_funcNum = 0; return g; } void GPU_Reset(GPU *g, u8 l) { memset(g, 0, sizeof(GPU)); //important for emulator stability for this to initialize, since we have to setup a table based on it g->BLDALPHA_EVA = 0; g->BLDALPHA_EVB = 0; //make sure we have our blend table setup even if the game blends without setting the blend variables g->updateBLDALPHA(); g->setFinalColorBck_funcNum = 0; g->setFinalColor3d_funcNum = 0; g->setFinalColorSpr_funcNum = 0; g->core = l; g->BGSize[0][0] = g->BGSize[1][0] = g->BGSize[2][0] = g->BGSize[3][0] = 256; g->BGSize[0][1] = g->BGSize[1][1] = g->BGSize[2][1] = g->BGSize[3][1] = 256; g->spriteRenderMode = GPU::SPRITE_1D; g->bgPrio[4] = 0xFF; g->bg0HasHighestPrio = TRUE; if(g->core == GPU_SUB) { g->oam = (MMU.ARM9_OAM + ADDRESS_STEP_1KB); g->sprMem = MMU_BOBJ; // GPU core B g->dispx_st = (REG_DISPx*)(&MMU.ARM9_REG[REG_DISPB]); } else { g->oam = (MMU.ARM9_OAM); g->sprMem = MMU_AOBJ; // GPU core A g->dispx_st = (REG_DISPx*)(&MMU.ARM9_REG[0]); } } void GPU_DeInit(GPU * gpu) { if(gpu==&GPU_main || gpu==&GPU_sub) return; free(gpu); } static void GPU_resortBGs(GPU *gpu) { int i, prio; struct _DISPCNT * cnt = &gpu->dispx_st->dispx_DISPCNT.bits; itemsForPriority_t * item; // we don't need to check for windows here... // if we tick boxes, invisible layers become invisible & vice versa #define OP ^ ! // if we untick boxes, layers become invisible //#define OP && gpu->LayersEnable[0] = CommonSettings.dispLayers[gpu->core][0] OP(cnt->BG0_Enable/* && !(cnt->BG0_3D && (gpu->core==0))*/); gpu->LayersEnable[1] = CommonSettings.dispLayers[gpu->core][1] OP(cnt->BG1_Enable); gpu->LayersEnable[2] = CommonSettings.dispLayers[gpu->core][2] OP(cnt->BG2_Enable); gpu->LayersEnable[3] = CommonSettings.dispLayers[gpu->core][3] OP(cnt->BG3_Enable); gpu->LayersEnable[4] = CommonSettings.dispLayers[gpu->core][4] OP(cnt->OBJ_Enable); // KISS ! lower priority first, if same then lower num for (i=0;iitemsForPriority[i]); item->nbBGs=0; item->nbPixelsX=0; } for (i=NB_BG; i>0; ) { i--; if (!gpu->LayersEnable[i]) continue; prio = (gpu->dispx_st)->dispx_BGxCNT[i].bits.Priority; item = &(gpu->itemsForPriority[prio]); item->BGs[item->nbBGs]=i; item->nbBGs++; } int bg0Prio = gpu->dispx_st->dispx_BGxCNT[0].bits.Priority; gpu->bg0HasHighestPrio = TRUE; for(i = 1; i < 4; i++) { if(gpu->LayersEnable[i]) { if(gpu->dispx_st->dispx_BGxCNT[i].bits.Priority < bg0Prio) { gpu->bg0HasHighestPrio = FALSE; break; } } } #if 0 //debug for (i=0;iitemsForPriority[i]); printf("%d : ", i); for (j=0; jnbBGs) printf("BG%d ", item->BGs[j]); else printf("... ", item->BGs[j]); } } printf("\n"); #endif } static FORCEINLINE u16 _blend(u16 colA, u16 colB, GPU::TBlendTable* blendTable) { u8 r = (*blendTable)[colA&0x1F][colB&0x1F]; u8 g = (*blendTable)[(colA>>5)&0x1F][(colB>>5)&0x1F]; u8 b = (*blendTable)[(colA>>10)&0x1F][(colB>>10)&0x1F]; return r|(g<<5)|(b<<10); } FORCEINLINE u16 GPU::blend(u16 colA, u16 colB) { return _blend(colA, colB, blendTable); } void GPU_setMasterBrightness (GPU *gpu, u16 val) { if(!nds.isInVblank()) { PROGINFO("Changing master brightness outside of vblank\n"); } gpu->MasterBrightFactor = (val & 0x1F); gpu->MasterBrightMode = (val>>14); //printf("MASTER BRIGHTNESS %d to %d at %d\n",gpu->core,gpu->MasterBrightFactor,nds.VCount); } void SetupFinalPixelBlitter (GPU *gpu) { u8 windowUsed = (gpu->WIN0_ENABLED | gpu->WIN1_ENABLED | gpu->WINOBJ_ENABLED); u8 blendMode = (gpu->BLDCNT >> 6)&3; gpu->setFinalColorSpr_funcNum = windowUsed*4 + blendMode; gpu->setFinalColorBck_funcNum = windowUsed*4 + blendMode; gpu->setFinalColor3d_funcNum = windowUsed*4 + blendMode; } //Sets up LCD control variables for Display Engines A and B for quick reading void GPU_setVideoProp(GPU * gpu, u32 p) { struct _DISPCNT * cnt; cnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; T1WriteLong((u8 *)&(gpu->dispx_st)->dispx_DISPCNT.val, 0, p); gpu->WIN0_ENABLED = cnt->Win0_Enable; gpu->WIN1_ENABLED = cnt->Win1_Enable; gpu->WINOBJ_ENABLED = cnt->WinOBJ_Enable; SetupFinalPixelBlitter (gpu); gpu->dispMode = cnt->DisplayMode & ((gpu->core)?1:3); gpu->vramBlock = cnt->VRAM_Block; switch (gpu->dispMode) { case 0: // Display Off break; case 1: // Display BG and OBJ layers break; case 2: // Display framebuffer gpu->VRAMaddr = (u8 *)MMU.ARM9_LCD + (gpu->vramBlock * 0x20000); break; case 3: // Display from Main RAM // nothing to be done here // see GPU_RenderLine who gets data from FIFO. break; } if(cnt->OBJ_Tile_mapping) { //1-d sprite mapping boundaries: //32k, 64k, 128k, 256k gpu->sprBoundary = 5 + cnt->OBJ_Tile_1D_Bound ; //do not be deceived: even though a sprBoundary==8 (256KB region) is impossible to fully address //in GPU_SUB, it is still fully legal to address it with that granularity. //so don't do this: //if((gpu->core == GPU_SUB) && (cnt->OBJ_Tile_1D_Bound == 3)) gpu->sprBoundary = 7; gpu->spriteRenderMode = GPU::SPRITE_1D; } else { //2d sprite mapping //boundary : 32k gpu->sprBoundary = 5; gpu->spriteRenderMode = GPU::SPRITE_2D; } if(cnt->OBJ_BMP_1D_Bound && (gpu->core == GPU_MAIN)) gpu->sprBMPBoundary = 8; else gpu->sprBMPBoundary = 7; gpu->sprEnable = cnt->OBJ_Enable; GPU_setBGProp(gpu, 3, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 14)); GPU_setBGProp(gpu, 2, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 12)); GPU_setBGProp(gpu, 1, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 10)); GPU_setBGProp(gpu, 0, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 8)); //GPU_resortBGs(gpu); } //this handles writing in BGxCNT void GPU_setBGProp(GPU * gpu, u16 num, u16 p) { struct _BGxCNT * cnt = &((gpu->dispx_st)->dispx_BGxCNT[num].bits); struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; T1WriteWord((u8 *)&(gpu->dispx_st)->dispx_BGxCNT[num].val, 0, p); GPU_resortBGs(gpu); if(gpu->core == GPU_SUB) { gpu->BG_tile_ram[num] = MMU_BBG; gpu->BG_bmp_ram[num] = MMU_BBG; gpu->BG_bmp_large_ram[num] = MMU_BBG; gpu->BG_map_ram[num] = MMU_BBG; } else { gpu->BG_tile_ram[num] = MMU_ABG + dispCnt->CharacBase_Block * ADDRESS_STEP_64KB ; gpu->BG_bmp_ram[num] = MMU_ABG; gpu->BG_bmp_large_ram[num] = MMU_ABG; gpu->BG_map_ram[num] = MMU_ABG + dispCnt->ScreenBase_Block * ADDRESS_STEP_64KB; } gpu->BG_tile_ram[num] += (cnt->CharacBase_Block * ADDRESS_STEP_16KB); gpu->BG_bmp_ram[num] += (cnt->ScreenBase_Block * ADDRESS_STEP_16KB); gpu->BG_map_ram[num] += (cnt->ScreenBase_Block * ADDRESS_STEP_2KB); switch(num) { case 0: case 1: gpu->BGExtPalSlot[num] = cnt->PaletteSet_Wrap * 2 + num ; break; default: gpu->BGExtPalSlot[num] = (u8)num; break; } BGType mode = GPU_mode2type[dispCnt->BG_Mode][num]; //clarify affine ext modes if(mode == BGType_AffineExt) { //see: http://nocash.emubase.de/gbatek.htm#dsvideobgmodescontrol u8 affineModeSelection = (cnt->Palette_256 << 1) | (cnt->CharacBase_Block & 1) ; switch(affineModeSelection) { case 0: case 1: mode = BGType_AffineExt_256x16; break; case 2: mode = BGType_AffineExt_256x1; break; case 3: mode = BGType_AffineExt_Direct; break; } } gpu->BGTypes[num] = mode; gpu->BGSize[num][0] = sizeTab[mode][cnt->ScreenSize][0]; gpu->BGSize[num][1] = sizeTab[mode][cnt->ScreenSize][1]; gpu->bgPrio[num] = (p & 0x3); } /*****************************************************************************/ // ENABLING / DISABLING LAYERS /*****************************************************************************/ void GPU_remove(GPU * gpu, u8 num) { CommonSettings.dispLayers[gpu->core][num] = false; GPU_resortBGs(gpu); } void GPU_addBack(GPU * gpu, u8 num) { CommonSettings.dispLayers[gpu->core][num] = true; GPU_resortBGs(gpu); } /*****************************************************************************/ // ROUTINES FOR INSIDE / OUTSIDE WINDOW CHECKS /*****************************************************************************/ template FORCEINLINE u8 GPU::withinRect(u16 x) const { assert(x<256); //only way to be >256 is in debug views, and mosaic shouldnt be enabled for those return curr_win[WIN_NUM][x]; } // Now assumes that *draw and *effect are different from 0 when called, so we can avoid // setting some values twice FORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) const { // Check if win0 if enabled, and only check if it is // howevever, this has already been taken care of by the window precalculation //if (WIN0_ENABLED) { // it is in win0, do we display ? // high priority if (withinRect<0>(x)) { //INFO("bg%i passed win0 : (%i %i) was within (%i %i)(%i %i)\n", bgnum, x, gpu->currLine, gpu->WIN0H0, gpu->WIN0V0, gpu->WIN0H1, gpu->WIN0V1); draw = (WININ0 >> currBgNum)&1; effect = (WININ0_SPECIAL); return; } } // Check if win1 if enabled, and only check if it is //if (WIN1_ENABLED) // howevever, this has already been taken care of by the window precalculation { // it is in win1, do we display ? // mid priority if(withinRect<1>(x)) { //INFO("bg%i passed win1 : (%i %i) was within (%i %i)(%i %i)\n", bgnum, x, gpu->currLine, gpu->WIN1H0, gpu->WIN1V0, gpu->WIN1H1, gpu->WIN1V1); draw = (WININ1 >> currBgNum)&1; effect = (WININ1_SPECIAL); return; } } //if(true) //sprwin test hack if (WINOBJ_ENABLED) { // it is in winOBJ, do we display ? // low priority if (sprWin[x]) { draw = (WINOBJ >> currBgNum)&1; effect = (WINOBJ_SPECIAL); return; } } if (WINOBJ_ENABLED | WIN1_ENABLED | WIN0_ENABLED) { draw = (WINOUT >> currBgNum) & 1; effect = (WINOUT_SPECIAL); } } /*****************************************************************************/ // PIXEL RENDERING /*****************************************************************************/ template FORCEINLINE FASTCALL void GPU::_master_setFinal3dColor(int dstX, int srcX) { int x = dstX; int passing = dstX<<1; u8* color = &_3dColorLine[srcX<<2]; u8 red = color[0]; u8 green = color[1]; u8 blue = color[2]; u8 alpha = color[3]; u8* dst = currDst; u16 final; bool windowEffect = blend1; //bomberman land touch dialogbox will fail without setting to blend1 //TODO - should we do an alpha==0 -> bail out entirely check here? if(WINDOW) { bool windowDraw = false; renderline_checkWindows(dstX, windowDraw, windowEffect); //we never have anything more to do if the window rejected us if(!windowDraw) return; } int bg_under = bgPixels[dstX]; if(blend2[bg_under]) { alpha++; if(alpha<32) { //if the layer underneath is a blend bottom layer, then 3d always alpha blends with it COLOR c2, cfinal; c2.val = HostReadWord(dst, passing); cfinal.bits.red = ((red * alpha) + ((c2.bits.red<<1) * (32 - alpha)))>>6; cfinal.bits.green = ((green * alpha) + ((c2.bits.green<<1) * (32 - alpha)))>>6; cfinal.bits.blue = ((blue * alpha) + ((c2.bits.blue<<1) * (32 - alpha)))>>6; final = cfinal.val; } else final = R6G6B6TORGB15(red,green,blue); } else { final = R6G6B6TORGB15(red,green,blue); //perform the special effect if(windowEffect) switch(FUNC) { case Increase: final = currentFadeInColors[final&0x7FFF]; break; case Decrease: final = currentFadeOutColors[final&0x7FFF]; break; case NoBlend: case Blend: break; } } HostWriteWord(dst, passing, (final | 0x8000)); bgPixels[x] = 0; } template FORCEINLINE FASTCALL bool GPU::_master_setFinalBGColor(u16 &color, const u32 x) { //no further analysis for no special effects. on backdrops. just draw it. if(FUNC==NoBlend && BACKDROP) return true; //blend backdrop with what?? this doesn't make sense if(FUNC==Blend && BACKDROP) return true; bool windowEffect = true; if(WINDOW) { bool windowDraw = false; renderline_checkWindows(x, windowDraw, windowEffect); //backdrop must always be drawn if(BACKDROP) windowDraw = true; //we never have anything more to do if the window rejected us if(!windowDraw) return false; } //special effects rejected. just draw it. if(!(blend1 && windowEffect)) return true; const u8 bg_under = bgPixels[x]; //perform the special effect switch(FUNC) { case Blend: if(blend2[bg_under]) color = blend(color,HostReadWord(currDst, x<<1)); break; case Increase: color = currentFadeInColors[color]; break; case Decrease: color = currentFadeOutColors[color]; break; case NoBlend: break; } return true; } template static FORCEINLINE void _master_setFinalOBJColor(GPU *gpu, u8 *dst, u16 color, u8 alpha, u8 type, u16 x) { bool windowDraw = true, windowEffect = true; if(WINDOW) { gpu->renderline_checkWindows(x, windowDraw, windowEffect); if(!windowDraw) return; } const bool sourceEffectSelected = gpu->blend1; //note that the fadein and fadeout is done here before blending, //so that a fade and blending can be applied at the same time (actually, I don't think that is legal..) bool forceBlendingForNormal = false; if(windowEffect && sourceEffectSelected) switch(FUNC) { //zero 13-jun-2010 : if(allowBlend) was removed from these; //it should be possible to increase/decrease and also blend //(the effect would be increase, but the obj properties permit blending and the target layers are configured correctly) case Increase: color = gpu->currentFadeInColors[color&0x7FFF]; break; case Decrease: color = gpu->currentFadeOutColors[color&0x7FFF]; break; //only when blend color effect is selected, ordinarily opaque sprites are blended with the color effect params case Blend: forceBlendingForNormal = true; break; case NoBlend: break; } //this inspects the layer beneath the sprite to see if the current blend flags make it a candidate for blending const int bg_under = gpu->bgPixels[x]; const bool allowBlend = (bg_under != 4) && gpu->blend2[bg_under]; if(allowBlend) { u16 backColor = HostReadWord(dst,x<<1); //this hasn't been tested: this blending occurs without regard to the color effect, //but rather purely from the sprite's alpha if(type == GPU_OBJ_MODE_Bitmap) color = _blend(color,backColor,&gpuBlendTable555[alpha+1][15-alpha]); else if(type == GPU_OBJ_MODE_Transparent || forceBlendingForNormal) color = gpu->blend(color,backColor); } HostWriteWord(dst, x<<1, (color | 0x8000)); gpu->bgPixels[x] = 4; } //FUNCNUM is only set for backdrop, for an optimization of looking it up early template FORCEINLINE void GPU::setFinalColorBG(u16 color, const u32 x) { //It is not safe to assert this here. //This is probably the best place to enforce it, since almost every single color that comes in here //will be pulled from a palette that needs the top bit stripped off anyway. //assert((color&0x8000)==0); if(!BACKDROP) color &= 0x7FFF; //but for the backdrop we can easily guarantee earlier that theres no bit here bool draw; const int test = BACKDROP?FUNCNUM:setFinalColorBck_funcNum; switch(test) { case 0: draw = _master_setFinalBGColor(color,x); break; case 1: draw = _master_setFinalBGColor(color,x); break; case 2: draw = _master_setFinalBGColor(color,x); break; case 3: draw = _master_setFinalBGColor(color,x); break; case 4: draw = _master_setFinalBGColor(color,x); break; case 5: draw = _master_setFinalBGColor(color,x); break; case 6: draw = _master_setFinalBGColor(color,x); break; case 7: draw = _master_setFinalBGColor(color,x); break; default: draw = false; break; }; if(BACKDROP || draw) //backdrop must always be drawn { HostWriteWord(currDst, x<<1, color | 0x8000); if(!BACKDROP) bgPixels[x] = currBgNum; //lets do this in the backdrop drawing loop, should be faster } } FORCEINLINE void GPU::setFinalColor3d(int dstX, int srcX) { switch(setFinalColor3d_funcNum) { case 0x0: _master_setFinal3dColor(dstX,srcX); break; case 0x1: _master_setFinal3dColor(dstX,srcX); break; case 0x2: _master_setFinal3dColor(dstX,srcX); break; case 0x3: _master_setFinal3dColor(dstX,srcX); break; case 0x4: _master_setFinal3dColor(dstX,srcX); break; case 0x5: _master_setFinal3dColor(dstX,srcX); break; case 0x6: _master_setFinal3dColor(dstX,srcX); break; case 0x7: _master_setFinal3dColor(dstX,srcX); break; }; } FORCEINLINE void setFinalColorSpr(GPU* gpu, u8 *dst, u16 color, u8 alpha, u8 type, u16 x) { switch(gpu->setFinalColorSpr_funcNum) { case 0x0: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x1: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x2: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x3: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x4: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x5: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x6: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; case 0x7: _master_setFinalOBJColor(gpu, dst, color, alpha, type, x); break; }; } template FORCEINLINE void GPU::__setFinalColorBck(u16 color, const u32 x, const int opaque) { return ___setFinalColorBck(color,x,opaque); } //this was forced inline because most of the time it just falls through to setFinalColorBck() and the function call //overhead was ridiculous and terrible template FORCEINLINE void GPU::___setFinalColorBck(u16 color, const u32 x, const int opaque) { //under ordinary circumstances, nobody should pass in something >=256 //but in fact, someone is going to try. specifically, that is the map viewer debug tools //which try to render the enter BG. in cases where that is large, it could be up to 1024 wide. assert(debug || x<256); int x_int; //due to this early out, we will get incorrect behavior in cases where //we enable mosaic in the middle of a frame. this is deemed unlikely. if(!MOSAIC) { if(opaque) goto finish; else return; } if(!opaque) color = 0xFFFF; else color &= 0x7FFF; //due to the early out, enabled must always be true //x_int = enabled ? GPU::mosaicLookup.width[x].trunc : x; x_int = GPU::mosaicLookup.width[x].trunc; if(GPU::mosaicLookup.width[x].begin && GPU::mosaicLookup.height[currLine].begin) {} else color = mosaicColors.bg[currBgNum][x_int]; mosaicColors.bg[currBgNum][x] = color; if(color != 0xFFFF) { finish: setFinalColorBG(color,x); } } //unpacks an _OAM_ structure from the provided oam buffer (should point at OAM 0) and provided OAM index. //is endian-safe void SlurpOAM(_OAM_* oam_output, void* oam_buffer, int oam_index) { u16* u16_oam_buffer = (u16*)oam_buffer; int u16_offset = oam_index<<2; u16 attr[4]; for(int i=0;i<4;i++) attr[i] = LE_TO_LOCAL_16(u16_oam_buffer[u16_offset + i]); oam_output->Y = (attr[0]>>0) & 0xFF; oam_output->RotScale = (attr[0]>>8)&3; oam_output->Mode = (attr[0]>>10)&3; oam_output->Mosaic = (attr[0]>>12)&1; oam_output->Depth = (attr[0]>>13)&1; oam_output->Shape = (attr[0]>>14)&3; oam_output->X = (((s32)((attr[1]>>0)&0x1FF))<<23)>>23; oam_output->RotScalIndex = (attr[1]>>9)&7; oam_output->HFlip = (attr[1]>>12)&1; oam_output->VFlip = (attr[1]>>13)&1; oam_output->Size = (attr[1]>>14)&3; oam_output->TileIndex = (attr[2]>>0)&0x3FF; oam_output->Priority = (attr[2]>>10)&3; oam_output->PaletteIndex = (attr[2]>>12)&0xF; oam_output->attr3 = attr[3]; } //gets the affine parameter associated with the specified oam index. u16 SlurpOAMAffineParam(void* oam_buffer, int oam_index) { u16* u16_oam_buffer = (u16*)oam_buffer; int u16_offset = oam_index<<2; return LE_TO_LOCAL_16(u16_oam_buffer[u16_offset + 3]); } //this is fantastically inaccurate. //we do the early return even though it reduces the resulting accuracy //because we need the speed, and because it is inaccurate anyway static void mosaicSpriteLinePixel(GPU * gpu, int x, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab) { int x_int; int y = l; _OAM_ spriteInfo; SlurpOAM(&spriteInfo,gpu->oam,gpu->sprNum[x]); bool enabled = spriteInfo.Mosaic!=0; if(!enabled) return; bool opaque = prioTab[x] <= 4; GPU::MosaicColor::Obj objColor; objColor.color = T1ReadWord(dst,x<<1); objColor.alpha = dst_alpha[x]; objColor.opaque = opaque; x_int = enabled ? GPU::mosaicLookup.width[x].trunc : x; if(enabled) { if(GPU::mosaicLookup.width[x].begin && GPU::mosaicLookup.height[y].begin) {} else objColor = gpu->mosaicColors.obj[x_int]; } gpu->mosaicColors.obj[x] = objColor; T1WriteWord(dst,x<<1,objColor.color); dst_alpha[x] = objColor.alpha; if(!objColor.opaque) prioTab[x] = 0xFF; } FORCEINLINE static void mosaicSpriteLine(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab) { //don't even try this unless the mosaic is effective if(gpu->mosaicLookup.widthValue != 0 || gpu->mosaicLookup.heightValue != 0) for(int i=0;i<256;i++) mosaicSpriteLinePixel(gpu,i,l,dst,dst_alpha,typeTab,prioTab); } template void lineLarge8bpp(GPU * gpu) { if(gpu->core == 1) { PROGINFO("Cannot use large 8bpp screen on sub core\n"); return; } u8 num = gpu->currBgNum; u16 XBG = gpu->getHOFS(gpu->currBgNum); u16 YBG = gpu->currLine + gpu->getVOFS(gpu->currBgNum); u16 lg = gpu->BGSize[num][0]; u16 ht = gpu->BGSize[num][1]; u16 wmask = (lg-1); u16 hmask = (ht-1); YBG &= hmask; //TODO - handle wrapping / out of bounds correctly from rot_scale_op? u32 tmp_map = gpu->BG_bmp_large_ram[num] + lg * YBG; u8* map = (u8 *)MMU_gpu_map(tmp_map); u8* pal = MMU.ARM9_VMEM + gpu->core * ADDRESS_STEP_1KB; for(int x = 0; x < lg; ++x, ++XBG) { XBG &= wmask; u8 pixel = map[XBG]; u16 color = T1ReadWord(pal, pixel<<1); gpu->__setFinalColorBck(color,x,color); } } /*****************************************************************************/ // BACKGROUND RENDERING -TEXT- /*****************************************************************************/ // render a text background to the combined pixelbuffer template INLINE void renderline_textBG(GPU * gpu, u16 XBG, u16 YBG, u16 LG) { u8 num = gpu->currBgNum; struct _BGxCNT *bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[num].bits; struct _DISPCNT *dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; u16 lg = gpu->BGSize[num][0]; u16 ht = gpu->BGSize[num][1]; u16 wmask = (lg-1); u16 hmask = (ht-1); u16 tmp = ((YBG & hmask) >> 3); u32 map; u8 *pal, *line; u32 tile; u16 color; u16 xoff; u16 yoff; u32 x = 0; u32 xfin; s8 line_dir = 1; u32 mapinfo; TILEENTRY tileentry; u32 tmp_map = gpu->BG_map_ram[num] + (tmp&31) * 64; if(tmp>31) tmp_map+= ADDRESS_STEP_512B << bgCnt->ScreenSize ; map = tmp_map; tile = gpu->BG_tile_ram[num]; xoff = XBG; pal = MMU.ARM9_VMEM + gpu->core * ADDRESS_STEP_1KB; if(!bgCnt->Palette_256) // color: 16 palette entries { yoff = ((YBG&7)<<2); xfin = 8 - (xoff&7); for(x = 0; x < LG; xfin = std::min(x+8, LG)) { u16 tilePalette = 0; tmp = ((xoff&wmask)>>3); mapinfo = map + (tmp&0x1F) * 2; if(tmp>31) mapinfo += 32*32*2; tileentry.val = T1ReadWord(MMU_gpu_map(mapinfo), 0); tilePalette = (tileentry.bits.Palette*16); line = (u8*)MMU_gpu_map(tile + (tileentry.bits.TileNum * 0x20) + ((tileentry.bits.VFlip) ? (7*4)-yoff : yoff)); if(tileentry.bits.HFlip) { line += (3 - ((xoff&7)>>1)); for(; x < xfin; line --) { u8 currLine = *line; if(!(xoff&1)) { color = T1ReadWord(pal, ((currLine>>4) + tilePalette) << 1); gpu->__setFinalColorBck(color,x,currLine>>4); x++; xoff++; } if(x__setFinalColorBck(color,x,currLine&0xF); x++; xoff++; } } } else { line += ((xoff&7)>>1); for(; x < xfin; line ++) { u8 currLine = *line; if(!(xoff&1)) { color = T1ReadWord(pal, ((currLine&0xF) + tilePalette) << 1); gpu->__setFinalColorBck(color,x,currLine&0xF); x++; xoff++; } if(x>4) + tilePalette) << 1); gpu->__setFinalColorBck(color,x,currLine>>4); x++; xoff++; } } } } return; } //256-color BG if(dispCnt->ExBGxPalette_Enable) // color: extended palette { pal = MMU.ExtPal[gpu->core][gpu->BGExtPalSlot[num]]; if(!pal) return; } yoff = ((YBG&7)<<3); u8* tilePal; xfin = 8 - (xoff&7); u32 extPalMask = -dispCnt->ExBGxPalette_Enable; for(x = 0; x < LG; xfin = std::min(x+8, LG)) { tmp = (xoff & (lg-1))>>3; mapinfo = map + (tmp & 31) * 2; if(tmp > 31) mapinfo += 32*32*2; tileentry.val = T1ReadWord(MMU_gpu_map(mapinfo), 0); tilePal = pal + ((tileentry.bits.Palette<<9)&extPalMask); line = (u8*)MMU_gpu_map(tile + (tileentry.bits.TileNum*0x40) + ((tileentry.bits.VFlip) ? (7*8)-yoff : yoff)); if(tileentry.bits.HFlip) { line += (7 - (xoff&7)); line_dir = -1; } else { line += (xoff&7); line_dir = 1; } for(; x < xfin; ) { color = T1ReadWord(tilePal, (*line) << 1); gpu->__setFinalColorBck(color,x,*line); x++; xoff++; line += line_dir; } } } /*****************************************************************************/ // BACKGROUND RENDERING -ROTOSCALE- /*****************************************************************************/ template FORCEINLINE void rot_tiled_8bit_entry(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i) { u8 palette_entry; u16 tileindex, x, y, color; tileindex = *(u8*)MMU_gpu_map(map + ((auxX>>3) + (auxY>>3) * (lg>>3))); x = (auxX&7); y = (auxY&7); palette_entry = *(u8*)MMU_gpu_map(tile + ((tileindex<<6)+(y<<3)+x)); color = T1ReadWord(pal, palette_entry << 1); gpu->__setFinalColorBck(color,i,palette_entry); } template FORCEINLINE void rot_tiled_16bit_entry(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i) { void* const map_addr = MMU_gpu_map(map + (((auxX>>3) + (auxY>>3) * (lg>>3))<<1)); TILEENTRY tileentry; tileentry.val = T1ReadWord(map_addr, 0); const u16 x = ((tileentry.bits.HFlip) ? 7 - (auxX) : (auxX))&7; const u16 y = ((tileentry.bits.VFlip) ? 7 - (auxY) : (auxY))&7; const u8 palette_entry = *(u8*)MMU_gpu_map(tile + ((tileentry.bits.TileNum<<6)+(y<<3)+x)); const u16 color = T1ReadWord(pal, (palette_entry + (extPal ? (tileentry.bits.Palette<<8) : 0)) << 1); gpu->__setFinalColorBck(color, i, palette_entry); } template FORCEINLINE void rot_256_map(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i) { u8 palette_entry; u16 color; u8* adr = (u8*)MMU_gpu_map((map) + ((auxX + auxY * lg))); palette_entry = *adr; color = T1ReadWord(pal, palette_entry << 1); gpu->__setFinalColorBck(color, i, palette_entry); } template FORCEINLINE void rot_BMP_map(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i) { u16 color; void* adr = MMU_gpu_map((map) + ((auxX + auxY * lg) << 1)); color = T1ReadWord(adr, 0); gpu->__setFinalColorBck(color, i, color&0x8000); } typedef void (*rot_fun)(GPU * gpu, s32 auxX, s32 auxY, int lg, u32 map, u32 tile, u8 * pal, int i); template FORCEINLINE void rot_scale_op(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, u16 LG, s32 wh, s32 ht, u32 map, u32 tile, u8 * pal) { ROTOCOORD x, y; x.val = X; y.val = Y; const s32 dx = (s32)PA; const s32 dy = (s32)PC; // as an optimization, specially handle the fairly common case of // "unrotated + unscaled + no boundary checking required" if(dx==0x100 && dy==0) { s32 auxX = x.bits.Integer; s32 auxY = y.bits.Integer; if(WRAP || (auxX + LG < wh && auxX >= 0 && auxY < ht && auxY >= 0)) { if(WRAP) { auxY = auxY & (ht-1); auxX = auxX & (wh-1); } for(int i = 0; i < LG; ++i) { fun(gpu, auxX, auxY, wh, map, tile, pal, i); auxX++; if(WRAP) auxX = auxX & (wh-1); } return; } } for(int i = 0; i < LG; ++i) { s32 auxX, auxY; auxX = x.bits.Integer; auxY = y.bits.Integer; if(WRAP) { auxX = auxX & (wh-1); auxY = auxY & (ht-1); } if(WRAP || ((auxX >= 0) && (auxX < wh) && (auxY >= 0) && (auxY < ht))) fun(gpu, auxX, auxY, wh, map, tile, pal, i); x.val += dx; y.val += dy; } } template FORCEINLINE void apply_rot_fun(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, u16 LG, u32 map, u32 tile, u8 * pal) { struct _BGxCNT * bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[gpu->currBgNum].bits; s32 wh = gpu->BGSize[gpu->currBgNum][0]; s32 ht = gpu->BGSize[gpu->currBgNum][1]; if(bgCnt->PaletteSet_Wrap) rot_scale_op(gpu, X, Y, PA, PB, PC, PD, LG, wh, ht, map, tile, pal); else rot_scale_op(gpu, X, Y, PA, PB, PC, PD, LG, wh, ht, map, tile, pal); } template FORCEINLINE void rotBG2(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, u16 LG) { u8 num = gpu->currBgNum; u8 * pal = MMU.ARM9_VMEM + gpu->core * 0x400; // printf("rot mode\n"); apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal); } template FORCEINLINE void extRotBG2(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, s16 LG) { u8 num = gpu->currBgNum; struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; u8 *pal; switch(gpu->BGTypes[num]) { case BGType_AffineExt_256x16: if(dispCnt->ExBGxPalette_Enable) pal = MMU.ExtPal[gpu->core][gpu->BGExtPalSlot[num]]; else pal = MMU.ARM9_VMEM + gpu->core * 0x400; if (!pal) return; // 16 bit bgmap entries if(dispCnt->ExBGxPalette_Enable) apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal); else apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal); return; case BGType_AffineExt_256x1: // 256 colors pal = MMU.ARM9_VMEM + gpu->core * 0x400; apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_ram[num], 0, pal); return; case BGType_AffineExt_Direct: // direct colors / BMP apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_ram[num], 0, NULL); return; case BGType_Large8bpp: // large screen 256 colors pal = MMU.ARM9_VMEM + gpu->core * 0x400; apply_rot_fun >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_large_ram[num], 0, pal); return; default: break; } } /*****************************************************************************/ // BACKGROUND RENDERING -HELPER FUNCTIONS- /*****************************************************************************/ #if 0 static void lineNull(GPU * gpu) { } #endif template void lineText(GPU * gpu) { if(gpu->debug) { const s32 wh = gpu->BGSize[gpu->currBgNum][0]; renderline_textBG(gpu, 0, gpu->currLine, wh); } else { const u16 vofs = gpu->getVOFS(gpu->currBgNum); const u16 hofs = gpu->getHOFS(gpu->currBgNum); renderline_textBG(gpu, hofs, gpu->currLine + vofs, 256); } } template void lineRot(GPU * gpu) { BGxPARMS * parms; if (gpu->currBgNum==2) { parms = &(gpu->dispx_st)->dispx_BG2PARMS; } else { parms = &(gpu->dispx_st)->dispx_BG3PARMS; } if(gpu->debug) { s32 wh = gpu->BGSize[gpu->currBgNum][0]; rotBG2(gpu, 0, (s16)gpu->currLine*256, 256,0, 0,-77, wh); } else { rotBG2(gpu, parms->BGxX, parms->BGxY, parms->BGxPA, parms->BGxPB, parms->BGxPC, parms->BGxPD, 256); parms->BGxX += parms->BGxPB; parms->BGxY += parms->BGxPD; } } template void lineExtRot(GPU * gpu) { BGxPARMS * parms; if (gpu->currBgNum==2) { parms = &(gpu->dispx_st)->dispx_BG2PARMS; } else { parms = &(gpu->dispx_st)->dispx_BG3PARMS; } if(gpu->debug) { s32 wh = gpu->BGSize[gpu->currBgNum][0]; extRotBG2(gpu, 0, (s16)gpu->currLine*256, 256,0, 0,-77, wh); } else { extRotBG2(gpu, parms->BGxX, parms->BGxY, parms->BGxPA, parms->BGxPB, parms->BGxPC, parms->BGxPD, 256); parms->BGxX += parms->BGxPB; parms->BGxY += parms->BGxPD; } } /*****************************************************************************/ // SPRITE RENDERING -HELPER FUNCTIONS- /*****************************************************************************/ /* if i understand it correct, and it fixes some sprite problems in chameleon shot */ /* we have a 15 bit color, and should use the pal entry bits as alpha ?*/ /* http://nocash.emubase.de/gbatek.htm#dsvideoobjs */ INLINE void render_sprite_BMP (GPU * gpu, u8 spriteNum, u16 l, u8 * dst, u32 srcadr, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha) { int i; u16 color; for(i = 0; i < lg; i++, ++sprX, x+=xdir) { u16* src = (u16*)MMU_gpu_map(srcadr+(x<<1)); color = LE_TO_LOCAL_16(*src); // alpha bit = invisible if ((color&0x8000)&&(priosprNum[sprX] = spriteNum; } } } INLINE void render_sprite_256(GPU * gpu, u8 spriteNum, u16 l, u8 * dst, u32 srcadr, u16 * pal, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha) { int i; u8 palette_entry; u16 color; for(i = 0; i < lg; i++, ++sprX, x+=xdir) { u32 adr = srcadr + (x&0x7) + ((x&0xFFF8)<<3); u8* src = (u8 *)MMU_gpu_map(adr); palette_entry = *src; color = LE_TO_LOCAL_16(pal[palette_entry]); // palette entry = 0 means backdrop if ((palette_entry>0)&&(priosprNum[sprX] = spriteNum; } } } INLINE void render_sprite_16 ( GPU * gpu, u16 l, u8 * dst, u32 srcadr, u16 * pal, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha) { int i; u8 palette, palette_entry; u16 color, x1; for(i = 0; i < lg; i++, ++sprX, x+=xdir) { x1 = x>>1; u32 adr = srcadr + (x1&0x3) + ((x1&0xFFFC)<<3); u8* src = (u8 *)MMU_gpu_map(adr);// palette = *src; if (x & 1) palette_entry = palette >> 4; else palette_entry = palette & 0xF; color = LE_TO_LOCAL_16(pal[palette_entry]); // palette entry = 0 means backdrop if ((palette_entry>0)&&(prio>1; palette = src[(x1&0x3) + ((x1&0xFFFC)<<3)]; if (x & 1) palette_entry = palette >> 4; else palette_entry = palette & 0xF; //sprWin[sprX] = (palette_entry)?1:0; if(palette_entry) sprWin[sprX] = 1; } } } // return val means if the sprite is to be drawn or not FORCEINLINE BOOL compute_sprite_vars(_OAM_ * spriteInfo, u16 l, size &sprSize, s32 &sprX, s32 &sprY, s32 &x, s32 &y, s32 &lg, int &xdir) { x = 0; // get sprite location and size sprX = (spriteInfo->X/*<<23*/)/*>>23*/; sprY = spriteInfo->Y; sprSize = sprSizeTab[spriteInfo->Size][spriteInfo->Shape]; lg = sprSize.x; if (sprY>=192) sprY = (s32)((s8)(spriteInfo->Y)); // FIXME: for rot/scale, a list of entries into the sprite should be maintained, // that tells us where the first pixel of a screenline starts in the sprite, // and how a step to the right in a screenline translates within the sprite //this wasn't really tested by anything. very unlikely to get triggered y = (l - sprY)&255; /* get the y line within sprite coords */ if(y >= sprSize.y) return FALSE; if((sprX==256)||(sprX+sprSize.x<=0)) /* sprite pixels outside of line */ return FALSE; /* not to be drawn */ // sprite portion out of the screen (LEFT) if(sprX<0) { lg += sprX; x = -(sprX); sprX = 0; } // sprite portion out of the screen (RIGHT) if (sprX+sprSize.x >= 256) lg = 256 - sprX; // switch TOP<-->BOTTOM if (spriteInfo->VFlip) y = sprSize.y - y -1; // switch LEFT<-->RIGHT if (spriteInfo->HFlip) { x = sprSize.x - x -1; xdir = -1; } else { xdir = 1; } return TRUE; } /*****************************************************************************/ // SPRITE RENDERING /*****************************************************************************/ //TODO - refactor this so there isnt as much duped code between rotozoomed and non-rotozoomed versions static u32 bmp_sprite_address(GPU* gpu, _OAM_ * spriteInfo, size sprSize, s32 y) { if (gpu->dispCnt().OBJ_BMP_mapping) { //tested by buffy sacrifice damage blood splatters in corner return gpu->sprMem + (spriteInfo->TileIndex<sprBMPBoundary) + (y*sprSize.x*2); } else { //2d mapping: //verified in rotozoomed mode by knights in the nightmare intro if (gpu->dispCnt().OBJ_BMP_2D_dim) //256*256, verified by heroes of mana FMV intro return gpu->sprMem + (((spriteInfo->TileIndex&0x3E0) * 64 + (spriteInfo->TileIndex&0x1F) *8 + ( y << 8)) << 1); else //128*512, verified by harry potter and the order of the phoenix conversation portraits return gpu->sprMem + (((spriteInfo->TileIndex&0x3F0) * 64 + (spriteInfo->TileIndex&0x0F) *8 + ( y << 7)) << 1); } } template void GPU::_spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab) { u16 l = currLine; GPU *gpu = this; int cost = 0; struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; u8 block = gpu->sprBoundary; for(int i = 0; i<128; i++) { _OAM_ oam; _OAM_* spriteInfo = &oam; SlurpOAM(spriteInfo, gpu->oam, i); //for each sprite: if(cost>=2130) { //out of sprite rendering time //printf("sprite overflow!\n"); //return; } //do we incur a cost if a sprite is disabled?? we guess so. cost += 2; size sprSize; s32 sprX, sprY, x, y, lg; int xdir; u8 prio, * src; u32 srcadr; u16 j; // Check if sprite is disabled before everything if (spriteInfo->RotScale == 2) continue; prio = spriteInfo->Priority; if (spriteInfo->RotScale & 1) { s32 fieldX, fieldY, auxX, auxY, realX, realY, offset; u8 blockparameter, *pal; s16 dx, dmx, dy, dmy; u16 colour; // Get sprite positions and size sprX = (spriteInfo->X<<23)>>23; sprY = spriteInfo->Y; sprSize = sprSizeTab[spriteInfo->Size][spriteInfo->Shape]; lg = sprSize.x; if (sprY>=192) sprY = (s32)((s8)(spriteInfo->Y)); // Copy sprite size, to check change it if needed fieldX = sprSize.x; fieldY = sprSize.y; // If we are using double size mode, double our control vars if (spriteInfo->RotScale & 2) { fieldX <<= 1; fieldY <<= 1; lg <<= 1; } //check if the sprite is visible y-wise. unfortunately our logic for x and y is different due to our scanline based rendering //tested thoroughly by many large sprites in Super Robot Wars K which wrap around the screen y = (l - sprY)&255; if(y >= fieldY) continue; //check if sprite is visible x-wise. if((sprX==256) || (sprX+fieldX<=0)) continue; cost += sprSize.x*2 + 10; // Get which four parameter block is assigned to this sprite blockparameter = (spriteInfo->RotScalIndex + (spriteInfo->HFlip<< 3) + (spriteInfo->VFlip << 4))*4; // Get rotation/scale parameters dx = SlurpOAMAffineParam(gpu->oam,blockparameter+0); dmx = SlurpOAMAffineParam(gpu->oam,blockparameter+1); dy = SlurpOAMAffineParam(gpu->oam,blockparameter+2); dmy = SlurpOAMAffineParam(gpu->oam,blockparameter+3); // Calculate fixed poitn 8.8 start offsets realX = ((sprSize.x) << 7) - (fieldX >> 1)*dx - (fieldY>>1)*dmx + y * dmx; realY = ((sprSize.y) << 7) - (fieldX >> 1)*dy - (fieldY>>1)*dmy + y * dmy; if(sprX<0) { // If sprite is not in the window if(sprX + fieldX <= 0) continue; // Otherwise, is partially visible lg += sprX; realX -= sprX*dx; realY -= sprX*dy; sprX = 0; } else { if(sprX+fieldX>256) lg = 256 - sprX; } // If we are using 1 palette of 256 colours if(spriteInfo->Depth) { src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex << block)); // If extended palettes are set, use them if (dispCnt->ExOBJPalette_Enable) pal = (MMU.ObjExtPal[gpu->core][0]+(spriteInfo->PaletteIndex*0x200)); else pal = (MMU.ARM9_VMEM + 0x200 + gpu->core *0x400); for(j = 0; j < lg; ++j, ++sprX) { // Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data auxX = (realX>>8); auxY = (realY>>8); if (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y) { if(MODE == SPRITE_2D) offset = (auxX&0x7) + ((auxX&0xFFF8)<<3) + ((auxY>>3)<<10) + ((auxY&0x7)*8); else offset = (auxX&0x7) + ((auxX&0xFFF8)<<3) + ((auxY>>3)*sprSize.x*8) + ((auxY&0x7)*8); colour = src[offset]; if (colour && (prioMode; prioTab[sprX] = prio; } } // Add the rotation/scale coeficients, here the rotation/scaling // is performed realX += dx; realY += dy; } continue; } // Rotozoomed direct color else if(spriteInfo->Mode == 3) { //transparent (i think, dont bother to render?) if alpha is 0 if(spriteInfo->PaletteIndex == 0) continue; srcadr = bmp_sprite_address(this,spriteInfo,sprSize,0); for(j = 0; j < lg; ++j, ++sprX) { // Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data auxX = (realX>>8); auxY = (realY>>8); //this is all very slow, and so much dup code with other rotozoomed modes. //dont bother fixing speed until this whole thing gets reworked if (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y) { if(dispCnt->OBJ_BMP_2D_dim) //tested by knights in the nightmare offset = (bmp_sprite_address(this,spriteInfo,sprSize,auxY)-srcadr)/2+auxX; else //tested by lego indiana jones (somehow?) //tested by buffy sacrifice damage blood splatters in corner offset = auxX + (auxY*sprSize.x); u16* mem = (u16*)MMU_gpu_map(srcadr + (offset<<1)); colour = T1ReadWord(mem,0); if((colour&0x8000) && (prioPaletteIndex; typeTab[sprX] = spriteInfo->Mode; prioTab[sprX] = prio; } } // Add the rotation/scale coeficients, here the rotation/scaling // is performed realX += dx; realY += dy; } continue; } // Rotozoomed 16/16 palette else { if(MODE == SPRITE_2D) { src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<<5)); pal = MMU.ARM9_VMEM + 0x200 + (gpu->core*0x400 + (spriteInfo->PaletteIndex*32)); } else { src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<sprBoundary)); pal = MMU.ARM9_VMEM + 0x200 + gpu->core*0x400 + (spriteInfo->PaletteIndex*32); } for(j = 0; j < lg; ++j, ++sprX) { // Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data auxX = (realX>>8); auxY = (realY>>8); if (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y) { if(MODE == SPRITE_2D) offset = ((auxX>>1)&0x3) + (((auxX>>1)&0xFFFC)<<3) + ((auxY>>3)<<10) + ((auxY&0x7)*4); else offset = ((auxX>>1)&0x3) + (((auxX>>1)&0xFFFC)<<3) + ((auxY>>3)*sprSize.x)*4 + ((auxY&0x7)*4); colour = src[offset]; // Get 4bits value from the readed 8bits if (auxX&1) colour >>= 4; else colour &= 0xF; if(colour && (prioMode==2) sprWin[sprX] = 1; else { HostWriteWord(dst, (sprX<<1), LE_TO_LOCAL_16(HostReadWord(pal, colour << 1))); dst_alpha[sprX] = 16; typeTab[sprX] = spriteInfo->Mode; prioTab[sprX] = prio; } } } // Add the rotation/scale coeficients, here the rotation/scaling // is performed realX += dx; realY += dy; } continue; } } else //NOT rotozoomed { u16 * pal; if (!compute_sprite_vars(spriteInfo, l, sprSize, sprX, sprY, x, y, lg, xdir)) continue; cost += sprSize.x; if (spriteInfo->Mode == 2) { if(MODE == SPRITE_2D) { if (spriteInfo->Depth) src = (u8 *)MMU_gpu_map(gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8)); else src = (u8 *)MMU_gpu_map(gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*4)); } else { if (spriteInfo->Depth) src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<>3)*sprSize.x*8) + ((y&0x7)*8)); else src = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<>3)*sprSize.x*4) + ((y&0x7)*4)); } render_sprite_Win (gpu, l, src, spriteInfo->Depth, lg, sprX, x, xdir); continue; } if (spriteInfo->Mode == 3) //sprite is in BMP format { srcadr = bmp_sprite_address(this,spriteInfo,sprSize, y); //transparent (i think, dont bother to render?) if alpha is 0 if(spriteInfo->PaletteIndex == 0) continue; render_sprite_BMP (gpu, i, l, dst, srcadr, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->PaletteIndex); continue; } if(spriteInfo->Depth) //256 colors { if(MODE == SPRITE_2D) srcadr = gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8); else srcadr = gpu->sprMem + (spriteInfo->TileIndex<>3)*sprSize.x*8) + ((y&0x7)*8); if (dispCnt->ExOBJPalette_Enable) pal = (u16*)(MMU.ObjExtPal[gpu->core][0]+(spriteInfo->PaletteIndex*0x200)); else pal = (u16*)(MMU.ARM9_VMEM + 0x200 + gpu->core *0x400); render_sprite_256(gpu, i, l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1); continue; } // 16 colors if(MODE == SPRITE_2D) { srcadr = gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*4); } else { srcadr = gpu->sprMem + (spriteInfo->TileIndex<>3)*sprSize.x*4) + ((y&0x7)*4); } pal = (u16*)(MMU.ARM9_VMEM + 0x200 + gpu->core * 0x400); pal += (spriteInfo->PaletteIndex<<4); render_sprite_16 (gpu, l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1); } } } /*****************************************************************************/ // SCREEN FUNCTIONS /*****************************************************************************/ int Screen_Init() { MainScreen.gpu = GPU_Init(0); SubScreen.gpu = GPU_Init(1); memset(GPU_screen, 0, sizeof(GPU_screen)); for(int i = 0; i < (256*192*2); i++) ((u16*)GPU_screen)[i] = 0x7FFF; disp_fifo.head = disp_fifo.tail = 0; if (osd) {delete osd; osd =NULL; } osd = new OSDCLASS(-1); return 0; } void Screen_Reset(void) { GPU_Reset(MainScreen.gpu, 0); GPU_Reset(SubScreen.gpu, 1); memset(GPU_screen, 0, sizeof(GPU_screen)); for(int i = 0; i < (256*192*2); i++) ((u16*)GPU_screen)[i] = 0x7FFF; disp_fifo.head = disp_fifo.tail = 0; osd->clear(); } void Screen_DeInit(void) { GPU_DeInit(MainScreen.gpu); GPU_DeInit(SubScreen.gpu); if (osd) {delete osd; osd =NULL; } } /*****************************************************************************/ // GPU_RenderLine /*****************************************************************************/ void GPU_set_DISPCAPCNT(u32 val) { GPU * gpu = MainScreen.gpu; struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; gpu->dispCapCnt.val = val; gpu->dispCapCnt.EVA = std::min((u32)16, (val & 0x1F)); gpu->dispCapCnt.EVB = std::min((u32)16, ((val >> 8) & 0x1F)); gpu->dispCapCnt.writeBlock = (val >> 16) & 0x03; gpu->dispCapCnt.writeOffset = (val >> 18) & 0x03; gpu->dispCapCnt.readBlock = dispCnt->VRAM_Block; if (dispCnt->DisplayMode == 2) gpu->dispCapCnt.readOffset = 0; else gpu->dispCapCnt.readOffset = (val >> 26) & 0x03; gpu->dispCapCnt.srcA = (val >> 24) & 0x01; gpu->dispCapCnt.srcB = (val >> 25) & 0x01; gpu->dispCapCnt.capSrc = (val >> 29) & 0x03; switch((val >> 20) & 0x03) { case 0: gpu->dispCapCnt.capx = DISPCAPCNT::_128; gpu->dispCapCnt.capy = 128; break; case 1: gpu->dispCapCnt.capx = DISPCAPCNT::_256; gpu->dispCapCnt.capy = 64; break; case 2: gpu->dispCapCnt.capx = DISPCAPCNT::_256; gpu->dispCapCnt.capy = 128; break; case 3: gpu->dispCapCnt.capx = DISPCAPCNT::_256; gpu->dispCapCnt.capy = 192; break; } /*INFO("Capture 0x%X:\n EVA=%i, EVB=%i, wBlock=%i, wOffset=%i, capX=%i, capY=%i\n rBlock=%i, rOffset=%i, srcCap=%i, dst=0x%X, src=0x%X\n srcA=%i, srcB=%i\n\n", val, gpu->dispCapCnt.EVA, gpu->dispCapCnt.EVB, gpu->dispCapCnt.writeBlock, gpu->dispCapCnt.writeOffset, gpu->dispCapCnt.capx, gpu->dispCapCnt.capy, gpu->dispCapCnt.readBlock, gpu->dispCapCnt.readOffset, gpu->dispCapCnt.capSrc, gpu->dispCapCnt.dst - MMU.ARM9_LCD, gpu->dispCapCnt.src - MMU.ARM9_LCD, gpu->dispCapCnt.srcA, gpu->dispCapCnt.srcB);*/ } static void GPU_RenderLine_layer(NDS_Screen * screen, u16 l) { CACHE_ALIGN u8 spr[512]; CACHE_ALIGN u8 sprAlpha[256]; CACHE_ALIGN u8 sprType[256]; CACHE_ALIGN u8 sprPrio[256]; GPU * gpu = screen->gpu; struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits; itemsForPriority_t * item; u16 i16; BOOL BG_enabled = TRUE; gpu->currentFadeInColors = &fadeInColors[gpu->BLDY_EVY][0]; gpu->currentFadeOutColors = &fadeOutColors[gpu->BLDY_EVY][0]; u16 backdrop_color = T1ReadWord(MMU.ARM9_VMEM, gpu->core * 0x400) & 0x7FFF; //we need to write backdrop colors in the same way as we do BG pixels in order to do correct window processing //this is currently eating up 2fps or so. it is a reasonable candidate for optimization. gpu->currBgNum = 5; switch(gpu->setFinalColorBck_funcNum) { //for backdrops, blend isnt applied (it's illogical, isnt it?) case 0: case 1: PLAIN_CLEAR: memset_u16_le<256>(gpu->currDst,backdrop_color); break; //for backdrops, fade in and fade out can be applied if it's a 1st target screen case 2: if(gpu->BLDCNT & 0x20) //backdrop is selected for color effect memset_u16_le<256>(gpu->currDst,gpu->currentFadeInColors[backdrop_color]); else goto PLAIN_CLEAR; break; case 3: if(gpu->BLDCNT & 0x20) //backdrop is selected for color effect memset_u16_le<256>(gpu->currDst,gpu->currentFadeOutColors[backdrop_color]); else goto PLAIN_CLEAR; break; //windowed cases apparently need special treatment? why? can we not render the backdrop? how would that even work? case 4: for(int x=0;x<256;x++) gpu->___setFinalColorBck(backdrop_color,x,1); break; case 5: for(int x=0;x<256;x++) gpu->___setFinalColorBck(backdrop_color,x,1); break; case 6: for(int x=0;x<256;x++) gpu->___setFinalColorBck(backdrop_color,x,1); break; case 7: for(int x=0;x<256;x++) gpu->___setFinalColorBck(backdrop_color,x,1); break; } memset(gpu->bgPixels,5,256); // init background color & priorities memset(sprAlpha, 0, 256); memset(sprType, 0, 256); memset(sprPrio, 0xFF, 256); memset(sprWin, 0, 256); // init pixels priorities assert(NB_PRIORITIES==4); gpu->itemsForPriority[0].nbPixelsX = 0; gpu->itemsForPriority[1].nbPixelsX = 0; gpu->itemsForPriority[2].nbPixelsX = 0; gpu->itemsForPriority[3].nbPixelsX = 0; // for all the pixels in the line if (gpu->LayersEnable[4]) { //n.b. - this is clearing the sprite line buffer to the background color, //but it has been changed to write u32 instead of u16 for a little speedup for(int i = 0; i< 128; ++i) HostWriteTwoWords(spr, i << 2, backdrop_color | (backdrop_color<<16)); //zero 06-may-09: I properly supported window color effects for backdrop, but I am not sure //how it interacts with this. I wish we knew why we needed this gpu->spriteRender(spr, sprAlpha, sprType, sprPrio); mosaicSpriteLine(gpu, l, spr, sprAlpha, sprType, sprPrio); for(int i = 0; i<256; i++) { // assign them to the good priority item int prio = sprPrio[i]; if (prio >=4) continue; item = &(gpu->itemsForPriority[prio]); item->PixelsX[item->nbPixelsX]=i; item->nbPixelsX++; } } if (!gpu->LayersEnable[0] && !gpu->LayersEnable[1] && !gpu->LayersEnable[2] && !gpu->LayersEnable[3]) BG_enabled = FALSE; for(int j=0;j<8;j++) gpu->blend2[j] = (gpu->BLDCNT & (0x100 << j))!=0; // paint lower priorities first // then higher priorities on top for(int prio=NB_PRIORITIES; prio > 0; ) { prio--; item = &(gpu->itemsForPriority[prio]); // render BGs if (BG_enabled) { for (int i=0; i < item->nbBGs; i++) { i16 = item->BGs[i]; if (gpu->LayersEnable[i16]) { gpu->currBgNum = (u8)i16; gpu->blend1 = (gpu->BLDCNT & (1 << gpu->currBgNum))!=0; struct _BGxCNT *bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[i16].bits; gpu->curr_mosaic_enabled = bgCnt->Mosaic_Enable; if (gpu->core == GPU_MAIN) { if (i16 == 0 && dispCnt->BG0_3D) { gpu->currBgNum = 0; const u16 hofs = gpu->getHOFS(i16); gfx3d_GetLineData(l, &gpu->_3dColorLine); u8* colorLine = gpu->_3dColorLine; for(int k = 0; k < 256; k++) { int q = ((k + hofs) & 0x1FF); if((q < 0) || (q > 255)) continue; if(colorLine[(q<<2)+3]) gpu->setFinalColor3d(k, q); } continue; } } //useful for debugging individual layers //if(gpu->core == 1 || i16 != 2) continue; #ifndef DISABLE_MOSAIC if(gpu->curr_mosaic_enabled) gpu->modeRender(i16); else #endif gpu->modeRender(i16); } //layer enabled } } // render sprite Pixels if (gpu->LayersEnable[4]) { gpu->currBgNum = 4; gpu->blend1 = (gpu->BLDCNT & (1 << gpu->currBgNum))!=0; for (int i=0; i < item->nbPixelsX; i++) { i16=item->PixelsX[i]; setFinalColorSpr(gpu, gpu->currDst, HostReadWord(spr, (i16<<1)), sprAlpha[i16], sprType[i16], i16); } } } } template static void GPU_RenderLine_DispCapture(u16 l) { //this macro takes advantage of the fact that there are only two possible values for capx #define CAPCOPY(SRC,DST,SETALPHABIT) \ switch(gpu->dispCapCnt.capx) { \ case DISPCAPCNT::_128: \ for (int i = 0; i < 128; i++) \ HostWriteWord(DST, i << 1, HostReadWord(SRC, i << 1) | (SETALPHABIT?(1<<15):0)); \ break; \ case DISPCAPCNT::_256: \ for (int i = 0; i < 256; i++) \ HostWriteWord(DST, i << 1, HostReadWord(SRC, i << 1) | (SETALPHABIT?(1<<15):0)); \ break; \ default: assert(false); \ } GPU * gpu = MainScreen.gpu; if (l == 0) { if (gpu->dispCapCnt.val & 0x80000000) { gpu->dispCapCnt.enabled = TRUE; T1WriteLong(MMU.ARM9_REG, 0x64, gpu->dispCapCnt.val); } } bool skip = SKIP; if (gpu->dispCapCnt.enabled) { //128-wide captures should write linearly into memory, with no gaps //this is tested by hotel dusk u32 ofsmul = gpu->dispCapCnt.capx==DISPCAPCNT::_128?256:512; u32 cap_src_adr = gpu->dispCapCnt.readOffset * 0x8000 + (l * 512); u32 cap_dst_adr = gpu->dispCapCnt.writeOffset * 0x8000 + (l * ofsmul); //Read/Write block wrap to 00000h when exceeding 1FFFFh (128k) //this has not been tested yet (I thought I needed it for hotel dusk, but it was fixed by the above) cap_src_adr &= 0x1FFFF; cap_dst_adr &= 0x1FFFF; cap_src_adr += gpu->dispCapCnt.readBlock * 0x20000; cap_dst_adr += gpu->dispCapCnt.writeBlock * 0x20000; u8* cap_src = MMU.ARM9_LCD + cap_src_adr; u8* cap_dst = MMU.ARM9_LCD + cap_dst_adr; //we must block captures when the capture dest is not mapped to LCDC if(vramConfiguration.banks[gpu->dispCapCnt.writeBlock].purpose != VramConfiguration::LCDC) skip = true; //we must return zero from reads from memory not mapped to lcdc if(vramConfiguration.banks[gpu->dispCapCnt.readBlock].purpose != VramConfiguration::LCDC) cap_src = MMU.blank_memory; if(!skip) if (l < gpu->dispCapCnt.capy) { switch (gpu->dispCapCnt.capSrc) { case 0: // Capture source is SourceA { //INFO("Capture source is SourceA\n"); switch (gpu->dispCapCnt.srcA) { case 0: // Capture screen (BG + OBJ + 3D) { //INFO("Capture screen (BG + OBJ + 3D)\n"); u8 *src; src = (u8*)(gpu->tempScanline); CAPCOPY(src,cap_dst,true); } break; case 1: // Capture 3D { //INFO("Capture 3D\n"); u16* colorLine; gfx3d_GetLineData15bpp(l, &colorLine); CAPCOPY(((u8*)colorLine),cap_dst,false); } break; } } break; case 1: // Capture source is SourceB { //INFO("Capture source is SourceB\n"); switch (gpu->dispCapCnt.srcB) { case 0: //Capture VRAM CAPCOPY(cap_src,cap_dst,true); break; case 1: //capture dispfifo //(not yet tested) for(int i=0; i < 128; i++) T1WriteLong(cap_dst, i << 2, DISP_FIFOrecv()); break; } } break; default: // Capture source is SourceA+B blended { //INFO("Capture source is SourceA+B blended\n"); u16 *srcA = NULL; u16 *srcB = NULL; if (gpu->dispCapCnt.srcA == 0) { // Capture screen (BG + OBJ + 3D) srcA = (u16*)(gpu->tempScanline); } else { gfx3d_GetLineData15bpp(l, &srcA); } static u16 fifoLine[256]; if (gpu->dispCapCnt.srcB == 0) // VRAM screen srcB = (u16 *)cap_src; else { //fifo - tested by splinter cell chaos theory thermal view srcB = fifoLine; for (int i=0; i < 128; i++) T1WriteLong((u8*)srcB, i << 2, DISP_FIFOrecv()); } const int todo = (gpu->dispCapCnt.capx==DISPCAPCNT::_128?128:256); for(u16 i = 0; i < todo; i++) { u16 a,r,g,b; u16 a_alpha = srcA[i] & 0x8000; u16 b_alpha = srcB[i] & 0x8000; if(a_alpha) { a = 0x8000; r = ((srcA[i] & 0x1F) * gpu->dispCapCnt.EVA); g = (((srcA[i] >> 5) & 0x1F) * gpu->dispCapCnt.EVA); b = (((srcA[i] >> 10) & 0x1F) * gpu->dispCapCnt.EVA); } else a = r = g = b = 0; if(b_alpha) { a = 0x8000; r += ((srcB[i] & 0x1F) * gpu->dispCapCnt.EVB); g += (((srcB[i] >> 5) & 0x1F) * gpu->dispCapCnt.EVB); b += (((srcB[i] >> 10) & 0x1F) * gpu->dispCapCnt.EVB); } r >>= 4; g >>= 4; b >>= 4; //freedom wings sky will overflow while doing some fsaa/motionblur effect without this r = std::min((u16)31,r); g = std::min((u16)31,g); b = std::min((u16)31,b); HostWriteWord(cap_dst, i << 1, a | (b << 10) | (g << 5) | r); } } break; } } if (l>=191) { gpu->dispCapCnt.enabled = FALSE; gpu->dispCapCnt.val &= 0x7FFFFFFF; T1WriteLong(MMU.ARM9_REG, 0x64, gpu->dispCapCnt.val); return; } } } static INLINE void GPU_RenderLine_MasterBrightness(NDS_Screen * screen, u16 l) { GPU * gpu = screen->gpu; u8 * dst = GPU_screen + (screen->offset + l) * 512; u16 i16; //isn't it odd that we can set uselessly high factors here? //factors above 16 change nothing. curious. int factor = gpu->MasterBrightFactor; if(factor==0) return; if(factor>16) factor=16; //Apply final brightness adjust (MASTER_BRIGHT) //http://nocash.emubase.de/gbatek.htm#dsvideo (Under MASTER_BRIGHTNESS) switch (gpu->MasterBrightMode) { // Disabled case 0: break; // Bright up case 1: { if(factor != 16) { for(i16 = 0; i16 < 256; ++i16) { ((u16*)dst)[i16] = fadeInColors[factor][((u16*)dst)[i16]&0x7FFF]; } } else { // all white (optimization) for(i16 = 0; i16 < 256; ++i16) ((u16*)dst)[i16] = 0x7FFF; } break; } // Bright down case 2: { if(factor != 16) { for(i16 = 0; i16 < 256; ++i16) { ((u16*)dst)[i16] = fadeOutColors[factor][((u16*)dst)[i16]&0x7FFF]; } } else { // all black (optimization) memset(dst, 0, 512); } break; } // Reserved case 3: break; } } template FORCEINLINE void GPU::setup_windows() { u8 y = currLine; u16 startY,endY; if(WIN_NUM==0) { startY = WIN0V0; endY = WIN0V1; } else { startY = WIN1V0; endY = WIN1V1; } if(WIN_NUM == 0 && !WIN0_ENABLED) goto allout; if(WIN_NUM == 1 && !WIN1_ENABLED) goto allout; if(startY > endY) { if((y < startY) && (y > endY)) goto allout; } else { if((y < startY) || (y >= endY)) goto allout; } //the x windows will apply for this scanline curr_win[WIN_NUM] = h_win[WIN_NUM]; return; allout: curr_win[WIN_NUM] = win_empty; } void GPU::update_winh(int WIN_NUM) { //dont even waste any time in here if the window isnt enabled if(WIN_NUM==0 && !WIN0_ENABLED) return; if(WIN_NUM==1 && !WIN1_ENABLED) return; need_update_winh[WIN_NUM] = false; u16 startX,endX; if(WIN_NUM==0) { startX = WIN0H0; endX = WIN0H1; } else { startX = WIN1H0; endX = WIN1H1; } //the original logic: if you doubt the window code, please check it against the newer implementation below //if(startX > endX) //{ // if((x < startX) && (x > endX)) return false; //} //else //{ // if((x < startX) || (x >= endX)) return false; //} if(startX > endX) { for(int i=0;i<=endX;i++) h_win[WIN_NUM][i] = 1; for(int i=endX+1;igpu; //here is some setup which is only done on line 0 if(l == 0) { //this is speculative. the idea is as follows: //whenever the user updates the affine start position regs, it goes into the active regs immediately //(this is handled on the set event from MMU) //maybe it shouldnt take effect until the next hblank or something.. //this is a based on a combination of: //heroes of mana intro FMV //SPP level 3-8 rotoscale room //NSMB raster fx backdrops //bubble bobble revolution classic mode //NOTE: //I am REALLY unsatisfied with this logic now. But it seems to be working.. gpu->refreshAffineStartRegs(-1,-1); } if(skip) { gpu->currLine = l; if (gpu->core == GPU_MAIN) { GPU_RenderLine_DispCapture(l); if (l == 191) { disp_fifo.head = disp_fifo.tail = 0; } } return; } //blacken the screen if it is turned off by the user if(!CommonSettings.showGpu.screens[gpu->core]) { u8 * dst = GPU_screen + (screen->offset + l) * 512; memset(dst,0,512); return; } // skip some work if master brightness makes the screen completely white or completely black if(gpu->MasterBrightFactor >= 16 && (gpu->MasterBrightMode == 1 || gpu->MasterBrightMode == 2)) { // except if it could cause any side effects (for example if we're capturing), then don't skip anything if(!(gpu->core == GPU_MAIN && (gpu->dispCapCnt.enabled || l == 0 || l == 191))) { gpu->currLine = l; GPU_RenderLine_MasterBrightness(screen, l); return; } } //cache some parameters which are assumed to be stable throughout the rendering of the entire line gpu->currLine = l; u16 mosaic_control = T1ReadWord((u8 *)&gpu->dispx_st->dispx_MISC.MOSAIC, 0); u16 mosaic_width = (mosaic_control & 0xF); u16 mosaic_height = ((mosaic_control>>4) & 0xF); //mosaic test hacks //mosaic_width = mosaic_height = 3; GPU::mosaicLookup.widthValue = mosaic_width; GPU::mosaicLookup.heightValue = mosaic_height; GPU::mosaicLookup.width = &GPU::mosaicLookup.table[mosaic_width][0]; GPU::mosaicLookup.height = &GPU::mosaicLookup.table[mosaic_height][0]; if(gpu->need_update_winh[0]) gpu->update_winh(0); if(gpu->need_update_winh[1]) gpu->update_winh(1); gpu->setup_windows<0>(); gpu->setup_windows<1>(); //generate the 2d engine output if(gpu->dispMode == 1) { //optimization: render straight to the output buffer when thats what we are going to end up displaying anyway gpu->tempScanline = screen->gpu->currDst = (u8 *)(GPU_screen) + (screen->offset + l) * 512; } else { //otherwise, we need to go to a temp buffer gpu->tempScanline = screen->gpu->currDst = (u8 *)gpu->tempScanlineBuffer; } GPU_RenderLine_layer(screen, l); switch (gpu->dispMode) { case 0: // Display Off(Display white) { u8 * dst = GPU_screen + (screen->offset + l) * 512; for (int i=0; i<256; i++) HostWriteWord(dst, i << 1, 0x7FFF); } break; case 1: // Display BG and OBJ layers //do nothing: it has already been generated into the right place break; case 2: // Display vram framebuffer { u8 * dst = GPU_screen + (screen->offset + l) * 512; u8 * src = gpu->VRAMaddr + (l*512); memcpy (dst, src, 512); } break; case 3: // Display memory FIFO { //this has not been tested since the dma timing for dispfifo was changed around the time of //newemuloop. it may not work. u8 * dst = GPU_screen + (screen->offset + l) * 512; for (int i=0; i < 128; i++) T1WriteLong(dst, i << 2, DISP_FIFOrecv() & 0x7FFF7FFF); } break; } //capture after displaying so that we can safely display vram before overwriting it here if (gpu->core == GPU_MAIN) { //BUG!!! if someone is capturing and displaying both from the fifo, then it will have been //consumed above by the display before we get here //(is that even legal? i think so) GPU_RenderLine_DispCapture(l); if (l == 191) { disp_fifo.head = disp_fifo.tail = 0; } } GPU_RenderLine_MasterBrightness(screen, l); } void gpu_savestate(EMUFILE* os) { //version write32le(1,os); os->fwrite((char*)GPU_screen,sizeof(GPU_screen)); write32le(MainScreen.gpu->affineInfo[0].x,os); write32le(MainScreen.gpu->affineInfo[0].y,os); write32le(MainScreen.gpu->affineInfo[1].x,os); write32le(MainScreen.gpu->affineInfo[1].y,os); write32le(SubScreen.gpu->affineInfo[0].x,os); write32le(SubScreen.gpu->affineInfo[0].y,os); write32le(SubScreen.gpu->affineInfo[1].x,os); write32le(SubScreen.gpu->affineInfo[1].y,os); } bool gpu_loadstate(EMUFILE* is, int size) { //read version u32 version; //sigh.. shouldve used a new version number if(size == 256*192*2*2) version = 0; else if(size== 0x30024) { read32le(&version,is); version = 1; } else if(read32le(&version,is) != 1) return false; if(version<0||version>1) return false; is->fread((char*)GPU_screen,sizeof(GPU_screen)); if(version==1) { read32le(&MainScreen.gpu->affineInfo[0].x,is); read32le(&MainScreen.gpu->affineInfo[0].y,is); read32le(&MainScreen.gpu->affineInfo[1].x,is); read32le(&MainScreen.gpu->affineInfo[1].y,is); read32le(&SubScreen.gpu->affineInfo[0].x,is); read32le(&SubScreen.gpu->affineInfo[0].y,is); read32le(&SubScreen.gpu->affineInfo[1].x,is); read32le(&SubScreen.gpu->affineInfo[1].y,is); //removed per nitsuja feedback. anyway, this same thing will happen almost immediately in gpu line=0 //MainScreen.gpu->refreshAffineStartRegs(-1,-1); //SubScreen.gpu->refreshAffineStartRegs(-1,-1); } MainScreen.gpu->updateBLDALPHA(); SubScreen.gpu->updateBLDALPHA(); return !is->fail(); } u32 GPU::getAffineStart(int layer, int xy) { if(xy==0) return affineInfo[layer-2].x; else return affineInfo[layer-2].y; } void GPU::setAffineStartWord(int layer, int xy, u16 val, int word) { u32 curr = getAffineStart(layer,xy); if(word==0) curr = (curr&0xFFFF0000)|val; else curr = (curr&0x0000FFFF)|(((u32)val)<<16); setAffineStart(layer,xy,curr); } void GPU::setAffineStart(int layer, int xy, u32 val) { if(xy==0) affineInfo[layer-2].x = val; else affineInfo[layer-2].y = val; refreshAffineStartRegs(layer,xy); } void GPU::refreshAffineStartRegs(const int num, const int xy) { if(num==-1) { refreshAffineStartRegs(2,xy); refreshAffineStartRegs(3,xy); return; } if(xy==-1) { refreshAffineStartRegs(num,0); refreshAffineStartRegs(num,1); return; } BGxPARMS * parms; if (num==2) parms = &(dispx_st)->dispx_BG2PARMS; else parms = &(dispx_st)->dispx_BG3PARMS; if(xy==0) parms->BGxX = affineInfo[num-2].x; else parms->BGxY = affineInfo[num-2].y; } template void GPU::modeRender(int layer) { switch(GPU_mode2type[dispCnt().BG_Mode][layer]) { case BGType_Text: lineText(this); break; case BGType_Affine: lineRot(this); break; case BGType_AffineExt: lineExtRot(this); break; case BGType_Large8bpp: lineExtRot(this); break; case BGType_Invalid: PROGINFO("Attempting to render an invalid BG type\n"); break; default: break; } } void gpu_SetRotateScreen(u16 angle) { gpu_angle = angle; } desmume-0.9.9/src/cocoa/0000755000175000017500000000000012140306213015565 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/cocoa_cheat.h0000644000175000017500000001313312140261603020172 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include "../cheatSystem.h" #undef BOOL @class CocoaDSCore; /******************************************************************************************** CocoaDSCheatItem - OBJECTIVE-C CLASS This is an Objective-C wrapper class for DeSmuME's cheat item struct. The cheat item data is not freed upon release of this object. This is by design. Thread Safety: Assume that all methods are not thread-safe. This was done for performance reasons. The caller of this class' methods is expected to handle thread safety. ********************************************************************************************/ @interface CocoaDSCheatItem : NSObject { CHEATS_LIST *data; CHEATS_LIST *internalData; BOOL willAdd; pthread_mutex_t mutexData; CocoaDSCheatItem *workingCopy; CocoaDSCheatItem *parent; } @property (assign) CHEATS_LIST *data; @property (assign) BOOL willAdd; @property (assign, nonatomic) BOOL enabled; @property (assign, nonatomic) NSInteger cheatType; @property (assign, nonatomic) NSImage *cheatTypeIcon; @property (assign, nonatomic) BOOL isSupportedCheatType; @property (assign, nonatomic) NSInteger freezeType; @property (assign, nonatomic) NSString *description; @property (assign, nonatomic) NSUInteger codeCount; @property (assign, nonatomic) NSString *code; @property (assign, nonatomic) UInt8 bytes; @property (assign, nonatomic) UInt32 memAddress; @property (assign, nonatomic) NSString *memAddressString; @property (assign, nonatomic) NSString *memAddressSixDigitString; @property (assign, nonatomic) SInt64 value; @property (readonly) CocoaDSCheatItem *workingCopy; @property (assign) CocoaDSCheatItem *parent; - (id) initWithCheatData:(CHEATS_LIST *)cheatData; - (BOOL) retainData; - (char *) descriptionCString; - (void) update; - (CocoaDSCheatItem *) createWorkingCopy; - (void) destroyWorkingCopy; - (void) mergeFromWorkingCopy; - (void) mergeToParent; - (void) setDataWithDictionary:(NSDictionary *)dataDict; - (NSDictionary *) dataDictionary; @end /******************************************************************************************** CocoaDSCheatManager - OBJECTIVE-C CLASS This is an Objective-C wrapper class for DeSmuME's cheat list class. Thread Safety: All methods are thread-safe. ********************************************************************************************/ @interface CocoaDSCheatManager : NSObject { CHEATS *listData; NSMutableArray *list; CocoaDSCore *cdsCore; NSUInteger untitledCount; NSString *dbTitle; NSString *dbDate; } @property (readonly) CHEATS *listData; @property (readonly) NSMutableArray *list; @property (retain) CocoaDSCore *cdsCore; @property (assign) NSUInteger untitledCount; @property (copy) NSString *dbTitle; @property (copy) NSString *dbDate; - (id) initWithCore:(CocoaDSCore *)core; - (id) initWithCore:(CocoaDSCore *)core fileURL:(NSURL *)fileURL; - (id) initWithCore:(CocoaDSCore *)core listData:(CHEATS *)cheatList; - (id) initWithCore:(CocoaDSCore *)core fileURL:(NSURL *)fileURL listData:(CHEATS *)cheatList; - (BOOL) add:(CocoaDSCheatItem *)cheatItem; - (void) remove:(CocoaDSCheatItem *)cheatItem; - (BOOL) update:(CocoaDSCheatItem *)cheatItem; - (BOOL) save; - (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error; - (void) applyInternalCheat:(CocoaDSCheatItem *)cheatItem; + (void) setMasterCheatList:(CocoaDSCheatManager *)cheatListManager; + (void) applyInternalCheatWithItem:(CocoaDSCheatItem *)cheatItem; + (void) applyInternalCheatWithAddress:(UInt32)address value:(UInt32)value bytes:(NSUInteger)bytes; + (NSMutableArray *) cheatListWithListObject:(CHEATS *)cheatList; + (NSMutableArray *) cheatListWithItemStructArray:(CHEATS_LIST *)cheatItemArray count:(NSUInteger)itemCount; + (NSMutableDictionary *) cheatItemWithType:(NSInteger)cheatTypeID description:(NSString *)description; @end @interface CocoaDSCheatSearch : NSObject { CHEATSEARCH *listData; NSMutableArray *addressList; CocoaDSCore *cdsCore; NSUInteger searchCount; } @property (readonly) CHEATSEARCH *listData; @property (readonly) NSMutableArray *addressList; @property (retain) CocoaDSCore *cdsCore; @property (readonly) NSUInteger searchCount; - (id) initWithCore:(CocoaDSCore *)core; - (NSUInteger) runExactValueSearch:(NSInteger)value byteSize:(UInt8)byteSize signType:(NSInteger)signType; - (void) runExactValueSearchOnThread:(id)object; - (NSUInteger) runComparativeSearch:(NSInteger)typeID byteSize:(UInt8)byteSize signType:(NSInteger)signType; - (void) runComparativeSearchOnThread:(id)object; - (void) reset; + (NSMutableArray *) addressListWithListObject:(CHEATSEARCH *)addressList maxItems:(NSUInteger)maxItemCount; @end @interface CocoaDSCheatSearchParams : NSObject { NSInteger comparativeSearchType; NSInteger value; UInt8 byteSize; NSInteger signType; } @property (assign) NSInteger comparativeSearchType; @property (assign) NSInteger value; @property (assign) UInt8 byteSize; @property (assign) NSInteger signType; @end desmume-0.9.9/src/cocoa/cocoa_output.h0000644000175000017500000001323712140261603020453 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include #include #import "cocoa_util.h" @class NSImage; @class NSBitmapImageRep; typedef struct { double scale; double rotation; // Angle is in degrees double translationX; double translationY; double translationZ; } DisplayOutputTransformData; typedef struct { NSInteger displayModeID; unsigned int width; // Measured in pixels unsigned int height; // Measured in pixels } DisplaySrcPixelAttributes; @interface CocoaDSOutput : CocoaDSThread { BOOL isStateChanged; NSUInteger frameCount; NSData *frameData; NSData *frameAttributesData; NSMutableDictionary *property; pthread_mutex_t *mutexProducer; pthread_mutex_t *mutexConsume; } @property (assign) BOOL isStateChanged; @property (assign) NSUInteger frameCount; @property (retain) NSData *frameData; @property (retain) NSData *frameAttributesData; @property (readonly) NSMutableDictionary *property; @property (assign) pthread_mutex_t *mutexProducer; @property (readonly) pthread_mutex_t *mutexConsume; - (void) doCoreEmuFrame; - (void) handleEmuFrameProcessed:(NSData *)mainData attributes:(NSData *)attributesData; @end @interface CocoaDSSpeaker : CocoaDSOutput { NSUInteger bufferSize; OSSpinLock spinlockAudioOutputEngine; OSSpinLock spinlockVolume; OSSpinLock spinlockSpuAdvancedLogic; OSSpinLock spinlockSpuInterpolationMode; OSSpinLock spinlockSpuSyncMode; OSSpinLock spinlockSpuSyncMethod; } @property (assign) NSUInteger bufferSize; - (id) init; - (id) initWithVolume:(CGFloat)vol; - (void) dealloc; - (void) setVolume:(float)vol; - (float) volume; - (void) setAudioOutputEngine:(NSInteger)methodID; - (NSInteger) audioOutputEngine; - (void) setSpuAdvancedLogic:(BOOL)state; - (BOOL) spuAdvancedLogic; - (void) setSpuInterpolationMode:(NSInteger)modeID; - (NSInteger) spuInterpolationMode; - (void) setSpuSyncMode:(NSInteger)modeID; - (NSInteger) spuSyncMode; - (void) setSpuSyncMethod:(NSInteger)methodID; - (NSInteger) spuSyncMethod; - (BOOL) mute; - (void) setMute:(BOOL)mute; - (NSInteger) filter; - (void) setFilter:(NSInteger)filter; - (void) handleSetVolume:(NSData *)volumeData; - (void) handleSetAudioOutputEngine:(NSData *)methodIdData; - (void) handleSetSpuAdvancedLogic:(NSData *)stateData; - (void) handleSetSpuSyncMode:(NSData *)modeIdData; - (void) handleSetSpuSyncMethod:(NSData *)methodIdData; - (void) handleSetSpuInterpolationMode:(NSData *)modeIdData; @end @class CocoaVideoFilter; @protocol CocoaDSDisplayDelegate @required - (void) doDisplayModeChanged:(NSInteger)displayModeID; @property (assign) BOOL isHudEnabled; @property (assign) BOOL isHudEditingModeEnabled; @end @protocol CocoaDSDisplayVideoDelegate @required - (void) doInitVideoOutput:(NSDictionary *)properties; - (void) doProcessVideoFrame:(const void *)videoFrameData displayMode:(const NSInteger)displayModeID width:(const NSInteger)frameWidth height:(const NSInteger)frameHeight; @optional - (void) doResizeView:(NSRect)rect; - (void) doTransformView:(const DisplayOutputTransformData *)transformData; - (void) doRedraw; - (void) doDisplayOrientationChanged:(NSInteger)displayOrientationID; - (void) doDisplayOrderChanged:(NSInteger)displayOrderID; - (void) doDisplayGapChanged:(float)displayGapScalar; - (void) doBilinearOutputChanged:(BOOL)useBilinear; - (void) doVerticalSyncChanged:(BOOL)useVerticalSync; - (void) doVideoFilterChanged:(NSInteger)videoFilterTypeID frameSize:(NSSize)videoFilterDestSize; @end @interface CocoaDSDisplay : CocoaDSOutput { id delegate; NSInteger displayMode; NSSize frameSize; OSSpinLock spinlockDelegate; OSSpinLock spinlockDisplayType; } @property (retain) id delegate; @property (assign) NSInteger displayMode; @property (readonly) NSSize frameSize; - (void) handleChangeDisplayMode:(NSData *)displayModeData; - (void) handleSetViewToBlack; - (void) handleSetViewToWhite; - (void) handleRequestScreenshot:(NSData *)fileURLStringData fileTypeData:(NSData *)fileTypeData; - (void) handleCopyToPasteboard; - (void) fillVideoFrameWithColor:(UInt16)colorValue; - (NSImage *) image; - (NSBitmapImageRep *) bitmapImageRep; @end @interface CocoaDSDisplayVideo : CocoaDSDisplay { CocoaVideoFilter *vf; id videoDelegate; NSInteger lastDisplayMode; OSSpinLock spinlockVideoFilterType; OSSpinLock spinlockVFBuffers; } @property (retain) id delegate; @property (assign) CocoaVideoFilter *vf; - (void) handleResizeView:(NSData *)rectData; - (void) handleTransformView:(NSData *)transformData; - (void) handleRedrawView; - (void) handleChangeDisplayOrientation:(NSData *)displayOrientationIdData; - (void) handleChangeDisplayOrder:(NSData *)displayOrderIdData; - (void) handleChangeDisplayGap:(NSData *)displayGapScalarData; - (void) handleChangeBilinearOutput:(NSData *)bilinearStateData; - (void) handleChangeVerticalSync:(NSData *)verticalSyncStateData; - (void) handleChangeVideoFilter:(NSData *)videoFilterTypeIdData; @end desmume-0.9.9/src/cocoa/main.m0000644000175000017500000000151712140261603016676 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } desmume-0.9.9/src/cocoa/cocoa_firmware.h0000644000175000017500000000421112140261603020717 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import /******************************************************************************************** CocoaDSFirmware - OBJECTIVE-C CLASS This is an Objective-C wrapper class for DeSmuME's firmware struct. If this object is instantiated through any init method other than initWithFirmwareData:, this object allocate memory for its own internal firmware struct. This memory is then freed upon the release of this object. If this object is instantiated using initWithFirmwareData:, or if a firmware struct is assigned through the data property, the firmware struct is not freed upon the release of this object. This is by design. Thread Safety: All methods are thread-safe. ********************************************************************************************/ @interface CocoaDSFirmware : NSObject { struct NDS_fw_config_data *data; struct NDS_fw_config_data *internalData; NSUInteger birth_year; pthread_mutex_t mutex; } @property (assign) struct NDS_fw_config_data *data; @property (assign) NSInteger consoleType; @property (copy) NSString *nickname; @property (copy) NSString *message; @property (assign) NSInteger favoriteColor; @property (assign) NSDate *birthday; @property (assign) NSInteger language; - (id) initWithDictionary:(NSDictionary *)dataDict; - (id) initWithFirmwareData:(struct NDS_fw_config_data *)fwData; - (void) update; - (void) setDataWithDictionary:(NSDictionary *)fwDataDict; - (NSDictionary *) dataDictionary; @end desmume-0.9.9/src/cocoa/userinterface/0000755000175000017500000000000012140306213020424 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/userinterface/InputManager.h0000644000175000017500000002274712140261514023207 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include #include #if defined(__ppc__) || defined(__ppc64__) #include #else #include #endif #include #include #include "mic_ext.h" #undef BOOL #define INPUT_HANDLER_STRING_LENGTH 256 enum InputAttributeState { INPUT_ATTRIBUTE_STATE_OFF = 0, INPUT_ATTRIBUTE_STATE_ON, INPUT_ATTRIBUTE_STATE_MIXED }; @class EmuControllerDelegate; @class InputManager; @class InputHIDManager; @protocol InputHIDManagerTarget @required - (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue; @end typedef struct { char deviceName[INPUT_HANDLER_STRING_LENGTH]; char deviceCode[INPUT_HANDLER_STRING_LENGTH]; char elementName[INPUT_HANDLER_STRING_LENGTH]; char elementCode[INPUT_HANDLER_STRING_LENGTH]; InputAttributeState state; // The input state that is sent on command dispatch int32_t intCoordX; // The X-coordinate as an int for commands that require a location int32_t intCoordY; // The Y-coordinate as an int for commands that require a location float floatCoordX; // The X-coordinate as a float for commands that require a location float floatCoordY; // The Y-coordinate as a float for commands that require a location float scalar; // A scalar value for commands that require a scalar id sender; // An object for commands that require an object } InputAttributes; typedef struct { char tag[INPUT_HANDLER_STRING_LENGTH]; // A string identifier for these attributes SEL selector; // The selector that is called on command dispatch int32_t intValue[4]; // Context dependent int values float floatValue[4]; // Context dependent float values id object[4]; // Context dependent objects bool useInputForIntCoord; // The command will prefer the input device's int coordinate bool useInputForFloatCoord; // The command will prefer the input device's float coordinate bool useInputForScalar; // The command will prefer the input device's scalar bool useInputForSender; // The command will prefer the input device's sender InputAttributes input; // The input device's attributes } CommandAttributes; typedef std::vector InputAttributesList; typedef std::vector CommandAttributesList; #if defined(__ppc__) || defined(__ppc64__) typedef std::map InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes typedef std::map CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes typedef std::map CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector typedef std::map AudioFileSampleGeneratorMap; // Key = File path to audio file, Value = AudioSampleBlockGenerator #else typedef std::tr1::unordered_map InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes typedef std::tr1::unordered_map CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes typedef std::tr1::unordered_map CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector typedef std::tr1::unordered_map AudioFileSampleGeneratorMap; // Key = File path to audio file, Value = AudioSampleBlockGenerator #endif #pragma mark - @interface InputHIDDevice : NSObject { InputHIDManager *hidManager; IOHIDDeviceRef hidDeviceRef; IOHIDQueueRef hidQueueRef; NSRunLoop *runLoop; OSSpinLock spinlockRunLoop; } @property (retain) InputHIDManager *hidManager; @property (readonly) IOHIDDeviceRef hidDeviceRef; @property (retain) NSRunLoop *runLoop; - (id) initWithDevice:(IOHIDDeviceRef)theDevice hidManager:(InputHIDManager *)theHIDManager; - (void) start; - (void) stop; - (NSString *) manufacturerName; - (NSString *) productName; - (NSString *) serialNumber; @end BOOL GetOnStateFromHIDValueRef(IOHIDValueRef hidValueRef); InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char *altElementCode, const char *altElementName, NSNumber *altOnState); InputAttributesList InputListFromHIDValue(IOHIDValueRef hidValueRef); InputAttributesList InputListFromHatSwitchValue(IOHIDValueRef hidValueRef, bool useEightDirection); unsigned int ClearHIDQueue(const IOHIDQueueRef hidQueue); void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void *inSender); #pragma mark - @interface InputHIDManager : NSObject { InputManager *inputManager; IOHIDManagerRef hidManagerRef; NSRunLoop *runLoop; NSMutableSet *deviceList; id target; OSSpinLock spinlockRunLoop; } @property (retain) InputManager *inputManager; @property (readonly) IOHIDManagerRef hidManagerRef; @property (readonly) NSMutableSet *deviceList; @property (assign) id target; @property (retain) NSRunLoop *runLoop; - (id) initWithInputManager:(InputManager *)theInputManager; @end void HandleDeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef); void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef); #pragma mark - @interface InputManager : NSObject { EmuControllerDelegate *emuControl; id hidInputTarget; InputHIDManager *hidManager; NSMutableDictionary *inputMappings; NSArray *commandTagList; NSDictionary *commandIcon; InputCommandMap commandMap; CommandAttributesMap defaultCommandAttributes; CommandSelectorMap commandSelector; AudioFileSampleGeneratorMap audioFileGenerators; } @property (readonly) IBOutlet EmuControllerDelegate *emuControl; @property (retain) id hidInputTarget; @property (readonly) NSMutableDictionary *inputMappings; @property (readonly) NSArray *commandTagList; @property (readonly) NSDictionary *commandIcon; - (void) setMappingsWithMappings:(NSDictionary *)mappings; - (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceDict commandAttributes:(const CommandAttributes *)cmdAttr; - (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandAttributes:(const CommandAttributes *)cmdAttr; - (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandAttributes:(const CommandAttributes *)cmdAttr; - (void) addMappingForIBAction:(const SEL)theSelector commandAttributes:(const CommandAttributes *)cmdAttr; - (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandAttributes:(const CommandAttributes *)cmdAttr; - (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; - (void) removeAllMappingsForCommandTag:(const char *)commandTag; - (CommandAttributesList) generateCommandListUsingInputList:(const InputAttributesList *)inputList; - (void) dispatchCommandList:(const CommandAttributesList *)cmdList; - (BOOL) dispatchCommandUsingInputAttributes:(const InputAttributes *)inputAttr; - (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector sender:(id)sender; - (void) writeDefaultsInputMappings; - (NSString *) commandTagFromInputList:(NSArray *)inputList; - (SEL) selectorOfCommandTag:(const char *)commandTag; - (CommandAttributes) defaultCommandAttributesForCommandTag:(const char *)commandTag; - (CommandAttributes) mappedCommandAttributesOfDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; - (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; - (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag; - (OSStatus) loadAudioFileUsingPath:(NSString *)filePath; - (AudioSampleBlockGenerator *) audioFileGeneratorFromFilePath:(NSString *)filePath; - (void) updateAudioFileGenerators; CommandAttributes NewDefaultCommandAttributes(const char *commandTag); CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector); CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID); void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo); NSMutableDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr, NSString *deviceCode, NSString *deviceName, NSString *elementCode, NSString *elementName); InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue); InputAttributes InputManagerEncodeKeyboardInput(const unsigned short keyCode, BOOL keyPressed); InputAttributes InputManagerEncodeMouseButtonInput(const NSInteger buttonNumber, const NSPoint touchLoc, BOOL buttonPressed); InputAttributes InputManagerEncodeIBAction(const SEL theSelector, id sender); @end desmume-0.9.9/src/cocoa/userinterface/FileMigrationDelegate.mm0000644000175000017500000002030412140261514025146 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "FileMigrationDelegate.h" #import "cocoa_file.h" #import "cocoa_globals.h" @implementation FileMigrationDelegate @synthesize dummyObject; @synthesize window; @synthesize fileListController; @synthesize filesPresent; - (id)init { self = [super init]; if(self == nil) { return nil; } NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; _versionList = [[NSArray alloc] initWithArray:[fileTypeInfoRootDict valueForKey:@"VersionStrings"]]; NSDictionary *portStrings = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"PortStrings"]; _portStringsDict = [[NSMutableDictionary alloc] initWithCapacity:[portStrings count]]; for (NSString *versionKey in portStrings) { NSArray *portStringsList = (NSArray *)[portStrings valueForKey:versionKey]; NSMutableArray *newPortStringsList = [NSMutableArray arrayWithCapacity:[portStringsList count]]; for (NSString *portString in portStringsList) { [newPortStringsList addObject:[NSMutableString stringWithString:portString]]; } [_portStringsDict setObject:newPortStringsList forKey:versionKey]; } //_fileTree = [[NSMutableDictionary alloc] initWithCapacity:100]; filesPresent = NO; return self; } - (void)dealloc { [_versionList release]; [_portStringsDict release]; //[_fileTree release]; [super dealloc]; } - (void) updateFileList { NSMutableArray *fileList = [CocoaDSFile completeFileList]; if (fileList != nil) { [self setFilesPresent:([fileList count] == 0) ? NO : YES]; } [fileListController setContent:fileList]; // Refresh the file tree. /* NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSDictionary *defaultPaths = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; NSFileManager *fileManager = [[NSFileManager alloc] init]; [_fileTree removeAllObjects]; for (NSString *versionKey in _versionList) { NSArray *portStringsList = (NSArray *)[_portStringsDict valueForKey:versionKey]; if (portStringsList == nil || [portStringsList count] < 1) { continue; } NSMutableDictionary *newVersionTree = [NSMutableDictionary dictionaryWithCapacity:[portStringsList count]]; for (NSString *portKey in portStringsList) { NSDictionary *pathsDict = (NSDictionary *)[(NSDictionary *)[defaultPaths valueForKey:versionKey] valueForKey:portKey]; if (pathsDict == nil || [pathsDict count] < 1) { continue; } NSMutableArray *newPortTree = [NSMutableArray arrayWithCapacity:128]; for (NSString *pathKey in pathsDict) { NSString *pathString = (NSString *)[pathsDict valueForKey:pathKey]; NSArray *fileList = [fileManager contentsOfDirectoryAtPath:pathString error:nil]; for (NSString *filePath in fileList) { [newPortTree addObject:[NSMutableDictionary dictionaryWithObject:filePath forKey:@"FileName"]]; } } [newVersionTree setObject:newPortTree forKey:portKey]; } [_fileTree setObject:newVersionTree forKey:versionKey]; } [fileManager release]; */ } #pragma mark NSOutlineViewDelegate Protocol - (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView *)outlineView { return NO; } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { if ([(NSString *)[tableColumn identifier] isEqualToString:@"FileWillMigrateColumn"]) { return YES; } return NO; } - (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; NSCell *outCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]]; if ([columnID isEqualToString:@"FileNameColumn"]) { if ([item isKindOfClass:[NSString class]]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:NSBoldFontMask weight:0 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } } return outCell; } #pragma mark NSOutlineViewDataSource Protocol - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { if (item == nil) { return [_versionList objectAtIndex:index]; } else if ([item isKindOfClass:[NSString class]]) { if ([_versionList containsObject:item]) { return [(NSArray *)[_portStringsDict valueForKey:item] objectAtIndex:index]; } else { NSString *versionKey = (NSString *)[outlineView parentForItem:item]; //return [(NSArray *)[(NSDictionary *)[_fileTree valueForKey:versionKey] valueForKey:item] objectAtIndex:index]; return nil; } } return nil; } - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { if ([item isKindOfClass:[NSString class]]) { return YES; } return NO; } - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { NSInteger numberChildren = 0; if (item == nil) { numberChildren = [_versionList count]; } else if ([item isKindOfClass:[NSString class]]) { if ([_versionList containsObject:item]) { return [[_portStringsDict valueForKey:item] count]; } else { NSString *versionKey = (NSString *)[outlineView parentForItem:item]; //return [(NSArray *)[(NSDictionary *)[_fileTree valueForKey:versionKey] valueForKey:item] count]; return 0; } } return numberChildren; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; if ([columnID isEqualToString:@"FileWillMigrateColumn"]) { return nil; } else if ([columnID isEqualToString:@"FileNameColumn"]) { if ([item isKindOfClass:[NSString class]]) { return item; } else if ([item isKindOfClass:[NSDictionary class]]) { NSString *fileName = [item valueForKey:@"FileName"]; return (fileName != nil) ? fileName : @""; } else { return @""; } } else if ([columnID isEqualToString:@"FileKindColumn"]) { if ([item isKindOfClass:[NSString class]]) { return @""; } else if ([item isKindOfClass:[NSDictionary class]]) { return @""; } else { return @""; } } else if ([columnID isEqualToString:@"FileDateModifiedColumn"]) { if ([item isKindOfClass:[NSString class]]) { return @""; } else if ([item isKindOfClass:[NSDictionary class]]) { return @""; } else { return @""; } } return item; } #pragma mark IBActions - (IBAction) updateAndShowWindow:(id)sender { [self updateFileList]; [window center]; [window makeKeyAndOrderFront:nil]; } - (IBAction) handleChoice:(id)sender { const NSInteger option = [(NSControl *)sender tag]; NSMutableArray *fileList = [fileListController content]; switch (option) { case COCOA_DIALOG_DEFAULT: [CocoaDSFile copyFileListToCurrent:fileList]; break; case COCOA_DIALOG_OPTION: [CocoaDSFile moveFileListToCurrent:fileList]; break; default: break; } [[(NSControl *)sender window] close]; } - (IBAction) selectAll:(id)sender { NSMutableArray *fileList = [fileListController content]; for (NSMutableDictionary *fileAttr in fileList) { [fileAttr setValue:[NSNumber numberWithBool:YES] forKey:@"willMigrate"]; } } - (IBAction) selectNone:(id)sender { NSMutableArray *fileList = [fileListController content]; for (NSMutableDictionary *fileAttr in fileList) { [fileAttr setValue:[NSNumber numberWithBool:NO] forKey:@"willMigrate"]; } } @end desmume-0.9.9/src/cocoa/userinterface/appDelegate_legacy.mm0000644000175000017500000001765112140261514024534 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "appDelegate_legacy.h" #import "emuWindowDelegate_legacy.h" #import "cocoa_input_legacy.h" #import "cocoa_file.h" #import "cocoa_util.h" #import "cocoa_globals.h" #import "nds_control_legacy.h" #import "input_legacy.h" #import "preferences_legacy.h" #include "sndOSX.h" #undef BOOL #ifdef GDB_STUB #include #endif #ifdef GDB_STUB //GDB Stub implementation---------------------------------------------------------------------------- void* createThread_gdb(void (*thread_function)( void *data),void *thread_data) { // Create the thread using POSIX routines. pthread_attr_t attr; pthread_t* posixThreadID = (pthread_t*)malloc(sizeof(pthread_t)); assert(!pthread_attr_init(&attr)); assert(!pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE)); int threadError = pthread_create(posixThreadID, &attr, (void* (*)(void *))thread_function, thread_data); assert(!pthread_attr_destroy(&attr)); if (threadError != 0) { // Report an error. return NULL; } else { return posixThreadID; } } void joinThread_gdb(void *thread_handle) { pthread_join(*((pthread_t*)thread_handle), NULL); free(thread_handle); } #endif @implementation AppDelegate - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename { BOOL result = NO; NSURL *fileURL = [NSURL fileURLWithPath:filename]; EmuWindowDelegate *mainWindowDelegate = [mainWindow delegate]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (cdsCore == nil) { return result; } NSString *fileKind = [CocoaDSFile fileKindByURL:fileURL]; if ([fileKind isEqualToString:@"ROM"]) { result = [mainWindowDelegate handleLoadRom:fileURL]; } return result; } - (void)applicationWillFinishLaunching:(NSNotification *)notification { EmuWindowDelegate *mainWindowDelegate = (EmuWindowDelegate *)[mainWindow delegate]; // Create the needed directories in Application Support if they haven't already // been created. if (![CocoaDSFile setupAllAppDirectories]) { [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Could not create the required directories in your Application Support folder. DeSmuME will now quit.", nil)]; return; } [CocoaDSFile setupAllFilePaths]; // Setup the About window. NSMutableDictionary *aboutWindowProperties = [NSMutableDictionary dictionaryWithObjectsAndKeys: [[NSBundle mainBundle] pathForResource:@FILENAME_README ofType:@""], @"readMePath", [[NSBundle mainBundle] pathForResource:@FILENAME_COPYING ofType:@""], @"licensePath", [[NSBundle mainBundle] pathForResource:@FILENAME_AUTHORS ofType:@""], @"authorsPath", [[NSBundle mainBundle] pathForResource:@FILENAME_CHANGELOG ofType:@""], @"changeLogPath", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], @"versionString", @__DATE__, @"dateString", nil]; [aboutWindowController setContent:aboutWindowProperties]; //Set default values for all preferences //(this wont override saved preferences as //they work in different preference domains) setAppDefaults(); // Setup the slot menu items. We set this up manually instead of through Interface // Builder because we're assuming an arbitrary number of slot items. [self setupSlotMenuItems]; // Setup the user interface controllers. [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; [emuWindowController setContent:[mainWindowDelegate bindings]]; // Init the DS emulation core. CocoaDSCore *newCore = [[CocoaDSCore alloc] init]; [newCore setVideoUpdateCallback:@selector(setScreenState:) withObject:[mainWindowDelegate displayView]]; [newCore setErrorCallback:@selector(emulationError) withObject:[mainWindow delegate]]; [cdsCoreController setContent:newCore]; // Init the DS controller. CocoaDSController *newController = [[CocoaDSController alloc] init]; [newCore setCdsController:newController]; [[mainWindowDelegate displayView] setCdsController:newController]; keyboardHandler = [[InputHandler alloc] initWithCdsController:newController]; NSResponder *mainNextResponder = [mainWindow nextResponder]; [mainWindow setNextResponder:keyboardHandler]; [keyboardHandler setNextResponder:mainNextResponder]; } - (void)applicationDidFinishLaunching:(NSNotification *)notification { EmuWindowDelegate *mainWindowDelegate = [mainWindow delegate]; //Bring the application to the front [NSApp activateIgnoringOtherApps:TRUE]; //check if it should load something by default if([[[NSUserDefaults standardUserDefaults] stringForKey:PREF_AFTER_LAUNCHED] compare:PREF_AFTER_LAUNCHED_OPTION_LAST_ROM]==NSOrderedSame) { NSArray *recent_documents = [[NSDocumentController sharedDocumentController] recentDocumentURLs]; if([recent_documents count] > 0) { NSURL *romURL = [recent_documents objectAtIndex:0]; [mainWindowDelegate loadRom:romURL]; } } } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { EmuWindowDelegate *mainWindowDelegate = [mainWindow delegate]; //Ask user about quitting if a rom is loaded (avoid accidentally quitting with unsaved progress) if([mainWindowDelegate isRomLoaded]) if(![CocoaDSUtil quickYesNoDialogUsingTitle:NSLocalizedString(@"DeSmuME Emulator", nil) message:NSLocalizedString(@"Are you sure you want to quit?", nil)]) return NSTerminateCancel; return NSTerminateNow; } - (void)applicationWillTerminate:(NSNotification*)notification { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore pause]; [keyboardHandler release]; [[cdsCore cdsController] release]; [cdsCore release]; [cdsCoreController setContent:nil]; } - (IBAction) showSupportFolderInFinder:(id)sender { NSURL *folderURL = [CocoaDSFile userAppSupportBaseURL]; [[NSWorkspace sharedWorkspace] openFile:[folderURL path] withApplication:@"Finder"]; } - (IBAction) launchWebsite:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_WEBSITE]]; } - (IBAction) launchForums:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_FORUM_SITE]]; } - (IBAction) bugReport:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_BUG_REPORT_SITE]]; } - (void) setupSlotMenuItems { NSInteger i; NSMenuItem *loadItem = nil; NSMenuItem *saveItem = nil; for(i = 0; i < MAX_SAVESTATE_SLOTS; i++) { loadItem = [self addSlotMenuItem:mLoadStateSlot slotNumber:(NSUInteger)(i + 1)]; [loadItem setKeyEquivalentModifierMask:0]; [loadItem setTag:i]; [loadItem setAction:@selector(loadEmuSaveStateSlot:)]; saveItem = [self addSlotMenuItem:mSaveStateSlot slotNumber:(NSUInteger)(i + 1)]; [saveItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [saveItem setTag:i]; [saveItem setAction:@selector(saveEmuSaveStateSlot:)]; } } - (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber { NSUInteger slotNumberKey = slotNumber; if (slotNumber == 10) { slotNumberKey = 0; } NSMenuItem *mItem = [menu addItemWithTitle:[NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, slotNumber] action:nil keyEquivalent:[NSString stringWithFormat:@"%d", slotNumberKey]]; [mItem setTarget:[mainWindow delegate]]; return mItem; } @end desmume-0.9.9/src/cocoa/userinterface/appDelegate.h0000644000175000017500000000654112140261514023022 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import @class InputPrefsView; @class InputManager; @class FileMigrationDelegate; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface AppDelegate : NSObject #else @interface AppDelegate : NSObject #endif { NSObject *dummyObject; NSObjectController *aboutWindowController; NSObjectController *emuControlController; NSObjectController *cdsSoundController; NSObjectController *romInfoPanelController; NSObjectController *prefWindowController; NSObjectController *cheatWindowController; NSObjectController *cdsCoreController; FileMigrationDelegate *migrationDelegate; InputManager *inputManager; NSWindow *prefWindow; NSWindow *troubleshootingWindow; NSWindow *cheatListWindow; NSView *prefGeneralView; InputPrefsView *inputPrefsView; NSMenu *mLoadStateSlot; NSMenu *mSaveStateSlot; NSBox *boxGeneralInfo; NSBox *boxTitles; NSBox *boxARMBinaries; NSBox *boxFileSystem; NSBox *boxMisc; BOOL isAppRunningOnIntel; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSObjectController *aboutWindowController; @property (readonly) IBOutlet NSObjectController *emuControlController; @property (readonly) IBOutlet NSObjectController *cdsSoundController; @property (readonly) IBOutlet NSObjectController *romInfoPanelController; @property (readonly) IBOutlet NSObjectController *prefWindowController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet FileMigrationDelegate *migrationDelegate; @property (readonly) IBOutlet InputManager *inputManager; @property (readonly) IBOutlet NSWindow *prefWindow; @property (readonly) IBOutlet NSWindow *troubleshootingWindow; @property (readonly) IBOutlet NSWindow *cheatListWindow; @property (readonly) IBOutlet NSView *prefGeneralView; @property (readonly) IBOutlet NSMenu *mLoadStateSlot; @property (readonly) IBOutlet NSMenu *mSaveStateSlot; @property (readonly) IBOutlet InputPrefsView *inputPrefsView; @property (readonly) IBOutlet NSBox *boxGeneralInfo; @property (readonly) IBOutlet NSBox *boxTitles; @property (readonly) IBOutlet NSBox *boxARMBinaries; @property (readonly) IBOutlet NSBox *boxFileSystem; @property (readonly) IBOutlet NSBox *boxMisc; @property (assign) BOOL isAppRunningOnIntel; - (IBAction) launchWebsite:(id)sender; - (IBAction) launchForums:(id)sender; - (IBAction) supportRequest:(id)sender; - (IBAction) bugReport:(id)sender; - (void) setupSlotMenuItems; - (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber; - (void) setupUserDefaults; - (void) setRomInfoPanelBoxTitleColors; @end desmume-0.9.9/src/cocoa/userinterface/emuWindowDelegate_legacy.h0000644000175000017500000000733712140261514025550 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif @class NintendoDS; @class VideoOutputView; @class InputHandler; @compatibility_alias CocoaDSCore NintendoDS; @compatibility_alias CocoaDSRom NintendoDS; @compatibility_alias CocoaDisplayView VideoOutputView; #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 @interface EmuWindowDelegate : NSObject #else @interface EmuWindowDelegate : NSObject #endif { NSMutableDictionary *bindings; NSImage *iconVolumeFull; NSImage *iconVolumeTwoThird; NSImage *iconVolumeOneThird; NSImage *iconVolumeMute; NSImage *iconExecute; NSImage *iconPause; NSImage *iconSpeedNormal; NSImage *iconSpeedDouble; IBOutlet NSWindow *window; IBOutlet CocoaDisplayView *displayView; IBOutlet NSView *saveScreenshotPanelAccessoryView; IBOutlet NSObjectController *emuWindowController; IBOutlet NSObjectController *cdsCoreController; IBOutlet NSObjectController *romInfoPanelController; BOOL isRomLoading; NSURL *currentEmuSaveStateURL; NSUInteger statusBarHeight; NSSize minDisplayViewSize; BOOL isSmallestSizeNormal; BOOL isShowingStatusBar; NSBitmapImageFileType screenshotFileFormat; } - (NSMutableDictionary *) bindings; - (CocoaDisplayView *) displayView; - (void) setContentScalar:(double)s; - (void) setContentRotation:(double)angleDegrees; - (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees; - (double) maxContentScalar:(NSSize)contentBounds; - (void) setVolume:(float)vol; - (float) volume; - (void) setIsRomLoaded:(BOOL)theState; - (BOOL) isRomLoaded; - (void) setStatus:(NSString *)theString; - (NSString *) status; - (NSURL *) loadedRomURL; - (void) emulationError; // File Menu - (IBAction) openRom:(id)sender; - (IBAction) closeRom:(id)sender; - (IBAction) openEmuSaveState:(id)sender; - (IBAction) saveEmuSaveState:(id)sender; - (IBAction) saveEmuSaveStateAs:(id)sender; - (IBAction) revertEmuSaveState:(id)sender; - (IBAction) loadEmuSaveStateSlot:(id)sender; - (IBAction) saveEmuSaveStateSlot:(id)sender; - (IBAction) importRomSave:(id)sender; - (IBAction) exportRomSave:(id)sender; // Edit Menu - (IBAction) copy:(id)sender; // Emulation Menu - (IBAction) speedLimitDisable:(id)sender; - (IBAction) executeCoreToggle:(id)sender; - (IBAction) resetCore:(id)sender; - (IBAction) changeRomSaveType:(id)sender; // Window Elements - (IBAction) changeCoreSpeed:(id)sender; - (IBAction) changeVolume:(id)sender; - (IBAction) changeScale:(id)sender; - (IBAction) changeRotation:(id)sender; - (IBAction) changeRotationRelative:(id)sender; - (IBAction) toggleGPUState:(id)sender; - (IBAction) toggleMinSize:(id)sender; - (IBAction) toggleStatusBar:(id)sender; - (IBAction) changeScreenshotFileFormat:(id)sender; - (IBAction) saveScreenshotAs:(id)sender; - (BOOL) handleLoadRom:(NSURL *)fileURL; - (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL; - (BOOL) loadRom:(NSURL *)romURL; - (BOOL) unloadRom; - (void) executeCore; - (void) pauseCore; - (void) restoreCoreState; @end desmume-0.9.9/src/cocoa/userinterface/cheatWindowDelegate.mm0000644000175000017500000003356612140261514024707 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cheatWindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_cheat.h" #import "cocoa_util.h" @implementation CheatWindowDelegate @dynamic dummyObject; @synthesize window; @synthesize cheatConfigBox; @synthesize cheatSearchView; @synthesize cheatListTable; @synthesize cheatSearchListTable; @synthesize cheatListController; @synthesize cheatSearchListController; @synthesize cheatDatabaseController; @synthesize cheatWindowController; @synthesize cheatSelectedItemController; @synthesize viewConfigureNoSelection; @synthesize viewConfigureInternalCheat; @synthesize viewConfigureActionReplayCheat; @synthesize viewConfigureCodeBreakerCheat; @synthesize viewSearchNoSelection; @synthesize viewSearchExactValue; @synthesize viewSearchComparativeStart; @synthesize viewSearchComparativeContinue; @synthesize searchField; @synthesize cheatDatabaseSheet; @synthesize untitledCount; @synthesize bindings; @synthesize cdsCheats; @synthesize cdsCheatSearch; @synthesize workingCheat; - (id)init { self = [super init]; if(self == nil) { return nil; } bindings = [[NSMutableDictionary alloc] init]; if (bindings == nil) { [self release]; self = nil; return self; } cdsCheatSearch = [[CocoaDSCheatSearch alloc] init]; if (cdsCheatSearch == nil) { [bindings release]; [self release]; self = nil; return self; } workingCheat = nil; currentView = nil; currentSearchStyleView = nil; untitledCount = 0; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasSelection"]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasItems"]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isSearchStarted"]; [bindings setValue:[NSNumber numberWithInteger:CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE] forKey:@"cheatSearchStyle"]; [bindings setValue:[NSNumber numberWithInteger:CHEATSEARCH_UNSIGNED] forKey:@"cheatSearchSignType"]; [bindings setValue:@"Search not started." forKey:@"cheatSearchAddressCount"]; return self; } - (void)dealloc { self.workingCheat = nil; self.cdsCheats = nil; [cdsCheatSearch release]; [bindings release]; [super dealloc]; } - (IBAction) addToList:(id)sender { if (self.cdsCheats == nil) { return; } NSString *untitledString = nil; self.untitledCount++; if (self.untitledCount > 1) { untitledString = [NSString stringWithFormat:@"Untitled %ld", (unsigned long)self.untitledCount]; } else { untitledString = @"Untitled"; } CocoaDSCheatItem *newCheatItem = [[[CocoaDSCheatItem alloc] init] autorelease]; newCheatItem.cheatType = CHEAT_TYPE_INTERNAL; newCheatItem.description = untitledString; [cheatListController addObject:newCheatItem]; [self.cdsCheats add:newCheatItem]; [self.cdsCheats save]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasItems"]; } - (IBAction) removeFromList:(id)sender { NSMutableArray *cheatList = (NSMutableArray *)[cheatListController content]; if (cdsCheats == nil || cheatList == nil) { return; } NSUInteger selectionIndex = [cheatListController selectionIndex]; if (selectionIndex == NSNotFound) { return; } NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:selectionIndex]; NSArray *selectedObjects = [cheatListController selectedObjects]; CocoaDSCheatItem *selectedCheat = (CocoaDSCheatItem *)[selectedObjects objectAtIndex:0]; [self.cdsCheats remove:selectedCheat]; [cheatListController removeObject:selectedCheat]; [self.cdsCheats save]; [cheatListTable deselectAll:sender]; NSUInteger cheatCount = [cheatList count]; if (cheatCount > 0) { if (selectionIndex >= cheatCount) { selectionIndex--; indexSet = [NSIndexSet indexSetWithIndex:selectionIndex]; } [cheatListTable selectRowIndexes:indexSet byExtendingSelection:NO]; } else { [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasItems"]; } } - (IBAction) viewDatabase:(id)sender { [NSApp beginSheet:cheatDatabaseSheet modalForWindow:window modalDelegate:self didEndSelector:@selector(didEndCheatDatabaseSheet:returnCode:contextInfo:) contextInfo:nil]; } - (IBAction) setInternalCheatValue:(id)sender { // Force end of editing of any text fields. [window makeFirstResponder:nil]; [self.cdsCheats applyInternalCheat:self.workingCheat]; } - (IBAction) applyConfiguration:(id)sender { if (self.workingCheat == nil) { return; } // Force end of editing of any text fields. [window makeFirstResponder:nil]; [self.workingCheat mergeToParent]; BOOL result = [self.cdsCheats update:self.workingCheat.parent]; if (result) { [self.cdsCheats save]; } else { // TODO: Display an error sheet saying that the cheat applying failed. } } - (IBAction) selectCheatType:(id)sender { NSInteger cheatTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; CocoaDSCheatItem *cheatItem = [cheatSelectedItemController content]; cheatItem.cheatType = cheatTypeID; [self setCheatConfigViewByType:cheatTypeID]; } - (IBAction) selectCheatSearchStyle:(id)sender { NSInteger searchStyle = [CocoaDSUtil getIBActionSenderTag:sender]; [self.bindings setValue:[NSNumber numberWithInteger:searchStyle] forKey:@"cheatSearchStyle"]; [self setCheatSearchViewByStyle:searchStyle]; } - (IBAction) runExactValueSearch:(id)sender { if (self.workingCheat == nil) { return; } [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isSearchStarted"]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isRunningSearch"]; NSInteger value = [searchField integerValue]; UInt8 byteSize = self.workingCheat.bytes; NSInteger signType = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchSignType"] integerValue]; NSUInteger addressCount = [cdsCheatSearch runExactValueSearch:value byteSize:byteSize signType:signType]; [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; [cheatSearchListController setContent:cdsCheatSearch.addressList]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; } - (IBAction) runComparativeSearch:(id)sender { if (self.workingCheat == nil) { return; } [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isSearchStarted"]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isRunningSearch"]; if (cdsCheatSearch.searchCount == 0) { [bindings setValue:@"Running initial search..." forKey:@"cheatSearchAddressCount"]; [window displayIfNeeded]; } NSInteger compSearchTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; UInt8 byteSize = self.workingCheat.bytes; NSInteger signType = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchSignType"] integerValue]; NSUInteger addressCount = [cdsCheatSearch runComparativeSearch:compSearchTypeID byteSize:byteSize signType:signType]; [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; [cheatSearchListController setContent:cdsCheatSearch.addressList]; NSInteger searchStyle = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]; if (searchStyle == CHEATSEARCH_SEARCHSTYLE_COMPARATIVE && cdsCheatSearch.searchCount == 1) { [self setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_COMPARATIVE]; [bindings setValue:@"Search started!" forKey:@"cheatSearchAddressCount"]; } [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; } - (void) searchDidFinish:(NSNotification *)aNotification { CocoaDSCheatSearch *searcher = [aNotification object]; NSInteger addressCount = 0; if (searcher != nil) { addressCount = searcher.addressList.count; [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; [cheatSearchListController setContent:searcher.addressList]; NSInteger searchStyle = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]; if (searchStyle == CHEATSEARCH_SEARCHSTYLE_COMPARATIVE && searcher.searchCount == 1) { [self setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_COMPARATIVE]; [bindings setValue:@"Search started!" forKey:@"cheatSearchAddressCount"]; } } [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; } - (IBAction) resetSearch:(id)sender { [cheatSearchListController setContent:nil]; [cdsCheatSearch reset]; [self.bindings setValue:nil forKey:@"cheatSearchSearchValue"]; [self.bindings setValue:@"Search not started." forKey:@"cheatSearchAddressCount"]; [self setCheatSearchViewByStyle:[(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isSearchStarted"]; } - (void) setCheatConfigViewByType:(NSInteger)cheatTypeID { NSView *newView = nil; if (currentView == nil) { currentView = viewConfigureNoSelection; } switch (cheatTypeID) { case CHEAT_TYPE_INTERNAL: newView = viewConfigureInternalCheat; break; case CHEAT_TYPE_ACTION_REPLAY: newView = viewConfigureActionReplayCheat; break; case CHEAT_TYPE_CODE_BREAKER: newView = viewConfigureCodeBreakerCheat; break; default: break; } if (newView != nil) { NSRect frameRect = [currentView frame]; [currentView retain]; [cheatConfigBox replaceSubview:currentView with:newView]; currentView = newView; [currentView setFrame:frameRect]; } } - (void) setCheatSearchViewByStyle:(NSInteger)searchStyleID { NSView *newView = nil; if (currentSearchStyleView == nil) { currentSearchStyleView = viewSearchNoSelection; } switch (searchStyleID) { case CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE: newView = viewSearchExactValue; break; case CHEATSEARCH_SEARCHSTYLE_COMPARATIVE: if (cdsCheatSearch.searchCount == 0) { newView = viewSearchComparativeStart; } else { newView = viewSearchComparativeContinue; } break; default: break; } if (newView != nil) { NSRect frameRect = [currentSearchStyleView frame]; [currentSearchStyleView retain]; [cheatSearchView replaceSubview:currentSearchStyleView with:newView]; currentSearchStyleView = newView; [currentSearchStyleView setFrame:frameRect]; } } - (IBAction) selectAllCheatsInDatabase:(id)sender { NSMutableArray *dbList = [cheatDatabaseController content]; if (dbList == nil) { return; } for (CocoaDSCheatItem *cheatItem in dbList) { cheatItem.willAdd = YES; } } - (IBAction) selectNoneCheatsInDatabase:(id)sender { NSMutableArray *dbList = [cheatDatabaseController content]; if (dbList == nil) { return; } for (CocoaDSCheatItem *cheatItem in dbList) { cheatItem.willAdd = NO; } } - (void) addSelectedFromCheatDatabase { NSMutableArray *dbList = [cheatDatabaseController content]; if (dbList == nil) { return; } for (CocoaDSCheatItem *cheatItem in dbList) { if (cheatItem.willAdd) { CocoaDSCheatItem *newCheatItem = [[[CocoaDSCheatItem alloc] initWithCheatData:cheatItem.data] autorelease]; [newCheatItem retainData]; [cheatListController addObject:newCheatItem]; [self.cdsCheats add:newCheatItem]; } } if ([dbList count] > 0) { [self.cdsCheats save]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasItems"]; } } - (IBAction) closeCheatDatabaseSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; NSInteger code = [(NSControl *)sender tag]; [NSApp endSheet:sheet returnCode:code]; } - (void) didEndCheatDatabaseSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; switch (returnCode) { case NSCancelButton: return; break; case NSOKButton: [self addSelectedFromCheatDatabase]; break; default: break; } } - (void)windowDidBecomeKey:(NSNotification *)notification { [cheatWindowController setContent:self.bindings]; } - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { NSTableView *table = (NSTableView *)[aNotification object]; NSInteger rowIndex = [table selectedRow]; if (table == self.cheatListTable) { if (rowIndex >= 0) { NSArray *selectedObjects = [cheatListController selectedObjects]; CocoaDSCheatItem *selectedCheat = [selectedObjects objectAtIndex:0]; self.workingCheat = [selectedCheat createWorkingCopy]; [cheatSelectedItemController setContent:self.workingCheat]; [self setCheatConfigViewByType:selectedCheat.cheatType]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasSelection"]; } else { if (self.workingCheat != nil) { [self.workingCheat.parent destroyWorkingCopy]; } [cheatSelectedItemController setContent:nil]; self.workingCheat = nil; NSRect frameRect = [currentView frame]; [currentView retain]; [cheatConfigBox replaceSubview:currentView with:viewConfigureNoSelection]; currentView = viewConfigureNoSelection; [currentView setFrame:frameRect]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasSelection"]; } } else if (table == self.cheatSearchListTable) { if (rowIndex >= 0) { NSArray *selectedObjects = [cheatSearchListController selectedObjects]; NSMutableDictionary *selectedAddress = [selectedObjects objectAtIndex:0]; NSString *addressString = [(NSString *)[selectedAddress valueForKey:@"addressString"] substringFromIndex:4]; if (self.workingCheat != nil) { self.workingCheat.memAddressSixDigitString = addressString; } } } } @end desmume-0.9.9/src/cocoa/userinterface/preferencesWindowDelegate.mm0000644000175000017500000006063112140261514026115 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "preferencesWindowDelegate.h" #import "EmuControllerDelegate.h" #import "cocoa_core.h" #import "cocoa_cheat.h" #import "cocoa_globals.h" #import "cocoa_input.h" #import "cocoa_file.h" #import "cocoa_videofilter.h" #import "cocoa_util.h" @implementation PreferencesWindowDelegate @synthesize dummyObject; @synthesize window; @synthesize firmwareConfigSheet; @synthesize cdsCoreController; @synthesize emuController; @synthesize prefWindowController; @synthesize cheatWindowController; @synthesize cheatDatabaseController; @synthesize viewGeneral; @synthesize viewInput; @synthesize viewDisplay; @synthesize viewSound; @synthesize viewEmulation; @synthesize displayRotationMenu; @synthesize displayRotationMenuCustomItem; @synthesize displayRotationField; @synthesize spuSyncMethodMenu; @synthesize previewImageView; @synthesize bindings; - (id)init { self = [super init]; if(self == nil) { return nil; } bindings = [[NSMutableDictionary alloc] init]; if (bindings == nil) { [self release]; self = nil; return self; } VideoFilterTypeID vfType = (VideoFilterTypeID)[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_VideoFilter"]; NSImage *videoFilterImage = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"VideoFilterPreview_64x64" ofType:@"png"]]; videoFilter = [[CocoaVideoFilter alloc] initWithSize:[videoFilterImage size] typeID:vfType]; NSSize vfDestSize = [videoFilter destSize]; NSUInteger vfWidth = (NSUInteger)vfDestSize.width; NSUInteger vfHeight = (NSUInteger)vfDestSize.height; NSArray *imageRepArray = [videoFilterImage representations]; const NSBitmapImageRep *imageRep = [imageRepArray objectAtIndex:0]; RGBA8888ForceOpaqueBuffer((const uint32_t *)[imageRep bitmapData], (uint32_t *)[videoFilter srcBufferPtr], (64 * 64)); [videoFilterImage release]; BOOL useBilinear = [[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseBilinearOutput"]; if (vfWidth <= 64 || vfHeight <= 64) { [videoFilter changeFilter:VideoFilterTypeID_Nearest2X]; vfDestSize = [videoFilter destSize]; vfWidth = (NSUInteger)vfDestSize.width; vfHeight = (NSUInteger)vfDestSize.height; bilinearVideoFilter = [[CocoaVideoFilter alloc] initWithSize:vfDestSize typeID:(useBilinear) ? VideoFilterTypeID_Bilinear : VideoFilterTypeID_Nearest2X]; } else if (vfWidth >= 256 || vfHeight >= 256) { bilinearVideoFilter = [[CocoaVideoFilter alloc] initWithSize:vfDestSize typeID:VideoFilterTypeID_None]; } else { bilinearVideoFilter = [[CocoaVideoFilter alloc] initWithSize:vfDestSize typeID:(useBilinear) ? VideoFilterTypeID_Bilinear : VideoFilterTypeID_Nearest2X]; } RGBA8888ForceOpaqueBuffer((const uint32_t *)[videoFilter runFilter], (uint32_t *)[bilinearVideoFilter srcBufferPtr], (vfWidth * vfHeight)); [bindings setObject:[bilinearVideoFilter image] forKey:@"VideoFilterPreviewImage"]; iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]]; iconVolumeTwoThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeTwoThird_16x16" ofType:@"png"]]; iconVolumeOneThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeOneThird_16x16" ofType:@"png"]]; iconVolumeMute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]]; [bindings setObject:iconVolumeFull forKey:@"volumeIconImage"]; return self; } - (void)dealloc { [iconVolumeFull release]; [iconVolumeTwoThird release]; [iconVolumeOneThird release]; [iconVolumeMute release]; [bindings release]; [videoFilter release]; [super dealloc]; } - (IBAction) showGeneralView:(id)sender { [self switchContentView:viewGeneral]; } - (IBAction) showInputView:(id)sender { [self switchContentView:(NSView *)viewInput]; [window makeFirstResponder:(NSView *)viewInput]; } - (IBAction) showDisplayView:(id)sender { [self switchContentView:viewDisplay]; } - (IBAction) showSoundView:(id)sender { [self switchContentView:viewSound]; } - (IBAction) showEmulationView:(id)sender { [self switchContentView:viewEmulation]; } - (IBAction) selectAutoloadRomOption:(id)sender { const NSInteger option = [(NSMenuItem *)sender tag]; [[NSUserDefaults standardUserDefaults] setInteger:option forKey:@"General_AutoloadROMOption"]; if (option == 1) { NSString *autoloadRomPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"General_AutoloadROMSelectedPath"]; if ([autoloadRomPath length] == 0) { [self chooseRomForAutoload:sender]; } } } - (IBAction) chooseRomForAutoload:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_ROM_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_DS, @FILE_EXT_ROM_GBA, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseRomForAutoloadDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseRomForAutoloadDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseRomForAutoloadDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"General_AutoloadROMSelectedPath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"AutoloadRomName"]; } - (IBAction) chooseAdvansceneDatabase:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_ADVANSCENE_DB_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ADVANSCENE_DB, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseAdvansceneDatabaseDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseAdvansceneDatabaseDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseAdvansceneDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"Advanscene_DatabasePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"AdvansceneDatabaseName"]; } - (IBAction) chooseCheatDatabase:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_R4_CHEAT_DB_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_R4_CHEAT_DB, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseCheatDatabaseDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseCheatDatabaseDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseCheatDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"R4Cheat_DatabasePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"R4CheatDatabaseName"]; const BOOL isRomLoaded = [(EmuControllerDelegate *)[emuController content] currentRom] != nil; NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; CocoaDSCheatManager *cdsCheats = (CocoaDSCheatManager *)[cheatWindowBindings valueForKey:@"cheatList"]; if (isRomLoaded == YES && cdsCheats != nil) { NSInteger error = 0; NSMutableArray *dbList = [cdsCheats cheatListFromDatabase:selectedFileURL errorCode:&error]; if (dbList != nil) { [cheatDatabaseController setContent:dbList]; NSString *titleString = cdsCheats.dbTitle; NSString *dateString = cdsCheats.dbDate; [cheatWindowBindings setValue:titleString forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:dateString forKey:@"cheatDBDate"]; [cheatWindowBindings setValue:[NSString stringWithFormat:@"%ld", (unsigned long)[dbList count]] forKey:@"cheatDBItemCount"]; } else { // TODO: Display an error message here. [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; switch (error) { case CHEATEXPORT_ERROR_FILE_NOT_FOUND: NSLog(@"R4 Cheat Database read failed! Could not load the database file!"); [cheatWindowBindings setValue:@"Database not loaded." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"CANNOT LOAD FILE" forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_WRONG_FILE_FORMAT: NSLog(@"R4 Cheat Database read failed! Wrong file format!"); [cheatWindowBindings setValue:@"Database load error." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"FAILED TO LOAD FILE" forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_SERIAL_NOT_FOUND: NSLog(@"R4 Cheat Database read failed! Could not find the serial number for this game in the database!"); [cheatWindowBindings setValue:@"ROM not found in database." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"ROM not found." forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_EXPORT_FAILED: NSLog(@"R4 Cheat Database read failed! Could not read the database file!"); [cheatWindowBindings setValue:@"Database read error." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"CANNOT READ FILE" forKey:@"cheatDBDate"]; break; default: break; } } } } - (IBAction) selectDisplayMode:(id)sender { const NSInteger displayMode = [(NSMenuItem *)sender tag]; [[NSUserDefaults standardUserDefaults] setInteger:displayMode forKey:@"DisplayView_Mode"]; } - (IBAction) selectDisplaySize:(id)sender { const NSInteger displaySize = [(NSMenuItem *)sender tag]; [[NSUserDefaults standardUserDefaults] setInteger:displaySize forKey:@"DisplayView_Size"]; } - (IBAction) selectDisplayRotation:(id)sender { const NSInteger displayRotation = [(NSMenuItem *)sender tag]; if (displayRotation != -1) { [[NSUserDefaults standardUserDefaults] setDouble:displayRotation forKey:@"DisplayView_Rotation"]; } } - (IBAction) setUseBilinear:(id)sender { const BOOL useBilinear = [CocoaDSUtil getIBActionSenderButtonStateBool:sender]; const NSUInteger previewSrcWidth = (NSUInteger)[bilinearVideoFilter srcSize].width; const NSUInteger previewSrcHeight = (NSUInteger)[bilinearVideoFilter srcSize].height; if (previewSrcWidth <= 128 || previewSrcHeight <= 128) { [bilinearVideoFilter changeFilter:(useBilinear) ? VideoFilterTypeID_Bilinear : VideoFilterTypeID_Nearest2X]; } NSBitmapImageRep *newPreviewImageRep = [bilinearVideoFilter bitmapImageRep]; NSImage *videoFilterPreviewImage = [bindings objectForKey:@"VideoFilterPreviewImage"]; NSArray *imageRepArray = [videoFilterPreviewImage representations]; NSImageRep *oldImageRep = [imageRepArray objectAtIndex:0]; [videoFilterPreviewImage removeRepresentation:oldImageRep]; [videoFilterPreviewImage addRepresentation:newPreviewImageRep]; [previewImageView setNeedsDisplay:YES]; } - (IBAction) selectVideoFilterType:(id)sender { const VideoFilterTypeID vfType = (VideoFilterTypeID)[CocoaDSUtil getIBActionSenderTag:sender]; const BOOL useBilinear = [[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseBilinearOutput"]; [[NSUserDefaults standardUserDefaults] setInteger:vfType forKey:@"DisplayView_VideoFilter"]; [videoFilter changeFilter:vfType]; NSSize vfDestSize = [videoFilter destSize]; NSUInteger vfWidth = (NSUInteger)[videoFilter destSize].width; NSUInteger vfHeight = (NSUInteger)[videoFilter destSize].height; if (vfWidth <= 64 || vfHeight <= 64) { [videoFilter changeFilter:VideoFilterTypeID_Nearest2X]; vfDestSize = [videoFilter destSize]; vfWidth = (NSUInteger)vfDestSize.width; vfHeight = (NSUInteger)vfDestSize.height; [bilinearVideoFilter setSourceSize:vfDestSize]; [bilinearVideoFilter changeFilter:(useBilinear) ? VideoFilterTypeID_Bilinear : VideoFilterTypeID_Nearest2X]; } else if (vfWidth >= 256 || vfHeight >= 256) { [bilinearVideoFilter setSourceSize:vfDestSize]; [bilinearVideoFilter changeFilter:VideoFilterTypeID_None]; } else { [bilinearVideoFilter setSourceSize:vfDestSize]; [bilinearVideoFilter changeFilter:(useBilinear) ? VideoFilterTypeID_Bilinear : VideoFilterTypeID_Nearest2X]; } RGBA8888ForceOpaqueBuffer((const uint32_t *)[videoFilter runFilter], (uint32_t *)[bilinearVideoFilter srcBufferPtr], (vfWidth * vfHeight)); NSBitmapImageRep *newPreviewImageRep = [bilinearVideoFilter bitmapImageRep]; NSImage *videoFilterPreviewImage = [bindings objectForKey:@"VideoFilterPreviewImage"]; NSArray *imageRepArray = [videoFilterPreviewImage representations]; NSImageRep *oldImageRep = [imageRepArray objectAtIndex:0]; [videoFilterPreviewImage removeRepresentation:oldImageRep]; [videoFilterPreviewImage addRepresentation:newPreviewImageRep]; [previewImageView setNeedsDisplay:YES]; } - (IBAction) updateVolumeIcon:(id)sender { NSImage *iconImage = (NSImage *)[bindings objectForKey:@"volumeIconImage"]; const float vol = [[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]; if (vol <= 0.0f) { if (iconImage == iconVolumeMute) { return; } iconImage = iconVolumeMute; } else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) { if (iconImage == iconVolumeOneThird) { return; } iconImage = iconVolumeOneThird; } else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) { if (iconImage == iconVolumeTwoThird) { return; } iconImage = iconVolumeTwoThird; } else { if (iconImage == iconVolumeFull) { return; } iconImage = iconVolumeFull; } [bindings setObject:iconImage forKey:@"volumeIconImage"]; } - (IBAction) selectSPUSyncMode:(id)sender { const NSInteger spuSyncMode = [[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"]; [spuSyncMethodMenu setEnabled:(spuSyncMode == SPU_SYNC_MODE_DUAL_SYNC_ASYNC) ? NO : YES]; } - (IBAction) selectSPUSyncMethod:(id)sender { const NSInteger spuSyncMethod = [(NSMenuItem *)sender tag]; [[NSUserDefaults standardUserDefaults] setInteger:spuSyncMethod forKey:@"SPU_SyncMethod"]; } - (void) updateDisplayRotationMenu:(double)displayRotation { if (displayRotation == 0.0f || displayRotation == 90.0f || displayRotation == 180.0f || displayRotation == 270.0f) { [displayRotationMenu selectItemWithTag:(NSInteger)displayRotation]; } else if (displayRotation < 0.0f || displayRotation >= 360.0f) { displayRotation = 0.0f; [displayRotationField setFloatValue:displayRotation]; [displayRotationMenu selectItemWithTag:(NSInteger)displayRotation]; } else { [displayRotationMenu selectItem:displayRotationMenuCustomItem]; } } - (IBAction) chooseARM9BiosImage:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_ARM9_IMAGE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseArm9BiosImageDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseArm9BiosImageDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (IBAction) chooseARM7BiosImage:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_ARM7_IMAGE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseArm7BiosImageDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseArm7BiosImageDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (IBAction) chooseFirmwareImage:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_SELECT_FIRMWARE_IMAGE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { [self chooseFirmwareImageDidEnd:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:window modalDelegate:self didEndSelector:@selector(chooseFirmwareImageDidEnd:returnCode:contextInfo:) contextInfo:nil]; #endif } - (void) chooseArm9BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"BIOS_ARM9ImagePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"Arm9BiosImageName"]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setArm9ImageURL:selectedFileURL]; } - (void) chooseArm7BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"BIOS_ARM7ImagePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"Arm7BiosImageName"]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setArm7ImageURL:selectedFileURL]; } - (void) chooseFirmwareImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedFileURL == nil) { return; } NSString *selectedFile = [selectedFileURL path]; [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"Emulation_FirmwareImagePath"]; [bindings setValue:[selectedFile lastPathComponent] forKey:@"FirmwareImageName"]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setFirmwareImageURL:selectedFileURL]; } - (IBAction) configureInternalFirmware:(id)sender { [NSApp beginSheet:firmwareConfigSheet modalForWindow:window modalDelegate:self didEndSelector:@selector(didEndFirmwareConfigSheet:returnCode:contextInfo:) contextInfo:nil]; } - (IBAction) closeFirmwareConfigSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; const NSInteger code = [CocoaDSUtil getIBActionSenderTag:sender]; // Force end of editing of any text fields. [sheet makeFirstResponder:nil]; [NSApp endSheet:sheet returnCode:code]; } - (void) didEndFirmwareConfigSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; } - (void)controlTextDidEndEditing:(NSNotification *)aNotification { [self updateDisplayRotationMenu:[displayRotationField floatValue]]; } - (void) switchContentView:(NSView *)theView { if ([window contentView] == theView) { return; } NSRect newFrame = [window frameRectForContentRect:[theView frame]]; newFrame.origin.x = [window frame].origin.x; newFrame.origin.y = [window frame].origin.y + [[window contentView] frame].size.height - [theView frame].size.height; NSView *tempView = [[NSView alloc] initWithFrame:[[window contentView] frame]]; [window setContentView:tempView]; [window setFrame:newFrame display:YES animate:YES]; [window setContentView:theView]; [tempView release]; } - (void)windowDidBecomeKey:(NSNotification *)notification { [prefWindowController setContent:bindings]; if ([viewInput configInputTargetID] != nil) { [[viewInput inputManager] setHidInputTarget:viewInput]; } } - (void)windowWillClose:(NSNotification *)notification { [viewInput setConfigInputTargetID:nil]; } @end desmume-0.9.9/src/cocoa/userinterface/EmuControllerDelegate.mm0000644000175000017500000020164612140261514025221 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "EmuControllerDelegate.h" #import "DisplayWindowController.h" #import "InputManager.h" #import "cheatWindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_cheat.h" #import "cocoa_core.h" #import "cocoa_file.h" #import "cocoa_firmware.h" #import "cocoa_GPU.h" #import "cocoa_input.h" #import "cocoa_output.h" #import "cocoa_rom.h" @implementation EmuControllerDelegate @synthesize inputManager; @synthesize currentRom; @dynamic cdsFirmware; @dynamic cdsSpeaker; @synthesize cdsCheats; @synthesize cheatWindowDelegate; @synthesize firmwarePanelController; @synthesize romInfoPanelController; @synthesize cdsCoreController; @synthesize cdsSoundController; @synthesize cheatWindowController; @synthesize cheatListController; @synthesize cheatDatabaseController; @synthesize slot1ManagerWindow; @synthesize saveFileMigrationSheet; @synthesize saveStatePrecloseSheet; @synthesize exportRomSavePanelAccessoryView; @synthesize iconExecute; @synthesize iconPause; @synthesize iconSpeedNormal; @synthesize iconSpeedDouble; @dynamic masterExecuteFlag; @dynamic executionState; @dynamic speedScalar; @synthesize isWorking; @synthesize isRomLoading; @synthesize statusText; @dynamic currentVolumeValue; @synthesize currentVolumeIcon; @synthesize isShowingSaveStateDialog; @synthesize isShowingFileMigrationDialog; @synthesize isUserInterfaceBlockingExecution; @synthesize currentSaveStateURL; @synthesize selectedExportRomSaveID; @synthesize selectedRomSaveTypeID; @dynamic render3DRenderingEngine; @dynamic render3DHighPrecisionColorInterpolation; @dynamic render3DEdgeMarking; @dynamic render3DFog; @dynamic render3DTextures; @dynamic render3DDepthComparisonThreshold; @dynamic render3DThreads; @dynamic render3DLineHack; @dynamic render3DMultisample; @synthesize mainWindow; @synthesize windowList; -(id)init { self = [super init]; if(self == nil) { return nil; } spinlockFirmware = OS_SPINLOCK_INIT; spinlockSpeaker = OS_SPINLOCK_INIT; mainWindow = nil; windowList = [[NSMutableArray alloc] initWithCapacity:32]; currentRom = nil; cdsFirmware = nil; cdsSpeaker = nil; dummyCheatList = nil; isSaveStateEdited = NO; isShowingSaveStateDialog = NO; isShowingFileMigrationDialog = NO; isUserInterfaceBlockingExecution = NO; currentSaveStateURL = nil; selectedRomSaveTypeID = ROMSAVETYPE_AUTOMATIC; selectedExportRomSaveID = 0; lastSetSpeedScalar = 1.0f; isSoundMuted = NO; lastSetVolumeValue = MAX_VOLUME; iconExecute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]]; iconPause = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]]; iconSpeedNormal = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed1x_420x420" ofType:@"png"]]; iconSpeedDouble = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed2x_420x420" ofType:@"png"]]; iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]]; iconVolumeTwoThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeTwoThird_16x16" ofType:@"png"]]; iconVolumeOneThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeOneThird_16x16" ofType:@"png"]]; iconVolumeMute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]]; isWorking = NO; isRomLoading = NO; statusText = NSSTRING_STATUS_READY; currentVolumeValue = MAX_VOLUME; currentVolumeIcon = [iconVolumeFull retain]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadRomDidFinish:) name:@"org.desmume.DeSmuME.loadRomDidFinish" object:nil]; return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [iconExecute release]; [iconPause release]; [iconSpeedNormal release]; [iconSpeedDouble release]; [iconVolumeFull release]; [iconVolumeTwoThird release]; [iconVolumeOneThird release]; [iconVolumeMute release]; [[self currentRom] release]; [self setCurrentRom:nil]; [self setCdsCheats:nil]; [self setCdsSpeaker:nil]; [self setIsWorking:NO]; [self setStatusText:@""]; [self setCurrentVolumeValue:0.0f]; [self setCurrentVolumeIcon:nil]; [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; [cdsSoundController setContent:nil]; [firmwarePanelController setContent:nil]; [self setMainWindow:nil]; [windowList release]; [super dealloc]; } #pragma mark Dynamic Property Methods - (void) setCdsFirmware:(CocoaDSFirmware *)theFirmware { OSSpinLockLock(&spinlockFirmware); if (theFirmware == cdsFirmware) { OSSpinLockUnlock(&spinlockFirmware); return; } if (theFirmware != nil) { [theFirmware retain]; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setCdsFirmware:theFirmware]; [firmwarePanelController setContent:theFirmware]; [cdsFirmware release]; cdsFirmware = theFirmware; OSSpinLockUnlock(&spinlockFirmware); } - (CocoaDSFirmware *) cdsFirmware { OSSpinLockLock(&spinlockFirmware); CocoaDSFirmware *theFirmware = cdsFirmware; OSSpinLockUnlock(&spinlockFirmware); return theFirmware; } - (void) setCdsSpeaker:(CocoaDSSpeaker *)theSpeaker { OSSpinLockLock(&spinlockSpeaker); if (theSpeaker == cdsSpeaker) { OSSpinLockUnlock(&spinlockSpeaker); return; } if (theSpeaker != nil) { [theSpeaker retain]; } [cdsSoundController setContent:[theSpeaker property]]; [cdsSpeaker release]; cdsSpeaker = theSpeaker; OSSpinLockUnlock(&spinlockSpeaker); } - (CocoaDSSpeaker *) cdsSpeaker { OSSpinLockLock(&spinlockSpeaker); CocoaDSSpeaker *theSpeaker = cdsSpeaker; OSSpinLockUnlock(&spinlockSpeaker); return theSpeaker; } - (BOOL) masterExecuteFlag { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore masterExecute]; } - (NSInteger) executionState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore coreState]; } - (CGFloat) speedScalar { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore speedScalar]; } - (void) setCurrentVolumeValue:(float)vol { currentVolumeValue = vol; // Update the icon. NSImage *currentImage = [self currentVolumeIcon]; NSImage *newImage = nil; if (vol <= 0.0f) { newImage = iconVolumeMute; } else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) { newImage = iconVolumeOneThird; isSoundMuted = NO; lastSetVolumeValue = vol; } else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) { newImage = iconVolumeTwoThird; isSoundMuted = NO; lastSetVolumeValue = vol; } else { newImage = iconVolumeFull; isSoundMuted = NO; lastSetVolumeValue = vol; } if (newImage != currentImage) { [self setCurrentVolumeIcon:newImage]; } } - (float) currentVolumeValue { return currentVolumeValue; } - (void) setRender3DRenderingEngine:(NSInteger)engineID { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DRenderingEngine:engineID]; } - (NSInteger) render3DRenderingEngine { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DRenderingEngine]; } - (void) setRender3DHighPrecisionColorInterpolation:(BOOL)theState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DHighPrecisionColorInterpolation:theState]; } - (BOOL) render3DHighPrecisionColorInterpolation { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DHighPrecisionColorInterpolation]; } - (void) setRender3DEdgeMarking:(BOOL)theState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DEdgeMarking:theState]; } - (BOOL) render3DEdgeMarking { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DEdgeMarking]; } - (void) setRender3DFog:(BOOL)theState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DFog:theState]; } - (BOOL) render3DFog { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DFog]; } - (void) setRender3DTextures:(BOOL)theState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DTextures:theState]; } - (BOOL) render3DTextures { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DTextures]; } - (void) setRender3DDepthComparisonThreshold:(NSInteger)threshold { if (threshold < 0) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DDepthComparisonThreshold:(NSUInteger)threshold]; } - (NSInteger) render3DDepthComparisonThreshold { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DDepthComparisonThreshold]; } - (void) setRender3DThreads:(NSInteger)threadCount { if (threadCount < 0) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DThreads:(NSUInteger)threadCount]; } - (NSInteger) render3DThreads { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DThreads]; } - (void) setRender3DLineHack:(BOOL)theState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DLineHack:theState]; } - (BOOL) render3DLineHack { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DLineHack]; } - (void) setRender3DMultisample:(BOOL)theState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore.cdsGPU setRender3DMultisample:theState]; } - (BOOL) render3DMultisample { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [cdsCore.cdsGPU render3DMultisample]; } #pragma mark IBActions - (IBAction) newDisplayWindow:(id)sender { DisplayWindowController *newWindowController = [[DisplayWindowController alloc] initWithWindowNibName:@"DisplayWindow" emuControlDelegate:self]; [windowList addObject:newWindowController]; [[newWindowController view] setInputManager:[self inputManager]]; [self updateAllWindowTitles]; [newWindowController showWindow:self]; [[newWindowController window] makeKeyAndOrderFront:self]; [[newWindowController window] makeMainWindow]; if ([self currentRom] == nil) { [[newWindowController view] clearToBlack]; } else { [[newWindowController view] setNeedsDisplay:YES]; } } - (IBAction) openRom:(id)sender { if ([self isRomLoading]) { return; } NSURL *selectedFile = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_OPEN_ROM_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_DS, @FILE_EXT_ROM_GBA, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } [self handleLoadRom:selectedFile]; } } - (IBAction) loadRecentRom:(id)sender { // Dummy selector, used for UI validation only. } - (IBAction) closeWindow:(id)sender { [[mainWindow window] performClose:sender]; } - (IBAction) closeRom:(id)sender { [self handleUnloadRom:REASONFORCLOSE_NORMAL romToLoad:nil]; } - (IBAction) revealRomInFinder:(id)sender { NSURL *romURL = [[self currentRom] fileURL]; if (romURL != nil) { [[NSWorkspace sharedWorkspace] selectFile:[romURL path] inFileViewerRootedAtPath:@""]; } } - (IBAction) revealGameDataFolderInFinder:(id)sender { NSURL *folderURL = [CocoaDSFile userAppSupportURL:nil version:nil]; [[NSWorkspace sharedWorkspace] selectFile:[folderURL path] inFileViewerRootedAtPath:@""]; } - (IBAction) openEmuSaveState:(id)sender { NSURL *selectedFile = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_OPEN_STATE_FILE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_SAVE_STATE, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } } else { return; } [self pauseCore]; const BOOL isStateLoaded = [CocoaDSFile loadState:selectedFile]; if (!isStateLoaded) { [self setStatusText:NSSTRING_STATUS_SAVESTATE_LOADING_FAILED]; [self restoreCoreState]; return; } isSaveStateEdited = YES; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } [self setStatusText:NSSTRING_STATUS_SAVESTATE_LOADED]; [self restoreCoreState]; [self setCurrentSaveStateURL:selectedFile]; } - (IBAction) saveEmuSaveState:(id)sender { if (isSaveStateEdited && [self currentSaveStateURL] != nil) { [self pauseCore]; const BOOL isStateSaved = [CocoaDSFile saveState:[self currentSaveStateURL]]; if (!isStateSaved) { [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } isSaveStateEdited = YES; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVED]; [self restoreCoreState]; } else { [self saveEmuSaveStateAs:sender]; } } - (IBAction) saveEmuSaveStateAs:(id)sender { NSSavePanel *panel = [NSSavePanel savePanel]; [panel setCanCreateDirectories:YES]; [panel setTitle:NSSTRING_TITLE_SAVE_STATE_FILE_PANEL]; // The NSSavePanel method -(void)setRequiredFileType: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_SAVE_STATE, nil]; [panel setAllowedFileTypes:fileTypes]; #else [panel setRequiredFileType:@FILE_EXT_SAVE_STATE]; #endif const NSInteger buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { NSURL *saveFileURL = [panel URL]; [self pauseCore]; const BOOL isStateSaved = [CocoaDSFile saveState:saveFileURL]; if (!isStateSaved) { [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } isSaveStateEdited = YES; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVED]; [self restoreCoreState]; [self setCurrentSaveStateURL:saveFileURL]; } } - (IBAction) revertEmuSaveState:(id)sender { if (!isSaveStateEdited || [self currentSaveStateURL] == nil) { return; } [self pauseCore]; const BOOL isStateLoaded = [CocoaDSFile loadState:[self currentSaveStateURL]]; if (!isStateLoaded) { [self setStatusText:NSSTRING_STATUS_SAVESTATE_REVERTING_FAILED]; return; } isSaveStateEdited = YES; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } [self setStatusText:NSSTRING_STATUS_SAVESTATE_REVERTED]; [self restoreCoreState]; } - (IBAction) loadEmuSaveStateSlot:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) saveEmuSaveStateSlot:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) importRomSave:(id)sender { NSURL *selectedFile = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_IMPORT_ROM_SAVE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_SAVE_RAW, @FILE_EXT_ACTION_REPLAY_SAVE, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } const BOOL isRomSaveImported = [CocoaDSFile importRomSave:selectedFile]; [self setStatusText:(isRomSaveImported) ? NSSTRING_STATUS_ROM_SAVE_IMPORTED : NSSTRING_STATUS_ROM_SAVE_IMPORT_FAILED]; } } - (IBAction) exportRomSave:(id)sender { [self pauseCore]; NSSavePanel *panel = [NSSavePanel savePanel]; [panel setTitle:NSSTRING_TITLE_EXPORT_ROM_SAVE_PANEL]; [panel setCanCreateDirectories:YES]; [panel setAccessoryView:exportRomSavePanelAccessoryView]; const NSInteger buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { NSURL *romSaveURL = [CocoaDSFile fileURLFromRomURL:[[self currentRom] fileURL] toKind:@"ROM Save"]; if (romSaveURL != nil) { const BOOL isRomSaveExported = [CocoaDSFile exportRomSaveToURL:[panel URL] romSaveURL:romSaveURL fileType:[self selectedExportRomSaveID]]; [self setStatusText:(isRomSaveExported) ? NSSTRING_STATUS_ROM_SAVE_EXPORTED : NSSTRING_STATUS_ROM_SAVE_EXPORT_FAILED]; } } [self restoreCoreState]; } - (IBAction) toggleExecutePause:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) reset:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleSpeedLimiter:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleAutoFrameSkip:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender { [mainWindow toggleKeepMinDisplaySizeAtNormal:sender]; } - (IBAction) toggleStatusBar:(id)sender { [mainWindow toggleStatusBar:sender]; } - (IBAction) toggleToolbarShown:(id)sender { [[mainWindow window] toggleToolbarShown:sender]; } - (IBAction) runToolbarCustomizationPalette:(id)sender { [[mainWindow window] runToolbarCustomizationPalette:sender]; } - (IBAction) saveScreenshotAs:(id)sender { [mainWindow saveScreenshotAs:sender]; } - (IBAction) toggleGPUState:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) changeRomSaveType:(id)sender { const NSInteger saveTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; [self setSelectedRomSaveTypeID:saveTypeID]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore changeRomSaveType:saveTypeID]; } - (IBAction) toggleCheats:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) changeCoreSpeed:(id)sender { CGFloat newSpeedScalar = (CGFloat)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSpeedScalar:newSpeedScalar]; lastSetSpeedScalar = newSpeedScalar; } - (IBAction) changeCoreEmuFlags:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; NSUInteger flags = [cdsCore emulationFlags]; NSInteger flagBit = [CocoaDSUtil getIBActionSenderTag:sender]; if (flagBit < 0) { return; } BOOL flagState = [CocoaDSUtil getIBActionSenderButtonStateBool:sender]; if (flagState) { flags |= (1 << flagBit); } else { flags &= ~(1 << flagBit); } [cdsCore setEmulationFlags:flags]; } - (IBAction) changeFirmwareSettings:(id)sender { // Force end of editing of any text fields. [[(NSControl *)sender window] makeFirstResponder:nil]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsFirmware] update]; } - (IBAction) changeVolume:(id)sender { const float vol = [self currentVolumeValue]; [self setCurrentVolumeValue:vol]; [self setStatusText:[NSString stringWithFormat:NSSTRING_STATUS_VOLUME, vol]]; [CocoaDSUtil messageSendOneWayWithFloat:[cdsSpeaker receivePort] msgID:MESSAGE_SET_VOLUME floatValue:vol]; } - (IBAction) changeAudioEngine:(id)sender { [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_AUDIO_PROCESS_METHOD integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeSpuAdvancedLogic:(id)sender { [CocoaDSUtil messageSendOneWayWithBool:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_ADVANCED_LOGIC boolValue:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; } - (IBAction) changeSpuInterpolationMode:(id)sender { [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_INTERPOLATION_MODE integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeSpuSyncMode:(id)sender { [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_SYNC_MODE integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeSpuSyncMethod:(id)sender { [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_SYNC_METHOD integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeScale:(id)sender { [mainWindow setDisplayScale:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0]; } - (IBAction) changeRotation:(id)sender { // Get the rotation value from the sender. if ([sender isMemberOfClass:[NSSlider class]]) { [mainWindow setDisplayRotation:[(NSSlider *)sender doubleValue]]; } else { [mainWindow setDisplayRotation:(double)[CocoaDSUtil getIBActionSenderTag:sender]]; } } - (IBAction) changeRotationRelative:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) changeDisplayMode:(id)sender { const NSInteger newDisplayModeID = [CocoaDSUtil getIBActionSenderTag:sender]; if (newDisplayModeID == [mainWindow displayMode]) { return; } [mainWindow setDisplayMode:newDisplayModeID]; } - (IBAction) changeDisplayOrientation:(id)sender { const NSInteger newDisplayOrientation = [CocoaDSUtil getIBActionSenderTag:sender]; if (newDisplayOrientation == [mainWindow displayOrientation]) { return; } [mainWindow setDisplayOrientation:newDisplayOrientation]; } - (IBAction) changeDisplayOrder:(id)sender { [mainWindow setDisplayOrder:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeDisplayGap:(id)sender { [mainWindow setDisplayGap:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0]; } - (IBAction) chooseSlot1R4Directory:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:YES]; [panel setCanChooseFiles:NO]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:@"Select R4 Directory"]; NSArray *fileTypes = [NSArray arrayWithObjects:nil]; // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; [panel beginSheetModalForWindow:slot1ManagerWindow completionHandler:^(NSInteger result) { [self didEndChooseSlot1R4Directory:panel returnCode:result contextInfo:nil]; } ]; #else [panel beginSheetForDirectory:nil file:nil types:fileTypes modalForWindow:slot1ManagerWindow modalDelegate:self didEndSelector:@selector(didEndChooseSlot1R4Directory:returnCode:contextInfo:) contextInfo:nil]; #endif } - (IBAction) slot1Eject:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore slot1Eject]; } - (IBAction) writeDefaultsDisplayRotation:(id)sender { [[NSUserDefaults standardUserDefaults] setDouble:[mainWindow displayRotation] forKey:@"DisplayView_Rotation"]; } - (IBAction) writeDefaultsDisplayGap:(id)sender { [[NSUserDefaults standardUserDefaults] setDouble:([mainWindow displayGap] * 100.0) forKey:@"DisplayViewCombo_Gap"]; } - (IBAction) writeDefaultsHUDSettings:(id)sender { // TODO: Not implemented. } - (IBAction) writeDefaultsDisplayVideoSettings:(id)sender { [[NSUserDefaults standardUserDefaults] setInteger:[mainWindow videoFilterType] forKey:@"DisplayView_VideoFilter"]; [[NSUserDefaults standardUserDefaults] setBool:[mainWindow useBilinearOutput] forKey:@"DisplayView_UseBilinearOutput"]; [[NSUserDefaults standardUserDefaults] setBool:[mainWindow useVerticalSync] forKey:@"DisplayView_UseVerticalSync"]; } - (IBAction) writeDefaults3DRenderingSettings:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; // Force end of editing of any text fields. [[(NSControl *)sender window] makeFirstResponder:nil]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore.cdsGPU render3DRenderingEngine] forKey:@"Render3D_RenderingEngine"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore.cdsGPU render3DHighPrecisionColorInterpolation] forKey:@"Render3D_HighPrecisionColorInterpolation"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore.cdsGPU render3DEdgeMarking] forKey:@"Render3D_EdgeMarking"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore.cdsGPU render3DFog] forKey:@"Render3D_Fog"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore.cdsGPU render3DTextures] forKey:@"Render3D_Textures"]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore.cdsGPU render3DDepthComparisonThreshold] forKey:@"Render3D_DepthComparisonThreshold"]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore.cdsGPU render3DThreads] forKey:@"Render3D_Threads"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore.cdsGPU render3DLineHack] forKey:@"Render3D_LineHack"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore.cdsGPU render3DMultisample] forKey:@"Render3D_Multisample"]; } - (IBAction) writeDefaultsEmulationSettings:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; NSDictionary *firmwareDict = [(CocoaDSFirmware *)[firmwarePanelController content] dataDictionary]; // Force end of editing of any text fields. [[(NSControl *)sender window] makeFirstResponder:nil]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagAdvancedBusLevelTiming] forKey:@"Emulation_AdvancedBusLevelTiming"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagRigorousTiming] forKey:@"Emulation_RigorousTiming"]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore cpuEmulationEngine] forKey:@"Emulation_CPUEmulationEngine"]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore maxJITBlockSize] forKey:@"Emulation_MaxJITBlockSize"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagUseExternalBios] forKey:@"Emulation_UseExternalBIOSImages"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagEmulateBiosInterrupts] forKey:@"Emulation_BIOSEmulateSWI"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagPatchDelayLoop] forKey:@"Emulation_BIOSPatchDelayLoopSWI"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagUseExternalFirmware] forKey:@"Emulation_UseExternalFirmwareImage"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagFirmwareBoot] forKey:@"Emulation_FirmwareBoot"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagEmulateEnsata] forKey:@"Emulation_EmulateEnsata"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagDebugConsole] forKey:@"Emulation_UseDebugConsole"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Nickname"] forKey:@"FirmwareConfig_Nickname"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Message"] forKey:@"FirmwareConfig_Message"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"FavoriteColor"] forKey:@"FirmwareConfig_FavoriteColor"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Birthday"] forKey:@"FirmwareConfig_Birthday"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Language"] forKey:@"FirmwareConfig_Language"]; } - (IBAction) writeDefaultsSlot1Settings:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[NSUserDefaults standardUserDefaults] setInteger:[cdsCore slot1DeviceType] forKey:@"EmulationSlot1_DeviceType"]; [[NSUserDefaults standardUserDefaults] setObject:[[cdsCore slot1R4URL] path] forKey:@"EmulationSlot1_R4StoragePath"]; } - (IBAction) writeDefaultsSoundSettings:(id)sender { NSMutableDictionary *speakerBindings = (NSMutableDictionary *)[cdsSoundController content]; [[NSUserDefaults standardUserDefaults] setFloat:[[speakerBindings valueForKey:@"volume"] floatValue] forKey:@"Sound_Volume"]; [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"audioOutputEngine"] integerValue] forKey:@"Sound_AudioOutputEngine"]; [[NSUserDefaults standardUserDefaults] setBool:[[speakerBindings valueForKey:@"spuAdvancedLogic"] boolValue] forKey:@"SPU_AdvancedLogic"]; [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuInterpolationMode"] integerValue] forKey:@"SPU_InterpolationMode"]; [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuSyncMode"] integerValue] forKey:@"SPU_SyncMode"]; [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuSyncMethod"] integerValue] forKey:@"SPU_SyncMethod"]; } - (IBAction) closeSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; const NSInteger code = [(NSControl *)sender tag]; [NSApp endSheet:sheet returnCode:code]; } #pragma mark Class Methods - (void) cmdUpdateDSController:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; const NSUInteger controlID = cmdAttr.intValue[0]; const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; if (controlID == DSControllerState_Touch) { const NSPoint touchLoc = (cmdAttr.useInputForIntCoord) ? NSMakePoint(cmdAttr.input.intCoordX, cmdAttr.input.intCoordY) : NSMakePoint(cmdAttr.intValue[1], cmdAttr.intValue[2]); if (touchLoc.x >= 0.0 && touchLoc.y >= 0.0) { [[cdsCore cdsController] setTouchState:theState location:touchLoc]; } } else if (controlID == DSControllerState_Microphone) { const NSInteger micMode = cmdAttr.intValue[1]; [[cdsCore cdsController] setMicrophoneState:theState inputMode:micMode]; const float sineWaveFrequency = cmdAttr.floatValue[0]; [[cdsCore cdsController] setSineWaveGeneratorFrequency:sineWaveFrequency]; NSString *audioFilePath = cmdAttr.object[0]; [[cdsCore cdsController] setSelectedAudioFileGenerator:[inputManager audioFileGeneratorFromFilePath:audioFilePath]]; } else { [[cdsCore cdsController] setControllerState:theState controlID:controlID]; } } - (void) cmdLoadEmuSaveStateSlot:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; if (saveStatePath == nil) { // Should throw an error message here... return; } const NSInteger slotNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; if (slotNumber < 0 || slotNumber > MAX_SAVESTATE_SLOTS) { return; } NSURL *currentRomURL = [[self currentRom] fileURL]; NSString *fileName = [CocoaDSFile saveSlotFileName:currentRomURL slotNumber:(NSUInteger)(slotNumber + 1)]; if (fileName == nil) { return; } [self pauseCore]; const BOOL isStateLoaded = [CocoaDSFile loadState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; [self setStatusText:(isStateLoaded) ? NSSTRING_STATUS_SAVESTATE_LOADED : NSSTRING_STATUS_SAVESTATE_LOADING_FAILED]; [self restoreCoreState]; } - (void) cmdSaveEmuSaveStateSlot:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; if (saveStatePath == nil) { [self setStatusText:NSSTRING_STATUS_CANNOT_GENERATE_SAVE_PATH]; return; } const BOOL isDirectoryCreated = [CocoaDSFile createUserAppSupportDirectory:@"States"]; if (!isDirectoryCreated) { [self setStatusText:NSSTRING_STATUS_CANNOT_CREATE_SAVE_DIRECTORY]; return; } const NSInteger slotNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; if (slotNumber < 0 || slotNumber > MAX_SAVESTATE_SLOTS) { return; } NSURL *currentRomURL = [[self currentRom] fileURL]; NSString *fileName = [CocoaDSFile saveSlotFileName:currentRomURL slotNumber:(NSUInteger)(slotNumber + 1)]; if (fileName == nil) { return; } [self pauseCore]; const BOOL isStateSaved = [CocoaDSFile saveState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; [self setStatusText:(isStateSaved) ? NSSTRING_STATUS_SAVESTATE_SAVED : NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; [self restoreCoreState]; } - (void) cmdCopyScreen:(NSValue *)cmdAttrValue { [mainWindow copy:nil]; } - (void) cmdRotateDisplayRelative:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } const double relativeDegrees = (cmdAttr.useInputForSender) ? (double)[CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : (double)cmdAttr.intValue[0]; const double angleDegrees = [mainWindow displayRotation] + relativeDegrees; [mainWindow setDisplayRotation:angleDegrees]; } - (void) cmdHoldToggleSpeedScalar:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; const float speedScalar = (cmdAttr.useInputForScalar) ? cmdAttr.input.scalar : cmdAttr.floatValue[0]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSpeedScalar:(cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) ? lastSetSpeedScalar : speedScalar]; } - (void) cmdToggleSpeedLimiter:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isSpeedLimitEnabled]) { [cdsCore setIsSpeedLimitEnabled:NO]; [self setStatusText:NSSTRING_STATUS_SPEED_LIMIT_DISABLED]; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"CoreControl_EnableSpeedLimit"]; } else { [cdsCore setIsSpeedLimitEnabled:YES]; [self setStatusText:NSSTRING_STATUS_SPEED_LIMIT_ENABLED]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"CoreControl_EnableSpeedLimit"]; } } - (void) cmdToggleAutoFrameSkip:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isFrameSkipEnabled]) { [cdsCore setIsFrameSkipEnabled:NO]; [self setStatusText:NSSTRING_STATUS_AUTO_FRAME_SKIP_DISABLED]; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"CoreControl_EnableAutoFrameSkip"]; } else { [cdsCore setIsFrameSkipEnabled:YES]; [self setStatusText:NSSTRING_STATUS_AUTO_FRAME_SKIP_ENABLED]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"CoreControl_EnableAutoFrameSkip"]; } } - (void) cmdToggleCheats:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isCheatingEnabled]) { [cdsCore setIsCheatingEnabled:NO]; [self setStatusText:NSSTRING_STATUS_CHEATS_DISABLED]; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"CoreControl_EnableCheats"]; } else { [cdsCore setIsCheatingEnabled:YES]; [self setStatusText:NSSTRING_STATUS_CHEATS_ENABLED]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"CoreControl_EnableCheats"]; } } - (void) cmdToggleExecutePause:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore coreState] == CORESTATE_PAUSE) { [self executeCore]; } else { [self pauseCore]; } } - (void) cmdReset:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [self setStatusText:NSSTRING_STATUS_EMULATOR_RESETTING]; [self setIsWorking:YES]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } [cdsCore reset]; if ([cdsCore coreState] == CORESTATE_PAUSE) { for (DisplayWindowController *windowController in windowList) { [[windowController view] clearToWhite]; } } [self setStatusText:NSSTRING_STATUS_EMULATOR_RESET]; [self setIsWorking:NO]; [self writeDefaultsSlot1Settings:nil]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } } - (void) cmdToggleMute:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } float vol = 0.0f; if (isSoundMuted) { isSoundMuted = NO; vol = lastSetVolumeValue; [self setStatusText:@"Sound unmuted."]; } else { isSoundMuted = YES; [self setStatusText:@"Sound muted."]; } [self setCurrentVolumeValue:vol]; [CocoaDSUtil messageSendOneWayWithFloat:[cdsSpeaker receivePort] msgID:MESSAGE_SET_VOLUME floatValue:vol]; } - (void) cmdToggleGPUState:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; const NSInteger bitNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; const UInt32 flagBit = [cdsCore.cdsGPU gpuStateFlags] ^ (1 << bitNumber); [cdsCore.cdsGPU setGpuStateFlags:flagBit]; } - (BOOL) handleLoadRom:(NSURL *)fileURL { BOOL result = NO; if ([self isRomLoading]) { return result; } if ([self currentRom] != nil) { const BOOL closeResult = [self handleUnloadRom:REASONFORCLOSE_OPEN romToLoad:fileURL]; if ([self isShowingSaveStateDialog]) { return result; } if (![self isShowingFileMigrationDialog] && !closeResult) { return result; } } // Check for the v0.9.7 ROM Save File if ([CocoaDSFile romSaveExistsWithRom:fileURL] && ![CocoaDSFile romSaveExists:fileURL]) { [fileURL retain]; [self setIsUserInterfaceBlockingExecution:YES]; [self setIsShowingFileMigrationDialog:YES]; [NSApp beginSheet:saveFileMigrationSheet modalForWindow:[[windowList objectAtIndex:0] window] modalDelegate:self didEndSelector:@selector(didEndFileMigrationSheet:returnCode:contextInfo:) contextInfo:fileURL]; } else { result = [self loadRom:fileURL]; } return result; } - (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL { BOOL result = NO; if ([self isRomLoading] || [self currentRom] == nil) { return result; } [self pauseCore]; if (isSaveStateEdited && [self currentSaveStateURL] != nil) { SEL endSheetSelector = @selector(didEndSaveStateSheet:returnCode:contextInfo:); switch (reasonID) { case REASONFORCLOSE_OPEN: [romURL retain]; endSheetSelector = @selector(didEndSaveStateSheetOpen:returnCode:contextInfo:); break; case REASONFORCLOSE_TERMINATE: endSheetSelector = @selector(didEndSaveStateSheetTerminate:returnCode:contextInfo:); break; default: break; } [self setIsUserInterfaceBlockingExecution:YES]; [self setIsShowingSaveStateDialog:YES]; [NSApp beginSheet:saveStatePrecloseSheet modalForWindow:(NSWindow *)[[windowList objectAtIndex:0] window] modalDelegate:self didEndSelector:endSheetSelector contextInfo:romURL]; } else { result = [self unloadRom]; } return result; } - (BOOL) loadRom:(NSURL *)romURL { BOOL result = NO; if (romURL == nil) { return result; } [self setStatusText:NSSTRING_STATUS_ROM_LOADING]; [self setIsWorking:YES]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } // Need to pause the core before loading the ROM. [self pauseCore]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore applyDynaRec]; [cdsCore applySlot1Device]; [self writeDefaultsSlot1Settings:nil]; CocoaDSRom *newRom = [[CocoaDSRom alloc] init]; if (newRom != nil) { [self setIsRomLoading:YES]; [romURL retain]; [newRom setSaveType:selectedRomSaveTypeID]; [NSThread detachNewThreadSelector:@selector(loadDataOnThread:) toTarget:newRom withObject:romURL]; [romURL release]; } result = YES; return result; } - (void) loadRomDidFinish:(NSNotification *)aNotification { CocoaDSRom *theRom = [aNotification object]; NSDictionary *userInfo = [aNotification userInfo]; const BOOL didLoad = [(NSNumber *)[userInfo valueForKey:@"DidLoad"] boolValue]; if (theRom == nil || ![theRom isDataLoaded] || !didLoad) { // If ROM loading fails, restore the core state, but only if a ROM is already loaded. if([self currentRom] != nil) { [self restoreCoreState]; } [self setStatusText:NSSTRING_STATUS_ROM_LOADING_FAILED]; [self setIsWorking:NO]; [self setIsRomLoading:NO]; return; } // Set the core's ROM to our newly allocated ROM object. [self setCurrentRom:theRom]; [romInfoPanelController setContent:[theRom bindings]]; // If the ROM has an associated cheat file, load it now. NSString *cheatsPath = [[CocoaDSFile fileURLFromRomURL:[theRom fileURL] toKind:@"Cheat"] path]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; CocoaDSCheatManager *newCheatList = [[[CocoaDSCheatManager alloc] initWithCore:cdsCore fileURL:[NSURL fileURLWithPath:cheatsPath]] autorelease]; if (newCheatList != nil) { NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; [CocoaDSCheatManager setMasterCheatList:newCheatList]; [cheatListController setContent:[newCheatList list]]; [self setCdsCheats:newCheatList]; [cheatWindowBindings setValue:newCheatList forKey:@"cheatList"]; NSString *filePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"R4Cheat_DatabasePath"]; if (filePath != nil) { NSURL *fileURL = [NSURL fileURLWithPath:filePath]; NSInteger error = 0; NSMutableArray *dbList = [[self cdsCheats] cheatListFromDatabase:fileURL errorCode:&error]; if (dbList != nil) { [cheatDatabaseController setContent:dbList]; NSString *titleString = [[self cdsCheats] dbTitle]; NSString *dateString = [[self cdsCheats] dbDate]; [cheatWindowBindings setValue:titleString forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:dateString forKey:@"cheatDBDate"]; [cheatWindowBindings setValue:[NSString stringWithFormat:@"%ld", (unsigned long)[dbList count]] forKey:@"cheatDBItemCount"]; } else { [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; switch (error) { case CHEATEXPORT_ERROR_FILE_NOT_FOUND: NSLog(@"R4 Cheat Database read failed! Could not load the database file!"); [cheatWindowBindings setValue:@"Database not loaded." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"CANNOT LOAD FILE" forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_WRONG_FILE_FORMAT: NSLog(@"R4 Cheat Database read failed! Wrong file format!"); [cheatWindowBindings setValue:@"Database load error." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"FAILED TO LOAD FILE" forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_SERIAL_NOT_FOUND: NSLog(@"R4 Cheat Database read failed! Could not find the serial number for this game in the database!"); [cheatWindowBindings setValue:@"ROM not found in database." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"ROM not found." forKey:@"cheatDBDate"]; break; case CHEATEXPORT_ERROR_EXPORT_FAILED: NSLog(@"R4 Cheat Database read failed! Could not read the database file!"); [cheatWindowBindings setValue:@"Database read error." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"CANNOT READ FILE" forKey:@"cheatDBDate"]; break; default: break; } } } [cheatWindowDelegate setCdsCheats:newCheatList]; [[cheatWindowDelegate cdsCheatSearch] setCdsCore:cdsCore]; [cheatWindowDelegate setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE]; } // Add the last loaded ROM to the Recent ROMs list. [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[theRom fileURL]]; // Update the UI to indicate that a ROM has indeed been loaded. [self updateAllWindowTitles]; for (DisplayWindowController *windowController in windowList) { [[windowController view] clearToWhite]; } [self setStatusText:NSSTRING_STATUS_ROM_LOADED]; [self setIsWorking:NO]; [self setIsRomLoading:NO]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } // After the ROM loading is complete, send an execute message to the Cocoa DS per // user preferences. if ([[NSUserDefaults standardUserDefaults] boolForKey:@"General_ExecuteROMOnLoad"]) { [self executeCore]; } } - (BOOL) unloadRom { BOOL result = NO; [self setCurrentSaveStateURL:nil]; isSaveStateEdited = NO; for (DisplayWindowController *windowController in windowList) { [[windowController window] setDocumentEdited:isSaveStateEdited]; } // Save the ROM's cheat list before unloading. [[self cdsCheats] save]; // Update the UI to indicate that the ROM has started the process of unloading. [self setStatusText:NSSTRING_STATUS_ROM_UNLOADING]; [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; [cheatListController setContent:nil]; [cheatWindowDelegate resetSearch:nil]; [cheatWindowDelegate setCdsCheats:nil]; [cheatDatabaseController setContent:nil]; NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; [cheatWindowBindings setValue:@"No ROM loaded." forKey:@"cheatDBTitle"]; [cheatWindowBindings setValue:@"No ROM loaded." forKey:@"cheatDBDate"]; [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; [cheatWindowBindings setValue:nil forKey:@"cheatList"]; [self setIsWorking:YES]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } // Unload the ROM. [[self currentRom] release]; [self setCurrentRom:nil]; // Release the current cheat list and assign the empty list. [self setCdsCheats:nil]; if (dummyCheatList == nil) { dummyCheatList = [[CocoaDSCheatManager alloc] init]; } [CocoaDSCheatManager setMasterCheatList:dummyCheatList]; // Update the UI to indicate that the ROM has finished unloading. [self updateAllWindowTitles]; for (DisplayWindowController *windowController in windowList) { [[windowController view] clearToBlack]; } [self setStatusText:NSSTRING_STATUS_ROM_UNLOADED]; [self setIsWorking:NO]; for (DisplayWindowController *windowController in windowList) { [[windowController window] displayIfNeeded]; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSlot1StatusText:NSSTRING_STATUS_EMULATION_NOT_RUNNING]; result = YES; return result; } - (void) addOutputToCore:(CocoaDSOutput *)theOutput { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore addOutput:theOutput]; } - (void) removeOutputFromCore:(CocoaDSOutput *)theOutput { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore removeOutput:theOutput]; } - (void) executeCore { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setCoreState:CORESTATE_EXECUTE]; } - (void) pauseCore { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setCoreState:CORESTATE_PAUSE]; } - (void) restoreCoreState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore restoreCoreState]; } - (AudioSampleBlockGenerator *) selectedAudioFileGenerator { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; return [[cdsCore cdsController] selectedAudioFileGenerator]; } - (void) setSelectedAudioFileGenerator:(AudioSampleBlockGenerator *)theGenerator { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [[cdsCore cdsController] setSelectedAudioFileGenerator:theGenerator]; } - (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { NSURL *romURL = (NSURL *)contextInfo; NSURL *romSaveURL = [CocoaDSFile romSaveURLFromRomURL:romURL]; [sheet orderOut:self]; switch (returnCode) { case NSOKButton: [CocoaDSFile moveFileToCurrentDirectory:romSaveURL]; break; default: break; } [self setIsUserInterfaceBlockingExecution:NO]; [self setIsShowingFileMigrationDialog:NO]; [self loadRom:romURL]; // We retained this when we initially put up the sheet, so we need to release it now. [romURL release]; } - (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; switch (returnCode) { case NSCancelButton: // Cancel [self restoreCoreState]; [self setIsUserInterfaceBlockingExecution:NO]; [self setIsShowingSaveStateDialog:NO]; return; break; case COCOA_DIALOG_DEFAULT: // Save { const BOOL isStateSaved = [CocoaDSFile saveState:[self currentSaveStateURL]]; if (!isStateSaved) { // Throw an error here... [self setStatusText:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } break; } case COCOA_DIALOG_OPTION: // Don't Save break; default: break; } [self unloadRom]; [self setIsUserInterfaceBlockingExecution:NO]; [self setIsShowingSaveStateDialog:NO]; } - (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [self didEndSaveStateSheet:sheet returnCode:returnCode contextInfo:contextInfo]; NSURL *romURL = (NSURL *)contextInfo; [self handleLoadRom:romURL]; [romURL release]; } - (void) didEndSaveStateSheetTerminate:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [self didEndSaveStateSheet:sheet returnCode:returnCode contextInfo:contextInfo]; if (returnCode == NSCancelButton) { [NSApp replyToApplicationShouldTerminate:NO]; } else { if ([self currentSaveStateURL] == nil) { [NSApp replyToApplicationShouldTerminate:YES]; } } } - (void) didEndChooseSlot1R4Directory:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; if (returnCode == NSCancelButton) { return; } NSURL *selectedDirURL = [[sheet URLs] lastObject]; //hopefully also the first object if(selectedDirURL == nil) { return; } [[NSUserDefaults standardUserDefaults] setObject:[selectedDirURL path] forKey:@"EmulationSlot1_R4StoragePath"]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSlot1R4URL:selectedDirURL]; } - (void) updateAllWindowTitles { if ([windowList count] < 1) { return; } NSString *romName = nil; NSURL *repURL = nil; NSImage *titleIcon = nil; if ([self currentRom] == nil) { romName = (NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; } else { romName = [currentRom internalName]; repURL = [currentRom fileURL]; titleIcon = [currentRom icon]; } if ([windowList count] > 1) { for (DisplayWindowController *windowController in windowList) { NSString *newWindowTitle = [romName stringByAppendingFormat:@":%ld", (unsigned long)([windowList indexOfObject:windowController] + 1)]; [[windowController window] setTitle:newWindowTitle]; [[windowController window] setRepresentedURL:repURL]; [[[windowController window] standardWindowButton:NSWindowDocumentIconButton] setImage:titleIcon]; } } else { NSWindow *theWindow = [[windowList objectAtIndex:0] window]; [theWindow setTitle:romName]; [theWindow setRepresentedURL:repURL]; [[theWindow standardWindowButton:NSWindowDocumentIconButton] setImage:titleIcon]; } } - (void) setupUserDefaults { // Set the SPU settings per user preferences. [self setCurrentVolumeValue:[[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]]; [[self cdsSpeaker] setVolume:[[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]]; [[self cdsSpeaker] setAudioOutputEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Sound_AudioOutputEngine"]]; [[self cdsSpeaker] setSpuAdvancedLogic:[[NSUserDefaults standardUserDefaults] boolForKey:@"SPU_AdvancedLogic"]]; [[self cdsSpeaker] setSpuInterpolationMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_InterpolationMode"]]; [[self cdsSpeaker] setSpuSyncMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"]]; [[self cdsSpeaker] setSpuSyncMethod:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMethod"]]; // Set the 3D rendering options per user preferences. [self setRender3DThreads:(NSUInteger)[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_Threads"]]; [self setRender3DRenderingEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_RenderingEngine"]]; [self setRender3DHighPrecisionColorInterpolation:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_HighPrecisionColorInterpolation"]]; [self setRender3DEdgeMarking:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_EdgeMarking"]]; [self setRender3DFog:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_Fog"]]; [self setRender3DTextures:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_Textures"]]; [self setRender3DDepthComparisonThreshold:(NSUInteger)[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_DepthComparisonThreshold"]]; [self setRender3DLineHack:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_LineHack"]]; [self setRender3DMultisample:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_Multisample"]]; } #pragma mark NSUserInterfaceValidations Protocol - (BOOL)validateUserInterfaceItem:(id )theItem { BOOL enable = YES; const SEL theAction = [theItem action]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (theAction == @selector(importRomSave:) || theAction == @selector(exportRomSave:)) { if ([self currentRom] == nil) { enable = NO; } } else if (theAction == @selector(toggleExecutePause:)) { if (![cdsCore masterExecute] || [self currentRom] == nil || [self isUserInterfaceBlockingExecution]) { enable = NO; } if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([cdsCore coreState] == CORESTATE_PAUSE) { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_EXECUTE_CONTROL]; } else { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_PAUSE_CONTROL]; } } else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) { if ([cdsCore coreState] == CORESTATE_PAUSE) { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_EXECUTE_CONTROL]; [(NSToolbarItem*)theItem setImage:iconExecute]; } else { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_PAUSE_CONTROL]; [(NSToolbarItem*)theItem setImage:iconPause]; } } } else if (theAction == @selector(executeCore) || theAction == @selector(pauseCore)) { if (![cdsCore masterExecute] || [self currentRom] == nil || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(reset:)) { if ([self currentRom] == nil || [self isUserInterfaceBlockingExecution]) { enable = NO; } } else if (theAction == @selector(loadRecentRom:)) { if ([self isRomLoading] || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(openRom:)) { if ([self isRomLoading] || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(closeRom:)) { if ([self currentRom] == nil || [self isRomLoading] || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(revealRomInFinder:)) { if ([self currentRom] == nil || [self isRomLoading]) { enable = NO; } } else if (theAction == @selector(loadEmuSaveStateSlot:)) { if ([self currentRom] == nil || [self isShowingSaveStateDialog] || ![CocoaDSFile saveStateExistsForSlot:[[self currentRom] fileURL] slotNumber:[theItem tag] + 1]) { enable = NO; } } else if (theAction == @selector(saveEmuSaveStateSlot:)) { if ([self currentRom] == nil || [self isShowingSaveStateDialog]) { enable = NO; } if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([CocoaDSFile saveStateExistsForSlot:[[self currentRom] fileURL] slotNumber:[theItem tag] + 1]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } else if (theAction == @selector(changeCoreSpeed:)) { NSInteger speedScalar = (NSInteger)([cdsCore speedScalar] * 100.0); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([theItem tag] == -1) { if (speedScalar == (NSInteger)(SPEED_SCALAR_HALF * 100.0) || speedScalar == (NSInteger)(SPEED_SCALAR_NORMAL * 100.0) || speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) { [(NSMenuItem*)theItem setState:NSOffState]; } else { [(NSMenuItem*)theItem setState:NSOnState]; } } else { [(NSMenuItem*)theItem setState:(speedScalar == [theItem tag]) ? NSOnState : NSOffState]; } } else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) { if (speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_SPEED_1X]; [(NSToolbarItem*)theItem setTag:100]; [(NSToolbarItem*)theItem setImage:iconSpeedNormal]; } else { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_SPEED_2X]; [(NSToolbarItem*)theItem setTag:200]; [(NSToolbarItem*)theItem setImage:iconSpeedDouble]; } } } else if (theAction == @selector(toggleSpeedLimiter:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([cdsCore isSpeedLimitEnabled]) ? NSSTRING_TITLE_DISABLE_SPEED_LIMIT : NSSTRING_TITLE_ENABLE_SPEED_LIMIT]; } } else if (theAction == @selector(toggleAutoFrameSkip:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([cdsCore isFrameSkipEnabled]) ? NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP : NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP]; } } else if (theAction == @selector(toggleCheats:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([cdsCore isCheatingEnabled]) ? NSSTRING_TITLE_DISABLE_CHEATS : NSSTRING_TITLE_ENABLE_CHEATS]; } } else if (theAction == @selector(changeRomSaveType:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:([self selectedRomSaveTypeID] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(openEmuSaveState:) || theAction == @selector(saveEmuSaveState:) || theAction == @selector(saveEmuSaveStateAs:)) { if ([self currentRom] == nil || [self isShowingSaveStateDialog]) { enable = NO; } } else if (theAction == @selector(revertEmuSaveState:)) { if ([self currentRom] == nil || [self isShowingSaveStateDialog] || [self currentSaveStateURL] == nil) { enable = NO; } } else if (theAction == @selector(toggleGPUState:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:([cdsCore.cdsGPU gpuStateByBit:[theItem tag]]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeScale:)) { const NSInteger viewScale = (NSInteger)([mainWindow displayScale] * 100.0); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:(viewScale == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeRotation:)) { const NSInteger viewRotation = (NSInteger)[mainWindow displayRotation]; if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([theItem tag] == -1) { if (viewRotation == 0 || viewRotation == 90 || viewRotation == 180 || viewRotation == 270) { [(NSMenuItem*)theItem setState:NSOffState]; } else { [(NSMenuItem*)theItem setState:NSOnState]; } } else { [(NSMenuItem*)theItem setState:(viewRotation == [theItem tag]) ? NSOnState : NSOffState]; } } } else if (theAction == @selector(changeDisplayMode:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:([mainWindow displayMode] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayOrientation:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:([mainWindow displayOrientation] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayOrder:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:([mainWindow displayOrder] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeDisplayGap:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { const NSInteger gapScalar = (NSInteger)([mainWindow displayGap] * 100.0); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([theItem tag] == -1) { if (gapScalar == 0 || gapScalar == 50 || gapScalar == 100 || gapScalar == 150 || gapScalar == 200) { [(NSMenuItem*)theItem setState:NSOffState]; } else { [(NSMenuItem*)theItem setState:NSOnState]; } } else { [(NSMenuItem*)theItem setState:(gapScalar == [theItem tag]) ? NSOnState : NSOffState]; } } } } else if (theAction == @selector(hudDisable:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([[mainWindow view] isHudEnabled]) ? NSSTRING_TITLE_DISABLE_HUD : NSSTRING_TITLE_ENABLE_HUD]; } } else if (theAction == @selector(toggleStatusBar:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([mainWindow isShowingStatusBar]) ? NSSTRING_TITLE_HIDE_STATUS_BAR : NSSTRING_TITLE_SHOW_STATUS_BAR]; } } else if (theAction == @selector(toggleKeepMinDisplaySizeAtNormal:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setState:([mainWindow isMinSizeNormal]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(toggleToolbarShown:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { [(NSMenuItem*)theItem setTitle:([[[mainWindow window] toolbar] isVisible]) ? NSSTRING_TITLE_HIDE_TOOLBAR : NSSTRING_TITLE_SHOW_TOOLBAR]; } } return enable; } #pragma mark NSControl Delegate Methods - (void)controlTextDidEndEditing:(NSNotification *)aNotification { [self setRender3DDepthComparisonThreshold:[(NSNumber *)[aNotification object] integerValue]]; } @end desmume-0.9.9/src/cocoa/userinterface/inputPrefsView.mm0000644000175000017500000010175112140261514023762 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "inputPrefsView.h" #import "InputProfileController.h" #import "preferencesWindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_util.h" #define INPUT_HOLD_TIME 0.1 // Time in seconds to hold a button in its on state when mapping an input. @implementation InputPrefsView @synthesize dummyObject; @synthesize prefWindow; @synthesize inputProfileMenu; @synthesize inputProfilePreviousButton; @synthesize inputProfileNextButton; @synthesize inputPrefOutlineView; @synthesize inputSettingsController; @synthesize inputProfileController; @synthesize inputSettingsMicrophone; @synthesize inputSettingsTouch; @synthesize inputSettingsLoadStateSlot; @synthesize inputSettingsSaveStateSlot; @synthesize inputSettingsSetSpeedLimit; @synthesize inputSettingsGPUState; @synthesize inputProfileSheet; @synthesize inputProfileRenameSheet; @synthesize inputManager; @dynamic configInputTargetID; @synthesize inputSettingsInEdit; - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self == nil) { return self; } // Note that we manually reconstruct the profile dictionaries down to the mappings since // we depend on the input lists having unique pointers. In other words, since all empty // NSArrays have the same pointer, we remake them into NSMutableArrays to force their // pointers to be unique. The reason we do this is because commandTagFromInputList: depends // on searching for unique pointers to match up command tags. If we don't do this, there // will be duplicate entries in the NSOutlineViews for every empty input list. NSDictionary *defaultKeyMappingsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; NSArray *internalDefaultProfilesList = (NSArray *)[defaultKeyMappingsDict valueForKey:@"DefaultInputProfiles"]; _defaultProfileListCount = [internalDefaultProfilesList count]; defaultProfilesList = [[NSMutableArray alloc] initWithCapacity:_defaultProfileListCount]; for (NSDictionary *theProfile in internalDefaultProfilesList) { NSMutableDictionary *reconstructedProfile = [[NSMutableDictionary alloc] initWithCapacity:[theProfile count]]; for (NSString *profileKey in theProfile) { if ([profileKey isEqualToString:@"Mappings"]) { NSDictionary *profileMappings = (NSDictionary *)[theProfile objectForKey:profileKey]; NSMutableDictionary *reconstructedMappings = [[NSMutableDictionary alloc] initWithCapacity:[profileMappings count]]; for (NSString *mappingKey in profileMappings) { NSArray *inputList = (NSArray *)[profileMappings objectForKey:mappingKey]; NSMutableArray *newInputList = [[NSMutableArray alloc] initWithArray:inputList copyItems:YES]; [reconstructedMappings setObject:[newInputList autorelease] forKey:mappingKey]; } [reconstructedProfile setObject:[reconstructedMappings autorelease] forKey:profileKey]; } else { [reconstructedProfile setObject:[theProfile objectForKey:profileKey] forKey:profileKey]; } } [defaultProfilesList addObject:[reconstructedProfile autorelease]]; } NSArray *userDefaultsSavedProfilesList = (NSArray *)[[NSUserDefaults standardUserDefaults] arrayForKey:@"Input_SavedProfiles"]; savedProfilesList = [[NSMutableArray alloc] initWithCapacity:32]; for (NSDictionary *theProfile in userDefaultsSavedProfilesList) { NSMutableDictionary *reconstructedProfile = [[NSMutableDictionary alloc] initWithCapacity:[theProfile count]]; for (NSString *profileKey in theProfile) { if ([profileKey isEqualToString:@"Mappings"]) { NSDictionary *profileMappings = (NSDictionary *)[theProfile objectForKey:profileKey]; NSMutableDictionary *reconstructedMappings = [[NSMutableDictionary alloc] initWithCapacity:[profileMappings count]]; for (NSString *mappingKey in profileMappings) { NSArray *inputList = (NSArray *)[profileMappings objectForKey:mappingKey]; NSMutableArray *newInputList = [[NSMutableArray alloc] initWithArray:inputList copyItems:YES]; [reconstructedMappings setObject:[newInputList autorelease] forKey:mappingKey]; } [reconstructedProfile setObject:[reconstructedMappings autorelease] forKey:profileKey]; } else { [reconstructedProfile setObject:[theProfile objectForKey:profileKey] forKey:profileKey]; } } [savedProfilesList addObject:[reconstructedProfile autorelease]]; } configInputTargetID = nil; configInputList = [[NSMutableDictionary alloc] initWithCapacity:128]; inputSettingsInEdit = nil; return self; } - (void)dealloc { [configInputList release]; [inputSettingsMappings release]; [savedProfilesList release]; [super dealloc]; } #pragma mark Dynamic Properties - (void) setConfigInputTargetID:(NSString *)targetID { if (targetID == nil) { [configInputTargetID release]; } configInputTargetID = [targetID retain]; [[self inputManager] setHidInputTarget:(targetID == nil) ? nil : self]; } - (NSString *) configInputTargetID { return configInputTargetID; } #pragma mark Class Methods - (void) initSettingsSheets { inputSettingsMappings = [[NSDictionary alloc] initWithObjectsAndKeys: inputSettingsMicrophone, @"Microphone", inputSettingsTouch, @"Touch", inputSettingsLoadStateSlot, @"Load State Slot", inputSettingsSaveStateSlot, @"Save State Slot", inputSettingsSetSpeedLimit, @"Set Speed", inputSettingsGPUState, @"Enable/Disable GPU State", nil]; } - (void) populateInputProfileMenu { NSDictionary *defaultKeyMappingsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; NSArray *defaultProfileList = [defaultKeyMappingsDict valueForKey:@"DefaultInputProfiles"]; if (defaultKeyMappingsDict == nil || defaultProfileList == nil) { return; } // We're going to populate this menu from scratch, so remove all existing profile items. NSMenu *profileMenu = [inputProfileMenu menu]; NSInteger menuItemCount = [profileMenu numberOfItems] - 2; for (NSInteger i = 0; i < menuItemCount; i++) { [profileMenu removeItemAtIndex:i]; } // Need this to keep track of profile indexes. NSInteger profileIndex = 0; // Add the menu items for the default profiles. for (NSUInteger i = 0; i < _defaultProfileListCount; i++) { NSDictionary *profileDict = [defaultProfileList objectAtIndex:i]; NSString *profileName = (NSString *)[profileDict valueForKey:@"Name"]; if (profileName == nil) { profileName = @""; } NSMenuItem *newProfileMenuItem = [[[NSMenuItem alloc] initWithTitle:profileName action:@selector(profileSelect:) keyEquivalent:@""] autorelease]; [newProfileMenuItem setTag:profileIndex]; [newProfileMenuItem setTarget:self]; [profileMenu insertItem:newProfileMenuItem atIndex:profileIndex]; profileIndex++; } // Add a separator item in between default profiles and user saved profiles. [[inputProfileMenu menu] insertItem:[NSMenuItem separatorItem] atIndex:profileIndex]; // Add the menu items for the user saved profiles. if ([savedProfilesList count] < 1) { [inputProfileMenu insertItemWithTitle:NSSTRING_INPUTPREF_NO_SAVED_PROFILES atIndex:profileIndex+1]; NSMenuItem *noSavedConfigItem = [inputProfileMenu itemAtIndex:profileIndex+1]; [noSavedConfigItem setEnabled:NO]; } else { for (NSUInteger i = 0; i < [savedProfilesList count]; i++) { NSDictionary *profileDict = [savedProfilesList objectAtIndex:i]; NSString *profileName = (NSString *)[profileDict valueForKey:@"Name"]; if (profileName == nil) { profileName = @""; } NSMenuItem *newProfileMenuItem = [[[NSMenuItem alloc] initWithTitle:profileName action:@selector(profileSelect:) keyEquivalent:@""] autorelease]; [newProfileMenuItem setTag:profileIndex]; [newProfileMenuItem setTarget:self]; [profileMenu insertItem:newProfileMenuItem atIndex:profileIndex+1]; profileIndex++; } } [inputProfileMenu selectItemAtIndex:0]; [self profileSelect:[inputProfileMenu itemAtIndex:0]]; } - (BOOL) handleKeyboardEvent:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed { const InputAttributes inputAttr = InputManagerEncodeKeyboardInput([theEvent keyCode], keyPressed); return [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]]; } - (BOOL) handleMouseButtonEvent:(NSEvent *)mouseEvent buttonPressed:(BOOL)buttonPressed { const InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([mouseEvent buttonNumber], NSMakePoint(0.0f, 0.0f), buttonPressed); return [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]]; } - (BOOL) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(NSString *)commandTag { BOOL didMap = NO; if (commandTag == nil) { return didMap; } const char *cmdTag = [commandTag cStringUsingEncoding:NSUTF8StringEncoding]; if (cmdTag == NULL) { return didMap; } // Add the input mapping. const CommandAttributes cmdAttr = [inputManager defaultCommandAttributesForCommandTag:cmdTag]; [inputManager addMappingUsingInputAttributes:inputAttr commandAttributes:&cmdAttr]; [inputManager writeDefaultsInputMappings]; // If we're dealing with a Microphone command, update the audio file generators list. if ([commandTag isEqualToString:@"Microphone"]) { [inputManager updateAudioFileGenerators]; } // Deselect the row of the command tag. NSDictionary *inputMappings = [inputManager inputMappings]; NSArray *mappingList = (NSArray *)[inputMappings valueForKey:[self configInputTargetID]]; const NSInteger rowNumber = [inputPrefOutlineView rowForItem:mappingList]; if (rowNumber != -1) { [inputPrefOutlineView deselectRow:rowNumber]; } // Update all expanded command tags. for (NSString *tag in inputMappings) { NSArray *inputList = (NSArray *)[inputMappings valueForKey:tag]; if ([inputPrefOutlineView isItemExpanded:inputList]) { [inputPrefOutlineView reloadItem:inputList reloadChildren:YES]; } } [self setConfigInputTargetID:nil]; didMap = YES; return didMap; } - (void) setMappingUsingDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo { if (deviceInfo == nil) { return; } NSString *deviceCode = (NSString *)[deviceInfo valueForKey:@"deviceCode"]; NSString *elementCode = (NSString *)[deviceInfo valueForKey:@"elementCode"]; const char *devCode = [deviceCode cStringUsingEncoding:NSUTF8StringEncoding]; const char *elCode = [elementCode cStringUsingEncoding:NSUTF8StringEncoding]; CommandAttributes cmdAttr = [inputManager mappedCommandAttributesOfDeviceCode:devCode elementCode:elCode]; UpdateCommandAttributesWithDeviceInfoDictionary(&cmdAttr, deviceInfo); [inputManager updateInputSettingsSummaryInDeviceInfoDictionary:deviceInfo commandTag:cmdAttr.tag]; [inputManager setMappedCommandAttributes:&cmdAttr deviceCode:devCode elementCode:elCode]; [inputManager writeDefaultsInputMappings]; // If we're dealing with a Microphone command, update the audio file generators list. if (strncmp(cmdAttr.tag, "Microphone", INPUT_HANDLER_STRING_LENGTH) == 0) { [inputManager updateAudioFileGenerators]; } } - (BOOL) doesProfileNameExist:(NSString *)profileName { BOOL doesExist = NO; for (NSMutableDictionary *savedProfile in savedProfilesList) { NSString *savedProfileName = (NSString *)[savedProfile valueForKey:@"Name"]; if ([savedProfileName isEqualToString:profileName]) { doesExist = YES; break; } } return doesExist; } - (void) updateSelectedProfileName { NSInteger profileID = [inputProfileMenu indexOfSelectedItem]; NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[inputProfileController content]; if (profileID < (NSInteger)_defaultProfileListCount || selectedProfile == nil) { return; } NSString *profileName = (NSString *)[selectedProfile valueForKey:@"Name"]; if (profileName == nil) { profileName = @""; } [[inputProfileMenu selectedItem] setTitle:profileName]; [[NSUserDefaults standardUserDefaults] setObject:savedProfilesList forKey:@"Input_SavedProfiles"]; } - (void) didEndSettingsSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; NSOutlineView *outlineView = (NSOutlineView *)contextInfo; NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content]; NSMutableDictionary *deviceInfoInEdit = [self inputSettingsInEdit]; switch (returnCode) { case NSCancelButton: break; case NSOKButton: [deviceInfoInEdit setDictionary:editedDeviceInfo]; [self setMappingUsingDeviceInfoDictionary:deviceInfoInEdit]; [outlineView reloadItem:deviceInfoInEdit reloadChildren:NO]; break; default: break; } [inputSettingsController setContent:nil]; [self setInputSettingsInEdit:nil]; } - (void) didEndProfileSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; } - (void) didEndProfileRenameSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { [sheet orderOut:self]; } #pragma mark InputHIDManagerTarget Protocol - (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue { BOOL isHandled = NO; if ([self configInputTargetID] == nil) { ClearHIDQueue(hidQueue); return isHandled; } InputAttributesList inputList = InputManagerEncodeHIDQueue(hidQueue); const size_t inputCount = inputList.size(); for (unsigned int i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = inputList[i]; char inputKey[INPUT_HANDLER_STRING_LENGTH*2]; strlcpy(inputKey, inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH*2); strlcat(inputKey, ":", INPUT_HANDLER_STRING_LENGTH*2); strlcat(inputKey, inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH*2); NSString *inputKeyStr = [NSString stringWithCString:inputKey encoding:NSUTF8StringEncoding]; NSDate *inputOnDate = [configInputList valueForKey:inputKeyStr]; if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON) { if (inputOnDate == nil) { [configInputList setValue:[NSDate date] forKey:inputKeyStr]; } } else { if (inputOnDate != nil) { if (([inputOnDate timeIntervalSinceNow] * -1.0) < INPUT_HOLD_TIME) { // If the button isn't held for at least INPUT_HOLD_TIME seconds, then reject the input. [configInputList setValue:nil forKey:inputKeyStr]; } else { isHandled = [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]]; break; } } } } isHandled = YES; return isHandled; } #pragma mark NSOutlineViewDelegate Protocol - (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView *)outlineView { return NO; } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { if ([(NSString *)[tableColumn identifier] isEqualToString:@"InputCommandTagColumn"] || [(NSString *)[tableColumn identifier] isEqualToString:@"InputSettingsColumn"] || [(NSString *)[tableColumn identifier] isEqualToString:@"RemoveInputColumn"]) { return YES; } return NO; } - (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; NSCell *outCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]]; if ([columnID isEqualToString:@"InputCommandTagColumn"]) { if ([item isKindOfClass:[NSArray class]]) { NSString *commandTag = [inputManager commandTagFromInputList:item]; if (commandTag != nil) { NSImage *buttonImage = (NSImage *)[[inputManager commandIcon] valueForKey:commandTag]; if (buttonImage == nil) { buttonImage = (NSImage *)[[inputManager commandIcon] valueForKey:@"UNKNOWN COMMAND"]; } [outCell setTitle:NSLocalizedString(commandTag, nil)]; [outCell setImage:buttonImage]; } else { outCell = [[[NSCell alloc] init] autorelease]; } } else { outCell = [[[NSCell alloc] init] autorelease]; } } else if ([columnID isEqualToString:@"InputDeviceColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 weight:0 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 weight:0 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } else if ([columnID isEqualToString:@"InputSettingsColumn"]) { if ([item isKindOfClass:[NSDictionary class]]) { NSString *commandTag = [inputManager commandTagFromInputList:[outlineView parentForItem:item]]; NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag]; [outCell setEnabled:(theSheet == nil) ? NO : YES]; } else { outCell = [[[NSCell alloc] init] autorelease]; } } else if ([columnID isEqualToString:@"RemoveInputColumn"]) { if (![item isKindOfClass:[NSDictionary class]]) { outCell = [[[NSCell alloc] init] autorelease]; } } return outCell; } #pragma mark NSOutlineViewDataSource Protocol - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { if (item == nil) { NSString *commandTag = [[inputManager commandTagList] objectAtIndex:index]; return [[inputManager inputMappings] valueForKey:commandTag]; } else if ([item isKindOfClass:[NSArray class]]) { return [(NSArray *)item objectAtIndex:index]; } return nil; } - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { if ([item isKindOfClass:[NSArray class]]) { return YES; } return NO; } - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { NSInteger numberChildren = 0; if (item == nil) { numberChildren = [[inputManager commandTagList] count]; } else if ([item isKindOfClass:[NSArray class]]) { numberChildren = [(NSArray *)item count]; } return numberChildren; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; if ([columnID isEqualToString:@"InputCommandTagColumn"]) { if ([item isKindOfClass:[NSDictionary class]]) { return nil; } } else if ([columnID isEqualToString:@"InputDeviceColumn"]) { if ([item isKindOfClass:[NSArray class]]) { const unsigned long inputCount = (unsigned long)[(NSArray *)item count]; return [NSString stringWithFormat:(inputCount != 1) ? NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED_PLURAL : NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED, inputCount]; } else if ([item isKindOfClass:[NSDictionary class]]) { return [item valueForKey:@"deviceInfoSummary"]; } return @""; } else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) { NSString *settingsSummary = @""; if ([item isKindOfClass:[NSDictionary class]]) { settingsSummary = [item valueForKey:@"inputSettingsSummary"]; if (settingsSummary == nil) { settingsSummary = @""; } } return settingsSummary; } else if ([columnID isEqualToString:@"InputSettingsColumn"]) { return nil; } else if ([columnID isEqualToString:@"RemoveInputColumn"]) { return nil; } return item; } - (id)outlineView:(NSOutlineView *)outlineView persistentObjectForItem:(id)item { return [inputManager commandTagFromInputList:item]; } - (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object { NSString *commandTag = (NSString *)object; NSArray *inputList = (NSArray *)[[inputManager inputMappings] valueForKey:commandTag]; return inputList; } #pragma mark NSResponder Methods - (void)keyDown:(NSEvent *)theEvent { BOOL isHandled = [self handleKeyboardEvent:theEvent keyPressed:YES]; if (!isHandled) { [super keyDown:theEvent]; } } - (void)mouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButtonEvent:theEvent buttonPressed:YES]; if (!isHandled) { [super mouseDown:theEvent]; } } - (void)mouseDragged:(NSEvent *)theEvent { [self mouseDown:theEvent]; } - (void)rightMouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButtonEvent:theEvent buttonPressed:YES]; if (!isHandled) { [super rightMouseDown:theEvent]; } } - (void)rightMouseDragged:(NSEvent *)theEvent { [self rightMouseDown:theEvent]; } - (void)otherMouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButtonEvent:theEvent buttonPressed:YES]; if (!isHandled) { [super otherMouseDown:theEvent]; } } - (void)otherMouseDragged:(NSEvent *)theEvent { [self otherMouseDown:theEvent]; } - (BOOL)acceptsFirstResponder { return YES; } - (BOOL)becomeFirstResponder { return YES; } - (BOOL)resignFirstResponder { return YES; } #pragma mark IBAction Methods - (IBAction) setInputAdd:(id)sender { NSOutlineView *outlineView = (NSOutlineView *)sender; const NSInteger rowNumber = [outlineView clickedRow]; [configInputList removeAllObjects]; if ([outlineView isRowSelected:rowNumber]) { [outlineView deselectRow:rowNumber]; [self setConfigInputTargetID:nil]; } else { [outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:rowNumber] byExtendingSelection:NO]; NSArray *inputList = (NSArray *)[outlineView itemAtRow:rowNumber]; [self setConfigInputTargetID:[inputManager commandTagFromInputList:inputList]]; [prefWindow makeFirstResponder:self]; } } - (IBAction) removeInput:(id)sender { NSOutlineView *outlineView = (NSOutlineView *)sender; const NSInteger rowNumber = [outlineView clickedRow]; NSDictionary *deviceInfo = (NSDictionary *)[outlineView itemAtRow:rowNumber]; NSArray *inputList = (NSArray *)[outlineView parentForItem:deviceInfo]; [inputManager removeMappingUsingDeviceCode:[(NSString *)[deviceInfo valueForKey:@"deviceCode"] cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[(NSString *)[deviceInfo valueForKey:@"elementCode"] cStringUsingEncoding:NSUTF8StringEncoding]]; [inputManager writeDefaultsInputMappings]; [outlineView reloadItem:inputList reloadChildren:YES]; // If we're dealing with a Microphone command, update the audio file generators list. if ([[inputManager commandTagFromInputList:inputList] isEqualToString:@"Microphone"]) { [inputManager updateAudioFileGenerators]; } } - (IBAction) changeSpeed:(id)sender { NSMutableDictionary *deviceInfo = (NSMutableDictionary *)[inputSettingsController content]; if (deviceInfo != nil) { const float speedScalar = (float)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f; [deviceInfo setObject:[NSNumber numberWithFloat:speedScalar] forKey:@"floatValue0"]; } } - (IBAction) showSettingsSheet:(id)sender { NSOutlineView *outlineView = (NSOutlineView *)sender; const NSInteger rowNumber = [outlineView clickedRow]; [self setInputSettingsInEdit:(NSMutableDictionary *)[outlineView itemAtRow:rowNumber]]; NSString *commandTag = [inputManager commandTagFromInputList:[outlineView parentForItem:[self inputSettingsInEdit]]]; NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag]; if (theSheet == nil) { return; } [inputSettingsController setContent:[NSMutableDictionary dictionaryWithDictionary:[self inputSettingsInEdit]]]; [NSApp beginSheet:theSheet modalForWindow:prefWindow modalDelegate:self didEndSelector:@selector(didEndSettingsSheet:returnCode:contextInfo:) contextInfo:outlineView]; } - (IBAction) closeSettingsSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; [sheet makeFirstResponder:nil]; // Force end of editing of any text fields. [NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) profileNew:(id)sender { static NSUInteger untitledCount = 1; NSString *newProfileName = (untitledCount == 1) ? @"Untitled" : [NSString stringWithFormat:@"Untitled %ld", (unsigned long)untitledCount]; while([self doesProfileNameExist:newProfileName]) { newProfileName = [NSString stringWithFormat:@"Untitled %ld", (unsigned long)++untitledCount]; } // Reconstruct the mappings dictionary to use NSMutableArrays to prevent duplicate // entries from showing up in the NSOutlineView. NSDictionary *profileMappings = [inputManager inputMappings]; NSMutableDictionary *reconstructedMappings = [[NSMutableDictionary alloc] initWithCapacity:[profileMappings count]]; for (NSString *mappingKey in profileMappings) { NSArray *inputList = (NSArray *)[profileMappings objectForKey:mappingKey]; NSMutableArray *newInputList = [[NSMutableArray alloc] initWithArray:inputList copyItems:YES]; [reconstructedMappings setObject:[newInputList autorelease] forKey:mappingKey]; } NSMutableDictionary *newProfile = [NSMutableDictionary dictionaryWithObjectsAndKeys: newProfileName, @"Name", [NSNumber numberWithBool:NO], @"IsDefaultType", [reconstructedMappings autorelease], @"Mappings", nil]; [savedProfilesList addObject:newProfile]; const NSInteger profileIndex = _defaultProfileListCount + [savedProfilesList count] - 1; NSMenu *profileMenu = [inputProfileMenu menu]; NSMenuItem *newProfileMenuItem = [[[NSMenuItem alloc] initWithTitle:newProfileName action:@selector(profileSelect:) keyEquivalent:@""] autorelease]; [newProfileMenuItem setTag:profileIndex]; [newProfileMenuItem setTarget:self]; [profileMenu insertItem:newProfileMenuItem atIndex:profileIndex+1]; // Remove the "no items" menu item when the first profile is saved. if ([savedProfilesList count] == 1) { [inputProfileMenu removeItemAtIndex:profileIndex+2]; } [inputProfileMenu selectItemAtIndex:profileIndex+1]; [self profileSelect:newProfileMenuItem]; [[NSUserDefaults standardUserDefaults] setObject:savedProfilesList forKey:@"Input_SavedProfiles"]; // Give the user a chance to name the new profile. [self profileRename:nil]; } - (IBAction) profileView:(id)sender { [NSApp beginSheet:inputProfileSheet modalForWindow:prefWindow modalDelegate:self didEndSelector:@selector(didEndProfileSheet:returnCode:contextInfo:) contextInfo:nil]; } - (IBAction) profileApply:(id)sender { NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[inputProfileController content]; NSMutableDictionary *profileMappings = (NSMutableDictionary *)[selectedProfile valueForKey:@"Mappings"]; if (profileMappings != nil) { // Use setMappingsWithMappings: instead of replacing the input mappings // completely since we need to keep this particular pointer address for // the inputMappings dictionary. If we don't do this, the outline view // will desync. [inputManager setMappingsWithMappings:profileMappings]; [inputPrefOutlineView reloadData]; [inputManager writeDefaultsInputMappings]; } } - (IBAction) profileRename:(id)sender { [NSApp beginSheet:inputProfileRenameSheet modalForWindow:prefWindow modalDelegate:self didEndSelector:@selector(didEndProfileRenameSheet:returnCode:contextInfo:) contextInfo:nil]; } - (IBAction) profileSave:(id)sender { NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[inputProfileController content]; if (selectedProfile == nil) { return; } [selectedProfile setValue:[[[NSMutableDictionary alloc] initWithDictionary:[inputManager inputMappings] copyItems:YES] autorelease] forKey:@"Mappings"]; [[NSUserDefaults standardUserDefaults] setObject:savedProfilesList forKey:@"Input_SavedProfiles"]; } - (IBAction) profileDelete:(id)sender { NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[inputProfileController content]; if (selectedProfile == nil) { return; } const NSInteger profileIndex = [inputProfileMenu indexOfSelectedItem] - 1; NSMenu *profileMenu = [inputProfileMenu menu]; [profileMenu removeItemAtIndex:[inputProfileMenu indexOfSelectedItem]]; [savedProfilesList removeObjectAtIndex:(profileIndex - _defaultProfileListCount)]; [inputProfileMenu selectItemAtIndex:0]; // Add the "no items" menu item if there are no profiles saved. if ([savedProfilesList count] < 1) { NSMenuItem *noSavedConfigItem = [[[NSMenuItem alloc] initWithTitle:NSSTRING_INPUTPREF_NO_SAVED_PROFILES action:NULL keyEquivalent:@""] autorelease]; [noSavedConfigItem setEnabled:NO]; [profileMenu insertItem:noSavedConfigItem atIndex:profileIndex+1]; } else // Update the profile indices in the menu tags. { for (NSUInteger i = 0; i < [savedProfilesList count]; i++) { [[profileMenu itemAtIndex:_defaultProfileListCount+i+1] setTag:_defaultProfileListCount+i]; } } [self profileSelect:[inputProfileMenu itemAtIndex:0]]; [[NSUserDefaults standardUserDefaults] setObject:savedProfilesList forKey:@"Input_SavedProfiles"]; } - (IBAction) profileSelect:(id)sender { const NSInteger profileID = [CocoaDSUtil getIBActionSenderTag:sender]; if (profileID < 0 || profileID >= (NSInteger)(_defaultProfileListCount + [savedProfilesList count])) { return; } NSArray *profileList = (profileID < (NSInteger)_defaultProfileListCount) ? defaultProfilesList : savedProfilesList; [inputProfilePreviousButton setTag:profileID-1]; [inputProfilePreviousButton setEnabled:(profileID > 0) ? YES : NO]; [inputProfileNextButton setTag:profileID+1]; [inputProfileNextButton setEnabled:(profileID < ((NSInteger)_defaultProfileListCount + (NSInteger)[savedProfilesList count] - 1)) ? YES : NO]; if (![sender isMemberOfClass:[NSMenuItem class]]) { [inputProfileMenu selectItemAtIndex:(profileID < (NSInteger)_defaultProfileListCount) ? profileID : profileID+1]; } NSMutableDictionary *selectedProfile = (NSMutableDictionary *)[profileList objectAtIndex:(profileID < (NSInteger)_defaultProfileListCount) ? profileID : (profileID - _defaultProfileListCount)]; [inputProfileController setContent:selectedProfile]; [[inputProfileController profileOutlineView] reloadData]; [[inputProfileController profileOutlineView] expandItem:nil expandChildren:YES]; } - (IBAction) closeProfileSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; [sheet makeFirstResponder:nil]; // Force end of editing of any text fields. [NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) closeProfileRenameSheet:(id)sender { NSWindow *sheet = [(NSControl *)sender window]; [sheet makeFirstResponder:nil]; // Force end of editing of any text fields. [NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) audioFileChoose:(id)sender { NSURL *selectedFileURL = nil; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:@"Select Audio File"]; NSArray *fileTypes = [NSArray arrayWithObjects: @"3gp", @"3g2", @"aac", @"adts", @"ac3", @"aifc", @"aiff", @"aif", @"amr", @"caf", @"mpeg", @"mpa", @"mp1", @"mp2", @"mp3", @"mp4", @"m4a", @"snd", @"au", @"sd2", @"wav", nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; const NSInteger buttonClicked = [panel runModal]; #else const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFileURL = [[panel URLs] lastObject]; if(selectedFileURL == nil) { return; } NSString *selectedFilePath = [selectedFileURL path]; NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content]; [editedDeviceInfo setValue:selectedFilePath forKey:@"object0"]; [editedDeviceInfo setValue:[selectedFilePath lastPathComponent] forKey:@"object1"]; } } - (IBAction) audioFileChooseNone:(id)sender { NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content]; [editedDeviceInfo setValue:nil forKey:@"object0"]; [editedDeviceInfo setValue:nil forKey:@"object1"]; } #pragma mark NSControl Delegate Methods - (void)controlTextDidEndEditing:(NSNotification *)aNotification { // Called when the profile view sheet changes the profile name [self updateSelectedProfileName]; } @end desmume-0.9.9/src/cocoa/userinterface/inputPrefsView.h0000644000175000017500000001100312140261514023566 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #import "InputManager.h" @class InputProfileController; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface InputPrefsView : NSView #else @interface InputPrefsView : NSView #endif { NSObject *dummyObject; NSWindow *prefWindow; NSPopUpButton *inputProfileMenu; NSButton *inputProfilePreviousButton; NSButton *inputProfileNextButton; NSOutlineView *inputPrefOutlineView; NSObjectController *inputSettingsController; InputProfileController *inputProfileController; NSWindow *inputProfileSheet; NSWindow *inputProfileRenameSheet; NSWindow *inputSettingsMicrophone; NSWindow *inputSettingsTouch; NSWindow *inputSettingsLoadStateSlot; NSWindow *inputSettingsSaveStateSlot; NSWindow *inputSettingsSetSpeedLimit; NSWindow *inputSettingsGPUState; InputManager *inputManager; NSString *configInputTargetID; NSMutableDictionary *configInputList; NSMutableDictionary *inputSettingsInEdit; NSDictionary *inputSettingsMappings; NSUInteger _defaultProfileListCount; NSMutableArray *defaultProfilesList; NSMutableArray *savedProfilesList; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *prefWindow; @property (readonly) IBOutlet NSPopUpButton *inputProfileMenu; @property (readonly) IBOutlet NSButton *inputProfilePreviousButton; @property (readonly) IBOutlet NSButton *inputProfileNextButton; @property (readonly) IBOutlet NSOutlineView *inputPrefOutlineView; @property (readonly) IBOutlet NSObjectController *inputSettingsController; @property (readonly) IBOutlet InputProfileController *inputProfileController; @property (readonly) IBOutlet NSWindow *inputProfileSheet; @property (readonly) IBOutlet NSWindow *inputProfileRenameSheet; @property (readonly) IBOutlet NSWindow *inputSettingsMicrophone; @property (readonly) IBOutlet NSWindow *inputSettingsTouch; @property (readonly) IBOutlet NSWindow *inputSettingsLoadStateSlot; @property (readonly) IBOutlet NSWindow *inputSettingsSaveStateSlot; @property (readonly) IBOutlet NSWindow *inputSettingsSetSpeedLimit; @property (readonly) IBOutlet NSWindow *inputSettingsGPUState; @property (readonly) IBOutlet InputManager *inputManager; @property (retain) NSString *configInputTargetID; @property (retain) NSMutableDictionary *inputSettingsInEdit; - (void) initSettingsSheets; - (void) populateInputProfileMenu; - (BOOL) handleKeyboardEvent:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed; - (BOOL) handleMouseButtonEvent:(NSEvent *)mouseEvent buttonPressed:(BOOL)buttonPressed; - (BOOL) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(NSString *)commandTag; - (void) setMappingUsingDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo; - (BOOL) doesProfileNameExist:(NSString *)profileName; - (void) updateSelectedProfileName; - (void) didEndSettingsSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndProfileSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndProfileRenameSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (IBAction) setInputAdd:(id)sender; - (IBAction) removeInput:(id)sender; - (IBAction) changeSpeed:(id)sender; - (IBAction) showSettingsSheet:(id)sender; - (IBAction) closeSettingsSheet:(id)sender; - (IBAction) profileNew:(id)sender; - (IBAction) profileView:(id)sender; - (IBAction) profileApply:(id)sender; - (IBAction) profileRename:(id)sender; - (IBAction) profileSave:(id)sender; - (IBAction) profileDelete:(id)sender; - (IBAction) profileSelect:(id)sender; - (IBAction) closeProfileSheet:(id)sender; - (IBAction) closeProfileRenameSheet:(id)sender; - (IBAction) audioFileChoose:(id)sender; - (IBAction) audioFileChooseNone:(id)sender; @end desmume-0.9.9/src/cocoa/userinterface/InputProfileController.h0000644000175000017500000000240112140261514025262 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #import "InputManager.h" #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface InputProfileController : NSObjectController #else @interface InputProfileController : NSObjectController #endif { NSObject *dummyObject; InputManager *inputManager; NSOutlineView *profileOutlineView; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet InputManager *inputManager; @property (readonly) IBOutlet NSOutlineView *profileOutlineView; - (NSString *) commandTagFromInputList:(NSArray *)inputList; @end desmume-0.9.9/src/cocoa/userinterface/InputProfileController.mm0000644000175000017500000001347112140261514025455 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "InputProfileController.h" #import "cocoa_globals.h" @implementation InputProfileController @synthesize dummyObject; @synthesize inputManager; @synthesize profileOutlineView; - (id)init { self = [super init]; if (self == nil) { return self; } return self; } - (void)dealloc { [super dealloc]; } - (NSString *) commandTagFromInputList:(NSArray *)inputList { NSDictionary *mappings = [(NSDictionary *)[self content] valueForKey:@"Mappings"]; NSString *commandTag = nil; if (inputList == nil) { return commandTag; } for (NSString *tag in mappings) { if (inputList == [mappings valueForKey:tag]) { commandTag = tag; break; } } return commandTag; } #pragma mark NSOutlineViewDelegate Protocol - (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView *)outlineView { return NO; } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { if ([(NSString *)[tableColumn identifier] isEqualToString:@"InputCommandTagColumn"]) { return YES; } return NO; } - (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; NSCell *outCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]]; if ([columnID isEqualToString:@"InputCommandIconColumn"]) { if ([item isKindOfClass:[NSArray class]]) { NSString *commandTag = [self commandTagFromInputList:item]; if (commandTag != nil) { NSImage *iconImage = (NSImage *)[[inputManager commandIcon] valueForKey:commandTag]; if (iconImage == nil) { iconImage = (NSImage *)[[inputManager commandIcon] valueForKey:@"UNKNOWN COMMAND"]; } [outCell setImage:iconImage]; } else { outCell = [[[NSCell alloc] init] autorelease]; } } else { outCell = [[[NSCell alloc] init] autorelease]; } } else if ([columnID isEqualToString:@"InputDeviceColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 weight:0 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) { NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 weight:0 size:[[outCell font] pointSize]]; [outCell setFont:newFont]; } return outCell; } #pragma mark NSOutlineViewDataSource Protocol - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { if (item == nil) { NSDictionary *mappings = [(NSDictionary *)[self content] valueForKey:@"Mappings"]; NSString *commandTag = [[inputManager commandTagList] objectAtIndex:index]; return [mappings valueForKey:commandTag]; } else if ([item isKindOfClass:[NSArray class]]) { return [(NSArray *)item objectAtIndex:index]; } return nil; } - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { if ([item isKindOfClass:[NSArray class]]) { return YES; } return NO; } - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { NSInteger numberChildren = 0; if (item == nil) { numberChildren = [[inputManager commandTagList] count]; } else if ([item isKindOfClass:[NSArray class]]) { numberChildren = [(NSArray *)item count]; } return numberChildren; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { NSString *columnID = (NSString *)[tableColumn identifier]; if ([columnID isEqualToString:@"InputCommandIconColumn"]) { NSString *commandTag = [self commandTagFromInputList:item]; if (commandTag != nil) { NSImage *iconImage = (NSImage *)[[inputManager commandIcon] valueForKey:commandTag]; if (iconImage == nil) { iconImage = (NSImage *)[[inputManager commandIcon] valueForKey:@"UNKNOWN COMMAND"]; } return iconImage; } else { return nil; } } else if ([columnID isEqualToString:@"InputCommandTagColumn"]) { if ([item isKindOfClass:[NSArray class]]) { NSString *tag = [self commandTagFromInputList:item]; return tag; } else { return @""; } } else if ([columnID isEqualToString:@"InputDeviceColumn"]) { if ([item isKindOfClass:[NSArray class]]) { const unsigned long inputCount = (unsigned long)[(NSArray *)item count]; return [NSString stringWithFormat:(inputCount != 1) ? NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED_PLURAL : NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED, inputCount]; } else if ([item isKindOfClass:[NSDictionary class]]) { return [item valueForKey:@"deviceInfoSummary"]; } return @""; } else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) { NSString *settingsSummary = @""; if ([item isKindOfClass:[NSDictionary class]]) { settingsSummary = [item valueForKey:@"inputSettingsSummary"]; } return settingsSummary; } return item; } @end desmume-0.9.9/src/cocoa/userinterface/FileMigrationDelegate.h0000644000175000017500000000275512140261514024776 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface FileMigrationDelegate : NSObject #else @interface FileMigrationDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSArrayController *fileListController; NSArray *_versionList; NSMutableDictionary *_portStringsDict; //NSMutableDictionary *_fileTree; BOOL filesPresent; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSArrayController *fileListController; @property (assign) BOOL filesPresent; - (void) updateFileList; - (IBAction) updateAndShowWindow:(id)sender; - (IBAction) handleChoice:(id)sender; - (IBAction) selectAll:(id)sender; - (IBAction) selectNone:(id)sender; @end desmume-0.9.9/src/cocoa/userinterface/DisplayWindowController.h0000644000175000017500000001232712140261514025447 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include #include #import "InputManager.h" #import "cocoa_output.h" @class CocoaDSController; @class EmuControllerDelegate; @interface DisplayView : NSView { InputManager *inputManager; // Display thread BOOL isHudEnabled; BOOL isHudEditingModeEnabled; // OpenGL context NSOpenGLContext *context; CGLContextObj cglDisplayContext; NSInteger lastDisplayMode; NSInteger currentDisplayOrientation; GLfloat currentGapScalar; GLenum glTexPixelFormat; GLvoid *glTexBack; NSSize glTexBackSize; GLuint displayTexID; GLuint vboVertexID; GLuint vboTexCoordID; GLuint vboElementID; GLuint vaoMainStatesID; GLuint vertexShaderID; GLuint fragmentShaderID; GLuint shaderProgram; GLint uniformAngleDegrees; GLint uniformScalar; GLint uniformViewSize; GLint vtxBuffer[4 * 8]; GLfloat texCoordBuffer[2 * 8]; GLubyte vtxIndexBuffer[12]; BOOL isShaderSupported; unsigned int vtxBufferOffset; } @property (retain) InputManager *inputManager; - (void) startupOpenGL; - (void) shutdownOpenGL; - (void) setupShaderIO; - (BOOL) setupShadersWithVertexProgram:(const char *)vertShaderProgram fragmentProgram:(const char *)fragShaderProgram; - (void) drawVideoFrame; - (void) uploadVertices; - (void) uploadTexCoords; - (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight; - (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID; - (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID gap:(const GLfloat)gapScalar; - (void) updateTexCoordS:(GLfloat)s T:(GLfloat)t; - (NSPoint) dsPointFromEvent:(NSEvent *)theEvent; - (NSPoint) convertPointToDS:(NSPoint)clickLoc; - (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed; - (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed; - (void) clearToBlack; - (void) clearToWhite; - (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType; @end @interface DisplayWindowController : NSWindowController { DisplayView *view; NSView *saveScreenshotPanelAccessoryView; EmuControllerDelegate *emuControl; CocoaDSDisplayVideo *cdsVideoOutput; NSSize _normalSize; double _displayScale; double _displayRotation; BOOL _useBilinearOutput; BOOL _useVerticalSync; NSInteger _displayMode; NSInteger _displayOrientation; NSInteger _displayOrder; double _displayGap; NSInteger _videoFilterType; NSInteger screenshotFileFormat; NSSize _minDisplayViewSize; BOOL _isMinSizeNormal; NSUInteger _statusBarHeight; OSSpinLock spinlockNormalSize; OSSpinLock spinlockScale; OSSpinLock spinlockRotation; OSSpinLock spinlockUseBilinearOutput; OSSpinLock spinlockUseVerticalSync; OSSpinLock spinlockDisplayMode; OSSpinLock spinlockDisplayOrientation; OSSpinLock spinlockDisplayOrder; OSSpinLock spinlockDisplayGap; OSSpinLock spinlockVideoFilterType; } @property (readonly) IBOutlet DisplayView *view; @property (readonly) IBOutlet NSView *saveScreenshotPanelAccessoryView; @property (retain) EmuControllerDelegate *emuControl; @property (assign) CocoaDSDisplayVideo *cdsVideoOutput; @property (readonly) NSSize normalSize; @property (assign) double displayScale; @property (assign) double displayRotation; @property (assign) BOOL useBilinearOutput; @property (assign) BOOL useVerticalSync; @property (assign) NSInteger displayMode; @property (assign) NSInteger displayOrientation; @property (assign) NSInteger displayOrder; @property (assign) double displayGap; @property (assign) NSInteger videoFilterType; @property (assign) NSInteger screenshotFileFormat; @property (assign) BOOL isMinSizeNormal; @property (assign) BOOL isShowingStatusBar; - (id)initWithWindowNibName:(NSString *)windowNibName emuControlDelegate:(EmuControllerDelegate *)theEmuController; - (void) setupUserDefaults; - (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees; - (double) maxScalarForContentBoundsWidth:(double)contentBoundsWidth height:(double)contentBoundsHeight; - (IBAction) copy:(id)sender; - (IBAction) changeVolume:(id)sender; - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender; - (IBAction) toggleStatusBar:(id)sender; - (IBAction) toggleExecutePause:(id)sender; - (IBAction) reset:(id)sender; - (IBAction) changeCoreSpeed:(id)sender; - (IBAction) openRom:(id)sender; - (IBAction) changeRotationRelative:(id)sender; - (IBAction) saveScreenshotAs:(id)sender; @end desmume-0.9.9/src/cocoa/userinterface/troubleshootingWindowDelegate.mm0000644000175000017500000001552212140261514027042 0ustar guillaumeguillaume/* Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "troubleshootingWindowDelegate.h" #import "cocoa_util.h" #import "cocoa_globals.h" @implementation TroubleshootingWindowDelegate @synthesize dummyObject; @synthesize window; @synthesize troubleshootingWindowController; @synthesize romInfoController; @synthesize viewSupportRequest; @synthesize viewBugReport; @synthesize viewFinishedForm; @synthesize bindings; - (id)init { self = [super init]; if(self == nil) { return nil; } bindings = [[NSMutableDictionary alloc] init]; if (bindings == nil) { [self release]; self = nil; return self; } return self; } - (void)dealloc { [super dealloc]; } - (IBAction) copyRomInfoToTextFields:(id)sender { NSMutableDictionary *romInfoBindings = (NSMutableDictionary *)[romInfoController content]; NSString *romNameStr = (NSString *)[romInfoBindings valueForKey:@"romInternalName"]; NSString *romSerialStr = (NSString *)[romInfoBindings valueForKey:@"romSerial"]; [bindings setValue:romNameStr forKey:@"romName"]; [bindings setValue:romSerialStr forKey:@"romSerial"]; } - (IBAction) continueToFinalForm:(id)sender { static NSString *unspecifiedStr = @"Unspecified"; // Do not expose localized version for this NSString -- we want this to be in English // Force end of editing of any text fields. [window makeFirstResponder:nil]; // Set final form text. #ifdef PUBLIC_RELEASE NSString *appVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; #else NSString *appVersionStr = [[CocoaDSUtil appInternalVersionString] stringByAppendingString:[CocoaDSUtil appCompilerDetailString]]; #endif NSString *romNameStr = (NSString *)[bindings valueForKey:@"romName"]; if (romNameStr == nil) { romNameStr = unspecifiedStr; } NSString *romSerialStr = (NSString *)[bindings valueForKey:@"romSerial"]; if (romSerialStr == nil) { romSerialStr = unspecifiedStr; } NSString *finalFormTextStr = @"App Version: "; finalFormTextStr = [finalFormTextStr stringByAppendingString:appVersionStr]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nOperating System: "] stringByAppendingString:[CocoaDSUtil operatingSystemString]]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nModel Identifier: "] stringByAppendingString:[CocoaDSUtil modelIdentifierString]]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nROM Name: "] stringByAppendingString:romNameStr]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nROM Serial: "] stringByAppendingString:romSerialStr]; if ([window contentView] == viewSupportRequest) { NSString *supportRequestTextStr = (NSString *)[bindings valueForKey:@"supportRequestText"]; if (supportRequestTextStr == nil) { supportRequestTextStr = unspecifiedStr; } finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n\nSupport Request: "] stringByAppendingString:supportRequestTextStr]; [bindings setValue:NSSTRING_HELP_COPY_PASTE_TECH_SUPPORT forKey:@"copyPasteHelpText"]; [bindings setValue:NSSTRING_TITLE_GO_TECH_SUPPORT_WEBPAGE_TITLE forKey:@"goWebpageButtonTitle"]; } else { NSString *bugReportObservedTextStr = (NSString *)[bindings valueForKey:@"bugReportObservedText"]; if (bugReportObservedTextStr == nil) { bugReportObservedTextStr = unspecifiedStr; } NSString *bugReportExpectedTextStr = (NSString *)[bindings valueForKey:@"bugReportExpectedText"]; if (bugReportExpectedTextStr == nil) { bugReportExpectedTextStr = unspecifiedStr; } finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n\nObserved Behavior: "] stringByAppendingString:bugReportObservedTextStr]; finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n\nExpected Behavior: "] stringByAppendingString:bugReportExpectedTextStr]; [bindings setValue:NSSTRING_HELP_COPY_PASTE_BUG_REPORT forKey:@"copyPasteHelpText"]; [bindings setValue:NSSTRING_TITLE_GO_BUG_REPORT_WEBPAGE_TITLE forKey:@"goWebpageButtonTitle"]; } [bindings setValue:finalFormTextStr forKey:@"finalFormText"]; // Remember the current form and switch the window view. currentForm = [window contentView]; [self switchContentView:viewFinishedForm]; } - (IBAction) backForm:(id)sender { [self switchContentView:currentForm]; } - (IBAction) copyInfoToPasteboard:(id)sender { NSPasteboard *pboard = [NSPasteboard generalPasteboard]; [pboard declareTypes:[NSArray arrayWithObjects:NSStringPboardType, nil] owner:self]; [pboard setString:(NSString *)[bindings valueForKey:@"finalFormText"] forType:NSStringPboardType]; } - (IBAction) goToWebpage:(id)sender { if (currentForm == viewSupportRequest) { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_TECH_SUPPORT_SITE]]; } else { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_BUG_REPORT_SITE]]; } } - (void) switchViewByID:(TroubleshootingViewID)viewID { NSView *viewToSwitch = nil; switch (viewID) { case TROUBLESHOOTING_TECH_SUPPORT_VIEW_ID: viewToSwitch = viewSupportRequest; break; case TROUBLESHOOTING_BUG_REPORT_VIEW_ID: viewToSwitch = viewBugReport; break; default: break; } if (viewToSwitch == nil) { return; } [self clearAllText]; [self switchContentView:viewToSwitch]; } - (void) clearAllText { [bindings removeObjectForKey:@"romName"]; [bindings removeObjectForKey:@"romSerial"]; [bindings removeObjectForKey:@"supportRequestText"]; [bindings removeObjectForKey:@"bugReportObservedText"]; [bindings removeObjectForKey:@"bugReportExpectedText"]; [bindings removeObjectForKey:@"finalFormText"]; } - (void) switchContentView:(NSView *)theView { if ([window contentView] == theView) { return; } NSRect newFrame = [window frameRectForContentRect:[theView frame]]; newFrame.origin.x = [window frame].origin.x; newFrame.origin.y = [window frame].origin.y + [[window contentView] frame].size.height - [theView frame].size.height; NSView *tempView = [[NSView alloc] initWithFrame:[[window contentView] frame]]; [window setContentView:tempView]; [window setFrame:newFrame display:YES animate:YES]; [window setContentView:theView]; [tempView release]; } - (void)windowDidBecomeKey:(NSNotification *)notification { [troubleshootingWindowController setContent:bindings]; } @end desmume-0.9.9/src/cocoa/userinterface/troubleshootingWindowDelegate.h0000644000175000017500000000405312140261514026655 0ustar guillaumeguillaume/* Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import enum TroubleshootingViewID { TROUBLESHOOTING_TECH_SUPPORT_VIEW_ID = 0, TROUBLESHOOTING_BUG_REPORT_VIEW_ID }; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface TroubleshootingWindowDelegate : NSObject #else @interface TroubleshootingWindowDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSObjectController *troubleshootingWindowController; NSObjectController *romInfoController; NSView *viewSupportRequest; NSView *viewBugReport; NSView *viewFinishedForm; NSView *currentForm; NSMutableDictionary *bindings; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSObjectController *troubleshootingWindowController; @property (readonly) IBOutlet NSObjectController *romInfoController; @property (readonly) IBOutlet NSView *viewSupportRequest; @property (readonly) IBOutlet NSView *viewBugReport; @property (readonly) IBOutlet NSView *viewFinishedForm; @property (readonly) NSMutableDictionary *bindings; - (IBAction) copyRomInfoToTextFields:(id)sender; - (IBAction) continueToFinalForm:(id)sender; - (IBAction) backForm:(id)sender; - (IBAction) copyInfoToPasteboard:(id)sender; - (IBAction) goToWebpage:(id)sender; - (void) switchViewByID:(TroubleshootingViewID)viewID; - (void) clearAllText; - (void) switchContentView:(NSView *)theView; @end desmume-0.9.9/src/cocoa/userinterface/emuWindowDelegate_legacy.mm0000644000175000017500000010403012140261514025716 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "emuWindowDelegate_legacy.h" #import "cocoa_file.h" #import "cocoa_globals.h" #import "cocoa_util.h" #import "video_output_view_legacy.h" #import "nds_control_legacy.h" #import "input_legacy.h" @implementation EmuWindowDelegate - (id)init { self = [super init]; if(self == nil) { return nil; } bindings = [[NSMutableDictionary alloc] init]; if (bindings == nil) { [self release]; self = nil; return self; } iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]]; iconVolumeTwoThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeTwoThird_16x16" ofType:@"png"]]; iconVolumeOneThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeOneThird_16x16" ofType:@"png"]]; iconVolumeMute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]]; iconExecute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]]; iconPause = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]]; iconSpeedNormal = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed1x_420x420" ofType:@"png"]]; iconSpeedDouble = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed2x_420x420" ofType:@"png"]]; isRomLoading = NO; currentEmuSaveStateURL = nil; statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; minDisplayViewSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); isSmallestSizeNormal = YES; isShowingStatusBar = YES; screenshotFileFormat = NSTIFFFileType; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRomLoaded"]; [bindings setValue:[NSNumber numberWithFloat:MAX_VOLUME] forKey:@"volume"]; [bindings setObject:iconVolumeFull forKey:@"volumeIconImage"]; [bindings setValue:NSSTRING_STATUS_READY forKey:@"status"]; return self; } - (void)dealloc { [iconVolumeFull release]; [iconVolumeTwoThird release]; [iconVolumeOneThird release]; [iconVolumeMute release]; [iconExecute release]; [iconPause release]; [iconSpeedNormal release]; [iconSpeedDouble release]; [bindings release]; [super dealloc]; } - (NSMutableDictionary *) bindings { return bindings; } - (CocoaDisplayView *) displayView { return displayView; } - (void) setContentScalar:(double)s { [displayView setScale:s]; // Resize the window when contentScalar changes. NSSize drawBounds = [displayView normalSize]; [self resizeWithTransform:drawBounds scalar:s rotation:[displayView rotation]]; } - (void) setContentRotation:(double)angleDegrees { double newAngleDegrees = fmod(angleDegrees, 360.0); if (newAngleDegrees < 0.0) { newAngleDegrees = 360.0 + newAngleDegrees; } if (newAngleDegrees == 360.0) { newAngleDegrees = 0.0; } [displayView setRotation:newAngleDegrees]; // Set the minimum content size for the window, since this will change based on rotation. NSSize drawBounds = minDisplayViewSize; CGSize minContentSize = GetTransformedBounds(drawBounds.width, drawBounds.height, 1.0, CLOCKWISE_DEGREES(newAngleDegrees)); minContentSize.height += statusBarHeight; [window setContentMinSize:NSMakeSize(minContentSize.width, minContentSize.height)]; // Resize the window. NSSize oldBounds = [window frame].size; [self resizeWithTransform:[displayView normalSize] scalar:[displayView scale] rotation:newAngleDegrees]; NSSize newBounds = [window frame].size; // If the window size didn't change, it is possible that the old and new rotation angles // are 180 degrees offset from each other. In this case, we'll need to force the // display view to update itself. if (oldBounds.width == newBounds.width && oldBounds.height == newBounds.height) { [displayView setFrame:[displayView frame]]; } } - (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees { // Convert angle to clockwise-direction degrees. angleDegrees = CLOCKWISE_DEGREES(angleDegrees); // Get the maximum scalar size within drawBounds. Constrain scalar to maxScalar if necessary. CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, angleDegrees); double maxScalar = [self maxContentScalar:NSMakeSize(checkSize.width, checkSize.height)]; if (scalar > maxScalar) { scalar = maxScalar; } // Get the new bounds for the window's content view based on the transformed draw bounds. CGSize transformedBounds = GetTransformedBounds(normalBounds.width, normalBounds.height, scalar, angleDegrees); // Get the center of the content view in screen coordinates. NSRect windowContentRect = [[window contentView] bounds]; double translationX = (windowContentRect.size.width - transformedBounds.width) / 2.0; double translationY = ((windowContentRect.size.height - statusBarHeight) - transformedBounds.height) / 2.0; // Resize the window. NSRect windowFrame = [window frame]; NSRect newFrame = [window frameRectForContentRect:NSMakeRect(windowFrame.origin.x + translationX, windowFrame.origin.y + translationY, transformedBounds.width, transformedBounds.height + statusBarHeight)]; [window setFrame:newFrame display:YES animate:NO]; return scalar; } - (double) maxContentScalar:(NSSize)contentBounds { // Determine the maximum scale based on the visible screen size (which // doesn't include the menu bar or dock). NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; NSRect windowFrame = [window frameRectForContentRect:NSMakeRect(0.0, 0.0, contentBounds.width, contentBounds.height + statusBarHeight)]; NSSize visibleScreenBounds = { (screenFrame.size.width - (windowFrame.size.width - contentBounds.width)), (screenFrame.size.height - (windowFrame.size.height - contentBounds.height)) }; double maxS = GetMaxScalarInBounds(contentBounds.width, contentBounds.height, visibleScreenBounds.width, visibleScreenBounds.height); return maxS; } - (void) setVolume:(float)vol { [bindings setValue:[NSNumber numberWithFloat:vol] forKey:@"volume"]; // Update the icon. NSImage *currentImage = [bindings valueForKey:@"volumeIconImage"]; NSImage *newImage = nil; if (vol <= 0.0f) { newImage = iconVolumeMute; } else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) { newImage = iconVolumeOneThird; } else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) { newImage = iconVolumeTwoThird; } else { newImage = iconVolumeFull; } if (newImage != currentImage) { [bindings setObject:newImage forKey:@"volumeIconImage"]; } } - (float) volume { return [(NSNumber *)[bindings valueForKey:@"volume"] floatValue]; } - (void) setIsRomLoaded:(BOOL)theState { [bindings setValue:[NSNumber numberWithBool:theState] forKey:@"isRomLoaded"]; } - (BOOL) isRomLoaded { return [(NSNumber *)[bindings valueForKey:@"isRomLoaded"] boolValue]; } - (void) setStatus:(NSString *)theString { [bindings setValue:theString forKey:@"status"]; } - (NSString *) status { return (NSString *)[bindings valueForKey:@"status"]; } - (NSURL *) loadedRomURL { NSURL *romURL = nil; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (cdsCore != nil) { romURL = [cdsCore loadedRomURL]; } return romURL; } - (void) emulationError { [CocoaDSUtil quickDialogUsingTitle:NSSTRING_ERROR_TITLE_LEGACY message:NSSTRING_ERROR_GENERIC_LEGACY]; } - (IBAction) openRom:(id)sender { if (isRomLoading) { return; } NSURL *selectedFile = nil; NSInteger buttonClicked = NSFileHandlingPanelCancelButton; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_OPEN_ROM_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_DS, @FILE_EXT_ROM_GBA, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; buttonClicked = [panel runModal]; #else buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } } else { return; } [self handleLoadRom:selectedFile]; } - (IBAction) closeRom:(id)sender; { BOOL willClose = [CocoaDSUtil quickYesNoDialogUsingTitle:NSSTRING_MESSAGE_TITLE_LEGACY message:NSSTRING_MESSAGE_ASK_CLOSE_LEGACY]; if (willClose) { [self handleUnloadRom:REASONFORCLOSE_NORMAL romToLoad:nil]; } } - (IBAction) openEmuSaveState:(id)sender { BOOL result = NO; NSURL *selectedFile = nil; NSInteger buttonClicked = NSFileHandlingPanelCancelButton; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_OPEN_STATE_FILE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_SAVE_STATE, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; buttonClicked = [panel runModal]; #else buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } } else { return; } [self pauseCore]; result = [CocoaDSFile loadState:selectedFile]; if (result == NO) { [self setStatus:NSSTRING_STATUS_SAVESTATE_LOADING_FAILED]; [self restoreCoreState]; return; } currentEmuSaveStateURL = selectedFile; [currentEmuSaveStateURL retain]; [window setDocumentEdited:YES]; [self restoreCoreState]; [self setStatus:NSSTRING_STATUS_SAVESTATE_LOADED]; } - (IBAction) saveEmuSaveState:(id)sender { BOOL result = NO; if ([window isDocumentEdited] && currentEmuSaveStateURL != nil) { [self pauseCore]; result = [CocoaDSFile saveState:currentEmuSaveStateURL]; if (result == NO) { [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } [window setDocumentEdited:YES]; [self restoreCoreState]; [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVED]; } else { [self saveEmuSaveStateAs:sender]; } } - (IBAction) saveEmuSaveStateAs:(id)sender { BOOL result = NO; NSInteger buttonClicked = NSFileHandlingPanelCancelButton; NSSavePanel *panel = [NSSavePanel savePanel]; [panel setCanCreateDirectories:YES]; [panel setTitle:NSSTRING_TITLE_SAVE_STATE_FILE_PANEL]; [panel setRequiredFileType:@FILE_EXT_SAVE_STATE]; buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { [self pauseCore]; NSURL *saveFileURL = [panel URL]; result = [CocoaDSFile saveState:saveFileURL]; if (result == NO) { [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } currentEmuSaveStateURL = saveFileURL; [currentEmuSaveStateURL retain]; [window setDocumentEdited:YES]; [self restoreCoreState]; [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVED]; } } - (IBAction) revertEmuSaveState:(id)sender { BOOL result = NO; if ([window isDocumentEdited] && currentEmuSaveStateURL != nil) { [self pauseCore]; result = [CocoaDSFile loadState:currentEmuSaveStateURL]; if (result == NO) { [self setStatus:NSSTRING_STATUS_SAVESTATE_REVERTING_FAILED]; return; } [window setDocumentEdited:YES]; [self restoreCoreState]; [self setStatus:NSSTRING_STATUS_SAVESTATE_REVERTED]; } } - (IBAction) loadEmuSaveStateSlot:(id)sender { BOOL result = NO; NSInteger i = [CocoaDSUtil getIBActionSenderTag:sender]; NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; if (saveStatePath == nil) { return; } if (i < 0 || i > MAX_SAVESTATE_SLOTS) { return; } NSString *fileName = [CocoaDSFile saveSlotFileName:[self loadedRomURL] slotNumber:(NSUInteger)(i + 1)]; if (fileName == nil) { return; } [self pauseCore]; result = [CocoaDSFile loadState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; if (result == NO) { [self setStatus:NSSTRING_STATUS_SAVESTATE_LOADING_FAILED]; } [self restoreCoreState]; [self setStatus:NSSTRING_STATUS_SAVESTATE_LOADED]; } - (IBAction) saveEmuSaveStateSlot:(id)sender { BOOL result = NO; NSInteger i = [CocoaDSUtil getIBActionSenderTag:sender]; NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; if (saveStatePath == nil) { [self setStatus:NSSTRING_STATUS_CANNOT_GENERATE_SAVE_PATH]; return; } result = [CocoaDSFile createUserAppSupportDirectory:@"States"]; if (result == NO) { [self setStatus:NSSTRING_STATUS_CANNOT_CREATE_SAVE_DIRECTORY]; return; } if (i < 0 || i > MAX_SAVESTATE_SLOTS) { return; } NSString *fileName = [CocoaDSFile saveSlotFileName:[self loadedRomURL] slotNumber:(NSUInteger)(i + 1)]; if (fileName == nil) { return; } [self pauseCore]; result = [CocoaDSFile saveState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; if (result == NO) { [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; return; } [self restoreCoreState]; [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVED]; } - (IBAction) importRomSave:(id)sender { NSURL *selectedFile = nil; NSInteger buttonClicked = NSFileHandlingPanelCancelButton; NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:NO]; [panel setTitle:NSSTRING_TITLE_IMPORT_ROM_SAVE_PANEL]; NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_DS, @FILE_EXT_ROM_GBA, nil]; // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: // is deprecated in Mac OS X v10.6. #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 [panel setAllowedFileTypes:fileTypes]; buttonClicked = [panel runModal]; #else buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; #endif if (buttonClicked == NSFileHandlingPanelOKButton) { selectedFile = [[panel URLs] lastObject]; if(selectedFile == nil) { return; } } else { return; } BOOL result = [CocoaDSFile importRomSave:selectedFile]; if (!result) { [self setStatus:NSSTRING_STATUS_ROM_SAVE_IMPORT_FAILED]; return; } [self setStatus:NSSTRING_STATUS_ROM_SAVE_IMPORTED]; } - (IBAction) exportRomSave:(id)sender { BOOL result = NO; NSInteger buttonClicked; NSSavePanel *panel = [NSSavePanel savePanel]; [panel setTitle:NSSTRING_TITLE_EXPORT_ROM_SAVE_PANEL]; [panel setCanCreateDirectories:YES]; [panel setRequiredFileType:@FILE_EXT_ROM_SAVE_NOGBA]; //save it buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { [self pauseCore]; result = [CocoaDSFile exportRomSaveToURL:[panel URL] romSaveURL:[self loadedRomURL] fileType:ROMSAVEFORMAT_NOGBA]; if (result == NO) { [self setStatus:NSSTRING_STATUS_ROM_SAVE_EXPORT_FAILED]; return; } [self restoreCoreState]; [self setStatus:NSSTRING_STATUS_ROM_SAVE_EXPORTED]; } } - (IBAction) copy:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore copyToPasteboard]; } - (IBAction) executeCoreToggle:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore paused]) { if ([self isRomLoaded]) { [self executeCore]; } } else { [self pauseCore]; } } - (IBAction) resetCore:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([self isRomLoaded]) { [self setStatus:NSSTRING_STATUS_EMULATOR_RESETTING]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isWorking"]; [window displayIfNeeded]; [cdsCore reset]; if ([cdsCore paused]) { [displayView setViewToWhite]; } [self setStatus:NSSTRING_STATUS_EMULATOR_RESET_LEGACY]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; [window displayIfNeeded]; } } - (IBAction) speedLimitDisable:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isSpeedLimitEnabled]) { [cdsCore setIsSpeedLimitEnabled:NO]; [self setStatus:NSSTRING_STATUS_SPEED_LIMIT_DISABLED]; } else { [cdsCore setIsSpeedLimitEnabled:YES]; [self setStatus:NSSTRING_STATUS_SPEED_LIMIT_ENABLED]; } } - (IBAction) changeRomSaveType:(id)sender { if (![self isRomLoaded]) { return; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSaveType:[CocoaDSUtil getIBActionSenderTag:sender]]; } - (IBAction) changeCoreSpeed:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setSpeedScalar:(CGFloat)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f]; } - (IBAction) changeVolume:(id)sender { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; float vol = [self volume]; [self setVolume:vol]; [self setStatus:[NSString stringWithFormat:NSSTRING_STATUS_VOLUME, vol]]; [cdsCore setVolume:vol]; } - (IBAction) changeScale:(id)sender { [self setContentScalar:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0]; } - (IBAction) changeRotation:(id)sender { // Get the rotation value from the sender. if ([sender isMemberOfClass:[NSSlider class]]) { [self setContentRotation:[(NSSlider *)sender doubleValue]]; } else { [self setContentRotation:(double)[CocoaDSUtil getIBActionSenderTag:sender]]; } } - (IBAction) changeRotationRelative:(id)sender { double angleDegrees = [displayView rotation] + (double)[CocoaDSUtil getIBActionSenderTag:sender]; [self setContentRotation:angleDegrees]; } - (IBAction) toggleGPUState:(id)sender { NSInteger i = [CocoaDSUtil getIBActionSenderTag:sender]; UInt32 flags = [displayView gpuStateFlags]; flags ^= (1 << i); [displayView setGpuStateFlags:flags]; } - (IBAction) toggleMinSize:(id)sender { if (isSmallestSizeNormal) { minDisplayViewSize.width /= 4; minDisplayViewSize.height /= 4; isSmallestSizeNormal = NO; } else { minDisplayViewSize.width = GPU_DISPLAY_WIDTH; minDisplayViewSize.height = GPU_DISPLAY_HEIGHT * 2; isSmallestSizeNormal = YES; } // Set the minimum content size, keeping the display rotation in mind. CGSize transformedMinSize = GetTransformedBounds(minDisplayViewSize.width, minDisplayViewSize.height, 1.0, CLOCKWISE_DEGREES([displayView rotation])); transformedMinSize.height += statusBarHeight; [window setContentMinSize:NSMakeSize(transformedMinSize.width, transformedMinSize.height)]; // Resize the window if it's smaller than the minimum content size. NSRect windowContentRect = [window contentRectForFrameRect:[window frame]]; if (windowContentRect.size.width < transformedMinSize.width || windowContentRect.size.height < transformedMinSize.height) { // Prepare to resize. NSRect oldFrameRect = [window frame]; windowContentRect.size = NSMakeSize(transformedMinSize.width, transformedMinSize.height); NSRect newFrameRect = [window frameRectForContentRect:windowContentRect]; // Keep the window centered when expanding the size. newFrameRect.origin.x = oldFrameRect.origin.x - ((newFrameRect.size.width - oldFrameRect.size.width) / 2); newFrameRect.origin.y = oldFrameRect.origin.y - ((newFrameRect.size.height - oldFrameRect.size.height) / 2); // Set the window size. [window setFrame:newFrameRect display:YES animate:NO]; } } - (IBAction) toggleStatusBar:(id)sender { NSRect frameRect = [window frame]; if (isShowingStatusBar) { isShowingStatusBar = NO; statusBarHeight = 0; frameRect.origin.y += WINDOW_STATUS_BAR_HEIGHT; frameRect.size.height -= WINDOW_STATUS_BAR_HEIGHT; } else { isShowingStatusBar = YES; statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; frameRect.origin.y -= WINDOW_STATUS_BAR_HEIGHT; frameRect.size.height += WINDOW_STATUS_BAR_HEIGHT; } [window setFrame:frameRect display:YES animate:NO]; } - (IBAction) changeScreenshotFileFormat:(id)sender { screenshotFileFormat = (NSBitmapImageFileType)[CocoaDSUtil getIBActionSenderTag:sender]; } - (IBAction) saveScreenshotAs:(id)sender { [self pauseCore]; NSInteger buttonClicked = NSFileHandlingPanelCancelButton; NSSavePanel *panel = [NSSavePanel savePanel]; [panel setCanCreateDirectories:YES]; [panel setTitle:@"Save Screenshot As"]; [panel setAccessoryView:saveScreenshotPanelAccessoryView]; buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; BOOL fileSaved = [CocoaDSFile saveScreenshot:[panel URL] bitmapData:[cdsCore bitmapImageRep] fileType:screenshotFileFormat]; if (!fileSaved) { [CocoaDSUtil quickDialogUsingTitle:NSSTRING_ERROR_TITLE_LEGACY message:NSSTRING_ERROR_SCREENSHOT_FAILED_LEGACY]; } } [self restoreCoreState]; } - (BOOL) handleLoadRom:(NSURL *)fileURL { BOOL result = NO; if (isRomLoading) { return result; } result = [self loadRom:fileURL]; return result; } - (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL { BOOL result = NO; if (isRomLoading || ![self isRomLoaded]) { return result; } [self pauseCore]; result = [self unloadRom]; return result; } - (BOOL) loadRom:(NSURL *)romURL { BOOL romLoaded = NO; if (romURL == nil) { return romLoaded; } CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [self setStatus:NSSTRING_STATUS_ROM_LOADING]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isWorking"]; [window displayIfNeeded]; // Need to pause the core before loading the ROM. [self pauseCore]; // Load the ROM. isRomLoading = YES; romLoaded = [cdsCore loadRom:romURL]; if (!romLoaded) { // If ROM loading fails, restore the core state, but only if a ROM is already loaded. if([self isRomLoaded]) { [self restoreCoreState]; } [self setStatus:NSSTRING_STATUS_ROM_LOADING_FAILED_LEGACY]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; isRomLoading = NO; return romLoaded; } [romInfoPanelController setContent:[cdsCore romInfoBindings]]; // After the ROM loading is complete, send an execute message to the Cocoa DS per // user preferences. if ([[NSUserDefaults standardUserDefaults] boolForKey:@"ExecuteROMOnLoad"]) { [self executeCore]; } // Add the last loaded ROM to the Recent ROMs list. [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[cdsCore loadedRomURL]]; // Update the UI to indicate that a ROM has indeed been loaded. [displayView setViewToWhite]; [self setStatus:NSSTRING_STATUS_ROM_LOADED_LEGACY]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; [self setIsRomLoaded:YES]; [window displayIfNeeded]; isRomLoading = NO; romLoaded = YES; return romLoaded; } - (BOOL) unloadRom { BOOL result = NO; [currentEmuSaveStateURL release]; currentEmuSaveStateURL = nil; [window setDocumentEdited:NO]; // Update the UI to indicate that the ROM has started the process of unloading. [self setStatus:NSSTRING_STATUS_ROM_UNLOADING]; [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isWorking"]; [window displayIfNeeded]; // Unload the ROM. CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore closeROM]; // Update the UI to indicate that the ROM has finished unloading. [displayView setViewToBlack]; [self setStatus:NSSTRING_STATUS_ROM_UNLOADED_LEGACY]; [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; [self setIsRomLoaded:NO]; [window displayIfNeeded]; result = YES; return result; } - (void) executeCore { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setCoreState:CORESTATE_EXECUTE]; [self setStatus:NSSTRING_STATUS_EMULATOR_EXECUTING_LEGACY]; } - (void) pauseCore { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore setCoreState:CORESTATE_PAUSE]; [self setStatus:NSSTRING_STATUS_EMULATOR_PAUSED_LEGACY]; } - (void) restoreCoreState { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; [cdsCore restoreCoreState]; } - (BOOL)windowShouldClose:(id)sender { BOOL shouldClose = YES; // If no ROM is loaded, terminate the application. if (![self isRomLoaded]) { [NSApp terminate:sender]; } // If a ROM is loaded, just close the ROM, but don't terminate. else { shouldClose = NO; [self closeRom:nil]; } return shouldClose; } - (void)windowDidResize:(NSNotification *)notification { if (displayView == nil) { return; } NSSize normalBounds = [displayView normalSize]; double r = [displayView rotation]; // Get the max scalar within the window's current content bounds. CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, r); NSSize contentBounds = [[window contentView] bounds].size; contentBounds.height -= statusBarHeight; double maxS = GetMaxScalarInBounds(checkSize.width, checkSize.height, contentBounds.width, contentBounds.height); // Set the display view's properties. [displayView setScale:maxS]; // Resize the view. NSRect newContentFrame = [[window contentView] bounds]; newContentFrame.origin.y = statusBarHeight; newContentFrame.size.height -= statusBarHeight; [displayView setFrame:newContentFrame]; } - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize { NSSize finalSize = frameSize; const NSSize normalBounds = [displayView normalSize]; // Get a content Rect so that we can make our comparison. // This will be based on the proposed frameSize. const NSRect frameRect = NSMakeRect(0.0f, 0.0f, frameSize.width, frameSize.height); const NSRect contentRect = [sender contentRectForFrameRect:frameRect]; // Find the maximum scalar we can use for the display view, bounded by the // content Rect. const CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, [displayView rotation]); const NSSize contentBounds = NSMakeSize(contentRect.size.width, contentRect.size.height - statusBarHeight); const double maxS = GetMaxScalarInBounds(checkSize.width, checkSize.height, contentBounds.width, contentBounds.height); [displayView setScale:maxS]; // Make a new content Rect with our max scalar, and convert it back to a frame Rect. NSRect finalContentRect = NSMakeRect(0.0f, 0.0f, checkSize.width * maxS, (checkSize.height * maxS) + statusBarHeight); NSRect finalFrameRect = [sender frameRectForContentRect:finalContentRect]; // Set the final size based on our new frame Rect. finalSize.width = finalFrameRect.size.width; finalSize.height = finalFrameRect.size.height; return finalSize; } - (void)windowDidBecomeMain:(NSNotification *)notification { [emuWindowController setContent:bindings]; } - (BOOL)validateUserInterfaceItem:(id )theItem { BOOL enable = YES; SEL theAction = [theItem action]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (theAction == @selector(importRomSave:) || theAction == @selector(exportRomSave:)) { if (![self isRomLoaded]) { enable = NO; } } else if (theAction == @selector(executeCoreToggle:)) { if (![self isRomLoaded] || ![cdsCore masterExecute]) { enable = NO; } if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([cdsCore paused]) { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_EXECUTE_CONTROL]; } else { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_PAUSE_CONTROL]; } } else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) { if ([cdsCore paused]) { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_EXECUTE_CONTROL]; [(NSToolbarItem*)theItem setImage:iconExecute]; } else { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_PAUSE_CONTROL]; [(NSToolbarItem*)theItem setImage:iconPause]; } } } else if (theAction == @selector(executeCore) || theAction == @selector(pauseCore)) { if (![self isRomLoaded] || ![cdsCore masterExecute]) { enable = NO; } } else if (theAction == @selector(resetCore:)) { if (![self isRomLoaded]) { enable = NO; } } else if (theAction == @selector(openRom:)) { if (isRomLoading) { enable = NO; } } else if (theAction == @selector(closeRom:)) { if (![self isRomLoaded] || isRomLoading) { enable = NO; } } else if (theAction == @selector(loadEmuSaveStateSlot:)) { if (![self isRomLoaded]) { enable = NO; } else if (![CocoaDSFile saveStateExistsForSlot:[self loadedRomURL] slotNumber:[theItem tag] + 1]) { enable = NO; } } else if (theAction == @selector(saveEmuSaveStateSlot:)) { if (![self isRomLoaded]) { enable = NO; } if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([CocoaDSFile saveStateExistsForSlot:[self loadedRomURL] slotNumber:[theItem tag] + 1]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } else if (theAction == @selector(changeCoreSpeed:)) { NSInteger speedScalar = (NSInteger)([cdsCore speedScalar] * 100.0); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([theItem tag] == -1) { if (speedScalar == (NSInteger)(SPEED_SCALAR_QUARTER * 100.0) || speedScalar == (NSInteger)(SPEED_SCALAR_HALF * 100.0) || speedScalar == (NSInteger)(SPEED_SCALAR_NORMAL * 100.0) || speedScalar == (NSInteger)(SPEED_SCALAR_THREE_QUARTER * 100.0) || speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) { [(NSMenuItem*)theItem setState:NSOffState]; } else { [(NSMenuItem*)theItem setState:NSOnState]; } } else if (speedScalar == [theItem tag]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) { if (speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_SPEED_1X]; [(NSToolbarItem*)theItem setTag:100]; [(NSToolbarItem*)theItem setImage:iconSpeedNormal]; } else { [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_SPEED_2X]; [(NSToolbarItem*)theItem setTag:200]; [(NSToolbarItem*)theItem setImage:iconSpeedDouble]; } } } else if (theAction == @selector(speedLimitDisable:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([cdsCore isSpeedLimitEnabled]) { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_SPEED_LIMIT]; } else { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_SPEED_LIMIT]; } } } else if (theAction == @selector(changeRomSaveType:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([cdsCore saveType] == [theItem tag]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } else if (theAction == @selector(changeScale:)) { NSInteger viewScale = (NSInteger)([displayView scale] * 100.0); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if (viewScale == [theItem tag]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } else if (theAction == @selector(changeRotation:)) { NSInteger viewRotation = (NSInteger)([displayView rotation]); if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([theItem tag] == -1) { if (viewRotation == 0 || viewRotation == 90 || viewRotation == 180 || viewRotation == 270) { [(NSMenuItem*)theItem setState:NSOffState]; } else { [(NSMenuItem*)theItem setState:NSOnState]; } } else if (viewRotation == [theItem tag]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } else if (theAction == @selector(changeDisplayMode:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([displayView displayMode] == [theItem tag]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } else if (theAction == @selector(openEmuSaveState:) || theAction == @selector(saveEmuSaveState:) || theAction == @selector(saveEmuSaveStateAs:)) { if (![self isRomLoaded]) { enable = NO; } } else if (theAction == @selector(revertEmuSaveState:)) { if (![self isRomLoaded] || currentEmuSaveStateURL == nil) { enable = NO; } } else if (theAction == @selector(toggleGPUState:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if ([displayView gpuStateByBit:[theItem tag]]) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } else if (theAction == @selector(toggleStatusBar:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if (isShowingStatusBar) { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_HIDE_STATUS_BAR]; } else { [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_SHOW_STATUS_BAR]; } } } else if (theAction == @selector(toggleMinSize:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { if (isSmallestSizeNormal) { [(NSMenuItem*)theItem setState:NSOnState]; } else { [(NSMenuItem*)theItem setState:NSOffState]; } } } return enable; } @end desmume-0.9.9/src/cocoa/userinterface/appDelegate.mm0000644000175000017500000005327412140261514023211 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "appDelegate.h" #import "DisplayWindowController.h" #import "EmuControllerDelegate.h" #import "FileMigrationDelegate.h" #import "preferencesWindowDelegate.h" #import "troubleshootingWindowDelegate.h" #import "cheatWindowDelegate.h" #import "inputPrefsView.h" #import "cocoa_core.h" #import "cocoa_file.h" #import "cocoa_firmware.h" #import "cocoa_globals.h" #import "cocoa_input.h" #import "cocoa_rom.h" #import "cocoa_util.h" @implementation AppDelegate @dynamic dummyObject; @synthesize prefWindow; @synthesize troubleshootingWindow; @synthesize cheatListWindow; @synthesize prefGeneralView; @synthesize mLoadStateSlot; @synthesize mSaveStateSlot; @synthesize inputPrefsView; @synthesize aboutWindowController; @synthesize emuControlController; @synthesize cdsSoundController; @synthesize romInfoPanelController; @synthesize prefWindowController; @synthesize cdsCoreController; @synthesize cheatWindowController; @synthesize migrationDelegate; @synthesize inputManager; @synthesize boxGeneralInfo; @synthesize boxTitles; @synthesize boxARMBinaries; @synthesize boxFileSystem; @synthesize boxMisc; @synthesize isAppRunningOnIntel; - (id)init { self = [super init]; if(self == nil) { return nil; } // Determine if we're running on Intel or PPC. #if defined(__i386__) || defined(__x86_64__) isAppRunningOnIntel = YES; #else isAppRunningOnIntel = NO; #endif return self; } - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { BOOL result = NO; NSURL *fileURL = [NSURL fileURLWithPath:filename]; EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if (cdsCore == nil) { return result; } NSString *fileKind = [CocoaDSFile fileKindByURL:fileURL]; if ([fileKind isEqualToString:@"ROM"]) { result = [emuControl handleLoadRom:fileURL]; if ([emuControl isShowingSaveStateDialog] || [emuControl isShowingFileMigrationDialog]) { // Just reply YES if a sheet is showing, even if the ROM hasn't actually been loaded yet. // This will prevent the error dialog from showing, which is the intended behavior in // this case. result = YES; } } return result; } - (void)applicationWillFinishLaunching:(NSNotification *)notification { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; PreferencesWindowDelegate *prefWindowDelegate = (PreferencesWindowDelegate *)[prefWindow delegate]; CheatWindowDelegate *cheatWindowDelegate = (CheatWindowDelegate *)[cheatListWindow delegate]; // Create the needed directories in Application Support if they haven't already // been created. if (![CocoaDSFile setupAllAppDirectories]) { // Need to show a modal dialog here. return; } [CocoaDSFile setupAllFilePaths]; // Setup the About window. NSString *descriptionStr = [[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"] stringByAppendingString:@" "] stringByAppendingString:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]]; descriptionStr = [[descriptionStr stringByAppendingString:@"\n"] stringByAppendingString:@STRING_DESMUME_SHORT_DESCRIPTION]; descriptionStr = [[descriptionStr stringByAppendingString:@"\n"] stringByAppendingString:@STRING_DESMUME_WEBSITE]; NSString *buildInfoStr = @"Build Info:"; buildInfoStr = [[buildInfoStr stringByAppendingString:[CocoaDSUtil appInternalVersionString]] stringByAppendingString:[CocoaDSUtil appCompilerDetailString]]; buildInfoStr = [[buildInfoStr stringByAppendingString:@"\nBuild Date: "] stringByAppendingString:@__DATE__]; buildInfoStr = [[buildInfoStr stringByAppendingString:@"\nOperating System: "] stringByAppendingString:[CocoaDSUtil operatingSystemString]]; buildInfoStr = [[buildInfoStr stringByAppendingString:@"\nModel Identifier: "] stringByAppendingString:[CocoaDSUtil modelIdentifierString]]; NSFont *aboutTextFilesFont = [NSFont fontWithName:@"Monaco" size:10]; NSMutableDictionary *aboutWindowProperties = [NSMutableDictionary dictionaryWithObjectsAndKeys: [[NSBundle mainBundle] pathForResource:@FILENAME_README ofType:@""], @"readMePath", [[NSBundle mainBundle] pathForResource:@FILENAME_COPYING ofType:@""], @"licensePath", [[NSBundle mainBundle] pathForResource:@FILENAME_AUTHORS ofType:@""], @"authorsPath", [[NSBundle mainBundle] pathForResource:@FILENAME_CHANGELOG ofType:@""], @"changeLogPath", descriptionStr, @"descriptionString", buildInfoStr, @"buildInfoString", aboutTextFilesFont, @"aboutTextFilesFont", nil]; [aboutWindowController setContent:aboutWindowProperties]; // Register the application's defaults. NSDictionary *prefsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserPrefs" ofType:@"plist"]]; if (prefsDict == nil) { [[NSAlert alertWithMessageText:NSSTRING_ALERT_CRITICAL_FILE_MISSING_PRI defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:NSSTRING_ALERT_CRITICAL_FILE_MISSING_SEC] runModal]; [NSApp terminate:nil]; return; } [[NSUserDefaults standardUserDefaults] registerDefaults:prefsDict]; // Change the title colors of the NSBox objects in the ROM Info panel. We change the // colors manually here because you can't change them in Interface Builder. Boo!!! [self setRomInfoPanelBoxTitleColors]; // Set the preferences window to the general view by default. [prefWindowDelegate switchContentView:prefGeneralView]; // Setup the slot menu items. We set this up manually instead of through Interface // Builder because we're assuming an arbitrary number of slot items. [self setupSlotMenuItems]; // Init the DS emulation core. CocoaDSCore *newCore = [[[CocoaDSCore alloc] init] autorelease]; // Init the DS controller. CocoaDSController *newController = [[[CocoaDSController alloc] init] autorelease]; [newCore setCdsController:newController]; // Init the DS speakers. CocoaDSSpeaker *newSpeaker = [[[CocoaDSSpeaker alloc] init] autorelease]; [newCore addOutput:newSpeaker]; [emuControl setCdsSpeaker:newSpeaker]; // Start the core thread. [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:newCore withObject:nil]; // Wait until the emulation core has finished starting up. while (!([CocoaDSCore isCoreStarted] && [newCore thread] != nil)) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } // Start up the threads for our outputs. [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:newSpeaker withObject:nil]; // Wait until the SPU is finished starting up. while ([newSpeaker thread] == nil) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } // Set up all the object controllers. [cdsCoreController setContent:newCore]; [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; [prefWindowController setContent:[prefWindowDelegate bindings]]; [cheatWindowController setContent:[cheatWindowDelegate bindings]]; // Setup the applications settings from the user defaults file. [self setupUserDefaults]; [inputPrefsView initSettingsSheets]; [inputPrefsView populateInputProfileMenu]; [[inputPrefsView inputProfileMenu] selectItemAtIndex:0]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; // Determine if the app was run for the first time. NSMutableDictionary *appFirstTimeRunDict = [[NSMutableDictionary alloc] initWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"General_AppFirstTimeRun"]]; NSString *bundleVersionString = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; BOOL isFirstTimeRun = NO; NSNumber *isFirstTimeRunNumber = (NSNumber *)[appFirstTimeRunDict valueForKey:bundleVersionString]; if (isFirstTimeRunNumber == nil) { isFirstTimeRunNumber = [NSNumber numberWithBool:isFirstTimeRun]; } isFirstTimeRun = [isFirstTimeRunNumber boolValue]; if (appFirstTimeRunDict == nil) { appFirstTimeRunDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:isFirstTimeRunNumber, bundleVersionString, nil]; } // Load a new ROM on launch per user preferences. const BOOL loadROMOnLaunch = [[NSUserDefaults standardUserDefaults] boolForKey:@"General_AutoloadROMOnLaunch"]; if (loadROMOnLaunch && [emuControl currentRom] == nil) { const NSInteger autoloadRomOption = [[NSUserDefaults standardUserDefaults] integerForKey:@"General_AutoloadROMOption"]; NSURL *autoloadRomURL = nil; if (autoloadRomOption == ROMAUTOLOADOPTION_LOAD_LAST) { autoloadRomURL = [CocoaDSFile lastLoadedRomURL]; } else if(autoloadRomOption == ROMAUTOLOADOPTION_LOAD_SELECTED) { NSString *autoloadRomPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"General_AutoloadROMSelectedPath"]; if (autoloadRomPath != nil && [autoloadRomPath length] > 0) { autoloadRomURL = [NSURL fileURLWithPath:autoloadRomPath]; } } if (autoloadRomURL != nil) { [emuControl handleLoadRom:autoloadRomURL]; } } //Bring the application to the front [NSApp activateIgnoringOtherApps:TRUE]; [emuControl newDisplayWindow:nil]; // Present the file migration window to the user (if they haven't disabled it). if (![[NSUserDefaults standardUserDefaults] boolForKey:@"General_DoNotAskMigrate"] || !isFirstTimeRun) { [migrationDelegate updateFileList]; if ([migrationDelegate filesPresent]) { [[migrationDelegate window] center]; [[migrationDelegate window] makeKeyAndOrderFront:nil]; } } // Set that the app has run for the first time. isFirstTimeRun = YES; [appFirstTimeRunDict setValue:[NSNumber numberWithBool:isFirstTimeRun] forKey:bundleVersionString]; [[NSUserDefaults standardUserDefaults] setObject:appFirstTimeRunDict forKey:@"General_AppFirstTimeRun"]; [appFirstTimeRunDict release]; } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; // If a file needs to be saved, give the user a chance to save it // before quitting. const BOOL didRomClose = [emuControl handleUnloadRom:REASONFORCLOSE_TERMINATE romToLoad:nil]; if (!didRomClose) { if ([emuControl isShowingSaveStateDialog]) { return NSTerminateLater; } } // Either there wasn't a file that needed to be saved, or there // wasn't anything loaded. Just continue program termination normally. return NSTerminateNow; } - (void)applicationWillTerminate:(NSNotification *)notification { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; // Save some settings to user defaults before app termination [[NSUserDefaults standardUserDefaults] setBool:[cdsCore isSpeedLimitEnabled] forKey:@"CoreControl_EnableSpeedLimit"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore isFrameSkipEnabled] forKey:@"CoreControl_EnableAutoFrameSkip"]; [[NSUserDefaults standardUserDefaults] setBool:[cdsCore isCheatingEnabled] forKey:@"CoreControl_EnableCheats"]; [cdsCoreController setContent:nil]; } - (IBAction) launchWebsite:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_WEBSITE]]; } - (IBAction) launchForums:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_FORUM_SITE]]; } - (IBAction) supportRequest:(id)sender { TroubleshootingWindowDelegate *troubleshootingWindowDelegate = [troubleshootingWindow delegate]; [troubleshootingWindowDelegate switchViewByID:TROUBLESHOOTING_TECH_SUPPORT_VIEW_ID]; [troubleshootingWindow setTitle:NSSTRING_TITLE_TECH_SUPPORT_WINDOW_TITLE]; [troubleshootingWindow makeKeyAndOrderFront:sender]; } - (IBAction) bugReport:(id)sender { TroubleshootingWindowDelegate *troubleshootingWindowDelegate = [troubleshootingWindow delegate]; [troubleshootingWindowDelegate switchViewByID:TROUBLESHOOTING_BUG_REPORT_VIEW_ID]; [troubleshootingWindow setTitle:NSSTRING_TITLE_BUG_REPORT_WINDOW_TITLE]; [troubleshootingWindow makeKeyAndOrderFront:sender]; } - (void) setupSlotMenuItems { NSMenuItem *loadItem = nil; NSMenuItem *saveItem = nil; for(NSInteger i = 0; i < MAX_SAVESTATE_SLOTS; i++) { loadItem = [self addSlotMenuItem:mLoadStateSlot slotNumber:(NSUInteger)(i + 1)]; [loadItem setKeyEquivalentModifierMask:0]; [loadItem setTag:i]; [loadItem setAction:@selector(loadEmuSaveStateSlot:)]; saveItem = [self addSlotMenuItem:mSaveStateSlot slotNumber:(NSUInteger)(i + 1)]; [saveItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [saveItem setTag:i]; [saveItem setAction:@selector(saveEmuSaveStateSlot:)]; } } - (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; NSUInteger slotNumberKey = slotNumber; if (slotNumber == 10) { slotNumberKey = 0; } NSMenuItem *mItem = [menu addItemWithTitle:[NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, (unsigned long)slotNumber] action:nil keyEquivalent:[NSString stringWithFormat:@"%ld", (unsigned long)slotNumberKey]]; [mItem setTarget:emuControl]; return mItem; } - (void) setupUserDefaults { EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content]; PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate]; NSMutableDictionary *prefBindings = [prefWindowDelegate bindings]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; // Set the emulation flags. NSUInteger emuFlags = 0; if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_AdvancedBusLevelTiming"]) { emuFlags |= EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_RigorousTiming"]) { emuFlags |= EMULATION_RIGOROUS_TIMING_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseExternalBIOSImages"]) { emuFlags |= EMULATION_USE_EXTERNAL_BIOS_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_BIOSEmulateSWI"]) { emuFlags |= EMULATION_BIOS_SWI_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_BIOSPatchDelayLoopSWI"]) { emuFlags |= EMULATION_PATCH_DELAY_LOOP_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseExternalFirmwareImage"]) { emuFlags |= EMULATION_USE_EXTERNAL_FIRMWARE_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_FirmwareBoot"]) { emuFlags |= EMULATION_BOOT_FROM_FIRMWARE_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_EmulateEnsata"]) { emuFlags |= EMULATION_ENSATA_MASK; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseDebugConsole"]) { emuFlags |= EMULATION_DEBUG_CONSOLE_MASK; } [cdsCore setEmulationFlags:emuFlags]; // If we're not running on Intel, force the CPU emulation engine to use the interpreter engine. if (!isAppRunningOnIntel) { [[NSUserDefaults standardUserDefaults] setInteger:CPU_EMULATION_ENGINE_INTERPRETER forKey:@"Emulation_CPUEmulationEngine"]; } // Set the CPU emulation engine per user preferences. [cdsCore setCpuEmulationEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Emulation_CPUEmulationEngine"]]; [cdsCore setMaxJITBlockSize:[[NSUserDefaults standardUserDefaults] integerForKey:@"Emulation_MaxJITBlockSize"]]; // Set the SLOT-1 device settings per user preferences. NSString *slot1R4Path = (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:@"EmulationSlot1_R4StoragePath"]; [cdsCore setSlot1DeviceType:[[NSUserDefaults standardUserDefaults] integerForKey:@"EmulationSlot1_DeviceType"]]; [cdsCore setSlot1R4URL:(slot1R4Path != nil) ? [NSURL fileURLWithPath:slot1R4Path] : nil]; // Set the miscellaneous emulations settings per user preferences. [cdsCore setIsSpeedLimitEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableSpeedLimit"]]; [cdsCore setIsFrameSkipEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableAutoFrameSkip"]]; [cdsCore setIsCheatingEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableCheats"]]; // Set up the firmware per user preferences. NSMutableDictionary *newFWDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Nickname"], @"Nickname", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Message"], @"Message", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_FavoriteColor"], @"FavoriteColor", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Birthday"], @"Birthday", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Language"], @"Language", nil]; CocoaDSFirmware *newFirmware = [[[CocoaDSFirmware alloc] initWithDictionary:newFWDict] autorelease]; [newFirmware update]; [emuControl setCdsFirmware:newFirmware]; // Setup the ARM7 BIOS, ARM9 BIOS, and firmware image paths per user preferences. NSString *arm7BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM7ImagePath"]; if (arm7BiosImagePath != nil) { [cdsCore setArm7ImageURL:[NSURL fileURLWithPath:arm7BiosImagePath]]; [prefBindings setValue:[arm7BiosImagePath lastPathComponent] forKey:@"Arm7BiosImageName"]; } else { [cdsCore setArm7ImageURL:nil]; [prefBindings setValue:nil forKey:@"Arm7BiosImageName"]; } NSString *arm9BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM9ImagePath"]; if (arm9BiosImagePath != nil) { [cdsCore setArm9ImageURL:[NSURL fileURLWithPath:arm9BiosImagePath]]; [prefBindings setValue:[arm9BiosImagePath lastPathComponent] forKey:@"Arm9BiosImageName"]; } else { [cdsCore setArm9ImageURL:nil]; [prefBindings setValue:nil forKey:@"Arm9BiosImageName"]; } NSString *firmwareImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Emulation_FirmwareImagePath"]; if (firmwareImagePath != nil) { [cdsCore setFirmwareImageURL:[NSURL fileURLWithPath:firmwareImagePath]]; [prefBindings setValue:[firmwareImagePath lastPathComponent] forKey:@"FirmwareImageName"]; } else { [cdsCore setFirmwareImageURL:nil]; [prefBindings setValue:nil forKey:@"FirmwareImageName"]; } NSString *advansceneDatabasePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Advanscene_DatabasePath"]; if (advansceneDatabasePath != nil) { [prefBindings setValue:[advansceneDatabasePath lastPathComponent] forKey:@"AdvansceneDatabaseName"]; } NSString *cheatDatabasePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"R4Cheat_DatabasePath"]; if (cheatDatabasePath != nil) { [prefBindings setValue:[cheatDatabasePath lastPathComponent] forKey:@"R4CheatDatabaseName"]; } // Update the SPU Sync controls in the Preferences window. if ([[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"] == SPU_SYNC_MODE_DUAL_SYNC_ASYNC) { [[prefWindowDelegate spuSyncMethodMenu] setEnabled:NO]; } else { [[prefWindowDelegate spuSyncMethodMenu] setEnabled:YES]; } // Set the text field for the autoloaded ROM. NSString *autoloadRomPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"General_AutoloadROMSelectedPath"]; if (autoloadRomPath != nil) { [prefBindings setValue:[autoloadRomPath lastPathComponent] forKey:@"AutoloadRomName"]; } else { [prefBindings setValue:nil forKey:@"AutoloadRomName"]; } // Set the menu for the display rotation. const double displayRotation = (double)[[NSUserDefaults standardUserDefaults] floatForKey:@"DisplayView_Rotation"]; [prefWindowDelegate updateDisplayRotationMenu:displayRotation]; // Set the default sound volume per user preferences. [prefWindowDelegate updateVolumeIcon:nil]; // Set up the user's default input settings. NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]; if (userMappings == nil) { NSDictionary *defaultKeyMappingsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; NSArray *internalDefaultProfilesList = (NSArray *)[defaultKeyMappingsDict valueForKey:@"DefaultInputProfiles"]; userMappings = [(NSDictionary *)[internalDefaultProfilesList objectAtIndex:0] valueForKey:@"Mappings"]; } [inputManager setMappingsWithMappings:userMappings]; // Set up the rest of the emulation-related user defaults. [emuControl setupUserDefaults]; } - (void) setRomInfoPanelBoxTitleColors { NSColor *boxTitleColor = [NSColor whiteColor]; [[boxGeneralInfo titleCell] setTextColor:boxTitleColor]; [[boxTitles titleCell] setTextColor:boxTitleColor]; [[boxARMBinaries titleCell] setTextColor:boxTitleColor]; [[boxFileSystem titleCell] setTextColor:boxTitleColor]; [[boxMisc titleCell] setTextColor:boxTitleColor]; [boxGeneralInfo setNeedsDisplay:YES]; [boxTitles setNeedsDisplay:YES]; [boxARMBinaries setNeedsDisplay:YES]; [boxFileSystem setNeedsDisplay:YES]; [boxMisc setNeedsDisplay:YES]; } @end desmume-0.9.9/src/cocoa/userinterface/EmuControllerDelegate.h0000644000175000017500000002225512140261514025034 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include @class InputManager; @class CocoaDSRom; @class CocoaDSFirmware; @class CocoaDSOutput; @class CocoaDSSpeaker; @class CocoaDSCheatManager; @class CheatWindowDelegate; @class DisplayWindowController; class AudioSampleBlockGenerator; @interface EmuControllerDelegate : NSObject { InputManager *inputManager; CocoaDSRom *currentRom; CocoaDSFirmware *cdsFirmware; CocoaDSSpeaker *cdsSpeaker; CocoaDSCheatManager *cdsCheats; CocoaDSCheatManager *dummyCheatList; CheatWindowDelegate *cheatWindowDelegate; NSObjectController *firmwarePanelController; NSObjectController *romInfoPanelController; NSObjectController *cdsCoreController; NSObjectController *cdsSoundController; NSObjectController *cheatWindowController; NSArrayController *cheatListController; NSArrayController *cheatDatabaseController; NSWindow *slot1ManagerWindow; NSWindow *saveFileMigrationSheet; NSWindow *saveStatePrecloseSheet; NSView *exportRomSavePanelAccessoryView; BOOL isSaveStateEdited; BOOL isWorking; BOOL isRomLoading; NSString *statusText; float currentVolumeValue; NSImage *currentVolumeIcon; BOOL isShowingSaveStateDialog; BOOL isShowingFileMigrationDialog; BOOL isUserInterfaceBlockingExecution; NSURL *currentSaveStateURL; NSInteger selectedExportRomSaveID; NSInteger selectedRomSaveTypeID; CGFloat lastSetSpeedScalar; BOOL isSoundMuted; float lastSetVolumeValue; NSImage *iconVolumeFull; NSImage *iconVolumeTwoThird; NSImage *iconVolumeOneThird; NSImage *iconVolumeMute; NSImage *iconExecute; NSImage *iconPause; NSImage *iconSpeedNormal; NSImage *iconSpeedDouble; DisplayWindowController *mainWindow; NSMutableArray *windowList; OSSpinLock spinlockFirmware; OSSpinLock spinlockSpeaker; } @property (readonly) IBOutlet InputManager *inputManager; @property (assign) CocoaDSRom *currentRom; // Don't rely on autorelease since the emulator doesn't support concurrent unloading @property (retain) CocoaDSFirmware *cdsFirmware; @property (retain) CocoaDSSpeaker *cdsSpeaker; @property (retain) CocoaDSCheatManager *cdsCheats; @property (readonly) IBOutlet CheatWindowDelegate *cheatWindowDelegate; @property (readonly) IBOutlet NSObjectController *firmwarePanelController; @property (readonly) IBOutlet NSObjectController *romInfoPanelController; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet NSObjectController *cdsSoundController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSArrayController *cheatListController; @property (readonly) IBOutlet NSArrayController *cheatDatabaseController; @property (readonly) IBOutlet NSWindow *slot1ManagerWindow; @property (readonly) IBOutlet NSWindow *saveFileMigrationSheet; @property (readonly) IBOutlet NSWindow *saveStatePrecloseSheet; @property (readonly) IBOutlet NSView *exportRomSavePanelAccessoryView; @property (readonly) NSImage *iconExecute; @property (readonly) NSImage *iconPause; @property (readonly) NSImage *iconSpeedNormal; @property (readonly) NSImage *iconSpeedDouble; @property (readonly) BOOL masterExecuteFlag; @property (readonly) NSInteger executionState; @property (readonly) CGFloat speedScalar; @property (assign) BOOL isWorking; @property (assign) BOOL isRomLoading; @property (assign) NSString *statusText; @property (assign) float currentVolumeValue; @property (retain) NSImage *currentVolumeIcon; @property (assign) BOOL isShowingSaveStateDialog; @property (assign) BOOL isShowingFileMigrationDialog; @property (assign) BOOL isUserInterfaceBlockingExecution; @property (retain) NSURL *currentSaveStateURL; @property (assign) NSInteger selectedExportRomSaveID; @property (assign) NSInteger selectedRomSaveTypeID; @property (assign) NSInteger render3DRenderingEngine; @property (assign) BOOL render3DHighPrecisionColorInterpolation; @property (assign) BOOL render3DEdgeMarking; @property (assign) BOOL render3DFog; @property (assign) BOOL render3DTextures; @property (assign) NSInteger render3DDepthComparisonThreshold; @property (assign) NSInteger render3DThreads; @property (assign) BOOL render3DLineHack; @property (assign) BOOL render3DMultisample; @property (retain) DisplayWindowController *mainWindow; @property (readonly) NSMutableArray *windowList; // File Menu - (IBAction) newDisplayWindow:(id)sender; - (IBAction) openRom:(id)sender; - (IBAction) loadRecentRom:(id)sender; - (IBAction) closeWindow:(id)sender; - (IBAction) closeRom:(id)sender; - (IBAction) revealRomInFinder:(id)sender; - (IBAction) revealGameDataFolderInFinder:(id)sender; - (IBAction) openEmuSaveState:(id)sender; - (IBAction) saveEmuSaveState:(id)sender; - (IBAction) saveEmuSaveStateAs:(id)sender; - (IBAction) revertEmuSaveState:(id)sender; - (IBAction) loadEmuSaveStateSlot:(id)sender; - (IBAction) saveEmuSaveStateSlot:(id)sender; - (IBAction) importRomSave:(id)sender; - (IBAction) exportRomSave:(id)sender; // Emulation Menu - (IBAction) toggleSpeedLimiter:(id)sender; - (IBAction) toggleAutoFrameSkip:(id)sender; - (IBAction) toggleCheats:(id)sender; - (IBAction) toggleExecutePause:(id)sender; - (IBAction) reset:(id)sender; - (IBAction) changeRomSaveType:(id)sender; // View Menu - (IBAction) changeScale:(id)sender; - (IBAction) changeRotation:(id)sender; - (IBAction) changeRotationRelative:(id)sender; - (IBAction) changeDisplayMode:(id)sender; - (IBAction) changeDisplayOrientation:(id)sender; - (IBAction) changeDisplayOrder:(id)sender; - (IBAction) changeDisplayGap:(id)sender; - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender; - (IBAction) toggleStatusBar:(id)sender; - (IBAction) toggleToolbarShown:(id)sender; - (IBAction) runToolbarCustomizationPalette:(id)sender; // Tools Menu - (IBAction) toggleGPUState:(id)sender; - (IBAction) saveScreenshotAs:(id)sender; - (IBAction) changeCoreSpeed:(id)sender; - (IBAction) changeCoreEmuFlags:(id)sender; - (IBAction) changeFirmwareSettings:(id)sender; - (IBAction) changeVolume:(id)sender; - (IBAction) changeAudioEngine:(id)sender; - (IBAction) changeSpuAdvancedLogic:(id)sender; - (IBAction) changeSpuInterpolationMode:(id)sender; - (IBAction) changeSpuSyncMode:(id)sender; - (IBAction) changeSpuSyncMethod:(id)sender; // Misc IBActions - (IBAction) chooseSlot1R4Directory:(id)sender; - (IBAction) slot1Eject:(id)sender; - (IBAction) writeDefaultsDisplayRotation:(id)sender; - (IBAction) writeDefaultsDisplayGap:(id)sender; - (IBAction) writeDefaultsHUDSettings:(id)sender; - (IBAction) writeDefaultsDisplayVideoSettings:(id)sender; - (IBAction) writeDefaults3DRenderingSettings:(id)sender; - (IBAction) writeDefaultsEmulationSettings:(id)sender; - (IBAction) writeDefaultsSlot1Settings:(id)sender; - (IBAction) writeDefaultsSoundSettings:(id)sender; - (IBAction) closeSheet:(id)sender; - (void) cmdUpdateDSController:(NSValue *)cmdAttrValue; - (void) cmdLoadEmuSaveStateSlot:(NSValue *)cmdAttrValue; - (void) cmdSaveEmuSaveStateSlot:(NSValue *)cmdAttrValue; - (void) cmdCopyScreen:(NSValue *)cmdAttrValue; - (void) cmdRotateDisplayRelative:(NSValue *)cmdAttrValue; - (void) cmdHoldToggleSpeedScalar:(NSValue *)cmdAttrValue; - (void) cmdToggleSpeedLimiter:(NSValue *)cmdAttrValue; - (void) cmdToggleAutoFrameSkip:(NSValue *)cmdAttrValue; - (void) cmdToggleCheats:(NSValue *)cmdAttrValue; - (void) cmdToggleExecutePause:(NSValue *)cmdAttrValue; - (void) cmdReset:(NSValue *)cmdAttrValue; - (void) cmdToggleGPUState:(NSValue *)cmdAttrValue; - (BOOL) handleLoadRom:(NSURL *)fileURL; - (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL; - (BOOL) loadRom:(NSURL *)romURL; - (void) loadRomDidFinish:(NSNotification *)aNotification; - (BOOL) unloadRom; - (void) addOutputToCore:(CocoaDSOutput *)theOutput; - (void) removeOutputFromCore:(CocoaDSOutput *)theOutput; - (void) executeCore; - (void) pauseCore; - (void) restoreCoreState; - (AudioSampleBlockGenerator *) selectedAudioFileGenerator; - (void) setSelectedAudioFileGenerator:(AudioSampleBlockGenerator *)theGenerator; - (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheetTerminate:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndChooseSlot1R4Directory:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (void) updateAllWindowTitles; - (void) setupUserDefaults; @end desmume-0.9.9/src/cocoa/userinterface/preferencesWindowDelegate.h0000644000175000017500000001137212140261514025731 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #import "inputPrefsView.h" @class CocoaVideoFilter; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface PreferencesWindowDelegate : NSObject #else @interface PreferencesWindowDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSWindow *firmwareConfigSheet; NSObjectController *cdsCoreController; NSObjectController *emuController; NSObjectController *prefWindowController; NSObjectController *cheatWindowController; NSArrayController *cheatDatabaseController; NSView *viewGeneral; InputPrefsView *viewInput; NSView *viewDisplay; NSView *viewSound; NSView *viewEmulation; NSPopUpButton *displayRotationMenu; NSMenuItem *displayRotationMenuCustomItem; NSTextField *displayRotationField; NSImage *iconVolumeFull; NSImage *iconVolumeTwoThird; NSImage *iconVolumeOneThird; NSImage *iconVolumeMute; NSPopUpButton *spuSyncMethodMenu; NSImageView *previewImageView; CocoaVideoFilter *videoFilter; CocoaVideoFilter *bilinearVideoFilter; NSMutableDictionary *bindings; } @property (readonly) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSWindow *firmwareConfigSheet; @property (readonly) IBOutlet NSObjectController *cdsCoreController; @property (readonly) IBOutlet NSObjectController *emuController; @property (readonly) IBOutlet NSObjectController *prefWindowController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSArrayController *cheatDatabaseController; @property (readonly) IBOutlet NSView *viewGeneral; @property (readonly) IBOutlet InputPrefsView *viewInput; @property (readonly) IBOutlet NSView *viewDisplay; @property (readonly) IBOutlet NSView *viewSound; @property (readonly) IBOutlet NSView *viewEmulation; @property (readonly) IBOutlet NSPopUpButton *displayRotationMenu; @property (readonly) IBOutlet NSMenuItem *displayRotationMenuCustomItem; @property (readonly) IBOutlet NSTextField *displayRotationField; @property (readonly) IBOutlet NSPopUpButton *spuSyncMethodMenu; @property (readonly) IBOutlet NSImageView *previewImageView; @property (readonly) NSMutableDictionary *bindings; - (IBAction) showGeneralView:(id)sender; - (IBAction) showInputView:(id)sender; - (IBAction) showDisplayView:(id)sender; - (IBAction) showSoundView:(id)sender; - (IBAction) showEmulationView:(id)sender; - (IBAction) selectAutoloadRomOption:(id)sender; - (IBAction) chooseAdvansceneDatabase:(id)sender; - (void) chooseAdvansceneDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) chooseRomForAutoload:(id)sender; - (void) chooseRomForAutoloadDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) chooseCheatDatabase:(id)sender; - (void) chooseCheatDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) selectDisplayMode:(id)sender; - (IBAction) selectDisplaySize:(id)sender; - (IBAction) selectDisplayRotation:(id)sender; - (void) updateDisplayRotationMenu:(double)displayRotation; - (IBAction) setUseBilinear:(id)sender; - (IBAction) selectVideoFilterType:(id)sender; - (IBAction) updateVolumeIcon:(id)sender; - (IBAction) selectSPUSyncMode:(id)sender; - (IBAction) selectSPUSyncMethod:(id)sender; - (IBAction) chooseARM9BiosImage:(id)sender; - (IBAction) chooseARM7BiosImage:(id)sender; - (IBAction) chooseFirmwareImage:(id)sender; - (void) chooseArm9BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (void) chooseArm7BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (void) chooseFirmwareImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction) configureInternalFirmware:(id)sender; - (IBAction) closeFirmwareConfigSheet:(id)sender; - (void) didEndFirmwareConfigSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) switchContentView:(NSView *)theView; @end desmume-0.9.9/src/cocoa/userinterface/appDelegate_legacy.h0000644000175000017500000000375512140261514024352 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif @class NintendoDS; @class InputHandler; @class VideoOutputWindow; @compatibility_alias CocoaDSCore NintendoDS; @compatibility_alias CocoaDSRom NintendoDS; #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 @interface AppDelegate : NSObject #else @interface AppDelegate : NSObject #endif { IBOutlet NSWindow *mainWindow; IBOutlet NSObjectController *aboutWindowController; IBOutlet NSObjectController *emuWindowController; IBOutlet NSObjectController *cdsCoreController; IBOutlet NSObjectController *romInfoPanelController; IBOutlet NSTextView *readMeTextView; IBOutlet NSMenu *mLoadStateSlot; IBOutlet NSMenu *mSaveStateSlot; InputHandler *keyboardHandler; } // Tools Menu - (IBAction) showSupportFolderInFinder:(id)sender; // Help Menu - (IBAction) launchWebsite:(id)sender; - (IBAction) launchForums:(id)sender; - (IBAction) bugReport:(id)sender; - (void) setupSlotMenuItems; - (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber; @end #ifdef __cplusplus extern "C" { #endif void* createThread_gdb(void (*thread_function)( void *data),void *thread_data); void joinThread_gdb(void *thread_handle); #ifdef __cplusplus } #endif desmume-0.9.9/src/cocoa/userinterface/DisplayWindowController.mm0000644000175000017500000016020212140261514025625 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "DisplayWindowController.h" #import "EmuControllerDelegate.h" #import "InputManager.h" #import "cocoa_file.h" #import "cocoa_input.h" #import "cocoa_globals.h" #import "cocoa_videofilter.h" #import "cocoa_util.h" #include #include #include // VERTEX SHADER FOR DISPLAY OUTPUT static const char *vertexProgram_100 = {"\ attribute vec2 inPosition; \n\ attribute vec2 inTexCoord0; \n\ \n\ uniform vec2 viewSize; \n\ uniform float scalar; \n\ uniform float angleDegrees; \n\ \n\ varying vec2 vtxTexCoord; \n\ \n\ void main() \n\ { \n\ float angleRadians = radians(angleDegrees); \n\ \n\ mat2 projection = mat2( vec2(2.0/viewSize.x, 0.0), \n\ vec2( 0.0, 2.0/viewSize.y)); \n\ \n\ mat2 rotation = mat2( vec2(cos(angleRadians), -sin(angleRadians)), \n\ vec2(sin(angleRadians), cos(angleRadians))); \n\ \n\ mat2 scale = mat2( vec2(scalar, 0.0), \n\ vec2( 0.0, scalar)); \n\ \n\ vtxTexCoord = inTexCoord0; \n\ gl_Position = vec4(projection * rotation * scale * inPosition, 1.0, 1.0); \n\ } \n\ "}; // FRAGMENT SHADER FOR DISPLAY OUTPUT static const char *fragmentProgram_100 = {"\ varying vec2 vtxTexCoord; \n\ uniform sampler2D tex; \n\ \n\ void main() \n\ { \n\ gl_FragColor = texture2D(tex, vtxTexCoord); \n\ } \n\ "}; enum OGLVertexAttributeID { OGLVertexAttributeID_Position = 0, OGLVertexAttributeID_TexCoord0 = 8 }; @implementation DisplayWindowController @synthesize emuControl; @synthesize cdsVideoOutput; @synthesize view; @synthesize saveScreenshotPanelAccessoryView; @dynamic normalSize; @dynamic displayScale; @dynamic displayRotation; @dynamic useBilinearOutput; @dynamic useVerticalSync; @dynamic displayMode; @dynamic displayOrientation; @dynamic displayOrder; @dynamic displayGap; @dynamic videoFilterType; @synthesize screenshotFileFormat; @dynamic isMinSizeNormal; @dynamic isShowingStatusBar; - (id)initWithWindowNibName:(NSString *)windowNibName emuControlDelegate:(EmuControllerDelegate *)theEmuController { self = [super initWithWindowNibName:windowNibName]; if (self == nil) { return self; } emuControl = [theEmuController retain]; cdsVideoOutput = nil; spinlockNormalSize = OS_SPINLOCK_INIT; spinlockScale = OS_SPINLOCK_INIT; spinlockRotation = OS_SPINLOCK_INIT; spinlockUseBilinearOutput = OS_SPINLOCK_INIT; spinlockUseVerticalSync = OS_SPINLOCK_INIT; spinlockDisplayMode = OS_SPINLOCK_INIT; spinlockDisplayOrientation = OS_SPINLOCK_INIT; spinlockDisplayOrder = OS_SPINLOCK_INIT; spinlockDisplayGap = OS_SPINLOCK_INIT; spinlockVideoFilterType = OS_SPINLOCK_INIT; screenshotFileFormat = NSTIFFFileType; // These need to be initialized first since there are dependencies on these. _displayGap = 0.0; _displayMode = DS_DISPLAY_TYPE_COMBO; _displayOrientation = DS_DISPLAY_ORIENTATION_VERTICAL; _minDisplayViewSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*_displayGap)); _isMinSizeNormal = YES; _statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; // Setup default values per user preferences. [self setupUserDefaults]; [[self window] setTitle:(NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveScreenshotAsFinish:) name:@"org.desmume.DeSmuME.requestScreenshotDidFinish" object:nil]; return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [self setEmuControl:nil]; [super dealloc]; } #pragma mark Dynamic Property Methods - (NSSize) normalSize { OSSpinLockLock(&spinlockNormalSize); const NSSize theSize = _normalSize; OSSpinLockUnlock(&spinlockNormalSize); return theSize; } - (void) setDisplayScale:(double)s { // Resize the window when displayScale changes. // No need to set the view's scale here since window resizing will implicitly change it. const double constrainedScale = [self resizeWithTransform:[self normalSize] scalar:s rotation:[self displayRotation]]; OSSpinLockLock(&spinlockScale); _displayScale = constrainedScale; OSSpinLockUnlock(&spinlockScale); DisplayOutputTransformData transformData = { constrainedScale, [self displayRotation], 0.0, 0.0, 0.0 }; [CocoaDSUtil messageSendOneWayWithData:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_TRANSFORM_VIEW data:[NSData dataWithBytes:&transformData length:sizeof(DisplayOutputTransformData)]]; } - (double) displayScale { OSSpinLockLock(&spinlockScale); const double s = _displayScale; OSSpinLockUnlock(&spinlockScale); return s; } - (void) setDisplayRotation:(double)angleDegrees { double newAngleDegrees = fmod(angleDegrees, 360.0); if (newAngleDegrees < 0.0) { newAngleDegrees = 360.0 + newAngleDegrees; } if (newAngleDegrees == 360.0) { newAngleDegrees = 0.0; } OSSpinLockLock(&spinlockRotation); _displayRotation = newAngleDegrees; OSSpinLockUnlock(&spinlockRotation); NSWindow *theWindow = [self window]; // Set the minimum content size for the window, since this will change based on rotation. CGSize minContentSize = GetTransformedBounds(_minDisplayViewSize.width, _minDisplayViewSize.height, 1.0, CLOCKWISE_DEGREES(newAngleDegrees)); minContentSize.height += _statusBarHeight; [theWindow setContentMinSize:NSMakeSize(minContentSize.width, minContentSize.height)]; // Resize the window. const NSSize oldBounds = [theWindow frame].size; const double constrainedScale = [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:newAngleDegrees]; const NSSize newBounds = [theWindow frame].size; OSSpinLockLock(&spinlockScale); _displayScale = constrainedScale; OSSpinLockUnlock(&spinlockScale); // If the window size didn't change, it is possible that the old and new rotation angles // are 180 degrees offset from each other. In this case, we'll need to force the // display view to update itself. if (oldBounds.width == newBounds.width && oldBounds.height == newBounds.height) { [view setNeedsDisplay:YES]; } DisplayOutputTransformData transformData = { constrainedScale, angleDegrees, 0.0, 0.0, 0.0 }; [CocoaDSUtil messageSendOneWayWithData:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_TRANSFORM_VIEW data:[NSData dataWithBytes:&transformData length:sizeof(DisplayOutputTransformData)]]; } - (double) displayRotation { OSSpinLockLock(&spinlockRotation); const double angleDegrees = _displayRotation; OSSpinLockUnlock(&spinlockRotation); return angleDegrees; } - (void) setUseBilinearOutput:(BOOL)theState { OSSpinLockLock(&spinlockUseBilinearOutput); _useBilinearOutput = theState; OSSpinLockUnlock(&spinlockUseBilinearOutput); [CocoaDSUtil messageSendOneWayWithBool:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_BILINEAR_OUTPUT boolValue:theState]; } - (BOOL) useBilinearOutput { OSSpinLockLock(&spinlockUseBilinearOutput); const BOOL theState = _useBilinearOutput; OSSpinLockUnlock(&spinlockUseBilinearOutput); return theState; } - (void) setUseVerticalSync:(BOOL)theState { OSSpinLockLock(&spinlockUseVerticalSync); _useVerticalSync = theState; OSSpinLockUnlock(&spinlockUseVerticalSync); [CocoaDSUtil messageSendOneWayWithBool:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_VERTICAL_SYNC boolValue:theState]; } - (BOOL) useVerticalSync { OSSpinLockLock(&spinlockUseVerticalSync); const BOOL theState = _useVerticalSync; OSSpinLockUnlock(&spinlockUseVerticalSync); return theState; } - (void) setDisplayMode:(NSInteger)displayModeID { NSSize newDisplaySize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); NSString *modeString = @"Unknown"; switch (displayModeID) { case DS_DISPLAY_TYPE_MAIN: modeString = NSSTRING_DISPLAYMODE_MAIN; break; case DS_DISPLAY_TYPE_TOUCH: modeString = NSSTRING_DISPLAYMODE_TOUCH; break; case DS_DISPLAY_TYPE_COMBO: { const double gapScalar = [self displayGap]; modeString = NSSTRING_DISPLAYMODE_COMBO; if ([self displayOrientation] == DS_DISPLAY_ORIENTATION_VERTICAL) { newDisplaySize.height = newDisplaySize.height * 2.0 + (DS_DISPLAY_GAP * gapScalar); } else { newDisplaySize.width = newDisplaySize.width * 2.0 + (DS_DISPLAY_GAP * gapScalar); } break; } default: break; } OSSpinLockLock(&spinlockDisplayMode); const NSInteger oldMode = _displayMode; _displayMode = displayModeID; OSSpinLockUnlock(&spinlockDisplayMode); OSSpinLockLock(&spinlockNormalSize); _normalSize = newDisplaySize; OSSpinLockUnlock(&spinlockNormalSize); [self setIsMinSizeNormal:[self isMinSizeNormal]]; [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; [CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_TYPE integerValue:displayModeID]; // If the display mode swaps between Main Only and Touch Only, the view will not resize to implicitly // redraw the view. So when swapping between these two display modes, explicitly tell the view to redraw. if ( (oldMode == DS_DISPLAY_TYPE_MAIN && displayModeID == DS_DISPLAY_TYPE_TOUCH) || (oldMode == DS_DISPLAY_TYPE_TOUCH && displayModeID == DS_DISPLAY_TYPE_MAIN) ) { [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_REDRAW_VIEW]; } } - (NSInteger) displayMode { OSSpinLockLock(&spinlockDisplayMode); const NSInteger displayModeID = _displayMode; OSSpinLockUnlock(&spinlockDisplayMode); return displayModeID; } - (void) setDisplayOrientation:(NSInteger)theOrientation { OSSpinLockLock(&spinlockDisplayOrientation); _displayOrientation = theOrientation; OSSpinLockUnlock(&spinlockDisplayOrientation); if ([self displayMode] == DS_DISPLAY_TYPE_COMBO) { const double gapScalar = [self displayGap]; NSSize newDisplaySize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); if (theOrientation == DS_DISPLAY_ORIENTATION_VERTICAL) { newDisplaySize.height = newDisplaySize.height * 2.0 + (DS_DISPLAY_GAP * gapScalar); } else { newDisplaySize.width = newDisplaySize.width * 2.0 + (DS_DISPLAY_GAP * gapScalar); } OSSpinLockLock(&spinlockNormalSize); _normalSize = newDisplaySize; OSSpinLockUnlock(&spinlockNormalSize); [self setIsMinSizeNormal:[self isMinSizeNormal]]; [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; } [CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_ORIENTATION integerValue:theOrientation]; } - (NSInteger) displayOrientation { OSSpinLockLock(&spinlockDisplayOrientation); const NSInteger theOrientation = _displayOrientation; OSSpinLockUnlock(&spinlockDisplayOrientation); return theOrientation; } - (void) setDisplayOrder:(NSInteger)theOrder { OSSpinLockLock(&spinlockDisplayOrder); _displayOrder = theOrder; OSSpinLockUnlock(&spinlockDisplayOrder); [CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_ORDER integerValue:theOrder]; } - (NSInteger) displayOrder { OSSpinLockLock(&spinlockDisplayOrder); const NSInteger theOrder = _displayOrder; OSSpinLockUnlock(&spinlockDisplayOrder); return theOrder; } - (void) setDisplayGap:(double)gapScalar { OSSpinLockLock(&spinlockDisplayGap); _displayGap = gapScalar; OSSpinLockUnlock(&spinlockDisplayGap); if ([self displayMode] == DS_DISPLAY_TYPE_COMBO) { NSSize newDisplaySize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); if ([self displayOrientation] == DS_DISPLAY_ORIENTATION_VERTICAL) { newDisplaySize.height = newDisplaySize.height * 2.0 + (DS_DISPLAY_GAP * gapScalar); } else { newDisplaySize.width = newDisplaySize.width * 2.0 + (DS_DISPLAY_GAP * gapScalar); } OSSpinLockLock(&spinlockNormalSize); _normalSize = newDisplaySize; OSSpinLockUnlock(&spinlockNormalSize); [self setIsMinSizeNormal:[self isMinSizeNormal]]; [self resizeWithTransform:[self normalSize] scalar:[self displayScale] rotation:[self displayRotation]]; } [CocoaDSUtil messageSendOneWayWithFloat:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_DISPLAY_GAP floatValue:(float)gapScalar]; } - (double) displayGap { OSSpinLockLock(&spinlockDisplayGap); const double gapScalar = _displayGap; OSSpinLockUnlock(&spinlockDisplayGap); return gapScalar; } - (void) setVideoFilterType:(NSInteger)typeID { OSSpinLockLock(&spinlockVideoFilterType); _videoFilterType = typeID; OSSpinLockUnlock(&spinlockVideoFilterType); [CocoaDSUtil messageSendOneWayWithInteger:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_VIDEO_FILTER integerValue:typeID]; } - (NSInteger) videoFilterType { OSSpinLockLock(&spinlockVideoFilterType); const NSInteger typeID = _videoFilterType; OSSpinLockUnlock(&spinlockVideoFilterType); return typeID; } - (void) setIsMinSizeNormal:(BOOL)theState { OSSpinLockLock(&spinlockDisplayGap); const double gapScalar = _displayGap; OSSpinLockUnlock(&spinlockDisplayGap); _isMinSizeNormal = theState; if ([self displayMode] == DS_DISPLAY_TYPE_COMBO) { if ([self displayOrientation] == DS_DISPLAY_ORIENTATION_HORIZONTAL) { _minDisplayViewSize.width = GPU_DISPLAY_WIDTH*2.0 + (DS_DISPLAY_GAP*gapScalar); _minDisplayViewSize.height = GPU_DISPLAY_HEIGHT; } else { _minDisplayViewSize.width = GPU_DISPLAY_WIDTH; _minDisplayViewSize.height = GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*gapScalar); } } else { _minDisplayViewSize.width = GPU_DISPLAY_WIDTH; _minDisplayViewSize.height = GPU_DISPLAY_HEIGHT; } if (!_isMinSizeNormal) { _minDisplayViewSize.width /= 4; _minDisplayViewSize.height /= 4; } // Set the minimum content size, keeping the display rotation in mind. CGSize transformedMinSize = GetTransformedBounds(_minDisplayViewSize.width, _minDisplayViewSize.height, 1.0, CLOCKWISE_DEGREES([self displayRotation])); transformedMinSize.height += _statusBarHeight; [[self window] setContentMinSize:NSMakeSize(transformedMinSize.width, transformedMinSize.height)]; } - (BOOL) isMinSizeNormal { return _isMinSizeNormal; } - (void) setIsShowingStatusBar:(BOOL)showStatusBar { NSRect frameRect = [[self window] frame]; if (showStatusBar) { _statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; frameRect.size.height += WINDOW_STATUS_BAR_HEIGHT; NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; if (frameRect.size.height > screenFrame.size.height) { NSRect windowContentRect = [[[self window] contentView] bounds]; double widthToHeightRatio = windowContentRect.size.width / windowContentRect.size.height; windowContentRect.size.height -= frameRect.size.height - screenFrame.size.height; windowContentRect.size.width = windowContentRect.size.height * widthToHeightRatio; frameRect.size.height = screenFrame.size.height; frameRect.size.width = windowContentRect.size.width; } else { frameRect.origin.y -= WINDOW_STATUS_BAR_HEIGHT; } } else { _statusBarHeight = 0; frameRect.origin.y += WINDOW_STATUS_BAR_HEIGHT; frameRect.size.height -= WINDOW_STATUS_BAR_HEIGHT; } [[NSUserDefaults standardUserDefaults] setBool:showStatusBar forKey:@"DisplayView_ShowStatusBar"]; [[self window] setFrame:frameRect display:YES animate:NO]; } - (BOOL) isShowingStatusBar { return !(_statusBarHeight == 0); } #pragma mark Class Methods - (void) setupUserDefaults { // Set the display window per user preferences. [self setIsShowingStatusBar:[[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_ShowStatusBar"]]; // Set the display settings per user preferences. [self setDisplayGap:([[NSUserDefaults standardUserDefaults] doubleForKey:@"DisplayViewCombo_Gap"] / 100.0)]; [self setDisplayMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_Mode"]]; [self setDisplayOrientation:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayViewCombo_Orientation"]]; [self setDisplayOrder:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayViewCombo_Order"]]; [self setDisplayScale:([[NSUserDefaults standardUserDefaults] doubleForKey:@"DisplayView_Size"] / 100.0)]; [self setDisplayRotation:[[NSUserDefaults standardUserDefaults] doubleForKey:@"DisplayView_Rotation"]]; [self setVideoFilterType:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_VideoFilter"]]; [self setUseBilinearOutput:[[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseBilinearOutput"]]; [self setUseVerticalSync:[[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseVerticalSync"]]; } - (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees { NSWindow *theWindow = [self window]; // Convert angle to clockwise-direction degrees. angleDegrees = CLOCKWISE_DEGREES(angleDegrees); // Get the maximum scalar size within drawBounds. Constrain scalar to maxScalar if necessary. const CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, angleDegrees); const double maxScalar = [self maxScalarForContentBoundsWidth:checkSize.width height:checkSize.height]; if (scalar > maxScalar) { scalar = maxScalar; } // Get the new bounds for the window's content view based on the transformed draw bounds. const CGSize transformedBounds = GetTransformedBounds(normalBounds.width, normalBounds.height, scalar, angleDegrees); // Get the center of the content view in screen coordinates. const NSRect windowContentRect = [[theWindow contentView] bounds]; const double translationX = (windowContentRect.size.width - transformedBounds.width) / 2.0; const double translationY = ((windowContentRect.size.height - _statusBarHeight) - transformedBounds.height) / 2.0; // Resize the window. const NSRect windowFrame = [theWindow frame]; const NSRect newFrame = [theWindow frameRectForContentRect:NSMakeRect(windowFrame.origin.x + translationX, windowFrame.origin.y + translationY, transformedBounds.width, transformedBounds.height + _statusBarHeight)]; [theWindow setFrame:newFrame display:YES animate:NO]; // Return the actual scale used for the view (may be constrained). return scalar; } - (double) maxScalarForContentBoundsWidth:(double)contentBoundsWidth height:(double)contentBoundsHeight { // Determine the maximum scale based on the visible screen size (which // doesn't include the menu bar or dock). const NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; const NSRect windowFrame = [[self window] frameRectForContentRect:NSMakeRect(0.0, 0.0, contentBoundsWidth, contentBoundsHeight + _statusBarHeight)]; const NSSize visibleScreenBounds = { (screenFrame.size.width - (windowFrame.size.width - contentBoundsWidth)), (screenFrame.size.height - (windowFrame.size.height - contentBoundsHeight)) }; return GetMaxScalarInBounds(contentBoundsWidth, contentBoundsHeight, visibleScreenBounds.width, visibleScreenBounds.height); } - (void) saveScreenshotAsFinish:(NSNotification *)aNotification { NSURL *fileURL = (NSURL *)[[aNotification userInfo] valueForKey:@"fileURL"]; NSBitmapImageFileType fileType = (NSBitmapImageFileType)[(NSNumber *)[[aNotification userInfo] valueForKey:@"fileType"] integerValue]; NSImage *screenshotImage = (NSImage *)[[aNotification userInfo] valueForKey:@"screenshotImage"]; const BOOL fileSaved = [CocoaDSFile saveScreenshot:fileURL bitmapData:[[screenshotImage representations] objectAtIndex:0] fileType:fileType]; if (!fileSaved) { [CocoaDSUtil quickDialogUsingTitle:NSSTRING_ERROR_TITLE_LEGACY message:NSSTRING_ERROR_SCREENSHOT_FAILED_LEGACY]; } [emuControl restoreCoreState]; } #pragma mark IBActions - (IBAction) copy:(id)sender { [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_COPY_TO_PASTEBOARD]; } - (IBAction) changeVolume:(id)sender { [emuControl changeVolume:sender]; } - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender { NSWindow *theWindow = [self window]; if ([self isMinSizeNormal]) { [self setIsMinSizeNormal:NO]; } else { [self setIsMinSizeNormal:YES]; // Set the minimum content size, keeping the display rotation in mind. CGSize transformedMinSize = GetTransformedBounds(_minDisplayViewSize.width, _minDisplayViewSize.height, 1.0, CLOCKWISE_DEGREES([self displayRotation])); transformedMinSize.height += _statusBarHeight; // Resize the window if it's smaller than the minimum content size. NSRect windowContentRect = [theWindow contentRectForFrameRect:[theWindow frame]]; if (windowContentRect.size.width < transformedMinSize.width || windowContentRect.size.height < transformedMinSize.height) { // Prepare to resize. NSRect oldFrameRect = [theWindow frame]; windowContentRect.size = NSMakeSize(transformedMinSize.width, transformedMinSize.height); NSRect newFrameRect = [theWindow frameRectForContentRect:windowContentRect]; // Keep the window centered when expanding the size. newFrameRect.origin.x = oldFrameRect.origin.x - ((newFrameRect.size.width - oldFrameRect.size.width) / 2); newFrameRect.origin.y = oldFrameRect.origin.y - ((newFrameRect.size.height - oldFrameRect.size.height) / 2); // Set the window size. [theWindow setFrame:newFrameRect display:YES animate:NO]; } } } - (IBAction) toggleStatusBar:(id)sender { [self setIsShowingStatusBar:([self isShowingStatusBar]) ? NO : YES]; } - (IBAction) toggleExecutePause:(id)sender { [emuControl toggleExecutePause:sender]; } - (IBAction) reset:(id)sender { [emuControl reset:sender]; } - (IBAction) changeCoreSpeed:(id)sender { [emuControl changeCoreSpeed:sender]; } - (IBAction) openRom:(id)sender { [emuControl openRom:sender]; } - (IBAction) changeRotationRelative:(id)sender { const double angleDegrees = [self displayRotation] + (double)[CocoaDSUtil getIBActionSenderTag:sender]; [self setDisplayRotation:angleDegrees]; } - (IBAction) saveScreenshotAs:(id)sender { [emuControl pauseCore]; NSSavePanel *panel = [NSSavePanel savePanel]; [panel setCanCreateDirectories:YES]; [panel setTitle:NSSTRING_TITLE_SAVE_SCREENSHOT_PANEL]; [panel setAccessoryView:saveScreenshotPanelAccessoryView]; const NSInteger buttonClicked = [panel runModal]; if(buttonClicked == NSOKButton) { [view requestScreenshot:[panel URL] fileType:(NSBitmapImageFileType)[self screenshotFileFormat]]; } else { [emuControl restoreCoreState]; } } #pragma mark NSWindowDelegate Protocol - (void)windowDidLoad { cdsVideoOutput = [[CocoaDSDisplayVideo alloc] init]; [cdsVideoOutput setDelegate:view]; [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:cdsVideoOutput withObject:nil]; while ([cdsVideoOutput thread] == nil) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } [emuControl addOutputToCore:cdsVideoOutput]; } - (void)windowDidBecomeMain:(NSNotification *)notification { [emuControl setMainWindow:self]; [view setNextResponder:[self window]]; [[view inputManager] setHidInputTarget:view]; } - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize { // Get a content Rect so that we can make our comparison. // This will be based on the proposed frameSize. const NSRect frameRect = NSMakeRect(0.0f, 0.0f, frameSize.width, frameSize.height); const NSRect contentRect = [sender contentRectForFrameRect:frameRect]; // Find the maximum scalar we can use for the display view, bounded by the // content Rect. const NSSize normalBounds = [self normalSize]; const CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, [self displayRotation]); const NSSize contentBounds = NSMakeSize(contentRect.size.width, contentRect.size.height - _statusBarHeight); const double maxS = GetMaxScalarInBounds(checkSize.width, checkSize.height, contentBounds.width, contentBounds.height); // Make a new content Rect with our max scalar, and convert it back to a frame Rect. const NSRect finalContentRect = NSMakeRect(0.0f, 0.0f, checkSize.width * maxS, (checkSize.height * maxS) + _statusBarHeight); const NSRect finalFrameRect = [sender frameRectForContentRect:finalContentRect]; // Set the final size based on our new frame Rect. return finalFrameRect.size; } - (void)windowDidResize:(NSNotification *)notification { // Get the max scalar within the window's current content bounds. const NSSize normalBounds = [self normalSize]; const CGSize checkSize = GetTransformedBounds(normalBounds.width, normalBounds.height, 1.0, [self displayRotation]); NSSize contentBounds = [[[self window] contentView] bounds].size; contentBounds.height -= _statusBarHeight; const double maxS = GetMaxScalarInBounds(checkSize.width, checkSize.height, contentBounds.width, contentBounds.height); // Set the display view's properties. [self setDisplayScale:maxS]; // Resize the view. NSRect newContentFrame = [[[self window] contentView] bounds]; newContentFrame.origin.y = _statusBarHeight; newContentFrame.size.height -= _statusBarHeight; [view setFrame:newContentFrame]; } - (BOOL)windowShouldClose:(id)sender { BOOL shouldClose = YES; if ([[emuControl windowList] count] > 1) // If this isn't the last window, then just close it without doing anything else. { return shouldClose; } else if ([emuControl currentRom] != nil) // If a ROM is loaded, just close the ROM, but don't close the window. { [emuControl closeRom:nil]; shouldClose = NO; } else // If no ROM is loaded, close the window and terminate the application. { [NSApp terminate:sender]; } return shouldClose; } - (void)windowWillClose:(NSNotification *)notification { [emuControl removeOutputFromCore:[self cdsVideoOutput]]; [[self cdsVideoOutput] forceThreadExit]; [[self cdsVideoOutput] release]; [self setCdsVideoOutput:nil]; [[emuControl windowList] removeObject:self]; [emuControl updateAllWindowTitles]; } - (BOOL)validateToolbarItem:(NSToolbarItem *)theItem { BOOL enable = YES; const SEL theAction = [theItem action]; if (theAction == @selector(toggleExecutePause:)) { if (![emuControl masterExecuteFlag] || [emuControl currentRom] == nil || [emuControl isUserInterfaceBlockingExecution]) { enable = NO; } if ([emuControl executionState] == CORESTATE_PAUSE) { [theItem setLabel:NSSTRING_TITLE_EXECUTE_CONTROL]; [theItem setImage:[emuControl iconExecute]]; } else { [theItem setLabel:NSSTRING_TITLE_PAUSE_CONTROL]; [theItem setImage:[emuControl iconPause]]; } } else if (theAction == @selector(reset:)) { if ([emuControl currentRom] == nil || [emuControl isUserInterfaceBlockingExecution]) { enable = NO; } } else if (theAction == @selector(changeCoreSpeed:)) { NSInteger speedScalar = (NSInteger)([emuControl speedScalar] * 100.0); if (speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) { [theItem setLabel:NSSTRING_TITLE_SPEED_1X]; [theItem setTag:100]; [theItem setImage:[emuControl iconSpeedNormal]]; } else { [theItem setLabel:NSSTRING_TITLE_SPEED_2X]; [theItem setTag:200]; [theItem setImage:[emuControl iconSpeedDouble]]; } } else if (theAction == @selector(openRom:)) { if ([emuControl isRomLoading] || [emuControl isShowingSaveStateDialog]) { enable = NO; } } return enable; } @end #pragma mark - @implementation DisplayView @synthesize inputManager; @synthesize isHudEnabled; @synthesize isHudEditingModeEnabled; - (id)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:frameRect]; if (self == nil) { return self; } // Initialize the OpenGL context NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24, NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8, NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)0, NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)0, NSOpenGLPFADoubleBuffer, (NSOpenGLPixelFormatAttribute)0 }; NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; context = [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil]; [format release]; cglDisplayContext = (CGLContextObj)[context CGLContextObj]; CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); [self startupOpenGL]; CGLSetCurrentContext(prevContext); lastDisplayMode = DS_DISPLAY_TYPE_COMBO; currentDisplayOrientation = DS_DISPLAY_ORIENTATION_VERTICAL; currentGapScalar = 0.0f; glTexPixelFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV; UInt32 w = GetNearestPositivePOT((UInt32)GPU_DISPLAY_WIDTH); UInt32 h = GetNearestPositivePOT((UInt32)(GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*currentGapScalar))); glTexBack = (GLvoid *)calloc(w * h, sizeof(UInt16)); glTexBackSize = NSMakeSize(w, h); vtxBufferOffset = 0; inputManager = nil; return self; } - (void)dealloc { CGLContextObj prevContext = CGLGetCurrentContext(); CGLSetCurrentContext(cglDisplayContext); [self shutdownOpenGL]; CGLSetCurrentContext(prevContext); free(glTexBack); glTexBack = NULL; [self setInputManager:nil]; [context clearDrawable]; [context release]; [super dealloc]; } #pragma mark Class Methods - (void) startupOpenGL { [self updateDisplayVerticesUsingDisplayMode:lastDisplayMode orientation:currentDisplayOrientation gap:currentGapScalar]; [self updateTexCoordS:1.0f T:2.0f]; // Set up initial vertex elements vtxIndexBuffer[0] = 0; vtxIndexBuffer[1] = 1; vtxIndexBuffer[2] = 2; vtxIndexBuffer[3] = 2; vtxIndexBuffer[4] = 3; vtxIndexBuffer[5] = 0; vtxIndexBuffer[6] = 4; vtxIndexBuffer[7] = 5; vtxIndexBuffer[8] = 6; vtxIndexBuffer[9] = 6; vtxIndexBuffer[10] = 7; vtxIndexBuffer[11] = 4; // Check the OpenGL capabilities for this renderer const GLubyte *glExtString = glGetString(GL_EXTENSIONS); // Set up textures glGenTextures(1, &displayTexID); glBindTexture(GL_TEXTURE_2D, displayTexID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); // Set up shaders (but disable on PowerPC, since it doesn't seem to work there) #if defined(__i386__) || defined(__x86_64__) isShaderSupported = (gluCheckExtension((const GLubyte *)"GL_ARB_shader_objects", glExtString) && gluCheckExtension((const GLubyte *)"GL_ARB_vertex_shader", glExtString) && gluCheckExtension((const GLubyte *)"GL_ARB_fragment_shader", glExtString) && gluCheckExtension((const GLubyte *)"GL_ARB_vertex_program", glExtString) ); #else isShaderSupported = false; #endif if (isShaderSupported) { BOOL isShaderSetUp = [self setupShadersWithVertexProgram:vertexProgram_100 fragmentProgram:fragmentProgram_100]; if (isShaderSetUp) { glUseProgram(shaderProgram); uniformAngleDegrees = glGetUniformLocation(shaderProgram, "angleDegrees"); uniformScalar = glGetUniformLocation(shaderProgram, "scalar"); uniformViewSize = glGetUniformLocation(shaderProgram, "viewSize"); glUniform1f(uniformAngleDegrees, 0.0f); glUniform1f(uniformScalar, 1.0f); glUniform2f(uniformViewSize, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT*2.0 + (DS_DISPLAY_GAP*currentGapScalar)); } else { isShaderSupported = false; } } // Set up VBOs glGenBuffersARB(1, &vboVertexID); glGenBuffersARB(1, &vboTexCoordID); glGenBuffersARB(1, &vboElementID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLint) * (2 * 8), vtxBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * (2 * 8), texCoordBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLubyte) * 12, vtxIndexBuffer, GL_STATIC_DRAW_ARB); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // Set up VAO glGenVertexArraysAPPLE(1, &vaoMainStatesID); glBindVertexArrayAPPLE(vaoMainStatesID); if (isShaderSupported) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glVertexAttribPointer(OGLVertexAttributeID_Position, 2, GL_INT, GL_FALSE, 0, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID); glVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, 0, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID); glEnableVertexAttribArray(OGLVertexAttributeID_Position); glEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0); } else { glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glVertexPointer(2, GL_INT, 0, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID); glTexCoordPointer(2, GL_FLOAT, 0, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vboElementID); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } glBindVertexArrayAPPLE(0); // Render State Setup (common to both shaders and fixed-function pipeline) glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); glDisable(GL_DITHER); glDisable(GL_STENCIL_TEST); // Set up fixed-function pipeline render states. if (!isShaderSupported) { glDisable(GL_ALPHA_TEST); glDisable(GL_LIGHTING); glDisable(GL_FOG); glEnable(GL_TEXTURE_2D); } // Set up clear attributes glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); } - (void) shutdownOpenGL { glDeleteTextures(1, &displayTexID); glDeleteVertexArraysAPPLE(1, &vaoMainStatesID); glDeleteBuffersARB(1, &vboVertexID); glDeleteBuffersARB(1, &vboTexCoordID); glDeleteBuffersARB(1, &vboElementID); if (isShaderSupported) { glUseProgram(0); glDetachShader(shaderProgram, vertexShaderID); glDetachShader(shaderProgram, fragmentShaderID); glDeleteProgram(shaderProgram); glDeleteShader(vertexShaderID); glDeleteShader(fragmentShaderID); } } - (void) setupShaderIO { glBindAttribLocation(shaderProgram, OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(shaderProgram, OGLVertexAttributeID_TexCoord0, "inTexCoord0"); } - (BOOL) setupShadersWithVertexProgram:(const char *)vertShaderProgram fragmentProgram:(const char *)fragShaderProgram { BOOL result = NO; GLint shaderStatus = GL_TRUE; vertexShaderID = glCreateShader(GL_VERTEX_SHADER); if (vertexShaderID == 0) { NSLog(@"OpenGL Error - Failed to create vertex shader."); return result; } glShaderSource(vertexShaderID, 1, (const GLchar **)&vertShaderProgram, NULL); glCompileShader(vertexShaderID); glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &shaderStatus); if (shaderStatus == GL_FALSE) { glDeleteShader(vertexShaderID); NSLog(@"OpenGL Error - Failed to compile vertex shader."); return result; } fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); if (fragmentShaderID == 0) { glDeleteShader(vertexShaderID); NSLog(@"OpenGL Error - Failed to create fragment shader."); return result; } glShaderSource(fragmentShaderID, 1, (const GLchar **)&fragShaderProgram, NULL); glCompileShader(fragmentShaderID); glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &shaderStatus); if (shaderStatus == GL_FALSE) { glDeleteShader(vertexShaderID); glDeleteShader(fragmentShaderID); NSLog(@"OpenGL Error - Failed to compile fragment shader."); return result; } shaderProgram = glCreateProgram(); if (shaderProgram == 0) { glDeleteShader(vertexShaderID); glDeleteShader(fragmentShaderID); NSLog(@"OpenGL Error - Failed to create shader program."); return result; } glAttachShader(shaderProgram, vertexShaderID); glAttachShader(shaderProgram, fragmentShaderID); [self setupShaderIO]; glLinkProgram(shaderProgram); glGetProgramiv(shaderProgram, GL_LINK_STATUS, &shaderStatus); if (shaderStatus == GL_FALSE) { glDeleteProgram(shaderProgram); glDeleteShader(vertexShaderID); glDeleteShader(fragmentShaderID); NSLog(@"OpenGL Error - Failed to link shader program."); return result; } glValidateProgram(shaderProgram); result = YES; return result; } - (void) drawVideoFrame { CGLFlushDrawable(cglDisplayContext); } - (void) uploadVertices { glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVertexID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLint) * (2 * 8), vtxBuffer + vtxBufferOffset); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); } - (void) uploadTexCoords { glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTexCoordID); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(GLfloat) * (2 * 8), texCoordBuffer); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); } - (void) uploadDisplayTextures:(const GLvoid *)textureData displayMode:(const NSInteger)displayModeID width:(const GLsizei)texWidth height:(const GLsizei)texHeight { if (textureData == NULL) { return; } const GLint lineOffset = (displayModeID == DS_DISPLAY_TYPE_TOUCH) ? texHeight : 0; glBindTexture(GL_TEXTURE_2D, displayTexID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, lineOffset, texWidth, texHeight, GL_RGBA, glTexPixelFormat, textureData); glBindTexture(GL_TEXTURE_2D, 0); } - (void) renderDisplayUsingDisplayMode:(const NSInteger)displayModeID { // Enable vertex attributes glBindVertexArrayAPPLE(vaoMainStatesID); // Perform the render if (lastDisplayMode != displayModeID) { lastDisplayMode = displayModeID; [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation gap:currentGapScalar]; [self uploadVertices]; } const GLsizei vtxElementCount = (displayModeID == DS_DISPLAY_TYPE_COMBO) ? 12 : 6; const GLubyte *elementPointer = !(displayModeID == DS_DISPLAY_TYPE_TOUCH) ? 0 : (GLubyte *)(vtxElementCount * sizeof(GLubyte)); glClear(GL_COLOR_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D, displayTexID); glDrawElements(GL_TRIANGLES, vtxElementCount, GL_UNSIGNED_BYTE, elementPointer); glBindTexture(GL_TEXTURE_2D, 0); // Disable vertex attributes glBindVertexArrayAPPLE(0); } - (void) updateDisplayVerticesUsingDisplayMode:(const NSInteger)displayModeID orientation:(const NSInteger)displayOrientationID gap:(const GLfloat)gapScalar { const GLfloat w = GPU_DISPLAY_WIDTH; const GLfloat h = GPU_DISPLAY_HEIGHT; const GLfloat gap = DS_DISPLAY_GAP * gapScalar / 2.0; if (displayModeID == DS_DISPLAY_TYPE_COMBO) { // displayOrder == DS_DISPLAY_ORDER_MAIN_FIRST if (displayOrientationID == DS_DISPLAY_ORIENTATION_VERTICAL) { vtxBuffer[0] = -w/2; vtxBuffer[1] = h+gap; // Top display, top left vtxBuffer[2] = w/2; vtxBuffer[3] = h+gap; // Top display, top right vtxBuffer[4] = w/2; vtxBuffer[5] = gap; // Top display, bottom right vtxBuffer[6] = -w/2; vtxBuffer[7] = gap; // Top display, bottom left vtxBuffer[8] = -w/2; vtxBuffer[9] = -gap; // Bottom display, top left vtxBuffer[10] = w/2; vtxBuffer[11] = -gap; // Bottom display, top right vtxBuffer[12] = w/2; vtxBuffer[13] = -(h+gap); // Bottom display, bottom right vtxBuffer[14] = -w/2; vtxBuffer[15] = -(h+gap); // Bottom display, bottom left } else // displayOrientationID == DS_DISPLAY_ORIENTATION_HORIZONTAL { vtxBuffer[0] = -(w+gap); vtxBuffer[1] = h/2; // Left display, top left vtxBuffer[2] = -gap; vtxBuffer[3] = h/2; // Left display, top right vtxBuffer[4] = -gap; vtxBuffer[5] = -h/2; // Left display, bottom right vtxBuffer[6] = -(w+gap); vtxBuffer[7] = -h/2; // Left display, bottom left vtxBuffer[8] = gap; vtxBuffer[9] = h/2; // Right display, top left vtxBuffer[10] = w+gap; vtxBuffer[11] = h/2; // Right display, top right vtxBuffer[12] = w+gap; vtxBuffer[13] = -h/2; // Right display, bottom right vtxBuffer[14] = gap; vtxBuffer[15] = -h/2; // Right display, bottom left } // displayOrder == DS_DISPLAY_ORDER_TOUCH_FIRST memcpy(vtxBuffer + (2 * 8), vtxBuffer + (1 * 8), sizeof(GLint) * (1 * 8)); memcpy(vtxBuffer + (3 * 8), vtxBuffer + (0 * 8), sizeof(GLint) * (1 * 8)); } else // displayModeID == DS_DISPLAY_TYPE_MAIN || displayModeID == DS_DISPLAY_TYPE_TOUCH { vtxBuffer[0] = -w/2; vtxBuffer[1] = h/2; // First display, top left vtxBuffer[2] = w/2; vtxBuffer[3] = h/2; // First display, top right vtxBuffer[4] = w/2; vtxBuffer[5] = -h/2; // First display, bottom right vtxBuffer[6] = -w/2; vtxBuffer[7] = -h/2; // First display, bottom left memcpy(vtxBuffer + (1 * 8), vtxBuffer + (0 * 8), sizeof(GLint) * (1 * 8)); // Second display memcpy(vtxBuffer + (2 * 8), vtxBuffer + (0 * 8), sizeof(GLint) * (2 * 8)); // Second display } } - (void) updateTexCoordS:(GLfloat)s T:(GLfloat)t { texCoordBuffer[0] = 0.0f; texCoordBuffer[1] = 0.0f; texCoordBuffer[2] = s; texCoordBuffer[3] = 0.0f; texCoordBuffer[4] = s; texCoordBuffer[5] = t/2.0f; texCoordBuffer[6] = 0.0f; texCoordBuffer[7] = t/2.0f; texCoordBuffer[8] = 0.0f; texCoordBuffer[9] = t/2.0f; texCoordBuffer[10] = s; texCoordBuffer[11] = t/2.0f; texCoordBuffer[12] = s; texCoordBuffer[13] = t; texCoordBuffer[14] = 0.0f; texCoordBuffer[15] = t; } - (NSPoint) dsPointFromEvent:(NSEvent *)theEvent { // Convert the clicked location from window coordinates, to view coordinates, // and finally to DS touchscreen coordinates. NSPoint touchLoc = [theEvent locationInWindow]; touchLoc = [self convertPoint:touchLoc fromView:nil]; touchLoc = [self convertPointToDS:touchLoc]; return touchLoc; } - (NSPoint) convertPointToDS:(NSPoint)clickLoc { DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; double viewAngle = [windowController displayRotation]; if (viewAngle != 0.0) { viewAngle = CLOCKWISE_DEGREES(viewAngle); } const NSSize normalBounds = [windowController normalSize]; const NSSize transformBounds = [self bounds].size; CGPoint touchLoc = GetNormalPointFromTransformedPoint(clickLoc.x, clickLoc.y, normalBounds.width, normalBounds.height, transformBounds.width, transformBounds.height, [windowController displayScale], viewAngle); // Normalize the touch location to the DS. if ([windowController displayMode] == DS_DISPLAY_TYPE_COMBO) { const NSInteger theOrientation = [windowController displayOrientation]; const NSInteger theOrder = [windowController displayOrder]; const double gap = DS_DISPLAY_GAP * [windowController displayGap]; if (theOrientation == DS_DISPLAY_ORIENTATION_VERTICAL && theOrder == DS_DISPLAY_ORDER_TOUCH_FIRST) { touchLoc.y -= (GPU_DISPLAY_HEIGHT+gap); } else if (theOrientation == DS_DISPLAY_ORIENTATION_HORIZONTAL && theOrder == DS_DISPLAY_ORDER_MAIN_FIRST) { touchLoc.x -= (GPU_DISPLAY_WIDTH+gap); } } touchLoc.y = GPU_DISPLAY_HEIGHT - touchLoc.y; // Constrain the touch point to the DS dimensions. if (touchLoc.x < 0) { touchLoc.x = 0; } else if (touchLoc.x > (GPU_DISPLAY_WIDTH - 1)) { touchLoc.x = (GPU_DISPLAY_WIDTH - 1); } if (touchLoc.y < 0) { touchLoc.y = 0; } else if (touchLoc.y > (GPU_DISPLAY_HEIGHT - 1)) { touchLoc.y = (GPU_DISPLAY_HEIGHT - 1); } return NSMakePoint(touchLoc.x, touchLoc.y); } #pragma mark InputHIDManagerTarget Protocol - (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue { BOOL isHandled = NO; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; InputAttributesList inputList = InputManagerEncodeHIDQueue(hidQueue); char inputStr[INPUT_HANDLER_STRING_LENGTH*2]; memset(inputStr, '\0', INPUT_HANDLER_STRING_LENGTH*2); const size_t inputCount = inputList.size(); for (unsigned int i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = inputList[i]; if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON) { strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2); strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2); strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2); break; } } if (inputStr[0] != '\0' && inputStr[0] != ':') { [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]]; } CommandAttributesList cmdList = [inputManager generateCommandListUsingInputList:&inputList]; if (cmdList.empty()) { return isHandled; } [inputManager dispatchCommandList:&cmdList]; isHandled = YES; return isHandled; } - (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed { BOOL isHandled = NO; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; const InputAttributes inputAttr = InputManagerEncodeKeyboardInput([theEvent keyCode], keyPressed); if (keyPressed && [theEvent window] != nil) { char inputStr[INPUT_HANDLER_STRING_LENGTH*2]; strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2); strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2); strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2); [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]]; } isHandled = [inputManager dispatchCommandUsingInputAttributes:&inputAttr]; return isHandled; } - (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed { BOOL isHandled = NO; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; const NSInteger displayModeID = [windowController displayMode]; // Convert the clicked location from window coordinates, to view coordinates, // and finally to DS touchscreen coordinates. NSPoint touchLoc = NSMakePoint(-2.0, -2.0); if (displayModeID == DS_DISPLAY_TYPE_TOUCH || displayModeID == DS_DISPLAY_TYPE_COMBO) { touchLoc = [self dsPointFromEvent:theEvent]; } const InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([theEvent buttonNumber], touchLoc, buttonPressed); if (buttonPressed && [theEvent window] != nil) { static char inputStr[INPUT_HANDLER_STRING_LENGTH*2] = {0}; strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2); strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2); strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2); if (inputAttr.intCoordX >= 0) { static char inputCoordBuf[64] = {0}; snprintf(inputCoordBuf, 64, " X:%i Y:%i", (int)inputAttr.intCoordX, (int)inputAttr.intCoordY); strlcat(inputStr, inputCoordBuf, INPUT_HANDLER_STRING_LENGTH*2); } [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]]; } isHandled = [inputManager dispatchCommandUsingInputAttributes:&inputAttr]; return isHandled; } - (void) clearToBlack { DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_SET_VIEW_TO_BLACK]; } - (void) clearToWhite { DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_SET_VIEW_TO_WHITE]; } - (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType { NSString *fileURLString = [fileURL absoluteString]; NSData *fileURLStringData = [fileURLString dataUsingEncoding:NSUTF8StringEncoding]; NSData *bitmapImageFileTypeData = [[NSData alloc] initWithBytes:&fileType length:sizeof(NSBitmapImageFileType)]; NSArray *messageComponents = [[NSArray alloc] initWithObjects:fileURLStringData, bitmapImageFileTypeData, nil]; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; [CocoaDSUtil messageSendOneWayWithMessageComponents:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REQUEST_SCREENSHOT array:messageComponents]; [bitmapImageFileTypeData release]; [messageComponents release]; } #pragma mark NSView Methods - (BOOL)isOpaque { return YES; } - (void)lockFocus { [super lockFocus]; if ([context view] != self) { [context setView:self]; } } - (void)drawRect:(NSRect)dirtyRect { DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REDRAW_VIEW]; } - (void)setFrame:(NSRect)rect { NSRect oldFrame = [self frame]; [super setFrame:rect]; if (rect.size.width != oldFrame.size.width || rect.size.height != oldFrame.size.height) { [context update]; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; [CocoaDSUtil messageSendOneWayWithRect:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RESIZE_VIEW rect:rect]; [self setNeedsDisplay:YES]; } } #pragma mark NSResponder Methods - (void)keyDown:(NSEvent *)theEvent { BOOL isHandled = [self handleKeyPress:theEvent keyPressed:YES]; if (!isHandled) { [super keyDown:theEvent]; } } - (void)keyUp:(NSEvent *)theEvent { BOOL isHandled = [self handleKeyPress:theEvent keyPressed:NO]; if (!isHandled) { [super keyUp:theEvent]; } } - (void)mouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:YES]; if (!isHandled) { [super mouseDown:theEvent]; } } - (void)mouseDragged:(NSEvent *)theEvent { [self mouseDown:theEvent]; } - (void)mouseUp:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:NO]; if (!isHandled) { [super mouseUp:theEvent]; } } - (void)rightMouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:YES]; if (!isHandled) { [super rightMouseDown:theEvent]; } } - (void)rightMouseDragged:(NSEvent *)theEvent { [self rightMouseDown:theEvent]; } - (void)rightMouseUp:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:NO]; if (!isHandled) { [super rightMouseUp:theEvent]; } } - (void)otherMouseDown:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:YES]; if (!isHandled) { [super otherMouseDown:theEvent]; } } - (void)otherMouseDragged:(NSEvent *)theEvent { [self otherMouseDown:theEvent]; } - (void)otherMouseUp:(NSEvent *)theEvent { BOOL isHandled = [self handleMouseButton:theEvent buttonPressed:NO]; if (!isHandled) { [super otherMouseUp:theEvent]; } } - (BOOL)acceptsFirstResponder { return YES; } - (BOOL)becomeFirstResponder { return YES; } - (BOOL)resignFirstResponder { return YES; } #pragma mark CocoaDSDisplayVideoDelegate Protocol - (void)doInitVideoOutput:(NSDictionary *)properties { // No init needed, so do nothing. } - (void)doProcessVideoFrame:(const void *)videoFrameData displayMode:(const NSInteger)displayModeID width:(const NSInteger)frameWidth height:(const NSInteger)frameHeight { CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self uploadDisplayTextures:videoFrameData displayMode:displayModeID width:frameWidth height:frameHeight]; [self renderDisplayUsingDisplayMode:displayModeID]; [self drawVideoFrame]; CGLUnlockContext(cglDisplayContext); } - (void)doResizeView:(NSRect)rect { CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); glViewport(0, 0, rect.size.width, rect.size.height); if (isShaderSupported) { glUniform2f(uniformViewSize, rect.size.width, rect.size.height); } else { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-rect.size.width/2, -rect.size.width/2 + rect.size.width, -rect.size.height/2, -rect.size.height/2 + rect.size.height, -1.0, 1.0); } CGLUnlockContext(cglDisplayContext); } - (void)doTransformView:(const DisplayOutputTransformData *)transformData { const GLfloat angleDegrees = (GLfloat)transformData->rotation; const GLfloat s = (GLfloat)transformData->scale; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); if (isShaderSupported) { glUniform1f(uniformAngleDegrees, angleDegrees); glUniform1f(uniformScalar, s); } else { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(CLOCKWISE_DEGREES(angleDegrees), 0.0f, 0.0f, 1.0f); glScalef(s, s, 1.0f); } CGLUnlockContext(cglDisplayContext); } - (void)doRedraw { CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self renderDisplayUsingDisplayMode:lastDisplayMode]; [self drawVideoFrame]; CGLUnlockContext(cglDisplayContext); } - (void)doDisplayModeChanged:(NSInteger)displayModeID { lastDisplayMode = displayModeID; [self updateDisplayVerticesUsingDisplayMode:displayModeID orientation:currentDisplayOrientation gap:currentGapScalar]; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self uploadVertices]; CGLUnlockContext(cglDisplayContext); } - (void)doBilinearOutputChanged:(BOOL)useBilinear { const GLint textureFilter = useBilinear ? GL_LINEAR : GL_NEAREST; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); glBindTexture(GL_TEXTURE_2D, displayTexID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, textureFilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, textureFilter); glBindTexture(GL_TEXTURE_2D, 0); CGLUnlockContext(cglDisplayContext); } - (void) doDisplayOrientationChanged:(NSInteger)displayOrientationID { currentDisplayOrientation = displayOrientationID; [self updateDisplayVerticesUsingDisplayMode:lastDisplayMode orientation:displayOrientationID gap:currentGapScalar]; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self uploadVertices]; CGLUnlockContext(cglDisplayContext); } - (void) doDisplayOrderChanged:(NSInteger)displayOrderID { if (displayOrderID == DS_DISPLAY_ORDER_MAIN_FIRST) { vtxBufferOffset = 0; } else // displayOrder == DS_DISPLAY_ORDER_TOUCH_FIRST { vtxBufferOffset = (2 * 8); } CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self uploadVertices]; if (lastDisplayMode == DS_DISPLAY_TYPE_COMBO) { [self renderDisplayUsingDisplayMode:lastDisplayMode]; [self drawVideoFrame]; } CGLUnlockContext(cglDisplayContext); } - (void) doDisplayGapChanged:(float)displayGapScalar { currentGapScalar = (GLfloat)displayGapScalar; [self updateDisplayVerticesUsingDisplayMode:lastDisplayMode orientation:currentDisplayOrientation gap:(GLfloat)displayGapScalar]; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); [self uploadVertices]; CGLUnlockContext(cglDisplayContext); } - (void)doVerticalSyncChanged:(BOOL)useVerticalSync { const GLint swapInt = useVerticalSync ? 1 : 0; CGLSetParameter(cglDisplayContext, kCGLCPSwapInterval, &swapInt); } - (void)doVideoFilterChanged:(NSInteger)videoFilterTypeID frameSize:(NSSize)videoFilterDestSize { size_t colorDepth = sizeof(uint32_t); glTexPixelFormat = GL_UNSIGNED_INT_8_8_8_8_REV; if (videoFilterTypeID == VideoFilterTypeID_None) { colorDepth = sizeof(uint16_t); glTexPixelFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV; } if ([(DisplayWindowController *)[[self window] delegate] displayMode] != DS_DISPLAY_TYPE_COMBO) { videoFilterDestSize.height = (uint32_t)videoFilterDestSize.height * 2; } // Convert textures to Power-of-Two to support older GPUs // Example: Radeon X1600M on the 2006 MacBook Pro const uint32_t potW = GetNearestPositivePOT((uint32_t)videoFilterDestSize.width); const uint32_t potH = GetNearestPositivePOT((uint32_t)videoFilterDestSize.height); if (glTexBackSize.width != potW || glTexBackSize.height != potH) { glTexBackSize.width = potW; glTexBackSize.height = potH; free(glTexBack); glTexBack = (GLvoid *)calloc((size_t)potW * (size_t)potH, colorDepth); if (glTexBack == NULL) { return; } } const GLfloat s = (GLfloat)videoFilterDestSize.width / (GLfloat)potW; const GLfloat t = (GLfloat)videoFilterDestSize.height / (GLfloat)potH; [self updateTexCoordS:s T:t]; CGLLockContext(cglDisplayContext); CGLSetCurrentContext(cglDisplayContext); glBindTexture(GL_TEXTURE_2D, displayTexID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)potW, (GLsizei)potH, 0, GL_BGRA, glTexPixelFormat, glTexBack); glBindTexture(GL_TEXTURE_2D, 0); [self uploadTexCoords]; CGLUnlockContext(cglDisplayContext); } @end desmume-0.9.9/src/cocoa/userinterface/cheatWindowDelegate.h0000644000175000017500000001065412140261514024516 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import @class CocoaDSCheatItem; @class CocoaDSCheatManager; @class CocoaDSCheatSearch; @class CocoaDSCheatSearchParams; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface CheatWindowDelegate : NSObject #else @interface CheatWindowDelegate : NSObject #endif { NSObject *dummyObject; NSWindow *window; NSBox *cheatConfigBox; NSView *cheatSearchView; NSTableView *cheatListTable; NSTableView *cheatSearchListTable; NSArrayController *cheatListController; NSArrayController *cheatSearchListController; NSArrayController *cheatDatabaseController; NSObjectController *cheatWindowController; NSObjectController *cheatSelectedItemController; NSView *currentView; NSView *viewConfigureNoSelection; NSView *viewConfigureInternalCheat; NSView *viewConfigureActionReplayCheat; NSView *viewConfigureCodeBreakerCheat; NSView *currentSearchStyleView; NSView *viewSearchNoSelection; NSView *viewSearchExactValue; NSView *viewSearchComparativeStart; NSView *viewSearchComparativeContinue; NSSearchField *searchField; NSWindow *cheatDatabaseSheet; NSUInteger untitledCount; NSMutableDictionary *bindings; CocoaDSCheatItem *workingCheat; CocoaDSCheatManager *cdsCheats; CocoaDSCheatSearch *cdsCheatSearch; } @property (assign) IBOutlet NSObject *dummyObject; @property (readonly) IBOutlet NSWindow *window; @property (readonly) IBOutlet NSBox *cheatConfigBox; @property (readonly) IBOutlet NSView *cheatSearchView; @property (readonly) IBOutlet NSTableView *cheatListTable; @property (readonly) IBOutlet NSTableView *cheatSearchListTable; @property (readonly) IBOutlet NSArrayController *cheatListController; @property (readonly) IBOutlet NSArrayController *cheatSearchListController; @property (readonly) IBOutlet NSArrayController *cheatDatabaseController; @property (readonly) IBOutlet NSObjectController *cheatWindowController; @property (readonly) IBOutlet NSObjectController *cheatSelectedItemController; @property (readonly) IBOutlet NSView *viewConfigureNoSelection; @property (readonly) IBOutlet NSView *viewConfigureInternalCheat; @property (readonly) IBOutlet NSView *viewConfigureActionReplayCheat; @property (readonly) IBOutlet NSView *viewConfigureCodeBreakerCheat; @property (readonly) IBOutlet NSView *viewSearchNoSelection; @property (readonly) IBOutlet NSView *viewSearchExactValue; @property (readonly) IBOutlet NSView *viewSearchComparativeStart; @property (readonly) IBOutlet NSView *viewSearchComparativeContinue; @property (readonly) IBOutlet NSSearchField *searchField; @property (readonly) IBOutlet NSWindow *cheatDatabaseSheet; @property (assign) NSUInteger untitledCount; @property (readonly) NSMutableDictionary *bindings; @property (retain) CocoaDSCheatItem *workingCheat; @property (retain) CocoaDSCheatManager *cdsCheats; @property (readonly) CocoaDSCheatSearch *cdsCheatSearch; - (IBAction) addToList:(id)sender; - (IBAction) removeFromList:(id)sender; - (IBAction) viewDatabase:(id)sender; - (IBAction) setInternalCheatValue:(id)sender; - (IBAction) applyConfiguration:(id)sender; - (IBAction) selectCheatType:(id)sender; - (IBAction) selectCheatSearchStyle:(id)sender; - (IBAction) runExactValueSearch:(id)sender; - (IBAction) runComparativeSearch:(id)sender; - (void) searchDidFinish:(NSNotification *)aNotification; - (IBAction) resetSearch:(id)sender; - (void) setCheatConfigViewByType:(NSInteger)cheatTypeID; - (void) setCheatSearchViewByStyle:(NSInteger)searchStyleID; - (IBAction) selectAllCheatsInDatabase:(id)sender; - (IBAction) selectNoneCheatsInDatabase:(id)sender; - (void) addSelectedFromCheatDatabase; - (IBAction) closeCheatDatabaseSheet:(id)sender; - (void) didEndCheatDatabaseSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; @end desmume-0.9.9/src/cocoa/userinterface/InputManager.mm0000644000175000017500000020552112140261514023362 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "InputManager.h" #import "EmuControllerDelegate.h" #import "cocoa_globals.h" #import "cocoa_input.h" #import "cocoa_util.h" #include /* Get the symbols for UpdateSystemActivity(). For some reason, in Mac OS v10.5 and earlier, UpdateSystemActivity() is not defined for 64-bit, even though it does work on 64-bit systems. So we're going to copy the symbols from OSServices/Power.h so that we can use them. This solution is better than making an absolute path to the Power.h file, since we can't assume that the header file will always be in the same location. Note that this isn't a problem on 32-bit, or if the target SDK is Mac OS v10.6 or later. */ #if !__LP64__ || MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 #include #else #ifdef __cplusplus extern "C" { #endif extern OSErr UpdateSystemActivity(UInt8 activity); enum { OverallAct = 0, UsrActivity = 1, NetActivity = 2, HDActivity = 3, IdleActivity = 4 }; #ifdef __cplusplus } #endif #endif // !__LP64__ || MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 #pragma mark - @implementation InputHIDDevice @synthesize hidManager; @synthesize hidDeviceRef; @dynamic runLoop; static NSDictionary *hidUsageTable = nil; - (id) initWithDevice:(IOHIDDeviceRef)theDevice hidManager:(InputHIDManager *)theHIDManager { self = [super init]; if(self == nil) { return self; } if (hidUsageTable == nil) { hidUsageTable = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HID_usage_strings" ofType:@"plist"]]; } hidManager = [theHIDManager retain]; hidDeviceRef = theDevice; hidQueueRef = IOHIDQueueCreate(kCFAllocatorDefault, hidDeviceRef, 10, kIOHIDOptionsTypeNone); if (hidQueueRef == NULL) { [self release]; return nil; } CFArrayRef elementArray = IOHIDDeviceCopyMatchingElements(hidDeviceRef, NULL, kIOHIDOptionsTypeNone); NSEnumerator *enumerator = [(NSArray *)elementArray objectEnumerator]; IOHIDElementRef hidElement = NULL; while ((hidElement = (IOHIDElementRef)[enumerator nextObject])) { IOHIDQueueAddElement(hidQueueRef, hidElement); } CFRelease(elementArray); spinlockRunLoop = OS_SPINLOCK_INIT; [self setRunLoop:[NSRunLoop currentRunLoop]]; return self; } - (void)dealloc { [self stop]; [self setRunLoop:nil]; [self setHidManager:nil]; if (hidQueueRef != NULL) { CFRelease(hidQueueRef); hidQueueRef = NULL; } [super dealloc]; } - (void) setRunLoop:(NSRunLoop *)theRunLoop { OSSpinLockLock(&spinlockRunLoop); if (theRunLoop == runLoop) { OSSpinLockUnlock(&spinlockRunLoop); return; } if (theRunLoop == nil) { IOHIDQueueRegisterValueAvailableCallback(hidQueueRef, NULL, NULL); IOHIDQueueUnscheduleFromRunLoop(hidQueueRef, [runLoop getCFRunLoop], kCFRunLoopDefaultMode); } else { [theRunLoop retain]; IOHIDQueueScheduleWithRunLoop(hidQueueRef, [theRunLoop getCFRunLoop], kCFRunLoopDefaultMode); IOHIDQueueRegisterValueAvailableCallback(hidQueueRef, HandleQueueValueAvailableCallback, [self hidManager]); } [runLoop release]; runLoop = theRunLoop; OSSpinLockUnlock(&spinlockRunLoop); } - (NSRunLoop *) runLoop { OSSpinLockLock(&spinlockRunLoop); NSRunLoop *theRunLoop = runLoop; OSSpinLockUnlock(&spinlockRunLoop); return theRunLoop; } - (void) start { IOHIDQueueStart(hidQueueRef); } - (void) stop { IOHIDQueueStop(hidQueueRef); } - (NSString *) manufacturerName { return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDManufacturerKey)); } - (NSString *) productName { return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDProductKey)); } - (NSString *) serialNumber { return (NSString *)IOHIDDeviceGetProperty([self hidDeviceRef], CFSTR(kIOHIDSerialNumberKey)); } @end /******************************************************************************************** InputAttributesOfHIDValue() Parses an IOHIDValueRef into an input attributes struct. Takes: hidValueRef - The IOHIDValueRef to parse. altElementCode - An NSString that overrides the default element code. altElementName - An NSString that overrides the default element name. altOnState - An NSNumber that overrides the default on state. Returns: An InputAttributes struct with the parsed input attributes. Details: None. ********************************************************************************************/ InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char *altElementCode, const char *altElementName, NSNumber *altOnState) { InputAttributes inputAttr; if (hidValueRef == NULL) { return inputAttr; } IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); if (altElementCode == NULL) { snprintf(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH, "0x%04lX/0x%04lX", (long)elementUsagePage, (long)elementUsage); } else { strncpy(inputAttr.elementCode, altElementCode, INPUT_HANDLER_STRING_LENGTH); } if (altElementName == NULL) { CFStringRef cfElementName = IOHIDElementGetName(hidElementRef); if (cfElementName == nil) { if (elementUsagePage == kHIDPage_Button) { snprintf(inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, "Button %li", (long)elementUsage); } else if (elementUsagePage == kHIDPage_VendorDefinedStart) { snprintf(inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, "VendorDefined %li", (long)elementUsage); } else { NSDictionary *elementUsagePageDict = (NSDictionary *)[hidUsageTable valueForKey:[NSString stringWithFormat:@"0x%04lX", (long)elementUsagePage]]; NSString *elementNameLookup = (NSString *)[elementUsagePageDict valueForKey:[NSString stringWithFormat:@"0x%04lX", (long)elementUsage]]; if (elementNameLookup != nil) { strncpy(inputAttr.elementName, [elementNameLookup cStringUsingEncoding:NSUTF8StringEncoding], 256); } } } else { CFStringGetCString(cfElementName, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, kCFStringEncodingUTF8); } } else { strncpy(inputAttr.elementName, altElementName, INPUT_HANDLER_STRING_LENGTH); } IOHIDDeviceRef hidDeviceRef = IOHIDElementGetDevice(hidElementRef); CFNumberRef cfVendorIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDVendorIDKey)); SInt32 vendorID = 0; CFNumberGetValue(cfVendorIDNumber, kCFNumberSInt32Type, &vendorID); CFNumberRef cfProductIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductIDKey)); SInt32 productID = 0; CFNumberGetValue(cfProductIDNumber, kCFNumberSInt32Type, &productID); CFStringRef cfDeviceCode = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDSerialNumberKey)); if (cfDeviceCode == nil) { CFNumberRef cfLocationIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDLocationIDKey)); SInt32 locationID = 0; CFNumberGetValue(cfLocationIDNumber, kCFNumberSInt32Type, &locationID); snprintf(inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH, "%d/%d/0x%08X", (int)vendorID, (int)productID, (unsigned int)locationID); } else { char cfDeviceCodeBuf[256] = {0}; CFStringGetCString(cfDeviceCode, cfDeviceCodeBuf, 256, kCFStringEncodingUTF8); snprintf(inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH, "%d/%d/%s", (int)vendorID, (int)productID, cfDeviceCodeBuf); } CFStringRef cfDeviceName = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductKey)); if (cfDeviceName == nil) { strncpy(inputAttr.deviceName, inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH); } else { CFStringGetCString(cfDeviceName, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH, kCFStringEncodingUTF8); } BOOL onState = (altOnState == nil) ? GetOnStateFromHIDValueRef(hidValueRef) : [altOnState boolValue]; CFIndex logicalValue = IOHIDValueGetIntegerValue(hidValueRef); NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); inputAttr.state = (onState) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; inputAttr.intCoordX = 0; inputAttr.intCoordY = 0; inputAttr.floatCoordX = 0.0f; inputAttr.floatCoordY = 0.0f; inputAttr.scalar = (float)(logicalValue - logicalMin) / (float)(logicalMax - logicalMin); inputAttr.sender = nil; return inputAttr; } InputAttributesList InputListFromHIDValue(IOHIDValueRef hidValueRef) { InputAttributesList inputList; if (hidValueRef == NULL) { return inputList; } IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); // IOHIDValueGetIntegerValue() will crash if the value length is too large. // Do a bounds check here to prevent crashing. This workaround makes the PS3 // controller usable, since it returns a length of 39 on some elements. if(IOHIDValueGetLength(hidValueRef) > 2) { return inputList; } NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); inputList.resize(2); if (logicalMin == 0 && logicalMax == 1) { inputList.push_back(InputAttributesOfHIDValue(hidValueRef, NULL, NULL, nil)); } else { NSInteger lowerThreshold = ((logicalMax - logicalMin) / 3) + logicalMin; NSInteger upperThreshold = (((logicalMax - logicalMin) * 2) / 3) + logicalMin; NSNumber *onState = [NSNumber numberWithBool:YES]; NSNumber *offState = [NSNumber numberWithBool:NO]; char elementCodeLowerThresholdBuf[256] = {0}; char elementCodeUpperThresholdBuf[256] = {0}; snprintf(elementCodeLowerThresholdBuf, 256, "0x%04lX/0x%04lX/LowerThreshold", (long)elementUsagePage, (long)elementUsage); snprintf(elementCodeUpperThresholdBuf, 256, "0x%04lX/0x%04lX/UpperThreshold", (long)elementUsagePage, (long)elementUsage); if (logicalValue <= lowerThreshold) { inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeLowerThresholdBuf, NULL, onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeUpperThresholdBuf, NULL, offState)); } else if (logicalValue >= upperThreshold) { inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeLowerThresholdBuf, NULL, offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeUpperThresholdBuf, NULL, onState)); } else { inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeLowerThresholdBuf, NULL, offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeUpperThresholdBuf, NULL, onState)); } } return inputList; } InputAttributesList InputListFromHatSwitchValue(IOHIDValueRef hidValueRef, bool useEightDirection) { InputAttributesList inputList; if (hidValueRef == NULL) { return inputList; } IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); if (elementUsage != kHIDUsage_GD_Hatswitch) { return inputList; } inputList.resize(8); NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); NSNumber *onState = [NSNumber numberWithBool:YES]; NSNumber *offState = [NSNumber numberWithBool:NO]; char elementCodeFourWay[4][256]; for (unsigned int i = 0; i < 4; i++) { snprintf(elementCodeFourWay[i], 256, "0x%04lX/0x%04lX/%d-FourDirection", (long)elementUsagePage, (long)elementUsage, i); } const char *elementNameFourWay[4] = { "Hatswitch - Up", "Hatswitch - Right", "Hatswitch - Down", "Hatswitch - Left" }; char elementCodeEightWay[8][256]; for (unsigned int i = 0; i < 8; i++) { snprintf(elementCodeEightWay[i], 256, "0x%04lX/0x%04lX/%d-EightDirection", (long)elementUsagePage, (long)elementUsage, i); } const char *elementNameEightWay[8] = { "Hatswitch - Up", "Hatswitch - Up/Right", "Hatswitch - Right", "Hatswitch - Down/Right", "Hatswitch - Down", "Hatswitch - Down/Left", "Hatswitch - Left", "Hatswitch - Up/Left" }; if (logicalMax == 3) { for (unsigned int i = 0; i <= (unsigned int)logicalMax; i++) { inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeFourWay[i], elementNameFourWay[i], (i == (unsigned int)logicalValue) ? onState : offState)); } } else if (logicalMax == 7) { if (useEightDirection) { for (unsigned int i = 0; i <= (unsigned int)logicalMax; i++) { inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[i], elementNameEightWay[i], (i == (unsigned int)logicalValue) ? onState : offState)); } } else { switch (logicalValue) { case 0: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], offState)); break; case 1: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], offState)); break; case 2: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], offState)); break; case 3: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], offState)); break; case 4: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], offState)); break; case 5: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], onState)); break; case 6: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], onState)); break; case 7: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], onState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], onState)); break; default: inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[0], elementNameEightWay[0], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[2], elementNameEightWay[2], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[4], elementNameEightWay[4], offState)); inputList.push_back(InputAttributesOfHIDValue(hidValueRef, elementCodeEightWay[6], elementNameEightWay[6], offState)); break; } } } return inputList; } BOOL GetOnStateFromHIDValueRef(IOHIDValueRef hidValueRef) { BOOL onState = NO; if (hidValueRef == nil) { return onState; } IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); NSInteger lowerThreshold = ((logicalMax - logicalMin) / 4) + logicalMin; NSInteger upperThreshold = (((logicalMax - logicalMin) * 3) / 4) + logicalMin; NSInteger elementType = IOHIDElementGetType(hidElementRef); switch (elementType) { case kIOHIDElementTypeInput_Misc: { if (logicalMin == 0 && logicalMax == 1) { if (logicalValue == 1) { onState = YES; } } else { if (logicalValue <= lowerThreshold || logicalValue >= upperThreshold) { onState = YES; } } break; } case kIOHIDElementTypeInput_Button: { if (logicalValue == 1) { onState = YES; } break; } case kIOHIDElementTypeInput_Axis: { if (logicalMin == 0 && logicalMax == 1) { if (logicalValue == 1) { onState = YES; } } else { if (logicalValue <= lowerThreshold || logicalValue >= upperThreshold) { onState = YES; } } break; } default: break; } return onState; } unsigned int ClearHIDQueue(const IOHIDQueueRef hidQueue) { unsigned int hidInputClearCount = 0; if (hidQueue == nil) { return hidInputClearCount; } do { IOHIDValueRef hidValueRef = IOHIDQueueCopyNextValueWithTimeout(hidQueue, 0.0); if (hidValueRef == NULL) { break; } CFRelease(hidValueRef); hidInputClearCount++; } while (1); if (hidInputClearCount > 0) { // HID input devices don't register events, so we need to manually prevent // sleep and screensaver whenever we detect an input. UpdateSystemActivity(UsrActivity); } return hidInputClearCount; } void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void *inSender) { InputHIDManager *hidManager = (InputHIDManager *)inContext; IOHIDQueueRef hidQueue = (IOHIDQueueRef)inSender; id target = [hidManager target]; if (target != nil) { NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; [[hidManager target] handleHIDQueue:hidQueue]; [tempPool release]; } else { // We must make sure the HID queue is emptied or else HID input will stall. ClearHIDQueue(hidQueue); } } #pragma mark - @implementation InputHIDManager @synthesize inputManager; @synthesize hidManagerRef; @synthesize deviceList; @synthesize target; @dynamic runLoop; - (id) initWithInputManager:(InputManager *)theInputManager { self = [super init]; if(self == nil) { return self; } target = nil; inputManager = [theInputManager retain]; hidManagerRef = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); if (hidManagerRef == NULL) { [self release]; return nil; } deviceList = [[NSMutableSet alloc] initWithCapacity:32]; CFMutableDictionaryRef cfJoystickMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(cfJoystickMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); CFDictionarySetValue(cfJoystickMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_Joystick]); CFMutableDictionaryRef cfGamepadMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(cfGamepadMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); CFDictionarySetValue(cfGamepadMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_GamePad]); NSArray *matcherArray = [[NSArray alloc] initWithObjects:(NSMutableDictionary *)cfJoystickMatcher, (NSMutableDictionary *)cfGamepadMatcher, nil]; IOHIDManagerSetDeviceMatchingMultiple(hidManagerRef, (CFArrayRef)matcherArray); [matcherArray release]; CFRelease(cfJoystickMatcher); CFRelease(cfGamepadMatcher); spinlockRunLoop = OS_SPINLOCK_INIT; [self setRunLoop:[NSRunLoop currentRunLoop]]; IOReturn result = IOHIDManagerOpen(hidManagerRef, kIOHIDOptionsTypeNone); if (result != kIOReturnSuccess) { [self release]; return nil; } return self; } - (void)dealloc { [self setRunLoop:nil]; [self setInputManager:nil]; [self setTarget:nil]; [deviceList release]; if (hidManagerRef != NULL) { IOHIDManagerClose(hidManagerRef, 0); CFRelease(hidManagerRef); hidManagerRef = NULL; } [super dealloc]; } - (void) setRunLoop:(NSRunLoop *)theRunLoop { OSSpinLockLock(&spinlockRunLoop); if (theRunLoop == runLoop) { OSSpinLockUnlock(&spinlockRunLoop); return; } if (theRunLoop == nil) { IOHIDManagerRegisterDeviceMatchingCallback(hidManagerRef, NULL, NULL); IOHIDManagerRegisterDeviceRemovalCallback(hidManagerRef, NULL, NULL); IOHIDManagerUnscheduleFromRunLoop(hidManagerRef, [runLoop getCFRunLoop], kCFRunLoopDefaultMode); } else { [theRunLoop retain]; IOHIDManagerScheduleWithRunLoop(hidManagerRef, [theRunLoop getCFRunLoop], kCFRunLoopDefaultMode); IOHIDManagerRegisterDeviceMatchingCallback(hidManagerRef, HandleDeviceMatchingCallback, self); IOHIDManagerRegisterDeviceRemovalCallback(hidManagerRef, HandleDeviceRemovalCallback, self); } [runLoop release]; runLoop = theRunLoop; OSSpinLockUnlock(&spinlockRunLoop); } - (NSRunLoop *) runLoop { OSSpinLockLock(&spinlockRunLoop); NSRunLoop *theRunLoop = runLoop; OSSpinLockUnlock(&spinlockRunLoop); return theRunLoop; } @end void HandleDeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) { InputHIDManager *hidManager = (InputHIDManager *)inContext; InputHIDDevice *newDevice = [[[InputHIDDevice alloc] initWithDevice:inIOHIDDeviceRef hidManager:hidManager] autorelease]; [[hidManager deviceList] addObject:newDevice]; [newDevice start]; } void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) { InputHIDManager *hidManager = (InputHIDManager *)inContext; for (InputHIDDevice *hidDevice in [hidManager deviceList]) { if ([hidDevice hidDeviceRef] == inIOHIDDeviceRef) { [[hidManager deviceList] removeObject:hidDevice]; break; } } } #pragma mark - @implementation InputManager @synthesize emuControl; @dynamic hidInputTarget; @synthesize inputMappings; @synthesize commandTagList; @synthesize commandIcon; #if defined(__ppc__) || defined(__ppc64__) static std::map keyboardNameTable; // Key = Key code, Value = Key name #else static std::tr1::unordered_map keyboardNameTable; // Key = Key code, Value = Key name #endif - (id)init { self = [super init]; if (self == nil) { return self; } if (keyboardNameTable.empty()) { NSDictionary *keyboardNameDict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"KeyNames" ofType:@"plist"]]; NSArray *keyboardDictKeyList = [keyboardNameDict allKeys]; for (NSString *dKey in keyboardDictKeyList) { unsigned short keyCode = (unsigned short)[dKey intValue]; keyboardNameTable[keyCode] = std::string([(NSString *)[keyboardNameDict valueForKey:dKey] cStringUsingEncoding:NSUTF8StringEncoding]); } } hidManager = [[InputHIDManager alloc] initWithInputManager:self]; inputMappings = [[NSMutableDictionary alloc] initWithCapacity:128]; commandTagList = [[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]] valueForKey:@"CommandTagList"]; // Initialize the icons associated with each command. commandIcon = [[NSDictionary alloc] initWithObjectsAndKeys: [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"UNKNOWN COMMAND", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowUp_420x420" ofType:@"png"]] autorelease], @"Up", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowDown_420x420" ofType:@"png"]] autorelease], @"Down", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowLeft_420x420" ofType:@"png"]] autorelease], @"Left", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowRight_420x420" ofType:@"png"]] autorelease], @"Right", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonA_420x420" ofType:@"png"]] autorelease], @"A", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonB_420x420" ofType:@"png"]] autorelease], @"B", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonX_420x420" ofType:@"png"]] autorelease], @"X", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonY_420x420" ofType:@"png"]] autorelease], @"Y", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonL_420x420" ofType:@"png"]] autorelease], @"L", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonR_420x420" ofType:@"png"]] autorelease], @"R", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonStart_420x420" ofType:@"png"]] autorelease], @"Start", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Select", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Microphone_420x420" ofType:@"png"]] autorelease], @"Microphone", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_RotateCCW_420x420" ofType:@"png"]] autorelease], @"Rotate Display Left", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_RotateCW_420x420" ofType:@"png"]] autorelease], @"Rotate Display Right", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ShowHUD_420x420" ofType:@"png"]] autorelease], @"HUD", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]] autorelease], @"Execute", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]] autorelease], @"Pause", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]] autorelease], @"Execute/Pause", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Reset_420x420" ofType:@"png"]] autorelease], @"Reset", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Touch", [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]] autorelease], @"Mute/Unmute", nil]; // Initialize the selectors used for each command tag. (Do this in code rather than in an external file.) commandSelector["Up"] = @selector(cmdUpdateDSController:); commandSelector["Down"] = @selector(cmdUpdateDSController:); commandSelector["Right"] = @selector(cmdUpdateDSController:); commandSelector["Left"] = @selector(cmdUpdateDSController:); commandSelector["A"] = @selector(cmdUpdateDSController:); commandSelector["B"] = @selector(cmdUpdateDSController:); commandSelector["X"] = @selector(cmdUpdateDSController:); commandSelector["Y"] = @selector(cmdUpdateDSController:); commandSelector["L"] = @selector(cmdUpdateDSController:); commandSelector["R"] = @selector(cmdUpdateDSController:); commandSelector["Start"] = @selector(cmdUpdateDSController:); commandSelector["Select"] = @selector(cmdUpdateDSController:); commandSelector["Touch"] = @selector(cmdUpdateDSController:); commandSelector["Microphone"] = @selector(cmdUpdateDSController:); commandSelector["Debug"] = @selector(cmdUpdateDSController:); commandSelector["Lid"] = @selector(cmdUpdateDSController:); commandSelector["Load State Slot"] = @selector(cmdLoadEmuSaveStateSlot:); commandSelector["Save State Slot"] = @selector(cmdSaveEmuSaveStateSlot:); commandSelector["Copy Screen"] = @selector(cmdCopyScreen:); commandSelector["Rotate Display Relative"] = @selector(cmdRotateDisplayRelative:); commandSelector["Set Speed"] = @selector(cmdHoldToggleSpeedScalar:); commandSelector["Enable/Disable Speed Limiter"] = @selector(cmdToggleSpeedLimiter:); commandSelector["Enable/Disable Auto Frame Skip"] = @selector(cmdToggleAutoFrameSkip:); commandSelector["Enable/Disable Cheats"] = @selector(cmdToggleCheats:); commandSelector["Execute/Pause"] = @selector(cmdToggleExecutePause:); commandSelector["Reset"] = @selector(cmdReset:); commandSelector["Mute/Unmute"] = @selector(cmdToggleMute:); commandSelector["Enable/Disable GPU State"] = @selector(cmdToggleGPUState:); // Generate the default command attributes for each command tag. (Do this in code rather than in an external file.) CommandAttributes cmdDSControlRight = NewCommandAttributesForDSControl("Right", DSControllerState_Right); CommandAttributes cmdDSControlLeft = NewCommandAttributesForDSControl("Left", DSControllerState_Left); CommandAttributes cmdDSControlDown = NewCommandAttributesForDSControl("Down", DSControllerState_Down); CommandAttributes cmdDSControlUp = NewCommandAttributesForDSControl("Up", DSControllerState_Up); CommandAttributes cmdDSControlSelect = NewCommandAttributesForDSControl("Select", DSControllerState_Select); CommandAttributes cmdDSControlStart = NewCommandAttributesForDSControl("Start", DSControllerState_Start); CommandAttributes cmdDSControlB = NewCommandAttributesForDSControl("B", DSControllerState_B); CommandAttributes cmdDSControlA = NewCommandAttributesForDSControl("A", DSControllerState_A); CommandAttributes cmdDSControlY = NewCommandAttributesForDSControl("Y", DSControllerState_Y); CommandAttributes cmdDSControlX = NewCommandAttributesForDSControl("X", DSControllerState_X); CommandAttributes cmdDSControlL = NewCommandAttributesForDSControl("L", DSControllerState_L); CommandAttributes cmdDSControlR = NewCommandAttributesForDSControl("R", DSControllerState_R); CommandAttributes cmdDSControlDebug = NewCommandAttributesForDSControl("Debug", DSControllerState_Debug); CommandAttributes cmdDSControlLid = NewCommandAttributesForDSControl("Lid", DSControllerState_Lid); CommandAttributes cmdDSControlTouch = NewCommandAttributesForDSControl("Touch", DSControllerState_Touch); cmdDSControlTouch.useInputForIntCoord = true; CommandAttributes cmdDSControlMic = NewCommandAttributesForDSControl("Microphone", DSControllerState_Microphone); cmdDSControlMic.intValue[1] = MICMODE_INTERNAL_NOISE; cmdDSControlMic.floatValue[0] = 250.0f; CommandAttributes cmdLoadEmuSaveStateSlot = NewCommandAttributesForSelector("Load State Slot", commandSelector["Load State Slot"]); CommandAttributes cmdSaveEmuSaveStateSlot = NewCommandAttributesForSelector("Save State Slot", commandSelector["Save State Slot"]); CommandAttributes cmdCopyScreen = NewCommandAttributesForSelector("Copy Screen", commandSelector["Copy Screen"]); CommandAttributes cmdRotateDisplayRelative = NewCommandAttributesForSelector("Rotate Display Relative", commandSelector["Rotate Display Relative"]); cmdRotateDisplayRelative.intValue[0] = 90; CommandAttributes cmdRotateDisplayLeft = NewCommandAttributesForSelector("Rotate Display Left", commandSelector["Rotate Display Relative"]); cmdRotateDisplayLeft.intValue[0] = -90; CommandAttributes cmdRotateDisplayRight = NewCommandAttributesForSelector("Rotate Display Right", commandSelector["Rotate Display Relative"]); cmdRotateDisplayRight.intValue[0] = 90; CommandAttributes cmdToggleSpeed = NewCommandAttributesForSelector("Set Speed", commandSelector["Set Speed"]); cmdToggleSpeed.floatValue[0] = 1.0f; CommandAttributes cmdToggleSpeedLimiter = NewCommandAttributesForSelector("Enable/Disable Speed Limiter", commandSelector["Enable/Disable Speed Limiter"]); CommandAttributes cmdToggleAutoFrameSkip = NewCommandAttributesForSelector("Enable/Disable Auto Frame Skip", commandSelector["Enable/Disable Auto Frame Skip"]); CommandAttributes cmdToggleCheats = NewCommandAttributesForSelector("Enable/Disable Cheats", commandSelector["Enable/Disable Cheats"]); CommandAttributes cmdToggleExecutePause = NewCommandAttributesForSelector("Execute/Pause", commandSelector["Execute/Pause"]); CommandAttributes cmdReset = NewCommandAttributesForSelector("Reset", commandSelector["Reset"]); CommandAttributes cmdToggleMute = NewCommandAttributesForSelector("Mute/Unmute", commandSelector["Mute/Unmute"]); CommandAttributes cmdToggleGPUState = NewCommandAttributesForSelector("Enable/Disable GPU State", commandSelector["Enable/Disable GPU State"]); defaultCommandAttributes["Up"] = cmdDSControlUp; defaultCommandAttributes["Down"] = cmdDSControlDown; defaultCommandAttributes["Right"] = cmdDSControlRight; defaultCommandAttributes["Left"] = cmdDSControlLeft; defaultCommandAttributes["A"] = cmdDSControlA; defaultCommandAttributes["B"] = cmdDSControlB; defaultCommandAttributes["X"] = cmdDSControlX; defaultCommandAttributes["Y"] = cmdDSControlY; defaultCommandAttributes["L"] = cmdDSControlL; defaultCommandAttributes["R"] = cmdDSControlR; defaultCommandAttributes["Start"] = cmdDSControlStart; defaultCommandAttributes["Select"] = cmdDSControlSelect; defaultCommandAttributes["Touch"] = cmdDSControlTouch; defaultCommandAttributes["Microphone"] = cmdDSControlMic; defaultCommandAttributes["Debug"] = cmdDSControlDebug; defaultCommandAttributes["Lid"] = cmdDSControlLid; defaultCommandAttributes["Load State Slot"] = cmdLoadEmuSaveStateSlot; defaultCommandAttributes["Save State Slot"] = cmdSaveEmuSaveStateSlot; defaultCommandAttributes["Copy Screen"] = cmdCopyScreen; defaultCommandAttributes["Rotate Display Left"] = cmdRotateDisplayLeft; defaultCommandAttributes["Rotate Display Right"] = cmdRotateDisplayRight; defaultCommandAttributes["Set Speed"] = cmdToggleSpeed; defaultCommandAttributes["Enable/Disable Speed Limiter"] = cmdToggleSpeedLimiter; defaultCommandAttributes["Enable/Disable Auto Frame Skip"] = cmdToggleAutoFrameSkip; defaultCommandAttributes["Enable/Disable Cheats"] = cmdToggleCheats; defaultCommandAttributes["Execute/Pause"] = cmdToggleExecutePause; defaultCommandAttributes["Reset"] = cmdReset; defaultCommandAttributes["Mute/Unmute"] = cmdToggleMute; defaultCommandAttributes["Enable/Disable GPU State"] = cmdToggleGPUState; // Map all IBActions (the target object is an EmuControllerDelegate) [self addMappingForIBAction:@selector(loadEmuSaveStateSlot:) commandAttributes:&cmdLoadEmuSaveStateSlot]; [self addMappingForIBAction:@selector(saveEmuSaveStateSlot:) commandAttributes:&cmdSaveEmuSaveStateSlot]; [self addMappingForIBAction:@selector(copy:) commandAttributes:&cmdCopyScreen]; [self addMappingForIBAction:@selector(changeRotationRelative:) commandAttributes:&cmdRotateDisplayRelative]; [self addMappingForIBAction:@selector(toggleSpeedLimiter:) commandAttributes:&cmdToggleSpeedLimiter]; [self addMappingForIBAction:@selector(toggleAutoFrameSkip:) commandAttributes:&cmdToggleAutoFrameSkip]; [self addMappingForIBAction:@selector(toggleCheats:) commandAttributes:&cmdToggleCheats]; [self addMappingForIBAction:@selector(toggleExecutePause:) commandAttributes:&cmdToggleExecutePause]; [self addMappingForIBAction:@selector(reset:) commandAttributes:&cmdReset]; [self addMappingForIBAction:@selector(toggleGPUState:) commandAttributes:&cmdToggleGPUState]; return self; } - (void)dealloc { [hidManager release]; [inputMappings release]; [commandTagList release]; [commandIcon release]; [super dealloc]; } #pragma mark Dynamic Properties - (void) setHidInputTarget:(id)theTarget { [hidManager setTarget:theTarget]; } - (id) hidInputTarget { return [hidManager target]; } #pragma mark Class Methods - (void) setMappingsWithMappings:(NSDictionary *)mappings { if (mappings == nil || commandTagList == nil) { return; } // Add the input mappings, filling in missing data as needed. for (NSString *commandTag in commandTagList) { NSArray *deviceInfoList = (NSArray *)[mappings valueForKey:commandTag]; if ([[self inputMappings] valueForKey:commandTag] == nil) { [[self inputMappings] setObject:[NSMutableArray arrayWithCapacity:4] forKey:commandTag]; } else { [self removeAllMappingsForCommandTag:[commandTag cStringUsingEncoding:NSUTF8StringEncoding]]; } for(NSDictionary *deviceInfo in deviceInfoList) { const char *cmdTag = [commandTag cStringUsingEncoding:NSUTF8StringEncoding]; CommandAttributes cmdAttr = defaultCommandAttributes[cmdTag]; UpdateCommandAttributesWithDeviceInfoDictionary(&cmdAttr, deviceInfo); // Force DS control commands to use IDs from code instead of from the file. // (In other words, we can't trust an external file with this information since // IDs might desync if the DS Control ID enumeration changes.) if (cmdAttr.selector == @selector(cmdUpdateDSController:)) { cmdAttr.intValue[0] = defaultCommandAttributes[cmdTag].intValue[0]; } // Copy all command attributes into a new deviceInfo dictionary. NSMutableDictionary *newDeviceInfo = DeviceInfoDictionaryWithCommandAttributes(&cmdAttr, [deviceInfo valueForKey:@"deviceCode"], [deviceInfo valueForKey:@"deviceName"], [deviceInfo valueForKey:@"elementCode"], [deviceInfo valueForKey:@"elementName"]); [self addMappingUsingDeviceInfoDictionary:newDeviceInfo commandAttributes:&cmdAttr]; } } [self updateAudioFileGenerators]; } - (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceInfo commandAttributes:(const CommandAttributes *)cmdAttr { NSString *deviceCode = (NSString *)[deviceInfo valueForKey:@"deviceCode"]; NSString *elementCode = (NSString *)[deviceInfo valueForKey:@"elementCode"]; if (deviceCode == nil || elementCode == nil || cmdAttr == NULL) { return; } [self addMappingUsingDeviceCode:[deviceCode cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[elementCode cStringUsingEncoding:NSUTF8StringEncoding] commandAttributes:cmdAttr]; // Save the input device info for the user defaults. NSString *commandTagString = [NSString stringWithCString:cmdAttr->tag encoding:NSUTF8StringEncoding]; NSMutableArray *inputList = (NSMutableArray *)[[self inputMappings] valueForKey:commandTagString]; NSMutableDictionary *newDeviceInfo = [NSMutableDictionary dictionaryWithDictionary:deviceInfo]; [self updateInputSettingsSummaryInDeviceInfoDictionary:newDeviceInfo commandTag:cmdAttr->tag]; if (inputList == nil) { inputList = [NSMutableArray arrayWithObject:newDeviceInfo]; [[self inputMappings] setObject:inputList forKey:commandTagString]; } else { [inputList addObject:newDeviceInfo]; } } - (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandAttributes:(const CommandAttributes *)cmdAttr { if (inputAttr == NULL) { return; } NSMutableDictionary *deviceInfo = DeviceInfoDictionaryWithCommandAttributes(cmdAttr, [NSString stringWithCString:inputAttr->deviceCode encoding:NSUTF8StringEncoding], [NSString stringWithCString:inputAttr->deviceName encoding:NSUTF8StringEncoding], [NSString stringWithCString:inputAttr->elementCode encoding:NSUTF8StringEncoding], [NSString stringWithCString:inputAttr->elementName encoding:NSUTF8StringEncoding]); [self addMappingUsingDeviceInfoDictionary:deviceInfo commandAttributes:cmdAttr]; } - (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandAttributes:(const CommandAttributes *)cmdAttr { if (inputList == NULL) { return; } const size_t inputCount = inputList->size(); for (unsigned int i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = (*inputList)[i]; if (inputAttr.state != INPUT_ATTRIBUTE_STATE_ON) { continue; } [self addMappingUsingInputAttributes:&inputAttr commandAttributes:cmdAttr]; } } - (void) addMappingForIBAction:(const SEL)theSelector commandAttributes:(const CommandAttributes *)cmdAttr { if (theSelector == nil) { return; } CommandAttributes IBActionCmdAttr = *cmdAttr; IBActionCmdAttr.useInputForSender = true; [self addMappingUsingDeviceCode:"IBAction" elementCode:sel_getName(theSelector) commandAttributes:&IBActionCmdAttr]; } - (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandAttributes:(const CommandAttributes *)cmdAttr { if (deviceCode == NULL || elementCode == NULL || cmdAttr == NULL) { return; } // Remove all previous instances of this particular input device. (We will not be supporting // many-to-many mappings at this time. [self removeMappingUsingDeviceCode:deviceCode elementCode:elementCode]; // Map the input. [self setMappedCommandAttributes:cmdAttr deviceCode:deviceCode elementCode:elementCode]; } - (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode { if (deviceCode == NULL || elementCode == NULL) { return; } const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); commandMap.erase(inputKey); for (NSString *inputCommandTag in inputMappings) { NSMutableArray *inputList = (NSMutableArray *)[inputMappings valueForKey:inputCommandTag]; NSMutableArray *inputRemovalList = [NSMutableArray arrayWithCapacity:1]; for (NSDictionary *inputDeviceInfo in inputList) { NSString *deviceCodeString = [NSString stringWithCString:deviceCode encoding:NSUTF8StringEncoding]; NSString *elementCodeString = [NSString stringWithCString:elementCode encoding:NSUTF8StringEncoding]; NSString *inputDeviceCode = (NSString *)[inputDeviceInfo valueForKey:@"deviceCode"]; NSString *inputElementCode = (NSString *)[inputDeviceInfo valueForKey:@"elementCode"]; if ([inputDeviceCode isEqualToString:deviceCodeString] && [inputElementCode isEqualToString:elementCodeString]) { [inputRemovalList addObject:inputDeviceInfo]; } } [inputList removeObjectsInArray:inputRemovalList]; } } - (void) removeAllMappingsForCommandTag:(const char *)cmdTag { if (cmdTag == NULL) { return; } // This loop removes all mappings to commandTag, with the exception of IBAction mappings. for (InputCommandMap::iterator it=commandMap.begin(); it!=commandMap.end(); ++it) { if (it->first.find("IBAction") == std::string::npos && strncmp(it->second.tag, cmdTag, INPUT_HANDLER_STRING_LENGTH) == 0) { commandMap.erase(it); } } NSString *commandTag = [NSString stringWithCString:cmdTag encoding:NSUTF8StringEncoding]; NSMutableArray *inputList = (NSMutableArray *)[[self inputMappings] valueForKey:commandTag]; [inputList removeAllObjects]; } - (CommandAttributesList) generateCommandListUsingInputList:(const InputAttributesList *)inputList { CommandAttributesList cmdList; size_t inputCount = inputList->size(); for (unsigned int i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = (*inputList)[i]; // All inputs require a device code and element code for mapping. If one or both are // not present, reject the input. if (inputAttr.deviceCode[0] == '\0' || inputAttr.elementCode[0] == '\0') { continue; } // Look up the command attributes using the input key. const std::string inputKey = std::string(inputAttr.deviceCode) + ":" + std::string(inputAttr.elementCode); CommandAttributes cmdAttr = commandMap[inputKey]; if (cmdAttr.tag[0] == '\0' || cmdAttr.selector == nil) { continue; } cmdAttr.input = inputAttr; // Copy the input state to the command attributes. cmdList.push_back(cmdAttr); // Add the command attributes to the list. } return cmdList; } - (void) dispatchCommandList:(const CommandAttributesList *)cmdList { size_t cmdCount = cmdList->size(); for (size_t i = 0; i < cmdCount; i++) { const CommandAttributes &cmdAttr = (*cmdList)[i]; if ([emuControl respondsToSelector:cmdAttr.selector]) { NSValue *cmdObject = [[NSValue alloc] initWithBytes:&cmdAttr objCType:@encode(CommandAttributes)]; [emuControl performSelector:cmdAttr.selector withObject:cmdObject]; [cmdObject release]; } } } - (BOOL) dispatchCommandUsingInputAttributes:(const InputAttributes *)inputAttr { BOOL didCommandDispatch = NO; // All inputs require a device code and element code for mapping. If one or both are // not present, reject the input. if (inputAttr->deviceCode[0] == '\0' || inputAttr->elementCode[0] == '\0') { return didCommandDispatch; } // Look up the command key using the input key. const std::string inputKey = std::string(inputAttr->deviceCode) + ":" + std::string(inputAttr->elementCode); CommandAttributes cmdAttr = commandMap[inputKey]; if (cmdAttr.tag[0] == '\0' || cmdAttr.selector == nil) { return didCommandDispatch; } // Copy the input state to the command attributes. cmdAttr.input = *inputAttr; if ([emuControl respondsToSelector:cmdAttr.selector]) { NSValue *cmdObject = [[NSValue alloc] initWithBytes:&cmdAttr objCType:@encode(CommandAttributes)]; [emuControl performSelector:cmdAttr.selector withObject:cmdObject]; [cmdObject release]; } didCommandDispatch = YES; return didCommandDispatch; } - (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector sender:(id)sender { const InputAttributes inputAttr = InputManagerEncodeIBAction(theSelector, sender); return [self dispatchCommandUsingInputAttributes:&inputAttr]; } - (void) writeDefaultsInputMappings { [[NSUserDefaults standardUserDefaults] setObject:[self inputMappings] forKey:@"Input_ControllerMappings"]; } - (NSString *) commandTagFromInputList:(NSArray *)inputList { NSString *commandTag = nil; if (inputList == nil) { return commandTag; } for (NSString *tag in inputMappings) { if (inputList == [inputMappings valueForKey:tag]) { commandTag = tag; break; } } return commandTag; } - (SEL) selectorOfCommandTag:(const char *)commandTag { return commandSelector[commandTag]; } - (CommandAttributes) defaultCommandAttributesForCommandTag:(const char *)commandTag { return defaultCommandAttributes[commandTag]; } - (CommandAttributes) mappedCommandAttributesOfDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode { const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); return commandMap[inputKey]; } - (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode { const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); commandMap[inputKey] = *cmdAttr; } - (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag { NSString *inputSummary = nil; if (strncmp(commandTag, "Touch", INPUT_HANDLER_STRING_LENGTH) == 0) { const BOOL useInputForIntCoord = [(NSNumber *)[deviceInfo valueForKey:@"useInputForIntCoord"] boolValue]; if (useInputForIntCoord) { inputSummary = NSSTRING_INPUTPREF_USE_DEVICE_COORDINATES; } else { const int xCoord = (int)[(NSNumber *)[deviceInfo valueForKey:@"intValue1"] intValue]; const int yCoord = (int)[(NSNumber *)[deviceInfo valueForKey:@"intValue2"] intValue]; inputSummary = [NSString stringWithFormat:@"X:%i Y:%i", xCoord, yCoord]; } } else if (strncmp(commandTag, "Microphone", INPUT_HANDLER_STRING_LENGTH) == 0) { const NSInteger micMode = [(NSNumber *)[deviceInfo valueForKey:@"intValue1"] integerValue]; switch (micMode) { case MICMODE_NONE: inputSummary = NSSTRING_INPUTPREF_MIC_NONE; break; case MICMODE_INTERNAL_NOISE: inputSummary = NSSTRING_INPUTPREF_MIC_INTERNAL_NOISE; break; case MICMODE_AUDIO_FILE: inputSummary = (NSString *)[deviceInfo valueForKey:@"object1"]; if (inputSummary == nil) { inputSummary = NSSTRING_INPUTPREF_MIC_AUDIO_FILE_NONE_SELECTED; } break; case MICMODE_WHITE_NOISE: inputSummary = NSSTRING_INPUTPREF_MIC_WHITE_NOISE; break; case MICMODE_SINE_WAVE: inputSummary = [NSString stringWithFormat:NSSTRING_INPUTPREF_MIC_SINE_WAVE, [(NSNumber *)[deviceInfo valueForKey:@"floatValue0"] floatValue]]; break; case MICMODE_PHYSICAL: inputSummary = @"Physical:"; break; default: break; } } else if (strncmp(commandTag, "Load State Slot", INPUT_HANDLER_STRING_LENGTH) == 0) { const NSInteger slotNumber = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue] + 1; inputSummary = [NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, slotNumber]; } else if (strncmp(commandTag, "Save State Slot", INPUT_HANDLER_STRING_LENGTH) == 0) { const NSInteger slotNumber = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue] + 1; inputSummary = [NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, slotNumber]; } else if (strncmp(commandTag, "Set Speed", INPUT_HANDLER_STRING_LENGTH) == 0) { const float speedScalar = [(NSNumber *)[deviceInfo valueForKey:@"floatValue0"] floatValue]; inputSummary = [NSString stringWithFormat:NSSTRING_INPUTPREF_SPEED_SCALAR, speedScalar]; } else if (strncmp(commandTag, "Enable/Disable GPU State", INPUT_HANDLER_STRING_LENGTH) == 0) { const NSInteger gpuStateID = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue]; switch (gpuStateID) { case 0: inputSummary = NSSTRING_INPUTPREF_GPU_STATE_ALL_MAIN; break; case 1: inputSummary = @"Main BG0"; break; case 2: inputSummary = @"Main BG1"; break; case 3: inputSummary = @"Main BG2"; break; case 4: inputSummary = @"Main BG3"; break; case 5: inputSummary = @"Main OBJ"; break; case 6: inputSummary = NSSTRING_INPUTPREF_GPU_STATE_ALL_SUB; break; case 7: inputSummary = @"Sub BG0"; break; case 8: inputSummary = @"Sub BG1"; break; case 9: inputSummary = @"Sub BG2"; break; case 10: inputSummary = @"Sub BG3"; break; case 11: inputSummary = @"Sub OBJ"; break; default: break; } } if (inputSummary == nil) { inputSummary = @""; } [deviceInfo setObject:inputSummary forKey:@"inputSettingsSummary"]; } - (OSStatus) loadAudioFileUsingPath:(NSString *)filePath { OSStatus error = noErr; if (filePath == nil) { error = 1; return error; } // Check if the audio file is already loaded. If it is, don't load it again. std::string filePathStr = std::string([filePath cStringUsingEncoding:NSUTF8StringEncoding]); for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it) { if (it->first.find(filePathStr) != std::string::npos) { return error; } } // Open the audio file using the file URL. NSURL *fileURL = [NSURL fileURLWithPath:filePath isDirectory:NO]; if (fileURL == nil) { error = 1; return error; } ExtAudioFileRef audioFile; error = ExtAudioFileOpenURL((CFURLRef)fileURL, &audioFile); if (error != noErr) { return error; } // Create an ASBD of the DS mic audio format. AudioStreamBasicDescription outputFormat; outputFormat.mSampleRate = MIC_SAMPLE_RATE; outputFormat.mFormatID = kAudioFormatLinearPCM; outputFormat.mFormatFlags = kAudioFormatFlagIsPacked; outputFormat.mBytesPerPacket = 1; outputFormat.mFramesPerPacket = 1; outputFormat.mBytesPerFrame = 1; outputFormat.mChannelsPerFrame = 1; outputFormat.mBitsPerChannel = 8; error = ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(outputFormat), &outputFormat); if (error != noErr) { return error; } SInt64 fileLengthFrames = 0; UInt32 propertySize = sizeof(fileLengthFrames); error = ExtAudioFileGetProperty(audioFile, kExtAudioFileProperty_FileLengthFrames, &propertySize, &fileLengthFrames); if (error != noErr) { return error; } // Create a new audio file generator. audioFileGenerators[filePathStr] = AudioSampleBlockGenerator(); AudioSampleBlockGenerator &theGenerator = audioFileGenerators[filePathStr]; u8 *buffer = theGenerator.allocate(fileLengthFrames); // Read the audio file and fill the generator's buffer. const size_t convertBufferSize = 32 * 1024; AudioBufferList convertedData; convertedData.mNumberBuffers = 1; convertedData.mBuffers[0].mNumberChannels = outputFormat.mChannelsPerFrame; convertedData.mBuffers[0].mDataByteSize = convertBufferSize; convertedData.mBuffers[0].mData = buffer; UInt32 readFrames = convertBufferSize; while (readFrames > 0) { ExtAudioFileRead(audioFile, &readFrames, &convertedData); buffer += readFrames; convertedData.mBuffers[0].mData = buffer; } // Close the audio file. ExtAudioFileDispose(audioFile); // Convert the audio buffer to 7-bit unsigned PCM. buffer = theGenerator.getBuffer(); for (SInt64 i = 0; i < fileLengthFrames; i++) { *(buffer+i) >>= 1; } return error; } - (AudioSampleBlockGenerator *) audioFileGeneratorFromFilePath:(NSString *)filePath { BOOL isAudioFileLoaded = NO; if (filePath == nil) { return NULL; } std::string filePathStr = std::string([filePath cStringUsingEncoding:NSUTF8StringEncoding]); for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it) { if (it->first.find(filePathStr) != std::string::npos) { isAudioFileLoaded = YES; break; } } return (isAudioFileLoaded) ? &audioFileGenerators[filePathStr] : NULL; } - (void) updateAudioFileGenerators { NSMutableArray *inputList = (NSMutableArray *)[inputMappings valueForKey:@"Microphone"]; // Load any unloaded audio files for (NSMutableArray *deviceInfo in inputList) { NSString *filePath = (NSString *)[deviceInfo valueForKey:@"object0"]; [self loadAudioFileUsingPath:filePath]; } // Unload any orphaned audio files for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it) { BOOL didFindKey = NO; NSString *audioGeneratorKey = [NSString stringWithCString:it->first.c_str() encoding:NSUTF8StringEncoding]; for (NSMutableDictionary *deviceInfo in inputList) { NSString *deviceAudioFilePath = (NSString *)[deviceInfo valueForKey:@"object0"]; if ([audioGeneratorKey isEqualToString:deviceAudioFilePath]) { didFindKey = YES; break; } } if (!didFindKey) { AudioSampleBlockGenerator *selectedGenerator = [emuControl selectedAudioFileGenerator]; if (selectedGenerator == &it->second) { [emuControl setSelectedAudioFileGenerator:NULL]; } audioFileGenerators.erase(it); } } } CommandAttributes NewDefaultCommandAttributes(const char *commandTag) { CommandAttributes cmdAttr; strncpy(cmdAttr.tag, commandTag, INPUT_HANDLER_STRING_LENGTH); cmdAttr.selector = nil; cmdAttr.intValue[0] = 0; cmdAttr.intValue[1] = 0; cmdAttr.intValue[2] = 0; cmdAttr.intValue[3] = 0; cmdAttr.floatValue[0] = 0; cmdAttr.floatValue[1] = 0; cmdAttr.floatValue[2] = 0; cmdAttr.floatValue[3] = 0; cmdAttr.object[0] = nil; cmdAttr.object[1] = nil; cmdAttr.object[2] = nil; cmdAttr.object[3] = nil; cmdAttr.useInputForIntCoord = false; cmdAttr.useInputForFloatCoord = false; cmdAttr.useInputForScalar = false; cmdAttr.useInputForSender = false; return cmdAttr; } CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector) { CommandAttributes cmdAttr = NewDefaultCommandAttributes(commandTag); cmdAttr.selector = theSelector; return cmdAttr; } CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID) { CommandAttributes cmdAttr = NewCommandAttributesForSelector(commandTag, @selector(cmdUpdateDSController:)); cmdAttr.intValue[0] = controlID; cmdAttr.floatValue[0] = 250.0f; return cmdAttr; } void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo) { if (cmdAttr == NULL || deviceInfo == nil) { return; } NSNumber *intValue0 = (NSNumber *)[deviceInfo valueForKey:@"intValue0"]; NSNumber *intValue1 = (NSNumber *)[deviceInfo valueForKey:@"intValue1"]; NSNumber *intValue2 = (NSNumber *)[deviceInfo valueForKey:@"intValue2"]; NSNumber *intValue3 = (NSNumber *)[deviceInfo valueForKey:@"intValue3"]; NSNumber *floatValue0 = (NSNumber *)[deviceInfo valueForKey:@"floatValue0"]; NSNumber *floatValue1 = (NSNumber *)[deviceInfo valueForKey:@"floatValue1"]; NSNumber *floatValue2 = (NSNumber *)[deviceInfo valueForKey:@"floatValue2"]; NSNumber *floatValue3 = (NSNumber *)[deviceInfo valueForKey:@"floatValue3"]; NSObject *object0 = [deviceInfo valueForKey:@"object0"]; NSObject *object1 = [deviceInfo valueForKey:@"object1"]; NSObject *object2 = [deviceInfo valueForKey:@"object2"]; NSObject *object3 = [deviceInfo valueForKey:@"object3"]; NSNumber *useInputForIntCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForIntCoord"]; NSNumber *useInputForFloatCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForFloatCoord"]; NSNumber *useInputForScalar = (NSNumber *)[deviceInfo valueForKey:@"useInputForScalar"]; NSNumber *useInputForSender = (NSNumber *)[deviceInfo valueForKey:@"useInputForSender"]; if (intValue0 != nil) cmdAttr->intValue[0] = [intValue0 intValue]; if (intValue1 != nil) cmdAttr->intValue[1] = [intValue1 intValue]; if (intValue2 != nil) cmdAttr->intValue[2] = [intValue2 intValue]; if (intValue3 != nil) cmdAttr->intValue[3] = [intValue3 intValue]; if (floatValue0 != nil) cmdAttr->floatValue[0] = [floatValue0 floatValue]; if (floatValue1 != nil) cmdAttr->floatValue[1] = [floatValue1 floatValue]; if (floatValue2 != nil) cmdAttr->floatValue[2] = [floatValue2 floatValue]; if (floatValue3 != nil) cmdAttr->floatValue[3] = [floatValue3 floatValue]; if (useInputForIntCoord != nil) cmdAttr->useInputForIntCoord = [useInputForIntCoord boolValue]; if (useInputForFloatCoord != nil) cmdAttr->useInputForFloatCoord = [useInputForFloatCoord boolValue]; if (useInputForScalar != nil) cmdAttr->useInputForScalar = [useInputForScalar boolValue]; if (useInputForSender != nil) cmdAttr->useInputForSender = [useInputForSender boolValue]; cmdAttr->object[0] = object0; cmdAttr->object[1] = object1; cmdAttr->object[2] = object2; cmdAttr->object[3] = object3; } NSMutableDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr, NSString *deviceCode, NSString *deviceName, NSString *elementCode, NSString *elementName) { if (cmdAttr == NULL || deviceCode == nil || deviceName == nil || elementCode == nil || elementName == nil) { return nil; } NSString *deviceInfoSummary = [[deviceName stringByAppendingString:@": "] stringByAppendingString:elementName]; NSMutableDictionary *newDeviceInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: deviceCode, @"deviceCode", deviceName, @"deviceName", elementCode, @"elementCode", elementName, @"elementName", deviceInfoSummary, @"deviceInfoSummary", @"", @"inputSettingsSummary", [NSNumber numberWithInt:cmdAttr->intValue[0]], @"intValue0", [NSNumber numberWithInt:cmdAttr->intValue[1]], @"intValue1", [NSNumber numberWithInt:cmdAttr->intValue[2]], @"intValue2", [NSNumber numberWithInt:cmdAttr->intValue[3]], @"intValue3", [NSNumber numberWithFloat:cmdAttr->floatValue[0]], @"floatValue0", [NSNumber numberWithFloat:cmdAttr->floatValue[1]], @"floatValue1", [NSNumber numberWithFloat:cmdAttr->floatValue[2]], @"floatValue2", [NSNumber numberWithFloat:cmdAttr->floatValue[3]], @"floatValue3", [NSNumber numberWithBool:cmdAttr->useInputForIntCoord], @"useInputForIntCoord", [NSNumber numberWithBool:cmdAttr->useInputForFloatCoord], @"useInputForFloatCoord", [NSNumber numberWithBool:cmdAttr->useInputForScalar], @"useInputForScalar", [NSNumber numberWithBool:cmdAttr->useInputForSender], @"useInputForSender", nil]; // Set the object references last since these could be nil. [newDeviceInfo setValue:cmdAttr->object[0] forKey:@"object0"]; [newDeviceInfo setValue:cmdAttr->object[1] forKey:@"object1"]; [newDeviceInfo setValue:cmdAttr->object[2] forKey:@"object2"]; [newDeviceInfo setValue:cmdAttr->object[3] forKey:@"object3"]; return newDeviceInfo; } InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue) { InputAttributesList inputList; if (hidQueue == nil) { return inputList; } do { IOHIDValueRef hidValueRef = IOHIDQueueCopyNextValueWithTimeout(hidQueue, 0.0); if (hidValueRef == NULL) { break; } InputAttributesList hidInputList = InputListFromHatSwitchValue(hidValueRef, false); if (hidInputList.empty()) { hidInputList = InputListFromHIDValue(hidValueRef); } size_t hidInputCount = hidInputList.size(); for (unsigned int i = 0; i < hidInputCount; i++) { if (hidInputList[i].deviceCode[0] == '\0' || hidInputList[i].elementCode[0] == '\0') { continue; } inputList.push_back(hidInputList[i]); } CFRelease(hidValueRef); } while (1); if (!inputList.empty()) { // HID input devices don't register events, so we need to manually prevent // sleep and screensaver whenever we detect an input. UpdateSystemActivity(UsrActivity); } return inputList; } InputAttributes InputManagerEncodeKeyboardInput(const unsigned short keyCode, BOOL keyPressed) { std::string elementName = keyboardNameTable[keyCode]; InputAttributes inputAttr; strncpy(inputAttr.deviceCode, "NSEventKeyboard", INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.deviceName, "Keyboard", INPUT_HANDLER_STRING_LENGTH); snprintf(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH, "%d", keyCode); strncpy(inputAttr.elementName, (elementName.empty()) ? inputAttr.elementCode : elementName.c_str(), INPUT_HANDLER_STRING_LENGTH); inputAttr.state = (keyPressed) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; inputAttr.intCoordX = 0; inputAttr.intCoordY = 0; inputAttr.floatCoordX = 0.0f; inputAttr.floatCoordY = 0.0f; inputAttr.scalar = (keyPressed) ? 1.0f : 0.0f; inputAttr.sender = nil; return inputAttr; } InputAttributes InputManagerEncodeMouseButtonInput(const NSInteger buttonNumber, const NSPoint touchLoc, BOOL buttonPressed) { InputAttributes inputAttr; strncpy(inputAttr.deviceCode, "NSEventMouse", INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.deviceName, "Mouse", INPUT_HANDLER_STRING_LENGTH); snprintf(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH, "%i", (const int)buttonNumber); switch (buttonNumber) { case kCGMouseButtonLeft: strncpy(inputAttr.elementName, "Primary Button", INPUT_HANDLER_STRING_LENGTH); break; case kCGMouseButtonRight: strncpy(inputAttr.elementName, "Secondary Button", INPUT_HANDLER_STRING_LENGTH); break; case kCGMouseButtonCenter: strncpy(inputAttr.elementName, "Center Button", INPUT_HANDLER_STRING_LENGTH); break; default: snprintf(inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, "Button %i", (const int)buttonNumber); break; } inputAttr.state = (buttonPressed) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; inputAttr.intCoordX = (int32_t)touchLoc.x; inputAttr.intCoordY = (int32_t)touchLoc.y; inputAttr.floatCoordX = touchLoc.x; inputAttr.floatCoordY = touchLoc.y; inputAttr.scalar = (buttonPressed) ? 1.0f : 0.0f; inputAttr.sender = nil; return inputAttr; } InputAttributes InputManagerEncodeIBAction(const SEL theSelector, id sender) { InputAttributes inputAttr; strncpy(inputAttr.deviceCode, "IBAction", INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.deviceName, "Application", INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.elementCode, sel_getName(theSelector), INPUT_HANDLER_STRING_LENGTH); strncpy(inputAttr.elementName, inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH); inputAttr.state = INPUT_ATTRIBUTE_STATE_ON; inputAttr.intCoordX = 0; inputAttr.intCoordY = 0; inputAttr.floatCoordX = 0.0f; inputAttr.floatCoordY = 0.0f; inputAttr.scalar = 1.0f; inputAttr.sender = sender; return inputAttr; } @end desmume-0.9.9/src/cocoa/DeSmuME (XCode 3).xcodeproj/0000755000175000017500000000000012140306213022247 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj0000644000175000017500000130756412140261507025351 0ustar guillaumeguillaume// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ AB0F290614BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB0F290714BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB0F290814BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB0F290914BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB0F294814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB0F294914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB0F294A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB0F294B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB0F294C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB0F294D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB0F294E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB0F294F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB0F295014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB0F295114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB0F295214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB0F295314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB0F295414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB0F295514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB0F295614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB0F295714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB0F296F14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB0F297014BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB0F297B14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB0F299014BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB0F299114BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB0F299214BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB0F299314BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB0F29B814BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB0F29B914BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB0F29BA14BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB0F29BB14BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB0F29BC14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB0F29BD14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB0F29BE14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB0F29BF14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB0F29C014BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB0F29C114BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB0F29C214BE7213009ABC6F /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB0F29C314BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; AB0F29C414BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB0F29C514BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB0F29C614BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB0F29C714BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB0F29C814BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB0F29C914BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB213D45170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213D46170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213D48170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB213E991710D074006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB213EC41710D0A0006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB213EC51710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB213EC61710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB2145231714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2145241714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2145251714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2145261714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2A99A71725F00F0062C1A1 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB2A99A81725F00F0062C1A1 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB2A99A91725F00F0062C1A1 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB2A99AA1725F00F0062C1A1 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB2A99AB1725F00F0062C1A1 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB2A99AC1725F00F0062C1A1 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB2A99AD1725F00F0062C1A1 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB2A99AE1725F00F0062C1A1 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB2A99AF1725F00F0062C1A1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB2A99B01725F00F0062C1A1 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB2A99B11725F00F0062C1A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB2A99B21725F00F0062C1A1 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB2A99B31725F00F0062C1A1 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB2A99B41725F00F0062C1A1 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB2A99B51725F00F0062C1A1 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB2A99B61725F00F0062C1A1 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB2A99B71725F00F0062C1A1 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB2A99B81725F00F0062C1A1 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB2A99B91725F00F0062C1A1 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB2A99BA1725F00F0062C1A1 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB2A99BB1725F00F0062C1A1 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB2A99BC1725F00F0062C1A1 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB2A99BD1725F00F0062C1A1 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB2A99BE1725F00F0062C1A1 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB2A99BF1725F00F0062C1A1 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB2A99C01725F00F0062C1A1 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB2A99C11725F00F0062C1A1 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB2A99C21725F00F0062C1A1 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB2A99C31725F00F0062C1A1 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB2A99C41725F00F0062C1A1 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB2A99C51725F00F0062C1A1 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB2A99C61725F00F0062C1A1 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB2A99C71725F00F0062C1A1 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB2A99C81725F00F0062C1A1 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB2A99C91725F00F0062C1A1 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB2A99CA1725F00F0062C1A1 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB2A99CB1725F00F0062C1A1 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB2A99CC1725F00F0062C1A1 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB2A99CD1725F00F0062C1A1 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB2A99CE1725F00F0062C1A1 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB2A99CF1725F00F0062C1A1 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB2A99D01725F00F0062C1A1 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB2A99D11725F00F0062C1A1 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB2A99D21725F00F0062C1A1 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB2A99D31725F00F0062C1A1 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB2A99D41725F00F0062C1A1 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB2A99D51725F00F0062C1A1 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB2A99D61725F00F0062C1A1 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB2A99D71725F00F0062C1A1 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB2A99D81725F00F0062C1A1 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB2A99D91725F00F0062C1A1 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB2A99DA1725F00F0062C1A1 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB2A99DB1725F00F0062C1A1 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB2A99DC1725F00F0062C1A1 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB2A99DD1725F00F0062C1A1 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB2A99DE1725F00F0062C1A1 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB2A99DF1725F00F0062C1A1 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB2A99E01725F00F0062C1A1 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB2A99E11725F00F0062C1A1 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; AB2A99E21725F00F0062C1A1 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB2A99E31725F00F0062C1A1 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB2A99E41725F00F0062C1A1 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB2A99E51725F00F0062C1A1 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB2A99E61725F00F0062C1A1 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB2A99E71725F00F0062C1A1 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB2A99E81725F00F0062C1A1 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB2A99E91725F00F0062C1A1 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB2A99EA1725F00F0062C1A1 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB2A99EB1725F00F0062C1A1 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB2A99EC1725F00F0062C1A1 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB2A99ED1725F00F0062C1A1 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB2A99EE1725F00F0062C1A1 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB2A99F11725F00F0062C1A1 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB2A99F21725F00F0062C1A1 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; AB2A99F31725F00F0062C1A1 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB2A99F41725F00F0062C1A1 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB2A99F51725F00F0062C1A1 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB2A99F61725F00F0062C1A1 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB2A99F71725F00F0062C1A1 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB2A99F81725F00F0062C1A1 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB2A99F91725F00F0062C1A1 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB2A99FA1725F00F0062C1A1 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB2A99FB1725F00F0062C1A1 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB2A99FC1725F00F0062C1A1 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB2A99FD1725F00F0062C1A1 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB2A99FE1725F00F0062C1A1 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB2A99FF1725F00F0062C1A1 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB2A9A001725F00F0062C1A1 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB2A9A011725F00F0062C1A1 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB2A9A021725F00F0062C1A1 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB2A9A031725F00F0062C1A1 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB2A9A041725F00F0062C1A1 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB2A9A051725F00F0062C1A1 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB2A9A061725F00F0062C1A1 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB2A9A071725F00F0062C1A1 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB2A9A081725F00F0062C1A1 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB2A9A091725F00F0062C1A1 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB2A9A0A1725F00F0062C1A1 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB2A9A0B1725F00F0062C1A1 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB2A9A0C1725F00F0062C1A1 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB2A9A0D1725F00F0062C1A1 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB2A9A0E1725F00F0062C1A1 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB2A9A0F1725F00F0062C1A1 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB2A9A101725F00F0062C1A1 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB2A9A111725F00F0062C1A1 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB2A9A121725F00F0062C1A1 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB2A9A131725F00F0062C1A1 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB2A9A141725F00F0062C1A1 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB2A9A151725F00F0062C1A1 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB2A9A161725F00F0062C1A1 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB2A9A171725F00F0062C1A1 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB2A9A181725F00F0062C1A1 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB2A9A191725F00F0062C1A1 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB2A9A1A1725F00F0062C1A1 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB2A9A1B1725F00F0062C1A1 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB2A9A1C1725F00F0062C1A1 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB2A9A1D1725F00F0062C1A1 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB2A9A1E1725F00F0062C1A1 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB2A9A1F1725F00F0062C1A1 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB2A9A201725F00F0062C1A1 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB2A9A211725F00F0062C1A1 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB2A9A221725F00F0062C1A1 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB2A9A231725F00F0062C1A1 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB2A9A241725F00F0062C1A1 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB2A9A251725F00F0062C1A1 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB2A9A261725F00F0062C1A1 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; AB2A9A271725F00F0062C1A1 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB2A9A281725F00F0062C1A1 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB2A9A291725F00F0062C1A1 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB2A9A2A1725F00F0062C1A1 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB2A9A2B1725F00F0062C1A1 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB2A9A2C1725F00F0062C1A1 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB2A9A2D1725F00F0062C1A1 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB2A9A2E1725F00F0062C1A1 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB2A9A2F1725F00F0062C1A1 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB2A9A301725F00F0062C1A1 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB2A9A311725F00F0062C1A1 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB2A9A321725F00F0062C1A1 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB2A9A331725F00F0062C1A1 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB2A9A341725F00F0062C1A1 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB2A9A351725F00F0062C1A1 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB2A9A361725F00F0062C1A1 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB2A9A371725F00F0062C1A1 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB2A9A381725F00F0062C1A1 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB2A9A391725F00F0062C1A1 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB2A9A3A1725F00F0062C1A1 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB2A9A3B1725F00F0062C1A1 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB2A9A3C1725F00F0062C1A1 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB2A9A3D1725F00F0062C1A1 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB2A9A3E1725F00F0062C1A1 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB2A9A3F1725F00F0062C1A1 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB2A9A401725F00F0062C1A1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB2A9A411725F00F0062C1A1 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB2A9A421725F00F0062C1A1 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB2A9A431725F00F0062C1A1 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB2A9A441725F00F0062C1A1 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB2A9A451725F00F0062C1A1 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB2A9A461725F00F0062C1A1 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; AB2A9A471725F00F0062C1A1 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB2A9A481725F00F0062C1A1 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB2A9A491725F00F0062C1A1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB2A9A4A1725F00F0062C1A1 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB2A9A4B1725F00F0062C1A1 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB2A9A4C1725F00F0062C1A1 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB2A9A4D1725F00F0062C1A1 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB2A9A4E1725F00F0062C1A1 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB2A9A4F1725F00F0062C1A1 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB2A9A501725F00F0062C1A1 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB2A9A511725F00F0062C1A1 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB2A9A521725F00F0062C1A1 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB2A9A531725F00F0062C1A1 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB2A9A541725F00F0062C1A1 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB2A9A551725F00F0062C1A1 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB2A9A561725F00F0062C1A1 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB2A9A571725F00F0062C1A1 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; AB2A9A581725F00F0062C1A1 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; AB2A9A591725F00F0062C1A1 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; AB2A9A5A1725F00F0062C1A1 /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB2A9A5B1725F00F0062C1A1 /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB2A9A5C1725F00F0062C1A1 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB2A9A5D1725F00F0062C1A1 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB2A9A5E1725F00F0062C1A1 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB2A9A5F1725F00F0062C1A1 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB2A9A601725F00F0062C1A1 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB2A9A611725F00F0062C1A1 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB2A9A621725F00F0062C1A1 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB2A9A631725F00F0062C1A1 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB2A9A641725F00F0062C1A1 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB2A9A651725F00F0062C1A1 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB2A9A661725F00F0062C1A1 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB2A9A671725F00F0062C1A1 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB2A9A681725F00F0062C1A1 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB2A9A691725F00F0062C1A1 /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; }; AB2A9A6A1725F00F0062C1A1 /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; }; AB2A9A6B1725F00F0062C1A1 /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; AB2A9A6D1725F00F0062C1A1 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB2A9A6E1725F00F0062C1A1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB2A9A6F1725F00F0062C1A1 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB2A9A701725F00F0062C1A1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB2A9A711725F00F0062C1A1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB2A9A721725F00F0062C1A1 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB2A9A731725F00F0062C1A1 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB2A9A741725F00F0062C1A1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB2A9A751725F00F0062C1A1 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; }; AB2F3B7D15CF9C6000858373 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB2F3B7E15CF9C6000858373 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB2F3B7F15CF9C6000858373 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB2F3B8015CF9C6000858373 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB2F3B8115CF9C6000858373 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB2F3B8215CF9C6000858373 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB2F3B8315CF9C6000858373 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB2F3B8415CF9C6000858373 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB2F3B8515CF9C6000858373 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB2F3B8615CF9C6000858373 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB2F3B8715CF9C6000858373 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB2F3B8815CF9C6000858373 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB2F3B8915CF9C6000858373 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB2F3B8A15CF9C6000858373 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB2F3B8B15CF9C6000858373 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB2F3B8C15CF9C6000858373 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB2F3B8D15CF9C6000858373 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB2F3B8E15CF9C6000858373 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB2F3B8F15CF9C6000858373 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB2F3B9015CF9C6000858373 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB2F3B9115CF9C6000858373 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB2F3B9215CF9C6000858373 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB2F3B9315CF9C6000858373 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB2F3B9415CF9C6000858373 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB2F3B9515CF9C6000858373 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB2F3B9615CF9C6000858373 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB2F3B9715CF9C6000858373 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB2F3B9815CF9C6000858373 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB2F3B9915CF9C6000858373 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB2F3B9A15CF9C6000858373 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB2F3B9B15CF9C6000858373 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB2F3B9C15CF9C6000858373 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB2F3B9D15CF9C6000858373 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB2F3B9E15CF9C6000858373 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB2F3B9F15CF9C6000858373 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB2F3BA015CF9C6000858373 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB2F3BA115CF9C6000858373 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB2F3BA215CF9C6000858373 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB2F3BA315CF9C6000858373 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB2F3BA415CF9C6000858373 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB2F3BA515CF9C6000858373 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB2F3BA615CF9C6000858373 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB2F3BA715CF9C6000858373 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB2F3BA815CF9C6000858373 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB2F3BA915CF9C6000858373 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB2F3BAA15CF9C6000858373 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB2F3BAB15CF9C6000858373 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB2F3BAC15CF9C6000858373 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB2F3BAD15CF9C6000858373 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB2F3BAE15CF9C6000858373 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB2F3BAF15CF9C6000858373 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB2F3BB015CF9C6000858373 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB2F3BB115CF9C6000858373 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB2F3BB215CF9C6000858373 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB2F3BB315CF9C6000858373 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB2F3BB415CF9C6000858373 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB2F3BB515CF9C6000858373 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB2F3BB615CF9C6000858373 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB2F3BB715CF9C6000858373 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; AB2F3BB815CF9C6000858373 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB2F3BB915CF9C6000858373 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB2F3BBA15CF9C6000858373 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB2F3BBB15CF9C6000858373 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB2F3BBC15CF9C6000858373 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB2F3BBD15CF9C6000858373 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB2F3BBE15CF9C6000858373 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB2F3BBF15CF9C6000858373 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB2F3BC015CF9C6000858373 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB2F3BC115CF9C6000858373 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB2F3BC215CF9C6000858373 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB2F3BC315CF9C6000858373 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB2F3BC515CF9C6000858373 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB2F3BC715CF9C6000858373 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; AB2F3BC815CF9C6000858373 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB2F3BC915CF9C6000858373 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB2F3BCA15CF9C6000858373 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB2F3BCB15CF9C6000858373 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB2F3BCC15CF9C6000858373 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB2F3BCD15CF9C6000858373 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB2F3BCE15CF9C6000858373 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB2F3BD015CF9C6000858373 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB2F3BD115CF9C6000858373 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB2F3BD215CF9C6000858373 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB2F3BD315CF9C6000858373 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB2F3BD415CF9C6000858373 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB2F3BD515CF9C6000858373 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB2F3BD615CF9C6000858373 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB2F3BD715CF9C6000858373 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB2F3BD815CF9C6000858373 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB2F3BD915CF9C6000858373 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB2F3BDA15CF9C6000858373 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB2F3BDB15CF9C6000858373 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB2F3BDC15CF9C6000858373 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB2F3BDD15CF9C6000858373 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB2F3BDF15CF9C6000858373 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB2F3BE015CF9C6000858373 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB2F3BE215CF9C6000858373 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB2F3BE315CF9C6000858373 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB2F3BE415CF9C6000858373 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB2F3BE515CF9C6000858373 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB2F3BE615CF9C6000858373 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB2F3BE715CF9C6000858373 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB2F3BE815CF9C6000858373 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB2F3BE915CF9C6000858373 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB2F3BEA15CF9C6000858373 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB2F3BEB15CF9C6000858373 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB2F3BEC15CF9C6000858373 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB2F3BED15CF9C6000858373 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB2F3BEE15CF9C6000858373 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB2F3BEF15CF9C6000858373 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB2F3BF015CF9C6000858373 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB2F3BF215CF9C6000858373 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB2F3BF315CF9C6000858373 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB2F3BF415CF9C6000858373 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB2F3BF515CF9C6000858373 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB2F3BF615CF9C6000858373 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB2F3BF815CF9C6000858373 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB2F3BF915CF9C6000858373 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB2F3BFA15CF9C6000858373 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB2F3BFB15CF9C6000858373 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB2F3BFC15CF9C6000858373 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB2F3BFD15CF9C6000858373 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB2F3BFE15CF9C6000858373 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB2F3BFF15CF9C6000858373 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB2F3C0015CF9C6000858373 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; AB2F3C0115CF9C6000858373 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB2F3C0215CF9C6000858373 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB2F3C0315CF9C6000858373 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB2F3C0415CF9C6000858373 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB2F3C0515CF9C6000858373 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB2F3C0615CF9C6000858373 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB2F3C0715CF9C6000858373 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB2F3C0815CF9C6000858373 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB2F3C0915CF9C6000858373 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB2F3C0A15CF9C6000858373 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB2F3C0B15CF9C6000858373 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB2F3C0D15CF9C6000858373 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB2F3C0F15CF9C6000858373 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB2F3C1115CF9C6000858373 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB2F3C1215CF9C6000858373 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB2F3C1315CF9C6000858373 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB2F3C1415CF9C6000858373 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB2F3C1515CF9C6000858373 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB2F3C1615CF9C6000858373 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB2F3C1715CF9C6000858373 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB2F3C1815CF9C6000858373 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB2F3C1915CF9C6000858373 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB2F3C1A15CF9C6000858373 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB2F3C1C15CF9C6000858373 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB2F3C1D15CF9C6000858373 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB2F3C1E15CF9C6000858373 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB2F3C1F15CF9C6000858373 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB2F3C2015CF9C6000858373 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB2F3C2115CF9C6000858373 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB2F3C2215CF9C6000858373 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB2F3C2415CF9C6000858373 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB2F3C2515CF9C6000858373 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; AB2F3C2615CF9C6000858373 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB2F3C2715CF9C6000858373 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB2F3C2815CF9C6000858373 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB2F3C2915CF9C6000858373 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB2F3C2A15CF9C6000858373 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB2F3C2B15CF9C6000858373 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB2F3C2C15CF9C6000858373 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB2F3C2F15CF9C6000858373 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB2F3C3015CF9C6000858373 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB2F3C3115CF9C6000858373 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB2F3C3215CF9C6000858373 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB2F3C3315CF9C6000858373 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB2F3C3415CF9C6000858373 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB2F3C3515CF9C6000858373 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB2F3C3615CF9C6000858373 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB2F3C3715CF9C6000858373 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB2F3C3815CF9C6000858373 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; AB2F3C3915CF9C6000858373 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; AB2F3C3B15CF9C6000858373 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB2F3C3C15CF9C6000858373 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB2F3C3D15CF9C6000858373 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB2F3C3E15CF9C6000858373 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB2F3C3F15CF9C6000858373 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB2F3C4115CF9C6000858373 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB2F56F01704C86900E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB2F56F11704C86900E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB2F56F21704C86900E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB2F56F31704C86900E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F56EF1704C86900E28885 /* utilities.c */; }; AB3ACB7814C2361100D7D192 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB3ACB7914C2361100D7D192 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB3ACB7C14C2361100D7D192 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB3ACB7D14C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB3ACC4414C24D5400D7D192 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB3ACC4514C24D5400D7D192 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB3ACC4614C24D5400D7D192 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB3ACC4714C24D5400D7D192 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB3ACC4914C24D5400D7D192 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB4C4C3F16F55C64002E07CD /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB4C4C4016F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB4C4C4116F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB4C4C4216F55C64002E07CD /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB4C4C4316F55C64002E07CD /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB4C4C4416F55C64002E07CD /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB4C4C4516F55C64002E07CD /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB4C4C4616F55C64002E07CD /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB4C4C4716F55C64002E07CD /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB4C4C4816F55C64002E07CD /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB4C4C4916F55C64002E07CD /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB4C4C4A16F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB4C4C4B16F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB4C4C4C16F55C64002E07CD /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB4C4C4D16F55C64002E07CD /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB4C4C4E16F55C64002E07CD /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB4C4C4F16F55C64002E07CD /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB4C4C5016F55C64002E07CD /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB4C4C5116F55C64002E07CD /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB4C4C5216F55C64002E07CD /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB4C4C5316F55C64002E07CD /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB4C4C5416F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB4C4C5516F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB4C4C5616F55C64002E07CD /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB4C4C5716F55C64002E07CD /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB4C4C5816F55C64002E07CD /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB4C4C5916F55C64002E07CD /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB4C4C5A16F55C64002E07CD /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB4C4C5B16F55C64002E07CD /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB4C4C5C16F55C64002E07CD /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB4C4C5D16F55C64002E07CD /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */; }; AB4C4C5E16F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */; }; AB4C4C5F16F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */; }; AB4C4C6016F55C64002E07CD /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */; }; AB4C4C6116F55C64002E07CD /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */; }; AB4C4C6216F55C64002E07CD /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */; }; AB4C4C6316F55C64002E07CD /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */; }; AB4C4C6416F55C64002E07CD /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */; }; AB4C4C6516F55C64002E07CD /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3216F55C64002E07CD /* TDStretch.cpp */; }; AB4C4C6616F55C64002E07CD /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C4C3316F55C64002E07CD /* WavFile.cpp */; }; AB5A795816D5A56000ED84B7 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB5A795916D5A56000ED84B7 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB5A795A16D5A56000ED84B7 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB5A795B16D5A56000ED84B7 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB5A795716D5A56000ED84B7 /* InputManager.mm */; }; AB6A187C16C9951C00384EED /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB6A187D16C9951C00384EED /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB6A187E16C9951C00384EED /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB6A187F16C9951C00384EED /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */; }; AB6A198316CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB6A198416CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB6A198516CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB6A198616CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB700DBA16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DBB16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DBC16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DBD16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DDE16CDE4C300FBD336 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB700DDF16CDE4C300FBD336 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB700DE016CDE4C300FBD336 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB700DE116CDE4C300FBD336 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */; }; AB711ED21481C35F009011C8 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB711ED31481C35F009011C8 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB711ED81481C35F009011C8 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB711EDE1481C35F009011C8 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB711EEF1481C35F009011C8 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB711EF01481C35F009011C8 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB711EF11481C35F009011C8 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB711EF21481C35F009011C8 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB711EF31481C35F009011C8 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB711EF41481C35F009011C8 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB711EF51481C35F009011C8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB711EFB1481C35F009011C8 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB711EFC1481C35F009011C8 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB711EFD1481C35F009011C8 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB711EFE1481C35F009011C8 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB711F001481C35F009011C8 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; AB711F011481C35F009011C8 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB711F021481C35F009011C8 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB711F031481C35F009011C8 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB711F041481C35F009011C8 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB711F051481C35F009011C8 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB711F061481C35F009011C8 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB711F071481C35F009011C8 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB711F081481C35F009011C8 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB711F091481C35F009011C8 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB711F0A1481C35F009011C8 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB711F0B1481C35F009011C8 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB711F0C1481C35F009011C8 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB711F0D1481C35F009011C8 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB711F0E1481C35F009011C8 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB711F0F1481C35F009011C8 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB711F101481C35F009011C8 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB711F111481C35F009011C8 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB711F121481C35F009011C8 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB711F131481C35F009011C8 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB711F141481C35F009011C8 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB711F151481C35F009011C8 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB711F161481C35F009011C8 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB711F171481C35F009011C8 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB711F181481C35F009011C8 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB711F191481C35F009011C8 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB711F1A1481C35F009011C8 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB711F1B1481C35F009011C8 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB711F1C1481C35F009011C8 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB711F1D1481C35F009011C8 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB711F1E1481C35F009011C8 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB711F1F1481C35F009011C8 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB711F201481C35F009011C8 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB711F211481C35F009011C8 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB711F221481C35F009011C8 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB711F231481C35F009011C8 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB711F241481C35F009011C8 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; AB711F251481C35F009011C8 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB711F261481C35F009011C8 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB711F271481C35F009011C8 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB711F281481C35F009011C8 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB711F291481C35F009011C8 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB711F2A1481C35F009011C8 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB711F2B1481C35F009011C8 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB711F2C1481C35F009011C8 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB711F2D1481C35F009011C8 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB711F2E1481C35F009011C8 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB711F2F1481C35F009011C8 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB711F301481C35F009011C8 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB711F311481C35F009011C8 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB711F321481C35F009011C8 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB711F331481C35F009011C8 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB711F341481C35F009011C8 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB711F351481C35F009011C8 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB711F361481C35F009011C8 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB711F371481C35F009011C8 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB711F381481C35F009011C8 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB711F391481C35F009011C8 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB711F3A1481C35F009011C8 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB711F3B1481C35F009011C8 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB711F3C1481C35F009011C8 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB711F3D1481C35F009011C8 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB711F3E1481C35F009011C8 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB711F3F1481C35F009011C8 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB711F401481C35F009011C8 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB711F411481C35F009011C8 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB711F421481C35F009011C8 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB711F431481C35F009011C8 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB711F461481C35F009011C8 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB711F471481C35F009011C8 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB711F481481C35F009011C8 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB711F491481C35F009011C8 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB711F4A1481C35F009011C8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB711F4C1481C35F009011C8 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB711F4E1481C35F009011C8 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB711F501481C35F009011C8 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB711F511481C35F009011C8 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB711F521481C35F009011C8 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB711F5C1481C35F009011C8 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB711F5D1481C35F009011C8 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB711F5E1481C35F009011C8 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; AB711F5F1481C35F009011C8 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB711F611481C35F009011C8 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB711F621481C35F009011C8 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB711F631481C35F009011C8 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB711F641481C35F009011C8 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB711F6C1481C35F009011C8 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB711F6D1481C35F009011C8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB711F6E1481C35F009011C8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB711F701481C35F009011C8 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB711F741481C35F009011C8 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB711F751481C35F009011C8 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB711F771481C35F009011C8 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB711F781481C35F009011C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB73A96A1507C9F500A310C8 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB73A96B1507C9F500A310C8 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB73A96C1507C9F500A310C8 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB73A96D1507C9F500A310C8 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB73A96E1507C9F500A310C8 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB73A96F1507C9F500A310C8 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB73A9701507C9F500A310C8 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB73A9711507C9F500A310C8 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB73A9721507C9F500A310C8 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB73A9731507C9F500A310C8 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB73A9741507C9F500A310C8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB73A9751507C9F500A310C8 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB73A9761507C9F500A310C8 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB73A9771507C9F500A310C8 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB73A9781507C9F500A310C8 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB73A9791507C9F500A310C8 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB73A97A1507C9F500A310C8 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB73A97B1507C9F500A310C8 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB73A97C1507C9F500A310C8 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB73A97D1507C9F500A310C8 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB73A97E1507C9F500A310C8 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB73A97F1507C9F500A310C8 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB73A9801507C9F500A310C8 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB73A9811507C9F500A310C8 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB73A9821507C9F500A310C8 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB73A9831507C9F500A310C8 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB73A9841507C9F500A310C8 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB73A9851507C9F500A310C8 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB73A9861507C9F500A310C8 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB73A9871507C9F500A310C8 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB73A9881507C9F500A310C8 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB73A9891507C9F500A310C8 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB73A98A1507C9F500A310C8 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB73A98B1507C9F500A310C8 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB73A98C1507C9F500A310C8 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB73A98D1507C9F500A310C8 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB73A98E1507C9F500A310C8 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB73A98F1507C9F500A310C8 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB73A9901507C9F500A310C8 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB73A9911507C9F500A310C8 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB73A9921507C9F500A310C8 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB73A9931507C9F500A310C8 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB73A9941507C9F500A310C8 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB73A9951507C9F500A310C8 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB73A9961507C9F500A310C8 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB73A9971507C9F500A310C8 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB73A9981507C9F500A310C8 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB73A9991507C9F500A310C8 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB73A99A1507C9F500A310C8 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB73A99B1507C9F500A310C8 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB73A99C1507C9F500A310C8 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB73A99D1507C9F500A310C8 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB73A99E1507C9F500A310C8 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB73A99F1507C9F500A310C8 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB73A9A01507C9F500A310C8 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB73A9A11507C9F500A310C8 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB73A9A21507C9F500A310C8 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB73A9A31507C9F500A310C8 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB73A9A41507C9F500A310C8 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; AB73A9A51507C9F500A310C8 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB73A9A61507C9F500A310C8 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB73A9A71507C9F500A310C8 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB73A9A81507C9F500A310C8 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB73A9A91507C9F500A310C8 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB73A9AA1507C9F500A310C8 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB73A9AB1507C9F500A310C8 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB73A9AC1507C9F500A310C8 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB73A9AD1507C9F500A310C8 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB73A9AE1507C9F500A310C8 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB73A9B01507C9F500A310C8 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB73A9B11507C9F500A310C8 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB73A9B31507C9F500A310C8 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB73A9B51507C9F500A310C8 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; AB73A9B61507C9F500A310C8 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB73A9B71507C9F500A310C8 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB73A9B81507C9F500A310C8 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB73A9B91507C9F500A310C8 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB73A9BA1507C9F500A310C8 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB73A9BB1507C9F500A310C8 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB73A9BC1507C9F500A310C8 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB73A9BE1507C9F500A310C8 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB73A9BF1507C9F500A310C8 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB73A9C01507C9F500A310C8 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB73A9C11507C9F500A310C8 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB73A9C21507C9F500A310C8 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB73A9C31507C9F500A310C8 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB73A9C41507C9F500A310C8 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB73A9C51507C9F500A310C8 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB73A9C61507C9F500A310C8 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB73A9C71507C9F500A310C8 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB73A9C81507C9F500A310C8 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB73A9C91507C9F500A310C8 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB73A9CA1507C9F500A310C8 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB73A9CB1507C9F500A310C8 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB73A9CD1507C9F500A310C8 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB73A9CE1507C9F500A310C8 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB73A9D01507C9F500A310C8 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB73A9D11507C9F500A310C8 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB73A9D21507C9F500A310C8 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB73A9D31507C9F500A310C8 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB73A9D41507C9F500A310C8 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB73A9D51507C9F500A310C8 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB73A9D61507C9F500A310C8 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB73A9D71507C9F500A310C8 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB73A9D81507C9F500A310C8 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB73A9D91507C9F500A310C8 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB73A9DA1507C9F500A310C8 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB73A9DB1507C9F500A310C8 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB73A9DC1507C9F500A310C8 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB73A9DD1507C9F500A310C8 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB73A9DE1507C9F500A310C8 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB73A9E01507C9F500A310C8 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB73A9E11507C9F500A310C8 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB73A9E21507C9F500A310C8 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB73A9E31507C9F500A310C8 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB73A9E41507C9F500A310C8 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB73A9E61507C9F500A310C8 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB73A9E71507C9F500A310C8 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB73A9E81507C9F500A310C8 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB73A9E91507C9F500A310C8 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB73A9EA1507C9F500A310C8 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB73A9EB1507C9F500A310C8 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB73A9EC1507C9F500A310C8 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB73A9ED1507C9F500A310C8 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB73A9EE1507C9F500A310C8 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; AB73A9EF1507C9F500A310C8 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB73A9F01507C9F500A310C8 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB73A9F11507C9F500A310C8 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB73A9F21507C9F500A310C8 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB73A9F31507C9F500A310C8 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB73A9F41507C9F500A310C8 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB73A9F51507C9F500A310C8 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB73A9F61507C9F500A310C8 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB73A9F71507C9F500A310C8 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB73A9F81507C9F500A310C8 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB73A9F91507C9F500A310C8 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB73A9FB1507C9F500A310C8 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB73A9FD1507C9F500A310C8 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB73A9FF1507C9F500A310C8 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB73AA001507C9F500A310C8 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB73AA011507C9F500A310C8 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB73AA021507C9F500A310C8 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB73AA031507C9F500A310C8 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB73AA041507C9F500A310C8 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB73AA051507C9F500A310C8 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB73AA061507C9F500A310C8 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB73AA071507C9F500A310C8 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB73AA081507C9F500A310C8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB73AA0A1507C9F500A310C8 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB73AA0B1507C9F500A310C8 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB73AA0C1507C9F500A310C8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB73AA0D1507C9F500A310C8 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB73AA0E1507C9F500A310C8 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB73AA0F1507C9F500A310C8 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB73AA101507C9F500A310C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB73AA121507C9F500A310C8 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB73AA131507C9F500A310C8 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; AB73AA141507C9F500A310C8 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB73AA151507C9F500A310C8 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB73AA161507C9F500A310C8 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB73AA171507C9F500A310C8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB73AA181507C9F500A310C8 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB73AA191507C9F500A310C8 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB73AA1A1507C9F500A310C8 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB73AA1D1507C9F500A310C8 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB73AA1E1507C9F500A310C8 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB73AA1F1507C9F500A310C8 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB73AA201507C9F500A310C8 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB73AA211507C9F500A310C8 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB73AA221507C9F500A310C8 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB73AA231507C9F500A310C8 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB73AA241507C9F500A310C8 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB73AA251507C9F500A310C8 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB73AA261507C9F500A310C8 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; AB73AA271507C9F500A310C8 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; AB73AA291507C9F500A310C8 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB73AA2A1507C9F500A310C8 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB73AA2B1507C9F500A310C8 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB73AA2C1507C9F500A310C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB73AA2D1507C9F500A310C8 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB73AA2F1507C9F500A310C8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB75226F14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB97C554169646D1002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB97D5E516964F3B002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB97D60916964F48002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; AB97D60C16964F54002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97C553169646D1002AC11B /* Accelerate.framework */; }; ABA03570169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; ABA03571169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; ABA03572169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; ABA03573169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */; }; ABAAFBEA172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; ABAAFBEB172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; ABAAFBEC172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; ABAAFBED172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; }; ABAD0F7315ACE7A00000EC47 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; ABAD0F7415ACE7A00000EC47 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; ABAD0F7515ACE7A00000EC47 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; ABAD0F7615ACE7A00000EC47 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; ABAD0F7715ACE7A00000EC47 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; ABAD0F7815ACE7A00000EC47 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; ABAD0F7915ACE7A00000EC47 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; ABAD0F7A15ACE7A00000EC47 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; ABAD0F7B15ACE7A00000EC47 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; ABAD0F7C15ACE7A00000EC47 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; ABAD0F7D15ACE7A00000EC47 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; ABAD0F7E15ACE7A00000EC47 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; ABAD0F7F15ACE7A00000EC47 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; ABAD0F8015ACE7A00000EC47 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; ABAD0F8115ACE7A00000EC47 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; ABAD0F8215ACE7A00000EC47 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; ABAD0F8315ACE7A00000EC47 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; ABAD0F8415ACE7A00000EC47 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; ABAD0F8515ACE7A00000EC47 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; ABAD0F8615ACE7A00000EC47 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; ABAD0F8715ACE7A00000EC47 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; ABAD0F8815ACE7A00000EC47 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; ABAD0F8915ACE7A00000EC47 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; ABAD0F8A15ACE7A00000EC47 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; ABAD0F8B15ACE7A00000EC47 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; ABAD0F8C15ACE7A00000EC47 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; ABAD0F8D15ACE7A00000EC47 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; ABAD0F8E15ACE7A00000EC47 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; ABAD0F8F15ACE7A00000EC47 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; ABAD0F9015ACE7A00000EC47 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; ABAD0F9115ACE7A00000EC47 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; ABAD0F9215ACE7A00000EC47 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; ABAD0F9315ACE7A00000EC47 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; ABAD0F9415ACE7A00000EC47 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; ABAD0F9515ACE7A00000EC47 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; ABAD0F9615ACE7A00000EC47 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; ABAD0F9715ACE7A00000EC47 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; ABAD0F9815ACE7A00000EC47 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; ABAD0F9915ACE7A00000EC47 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; ABAD0F9A15ACE7A00000EC47 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; ABAD0F9B15ACE7A00000EC47 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; ABAD0F9C15ACE7A00000EC47 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; ABAD0F9D15ACE7A00000EC47 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; ABAD0F9E15ACE7A00000EC47 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; ABAD0F9F15ACE7A00000EC47 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; ABAD0FA015ACE7A00000EC47 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; ABAD0FA115ACE7A00000EC47 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; ABAD0FA215ACE7A00000EC47 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; ABAD0FA315ACE7A00000EC47 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; ABAD0FA415ACE7A00000EC47 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; ABAD0FA515ACE7A00000EC47 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; ABAD0FA615ACE7A00000EC47 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; ABAD0FA715ACE7A00000EC47 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; ABAD0FA815ACE7A00000EC47 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; ABAD0FA915ACE7A00000EC47 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; ABAD0FAA15ACE7A00000EC47 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; ABAD0FAB15ACE7A00000EC47 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; ABAD0FAC15ACE7A00000EC47 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; ABAD0FAD15ACE7A00000EC47 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; ABAD0FAE15ACE7A00000EC47 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; ABAD0FAF15ACE7A00000EC47 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; ABAD0FB015ACE7A00000EC47 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; ABAD0FB115ACE7A00000EC47 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; ABAD0FB215ACE7A00000EC47 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; ABAD0FB315ACE7A00000EC47 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; ABAD0FB415ACE7A00000EC47 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; ABAD0FB515ACE7A00000EC47 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; ABAD0FB615ACE7A00000EC47 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; ABAD0FB715ACE7A00000EC47 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; ABAD0FB815ACE7A00000EC47 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; ABAD0FB915ACE7A00000EC47 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; ABAD0FBB15ACE7A00000EC47 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; ABAD0FBD15ACE7A00000EC47 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; ABAD0FBE15ACE7A00000EC47 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; ABAD0FBF15ACE7A00000EC47 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; ABAD0FC015ACE7A00000EC47 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; ABAD0FC115ACE7A00000EC47 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; ABAD0FC215ACE7A00000EC47 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; ABAD0FC315ACE7A00000EC47 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; ABAD0FC415ACE7A00000EC47 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; ABAD0FC615ACE7A00000EC47 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; ABAD0FC715ACE7A00000EC47 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; ABAD0FC815ACE7A00000EC47 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; ABAD0FC915ACE7A00000EC47 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; ABAD0FCA15ACE7A00000EC47 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; ABAD0FCB15ACE7A00000EC47 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; ABAD0FCC15ACE7A00000EC47 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; ABAD0FCD15ACE7A00000EC47 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; ABAD0FCE15ACE7A00000EC47 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; ABAD0FCF15ACE7A00000EC47 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; ABAD0FD015ACE7A00000EC47 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; ABAD0FD115ACE7A00000EC47 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; ABAD0FD215ACE7A00000EC47 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; ABAD0FD315ACE7A00000EC47 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; ABAD0FD515ACE7A00000EC47 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; ABAD0FD615ACE7A00000EC47 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; ABAD0FD815ACE7A00000EC47 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; ABAD0FD915ACE7A00000EC47 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; ABAD0FDA15ACE7A00000EC47 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; ABAD0FDB15ACE7A00000EC47 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; ABAD0FDC15ACE7A00000EC47 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; ABAD0FDD15ACE7A00000EC47 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; ABAD0FDE15ACE7A00000EC47 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; ABAD0FDF15ACE7A00000EC47 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; ABAD0FE015ACE7A00000EC47 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; ABAD0FE115ACE7A00000EC47 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; ABAD0FE215ACE7A00000EC47 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; ABAD0FE315ACE7A00000EC47 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; ABAD0FE415ACE7A00000EC47 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; ABAD0FE515ACE7A00000EC47 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; ABAD0FE615ACE7A00000EC47 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; ABAD0FE815ACE7A00000EC47 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; ABAD0FE915ACE7A00000EC47 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; ABAD0FEA15ACE7A00000EC47 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; ABAD0FEB15ACE7A00000EC47 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; ABAD0FEC15ACE7A00000EC47 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; ABAD0FEE15ACE7A00000EC47 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; ABAD0FEF15ACE7A00000EC47 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; ABAD0FF015ACE7A00000EC47 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; ABAD0FF115ACE7A00000EC47 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; ABAD0FF215ACE7A00000EC47 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; ABAD0FF315ACE7A00000EC47 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; ABAD0FF415ACE7A00000EC47 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; ABAD0FF515ACE7A00000EC47 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; ABAD0FF615ACE7A00000EC47 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; ABAD0FF715ACE7A00000EC47 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; ABAD0FF815ACE7A00000EC47 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; ABAD0FF915ACE7A00000EC47 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; ABAD0FFA15ACE7A00000EC47 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; ABAD0FFB15ACE7A00000EC47 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; ABAD0FFC15ACE7A00000EC47 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; ABAD0FFD15ACE7A00000EC47 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; ABAD0FFE15ACE7A00000EC47 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; ABAD0FFF15ACE7A00000EC47 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; ABAD100015ACE7A00000EC47 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; ABAD100115ACE7A00000EC47 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; ABAD100315ACE7A00000EC47 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; ABAD100515ACE7A00000EC47 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; ABAD100715ACE7A00000EC47 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; ABAD100815ACE7A00000EC47 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; ABAD100915ACE7A00000EC47 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; ABAD100A15ACE7A00000EC47 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; ABAD100B15ACE7A00000EC47 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; ABAD100C15ACE7A00000EC47 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; ABAD100D15ACE7A00000EC47 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; ABAD100E15ACE7A00000EC47 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; ABAD100F15ACE7A00000EC47 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; ABAD101015ACE7A00000EC47 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; ABAD101215ACE7A00000EC47 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; ABAD101315ACE7A00000EC47 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; ABAD101415ACE7A00000EC47 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; ABAD101515ACE7A00000EC47 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; ABAD101615ACE7A00000EC47 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; ABAD101715ACE7A00000EC47 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; ABAD101815ACE7A00000EC47 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; ABAD101A15ACE7A00000EC47 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; ABAD101B15ACE7A00000EC47 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; }; ABAD101C15ACE7A00000EC47 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; ABAD101D15ACE7A00000EC47 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; ABAD101E15ACE7A00000EC47 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; ABAD101F15ACE7A00000EC47 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; ABAD102015ACE7A00000EC47 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; ABAD102115ACE7A00000EC47 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; ABAD102215ACE7A00000EC47 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; ABAD102515ACE7A00000EC47 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; ABAD102615ACE7A00000EC47 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; ABAD102715ACE7A00000EC47 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; ABAD102815ACE7A00000EC47 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; ABAD102915ACE7A00000EC47 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; ABAD102A15ACE7A00000EC47 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; ABAD102B15ACE7A00000EC47 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; ABAD102C15ACE7A00000EC47 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; ABAD102D15ACE7A00000EC47 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; ABAD102E15ACE7A00000EC47 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; ABAD102F15ACE7A00000EC47 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; ABAD103F15ACE7A00000EC47 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; ABAD104015ACE7A00000EC47 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; ABAD104115ACE7A00000EC47 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; ABAD104215ACE7A00000EC47 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; ABBCE29715ACB1FF00A2C965 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */; }; ABBCE29815ACB1FF00A2C965 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */; }; ABBF04A614B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; ABC3AF3314B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; ABC3AF3414B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; ABC3AF3514B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; ABC3AF3614B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; ABD0A53A1501AA5A0074A094 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */; }; ABD0A53B1501AA5A0074A094 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */; }; ABF50ABA169F5FDA0018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7B169F5FDA0018C08D /* assembler.cpp */; }; ABF50ABB169F5FDA0018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7D169F5FDA0018C08D /* assert.cpp */; }; ABF50ABC169F5FDA0018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7F169F5FDA0018C08D /* buffer.cpp */; }; ABF50ABD169F5FDA0018C08D /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A82169F5FDA0018C08D /* compiler.cpp */; }; ABF50ABE169F5FDA0018C08D /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A84169F5FDA0018C08D /* compilercontext.cpp */; }; ABF50ABF169F5FDA0018C08D /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A86169F5FDA0018C08D /* compilerfunc.cpp */; }; ABF50AC0169F5FDA0018C08D /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A88169F5FDA0018C08D /* compileritem.cpp */; }; ABF50AC1169F5FDA0018C08D /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8A169F5FDA0018C08D /* context.cpp */; }; ABF50AC2169F5FDA0018C08D /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8C169F5FDA0018C08D /* cpuinfo.cpp */; }; ABF50AC3169F5FDA0018C08D /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8E169F5FDA0018C08D /* defs.cpp */; }; ABF50AC4169F5FDA0018C08D /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A90169F5FDA0018C08D /* func.cpp */; }; ABF50AC5169F5FDA0018C08D /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A94169F5FDA0018C08D /* logger.cpp */; }; ABF50AC6169F5FDA0018C08D /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A96169F5FDA0018C08D /* memorymanager.cpp */; }; ABF50AC7169F5FDA0018C08D /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A98169F5FDA0018C08D /* memorymarker.cpp */; }; ABF50AC8169F5FDA0018C08D /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9A169F5FDA0018C08D /* operand.cpp */; }; ABF50AC9169F5FDA0018C08D /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9D169F5FDA0018C08D /* stringbuilder.cpp */; }; ABF50ACA169F5FDA0018C08D /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9F169F5FDA0018C08D /* stringutil.cpp */; }; ABF50ACB169F5FDA0018C08D /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA1169F5FDA0018C08D /* virtualmemory.cpp */; }; ABF50ACC169F5FDA0018C08D /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA3169F5FDA0018C08D /* zonememory.cpp */; }; ABF50ACD169F5FDA0018C08D /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA6169F5FDA0018C08D /* x86assembler.cpp */; }; ABF50ACE169F5FDA0018C08D /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA8169F5FDA0018C08D /* x86compiler.cpp */; }; ABF50ACF169F5FDA0018C08D /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAA169F5FDA0018C08D /* x86compilercontext.cpp */; }; ABF50AD0169F5FDA0018C08D /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAC169F5FDA0018C08D /* x86compilerfunc.cpp */; }; ABF50AD1169F5FDA0018C08D /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAE169F5FDA0018C08D /* x86compileritem.cpp */; }; ABF50AD2169F5FDA0018C08D /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB0169F5FDA0018C08D /* x86cpuinfo.cpp */; }; ABF50AD3169F5FDA0018C08D /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB2169F5FDA0018C08D /* x86defs.cpp */; }; ABF50AD4169F5FDA0018C08D /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB4169F5FDA0018C08D /* x86func.cpp */; }; ABF50AD5169F5FDA0018C08D /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB6169F5FDA0018C08D /* x86operand.cpp */; }; ABF50AD6169F5FDA0018C08D /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB8169F5FDA0018C08D /* x86util.cpp */; }; ABF50B11169F5FDA0018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7B169F5FDA0018C08D /* assembler.cpp */; }; ABF50B12169F5FDA0018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7D169F5FDA0018C08D /* assert.cpp */; }; ABF50B13169F5FDA0018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A7F169F5FDA0018C08D /* buffer.cpp */; }; ABF50B14169F5FDA0018C08D /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A82169F5FDA0018C08D /* compiler.cpp */; }; ABF50B15169F5FDA0018C08D /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A84169F5FDA0018C08D /* compilercontext.cpp */; }; ABF50B16169F5FDA0018C08D /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A86169F5FDA0018C08D /* compilerfunc.cpp */; }; ABF50B17169F5FDA0018C08D /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A88169F5FDA0018C08D /* compileritem.cpp */; }; ABF50B18169F5FDA0018C08D /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8A169F5FDA0018C08D /* context.cpp */; }; ABF50B19169F5FDA0018C08D /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8C169F5FDA0018C08D /* cpuinfo.cpp */; }; ABF50B1A169F5FDA0018C08D /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A8E169F5FDA0018C08D /* defs.cpp */; }; ABF50B1B169F5FDA0018C08D /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A90169F5FDA0018C08D /* func.cpp */; }; ABF50B1C169F5FDA0018C08D /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A94169F5FDA0018C08D /* logger.cpp */; }; ABF50B1D169F5FDA0018C08D /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A96169F5FDA0018C08D /* memorymanager.cpp */; }; ABF50B1E169F5FDA0018C08D /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A98169F5FDA0018C08D /* memorymarker.cpp */; }; ABF50B1F169F5FDA0018C08D /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9A169F5FDA0018C08D /* operand.cpp */; }; ABF50B20169F5FDA0018C08D /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9D169F5FDA0018C08D /* stringbuilder.cpp */; }; ABF50B21169F5FDA0018C08D /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50A9F169F5FDA0018C08D /* stringutil.cpp */; }; ABF50B22169F5FDA0018C08D /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA1169F5FDA0018C08D /* virtualmemory.cpp */; }; ABF50B23169F5FDA0018C08D /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA3169F5FDA0018C08D /* zonememory.cpp */; }; ABF50B24169F5FDA0018C08D /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA6169F5FDA0018C08D /* x86assembler.cpp */; }; ABF50B25169F5FDA0018C08D /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AA8169F5FDA0018C08D /* x86compiler.cpp */; }; ABF50B26169F5FDA0018C08D /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAA169F5FDA0018C08D /* x86compilercontext.cpp */; }; ABF50B27169F5FDA0018C08D /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAC169F5FDA0018C08D /* x86compilerfunc.cpp */; }; ABF50B28169F5FDA0018C08D /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AAE169F5FDA0018C08D /* x86compileritem.cpp */; }; ABF50B29169F5FDA0018C08D /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB0169F5FDA0018C08D /* x86cpuinfo.cpp */; }; ABF50B2A169F5FDA0018C08D /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB2169F5FDA0018C08D /* x86defs.cpp */; }; ABF50B2B169F5FDA0018C08D /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB4169F5FDA0018C08D /* x86func.cpp */; }; ABF50B2C169F5FDA0018C08D /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB6169F5FDA0018C08D /* x86operand.cpp */; }; ABF50B2D169F5FDA0018C08D /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50AB8169F5FDA0018C08D /* x86util.cpp */; }; ABFE150F14C92FF5005D6699 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; ABFE151014C92FF5005D6699 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; ABFE151114C92FF5005D6699 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; ABFE151214C92FF5005D6699 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; ABFE151314C92FF5005D6699 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; ABFE151514C92FF5005D6699 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; ABFE151614C92FF5005D6699 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AB00E87A14205EAE00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = translations/English.lproj/InfoPlist.strings; sourceTree = ""; }; AB00E87D14205EBC00DE561F /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/MainMenu.xib; sourceTree = ""; }; AB00E89114205ECC00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = translations/English.lproj/Localizable.strings; sourceTree = ""; }; AB02475B13886BF300E9F9AB /* KeyNames.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = KeyNames.plist; sourceTree = ""; }; AB02791814415E4C0075E58C /* Info (Debug).plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info (Debug).plist"; sourceTree = ""; }; AB0A0D1914AACA9600E83E91 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Execute_420x420.png; path = images/Icon_Execute_420x420.png; sourceTree = ""; }; AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Pause_420x420.png; path = images/Icon_Pause_420x420.png; sourceTree = ""; }; AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed1x_420x420.png; path = images/Icon_Speed1x_420x420.png; sourceTree = ""; }; AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed2x_420x420.png; path = images/Icon_Speed2x_420x420.png; sourceTree = ""; }; AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Blue_16x16.png; path = images/ColorSwatch_Blue_16x16.png; sourceTree = ""; }; AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Brown_16x16.png; path = images/ColorSwatch_Brown_16x16.png; sourceTree = ""; }; AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkBlue_16x16.png; path = images/ColorSwatch_DarkBlue_16x16.png; sourceTree = ""; }; AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkGreen_16x16.png; path = images/ColorSwatch_DarkGreen_16x16.png; sourceTree = ""; }; AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkPurple_16x16.png; path = images/ColorSwatch_DarkPurple_16x16.png; sourceTree = ""; }; AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Gray_16x16.png; path = images/ColorSwatch_Gray_16x16.png; sourceTree = ""; }; AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Green_16x16.png; path = images/ColorSwatch_Green_16x16.png; sourceTree = ""; }; AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_LimeGreen_16x16.png; path = images/ColorSwatch_LimeGreen_16x16.png; sourceTree = ""; }; AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Magenta_16x16.png; path = images/ColorSwatch_Magenta_16x16.png; sourceTree = ""; }; AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Orange_16x16.png; path = images/ColorSwatch_Orange_16x16.png; sourceTree = ""; }; AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Pink_16x16.png; path = images/ColorSwatch_Pink_16x16.png; sourceTree = ""; }; AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Red_16x16.png; path = images/ColorSwatch_Red_16x16.png; sourceTree = ""; }; AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_SeaGreen_16x16.png; path = images/ColorSwatch_SeaGreen_16x16.png; sourceTree = ""; }; AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Turquoise_16x16.png; path = images/ColorSwatch_Turquoise_16x16.png; sourceTree = ""; }; AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Violet_16x16.png; path = images/ColorSwatch_Violet_16x16.png; sourceTree = ""; }; AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Yellow_16x16.png; path = images/ColorSwatch_Yellow_16x16.png; sourceTree = ""; }; AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_128x128.png; path = images/Icon_ActionReplay_128x128.png; sourceTree = ""; }; AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_128x128.png; path = images/Icon_CodeBreaker_128x128.png; sourceTree = ""; }; AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = VideoFilterPreview_64x64.png; path = images/VideoFilterPreview_64x64.png; sourceTree = ""; }; AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowDown_420x420.png; path = images/Icon_ArrowDown_420x420.png; sourceTree = ""; }; AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowLeft_420x420.png; path = images/Icon_ArrowLeft_420x420.png; sourceTree = ""; }; AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowRight_420x420.png; path = images/Icon_ArrowRight_420x420.png; sourceTree = ""; }; AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowUp_420x420.png; path = images/Icon_ArrowUp_420x420.png; sourceTree = ""; }; AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DoubleSpeed_420x420.png; path = images/Icon_DoubleSpeed_420x420.png; sourceTree = ""; }; AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonA_420x420.png; path = images/Icon_DSButtonA_420x420.png; sourceTree = ""; }; AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonB_420x420.png; path = images/Icon_DSButtonB_420x420.png; sourceTree = ""; }; AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonL_420x420.png; path = images/Icon_DSButtonL_420x420.png; sourceTree = ""; }; AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonR_420x420.png; path = images/Icon_DSButtonR_420x420.png; sourceTree = ""; }; AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonSelect_420x420.png; path = images/Icon_DSButtonSelect_420x420.png; sourceTree = ""; }; AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonStart_420x420.png; path = images/Icon_DSButtonStart_420x420.png; sourceTree = ""; }; AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonX_420x420.png; path = images/Icon_DSButtonX_420x420.png; sourceTree = ""; }; AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonY_420x420.png; path = images/Icon_DSButtonY_420x420.png; sourceTree = ""; }; AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Emulation_420x420.png; path = images/Icon_Emulation_420x420.png; sourceTree = ""; }; AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Input_420x420.png; path = images/Icon_Input_420x420.png; sourceTree = ""; }; AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Microphone_420x420.png; path = images/Icon_Microphone_420x420.png; sourceTree = ""; }; AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_OpenROM_420x420.png; path = images/Icon_OpenROM_420x420.png; sourceTree = ""; }; AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Reset_420x420.png; path = images/Icon_Reset_420x420.png; sourceTree = ""; }; AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCCW_420x420.png; path = images/Icon_RotateCCW_420x420.png; sourceTree = ""; }; AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCW_420x420.png; path = images/Icon_RotateCW_420x420.png; sourceTree = ""; }; AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ShowHUD_420x420.png; path = images/Icon_ShowHUD_420x420.png; sourceTree = ""; }; AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = ""; }; AB213D43170CB141006DDB0F /* InputProfileController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputProfileController.h; sourceTree = ""; }; AB213D44170CB141006DDB0F /* InputProfileController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputProfileController.mm; sourceTree = ""; }; AB213E981710D074006DDB0F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; AB2145211714DFF4006DDB0F /* audiosamplegenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiosamplegenerator.h; sourceTree = ""; }; AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiosamplegenerator.cpp; sourceTree = ""; }; AB2A9A791725F00F0062C1A1 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB2F3C4515CF9C6000858373 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB2F56EE1704C86900E28885 /* utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = ""; }; AB2F56EF1704C86900E28885 /* utilities.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utilities.c; sourceTree = ""; }; AB350BA41478AC96007165AC /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; AB350D38147A1D8D007165AC /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = English; path = translations/English.lproj/HID_usage_strings.plist; sourceTree = ""; }; AB3ACB6614C2361100D7D192 /* appDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = appDelegate.h; sourceTree = ""; }; AB3ACB6714C2361100D7D192 /* appDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = appDelegate.mm; sourceTree = ""; }; AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cheatWindowDelegate.h; sourceTree = ""; }; AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cheatWindowDelegate.mm; sourceTree = ""; }; AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inputPrefsView.h; sourceTree = ""; }; AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = inputPrefsView.mm; sourceTree = ""; }; AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = preferencesWindowDelegate.h; sourceTree = ""; }; AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = preferencesWindowDelegate.mm; sourceTree = ""; }; AB3ACC3814C24D5400D7D192 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; }; AB3ACC3914C24D5400D7D192 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; }; AB3ACC3A14C24D5400D7D192 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; }; AB3ACC3B14C24D5400D7D192 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; }; AB3ACC3D14C24D5400D7D192 /* README.MAC */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.MAC; path = ../../README.MAC; sourceTree = SOURCE_ROOT; }; AB3E34C7134AF4500056477A /* cocoa_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_output.h; sourceTree = ""; }; AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = ""; }; AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AAFilter.cpp; sourceTree = ""; }; AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_detect_x86_gcc.cpp; sourceTree = ""; }; AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIFOSampleBuffer.cpp; sourceTree = ""; }; AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIRFilter.cpp; sourceTree = ""; }; AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmx_optimized.cpp; sourceTree = ""; }; AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RateTransposer.cpp; sourceTree = ""; }; AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SoundTouch.cpp; sourceTree = ""; }; AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sse_optimized.cpp; sourceTree = ""; }; AB4C4C3216F55C64002E07CD /* TDStretch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TDStretch.cpp; sourceTree = ""; }; AB4C4C3316F55C64002E07CD /* WavFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WavFile.cpp; sourceTree = ""; }; AB4C4C3416F55C64002E07CD /* AAFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAFilter.h; sourceTree = ""; }; AB4C4C3516F55C64002E07CD /* BPMDetect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMDetect.h; sourceTree = ""; }; AB4C4C3616F55C64002E07CD /* cpu_detect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_detect.h; sourceTree = ""; }; AB4C4C3716F55C64002E07CD /* FIFOSampleBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSampleBuffer.h; sourceTree = ""; }; AB4C4C3816F55C64002E07CD /* FIFOSamplePipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSamplePipe.h; sourceTree = ""; }; AB4C4C3916F55C64002E07CD /* FIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRFilter.h; sourceTree = ""; }; AB4C4C3A16F55C64002E07CD /* RateTransposer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RateTransposer.h; sourceTree = ""; }; AB4C4C3B16F55C64002E07CD /* SoundTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundTouch.h; sourceTree = ""; }; AB4C4C3C16F55C64002E07CD /* STTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STTypes.h; sourceTree = ""; }; AB4C4C3D16F55C64002E07CD /* TDStretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDStretch.h; sourceTree = ""; }; AB4C4C3E16F55C64002E07CD /* WavFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WavFile.h; sourceTree = ""; }; AB58F32B1364F44B0074C376 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = ""; }; AB58F32C1364F44B0074C376 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = ""; }; AB5A795616D5A56000ED84B7 /* InputManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputManager.h; sourceTree = ""; }; AB5A795716D5A56000ED84B7 /* InputManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputManager.mm; sourceTree = ""; }; AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = FileTypeInfo.plist; sourceTree = ""; }; AB6A187A16C9951C00384EED /* EmuControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmuControllerDelegate.h; sourceTree = ""; }; AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EmuControllerDelegate.mm; sourceTree = ""; }; AB6A198116CAD66900384EED /* cocoa_GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_GPU.h; sourceTree = ""; }; AB6A198216CAD66900384EED /* cocoa_GPU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_GPU.mm; sourceTree = ""; }; AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = ""; }; AB700DB916CDDBC400FBD336 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/DisplayWindow.xib; sourceTree = ""; }; AB700DDC16CDE4C300FBD336 /* DisplayWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayWindowController.h; sourceTree = ""; }; AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayWindowController.mm; sourceTree = ""; }; AB711F7F1481C35F009011C8 /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; AB73AA331507C9F500A310C8 /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_FirmwareConfig.icns; sourceTree = ""; }; AB80E04C142BC4A800A52038 /* cocoa_util.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_util.mm; sourceTree = ""; }; AB80E050142BC4FA00A52038 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = ""; }; AB817A34143EE2DB00A7DFE9 /* videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = videofilter.h; sourceTree = ""; }; AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = videofilter.cpp; sourceTree = ""; }; AB901BDF1420706B00348EEC /* Japanese */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Japanese; path = translations/Japanese.lproj/Localizable.strings; sourceTree = ""; }; AB901BE01420706F00348EEC /* French */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = French; path = translations/French.lproj/Localizable.strings; sourceTree = ""; }; AB901BE11420707400348EEC /* Italian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Italian; path = translations/Italian.lproj/Localizable.strings; sourceTree = ""; }; AB901BE21420707800348EEC /* Chinese */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Chinese; path = translations/Chinese.lproj/Localizable.strings; sourceTree = ""; }; AB901BE31420707D00348EEC /* Norwegian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Norwegian; path = translations/Norwegian.lproj/Localizable.strings; sourceTree = ""; }; AB901BE41420708200348EEC /* Romanian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Romanian; path = translations/Romanian.lproj/Localizable.strings; sourceTree = ""; }; AB97C553169646D1002AC11B /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; AB9971CE134EDA0800531BA7 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = ""; }; ABA0356E169127BB00817C69 /* troubleshootingWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = troubleshootingWindowDelegate.h; sourceTree = ""; }; ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = troubleshootingWindowDelegate.mm; sourceTree = ""; }; ABA6574914511EC90077E5E9 /* cocoa_cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_cheat.h; sourceTree = ""; }; ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_cheat.mm; sourceTree = ""; }; ABAAFBE8172122B6005DDDBE /* FileMigrationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMigrationDelegate.h; sourceTree = ""; }; ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FileMigrationDelegate.mm; sourceTree = ""; }; ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_32x32.png; path = Images/Icon_ActionReplay_32x32.png; sourceTree = ""; }; ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_32x32.png; path = Images/Icon_CodeBreaker_32x32.png; sourceTree = ""; }; ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DeSmuME_32x32.png; path = Images/Icon_DeSmuME_32x32.png; sourceTree = ""; }; ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = DefaultUserPrefs.plist; sourceTree = ""; }; ABBCE29415ACB1E600A2C965 /* arm_jit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arm_jit.h; path = ../arm_jit.h; sourceTree = SOURCE_ROOT; }; ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_jit.cpp; path = ../arm_jit.cpp; sourceTree = SOURCE_ROOT; }; ABBCE29D15ACB26100A2C965 /* instruction_attributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = instruction_attributes.h; path = ../instruction_attributes.h; sourceTree = SOURCE_ROOT; }; ABBCE29E15ACB26100A2C965 /* instructions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = instructions.h; path = ../instructions.h; sourceTree = SOURCE_ROOT; }; ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = ""; }; ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeFull_16x16.png; path = images/Icon_VolumeFull_16x16.png; sourceTree = ""; }; ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeMute_16x16.png; path = images/Icon_VolumeMute_16x16.png; sourceTree = ""; }; ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeOneThird_16x16.png; path = images/Icon_VolumeOneThird_16x16.png; sourceTree = ""; }; ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeTwoThird_16x16.png; path = images/Icon_VolumeTwoThird_16x16.png; sourceTree = ""; }; ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; ABC570D4134431DA00E7B0B1 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultKeyMappings.plist; sourceTree = ""; }; ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = coreaudiosound.cpp; sourceTree = ""; }; ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ringbuffer.cpp; sourceTree = ""; }; ABD0A5361501AA5A0074A094 /* coreaudiosound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coreaudiosound.h; sourceTree = ""; }; ABD0A5371501AA5A0074A094 /* ringbuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ringbuffer.h; sourceTree = ""; }; ABD103FE1346652500AF11D1 /* cocoa_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_core.h; sourceTree = ""; }; ABD103FF1346652500AF11D1 /* cocoa_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input.h; sourceTree = ""; }; ABD104001346652500AF11D1 /* cocoa_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_rom.h; sourceTree = ""; }; ABD104011346652500AF11D1 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = ""; }; ABD104111346652500AF11D1 /* cocoa_input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input.mm; sourceTree = ""; }; ABD104121346652500AF11D1 /* cocoa_core.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_core.mm; sourceTree = ""; }; ABD104131346652500AF11D1 /* cocoa_rom.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_rom.mm; sourceTree = ""; }; ABD104141346652500AF11D1 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = ""; }; ABD104271346653B00AF11D1 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix.pch; sourceTree = ""; }; ABD1FE6B1345AC8400AF11D1 /* addons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = addons.h; path = ../addons.h; sourceTree = SOURCE_ROOT; }; ABD1FE6C1345AC8400AF11D1 /* agg2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = agg2d.h; path = ../agg2d.h; sourceTree = SOURCE_ROOT; }; ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aggdraw.h; path = ../aggdraw.h; sourceTree = SOURCE_ROOT; }; ABD1FE6F1345AC8400AF11D1 /* armcpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = armcpu.h; path = ../armcpu.h; sourceTree = SOURCE_ROOT; }; ABD1FE701345AC8400AF11D1 /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bios.h; path = ../bios.h; sourceTree = SOURCE_ROOT; }; ABD1FE711345AC8400AF11D1 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bits.h; path = ../bits.h; sourceTree = SOURCE_ROOT; }; ABD1FE721345AC8400AF11D1 /* cheatSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cheatSystem.h; path = ../cheatSystem.h; sourceTree = SOURCE_ROOT; }; ABD1FE731345AC8400AF11D1 /* commandline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = commandline.h; path = ../commandline.h; sourceTree = SOURCE_ROOT; }; ABD1FE741345AC8400AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../common.h; sourceTree = SOURCE_ROOT; }; ABD1FE751345AC8400AF11D1 /* cp15.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cp15.h; path = ../cp15.h; sourceTree = SOURCE_ROOT; }; ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ctrlssdl.h; path = ../ctrlssdl.h; sourceTree = SOURCE_ROOT; }; ABD1FE771345AC8400AF11D1 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../debug.h; sourceTree = SOURCE_ROOT; }; ABD1FE781345AC8400AF11D1 /* desmume_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = desmume_config.h; path = ../desmume_config.h; sourceTree = SOURCE_ROOT; }; ABD1FE791345AC8400AF11D1 /* Disassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Disassembler.h; path = ../Disassembler.h; sourceTree = SOURCE_ROOT; }; ABD1FE7A1345AC8400AF11D1 /* driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = driver.h; path = ../driver.h; sourceTree = SOURCE_ROOT; }; ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile_types.h; path = ../emufile_types.h; sourceTree = SOURCE_ROOT; }; ABD1FE7C1345AC8400AF11D1 /* emufile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile.h; path = ../emufile.h; sourceTree = SOURCE_ROOT; }; ABD1FE7D1345AC8400AF11D1 /* FIFO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FIFO.h; path = ../FIFO.h; sourceTree = SOURCE_ROOT; }; ABD1FE7E1345AC8400AF11D1 /* firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = firmware.h; path = ../firmware.h; sourceTree = SOURCE_ROOT; }; ABD1FE7F1345AC8400AF11D1 /* fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fs.h; path = ../fs.h; sourceTree = SOURCE_ROOT; }; ABD1FE801345AC8400AF11D1 /* gdbstub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gdbstub.h; path = ../gdbstub.h; sourceTree = SOURCE_ROOT; }; ABD1FE811345AC8400AF11D1 /* gfx3d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gfx3d.h; path = ../gfx3d.h; sourceTree = SOURCE_ROOT; }; ABD1FE821345AC8400AF11D1 /* GPU_osd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU_osd.h; path = ../GPU_osd.h; sourceTree = SOURCE_ROOT; }; ABD1FE831345AC8400AF11D1 /* GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU.h; path = ../GPU.h; sourceTree = SOURCE_ROOT; }; ABD1FE841345AC8400AF11D1 /* lua-engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lua-engine.h"; path = "../lua-engine.h"; sourceTree = SOURCE_ROOT; }; ABD1FE851345AC8400AF11D1 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../matrix.h; sourceTree = SOURCE_ROOT; }; ABD1FE861345AC8400AF11D1 /* mc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mc.h; path = ../mc.h; sourceTree = SOURCE_ROOT; }; ABD1FE871345AC8400AF11D1 /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mem.h; path = ../mem.h; sourceTree = SOURCE_ROOT; }; ABD1FE881345AC8400AF11D1 /* mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mic.h; path = ../mic.h; sourceTree = SOURCE_ROOT; }; ABD1FE891345AC8400AF11D1 /* MMU_timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU_timing.h; path = ../MMU_timing.h; sourceTree = SOURCE_ROOT; }; ABD1FE8A1345AC8400AF11D1 /* MMU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU.h; path = ../MMU.h; sourceTree = SOURCE_ROOT; }; ABD1FE8B1345AC8400AF11D1 /* movie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = movie.h; path = ../movie.h; sourceTree = SOURCE_ROOT; }; ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NDSSystem.h; path = ../NDSSystem.h; sourceTree = SOURCE_ROOT; }; ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OGLRender.h; path = ../OGLRender.h; sourceTree = SOURCE_ROOT; }; ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED_END.h; path = ../PACKED_END.h; sourceTree = SOURCE_ROOT; }; ABD1FE8F1345AC8400AF11D1 /* PACKED.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED.h; path = ../PACKED.h; sourceTree = SOURCE_ROOT; }; ABD1FE901345AC8400AF11D1 /* path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path.h; path = ../path.h; sourceTree = SOURCE_ROOT; }; ABD1FE911345AC8400AF11D1 /* rasterize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rasterize.h; path = ../rasterize.h; sourceTree = SOURCE_ROOT; }; ABD1FE921345AC8400AF11D1 /* readwrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = readwrite.h; path = ../readwrite.h; sourceTree = SOURCE_ROOT; }; ABD1FE931345AC8400AF11D1 /* registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = registers.h; path = ../registers.h; sourceTree = SOURCE_ROOT; }; ABD1FE941345AC8400AF11D1 /* render3D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = render3D.h; path = ../render3D.h; sourceTree = SOURCE_ROOT; }; ABD1FE951345AC8400AF11D1 /* ROMReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ROMReader.h; path = ../ROMReader.h; sourceTree = SOURCE_ROOT; }; ABD1FE961345AC8400AF11D1 /* rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rtc.h; path = ../rtc.h; sourceTree = SOURCE_ROOT; }; ABD1FE971345AC8400AF11D1 /* saves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = saves.h; path = ../saves.h; sourceTree = SOURCE_ROOT; }; ABD1FE991345AC8400AF11D1 /* slot1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slot1.h; path = ../slot1.h; sourceTree = SOURCE_ROOT; }; ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndsdl.h; path = ../sndsdl.h; sourceTree = SOURCE_ROOT; }; ABD1FE9B1345AC8400AF11D1 /* SPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPU.h; path = ../SPU.h; sourceTree = SOURCE_ROOT; }; ABD1FE9C1345AC8400AF11D1 /* texcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = texcache.h; path = ../texcache.h; sourceTree = SOURCE_ROOT; }; ABD1FE9E1345AC8400AF11D1 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../types.h; sourceTree = SOURCE_ROOT; }; ABD1FE9F1345AC8400AF11D1 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../version.h; sourceTree = SOURCE_ROOT; }; ABD1FEA01345AC8400AF11D1 /* wifi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wifi.h; path = ../wifi.h; sourceTree = SOURCE_ROOT; }; ABD1FEA11345AC8400AF11D1 /* addons.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = addons.cpp; path = ../addons.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aggdraw.cpp; path = ../aggdraw.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_instructions.cpp; path = ../arm_instructions.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = armcpu.cpp; path = ../armcpu.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA51345AC8400AF11D1 /* bios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bios.cpp; path = ../bios.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cheatSystem.cpp; path = ../cheatSystem.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA71345AC8400AF11D1 /* commandline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = commandline.cpp; path = ../commandline.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA81345AC8400AF11D1 /* common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.cpp; path = ../common.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA91345AC8400AF11D1 /* cp15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cp15.cpp; path = ../cp15.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ctrlssdl.cpp; path = ../ctrlssdl.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAB1345AC8400AF11D1 /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cpp; path = ../debug.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = desmume_config.cpp; path = ../desmume_config.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Disassembler.cpp; path = ../Disassembler.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAE1345AC8400AF11D1 /* driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = driver.cpp; path = ../driver.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = emufile.cpp; path = ../emufile.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FIFO.cpp; path = ../FIFO.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB11345AC8400AF11D1 /* firmware.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = firmware.cpp; path = ../firmware.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "fs-linux.cpp"; path = "../fs-linux.cpp"; sourceTree = SOURCE_ROOT; }; ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gfx3d.cpp; path = ../gfx3d.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd_stub.cpp; path = ../GPU_osd_stub.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd.cpp; path = ../GPU_osd.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB71345AC8400AF11D1 /* GPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU.cpp; path = ../GPU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "lua-engine.cpp"; path = "../lua-engine.cpp"; sourceTree = SOURCE_ROOT; }; ABD1FEB91345AC8400AF11D1 /* matrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = matrix.cpp; path = ../matrix.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBA1345AC8400AF11D1 /* mc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mc.cpp; path = ../mc.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_alsa.cpp; path = ../mic_alsa.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_openal.cpp; path = ../mic_openal.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBD1345AC8400AF11D1 /* mic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic.cpp; path = ../mic.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MMU.cpp; path = ../MMU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBF1345AC8400AF11D1 /* movie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = movie.cpp; path = ../movie.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NDSSystem.cpp; path = ../NDSSystem.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender.cpp; path = ../OGLRender.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC21345AC8400AF11D1 /* path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path.cpp; path = ../path.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rasterize.cpp; path = ../rasterize.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = readwrite.cpp; path = ../readwrite.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC51345AC8400AF11D1 /* render3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = render3D.cpp; path = ../render3D.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ROMReader.cpp; path = ../ROMReader.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC71345AC8400AF11D1 /* rtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rtc.cpp; path = ../rtc.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC81345AC8400AF11D1 /* saves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = saves.cpp; path = ../saves.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC91345AC8400AF11D1 /* slot1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot1.cpp; path = ../slot1.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndsdl.cpp; path = ../sndsdl.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECB1345AC8400AF11D1 /* SPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SPU.cpp; path = ../SPU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECC1345AC8400AF11D1 /* texcache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = texcache.cpp; path = ../texcache.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thumb_instructions.cpp; path = ../thumb_instructions.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECE1345AC8400AF11D1 /* version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cpp; path = ../version.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECF1345AC8400AF11D1 /* wifi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wifi.cpp; path = ../wifi.cpp; sourceTree = SOURCE_ROOT; }; ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_none.cpp; sourceTree = ""; }; ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_r4.cpp; sourceTree = ""; }; ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail.cpp; sourceTree = ""; }; ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_expMemory.cpp; sourceTree = ""; }; ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_gbagame.cpp; sourceTree = ""; }; ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_guitarGrip.cpp; sourceTree = ""; }; ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_mpcf.cpp; sourceTree = ""; }; ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_none.cpp; sourceTree = ""; }; ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_paddle.cpp; sourceTree = ""; }; ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_piano.cpp; sourceTree = ""; }; ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_rumblepak.cpp; sourceTree = ""; }; ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gdbstub.cpp; sourceTree = ""; }; ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gdbstub_internal.h; sourceTree = ""; }; ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ConvertUTF.c; sourceTree = ""; }; ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConvertUTF.h; sourceTree = ""; }; ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = datetime.cpp; sourceTree = ""; }; ABD1FF201345ACBF00AF11D1 /* datetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datetime.h; sourceTree = ""; }; ABD1FF221345ACBF00AF11D1 /* crc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = crc.cpp; sourceTree = ""; }; ABD1FF231345ACBF00AF11D1 /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc.h; sourceTree = ""; }; ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decrypt.cpp; sourceTree = ""; }; ABD1FF251345ACBF00AF11D1 /* decrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decrypt.h; sourceTree = ""; }; ABD1FF261345ACBF00AF11D1 /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; ABD1FF271345ACBF00AF11D1 /* header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = header.h; sourceTree = ""; }; ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dlditool.cpp; sourceTree = ""; }; ABD1FF291345ACBF00AF11D1 /* emufat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emufat.cpp; sourceTree = ""; }; ABD1FF2A1345ACBF00AF11D1 /* emufat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat.h; sourceTree = ""; }; ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat_types.h; sourceTree = ""; }; ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = guid.cpp; sourceTree = ""; }; ABD1FF2D1345ACBF00AF11D1 /* guid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guid.h; sourceTree = ""; }; ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_ops.h; sourceTree = ""; }; ABD1FF301345ACBF00AF11D1 /* cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cpp; sourceTree = ""; }; ABD1FF311345ACBF00AF11D1 /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; ABD1FF321345ACBF00AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; ABD1FF331345ACBF00AF11D1 /* directory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = directory.cpp; sourceTree = ""; }; ABD1FF341345ACBF00AF11D1 /* directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directory.h; sourceTree = ""; }; ABD1FF351345ACBF00AF11D1 /* disc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disc.cpp; sourceTree = ""; }; ABD1FF361345ACBF00AF11D1 /* disc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc.h; sourceTree = ""; }; ABD1FF371345ACBF00AF11D1 /* disc_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc_io.h; sourceTree = ""; }; ABD1FF381345ACBF00AF11D1 /* fat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fat.h; sourceTree = ""; }; ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatdir.cpp; sourceTree = ""; }; ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatdir.h; sourceTree = ""; }; ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatfile.cpp; sourceTree = ""; }; ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatfile.h; sourceTree = ""; }; ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_allocation_table.cpp; sourceTree = ""; }; ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_allocation_table.h; sourceTree = ""; }; ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filetime.cpp; sourceTree = ""; }; ABD1FF401345ACBF00AF11D1 /* filetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filetime.h; sourceTree = ""; }; ABD1FF411345ACBF00AF11D1 /* libfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat.cpp; sourceTree = ""; }; ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_pc.h; sourceTree = ""; }; ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat_public_api.cpp; sourceTree = ""; }; ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_public_api.h; sourceTree = ""; }; ABD1FF451345ACBF00AF11D1 /* lock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lock.cpp; sourceTree = ""; }; ABD1FF461345ACBF00AF11D1 /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_allocate.h; sourceTree = ""; }; ABD1FF481345ACBF00AF11D1 /* partition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = partition.cpp; sourceTree = ""; }; ABD1FF491345ACBF00AF11D1 /* partition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition.h; sourceTree = ""; }; ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = ""; }; ABD1FF4B1345ACBF00AF11D1 /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; ABD1FF4C1345ACBF00AF11D1 /* task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = task.cpp; sourceTree = ""; }; ABD1FF4D1345ACBF00AF11D1 /* task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = task.h; sourceTree = ""; }; ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = valuearray.h; sourceTree = ""; }; ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vfat.cpp; sourceTree = ""; }; ABD1FF501345ACBF00AF11D1 /* vfat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vfat.h; sourceTree = ""; }; ABD1FF511345ACBF00AF11D1 /* xstring.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xstring.cpp; sourceTree = ""; }; ABD1FF521345ACBF00AF11D1 /* xstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xstring.h; sourceTree = ""; }; ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metaspu.cpp; sourceTree = ""; }; ABD1FF781345ACFA00AF11D1 /* metaspu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metaspu.h; sourceTree = ""; }; ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = ""; }; ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = ""; }; ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = ""; }; ABD9A46313DB99B300777194 /* mic_ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mic_ext.h; sourceTree = ""; }; ABD9A46413DB99B300777194 /* mic_ext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mic_ext.cpp; sourceTree = ""; }; ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = ""; }; ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = ""; }; ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = ""; }; ABE670261415DE6C00E8E4C9 /* tinystr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinystr.h; sourceTree = ""; }; ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxml.cpp; sourceTree = ""; }; ABE670281415DE6C00E8E4C9 /* tinyxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinyxml.h; sourceTree = ""; }; ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlerror.cpp; sourceTree = ""; }; ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlparser.cpp; sourceTree = ""; }; ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_firmware.h; sourceTree = ""; }; ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_firmware.mm; sourceTree = ""; }; ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = ""; }; ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_DeSmuME.icns; sourceTree = ""; }; ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = ""; }; ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = ""; }; ABF50A74169F5FDA0018C08D /* AsmJit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsmJit.h; sourceTree = ""; }; ABF50A75169F5FDA0018C08D /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Config.h; sourceTree = ""; }; ABF50A76169F5FDA0018C08D /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; ABF50A77169F5FDA0018C08D /* x86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86.h; sourceTree = ""; }; ABF50A79169F5FDA0018C08D /* apibegin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apibegin.h; sourceTree = ""; }; ABF50A7A169F5FDA0018C08D /* apiend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apiend.h; sourceTree = ""; }; ABF50A7B169F5FDA0018C08D /* assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembler.cpp; sourceTree = ""; }; ABF50A7C169F5FDA0018C08D /* assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembler.h; sourceTree = ""; }; ABF50A7D169F5FDA0018C08D /* assert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assert.cpp; sourceTree = ""; }; ABF50A7E169F5FDA0018C08D /* assert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assert.h; sourceTree = ""; }; ABF50A7F169F5FDA0018C08D /* buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = buffer.cpp; sourceTree = ""; }; ABF50A80169F5FDA0018C08D /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; ABF50A81169F5FDA0018C08D /* build.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build.h; sourceTree = ""; }; ABF50A82169F5FDA0018C08D /* compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compiler.cpp; sourceTree = ""; }; ABF50A83169F5FDA0018C08D /* compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = ""; }; ABF50A84169F5FDA0018C08D /* compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilercontext.cpp; sourceTree = ""; }; ABF50A85169F5FDA0018C08D /* compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilercontext.h; sourceTree = ""; }; ABF50A86169F5FDA0018C08D /* compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilerfunc.cpp; sourceTree = ""; }; ABF50A87169F5FDA0018C08D /* compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilerfunc.h; sourceTree = ""; }; ABF50A88169F5FDA0018C08D /* compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compileritem.cpp; sourceTree = ""; }; ABF50A89169F5FDA0018C08D /* compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compileritem.h; sourceTree = ""; }; ABF50A8A169F5FDA0018C08D /* context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = context.cpp; sourceTree = ""; }; ABF50A8B169F5FDA0018C08D /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; ABF50A8C169F5FDA0018C08D /* cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpuinfo.cpp; sourceTree = ""; }; ABF50A8D169F5FDA0018C08D /* cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpuinfo.h; sourceTree = ""; }; ABF50A8E169F5FDA0018C08D /* defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = defs.cpp; sourceTree = ""; }; ABF50A8F169F5FDA0018C08D /* defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defs.h; sourceTree = ""; }; ABF50A90169F5FDA0018C08D /* func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = func.cpp; sourceTree = ""; }; ABF50A91169F5FDA0018C08D /* func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = func.h; sourceTree = ""; }; ABF50A92169F5FDA0018C08D /* intutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intutil.h; sourceTree = ""; }; ABF50A93169F5FDA0018C08D /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; ABF50A94169F5FDA0018C08D /* logger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logger.cpp; sourceTree = ""; }; ABF50A95169F5FDA0018C08D /* logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logger.h; sourceTree = ""; }; ABF50A96169F5FDA0018C08D /* memorymanager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymanager.cpp; sourceTree = ""; }; ABF50A97169F5FDA0018C08D /* memorymanager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymanager.h; sourceTree = ""; }; ABF50A98169F5FDA0018C08D /* memorymarker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymarker.cpp; sourceTree = ""; }; ABF50A99169F5FDA0018C08D /* memorymarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymarker.h; sourceTree = ""; }; ABF50A9A169F5FDA0018C08D /* operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand.cpp; sourceTree = ""; }; ABF50A9B169F5FDA0018C08D /* operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand.h; sourceTree = ""; }; ABF50A9C169F5FDA0018C08D /* podvector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = podvector.h; sourceTree = ""; }; ABF50A9D169F5FDA0018C08D /* stringbuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringbuilder.cpp; sourceTree = ""; }; ABF50A9E169F5FDA0018C08D /* stringbuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringbuilder.h; sourceTree = ""; }; ABF50A9F169F5FDA0018C08D /* stringutil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutil.cpp; sourceTree = ""; }; ABF50AA0169F5FDA0018C08D /* stringutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutil.h; sourceTree = ""; }; ABF50AA1169F5FDA0018C08D /* virtualmemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = virtualmemory.cpp; sourceTree = ""; }; ABF50AA2169F5FDA0018C08D /* virtualmemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = virtualmemory.h; sourceTree = ""; }; ABF50AA3169F5FDA0018C08D /* zonememory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = zonememory.cpp; sourceTree = ""; }; ABF50AA4169F5FDA0018C08D /* zonememory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zonememory.h; sourceTree = ""; }; ABF50AA6169F5FDA0018C08D /* x86assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86assembler.cpp; sourceTree = ""; }; ABF50AA7169F5FDA0018C08D /* x86assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86assembler.h; sourceTree = ""; }; ABF50AA8169F5FDA0018C08D /* x86compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compiler.cpp; sourceTree = ""; }; ABF50AA9169F5FDA0018C08D /* x86compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compiler.h; sourceTree = ""; }; ABF50AAA169F5FDA0018C08D /* x86compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilercontext.cpp; sourceTree = ""; }; ABF50AAB169F5FDA0018C08D /* x86compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilercontext.h; sourceTree = ""; }; ABF50AAC169F5FDA0018C08D /* x86compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilerfunc.cpp; sourceTree = ""; }; ABF50AAD169F5FDA0018C08D /* x86compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilerfunc.h; sourceTree = ""; }; ABF50AAE169F5FDA0018C08D /* x86compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compileritem.cpp; sourceTree = ""; }; ABF50AAF169F5FDA0018C08D /* x86compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compileritem.h; sourceTree = ""; }; ABF50AB0169F5FDA0018C08D /* x86cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86cpuinfo.cpp; sourceTree = ""; }; ABF50AB1169F5FDA0018C08D /* x86cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86cpuinfo.h; sourceTree = ""; }; ABF50AB2169F5FDA0018C08D /* x86defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86defs.cpp; sourceTree = ""; }; ABF50AB3169F5FDA0018C08D /* x86defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86defs.h; sourceTree = ""; }; ABF50AB4169F5FDA0018C08D /* x86func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86func.cpp; sourceTree = ""; }; ABF50AB5169F5FDA0018C08D /* x86func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86func.h; sourceTree = ""; }; ABF50AB6169F5FDA0018C08D /* x86operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86operand.cpp; sourceTree = ""; }; ABF50AB7169F5FDA0018C08D /* x86operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86operand.h; sourceTree = ""; }; ABF50AB8169F5FDA0018C08D /* x86util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86util.cpp; sourceTree = ""; }; ABF50AB9169F5FDA0018C08D /* x86util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86util.h; sourceTree = ""; }; ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 2xsai.cpp; sourceTree = ""; }; ABFE14FB14C92FF5005D6699 /* bilinear.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bilinear.cpp; sourceTree = ""; }; ABFE14FC14C92FF5005D6699 /* epx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = epx.cpp; sourceTree = ""; }; ABFE14FD14C92FF5005D6699 /* filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = ""; }; ABFE14FE14C92FF5005D6699 /* hq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq2x.cpp; sourceTree = ""; }; ABFE14FF14C92FF5005D6699 /* hq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq2x.h; sourceTree = ""; }; ABFE150014C92FF5005D6699 /* hq4x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq4x.cpp; sourceTree = ""; }; ABFE150214C92FF5005D6699 /* hq4x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq4x.h; sourceTree = ""; }; ABFE150314C92FF5005D6699 /* interp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interp.h; sourceTree = ""; }; ABFE150414C92FF5005D6699 /* lq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lq2x.cpp; sourceTree = ""; }; ABFE150514C92FF5005D6699 /* lq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lq2x.h; sourceTree = ""; }; ABFE150614C92FF5005D6699 /* scanline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scanline.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ AB2A9A6C1725F00F0062C1A1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB2A9A6D1725F00F0062C1A1 /* Accelerate.framework in Frameworks */, AB2A9A6E1725F00F0062C1A1 /* AppKit.framework in Frameworks */, AB2A9A6F1725F00F0062C1A1 /* AudioUnit.framework in Frameworks */, AB2A9A701725F00F0062C1A1 /* Cocoa.framework in Frameworks */, AB2A9A711725F00F0062C1A1 /* Foundation.framework in Frameworks */, AB2A9A721725F00F0062C1A1 /* IOKit.framework in Frameworks */, AB2A9A731725F00F0062C1A1 /* OpenGL.framework in Frameworks */, AB2A9A741725F00F0062C1A1 /* libz.dylib in Frameworks */, AB2A9A751725F00F0062C1A1 /* AudioToolbox.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB2F3C3A15CF9C6000858373 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D60C16964F54002AC11B /* Accelerate.framework in Frameworks */, AB2F3C3B15CF9C6000858373 /* AppKit.framework in Frameworks */, AB2F3C3C15CF9C6000858373 /* AudioUnit.framework in Frameworks */, AB2F3C3D15CF9C6000858373 /* Cocoa.framework in Frameworks */, AB2F3C3E15CF9C6000858373 /* Foundation.framework in Frameworks */, AB2F3C3F15CF9C6000858373 /* IOKit.framework in Frameworks */, AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */, AB2F3C4115CF9C6000858373 /* libz.dylib in Frameworks */, AB213EC41710D0A0006DDB0F /* AudioToolbox.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB711F731481C35F009011C8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97C554169646D1002AC11B /* Accelerate.framework in Frameworks */, AB711F771481C35F009011C8 /* AppKit.framework in Frameworks */, AB711F751481C35F009011C8 /* AudioUnit.framework in Frameworks */, AB711F741481C35F009011C8 /* Cocoa.framework in Frameworks */, AB711F781481C35F009011C8 /* Foundation.framework in Frameworks */, AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */, AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */, ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */, AB213E991710D074006DDB0F /* AudioToolbox.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB73AA281507C9F500A310C8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D5E516964F3B002AC11B /* Accelerate.framework in Frameworks */, AB73AA291507C9F500A310C8 /* AppKit.framework in Frameworks */, AB73AA2A1507C9F500A310C8 /* AudioUnit.framework in Frameworks */, AB73AA2B1507C9F500A310C8 /* Cocoa.framework in Frameworks */, AB73AA2C1507C9F500A310C8 /* Foundation.framework in Frameworks */, AB73AA2D1507C9F500A310C8 /* IOKit.framework in Frameworks */, AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */, AB73AA2F1507C9F500A310C8 /* libz.dylib in Frameworks */, AB213EC61710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; ABAD103E15ACE7A00000EC47 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D60916964F48002AC11B /* Accelerate.framework in Frameworks */, ABAD103F15ACE7A00000EC47 /* AppKit.framework in Frameworks */, ABAD104015ACE7A00000EC47 /* AudioUnit.framework in Frameworks */, ABAD104115ACE7A00000EC47 /* Cocoa.framework in Frameworks */, ABAD104215ACE7A00000EC47 /* Foundation.framework in Frameworks */, ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */, ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */, ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */, AB213EC51710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Cocoa Port */ = { isa = PBXGroup; children = ( AB3ACB6514C2361100D7D192 /* userinterface */, AB2F56EF1704C86900E28885 /* utilities.c */, AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */, ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */, ABD9A46413DB99B300777194 /* mic_ext.cpp */, ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */, ABD104141346652500AF11D1 /* sndOSX.cpp */, AB2145211714DFF4006DDB0F /* audiosamplegenerator.h */, ABA6574914511EC90077E5E9 /* cocoa_cheat.h */, ABD103FE1346652500AF11D1 /* cocoa_core.h */, AB58F32B1364F44B0074C376 /* cocoa_file.h */, ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */, AB9971CE134EDA0800531BA7 /* cocoa_globals.h */, AB6A198116CAD66900384EED /* cocoa_GPU.h */, ABD103FF1346652500AF11D1 /* cocoa_input.h */, AB3E34C7134AF4500056477A /* cocoa_output.h */, ABD104001346652500AF11D1 /* cocoa_rom.h */, AB80E050142BC4FA00A52038 /* cocoa_util.h */, ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */, ABD0A5361501AA5A0074A094 /* coreaudiosound.h */, ABD9A46313DB99B300777194 /* mic_ext.h */, ABD0A5371501AA5A0074A094 /* ringbuffer.h */, ABD104011346652500AF11D1 /* sndOSX.h */, AB2F56EE1704C86900E28885 /* utilities.h */, ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */, ABD104121346652500AF11D1 /* cocoa_core.mm */, AB58F32C1364F44B0074C376 /* cocoa_file.mm */, ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */, AB6A198216CAD66900384EED /* cocoa_GPU.mm */, ABD104111346652500AF11D1 /* cocoa_input.mm */, AB3E34C8134AF4500056477A /* cocoa_output.mm */, ABD104131346652500AF11D1 /* cocoa_rom.mm */, AB80E04C142BC4A800A52038 /* cocoa_util.mm */, ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */, ); name = "Cocoa Port"; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( AB97C553169646D1002AC11B /* Accelerate.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, AB213E981710D074006DDB0F /* AudioToolbox.framework */, ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, ABC570D4134431DA00E7B0B1 /* OpenGL.framework */, AB0A0D1914AACA9600E83E91 /* libz.dylib */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( AB711F7F1481C35F009011C8 /* DeSmuME.app */, AB73AA331507C9F500A310C8 /* DeSmuME.app */, ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */, AB2F3C4515CF9C6000858373 /* DeSmuME (PPC).app */, AB2A9A791725F00F0062C1A1 /* DeSmuME (PPC).app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* DeSmuME */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Cocoa Port */, ABC572B7134592D900E7B0B1 /* Core */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 19C28FACFE9D520D11CA2CBB /* Products */, 29B97317FDCFA39411CA2CEA /* Resources */, ); name = DeSmuME; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( ABD104271346653B00AF11D1 /* main.m */, ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( ABC2ECD613B1C87000FAAA2A /* Images */, AB00E87C14205EBC00DE561F /* MainMenu.xib */, AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */, AB350D3A147A1D93007165AC /* HID_usage_strings.plist */, 8D1107310486CEB800E47090 /* Info.plist */, AB02791814415E4C0075E58C /* Info (Debug).plist */, AB00E87914205EAE00DE561F /* InfoPlist.strings */, AB02475B13886BF300E9F9AB /* KeyNames.plist */, AB901BDD1420706100348EEC /* Localizable.strings */, ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */, ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */, AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */, AB3ACC3814C24D5400D7D192 /* AUTHORS */, AB3ACC3914C24D5400D7D192 /* ChangeLog */, AB3ACC3A14C24D5400D7D192 /* COPYING */, AB3ACC3B14C24D5400D7D192 /* README */, AB3ACC3D14C24D5400D7D192 /* README.MAC */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; AB3ACB6514C2361100D7D192 /* userinterface */ = { isa = PBXGroup; children = ( AB3ACB6614C2361100D7D192 /* appDelegate.h */, AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */, AB700DDC16CDE4C300FBD336 /* DisplayWindowController.h */, AB6A187A16C9951C00384EED /* EmuControllerDelegate.h */, ABAAFBE8172122B6005DDDBE /* FileMigrationDelegate.h */, AB5A795616D5A56000ED84B7 /* InputManager.h */, AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB213D43170CB141006DDB0F /* InputProfileController.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, ABA0356E169127BB00817C69 /* troubleshootingWindowDelegate.h */, AB3ACB6714C2361100D7D192 /* appDelegate.mm */, AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */, AB700DDD16CDE4C300FBD336 /* DisplayWindowController.mm */, AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */, ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */, AB5A795716D5A56000ED84B7 /* InputManager.mm */, AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB213D44170CB141006DDB0F /* InputProfileController.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, ABA0356F169127C000817C69 /* troubleshootingWindowDelegate.mm */, ); path = userinterface; sourceTree = ""; }; AB85D77414ABE42100286B70 /* App Icons */ = { isa = PBXGroup; children = ( ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */, ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */, ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */, ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */, AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */, ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */, ); name = "App Icons"; sourceTree = ""; }; ABBCE2A115ACB29100A2C965 /* AsmJit */ = { isa = PBXGroup; children = ( ABF50A78169F5FDA0018C08D /* core */, ABF50AA5169F5FDA0018C08D /* x86 */, ABF50A74169F5FDA0018C08D /* AsmJit.h */, ABF50A75169F5FDA0018C08D /* Config.h */, ABF50A76169F5FDA0018C08D /* core.h */, ABF50A77169F5FDA0018C08D /* x86.h */, ); path = AsmJit; sourceTree = ""; }; ABC2ECD613B1C87000FAAA2A /* Images */ = { isa = PBXGroup; children = ( AB85D77414ABE42100286B70 /* App Icons */, AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */, AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */, AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */, AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */, AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */, AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */, AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */, AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */, AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */, AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */, AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */, AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */, AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */, AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */, AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */, AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */, AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */, ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */, AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */, AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */, AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */, AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */, AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */, ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */, ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */, AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */, AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */, AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */, AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */, AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */, AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */, AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */, AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */, AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */, AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */, AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */, AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */, AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */, AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */, AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */, AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */, AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */, AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */, AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */, AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */, AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */, AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */, ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */, ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */, ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */, ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */, AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */, ); name = Images; sourceTree = ""; }; ABC572B7134592D900E7B0B1 /* Core */ = { isa = PBXGroup; children = ( ABD1FEFF1345AC9B00AF11D1 /* addons */, ABD1FF161345ACA900AF11D1 /* gdbstub */, ABFE14F914C92FF5005D6699 /* filter */, ABD1FF761345ACFA00AF11D1 /* metaspu */, ABD1FF1C1345ACBF00AF11D1 /* utils */, ABD1FEA11345AC8400AF11D1 /* addons.cpp */, ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */, ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */, ABBCE29515ACB1FF00A2C965 /* arm_jit.cpp */, ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */, ABD1FEA51345AC8400AF11D1 /* bios.cpp */, ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */, ABD1FEA71345AC8400AF11D1 /* commandline.cpp */, ABD1FEA81345AC8400AF11D1 /* common.cpp */, ABD1FEA91345AC8400AF11D1 /* cp15.cpp */, ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */, ABD1FEAB1345AC8400AF11D1 /* debug.cpp */, ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */, ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */, ABD1FEAE1345AC8400AF11D1 /* driver.cpp */, ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */, ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */, ABD1FEB11345AC8400AF11D1 /* firmware.cpp */, ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */, ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */, ABD1FEB71345AC8400AF11D1 /* GPU.cpp */, ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */, ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */, ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */, ABD1FEB91345AC8400AF11D1 /* matrix.cpp */, ABD1FEBA1345AC8400AF11D1 /* mc.cpp */, ABD1FEBD1345AC8400AF11D1 /* mic.cpp */, ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */, ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */, ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */, ABD1FEBF1345AC8400AF11D1 /* movie.cpp */, ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */, ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */, ABD1FEC21345AC8400AF11D1 /* path.cpp */, ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */, ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */, ABD1FEC51345AC8400AF11D1 /* render3D.cpp */, ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */, ABD1FEC71345AC8400AF11D1 /* rtc.cpp */, ABD1FEC81345AC8400AF11D1 /* saves.cpp */, ABD1FEC91345AC8400AF11D1 /* slot1.cpp */, ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */, ABD1FECB1345AC8400AF11D1 /* SPU.cpp */, ABD1FECC1345AC8400AF11D1 /* texcache.cpp */, ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */, ABD1FECE1345AC8400AF11D1 /* version.cpp */, ABD1FECF1345AC8400AF11D1 /* wifi.cpp */, ABD1FE6B1345AC8400AF11D1 /* addons.h */, ABD1FE6C1345AC8400AF11D1 /* agg2d.h */, ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */, ABBCE29415ACB1E600A2C965 /* arm_jit.h */, ABD1FE6F1345AC8400AF11D1 /* armcpu.h */, ABD1FE701345AC8400AF11D1 /* bios.h */, ABD1FE711345AC8400AF11D1 /* bits.h */, ABD1FE721345AC8400AF11D1 /* cheatSystem.h */, ABD1FE731345AC8400AF11D1 /* commandline.h */, ABD1FE741345AC8400AF11D1 /* common.h */, ABD1FE751345AC8400AF11D1 /* cp15.h */, ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */, ABD1FE771345AC8400AF11D1 /* debug.h */, ABD1FE781345AC8400AF11D1 /* desmume_config.h */, ABD1FE791345AC8400AF11D1 /* Disassembler.h */, ABD1FE7A1345AC8400AF11D1 /* driver.h */, ABD1FE7C1345AC8400AF11D1 /* emufile.h */, ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */, ABD1FE7D1345AC8400AF11D1 /* FIFO.h */, ABD1FE7E1345AC8400AF11D1 /* firmware.h */, ABD1FE7F1345AC8400AF11D1 /* fs.h */, ABD1FE801345AC8400AF11D1 /* gdbstub.h */, ABD1FE811345AC8400AF11D1 /* gfx3d.h */, ABD1FE831345AC8400AF11D1 /* GPU.h */, ABD1FE821345AC8400AF11D1 /* GPU_osd.h */, ABBCE29D15ACB26100A2C965 /* instruction_attributes.h */, ABBCE29E15ACB26100A2C965 /* instructions.h */, ABD1FE841345AC8400AF11D1 /* lua-engine.h */, ABD1FE851345AC8400AF11D1 /* matrix.h */, ABD1FE861345AC8400AF11D1 /* mc.h */, ABD1FE871345AC8400AF11D1 /* mem.h */, ABD1FE881345AC8400AF11D1 /* mic.h */, ABD1FE8A1345AC8400AF11D1 /* MMU.h */, ABD1FE891345AC8400AF11D1 /* MMU_timing.h */, ABD1FE8B1345AC8400AF11D1 /* movie.h */, ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */, ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */, ABD1FE8F1345AC8400AF11D1 /* PACKED.h */, ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */, ABD1FE901345AC8400AF11D1 /* path.h */, ABD1FE911345AC8400AF11D1 /* rasterize.h */, ABD1FE921345AC8400AF11D1 /* readwrite.h */, ABD1FE931345AC8400AF11D1 /* registers.h */, ABD1FE941345AC8400AF11D1 /* render3D.h */, ABD1FE951345AC8400AF11D1 /* ROMReader.h */, ABD1FE961345AC8400AF11D1 /* rtc.h */, ABD1FE971345AC8400AF11D1 /* saves.h */, ABD1FE991345AC8400AF11D1 /* slot1.h */, ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */, ABD1FE9B1345AC8400AF11D1 /* SPU.h */, ABD1FE9C1345AC8400AF11D1 /* texcache.h */, ABD1FE9E1345AC8400AF11D1 /* types.h */, ABD1FE9F1345AC8400AF11D1 /* version.h */, ABD1FEA01345AC8400AF11D1 /* wifi.h */, ); name = Core; sourceTree = ""; }; ABD1FEFF1345AC9B00AF11D1 /* addons */ = { isa = PBXGroup; children = ( ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */, ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */, AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */, ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */, ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */, ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */, ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */, ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */, ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */, ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */, ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */, ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */, ); name = addons; path = ../addons; sourceTree = SOURCE_ROOT; }; ABD1FF161345ACA900AF11D1 /* gdbstub */ = { isa = PBXGroup; children = ( ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */, ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */, ); name = gdbstub; path = ../gdbstub; sourceTree = SOURCE_ROOT; }; ABD1FF1C1345ACBF00AF11D1 /* utils */ = { isa = PBXGroup; children = ( ABBCE2A115ACB29100A2C965 /* AsmJit */, ABD1FF211345ACBF00AF11D1 /* decrypt */, ABD1FF2E1345ACBF00AF11D1 /* libfat */, ABE670241415DE6C00E8E4C9 /* tinyxml */, ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */, ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */, ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */, ABD1FF291345ACBF00AF11D1 /* emufat.cpp */, ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */, ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */, ABD1FF4C1345ACBF00AF11D1 /* task.cpp */, ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */, ABD1FF511345ACBF00AF11D1 /* xstring.cpp */, ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */, ABD1FF201345ACBF00AF11D1 /* datetime.h */, ABD1FF2A1345ACBF00AF11D1 /* emufat.h */, ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */, ABD1FF2D1345ACBF00AF11D1 /* guid.h */, ABD1FF4B1345ACBF00AF11D1 /* md5.h */, ABD1FF4D1345ACBF00AF11D1 /* task.h */, ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */, ABD1FF501345ACBF00AF11D1 /* vfat.h */, ABD1FF521345ACBF00AF11D1 /* xstring.h */, ); name = utils; path = ../utils; sourceTree = SOURCE_ROOT; }; ABD1FF211345ACBF00AF11D1 /* decrypt */ = { isa = PBXGroup; children = ( ABD1FF221345ACBF00AF11D1 /* crc.cpp */, ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */, ABD1FF261345ACBF00AF11D1 /* header.cpp */, ABD1FF231345ACBF00AF11D1 /* crc.h */, ABD1FF251345ACBF00AF11D1 /* decrypt.h */, ABD1FF271345ACBF00AF11D1 /* header.h */, ); path = decrypt; sourceTree = ""; }; ABD1FF2E1345ACBF00AF11D1 /* libfat */ = { isa = PBXGroup; children = ( ABD1FF301345ACBF00AF11D1 /* cache.cpp */, ABD1FF331345ACBF00AF11D1 /* directory.cpp */, ABD1FF351345ACBF00AF11D1 /* disc.cpp */, ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */, ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */, ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */, ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */, ABD1FF411345ACBF00AF11D1 /* libfat.cpp */, ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */, ABD1FF451345ACBF00AF11D1 /* lock.cpp */, ABD1FF481345ACBF00AF11D1 /* partition.cpp */, ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */, ABD1FF311345ACBF00AF11D1 /* cache.h */, ABD1FF321345ACBF00AF11D1 /* common.h */, ABD1FF341345ACBF00AF11D1 /* directory.h */, ABD1FF361345ACBF00AF11D1 /* disc.h */, ABD1FF371345ACBF00AF11D1 /* disc_io.h */, ABD1FF381345ACBF00AF11D1 /* fat.h */, ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */, ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */, ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */, ABD1FF401345ACBF00AF11D1 /* filetime.h */, ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */, ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */, ABD1FF461345ACBF00AF11D1 /* lock.h */, ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */, ABD1FF491345ACBF00AF11D1 /* partition.h */, ); path = libfat; sourceTree = ""; }; ABD1FF761345ACFA00AF11D1 /* metaspu */ = { isa = PBXGroup; children = ( ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */, ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */, ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */, ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */, ABD1FF781345ACFA00AF11D1 /* metaspu.h */, ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */, ); name = metaspu; path = ../metaspu; sourceTree = SOURCE_ROOT; }; ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */ = { isa = PBXGroup; children = ( AB4C4C2A16F55C64002E07CD /* AAFilter.cpp */, AB4C4C2B16F55C64002E07CD /* cpu_detect_x86_gcc.cpp */, AB4C4C2C16F55C64002E07CD /* FIFOSampleBuffer.cpp */, AB4C4C2D16F55C64002E07CD /* FIRFilter.cpp */, AB4C4C2E16F55C64002E07CD /* mmx_optimized.cpp */, AB4C4C2F16F55C64002E07CD /* RateTransposer.cpp */, AB4C4C3016F55C64002E07CD /* SoundTouch.cpp */, AB4C4C3116F55C64002E07CD /* sse_optimized.cpp */, AB4C4C3216F55C64002E07CD /* TDStretch.cpp */, AB4C4C3316F55C64002E07CD /* WavFile.cpp */, AB4C4C3416F55C64002E07CD /* AAFilter.h */, AB4C4C3516F55C64002E07CD /* BPMDetect.h */, AB4C4C3616F55C64002E07CD /* cpu_detect.h */, AB4C4C3716F55C64002E07CD /* FIFOSampleBuffer.h */, AB4C4C3816F55C64002E07CD /* FIFOSamplePipe.h */, AB4C4C3916F55C64002E07CD /* FIRFilter.h */, AB4C4C3A16F55C64002E07CD /* RateTransposer.h */, AB4C4C3B16F55C64002E07CD /* SoundTouch.h */, AB4C4C3C16F55C64002E07CD /* STTypes.h */, AB4C4C3D16F55C64002E07CD /* TDStretch.h */, AB4C4C3E16F55C64002E07CD /* WavFile.h */, ); path = SoundTouch; sourceTree = ""; }; ABE670241415DE6C00E8E4C9 /* tinyxml */ = { isa = PBXGroup; children = ( ABE670251415DE6C00E8E4C9 /* tinystr.cpp */, ABE670261415DE6C00E8E4C9 /* tinystr.h */, ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */, ABE670281415DE6C00E8E4C9 /* tinyxml.h */, ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */, ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */, ); path = tinyxml; sourceTree = ""; }; ABF50A78169F5FDA0018C08D /* core */ = { isa = PBXGroup; children = ( ABF50A7B169F5FDA0018C08D /* assembler.cpp */, ABF50A7D169F5FDA0018C08D /* assert.cpp */, ABF50A7F169F5FDA0018C08D /* buffer.cpp */, ABF50A82169F5FDA0018C08D /* compiler.cpp */, ABF50A84169F5FDA0018C08D /* compilercontext.cpp */, ABF50A86169F5FDA0018C08D /* compilerfunc.cpp */, ABF50A88169F5FDA0018C08D /* compileritem.cpp */, ABF50A8A169F5FDA0018C08D /* context.cpp */, ABF50A8C169F5FDA0018C08D /* cpuinfo.cpp */, ABF50A8E169F5FDA0018C08D /* defs.cpp */, ABF50A90169F5FDA0018C08D /* func.cpp */, ABF50A94169F5FDA0018C08D /* logger.cpp */, ABF50A96169F5FDA0018C08D /* memorymanager.cpp */, ABF50A98169F5FDA0018C08D /* memorymarker.cpp */, ABF50A9A169F5FDA0018C08D /* operand.cpp */, ABF50A9D169F5FDA0018C08D /* stringbuilder.cpp */, ABF50A9F169F5FDA0018C08D /* stringutil.cpp */, ABF50AA1169F5FDA0018C08D /* virtualmemory.cpp */, ABF50AA3169F5FDA0018C08D /* zonememory.cpp */, ABF50A79169F5FDA0018C08D /* apibegin.h */, ABF50A7A169F5FDA0018C08D /* apiend.h */, ABF50A7C169F5FDA0018C08D /* assembler.h */, ABF50A7E169F5FDA0018C08D /* assert.h */, ABF50A80169F5FDA0018C08D /* buffer.h */, ABF50A81169F5FDA0018C08D /* build.h */, ABF50A83169F5FDA0018C08D /* compiler.h */, ABF50A85169F5FDA0018C08D /* compilercontext.h */, ABF50A87169F5FDA0018C08D /* compilerfunc.h */, ABF50A89169F5FDA0018C08D /* compileritem.h */, ABF50A8B169F5FDA0018C08D /* context.h */, ABF50A8D169F5FDA0018C08D /* cpuinfo.h */, ABF50A8F169F5FDA0018C08D /* defs.h */, ABF50A91169F5FDA0018C08D /* func.h */, ABF50A92169F5FDA0018C08D /* intutil.h */, ABF50A93169F5FDA0018C08D /* lock.h */, ABF50A95169F5FDA0018C08D /* logger.h */, ABF50A97169F5FDA0018C08D /* memorymanager.h */, ABF50A99169F5FDA0018C08D /* memorymarker.h */, ABF50A9B169F5FDA0018C08D /* operand.h */, ABF50A9C169F5FDA0018C08D /* podvector.h */, ABF50A9E169F5FDA0018C08D /* stringbuilder.h */, ABF50AA0169F5FDA0018C08D /* stringutil.h */, ABF50AA2169F5FDA0018C08D /* virtualmemory.h */, ABF50AA4169F5FDA0018C08D /* zonememory.h */, ); path = core; sourceTree = ""; }; ABF50AA5169F5FDA0018C08D /* x86 */ = { isa = PBXGroup; children = ( ABF50AA6169F5FDA0018C08D /* x86assembler.cpp */, ABF50AA8169F5FDA0018C08D /* x86compiler.cpp */, ABF50AAA169F5FDA0018C08D /* x86compilercontext.cpp */, ABF50AAC169F5FDA0018C08D /* x86compilerfunc.cpp */, ABF50AAE169F5FDA0018C08D /* x86compileritem.cpp */, ABF50AB0169F5FDA0018C08D /* x86cpuinfo.cpp */, ABF50AB2169F5FDA0018C08D /* x86defs.cpp */, ABF50AB4169F5FDA0018C08D /* x86func.cpp */, ABF50AB6169F5FDA0018C08D /* x86operand.cpp */, ABF50AB8169F5FDA0018C08D /* x86util.cpp */, ABF50AA7169F5FDA0018C08D /* x86assembler.h */, ABF50AA9169F5FDA0018C08D /* x86compiler.h */, ABF50AAB169F5FDA0018C08D /* x86compilercontext.h */, ABF50AAD169F5FDA0018C08D /* x86compilerfunc.h */, ABF50AAF169F5FDA0018C08D /* x86compileritem.h */, ABF50AB1169F5FDA0018C08D /* x86cpuinfo.h */, ABF50AB3169F5FDA0018C08D /* x86defs.h */, ABF50AB5169F5FDA0018C08D /* x86func.h */, ABF50AB7169F5FDA0018C08D /* x86operand.h */, ABF50AB9169F5FDA0018C08D /* x86util.h */, ); path = x86; sourceTree = ""; }; ABFE14F914C92FF5005D6699 /* filter */ = { isa = PBXGroup; children = ( ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */, ABFE14FB14C92FF5005D6699 /* bilinear.cpp */, ABFE14FC14C92FF5005D6699 /* epx.cpp */, ABFE14FE14C92FF5005D6699 /* hq2x.cpp */, ABFE150014C92FF5005D6699 /* hq4x.cpp */, ABFE150414C92FF5005D6699 /* lq2x.cpp */, ABFE150614C92FF5005D6699 /* scanline.cpp */, AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */, ABFE14FD14C92FF5005D6699 /* filter.h */, ABFE14FF14C92FF5005D6699 /* hq2x.h */, ABFE150214C92FF5005D6699 /* hq4x.h */, ABFE150314C92FF5005D6699 /* interp.h */, ABFE150514C92FF5005D6699 /* lq2x.h */, AB817A34143EE2DB00A7DFE9 /* videofilter.h */, ); name = filter; path = ../filter; sourceTree = SOURCE_ROOT; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ AB2A99A41725F00F0062C1A1 /* DeSmuME (OS X App; PowerPC Release Build) */ = { isa = PBXNativeTarget; buildConfigurationList = AB2A9A761725F00F0062C1A1 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC Release Build)" */; buildPhases = ( AB2A99A51725F00F0062C1A1 /* ShellScript */, AB2A99A61725F00F0062C1A1 /* Resources */, AB2A99EF1725F00F0062C1A1 /* ShellScript */, AB2A99F01725F00F0062C1A1 /* Sources */, AB2A9A6C1725F00F0062C1A1 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; PowerPC Release Build)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB2A9A791725F00F0062C1A1 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; AB2F3B7A15CF9C6000858373 /* DeSmuME (OS X App; PowerPC; LLVM-GCC) */ = { isa = PBXNativeTarget; buildConfigurationList = AB2F3C4215CF9C6000858373 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; LLVM-GCC)" */; buildPhases = ( AB2F3B7B15CF9C6000858373 /* ShellScript */, AB2F3B7C15CF9C6000858373 /* Resources */, ABE76A8015E0904E00F458AE /* ShellScript */, AB2F3BC415CF9C6000858373 /* Sources */, AB2F3C3A15CF9C6000858373 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; PowerPC; LLVM-GCC)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB2F3C4515CF9C6000858373 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; AB711EBD1481C35F009011C8 /* DeSmuME (OS X App; Intel; LLVM-Clang) */ = { isa = PBXNativeTarget; buildConfigurationList = AB711F7C1481C35F009011C8 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; LLVM-Clang)" */; buildPhases = ( AB75222C14C799C1009B97B3 /* ShellScript */, AB711EBE1481C35F009011C8 /* Resources */, ABE76A5215E08E1100F458AE /* ShellScript */, AB711EFF1481C35F009011C8 /* Sources */, AB711F731481C35F009011C8 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; Intel; LLVM-Clang)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB711F7F1481C35F009011C8 /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; AB73A9671507C9F500A310C8 /* DeSmuME (OS X App; Intel; LLVM-GCC) */ = { isa = PBXNativeTarget; buildConfigurationList = AB73AA301507C9F500A310C8 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; LLVM-GCC)" */; buildPhases = ( AB73A9681507C9F500A310C8 /* ShellScript */, AB73A9691507C9F500A310C8 /* Resources */, ABE76A7C15E0902700F458AE /* ShellScript */, AB73A9B21507C9F500A310C8 /* Sources */, AB73AA281507C9F500A310C8 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; Intel; LLVM-GCC)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB73AA331507C9F500A310C8 /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; ABAD0F7015ACE7A00000EC47 /* DeSmuME (OS X App; PowerPC; LLVM-Clang) */ = { isa = PBXNativeTarget; buildConfigurationList = ABAD104615ACE7A00000EC47 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; LLVM-Clang)" */; buildPhases = ( ABAD0F7115ACE7A00000EC47 /* ShellScript */, ABAD0F7215ACE7A00000EC47 /* Resources */, ABE76A7E15E0903E00F458AE /* ShellScript */, ABAD0FBA15ACE7A00000EC47 /* Sources */, ABAD103E15ACE7A00000EC47 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; PowerPC; LLVM-Clang)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { ORGANIZATIONNAME = "DeSmuME Team"; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 3)" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, Italian, Chinese, Norwegian, Romanian, ); mainGroup = 29B97314FDCFA39411CA2CEA /* DeSmuME */; projectDirPath = ""; projectRoot = ""; targets = ( AB711EBD1481C35F009011C8 /* DeSmuME (OS X App; Intel; LLVM-Clang) */, AB73A9671507C9F500A310C8 /* DeSmuME (OS X App; Intel; LLVM-GCC) */, ABAD0F7015ACE7A00000EC47 /* DeSmuME (OS X App; PowerPC; LLVM-Clang) */, AB2F3B7A15CF9C6000858373 /* DeSmuME (OS X App; PowerPC; LLVM-GCC) */, AB2A99A41725F00F0062C1A1 /* DeSmuME (OS X App; PowerPC Release Build) */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ AB2A99A61725F00F0062C1A1 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB2A99A71725F00F0062C1A1 /* KeyNames.plist in Resources */, AB2A99A81725F00F0062C1A1 /* DefaultKeyMappings.plist in Resources */, AB2A99A91725F00F0062C1A1 /* DefaultUserPrefs.plist in Resources */, AB2A99AA1725F00F0062C1A1 /* FileTypeInfo.plist in Resources */, AB2A99AB1725F00F0062C1A1 /* AppIcon_ROMSave.icns in Resources */, AB2A99AC1725F00F0062C1A1 /* AppIcon_DeSmuME.icns in Resources */, AB2A99AD1725F00F0062C1A1 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB2A99AE1725F00F0062C1A1 /* AppIcon_SaveState.icns in Resources */, AB2A99AF1725F00F0062C1A1 /* InfoPlist.strings in Resources */, AB2A99B01725F00F0062C1A1 /* MainMenu.xib in Resources */, AB2A99B11725F00F0062C1A1 /* Localizable.strings in Resources */, AB2A99B21725F00F0062C1A1 /* Icon_ActionReplay_32x32.png in Resources */, AB2A99B31725F00F0062C1A1 /* Icon_CodeBreaker_32x32.png in Resources */, AB2A99B41725F00F0062C1A1 /* Icon_DeSmuME_32x32.png in Resources */, AB2A99B51725F00F0062C1A1 /* HID_usage_strings.plist in Resources */, AB2A99B61725F00F0062C1A1 /* AppIcon_ROMCheats.icns in Resources */, AB2A99B71725F00F0062C1A1 /* Icon_VolumeFull_16x16.png in Resources */, AB2A99B81725F00F0062C1A1 /* Icon_VolumeMute_16x16.png in Resources */, AB2A99B91725F00F0062C1A1 /* Icon_VolumeOneThird_16x16.png in Resources */, AB2A99BA1725F00F0062C1A1 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB2A99BB1725F00F0062C1A1 /* Icon_Execute_420x420.png in Resources */, AB2A99BC1725F00F0062C1A1 /* Icon_Pause_420x420.png in Resources */, AB2A99BD1725F00F0062C1A1 /* Icon_Speed1x_420x420.png in Resources */, AB2A99BE1725F00F0062C1A1 /* Icon_Speed2x_420x420.png in Resources */, AB2A99BF1725F00F0062C1A1 /* ColorSwatch_Blue_16x16.png in Resources */, AB2A99C01725F00F0062C1A1 /* ColorSwatch_Brown_16x16.png in Resources */, AB2A99C11725F00F0062C1A1 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB2A99C21725F00F0062C1A1 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB2A99C31725F00F0062C1A1 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB2A99C41725F00F0062C1A1 /* ColorSwatch_Gray_16x16.png in Resources */, AB2A99C51725F00F0062C1A1 /* ColorSwatch_Green_16x16.png in Resources */, AB2A99C61725F00F0062C1A1 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB2A99C71725F00F0062C1A1 /* ColorSwatch_Magenta_16x16.png in Resources */, AB2A99C81725F00F0062C1A1 /* ColorSwatch_Orange_16x16.png in Resources */, AB2A99C91725F00F0062C1A1 /* ColorSwatch_Pink_16x16.png in Resources */, AB2A99CA1725F00F0062C1A1 /* ColorSwatch_Red_16x16.png in Resources */, AB2A99CB1725F00F0062C1A1 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB2A99CC1725F00F0062C1A1 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB2A99CD1725F00F0062C1A1 /* ColorSwatch_Violet_16x16.png in Resources */, AB2A99CE1725F00F0062C1A1 /* ColorSwatch_Yellow_16x16.png in Resources */, AB2A99CF1725F00F0062C1A1 /* Icon_ActionReplay_128x128.png in Resources */, AB2A99D01725F00F0062C1A1 /* Icon_CodeBreaker_128x128.png in Resources */, AB2A99D11725F00F0062C1A1 /* VideoFilterPreview_64x64.png in Resources */, AB2A99D21725F00F0062C1A1 /* Icon_ArrowDown_420x420.png in Resources */, AB2A99D31725F00F0062C1A1 /* Icon_ArrowLeft_420x420.png in Resources */, AB2A99D41725F00F0062C1A1 /* Icon_ArrowRight_420x420.png in Resources */, AB2A99D51725F00F0062C1A1 /* Icon_ArrowUp_420x420.png in Resources */, AB2A99D61725F00F0062C1A1 /* Icon_DoubleSpeed_420x420.png in Resources */, AB2A99D71725F00F0062C1A1 /* Icon_DSButtonA_420x420.png in Resources */, AB2A99D81725F00F0062C1A1 /* Icon_DSButtonB_420x420.png in Resources */, AB2A99D91725F00F0062C1A1 /* Icon_DSButtonL_420x420.png in Resources */, AB2A99DA1725F00F0062C1A1 /* Icon_DSButtonR_420x420.png in Resources */, AB2A99DB1725F00F0062C1A1 /* Icon_DSButtonSelect_420x420.png in Resources */, AB2A99DC1725F00F0062C1A1 /* Icon_DSButtonStart_420x420.png in Resources */, AB2A99DD1725F00F0062C1A1 /* Icon_DSButtonX_420x420.png in Resources */, AB2A99DE1725F00F0062C1A1 /* Icon_DSButtonY_420x420.png in Resources */, AB2A99DF1725F00F0062C1A1 /* Icon_Emulation_420x420.png in Resources */, AB2A99E01725F00F0062C1A1 /* Icon_Input_420x420.png in Resources */, AB2A99E11725F00F0062C1A1 /* Icon_Microphone_420x420.png in Resources */, AB2A99E21725F00F0062C1A1 /* Icon_OpenROM_420x420.png in Resources */, AB2A99E31725F00F0062C1A1 /* Icon_Reset_420x420.png in Resources */, AB2A99E41725F00F0062C1A1 /* Icon_RotateCCW_420x420.png in Resources */, AB2A99E51725F00F0062C1A1 /* Icon_RotateCW_420x420.png in Resources */, AB2A99E61725F00F0062C1A1 /* Icon_ShowHUD_420x420.png in Resources */, AB2A99E71725F00F0062C1A1 /* Icon_Speaker_420x420.png in Resources */, AB2A99E81725F00F0062C1A1 /* AUTHORS in Resources */, AB2A99E91725F00F0062C1A1 /* ChangeLog in Resources */, AB2A99EA1725F00F0062C1A1 /* COPYING in Resources */, AB2A99EB1725F00F0062C1A1 /* README in Resources */, AB2A99EC1725F00F0062C1A1 /* README.MAC in Resources */, AB2A99ED1725F00F0062C1A1 /* AppIcon_FirmwareConfig.icns in Resources */, AB2A99EE1725F00F0062C1A1 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB2F3B7C15CF9C6000858373 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB2F3B7D15CF9C6000858373 /* KeyNames.plist in Resources */, AB2F3B7E15CF9C6000858373 /* DefaultKeyMappings.plist in Resources */, AB2F3B7F15CF9C6000858373 /* DefaultUserPrefs.plist in Resources */, AB2F3B8015CF9C6000858373 /* FileTypeInfo.plist in Resources */, AB2F3B8115CF9C6000858373 /* AppIcon_ROMSave.icns in Resources */, AB2F3B8215CF9C6000858373 /* AppIcon_DeSmuME.icns in Resources */, AB2F3B8315CF9C6000858373 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB2F3B8415CF9C6000858373 /* AppIcon_SaveState.icns in Resources */, AB2F3B8515CF9C6000858373 /* InfoPlist.strings in Resources */, AB2F3B8615CF9C6000858373 /* MainMenu.xib in Resources */, AB2F3B8715CF9C6000858373 /* Localizable.strings in Resources */, AB2F3B8815CF9C6000858373 /* Icon_ActionReplay_32x32.png in Resources */, AB2F3B8915CF9C6000858373 /* Icon_CodeBreaker_32x32.png in Resources */, AB2F3B8A15CF9C6000858373 /* Icon_DeSmuME_32x32.png in Resources */, AB2F3B8B15CF9C6000858373 /* HID_usage_strings.plist in Resources */, AB2F3B8C15CF9C6000858373 /* AppIcon_ROMCheats.icns in Resources */, AB2F3B8D15CF9C6000858373 /* Icon_VolumeFull_16x16.png in Resources */, AB2F3B8E15CF9C6000858373 /* Icon_VolumeMute_16x16.png in Resources */, AB2F3B8F15CF9C6000858373 /* Icon_VolumeOneThird_16x16.png in Resources */, AB2F3B9015CF9C6000858373 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB2F3B9115CF9C6000858373 /* Icon_Execute_420x420.png in Resources */, AB2F3B9215CF9C6000858373 /* Icon_Pause_420x420.png in Resources */, AB2F3B9315CF9C6000858373 /* Icon_Speed1x_420x420.png in Resources */, AB2F3B9415CF9C6000858373 /* Icon_Speed2x_420x420.png in Resources */, AB2F3B9515CF9C6000858373 /* ColorSwatch_Blue_16x16.png in Resources */, AB2F3B9615CF9C6000858373 /* ColorSwatch_Brown_16x16.png in Resources */, AB2F3B9715CF9C6000858373 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB2F3B9815CF9C6000858373 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB2F3B9915CF9C6000858373 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB2F3B9A15CF9C6000858373 /* ColorSwatch_Gray_16x16.png in Resources */, AB2F3B9B15CF9C6000858373 /* ColorSwatch_Green_16x16.png in Resources */, AB2F3B9C15CF9C6000858373 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB2F3B9D15CF9C6000858373 /* ColorSwatch_Magenta_16x16.png in Resources */, AB2F3B9E15CF9C6000858373 /* ColorSwatch_Orange_16x16.png in Resources */, AB2F3B9F15CF9C6000858373 /* ColorSwatch_Pink_16x16.png in Resources */, AB2F3BA015CF9C6000858373 /* ColorSwatch_Red_16x16.png in Resources */, AB2F3BA115CF9C6000858373 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB2F3BA215CF9C6000858373 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB2F3BA315CF9C6000858373 /* ColorSwatch_Violet_16x16.png in Resources */, AB2F3BA415CF9C6000858373 /* ColorSwatch_Yellow_16x16.png in Resources */, AB2F3BA515CF9C6000858373 /* Icon_ActionReplay_128x128.png in Resources */, AB2F3BA615CF9C6000858373 /* Icon_CodeBreaker_128x128.png in Resources */, AB2F3BA715CF9C6000858373 /* VideoFilterPreview_64x64.png in Resources */, AB2F3BA815CF9C6000858373 /* Icon_ArrowDown_420x420.png in Resources */, AB2F3BA915CF9C6000858373 /* Icon_ArrowLeft_420x420.png in Resources */, AB2F3BAA15CF9C6000858373 /* Icon_ArrowRight_420x420.png in Resources */, AB2F3BAB15CF9C6000858373 /* Icon_ArrowUp_420x420.png in Resources */, AB2F3BAC15CF9C6000858373 /* Icon_DoubleSpeed_420x420.png in Resources */, AB2F3BAD15CF9C6000858373 /* Icon_DSButtonA_420x420.png in Resources */, AB2F3BAE15CF9C6000858373 /* Icon_DSButtonB_420x420.png in Resources */, AB2F3BAF15CF9C6000858373 /* Icon_DSButtonL_420x420.png in Resources */, AB2F3BB015CF9C6000858373 /* Icon_DSButtonR_420x420.png in Resources */, AB2F3BB115CF9C6000858373 /* Icon_DSButtonSelect_420x420.png in Resources */, AB2F3BB215CF9C6000858373 /* Icon_DSButtonStart_420x420.png in Resources */, AB2F3BB315CF9C6000858373 /* Icon_DSButtonX_420x420.png in Resources */, AB2F3BB415CF9C6000858373 /* Icon_DSButtonY_420x420.png in Resources */, AB2F3BB515CF9C6000858373 /* Icon_Emulation_420x420.png in Resources */, AB2F3BB615CF9C6000858373 /* Icon_Input_420x420.png in Resources */, AB2F3BB715CF9C6000858373 /* Icon_Microphone_420x420.png in Resources */, AB2F3BB815CF9C6000858373 /* Icon_OpenROM_420x420.png in Resources */, AB2F3BB915CF9C6000858373 /* Icon_Reset_420x420.png in Resources */, AB2F3BBA15CF9C6000858373 /* Icon_RotateCCW_420x420.png in Resources */, AB2F3BBB15CF9C6000858373 /* Icon_RotateCW_420x420.png in Resources */, AB2F3BBC15CF9C6000858373 /* Icon_ShowHUD_420x420.png in Resources */, AB2F3BBD15CF9C6000858373 /* Icon_Speaker_420x420.png in Resources */, AB2F3BBE15CF9C6000858373 /* AUTHORS in Resources */, AB2F3BBF15CF9C6000858373 /* ChangeLog in Resources */, AB2F3BC015CF9C6000858373 /* COPYING in Resources */, AB2F3BC115CF9C6000858373 /* README in Resources */, AB2F3BC215CF9C6000858373 /* README.MAC in Resources */, AB2F3BC315CF9C6000858373 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBA16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB711EBE1481C35F009011C8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB711ED21481C35F009011C8 /* KeyNames.plist in Resources */, AB711ED31481C35F009011C8 /* DefaultKeyMappings.plist in Resources */, AB711ED81481C35F009011C8 /* DefaultUserPrefs.plist in Resources */, AB711EDE1481C35F009011C8 /* FileTypeInfo.plist in Resources */, AB711EEF1481C35F009011C8 /* AppIcon_ROMSave.icns in Resources */, AB711EF01481C35F009011C8 /* AppIcon_DeSmuME.icns in Resources */, AB711EF11481C35F009011C8 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB711EF21481C35F009011C8 /* AppIcon_SaveState.icns in Resources */, AB711EF31481C35F009011C8 /* InfoPlist.strings in Resources */, AB711EF41481C35F009011C8 /* MainMenu.xib in Resources */, AB711EF51481C35F009011C8 /* Localizable.strings in Resources */, AB711EFB1481C35F009011C8 /* Icon_ActionReplay_32x32.png in Resources */, AB711EFC1481C35F009011C8 /* Icon_CodeBreaker_32x32.png in Resources */, AB711EFD1481C35F009011C8 /* Icon_DeSmuME_32x32.png in Resources */, AB711EFE1481C35F009011C8 /* HID_usage_strings.plist in Resources */, ABBF04A614B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */, ABC3AF3314B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */, ABC3AF3414B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */, ABC3AF3514B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */, ABC3AF3614B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */, AB0F290614BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */, AB0F290714BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */, AB0F290814BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */, AB0F290914BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */, AB0F294814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */, AB0F294914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */, AB0F294A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB0F294B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB0F294C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB0F294D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */, AB0F294E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */, AB0F294F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB0F295014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */, AB0F295114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */, AB0F295214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */, AB0F295314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */, AB0F295414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB0F295514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */, AB0F295614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */, AB0F295714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */, AB0F296F14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */, AB0F297014BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */, AB0F297B14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */, AB0F299014BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */, AB0F299114BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */, AB0F299214BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */, AB0F299314BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */, AB0F29B814BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */, AB0F29B914BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */, AB0F29BA14BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */, AB0F29BB14BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */, AB0F29BC14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */, AB0F29BD14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */, AB0F29BE14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */, AB0F29BF14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */, AB0F29C014BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */, AB0F29C114BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */, AB0F29C214BE7213009ABC6F /* Icon_Input_420x420.png in Resources */, AB0F29C314BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */, AB0F29C414BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */, AB0F29C514BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */, AB0F29C614BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */, AB0F29C714BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */, AB0F29C814BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */, AB0F29C914BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */, AB3ACC4414C24D5400D7D192 /* AUTHORS in Resources */, AB3ACC4514C24D5400D7D192 /* ChangeLog in Resources */, AB3ACC4614C24D5400D7D192 /* COPYING in Resources */, AB3ACC4714C24D5400D7D192 /* README in Resources */, AB3ACC4914C24D5400D7D192 /* README.MAC in Resources */, AB75226F14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBB16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB73A9691507C9F500A310C8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB73A96A1507C9F500A310C8 /* KeyNames.plist in Resources */, AB73A96B1507C9F500A310C8 /* DefaultKeyMappings.plist in Resources */, AB73A96C1507C9F500A310C8 /* DefaultUserPrefs.plist in Resources */, AB73A96D1507C9F500A310C8 /* FileTypeInfo.plist in Resources */, AB73A96E1507C9F500A310C8 /* AppIcon_ROMSave.icns in Resources */, AB73A96F1507C9F500A310C8 /* AppIcon_DeSmuME.icns in Resources */, AB73A9701507C9F500A310C8 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB73A9711507C9F500A310C8 /* AppIcon_SaveState.icns in Resources */, AB73A9721507C9F500A310C8 /* InfoPlist.strings in Resources */, AB73A9731507C9F500A310C8 /* MainMenu.xib in Resources */, AB73A9741507C9F500A310C8 /* Localizable.strings in Resources */, AB73A9751507C9F500A310C8 /* Icon_ActionReplay_32x32.png in Resources */, AB73A9761507C9F500A310C8 /* Icon_CodeBreaker_32x32.png in Resources */, AB73A9771507C9F500A310C8 /* Icon_DeSmuME_32x32.png in Resources */, AB73A9781507C9F500A310C8 /* HID_usage_strings.plist in Resources */, AB73A9791507C9F500A310C8 /* AppIcon_ROMCheats.icns in Resources */, AB73A97A1507C9F500A310C8 /* Icon_VolumeFull_16x16.png in Resources */, AB73A97B1507C9F500A310C8 /* Icon_VolumeMute_16x16.png in Resources */, AB73A97C1507C9F500A310C8 /* Icon_VolumeOneThird_16x16.png in Resources */, AB73A97D1507C9F500A310C8 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB73A97E1507C9F500A310C8 /* Icon_Execute_420x420.png in Resources */, AB73A97F1507C9F500A310C8 /* Icon_Pause_420x420.png in Resources */, AB73A9801507C9F500A310C8 /* Icon_Speed1x_420x420.png in Resources */, AB73A9811507C9F500A310C8 /* Icon_Speed2x_420x420.png in Resources */, AB73A9821507C9F500A310C8 /* ColorSwatch_Blue_16x16.png in Resources */, AB73A9831507C9F500A310C8 /* ColorSwatch_Brown_16x16.png in Resources */, AB73A9841507C9F500A310C8 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB73A9851507C9F500A310C8 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB73A9861507C9F500A310C8 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB73A9871507C9F500A310C8 /* ColorSwatch_Gray_16x16.png in Resources */, AB73A9881507C9F500A310C8 /* ColorSwatch_Green_16x16.png in Resources */, AB73A9891507C9F500A310C8 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB73A98A1507C9F500A310C8 /* ColorSwatch_Magenta_16x16.png in Resources */, AB73A98B1507C9F500A310C8 /* ColorSwatch_Orange_16x16.png in Resources */, AB73A98C1507C9F500A310C8 /* ColorSwatch_Pink_16x16.png in Resources */, AB73A98D1507C9F500A310C8 /* ColorSwatch_Red_16x16.png in Resources */, AB73A98E1507C9F500A310C8 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB73A98F1507C9F500A310C8 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB73A9901507C9F500A310C8 /* ColorSwatch_Violet_16x16.png in Resources */, AB73A9911507C9F500A310C8 /* ColorSwatch_Yellow_16x16.png in Resources */, AB73A9921507C9F500A310C8 /* Icon_ActionReplay_128x128.png in Resources */, AB73A9931507C9F500A310C8 /* Icon_CodeBreaker_128x128.png in Resources */, AB73A9941507C9F500A310C8 /* VideoFilterPreview_64x64.png in Resources */, AB73A9951507C9F500A310C8 /* Icon_ArrowDown_420x420.png in Resources */, AB73A9961507C9F500A310C8 /* Icon_ArrowLeft_420x420.png in Resources */, AB73A9971507C9F500A310C8 /* Icon_ArrowRight_420x420.png in Resources */, AB73A9981507C9F500A310C8 /* Icon_ArrowUp_420x420.png in Resources */, AB73A9991507C9F500A310C8 /* Icon_DoubleSpeed_420x420.png in Resources */, AB73A99A1507C9F500A310C8 /* Icon_DSButtonA_420x420.png in Resources */, AB73A99B1507C9F500A310C8 /* Icon_DSButtonB_420x420.png in Resources */, AB73A99C1507C9F500A310C8 /* Icon_DSButtonL_420x420.png in Resources */, AB73A99D1507C9F500A310C8 /* Icon_DSButtonR_420x420.png in Resources */, AB73A99E1507C9F500A310C8 /* Icon_DSButtonSelect_420x420.png in Resources */, AB73A99F1507C9F500A310C8 /* Icon_DSButtonStart_420x420.png in Resources */, AB73A9A01507C9F500A310C8 /* Icon_DSButtonX_420x420.png in Resources */, AB73A9A11507C9F500A310C8 /* Icon_DSButtonY_420x420.png in Resources */, AB73A9A21507C9F500A310C8 /* Icon_Emulation_420x420.png in Resources */, AB73A9A31507C9F500A310C8 /* Icon_Input_420x420.png in Resources */, AB73A9A41507C9F500A310C8 /* Icon_Microphone_420x420.png in Resources */, AB73A9A51507C9F500A310C8 /* Icon_OpenROM_420x420.png in Resources */, AB73A9A61507C9F500A310C8 /* Icon_Reset_420x420.png in Resources */, AB73A9A71507C9F500A310C8 /* Icon_RotateCCW_420x420.png in Resources */, AB73A9A81507C9F500A310C8 /* Icon_RotateCW_420x420.png in Resources */, AB73A9A91507C9F500A310C8 /* Icon_ShowHUD_420x420.png in Resources */, AB73A9AA1507C9F500A310C8 /* Icon_Speaker_420x420.png in Resources */, AB73A9AB1507C9F500A310C8 /* AUTHORS in Resources */, AB73A9AC1507C9F500A310C8 /* ChangeLog in Resources */, AB73A9AD1507C9F500A310C8 /* COPYING in Resources */, AB73A9AE1507C9F500A310C8 /* README in Resources */, AB73A9B01507C9F500A310C8 /* README.MAC in Resources */, AB73A9B11507C9F500A310C8 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBD16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABAD0F7215ACE7A00000EC47 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ABAD0F7315ACE7A00000EC47 /* KeyNames.plist in Resources */, ABAD0F7415ACE7A00000EC47 /* DefaultKeyMappings.plist in Resources */, ABAD0F7515ACE7A00000EC47 /* DefaultUserPrefs.plist in Resources */, ABAD0F7615ACE7A00000EC47 /* FileTypeInfo.plist in Resources */, ABAD0F7715ACE7A00000EC47 /* AppIcon_ROMSave.icns in Resources */, ABAD0F7815ACE7A00000EC47 /* AppIcon_DeSmuME.icns in Resources */, ABAD0F7915ACE7A00000EC47 /* AppIcon_NintendoDS_ROM.icns in Resources */, ABAD0F7A15ACE7A00000EC47 /* AppIcon_SaveState.icns in Resources */, ABAD0F7B15ACE7A00000EC47 /* InfoPlist.strings in Resources */, ABAD0F7C15ACE7A00000EC47 /* MainMenu.xib in Resources */, ABAD0F7D15ACE7A00000EC47 /* Localizable.strings in Resources */, ABAD0F7E15ACE7A00000EC47 /* Icon_ActionReplay_32x32.png in Resources */, ABAD0F7F15ACE7A00000EC47 /* Icon_CodeBreaker_32x32.png in Resources */, ABAD0F8015ACE7A00000EC47 /* Icon_DeSmuME_32x32.png in Resources */, ABAD0F8115ACE7A00000EC47 /* HID_usage_strings.plist in Resources */, ABAD0F8215ACE7A00000EC47 /* AppIcon_ROMCheats.icns in Resources */, ABAD0F8315ACE7A00000EC47 /* Icon_VolumeFull_16x16.png in Resources */, ABAD0F8415ACE7A00000EC47 /* Icon_VolumeMute_16x16.png in Resources */, ABAD0F8515ACE7A00000EC47 /* Icon_VolumeOneThird_16x16.png in Resources */, ABAD0F8615ACE7A00000EC47 /* Icon_VolumeTwoThird_16x16.png in Resources */, ABAD0F8715ACE7A00000EC47 /* Icon_Execute_420x420.png in Resources */, ABAD0F8815ACE7A00000EC47 /* Icon_Pause_420x420.png in Resources */, ABAD0F8915ACE7A00000EC47 /* Icon_Speed1x_420x420.png in Resources */, ABAD0F8A15ACE7A00000EC47 /* Icon_Speed2x_420x420.png in Resources */, ABAD0F8B15ACE7A00000EC47 /* ColorSwatch_Blue_16x16.png in Resources */, ABAD0F8C15ACE7A00000EC47 /* ColorSwatch_Brown_16x16.png in Resources */, ABAD0F8D15ACE7A00000EC47 /* ColorSwatch_DarkBlue_16x16.png in Resources */, ABAD0F8E15ACE7A00000EC47 /* ColorSwatch_DarkGreen_16x16.png in Resources */, ABAD0F8F15ACE7A00000EC47 /* ColorSwatch_DarkPurple_16x16.png in Resources */, ABAD0F9015ACE7A00000EC47 /* ColorSwatch_Gray_16x16.png in Resources */, ABAD0F9115ACE7A00000EC47 /* ColorSwatch_Green_16x16.png in Resources */, ABAD0F9215ACE7A00000EC47 /* ColorSwatch_LimeGreen_16x16.png in Resources */, ABAD0F9315ACE7A00000EC47 /* ColorSwatch_Magenta_16x16.png in Resources */, ABAD0F9415ACE7A00000EC47 /* ColorSwatch_Orange_16x16.png in Resources */, ABAD0F9515ACE7A00000EC47 /* ColorSwatch_Pink_16x16.png in Resources */, ABAD0F9615ACE7A00000EC47 /* ColorSwatch_Red_16x16.png in Resources */, ABAD0F9715ACE7A00000EC47 /* ColorSwatch_SeaGreen_16x16.png in Resources */, ABAD0F9815ACE7A00000EC47 /* ColorSwatch_Turquoise_16x16.png in Resources */, ABAD0F9915ACE7A00000EC47 /* ColorSwatch_Violet_16x16.png in Resources */, ABAD0F9A15ACE7A00000EC47 /* ColorSwatch_Yellow_16x16.png in Resources */, ABAD0F9B15ACE7A00000EC47 /* Icon_ActionReplay_128x128.png in Resources */, ABAD0F9C15ACE7A00000EC47 /* Icon_CodeBreaker_128x128.png in Resources */, ABAD0F9D15ACE7A00000EC47 /* VideoFilterPreview_64x64.png in Resources */, ABAD0F9E15ACE7A00000EC47 /* Icon_ArrowDown_420x420.png in Resources */, ABAD0F9F15ACE7A00000EC47 /* Icon_ArrowLeft_420x420.png in Resources */, ABAD0FA015ACE7A00000EC47 /* Icon_ArrowRight_420x420.png in Resources */, ABAD0FA115ACE7A00000EC47 /* Icon_ArrowUp_420x420.png in Resources */, ABAD0FA215ACE7A00000EC47 /* Icon_DoubleSpeed_420x420.png in Resources */, ABAD0FA315ACE7A00000EC47 /* Icon_DSButtonA_420x420.png in Resources */, ABAD0FA415ACE7A00000EC47 /* Icon_DSButtonB_420x420.png in Resources */, ABAD0FA515ACE7A00000EC47 /* Icon_DSButtonL_420x420.png in Resources */, ABAD0FA615ACE7A00000EC47 /* Icon_DSButtonR_420x420.png in Resources */, ABAD0FA715ACE7A00000EC47 /* Icon_DSButtonSelect_420x420.png in Resources */, ABAD0FA815ACE7A00000EC47 /* Icon_DSButtonStart_420x420.png in Resources */, ABAD0FA915ACE7A00000EC47 /* Icon_DSButtonX_420x420.png in Resources */, ABAD0FAA15ACE7A00000EC47 /* Icon_DSButtonY_420x420.png in Resources */, ABAD0FAB15ACE7A00000EC47 /* Icon_Emulation_420x420.png in Resources */, ABAD0FAC15ACE7A00000EC47 /* Icon_Input_420x420.png in Resources */, ABAD0FAD15ACE7A00000EC47 /* Icon_Microphone_420x420.png in Resources */, ABAD0FAE15ACE7A00000EC47 /* Icon_OpenROM_420x420.png in Resources */, ABAD0FAF15ACE7A00000EC47 /* Icon_Reset_420x420.png in Resources */, ABAD0FB015ACE7A00000EC47 /* Icon_RotateCCW_420x420.png in Resources */, ABAD0FB115ACE7A00000EC47 /* Icon_RotateCW_420x420.png in Resources */, ABAD0FB215ACE7A00000EC47 /* Icon_ShowHUD_420x420.png in Resources */, ABAD0FB315ACE7A00000EC47 /* Icon_Speaker_420x420.png in Resources */, ABAD0FB415ACE7A00000EC47 /* AUTHORS in Resources */, ABAD0FB515ACE7A00000EC47 /* ChangeLog in Resources */, ABAD0FB615ACE7A00000EC47 /* COPYING in Resources */, ABAD0FB715ACE7A00000EC47 /* README in Resources */, ABAD0FB815ACE7A00000EC47 /* README.MAC in Resources */, ABAD0FB915ACE7A00000EC47 /* AppIcon_FirmwareConfig.icns in Resources */, AB700DBC16CDDBC400FBD336 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ AB2A99A51725F00F0062C1A1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB2A99EF1725F00F0062C1A1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; AB2F3B7B15CF9C6000858373 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB73A9681507C9F500A310C8 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB75222C14C799C1009B97B3 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; ABAD0F7115ACE7A00000EC47 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; ABE76A5215E08E1100F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76A7C15E0902700F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76A7E15E0903E00F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76A8015E0904E00F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ AB2A99F01725F00F0062C1A1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB2A99F11725F00F0062C1A1 /* ConvertUTF.c in Sources */, AB2A99F21725F00F0062C1A1 /* addons.cpp in Sources */, AB2A99F31725F00F0062C1A1 /* arm_instructions.cpp in Sources */, AB2A99F41725F00F0062C1A1 /* armcpu.cpp in Sources */, AB2A99F51725F00F0062C1A1 /* bios.cpp in Sources */, AB2A99F61725F00F0062C1A1 /* cache.cpp in Sources */, AB2A99F71725F00F0062C1A1 /* cheatSystem.cpp in Sources */, AB2A99F81725F00F0062C1A1 /* common.cpp in Sources */, AB2A99F91725F00F0062C1A1 /* cp15.cpp in Sources */, AB2A99FA1725F00F0062C1A1 /* crc.cpp in Sources */, AB2A99FB1725F00F0062C1A1 /* datetime.cpp in Sources */, AB2A99FC1725F00F0062C1A1 /* debug.cpp in Sources */, AB2A99FD1725F00F0062C1A1 /* decrypt.cpp in Sources */, AB2A99FE1725F00F0062C1A1 /* directory.cpp in Sources */, AB2A99FF1725F00F0062C1A1 /* Disassembler.cpp in Sources */, AB2A9A001725F00F0062C1A1 /* disc.cpp in Sources */, AB2A9A011725F00F0062C1A1 /* dlditool.cpp in Sources */, AB2A9A021725F00F0062C1A1 /* driver.cpp in Sources */, AB2A9A031725F00F0062C1A1 /* emufat.cpp in Sources */, AB2A9A041725F00F0062C1A1 /* emufile.cpp in Sources */, AB2A9A051725F00F0062C1A1 /* fatdir.cpp in Sources */, AB2A9A061725F00F0062C1A1 /* fatfile.cpp in Sources */, AB2A9A071725F00F0062C1A1 /* FIFO.cpp in Sources */, AB2A9A081725F00F0062C1A1 /* file_allocation_table.cpp in Sources */, AB2A9A091725F00F0062C1A1 /* filetime.cpp in Sources */, AB2A9A0A1725F00F0062C1A1 /* firmware.cpp in Sources */, AB2A9A0B1725F00F0062C1A1 /* fs-linux.cpp in Sources */, AB2A9A0C1725F00F0062C1A1 /* gfx3d.cpp in Sources */, AB2A9A0D1725F00F0062C1A1 /* GPU.cpp in Sources */, AB2A9A0E1725F00F0062C1A1 /* GPU_osd_stub.cpp in Sources */, AB2A9A0F1725F00F0062C1A1 /* guid.cpp in Sources */, AB2A9A101725F00F0062C1A1 /* header.cpp in Sources */, AB2A9A111725F00F0062C1A1 /* libfat.cpp in Sources */, AB2A9A121725F00F0062C1A1 /* libfat_public_api.cpp in Sources */, AB2A9A131725F00F0062C1A1 /* lock.cpp in Sources */, AB2A9A141725F00F0062C1A1 /* matrix.cpp in Sources */, AB2A9A151725F00F0062C1A1 /* mc.cpp in Sources */, AB2A9A161725F00F0062C1A1 /* md5.cpp in Sources */, AB2A9A171725F00F0062C1A1 /* metaspu.cpp in Sources */, AB2A9A181725F00F0062C1A1 /* MMU.cpp in Sources */, AB2A9A191725F00F0062C1A1 /* movie.cpp in Sources */, AB2A9A1A1725F00F0062C1A1 /* NDSSystem.cpp in Sources */, AB2A9A1B1725F00F0062C1A1 /* partition.cpp in Sources */, AB2A9A1C1725F00F0062C1A1 /* path.cpp in Sources */, AB2A9A1D1725F00F0062C1A1 /* rasterize.cpp in Sources */, AB2A9A1E1725F00F0062C1A1 /* readwrite.cpp in Sources */, AB2A9A1F1725F00F0062C1A1 /* render3D.cpp in Sources */, AB2A9A201725F00F0062C1A1 /* ROMReader.cpp in Sources */, AB2A9A211725F00F0062C1A1 /* rtc.cpp in Sources */, AB2A9A221725F00F0062C1A1 /* saves.cpp in Sources */, AB2A9A231725F00F0062C1A1 /* slot1.cpp in Sources */, AB2A9A241725F00F0062C1A1 /* slot1_none.cpp in Sources */, AB2A9A251725F00F0062C1A1 /* slot1_r4.cpp in Sources */, AB2A9A261725F00F0062C1A1 /* slot1_retail.cpp in Sources */, AB2A9A271725F00F0062C1A1 /* slot1_retail_nand.cpp in Sources */, AB2A9A281725F00F0062C1A1 /* slot2_expMemory.cpp in Sources */, AB2A9A291725F00F0062C1A1 /* slot2_gbagame.cpp in Sources */, AB2A9A2A1725F00F0062C1A1 /* slot2_guitarGrip.cpp in Sources */, AB2A9A2B1725F00F0062C1A1 /* slot2_mpcf.cpp in Sources */, AB2A9A2C1725F00F0062C1A1 /* slot2_none.cpp in Sources */, AB2A9A2D1725F00F0062C1A1 /* slot2_paddle.cpp in Sources */, AB2A9A2E1725F00F0062C1A1 /* slot2_piano.cpp in Sources */, AB2A9A2F1725F00F0062C1A1 /* slot2_rumblepak.cpp in Sources */, AB2A9A301725F00F0062C1A1 /* sndOSX.cpp in Sources */, AB2A9A311725F00F0062C1A1 /* SndOut.cpp in Sources */, AB2A9A321725F00F0062C1A1 /* SPU.cpp in Sources */, AB2A9A331725F00F0062C1A1 /* task.cpp in Sources */, AB2A9A341725F00F0062C1A1 /* texcache.cpp in Sources */, AB2A9A351725F00F0062C1A1 /* thumb_instructions.cpp in Sources */, AB2A9A361725F00F0062C1A1 /* Timestretcher.cpp in Sources */, AB2A9A371725F00F0062C1A1 /* tinystr.cpp in Sources */, AB2A9A381725F00F0062C1A1 /* tinyxml.cpp in Sources */, AB2A9A391725F00F0062C1A1 /* tinyxmlerror.cpp in Sources */, AB2A9A3A1725F00F0062C1A1 /* tinyxmlparser.cpp in Sources */, AB2A9A3B1725F00F0062C1A1 /* version.cpp in Sources */, AB2A9A3C1725F00F0062C1A1 /* vfat.cpp in Sources */, AB2A9A3D1725F00F0062C1A1 /* videofilter.cpp in Sources */, AB2A9A3E1725F00F0062C1A1 /* wifi.cpp in Sources */, AB2A9A3F1725F00F0062C1A1 /* xstring.cpp in Sources */, AB2A9A401725F00F0062C1A1 /* main.m in Sources */, AB2A9A411725F00F0062C1A1 /* cocoa_cheat.mm in Sources */, AB2A9A421725F00F0062C1A1 /* cocoa_core.mm in Sources */, AB2A9A431725F00F0062C1A1 /* cocoa_file.mm in Sources */, AB2A9A441725F00F0062C1A1 /* cocoa_firmware.mm in Sources */, AB2A9A451725F00F0062C1A1 /* cocoa_input.mm in Sources */, AB2A9A461725F00F0062C1A1 /* mic_ext.cpp in Sources */, AB2A9A471725F00F0062C1A1 /* cocoa_output.mm in Sources */, AB2A9A481725F00F0062C1A1 /* cocoa_rom.mm in Sources */, AB2A9A491725F00F0062C1A1 /* cocoa_util.mm in Sources */, AB2A9A4A1725F00F0062C1A1 /* cocoa_videofilter.mm in Sources */, AB2A9A4B1725F00F0062C1A1 /* OGLRender.cpp in Sources */, AB2A9A4C1725F00F0062C1A1 /* appDelegate.mm in Sources */, AB2A9A4D1725F00F0062C1A1 /* cheatWindowDelegate.mm in Sources */, AB2A9A4E1725F00F0062C1A1 /* inputPrefsView.mm in Sources */, AB2A9A4F1725F00F0062C1A1 /* preferencesWindowDelegate.mm in Sources */, AB2A9A501725F00F0062C1A1 /* 2xsai.cpp in Sources */, AB2A9A511725F00F0062C1A1 /* bilinear.cpp in Sources */, AB2A9A521725F00F0062C1A1 /* epx.cpp in Sources */, AB2A9A531725F00F0062C1A1 /* hq2x.cpp in Sources */, AB2A9A541725F00F0062C1A1 /* hq4x.cpp in Sources */, AB2A9A551725F00F0062C1A1 /* lq2x.cpp in Sources */, AB2A9A561725F00F0062C1A1 /* scanline.cpp in Sources */, AB2A9A571725F00F0062C1A1 /* coreaudiosound.cpp in Sources */, AB2A9A581725F00F0062C1A1 /* ringbuffer.cpp in Sources */, AB2A9A591725F00F0062C1A1 /* troubleshootingWindowDelegate.mm in Sources */, AB2A9A5A1725F00F0062C1A1 /* EmuControllerDelegate.mm in Sources */, AB2A9A5B1725F00F0062C1A1 /* cocoa_GPU.mm in Sources */, AB2A9A5C1725F00F0062C1A1 /* DisplayWindowController.mm in Sources */, AB2A9A5D1725F00F0062C1A1 /* InputManager.mm in Sources */, AB2A9A5E1725F00F0062C1A1 /* AAFilter.cpp in Sources */, AB2A9A5F1725F00F0062C1A1 /* cpu_detect_x86_gcc.cpp in Sources */, AB2A9A601725F00F0062C1A1 /* FIFOSampleBuffer.cpp in Sources */, AB2A9A611725F00F0062C1A1 /* FIRFilter.cpp in Sources */, AB2A9A621725F00F0062C1A1 /* mmx_optimized.cpp in Sources */, AB2A9A631725F00F0062C1A1 /* RateTransposer.cpp in Sources */, AB2A9A641725F00F0062C1A1 /* SoundTouch.cpp in Sources */, AB2A9A651725F00F0062C1A1 /* sse_optimized.cpp in Sources */, AB2A9A661725F00F0062C1A1 /* TDStretch.cpp in Sources */, AB2A9A671725F00F0062C1A1 /* WavFile.cpp in Sources */, AB2A9A681725F00F0062C1A1 /* utilities.c in Sources */, AB2A9A691725F00F0062C1A1 /* InputProfileController.mm in Sources */, AB2A9A6A1725F00F0062C1A1 /* audiosamplegenerator.cpp in Sources */, AB2A9A6B1725F00F0062C1A1 /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB2F3BC415CF9C6000858373 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB2F3BC515CF9C6000858373 /* ConvertUTF.c in Sources */, AB2F3BC715CF9C6000858373 /* addons.cpp in Sources */, AB2F3BC815CF9C6000858373 /* arm_instructions.cpp in Sources */, AB2F3BC915CF9C6000858373 /* armcpu.cpp in Sources */, AB2F3BCA15CF9C6000858373 /* bios.cpp in Sources */, AB2F3BCB15CF9C6000858373 /* cache.cpp in Sources */, AB2F3BCC15CF9C6000858373 /* cheatSystem.cpp in Sources */, AB2F3BCD15CF9C6000858373 /* common.cpp in Sources */, AB2F3BCE15CF9C6000858373 /* cp15.cpp in Sources */, AB2F3BD015CF9C6000858373 /* crc.cpp in Sources */, AB2F3BD115CF9C6000858373 /* datetime.cpp in Sources */, AB2F3BD215CF9C6000858373 /* debug.cpp in Sources */, AB2F3BD315CF9C6000858373 /* decrypt.cpp in Sources */, AB2F3BD415CF9C6000858373 /* directory.cpp in Sources */, AB2F3BD515CF9C6000858373 /* Disassembler.cpp in Sources */, AB2F3BD615CF9C6000858373 /* disc.cpp in Sources */, AB2F3BD715CF9C6000858373 /* dlditool.cpp in Sources */, AB2F3BD815CF9C6000858373 /* driver.cpp in Sources */, AB2F3BD915CF9C6000858373 /* emufat.cpp in Sources */, AB2F3BDA15CF9C6000858373 /* emufile.cpp in Sources */, AB2F3BDB15CF9C6000858373 /* fatdir.cpp in Sources */, AB2F3BDC15CF9C6000858373 /* fatfile.cpp in Sources */, AB2F3BDD15CF9C6000858373 /* FIFO.cpp in Sources */, AB2F3BDF15CF9C6000858373 /* file_allocation_table.cpp in Sources */, AB2F3BE015CF9C6000858373 /* filetime.cpp in Sources */, AB2F3BE215CF9C6000858373 /* firmware.cpp in Sources */, AB2F3BE315CF9C6000858373 /* fs-linux.cpp in Sources */, AB2F3BE415CF9C6000858373 /* gfx3d.cpp in Sources */, AB2F3BE515CF9C6000858373 /* GPU.cpp in Sources */, AB2F3BE615CF9C6000858373 /* GPU_osd_stub.cpp in Sources */, AB2F3BE715CF9C6000858373 /* guid.cpp in Sources */, AB2F3BE815CF9C6000858373 /* header.cpp in Sources */, AB2F3BE915CF9C6000858373 /* libfat.cpp in Sources */, AB2F3BEA15CF9C6000858373 /* libfat_public_api.cpp in Sources */, AB2F3BEB15CF9C6000858373 /* lock.cpp in Sources */, AB2F3BEC15CF9C6000858373 /* matrix.cpp in Sources */, AB2F3BED15CF9C6000858373 /* mc.cpp in Sources */, AB2F3BEE15CF9C6000858373 /* md5.cpp in Sources */, AB2F3BEF15CF9C6000858373 /* metaspu.cpp in Sources */, AB2F3BF015CF9C6000858373 /* MMU.cpp in Sources */, AB2F3BF215CF9C6000858373 /* movie.cpp in Sources */, AB2F3BF315CF9C6000858373 /* NDSSystem.cpp in Sources */, AB2F3BF415CF9C6000858373 /* partition.cpp in Sources */, AB2F3BF515CF9C6000858373 /* path.cpp in Sources */, AB2F3BF615CF9C6000858373 /* rasterize.cpp in Sources */, AB2F3BF815CF9C6000858373 /* readwrite.cpp in Sources */, AB2F3BF915CF9C6000858373 /* render3D.cpp in Sources */, AB2F3BFA15CF9C6000858373 /* ROMReader.cpp in Sources */, AB2F3BFB15CF9C6000858373 /* rtc.cpp in Sources */, AB2F3BFC15CF9C6000858373 /* saves.cpp in Sources */, AB2F3BFD15CF9C6000858373 /* slot1.cpp in Sources */, AB2F3BFE15CF9C6000858373 /* slot1_none.cpp in Sources */, AB2F3BFF15CF9C6000858373 /* slot1_r4.cpp in Sources */, AB2F3C0015CF9C6000858373 /* slot1_retail.cpp in Sources */, AB2F3C0115CF9C6000858373 /* slot1_retail_nand.cpp in Sources */, AB2F3C0215CF9C6000858373 /* slot2_expMemory.cpp in Sources */, AB2F3C0315CF9C6000858373 /* slot2_gbagame.cpp in Sources */, AB2F3C0415CF9C6000858373 /* slot2_guitarGrip.cpp in Sources */, AB2F3C0515CF9C6000858373 /* slot2_mpcf.cpp in Sources */, AB2F3C0615CF9C6000858373 /* slot2_none.cpp in Sources */, AB2F3C0715CF9C6000858373 /* slot2_paddle.cpp in Sources */, AB2F3C0815CF9C6000858373 /* slot2_piano.cpp in Sources */, AB2F3C0915CF9C6000858373 /* slot2_rumblepak.cpp in Sources */, AB2F3C0A15CF9C6000858373 /* sndOSX.cpp in Sources */, AB2F3C0B15CF9C6000858373 /* SndOut.cpp in Sources */, AB2F3C0D15CF9C6000858373 /* SPU.cpp in Sources */, AB2F3C0F15CF9C6000858373 /* task.cpp in Sources */, AB2F3C1115CF9C6000858373 /* texcache.cpp in Sources */, AB2F3C1215CF9C6000858373 /* thumb_instructions.cpp in Sources */, AB2F3C1315CF9C6000858373 /* Timestretcher.cpp in Sources */, AB2F3C1415CF9C6000858373 /* tinystr.cpp in Sources */, AB2F3C1515CF9C6000858373 /* tinyxml.cpp in Sources */, AB2F3C1615CF9C6000858373 /* tinyxmlerror.cpp in Sources */, AB2F3C1715CF9C6000858373 /* tinyxmlparser.cpp in Sources */, AB2F3C1815CF9C6000858373 /* version.cpp in Sources */, AB2F3C1915CF9C6000858373 /* vfat.cpp in Sources */, AB2F3C1A15CF9C6000858373 /* videofilter.cpp in Sources */, AB2F3C1C15CF9C6000858373 /* wifi.cpp in Sources */, AB2F3C1D15CF9C6000858373 /* xstring.cpp in Sources */, AB2F3C1E15CF9C6000858373 /* main.m in Sources */, AB2F3C1F15CF9C6000858373 /* cocoa_cheat.mm in Sources */, AB2F3C2015CF9C6000858373 /* cocoa_core.mm in Sources */, AB2F3C2115CF9C6000858373 /* cocoa_file.mm in Sources */, AB2F3C2215CF9C6000858373 /* cocoa_firmware.mm in Sources */, AB2F3C2415CF9C6000858373 /* cocoa_input.mm in Sources */, AB2F3C2515CF9C6000858373 /* mic_ext.cpp in Sources */, AB2F3C2615CF9C6000858373 /* cocoa_output.mm in Sources */, AB2F3C2715CF9C6000858373 /* cocoa_rom.mm in Sources */, AB2F3C2815CF9C6000858373 /* cocoa_util.mm in Sources */, AB2F3C2915CF9C6000858373 /* cocoa_videofilter.mm in Sources */, AB2F3C2A15CF9C6000858373 /* OGLRender.cpp in Sources */, AB2F3C2B15CF9C6000858373 /* appDelegate.mm in Sources */, AB2F3C2C15CF9C6000858373 /* cheatWindowDelegate.mm in Sources */, AB2F3C2F15CF9C6000858373 /* inputPrefsView.mm in Sources */, AB2F3C3015CF9C6000858373 /* preferencesWindowDelegate.mm in Sources */, AB2F3C3115CF9C6000858373 /* 2xsai.cpp in Sources */, AB2F3C3215CF9C6000858373 /* bilinear.cpp in Sources */, AB2F3C3315CF9C6000858373 /* epx.cpp in Sources */, AB2F3C3415CF9C6000858373 /* hq2x.cpp in Sources */, AB2F3C3515CF9C6000858373 /* hq4x.cpp in Sources */, AB2F3C3615CF9C6000858373 /* lq2x.cpp in Sources */, AB2F3C3715CF9C6000858373 /* scanline.cpp in Sources */, AB2F3C3815CF9C6000858373 /* coreaudiosound.cpp in Sources */, AB2F3C3915CF9C6000858373 /* ringbuffer.cpp in Sources */, ABA03571169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */, AB6A187C16C9951C00384EED /* EmuControllerDelegate.mm in Sources */, AB6A198316CAD66900384EED /* cocoa_GPU.mm in Sources */, AB700DDF16CDE4C300FBD336 /* DisplayWindowController.mm in Sources */, AB5A795B16D5A56000ED84B7 /* InputManager.mm in Sources */, AB4C4C4916F55C64002E07CD /* AAFilter.cpp in Sources */, AB4C4C4A16F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */, AB4C4C4B16F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */, AB4C4C4C16F55C64002E07CD /* FIRFilter.cpp in Sources */, AB4C4C4D16F55C64002E07CD /* mmx_optimized.cpp in Sources */, AB4C4C4E16F55C64002E07CD /* RateTransposer.cpp in Sources */, AB4C4C4F16F55C64002E07CD /* SoundTouch.cpp in Sources */, AB4C4C5016F55C64002E07CD /* sse_optimized.cpp in Sources */, AB4C4C5116F55C64002E07CD /* TDStretch.cpp in Sources */, AB4C4C5216F55C64002E07CD /* WavFile.cpp in Sources */, AB2F56F11704C86900E28885 /* utilities.c in Sources */, AB213D46170CB141006DDB0F /* InputProfileController.mm in Sources */, AB2145241714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */, ABAAFBEB172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB711EFF1481C35F009011C8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB711F2D1481C35F009011C8 /* ConvertUTF.c in Sources */, AB711F001481C35F009011C8 /* addons.cpp in Sources */, AB711F011481C35F009011C8 /* arm_instructions.cpp in Sources */, AB711F021481C35F009011C8 /* armcpu.cpp in Sources */, AB711F031481C35F009011C8 /* bios.cpp in Sources */, AB711F341481C35F009011C8 /* cache.cpp in Sources */, AB711F041481C35F009011C8 /* cheatSystem.cpp in Sources */, AB711F051481C35F009011C8 /* common.cpp in Sources */, AB711F061481C35F009011C8 /* cp15.cpp in Sources */, AB711F2E1481C35F009011C8 /* crc.cpp in Sources */, AB711F5C1481C35F009011C8 /* datetime.cpp in Sources */, AB711F071481C35F009011C8 /* debug.cpp in Sources */, AB711F2F1481C35F009011C8 /* decrypt.cpp in Sources */, AB711F351481C35F009011C8 /* directory.cpp in Sources */, AB711F081481C35F009011C8 /* Disassembler.cpp in Sources */, AB711F361481C35F009011C8 /* disc.cpp in Sources */, AB711F311481C35F009011C8 /* dlditool.cpp in Sources */, AB711F091481C35F009011C8 /* driver.cpp in Sources */, AB711F321481C35F009011C8 /* emufat.cpp in Sources */, AB711F0A1481C35F009011C8 /* emufile.cpp in Sources */, AB711F371481C35F009011C8 /* fatdir.cpp in Sources */, AB711F381481C35F009011C8 /* fatfile.cpp in Sources */, AB711F0B1481C35F009011C8 /* FIFO.cpp in Sources */, AB711F391481C35F009011C8 /* file_allocation_table.cpp in Sources */, AB711F3A1481C35F009011C8 /* filetime.cpp in Sources */, AB711F0C1481C35F009011C8 /* firmware.cpp in Sources */, AB711F5D1481C35F009011C8 /* fs-linux.cpp in Sources */, AB711F0D1481C35F009011C8 /* gfx3d.cpp in Sources */, AB711F0F1481C35F009011C8 /* GPU.cpp in Sources */, AB711F0E1481C35F009011C8 /* GPU_osd_stub.cpp in Sources */, AB711F331481C35F009011C8 /* guid.cpp in Sources */, AB711F301481C35F009011C8 /* header.cpp in Sources */, AB711F3B1481C35F009011C8 /* libfat.cpp in Sources */, AB711F3C1481C35F009011C8 /* libfat_public_api.cpp in Sources */, AB711F3D1481C35F009011C8 /* lock.cpp in Sources */, AB711F101481C35F009011C8 /* matrix.cpp in Sources */, AB711F111481C35F009011C8 /* mc.cpp in Sources */, AB711F3F1481C35F009011C8 /* md5.cpp in Sources */, AB711F431481C35F009011C8 /* metaspu.cpp in Sources */, AB711F121481C35F009011C8 /* MMU.cpp in Sources */, AB711F131481C35F009011C8 /* movie.cpp in Sources */, AB711F141481C35F009011C8 /* NDSSystem.cpp in Sources */, AB711F5F1481C35F009011C8 /* OGLRender.cpp in Sources */, AB711F3E1481C35F009011C8 /* partition.cpp in Sources */, AB711F151481C35F009011C8 /* path.cpp in Sources */, AB711F161481C35F009011C8 /* rasterize.cpp in Sources */, AB711F171481C35F009011C8 /* readwrite.cpp in Sources */, AB711F181481C35F009011C8 /* render3D.cpp in Sources */, AB711F191481C35F009011C8 /* ROMReader.cpp in Sources */, AB711F1A1481C35F009011C8 /* rtc.cpp in Sources */, AB711F1B1481C35F009011C8 /* saves.cpp in Sources */, AB711F1C1481C35F009011C8 /* slot1.cpp in Sources */, AB711F221481C35F009011C8 /* slot1_none.cpp in Sources */, AB711F231481C35F009011C8 /* slot1_r4.cpp in Sources */, AB711F241481C35F009011C8 /* slot1_retail.cpp in Sources */, AB711F501481C35F009011C8 /* slot1_retail_nand.cpp in Sources */, AB711F251481C35F009011C8 /* slot2_expMemory.cpp in Sources */, AB711F261481C35F009011C8 /* slot2_gbagame.cpp in Sources */, AB711F271481C35F009011C8 /* slot2_guitarGrip.cpp in Sources */, AB711F281481C35F009011C8 /* slot2_mpcf.cpp in Sources */, AB711F291481C35F009011C8 /* slot2_none.cpp in Sources */, AB711F2A1481C35F009011C8 /* slot2_paddle.cpp in Sources */, AB711F2B1481C35F009011C8 /* slot2_piano.cpp in Sources */, AB711F2C1481C35F009011C8 /* slot2_rumblepak.cpp in Sources */, AB711F491481C35F009011C8 /* sndOSX.cpp in Sources */, AB711F511481C35F009011C8 /* SndOut.cpp in Sources */, AB711F1D1481C35F009011C8 /* SPU.cpp in Sources */, AB711F401481C35F009011C8 /* task.cpp in Sources */, AB711F1E1481C35F009011C8 /* texcache.cpp in Sources */, AB711F1F1481C35F009011C8 /* thumb_instructions.cpp in Sources */, AB711F521481C35F009011C8 /* Timestretcher.cpp in Sources */, AB711F611481C35F009011C8 /* tinystr.cpp in Sources */, AB711F621481C35F009011C8 /* tinyxml.cpp in Sources */, AB711F631481C35F009011C8 /* tinyxmlerror.cpp in Sources */, AB711F641481C35F009011C8 /* tinyxmlparser.cpp in Sources */, AB711F201481C35F009011C8 /* version.cpp in Sources */, AB711F411481C35F009011C8 /* vfat.cpp in Sources */, AB711F6D1481C35F009011C8 /* videofilter.cpp in Sources */, AB711F211481C35F009011C8 /* wifi.cpp in Sources */, AB711F421481C35F009011C8 /* xstring.cpp in Sources */, AB711F4A1481C35F009011C8 /* main.m in Sources */, AB711F701481C35F009011C8 /* cocoa_cheat.mm in Sources */, AB711F471481C35F009011C8 /* cocoa_core.mm in Sources */, AB711F4E1481C35F009011C8 /* cocoa_file.mm in Sources */, AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */, AB711F461481C35F009011C8 /* cocoa_input.mm in Sources */, AB711F5E1481C35F009011C8 /* mic_ext.cpp in Sources */, AB711F4C1481C35F009011C8 /* cocoa_output.mm in Sources */, AB711F481481C35F009011C8 /* cocoa_rom.mm in Sources */, AB711F6C1481C35F009011C8 /* cocoa_util.mm in Sources */, AB711F6E1481C35F009011C8 /* cocoa_videofilter.mm in Sources */, AB3ACB7814C2361100D7D192 /* appDelegate.mm in Sources */, AB3ACB7914C2361100D7D192 /* cheatWindowDelegate.mm in Sources */, AB3ACB7C14C2361100D7D192 /* inputPrefsView.mm in Sources */, AB3ACB7D14C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */, ABFE150F14C92FF5005D6699 /* 2xsai.cpp in Sources */, ABFE151014C92FF5005D6699 /* bilinear.cpp in Sources */, ABFE151114C92FF5005D6699 /* epx.cpp in Sources */, ABFE151214C92FF5005D6699 /* hq2x.cpp in Sources */, ABFE151314C92FF5005D6699 /* hq4x.cpp in Sources */, ABFE151514C92FF5005D6699 /* lq2x.cpp in Sources */, ABFE151614C92FF5005D6699 /* scanline.cpp in Sources */, ABD0A53A1501AA5A0074A094 /* coreaudiosound.cpp in Sources */, ABD0A53B1501AA5A0074A094 /* ringbuffer.cpp in Sources */, ABBCE29815ACB1FF00A2C965 /* arm_jit.cpp in Sources */, ABA03572169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */, ABF50ABA169F5FDA0018C08D /* assembler.cpp in Sources */, ABF50ABB169F5FDA0018C08D /* assert.cpp in Sources */, ABF50ABC169F5FDA0018C08D /* buffer.cpp in Sources */, ABF50ABD169F5FDA0018C08D /* compiler.cpp in Sources */, ABF50ABE169F5FDA0018C08D /* compilercontext.cpp in Sources */, ABF50ABF169F5FDA0018C08D /* compilerfunc.cpp in Sources */, ABF50AC0169F5FDA0018C08D /* compileritem.cpp in Sources */, ABF50AC1169F5FDA0018C08D /* context.cpp in Sources */, ABF50AC2169F5FDA0018C08D /* cpuinfo.cpp in Sources */, ABF50AC3169F5FDA0018C08D /* defs.cpp in Sources */, ABF50AC4169F5FDA0018C08D /* func.cpp in Sources */, ABF50AC5169F5FDA0018C08D /* logger.cpp in Sources */, ABF50AC6169F5FDA0018C08D /* memorymanager.cpp in Sources */, ABF50AC7169F5FDA0018C08D /* memorymarker.cpp in Sources */, ABF50AC8169F5FDA0018C08D /* operand.cpp in Sources */, ABF50AC9169F5FDA0018C08D /* stringbuilder.cpp in Sources */, ABF50ACA169F5FDA0018C08D /* stringutil.cpp in Sources */, ABF50ACB169F5FDA0018C08D /* virtualmemory.cpp in Sources */, ABF50ACC169F5FDA0018C08D /* zonememory.cpp in Sources */, ABF50ACD169F5FDA0018C08D /* x86assembler.cpp in Sources */, ABF50ACE169F5FDA0018C08D /* x86compiler.cpp in Sources */, ABF50ACF169F5FDA0018C08D /* x86compilercontext.cpp in Sources */, ABF50AD0169F5FDA0018C08D /* x86compilerfunc.cpp in Sources */, ABF50AD1169F5FDA0018C08D /* x86compileritem.cpp in Sources */, ABF50AD2169F5FDA0018C08D /* x86cpuinfo.cpp in Sources */, ABF50AD3169F5FDA0018C08D /* x86defs.cpp in Sources */, ABF50AD4169F5FDA0018C08D /* x86func.cpp in Sources */, ABF50AD5169F5FDA0018C08D /* x86operand.cpp in Sources */, ABF50AD6169F5FDA0018C08D /* x86util.cpp in Sources */, AB6A187E16C9951C00384EED /* EmuControllerDelegate.mm in Sources */, AB6A198516CAD66900384EED /* cocoa_GPU.mm in Sources */, AB700DE116CDE4C300FBD336 /* DisplayWindowController.mm in Sources */, AB5A795916D5A56000ED84B7 /* InputManager.mm in Sources */, AB4C4C3F16F55C64002E07CD /* AAFilter.cpp in Sources */, AB4C4C4016F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */, AB4C4C4116F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */, AB4C4C4216F55C64002E07CD /* FIRFilter.cpp in Sources */, AB4C4C4316F55C64002E07CD /* mmx_optimized.cpp in Sources */, AB4C4C4416F55C64002E07CD /* RateTransposer.cpp in Sources */, AB4C4C4516F55C64002E07CD /* SoundTouch.cpp in Sources */, AB4C4C4616F55C64002E07CD /* sse_optimized.cpp in Sources */, AB4C4C4716F55C64002E07CD /* TDStretch.cpp in Sources */, AB4C4C4816F55C64002E07CD /* WavFile.cpp in Sources */, AB2F56F01704C86900E28885 /* utilities.c in Sources */, AB213D48170CB141006DDB0F /* InputProfileController.mm in Sources */, AB2145261714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */, ABAAFBEA172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB73A9B21507C9F500A310C8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB73A9B31507C9F500A310C8 /* ConvertUTF.c in Sources */, AB73A9B51507C9F500A310C8 /* addons.cpp in Sources */, AB73A9B61507C9F500A310C8 /* arm_instructions.cpp in Sources */, AB73A9B71507C9F500A310C8 /* armcpu.cpp in Sources */, AB73A9B81507C9F500A310C8 /* bios.cpp in Sources */, AB73A9B91507C9F500A310C8 /* cache.cpp in Sources */, AB73A9BA1507C9F500A310C8 /* cheatSystem.cpp in Sources */, AB73A9BB1507C9F500A310C8 /* common.cpp in Sources */, AB73A9BC1507C9F500A310C8 /* cp15.cpp in Sources */, AB73A9BE1507C9F500A310C8 /* crc.cpp in Sources */, AB73A9BF1507C9F500A310C8 /* datetime.cpp in Sources */, AB73A9C01507C9F500A310C8 /* debug.cpp in Sources */, AB73A9C11507C9F500A310C8 /* decrypt.cpp in Sources */, AB73A9C21507C9F500A310C8 /* directory.cpp in Sources */, AB73A9C31507C9F500A310C8 /* Disassembler.cpp in Sources */, AB73A9C41507C9F500A310C8 /* disc.cpp in Sources */, AB73A9C51507C9F500A310C8 /* dlditool.cpp in Sources */, AB73A9C61507C9F500A310C8 /* driver.cpp in Sources */, AB73A9C71507C9F500A310C8 /* emufat.cpp in Sources */, AB73A9C81507C9F500A310C8 /* emufile.cpp in Sources */, AB73A9C91507C9F500A310C8 /* fatdir.cpp in Sources */, AB73A9CA1507C9F500A310C8 /* fatfile.cpp in Sources */, AB73A9CB1507C9F500A310C8 /* FIFO.cpp in Sources */, AB73A9CD1507C9F500A310C8 /* file_allocation_table.cpp in Sources */, AB73A9CE1507C9F500A310C8 /* filetime.cpp in Sources */, AB73A9D01507C9F500A310C8 /* firmware.cpp in Sources */, AB73A9D11507C9F500A310C8 /* fs-linux.cpp in Sources */, AB73A9D21507C9F500A310C8 /* gfx3d.cpp in Sources */, AB73A9D31507C9F500A310C8 /* GPU.cpp in Sources */, AB73A9D41507C9F500A310C8 /* GPU_osd_stub.cpp in Sources */, AB73A9D51507C9F500A310C8 /* guid.cpp in Sources */, AB73A9D61507C9F500A310C8 /* header.cpp in Sources */, AB73A9D71507C9F500A310C8 /* libfat.cpp in Sources */, AB73A9D81507C9F500A310C8 /* libfat_public_api.cpp in Sources */, AB73A9D91507C9F500A310C8 /* lock.cpp in Sources */, AB73A9DA1507C9F500A310C8 /* matrix.cpp in Sources */, AB73A9DB1507C9F500A310C8 /* mc.cpp in Sources */, AB73A9DC1507C9F500A310C8 /* md5.cpp in Sources */, AB73A9DD1507C9F500A310C8 /* metaspu.cpp in Sources */, AB73A9DE1507C9F500A310C8 /* MMU.cpp in Sources */, AB73A9E01507C9F500A310C8 /* movie.cpp in Sources */, AB73A9E11507C9F500A310C8 /* NDSSystem.cpp in Sources */, AB73A9E21507C9F500A310C8 /* partition.cpp in Sources */, AB73A9E31507C9F500A310C8 /* path.cpp in Sources */, AB73A9E41507C9F500A310C8 /* rasterize.cpp in Sources */, AB73A9E61507C9F500A310C8 /* readwrite.cpp in Sources */, AB73A9E71507C9F500A310C8 /* render3D.cpp in Sources */, AB73A9E81507C9F500A310C8 /* ROMReader.cpp in Sources */, AB73A9E91507C9F500A310C8 /* rtc.cpp in Sources */, AB73A9EA1507C9F500A310C8 /* saves.cpp in Sources */, AB73A9EB1507C9F500A310C8 /* slot1.cpp in Sources */, AB73A9EC1507C9F500A310C8 /* slot1_none.cpp in Sources */, AB73A9ED1507C9F500A310C8 /* slot1_r4.cpp in Sources */, AB73A9EE1507C9F500A310C8 /* slot1_retail.cpp in Sources */, AB73A9EF1507C9F500A310C8 /* slot1_retail_nand.cpp in Sources */, AB73A9F01507C9F500A310C8 /* slot2_expMemory.cpp in Sources */, AB73A9F11507C9F500A310C8 /* slot2_gbagame.cpp in Sources */, AB73A9F21507C9F500A310C8 /* slot2_guitarGrip.cpp in Sources */, AB73A9F31507C9F500A310C8 /* slot2_mpcf.cpp in Sources */, AB73A9F41507C9F500A310C8 /* slot2_none.cpp in Sources */, AB73A9F51507C9F500A310C8 /* slot2_paddle.cpp in Sources */, AB73A9F61507C9F500A310C8 /* slot2_piano.cpp in Sources */, AB73A9F71507C9F500A310C8 /* slot2_rumblepak.cpp in Sources */, AB73A9F81507C9F500A310C8 /* sndOSX.cpp in Sources */, AB73A9F91507C9F500A310C8 /* SndOut.cpp in Sources */, AB73A9FB1507C9F500A310C8 /* SPU.cpp in Sources */, AB73A9FD1507C9F500A310C8 /* task.cpp in Sources */, AB73A9FF1507C9F500A310C8 /* texcache.cpp in Sources */, AB73AA001507C9F500A310C8 /* thumb_instructions.cpp in Sources */, AB73AA011507C9F500A310C8 /* Timestretcher.cpp in Sources */, AB73AA021507C9F500A310C8 /* tinystr.cpp in Sources */, AB73AA031507C9F500A310C8 /* tinyxml.cpp in Sources */, AB73AA041507C9F500A310C8 /* tinyxmlerror.cpp in Sources */, AB73AA051507C9F500A310C8 /* tinyxmlparser.cpp in Sources */, AB73AA061507C9F500A310C8 /* version.cpp in Sources */, AB73AA071507C9F500A310C8 /* vfat.cpp in Sources */, AB73AA081507C9F500A310C8 /* videofilter.cpp in Sources */, AB73AA0A1507C9F500A310C8 /* wifi.cpp in Sources */, AB73AA0B1507C9F500A310C8 /* xstring.cpp in Sources */, AB73AA0C1507C9F500A310C8 /* main.m in Sources */, AB73AA0D1507C9F500A310C8 /* cocoa_cheat.mm in Sources */, AB73AA0E1507C9F500A310C8 /* cocoa_core.mm in Sources */, AB73AA0F1507C9F500A310C8 /* cocoa_file.mm in Sources */, AB73AA101507C9F500A310C8 /* cocoa_firmware.mm in Sources */, AB73AA121507C9F500A310C8 /* cocoa_input.mm in Sources */, AB73AA131507C9F500A310C8 /* mic_ext.cpp in Sources */, AB73AA141507C9F500A310C8 /* cocoa_output.mm in Sources */, AB73AA151507C9F500A310C8 /* cocoa_rom.mm in Sources */, AB73AA161507C9F500A310C8 /* cocoa_util.mm in Sources */, AB73AA171507C9F500A310C8 /* cocoa_videofilter.mm in Sources */, AB73AA181507C9F500A310C8 /* OGLRender.cpp in Sources */, AB73AA191507C9F500A310C8 /* appDelegate.mm in Sources */, AB73AA1A1507C9F500A310C8 /* cheatWindowDelegate.mm in Sources */, AB73AA1D1507C9F500A310C8 /* inputPrefsView.mm in Sources */, AB73AA1E1507C9F500A310C8 /* preferencesWindowDelegate.mm in Sources */, AB73AA1F1507C9F500A310C8 /* 2xsai.cpp in Sources */, AB73AA201507C9F500A310C8 /* bilinear.cpp in Sources */, AB73AA211507C9F500A310C8 /* epx.cpp in Sources */, AB73AA221507C9F500A310C8 /* hq2x.cpp in Sources */, AB73AA231507C9F500A310C8 /* hq4x.cpp in Sources */, AB73AA241507C9F500A310C8 /* lq2x.cpp in Sources */, AB73AA251507C9F500A310C8 /* scanline.cpp in Sources */, AB73AA261507C9F500A310C8 /* coreaudiosound.cpp in Sources */, AB73AA271507C9F500A310C8 /* ringbuffer.cpp in Sources */, ABBCE29715ACB1FF00A2C965 /* arm_jit.cpp in Sources */, ABA03570169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */, ABF50B11169F5FDA0018C08D /* assembler.cpp in Sources */, ABF50B12169F5FDA0018C08D /* assert.cpp in Sources */, ABF50B13169F5FDA0018C08D /* buffer.cpp in Sources */, ABF50B14169F5FDA0018C08D /* compiler.cpp in Sources */, ABF50B15169F5FDA0018C08D /* compilercontext.cpp in Sources */, ABF50B16169F5FDA0018C08D /* compilerfunc.cpp in Sources */, ABF50B17169F5FDA0018C08D /* compileritem.cpp in Sources */, ABF50B18169F5FDA0018C08D /* context.cpp in Sources */, ABF50B19169F5FDA0018C08D /* cpuinfo.cpp in Sources */, ABF50B1A169F5FDA0018C08D /* defs.cpp in Sources */, ABF50B1B169F5FDA0018C08D /* func.cpp in Sources */, ABF50B1C169F5FDA0018C08D /* logger.cpp in Sources */, ABF50B1D169F5FDA0018C08D /* memorymanager.cpp in Sources */, ABF50B1E169F5FDA0018C08D /* memorymarker.cpp in Sources */, ABF50B1F169F5FDA0018C08D /* operand.cpp in Sources */, ABF50B20169F5FDA0018C08D /* stringbuilder.cpp in Sources */, ABF50B21169F5FDA0018C08D /* stringutil.cpp in Sources */, ABF50B22169F5FDA0018C08D /* virtualmemory.cpp in Sources */, ABF50B23169F5FDA0018C08D /* zonememory.cpp in Sources */, ABF50B24169F5FDA0018C08D /* x86assembler.cpp in Sources */, ABF50B25169F5FDA0018C08D /* x86compiler.cpp in Sources */, ABF50B26169F5FDA0018C08D /* x86compilercontext.cpp in Sources */, ABF50B27169F5FDA0018C08D /* x86compilerfunc.cpp in Sources */, ABF50B28169F5FDA0018C08D /* x86compileritem.cpp in Sources */, ABF50B29169F5FDA0018C08D /* x86cpuinfo.cpp in Sources */, ABF50B2A169F5FDA0018C08D /* x86defs.cpp in Sources */, ABF50B2B169F5FDA0018C08D /* x86func.cpp in Sources */, ABF50B2C169F5FDA0018C08D /* x86operand.cpp in Sources */, ABF50B2D169F5FDA0018C08D /* x86util.cpp in Sources */, AB6A187F16C9951C00384EED /* EmuControllerDelegate.mm in Sources */, AB6A198616CAD66900384EED /* cocoa_GPU.mm in Sources */, AB700DDE16CDE4C300FBD336 /* DisplayWindowController.mm in Sources */, AB5A795A16D5A56000ED84B7 /* InputManager.mm in Sources */, AB4C4C5D16F55C64002E07CD /* AAFilter.cpp in Sources */, AB4C4C5E16F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */, AB4C4C5F16F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */, AB4C4C6016F55C64002E07CD /* FIRFilter.cpp in Sources */, AB4C4C6116F55C64002E07CD /* mmx_optimized.cpp in Sources */, AB4C4C6216F55C64002E07CD /* RateTransposer.cpp in Sources */, AB4C4C6316F55C64002E07CD /* SoundTouch.cpp in Sources */, AB4C4C6416F55C64002E07CD /* sse_optimized.cpp in Sources */, AB4C4C6516F55C64002E07CD /* TDStretch.cpp in Sources */, AB4C4C6616F55C64002E07CD /* WavFile.cpp in Sources */, AB2F56F31704C86900E28885 /* utilities.c in Sources */, AB213D45170CB141006DDB0F /* InputProfileController.mm in Sources */, AB2145251714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */, ABAAFBED172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABAD0FBA15ACE7A00000EC47 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ABAD0FBB15ACE7A00000EC47 /* ConvertUTF.c in Sources */, ABAD0FBD15ACE7A00000EC47 /* addons.cpp in Sources */, ABAD0FBE15ACE7A00000EC47 /* arm_instructions.cpp in Sources */, ABAD0FBF15ACE7A00000EC47 /* armcpu.cpp in Sources */, ABAD0FC015ACE7A00000EC47 /* bios.cpp in Sources */, ABAD0FC115ACE7A00000EC47 /* cache.cpp in Sources */, ABAD0FC215ACE7A00000EC47 /* cheatSystem.cpp in Sources */, ABAD0FC315ACE7A00000EC47 /* common.cpp in Sources */, ABAD0FC415ACE7A00000EC47 /* cp15.cpp in Sources */, ABAD0FC615ACE7A00000EC47 /* crc.cpp in Sources */, ABAD0FC715ACE7A00000EC47 /* datetime.cpp in Sources */, ABAD0FC815ACE7A00000EC47 /* debug.cpp in Sources */, ABAD0FC915ACE7A00000EC47 /* decrypt.cpp in Sources */, ABAD0FCA15ACE7A00000EC47 /* directory.cpp in Sources */, ABAD0FCB15ACE7A00000EC47 /* Disassembler.cpp in Sources */, ABAD0FCC15ACE7A00000EC47 /* disc.cpp in Sources */, ABAD0FCD15ACE7A00000EC47 /* dlditool.cpp in Sources */, ABAD0FCE15ACE7A00000EC47 /* driver.cpp in Sources */, ABAD0FCF15ACE7A00000EC47 /* emufat.cpp in Sources */, ABAD0FD015ACE7A00000EC47 /* emufile.cpp in Sources */, ABAD0FD115ACE7A00000EC47 /* fatdir.cpp in Sources */, ABAD0FD215ACE7A00000EC47 /* fatfile.cpp in Sources */, ABAD0FD315ACE7A00000EC47 /* FIFO.cpp in Sources */, ABAD0FD515ACE7A00000EC47 /* file_allocation_table.cpp in Sources */, ABAD0FD615ACE7A00000EC47 /* filetime.cpp in Sources */, ABAD0FD815ACE7A00000EC47 /* firmware.cpp in Sources */, ABAD0FD915ACE7A00000EC47 /* fs-linux.cpp in Sources */, ABAD0FDA15ACE7A00000EC47 /* gfx3d.cpp in Sources */, ABAD0FDB15ACE7A00000EC47 /* GPU.cpp in Sources */, ABAD0FDC15ACE7A00000EC47 /* GPU_osd_stub.cpp in Sources */, ABAD0FDD15ACE7A00000EC47 /* guid.cpp in Sources */, ABAD0FDE15ACE7A00000EC47 /* header.cpp in Sources */, ABAD0FDF15ACE7A00000EC47 /* libfat.cpp in Sources */, ABAD0FE015ACE7A00000EC47 /* libfat_public_api.cpp in Sources */, ABAD0FE115ACE7A00000EC47 /* lock.cpp in Sources */, ABAD0FE215ACE7A00000EC47 /* matrix.cpp in Sources */, ABAD0FE315ACE7A00000EC47 /* mc.cpp in Sources */, ABAD0FE415ACE7A00000EC47 /* md5.cpp in Sources */, ABAD0FE515ACE7A00000EC47 /* metaspu.cpp in Sources */, ABAD0FE615ACE7A00000EC47 /* MMU.cpp in Sources */, ABAD0FE815ACE7A00000EC47 /* movie.cpp in Sources */, ABAD0FE915ACE7A00000EC47 /* NDSSystem.cpp in Sources */, ABAD0FEA15ACE7A00000EC47 /* partition.cpp in Sources */, ABAD0FEB15ACE7A00000EC47 /* path.cpp in Sources */, ABAD0FEC15ACE7A00000EC47 /* rasterize.cpp in Sources */, ABAD0FEE15ACE7A00000EC47 /* readwrite.cpp in Sources */, ABAD0FEF15ACE7A00000EC47 /* render3D.cpp in Sources */, ABAD0FF015ACE7A00000EC47 /* ROMReader.cpp in Sources */, ABAD0FF115ACE7A00000EC47 /* rtc.cpp in Sources */, ABAD0FF215ACE7A00000EC47 /* saves.cpp in Sources */, ABAD0FF315ACE7A00000EC47 /* slot1.cpp in Sources */, ABAD0FF415ACE7A00000EC47 /* slot1_none.cpp in Sources */, ABAD0FF515ACE7A00000EC47 /* slot1_r4.cpp in Sources */, ABAD0FF615ACE7A00000EC47 /* slot1_retail.cpp in Sources */, ABAD0FF715ACE7A00000EC47 /* slot1_retail_nand.cpp in Sources */, ABAD0FF815ACE7A00000EC47 /* slot2_expMemory.cpp in Sources */, ABAD0FF915ACE7A00000EC47 /* slot2_gbagame.cpp in Sources */, ABAD0FFA15ACE7A00000EC47 /* slot2_guitarGrip.cpp in Sources */, ABAD0FFB15ACE7A00000EC47 /* slot2_mpcf.cpp in Sources */, ABAD0FFC15ACE7A00000EC47 /* slot2_none.cpp in Sources */, ABAD0FFD15ACE7A00000EC47 /* slot2_paddle.cpp in Sources */, ABAD0FFE15ACE7A00000EC47 /* slot2_piano.cpp in Sources */, ABAD0FFF15ACE7A00000EC47 /* slot2_rumblepak.cpp in Sources */, ABAD100015ACE7A00000EC47 /* sndOSX.cpp in Sources */, ABAD100115ACE7A00000EC47 /* SndOut.cpp in Sources */, ABAD100315ACE7A00000EC47 /* SPU.cpp in Sources */, ABAD100515ACE7A00000EC47 /* task.cpp in Sources */, ABAD100715ACE7A00000EC47 /* texcache.cpp in Sources */, ABAD100815ACE7A00000EC47 /* thumb_instructions.cpp in Sources */, ABAD100915ACE7A00000EC47 /* Timestretcher.cpp in Sources */, ABAD100A15ACE7A00000EC47 /* tinystr.cpp in Sources */, ABAD100B15ACE7A00000EC47 /* tinyxml.cpp in Sources */, ABAD100C15ACE7A00000EC47 /* tinyxmlerror.cpp in Sources */, ABAD100D15ACE7A00000EC47 /* tinyxmlparser.cpp in Sources */, ABAD100E15ACE7A00000EC47 /* version.cpp in Sources */, ABAD100F15ACE7A00000EC47 /* vfat.cpp in Sources */, ABAD101015ACE7A00000EC47 /* videofilter.cpp in Sources */, ABAD101215ACE7A00000EC47 /* wifi.cpp in Sources */, ABAD101315ACE7A00000EC47 /* xstring.cpp in Sources */, ABAD101415ACE7A00000EC47 /* main.m in Sources */, ABAD101515ACE7A00000EC47 /* cocoa_cheat.mm in Sources */, ABAD101615ACE7A00000EC47 /* cocoa_core.mm in Sources */, ABAD101715ACE7A00000EC47 /* cocoa_file.mm in Sources */, ABAD101815ACE7A00000EC47 /* cocoa_firmware.mm in Sources */, ABAD101A15ACE7A00000EC47 /* cocoa_input.mm in Sources */, ABAD101B15ACE7A00000EC47 /* mic_ext.cpp in Sources */, ABAD101C15ACE7A00000EC47 /* cocoa_output.mm in Sources */, ABAD101D15ACE7A00000EC47 /* cocoa_rom.mm in Sources */, ABAD101E15ACE7A00000EC47 /* cocoa_util.mm in Sources */, ABAD101F15ACE7A00000EC47 /* cocoa_videofilter.mm in Sources */, ABAD102015ACE7A00000EC47 /* OGLRender.cpp in Sources */, ABAD102115ACE7A00000EC47 /* appDelegate.mm in Sources */, ABAD102215ACE7A00000EC47 /* cheatWindowDelegate.mm in Sources */, ABAD102515ACE7A00000EC47 /* inputPrefsView.mm in Sources */, ABAD102615ACE7A00000EC47 /* preferencesWindowDelegate.mm in Sources */, ABAD102715ACE7A00000EC47 /* 2xsai.cpp in Sources */, ABAD102815ACE7A00000EC47 /* bilinear.cpp in Sources */, ABAD102915ACE7A00000EC47 /* epx.cpp in Sources */, ABAD102A15ACE7A00000EC47 /* hq2x.cpp in Sources */, ABAD102B15ACE7A00000EC47 /* hq4x.cpp in Sources */, ABAD102C15ACE7A00000EC47 /* lq2x.cpp in Sources */, ABAD102D15ACE7A00000EC47 /* scanline.cpp in Sources */, ABAD102E15ACE7A00000EC47 /* coreaudiosound.cpp in Sources */, ABAD102F15ACE7A00000EC47 /* ringbuffer.cpp in Sources */, ABA03573169127C000817C69 /* troubleshootingWindowDelegate.mm in Sources */, AB6A187D16C9951C00384EED /* EmuControllerDelegate.mm in Sources */, AB6A198416CAD66900384EED /* cocoa_GPU.mm in Sources */, AB700DE016CDE4C300FBD336 /* DisplayWindowController.mm in Sources */, AB5A795816D5A56000ED84B7 /* InputManager.mm in Sources */, AB4C4C5316F55C64002E07CD /* AAFilter.cpp in Sources */, AB4C4C5416F55C64002E07CD /* cpu_detect_x86_gcc.cpp in Sources */, AB4C4C5516F55C64002E07CD /* FIFOSampleBuffer.cpp in Sources */, AB4C4C5616F55C64002E07CD /* FIRFilter.cpp in Sources */, AB4C4C5716F55C64002E07CD /* mmx_optimized.cpp in Sources */, AB4C4C5816F55C64002E07CD /* RateTransposer.cpp in Sources */, AB4C4C5916F55C64002E07CD /* SoundTouch.cpp in Sources */, AB4C4C5A16F55C64002E07CD /* sse_optimized.cpp in Sources */, AB4C4C5B16F55C64002E07CD /* TDStretch.cpp in Sources */, AB4C4C5C16F55C64002E07CD /* WavFile.cpp in Sources */, AB2F56F21704C86900E28885 /* utilities.c in Sources */, AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */, AB2145231714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */, ABAAFBEC172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ AB00E87914205EAE00DE561F /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( AB00E87A14205EAE00DE561F /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; AB00E87C14205EBC00DE561F /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( AB00E87D14205EBC00DE561F /* English */, ); name = MainMenu.xib; sourceTree = ""; }; AB350D3A147A1D93007165AC /* HID_usage_strings.plist */ = { isa = PBXVariantGroup; children = ( AB350D38147A1D8D007165AC /* English */, ); name = HID_usage_strings.plist; sourceTree = ""; }; AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */ = { isa = PBXVariantGroup; children = ( AB700DB916CDDBC400FBD336 /* English */, ); name = DisplayWindow.xib; sourceTree = ""; }; AB901BDD1420706100348EEC /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( AB00E89114205ECC00DE561F /* English */, AB901BE01420706F00348EEC /* French */, AB901BE11420707400348EEC /* Italian */, AB901BDF1420706B00348EEC /* Japanese */, AB901BE21420707800348EEC /* Chinese */, AB901BE31420707D00348EEC /* Norwegian */, AB901BE41420708200348EEC /* Romanian */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ AB2A9A771725F00F0062C1A1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ppc; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc]" = G5; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; SDKROOT = macosx10.5; SKIP_INSTALL = NO; }; name = Debug; }; AB2A9A781725F00F0062C1A1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ppc; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc]" = G5; GCC_PREPROCESSOR_DEFINITIONS = ( NDEBUG, PUBLIC_RELEASE, ); PRODUCT_NAME = "DeSmuME (PPC)"; SDKROOT = macosx10.5; }; name = Release; }; AB2F3C4315CF9C6000858373 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; SDKROOT = macosx10.5; SKIP_INSTALL = NO; }; name = Debug; }; AB2F3C4415CF9C6000858373 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; PRODUCT_NAME = "DeSmuME (PPC)"; SDKROOT = macosx10.5; }; name = Release; }; AB711F7D1481C35F009011C8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_INLINES_ARE_PRIVATE_EXTERN = NO; OTHER_LDFLAGS = ( "-weak_library", /usr/lib/libSystem.B.dylib, ); }; name = Debug; }; AB711F7E1481C35F009011C8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_LDFLAGS = ( "-weak_library", /usr/lib/libSystem.B.dylib, ); SKIP_INSTALL = NO; }; name = Release; }; AB73AA311507C9F500A310C8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; OTHER_LDFLAGS = ( "-weak_library", /usr/lib/libSystem.B.dylib, ); SKIP_INSTALL = NO; }; name = Debug; }; AB73AA321507C9F500A310C8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; OTHER_LDFLAGS = ( "-weak_library", /usr/lib/libSystem.B.dylib, ); }; name = Release; }; ABAD104715ACE7A00000EC47 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_INLINES_ARE_PRIVATE_EXTERN = NO; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; SDKROOT = macosx10.5; SKIP_INSTALL = NO; }; name = Debug; }; ABAD104815ACE7A00000EC47 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); PRODUCT_NAME = "DeSmuME (PPC)"; SDKROOT = macosx10.5; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( i386, x86_64, ); COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; GCC_ALTIVEC_EXTENSIONS = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_FAST_OBJC_DISPATCH = NO; GCC_MODEL_TUNING = ""; "GCC_MODEL_TUNING[sdk=macosx10.4][arch=ppc]" = G4; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc64]" = G5; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc]" = G4; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( _DEBUG, "DEBUG=1", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_PROTOTYPE_CONVERSION = NO; GCC_WARN_SHADOW = NO; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IBC_FLATTEN_NIBS = NO; INFOPLIST_FILE = "Info (Debug).plist"; MACOSX_DEPLOYMENT_TARGET = 10.5; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "DeSmuME (Debug)"; SDKROOT = macosx; SKIP_INSTALL = YES; STRIP_INSTALLED_PRODUCT = NO; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( i386, x86_64, ); COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; ENABLE_OPENMP_SUPPORT = NO; GCC_ALTIVEC_EXTENSIONS = YES; GCC_AUTO_VECTORIZATION = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_SSE3_EXTENSIONS = YES; GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; "GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS[arch=i386]" = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; "GCC_MODEL_PPC64[sdk=macosx10.5][arch=ppc64]" = YES; GCC_MODEL_TUNING = ""; "GCC_MODEL_TUNING[sdk=macosx10.4][arch=ppc]" = G4; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc64]" = G5; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc]" = G4; GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = NDEBUG; GCC_STRICT_ALIASING = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_UNROLL_LOOPS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_PROTOTYPE_CONVERSION = NO; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = Info.plist; MACOSX_DEPLOYMENT_TARGET = 10.5; PRODUCT_NAME = DeSmuME; SDKROOT = macosx; STRIP_INSTALLED_PRODUCT = NO; VALIDATE_PRODUCT = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ AB2A9A761725F00F0062C1A1 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC Release Build)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB2A9A771725F00F0062C1A1 /* Debug */, AB2A9A781725F00F0062C1A1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB2F3C4215CF9C6000858373 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; LLVM-GCC)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB2F3C4315CF9C6000858373 /* Debug */, AB2F3C4415CF9C6000858373 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB711F7C1481C35F009011C8 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; LLVM-Clang)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB711F7D1481C35F009011C8 /* Debug */, AB711F7E1481C35F009011C8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB73AA301507C9F500A310C8 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; LLVM-GCC)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB73AA311507C9F500A310C8 /* Debug */, AB73AA321507C9F500A310C8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; ABAD104615ACE7A00000EC47 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; LLVM-Clang)" */ = { isa = XCConfigurationList; buildConfigurations = ( ABAD104715ACE7A00000EC47 /* Debug */, ABAD104815ACE7A00000EC47 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 3)" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } desmume-0.9.9/src/cocoa/macosx_10_5_compat.cpp0000644000175000017500000000644612140261603021667 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include // Workarounds for symbols that are missing from Leopard stdlibc++.dylib. // http://stackoverflow.com/questions/3484043/os-x-program-runs-on-dev-machine-crashing-horribly-on-others _GLIBCXX_BEGIN_NAMESPACE(std) // From ostream_insert.h template ostream& __ostream_insert(ostream&, const char*, streamsize); #ifdef _GLIBCXX_USE_WCHAR_T template wostream& __ostream_insert(wostream&, const wchar_t*, streamsize); #endif // From ostream.tcc template ostream& ostream::_M_insert(long); template ostream& ostream::_M_insert(unsigned long); template ostream& ostream::_M_insert(bool); #ifdef _GLIBCXX_USE_LONG_LONG template ostream& ostream::_M_insert(long long); template ostream& ostream::_M_insert(unsigned long long); #endif template ostream& ostream::_M_insert(double); template ostream& ostream::_M_insert(long double); template ostream& ostream::_M_insert(const void*); #ifdef _GLIBCXX_USE_WCHAR_T template wostream& wostream::_M_insert(long); template wostream& wostream::_M_insert(unsigned long); template wostream& wostream::_M_insert(bool); #ifdef _GLIBCXX_USE_LONG_LONG template wostream& wostream::_M_insert(long long); template wostream& wostream::_M_insert(unsigned long long); #endif template wostream& wostream::_M_insert(double); template wostream& wostream::_M_insert(long double); template wostream& wostream::_M_insert(const void*); #endif // From istream.tcc template istream& istream::_M_extract(unsigned short&); template istream& istream::_M_extract(unsigned int&); template istream& istream::_M_extract(long&); template istream& istream::_M_extract(unsigned long&); template istream& istream::_M_extract(bool&); #ifdef _GLIBCXX_USE_LONG_LONG template istream& istream::_M_extract(long long&); template istream& istream::_M_extract(unsigned long long&); #endif template istream& istream::_M_extract(float&); template istream& istream::_M_extract(double&); template istream& istream::_M_extract(long double&); template istream& istream::_M_extract(void*&); #ifdef _GLIBCXX_USE_WCHAR_T template wistream& wistream::_M_extract(unsigned short&); template wistream& wistream::_M_extract(unsigned int&); template wistream& wistream::_M_extract(long&); template wistream& wistream::_M_extract(unsigned long&); template wistream& wistream::_M_extract(bool&); #ifdef _GLIBCXX_USE_LONG_LONG template wistream& wistream::_M_extract(long long&); template wistream& wistream::_M_extract(unsigned long long&); #endif template wistream& wistream::_M_extract(float&); template wistream& wistream::_M_extract(double&); template wistream& wistream::_M_extract(long double&); template wistream& wistream::_M_extract(void*&); #endif _GLIBCXX_END_NAMESPACE desmume-0.9.9/src/cocoa/AppIcon_DeSmuME.icns0000755000175000017500000035171712140261603021337 0ustar guillaumeguillaumeicnsis32 A6XDPU' I2a"͚7 [/}VD~v S~}3ym3Ps Q{w1sg1yHo O0r)g 62-"$3 ha`D C3; (oZYt]d $_FNqfZ hJ08 j7 618"/,  :tn_`S 4QQO\N' )BA/> W\ A6XDOT' H2a"͚7 [/~VD~v S~}3zm3Ps Q{w1sg1yHo O0r)g 62-"$3 ha`D C3; (p[Yt^d $_FNqfZ hJ/8 j7 728"/,  ;tn_`S 4QQO\N' (BA/> W\ L>iVXg2 !S9s,B e;b"T fBD_ fADU d@;݇ IE @0 2H keP[ @ۥ}* >Бfs* 3wIX] `Xb<TV d³-& d/i& g9O Tn5s8mkA@@@?@@,V135܁0&YQUXVVVVVil32Z#.#')+1+'+1]s]-#7eޝ-rfo "ߙ"a!ܝcc#_!؛ ]^^ Ԙ \\\ Е ZZZ̑YYYƑWWŏW$XXXiB?Btt__QLQ~::LHM|>?KFKy==IKFKy==Ij ,Ki?~g=~h?~~h~~~?}g~~~=}g}?}~}} g~~}~}}||}f|>|}}|f}}|}||}||{e|{||>{{|{e|{{||{|{{z{{d{{z{|{={zz{e{zz}||~}yz}czy}j ,Ki@~g>~i@}}~g~~?~h~}~=}g~~}>}~}} g}}~}}}||}f}>|}||g||}}| }||}}||}}{{||f||{|>{|{{f|{{|{|{|{{|{|{{|~{z{{ez{z{z{~={z{ze~{zz{z~|}~~~~~zyyz~dzyzz}oD6A^nE ~ b .9u?~Blctȸe$PE9$ 4y:{蕽.yݥkP)ʴ8\0H(q*)S|$']ac?u}Aywa?~6#5C,$O*k HD3ՠ5+P}0-'/K))LڣӇtuj.F`Pp TЉCp*X-ZY3J$FiRq ,(2&aPءN\N~f(ae]?fQ5e%99hm}3\ϑRw"7c Ӹzz-RVɄ+RiLgH+0YZD+4d3N9ܺ>^wZΡK S!SQy c:+c5>A?=X>OIir(|5pl 9K$c0dK^$f(SP8:qdJLX`B_7ldkیt'8kX霄 +bg0vȑZ5=LC:rl2-[4{uWgykE#`d"i\zk)k!ZjfY<># ٴEqgByx!$V)mϸLW =k$j_[s7H"gj[u+ܹbG: P:2n8/+.As)_"/Ov:G>&/0 8qbu*m BrpuVαHDRaUJ 9vǿ;ԹdrE`АF`w[B~3\UFQ FoicbK}̳_1;6dOGE𡀒Lbsd]v& }cY<У98a%8y F=(I3X>Bv"e .kx:#\wHz`IZ56 &O+h'qip PȒcQQ<# sT#ƅV(HcYոF62WL|sC(LfstNu)W+T6k,5)068(ƀ}/DTȇ]Gni5t``/]AyFpg,i uiL"UWeERd%)dMhY}HrV&sӋn_/ci~'HZ ,nqV3/)Ʌ^07[fr'k}\T: `m_݀n?~ fz%Ct9kn^s ឩYc(hua}XL4!XMun,uj^Nƹqކ^oH_3cnMڕ$7crY&ZN1Bʼn5]g&Y K8t 4 @Rķ.S#]Dy+@1s9"P3-V}]Amgok#+ɕZ N5b˷tlv *G)U  A #)g#d57i%Ä3 ʸ`}jq Y \q_vsπSP9䴿娕rap&Qڔ_^g#C%H4IIĤ{uٮ`r_?)aWjVkU8G#Ԡ4!txĕ@AŞ䵖_Ru fq|EYyL5SRv]?fTFjI>ܳ`c!kHt6|CHeFW 5kܵ>'deh #bQB[R27RLcr 0'L藲[L-`tĹ| q3Z!`p|X[h(/0G]Qm >Xo3HiSG4c^vNfk,Mqd pM \iԟͤpɐ_k tWKBJm>Lg1{Jq{a|8nGⱬ;OH u`LU`T:Hv8݄_wLw@O.vjj[\j WX^ح\#P N߂v4_S(5[_^gޢ@/ P)3?>b6a7D5?7@}Hx+#PVfS.qvxӅ| {Wɞ#\TQZ #7(A~Ӡh;Gy&D鰠Jv *:"DAGydTSQ1_˘P!6L?L æe̙qTYFB[Kn <G~&f2%:R/wFzOۥEISO9SL{G$I>(ָpyPr4vG&*j-ke31$[:t_Ftm!1Jʥؼ^ $nbf(Qg/ *R޴>޼`a5s4dE Y%զղKB9 !}[9 'wF3M)frrNF(͡bSei+l}&&o>?\S uЬ3Pg~ذ H Ũ뱚ߓS5s#,QSㅹ;HGՠ,QQiVg_>"rz:J!,I44zʦxPL8_r檝.lČQ*aDH 0yIʟ)LGM?xH?HϳS.rY& )Mj ]+ceQ Zw]D:JiGL$3Guᢿ-O48;Ɣ,x  LL."^.!bɟ\ieSlR̎ X,^O[Z3D]QTC\f{I-+{l sLk_nP+ ^k7tA(xfN\oxy<^{je! 0͌@`Pryv6F1s  v~9-Sur2J3^?_ йpXw!%3mK3lfY_|p3FL-Ht0 zR:s2{ֶOv/X"@pwlgkwz8sꚘNr7\nmZJ9o.A1K)V+,zP6}"pIdZ0v '!wy&]sjXAZGGbBypɇC _O|T_bwfL!Wh _Wk}VApg 寧wV91%2Hn% +^Ӄ'iĜ8 HWVQ PPŌy,; Gun( nX!~Sfi!{ fck+3aB%븜GI ݭcOE,oFU>CH/Y2ĕBZ]P;S _eH1 %w uxq>> ',H)Leէ;>cl9uy&āLpM-ḵ9qZ^0Q4V*)Na.R. C'Yh˭-#纖JyDL;az,/a]*7'.TwA|8U#!1Tcgxȸ-68Y^PtBp9"z =YT+2d8khjSDZy(Dw=.[m! ^_"3E"eJe0iAZ{RZ/:q=ǣv, }beݠ[vĞ:W0Z6I&'"$y9=ae.,Khc|ˡM!Lno`𗩠}+,^-#mBD[NY`KpURr¥BƊ 7 p( e؛H> G;m&ϊR~⑈`kax;e-ٳ9-t`+NXc@KݭT/slNQ#G!P1ύҌek)a-GE ΋=>2"{ “3v2KeldYКf5}5k! L8=9̿ɭ/MJЊѮ {onN '0mNqy@*8 KCG`'~p[@7N}BR{k p,.;FdS&ӝ'2xsS?tQ+髣өb n(LFJL50HC#oLڥᶚ\:JLlUNШHU^( n[v3g,y-̖S o*o^ɈbҤ"lƐ$`"K'!&pF%M[z}Q!82#.=t~FBI=TY$ WȢ S'Oϡj3Qǿ|<`mP *DC{GKsǀ> iV ?tlg,QN3~)B 2-vv^\J{/BuژJt&o {Q[:1(Vn3IyP|=Ks*BY~lʬ@d#b|iP]E_b?s.:6|~ j-PjFi!C.)`(ۀ8Ή߂EJ3F+J>e`}{ND#r$9alfBżc{T?}ی$ ?'`rmI5*U/Dٴၹ.Iv^s4씁UA!FWNaH l4]uF7+Y?g}_ޙEG"|{>0=2,'r`+WkS r^tf|z7*)3`Cy2KxVV 'Zאh7]ωn@YlujHR;WOoo"DTy Pl/U!],2;qOJI4D}cjHۛ\8 :@oY2Mumɧ2Qp}4a{:¦?ߠaw }(F>Cv>LpZ|Jꗂ(cO]9`L{Q:YiHM.6hܯa_N$%"gqsnނ6"Z,WbЈ)P TiiIP/=amn+Qx&ÑAnJb{XQ_@c'%ݓqyo6z$Y'36ƚnFV6 (o|UaVYMeX<Q6 Q޼O5TANi.U&WY%LdED#x͸؈!,n #cznx>|G{ͮ л N.|wo,I<}Q?- _^'?F%ꀳd#5$A>xlN 3;Zemtcn;tT4B3 W%8:;^D 秭cC: җZY+9*'`gG"UҴ~)m1hMk)5 p@cKR3ĚiUhXY{3/&QA7Ag#q28@qIh8)Ljԣ8ޭQ1 3BcKXmŬ9nw _dsOYb*!i"AߩR.`ܤ|_h;v1_>XeFYCqDx84ڟg(SZ|rXJG#\k?z0[9yʃ.95kR '1l k? !pmHHEwVB pzc)yM! cX*I)yLEJ\ʤ4I'%TN54%h*6EI'co{Qq$9"C1mM6\ku_ݬ~ވn~ׅmM]p~ œ2/.FZY u <~(LA/ ]{w*^Kx6%~;"| 8k)"Mxy[~M*ms>\#Th|s T5| MJemtD_]ˍe@|ƌ6#~^|uF;~&{! gO1%'2@6ox6~m.E:$v6jHFu-}(jb'wWykAjf-fe Km5l]TzôI&`")ԭxS% ,>Cu6tG5E!yYTfB$?#D-L<PbS*淛ሣ7TcPUin<:34" h +1Yʀkc3JScS tj䐲Z6hHW*@w1}~ wwPƼ- o{jk`Y_?nD"5uFCY1y3`LJj7_3V>Wk8D] j cꕊ*]VBD,9$4{\\N{xjL8;06y @DGXўTJ)TFcC4 YtfZN] x MVPNjY`(m5GrK J)\w^_gL: SR4uPClBFDo'ZO wĐ%(Z-u3%r\19Q=uHԹԅAh ]p麈ޤrA .DŽܧQģVGryđ1*5Ggg~_ȑ6v% U? 1mP:;'YaR<jwN_e~h[~ "2ݺ_=އQ'"ev"e3MxF7,PM룢^kaw=JJB(ۿx64t ,aȇe(t9S{yQ9.+v*SF_. S 4 +4"Z>D#ybɪ?iez* mѸ3GBZspJ{=SoTKdƤq* S (-Hk"Kz̎7pǴʠ\AOPK -ۮc }w) ӱH'~" Omi H5A^glGB>$-sKJUҡ{ho 7nurF&]IVHd," Sh5EWyB[=A3pNԺژbaMU*_ r *Բkfo>@{?ׯʞnÎH=N *˕xY)(nL~)IK k,pm\E@r27Nrx IR5JgW;%aDq2I:=?fzN"ehQE3ze֘A.w)5V6HJ1Fo:`{dW"#= 6H!w ʪt!z Eё!eP:Ў*Ѥ3[U fg1@!j'xL{ 'FYt~eT˵p`X hr4:EЙaP#[0=gQOEDwo+/)3AR[uh/󭡫م4<{n%wț?ɃGѕAz#^#Ķglfd| ]=sEEQa]\3AfW"1;n!z(☆j,Os|-p Eogţ{ӭ9ufb,] mrwLYSY!D.6AI!}% >NEs 䕓Aԃ| I-m փtLl}xG7:e2 ~UkL|9K#l<b K@Ka OȆBk'ˈ5}^ߨG 2ۓ~>^mūK^!/Ïp٣ ^äeqc" 1j1#bVG?GP{NW/AuwnY u}0h$-.8Oqg*ĪȾ+F˼%'u,7Cb$c=Im`Um gV2ON6VZ!@xua2C1gDB t$>1Tc";_K+b\etMYu(nsuvS$вI!8=|qD|VV@#?,{.Ǔu;)1-A'yV}$'uJLwU}D;4 |*aFJ lSwDQks2ǎ(0<ErǼ>P4[ɔ L Ps J$ h=uUX)`kgpJ;,jYb|^ r/+Dćb% m2YBR.w|c4N*>rlh,N*\ [EiAJȚz{218Eѹٯ?٦Ts@r\Aw1BĂP>MdM\Ji{b2JjILvv9,Tև+['{SC[GYfYl fr!sz#U)/߳BuW2u 0Z]Ok?*(+d',g}4V4nmէD0r,'YIa<[nO~g+;Iq84_JmvA| VI-cGQfp<L SJ`4oo|3ajnPߑڹדU*0h:a vtl^ar}G*J}SbEw7I|ugS/SD [j - Ƒ/EnؑD:RKOAZ%̻h}ȋ^8Gz'4,rr^~RՀsKwջ~~>}}W J|_- .-ȱC&$p;sW/ӏ`"O'z7# +DA*fkA 0tN9S'辋=G @A+7yfQn#44Wj}<+f-?=}wR;]}T(b~e*q`5vLIx%21EpXFuC`bG&C<-1fآjsl^ p9*Hʾ]ګkSܒ2h. @/^JfcC.Z7R 6&qxn0£Cč5Lƴ]p됂(uޕZ4M*?Jϖn,DVPWPU÷ϐRE Jd .>}\]JRzojS=BpF\c RVP"64o~-]*)i$ HV"Nn5Mc\grvt[C b{@*eE?AS^+Q(gwSNd!8,_qP6ur(ei+aVM9d G Ш7$S/XYVl`Y/fV _հ Yo9s'%-.M=6ZߗjaOҾ}ĕ,o2V5kh҈Mn7OGӡ;!q Oz~WG#*ԗwfVX dO.Mr^X2",]Jng}"e>aDq_sL:ROl=c0&mXyaME5Ѣ5iN\DZ c5ar@jnqƥyu `>Pm2 C XE~OݚLI(kQd.BPl% ɜ?}Gh9LQ/ſ TPѲ,&g[n 񷜅"!`t:Ct.B~ $@3^(5vY'KƣL {2OJF+ JכȤGZ=o{@c>`ʜְ2+a;b fݻF$$ U|@='b Z$BJU>~Vt 3ucؙ8Ljg |Dhwu UE,*Eor Y4:Q+76yn];šEO1M6F7PߨF.ԮLAJ4Pw5VKmlIQ zX,9 j$ڗO6COh~˂T621(" Y NW/k~$mTw-my|dSkk{]35 SC n ޕ;YhK˾-E μL;&daTz~e#Q.wAy ȷu5mϽ bDư#ÏE\BfJ^ :S$d}q j af>4]нg"i ЩҪsτ3 P=e ,I~S6c|~ȧ{8ҿZIK¥rDT!G"[g Z.mR.?mtS\, 2YDHϙHOߩR01֍jY iquqTaf"to`& bܮqRɯSy&cHVe1qwUe cԙv1yB/~;"WPo/{":Bҁϔ& (-3fAJ G-ҲvߪP2pn#|nܮZܢÒ $uv .W$JP!#,53Hs崷>Ī';2NfXLFDRIFvLnVPDU@!`ԏ.IgRj( Hsst/*1#];?vcnY^PVUG:SQ[Q_2Tl(yC2Y6=m,|-s@NjA_Dxvs+i 2|^6gug9En: hbxl>}k:!NţlyNPaS 'P\Rxk8FO3?H߅Lq2a̭ yF Ax'` >H&(Ffp)Әa.%]W8ݐX&׿ R6g8eILyoӇ?% 0SgG6+! oI0gY#@"bOmrA?%nkh:!itGY~S0 g?Hb5RဋEx'wzrM& KB 'Gez=@7^N NP/$QXY0 3OiZ]o4@({ WGip(+5u".M3f&G|i`V4j0j§Vw2P u\MT`Az73iAշk[{hgVߊψ2K Go -l>v9ϵ'~9N C0"άOc4C S)v*8qjvgFQы}Kg r}%mC#HY#6fbⒾYE\GaxS8nk?{%{5Fȅ#Ύ0v !Z鿼eR_tBUq:`Ꮱx￰naTD[6BH-xxQ7h0쏍W8[? Zz"zc3V 3o\{ޒż R#NL4{i6W~W6X D^g5<)4@-:o{8+vn$*')r9Q kip]ZI}kD!R^* a3-D#lIa^! z*7$%BᘤD,jOe)4k;%@N2jOyL߱] -%CMsfp-JʬY\Nu,9)5VMW* Fg&`_]r#la;8d]岩_l,AhE1"WD8&+r랂.%sk  d834TtK1m,C2 Nۿ& -c9Zm֫fy,:o6RDUT!XOa;Jbyy&w1>bOJ :(O &̦۪e60uD96GMNE(47m>BGv][Z¥b2ڬurM>毇u)=]1{w?Kt}(QM.m;[ڔP#*w 5rUbLaCI?EݭUs`2Eb9v< ̖ 8Kh2'y`o\hWI{чIJ(C+j2{DEeGõyF U!#Ǻݹ؎?i8 ##!U?w{fW};=w޸{z{S5a+9e .qWM  uh>Ry#냒# .6%$ykՀKLIo%$c0w9?ꄓYZY+tchc&I3QmS}$o- \uy%QK3 f ۏLI.AE~eMKb 杽X$DNZrfL)[Nԋ>0ۊIŖ?nBj1 J6 *yy8&%qUpxK L9ϥ&ΑܯSRThv3C^L`LbWFWQtJd6*?/]- }_ '#S'nWA}ԀX%l˸nԒ6Q(qHs>ѝVz[[; woȵo C.:jNXg61gӞ}ݷRA)H&gb)TG>xn6kTzUEm;5xT5+ko3HSnk!B;_o/5M]ƥ~9z}!|tsमAɪi ZNKn?.qIe4Tzf0e)зO VҶ[UXeiXyK@wRVkD"31[ a 5 +Ov_ė@$̬"@-ML ve,6Ǹdcwj$S#2*Au ws$dHFx-uf,}@d43-]A nFN </1s H&,*yfXM*bu y\GO|J ]o[7rñ +&YFoR~>Bz,0`,_bnC"/jFN.M\X -9 2&&냡#<+-ЬNk7P?/\o8F4G,b&GRwBBѴh=0_,oeRgc-!`'d)Qpme~l4arҊ|3  X'#D?V""[w?0Ǿxw\Yo6~}4߸!כkMbz <478StUΞd^~f){ݶ* 6X[s$*K?q& ^߀C_oǙv%ڏLS(%JLF$0FGKDq)~1_F(T]J7ܬ:̲lNY;3z%&ڝi2,…`#wظF6FL31Pc~*gE#4 >vZ>+~A6]аzB} {Z8-s"G ֍cKx9FXFuP|C0?+ViҤ&z2:Kiϩ\u הi,Qcb7M6ʼ'6~ E4g*"KB3cbgTjM0 xbQ?kK6j-Uh򘸍V{4)l4h<'> TPMfԌx`yH[^G +ebN -IMF&Xx,O \܉!EE A _e^{WE@D!vDTIdJP[PCJJZI)5gK.*t9qyVhՊȺI0ǔXLMpگ/IsǛ\-{o VuʙhŲzKh@ b-><=s*ʛySǬJ*[ƶPwׄxYk#yc'tA>5YA Ч O!k^Al;ɤGnр_Vo dSVճ1w5[CD6p]6r[J,`e*0$I]fLZMwNhoA:fj1ZՌ,o.'ôo%$g}lxPb5|<;x{m_.w;XF3HJC؛1Dda Tp5g|$AOB1IY?AJ, o GZf Tg0|bt}Mq qwpO"3t&_>&k:z>`Z-MN3>tmW=~De1R :9Z\e吕,:,ZyFjqq&jWk~ϖTJ2qaDjg $W4)#%wy3/,ީ 2#t}ꦌYQLL8(\+*x. W{ASt8QY==vv@r[,:;ЎW!tq93d F@JCSqVN>KpR8`]b!̖z %OۂޭM pbN(D:ۖ }J/FK^* c/N>(/n|a}>@(*lWh=q,Z3_u~dq @{h1-^Ir<dM_5ak~\ $<:Ev@֯ijzEܬH11Bf7G$%ɸt`8'9?t)Ο2sZڵN8Fwڊb=m~*dLsj⃭<{('nטpKΈ;,^T/gBG,BPL~?;C'+'*/<~^JsLȠ0:MKP^Aw.?'`&UΣz~ sR,my@2.pT.G;I9s%8l$6>ȌP}56&Ϗb=)&gSםR NxV!W6״_v*,Á@)d<ަf"%bT׬˩jvb?_kMϚl:w "e͠4|w`s2nZ#ի"OR >TLaL%IJϡBYeRpoA`ϱQ쵫i~ TȺ/B*81NxZVHmSe/?By#cU5dc&[_Cb>wKr/+.As3BbUPFyȏ/u/>ĹaO&oSYpJ[LfM/.S @/Q -gv#_$I tD % ΃9U+Z0twl PGC𡀒Lb DOȺ\aC/,g\#ͣ+(Gy2MXX!BxώyF 'nן[IFxVT5Y[/K ( O֒(u$jbB"ZtĭBSJG(HcYոF62WLӛ4Dڊh&2f{H&2x]|g\CK24#rWύ:',ba_#=uΆ@r8sV0ƚO;|E䐏RNA?Woj8>lr Tǐ0$bp ;TU(ƐBd;"nT)$"4R5F2]ἱkn*Ȗ&\ hY@6 Ύ8+ 7G o-/!Pi 䣪-_p2,=TWox"lۅί%'E4s b::ۮGRteCAcZ8ʴ}`gKUQk~q$(Y4Uz!}|.G(ؓrƋadLӧ wBigv# W?,B}~]Quu¶jA0UǾmu['FO͸՞W68㉏o>VMfI٩Oqמs,gRG/S'y{@Jeqsn9G]Ƚr=nʯQ5ZvEϢ7v X`X%{%0@C FKۤ!~LŅ^ǽKHu_bIҟAC 1Z+$ R8 2FQ`Wҗ_7`q ï`m:r%2 vW+zhE6H'AaVqMQa/oq└[n+NB?'uy:̄%Y3ȲR~@$[م)$EGI)DAZToPgZiVkDb |3EҷB>A4\ ,A/ E֠,z*ٶ%GiV\xUP7}Q Z ~퓮cL2plVz|kې"W{fzZAʼBv [LXj {?\#ɛHi" 22qf>̩\>ǮHT+Q_Ќ '^AH Uu(q tk6A7oS{ijm*\'<6Uaݯ<;}"7&*^"+v_C (8K7D-1 يkض/u A#  NBBk?6T@TPd@LX5{$2AtFEʄjg!8^I/1^@3.& F0'U)YԾ`a Fv,XS¡|D5.A1/P/+Ҷ[bCw)̮ďz+ovޜ$W2R4S&497Xtaz¦( @M \mj4X/S޵|EG}PT)I܌CTI!{guI4y U>lpr |3mkVRr(PΥA(b,Sk)2o_hee۸LsR:h.{b4\8/),+_u"%r|_ΰ 8а@z\O-+vJhHcYw]ɅCsNa6ݨLd[@!'dRElqbKH;9ie}G G{iXžbSҔdrBd [%{m @ \?$=Q*]0y\׏ʊV_PrCi6 eoP<`?z^X*|0  \GGh&—VfBK'AT ,;_]5Fua&(0Dyfy-ph(_LOf ] wRwz3t=z$$!&:癨eմfojR${G$[zdXwVq 19[f*08.[6J NcYh/a &{T5Ѽ`uߟcD;Jq=+tl"ehJ&& AI:g?!>;4~`8 3\R1Hc  ϞOs wF&q±\Rw^I1=a6K PkĥE6qYœanE^p<0' (jՊ6P}[&a݊.y.s (l"WńRy55Ĉ]c`Zj?ՖƎZ0cuڙd4b6˰dDU%kWWmkGsAO]G-XsXy6-8(%p1V^uXv&.<2hv)hևd蚷&%ؖM:iC=?o /$2ǥ$iq bJQ!˩OTA@Ul%ElEr-J#%M%9ŠH Y]4c \s;S_DL$T׿o4W~w?:y Z~XB 4GZPOΉp&~o0$~g0c#-ι[oK!c&$RGhr3|/*@YT[mDzD:#aJ#'iL;``)6B&6>c6O̺ w`} q/6ĒYm{?CȆ@Qíc`m`qaeɂ\G N>ye'ZTH1'r>XZr.=k/7 J7#:V^n?bVBxrc# ۞a}@\f{gґKGm렐x0#d`ďc#L|g q&ZN5E85^5eh[^:B/k) $ٹ MIueg*JA7;2ǕU*&se2~+O5Ɋ c;y܋$&$I'q~-<ߐ`̇g҅j fazh:lQ>b;eaBL]!> 5oPৃ}F$M¸ʤ1ܴ]C2ComKֈaDY5ڒ].ڄ8TGH96Qix9H_Hpu2B0 ,cݟ0U0/R b$s\2&Nk5m_kjaonFi"'S2OmuK4uɯ#d=3(rpd`Bα5\r=v@FD Œal 5ϺCbI4m}'IxJy[plY>9Û낲އkRh}ml 54eX s~Os7;58xj#1DqUSʮbcp+o2C. Ds81-_ll;O9GkKFf@Ob}!:r3B}ߛA`;Z[  xm4lbm$OYK_QI]t:WR3H~ 筨hL겷j"7mC43^9#c"W"Y^[".* lHBӀs3z⺂ L* oUDF\‘R ?Js' h`ago(Z%O?({*`.SWl*7ҽ!^bx"[H_yCơHrb{# bQ.of9"aW ~us.Wst'<^7_aV"E;anpC_:z-a__2O=One'&"*h Ig@Kzu?)m:#gԗF=_ߜ\ څR XíF! V:F_tp?%ts d:iZXϔWd6̙7$JWuz]ID)[-^juz k'@zNDV?h@H|ԲѐTǥUOEdvƖ"Pwt==fS :JL??Jja ,y{R <`wp92nyPB}f[AoCz$!n׃Gav;*zZCeJ?/qYbą5/eh&F:9>#~$. j1We+9$6w\_ /\N~%<ц膑3"`׎VF$Bﴰ:Z:15Rzz+E Kޣ0V O> EF"ܟ-&hc{6j[!9ԈSDR.]#vKyvAsÆQڔA "9[^X2z4Y6ݔ8Iz ߽D o_X-˙=GtHi}3opw驟ŀoy+4??W@R>p&+Kd6J uz?o(F|b87K!&FVZhsVj?ŤHH x~If)ۃ]|{1*zs,w"Elvm:)t#3]FpYA\ʈ>[rq >KU}.l9,TmAYQKdRK"3`rkD@'K9#UTa\Y}3mܵtee۹2U$^\`MMMѡ/cViZ&u&N}\1:>_NڦU8̨-ס`Kp@jD~Iai YiU>j`|>ЄչwXFz&"@, V4.N|mxAT:34)74w.\vIx(zM2A2߅"Ҵߋ5 ׿IZsJv 1`~`h@sİ}I (Bxd7<W|֎X+^dp& =>b-{}Uv18 1yK/ ЕU ՂP/-ha.qN`5]W'pq}>QFeԦK<#|AY҆[ҡr(NXH&%j%LqLe2@[[~6kÌ"fKyA ~aχGBvѬS60ވg?Km цB59V,ɗ⍋w3#;Hs T&e9>5(<3Up2 EZUqk%^J,! Ӎc[+[c7haك^ȋj  ?krXbANG\u8e˳bC6Ƭ6ߛDן'Gdzupc/E[)cݚH>6{,K>7ri:rB:~9`1~tzPUb3~ ۭS,/\}Q}-#B#ӛtg?ף.=[o^Aj |zak T}( zd𢣟ARmdg6˫/Ci{ضEݔJzɧNZʛȓfd)eҸ"U,~*1=c Ԃ253P3_STWvs&Uf(`6~M|Ϊro|@*.f'0Ma﹝MйC24knα;Ow9QHo+_pI[`DO(0={>MtpO^RPߐrыQ@1^YLvy4U^YxZX ^ ~A^ >Pzi^p5:IF ^Zt ƍϜiCnCH:F[άTEr 4BGv 2TP8O᥁nVmfM5]$ud `>^eù*&> >ZvΓT8qfۮH٧2]ΫpRЦjY${l$TMj6B/<}RoNXyIt'>{Y=ȂYT&.9%tJVVdMIۂ wd K(ֆ{`ɻ zKk& xbR>Yb?*C+Q@n I/gxjj{)ͭ}X;kSگmUǼBd,%40u|R5P _̐B٢5KeR̅M+@cRi=Фg7s;CtJq"9-6< =-~γ \{:E/ \e缇J}МYKb#X_Smɳ fޟ*;0/T3+o!"pQf)^6*D/FH]j c5 &Y+ #%N B;hkMCG0J\C<|@)EqI^ŮXAFd= =dVs_sȹ/CutG'5Y/x'nƌxpm~ O<cqZܬ6K+2ViYجKu[.]8xDO2u=X2w {WS9=IAig{\&S(=X^2mlM!sI+y*rk: 3YKR,P YM>7;Fi_K8W5Vr5HrHZ iS.\9NRJ۵ 8o}Ua}(#qHwS\C`TcB/ژYuj)/g|/XÀv+,;GPT+ȭpdW酶D~ ?QhPba\Kӑb[@R0qBAM/CѽDr17 8#\vGcqY5~˔J@T*uri m &j$9yg49P;۫44V{3^Je( PιKU'(QYJkw \EST'5-G"?z;l1J:g`/DhApfQ{ 9*$4 8 ڛľ+CңB#(hh6u,B2c޼dj翖[|jW%/)Aϸb?.+7 Q8LW77:}35dA=w\ [wG}$3M$1S=zҖQ8li^.l|yO3+(Ꮢlo鄶x7;E 32aIKؽKFY1j"]zabr-01 :!ux))GVEеK:S}OstkyqJ'`RA(*U@15OO=;d;r$Ơ?8gMqBV!~* l,]6Ǖ qkZ߇mYe,%D%/re-z;CbKZ~YLoxJ Nغt4C{u0Q*xi:9%4Ӿ3#1<*F 5u!Nwk]#B(ED" x{I0^~]]7 .qa+ Mq6 'Idۤ?NY(G f?V"PXik ]OSo?LNd[jS$ YzD#f-=N#ɇb;=M1h1ZL$/{PYh?[:й2 SW46A!M=A<QT 8ҎrxPQ`<]W2q`<"iJh ڿŠd' txחͤϥ'_~N$_b{I8W9وL/[MS!Q$CYrQ?zu2m5٤+'.b`+pԸ+|K *\lsG Lx-F4HQe "`_2tmepz6jC.rMjRO:=Xw}o=‡_]}Fl&(] w>5Lޛ)d&⤳\[z0zCHr/8$ł&W+k™ASB9:VpZrgapm G5;~ J,r]XYu֚6&K^*a%PZѢ֠/l`3Oa%1Nq^,}U=sz 3GhR,eӸNlDDHrHq.k[(3͚1Z:ҍ58YzpqK6}/i>3.E6 qD=si*ݵh 8PǬKIv\,[Yυ!9Kܮzh'lF.uАQ1{K$U پco?v~sՄ44 C1H#t$@Ti}Y\mu]n~\  \U,ok!lU@Vq:sDsNP/9ܲ@#rRsW :rZT#syΪKA6sF"М80leDջ}Bcxnr Ogc3nc,paC sv,{iLM9Kg ݹABͣ ΍7+ Ui!HQpo vPj+H,|Z O2v"ܞcaJӜ>q ${0w|}]OV~ބ?oI_W@դ[_z0?u۱ZjƏŷ.%e՝>u=o ̲}GљJe` (r8^2(twXtg,}p) xyOE'ys%( 7KY\Y ^qRI|s(Hȟvv0wq&$GuY#q !`lmlUV@S|D-7Q*_UΔq'Uwt -S6aSD4\z䍂hg&VrȜП cq}W L'ƪ!sκEO+;&=TPajcm`c7ۢb"eVDv,t=TP^O?m ?GI~( V"|n/3%Irspt'=@dHwiƗlcnrgi|6dg qƝ%,:t2 J*ggbʼƄ$#)XH?D"}GR %녞= uFLn0/A.߈j6@촪і^:vF粞m4kEЅ˔RMww#×}ಓ爘nNIlF[=[tZiwzѵ?t4LRW"x #p ZN*6[!*Kf︮0秛S!tyD/]~iHG ̄J|Ii9q *Hݢ6kGDG_+mxEnԷrGjTޅv ]+e} m> ѱ&>-@@S,7>[صY5b1aNe"F^f5uq \g}QeuDSgF~vQ%bf@|dl9 3+U?/}J{=MtC+ \֛d>\t0v">~?2Fm9 ?0;6)u=_GX5r*|}ptYH~DY=@LhE4.X#_ZLuR \?J?>?V(zVWp#[;SU'+ Z$ɯ;Ե1>>?uS q&d='?U]~(Gu}1XZ(/ _6ƢB(b@ g7.Aj9ʓ#, oND^sZ7#O6[3t~; u_2^)8Q?qkSP vTB~k|/[',j ha.9oQAVfhoy|PZr%s꾖ޝ b ڗ,חcB!jOnP,ۥCijFA_ZeGtvŶ6adk" [88ӫ5 Y\ T 3h\q/h"kiHEn/e?*4B]rNr.Go2Rݢ{-])XeE>㐖bzi($ ?+W=ؙV&m.LL"YΈww7%ﴩh>r޶gq}yT',k}+R55yz0/\Oh¯g\`_,4C Mqu Ι~ tXo+ ^8^<ϙ^؁ Ld*HE!`! _k7oX'0#:eң1NV0#BcJYuR6W)PPxpvP "j{0{Qͣ5wpUW6􊲐hD[65ޗ6"=(=d+ɀHx\y'GupKbh1WQaz\yFϳ"5yH,2H@2G8FN!{(̸qN1J&tq)(~%ٙZ`jxUl ZuGʁO_-\̦FM_xNx<[ 'ayDxR I~TCo1n'|Q1%cpn삹 t QCՂ!T-κAZ,/糟IeF#?EGojtTW?Z0RUu4"yTk\",2:$/aua;s 4ˡԜ8/o`.恼6Qv#@:/+cy6045Dwj۵rۍv(A&d8dA( )Ydid0PeqxRP-M(bEJvL_#z _.:0M9#?2ɗOЅ/ t|dǞѾ1C@IҩIBq^r/X@@װ;b&i2 l*<ueV' )G3?JGp̡ܻJfx\Ra e>$e!<@CdakV/kknL2w&;w{d !@+ m{$]A(CI|j;u:ΎiO-F'%f% v*G=quyP8}k&R1g$yY)6=y^NNFqLmA2C)tK`Y)$ACXe' W@Zqd2אg| ߽l-kk7Yb0j~0y`CĂvWUYf<ڽIJ82i#aPM>}ˊ`#w)#cΖZz58=%?(BW/İy:ⲮZ}\&4rR ZPP^hJ0c -~= ;Q,R J7(u;^0s"nY#!4?X!Fv[BOKHR5Ǖ_vr)+ pR7p$2jQb`=d [ǿ҆IۿsPjHI 9DMdMMY\_h /KUQVs||B ࢩLw}o(g?\`'_T/j*RC>d^g'"ki 4E5^IEx05}QTuȺ7A.FUrٹm7II@ xے@mZc+vH2;10ח1-]2)w7>;W;\.n;J"@;[{7}p`mPBF/HWva9F._ zAT3ز{1 ae1T_hysZ M7>/$ZA㈖#Z_;7ZYGU4+o?#SF Gg6bdvN /aL㆓T WTHވ*HH&M((i_Ǖ)3 :UBpY+;p5נ#źByt'_OM^_]34Q-j|]IEJTR2c$Nk/]|}56l=Y,h__Xp*OSiu'5Rbg.Mץ:k!7XnEz)ieڦ5Dlүeji ϔJ'` \v$Yim hjSz# U񷈽+krȼ|.y17!(g$/8MGuݮec;PP<%EhXu)Oo") ?v\Ǧr917WJLsaz%nL}~D983]6̱Aе6Hcn 1#' Ac,yY"@T j7AtL!2lTmJzx]9L (lH[v 81VyPـESY JTA` v yQ^T`-<#dʺQqKz,(}6@> i˚Ir4ldEǴ>w%A>6wdM*: ME纙U Kiv/y$-ؔgT~+0q(QqZBݟ/vן{'C}>>W@ꃢ"VԱtmfZLn] i}x<ȧhmh4\z^O=y{tbF]BҬU9*lD inkx /LYGH!L\;9ǭB<9/aju>3Vjr/aSB'',mH ѭ͆do:[Ax%:iSN/sWskHG~]*7Q7˔bgĒm{] !PWLVL|Wo&mM(`K `)Hۦ7=/ O b^%H{Y&M'bLs8#apjZw v@6`y&#='IcCSm-9 kYLf[fjWV%9"Hj2!n72.z)rv(fAT^p/[Vh R&. tI,_4/VV'׏_5薖\G+i#>ap٩rNq$0v,5D3= WK/ʀ^Y 8=q|DI2d˶Mf`lT/4B|1YB%gB`bG RS~]\I Tx2IS{x{]Eu蚅'HJ+wM 5gwaC5cz)G/<ۛ;N(şg{1wb(OCxDbWO{BBjP0zH#3g w8 783kT\`GTwR& hG@`hm78k1;piIJ'ףz%@StMz0yL܌CNcad*D06yd*!JZ>[IĠR x8wZ8?@Cy@PןFIG=8j"1>@4ZZH<Lym41DvO6V'(L%Zݷa,kY(la$ : mQnd~#50kWZSST,;4"_scə}_rUzТsU\b"cY48T_:,wr[8w*gxo4Yh樗Gl!zQIxgq/I`S,Wه-V Y n'ƢGmʛgd%,WU8ZFd(#B]]x^j =@zH4n rce{fP6 qI׆Pʰ uBd*^<^*kCxɝZNXίԓZV A3 A UcJ=${Q~&1pl뷊7cV#pH+5#%6uZp3fF? H&-b4KUD6e,uCQǮQ³h_brgΠ죈ݲr74,K~A0`6H"jeӞ<e( _Qq+>Eζp)_Fsrx k9V.& 4o08%[]l}RXW!~xfZ[ā5WEΈbLƊaP4U&7@Mnن>b_Hh_U^BL|u*mDyds Ocp_ NSGkjm>ʳ yUMPpyR9?dP*x׌)'g$4I ƭUT7w+5H O=%GZ1k߽'=&T7JeZF[5t5fcI.^WI3֎iT7X[ͰHgsMM?0ÙRڔ] b!cgy,&Cl!/f -pBm0Nr{Vxkp su]+\AwRz׌ Dc}KʿO7z/x|Wߋj;\\:<!:(e"ڌTuG C/PTC5>%[q㬅cp!p>^C`Ϥ1$6A3em([P&H + -SIuq&2Q[xg8#;Z2)wn vEۓ4.D41R4~L8C%GO n]!4uSu<7€?"SSG7Dc[Yy|Y$` C8FXQnOά21r̯ۘ $$XA={Co400@N)b˞6+ݡ&S -no=5V|7y+Hl6 -yyyyyywesop2&EMNFk26|)~qN.D1Hc+tOU1 f  Er6e+U62̱=>dRۿgT}YWbQISD !H߾\ Wze7K Bo:Fkdղl uժ< hݏ㱳E Bl-`LЭN*Tsil:B>X}2ʯS2zo8t6_EGh=$YYxFآ^70g\Cu!>UTe Q} BfG*cw"]#6/F ғMMudlo!$nce޴ 7!e-&%tNR}AMJ)kȭBb8/Q}`%Ve a)ϼ.K4w$Du.ll_maT]dHqF{cʸ(Э+Tt 4VL%i?G8wd~."8=V5cZK `gJPdo˒CMS#w9fzqQ F`ek .oh'-31%?qV3 l3.cߧ|%53f+Ġ)8RIm n7f*x/bҥ9\ @0_)`=Wi233qÉ9i_sOҬ*9;T,[Ő(h3:6qjr֐{Z4Li55><e`㒳`.fW%Fuz[ďhx(:/B`hW*syFٌ/~?͠=ApPZҺ_/Wff Wϱ\^Xpe73D)&ܞD-  Y)&L =cw2w{|AR8add]}#0v}Cj6~LXI KRKǯ)后#,ܿp37!4H3E*HDBT:vFܒW\j35:$U9aZ3h:<7Q6J}Z~: u<7߃}G/83Rcxxbl) F c@;C96Zg7Ve 7N~!iwtƗB RZ:'+ΦxS\PtFTdJ4$gBv` ̊$Ly'TBْ0 +i ѣo661Zһg[avARk ض-dXq04O;\wRpcACz$ِrz_S㑑v3s})g,bu-Esu[w溘Ŋ98Ic1DN"9ԢUʊlrN89csb-TbxBGh VKK .BvV:CgZT{ؤz]ƾd%|j!iĵ_~{]SǤD]4_#. Zᾷ^Fߓr;?QP19-'' C6^-7/gn$uL7:oT>8Vot_3z谿,~i}5zTc;ð'98mT#,^v"q2yjS:qYReG 6[ _2Gym):|Fpmմ,/Pu*CO_k`TYԆZCi@K>XAKv :c5g'ؖ\(>,%e^CvqqܫkM1«Qۧ¾0F Q !v> "!X%ƅWS~Y9|*l- X{ˤ%<7hI_bSlR1^.KHSp̶s@V)gejN#'k!ﱌj#W~t\\XSdz5|)5{MdCxO0Ջ`h̡QKt+ y!~5kn9Vk̝b%±@uW|pO 0֎A['{>,F Dف{ 1rNlyHH a\gQ_ ._h8"/ѭܭoO0ι}!=I=m 2|vVq}R05cEY#|,ERsڥ, nI{#A*Rfxac2@ !78UT@)) ̗Ӽ<[[p`.=w lcǂ(¡hStS Ef,4ܖ`h^GdJuX=JevĚL [a +!7%.ص Yɳbe}y?^8 6ضWޭr+Eb}21't+tyҺc+g%U& {[Cp3Z~MI-n9tn¶E^L'|eҖI>EDa~^^IC n[lU"SE{ffr ]9}(Mo8^`+*Uw1Wܵ{+U:<-᝛1N!ܱ( 8@ uOy<yil-ѽ6u+z4QθI%rU~><Xy#$%/v\% Yd:R_n 9ı#-*t_Vs-FE9R~Y-ELSq nY~k XNFP|X |Py%X1 W,+u/[`ikP8RA}?hpX] d<q"yAtYUk-8*OtM9U`<8ncZFf"[^/MAa8/N=ڃE7tc-쎸_"avz"bx^,O\fMr 4e*b54Ο\NQqzi\r%M4oi~j儴|jrht00Rr/qQ'!{)w՛,(̃,NZ!F̡H4a:&K2Cw"罺 /O9 b^ f~9$>8՚,{DP ,t/o,N$\qyjf9N[' ZEiu>PҲiW/KPǏO*Yd>Q[ Ddn4HkuV5̢ElQKE0^\٘Y|ODPt XE &*v:ҽizYEs* `P*)i-󩰐+1o| `4$ YfUw‚t,\CQt 9RU 1͘5X,8W^ޯcyw{hW7umЂݐbt[93][oz~8,&,p655;q AfXobsݻG$>,NADͿӷ&j0*lDq[&MxT$٠1he@wh0j8"0+D[5<f 杇5e|5F$o81p_e4e#l3N"~qY "g+qoyK88So),\In撋kj= BA d  |~5\IW,6 jCk4 a`qcȉ7|'hԀlOH5tNgf`Lj4 ]{fQ0;zCگAy6<_-Ø _VJfV~}} ĺ31=,DG䧸lFd80K!!]wLAݑSa<.#Q2/7vW^SIx7Ɛ C|n0 t>7 A$xu%^ޤ ?PAC z]4+F=QʂD$ER z{J']Wu@Va2tP EŒlVT`@ y;>;??&"DQՉJ^2Әu:ʻ #guO8Z6PzEeNm7WYsB-l5e2@l/a2~nae1]2eb є^wz|u^,̟hqDZ- W@63RmdX@[H󉄢w 䗎#&+a鼻^"`9cr:?tgz7%QP*/ ) ()!av3&N>B0/!%Dї|bŸ}ȷU(E1A@~_) b\ ӄhndܭmyX"P٬tm'{kSJ-rYi $=1(䨒ޝdJ'"wS"-t *@#%98 ߓpVl34wS\LOdN1מ'L'enjKO(3 huq~W/{:psۑyS5}2. [ eӔL;Le[>^[]K5ۘ9Kӥ}t ?;Jf +"NRcBFL:g<|~t:WMkĭXgDIL%S>%W]FlPjC3N4R\!-ReY kyFm$nՈ -72MI;*gg)u12۠gOS'Gb_:9P ž'h?}c?B'y`5.`x}X;u %:LJDa^&Kv1& `jx!9mǴ:CN*i%vlp)Jʵ4Ԥ0% tsTkv^x2Cx' #|,ǩXjAuyΌ9XR>]9Gv,SeQPb p}a\FQ̬k6E{cZ-MA̬(]]ͺ!`Pκ+e`q ?}!/Y8.Bq jUsA H0R=|Qs]uT6qg{ƞ=jb~q2J0nj,V!p7ӃQ>{bt`fƄPY]H9m 8fr ɝ_O8D&H{x&VT&PɄ_oX<ad7m5%t?gA"ؕJx/"MVGS5˕ĸ0|Y +^>lB+hC-a>FnL}g=ao\`u]圏>h`(XbvhMҀd YYm5`(wQrM[soT-keD d$0,Ӭ40 Z62W@ }W0~vXy;,ݓ 0q\ҍM)f*!;}[rD+7 `ITKFGgQ73dWj"mr>QʖYqe^X]i khXk+8_a Qm˗L+9[T-R1n gZ&Խ{b~se k5A]A9覴1֊JSJLQD9 s;y) [H:,0xb] qdg>[\ɒLiuy-X?³\>f q#[JV~<5F:> ڱs" ٰUkW`aH`@f^:\{eB_E p+#hοI8CK>Ϯ0ۖK82tIN< Z:|NhRKCwէW/qǬsAfexEm0~>6kn eȬ&-Mk#HWa֢hq9dzǒ[ާ1\ydh깂uak*x%["gPEJ~E}r Lďˎg˖g$2sa+$6Rٝ?Q``ja,?G#èo}Ow~~ DV5m)P~lb:!V!XNEHX-0@/Xf&liCRք}X @LQh&ĄY~?3s(yK-MT7r}e1kq{;r$Ixq~.1t; uҀX23"8!j\z,zwB7bh-taH-rP #S@ * =^kRqJ =T12ui,;1Vd6)@0A=;?-Nܹ3jv}+ XQY;Q}446>g'iGx;_s: mv{8CB}n\KaU 14;b|LCD'6!eOΝEJ잰~q_L+~d)J7xT4*^ {xjVN @CfY]}ւ̗avR`#°!xJڑPz֕ V?[*<mȂ s [Fࢭ4H¦?M:=cX$="bXs% zKSE"9=;hI&Xu?=)ްSJcQ[G$;Cp 4LЯ̷0L{17:FN(\NeMW rֵ8tFs[Gd*T,/}p=)}෽$Q+粝N.nwLrGu"$ џ꠻ȶq~%Zbm,x)]w2EC(B9 EYUTn=Dh%sҨͿoc|.72y\ }ɱU𽮚MN!Q UB Dd5>qq I xT f]g2̚^Niwr@{V+@ad.pm rlc}eq惬IZ"eIAcz }WPiQOS>6i;"r T Oj& pgzMEv,hfdfsb'X0kwmL0Dd$'喿X@c}ɕBe1Уa-.nz \tY%F^ÿґb B/s$r=*`!@H>;ƐDL>%>}X !kJnco\LZ2,ނ2SJsae+bjBdr$h\ŌT.miNHh @[QU/zsS.3W,b)tQ[h=q9z/5^uKD)6ᕺU=T©Jgy?QC+&ҽz, S"t\ˏ5Yxp51%ܶRx 1 iYѳp.$5$E?moA."gޔǝ7L9٘ <ͳ&>H3v O%9z^5)=YbUT-#vWK=aZ'HnDQR+Z*Xz@v*i` eB3o #ҟo@L}"] 2ChLj!ȟ[g~hG1&U PP$ V1t,4!\,?:As৚9]LYf:< %;:01f*ܜFBN3랟"|Vd(bgH-.Ji|1ƻE=8$C_0qMR-&mB-fYd_ӁaTިAY_-m\ҾcC |}:ۀT] 3m:YlgR\ÇaH`ѽ%;T4Zdx2#l$,Z= "= y2 dn'>l,_$Fx]g䷸mOY&Nedo[esvأȽP7Đ'ʹ}%`UdvqnazLU{d`f$LC"׹j祚>7:ЩrGF^7}{/YO95/[d24Z E@J07=/1z XT(@P &SsMJWz@#Bj  0_kfr`1MfCe3F\H$b 9Ɖd (g7,[q_?D%ܢ]l7wv/ޥo?#;YyƁoJ/.]!gBڒtaA?<;gS =` .KM>=K_ lLZ=g 'y(C];KsnC{W4fPO9ݢmIB`%AH/5dnifWF_?A?Vh7E|܋*~{_U#|ӿVUi~հl5?Vݕ .~}3F_!N|3:Mc䯀Liw\*%&Uk>r7*# +xH1t#_%:/8e)Ag۽&2kw٦B);12Rê_wXN)㦐 pXw ;IԢl=";j8䌪0<*ܢdݻh2|D㍰b=SI|=ƳkVqHD%{=_TnΞP lHGtu?TSrod 86F;Xy௯,`&d掺ƀ2Ip.~ bn$iDQ {&3=OQC[zZh=֭qƠ{s]L" Ju#I)n- l#[ ÉSng$"TL99\;cQZ5e:C^ a_4$O*s$/oh9r#Ridip2:= F8aAQ|\%W(~N0yXl`kۦY}pu`uG鋳 5Qje ?s~vٌlc|7= fLZ*[H0 |_Q˻M9!ӕ/  ˀU^BZ]"q \*5ğǔBh?R!NP tzk{T7 G:I߈IX:N "1S3 Pi} MY{R4 ^*OY8ʮ<80Lstd:Z<0H="^CvgS~[1p$W@gd6:dQBe' {bӴ.{'}N /˕{履 Uk6GEW =@.T_V]Lg8yiu槛wʜ?,H tlbx3 +;QTf,U (sowyEUN9~>N!"!!DH:((w0|_l7wkࢽ9]'pKl\P {C&r+>wW?LcCbl'!.m cW?o>hn` ,V_H1E1 @84}R$&O-b#%Yo50VU@'AX9%ccvx#Q,LqYLʖGAb ʬ4YxO 7oWƹkAh 'JY:x8(ڴߊ Yqf|Ib\r, nb(VN/Q}?j4~5ciȮ႘ՠb&NҫP1-8H0 !<Fn!#m{_ia0g~lbƅLYFX,a[u|7B*><*LQ,տEB)Q1)flTY)yR3eN';TSO~ ˵ݨ~`iZ Oynox7~BZ{r̀(51@mLJL0t19gIҧف#Vfdžݐ<#JgRT璫.FF=$x*Ra A-ԧQpw?(Xu$mח[Qܪ*[W1Q6=TvbePGZDYX4'P0ks Ѥsʡ9 B((07ׇnb·+40:Ȧ.A4D_N)B0e\/hrˬ/G7sW{Z̍ /f}"e/+dY5 &㹎!F"џB}CLRȵ'ؿb.nN INZ][*Gt0.PUvЖd9&Ů,cD ?}tO6# 1_~ ᢒ9: T'l#c'0HT(1y?; g.ۮqİn=3jD 6.v C ~LM_ca?Eߗ鈑wfRir\̙]Vu" D;-x-{Q} V 6IEW Ԣ%KI׼ Q ೲkX=o*Zsݷ/̠3ͮ6qNuiw!E Y((xMBixnJ;+gLh 5d<=xUє0YX3Tw:רI AU،!Y 4X,7dEpK{oZYd+;z`} SʳdafdZ)ˮc_ͶnUɆ3tׂp\'$2xӀQ=Oh(]EzY,{'Y˵恬!y/5`I<0B 1RPu~,C ;*rd~+Մa<KiހUL c'&,!`*¸[`nϫGqNB^cDX\3a.)$=c {a)T2go]d"[*jЎ>Yl>2M Q,ۨU0 gXvXaZf.c ߶)79sZ:' % 6󠐞2eC(t27g%UwAX)X(A*DzgJ @`U;,GSEE}W*8A+.p%GC?>#L JQ37SLb> {DmkXJ‹S[PkL=]Kʄv3r6 4C5jA6l[mO];mcE:qIR]鰥"f͏H=>=?$a9Z,SH]wmWɡݻG [:[:͛2#50߲O ϵtm]_ $$0%d2㡱 ]cbrX ;")HFLUߧ5'6MDX?\KSg|{^ޡw"3R-Y*õolƩ(dI;"aE%(;BhCavX+8Dƒ:ILS[_Kdv.r`/blOJ6/yt}W=k Nj9sn: =A2,Ŗgw owTgEفdC퇦GvTTF E<ۓTg2_G/'fb6h=ŴZv%~M(9`%!͐oXWj0F|6yHi%YTCC|cejHm5$ *iKxg}d&4:8߻%rެŬqH@kΩr!S뀈c LeM{NگF64LeL $R¥L[q[rt^_TMpS?np&ӛ~>~HxXd!+ꨎ1U'\kzY$l!'rpڵl@C۠]YWGҤaXwǣὢ. ~Vȹ/ )2nn7/\j!a?eC,1% U@KEb2>Qwē1* l0a ӫE#?Lpi)xO k Pe-פV3u=E}uS3l04Pg(!Ol8EjC%i@coC?%>s;]yar%ş% X..0V8Y {pAHZu90@ME<UZxX(<*"KMx3OƮ=b@__l1q;#@${"rQpV]\BcNAܕڬ&Nuqnf6G& HaFƂs#8T)d>J~W}2W͛iV?S MHԽ2īnBxVdNATX[zS9< DɵǢ0_p5pCgU+%$\R$!S[p_^F{/O h`. O4,/~V> M9"@mD3=9鍞Q cf%V]f=©*MY5aÛw{6FИͽ=[VF--2ua\tuDb.dͅX<*LuYoGVGy˘zo T rч&I$ Tc2~h!X<7aӮ~+ *'PN԰͔f{ˎV  PHUş}SNGC[{WfpK2mJ¿;Q%H/mAR{ށD,u[S蝿l 6>P}:` $Nt 8]bT"$3zA_JWWPZ5 1@Gyز`/g[+A]@ӹ]H:jXD+]Ll~vA))F^9H+̖N>R_6TeNDдK* U1C<[I஗Ŋ/tEGIUDQ.ѷTD>dx0gjb MK QvT9q{u/&*C7ywpU?:pzW  W"eoh(=ՊA(lWKvÓ[ Kw]e_#jƿMö[|}QUrIs'=}֨&,wGbEKLa G f1ae>wX~4%A=] ~@0,I^e %CC #3魤 C3OƗH6~5b ,rH;})-1b '/'u)lV 4.9Ct r\$ PW#EWc<ڢ`db;7vNkAF78n6$O,A&>=GH"rѾg.U>5UâхD9=r$[B-hS\ƌ𠐐srxPpeY~nx:u"fLt B%Xz2P7ca&mO_Spc`|hp@3Y4."̸P=z y#+DqǠ?_Y 8쁅0fc9qwUBwp 5 OQvy[Y $%j U.v /*gRW#QsdV OEu'z-Uu]V5dgHsubZ!{,*E!RȨG0GđIPiX-BӄGcX7AW^ؿs*I;8YX; ^t/JTaOyZ.*8@ X aڹ}O`CtC0vԅ\8׎ڐ4ِ6񸥠g7 tfGL ZГ|!őBF^dTNܛ呩:n_sʿ %>ډeH'z~@eR Q9A'&ݵk϶G9l#\VCRas#b]Zn'T9U-I+ T)MT(!5_?Tff3MTh̊3˽0yCz~>q/""p/h<Ósb)q L 6[c I fP 9i?*Z zEok:+L"<޵M^DI)v˅Bkқ"'b.qGnS).+10_/+ yD*AtNܻ#Fʣr2;vH>]e)ЋMk4-FGP0`BD\)KD`fH$kxęgx;Կ)RW$[B,Ēj>3Q~x  3eXmX}e0M. ^Po!+A7mĊٿwE/7cz27'L!GPfNؿQ'7+w᫊f Ah,Jn%]y& ,4XqAzRoat&sr]7A^D_IV]4x~xmxDZ1',aFeu5ȋa2?{ fwTP*"ıN*N{oHtw2"Ȏ5W/(hku#N9-c"U(PaP03qv *@l+ڬ-Dؑ Ю3 JǡHZM?"-,西rMcp#'S~/Lh:\ DV|*if󘲬B]:-.*t(<4D٨!_&;OEMݝϙGz}t]ɖkֿ>}5#.R"/>xC<0 KO~A"0ׅO^;r^F %PY,i7{ Zg##\cs_odqvv3)4,8ȜxҴqU"%%]Ɵ~ g@,/9fHᵢ#& fj5"i} 䵖{uGn6 >;U:)HƳ!Ec t a H'.c?HYD`9D^L9́Lagl'O.~B-4_ 'Z @S:6?{oNQ.tj>R7Yd AvW+QrNЛ`h!(@h6||؜oc>Zwk* ,b齑v,y:DƚBuӣ0 ̾1sVy[N·O!C +8R];zE9MAFbkrU2CH+&YWdzFɼ% 3׊՘1NfZjNP'?a:8 00oH ]C%ʕqrj2 (-!LAW-9eN+N{J%/i:GX^D#D Yۃݷ:U{pzuj]; {|{B/vƃذ]'GV*9ϮDf@jd>ά!,"s: -;9[r~I\F_< >x2$+tI0Tߝ)7w'ﲟVnPӀ}o}imt췾?X?by艹{U>=}wM엯=o>竳x t@U*<`aJp^#F;)ҺPom>^iRG`&ɨBקs|Յ.j.@Sܶh@/TB澨`2|A '`t[NVgK|}gaMj#:Qep%>xb_w RJRTq6qӦuZ'a}G*wt] _[>(R;jlG6R@W^`TOt/N;1Y7/QpcR"O#opBe6ő',? Km㧘^&N~v^ ҳu9E7؉t)C:a|wfhe GrTg$. <7DHits%"ʖ9|z5G)6:7m\vZ8ۼ`젅ހ=L0+P0kI7֟|b&?2'c]C'%K?%h@]ص1p$^jQ%1H.kw"y6oA˨zar޸K3|u=3~Baa?խOkM`wXr)K ߎb%gO.1 ^M';gy }N9zِ9F P4 ٪hRgbڊKvەPNzjPn8W{yąF%o*)dN(RdF`;1~qi5OF·9IM2إkՐ`8:Z%0g?b(5 "Ŵ*s6Q~Tr2uwQ?̍'rʆeMRHB!d4X6~g'1Wٖ!w͔ btw Ӷ$m-w9Kj/!F3iwT[9VMIq āF|DŽ:xw#ʋeϞTSLE2l󵂍-~FfYS$&1nк;ӻs C9lQDJL9t'?*%gSx&~i4>Yh`)_r-~w㡏1hғ7G'|hJW4o [Kr9.ܰ>ēؖ/:,۞1J[*{{kʍel{<ԉjE۬>A 'Pq|6~edC5D<-.itvfrqƤBO-6Orb)a ̋g܃]9іPyo$.„͏+qOg\zg9>i٢(`sh%Gm?(^(( [32)0[߅ @8#=Rli5kH}9駜%KD Eȫ)u~mxmbƅϾ#pE;#e޳"- O?;oJP"#.;Z_ծ|n cλSgD>+s; mTh' CY>q[_̐kr kdljn.:]zs}aE8r44wI&G$3~r@8DZי\{2W uCn$! sa !c[;E8mPHbi\Λ`|w^M V|e"gS!C7vVL%8ё|9M1ah(`\R2~Xn|(i>oVoxu`.8hTOꪲ0#bg@pӏQSCj3LP*X(3Rwdv!ōE$󓂇ɂ3@Y{-cSQ,d8j %_eH#ܐs&`+6gd̚nm~5rNu#DPegL#'N%h>Ѳ~kqyBsUG1pYll1b'2ț讥M}G>;H+MN$Ļz߶! /UVBx8y_ rezZD˩5_eIѱ )ag2-usnXKĤH=/}VxUQa. B͔Fj~,LU1SrC_g=Yb(|[y"(9@ci_tj`KT ]61L|iHke|Lc)U"U`WW깆]O윔y߲3u3Jg&X.`@\rYq*T4 z^qkF L[)# 9BӍ9 ō77|Y%P [S/,"^&D+}^ w&+@~y..WN}>$e-tKM?sLl3}( klˈ&e4,?{xT2]d/1^bK '1EW -&%ܰ{ڡf%x(*LBaZ=[|y~!i=mvlɠHOi bWS9%Ϯ1F^ -/4,rg^y֖K_S+WAP,Er5,7)nT_ ׁ3|6c%z$$;KhjuNghI;|Wv{8#:ڨS[Ψkw^|mIdbdpθ;eb`aVs} FbmheEvD]Xe: xw!)@jhCkyo(%YeIGX+SlP#!%.RQ8Rw`*;* lXkqй J[*ˑP0!Ed\w9^ON?d'ٯXr>jL ] `qOg =OAh L% CO>7_dHl#u@b.I6;T O܊K=Zr#hWkx,dx>E:v\(:j}[L^[F O( #%K᳅;ksrN$wXf 7?'1jTĩ ycNw)gKOS%4wSMA{{㺝ҙSiϋxV#_MOj57n ȕ'1&ȔQzeo U'Ha~6!%Q.n^Ϟtv#-+H3HYWzR]ӈ>948|Pr+Z%cW_ZF6#DflG18R Ŀ ,n"߻>B*C0fDEdMQ+{Ri?gPi3ދpVRJ- Bʶ5B \FӐQ9H$;Z>W'(Az*Pi ګ\iD@=ِL3WY"T.Qv\HIEu9Sf,1#`g\uϴ[d  &`g|%#ߢ/}MT'빥*K;2ry0s ss͟@UAnbs/4jhoi;L[Őr&&Jdb/RUn55l 8=QO~bCvw2и}!*a޸PK}2fPA, }<`+82J?2͂VVi9:=ԦYIw,MHH'=LִH8M6!\WbYJ\;`ymzŖP0SkM_<jDF9r+,RHU)&zH5!Q1c`"tY2Iq% ȶo 3f0/}0̶ U2X5ҩ8֬ېqRL vy 33<* ITܵ ##\feKDΛ솦ˀRT ImI.3@1 KB(y G2 pAGaK3\D"IT&QhAB -fuߚ Yj!xw tDn@vR7#+Lb\6fUae z標\L5Wq @ʽ!#t"sY޻gvck<_\S([h\,,d+崷_5˸ϤZDMk0a!?t*Ʃ[ohĢs1YsZ:և5QDq AH.,1CI8%0UW(q~0T.r7бT. zv9}&bD)V;ь'=w0@Km?GʜˉrR꟏4^>5ܫͅ]dOY*ӛ=J#ǝ<-$k|sXZe!ӭ"K&K/`OǍ3@n Uh\ O`_J7S:^wwPb(,ʼnFӫOLO< $;ByyM_,ghcnOʄZ.wYe.O{jf'׍@-֕y|;CHQ9κ5/ >S/t`B#[wd݃q))Nhq>]NcX_d2_m8:(qA2c;9p0dnY1e<Oškهt+͌6mLB?H(lC=zO.VwQ>0ц|f,*GQ0ux\1FKZO hRW>5r:V5++vl-sdsV $6  GޱTdc ت''uSTv~{]@,p' 0ޜ\MST͟r%߇؇5[`sT$ dp!-#vF6-^w?׶ L-_qv&Ws`e.$P"rx%0&}?oӧE[- 'X;+BڱWף(X019lոq~-ERE!U*c0Ag3E|+P Ҕztôm)F^:$^e6ăCQ>\:L1ΧjӀ5A^ OH|ka?xWCYg\A%0K|5m1N ŒXt-h1;MFw6(LRX uAﶊ1zlӬd?ALPq=U#Sq^J/gh0`~ʰ"kp ra+K<r 'rCȿ RWI0K0SR_If3y4"uZ|̟D;5caM^L K5[GϋoP0ml$. 4t POҐlͩ~˸A xm$!@NI#%$ rV!:BF g Xu$O,b38'](` ^cS%K~ȗ5yii}ZNjgTF|.)tI :čq&[pC$xV`5 .CGJbxdxPC9SmjmڍW҆);qi۟ܛt()O8kNux|U7zᥨ#(\cGT"#skz Z,}3C#A'gԾ-6vYA^d$&0tu}ňL^ 'Mn0ǡrjuZK">߹=F({Q12!T`i?&fg=4Ҏ8;.D.śuGmr&Մ M=u/X1E Z1PBcOr+]*q4bY/MJJJ l%|emY5 e^L&ȍϸC԰;&,"94D6Xެ'.9ܢ4(q| hoα8=Шx7 bd@S l~ Ϋkjq׸FRQUka*ky"@Aԯ眳>\G%m\jGg܃xj\2f606̊tr.[)&pp<,zx72E 6-xPŬQ*B/\(Ψ TݢWvya%n )a (_U:f$mb'*!Dh<ѫ1 =& 9f\otaw+0%3RDŌgbI taѬ-Viԉ*W{59D) gh~vO`EED24$GmVYI4:,ض/k<yL#ԴQcݓ7"ql%t^tk45=of)Zzo㕧mQoN  +iwFA|z=`c~ E̪O Lf[Q]7=[8uk]{Rxd($j߲[9|N?tpn6N]Xfaw Fw %TFqXX|a9la_eݩ,4=s4Rv8NcD4uFg=]82=ai2+||cQQ~*x~Җ8!/Dko83]1adz:,O+|$!%md@z22Ӹ}&}%agg Lڃ0̙⤥q1 |^sj^#=Pb@]*e#yunO\ +}{[?,x_r4S ĹZٙӍ 1%96 \KÛ"!ǜJ25Ú͢?5w ^-'swf :.$dx1p7fr'̺W|6 rRo(̮{[!Q w< ɻ^?6rJrN碍f W}CM<qa.p2\$mwIS0t-~ ~ͫIB= (N ktDDRiWhmM٫QTld2|ɋz}BSn$`j1wJ硪։Fj!]s}cN 9L{c'؟5᭡+V tJIy*3 1ilAAEQ-?U<8@ JY PIaڪ&ңHuu44#&Qe\(=w`$8L`6Աs51 nx00tlj.0F@:ndUoӔWgXhU(ӡrߴYs߭0lW'Gv͋jTzIA۪۬}`Gs]8@~…E qboO5晎Bh19@KPAk""HDO<@|=#*/r1H}AVTG?yLs /g-6ޙ4)JGydfTJ8܀v̔# JƔ6§i6^Y}' ؂Apb>&}LRӳ)q]?4Bqa>u)䢰!I~k0+W5m/m'B? -^{짓jb+ߙft8N:T2)Ǵ^Uߍo`rj/߶e >8"}ug*l'$qb>'8΀^)O&H{ 2KjY4qp Ƹg(=K8.}Cvb57Ulj}Q 92kfjƴ<3NU֮Hy]BL,sbWYa2z8Beo\ɵnQ"QP±^t%rnf.뛚y=,'Z v8@bwvAvvr>x)Th,po0 GknS"9 R}70B7Wg)&v9[8B'lߠl'KOWja%3h̛QAU=Kw\GU4=fg+Eq-ဂv 7W6?Vu)8fQ5 ˛=Φ[CV59K:ʠj}Xs^˃ M[#Dy׫i'M/sLDRֹl(P+_c$a BҊ6}mo3tO3+_k › L+.ipgM3? WPEA-{M)WTق`d`W ;oo;{. RחIT 0d]|7|7|9H*7ݲ x a oo!nZ?@`:HH=la!"2PoN.h3eB"L1ku|7|A5!ku|7|7qyFOZ|7|7GPm|7|CS!nZ?@`:HH=la!"H1OpzuPh)<RCp!nL#dYahTJ@P?E";0:uC`? ۯooES|7|7|7~mooo2ooo1O0 B_Qh $$B0wz1𢔲yvC5z:}0rV jFHP@vhjIFr>^21v1J!.tw7Αy'GQ^뛦wPML d qEV Jׯ2 ll`i*4JCPz><_ ۿTRB@0ڭicnV Bdesmume-0.9.9/src/cocoa/Info (Legacy Debug).plist0000644000175000017500000003032612140261603022061 0ustar guillaumeguillaume CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions nds CFBundleTypeIconFile AppIcon_NintendoDS_ROM.icns CFBundleTypeName Nintendo DS ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions ds.gba CFBundleTypeIconFile AppIcon_NintendoGBA_ROM.icns CFBundleTypeName Gameboy Advance ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dst CFBundleTypeIconFile AppIcon_SaveState.icns CFBundleTypeName DeSmuME Save State CFBundleTypeRole Editor LSItemContentTypes com.desmume.savestate LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dsv CFBundleTypeIconFile AppIcon_ROMSave.icns CFBundleTypeName DeSmuME ROM Save CFBundleTypeRole Editor LSItemContentTypes com.desmume.romsave LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dfc CFBundleTypeIconFile AppIcon_FirmwareConfig.icns CFBundleTypeName DeSmuME Firmware Configuration CFBundleTypeRole Editor LSItemContentTypes com.desmume.firmwareconfig LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dct CFBundleTypeIconFile AppIcon_ROMCheats.icns CFBundleTypeName DeSmuME ROM Cheats CFBundleTypeRole Editor LSItemContentTypes com.desmume.romcheats LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions sav CFBundleTypeIconFile AppIcon_NoGBA_ROMSave.icns CFBundleTypeName No$GBA ROM Save CFBundleTypeRole Viewer LSItemContentTypes de.emubase.nocash.romsave.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions duc CFBundleTypeIconFile AppIcon_ActionReplaySave.icns CFBundleTypeName Action Replay Save CFBundleTypeRole Viewer LSItemContentTypes com.codejunkies.actionreplay.save.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions bin CFBundleTypeIconFile AppIcon_HWImage_NDS.icns CFBundleTypeName Nintendo DS Hardware Image CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.hwimage.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions xml CFBundleTypeIconFile AppIcon_ADVANsCEneDatabase.icns CFBundleTypeName ADVANsCEne Database CFBundleTypeRole Viewer LSItemContentTypes com.advanscene.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dat CFBundleTypeIconFile AppIcon_R4CheatDatabase.icns CFBundleTypeName R4 Cheats Database CFBundleTypeRole Viewer LSItemContentTypes net.gbatemp.cheats.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleExecutable ${PRODUCT_NAME} CFBundleIconFile AppIcon_DeSmuME CFBundleIdentifier org.desmume.DeSmuME CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString v0.9.9 (Debug) CFBundleSignature DSmM CFBundleVersion 0.9.9 LSApplicationCategoryType public.app-category.entertainment LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright Copyright ©2012 DeSmuME Team. All rights reserved. NSMainNibFile MainMenu (Legacy) NSPrincipalClass NSApplication UTExportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription DeSmuME Save State UTTypeIconFile AppIcon_SaveState.icns UTTypeIdentifier com.desmume.savestate UTTypeTagSpecification public.filename-extension dst UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Save UTTypeIconFile AppIcon_ROMSave.icns UTTypeIdentifier com.desmume.romsave UTTypeTagSpecification public.filename-extension dsv UTTypeConformsTo public.data UTTypeDescription DeSmuME Firmware Configuration UTTypeIconFile AppIcon_FirmwareConfig.icns UTTypeIdentifier com.desmume.firmwareconfig UTTypeTagSpecification public.filename-extension dfc UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Cheats UTTypeIconFile AppIcon_ROMCheats.icns UTTypeIdentifier com.desmume.romcheats UTTypeTagSpecification public.filename-extension dct UTImportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription Nintendo DS ROM UTTypeIconFile AppIcon_NintendoDS_ROM.icns UTTypeIdentifier com.nintendo.rom.ds UTTypeTagSpecification public.filename-extension nds UTTypeConformsTo public.data UTTypeDescription Gameboy Advance ROM UTTypeIconFile AppIcon_NintendoGBA_ROM.icns UTTypeIdentifier com.nintendo.rom.gba UTTypeTagSpecification public.filename-extension ds.gba UTTypeConformsTo public.data UTTypeDescription No$GBA ROM Save UTTypeIconFile AppIcon_NoGBA_ROMSave.icns UTTypeIdentifier de.emubase.nocash.romsave.gba UTTypeTagSpecification public.filename-extension sav UTTypeConformsTo public.data UTTypeDescription Action Replay Save UTTypeIconFile AppIcon_ActionReplaySave.icns UTTypeIdentifier com.codejunkies.actionreplay.save.nintendo.ds UTTypeTagSpecification public.filename-extension duc UTTypeConformsTo public.data UTTypeDescription Nintendo DS Hardware Image UTTypeIconFile AppIcon_HWImage_NDS.icns UTTypeIdentifier com.nintendo.hwimage.ds UTTypeTagSpecification public.filename-extension bin UTTypeConformsTo public.xml UTTypeDescription ADVANsCEne Database UTTypeIconFile AppIcon_ADVANsCEneDatabase.icns UTTypeIdentifier com.advanscene.database.nintendo.ds UTTypeTagSpecification public.filename-extension xml UTTypeConformsTo public.data UTTypeDescription R4 Cheats Database UTTypeIconFile AppIcon_R4CheatDatabase.icns UTTypeIdentifier net.gbatemp.cheats.database.nintendo.ds UTTypeTagSpecification public.filename-extension dat desmume-0.9.9/src/cocoa/utilities.h0000644000175000017500000000411312140261603017753 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _COCOA_PORT_UTILITIES_ #define _COCOA_PORT_UTILITIES_ #include #include #include #ifdef __cplusplus extern "C" { #endif bool IsOSXVersionSupported(const unsigned int major, const unsigned int minor, const unsigned int revision); uint32_t RGB555ToRGBA8888(const uint16_t color16); uint32_t RGBA8888ForceOpaque(const uint32_t color32); void RGB555ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels); void RGBA8888ForceOpaqueBuffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels); CGSize GetTransformedBounds(const double normalBoundsWidth, const double normalBoundsHeight, const double scalar, const double angleDegrees); double GetMaxScalarInBounds(const double normalBoundsWidth, const double normalBoundsHeight, const double keepInBoundsWidth, const double keepInBoundsHeight); CGPoint GetNormalPointFromTransformedPoint(const double transformedPointX, const double transformedPointY, const double normalBoundsWidth, const double normalBoundsHeight, const double transformBoundsWidth, const double transformBoundsHeight, const double scalar, const double angleDegrees); uint32_t GetNearestPositivePOT(uint32_t value); #ifdef __cplusplus } #endif #endif // _COCOA_PORT_UTILITIES_ desmume-0.9.9/src/cocoa/preferences_legacy.h0000644000175000017500000000346112140261603021572 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif #define PREF_EXECUTE_UPON_LOAD @"Execute Upon Load" #define PREF_AFTER_LAUNCHED @"When Launching, Load" #define PREF_AFTER_LAUNCHED_OPTION_NOTHING @"Load Nothing" #define PREF_AFTER_LAUNCHED_OPTION_LAST_ROM @"Load Last ROM" #ifdef GDB_STUB #define PREF_ARM9_GDB_PORT @"arm9gdb" #define PREF_ARM7_GDB_PORT @"arm7gdb" #endif #define PREF_KEY_A @"A Button" #define PREF_KEY_B @"B Button" #define PREF_KEY_X @"X Button" #define PREF_KEY_Y @"Y Button" #define PREF_KEY_L @"L Button" #define PREF_KEY_R @"R Button" #define PREF_KEY_UP @"Up Button" #define PREF_KEY_DOWN @"Down Button" #define PREF_KEY_LEFT @"Left Button" #define PREF_KEY_RIGHT @"Right Button" #define PREF_KEY_START @"Start Button" #define PREF_KEY_SELECT @"Select Button" void setAppDefaults(); //this is defined in preferences.m and should be called at app launch NSView *createPreferencesView(NSString *helpinfo, NSDictionary *options, id delegate); //utility func for creating a preference panel with a set of options desmume-0.9.9/src/cocoa/Makefile.am0000644000175000017500000000253212140261603017626 0ustar guillaumeguillaumeEXTRA_DIST = cocoa_util.m DeSmuME.cbp globals.h main.mm main_window.h main_window.mm nds_control.h nds_control.mm preferences.mm \ about.m DeSmuME.icns Info.plist InfoPlist.strings input.h input.mm \ makeapp.sh PkgInfo preferences.h screenshot.h screenshot.mm \ screen_state.h screen_state.m sndOSX.h sndOSX.mm video_output_view.h video_output_view.mm \ DeSmuME.xcodeproj/project.pbxproj Rakefile \ dialogs/rom_info.h dialogs/rom_info.m dialogs/speed_limit_selection_window.h dialogs/speed_limit_selection_window.mm \ translations/English.lproj/Localizable.strings translations/English.lproj/MainMenu.nib/classes.nib \ translations/English.lproj/MainMenu.nib/info.nib translations/English.lproj/MainMenu.nib/keyedobjects.nib \ translations/French.lproj/Localizable.strings translations/French.lproj/MainMenu.nib/classes.nib \ translations/French.lproj/MainMenu.nib/info.nib translations/French.lproj/MainMenu.nib/keyedobjects.nib \ translations/Italian.lproj/Localizable.strings translations/Italian.lproj/MainMenu.nib/classes.nib \ translations/Italian.lproj/MainMenu.nib/info.nib translations/Italian.lproj/MainMenu.nib/keyedobjects.nib \ translations/Japanese.lproj/Localizable.strings translations/Japanese.lproj/MainMenu.nib/classes.nib \ translations/Japanese.lproj/MainMenu.nib/info.nib translations/Japanese.lproj/MainMenu.nib/keyedobjects.nib desmume-0.9.9/src/cocoa/utilities.c0000644000175000017500000003602412140261603017754 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "utilities.h" #include static CFStringRef OSXProductName = NULL; static CFStringRef OSXProductVersion = NULL; static CFStringRef OSXProductBuildVersion = NULL; static unsigned int OSXVersionMajor = 0; static unsigned int OSXVersionMinor = 0; static unsigned int OSXVersionRevision = 0; static bool isSystemVersionAlreadyRead = false; static void ReadSystemVersionPListFile() { // Read the SystemVersion.plist file. CFDataRef resourceData = NULL; CFURLRef systemPListURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/System/Library/CoreServices/SystemVersion.plist"), kCFURLPOSIXPathStyle, false); Boolean status = CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault, systemPListURL, &resourceData, NULL, NULL, NULL); if (!status) { CFRelease(systemPListURL); return; } CFDictionaryRef systemDict = (CFDictionaryRef)CFPropertyListCreateFromXMLData(kCFAllocatorDefault, resourceData, kCFPropertyListImmutable, NULL); if (systemDict == NULL) { CFRelease(resourceData); CFRelease(systemPListURL); return; } // Get the system version string. if (OSXProductVersion != NULL) { CFRelease(OSXProductVersion); } OSXProductVersion = (CFStringRef)CFDictionaryGetValue(systemDict, CFSTR("ProductVersion")); if (OSXProductVersion != NULL) { // Copy the system version. CFRetain(OSXProductVersion); char versionCString[256] = {0}; CFStringGetCString(OSXProductVersion, versionCString, 256, kCFStringEncodingUTF8); sscanf(versionCString, "%u.%u.%u", &OSXVersionMajor, &OSXVersionMinor, &OSXVersionRevision); } if (OSXProductName != NULL) { CFRelease(OSXProductName); } OSXProductName = (CFStringRef)CFDictionaryGetValue(systemDict, CFSTR("ProductName")); if (OSXProductName != NULL) { CFRetain(OSXProductName); } if (OSXProductBuildVersion != NULL) { CFRelease(OSXProductBuildVersion); } OSXProductBuildVersion = (CFStringRef)CFDictionaryGetValue(systemDict, CFSTR("ProductBuildVersion")); if (OSXProductBuildVersion != NULL) { CFRetain(OSXProductBuildVersion); } // Release all resources now that the system version string has been copied. CFRelease(resourceData); CFRelease(systemPListURL); CFRelease(systemDict); // Mark that we've already read the SystemVersion.plist file so that we don't // have to do this again. isSystemVersionAlreadyRead = true; } bool IsOSXVersionSupported(const unsigned int major, const unsigned int minor, const unsigned int revision) { bool result = false; if (!isSystemVersionAlreadyRead) { ReadSystemVersionPListFile(); } if (isSystemVersionAlreadyRead && ((OSXVersionMajor > major) || (OSXVersionMajor >= major && OSXVersionMinor > minor) || (OSXVersionMajor >= major && OSXVersionMinor >= minor && OSXVersionRevision >= revision)) ) { result = true; } return result; } /******************************************************************************************** RGB555ToRGBA8888() - INLINE Converts a color from 15-bit RGB555 format into 32-bit RGBA8888 format. Takes: color16 - The pixel in 15-bit RGB555 format. Returns: A 32-bit unsigned integer containing the RGBA8888 formatted color. Details: The input and output pixels are expected to have little-endian byte order. ********************************************************************************************/ inline uint32_t RGB555ToRGBA8888(const uint16_t color16) { return ((color16 & 0x001F) << 3) | ((color16 & 0x03E0) << 6) | ((color16 & 0x7C00) << 9) | 0xFF000000; } /******************************************************************************************** RGBA8888ForceOpaque() - INLINE Forces the alpha channel of a 32-bit RGBA8888 color to a value of 0xFF. Takes: color32 - The pixel in 32-bit RGBA8888 format. Returns: A 32-bit unsigned integer containing the RGBA8888 formatted color. Details: The input and output pixels are expected to have little-endian byte order. ********************************************************************************************/ inline uint32_t RGBA8888ForceOpaque(const uint32_t color32) { return color32 | 0xFF000000; } /******************************************************************************************** RGB555ToRGBA8888Buffer() Copies a 15-bit RGB555 pixel buffer into a 32-bit RGBA8888 pixel buffer. Takes: srcBuffer - Pointer to the source 15-bit RGB555 pixel buffer. destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer. numberPixels - The number of pixels to copy. Returns: Nothing. Details: The source and destination pixels are expected to have little-endian byte order. Also, it is the caller's responsibility to ensure that the source and destination buffers are large enough to accomodate the requested number of pixels. ********************************************************************************************/ void RGB555ToRGBA8888Buffer(const uint16_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels) { const uint32_t *__restrict__ destBufferEnd = destBuffer + numberPixels; while (destBuffer < destBufferEnd) { *destBuffer++ = RGB555ToRGBA8888(*srcBuffer++); } } /******************************************************************************************** RGBA8888ForceOpaqueBuffer() Copies a 32-bit RGBA8888 pixel buffer into another 32-bit RGBA8888 pixel buffer. The pixels in the destination buffer will have an alpha value of 0xFF. Takes: srcBuffer - Pointer to the source 32-bit RGBA8888 pixel buffer. destBuffer - Pointer to the destination 32-bit RGBA8888 pixel buffer. numberPixels - The number of pixels to copy. Returns: Nothing. Details: The source and destination pixels are expected to have little-endian byte order. Also, it is the caller's responsibility to ensure that the source and destination buffers are large enough to accomodate the requested number of pixels. ********************************************************************************************/ void RGBA8888ForceOpaqueBuffer(const uint32_t *__restrict__ srcBuffer, uint32_t *__restrict__ destBuffer, unsigned int numberPixels) { const uint32_t *__restrict__ destBufferEnd = destBuffer + numberPixels; while (destBuffer < destBufferEnd) { *destBuffer++ = RGBA8888ForceOpaque(*srcBuffer++); } } /******************************************************************************************** GetTransformedBounds() Returns the bounds of a normalized 2D surface using affine transformations. Takes: normalBoundsWidth - The width of the normal 2D surface. normalBoundsHeight - The height of the normal 2D surface. scalar - The scalar used to transform the 2D surface. angleDegrees - The rotation angle, in degrees, to transform the 2D surface. Returns: The bounds of a normalized 2D surface using affine transformations. Details: The returned bounds is always a normal rectangle. Ignoring the scaling, the returned bounds will always be at its smallest when the angle is at 0, 90, 180, or 270 degrees, and largest when the angle is at 45, 135, 225, or 315 degrees. ********************************************************************************************/ CGSize GetTransformedBounds(const double normalBoundsWidth, const double normalBoundsHeight, const double scalar, const double angleDegrees) { const double angleRadians = angleDegrees * (M_PI/180.0); // The points are as follows: // // (x[3], y[3]) (x[2], y[2]) // // // // (x[0], y[0]) (x[1], y[1]) // Do our scale and rotate transformations. #ifdef __ACCELERATE__ // Note that although we only need to calculate 3 points, we include 4 points // here because Accelerate prefers 16-byte alignment. double x[] = {0.0, normalBoundsWidth, normalBoundsWidth, 0.0}; double y[] = {0.0, 0.0, normalBoundsHeight, normalBoundsHeight}; cblas_drot(4, x, 1, y, 1, scalar * cos(angleRadians), scalar * sin(angleRadians)); #else // Keep a C-version of this transformation for reference purposes. const double w = scalar * normalBoundsWidth; const double h = scalar * normalBoundsHeight; const double d = hypot(w, h); const double dAngle = atan2(h, w); const double px = w * cos(angleRadians); const double py = w * sin(angleRadians); const double qx = d * cos(dAngle + angleRadians); const double qy = d * sin(dAngle + angleRadians); const double rx = h * cos((M_PI/2.0) + angleRadians); const double ry = h * sin((M_PI/2.0) + angleRadians); const double x[] = {0.0, px, qx, rx}; const double y[] = {0.0, py, qy, ry}; #endif // Determine the transformed width, which is dependent on the location of // the x-coordinate of point (x[2], y[2]). CGSize transformBounds = {0.0, 0.0}; if (x[2] > 0.0) { if (x[2] < x[3]) { transformBounds.width = x[3] - x[1]; } else if (x[2] < x[1]) { transformBounds.width = x[1] - x[3]; } else { transformBounds.width = x[2]; } } else if (x[2] < 0.0) { if (x[2] > x[3]) { transformBounds.width = -(x[3] - x[1]); } else if (x[2] > x[1]) { transformBounds.width = -(x[1] - x[3]); } else { transformBounds.width = -x[2]; } } else { transformBounds.width = abs(x[1] - x[3]); } // Determine the transformed height, which is dependent on the location of // the y-coordinate of point (x[2], y[2]). if (y[2] > 0.0) { if (y[2] < y[3]) { transformBounds.height = y[3] - y[1]; } else if (y[2] < y[1]) { transformBounds.height = y[1] - y[3]; } else { transformBounds.height = y[2]; } } else if (y[2] < 0.0) { if (y[2] > y[3]) { transformBounds.height = -(y[3] - y[1]); } else if (y[2] > y[1]) { transformBounds.height = -(y[1] - y[3]); } else { transformBounds.height = -y[2]; } } else { transformBounds.height = abs(y[3] - y[1]); } return transformBounds; } /******************************************************************************************** GetMaxScalarInBounds() Returns the maximum scalar that a rectangle can grow, while maintaining its aspect ratio, within a boundary. Takes: normalBoundsWidth - The width of the normal 2D surface. normalBoundsHeight - The height of the normal 2D surface. keepInBoundsWidth - The width of the keep-in 2D surface. keepInBoundsHeight - The height of the keep-in 2D surface. Returns: The maximum scalar that a rectangle can grow, while maintaining its aspect ratio, within a boundary. Details: If keepInBoundsWidth or keepInBoundsHeight are less than or equal to zero, the returned scalar will be zero. ********************************************************************************************/ double GetMaxScalarInBounds(const double normalBoundsWidth, const double normalBoundsHeight, const double keepInBoundsWidth, const double keepInBoundsHeight) { const double maxX = (normalBoundsWidth <= 0.0) ? 0.0 : keepInBoundsWidth / normalBoundsWidth; const double maxY = (normalBoundsHeight <= 0.0) ? 0.0 : keepInBoundsHeight / normalBoundsHeight; return (maxX <= maxY) ? maxX : maxY; } /******************************************************************************************** GetNormalPointFromTransformedPoint() Returns a normalized point from a point from a 2D transformed surface. Takes: transformedPointX - The X coordinate of a 2D point as it exists on a 2D transformed surface. transformedPointY - The Y coordinate of a 2D point as it exists on a 2D transformed surface. normalBoundsWidth - The width of the normal 2D surface. normalBoundsHeight - The height of the normal 2D surface. transformBoundsWidth - The width of the transformed 2D surface. transformBoundsHeight - The height of the transformed 2D surface. scalar - The scalar used on the transformed 2D surface. angleDegrees - The rotation angle, in degrees, of the transformed 2D surface. Returns: A normalized point from a point from a 2D transformed surface. Details: It may help to call GetTransformedBounds() for the transformBounds parameter. ********************************************************************************************/ CGPoint GetNormalPointFromTransformedPoint(const double transformedPointX, const double transformedPointY, const double normalBoundsWidth, const double normalBoundsHeight, const double transformBoundsWidth, const double transformBoundsHeight, const double scalar, const double angleDegrees) { // Get the coordinates of the transformed point and translate the coordinate // system so that the origin becomes the center. const double transformedX = transformedPointX - (transformBoundsWidth / 2.0); const double transformedY = transformedPointY - (transformBoundsHeight / 2.0); // Perform rect-polar conversion. // Get the radius r with respect to the origin. const double r = hypot(transformedX, transformedY) / scalar; // Get the angle theta with respect to the origin. double theta = 0.0; if (transformedX == 0.0) { if (transformedY > 0.0) { theta = M_PI / 2.0; } else if (transformedY < 0.0) { theta = M_PI * 1.5; } } else if (transformedX < 0.0) { theta = M_PI - atan2(transformedY, -transformedX); } else if (transformedY < 0.0) { theta = atan2(transformedY, transformedX) + (M_PI * 2.0); } else { theta = atan2(transformedY, transformedX); } // Get the normalized angle and use it to rotate about the origin. // Then do polar-rect conversion and translate back to transformed coordinates // with a 0 degree rotation. const double angleRadians = angleDegrees * (M_PI/180.0); const double normalizedAngle = theta - angleRadians; const double normalizedX = (r * cos(normalizedAngle)) + (normalBoundsWidth / 2.0); const double normalizedY = (r * sin(normalizedAngle)) + (normalBoundsHeight / 2.0); return CGPointMake(normalizedX, normalizedY); } /******************************************************************************************** GetNearestPositivePOT() Returns the next highest power of two of a 32-bit integer value. Takes: value - A 32-bit integer value. Returns: A 32-bit integer with the next highest power of two compared to the input value. Details: If the input value is already a power of two, this function returns the same value. ********************************************************************************************/ uint32_t GetNearestPositivePOT(uint32_t value) { value--; value |= value >> 1; value |= value >> 2; value |= value >> 4; value |= value >> 8; value |= value >> 16; value++; return value; } desmume-0.9.9/src/cocoa/sndOSX.h0000644000175000017500000000326012140261603017120 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2007-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _OSXSOUNDINTERFACE_ #define _OSXSOUNDINTERFACE_ #include #include "../SPU.h" #undef BOOL #define SNDCORE_OSX 58325 //hopefully this is unique number extern SoundInterface_struct SNDOSX; // Sound interface to the SPU extern pthread_mutex_t *mutexAudioEmulateCore; // Mutex for the emulation core - used when mixing audio in Dual Synch/Asynch mode in post-process // Core Audio functions for the sound interface int SNDOSXInit(int buffer_size); void SNDOSXDeInit(); int SNDOSXReset(); void SNDOSXUpdateAudio(s16 *buffer, u32 num_samples); u32 SNDOSXGetAudioSpace(); void SNDOSXMuteAudio(); void SNDOSXUnMuteAudio(); void SNDOSXSetVolume(int volume); void SNDOSXClearBuffer(); void SNDOSXFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t SNDOSXPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); #endif // _OSXSOUNDINTERFACE_ desmume-0.9.9/src/cocoa/cocoa_core.h0000644000175000017500000001012612140261603020035 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include #include #include #import "cocoa_util.h" @class CocoaDSController; @class CocoaDSFirmware; @class CocoaDSGPU; @class CocoaDSOutput; typedef struct { void *cdsCore; void *cdsController; int state; bool isFrameSkipEnabled; unsigned int frameCount; unsigned int framesToSkip; uint64_t timeBudgetMachAbsTime; bool exitThread; pthread_mutex_t mutexCoreExecute; pthread_mutex_t mutexOutputList; pthread_mutex_t mutexThreadExecute; pthread_cond_t condThreadExecute; } CoreThreadParam; @interface CocoaDSCore : CocoaDSThread { CocoaDSController *cdsController; CocoaDSFirmware *cdsFirmware; CocoaDSGPU *cdsGPU; NSMutableArray *cdsOutputList; pthread_t coreThread; CoreThreadParam threadParam; NSInteger prevCoreState; BOOL isSpeedLimitEnabled; CGFloat speedScalar; std::string _slot1R4Path; NSUInteger emulationFlags; BOOL emuFlagAdvancedBusLevelTiming; BOOL emuFlagRigorousTiming; BOOL emuFlagUseExternalBios; BOOL emuFlagEmulateBiosInterrupts; BOOL emuFlagPatchDelayLoop; BOOL emuFlagUseExternalFirmware; BOOL emuFlagFirmwareBoot; BOOL emuFlagDebugConsole; BOOL emuFlagEmulateEnsata; NSInteger cpuEmulationEngine; NSInteger slot1DeviceType; NSString *slot1StatusText; NSURL *slot1R4URL; OSSpinLock spinlockCdsController; OSSpinLock spinlockMasterExecute; OSSpinLock spinlockExecutionChange; OSSpinLock spinlockCheatEnableFlag; OSSpinLock spinlockEmulationFlags; OSSpinLock spinlockCPUEmulationEngine; } @property (retain) CocoaDSController *cdsController; @property (retain) CocoaDSFirmware *cdsFirmware; @property (retain) CocoaDSGPU *cdsGPU; @property (assign) NSMutableArray *cdsOutputList; @property (assign) BOOL masterExecute; @property (assign) BOOL isFrameSkipEnabled; @property (assign) NSInteger coreState; @property (assign) BOOL isSpeedLimitEnabled; @property (assign) BOOL isCheatingEnabled; @property (assign) CGFloat speedScalar; @property (assign) NSUInteger emulationFlags; @property (assign) BOOL emuFlagAdvancedBusLevelTiming; @property (assign) BOOL emuFlagRigorousTiming; @property (assign) BOOL emuFlagUseExternalBios; @property (assign) BOOL emuFlagEmulateBiosInterrupts; @property (assign) BOOL emuFlagPatchDelayLoop; @property (assign) BOOL emuFlagUseExternalFirmware; @property (assign) BOOL emuFlagFirmwareBoot; @property (assign) BOOL emuFlagDebugConsole; @property (assign) BOOL emuFlagEmulateEnsata; @property (assign) NSInteger cpuEmulationEngine; @property (assign) NSInteger maxJITBlockSize; @property (assign) NSInteger slot1DeviceType; @property (assign) NSString *slot1StatusText; @property (copy) NSURL *arm9ImageURL; @property (copy) NSURL *arm7ImageURL; @property (copy) NSURL *firmwareImageURL; @property (retain) NSURL *slot1R4URL; @property (readonly) pthread_mutex_t *mutexCoreExecute; + (BOOL) startupCore; + (void) shutdownCore; + (BOOL) isCoreStarted; - (BOOL) ejectCardFlag; - (void) setEjectCardFlag; - (void) slot1Eject; - (void) changeRomSaveType:(NSInteger)saveTypeID; - (void) changeExecutionSpeed; - (void) applyDynaRec; - (BOOL) applySlot1Device; - (void) restoreCoreState; - (void) reset; - (void) addOutput:(CocoaDSOutput *)theOutput; - (void) removeOutput:(CocoaDSOutput *)theOutput; - (void) removeAllOutputs; @end static void* RunCoreThread(void *arg); static void CoreFrameSkip(uint64_t timeBudgetMachAbsoluteTime, uint64_t frameStartMachAbsoluteTime, unsigned int *outFramesToSkip); desmume-0.9.9/src/cocoa/mic_ext.h0000644000175000017500000000255012140261603017373 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _MIC_EXTENSION_ #define _MIC_EXTENSION_ #include "audiosamplegenerator.h" #include "ringbuffer.h" #ifdef __cplusplus extern "C" { #endif bool Mic_GetUseBufferedSource(); void Mic_SetUseBufferedSource(bool theState); AudioGenerator* Mic_GetSelectedDirectSampleGenerator(); void Mic_SetSelectedDirectSampleGenerator(AudioGenerator *theGenerator); extern RingBuffer micInputBuffer; extern NullGenerator nullSampleGenerator; extern InternalNoiseGenerator internalNoiseGenerator; extern WhiteNoiseGenerator whiteNoiseGenerator; extern SineWaveGenerator sineWaveGenerator; extern AudioGenerator *selectedGeneratorDirect; #ifdef __cplusplus } #endif #endif // _MIC_EXTENSION_ desmume-0.9.9/src/cocoa/openemu/0000755000175000017500000000000012140306213017235 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/openemu/Info (OpenEmu Plug-in).plist0000644000175000017500000000257612140261562024174 0ustar guillaumeguillaume CFBundleDevelopmentRegion English CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier org.desmume.DeSmuME-OpenEmu CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType BNDL CFBundleShortVersionString v0.9.9 (OpenEmu Plug-in) CFBundleSignature ???? CFBundleVersion 0.9.9 CSResourcesFileMapped yes NSHumanReadableCopyright Copyright © 2012-2013 DeSmuME Team. All rights reserved. NSPrincipalClass OEGameCoreController OEGameCoreClass NDSGameCore OEGameCorePlayerCount 1 OEProjectURL http://desmume.org/ OESystemIdentifiers openemu.system.nds SUFeedURL http://openemu.org/updater/desmume_appcast.xml SUEnableAutomaticChecks 1 desmume-0.9.9/src/cocoa/openemu/OESoundInterface.h0000644000175000017500000000310012140261562022544 0ustar guillaumeguillaume/* Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include "../../SPU.h" #define SNDCORE_OPENEMU 58326 // Sound interface to the SPU extern SoundInterface_struct SNDOpenEmu; // Ring buffer extern OERingBuffer *openEmuSoundInterfaceBuffer; #ifdef __cplusplus extern "C" { #endif // OpenEmu functions for the sound interface int SNDOpenEmuInit(int buffer_size); void SNDOpenEmuDeInit(); int SNDOpenEmuReset(); void SNDOpenEmuUpdateAudio(s16 *buffer, u32 num_samples); u32 SNDOpenEmuGetAudioSpace(); void SNDOpenEmuMuteAudio(); void SNDOpenEmuUnMuteAudio(); void SNDOpenEmuSetVolume(int volume); void SNDOpenEmuClearBuffer(); void SNDOpenEmuFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); size_t SNDOpenEmuPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer); #ifdef __cplusplus } #endif desmume-0.9.9/src/cocoa/openemu/NDSGameCore.h0000644000175000017500000000270112140261562021444 0ustar guillaumeguillaume/* Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #import #import "OENDSSystemResponderClient.h" #include #include @class CocoaDSController; @class CocoaDSGPU; @class CocoaDSFirmware; @interface NDSGameCore : OEGameCore { NSPoint touchLocation; CocoaDSController *cdsController; CocoaDSGPU *cdsGPU; CocoaDSFirmware *cdsFirmware; NSInteger displayMode; OEIntRect displayRect; OEIntSize displayAspectRatio; NSInteger inputID[OENDSButtonCount]; // Key = OpenEmu's input ID, Value = DeSmuME's input ID OSSpinLock spinlockDisplayMode; pthread_mutex_t mutexCoreExecute; } @property (retain) CocoaDSController *cdsController; @property (retain) CocoaDSGPU *cdsGPU; @property (retain) CocoaDSFirmware *cdsFirmware; @property (assign) NSInteger displayMode; @end desmume-0.9.9/src/cocoa/openemu/OESoundInterface.mm0000644000175000017500000000736712140261562022751 0ustar guillaumeguillaume/* Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "OESoundInterface.h" #import "cocoa_globals.h" OERingBuffer *openEmuSoundInterfaceBuffer = nil; static pthread_mutex_t *mutexAudioSampleReadWrite = NULL; pthread_mutex_t *mutexAudioEmulateCore = NULL; // Sound interface to the SPU SoundInterface_struct SNDOpenEmu = { SNDCORE_OPENEMU, "OpenEmu Sound Interface", SNDOpenEmuInit, SNDOpenEmuDeInit, SNDOpenEmuUpdateAudio, SNDOpenEmuGetAudioSpace, SNDOpenEmuMuteAudio, SNDOpenEmuUnMuteAudio, SNDOpenEmuSetVolume, SNDOpenEmuClearBuffer, SNDOpenEmuFetchSamples, SNDOpenEmuPostProcessSamples }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDOpenEmu, NULL }; int SNDOpenEmuInit(int buffer_size) { [openEmuSoundInterfaceBuffer setLength:buffer_size]; if (mutexAudioSampleReadWrite == NULL) { mutexAudioSampleReadWrite = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(mutexAudioSampleReadWrite, NULL); } return 0; } void SNDOpenEmuDeInit() { if (mutexAudioSampleReadWrite != NULL) { pthread_mutex_destroy(mutexAudioSampleReadWrite); free(mutexAudioSampleReadWrite); mutexAudioSampleReadWrite = NULL; } } int SNDOpenEmuReset() { // Do nothing. The OpenEmu frontend will take care of this. return 0; } void SNDOpenEmuUpdateAudio(s16 *buffer, u32 num_samples) { [openEmuSoundInterfaceBuffer write:buffer maxLength:num_samples * SPU_SAMPLE_SIZE]; } u32 SNDOpenEmuGetAudioSpace() { return (u32)[openEmuSoundInterfaceBuffer usedBytes] / SPU_SAMPLE_SIZE; } void SNDOpenEmuMuteAudio() { // Do nothing. The OpenEmu frontend will take care of this. } void SNDOpenEmuUnMuteAudio() { // Do nothing. The OpenEmu frontend will take care of this. } void SNDOpenEmuSetVolume(int volume) { // Do nothing. The OpenEmu frontend will take care of this. } void SNDOpenEmuClearBuffer() { // Do nothing. The OpenEmu frontend will take care of this. } void SNDOpenEmuFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { if (mutexAudioSampleReadWrite == NULL) { return; } pthread_mutex_lock(mutexAudioSampleReadWrite); SPU_DefaultFetchSamples(sampleBuffer, sampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioSampleReadWrite); } size_t SNDOpenEmuPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { size_t processedSampleCount = 0; switch (synchMode) { case ESynchMode_DualSynchAsynch: if (mutexAudioEmulateCore != NULL) { pthread_mutex_lock(mutexAudioEmulateCore); processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, requestedSampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioEmulateCore); } break; case ESynchMode_Synchronous: if (mutexAudioSampleReadWrite != NULL) { pthread_mutex_lock(mutexAudioSampleReadWrite); processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, requestedSampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioSampleReadWrite); } break; default: break; } return processedSampleCount; } desmume-0.9.9/src/cocoa/openemu/DeSmuME_Prefix_OpenEmu.pch0000644000175000017500000000154012140261562024144 0ustar guillaumeguillaume/* Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifdef __OBJC__ #define OBJ_C #endif #define DESMUME_COCOA #define HAVE_OPENGL #define HAVE_LIBZ #if defined(__i386__) || defined(__x86_64__) #define HAVE_JIT #endif #define PORT_VERSION "OpenEmu"desmume-0.9.9/src/cocoa/openemu/OENDSSystemResponderClient.h0000644000175000017500000000256012140261562024516 0ustar guillaumeguillaume/* Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import @protocol OESystemResponderClient; typedef enum _OENDSButton { OENDSButtonUp, OENDSButtonDown, OENDSButtonLeft, OENDSButtonRight, OENDSButtonA, OENDSButtonB, OENDSButtonX, OENDSButtonY, OENDSButtonL, OENDSButtonR, OENDSButtonStart, OENDSButtonSelect, OENDSButtonMicrophone, OENDSButtonLid, OENDSButtonDebug, OENDSButtonCount } OENDSButton; @protocol OENDSSystemResponderClient - (oneway void)didPushNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player; - (oneway void)didReleaseNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player; - (oneway void)didTouchScreenPoint:(OEIntPoint)aPoint; - (oneway void)didReleaseTouch; @end desmume-0.9.9/src/cocoa/openemu/NDSGameCore.mm0000644000175000017500000002327112140261562021633 0ustar guillaumeguillaume/* Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "NDSGameCore.h" #import "cocoa_globals.h" #import "cocoa_file.h" #import "cocoa_firmware.h" #import "cocoa_GPU.h" #import "cocoa_input.h" #import "cocoa_core.h" #import "cocoa_output.h" #import "OESoundInterface.h" #import "OENDSSystemResponderClient.h" #include #include "../../NDSSystem.h" #include "../../render3D.h" #undef BOOL @implementation NDSGameCore @synthesize cdsController; @synthesize cdsGPU; @synthesize cdsFirmware; @dynamic displayMode; - (id)init { self = [super init]; if(self == nil) { return self; } // Set up threading locks spinlockDisplayMode = OS_SPINLOCK_INIT; pthread_mutex_init(&mutexCoreExecute, NULL); // Set up input handling touchLocation.x = 0; touchLocation.y = 0; inputID[OENDSButtonUp] = DSControllerState_Up; inputID[OENDSButtonDown] = DSControllerState_Down; inputID[OENDSButtonLeft] = DSControllerState_Left; inputID[OENDSButtonRight] = DSControllerState_Right; inputID[OENDSButtonA] = DSControllerState_A; inputID[OENDSButtonB] = DSControllerState_B; inputID[OENDSButtonX] = DSControllerState_X; inputID[OENDSButtonY] = DSControllerState_Y; inputID[OENDSButtonL] = DSControllerState_L; inputID[OENDSButtonR] = DSControllerState_R; inputID[OENDSButtonStart] = DSControllerState_Start; inputID[OENDSButtonSelect] = DSControllerState_Select; inputID[OENDSButtonMicrophone] = DSControllerState_Microphone; inputID[OENDSButtonLid] = DSControllerState_Lid; inputID[OENDSButtonDebug] = DSControllerState_Debug; // Set up the DS controller cdsController = [[[[CocoaDSController alloc] init] retain] autorelease]; [cdsController setMicMode:MICMODE_INTERNAL_NOISE]; // Set up the DS GPU cdsGPU = [[[[CocoaDSGPU alloc] init] retain] autorelease]; [cdsGPU setMutexProducer:&mutexCoreExecute]; [cdsGPU setRender3DThreads:0]; // Pass 0 to automatically set the number of rendering threads [cdsGPU setRender3DRenderingEngine:CORE3DLIST_SWRASTERIZE]; // Set up the emulation core CommonSettings.advanced_timing = true; CommonSettings.jit_max_block_size = 12; CommonSettings.use_jit = true; [CocoaDSCore startupCore]; // Set up the DS firmware using the internal firmware cdsFirmware = [[[[CocoaDSFirmware alloc] init] retain] autorelease]; [cdsFirmware update]; // Set up the sound core CommonSettings.spu_advanced = true; CommonSettings.spuInterpolationMode = SPUInterpolation_Cosine; openEmuSoundInterfaceBuffer = [self ringBufferAtIndex:0]; NSInteger result = SPU_ChangeSoundCore(SNDCORE_OPENEMU, (int)SPU_BUFFER_BYTES); if(result == -1) { SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); } SPU_SetSynchMode(SPU_SYNC_MODE_SYNCHRONOUS, SPU_SYNC_METHOD_P); SPU_SetVolume(100); // Set up the DS display displayMode = DS_DISPLAY_TYPE_COMBO; displayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); displayAspectRatio = OEIntSizeMake(2, 3); return self; } - (void)dealloc { SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); NDS_3D_ChangeCore(CORE3DLIST_NULL); [CocoaDSCore shutdownCore]; [self setCdsController:nil]; [self setCdsGPU:nil]; [self setCdsFirmware:nil]; pthread_mutex_destroy(&mutexCoreExecute); [super dealloc]; } - (NSInteger) displayMode { OSSpinLockLock(&spinlockDisplayMode); NSInteger theMode = displayMode; OSSpinLockUnlock(&spinlockDisplayMode); return theMode; } - (void) setDisplayMode:(NSInteger)theMode { OEIntRect newDisplayRect; OEIntSize newDisplayAspectRatio; switch (theMode) { case DS_DISPLAY_TYPE_MAIN: newDisplayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); newDisplayAspectRatio = OEIntSizeMake(4, 3); break; case DS_DISPLAY_TYPE_TOUCH: newDisplayRect = OEIntRectMake(0, GPU_DISPLAY_HEIGHT + 1, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); newDisplayAspectRatio = OEIntSizeMake(4, 3); break; case DS_DISPLAY_TYPE_COMBO: newDisplayRect = OEIntRectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); newDisplayAspectRatio = OEIntSizeMake(2, 3); break; default: return; break; } OSSpinLockLock(&spinlockDisplayMode); displayMode = theMode; displayRect = newDisplayRect; displayAspectRatio = newDisplayAspectRatio; OSSpinLockUnlock(&spinlockDisplayMode); } #pragma mark - #pragma mark Execution - (void)resetEmulation { NDS_Reset(); execute = true; } - (void)executeFrameSkippingFrame:(BOOL)skip { if (skip) { NDS_SkipNextFrame(); } [self executeFrame]; } - (void)executeFrame { [cdsController flush]; NDS_beginProcessingInput(); NDS_endProcessingInput(); pthread_mutex_lock(&mutexCoreExecute); NDS_exec(); pthread_mutex_unlock(&mutexCoreExecute); SPU_Emulate_user(); } - (BOOL)loadFileAtPath:(NSString*)path { NSString *openEmuDataPath = [self batterySavesDirectoryPath]; NSURL *openEmuDataURL = [NSURL fileURLWithPath:openEmuDataPath]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"ROM"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"ROM Save"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Save State"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Screenshot"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Video"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Cheat"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Sound Sample"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Firmware Configuration"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"Lua Script"]; [CocoaDSFile setupAllFilePathsWithURLDictionary:@PATH_OPEN_EMU]; // Ensure that the OpenEmu data directory exists before loading the ROM. NSFileManager *fileManager = [[NSFileManager alloc] init]; [fileManager createDirectoryAtPath:openEmuDataPath withIntermediateDirectories:YES attributes:nil error:NULL]; [fileManager release]; return [CocoaDSFile loadRom:[NSURL fileURLWithPath:path]]; } #pragma mark Video - (OEIntRect)screenRect { OSSpinLockLock(&spinlockDisplayMode); OEIntRect theRect = displayRect; OSSpinLockUnlock(&spinlockDisplayMode); return theRect; } - (OEIntSize)aspectSize { OSSpinLockLock(&spinlockDisplayMode); OEIntSize theAspectRatio = displayAspectRatio; OSSpinLockUnlock(&spinlockDisplayMode); return theAspectRatio; } - (OEIntSize)bufferSize { return OEIntSizeMake(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); } - (const void *)videoBuffer { return GPU_screen; } - (GLenum)pixelFormat { return GL_RGBA; } - (GLenum)pixelType { return GL_UNSIGNED_SHORT_1_5_5_5_REV; } - (GLenum)internalPixelFormat { return GL_RGB5_A1; } - (NSTimeInterval)frameInterval { return DS_FRAMES_PER_SECOND; } #pragma mark Audio - (NSUInteger)audioBufferCount { return 1; } - (NSUInteger)channelCount { return SPU_NUMBER_CHANNELS; } - (double)audioSampleRate { return SPU_SAMPLE_RATE; } - (NSUInteger)channelCountForBuffer:(NSUInteger)buffer { return [self channelCount]; } - (NSUInteger)audioBufferSizeForBuffer:(NSUInteger)buffer { return (NSUInteger)SPU_BUFFER_BYTES; } - (double)audioSampleRateForBuffer:(NSUInteger)buffer { return [self audioSampleRate]; } #pragma mark Input - (oneway void)didPushNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player { [cdsController setControllerState:YES controlID:inputID[button]]; } - (oneway void)didReleaseNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player { [cdsController setControllerState:NO controlID:inputID[button]]; } - (oneway void)didTouchScreenPoint:(OEIntPoint)aPoint { BOOL isTouchPressed = NO; NSInteger dispMode = [self displayMode]; switch (dispMode) { case DS_DISPLAY_TYPE_MAIN: isTouchPressed = NO; // Reject touch input if showing only the main screen. break; case DS_DISPLAY_TYPE_TOUCH: isTouchPressed = YES; break; case DS_DISPLAY_TYPE_COMBO: isTouchPressed = YES; aPoint.y -= GPU_DISPLAY_HEIGHT; // Normalize the y-coordinate to the DS. break; default: return; break; } // Constrain the touch point to the DS dimensions. if (aPoint.x < 0) { aPoint.x = 0; } else if (aPoint.x > (GPU_DISPLAY_WIDTH - 1)) { aPoint.x = (GPU_DISPLAY_WIDTH - 1); } if (aPoint.y < 0) { aPoint.y = 0; } else if (aPoint.y > (GPU_DISPLAY_HEIGHT - 1)) { aPoint.y = (GPU_DISPLAY_HEIGHT - 1); } touchLocation = NSMakePoint(aPoint.x, aPoint.y); [cdsController setTouchState:isTouchPressed location:touchLocation]; } - (oneway void)didReleaseTouch { [cdsController setTouchState:NO location:touchLocation]; } - (NSTrackingAreaOptions)mouseTrackingOptions { return 0; } - (void)settingWasSet:(id)aValue forKey:(NSString *)keyName { DLog(@"keyName = %@", keyName); //[self doesNotImplementSelector:_cmd]; } #pragma mark Save State - (BOOL)saveStateToFileAtPath:(NSString *)fileName { return [CocoaDSFile saveState:[NSURL fileURLWithPath:fileName]]; } - (BOOL)loadStateFromFileAtPath:(NSString *)fileName { return [CocoaDSFile loadState:[NSURL fileURLWithPath:fileName]]; } @end desmume-0.9.9/src/cocoa/cocoa_core.mm0000644000175000017500000005247512140261603020234 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_core.h" #import "cocoa_input.h" #import "cocoa_firmware.h" #import "cocoa_GPU.h" #import "cocoa_globals.h" #import "cocoa_output.h" #import "cocoa_rom.h" #import "cocoa_util.h" #include #include #include "../addons.h" #include "../NDSSystem.h" #include "../slot1.h" #undef BOOL //accessed from other files volatile bool execute = true; @implementation CocoaDSCore @dynamic cdsController; @synthesize cdsFirmware; @synthesize cdsGPU; @synthesize cdsOutputList; @dynamic masterExecute; @dynamic isFrameSkipEnabled; @dynamic coreState; @dynamic isSpeedLimitEnabled; @dynamic isCheatingEnabled; @dynamic speedScalar; @dynamic emulationFlags; @synthesize emuFlagAdvancedBusLevelTiming; @synthesize emuFlagRigorousTiming; @synthesize emuFlagUseExternalBios; @synthesize emuFlagEmulateBiosInterrupts; @synthesize emuFlagPatchDelayLoop; @synthesize emuFlagUseExternalFirmware; @synthesize emuFlagFirmwareBoot; @synthesize emuFlagDebugConsole; @synthesize emuFlagEmulateEnsata; @dynamic cpuEmulationEngine; @dynamic maxJITBlockSize; @synthesize slot1DeviceType; @synthesize slot1StatusText; @dynamic arm9ImageURL; @dynamic arm7ImageURL; @dynamic firmwareImageURL; @synthesize slot1R4URL; @dynamic mutexCoreExecute; static BOOL isCoreStarted = NO; - (id)init { self = [super init]; if(self == nil) { return self; } cdsController = nil; cdsFirmware = nil; cdsGPU = [[[[CocoaDSGPU alloc] init] autorelease] retain]; cdsOutputList = [[NSMutableArray alloc] initWithCapacity:32]; emulationFlags = EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK; emuFlagAdvancedBusLevelTiming = YES; emuFlagRigorousTiming = NO; emuFlagUseExternalBios = NO; emuFlagEmulateBiosInterrupts = NO; emuFlagPatchDelayLoop = NO; emuFlagUseExternalFirmware = NO; emuFlagFirmwareBoot = NO; emuFlagDebugConsole = NO; emuFlagEmulateEnsata = NO; slot1DeviceType = NDS_SLOT1_RETAIL; slot1StatusText = NSSTRING_STATUS_EMULATION_NOT_RUNNING; spinlockMasterExecute = OS_SPINLOCK_INIT; spinlockCdsController = OS_SPINLOCK_INIT; spinlockExecutionChange = OS_SPINLOCK_INIT; spinlockCheatEnableFlag = OS_SPINLOCK_INIT; spinlockEmulationFlags = OS_SPINLOCK_INIT; spinlockCPUEmulationEngine = OS_SPINLOCK_INIT; isSpeedLimitEnabled = YES; speedScalar = SPEED_SCALAR_NORMAL; prevCoreState = CORESTATE_PAUSE; slot1R4URL = nil; _slot1R4Path = ""; threadParam.cdsCore = self; threadParam.cdsController = cdsController; threadParam.state = CORESTATE_PAUSE; threadParam.isFrameSkipEnabled = true; threadParam.frameCount = 0; threadParam.framesToSkip = 0; uint64_t timeBudgetNanoseconds = (uint64_t)(DS_SECONDS_PER_FRAME * 1000000000.0 / speedScalar); AbsoluteTime timeBudgetAbsTime = NanosecondsToAbsolute(*(Nanoseconds *)&timeBudgetNanoseconds); threadParam.timeBudgetMachAbsTime = *(uint64_t *)&timeBudgetAbsTime; threadParam.exitThread = false; pthread_mutex_init(&threadParam.mutexCoreExecute, NULL); pthread_mutex_init(&threadParam.mutexOutputList, NULL); pthread_mutex_init(&threadParam.mutexThreadExecute, NULL); pthread_cond_init(&threadParam.condThreadExecute, NULL); pthread_create(&coreThread, NULL, &RunCoreThread, &threadParam); [cdsGPU setMutexProducer:self.mutexCoreExecute]; return self; } - (void)dealloc { [self setCoreState:CORESTATE_PAUSE]; // Exit the thread. if (self.thread != nil) { self.threadExit = YES; // Wait until the thread has shut down. while (self.thread != nil) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } } pthread_mutex_lock(&threadParam.mutexThreadExecute); threadParam.exitThread = true; pthread_cond_signal(&threadParam.condThreadExecute); pthread_mutex_unlock(&threadParam.mutexThreadExecute); pthread_join(coreThread, NULL); coreThread = nil; pthread_mutex_destroy(&threadParam.mutexThreadExecute); pthread_cond_destroy(&threadParam.condThreadExecute); self.cdsController = nil; self.cdsFirmware = nil; self.cdsGPU = nil; [self removeAllOutputs]; [cdsOutputList release]; pthread_mutex_destroy(&threadParam.mutexOutputList); pthread_mutex_destroy(&threadParam.mutexCoreExecute); [super dealloc]; } + (BOOL) startupCore { NSInteger result = -1; if (isCoreStarted) { return isCoreStarted; } addonsChangePak(NDS_ADDON_NONE); result = NDS_Init(); if (result == -1) { isCoreStarted = NO; return isCoreStarted; } isCoreStarted = YES; return isCoreStarted; } + (void) shutdownCore { if (isCoreStarted) { NDS_DeInit(); isCoreStarted = NO; } } + (BOOL) isCoreStarted { return isCoreStarted; } - (void) setMasterExecute:(BOOL)theState { OSSpinLockLock(&spinlockMasterExecute); execute = theState ? true : false; OSSpinLockUnlock(&spinlockMasterExecute); } - (BOOL) masterExecute { OSSpinLockLock(&spinlockMasterExecute); const BOOL theState = execute ? YES : NO; OSSpinLockUnlock(&spinlockMasterExecute); return theState; } - (void) setCdsController:(CocoaDSController *)theController { OSSpinLockLock(&spinlockCdsController); if (theController == cdsController) { OSSpinLockUnlock(&spinlockCdsController); return; } if (theController != nil) { [theController retain]; } pthread_mutex_lock(&threadParam.mutexThreadExecute); [cdsController release]; cdsController = theController; threadParam.cdsController = theController; pthread_mutex_unlock(&threadParam.mutexThreadExecute); OSSpinLockUnlock(&spinlockCdsController); } - (CocoaDSController *) cdsController { OSSpinLockLock(&spinlockCdsController); CocoaDSController *theController = cdsController; OSSpinLockUnlock(&spinlockCdsController); return theController; } - (void) setIsFrameSkipEnabled:(BOOL)theState { pthread_mutex_lock(&threadParam.mutexThreadExecute); if (theState) { threadParam.isFrameSkipEnabled = true; } else { threadParam.isFrameSkipEnabled = false; threadParam.framesToSkip = 0; } pthread_mutex_unlock(&threadParam.mutexThreadExecute); } - (BOOL) isFrameSkipEnabled { pthread_mutex_lock(&threadParam.mutexThreadExecute); const BOOL theState = threadParam.isFrameSkipEnabled ? YES : NO; pthread_mutex_unlock(&threadParam.mutexThreadExecute); return theState; } - (void) setSpeedScalar:(CGFloat)scalar { OSSpinLockLock(&spinlockExecutionChange); speedScalar = scalar; OSSpinLockUnlock(&spinlockExecutionChange); [self changeExecutionSpeed]; } - (CGFloat) speedScalar { OSSpinLockLock(&spinlockExecutionChange); const CGFloat scalar = speedScalar; OSSpinLockUnlock(&spinlockExecutionChange); return scalar; } - (void) setIsSpeedLimitEnabled:(BOOL)theState { OSSpinLockLock(&spinlockExecutionChange); isSpeedLimitEnabled = theState; OSSpinLockUnlock(&spinlockExecutionChange); [self changeExecutionSpeed]; } - (BOOL) isSpeedLimitEnabled { OSSpinLockLock(&spinlockExecutionChange); const BOOL enabled = isSpeedLimitEnabled; OSSpinLockUnlock(&spinlockExecutionChange); return enabled; } - (void) setIsCheatingEnabled:(BOOL)theState { OSSpinLockLock(&spinlockCheatEnableFlag); CommonSettings.cheatsDisable = theState ? false : true; OSSpinLockUnlock(&spinlockCheatEnableFlag); } - (BOOL) isCheatingEnabled { OSSpinLockLock(&spinlockCheatEnableFlag); BOOL theState = CommonSettings.cheatsDisable ? NO : YES; OSSpinLockUnlock(&spinlockCheatEnableFlag); return theState; } - (void) setEmulationFlags:(NSUInteger)theFlags { OSSpinLockLock(&spinlockEmulationFlags); emulationFlags = theFlags; OSSpinLockUnlock(&spinlockEmulationFlags); pthread_mutex_lock(&threadParam.mutexCoreExecute); if (theFlags & EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK) { self.emuFlagAdvancedBusLevelTiming = YES; CommonSettings.advanced_timing = true; } else { self.emuFlagAdvancedBusLevelTiming = NO; CommonSettings.advanced_timing = false; } if (theFlags & EMULATION_RIGOROUS_TIMING_MASK) { self.emuFlagRigorousTiming = YES; CommonSettings.rigorous_timing = true; } else { self.emuFlagRigorousTiming = NO; CommonSettings.rigorous_timing = false; } if (theFlags & EMULATION_ENSATA_MASK) { self.emuFlagEmulateEnsata = YES; CommonSettings.EnsataEmulation = true; } else { self.emuFlagEmulateEnsata = NO; CommonSettings.EnsataEmulation = false; } if (theFlags & EMULATION_USE_EXTERNAL_BIOS_MASK) { self.emuFlagUseExternalBios = YES; CommonSettings.UseExtBIOS = true; } else { self.emuFlagUseExternalBios = NO; CommonSettings.UseExtBIOS = false; } if (theFlags & EMULATION_BIOS_SWI_MASK) { self.emuFlagEmulateBiosInterrupts = YES; CommonSettings.SWIFromBIOS = true; } else { self.emuFlagEmulateBiosInterrupts = NO; CommonSettings.SWIFromBIOS = false; } if (theFlags & EMULATION_PATCH_DELAY_LOOP_MASK) { self.emuFlagPatchDelayLoop = YES; CommonSettings.PatchSWI3 = true; } else { self.emuFlagPatchDelayLoop = NO; CommonSettings.PatchSWI3 = false; } if (theFlags & EMULATION_USE_EXTERNAL_FIRMWARE_MASK) { self.emuFlagUseExternalFirmware = YES; CommonSettings.UseExtFirmware = true; } else { self.emuFlagUseExternalFirmware = NO; CommonSettings.UseExtFirmware = false; } if (theFlags & EMULATION_BOOT_FROM_FIRMWARE_MASK) { self.emuFlagFirmwareBoot = YES; CommonSettings.BootFromFirmware = true; } else { self.emuFlagFirmwareBoot = NO; CommonSettings.BootFromFirmware = false; } if (theFlags & EMULATION_DEBUG_CONSOLE_MASK) { self.emuFlagDebugConsole = YES; CommonSettings.DebugConsole = true; } else { self.emuFlagDebugConsole = NO; CommonSettings.DebugConsole = false; } pthread_mutex_unlock(&threadParam.mutexCoreExecute); } - (NSUInteger) emulationFlags { OSSpinLockLock(&spinlockEmulationFlags); const NSUInteger theFlags = emulationFlags; OSSpinLockUnlock(&spinlockEmulationFlags); return theFlags; } - (void) setCpuEmulationEngine:(NSInteger)engineID { OSSpinLockLock(&spinlockCPUEmulationEngine); #if defined(__i386__) || defined(__x86_64__) cpuEmulationEngine = engineID; #else cpuEmulationEngine = CPU_EMULATION_ENGINE_INTERPRETER; #endif OSSpinLockUnlock(&spinlockCPUEmulationEngine); } - (NSInteger) cpuEmulationEngine { OSSpinLockLock(&spinlockCPUEmulationEngine); const NSInteger engineID = cpuEmulationEngine; OSSpinLockUnlock(&spinlockCPUEmulationEngine); return engineID; } - (void) setMaxJITBlockSize:(NSInteger)blockSize { pthread_mutex_lock(&threadParam.mutexCoreExecute); CommonSettings.jit_max_block_size = (blockSize > 0) ? blockSize : 1; pthread_mutex_unlock(&threadParam.mutexCoreExecute); } - (NSInteger) maxJITBlockSize { pthread_mutex_lock(&threadParam.mutexCoreExecute); const NSInteger blockSize = CommonSettings.jit_max_block_size; pthread_mutex_unlock(&threadParam.mutexCoreExecute); return blockSize; } - (void) setCoreState:(NSInteger)coreState { pthread_mutex_lock(&threadParam.mutexThreadExecute); if (threadParam.state == CORESTATE_PAUSE) { prevCoreState = CORESTATE_PAUSE; } else { prevCoreState = CORESTATE_EXECUTE; } threadParam.state = coreState; pthread_cond_signal(&threadParam.condThreadExecute); pthread_mutex_unlock(&threadParam.mutexThreadExecute); } - (NSInteger) coreState { pthread_mutex_lock(&threadParam.mutexThreadExecute); const NSInteger theState = threadParam.state; pthread_mutex_unlock(&threadParam.mutexThreadExecute); return theState; } - (void) setArm9ImageURL:(NSURL *)fileURL { if (fileURL != nil) { strlcpy(CommonSettings.ARM9BIOS, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.ARM9BIOS)); } else { memset(CommonSettings.ARM9BIOS, 0, sizeof(CommonSettings.ARM9BIOS)); } } - (NSURL *) arm9ImageURL { return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.ARM9BIOS encoding:NSUTF8StringEncoding]]; } - (void) setArm7ImageURL:(NSURL *)fileURL { if (fileURL != nil) { strlcpy(CommonSettings.ARM7BIOS, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.ARM7BIOS)); } else { memset(CommonSettings.ARM7BIOS, 0, sizeof(CommonSettings.ARM7BIOS)); } } - (NSURL *) arm7ImageURL { return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.ARM7BIOS encoding:NSUTF8StringEncoding]]; } - (void) setFirmwareImageURL:(NSURL *)fileURL { if (fileURL != nil) { strlcpy(CommonSettings.Firmware, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.Firmware)); } else { memset(CommonSettings.Firmware, 0, sizeof(CommonSettings.Firmware)); } } - (NSURL *) firmwareImageURL { return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.Firmware encoding:NSUTF8StringEncoding]]; } - (pthread_mutex_t *) mutexCoreExecute { return &threadParam.mutexCoreExecute; } - (void) setEjectCardFlag { if (nds.cardEjected) { self.emulationFlags = self.emulationFlags | EMULATION_CARD_EJECT_MASK; return; } self.emulationFlags = self.emulationFlags & ~EMULATION_CARD_EJECT_MASK; } - (BOOL) ejectCardFlag { [self setEjectCardFlag]; if (nds.cardEjected) { return YES; } return NO; } - (void) slot1Eject { pthread_mutex_lock(&threadParam.mutexCoreExecute); NDS_TriggerCardEjectIRQ(); pthread_mutex_unlock(&threadParam.mutexCoreExecute); [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_NO_DEVICE]; } - (void) changeRomSaveType:(NSInteger)saveTypeID { pthread_mutex_lock(&threadParam.mutexCoreExecute); [CocoaDSRom changeRomSaveType:saveTypeID]; pthread_mutex_unlock(&threadParam.mutexCoreExecute); } - (void) changeExecutionSpeed { if (self.isSpeedLimitEnabled) { CGFloat theSpeed = self.speedScalar; if(theSpeed <= SPEED_SCALAR_MIN) { theSpeed = SPEED_SCALAR_MIN; } pthread_mutex_lock(&threadParam.mutexThreadExecute); uint64_t timeBudgetNanoseconds = (uint64_t)(DS_SECONDS_PER_FRAME * 1000000000.0 / theSpeed); AbsoluteTime timeBudgetAbsTime = NanosecondsToAbsolute(*(Nanoseconds *)&timeBudgetNanoseconds); threadParam.timeBudgetMachAbsTime = *(uint64_t *)&timeBudgetAbsTime; pthread_mutex_unlock(&threadParam.mutexThreadExecute); } else { pthread_mutex_lock(&threadParam.mutexThreadExecute); threadParam.timeBudgetMachAbsTime = 0; pthread_mutex_unlock(&threadParam.mutexThreadExecute); } } /******************************************************************************************** applyDynaRec Sets the use_jit variable for CommonSettings. Takes: Nothing. Returns: Nothing. Details: In the UI, we call setCpuEmulationEngine to set whether we should use the interpreter or the dynamic recompiler. However, the emulator cannot handle changing the engine while the emulation is running. Therefore, we use this method to set the engine at a later time, using the last cpuEmulationEngine value from the user. ********************************************************************************************/ - (void) applyDynaRec { const NSInteger engineID = [self cpuEmulationEngine]; pthread_mutex_lock(&threadParam.mutexThreadExecute); CommonSettings.use_jit = (engineID == CPU_EMULATION_ENGINE_DYNAMIC_RECOMPILER); pthread_mutex_unlock(&threadParam.mutexThreadExecute); } - (BOOL) applySlot1Device { const NSInteger deviceTypeID = [self slot1DeviceType]; NSString *r4Path = [[self slot1R4URL] path]; pthread_mutex_lock(&threadParam.mutexThreadExecute); _slot1R4Path = (r4Path != nil) ? std::string([r4Path cStringUsingEncoding:NSUTF8StringEncoding]) : ""; slot1SetFatDir(_slot1R4Path); BOOL result = slot1Change((NDS_SLOT1_TYPE)deviceTypeID); pthread_mutex_unlock(&threadParam.mutexThreadExecute); switch (deviceTypeID) { case NDS_SLOT1_NONE: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_NO_DEVICE]; break; case NDS_SLOT1_RETAIL: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_RETAIL_INSERTED]; break; case NDS_SLOT1_RETAIL_NAND: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_RETAIL_NAND_INSERTED]; break; case NDS_SLOT1_R4: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_R4_INSERTED]; break; default: [self setSlot1StatusText:NSSTRING_STATUS_SLOT1_UNKNOWN_STATE]; break; } return result; } - (void) restoreCoreState { [self setCoreState:prevCoreState]; } - (void) reset { [self setCoreState:CORESTATE_PAUSE]; [self applyDynaRec]; [self applySlot1Device]; pthread_mutex_lock(&threadParam.mutexThreadExecute); NDS_Reset(); pthread_mutex_unlock(&threadParam.mutexThreadExecute); [self restoreCoreState]; self.masterExecute = YES; } - (void) addOutput:(CocoaDSOutput *)theOutput { pthread_mutex_lock(&threadParam.mutexOutputList); theOutput.mutexProducer = self.mutexCoreExecute; [self.cdsOutputList addObject:theOutput]; pthread_mutex_unlock(&threadParam.mutexOutputList); } - (void) removeOutput:(CocoaDSOutput *)theOutput { pthread_mutex_lock(&threadParam.mutexOutputList); [self.cdsOutputList removeObject:theOutput]; pthread_mutex_unlock(&threadParam.mutexOutputList); } - (void) removeAllOutputs { pthread_mutex_lock(&threadParam.mutexOutputList); [self.cdsOutputList removeAllObjects]; pthread_mutex_unlock(&threadParam.mutexOutputList); } - (void) runThread:(id)object { [CocoaDSCore startupCore]; [super runThread:object]; [CocoaDSCore shutdownCore]; } @end static void* RunCoreThread(void *arg) { CoreThreadParam *param = (CoreThreadParam *)arg; CocoaDSCore *cdsCore = (CocoaDSCore *)param->cdsCore; NSMutableArray *cdsOutputList = [cdsCore cdsOutputList]; uint64_t startTime = 0; uint64_t timeBudget = 0; // Need local variable to ensure that param->timeBudgetMachAbsTime is thread-safe. do { startTime = mach_absolute_time(); pthread_mutex_lock(¶m->mutexThreadExecute); timeBudget = param->timeBudgetMachAbsTime; while (!(param->state == CORESTATE_EXECUTE && execute && !param->exitThread)) { pthread_cond_wait(¶m->condThreadExecute, ¶m->mutexThreadExecute); startTime = mach_absolute_time(); timeBudget = param->timeBudgetMachAbsTime; } if (param->exitThread) { pthread_mutex_unlock(¶m->mutexThreadExecute); break; } // Get the user's input, execute a single emulation frame, and generate // the frame output. [(CocoaDSController *)param->cdsController flush]; NDS_beginProcessingInput(); // Shouldn't need to do any special processing steps in between. // We'll just jump directly to ending the input processing. NDS_endProcessingInput(); // Execute the frame and increment the frame counter. pthread_mutex_lock(¶m->mutexCoreExecute); NDS_exec(); pthread_mutex_unlock(¶m->mutexCoreExecute); // Check if an internal execution error occurred that halted the emulation. if (!execute) { pthread_mutex_unlock(¶m->mutexThreadExecute); // TODO: Message the core that emulation halted. NSLog(@"The emulator halted during execution. Was it an internal error that caused this?"); continue; } if (param->framesToSkip == 0) { param->frameCount++; } pthread_mutex_lock(¶m->mutexOutputList); for(CocoaDSOutput *cdsOutput in cdsOutputList) { if (param->framesToSkip > 0 && [cdsOutput isKindOfClass:[CocoaDSDisplay class]]) { continue; } [cdsOutput doCoreEmuFrame]; } pthread_mutex_unlock(¶m->mutexOutputList); // Determine the number of frames to skip based on how much time "debt" // we owe on timeBudget. if (param->isFrameSkipEnabled) { CoreFrameSkip(timeBudget, startTime, ¶m->framesToSkip); } pthread_mutex_unlock(¶m->mutexThreadExecute); // If there is any time left in the loop, go ahead and pad it. mach_wait_until(startTime + timeBudget); } while (!param->exitThread); return nil; } static void CoreFrameSkip(uint64_t timeBudgetMachAbsTime, uint64_t frameStartMachAbsTime, unsigned int *outFramesToSkip) { if (*outFramesToSkip > 0) { NDS_SkipNextFrame(); (*outFramesToSkip)--; } else { // Calculate the time remaining. uint64_t elapsed = mach_absolute_time() - frameStartMachAbsTime; if (elapsed > timeBudgetMachAbsTime) { static unsigned int lastSetFrameSkip = 0; unsigned int framesToSkip = 0; if (timeBudgetMachAbsTime > 0) { framesToSkip = (unsigned int)( (((double)(elapsed - timeBudgetMachAbsTime) * FRAME_SKIP_AGGRESSIVENESS) / (double)timeBudgetMachAbsTime) + FRAME_SKIP_BIAS ); if (framesToSkip < lastSetFrameSkip) { framesToSkip += (unsigned int)((double)(lastSetFrameSkip - framesToSkip) * FRAME_SKIP_SMOOTHNESS); } lastSetFrameSkip = framesToSkip; } else { framesToSkip = (unsigned int)( (((double)(elapsed - timeBudgetMachAbsTime) * FRAME_SKIP_AGGRESSIVENESS * 100.0) / DS_SECONDS_PER_FRAME) + FRAME_SKIP_BIAS ); // Don't need to save lastSetFrameSkip here since this code path assumes that // the frame limiter is disabled. } // Bound the frame skip. if (framesToSkip > (unsigned int)MAX_FRAME_SKIP) { framesToSkip = (unsigned int)MAX_FRAME_SKIP; lastSetFrameSkip = framesToSkip; } *outFramesToSkip = framesToSkip; } else { *outFramesToSkip = 0; } } } desmume-0.9.9/src/cocoa/DeSmuME (XCode 4).xcodeproj/0000755000175000017500000000000012140306213022250 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.xcworkspace/0000755000175000017500000000000012140306213026246 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000175000017500000000024212140261575033221 0ustar guillaumeguillaume desmume-0.9.9/src/cocoa/DeSmuME (XCode 4).xcodeproj/project.pbxproj0000644000175000017500000077520212140261575025354 0ustar guillaumeguillaume// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB00E87B14205EAE00DE561F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB00E87E14205EBC00DE561F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB01005E170D07B000D70FBE /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB01005D170D07B000D70FBE /* InputProfileController.mm */; }; AB01005F170D07B000D70FBE /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB01005D170D07B000D70FBE /* InputProfileController.mm */; }; AB010060170D07B000D70FBE /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB01005D170D07B000D70FBE /* InputProfileController.mm */; }; AB02475C13886BF300E9F9AB /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB0F290214BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB0F290314BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB0F290414BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB0F290514BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB0F291D14BE6F4A009ABC6F /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB0F293814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB0F293914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB0F293A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB0F293B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB0F293C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB0F293D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB0F293E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB0F293F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB0F294014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB0F294114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB0F294214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB0F294314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB0F294414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB0F294514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB0F294614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB0F294714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB0F296D14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB0F296E14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB0F297A14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB0F298C14BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB0F298D14BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB0F298E14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB0F298F14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB0F29A614BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB0F29A714BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB0F29A814BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB0F29A914BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB0F29AA14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB0F29AB14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB0F29AC14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB0F29AD14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB0F29AE14BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB0F29B114BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; AB0F29B214BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB0F29B314BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB0F29B414BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB0F29B514BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB0F29B614BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB0F29B714BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB15CA7214A29EE500B8A6A4 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; AB181D0013B66889006CA82D /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB1949DB15034F900098793E /* OESoundInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABB3C6401501BB8300E0C22E /* OESoundInterface.mm */; }; AB1B9E631501A78000464647 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */; }; AB1B9E661501A78000464647 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E601501A78000464647 /* ringbuffer.cpp */; }; AB1F468413A0ADE400B80DE6 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB1F469813A0AE2F00B80DE6 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB23567416C2F6F400DA782E /* macosx_10_5_compat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */; }; AB23567516C2FAD800DA782E /* OGLRender_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */; }; AB26D87C16B5253D00A2305C /* OGLRender_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */; }; AB29B33116D4BEBF000EF671 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB29B33016D4BEBF000EF671 /* InputManager.mm */; }; AB29B33216D4BEBF000EF671 /* InputManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB29B33016D4BEBF000EF671 /* InputManager.mm */; }; AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB350D3B147A1D93007165AC /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB3A655E16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */; }; AB3A655F16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */; }; AB3A656116CC5438001F5D4A /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */; }; AB3A656216CC5438001F5D4A /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */; }; AB3A656316CC5438001F5D4A /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */; }; AB3ACB7214C2361100D7D192 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB3ACB7314C2361100D7D192 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB3ACB7614C2361100D7D192 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB3ACB7714C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB3ACC3E14C24D5400D7D192 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB3ACC3F14C24D5400D7D192 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB3ACC4014C24D5400D7D192 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB3ACC4114C24D5400D7D192 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB3ACC4314C24D5400D7D192 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB40562A169F5DBB0016AC3E /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; AB40562B169F5DBB0016AC3E /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; AB40562C169F5DBB0016AC3E /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; AB40562D169F5DBB0016AC3E /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405602169F5DBB0016AC3E /* assert.cpp */; }; AB40562E169F5DBB0016AC3E /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405602169F5DBB0016AC3E /* assert.cpp */; }; AB40562F169F5DBB0016AC3E /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405602169F5DBB0016AC3E /* assert.cpp */; }; AB405630169F5DBB0016AC3E /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405604169F5DBB0016AC3E /* buffer.cpp */; }; AB405631169F5DBB0016AC3E /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405604169F5DBB0016AC3E /* buffer.cpp */; }; AB405632169F5DBB0016AC3E /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405604169F5DBB0016AC3E /* buffer.cpp */; }; AB405633169F5DBB0016AC3E /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405607169F5DBB0016AC3E /* compiler.cpp */; }; AB405634169F5DBB0016AC3E /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405607169F5DBB0016AC3E /* compiler.cpp */; }; AB405635169F5DBB0016AC3E /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405607169F5DBB0016AC3E /* compiler.cpp */; }; AB405636169F5DBB0016AC3E /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405609169F5DBB0016AC3E /* compilercontext.cpp */; }; AB405637169F5DBB0016AC3E /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405609169F5DBB0016AC3E /* compilercontext.cpp */; }; AB405638169F5DBB0016AC3E /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405609169F5DBB0016AC3E /* compilercontext.cpp */; }; AB405639169F5DBB0016AC3E /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */; }; AB40563A169F5DBB0016AC3E /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */; }; AB40563B169F5DBB0016AC3E /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */; }; AB40563C169F5DBB0016AC3E /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560D169F5DBB0016AC3E /* compileritem.cpp */; }; AB40563D169F5DBB0016AC3E /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560D169F5DBB0016AC3E /* compileritem.cpp */; }; AB40563E169F5DBB0016AC3E /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560D169F5DBB0016AC3E /* compileritem.cpp */; }; AB40563F169F5DBB0016AC3E /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560F169F5DBB0016AC3E /* context.cpp */; }; AB405640169F5DBB0016AC3E /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560F169F5DBB0016AC3E /* context.cpp */; }; AB405641169F5DBB0016AC3E /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40560F169F5DBB0016AC3E /* context.cpp */; }; AB405642169F5DBB0016AC3E /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405611169F5DBB0016AC3E /* cpuinfo.cpp */; }; AB405643169F5DBB0016AC3E /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405611169F5DBB0016AC3E /* cpuinfo.cpp */; }; AB405644169F5DBB0016AC3E /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405611169F5DBB0016AC3E /* cpuinfo.cpp */; }; AB405645169F5DBB0016AC3E /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405613169F5DBB0016AC3E /* defs.cpp */; }; AB405646169F5DBB0016AC3E /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405613169F5DBB0016AC3E /* defs.cpp */; }; AB405647169F5DBB0016AC3E /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405613169F5DBB0016AC3E /* defs.cpp */; }; AB405648169F5DBB0016AC3E /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405615169F5DBB0016AC3E /* func.cpp */; }; AB405649169F5DBB0016AC3E /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405615169F5DBB0016AC3E /* func.cpp */; }; AB40564A169F5DBB0016AC3E /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405615169F5DBB0016AC3E /* func.cpp */; }; AB40564B169F5DBB0016AC3E /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405619169F5DBB0016AC3E /* logger.cpp */; }; AB40564C169F5DBB0016AC3E /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405619169F5DBB0016AC3E /* logger.cpp */; }; AB40564D169F5DBB0016AC3E /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405619169F5DBB0016AC3E /* logger.cpp */; }; AB40564E169F5DBB0016AC3E /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561B169F5DBB0016AC3E /* memorymanager.cpp */; }; AB40564F169F5DBB0016AC3E /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561B169F5DBB0016AC3E /* memorymanager.cpp */; }; AB405650169F5DBB0016AC3E /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561B169F5DBB0016AC3E /* memorymanager.cpp */; }; AB405651169F5DBB0016AC3E /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561D169F5DBB0016AC3E /* memorymarker.cpp */; }; AB405652169F5DBB0016AC3E /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561D169F5DBB0016AC3E /* memorymarker.cpp */; }; AB405653169F5DBB0016AC3E /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561D169F5DBB0016AC3E /* memorymarker.cpp */; }; AB405654169F5DBB0016AC3E /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561F169F5DBB0016AC3E /* operand.cpp */; }; AB405655169F5DBB0016AC3E /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561F169F5DBB0016AC3E /* operand.cpp */; }; AB405656169F5DBB0016AC3E /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40561F169F5DBB0016AC3E /* operand.cpp */; }; AB405657169F5DBB0016AC3E /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405622169F5DBB0016AC3E /* stringbuilder.cpp */; }; AB405658169F5DBB0016AC3E /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405622169F5DBB0016AC3E /* stringbuilder.cpp */; }; AB405659169F5DBB0016AC3E /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405622169F5DBB0016AC3E /* stringbuilder.cpp */; }; AB40565A169F5DBB0016AC3E /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405624169F5DBB0016AC3E /* stringutil.cpp */; }; AB40565B169F5DBB0016AC3E /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405624169F5DBB0016AC3E /* stringutil.cpp */; }; AB40565C169F5DBB0016AC3E /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405624169F5DBB0016AC3E /* stringutil.cpp */; }; AB40565D169F5DBB0016AC3E /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405626169F5DBB0016AC3E /* virtualmemory.cpp */; }; AB40565E169F5DBB0016AC3E /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405626169F5DBB0016AC3E /* virtualmemory.cpp */; }; AB40565F169F5DBB0016AC3E /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405626169F5DBB0016AC3E /* virtualmemory.cpp */; }; AB405660169F5DBB0016AC3E /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405628169F5DBB0016AC3E /* zonememory.cpp */; }; AB405661169F5DBB0016AC3E /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405628169F5DBB0016AC3E /* zonememory.cpp */; }; AB405662169F5DBB0016AC3E /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405628169F5DBB0016AC3E /* zonememory.cpp */; }; AB405678169F5DCC0016AC3E /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405664169F5DCC0016AC3E /* x86assembler.cpp */; }; AB405679169F5DCC0016AC3E /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405664169F5DCC0016AC3E /* x86assembler.cpp */; }; AB40567A169F5DCC0016AC3E /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405664169F5DCC0016AC3E /* x86assembler.cpp */; }; AB40567B169F5DCC0016AC3E /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405666169F5DCC0016AC3E /* x86compiler.cpp */; }; AB40567C169F5DCC0016AC3E /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405666169F5DCC0016AC3E /* x86compiler.cpp */; }; AB40567D169F5DCC0016AC3E /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405666169F5DCC0016AC3E /* x86compiler.cpp */; }; AB40567E169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */; }; AB40567F169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */; }; AB405680169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */; }; AB405681169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */; }; AB405682169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */; }; AB405683169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */; }; AB405684169F5DCC0016AC3E /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */; }; AB405685169F5DCC0016AC3E /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */; }; AB405686169F5DCC0016AC3E /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */; }; AB405687169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */; }; AB405688169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */; }; AB405689169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */; }; AB40568A169F5DCC0016AC3E /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405670169F5DCC0016AC3E /* x86defs.cpp */; }; AB40568B169F5DCC0016AC3E /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405670169F5DCC0016AC3E /* x86defs.cpp */; }; AB40568C169F5DCC0016AC3E /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405670169F5DCC0016AC3E /* x86defs.cpp */; }; AB40568D169F5DCC0016AC3E /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405672169F5DCC0016AC3E /* x86func.cpp */; }; AB40568E169F5DCC0016AC3E /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405672169F5DCC0016AC3E /* x86func.cpp */; }; AB40568F169F5DCC0016AC3E /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405672169F5DCC0016AC3E /* x86func.cpp */; }; AB405690169F5DCC0016AC3E /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405674169F5DCC0016AC3E /* x86operand.cpp */; }; AB405691169F5DCC0016AC3E /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405674169F5DCC0016AC3E /* x86operand.cpp */; }; AB405692169F5DCC0016AC3E /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405674169F5DCC0016AC3E /* x86operand.cpp */; }; AB405693169F5DCC0016AC3E /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; }; AB405694169F5DCC0016AC3E /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; }; AB405695169F5DCC0016AC3E /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; }; AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; }; AB5785F817175F16002C5FC7 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB5785F9171760D2002C5FC7 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB5785FD17176AFC002C5FC7 /* OpenEmuBase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB5785FC17176AFC002C5FC7 /* OpenEmuBase.framework */; }; AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB64987C13ECC73800EE7DD2 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB68A0DD16B139BC00DE0546 /* OGLRender_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */; }; AB6FBEF6139B6258007BB045 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB75226E14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB796C9C15CDCB0F00C59155 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; AB796C9F15CDCB0F00C59155 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; AB796CA715CDCBA200C59155 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; AB796CA815CDCBA200C59155 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; AB796CA915CDCBA200C59155 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; AB796CAA15CDCBA200C59155 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; AB796CAB15CDCBA200C59155 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; AB796CAC15CDCBA200C59155 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; AB796CAD15CDCBA200C59155 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; AB796CAE15CDCBA200C59155 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; AB796CAF15CDCBA200C59155 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; AB796CB015CDCBA200C59155 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; AB796CB115CDCBA200C59155 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB796CB215CDCBA200C59155 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; AB796CB315CDCBA200C59155 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; AB796CB415CDCBA200C59155 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; AB796CB515CDCBA200C59155 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; AB796CB615CDCBA200C59155 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; AB796CB715CDCBA200C59155 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; AB796CB815CDCBA200C59155 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; AB796CB915CDCBA200C59155 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; AB796CBA15CDCBA200C59155 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; AB796CBB15CDCBA200C59155 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; AB796CBC15CDCBA200C59155 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; AB796CBD15CDCBA200C59155 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; AB796CBE15CDCBA200C59155 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; AB796CBF15CDCBA200C59155 /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; AB796CC015CDCBA200C59155 /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; AB796CC115CDCBA200C59155 /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; AB796CC215CDCBA200C59155 /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; AB796CC315CDCBA200C59155 /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; AB796CC415CDCBA200C59155 /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; AB796CC515CDCBA200C59155 /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; AB796CC615CDCBA200C59155 /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; AB796CC715CDCBA200C59155 /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; AB796CC815CDCBA200C59155 /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; AB796CC915CDCBA200C59155 /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; AB796CCA15CDCBA200C59155 /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; AB796CCB15CDCBA200C59155 /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; AB796CCC15CDCBA200C59155 /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; AB796CCD15CDCBA200C59155 /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; AB796CCE15CDCBA200C59155 /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; AB796CCF15CDCBA200C59155 /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; AB796CD015CDCBA200C59155 /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; AB796CD115CDCBA200C59155 /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; AB796CD215CDCBA200C59155 /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; AB796CD315CDCBA200C59155 /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; AB796CD415CDCBA200C59155 /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; AB796CD515CDCBA200C59155 /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; AB796CD615CDCBA200C59155 /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; AB796CD715CDCBA200C59155 /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; AB796CD815CDCBA200C59155 /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; AB796CD915CDCBA200C59155 /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; AB796CDA15CDCBA200C59155 /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; AB796CDB15CDCBA200C59155 /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; AB796CDC15CDCBA200C59155 /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; AB796CDD15CDCBA200C59155 /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; AB796CDE15CDCBA200C59155 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; AB796CDF15CDCBA200C59155 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; AB796CE015CDCBA200C59155 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; AB796CE115CDCBA200C59155 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; AB796CE215CDCBA200C59155 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; AB796CE315CDCBA200C59155 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; AB796CE415CDCBA200C59155 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; AB796CE515CDCBA200C59155 /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; AB796CE615CDCBA200C59155 /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; AB796CE715CDCBA200C59155 /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; AB796CE815CDCBA200C59155 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; AB796CE915CDCBA200C59155 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; AB796CEA15CDCBA200C59155 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB796CEB15CDCBA200C59155 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB796CEC15CDCBA200C59155 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; AB796CED15CDCBA200C59155 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB796CEF15CDCBA200C59155 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; AB796CF015CDCBA200C59155 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; AB796CF115CDCBA200C59155 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; AB796CF215CDCBA200C59155 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; AB796CF315CDCBA200C59155 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; AB796CF415CDCBA200C59155 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; AB796CF515CDCBA200C59155 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; AB796CF615CDCBA200C59155 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; AB796CF715CDCBA200C59155 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; AB796CF815CDCBA200C59155 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; AB796CF915CDCBA200C59155 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; AB796CFA15CDCBA200C59155 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; AB796CFB15CDCBA200C59155 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; AB796CFC15CDCBA200C59155 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; AB796CFD15CDCBA200C59155 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; AB796CFE15CDCBA200C59155 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; AB796CFF15CDCBA200C59155 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; AB796D0015CDCBA200C59155 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; AB796D0115CDCBA200C59155 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; AB796D0215CDCBA200C59155 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; AB796D0315CDCBA200C59155 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; AB796D0415CDCBA200C59155 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; AB796D0515CDCBA200C59155 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; AB796D0615CDCBA200C59155 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; AB796D0715CDCBA200C59155 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; AB796D0815CDCBA200C59155 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; AB796D0915CDCBA200C59155 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; AB796D0A15CDCBA200C59155 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; AB796D0B15CDCBA200C59155 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; AB796D0C15CDCBA200C59155 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; AB796D0D15CDCBA200C59155 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; AB796D0E15CDCBA200C59155 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; AB796D0F15CDCBA200C59155 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; AB796D1015CDCBA200C59155 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; AB796D1115CDCBA200C59155 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; AB796D1215CDCBA200C59155 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; AB796D1315CDCBA200C59155 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; AB796D1415CDCBA200C59155 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; AB796D1515CDCBA200C59155 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; AB796D1615CDCBA200C59155 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; AB796D1715CDCBA200C59155 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; AB796D1815CDCBA200C59155 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; AB796D1915CDCBA200C59155 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; AB796D1A15CDCBA200C59155 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; AB796D1B15CDCBA200C59155 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; AB796D1C15CDCBA200C59155 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; AB796D1D15CDCBA200C59155 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; AB796D1E15CDCBA200C59155 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; AB796D1F15CDCBA200C59155 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; AB796D2015CDCBA200C59155 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; AB796D2115CDCBA200C59155 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; AB796D2215CDCBA200C59155 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; AB796D2315CDCBA200C59155 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; AB796D2415CDCBA200C59155 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; AB796D2515CDCBA200C59155 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; AB796D2615CDCBA200C59155 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; AB796D2715CDCBA200C59155 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; AB796D2815CDCBA200C59155 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; AB796D2915CDCBA200C59155 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; AB796D2A15CDCBA200C59155 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; AB796D2B15CDCBA200C59155 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; AB796D2C15CDCBA200C59155 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; AB796D2D15CDCBA200C59155 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; AB796D2E15CDCBA200C59155 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; AB796D2F15CDCBA200C59155 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; AB796D3015CDCBA200C59155 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; AB796D3115CDCBA200C59155 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; AB796D3215CDCBA200C59155 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; AB796D3315CDCBA200C59155 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; AB796D3415CDCBA200C59155 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; AB796D3515CDCBA200C59155 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; AB796D3615CDCBA200C59155 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; AB796D3715CDCBA200C59155 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; AB796D3815CDCBA200C59155 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; AB796D3915CDCBA200C59155 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; AB796D3A15CDCBA200C59155 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; AB796D3B15CDCBA200C59155 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; AB796D3C15CDCBA200C59155 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; AB796D3D15CDCBA200C59155 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; AB796D3E15CDCBA200C59155 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; AB796D3F15CDCBA200C59155 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; AB796D4015CDCBA200C59155 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; AB796D4115CDCBA200C59155 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; AB796D4215CDCBA200C59155 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; AB796D4315CDCBA200C59155 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; AB796D4415CDCBA200C59155 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; AB796D4515CDCBA200C59155 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; AB796D4615CDCBA200C59155 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; AB796D4715CDCBA200C59155 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; AB796D4815CDCBA200C59155 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; AB796D4915CDCBA200C59155 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; AB796D4A15CDCBA200C59155 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; AB796D4B15CDCBA200C59155 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; AB796D4C15CDCBA200C59155 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; AB796D4D15CDCBA200C59155 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; AB796D4F15CDCBA200C59155 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; AB796D5115CDCBA200C59155 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB796D5215CDCBA200C59155 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; AB796D5315CDCBA200C59155 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB796D5415CDCBA200C59155 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; AB796D5515CDCBA200C59155 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; AB796D5615CDCBA200C59155 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; AB796D5915CDCBA200C59155 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; AB796D5A15CDCBA200C59155 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; AB796D5B15CDCBA200C59155 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; AB796D5C15CDCBA200C59155 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; AB796D5D15CDCBA200C59155 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; AB796D5E15CDCBA200C59155 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; AB796D5F15CDCBA200C59155 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; AB796D6015CDCBA200C59155 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; AB796D6115CDCBA200C59155 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; AB796D6215CDCBA200C59155 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */; }; AB796D6315CDCBA200C59155 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E601501A78000464647 /* ringbuffer.cpp */; }; AB796D6415CDCBA200C59155 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */; }; AB796D6615CDCBA200C59155 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; AB796D6B15CDCBA200C59155 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; AB796D6C15CDCBA200C59155 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; AB80E04D142BC4A800A52038 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; AB82445B1704AE9A00B8EE20 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB82445A1704AE9A00B8EE20 /* utilities.c */; }; AB82445C1704AE9A00B8EE20 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB82445A1704AE9A00B8EE20 /* utilities.c */; }; AB82445D1704AE9A00B8EE20 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB82445A1704AE9A00B8EE20 /* utilities.c */; }; AB8967D916D2ED0700F826F1 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */; }; AB8967DA16D2ED0700F826F1 /* DisplayWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */; }; AB8967DD16D2ED2700F826F1 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */; }; AB8967DE16D2ED2700F826F1 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */; }; AB901BDE1420706100348EEC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; AB91D46B13BD013800462471 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; ABACB8DC1710B621003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; }; ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; }; ABACB8DE1710B65F003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; }; ABAD3E7113AF1D6D00502E1E /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; ABAD3E7413AF1D6D00502E1E /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; ABAD3E7513AF1D6D00502E1E /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; ABAD3E7613AF1D6D00502E1E /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; ABAD3E7713AF1D6D00502E1E /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; ABAD3E7813AF1D6D00502E1E /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; ABAD3E7913AF1D6D00502E1E /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; ABAD3E7A13AF1D6D00502E1E /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; ABAD3E7B13AF1D6D00502E1E /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; ABB3C6621501BF4E00E0C22E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; ABB3C6631501BF4E00E0C22E /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; ABB3C6641501BF8A00E0C22E /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; ABB3C6651501BF8A00E0C22E /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; ABB3C6661501BF8A00E0C22E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; ABB3C6691501BF8A00E0C22E /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; ABB3C66A1501BF8A00E0C22E /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; ABB3C66C1501C04F00E0C22E /* NDSGameCore.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABB3C63E1501BB8300E0C22E /* NDSGameCore.mm */; }; ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; ABB3C6751501C04F00E0C22E /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; ABB3C6761501C04F00E0C22E /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; ABB3C6771501C04F00E0C22E /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; ABB3C6781501C04F00E0C22E /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; ABB3C6791501C04F00E0C22E /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; ABB3C67A1501C04F00E0C22E /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; ABB3C67B1501C04F00E0C22E /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; ABB3C67C1501C04F00E0C22E /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; ABB3C67D1501C04F00E0C22E /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; ABB3C67E1501C04F00E0C22E /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; ABB3C67F1501C04F00E0C22E /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; ABB3C6801501C04F00E0C22E /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; ABB3C6811501C04F00E0C22E /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; ABB3C6821501C04F00E0C22E /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; ABB3C6831501C04F00E0C22E /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; ABB3C6841501C04F00E0C22E /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; ABB3C6851501C04F00E0C22E /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; ABB3C6861501C04F00E0C22E /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; ABB3C6871501C04F00E0C22E /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; ABB3C6881501C04F00E0C22E /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; ABB3C6891501C04F00E0C22E /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; ABB3C68A1501C04F00E0C22E /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; ABB3C68B1501C04F00E0C22E /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; ABB3C68C1501C04F00E0C22E /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; ABB3C68D1501C04F00E0C22E /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; ABB3C68E1501C04F00E0C22E /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; ABB3C68F1501C04F00E0C22E /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; ABB3C6901501C04F00E0C22E /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; ABB3C6911501C04F00E0C22E /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; ABB3C6921501C04F00E0C22E /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; ABB3C6931501C04F00E0C22E /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; ABB3C6941501C04F00E0C22E /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; ABB3C6951501C04F00E0C22E /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; ABB3C6961501C04F00E0C22E /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; ABB3C6971501C04F00E0C22E /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; ABB3C6981501C04F00E0C22E /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; ABB3C6991501C04F00E0C22E /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; ABB3C69A1501C04F00E0C22E /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; ABB3C69B1501C04F00E0C22E /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; ABB3C69C1501C04F00E0C22E /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; ABB3C69D1501C04F00E0C22E /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; ABB3C69E1501C04F00E0C22E /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; ABB3C69F1501C04F00E0C22E /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; ABB3C6A01501C04F00E0C22E /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; ABB3C6A11501C04F00E0C22E /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; ABB3C6A21501C04F00E0C22E /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; ABB3C6A31501C04F00E0C22E /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; ABB3C6A41501C04F00E0C22E /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; ABB3C6A51501C04F00E0C22E /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; ABB3C6A61501C04F00E0C22E /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; ABB3C6A71501C04F00E0C22E /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; ABB3C6A81501C04F00E0C22E /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; ABB3C6A91501C04F00E0C22E /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; ABB3C6AA1501C04F00E0C22E /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; ABB3C6AB1501C04F00E0C22E /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; ABB3C6AC1501C04F00E0C22E /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; ABB3C6AD1501C04F00E0C22E /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; ABB3C6AE1501C04F00E0C22E /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; ABB3C6AF1501C04F00E0C22E /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; ABB3C6B01501C04F00E0C22E /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; ABB3C6B11501C04F00E0C22E /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; ABB3C6B21501C04F00E0C22E /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; ABB3C6B31501C04F00E0C22E /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; ABB3C6B41501C04F00E0C22E /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; ABB3C6B51501C04F00E0C22E /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; ABB3C6B61501C04F00E0C22E /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; ABB3C6B71501C04F00E0C22E /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; ABB3C6B81501C04F00E0C22E /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; ABB3C6B91501C04F00E0C22E /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; ABB3C6BA1501C04F00E0C22E /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; ABB3C6BB1501C04F00E0C22E /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; ABB3C6BC1501C04F00E0C22E /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; ABB3C6BD1501C04F00E0C22E /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; ABB3C6BE1501C04F00E0C22E /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; ABB3C6BF1501C04F00E0C22E /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; ABB3C6C01501C04F00E0C22E /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; ABB3C6C11501C04F00E0C22E /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; ABB3C6C21501C04F00E0C22E /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; ABB3C6C31501C04F00E0C22E /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; ABB3C6C41501C04F00E0C22E /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; ABB3C6C61501C04F00E0C22E /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; ABB3C6C71501C04F00E0C22E /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; ABB3C6C81501C04F00E0C22E /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; ABB3C6C91501C04F00E0C22E /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; ABB3C6CA1501C04F00E0C22E /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; ABB3C6CB1501C04F00E0C22E /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; ABB3C6CC1501C04F00E0C22E /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; ABB3C6CD1501C04F00E0C22E /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; ABB3C6CE1501C04F00E0C22E /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; ABB3C6CF1501C04F00E0C22E /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; ABB3C6D01501C04F00E0C22E /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; ABB3C6D11501C04F00E0C22E /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; ABB3C6D31501C04F00E0C22E /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; ABB3C6D41501C04F00E0C22E /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; ABB3C6D51501C04F00E0C22E /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; ABB3C6D61501C04F00E0C22E /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; ABB3C6D71501C04F00E0C22E /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; ABB97876144E89CC00793FA3 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; ABB97877144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; ABB97878144E89CC00793FA3 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; ABBC0F8D1394B1AA0028B6BD /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; ABBF04A514B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; ABC3AF2F14B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; ABC3AF3214B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; ABC719E2138CB25E002827A9 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; ABD1041D1346652500AF11D1 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; ABD104281346653B00AF11D1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; ABD10AE71715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; }; ABD10AE81715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; }; ABD10AE91715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; }; ABD10AEA1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; }; ABD10AEB1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; }; ABD10AEC1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; }; ABD10AED17160C9300B5729D /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E601501A78000464647 /* ringbuffer.cpp */; }; ABD10AEE17160CDD00B5729D /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; ABD1FED01345AC8400AF11D1 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; ABD1FED21345AC8400AF11D1 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; ABD1FED31345AC8400AF11D1 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; ABD1FED41345AC8400AF11D1 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; ABD1FED51345AC8400AF11D1 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; ABD1FED71345AC8400AF11D1 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; ABD1FED81345AC8400AF11D1 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; ABD1FEDA1345AC8400AF11D1 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; ABD1FEDC1345AC8400AF11D1 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; ABD1FEDD1345AC8400AF11D1 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; ABD1FEDE1345AC8400AF11D1 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; ABD1FEDF1345AC8400AF11D1 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; ABD1FEE01345AC8400AF11D1 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; ABD1FEE31345AC8400AF11D1 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; ABD1FEE41345AC8400AF11D1 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; ABD1FEE61345AC8400AF11D1 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; ABD1FEE81345AC8400AF11D1 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; ABD1FEE91345AC8400AF11D1 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; ABD1FEED1345AC8400AF11D1 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; ABD1FEEE1345AC8400AF11D1 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; ABD1FEEF1345AC8400AF11D1 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; ABD1FEF11345AC8400AF11D1 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; ABD1FEF21345AC8400AF11D1 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; ABD1FEF31345AC8400AF11D1 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; ABD1FEF41345AC8400AF11D1 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; ABD1FEF51345AC8400AF11D1 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; ABD1FEF61345AC8400AF11D1 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; ABD1FEF71345AC8400AF11D1 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; ABD1FEF81345AC8400AF11D1 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; ABD1FEFA1345AC8400AF11D1 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; ABD1FEFB1345AC8400AF11D1 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; ABD1FEFC1345AC8400AF11D1 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; ABD1FEFD1345AC8400AF11D1 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; ABD1FEFE1345AC8400AF11D1 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; ABD1FF0B1345AC9C00AF11D1 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; ABD1FF0C1345AC9C00AF11D1 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; ABD1FF0D1345AC9C00AF11D1 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; ABD1FF0E1345AC9C00AF11D1 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; ABD1FF0F1345AC9C00AF11D1 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; ABD1FF101345AC9C00AF11D1 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; ABD1FF111345AC9C00AF11D1 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; ABD1FF121345AC9C00AF11D1 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; ABD1FF131345AC9C00AF11D1 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; ABD1FF141345AC9C00AF11D1 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; ABD1FF151345AC9C00AF11D1 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; ABD1FF531345ACBF00AF11D1 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; ABD1FF551345ACBF00AF11D1 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; ABD1FF561345ACBF00AF11D1 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; ABD1FF571345ACBF00AF11D1 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; ABD1FF581345ACBF00AF11D1 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; ABD1FF591345ACBF00AF11D1 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; ABD1FF5A1345ACBF00AF11D1 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; ABD1FF5B1345ACBF00AF11D1 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; ABD1FF5C1345ACBF00AF11D1 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; ABD1FF5D1345ACBF00AF11D1 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; ABD1FF5E1345ACBF00AF11D1 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; ABD1FF5F1345ACBF00AF11D1 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; ABD1FF601345ACBF00AF11D1 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; ABD1FF611345ACBF00AF11D1 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; ABD1FF621345ACBF00AF11D1 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; ABD1FF631345ACBF00AF11D1 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; ABD1FF641345ACBF00AF11D1 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; ABD1FF651345ACBF00AF11D1 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; ABD1FF661345ACBF00AF11D1 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; ABD1FF671345ACBF00AF11D1 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; ABD1FF681345ACBF00AF11D1 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; ABD1FF691345ACBF00AF11D1 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; ABD1FF9F1345ACFA00AF11D1 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; ABD42047172319D1006A9B46 /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */; }; ABD42048172319D1006A9B46 /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */; }; ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; ABE6702B1415DE6C00E8E4C9 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; ABE6702C1415DE6C00E8E4C9 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; ABE6702D1415DE6C00E8E4C9 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; ABE6702E1415DE6C00E8E4C9 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; ABE9EEEA1501C6EB00D3FB19 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; ABE9EEEB1501C78700D3FB19 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; ABEFCF61141AB82A000CC0CD /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; ABEFCF62141AB82A000CC0CD /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; ABEFCF63141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; ABEFCF64141AB82A000CC0CD /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; ABF2B9FB16904133000FF7C0 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */; }; ABF2B9FC16904133000FF7C0 /* troubleshootingWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */; }; ABFE150714C92FF5005D6699 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */; }; ABFE150814C92FF5005D6699 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FB14C92FF5005D6699 /* bilinear.cpp */; }; ABFE150914C92FF5005D6699 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FC14C92FF5005D6699 /* epx.cpp */; }; ABFE150A14C92FF5005D6699 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE14FE14C92FF5005D6699 /* hq2x.cpp */; }; ABFE150B14C92FF5005D6699 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150014C92FF5005D6699 /* hq4x.cpp */; }; ABFE150D14C92FF5005D6699 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150414C92FF5005D6699 /* lq2x.cpp */; }; ABFE150E14C92FF5005D6699 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABFE150614C92FF5005D6699 /* scanline.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* DeSmuME (Debug).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (Debug).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB00E87A14205EAE00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = translations/English.lproj/InfoPlist.strings; sourceTree = ""; }; AB00E87D14205EBC00DE561F /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/MainMenu.xib; sourceTree = ""; }; AB00E89114205ECC00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = translations/English.lproj/Localizable.strings; sourceTree = ""; }; AB01005C170D07AF00D70FBE /* InputProfileController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputProfileController.h; sourceTree = ""; }; AB01005D170D07B000D70FBE /* InputProfileController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputProfileController.mm; sourceTree = ""; }; AB02475B13886BF300E9F9AB /* KeyNames.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = KeyNames.plist; sourceTree = ""; }; AB02791814415E4C0075E58C /* Info (Debug).plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info (Debug).plist"; sourceTree = ""; }; AB0A0D1914AACA9600E83E91 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Execute_420x420.png; path = images/Icon_Execute_420x420.png; sourceTree = ""; }; AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Pause_420x420.png; path = images/Icon_Pause_420x420.png; sourceTree = ""; }; AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed1x_420x420.png; path = images/Icon_Speed1x_420x420.png; sourceTree = ""; }; AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed2x_420x420.png; path = images/Icon_Speed2x_420x420.png; sourceTree = ""; }; AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Blue_16x16.png; path = images/ColorSwatch_Blue_16x16.png; sourceTree = ""; }; AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Brown_16x16.png; path = images/ColorSwatch_Brown_16x16.png; sourceTree = ""; }; AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkBlue_16x16.png; path = images/ColorSwatch_DarkBlue_16x16.png; sourceTree = ""; }; AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkGreen_16x16.png; path = images/ColorSwatch_DarkGreen_16x16.png; sourceTree = ""; }; AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkPurple_16x16.png; path = images/ColorSwatch_DarkPurple_16x16.png; sourceTree = ""; }; AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Gray_16x16.png; path = images/ColorSwatch_Gray_16x16.png; sourceTree = ""; }; AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Green_16x16.png; path = images/ColorSwatch_Green_16x16.png; sourceTree = ""; }; AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_LimeGreen_16x16.png; path = images/ColorSwatch_LimeGreen_16x16.png; sourceTree = ""; }; AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Magenta_16x16.png; path = images/ColorSwatch_Magenta_16x16.png; sourceTree = ""; }; AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Orange_16x16.png; path = images/ColorSwatch_Orange_16x16.png; sourceTree = ""; }; AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Pink_16x16.png; path = images/ColorSwatch_Pink_16x16.png; sourceTree = ""; }; AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Red_16x16.png; path = images/ColorSwatch_Red_16x16.png; sourceTree = ""; }; AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_SeaGreen_16x16.png; path = images/ColorSwatch_SeaGreen_16x16.png; sourceTree = ""; }; AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Turquoise_16x16.png; path = images/ColorSwatch_Turquoise_16x16.png; sourceTree = ""; }; AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Violet_16x16.png; path = images/ColorSwatch_Violet_16x16.png; sourceTree = ""; }; AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Yellow_16x16.png; path = images/ColorSwatch_Yellow_16x16.png; sourceTree = ""; }; AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_128x128.png; path = images/Icon_ActionReplay_128x128.png; sourceTree = ""; }; AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_128x128.png; path = images/Icon_CodeBreaker_128x128.png; sourceTree = ""; }; AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = VideoFilterPreview_64x64.png; path = images/VideoFilterPreview_64x64.png; sourceTree = ""; }; AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowDown_420x420.png; path = images/Icon_ArrowDown_420x420.png; sourceTree = ""; }; AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowLeft_420x420.png; path = images/Icon_ArrowLeft_420x420.png; sourceTree = ""; }; AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowRight_420x420.png; path = images/Icon_ArrowRight_420x420.png; sourceTree = ""; }; AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowUp_420x420.png; path = images/Icon_ArrowUp_420x420.png; sourceTree = ""; }; AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DoubleSpeed_420x420.png; path = images/Icon_DoubleSpeed_420x420.png; sourceTree = ""; }; AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonA_420x420.png; path = images/Icon_DSButtonA_420x420.png; sourceTree = ""; }; AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonB_420x420.png; path = images/Icon_DSButtonB_420x420.png; sourceTree = ""; }; AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonL_420x420.png; path = images/Icon_DSButtonL_420x420.png; sourceTree = ""; }; AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonR_420x420.png; path = images/Icon_DSButtonR_420x420.png; sourceTree = ""; }; AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonSelect_420x420.png; path = images/Icon_DSButtonSelect_420x420.png; sourceTree = ""; }; AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonStart_420x420.png; path = images/Icon_DSButtonStart_420x420.png; sourceTree = ""; }; AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonX_420x420.png; path = images/Icon_DSButtonX_420x420.png; sourceTree = ""; }; AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonY_420x420.png; path = images/Icon_DSButtonY_420x420.png; sourceTree = ""; }; AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Emulation_420x420.png; path = images/Icon_Emulation_420x420.png; sourceTree = ""; }; AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Input_420x420.png; path = images/Icon_Input_420x420.png; sourceTree = ""; }; AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Microphone_420x420.png; path = images/Icon_Microphone_420x420.png; sourceTree = ""; }; AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_OpenROM_420x420.png; path = images/Icon_OpenROM_420x420.png; sourceTree = ""; }; AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Reset_420x420.png; path = images/Icon_Reset_420x420.png; sourceTree = ""; }; AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCCW_420x420.png; path = images/Icon_RotateCCW_420x420.png; sourceTree = ""; }; AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCW_420x420.png; path = images/Icon_RotateCW_420x420.png; sourceTree = ""; }; AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ShowHUD_420x420.png; path = images/Icon_ShowHUD_420x420.png; sourceTree = ""; }; AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = ""; }; AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = coreaudiosound.cpp; sourceTree = ""; }; AB1B9E601501A78000464647 /* ringbuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ringbuffer.cpp; sourceTree = ""; }; AB1B9E611501A78000464647 /* coreaudiosound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coreaudiosound.h; sourceTree = ""; }; AB1B9E621501A78000464647 /* ringbuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ringbuffer.h; sourceTree = ""; }; AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = macosx_10_5_compat.cpp; sourceTree = ""; }; AB29B32F16D4BEBF000EF671 /* InputManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputManager.h; sourceTree = ""; }; AB29B33016D4BEBF000EF671 /* InputManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputManager.mm; sourceTree = ""; }; AB350BA41478AC96007165AC /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; AB350D38147A1D8D007165AC /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = English; path = translations/English.lproj/HID_usage_strings.plist; sourceTree = ""; }; AB3A655C16CC5416001F5D4A /* EmuControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmuControllerDelegate.h; sourceTree = ""; }; AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EmuControllerDelegate.mm; sourceTree = ""; }; AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_GPU.mm; sourceTree = ""; }; AB3A656416CC5442001F5D4A /* cocoa_GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_GPU.h; sourceTree = ""; }; AB3ACB6614C2361100D7D192 /* appDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = appDelegate.h; sourceTree = ""; }; AB3ACB6714C2361100D7D192 /* appDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = appDelegate.mm; sourceTree = ""; }; AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cheatWindowDelegate.h; sourceTree = ""; }; AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cheatWindowDelegate.mm; sourceTree = ""; }; AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inputPrefsView.h; sourceTree = ""; }; AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = inputPrefsView.mm; sourceTree = ""; }; AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = preferencesWindowDelegate.h; sourceTree = ""; }; AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = preferencesWindowDelegate.mm; sourceTree = ""; }; AB3ACC3814C24D5400D7D192 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; }; AB3ACC3914C24D5400D7D192 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; }; AB3ACC3A14C24D5400D7D192 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; }; AB3ACC3B14C24D5400D7D192 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; }; AB3ACC3D14C24D5400D7D192 /* README.MAC */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.MAC; path = ../../README.MAC; sourceTree = SOURCE_ROOT; }; AB3E34C7134AF4500056477A /* cocoa_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_output.h; sourceTree = ""; }; AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = ""; }; AB4055ED169F59380016AC3E /* AsmJit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsmJit.h; sourceTree = ""; }; AB4055EE169F59380016AC3E /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Config.h; sourceTree = ""; }; AB4055EF169F59380016AC3E /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; AB4055F0169F59380016AC3E /* x86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86.h; sourceTree = ""; }; AB4055FE169F5DBB0016AC3E /* apibegin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apibegin.h; sourceTree = ""; }; AB4055FF169F5DBB0016AC3E /* apiend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apiend.h; sourceTree = ""; }; AB405600169F5DBB0016AC3E /* assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembler.cpp; sourceTree = ""; }; AB405601169F5DBB0016AC3E /* assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembler.h; sourceTree = ""; }; AB405602169F5DBB0016AC3E /* assert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assert.cpp; sourceTree = ""; }; AB405603169F5DBB0016AC3E /* assert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assert.h; sourceTree = ""; }; AB405604169F5DBB0016AC3E /* buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = buffer.cpp; sourceTree = ""; }; AB405605169F5DBB0016AC3E /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; AB405606169F5DBB0016AC3E /* build.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build.h; sourceTree = ""; }; AB405607169F5DBB0016AC3E /* compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compiler.cpp; sourceTree = ""; }; AB405608169F5DBB0016AC3E /* compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = ""; }; AB405609169F5DBB0016AC3E /* compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilercontext.cpp; sourceTree = ""; }; AB40560A169F5DBB0016AC3E /* compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilercontext.h; sourceTree = ""; }; AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilerfunc.cpp; sourceTree = ""; }; AB40560C169F5DBB0016AC3E /* compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilerfunc.h; sourceTree = ""; }; AB40560D169F5DBB0016AC3E /* compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compileritem.cpp; sourceTree = ""; }; AB40560E169F5DBB0016AC3E /* compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compileritem.h; sourceTree = ""; }; AB40560F169F5DBB0016AC3E /* context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = context.cpp; sourceTree = ""; }; AB405610169F5DBB0016AC3E /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; AB405611169F5DBB0016AC3E /* cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpuinfo.cpp; sourceTree = ""; }; AB405612169F5DBB0016AC3E /* cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpuinfo.h; sourceTree = ""; }; AB405613169F5DBB0016AC3E /* defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = defs.cpp; sourceTree = ""; }; AB405614169F5DBB0016AC3E /* defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defs.h; sourceTree = ""; }; AB405615169F5DBB0016AC3E /* func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = func.cpp; sourceTree = ""; }; AB405616169F5DBB0016AC3E /* func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = func.h; sourceTree = ""; }; AB405617169F5DBB0016AC3E /* intutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intutil.h; sourceTree = ""; }; AB405618169F5DBB0016AC3E /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; AB405619169F5DBB0016AC3E /* logger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logger.cpp; sourceTree = ""; }; AB40561A169F5DBB0016AC3E /* logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logger.h; sourceTree = ""; }; AB40561B169F5DBB0016AC3E /* memorymanager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymanager.cpp; sourceTree = ""; }; AB40561C169F5DBB0016AC3E /* memorymanager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymanager.h; sourceTree = ""; }; AB40561D169F5DBB0016AC3E /* memorymarker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymarker.cpp; sourceTree = ""; }; AB40561E169F5DBB0016AC3E /* memorymarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymarker.h; sourceTree = ""; }; AB40561F169F5DBB0016AC3E /* operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand.cpp; sourceTree = ""; }; AB405620169F5DBB0016AC3E /* operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand.h; sourceTree = ""; }; AB405621169F5DBB0016AC3E /* podvector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = podvector.h; sourceTree = ""; }; AB405622169F5DBB0016AC3E /* stringbuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringbuilder.cpp; sourceTree = ""; }; AB405623169F5DBB0016AC3E /* stringbuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringbuilder.h; sourceTree = ""; }; AB405624169F5DBB0016AC3E /* stringutil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutil.cpp; sourceTree = ""; }; AB405625169F5DBB0016AC3E /* stringutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutil.h; sourceTree = ""; }; AB405626169F5DBB0016AC3E /* virtualmemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = virtualmemory.cpp; sourceTree = ""; }; AB405627169F5DBB0016AC3E /* virtualmemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = virtualmemory.h; sourceTree = ""; }; AB405628169F5DBB0016AC3E /* zonememory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = zonememory.cpp; sourceTree = ""; }; AB405629169F5DBB0016AC3E /* zonememory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zonememory.h; sourceTree = ""; }; AB405664169F5DCC0016AC3E /* x86assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86assembler.cpp; sourceTree = ""; }; AB405665169F5DCC0016AC3E /* x86assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86assembler.h; sourceTree = ""; }; AB405666169F5DCC0016AC3E /* x86compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compiler.cpp; sourceTree = ""; }; AB405667169F5DCC0016AC3E /* x86compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compiler.h; sourceTree = ""; }; AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilercontext.cpp; sourceTree = ""; }; AB405669169F5DCC0016AC3E /* x86compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilercontext.h; sourceTree = ""; }; AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilerfunc.cpp; sourceTree = ""; }; AB40566B169F5DCC0016AC3E /* x86compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilerfunc.h; sourceTree = ""; }; AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compileritem.cpp; sourceTree = ""; }; AB40566D169F5DCC0016AC3E /* x86compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compileritem.h; sourceTree = ""; }; AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86cpuinfo.cpp; sourceTree = ""; }; AB40566F169F5DCC0016AC3E /* x86cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86cpuinfo.h; sourceTree = ""; }; AB405670169F5DCC0016AC3E /* x86defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86defs.cpp; sourceTree = ""; }; AB405671169F5DCC0016AC3E /* x86defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86defs.h; sourceTree = ""; }; AB405672169F5DCC0016AC3E /* x86func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86func.cpp; sourceTree = ""; }; AB405673169F5DCC0016AC3E /* x86func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86func.h; sourceTree = ""; }; AB405674169F5DCC0016AC3E /* x86operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86operand.cpp; sourceTree = ""; }; AB405675169F5DCC0016AC3E /* x86operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86operand.h; sourceTree = ""; }; AB405676169F5DCC0016AC3E /* x86util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86util.cpp; sourceTree = ""; }; AB405677169F5DCC0016AC3E /* x86util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86util.h; sourceTree = ""; }; AB4FCEBC1692AB82000F498F /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; AB5785FC17176AFC002C5FC7 /* OpenEmuBase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenEmuBase.framework; path = openemu/OpenEmuBase.framework; sourceTree = ""; }; AB58F32B1364F44B0074C376 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = ""; }; AB58F32C1364F44B0074C376 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = ""; }; AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = FileTypeInfo.plist; sourceTree = ""; }; AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender_3_2.cpp; path = ../OGLRender_3_2.cpp; sourceTree = ""; }; AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = ""; }; AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_FirmwareConfig.icns; sourceTree = ""; }; AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_jit.cpp; path = ../arm_jit.cpp; sourceTree = ""; }; AB796CA115CDCB4600C59155 /* arm_jit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arm_jit.h; path = ../arm_jit.h; sourceTree = ""; }; AB796CA215CDCB6B00C59155 /* instruction_attributes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = instruction_attributes.h; path = ../instruction_attributes.h; sourceTree = ""; }; AB796CA315CDCB6B00C59155 /* instructions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = instructions.h; path = ../instructions.h; sourceTree = ""; }; AB796D7015CDCBA200C59155 /* DeSmuME (Debug).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (Debug).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB80E04C142BC4A800A52038 /* cocoa_util.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_util.mm; sourceTree = ""; }; AB80E050142BC4FA00A52038 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = ""; }; AB817A34143EE2DB00A7DFE9 /* videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = videofilter.h; sourceTree = ""; }; AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = videofilter.cpp; sourceTree = ""; }; AB82445A1704AE9A00B8EE20 /* utilities.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utilities.c; sourceTree = ""; }; AB82445E1704AEC400B8EE20 /* utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = ""; }; AB8967D716D2ED0700F826F1 /* DisplayWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayWindowController.h; sourceTree = ""; }; AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayWindowController.mm; sourceTree = ""; }; AB8967DC16D2ED2700F826F1 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/DisplayWindow.xib; sourceTree = ""; }; AB901BDF1420706B00348EEC /* Japanese */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Japanese; path = translations/Japanese.lproj/Localizable.strings; sourceTree = ""; }; AB901BE01420706F00348EEC /* French */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = French; path = translations/French.lproj/Localizable.strings; sourceTree = ""; }; AB901BE11420707400348EEC /* Italian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Italian; path = translations/Italian.lproj/Localizable.strings; sourceTree = ""; }; AB901BE21420707800348EEC /* Chinese */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Chinese; path = translations/Chinese.lproj/Localizable.strings; sourceTree = ""; }; AB901BE31420707D00348EEC /* Norwegian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Norwegian; path = translations/Norwegian.lproj/Localizable.strings; sourceTree = ""; }; AB901BE41420708200348EEC /* Romanian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Romanian; path = translations/Romanian.lproj/Localizable.strings; sourceTree = ""; }; AB9971CE134EDA0800531BA7 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = ""; }; ABA6574914511EC90077E5E9 /* cocoa_cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_cheat.h; sourceTree = ""; }; ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_cheat.mm; sourceTree = ""; }; ABACB8DB1710B621003B845D /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; ABAD3E5913AF1D6D00502E1E /* AAFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAFilter.h; sourceTree = ""; }; ABAD3E5A13AF1D6D00502E1E /* BPMDetect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMDetect.h; sourceTree = ""; }; ABAD3E5B13AF1D6D00502E1E /* cpu_detect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_detect.h; sourceTree = ""; }; ABAD3E5C13AF1D6D00502E1E /* FIFOSampleBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSampleBuffer.h; sourceTree = ""; }; ABAD3E5D13AF1D6D00502E1E /* FIFOSamplePipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSamplePipe.h; sourceTree = ""; }; ABAD3E5E13AF1D6D00502E1E /* FIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRFilter.h; sourceTree = ""; }; ABAD3E5F13AF1D6D00502E1E /* RateTransposer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RateTransposer.h; sourceTree = ""; }; ABAD3E6013AF1D6D00502E1E /* SoundTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundTouch.h; sourceTree = ""; }; ABAD3E6113AF1D6D00502E1E /* STTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STTypes.h; sourceTree = ""; }; ABAD3E6213AF1D6D00502E1E /* TDStretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDStretch.h; sourceTree = ""; }; ABAD3E6313AF1D6D00502E1E /* WavFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WavFile.h; sourceTree = ""; }; ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AAFilter.cpp; sourceTree = ""; }; ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_detect_x86_gcc.cpp; sourceTree = ""; }; ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIFOSampleBuffer.cpp; sourceTree = ""; }; ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIRFilter.cpp; sourceTree = ""; }; ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmx_optimized.cpp; sourceTree = ""; }; ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RateTransposer.cpp; sourceTree = ""; }; ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SoundTouch.cpp; sourceTree = ""; }; ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sse_optimized.cpp; sourceTree = ""; }; ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TDStretch.cpp; sourceTree = ""; }; ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WavFile.cpp; sourceTree = ""; }; ABB3C63B1501BB8300E0C22E /* DeSmuME_Prefix_OpenEmu.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix_OpenEmu.pch; sourceTree = ""; }; ABB3C63C1501BB8300E0C22E /* Info (OpenEmu Plug-in).plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info (OpenEmu Plug-in).plist"; sourceTree = ""; }; ABB3C63D1501BB8300E0C22E /* NDSGameCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NDSGameCore.h; sourceTree = ""; }; ABB3C63E1501BB8300E0C22E /* NDSGameCore.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = NDSGameCore.mm; sourceTree = ""; }; ABB3C63F1501BB8300E0C22E /* OENDSSystemResponderClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OENDSSystemResponderClient.h; sourceTree = ""; }; ABB3C6401501BB8300E0C22E /* OESoundInterface.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OESoundInterface.mm; sourceTree = ""; }; ABB3C6411501BB8300E0C22E /* OESoundInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OESoundInterface.h; sourceTree = ""; }; ABB3C6471501BC6D00E0C22E /* DeSmuME.oecoreplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DeSmuME.oecoreplugin; sourceTree = BUILT_PRODUCTS_DIR; }; ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_32x32.png; path = Images/Icon_ActionReplay_32x32.png; sourceTree = ""; }; ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_32x32.png; path = Images/Icon_CodeBreaker_32x32.png; sourceTree = ""; }; ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DeSmuME_32x32.png; path = Images/Icon_DeSmuME_32x32.png; sourceTree = ""; }; ABBB421516B4A5F30012E5AB /* OGLRender_3_2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OGLRender_3_2.h; path = ../OGLRender_3_2.h; sourceTree = ""; }; ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = DefaultUserPrefs.plist; sourceTree = ""; }; ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = ""; }; ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeFull_16x16.png; path = images/Icon_VolumeFull_16x16.png; sourceTree = ""; }; ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeMute_16x16.png; path = images/Icon_VolumeMute_16x16.png; sourceTree = ""; }; ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeOneThird_16x16.png; path = images/Icon_VolumeOneThird_16x16.png; sourceTree = ""; }; ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeTwoThird_16x16.png; path = images/Icon_VolumeTwoThird_16x16.png; sourceTree = ""; }; ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; ABC570D4134431DA00E7B0B1 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultKeyMappings.plist; sourceTree = ""; }; ABD103FE1346652500AF11D1 /* cocoa_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_core.h; sourceTree = ""; }; ABD103FF1346652500AF11D1 /* cocoa_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input.h; sourceTree = ""; }; ABD104001346652500AF11D1 /* cocoa_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_rom.h; sourceTree = ""; }; ABD104011346652500AF11D1 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = ""; }; ABD104111346652500AF11D1 /* cocoa_input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input.mm; sourceTree = ""; }; ABD104121346652500AF11D1 /* cocoa_core.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_core.mm; sourceTree = ""; }; ABD104131346652500AF11D1 /* cocoa_rom.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_rom.mm; sourceTree = ""; }; ABD104141346652500AF11D1 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = ""; }; ABD104271346653B00AF11D1 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix.pch; sourceTree = ""; }; ABD10AE31715FCDD00B5729D /* audiosamplegenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiosamplegenerator.h; sourceTree = SOURCE_ROOT; }; ABD10AE41715FCDD00B5729D /* mic_ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mic_ext.h; sourceTree = SOURCE_ROOT; }; ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiosamplegenerator.cpp; sourceTree = SOURCE_ROOT; }; ABD10AE61715FCDD00B5729D /* mic_ext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mic_ext.cpp; sourceTree = SOURCE_ROOT; }; ABD1FE6B1345AC8400AF11D1 /* addons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = addons.h; path = ../addons.h; sourceTree = SOURCE_ROOT; }; ABD1FE6C1345AC8400AF11D1 /* agg2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = agg2d.h; path = ../agg2d.h; sourceTree = SOURCE_ROOT; }; ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aggdraw.h; path = ../aggdraw.h; sourceTree = SOURCE_ROOT; }; ABD1FE6F1345AC8400AF11D1 /* armcpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = armcpu.h; path = ../armcpu.h; sourceTree = SOURCE_ROOT; }; ABD1FE701345AC8400AF11D1 /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bios.h; path = ../bios.h; sourceTree = SOURCE_ROOT; }; ABD1FE711345AC8400AF11D1 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bits.h; path = ../bits.h; sourceTree = SOURCE_ROOT; }; ABD1FE721345AC8400AF11D1 /* cheatSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cheatSystem.h; path = ../cheatSystem.h; sourceTree = SOURCE_ROOT; }; ABD1FE731345AC8400AF11D1 /* commandline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = commandline.h; path = ../commandline.h; sourceTree = SOURCE_ROOT; }; ABD1FE741345AC8400AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../common.h; sourceTree = SOURCE_ROOT; }; ABD1FE751345AC8400AF11D1 /* cp15.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cp15.h; path = ../cp15.h; sourceTree = SOURCE_ROOT; }; ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ctrlssdl.h; path = ../ctrlssdl.h; sourceTree = SOURCE_ROOT; }; ABD1FE771345AC8400AF11D1 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../debug.h; sourceTree = SOURCE_ROOT; }; ABD1FE781345AC8400AF11D1 /* desmume_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = desmume_config.h; path = ../desmume_config.h; sourceTree = SOURCE_ROOT; }; ABD1FE791345AC8400AF11D1 /* Disassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Disassembler.h; path = ../Disassembler.h; sourceTree = SOURCE_ROOT; }; ABD1FE7A1345AC8400AF11D1 /* driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = driver.h; path = ../driver.h; sourceTree = SOURCE_ROOT; }; ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile_types.h; path = ../emufile_types.h; sourceTree = SOURCE_ROOT; }; ABD1FE7C1345AC8400AF11D1 /* emufile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile.h; path = ../emufile.h; sourceTree = SOURCE_ROOT; }; ABD1FE7D1345AC8400AF11D1 /* FIFO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FIFO.h; path = ../FIFO.h; sourceTree = SOURCE_ROOT; }; ABD1FE7E1345AC8400AF11D1 /* firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = firmware.h; path = ../firmware.h; sourceTree = SOURCE_ROOT; }; ABD1FE7F1345AC8400AF11D1 /* fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fs.h; path = ../fs.h; sourceTree = SOURCE_ROOT; }; ABD1FE801345AC8400AF11D1 /* gdbstub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gdbstub.h; path = ../gdbstub.h; sourceTree = SOURCE_ROOT; }; ABD1FE811345AC8400AF11D1 /* gfx3d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gfx3d.h; path = ../gfx3d.h; sourceTree = SOURCE_ROOT; }; ABD1FE821345AC8400AF11D1 /* GPU_osd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU_osd.h; path = ../GPU_osd.h; sourceTree = SOURCE_ROOT; }; ABD1FE831345AC8400AF11D1 /* GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU.h; path = ../GPU.h; sourceTree = SOURCE_ROOT; }; ABD1FE841345AC8400AF11D1 /* lua-engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lua-engine.h"; path = "../lua-engine.h"; sourceTree = SOURCE_ROOT; }; ABD1FE851345AC8400AF11D1 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../matrix.h; sourceTree = SOURCE_ROOT; }; ABD1FE861345AC8400AF11D1 /* mc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mc.h; path = ../mc.h; sourceTree = SOURCE_ROOT; }; ABD1FE871345AC8400AF11D1 /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mem.h; path = ../mem.h; sourceTree = SOURCE_ROOT; }; ABD1FE881345AC8400AF11D1 /* mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mic.h; path = ../mic.h; sourceTree = SOURCE_ROOT; }; ABD1FE891345AC8400AF11D1 /* MMU_timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU_timing.h; path = ../MMU_timing.h; sourceTree = SOURCE_ROOT; }; ABD1FE8A1345AC8400AF11D1 /* MMU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU.h; path = ../MMU.h; sourceTree = SOURCE_ROOT; }; ABD1FE8B1345AC8400AF11D1 /* movie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = movie.h; path = ../movie.h; sourceTree = SOURCE_ROOT; }; ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NDSSystem.h; path = ../NDSSystem.h; sourceTree = SOURCE_ROOT; }; ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OGLRender.h; path = ../OGLRender.h; sourceTree = SOURCE_ROOT; }; ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED_END.h; path = ../PACKED_END.h; sourceTree = SOURCE_ROOT; }; ABD1FE8F1345AC8400AF11D1 /* PACKED.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED.h; path = ../PACKED.h; sourceTree = SOURCE_ROOT; }; ABD1FE901345AC8400AF11D1 /* path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path.h; path = ../path.h; sourceTree = SOURCE_ROOT; }; ABD1FE911345AC8400AF11D1 /* rasterize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rasterize.h; path = ../rasterize.h; sourceTree = SOURCE_ROOT; }; ABD1FE921345AC8400AF11D1 /* readwrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = readwrite.h; path = ../readwrite.h; sourceTree = SOURCE_ROOT; }; ABD1FE931345AC8400AF11D1 /* registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = registers.h; path = ../registers.h; sourceTree = SOURCE_ROOT; }; ABD1FE941345AC8400AF11D1 /* render3D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = render3D.h; path = ../render3D.h; sourceTree = SOURCE_ROOT; }; ABD1FE951345AC8400AF11D1 /* ROMReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ROMReader.h; path = ../ROMReader.h; sourceTree = SOURCE_ROOT; }; ABD1FE961345AC8400AF11D1 /* rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rtc.h; path = ../rtc.h; sourceTree = SOURCE_ROOT; }; ABD1FE971345AC8400AF11D1 /* saves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = saves.h; path = ../saves.h; sourceTree = SOURCE_ROOT; }; ABD1FE991345AC8400AF11D1 /* slot1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slot1.h; path = ../slot1.h; sourceTree = SOURCE_ROOT; }; ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndsdl.h; path = ../sndsdl.h; sourceTree = SOURCE_ROOT; }; ABD1FE9B1345AC8400AF11D1 /* SPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPU.h; path = ../SPU.h; sourceTree = SOURCE_ROOT; }; ABD1FE9C1345AC8400AF11D1 /* texcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = texcache.h; path = ../texcache.h; sourceTree = SOURCE_ROOT; }; ABD1FE9E1345AC8400AF11D1 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../types.h; sourceTree = SOURCE_ROOT; }; ABD1FE9F1345AC8400AF11D1 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../version.h; sourceTree = SOURCE_ROOT; }; ABD1FEA01345AC8400AF11D1 /* wifi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wifi.h; path = ../wifi.h; sourceTree = SOURCE_ROOT; }; ABD1FEA11345AC8400AF11D1 /* addons.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = addons.cpp; path = ../addons.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aggdraw.cpp; path = ../aggdraw.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_instructions.cpp; path = ../arm_instructions.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = armcpu.cpp; path = ../armcpu.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA51345AC8400AF11D1 /* bios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bios.cpp; path = ../bios.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cheatSystem.cpp; path = ../cheatSystem.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA71345AC8400AF11D1 /* commandline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = commandline.cpp; path = ../commandline.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA81345AC8400AF11D1 /* common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.cpp; path = ../common.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEA91345AC8400AF11D1 /* cp15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cp15.cpp; path = ../cp15.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ctrlssdl.cpp; path = ../ctrlssdl.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAB1345AC8400AF11D1 /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cpp; path = ../debug.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = desmume_config.cpp; path = ../desmume_config.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Disassembler.cpp; path = ../Disassembler.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAE1345AC8400AF11D1 /* driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = driver.cpp; path = ../driver.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = emufile.cpp; path = ../emufile.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FIFO.cpp; path = ../FIFO.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB11345AC8400AF11D1 /* firmware.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = firmware.cpp; path = ../firmware.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "fs-linux.cpp"; path = "../fs-linux.cpp"; sourceTree = SOURCE_ROOT; }; ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gfx3d.cpp; path = ../gfx3d.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd_stub.cpp; path = ../GPU_osd_stub.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd.cpp; path = ../GPU_osd.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB71345AC8400AF11D1 /* GPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU.cpp; path = ../GPU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "lua-engine.cpp"; path = "../lua-engine.cpp"; sourceTree = SOURCE_ROOT; }; ABD1FEB91345AC8400AF11D1 /* matrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = matrix.cpp; path = ../matrix.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBA1345AC8400AF11D1 /* mc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mc.cpp; path = ../mc.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_alsa.cpp; path = ../mic_alsa.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_openal.cpp; path = ../mic_openal.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBD1345AC8400AF11D1 /* mic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic.cpp; path = ../mic.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MMU.cpp; path = ../MMU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEBF1345AC8400AF11D1 /* movie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = movie.cpp; path = ../movie.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NDSSystem.cpp; path = ../NDSSystem.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender.cpp; path = ../OGLRender.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC21345AC8400AF11D1 /* path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path.cpp; path = ../path.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rasterize.cpp; path = ../rasterize.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = readwrite.cpp; path = ../readwrite.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC51345AC8400AF11D1 /* render3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = render3D.cpp; path = ../render3D.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ROMReader.cpp; path = ../ROMReader.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC71345AC8400AF11D1 /* rtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rtc.cpp; path = ../rtc.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC81345AC8400AF11D1 /* saves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = saves.cpp; path = ../saves.cpp; sourceTree = SOURCE_ROOT; }; ABD1FEC91345AC8400AF11D1 /* slot1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot1.cpp; path = ../slot1.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndsdl.cpp; path = ../sndsdl.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECB1345AC8400AF11D1 /* SPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SPU.cpp; path = ../SPU.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECC1345AC8400AF11D1 /* texcache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = texcache.cpp; path = ../texcache.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thumb_instructions.cpp; path = ../thumb_instructions.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECE1345AC8400AF11D1 /* version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cpp; path = ../version.cpp; sourceTree = SOURCE_ROOT; }; ABD1FECF1345AC8400AF11D1 /* wifi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wifi.cpp; path = ../wifi.cpp; sourceTree = SOURCE_ROOT; }; ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_none.cpp; sourceTree = ""; }; ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_r4.cpp; sourceTree = ""; }; ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail.cpp; sourceTree = ""; }; ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_expMemory.cpp; sourceTree = ""; }; ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_gbagame.cpp; sourceTree = ""; }; ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_guitarGrip.cpp; sourceTree = ""; }; ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_mpcf.cpp; sourceTree = ""; }; ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_none.cpp; sourceTree = ""; }; ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_paddle.cpp; sourceTree = ""; }; ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_piano.cpp; sourceTree = ""; }; ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_rumblepak.cpp; sourceTree = ""; }; ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gdbstub.cpp; sourceTree = ""; }; ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gdbstub_internal.h; sourceTree = ""; }; ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ConvertUTF.c; sourceTree = ""; }; ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConvertUTF.h; sourceTree = ""; }; ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = datetime.cpp; sourceTree = ""; }; ABD1FF201345ACBF00AF11D1 /* datetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datetime.h; sourceTree = ""; }; ABD1FF221345ACBF00AF11D1 /* crc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = crc.cpp; sourceTree = ""; }; ABD1FF231345ACBF00AF11D1 /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc.h; sourceTree = ""; }; ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decrypt.cpp; sourceTree = ""; }; ABD1FF251345ACBF00AF11D1 /* decrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decrypt.h; sourceTree = ""; }; ABD1FF261345ACBF00AF11D1 /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; ABD1FF271345ACBF00AF11D1 /* header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = header.h; sourceTree = ""; }; ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dlditool.cpp; sourceTree = ""; }; ABD1FF291345ACBF00AF11D1 /* emufat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emufat.cpp; sourceTree = ""; }; ABD1FF2A1345ACBF00AF11D1 /* emufat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat.h; sourceTree = ""; }; ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat_types.h; sourceTree = ""; }; ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = guid.cpp; sourceTree = ""; }; ABD1FF2D1345ACBF00AF11D1 /* guid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guid.h; sourceTree = ""; }; ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_ops.h; sourceTree = ""; }; ABD1FF301345ACBF00AF11D1 /* cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cpp; sourceTree = ""; }; ABD1FF311345ACBF00AF11D1 /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; ABD1FF321345ACBF00AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; ABD1FF331345ACBF00AF11D1 /* directory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = directory.cpp; sourceTree = ""; }; ABD1FF341345ACBF00AF11D1 /* directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directory.h; sourceTree = ""; }; ABD1FF351345ACBF00AF11D1 /* disc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disc.cpp; sourceTree = ""; }; ABD1FF361345ACBF00AF11D1 /* disc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc.h; sourceTree = ""; }; ABD1FF371345ACBF00AF11D1 /* disc_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc_io.h; sourceTree = ""; }; ABD1FF381345ACBF00AF11D1 /* fat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fat.h; sourceTree = ""; }; ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatdir.cpp; sourceTree = ""; }; ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatdir.h; sourceTree = ""; }; ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatfile.cpp; sourceTree = ""; }; ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatfile.h; sourceTree = ""; }; ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_allocation_table.cpp; sourceTree = ""; }; ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_allocation_table.h; sourceTree = ""; }; ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filetime.cpp; sourceTree = ""; }; ABD1FF401345ACBF00AF11D1 /* filetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filetime.h; sourceTree = ""; }; ABD1FF411345ACBF00AF11D1 /* libfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat.cpp; sourceTree = ""; }; ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_pc.h; sourceTree = ""; }; ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat_public_api.cpp; sourceTree = ""; }; ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_public_api.h; sourceTree = ""; }; ABD1FF451345ACBF00AF11D1 /* lock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lock.cpp; sourceTree = ""; }; ABD1FF461345ACBF00AF11D1 /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_allocate.h; sourceTree = ""; }; ABD1FF481345ACBF00AF11D1 /* partition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = partition.cpp; sourceTree = ""; }; ABD1FF491345ACBF00AF11D1 /* partition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition.h; sourceTree = ""; }; ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = ""; }; ABD1FF4B1345ACBF00AF11D1 /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; ABD1FF4C1345ACBF00AF11D1 /* task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = task.cpp; sourceTree = ""; }; ABD1FF4D1345ACBF00AF11D1 /* task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = task.h; sourceTree = ""; }; ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = valuearray.h; sourceTree = ""; }; ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vfat.cpp; sourceTree = ""; }; ABD1FF501345ACBF00AF11D1 /* vfat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vfat.h; sourceTree = ""; }; ABD1FF511345ACBF00AF11D1 /* xstring.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xstring.cpp; sourceTree = ""; }; ABD1FF521345ACBF00AF11D1 /* xstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xstring.h; sourceTree = ""; }; ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metaspu.cpp; sourceTree = ""; }; ABD1FF781345ACFA00AF11D1 /* metaspu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metaspu.h; sourceTree = ""; }; ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = ""; }; ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = ""; }; ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = ""; }; ABD42045172319D1006A9B46 /* FileMigrationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMigrationDelegate.h; sourceTree = ""; }; ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FileMigrationDelegate.mm; sourceTree = ""; }; ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = ""; }; ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = ""; }; ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = ""; }; ABE670261415DE6C00E8E4C9 /* tinystr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinystr.h; sourceTree = ""; }; ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxml.cpp; sourceTree = ""; }; ABE670281415DE6C00E8E4C9 /* tinyxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinyxml.h; sourceTree = ""; }; ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlerror.cpp; sourceTree = ""; }; ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlparser.cpp; sourceTree = ""; }; ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_firmware.h; sourceTree = ""; }; ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_firmware.mm; sourceTree = ""; }; ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = ""; }; ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_DeSmuME.icns; sourceTree = ""; }; ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = ""; }; ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = ""; }; ABF2B9F81690412A000FF7C0 /* troubleshootingWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = troubleshootingWindowDelegate.h; sourceTree = ""; }; ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = troubleshootingWindowDelegate.mm; sourceTree = ""; }; ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 2xsai.cpp; sourceTree = ""; }; ABFE14FB14C92FF5005D6699 /* bilinear.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bilinear.cpp; sourceTree = ""; }; ABFE14FC14C92FF5005D6699 /* epx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = epx.cpp; sourceTree = ""; }; ABFE14FD14C92FF5005D6699 /* filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = ""; }; ABFE14FE14C92FF5005D6699 /* hq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq2x.cpp; sourceTree = ""; }; ABFE14FF14C92FF5005D6699 /* hq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq2x.h; sourceTree = ""; }; ABFE150014C92FF5005D6699 /* hq4x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq4x.cpp; sourceTree = ""; }; ABFE150214C92FF5005D6699 /* hq4x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq4x.h; sourceTree = ""; }; ABFE150314C92FF5005D6699 /* interp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interp.h; sourceTree = ""; }; ABFE150414C92FF5005D6699 /* lq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lq2x.cpp; sourceTree = ""; }; ABFE150514C92FF5005D6699 /* lq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lq2x.h; sourceTree = ""; }; ABFE150614C92FF5005D6699 /* scanline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scanline.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */, ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */, ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */, ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */, AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */, ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */, AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB796D6515CDCBA200C59155 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */, AB796D6615CDCBA200C59155 /* AppKit.framework in Frameworks */, ABACB8DC1710B621003B845D /* AudioToolbox.framework in Frameworks */, AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */, AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */, AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */, AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */, AB796D6B15CDCBA200C59155 /* OpenGL.framework in Frameworks */, AB796D6C15CDCBA200C59155 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; ABB3C6441501BC6D00E0C22E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */, ABB3C6641501BF8A00E0C22E /* AppKit.framework in Frameworks */, ABACB8DE1710B65F003B845D /* AudioToolbox.framework in Frameworks */, ABB3C6651501BF8A00E0C22E /* AudioUnit.framework in Frameworks */, ABB3C6661501BF8A00E0C22E /* Cocoa.framework in Frameworks */, ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */, ABB3C6691501BF8A00E0C22E /* OpenGL.framework in Frameworks */, ABB3C66A1501BF8A00E0C22E /* libz.dylib in Frameworks */, AB5785FD17176AFC002C5FC7 /* OpenEmuBase.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Cocoa Port */ = { isa = PBXGroup; children = ( ABB3C63A1501BB8300E0C22E /* openemu */, AB3ACB6514C2361100D7D192 /* userinterface */, AB82445A1704AE9A00B8EE20 /* utilities.c */, ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */, AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */, AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */, ABD10AE61715FCDD00B5729D /* mic_ext.cpp */, AB1B9E601501A78000464647 /* ringbuffer.cpp */, ABD104141346652500AF11D1 /* sndOSX.cpp */, ABD10AE31715FCDD00B5729D /* audiosamplegenerator.h */, ABA6574914511EC90077E5E9 /* cocoa_cheat.h */, ABD103FE1346652500AF11D1 /* cocoa_core.h */, AB58F32B1364F44B0074C376 /* cocoa_file.h */, ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */, AB9971CE134EDA0800531BA7 /* cocoa_globals.h */, AB3A656416CC5442001F5D4A /* cocoa_GPU.h */, ABD103FF1346652500AF11D1 /* cocoa_input.h */, AB3E34C7134AF4500056477A /* cocoa_output.h */, ABD104001346652500AF11D1 /* cocoa_rom.h */, AB80E050142BC4FA00A52038 /* cocoa_util.h */, ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */, AB1B9E611501A78000464647 /* coreaudiosound.h */, ABD10AE41715FCDD00B5729D /* mic_ext.h */, AB1B9E621501A78000464647 /* ringbuffer.h */, ABD104011346652500AF11D1 /* sndOSX.h */, AB82445E1704AEC400B8EE20 /* utilities.h */, ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */, ABD104121346652500AF11D1 /* cocoa_core.mm */, AB58F32C1364F44B0074C376 /* cocoa_file.mm */, ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */, AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */, ABD104111346652500AF11D1 /* cocoa_input.mm */, AB3E34C8134AF4500056477A /* cocoa_output.mm */, ABD104131346652500AF11D1 /* cocoa_rom.mm */, AB80E04C142BC4A800A52038 /* cocoa_util.mm */, ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */, ); name = "Cocoa Port"; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( AB4FCEBC1692AB82000F498F /* Accelerate.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, ABACB8DB1710B621003B845D /* AudioToolbox.framework */, ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, AB350BA41478AC96007165AC /* IOKit.framework */, ABC570D4134431DA00E7B0B1 /* OpenGL.framework */, AB0A0D1914AACA9600E83E91 /* libz.dylib */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( AB5785FC17176AFC002C5FC7 /* OpenEmuBase.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* DeSmuME (Debug).app */, ABB3C6471501BC6D00E0C22E /* DeSmuME.oecoreplugin */, AB796D7015CDCBA200C59155 /* DeSmuME (Debug).app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* DeSmuME */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Cocoa Port */, ABC572B7134592D900E7B0B1 /* Core */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 19C28FACFE9D520D11CA2CBB /* Products */, 29B97317FDCFA39411CA2CEA /* Resources */, ); name = DeSmuME; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( ABD104271346653B00AF11D1 /* main.m */, ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( ABC2ECD613B1C87000FAAA2A /* Images */, AB00E87C14205EBC00DE561F /* MainMenu.xib */, AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */, AB350D3A147A1D93007165AC /* HID_usage_strings.plist */, 8D1107310486CEB800E47090 /* Info.plist */, AB02791814415E4C0075E58C /* Info (Debug).plist */, AB00E87914205EAE00DE561F /* InfoPlist.strings */, AB02475B13886BF300E9F9AB /* KeyNames.plist */, AB901BDD1420706100348EEC /* Localizable.strings */, ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */, ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */, AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */, AB3ACC3814C24D5400D7D192 /* AUTHORS */, AB3ACC3914C24D5400D7D192 /* ChangeLog */, AB3ACC3A14C24D5400D7D192 /* COPYING */, AB3ACC3B14C24D5400D7D192 /* README */, AB3ACC3D14C24D5400D7D192 /* README.MAC */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; AB3ACB6514C2361100D7D192 /* userinterface */ = { isa = PBXGroup; children = ( AB3ACB6614C2361100D7D192 /* appDelegate.h */, AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */, AB8967D716D2ED0700F826F1 /* DisplayWindowController.h */, AB3A655C16CC5416001F5D4A /* EmuControllerDelegate.h */, ABD42045172319D1006A9B46 /* FileMigrationDelegate.h */, AB29B32F16D4BEBF000EF671 /* InputManager.h */, AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB01005C170D07AF00D70FBE /* InputProfileController.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, ABF2B9F81690412A000FF7C0 /* troubleshootingWindowDelegate.h */, AB3ACB6714C2361100D7D192 /* appDelegate.mm */, AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */, AB8967D816D2ED0700F826F1 /* DisplayWindowController.mm */, AB3A655D16CC5421001F5D4A /* EmuControllerDelegate.mm */, ABD42046172319D1006A9B46 /* FileMigrationDelegate.mm */, AB29B33016D4BEBF000EF671 /* InputManager.mm */, AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB01005D170D07B000D70FBE /* InputProfileController.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, ABF2B9FA16904133000FF7C0 /* troubleshootingWindowDelegate.mm */, ); path = userinterface; sourceTree = ""; }; AB4055FD169F5DBB0016AC3E /* core */ = { isa = PBXGroup; children = ( AB405600169F5DBB0016AC3E /* assembler.cpp */, AB405602169F5DBB0016AC3E /* assert.cpp */, AB405604169F5DBB0016AC3E /* buffer.cpp */, AB405607169F5DBB0016AC3E /* compiler.cpp */, AB405609169F5DBB0016AC3E /* compilercontext.cpp */, AB40560B169F5DBB0016AC3E /* compilerfunc.cpp */, AB40560D169F5DBB0016AC3E /* compileritem.cpp */, AB40560F169F5DBB0016AC3E /* context.cpp */, AB405611169F5DBB0016AC3E /* cpuinfo.cpp */, AB405613169F5DBB0016AC3E /* defs.cpp */, AB405615169F5DBB0016AC3E /* func.cpp */, AB405619169F5DBB0016AC3E /* logger.cpp */, AB40561B169F5DBB0016AC3E /* memorymanager.cpp */, AB40561D169F5DBB0016AC3E /* memorymarker.cpp */, AB40561F169F5DBB0016AC3E /* operand.cpp */, AB405622169F5DBB0016AC3E /* stringbuilder.cpp */, AB405624169F5DBB0016AC3E /* stringutil.cpp */, AB405626169F5DBB0016AC3E /* virtualmemory.cpp */, AB405628169F5DBB0016AC3E /* zonememory.cpp */, AB4055FE169F5DBB0016AC3E /* apibegin.h */, AB4055FF169F5DBB0016AC3E /* apiend.h */, AB405601169F5DBB0016AC3E /* assembler.h */, AB405603169F5DBB0016AC3E /* assert.h */, AB405605169F5DBB0016AC3E /* buffer.h */, AB405606169F5DBB0016AC3E /* build.h */, AB405608169F5DBB0016AC3E /* compiler.h */, AB40560A169F5DBB0016AC3E /* compilercontext.h */, AB40560C169F5DBB0016AC3E /* compilerfunc.h */, AB40560E169F5DBB0016AC3E /* compileritem.h */, AB405610169F5DBB0016AC3E /* context.h */, AB405612169F5DBB0016AC3E /* cpuinfo.h */, AB405614169F5DBB0016AC3E /* defs.h */, AB405616169F5DBB0016AC3E /* func.h */, AB405617169F5DBB0016AC3E /* intutil.h */, AB405618169F5DBB0016AC3E /* lock.h */, AB40561A169F5DBB0016AC3E /* logger.h */, AB40561C169F5DBB0016AC3E /* memorymanager.h */, AB40561E169F5DBB0016AC3E /* memorymarker.h */, AB405620169F5DBB0016AC3E /* operand.h */, AB405621169F5DBB0016AC3E /* podvector.h */, AB405623169F5DBB0016AC3E /* stringbuilder.h */, AB405625169F5DBB0016AC3E /* stringutil.h */, AB405627169F5DBB0016AC3E /* virtualmemory.h */, AB405629169F5DBB0016AC3E /* zonememory.h */, ); path = core; sourceTree = ""; }; AB405663169F5DCC0016AC3E /* x86 */ = { isa = PBXGroup; children = ( AB405664169F5DCC0016AC3E /* x86assembler.cpp */, AB405666169F5DCC0016AC3E /* x86compiler.cpp */, AB405668169F5DCC0016AC3E /* x86compilercontext.cpp */, AB40566A169F5DCC0016AC3E /* x86compilerfunc.cpp */, AB40566C169F5DCC0016AC3E /* x86compileritem.cpp */, AB40566E169F5DCC0016AC3E /* x86cpuinfo.cpp */, AB405670169F5DCC0016AC3E /* x86defs.cpp */, AB405672169F5DCC0016AC3E /* x86func.cpp */, AB405674169F5DCC0016AC3E /* x86operand.cpp */, AB405676169F5DCC0016AC3E /* x86util.cpp */, AB405665169F5DCC0016AC3E /* x86assembler.h */, AB405667169F5DCC0016AC3E /* x86compiler.h */, AB405669169F5DCC0016AC3E /* x86compilercontext.h */, AB40566B169F5DCC0016AC3E /* x86compilerfunc.h */, AB40566D169F5DCC0016AC3E /* x86compileritem.h */, AB40566F169F5DCC0016AC3E /* x86cpuinfo.h */, AB405671169F5DCC0016AC3E /* x86defs.h */, AB405673169F5DCC0016AC3E /* x86func.h */, AB405675169F5DCC0016AC3E /* x86operand.h */, AB405677169F5DCC0016AC3E /* x86util.h */, ); path = x86; sourceTree = ""; }; AB796D7415CDD20E00C59155 /* AsmJit */ = { isa = PBXGroup; children = ( AB4055ED169F59380016AC3E /* AsmJit.h */, AB4055EE169F59380016AC3E /* Config.h */, AB4055EF169F59380016AC3E /* core.h */, AB4055F0169F59380016AC3E /* x86.h */, AB4055FD169F5DBB0016AC3E /* core */, AB405663169F5DCC0016AC3E /* x86 */, ); path = AsmJit; sourceTree = ""; }; AB85D77414ABE42100286B70 /* App Icons */ = { isa = PBXGroup; children = ( ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */, ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */, ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */, ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */, AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */, ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */, ); name = "App Icons"; sourceTree = ""; }; ABB3C63A1501BB8300E0C22E /* openemu */ = { isa = PBXGroup; children = ( ABB3C6401501BB8300E0C22E /* OESoundInterface.mm */, ABB3C63D1501BB8300E0C22E /* NDSGameCore.h */, ABB3C63F1501BB8300E0C22E /* OENDSSystemResponderClient.h */, ABB3C6411501BB8300E0C22E /* OESoundInterface.h */, ABB3C63E1501BB8300E0C22E /* NDSGameCore.mm */, ABB3C63B1501BB8300E0C22E /* DeSmuME_Prefix_OpenEmu.pch */, ABB3C63C1501BB8300E0C22E /* Info (OpenEmu Plug-in).plist */, ); path = openemu; sourceTree = ""; }; ABC2ECD613B1C87000FAAA2A /* Images */ = { isa = PBXGroup; children = ( AB85D77414ABE42100286B70 /* App Icons */, AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */, AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */, AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */, AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */, AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */, AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */, AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */, AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */, AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */, AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */, AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */, AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */, AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */, AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */, AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */, AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */, AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */, ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */, AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */, AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */, AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */, AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */, AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */, ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */, ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */, AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */, AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */, AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */, AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */, AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */, AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */, AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */, AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */, AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */, AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */, AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */, AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */, AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */, AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */, AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */, AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */, AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */, AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */, AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */, AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */, AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */, AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */, ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */, ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */, ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */, ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */, AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */, ); name = Images; sourceTree = ""; }; ABC572B7134592D900E7B0B1 /* Core */ = { isa = PBXGroup; children = ( ABD1FEFF1345AC9B00AF11D1 /* addons */, ABD1FF161345ACA900AF11D1 /* gdbstub */, ABFE14F914C92FF5005D6699 /* filter */, ABD1FF761345ACFA00AF11D1 /* metaspu */, ABD1FF1C1345ACBF00AF11D1 /* utils */, ABD1FEA11345AC8400AF11D1 /* addons.cpp */, ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */, ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */, AB796C9B15CDCB0F00C59155 /* arm_jit.cpp */, ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */, ABD1FEA51345AC8400AF11D1 /* bios.cpp */, ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */, ABD1FEA71345AC8400AF11D1 /* commandline.cpp */, ABD1FEA81345AC8400AF11D1 /* common.cpp */, ABD1FEA91345AC8400AF11D1 /* cp15.cpp */, ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */, ABD1FEAB1345AC8400AF11D1 /* debug.cpp */, ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */, ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */, ABD1FEAE1345AC8400AF11D1 /* driver.cpp */, ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */, ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */, ABD1FEB11345AC8400AF11D1 /* firmware.cpp */, ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */, ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */, ABD1FEB71345AC8400AF11D1 /* GPU.cpp */, ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */, ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */, ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */, ABD1FEB91345AC8400AF11D1 /* matrix.cpp */, ABD1FEBA1345AC8400AF11D1 /* mc.cpp */, ABD1FEBD1345AC8400AF11D1 /* mic.cpp */, ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */, ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */, ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */, ABD1FEBF1345AC8400AF11D1 /* movie.cpp */, ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */, ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */, AB68A0DA16B139BC00DE0546 /* OGLRender_3_2.cpp */, ABD1FEC21345AC8400AF11D1 /* path.cpp */, ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */, ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */, ABD1FEC51345AC8400AF11D1 /* render3D.cpp */, ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */, ABD1FEC71345AC8400AF11D1 /* rtc.cpp */, ABD1FEC81345AC8400AF11D1 /* saves.cpp */, ABD1FEC91345AC8400AF11D1 /* slot1.cpp */, ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */, ABD1FECB1345AC8400AF11D1 /* SPU.cpp */, ABD1FECC1345AC8400AF11D1 /* texcache.cpp */, ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */, ABD1FECE1345AC8400AF11D1 /* version.cpp */, ABD1FECF1345AC8400AF11D1 /* wifi.cpp */, ABD1FE6B1345AC8400AF11D1 /* addons.h */, ABD1FE6C1345AC8400AF11D1 /* agg2d.h */, ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */, ABD1FE6F1345AC8400AF11D1 /* armcpu.h */, AB796CA115CDCB4600C59155 /* arm_jit.h */, ABD1FE701345AC8400AF11D1 /* bios.h */, ABD1FE711345AC8400AF11D1 /* bits.h */, ABD1FE721345AC8400AF11D1 /* cheatSystem.h */, ABD1FE731345AC8400AF11D1 /* commandline.h */, ABD1FE741345AC8400AF11D1 /* common.h */, ABD1FE751345AC8400AF11D1 /* cp15.h */, ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */, ABD1FE771345AC8400AF11D1 /* debug.h */, ABD1FE781345AC8400AF11D1 /* desmume_config.h */, ABD1FE791345AC8400AF11D1 /* Disassembler.h */, ABD1FE7A1345AC8400AF11D1 /* driver.h */, ABD1FE7C1345AC8400AF11D1 /* emufile.h */, ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */, ABD1FE7D1345AC8400AF11D1 /* FIFO.h */, ABD1FE7E1345AC8400AF11D1 /* firmware.h */, ABD1FE7F1345AC8400AF11D1 /* fs.h */, ABD1FE801345AC8400AF11D1 /* gdbstub.h */, ABD1FE811345AC8400AF11D1 /* gfx3d.h */, ABD1FE831345AC8400AF11D1 /* GPU.h */, ABD1FE821345AC8400AF11D1 /* GPU_osd.h */, AB796CA215CDCB6B00C59155 /* instruction_attributes.h */, AB796CA315CDCB6B00C59155 /* instructions.h */, ABD1FE841345AC8400AF11D1 /* lua-engine.h */, ABD1FE851345AC8400AF11D1 /* matrix.h */, ABD1FE861345AC8400AF11D1 /* mc.h */, ABD1FE871345AC8400AF11D1 /* mem.h */, ABD1FE881345AC8400AF11D1 /* mic.h */, ABD1FE8A1345AC8400AF11D1 /* MMU.h */, ABD1FE891345AC8400AF11D1 /* MMU_timing.h */, ABD1FE8B1345AC8400AF11D1 /* movie.h */, ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */, ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */, ABBB421516B4A5F30012E5AB /* OGLRender_3_2.h */, ABD1FE8F1345AC8400AF11D1 /* PACKED.h */, ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */, ABD1FE901345AC8400AF11D1 /* path.h */, ABD1FE911345AC8400AF11D1 /* rasterize.h */, ABD1FE921345AC8400AF11D1 /* readwrite.h */, ABD1FE931345AC8400AF11D1 /* registers.h */, ABD1FE941345AC8400AF11D1 /* render3D.h */, ABD1FE951345AC8400AF11D1 /* ROMReader.h */, ABD1FE961345AC8400AF11D1 /* rtc.h */, ABD1FE971345AC8400AF11D1 /* saves.h */, ABD1FE991345AC8400AF11D1 /* slot1.h */, ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */, ABD1FE9B1345AC8400AF11D1 /* SPU.h */, ABD1FE9C1345AC8400AF11D1 /* texcache.h */, ABD1FE9E1345AC8400AF11D1 /* types.h */, ABD1FE9F1345AC8400AF11D1 /* version.h */, ABD1FEA01345AC8400AF11D1 /* wifi.h */, ); name = Core; sourceTree = ""; }; ABD1FEFF1345AC9B00AF11D1 /* addons */ = { isa = PBXGroup; children = ( ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */, ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */, AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */, ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */, ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */, ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */, ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */, ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */, ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */, ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */, ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */, ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */, ); name = addons; path = ../addons; sourceTree = SOURCE_ROOT; }; ABD1FF161345ACA900AF11D1 /* gdbstub */ = { isa = PBXGroup; children = ( ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */, ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */, ); name = gdbstub; path = ../gdbstub; sourceTree = SOURCE_ROOT; }; ABD1FF1C1345ACBF00AF11D1 /* utils */ = { isa = PBXGroup; children = ( AB796D7415CDD20E00C59155 /* AsmJit */, ABD1FF211345ACBF00AF11D1 /* decrypt */, ABD1FF2E1345ACBF00AF11D1 /* libfat */, ABE670241415DE6C00E8E4C9 /* tinyxml */, ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */, ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */, ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */, ABD1FF291345ACBF00AF11D1 /* emufat.cpp */, ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */, ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */, ABD1FF4C1345ACBF00AF11D1 /* task.cpp */, ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */, ABD1FF511345ACBF00AF11D1 /* xstring.cpp */, ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */, ABD1FF201345ACBF00AF11D1 /* datetime.h */, ABD1FF2A1345ACBF00AF11D1 /* emufat.h */, ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */, ABD1FF2D1345ACBF00AF11D1 /* guid.h */, ABD1FF4B1345ACBF00AF11D1 /* md5.h */, ABD1FF4D1345ACBF00AF11D1 /* task.h */, ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */, ABD1FF501345ACBF00AF11D1 /* vfat.h */, ABD1FF521345ACBF00AF11D1 /* xstring.h */, ); name = utils; path = ../utils; sourceTree = SOURCE_ROOT; }; ABD1FF211345ACBF00AF11D1 /* decrypt */ = { isa = PBXGroup; children = ( ABD1FF221345ACBF00AF11D1 /* crc.cpp */, ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */, ABD1FF261345ACBF00AF11D1 /* header.cpp */, ABD1FF231345ACBF00AF11D1 /* crc.h */, ABD1FF251345ACBF00AF11D1 /* decrypt.h */, ABD1FF271345ACBF00AF11D1 /* header.h */, ); path = decrypt; sourceTree = ""; }; ABD1FF2E1345ACBF00AF11D1 /* libfat */ = { isa = PBXGroup; children = ( ABD1FF301345ACBF00AF11D1 /* cache.cpp */, ABD1FF331345ACBF00AF11D1 /* directory.cpp */, ABD1FF351345ACBF00AF11D1 /* disc.cpp */, ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */, ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */, ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */, ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */, ABD1FF411345ACBF00AF11D1 /* libfat.cpp */, ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */, ABD1FF451345ACBF00AF11D1 /* lock.cpp */, ABD1FF481345ACBF00AF11D1 /* partition.cpp */, ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */, ABD1FF311345ACBF00AF11D1 /* cache.h */, ABD1FF321345ACBF00AF11D1 /* common.h */, ABD1FF341345ACBF00AF11D1 /* directory.h */, ABD1FF361345ACBF00AF11D1 /* disc.h */, ABD1FF371345ACBF00AF11D1 /* disc_io.h */, ABD1FF381345ACBF00AF11D1 /* fat.h */, ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */, ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */, ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */, ABD1FF401345ACBF00AF11D1 /* filetime.h */, ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */, ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */, ABD1FF461345ACBF00AF11D1 /* lock.h */, ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */, ABD1FF491345ACBF00AF11D1 /* partition.h */, ); path = libfat; sourceTree = ""; }; ABD1FF761345ACFA00AF11D1 /* metaspu */ = { isa = PBXGroup; children = ( ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */, ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */, ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */, ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */, ABD1FF781345ACFA00AF11D1 /* metaspu.h */, ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */, ); name = metaspu; path = ../metaspu; sourceTree = SOURCE_ROOT; }; ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */ = { isa = PBXGroup; children = ( ABAD3E5913AF1D6D00502E1E /* AAFilter.h */, ABAD3E5A13AF1D6D00502E1E /* BPMDetect.h */, ABAD3E5B13AF1D6D00502E1E /* cpu_detect.h */, ABAD3E5C13AF1D6D00502E1E /* FIFOSampleBuffer.h */, ABAD3E5D13AF1D6D00502E1E /* FIFOSamplePipe.h */, ABAD3E5E13AF1D6D00502E1E /* FIRFilter.h */, ABAD3E5F13AF1D6D00502E1E /* RateTransposer.h */, ABAD3E6013AF1D6D00502E1E /* SoundTouch.h */, ABAD3E6113AF1D6D00502E1E /* STTypes.h */, ABAD3E6213AF1D6D00502E1E /* TDStretch.h */, ABAD3E6313AF1D6D00502E1E /* WavFile.h */, ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */, ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */, ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */, ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */, ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */, ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */, ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */, ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */, ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */, ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */, ); path = SoundTouch; sourceTree = ""; }; ABE670241415DE6C00E8E4C9 /* tinyxml */ = { isa = PBXGroup; children = ( ABE670251415DE6C00E8E4C9 /* tinystr.cpp */, ABE670261415DE6C00E8E4C9 /* tinystr.h */, ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */, ABE670281415DE6C00E8E4C9 /* tinyxml.h */, ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */, ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */, ); path = tinyxml; sourceTree = ""; }; ABFE14F914C92FF5005D6699 /* filter */ = { isa = PBXGroup; children = ( ABFE14FA14C92FF5005D6699 /* 2xsai.cpp */, ABFE14FB14C92FF5005D6699 /* bilinear.cpp */, ABFE14FC14C92FF5005D6699 /* epx.cpp */, ABFE14FE14C92FF5005D6699 /* hq2x.cpp */, ABFE150014C92FF5005D6699 /* hq4x.cpp */, ABFE150414C92FF5005D6699 /* lq2x.cpp */, ABFE150614C92FF5005D6699 /* scanline.cpp */, AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */, ABFE14FD14C92FF5005D6699 /* filter.h */, ABFE14FF14C92FF5005D6699 /* hq2x.h */, ABFE150214C92FF5005D6699 /* hq4x.h */, ABFE150314C92FF5005D6699 /* interp.h */, ABFE150514C92FF5005D6699 /* lq2x.h */, AB817A34143EE2DB00A7DFE9 /* videofilter.h */, ); name = filter; path = ../filter; sourceTree = SOURCE_ROOT; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8D1107260486CEB800E47090 /* DeSmuME (OS X App; v10.5 Leopard Release Build) */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; v10.5 Leopard Release Build)" */; buildPhases = ( AB75221714C79884009B97B3 /* ShellScript */, 8D1107290486CEB800E47090 /* Resources */, AB2DF23415E0838600B4D0BC /* ShellScript */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, AB067BF0153E59B000F417B1 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; v10.5 Leopard Release Build)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = 8D1107320486CEB800E47090 /* DeSmuME (Debug).app */; productType = "com.apple.product-type.application"; }; AB796CA415CDCBA200C59155 /* DeSmuME (OS X App) */ = { isa = PBXNativeTarget; buildConfigurationList = AB796D6D15CDCBA200C59155 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App)" */; buildPhases = ( AB796CA515CDCBA200C59155 /* ShellScript */, AB796CA615CDCBA200C59155 /* Resources */, AB2DF23215E0834E00B4D0BC /* ShellScript */, AB796CEE15CDCBA200C59155 /* Sources */, AB796D6515CDCBA200C59155 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB796D7015CDCBA200C59155 /* DeSmuME (Debug).app */; productType = "com.apple.product-type.application"; }; ABB3C6461501BC6D00E0C22E /* DeSmuME (OpenEmu Plug-in) */ = { isa = PBXNativeTarget; buildConfigurationList = ABB3C6571501BC6D00E0C22E /* Build configuration list for PBXNativeTarget "DeSmuME (OpenEmu Plug-in)" */; buildPhases = ( ABB3C6611501BF3700E0C22E /* Resources */, AB2DF23515E0839D00B4D0BC /* ShellScript */, ABB3C6431501BC6D00E0C22E /* Sources */, ABB3C6441501BC6D00E0C22E /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OpenEmu Plug-in)"; productName = DeSmuME; productReference = ABB3C6471501BC6D00E0C22E /* DeSmuME.oecoreplugin */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0460; ORGANIZATIONNAME = "DeSmuME Team"; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 4)" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, Italian, Chinese, Norwegian, Romanian, en, ); mainGroup = 29B97314FDCFA39411CA2CEA /* DeSmuME */; projectDirPath = ""; projectRoot = ""; targets = ( AB796CA415CDCBA200C59155 /* DeSmuME (OS X App) */, 8D1107260486CEB800E47090 /* DeSmuME (OS X App; v10.5 Leopard Release Build) */, ABB3C6461501BC6D00E0C22E /* DeSmuME (OpenEmu Plug-in) */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB02475C13886BF300E9F9AB /* KeyNames.plist in Resources */, ABC719E2138CB25E002827A9 /* DefaultKeyMappings.plist in Resources */, ABBC0F8D1394B1AA0028B6BD /* DefaultUserPrefs.plist in Resources */, AB64987C13ECC73800EE7DD2 /* FileTypeInfo.plist in Resources */, ABEFCF61141AB82A000CC0CD /* AppIcon_ROMSave.icns in Resources */, ABEFCF62141AB82A000CC0CD /* AppIcon_DeSmuME.icns in Resources */, ABEFCF63141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns in Resources */, ABEFCF64141AB82A000CC0CD /* AppIcon_SaveState.icns in Resources */, AB00E87B14205EAE00DE561F /* InfoPlist.strings in Resources */, AB00E87E14205EBC00DE561F /* MainMenu.xib in Resources */, AB901BDE1420706100348EEC /* Localizable.strings in Resources */, ABB97876144E89CC00793FA3 /* Icon_ActionReplay_32x32.png in Resources */, ABB97877144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png in Resources */, ABB97878144E89CC00793FA3 /* Icon_DeSmuME_32x32.png in Resources */, AB350D3B147A1D93007165AC /* HID_usage_strings.plist in Resources */, ABBF04A514B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */, ABC3AF2F14B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */, ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */, ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */, ABC3AF3214B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */, AB0F290214BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */, AB0F290314BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */, AB0F290414BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */, AB0F290514BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */, AB0F293814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */, AB0F293914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */, AB0F293A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB0F293B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB0F293C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB0F293D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */, AB0F293E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */, AB0F293F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB0F294014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */, AB0F294114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */, AB0F294214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */, AB0F294314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */, AB0F294414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB0F294514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */, AB0F294614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */, AB0F294714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */, AB0F296D14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */, AB0F296E14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */, AB0F297A14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */, AB0F298C14BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */, AB0F298D14BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */, AB0F298E14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */, AB0F298F14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */, AB0F29A614BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */, AB0F29A714BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */, AB0F29A814BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */, AB0F29A914BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */, AB0F29AA14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */, AB0F29AB14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */, AB0F29AC14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */, AB0F29AD14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */, AB0F29AE14BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */, AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */, AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */, AB0F29B114BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */, AB0F29B214BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */, AB0F29B314BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */, AB0F29B414BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */, AB0F29B514BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */, AB0F29B614BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */, AB0F29B714BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */, AB3ACC3E14C24D5400D7D192 /* AUTHORS in Resources */, AB3ACC3F14C24D5400D7D192 /* ChangeLog in Resources */, AB3ACC4014C24D5400D7D192 /* COPYING in Resources */, AB3ACC4114C24D5400D7D192 /* README in Resources */, AB3ACC4314C24D5400D7D192 /* README.MAC in Resources */, AB75226E14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, AB8967DE16D2ED2700F826F1 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB796CA615CDCBA200C59155 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB796CA715CDCBA200C59155 /* KeyNames.plist in Resources */, AB796CA815CDCBA200C59155 /* DefaultKeyMappings.plist in Resources */, AB796CA915CDCBA200C59155 /* DefaultUserPrefs.plist in Resources */, AB796CAA15CDCBA200C59155 /* FileTypeInfo.plist in Resources */, AB796CAB15CDCBA200C59155 /* AppIcon_ROMSave.icns in Resources */, AB796CAC15CDCBA200C59155 /* AppIcon_DeSmuME.icns in Resources */, AB796CAD15CDCBA200C59155 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB796CAE15CDCBA200C59155 /* AppIcon_SaveState.icns in Resources */, AB796CAF15CDCBA200C59155 /* InfoPlist.strings in Resources */, AB796CB015CDCBA200C59155 /* MainMenu.xib in Resources */, AB796CB115CDCBA200C59155 /* Localizable.strings in Resources */, AB796CB215CDCBA200C59155 /* Icon_ActionReplay_32x32.png in Resources */, AB796CB315CDCBA200C59155 /* Icon_CodeBreaker_32x32.png in Resources */, AB796CB415CDCBA200C59155 /* Icon_DeSmuME_32x32.png in Resources */, AB796CB515CDCBA200C59155 /* HID_usage_strings.plist in Resources */, AB796CB615CDCBA200C59155 /* AppIcon_ROMCheats.icns in Resources */, AB796CB715CDCBA200C59155 /* Icon_VolumeFull_16x16.png in Resources */, AB796CB815CDCBA200C59155 /* Icon_VolumeMute_16x16.png in Resources */, AB796CB915CDCBA200C59155 /* Icon_VolumeOneThird_16x16.png in Resources */, AB796CBA15CDCBA200C59155 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB796CBB15CDCBA200C59155 /* Icon_Execute_420x420.png in Resources */, AB796CBC15CDCBA200C59155 /* Icon_Pause_420x420.png in Resources */, AB796CBD15CDCBA200C59155 /* Icon_Speed1x_420x420.png in Resources */, AB796CBE15CDCBA200C59155 /* Icon_Speed2x_420x420.png in Resources */, AB796CBF15CDCBA200C59155 /* ColorSwatch_Blue_16x16.png in Resources */, AB796CC015CDCBA200C59155 /* ColorSwatch_Brown_16x16.png in Resources */, AB796CC115CDCBA200C59155 /* ColorSwatch_DarkBlue_16x16.png in Resources */, AB796CC215CDCBA200C59155 /* ColorSwatch_DarkGreen_16x16.png in Resources */, AB796CC315CDCBA200C59155 /* ColorSwatch_DarkPurple_16x16.png in Resources */, AB796CC415CDCBA200C59155 /* ColorSwatch_Gray_16x16.png in Resources */, AB796CC515CDCBA200C59155 /* ColorSwatch_Green_16x16.png in Resources */, AB796CC615CDCBA200C59155 /* ColorSwatch_LimeGreen_16x16.png in Resources */, AB796CC715CDCBA200C59155 /* ColorSwatch_Magenta_16x16.png in Resources */, AB796CC815CDCBA200C59155 /* ColorSwatch_Orange_16x16.png in Resources */, AB796CC915CDCBA200C59155 /* ColorSwatch_Pink_16x16.png in Resources */, AB796CCA15CDCBA200C59155 /* ColorSwatch_Red_16x16.png in Resources */, AB796CCB15CDCBA200C59155 /* ColorSwatch_SeaGreen_16x16.png in Resources */, AB796CCC15CDCBA200C59155 /* ColorSwatch_Turquoise_16x16.png in Resources */, AB796CCD15CDCBA200C59155 /* ColorSwatch_Violet_16x16.png in Resources */, AB796CCE15CDCBA200C59155 /* ColorSwatch_Yellow_16x16.png in Resources */, AB796CCF15CDCBA200C59155 /* Icon_ActionReplay_128x128.png in Resources */, AB796CD015CDCBA200C59155 /* Icon_CodeBreaker_128x128.png in Resources */, AB796CD115CDCBA200C59155 /* VideoFilterPreview_64x64.png in Resources */, AB796CD215CDCBA200C59155 /* Icon_ArrowDown_420x420.png in Resources */, AB796CD315CDCBA200C59155 /* Icon_ArrowLeft_420x420.png in Resources */, AB796CD415CDCBA200C59155 /* Icon_ArrowRight_420x420.png in Resources */, AB796CD515CDCBA200C59155 /* Icon_ArrowUp_420x420.png in Resources */, AB796CD615CDCBA200C59155 /* Icon_DoubleSpeed_420x420.png in Resources */, AB796CD715CDCBA200C59155 /* Icon_DSButtonA_420x420.png in Resources */, AB796CD815CDCBA200C59155 /* Icon_DSButtonB_420x420.png in Resources */, AB796CD915CDCBA200C59155 /* Icon_DSButtonL_420x420.png in Resources */, AB796CDA15CDCBA200C59155 /* Icon_DSButtonR_420x420.png in Resources */, AB796CDB15CDCBA200C59155 /* Icon_DSButtonSelect_420x420.png in Resources */, AB796CDC15CDCBA200C59155 /* Icon_DSButtonStart_420x420.png in Resources */, AB796CDD15CDCBA200C59155 /* Icon_DSButtonX_420x420.png in Resources */, AB796CDE15CDCBA200C59155 /* Icon_DSButtonY_420x420.png in Resources */, AB796CDF15CDCBA200C59155 /* Icon_Emulation_420x420.png in Resources */, AB796CE015CDCBA200C59155 /* Icon_Input_420x420.png in Resources */, AB796CE115CDCBA200C59155 /* Icon_Microphone_420x420.png in Resources */, AB796CE215CDCBA200C59155 /* Icon_OpenROM_420x420.png in Resources */, AB796CE315CDCBA200C59155 /* Icon_Reset_420x420.png in Resources */, AB796CE415CDCBA200C59155 /* Icon_RotateCCW_420x420.png in Resources */, AB796CE515CDCBA200C59155 /* Icon_RotateCW_420x420.png in Resources */, AB796CE615CDCBA200C59155 /* Icon_ShowHUD_420x420.png in Resources */, AB796CE715CDCBA200C59155 /* Icon_Speaker_420x420.png in Resources */, AB796CE815CDCBA200C59155 /* AUTHORS in Resources */, AB796CE915CDCBA200C59155 /* ChangeLog in Resources */, AB796CEA15CDCBA200C59155 /* COPYING in Resources */, AB796CEB15CDCBA200C59155 /* README in Resources */, AB796CEC15CDCBA200C59155 /* README.MAC in Resources */, AB796CED15CDCBA200C59155 /* AppIcon_FirmwareConfig.icns in Resources */, AB8967DD16D2ED2700F826F1 /* DisplayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABB3C6611501BF3700E0C22E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ABB3C6621501BF4E00E0C22E /* InfoPlist.strings in Resources */, ABB3C6631501BF4E00E0C22E /* FileTypeInfo.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ AB067BF0153E59B000F417B1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "#!/bin/sh\n\n# This script creates an application package that merges the ppc binary of an\n# Xcode 3 PowerPC release build to the i386 and x86_64 binaries of an Xcode 4\n# (or later) release build.\n#\n# Before you use this script, make sure that you already have an existing\n# PowerPC Release build from Xcode 3 in the ${SRCROOT}/build/Release directory.\n\nif test -e \"${SRCROOT}/build/Release/DeSmuME (PPC).app/Contents/MacOS/DeSmuME (PPC)\"\nthen\n\n# Create the Merged Release directory, plus a working copy of the\n# universal binary .app.\ncd \"${SRCROOT}/build\"\nmkdir -p \"./Merged Release\"\ncd \"./Merged Release\"\ncp -a \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app\" \"./\"\nrm -f \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}\"\n\n# Create the temp binaries for Intel.\ncd \"${TARGET_BUILD_DIR}\"\nlipo \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}\" -thin i386 -output \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_i386\"\nlipo \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}\" -thin x86_64 -output \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_x86_64\"\n\n# Merge the separate temp binaries into a single binary package.\ncd \"${SRCROOT}/build/Merged Release\"\nlipo \"../Release/DeSmuME (PPC).app/Contents/MacOS/DeSmuME (PPC)\" \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_i386\" \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_x86_64\" -create -output \"./${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}\"\n\n# Remove the temp binaries now that we're done with them.\nrm -f \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_i386\"\nrm -f \"${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${EXECUTABLE_NAME}_x86_64\"\n\nfi"; }; AB2DF23215E0834E00B4D0BC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; AB2DF23415E0838600B4D0BC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; AB2DF23515E0839D00B4D0BC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; AB75221714C79884009B97B3 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; AB796CA515CDCBA200C59155 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.xib", ); outputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu.strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ABD1FF531345ACBF00AF11D1 /* ConvertUTF.c in Sources */, ABAD3E7113AF1D6D00502E1E /* AAFilter.cpp in Sources */, ABD1FED01345AC8400AF11D1 /* addons.cpp in Sources */, ABD1FED21345AC8400AF11D1 /* arm_instructions.cpp in Sources */, ABD1FED31345AC8400AF11D1 /* armcpu.cpp in Sources */, ABD1FED41345AC8400AF11D1 /* bios.cpp in Sources */, ABD1FF5B1345ACBF00AF11D1 /* cache.cpp in Sources */, ABD1FED51345AC8400AF11D1 /* cheatSystem.cpp in Sources */, ABD1FED71345AC8400AF11D1 /* common.cpp in Sources */, ABD1FED81345AC8400AF11D1 /* cp15.cpp in Sources */, AB15CA7214A29EE500B8A6A4 /* cpu_detect_x86_gcc.cpp in Sources */, ABD1FF551345ACBF00AF11D1 /* crc.cpp in Sources */, AB181D0013B66889006CA82D /* datetime.cpp in Sources */, ABD1FEDA1345AC8400AF11D1 /* debug.cpp in Sources */, ABD1FF561345ACBF00AF11D1 /* decrypt.cpp in Sources */, ABD1FF5C1345ACBF00AF11D1 /* directory.cpp in Sources */, ABD1FEDC1345AC8400AF11D1 /* Disassembler.cpp in Sources */, ABD1FF5D1345ACBF00AF11D1 /* disc.cpp in Sources */, ABD1FF581345ACBF00AF11D1 /* dlditool.cpp in Sources */, ABD1FEDD1345AC8400AF11D1 /* driver.cpp in Sources */, ABD1FF591345ACBF00AF11D1 /* emufat.cpp in Sources */, ABD1FEDE1345AC8400AF11D1 /* emufile.cpp in Sources */, ABD1FF5E1345ACBF00AF11D1 /* fatdir.cpp in Sources */, ABD1FF5F1345ACBF00AF11D1 /* fatfile.cpp in Sources */, ABD1FEDF1345AC8400AF11D1 /* FIFO.cpp in Sources */, ABAD3E7413AF1D6D00502E1E /* FIFOSampleBuffer.cpp in Sources */, ABD1FF601345ACBF00AF11D1 /* file_allocation_table.cpp in Sources */, ABD1FF611345ACBF00AF11D1 /* filetime.cpp in Sources */, ABAD3E7513AF1D6D00502E1E /* FIRFilter.cpp in Sources */, ABD1FEE01345AC8400AF11D1 /* firmware.cpp in Sources */, AB91D46B13BD013800462471 /* fs-linux.cpp in Sources */, ABD1FEE31345AC8400AF11D1 /* gfx3d.cpp in Sources */, ABD1FEE61345AC8400AF11D1 /* GPU.cpp in Sources */, ABD1FEE41345AC8400AF11D1 /* GPU_osd_stub.cpp in Sources */, ABD1FF5A1345ACBF00AF11D1 /* guid.cpp in Sources */, ABD1FF571345ACBF00AF11D1 /* header.cpp in Sources */, ABD1FF621345ACBF00AF11D1 /* libfat.cpp in Sources */, ABD1FF631345ACBF00AF11D1 /* libfat_public_api.cpp in Sources */, ABD1FF641345ACBF00AF11D1 /* lock.cpp in Sources */, ABD1FEE81345AC8400AF11D1 /* matrix.cpp in Sources */, ABD1FEE91345AC8400AF11D1 /* mc.cpp in Sources */, ABD1FF661345ACBF00AF11D1 /* md5.cpp in Sources */, ABD1FF9F1345ACFA00AF11D1 /* metaspu.cpp in Sources */, ABD1FEED1345AC8400AF11D1 /* MMU.cpp in Sources */, ABAD3E7613AF1D6D00502E1E /* mmx_optimized.cpp in Sources */, ABD1FEEE1345AC8400AF11D1 /* movie.cpp in Sources */, ABD1FEEF1345AC8400AF11D1 /* NDSSystem.cpp in Sources */, ABD1FF651345ACBF00AF11D1 /* partition.cpp in Sources */, ABD1FEF11345AC8400AF11D1 /* path.cpp in Sources */, ABD1FEF21345AC8400AF11D1 /* rasterize.cpp in Sources */, ABAD3E7713AF1D6D00502E1E /* RateTransposer.cpp in Sources */, ABD1FEF31345AC8400AF11D1 /* readwrite.cpp in Sources */, ABD1FEF41345AC8400AF11D1 /* render3D.cpp in Sources */, ABD1FEF51345AC8400AF11D1 /* ROMReader.cpp in Sources */, ABD1FEF61345AC8400AF11D1 /* rtc.cpp in Sources */, ABD1FEF71345AC8400AF11D1 /* saves.cpp in Sources */, ABD1FEF81345AC8400AF11D1 /* slot1.cpp in Sources */, ABD1FF0B1345AC9C00AF11D1 /* slot1_none.cpp in Sources */, ABD1FF0C1345AC9C00AF11D1 /* slot1_r4.cpp in Sources */, ABD1FF0D1345AC9C00AF11D1 /* slot1_retail.cpp in Sources */, AB6FBEF6139B6258007BB045 /* slot1_retail_nand.cpp in Sources */, ABD1FF0E1345AC9C00AF11D1 /* slot2_expMemory.cpp in Sources */, ABD1FF0F1345AC9C00AF11D1 /* slot2_gbagame.cpp in Sources */, ABD1FF101345AC9C00AF11D1 /* slot2_guitarGrip.cpp in Sources */, ABD1FF111345AC9C00AF11D1 /* slot2_mpcf.cpp in Sources */, ABD1FF121345AC9C00AF11D1 /* slot2_none.cpp in Sources */, ABD1FF131345AC9C00AF11D1 /* slot2_paddle.cpp in Sources */, ABD1FF141345AC9C00AF11D1 /* slot2_piano.cpp in Sources */, ABD1FF151345AC9C00AF11D1 /* slot2_rumblepak.cpp in Sources */, ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */, AB1F468413A0ADE400B80DE6 /* SndOut.cpp in Sources */, ABAD3E7813AF1D6D00502E1E /* SoundTouch.cpp in Sources */, ABD1FEFA1345AC8400AF11D1 /* SPU.cpp in Sources */, ABAD3E7913AF1D6D00502E1E /* sse_optimized.cpp in Sources */, ABD1FF671345ACBF00AF11D1 /* task.cpp in Sources */, ABAD3E7A13AF1D6D00502E1E /* TDStretch.cpp in Sources */, ABD1FEFB1345AC8400AF11D1 /* texcache.cpp in Sources */, ABD1FEFC1345AC8400AF11D1 /* thumb_instructions.cpp in Sources */, AB1F469813A0AE2F00B80DE6 /* Timestretcher.cpp in Sources */, ABE6702B1415DE6C00E8E4C9 /* tinystr.cpp in Sources */, ABE6702C1415DE6C00E8E4C9 /* tinyxml.cpp in Sources */, ABE6702D1415DE6C00E8E4C9 /* tinyxmlerror.cpp in Sources */, ABE6702E1415DE6C00E8E4C9 /* tinyxmlparser.cpp in Sources */, ABD1FEFD1345AC8400AF11D1 /* version.cpp in Sources */, ABD1FF681345ACBF00AF11D1 /* vfat.cpp in Sources */, ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */, ABAD3E7B13AF1D6D00502E1E /* WavFile.cpp in Sources */, ABD1FEFE1345AC8400AF11D1 /* wifi.cpp in Sources */, ABD1FF691345ACBF00AF11D1 /* xstring.cpp in Sources */, ABD104281346653B00AF11D1 /* main.m in Sources */, ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */, ABD1041D1346652500AF11D1 /* cocoa_core.mm in Sources */, AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */, ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */, ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */, AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */, ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */, AB80E04D142BC4A800A52038 /* cocoa_util.mm in Sources */, ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */, AB0F291D14BE6F4A009ABC6F /* OGLRender.cpp in Sources */, AB3ACB7214C2361100D7D192 /* appDelegate.mm in Sources */, AB3ACB7314C2361100D7D192 /* cheatWindowDelegate.mm in Sources */, AB3ACB7614C2361100D7D192 /* inputPrefsView.mm in Sources */, AB3ACB7714C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */, ABFE150714C92FF5005D6699 /* 2xsai.cpp in Sources */, ABFE150814C92FF5005D6699 /* bilinear.cpp in Sources */, ABFE150914C92FF5005D6699 /* epx.cpp in Sources */, ABFE150A14C92FF5005D6699 /* hq2x.cpp in Sources */, ABFE150B14C92FF5005D6699 /* hq4x.cpp in Sources */, ABFE150D14C92FF5005D6699 /* lq2x.cpp in Sources */, ABFE150E14C92FF5005D6699 /* scanline.cpp in Sources */, AB1B9E631501A78000464647 /* coreaudiosound.cpp in Sources */, AB1B9E661501A78000464647 /* ringbuffer.cpp in Sources */, AB796C9C15CDCB0F00C59155 /* arm_jit.cpp in Sources */, ABF2B9FC16904133000FF7C0 /* troubleshootingWindowDelegate.mm in Sources */, AB40562B169F5DBB0016AC3E /* assembler.cpp in Sources */, AB40562E169F5DBB0016AC3E /* assert.cpp in Sources */, AB405631169F5DBB0016AC3E /* buffer.cpp in Sources */, AB405634169F5DBB0016AC3E /* compiler.cpp in Sources */, AB405637169F5DBB0016AC3E /* compilercontext.cpp in Sources */, AB40563A169F5DBB0016AC3E /* compilerfunc.cpp in Sources */, AB40563D169F5DBB0016AC3E /* compileritem.cpp in Sources */, AB405640169F5DBB0016AC3E /* context.cpp in Sources */, AB405643169F5DBB0016AC3E /* cpuinfo.cpp in Sources */, AB405646169F5DBB0016AC3E /* defs.cpp in Sources */, AB405649169F5DBB0016AC3E /* func.cpp in Sources */, AB40564C169F5DBB0016AC3E /* logger.cpp in Sources */, AB40564F169F5DBB0016AC3E /* memorymanager.cpp in Sources */, AB405652169F5DBB0016AC3E /* memorymarker.cpp in Sources */, AB405655169F5DBB0016AC3E /* operand.cpp in Sources */, AB405658169F5DBB0016AC3E /* stringbuilder.cpp in Sources */, AB40565B169F5DBB0016AC3E /* stringutil.cpp in Sources */, AB40565E169F5DBB0016AC3E /* virtualmemory.cpp in Sources */, AB405661169F5DBB0016AC3E /* zonememory.cpp in Sources */, AB405679169F5DCC0016AC3E /* x86assembler.cpp in Sources */, AB40567C169F5DCC0016AC3E /* x86compiler.cpp in Sources */, AB40567F169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */, AB405682169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */, AB405685169F5DCC0016AC3E /* x86compileritem.cpp in Sources */, AB405688169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */, AB40568B169F5DCC0016AC3E /* x86defs.cpp in Sources */, AB40568E169F5DCC0016AC3E /* x86func.cpp in Sources */, AB405691169F5DCC0016AC3E /* x86operand.cpp in Sources */, AB405694169F5DCC0016AC3E /* x86util.cpp in Sources */, AB23567416C2F6F400DA782E /* macosx_10_5_compat.cpp in Sources */, AB23567516C2FAD800DA782E /* OGLRender_3_2.cpp in Sources */, AB3A655F16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */, AB3A656216CC5438001F5D4A /* cocoa_GPU.mm in Sources */, AB8967DA16D2ED0700F826F1 /* DisplayWindowController.mm in Sources */, AB29B33216D4BEBF000EF671 /* InputManager.mm in Sources */, AB82445C1704AE9A00B8EE20 /* utilities.c in Sources */, AB01005F170D07B000D70FBE /* InputProfileController.mm in Sources */, ABD10AE81715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */, ABD10AEB1715FCDD00B5729D /* mic_ext.cpp in Sources */, ABD42048172319D1006A9B46 /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB796CEE15CDCBA200C59155 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB796CEF15CDCBA200C59155 /* ConvertUTF.c in Sources */, AB796CF015CDCBA200C59155 /* AAFilter.cpp in Sources */, AB796CF115CDCBA200C59155 /* addons.cpp in Sources */, AB796CF215CDCBA200C59155 /* arm_instructions.cpp in Sources */, AB796CF315CDCBA200C59155 /* armcpu.cpp in Sources */, AB796CF415CDCBA200C59155 /* bios.cpp in Sources */, AB796CF515CDCBA200C59155 /* cache.cpp in Sources */, AB796CF615CDCBA200C59155 /* cheatSystem.cpp in Sources */, AB796CF715CDCBA200C59155 /* common.cpp in Sources */, AB796CF815CDCBA200C59155 /* cp15.cpp in Sources */, AB796CF915CDCBA200C59155 /* cpu_detect_x86_gcc.cpp in Sources */, AB796CFA15CDCBA200C59155 /* crc.cpp in Sources */, AB796CFB15CDCBA200C59155 /* datetime.cpp in Sources */, AB796CFC15CDCBA200C59155 /* debug.cpp in Sources */, AB796CFD15CDCBA200C59155 /* decrypt.cpp in Sources */, AB796CFE15CDCBA200C59155 /* directory.cpp in Sources */, AB796CFF15CDCBA200C59155 /* Disassembler.cpp in Sources */, AB796D0015CDCBA200C59155 /* disc.cpp in Sources */, AB796D0115CDCBA200C59155 /* dlditool.cpp in Sources */, AB796D0215CDCBA200C59155 /* driver.cpp in Sources */, AB796D0315CDCBA200C59155 /* emufat.cpp in Sources */, AB796D0415CDCBA200C59155 /* emufile.cpp in Sources */, AB796D0515CDCBA200C59155 /* fatdir.cpp in Sources */, AB796D0615CDCBA200C59155 /* fatfile.cpp in Sources */, AB796D0715CDCBA200C59155 /* FIFO.cpp in Sources */, AB796D0815CDCBA200C59155 /* FIFOSampleBuffer.cpp in Sources */, AB796D0915CDCBA200C59155 /* file_allocation_table.cpp in Sources */, AB796D0A15CDCBA200C59155 /* filetime.cpp in Sources */, AB796D0B15CDCBA200C59155 /* FIRFilter.cpp in Sources */, AB796D0C15CDCBA200C59155 /* firmware.cpp in Sources */, AB796D0D15CDCBA200C59155 /* fs-linux.cpp in Sources */, AB796D0E15CDCBA200C59155 /* gfx3d.cpp in Sources */, AB796D0F15CDCBA200C59155 /* GPU.cpp in Sources */, AB796D1015CDCBA200C59155 /* GPU_osd_stub.cpp in Sources */, AB796D1115CDCBA200C59155 /* guid.cpp in Sources */, AB796D1215CDCBA200C59155 /* header.cpp in Sources */, AB796D1315CDCBA200C59155 /* libfat.cpp in Sources */, AB796D1415CDCBA200C59155 /* libfat_public_api.cpp in Sources */, AB796D1515CDCBA200C59155 /* lock.cpp in Sources */, AB796D1615CDCBA200C59155 /* matrix.cpp in Sources */, AB796D1715CDCBA200C59155 /* mc.cpp in Sources */, AB796D1815CDCBA200C59155 /* md5.cpp in Sources */, AB796D1915CDCBA200C59155 /* metaspu.cpp in Sources */, AB796D1A15CDCBA200C59155 /* MMU.cpp in Sources */, AB796D1B15CDCBA200C59155 /* mmx_optimized.cpp in Sources */, AB796D1C15CDCBA200C59155 /* movie.cpp in Sources */, AB796D1D15CDCBA200C59155 /* NDSSystem.cpp in Sources */, AB796D1E15CDCBA200C59155 /* OGLRender.cpp in Sources */, AB796D1F15CDCBA200C59155 /* partition.cpp in Sources */, AB796D2015CDCBA200C59155 /* path.cpp in Sources */, AB796D2115CDCBA200C59155 /* rasterize.cpp in Sources */, AB796D2215CDCBA200C59155 /* RateTransposer.cpp in Sources */, AB796D2315CDCBA200C59155 /* readwrite.cpp in Sources */, AB796D2415CDCBA200C59155 /* render3D.cpp in Sources */, AB796D2515CDCBA200C59155 /* ROMReader.cpp in Sources */, AB796D2615CDCBA200C59155 /* rtc.cpp in Sources */, AB796D2715CDCBA200C59155 /* saves.cpp in Sources */, AB796D2815CDCBA200C59155 /* slot1.cpp in Sources */, AB796D2915CDCBA200C59155 /* slot1_none.cpp in Sources */, AB796D2A15CDCBA200C59155 /* slot1_r4.cpp in Sources */, AB796D2B15CDCBA200C59155 /* slot1_retail.cpp in Sources */, AB796D2C15CDCBA200C59155 /* slot1_retail_nand.cpp in Sources */, AB796D2D15CDCBA200C59155 /* slot2_expMemory.cpp in Sources */, AB796D2E15CDCBA200C59155 /* slot2_gbagame.cpp in Sources */, AB796D2F15CDCBA200C59155 /* slot2_guitarGrip.cpp in Sources */, AB796D3015CDCBA200C59155 /* slot2_mpcf.cpp in Sources */, AB796D3115CDCBA200C59155 /* slot2_none.cpp in Sources */, AB796D3215CDCBA200C59155 /* slot2_paddle.cpp in Sources */, AB796D3315CDCBA200C59155 /* slot2_piano.cpp in Sources */, AB796D3415CDCBA200C59155 /* slot2_rumblepak.cpp in Sources */, AB796D3515CDCBA200C59155 /* sndOSX.cpp in Sources */, AB796D3615CDCBA200C59155 /* SndOut.cpp in Sources */, AB796D3715CDCBA200C59155 /* SoundTouch.cpp in Sources */, AB796D3815CDCBA200C59155 /* SPU.cpp in Sources */, AB796D3915CDCBA200C59155 /* sse_optimized.cpp in Sources */, AB796D3A15CDCBA200C59155 /* task.cpp in Sources */, AB796D3B15CDCBA200C59155 /* TDStretch.cpp in Sources */, AB796D3C15CDCBA200C59155 /* texcache.cpp in Sources */, AB796D3D15CDCBA200C59155 /* thumb_instructions.cpp in Sources */, AB796D3E15CDCBA200C59155 /* Timestretcher.cpp in Sources */, AB796D3F15CDCBA200C59155 /* tinystr.cpp in Sources */, AB796D4015CDCBA200C59155 /* tinyxml.cpp in Sources */, AB796D4115CDCBA200C59155 /* tinyxmlerror.cpp in Sources */, AB796D4215CDCBA200C59155 /* tinyxmlparser.cpp in Sources */, AB796D4315CDCBA200C59155 /* version.cpp in Sources */, AB796D4415CDCBA200C59155 /* vfat.cpp in Sources */, AB796D4515CDCBA200C59155 /* videofilter.cpp in Sources */, AB796D4615CDCBA200C59155 /* WavFile.cpp in Sources */, AB796D4715CDCBA200C59155 /* wifi.cpp in Sources */, AB796D4815CDCBA200C59155 /* xstring.cpp in Sources */, AB796D4915CDCBA200C59155 /* main.m in Sources */, AB796D4A15CDCBA200C59155 /* cocoa_cheat.mm in Sources */, AB796D4B15CDCBA200C59155 /* cocoa_core.mm in Sources */, AB796D4C15CDCBA200C59155 /* cocoa_file.mm in Sources */, AB796D4D15CDCBA200C59155 /* cocoa_firmware.mm in Sources */, AB796D4F15CDCBA200C59155 /* cocoa_input.mm in Sources */, AB796D5115CDCBA200C59155 /* cocoa_output.mm in Sources */, AB796D5215CDCBA200C59155 /* cocoa_rom.mm in Sources */, AB796D5315CDCBA200C59155 /* cocoa_util.mm in Sources */, AB796D5415CDCBA200C59155 /* cocoa_videofilter.mm in Sources */, AB796D5515CDCBA200C59155 /* appDelegate.mm in Sources */, AB796D5615CDCBA200C59155 /* cheatWindowDelegate.mm in Sources */, AB796D5915CDCBA200C59155 /* inputPrefsView.mm in Sources */, AB796D5A15CDCBA200C59155 /* preferencesWindowDelegate.mm in Sources */, AB796D5B15CDCBA200C59155 /* 2xsai.cpp in Sources */, AB796D5C15CDCBA200C59155 /* bilinear.cpp in Sources */, AB796D5D15CDCBA200C59155 /* epx.cpp in Sources */, AB796D5E15CDCBA200C59155 /* hq2x.cpp in Sources */, AB796D5F15CDCBA200C59155 /* hq4x.cpp in Sources */, AB796D6015CDCBA200C59155 /* lq2x.cpp in Sources */, AB796D6115CDCBA200C59155 /* scanline.cpp in Sources */, AB796D6215CDCBA200C59155 /* coreaudiosound.cpp in Sources */, AB796D6315CDCBA200C59155 /* ringbuffer.cpp in Sources */, AB796D6415CDCBA200C59155 /* arm_jit.cpp in Sources */, ABF2B9FB16904133000FF7C0 /* troubleshootingWindowDelegate.mm in Sources */, AB40562A169F5DBB0016AC3E /* assembler.cpp in Sources */, AB40562D169F5DBB0016AC3E /* assert.cpp in Sources */, AB405630169F5DBB0016AC3E /* buffer.cpp in Sources */, AB405633169F5DBB0016AC3E /* compiler.cpp in Sources */, AB405636169F5DBB0016AC3E /* compilercontext.cpp in Sources */, AB405639169F5DBB0016AC3E /* compilerfunc.cpp in Sources */, AB40563C169F5DBB0016AC3E /* compileritem.cpp in Sources */, AB40563F169F5DBB0016AC3E /* context.cpp in Sources */, AB405642169F5DBB0016AC3E /* cpuinfo.cpp in Sources */, AB405645169F5DBB0016AC3E /* defs.cpp in Sources */, AB405648169F5DBB0016AC3E /* func.cpp in Sources */, AB40564B169F5DBB0016AC3E /* logger.cpp in Sources */, AB40564E169F5DBB0016AC3E /* memorymanager.cpp in Sources */, AB405651169F5DBB0016AC3E /* memorymarker.cpp in Sources */, AB405654169F5DBB0016AC3E /* operand.cpp in Sources */, AB405657169F5DBB0016AC3E /* stringbuilder.cpp in Sources */, AB40565A169F5DBB0016AC3E /* stringutil.cpp in Sources */, AB40565D169F5DBB0016AC3E /* virtualmemory.cpp in Sources */, AB405660169F5DBB0016AC3E /* zonememory.cpp in Sources */, AB405678169F5DCC0016AC3E /* x86assembler.cpp in Sources */, AB40567B169F5DCC0016AC3E /* x86compiler.cpp in Sources */, AB40567E169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */, AB405681169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */, AB405684169F5DCC0016AC3E /* x86compileritem.cpp in Sources */, AB405687169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */, AB40568A169F5DCC0016AC3E /* x86defs.cpp in Sources */, AB40568D169F5DCC0016AC3E /* x86func.cpp in Sources */, AB405690169F5DCC0016AC3E /* x86operand.cpp in Sources */, AB405693169F5DCC0016AC3E /* x86util.cpp in Sources */, AB26D87C16B5253D00A2305C /* OGLRender_3_2.cpp in Sources */, AB3A655E16CC5421001F5D4A /* EmuControllerDelegate.mm in Sources */, AB3A656116CC5438001F5D4A /* cocoa_GPU.mm in Sources */, AB8967D916D2ED0700F826F1 /* DisplayWindowController.mm in Sources */, AB29B33116D4BEBF000EF671 /* InputManager.mm in Sources */, AB82445B1704AE9A00B8EE20 /* utilities.c in Sources */, AB01005E170D07B000D70FBE /* InputProfileController.mm in Sources */, ABD10AE71715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */, ABD10AEA1715FCDD00B5729D /* mic_ext.cpp in Sources */, ABD42047172319D1006A9B46 /* FileMigrationDelegate.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABB3C6431501BC6D00E0C22E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ABE9EEEB1501C78700D3FB19 /* fs-linux.cpp in Sources */, ABB3C66C1501C04F00E0C22E /* NDSGameCore.mm in Sources */, ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */, ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */, ABB3C6751501C04F00E0C22E /* cocoa_rom.mm in Sources */, ABB3C6761501C04F00E0C22E /* cocoa_util.mm in Sources */, ABB3C6771501C04F00E0C22E /* cocoa_videofilter.mm in Sources */, ABB3C6781501C04F00E0C22E /* slot1_none.cpp in Sources */, ABB3C6791501C04F00E0C22E /* slot1_r4.cpp in Sources */, ABB3C67A1501C04F00E0C22E /* slot1_retail_nand.cpp in Sources */, ABB3C67B1501C04F00E0C22E /* slot1_retail.cpp in Sources */, ABB3C67C1501C04F00E0C22E /* slot2_expMemory.cpp in Sources */, ABB3C67D1501C04F00E0C22E /* slot2_gbagame.cpp in Sources */, ABB3C67E1501C04F00E0C22E /* slot2_guitarGrip.cpp in Sources */, ABB3C67F1501C04F00E0C22E /* slot2_mpcf.cpp in Sources */, ABB3C6801501C04F00E0C22E /* slot2_none.cpp in Sources */, ABB3C6811501C04F00E0C22E /* slot2_paddle.cpp in Sources */, ABB3C6821501C04F00E0C22E /* slot2_piano.cpp in Sources */, ABB3C6831501C04F00E0C22E /* slot2_rumblepak.cpp in Sources */, ABB3C6841501C04F00E0C22E /* 2xsai.cpp in Sources */, ABB3C6851501C04F00E0C22E /* bilinear.cpp in Sources */, ABB3C6861501C04F00E0C22E /* epx.cpp in Sources */, ABB3C6871501C04F00E0C22E /* hq2x.cpp in Sources */, ABB3C6881501C04F00E0C22E /* hq4x.cpp in Sources */, ABB3C6891501C04F00E0C22E /* lq2x.cpp in Sources */, ABB3C68A1501C04F00E0C22E /* scanline.cpp in Sources */, ABB3C68B1501C04F00E0C22E /* AAFilter.cpp in Sources */, ABB3C68C1501C04F00E0C22E /* cpu_detect_x86_gcc.cpp in Sources */, ABB3C68D1501C04F00E0C22E /* FIFOSampleBuffer.cpp in Sources */, ABB3C68E1501C04F00E0C22E /* FIRFilter.cpp in Sources */, ABB3C68F1501C04F00E0C22E /* mmx_optimized.cpp in Sources */, ABB3C6901501C04F00E0C22E /* RateTransposer.cpp in Sources */, ABB3C6911501C04F00E0C22E /* SoundTouch.cpp in Sources */, ABB3C6921501C04F00E0C22E /* sse_optimized.cpp in Sources */, ABB3C6931501C04F00E0C22E /* TDStretch.cpp in Sources */, ABB3C6941501C04F00E0C22E /* WavFile.cpp in Sources */, ABB3C6951501C04F00E0C22E /* metaspu.cpp in Sources */, ABB3C6961501C04F00E0C22E /* SndOut.cpp in Sources */, ABB3C6971501C04F00E0C22E /* Timestretcher.cpp in Sources */, ABB3C6981501C04F00E0C22E /* crc.cpp in Sources */, ABB3C6991501C04F00E0C22E /* decrypt.cpp in Sources */, ABB3C69A1501C04F00E0C22E /* header.cpp in Sources */, ABB3C69B1501C04F00E0C22E /* cache.cpp in Sources */, ABB3C69C1501C04F00E0C22E /* directory.cpp in Sources */, ABB3C69D1501C04F00E0C22E /* disc.cpp in Sources */, ABB3C69E1501C04F00E0C22E /* fatdir.cpp in Sources */, ABB3C69F1501C04F00E0C22E /* fatfile.cpp in Sources */, ABB3C6A01501C04F00E0C22E /* file_allocation_table.cpp in Sources */, ABB3C6A11501C04F00E0C22E /* filetime.cpp in Sources */, ABB3C6A21501C04F00E0C22E /* libfat.cpp in Sources */, ABB3C6A31501C04F00E0C22E /* libfat_public_api.cpp in Sources */, ABB3C6A41501C04F00E0C22E /* lock.cpp in Sources */, ABB3C6A51501C04F00E0C22E /* partition.cpp in Sources */, ABB3C6A61501C04F00E0C22E /* tinystr.cpp in Sources */, ABB3C6A71501C04F00E0C22E /* tinyxml.cpp in Sources */, ABB3C6A81501C04F00E0C22E /* tinyxmlerror.cpp in Sources */, ABB3C6A91501C04F00E0C22E /* tinyxmlparser.cpp in Sources */, ABB3C6AA1501C04F00E0C22E /* ConvertUTF.c in Sources */, ABB3C6AB1501C04F00E0C22E /* datetime.cpp in Sources */, ABB3C6AC1501C04F00E0C22E /* dlditool.cpp in Sources */, ABB3C6AD1501C04F00E0C22E /* emufat.cpp in Sources */, ABB3C6AE1501C04F00E0C22E /* guid.cpp in Sources */, ABB3C6AF1501C04F00E0C22E /* md5.cpp in Sources */, ABB3C6B01501C04F00E0C22E /* task.cpp in Sources */, ABB3C6B11501C04F00E0C22E /* vfat.cpp in Sources */, ABB3C6B21501C04F00E0C22E /* xstring.cpp in Sources */, ABB3C6B31501C04F00E0C22E /* addons.cpp in Sources */, ABB3C6B41501C04F00E0C22E /* arm_instructions.cpp in Sources */, ABB3C6B51501C04F00E0C22E /* armcpu.cpp in Sources */, ABB3C6B61501C04F00E0C22E /* bios.cpp in Sources */, ABB3C6B71501C04F00E0C22E /* cheatSystem.cpp in Sources */, ABB3C6B81501C04F00E0C22E /* common.cpp in Sources */, ABB3C6B91501C04F00E0C22E /* cp15.cpp in Sources */, ABB3C6BA1501C04F00E0C22E /* debug.cpp in Sources */, ABB3C6BB1501C04F00E0C22E /* Disassembler.cpp in Sources */, ABB3C6BC1501C04F00E0C22E /* driver.cpp in Sources */, ABB3C6BD1501C04F00E0C22E /* emufile.cpp in Sources */, ABB3C6BE1501C04F00E0C22E /* FIFO.cpp in Sources */, ABB3C6BF1501C04F00E0C22E /* firmware.cpp in Sources */, ABB3C6C01501C04F00E0C22E /* gfx3d.cpp in Sources */, ABB3C6C11501C04F00E0C22E /* GPU.cpp in Sources */, ABB3C6C21501C04F00E0C22E /* GPU_osd_stub.cpp in Sources */, ABB3C6C31501C04F00E0C22E /* matrix.cpp in Sources */, ABB3C6C41501C04F00E0C22E /* mc.cpp in Sources */, ABB3C6C61501C04F00E0C22E /* MMU.cpp in Sources */, ABB3C6C71501C04F00E0C22E /* movie.cpp in Sources */, ABB3C6C81501C04F00E0C22E /* NDSSystem.cpp in Sources */, ABB3C6C91501C04F00E0C22E /* OGLRender.cpp in Sources */, ABB3C6CA1501C04F00E0C22E /* path.cpp in Sources */, ABB3C6CB1501C04F00E0C22E /* rasterize.cpp in Sources */, ABB3C6CC1501C04F00E0C22E /* readwrite.cpp in Sources */, ABB3C6CD1501C04F00E0C22E /* render3D.cpp in Sources */, ABB3C6CE1501C04F00E0C22E /* ROMReader.cpp in Sources */, ABB3C6CF1501C04F00E0C22E /* rtc.cpp in Sources */, ABB3C6D01501C04F00E0C22E /* saves.cpp in Sources */, ABB3C6D11501C04F00E0C22E /* slot1.cpp in Sources */, ABB3C6D31501C04F00E0C22E /* SPU.cpp in Sources */, ABB3C6D41501C04F00E0C22E /* texcache.cpp in Sources */, ABB3C6D51501C04F00E0C22E /* thumb_instructions.cpp in Sources */, ABB3C6D61501C04F00E0C22E /* version.cpp in Sources */, ABB3C6D71501C04F00E0C22E /* wifi.cpp in Sources */, ABE9EEEA1501C6EB00D3FB19 /* cocoa_firmware.mm in Sources */, AB1949DB15034F900098793E /* OESoundInterface.mm in Sources */, AB796C9F15CDCB0F00C59155 /* arm_jit.cpp in Sources */, AB40562C169F5DBB0016AC3E /* assembler.cpp in Sources */, AB40562F169F5DBB0016AC3E /* assert.cpp in Sources */, AB405632169F5DBB0016AC3E /* buffer.cpp in Sources */, AB405635169F5DBB0016AC3E /* compiler.cpp in Sources */, AB405638169F5DBB0016AC3E /* compilercontext.cpp in Sources */, AB40563B169F5DBB0016AC3E /* compilerfunc.cpp in Sources */, AB40563E169F5DBB0016AC3E /* compileritem.cpp in Sources */, AB405641169F5DBB0016AC3E /* context.cpp in Sources */, AB405644169F5DBB0016AC3E /* cpuinfo.cpp in Sources */, AB405647169F5DBB0016AC3E /* defs.cpp in Sources */, AB40564A169F5DBB0016AC3E /* func.cpp in Sources */, AB40564D169F5DBB0016AC3E /* logger.cpp in Sources */, AB405650169F5DBB0016AC3E /* memorymanager.cpp in Sources */, AB405653169F5DBB0016AC3E /* memorymarker.cpp in Sources */, AB405656169F5DBB0016AC3E /* operand.cpp in Sources */, AB405659169F5DBB0016AC3E /* stringbuilder.cpp in Sources */, AB40565C169F5DBB0016AC3E /* stringutil.cpp in Sources */, AB40565F169F5DBB0016AC3E /* virtualmemory.cpp in Sources */, AB405662169F5DBB0016AC3E /* zonememory.cpp in Sources */, AB40567A169F5DCC0016AC3E /* x86assembler.cpp in Sources */, AB40567D169F5DCC0016AC3E /* x86compiler.cpp in Sources */, AB405680169F5DCC0016AC3E /* x86compilercontext.cpp in Sources */, AB405683169F5DCC0016AC3E /* x86compilerfunc.cpp in Sources */, AB405686169F5DCC0016AC3E /* x86compileritem.cpp in Sources */, AB405689169F5DCC0016AC3E /* x86cpuinfo.cpp in Sources */, AB40568C169F5DCC0016AC3E /* x86defs.cpp in Sources */, AB40568F169F5DCC0016AC3E /* x86func.cpp in Sources */, AB405692169F5DCC0016AC3E /* x86operand.cpp in Sources */, AB405695169F5DCC0016AC3E /* x86util.cpp in Sources */, AB68A0DD16B139BC00DE0546 /* OGLRender_3_2.cpp in Sources */, AB3A656316CC5438001F5D4A /* cocoa_GPU.mm in Sources */, AB82445D1704AE9A00B8EE20 /* utilities.c in Sources */, AB010060170D07B000D70FBE /* InputProfileController.mm in Sources */, ABD10AE91715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */, ABD10AEC1715FCDD00B5729D /* mic_ext.cpp in Sources */, ABD10AED17160C9300B5729D /* ringbuffer.cpp in Sources */, ABD10AEE17160CDD00B5729D /* cocoa_input.mm in Sources */, AB5785F817175F16002C5FC7 /* cocoa_core.mm in Sources */, AB5785F9171760D2002C5FC7 /* cocoa_output.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ AB00E87914205EAE00DE561F /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( AB00E87A14205EAE00DE561F /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; AB00E87C14205EBC00DE561F /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( AB00E87D14205EBC00DE561F /* English */, ); name = MainMenu.xib; sourceTree = ""; }; AB350D3A147A1D93007165AC /* HID_usage_strings.plist */ = { isa = PBXVariantGroup; children = ( AB350D38147A1D8D007165AC /* English */, ); name = HID_usage_strings.plist; sourceTree = ""; }; AB8967DB16D2ED2700F826F1 /* DisplayWindow.xib */ = { isa = PBXVariantGroup; children = ( AB8967DC16D2ED2700F826F1 /* English */, ); name = DisplayWindow.xib; sourceTree = ""; }; AB901BDD1420706100348EEC /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( AB00E89114205ECC00DE561F /* English */, AB901BE01420706F00348EEC /* French */, AB901BE11420707400348EEC /* Italian */, AB901BDF1420706B00348EEC /* Japanese */, AB901BE21420707800348EEC /* Chinese */, AB901BE31420707D00348EEC /* Norwegian */, AB901BE41420708200348EEC /* Romanian */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ AB796D6E15CDCBA200C59155 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Debug; }; AB796D6F15CDCBA200C59155 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Release; }; ABB3C6581501BC6D00E0C22E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/openemu\"", ); GCC_PREFIX_HEADER = openemu/DeSmuME_Prefix_OpenEmu.pch; INFOPLIST_FILE = "openemu/Info (OpenEmu Plug-in).plist"; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = DeSmuME; WRAPPER_EXTENSION = oecoreplugin; }; name = Debug; }; ABB3C6591501BC6D00E0C22E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/openemu\"", ); GCC_PREFIX_HEADER = openemu/DeSmuME_Prefix_OpenEmu.pch; INFOPLIST_FILE = "openemu/Info (OpenEmu Plug-in).plist"; LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = DeSmuME; WRAPPER_EXTENSION = oecoreplugin; }; name = Release; }; C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { MACOSX_DEPLOYMENT_TARGET = 10.5; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = ( NDEBUG, PUBLIC_RELEASE, ); LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.5; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = sse3; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; GCC_DYNAMIC_NO_PIC = NO; GCC_FAST_OBJC_DISPATCH = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( _DEBUG, "DEBUG=1", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_SHADOW = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IBC_FLATTEN_NIBS = NO; INFOPLIST_FILE = "Info (Debug).plist"; MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "DeSmuME (Debug)"; SDKROOT = macosx; SKIP_INSTALL = YES; STRIP_INSTALLED_PRODUCT = NO; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_X86_VECTOR_INSTRUCTIONS = ssse3; "CLANG_X86_VECTOR_INSTRUCTIONS[arch=i386]" = sse3; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = NDEBUG; GCC_STRICT_ALIASING = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_UNROLL_LOOPS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_SHADOW = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = Info.plist; LD_NO_PIE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; PRODUCT_NAME = DeSmuME; SDKROOT = macosx; STRIP_INSTALLED_PRODUCT = NO; VALIDATE_PRODUCT = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ AB796D6D15CDCBA200C59155 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB796D6E15CDCBA200C59155 /* Debug */, AB796D6F15CDCBA200C59155 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; ABB3C6571501BC6D00E0C22E /* Build configuration list for PBXNativeTarget "DeSmuME (OpenEmu Plug-in)" */ = { isa = XCConfigurationList; buildConfigurations = ( ABB3C6581501BC6D00E0C22E /* Debug */, ABB3C6591501BC6D00E0C22E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; v10.5 Leopard Release Build)" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 4)" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } desmume-0.9.9/src/cocoa/DeSmuME (XCode 4).xcodeproj/xcshareddata/0000755000175000017500000000000012140306213024703 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/DeSmuME (XCode 4).xcodeproj/xcshareddata/xcschemes/0000755000175000017500000000000012140306213026665 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/input_legacy.h0000644000175000017500000000326412140261603020431 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #import /* The main window class instanciates an input object, and places it after the window in the responder chain, so any events not handled by a the window get sent here. */ @class VideoOutputWindow; @class CocoaDSController; @interface ControlsDelegate : NSObject {} + (id)sharedObject; @end @interface InputHandler : NSResponder { @private VideoOutputWindow *my_ds; CocoaDSController *cdsController; } //preferences + (NSView*)createPreferencesView:(float)width; + (NSDictionary*)appDefaults; //creation/deletion - (id) initWithCdsController:(CocoaDSController *)theController; - (void) setCdsController:(CocoaDSController *)theController; - (CocoaDSController *) cdsController; //keyboard input - (void)keyDown:(NSEvent*)event; - (void)keyUp:(NSEvent*)event; @end #ifdef __cplusplus extern "C" { #endif int testKey(NSString *chars_pressed, NSString *chars_for_key); #ifdef __cplusplus } #endif desmume-0.9.9/src/cocoa/AppIcon_SaveState.icns0000644000175000017500000023372712140261603021774 0ustar guillaumeguillaumeicns7is32 !"!9]\dC'|Щ0*vڲ6,[`;*\V=(ZnJ='Z~kV?>%Y}hU>4?#XxdO=&,>"XxdP;+ +="Tr_I4#'; \zgPA2+-$)9 [ҷ}(0)Vf^``eaci_hK.=,-.--$,.,0.66F !!9^eC'|ˣ0(~ͽ4%|1#{1"z0 y/x .w -wU.ty-up-^'1)Td[]\a]_f\eI/=-.//.&.0.2/76F !!9^eC'|ˤ0(~ͽ4%|1#{1"z0 y/x .w ,vU*t(u(^'1)Td[]\a\_e[cI/=-.//.&.0.2076s8mk>[TWVVVWWWWXU[Dil32 "%&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?7cropqmjpllklopszjmvroql?>J J=ZSw8W H7\xxrunz3U G7[ԠaEUz4U G6Z?z5U D;Fʼ];S C:DUP ?6BymfA>O >4BwnaZ=>N <3BvlaVM7?M <3A~tj_UKA2@L ;2A|sh^TJ@5-?K;1@{qg\SI>5)(?J90@zpf[QG=3*"(>H8/?xodYPF<2($ &>H8/?wmcXND:1'#"%=G8.?vmbXND:0'$"!${qg\QH=4*!!ɮǼv$I 44&Cʠؿڛt"H8/9%:ecffb+heejbdihgi`khljf54? 5/36/ ! !"!% " %76?);/018989.5;9::9;:;53;-8874554546534566:99"%&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?8cropqmjpmlklopszjmvroql?>J J=ZUw8W H7\wysv}lz3U G7[ӟaGWy4U G6[5}4V F6X2V E5V3W C4W2V B3V 2V B2U2VA1U1U@0T0T>/T0S>.T0S=.S/R<-S.Q;,R.O:*R{.N:*Rw.M:*Qr-L9)Qn-J8(Q5j-I8(Oǿe.H9'Ph+G5.<¥Ƿĺ༬ߛ¼v$I 44&Fˤ¨Ġݡv!H8/8#9cadc`fcbg_`fede\hfigd44? 5/36/!! " !"#"&!#"$&86?);/018989.5;9::9;:;53;-8874554546534566:99"%&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?8cropqmjpmlklopszjmvroql?>J J=ZUw8W H7\wysv}lz3U G7[ӠaGWy4U G6[5}4V F6X2V E5V3W C4V2V B3V 2V B2U2VA1U1U@0T0T>/T0S>.S0S=.S.R<-S-Q;,R,P:*R,O:*R+O:*Q*N9)Q)M8(Q0)K8(O~)J9'Pu(I5.<¥Ƿĺ໫ܘu$I 44&Fˤ¨Ġݣv!H8/8#9cadc`fcbg_`fece\gehfc44? 5/36/!! " !"#"&!# &86?);/018989.5;9::9;:;53;-8874554546534566:99l8mk%402111111111112222222222213,;+M)J*L*K*K*K*K*K*K+K*K+K+K+K+K+K+K+K+K+K+K+K+K+K+K*J$KEE"/it32m 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9bՃ 4Of%6:IHGK@WP AF@@ABAE?9a?Ȋ /7&5;IIGHFK@WP @F@A@A@E?9bʂ;h[8!Q!c!ʔ&5;IHGHFI@WO @FA @>D>:a!\RfSQRYeYNRkݬ&5;IHGHGK@WO @F@BAA@D=9a'5;IHGHGK@VP @F@ ?D=:a -48R躼71EABBA?D>6Eܣ)21E>@@A?D>5: 015; 01?@A>C>5; /1D?==?@C=4;̤.2>? =B<4;ʤ,2;IHFHFK@WQ;C==>@>B<4;ɤ-2;IHGHGJ@VP =<==B<4;Ȥ+2;IHFGFJ@WP ?>><@:1;{yxtqonkfj%39IGEI?VP 8A<;:;;@:1;'{yvsqnnjice$48HGFHFJ?WP 9A<=<;9?:1;){yvtpnmihe^b#48GGDFGI?WP8@;< :?90;*~{xvtpomihca]`"48GFFECI?VP7A:9;<;@90;!|zxvspoligc`^Z]"48HFDH>UQ 7@;;9?90;,|zxuronkhfc`^\XZ"57HFEEDG>UP 7?9<<;9=9/;.|yxurookhfb`]ZYTX!47GFFEEH>UP 8?99;<;>8/;.|ywtronkhfb`^ZYVSS57GEEFEI>UO6?:9899>8/;'{yvtqonjhfa_\[XVVNO 47HECG>UM5?9:9:7=80;&~{yvtpomihea^]ZWUSPLO57HECF=UO6>89:;9=7/;(~{yuspnmigc`^[YWUSMMKK56HEDG=TO7>788:9=7/;3~zxuspnmigc`^[YVUSMMLGG55GEDDCG=TN7>89786<7/;4}yxtrpnlhfc`^[YVURMMKICD55GEDEDG=TN6>89897<6.;5|zvtronkiga`][XUVQLLJHDAC55GEEFCG=TN5>8 98<6.;6|ywuqonkhfb_][XUTPMMKGCB?>55HEDECG=TN6>8 97<6.;7{yvtqnnjhfa_\ZXVTPLMIFCB@;<54HEFEBG=SN4>99898<6.;9zyutqomihfa_\ZWUTNLMIECB?<9964FEDFEH=TN4=89::7<6-;:~{yuspolihda^\ZWUSMLLIECA=;:8664GDBDCG=TN4=767:7<6-;;}zxuspnligca^[YVUQMMLIECA=;974364FDDCAF=SN4=87686;6-;2}zxuronlhfb`^[YVURMMKIDBB>:8641263FDBF;:7411,)(&%%72DBADCF;RL2;67886:4*;C}zxusonlhhc`^[YVUSNLKIEBA=::7411-)(%%$#73DBAA@D;RL0<54566:5*;:}zxusonmigb`^\YWUQMLLHDBA<;86411+)'%%$##72DB@C:RL2;65654:5*;;{ywtrookhhb`][YVUQMLKHDBA<;96310+)'%%$##"61DBAE:QL0;5656494*;3|ywtqomkhfa`]ZXUUPMMKGDB?<;86210*)'%%#""61DA@@AE:QK1:56 494);3{ywtqnnjhea_]ZXVTNMMJFCB@<;8531/*('%%#" 61DA@@?B:QK1:4356594);4zyusqnmihd`_\ZWUTOMLIECB>;;8521.*)&%%#"!60EAAB@C9QK194334494);6~{yuspnmihd``\ZWUTNLLIFBB>;;8421.)(&%%##" 60DA?D9OK0:4544383*;4~zxuspnlihc`^\ZWUSMMLIEBB=;:7420,)(%%$#""! 60DAAB?C9PJ0:483);1~ywusonlihb`^\YVUQMMKHDBA=;96421+)'%#""! 60DBAA?C9QJ0:4545483);6|zwuronkhgc`][YVURMLKHDBA<;96210+)'%%$##"! 6/CABB?B9QJ195483);3|ywtrookhfa_]ZXUUPLMJFDB@<;86310*)'%%#"!  6/C@>@@C9QJ0:5454483);3{yvtqomihea`]ZXUUPMMJFBB?<;8521/*)'%%#"!  6/C@?>?C8QJ0:45483);5{yvtqomihea_\ZWUTOMKIFBB>;:8521.)(&%%##"! 6.C@AA>A8PJ/:5443483(;3~zwutpnmigea_\ZWUTOLLIFBB>;:8421-)(&%%#"! 6.A?>@?C8OI.95 383(;1~zxusqomihc_^[YWUSNLLHEBA>;:7411-)'%#" 6.B?>>=B8PI/93455483(;6~zxuroolhgc`^[YUURNMLIDBA<;96411,)'%%$##"! 6-B@??<@7OJ093325483(;3}zxuronlif``^[YUUQLLJHDBA;;96320+)'%%#"!  6-A??@>A7NH/93432172(;3{yvtronkhfb_][XUUPMMJGCB@<;86220+)'%%#"! 6-A><>>B7NI0834 372(;3{ywtqnnjhfa_]ZWUTOLLJGCB?<:8521.*)'%%#"! 6-A>==;?7OH083424372';3{yutqnmihfa_][WUTPLLJFBB?<:7421.)(&%%#" 6,A>A6MH/83255372';1}zxuspnmigc`_\ZWUSMMLHDCA<;97411-)'%##"! 6-A=;<<@6MI.73213372';6|yxuspnligb`^[YUUSMLKHDBA=;97411-*(%%$##"! 6+A<==:=5MH073 1062';6|ywuronlhfc_][YUURMLKGCBA<:96310+)(%%$##"! 6+A=<=>3IF 05332p469)!_ebeLl|nNhiAtkS^w\ZsɄnZvmyX]n^_(+<;998;3IFz 46323225458 ,0PkM2v~;Yl͏t[@Gxx%/1yn5nUiVZq 0g IjWYn)mH?(+<;::9;2IFz,67334328+76 1!ikyy/=WE ΉMCVG&#xx6@w@+t,VĶA}Vx~=Edd(*:99<:<2HFz.$2423256.56 .Y=O0ե^fW5J|:R\F'QefT@MO:SRIQGA1QCS:UL@A>~)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtsvwtuusvsvuwsuvsv utxxwuvtuvttsw vvwvwutxwtuwuttuxxwwtwxuvxuwwxu}L97#>8898;2IG!E/4)8033223166,9;!;D,(@7997;0DD)E)6&91322323167'.2987898799::9:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9b׃ 4Of%6:IHGK@WP AF@@ABAE?9a?Ɋ /7&5;IIGHFK@WP @F@A@A@E?9b˂;h[8!Q!c!ʔ&5;IHGHFI@WO @FA @>D>:a!QeRQRYeZNSlޭ%6;IHGHGK@WO @F@BAA@D=:a'5;IHGHGK@VP @F@ ?D=9a*4;IHGGFJ@WP ?FAA@A@D=:bF->HIGK@VP >EABBA?E=9]L*?GIGJ@WP >E>@@A?D=8PK*?GIFGFI@WP ?E@?=@@E=8RL*?GIGHGK@WP =D?A@?=D<9QL*?GIGHGK@XP =D>?@A>C<8QL*?GIGK@WP >D?==?@D<7QL*?GIGHGJ@VP >? =B;7QL*?GIFHFK@WQ;C==>@>B;7QL*?GIGHGJ@VP =<==B;7QL*?GIFGFJ@WP ?>>GIGJ@WP;B;<<==B:6QL*>GIHGFJ@WP :B<=<<;@96QL*>FIHIGK@VP:B< ;@95QL*>FHEEFJ@VP:C<==<<@95QL*>FHGFDI?WP:B<=<@94RL*>FHFGEI?VP 9B= ;@94RL*>GHFGEJ?VP9B;:<>=@:3RL*>GHGGEI?VP 8A<;:;;@93RL*=FGFHFJ?WP 9A<=<;9?93RL*=EGDFGI?WP8@;< :?83RL*=EGFECI?VP7A:9;<;@82RL*=EGEFDH>UQ 7@;;9?92RL*=FGEEDG>UP 7?9<<;9>83RL)UP 8?99;<;>71RL)UO6?:9899>72RL)UM5?9:9:7=72RL*=FFEECF=UO6>89:;9=61RL)788:9=61RL);EFDDCG=TN7>89786<61RL*;EFDEDG=TN6>89897<51RL*;EFEFCG=TN5>8 98<50RK):EFDECG=TN6>8 97<50RK):EFFEBG=SN4>99898<50RK*:DFDFEH=TN4=89::7<5/RK*9DEBDCG=TN4=767:8<6/RK):DEDCAF=SN4=87686<5/RK)9BEDDBF@@C9QJ0:5454482,RB+5AA?>?C8QJ0:45482+RA+4@A>A8PJ/:5443482*RA+3??>@?C8OI.95 382*R+@+4@@>>=B8PI/93455482*R!@+3@@??<@7OJ093325482*R"?+2>@?@>A7NH/93432170+R.>,3?><>>B7NI0834 371*R/>+2??==;?7OH083424371*R>+2?>A6MH/83255371*R(ƿ<,1?>;<<@6MI.73213371*RŹ<,0?=:=5MH073 2070*R5;,/?=<===<;?5LH173 260)R*9,0=>3IF 05332p469)!_ebeLl|nNhiAtkS^w\ZsɄnZvmyX]n^_(+<;998;3IFz 46323225458 ,0PkM2v~;Yl͏t[@Gxx%/1yn5nUiVZq 0g IjWYn)mH?(+<;::9;2IFz,67334328+76 1!ikyy/=WE ΉMCVG&#xx6@w@+t,VĶA}Vx~=Edd(*:99<:<2HFz.$2423256.56 .Y=O0ե^fW5J|:R\F'QefT@MO:SRIQGA1QCS:UL@A>~)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtsvwtuusvsvuwsuvsv utxxwuvtuvttsw vvwvwutxwtuwuttuxxwwtwxuvxuwwxu}L97#>8898;2IG!E/4)8033223166,9;!;D,(@7997;0DD)E)6&91322323167'.2987898799::9:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9b؃ 4Of%6:IHGK@WP AF@@ABAE?9a?ˊ /7&5;IIGHFK@WP @F@A@A@E?9b͂;h[8!Q!c!ʔ&5;IHGHFI@WO @FA @>D>:a!￿¶QeRQRYeZNSlޭ%6;IHGHGK@WO @F@BAA@D=:a'5;IHGHGK@VP @F@ ?D=:a)5;IHGGFJ@WP ?FAA@A@D=:bF->HIGK@VP >EABBA?E=9]L*?GIGJ@WP >E>@@A?D=7PK*?GIFGFI@WP ?E@?=@@E=8RL*?GIGHGK@WP =D?A@?=C=9QL*?GIGHGK@XP =D>?@A>C=8QL*?GIGK@WP >D?==>@C<7QL*?GIGHGJ@VP >? =B;6QL*?GIFHFK@WQ;C==>@>B;7QL*?GIGHGJ@VP =<==B;7QL*?GIFGFJ@WP ?>>GIHGFJ@WP :B<=<<;@96QL*>FIHIGK@VP:B< ;@95QL*>FHEEFJ@VP:C<==<<@94RL*>FHGFDI?WP:B<=<@94RL*>FHFGEI?VP 9B= ;@94RL*>FHFGEJ?VP9B;:<>=@:3RL)>GHGGEI?VP 8A<;:;;@93RL*=FGFHFJ?WP 9A<=<;9?93RL*=EGDFGI?WP8@;< :?83RL*=EGFECI?VP7A:9;<;@82RL*=EGEFDH>UQ 7@;;9?92RL*UP 7?9<<;9>72RL*=EGFEEH>UP 8?99;<;>81RL*=EFEFEI>UO6?:9899>72RL*=EFCG>UM5?9:9:7=71RL*89:;9=61RL*788:9=61RL*;EFDDCG=TN7>89786<62RL*;EFDEDG=TN6>89897<61RL*;EFEFCG=TN5>8 98<50RL);EFDECG=TN6>8 97<50RL):EFFEBG=SN4>99898<50RL):DFDFEH=TN4=89::7<60RL):DEBDCG=TN4=767:8<6/RL):DEDCAF=SN4=87686;5/RL)9BEDDBF@@C9QJ0:5454482,RL(6@A?>?C8QJ0:45482+RL(5?A>A8PJ/:5443482+RL(5>@>@?C8OI.95 382+RL(5?@>>=B8PI/93455482+RL(4?@??<@7OJ093325482+RL(4=@?@>A7NH/93432170+RL(4>?<>>B7NI0834 371*RL(3>?==;?7OH083424371*RL(3>?>>>A6MH/83255371*RJ(3>>;<<@6MI.73213371)RI(1>=:=5MH073 2070*RH(1>=<=><=;?5LH/73313260(RG)1>>=<;?5LH173 260(R G)2=>3IF 05332p469)!_ebeLl|nNhiAtkS^w\ZsɄnZvmyX]n^_(+<;998;3IFz 46323225458 ,0PkM2v~;Yl͏t[@Gxx%/1yn5nUiVZq 0g IjWYn)mH?(+<;::9;2IFz,67334328+76 1!ikyy/=WE ΉMCVG&#xx6@w@+t,VĶA}Vx~=Edd(*:99<:<2HFz.$2423256.56 .Y=O0ե^fW5J|:R\F'QefT@MO:SRIQGA1QCS:UL@A>~)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtsvwtuusvsvuwsuvsv utxxwuvtuvttsw vvwvwutxwtuwuttuxxwwtwxuvxuwwxu}L97#>8898;2IG!E/4)8033223166,9;!;D,(@7997;0DD)E)6&91322323167'.2987898799::9:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0t8mk@13455555555555666666666666666677767776666667777777777777778888888888888888888888999999999::9:::::::::::;;::967;<<"s=!            !! ! !!   !!!!!!!!!!!!!!!!""!!!!!!!!!!!"""""""""""""""""""""""##"""##########$##########$!>  q[?9ܙ#.100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111/$!" ic08w jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 wB844D{H:2|rgGQÅ-ΔnѝV$#:Q!< \ UrtE4+튭E禬F1sk N~ka9U:qRcz L]qȴTIL 2ue-gw эvY(%EO?)PNf8uBf߫MjzB0%cɒ34k90גA1dK|4 gY*} -0Oc.)jm,3=70Y)'=gʰ yoBh~3{ćhi-s>h8zb> c7H>A|@Y _0i$ [b7' ۰[\+Z1}(+K$4wa*]*D/gS[e&Udo$JFn>GtK+E`5huc\_HS@ h߮켕[WP /}_buayUđgQ1h#uwslPVP  w۷9[f7} P>@E }4燖VDF Bkp" `3 QkMq͜1RmiOރB! On'|U :708)&[DGښ_GR!puL,4K%(R@A(,*tSܸćSXN˹E܋NJU=F|YVtP뿇OxGU{R/ÇFoO>ɷ sy0G78W1Q=eKfOqnӢ{Z%hŲ?v?lubNs?skzh#L&ZPk=?Xz٪g#Jahz+FZZ.+=]YZ7*r0$鋏Uổ3չsw3U}(%=GCV=*"7g1W>`UW"[h!h`lKVӅ4 <`<VK"bҩ0Y hyeɾ3 Av."pfKx{`Si۱nv/J2ձ][;nJ㨤1]XġFA?Fz#/MXƮ‚2(* ~ b-Ʒ-^p3)4dx,*ϰ+0B?Z":Ct eîvLQyAi^[;MBN85׊T=YڧRCZ|~:7Z偧RªGNʞN=N9HvZȘ:p6_][qshMFRw+d7Kt%@o^>|+ I'W zĩU0FH!9 >5tP%tıX>dv*i:dF:ΉD7-$Bz3*AMH/wjK\68mhgk'9W,\B=@?h ]jN߼%Xd`$-]$}\KUXgTύQcQ(j'{gJ-ow0R> |(|huN^'9JY,-@.a"qpƕئʥ$`!:׉2"s1,y}lC:Kcͱc96OjpnsaZO4"./03< ]G $qXStp6ٵzuSUSŒ`/ꛜ6]68OpܰN% w YULFIJӐ%4:N뱨2^ 3W"eʛ0o4`±36,$'<|v^D{Wrg 1q})D~TQ?L:y&IRֺנf8SKR@>F܄.՞{/yb·c4\kFo2f t*ڷ,9φ/쁕wyV2  f P )nN01!p>´_hfEXkE{UMb1JcHy"M%PXy?D&0:[z$% ;i#56Zv#wNB(HȝlI&Gs5*X3K h.v Bt$*zT7I H*]J'Ñat x;VRˏ|a&W]:czy0bwd'X1K jl”֌nFln`mȠl b~'x/)t3b5&YR11{ +C`t\ޚt gߪgGa* |_AW7oUol3*N-Bn@T+F6w{Yi*!Tyvٓrs߄ YFtaj5#k- !owcm}t(gaN!>lo# !@q!D1Nv_TOU$"d LOp_KHo</ff:q8AvԲJvTT.I"Ronʪ!$ZTOT7VĽQۏa q/LhGʊ`ڮl@~kwjH Mxo,*}eJ08'LRBXȰRxFC -9\@ -dl)65FFAh;Mҍ [> 6Q=Ʀ@b:llHfA%U;O`$H_vO|҉܈ gEv *Dnՠ#klr gy7XY8MT9i1tW`}HW ZrFװ26jM1:Վ~~$$2Y 3wLDh}|%Ihwdyr^hPm?P<+\BS 8UhƷd ab*3Q:5A2d(s t06AxF ][Y*sY 1>U`7+ Eɒcp"̄;7!5).J=@+H щrͩ8ؤw֠[֜'&1|R̾hߺwE*S?3 Hhλn/nVáWΝ(ӄU?𪼻 />ٰ&<,TAg_ %8xH@ l㇚I1:G N`[x?Z2[d$N_a[(AۻPfM״֏ؽ8z&p0Ar_|nӹfB!ov:ϞNwvtaڬ$6p|hRl3 2FXY'W'g SU_K?{[-nK*=JNy4Q?$ZK*w h"1ֈ܉Dg؜GKMXJH61;} H:@ yInC-뛻N@~G)X_+iwMFc%}"P8imp"*1hsMKJ]W_{|R-Y>"L>vM̾r؆ gb|x#[^@c::s*7T3`m2S9Z}t&(hXrA,hHm_33SxN|4?s(c|I\KnLSm!i)jѴJ0K56dϼ9XHhfՈ:1F&iHLN_*\Fލ[Q~RǹmFd8+ Z2 Z0;n&WpLo\m mC QlA92l&?[ğ"'myV"aT T}8C&pvŒ$4itka"xh ؔʎг$IbIWUr/WqM\i7=#%a Gɷ'It_h⢩QC)E=a-I( kQЁ3;`bӉ9k܀0{G}KQ mloC9֜L3Kx)jL,߇!% | S&^ƄB9@iDWMcFWطl{@O;L?$MFv%.5m^j#9b@7VR{ڳ/VRv >&78|$' N0 p17`ډH_Nd9ڪgf3qS sX<4 sV/ܾ7SVFc8bM1!}߆‹ 0_w.~r*UU۱١fa4b9d1%D㼛UQshJr]r:~xZ>3+'uTX= 5uzĽD^As( aޟ{*k ItOrIriWcqZg}!^Zƙ?+e9S>jۢo@Tܐ>LSЏ\qY(~1j/45s %ق`߀y`3[1qoU)k'DŽN`MP ڱBj>_j{z0)!9S1GU#Jp/8>zq`Ʈr޿nd rg΁Zqs !r1ַM}dJAUu2w pxS$C)Gy3G%//Ml8 š#AosY$`Q.y}툅{vAIT; 54h[ﵣXQݘ݂UǶQׂ㴮%/ڧR}B~1o m߄6HezgyF{-)_( =Pn_W:: u=bDCag5vd_5pɬy+4ͲWkV@+adx@pP;|>g6wT. {_q~onMhrʡTdoIZo#knsK,)e  l\pCo]tPG( Y5Q_Nf7k'_c/w¸K_dy!J_eIn^瀈H\ۚ)Pm]ԕĮRTe<QHjV1pP} HwC3x4 zR6 ܫ ,O+r_ z!! PnISU }<@6d?;iGcxǂ8=82Z\fEohc M~<[$sz_QmdxW?1*h`4?9zi@'yrFUYF4zh2NWkלAt.D0MDV]nź{qXNGؠW WV:¬31|Cu.[{ 1sŬtRDP9JaEFG廳lY.eei3Qeyg&aEt:>ImǝKL=Cw96b6 8j/KJg9Z#;BH۷SԙCL'dwy˽N>g$}v`8ՓM(C)v3L%iR(p4{q=@>^_k5X?S4o" \,vGBd"z[:&{rk(@0%72daVO1?sаGW<;Xqi@l9}ň}J&1kFdՐՇ C_ҹ>!8uH;"Qg'2 7CEYt 2WѩY3hrcPjEAYv hBT3+ }pP2Х2O㈔ ?A0ȋ$VAi0Ԕ8|5 }yN (:nm5%q,α[~69ZMh}DnJӕ z%4kFDjqՒt)y5y^" ^S桗6/{/TFa-NHߏ59\3i}j 3štfUɆj&% bԭN跣 G~Y$*H Fo蛦XKnH;ۦRMT{sA&:kr*/qϵd&2;p'?M^FKvϋZ,yw<) ኝMtFϠ0U>Pbj & 8WS2C:!~ &RXD}DB ƺM@^?Lr[`#ERl:ȈZhz|*`2Hs L;4mi"nCkp%7h%gUZI5A"\5#Liz1 렲p)Cw42iihV .>P30#|oMqjxNfln8B).1(#;s;=(M#He\٨5֘[0qnk3> $ښ]smmޠ9oiĵ2ʑ9-N Zx:bT$wYk}O_z {l ڶk%_r sUHo>QzP$@/ $SV"Rq6`)CaLXEހ^'(wg3,hdN|ЩCf<#kV>xвZ njiQ='j&uN"rw^?ΗhVgp0vV@V)Jvsr,˟!mW<  ۢz-o8Uzd 1dui s5-4k֜Z 8xmYq2~DHdنt$O)xl/>E k+HQ ^q[Qbߴe2tפ~zksە@oph֕uqPVK db` p|ov#>48sSd,ՏdDۡ @ю\DŽJF$K2ߖ5SGVۈr&c(1)'p1j "&F֏lB>5aN: }mƋq>t7l%iL,LIB\s AdPFG|T-TPGX~{w=5]t͝7`[^((gJ[/`mV8K2场t܏|=!M{g"I \?L7eBW)Kf6Q$ꔂSxi5(s/srxrNGnƼڵ1qy$)}guiI |p-aO~.7%NԻuVϗOhf8eDZzq𺷯]~Pܚ|7Mh&@ q#m:x="i';ys]Un§o HP|fDڣ m,Hsg XndKǘgi`RjR"BSN& jE|qfNYљLDÄҙ /3!|Ž&Fwƈ 뀌;s v8J1`;,!\:|EPm!6;p`'(: U=wk_ XM($Y dR )2jr "816o8iW^%o8$t{ΒVg[kFr Ko/%N p^%?C$ec~6b>{&x*Y[K"&BC8T(aH` d>զp\6DY7vە5̖1xF(܊y4/v\-K22H˔c$jܩW'8Fpyda5SGL 07u&$1˲gF= rt}>O+ؑ RG>AEc{ls~|.A+?e2$ETY`jfvP׃MHg;)\l,Dv śpg7h;V\[8]B߇h.B{օITY'V/%𻧓&h  [휡3>|JŸu.E)JGJQlT}6/٘K"\y{a|vcSh! Ȟi_Eتih*,3FYCZ~PvϬYX`;x4G7)xL}Xa| uoyX"x #IsAMz  &A%"A*bm\TFxQ~tSE[*x&"eJ_6Ue X(gZxKTTt ?2NEmCTd^^^^^^''|y4ޯ":#F|"!V[RZ`~QhS"uSQr^1jb%ݎ2) rp{`Sji3g%~`;6nY}b\+ 0cZ1],4<;t*k66.85-?G_ #lPTˢʧƎ`51FpM΂Yejij* }mj(vqZ*6Ur53 ~3jv#^P .r5NLjZ-_i #8Qwpc(s+db@  r~8\(]3k8ݳ('pIrpu0e =`{91X- iQ,Q*x:/Erv~(К sZ#U$8VN!*s呯fZw/!- 䦯EKq0M!n!;l!% ˦-H#{(38T+up/ zQhì$%:D)ZH9a2hui}*y>6/ #T{"kc?I&%5O~8#C$L|4w$$CMv[:H3Q5OoPTzJ#`% BUH&  :&o/v- 9eHъ#+ͨB^湌z0'b6>!aApbF_ڢF:-_#N/m򬹉u޳J!MϪ__y (S"δC}x >! x ҞWI3sK^@3'3Қ qA#JA\-Dw.֗p2>m?>s 3gvNAbvoܴ`#fHؤrxLAPS,lGD`ܶ^5)YD]66*y#.o8'@$.+^j -[a T5Rtb3?kx>[rr5t.0^ W|3+&zlcBaHɯP28jnih 2'j瞀6Hxy֒2%ָsπ;1WcE8>h.]bU!jfb;~t+~"n wdueŨkdz udY !'3&XF(6͌KSI]zX`(V`'\XNvؓf-A^ NAeA<,{+9{h4Ο(6^+'1PWoBu9gd%aHjLb<]<(!uzp.;=Z4"YzdLzDy G&El֖m{|Mt}#jARێֻ_CR?(JrYayVWnPWhP+}#Yu 8{>{ )j"8V Gx.N|?8ϣLJAq?9LyްvKm$4   vM+ _VNg1G.ʙ\bY8TbS`68p k~H1ThOU.i_nPہV}:%[rdXG^XxQd Ox{bb[kB'b/4'u6=rSDHn[0@sw#.L֕Ljv8G*$N,aTSyan^fPo͝HƝ5\ :sTdOĖ[LKw^dX)P&S6ॠ'K U[}6T`hQ/`au)6&\'uF{&e(xo>.[𽶞^A<8^/rƉ}@;C$@O0 2ܶ1޺D!ђ`AR3a4crI>7Pok,bD] +-W3hTvy7RGM/[SgWBsf3n]6/hmd$Z}~c`BNY0 ?[n6-q p̖~).C+ן@`^*c"'9J h\t JT=sEB~nml?Es 5 1ZI$I$I$I$I$I$h%TV8ə[M"K9.mk{o:jImIe}bZ}ڌpp[!ULIZ?><ofڙq'盁dAf;,Y;MСd?|/1c; _~J8O(|pb鞚\sՂ\w _,hϸn]XO 8H $/~~30EU^9~ҥ{qh y-ЁGa`;q&Ԕح"0$dGPcx{'njO#H&DM4^Ai3ۀN9@'pБ":܄q*$mhp(xdpg/*r G0O $j+1O70, 9v` goۤ}}u1/f?{y&RȐ!Z?ɝLf+K~#8;/tRʻߠR\{&T)yr+]8ᖕo?0^(=t[}H=JS%~6V- I"#6^)TA-mkUp X&3kFԴcr'@Ģ|^؇r'JQu#z+ > n^ݪ.ͽaɳ@IҠm؍^(}OOV1ׂ"Yƣ\k J03,8346 ֩-ƈs+CNg &DoLA٨I$I$ԅ|E³a4y !{&&n%$ʠ ĮxdZEJsB>v "Vo5*7 LW{bUqDr9"F' CPAf hQm p ^: jx LPU K)ByD`SKIsG қo8'^[|fYf0Vf9q5~I`Y:az>grz`O1qZv YXmq8yЀdT (#8@ 91s(|amz q2s 놕,rbqNEIOԄz(-){ްBɼ(薳h,[j;d쟜2S e'XO1A$FnV/PJW`$^9؄ic]`+Iq|+&J=6p Н]XWp%N0+5nVTw Arܶ{)~~ Fp$V1-~<1.z AC2 8ד]/ji&e4'38*0M`kB.Tz,loi~8 ֤t_l';=Fl.+"6>ǠWJ} T)ٔxz(G:7'f߄oTS5D;u¦re ÚUQ" Jn~< pހ)_Y&tBǷZ|՟ uc_Y==DZr_ۘ2b0K12ZNt2:FFVXX HG@nGZk@ڛyHD^?a [B&~BG].?2P]#%\JA'j^"YwĹrCxQEITÀKS9v2cᮍ) 8]݊:b)u;tU;(~hǪSR~J[[?K< ?OABzിTmR/ 7w R ʆ jP@"+ů/ aK+&,Z5}06f[KDReqb{BrQpnXn1PEc+>Kd_Hq+b/a'HmQsr>;,7YȨ7/KV2hbJ^æbb 52|5~֤A`?( yB_,i‚zQ] lҟvzJ uuޛ7d˥k YH_xJ d%ảCwqpiMFv^zݼ~=Eo^,AY3I4ǀ,xb9 Tp,)d/mЍgK/M @[U&)oK&Aڻ#\^uQ&ĝ7MAҀk,kk[o;:2l翊 Ce^)^z<|Qlt8i} й‡kE/IwJ3c?Ӱ~s㉯N$HRKřF|>+.#<{ɹ1ܥxu{lժ[irDcҮZIGj|uʤRmҡ,lSs÷ⓍLJ4/2ΈV;v&_Lsr EړI0,ƧLUa9 qVwĜtӦ^xO;i~p= n t|X)p-i$jliItTS7]ìq8xw ֙acdh39bODFc/jxMNnWKƿ9#̯",=蹌#.<|;0"WĈm# @Wqw~=q_@K;=9xI#3?A-A|LM܏Xm-SsT喘 qy*N%=b%j V[wo0`($#H]R9 zh~ǜl|j[%pQ:t ]QHJG|4U ]Ւ2Va-zt.מ4}Oe^Ȫ$$DLwØr?0}j!(MEF6HI,O!NOM'xS} ~85Rxy*CD%^[x&cBa(G#{L !4ӎWJRŽ 58 ќ({!;Y 0fMƞRNOHKBn4A9o3jf~6mg<N(3U(aV1-m\՜= UTUJ#>jXV!;Bsc8y*rc8դ,WH+Wȟ7h (ERFQKB`ws )UBгCjDUm;L Q=pZGActpʩ9RIvXCĘi}qR;Ol |p(v r'aBd㮣g4EYVuZEF[UqC~dGŌw1{3u;"oA.vJuauy]r*}ĨPs$HކMb>|oO:fӯ-SsP5s3KHg[P>y+[lL@UmkqiuQ>HO,:'9E;G:s(=3US11~7w^:"]VfH65 FGNPW"^t4J4e^Q?~H Jɣ3:0ZeT^RCLΞ$튱B=WfyAɤyBA)u fkP| bM[%0c?\uƒGcNo/#||$"}ӒO7zI {1ƕ3$,,e8 *?J8A )uXao]((LE2dYf+#c?ō(bҵP+V,B j7ܪU<́4TJ} y6YY,ө0}=$D<:d2'a쵪^e~(3 # Ԡwی=,]Xk"lk*U L*$k΄2ܢU8I"[nRrdd¨1`YɮNn/e0f!m.EwW;*OIڹ|&Wy[0E M( 156/urN[d?Q%pv_a 3՞_?k;OCCKSV w^":jDcb\_嚙JuOi*xmD1⫬h1 }Cjٝ#zGXBg2R()'Yޛ\ l#AߥkF q?̇VGŒW^?򦩑2ŒEKkq-RC=ybq5]sI'w%8KtLv `@G[_9#);`uidhBɨQ !\Mu5 K}>ARe+pd`ȯoT8=_tDiZC&o _3ߣ;9ҭ:œU_3I1 iwy`Po<huguvj$Q 3!\?D&s&]ث` u[V`ʞ`^38 5 6ld8\Тxډ'W+6mi<4*h`wc}e}SwJTX[0;ü41Oc?*{`ڭ\Z#ssTJ^IRK,CD@mY` D଴kA@Ԟt"ʼyt}*}F= }MjeReZ4vHõ{(dK4%M X.ѡz5~nH˗C*>ʣ4_k``,`>%aoS;Cvjg)f&֋cD,ϡ}Z*ja`TPF[!WܳJᶴl4$\iMpi *J_Fo+L:CuI]iFue!Oǀ@g11jx;F14orI v@o$_IZ+K$ԜZ7*Ck.6ʴdb=0c90s)5Ǝٳ&Xy&#Mq#ìf,5׿9cP:=7nnjH!zݤq ${zeKW[]{]Cx[?yhLTO(mܲCÔ<ǢYi7h\`_ae*~&ݺj7{/Xj >< ~' v9s>9L,wDDY@bGt |rw~e'GzRR'yKh ]@S1?q;^(| # w,m6knCJcOI57`qRqHu;_ӑ2D%^1eH)e NV匒đ@J9>Isb{;<S`bSId|u8 #t: Y= X!_5q=te5 UE]ͫC=  ύ:QPtxŨOm5dclE"Omi_FʪZђM]8b䦀!:%:^QCL"R'y oGB̎ꡕD_υχ'QgL m[}q[B{7%@r@ V Ͽ]\z\J3 bp1N r\."x۳ 4#(0@m%(XN$Ja4K'cSH_7efQg1ƺYJ--| c%0#v%b_/Ԣ#hw_FY+G}4a{ XU Pق8Ik6,_zfujEՉr7#]Sc ?;M?;Y8иV.=KB8'yzItIfs=9)-yLF}CT nkn=@wSkq SRMw7+Q7` U+>fmdJmXwem2&A^SyH EVf<8 }B"~[F T*6nmM]*tE!*W9B;LKzR:x%ɘ&ð;4q-5B&yvTWhإC^yX#oj8JzKQ>poޭ>L1ܺsL^\%uE״1l&T+jLnzF6K| +E07k**r0 E[, _މz睇z>Jc6 yX.N `rg=K BB\~_; vRbD,%8O2GBQ}6_YĸHK?T@xU!4yV UNU^;pbBsҪJ= 6=rxqn# d@Ap zпQcV+ۧr,##6C'6ql&e@5dL^@qrK@hD_X4g6IV?/S7vI|QRnxQ;E| +}߉oW8O:@`I'VSΗ@4X)!'~=+Y(A dy82i=+@VY_lkkE6XtF*ƚ I,t)pCb:m_,gu$e^N2-j;o:KPV}85;x8x< /aMNvXJ}F{]RC_o`dQѷ"~(OKefQ;?uSO D9aȕ1 8Ì7_;۝mPӯ!6\*cuf!*#ްO3s b[wN ]GrMf KG=JLfq+s*տOȣҷ+VۼKoS[F@T6ESރzQQf#5ZQ$,p ~^0s Իsk2p+Q@#pC':5@pPrƛpG`6}b#_2(Cxpݧ" %n7m`l~W\x U o&zo#oA!"D*j(װ\p?F#.'́PMIphEvJVҁy?0ɎW7plx'TB~ýM*^ѥ9RYa%^w2j2sӜζWlsvIו25zYC.rSKʘP9{}1Cw~ NP[@6&Ip>8YfoJd7ZVLL>ugIi!q`'j?b Pj{|-RG;,A7G9d} {L Cye<ÞNp>rF(NDn:H+ Zuu$iyyCh^I7LZΔ"]x9E`Rʠzz#{xTo~&4!Y ok~CaWG?b2LG?)H9,l:1L0t̑ZZaz'1+Ĩ tsY8?"o7e{q>F(ۏcq3#;mL$֍N ,-*^(d$;@N#/̨Tuy$@qk=sX^}fȫGHAohx>(0{@b0 w$ѽ4?EyC&kihŢ2ʣ*jPsIhtY)Ӥ3~re8nc Z!ͧZ~2GPi+"{JCfQ閭 !f H|LTQmo܂-Y^>O3STZϡ^55qƔX?Zò[0)ca:=hr⊨([bYV?a'hEaoǭe@&>Iksۧ 4nQ- Hċ?NG!bkqkжy9ǨRi2Lv{cO4& H= >0y̑ cm蓁fNH,9@p!r<*^Mƫ?`f׷8@nQtHVIJ ^h"DNO6Mb3}v_|Gb } 8ֆllbv @#^`\Q8Hm{} 4*:aNJ;uⴕ4*Z PXL].L2%ƨjXȃR5 YKwnoUW}aJG8x=D" R0%t^}u9*14>jsiՌwJlc/$$wnT;B҄Ɠ1e9p93/k282>~QpgӥkXhI>H3-t&tlB\<_;hS2Wߪ(3?ģ}} ]﭅CFg YfQv$1y&*Mb0=ہqicnV Bffdesmume-0.9.9/src/cocoa/Rakefile0000644000175000017500000001517612140261603017247 0ustar guillaumeguillaumerequire 'tempfile' require "open3" # General indent = ' ' # Compile Options compile = { :command => 'g++', :files => Dir['*.m'] + Dir['*.mm'] + Dir['dialogs/*.m'] + Dir['dialogs/*.mm'] + ([ 'MMU', 'SPU', 'emufile', 'fs-linux', 'matrix', 'FIFO', 'NDSSystem', 'arm_instructions', 'cp15', 'mc', 'cheatSystem', 'thumb_instructions', 'GPU', 'OGLRender', 'armcpu', 'gfx3d', 'render3D', 'wifi', 'GPU_osd_stub', 'ROMReader', 'texcache', 'slot1', 'movie', 'bios', 'debug', 'saves', 'readwrite', 'rtc', 'rasterize', 'common', 'mic', 'addons'].map { |core_file| '../' + core_file + '.cpp' } ) + Dir['../utils/*.c'] + Dir['../utils/*.cpp'] + Dir['../utils/decrypt/*.cpp'] + Dir['../addons/*.cpp'], :defines => { :global => ['DESMUME_OBJ_C', 'OBJ_C'], :cocoa => ['DESMUME_COCOA', 'HAVE_LIBZ', 'HAVE_OPENGL']}, :options => { :global => [ 'arch i386', 'fmessage-length=0', 'pascal-strings', 'fasm-blocks', 'O3', 'mfix-and-continue', 'funroll-loops', 'fstrict-aliasing', 'ftree-vectorize', 'mmacosx-version-min=10.4', 'gdwarf-2'], :obj_cpp => ['fvisibility-inlines-hidden'] } } # Link Options link = { :command => 'gcc', :files => Dir[File.dirname(__FILE__) + '/build/rake/o/*.o'], :libraries => { :cocoa => ['z', 'stdc++'] }, :frameworks => { :cocoa => ['Cocoa', 'OpenGL', 'AudioUnit'] }, :options => {} } # Params def verbose? return false unless ENV.include? 'verbose' return false if ENV['verbose'].downcase == 'false' return true if ENV['verbose'].downcase == 'true' raise StandardError, "verbose must be true or false. Type rake help for help" end # Compile Step desc 'Compiles the source files' task :compile do puts 'Compiling...' #create directory to place object files Dir.mkdir(File.dirname(__FILE__) + '/build') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/o') rescue nil task_options = [] task_options += compile[:options][:global] rescue [] task_options += compile[:options][:cocoa ] rescue [] task_options += compile[:defines][:global].collect { |d| 'D' + d } rescue [] task_options += compile[:defines][:cocoa ].collect { |d| 'D' + d } rescue [] compile[:files].each do |filename| puts indent + 'Compiling ' + filename file_options = [] file_options += compile[:options][:obj_c ] rescue [] if filename =~ /.*\.m$/i file_options += compile[:options][:obj_cpp] rescue [] if filename =~ /.*\.mm$/i file_options += compile[:defines][:obj_c ].collect { |d| 'D' + d } rescue [] if filename =~ /.*\.m/i file_options += compile[:defines][:obj_cpp].collect { |d| 'D' + d } rescue [] if filename =~ /.*\.mm/i command = [compile[:command]] command << filename command << '-o ' + File.dirname(__FILE__) + '/build/rake/o/' + File.basename(filename) + '.o' command << '-c' command += (file_options + task_options).map { |o| '-' + o } command = command.join ' ' puts indent*2 + command if verbose? Open3.popen3(command) do |stdin, stdout, stderr| stdout.readlines.each do |line| puts indent*2 + line end error = false stderr.readlines.each do |err| error = true if err =~ /:\s*error\s*:/i puts indent*2 + err end raise StandardError, "Didn't compile!" if error end end end # Link Step desc 'Builds an executable out of the object files' task :link => :compile do puts 'Linking...' Dir.mkdir(File.dirname(__FILE__) + '/build') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/MacOS/') rescue nil command = [link[:command]] command += link[:files] command << '-o ' + File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/MacOS/DeSmuME' command += link[:options ][:global].collect { |o| '-' + o } rescue [] command += link[:options ][:cocoa ].collect { |o| '-' + o } rescue [] command += link[:libraries ][:global].collect { |l| '-l ' + l } rescue [] command += link[:libraries ][:cocoa ].collect { |l| '-l ' + l } rescue [] command += link[:frameworks][:global].collect { |f| '-framework ' + f } rescue [] command += link[:frameworks][:cocoa ].collect { |f| '-framework ' + f } rescue [] command = command.join ' ' puts indent + command if verbose? Open3.popen3(command) do |stdin, stdout, stderr| stdout.readlines.each do |line| puts indent + line end raise StandardError, 'Couldn\'t link!' unless stderr.readlines.each do |err| puts indent + err end.empty? end end # Build App desc 'Builds a Cocoa application bundle out of the linked files' task :build_cocoa_app => :link do puts 'Building Application Bundle...' Dir.mkdir(File.dirname(__FILE__) + '/build') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents') rescue nil Dir.mkdir(File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources') rescue nil cp File.dirname(__FILE__) + '../..//Info.plist', File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' cp File.dirname(__FILE__) + '/PkgInfo', File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' cp File.dirname(__FILE__) + '/InfoPlist.strings', File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' cp File.dirname(__FILE__) + '/DeSmuME.icns', File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' system 'cp -r ' + File.dirname(__FILE__) + '/translations/*.lproj ' + File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/Resources/' end # Default Step desc 'Makes the executable from scratch' task :default => :build_cocoa_app do puts 'Finished!' end # Run Task desc 'Runs the executable if it exists' task :run => :build_cocoa_app do puts 'Running...' system File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/MacOS/DeSmuME' puts File.dirname(__FILE__) + '/build/rake/DeSmuME.app/Contents/MacOS/DeSmuME' end # Help desc 'Displays helpful information about this Rakefile' task :help do puts "" puts "Type rake to build the default task, which will make an executable" puts "Otherwise type rake [taskname] to execute a particular task" puts "Use rake -T to see what all the tasks are" puts "" puts "There are several parameters that you can pass:" puts "(but don't put spaces around the equal signs though)" puts " verbose = [true|false] print extra information (default is false)" puts "" end desmume-0.9.9/src/cocoa/cocoa_output.mm0000644000175000017500000006534112140261603020640 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_output.h" #import "cocoa_globals.h" #import "cocoa_videofilter.h" #import "cocoa_util.h" #include "sndOSX.h" #include "../NDSSystem.h" #include "../SPU.h" #include "../metaspu/metaspu.h" #import #undef BOOL @implementation CocoaDSOutput @synthesize isStateChanged; @synthesize frameCount; @synthesize frameData; @synthesize frameAttributesData; @synthesize property; @synthesize mutexProducer; @synthesize mutexConsume; - (id)init { self = [super initWithAutoreleaseInterval:0.1]; if (self == nil) { return self; } isStateChanged = NO; frameCount = 0; frameData = nil; frameAttributesData = nil; property = [[NSMutableDictionary alloc] init]; [property setValue:[NSDate date] forKey:@"outputTime"]; mutexConsume = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(mutexConsume, NULL); return self; } - (void)dealloc { // Force the thread to exit now so that we can safely release other resources. [self forceThreadExit]; self.frameData = nil; self.frameAttributesData = nil; [property release]; pthread_mutex_destroy(mutexConsume); free(mutexConsume); mutexConsume = NULL; [super dealloc]; } - (void) doCoreEmuFrame { [CocoaDSUtil messageSendOneWay:self.receivePort msgID:MESSAGE_EMU_FRAME_PROCESSED]; } - (void)handlePortMessage:(NSPortMessage *)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; NSArray *messageComponents = [portMessage components]; switch (message) { case MESSAGE_EMU_FRAME_PROCESSED: [self handleEmuFrameProcessed:[messageComponents objectAtIndex:0] attributes:[messageComponents objectAtIndex:1]]; break; default: [super handlePortMessage:portMessage]; break; } } - (void) handleEmuFrameProcessed:(NSData *)mainData attributes:(NSData *)attributesData { self.frameCount++; self.frameData = mainData; self.frameAttributesData = attributesData; } @end @implementation CocoaDSSpeaker @synthesize bufferSize; - (id)init { return [self initWithVolume:MAX_VOLUME]; } - (id) initWithVolume:(CGFloat)vol { self = [super init]; if (self == nil) { return self; } spinlockAudioOutputEngine = OS_SPINLOCK_INIT; spinlockVolume = OS_SPINLOCK_INIT; spinlockSpuAdvancedLogic = OS_SPINLOCK_INIT; spinlockSpuInterpolationMode = OS_SPINLOCK_INIT; spinlockSpuSyncMode = OS_SPINLOCK_INIT; spinlockSpuSyncMethod = OS_SPINLOCK_INIT; bufferSize = 0; // Set up properties. [property setValue:[NSNumber numberWithFloat:(float)vol] forKey:@"volume"]; [property setValue:[NSNumber numberWithBool:NO] forKey:@"mute"]; [property setValue:[NSNumber numberWithInteger:0] forKey:@"filter"]; [property setValue:[NSNumber numberWithInteger:SNDCORE_DUMMY] forKey:@"audioOutputEngine"]; [property setValue:[NSNumber numberWithBool:NO] forKey:@"spuAdvancedLogic"]; [property setValue:[NSNumber numberWithInteger:SPUInterpolation_None] forKey:@"spuInterpolationMode"]; [property setValue:[NSNumber numberWithInteger:SPU_SYNC_MODE_DUAL_SYNC_ASYNC] forKey:@"spuSyncMode"]; [property setValue:[NSNumber numberWithInteger:SPU_SYNC_METHOD_N] forKey:@"spuSyncMethod"]; return self; } - (void)dealloc { [super dealloc]; } - (void) setVolume:(float)vol { if (vol < 0.0f) { vol = 0.0f; } else if (vol > MAX_VOLUME) { vol = MAX_VOLUME; } OSSpinLockLock(&spinlockVolume); [property setValue:[NSNumber numberWithFloat:vol] forKey:@"volume"]; OSSpinLockUnlock(&spinlockVolume); SPU_SetVolume((int)vol); } - (float) volume { OSSpinLockLock(&spinlockVolume); float vol = [(NSNumber *)[property valueForKey:@"volume"] floatValue]; OSSpinLockUnlock(&spinlockVolume); return vol; } - (void) setAudioOutputEngine:(NSInteger)methodID { OSSpinLockLock(&spinlockAudioOutputEngine); [property setValue:[NSNumber numberWithInteger:methodID] forKey:@"audioOutputEngine"]; OSSpinLockUnlock(&spinlockAudioOutputEngine); pthread_mutex_lock(self.mutexProducer); NSInteger result = -1; if (methodID != SNDCORE_DUMMY) { result = SPU_ChangeSoundCore(methodID, (int)SPU_BUFFER_BYTES); } if(result == -1) { SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); } mutexAudioEmulateCore = self.mutexProducer; pthread_mutex_unlock(self.mutexProducer); // Force the volume back to it's original setting. [self setVolume:[self volume]]; } - (NSInteger) audioOutputEngine { OSSpinLockLock(&spinlockAudioOutputEngine); NSInteger methodID = [(NSNumber *)[property valueForKey:@"audioOutputEngine"] integerValue]; OSSpinLockUnlock(&spinlockAudioOutputEngine); return methodID; } - (void) setSpuAdvancedLogic:(BOOL)state { OSSpinLockLock(&spinlockSpuAdvancedLogic); [property setValue:[NSNumber numberWithBool:state] forKey:@"spuAdvancedLogic"]; OSSpinLockUnlock(&spinlockSpuAdvancedLogic); pthread_mutex_lock(self.mutexProducer); CommonSettings.spu_advanced = state; pthread_mutex_unlock(self.mutexProducer); } - (BOOL) spuAdvancedLogic { OSSpinLockLock(&spinlockSpuAdvancedLogic); BOOL state = [(NSNumber *)[property valueForKey:@"spuAdvancedLogic"] boolValue]; OSSpinLockUnlock(&spinlockSpuAdvancedLogic); return state; } - (void) setSpuInterpolationMode:(NSInteger)modeID { OSSpinLockLock(&spinlockSpuInterpolationMode); [property setValue:[NSNumber numberWithInteger:modeID] forKey:@"spuInterpolationMode"]; OSSpinLockUnlock(&spinlockSpuInterpolationMode); pthread_mutex_lock(self.mutexProducer); CommonSettings.spuInterpolationMode = (SPUInterpolationMode)modeID; pthread_mutex_unlock(self.mutexProducer); } - (NSInteger) spuInterpolationMode { OSSpinLockLock(&spinlockSpuInterpolationMode); NSInteger modeID = [(NSNumber *)[property valueForKey:@"spuInterpolationMode"] integerValue]; OSSpinLockUnlock(&spinlockSpuInterpolationMode); return modeID; } - (void) setSpuSyncMode:(NSInteger)modeID { OSSpinLockLock(&spinlockSpuSyncMode); [property setValue:[NSNumber numberWithInteger:modeID] forKey:@"spuSyncMode"]; OSSpinLockUnlock(&spinlockSpuSyncMode); NSInteger methodID = [self spuSyncMethod]; pthread_mutex_lock(self.mutexProducer); SPU_SetSynchMode(modeID, methodID); pthread_mutex_unlock(self.mutexProducer); } - (NSInteger) spuSyncMode { OSSpinLockLock(&spinlockSpuSyncMode); NSInteger modeID = [(NSNumber *)[property valueForKey:@"spuSyncMode"] integerValue]; OSSpinLockUnlock(&spinlockSpuSyncMode); return modeID; } - (void) setSpuSyncMethod:(NSInteger)methodID { OSSpinLockLock(&spinlockSpuSyncMethod); [property setValue:[NSNumber numberWithInteger:methodID] forKey:@"spuSyncMethod"]; OSSpinLockUnlock(&spinlockSpuSyncMethod); NSInteger modeID = [self spuSyncMode]; pthread_mutex_lock(self.mutexProducer); SPU_SetSynchMode(modeID, methodID); pthread_mutex_unlock(self.mutexProducer); } - (NSInteger) spuSyncMethod { OSSpinLockLock(&spinlockSpuSyncMethod); NSInteger methodID = [(NSNumber *)[property valueForKey:@"spuSyncMethod"] integerValue]; OSSpinLockUnlock(&spinlockSpuSyncMethod); return methodID; } - (BOOL) mute { return [[property objectForKey:@"mute"] boolValue]; } - (void) setMute:(BOOL)mute { [property setValue:[NSNumber numberWithBool:mute] forKey:@"mute"]; if (mute) { SPU_SetVolume(0); } else { SPU_SetVolume((int)[self volume]); } } - (NSInteger) filter { return [[property objectForKey:@"filter"] integerValue]; } - (void) setFilter:(NSInteger)filter { [property setValue:[NSNumber numberWithInteger:filter] forKey:@"filter"]; } - (void)handlePortMessage:(NSPortMessage*)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; NSArray *messageComponents = [portMessage components]; switch (message) { case MESSAGE_EMU_FRAME_PROCESSED: [self handleEmuFrameProcessed:nil attributes:nil]; break; case MESSAGE_SET_AUDIO_PROCESS_METHOD: [self handleSetAudioOutputEngine:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_SPU_ADVANCED_LOGIC: [self handleSetSpuAdvancedLogic:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_SPU_SYNC_MODE: [self handleSetSpuSyncMode:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_SPU_SYNC_METHOD: [self handleSetSpuSyncMethod:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_SPU_INTERPOLATION_MODE: [self handleSetSpuInterpolationMode:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_VOLUME: [self handleSetVolume:[messageComponents objectAtIndex:0]]; break; default: [super handlePortMessage:portMessage]; break; } } - (void) handleEmuFrameProcessed:(NSData *)mainData attributes:(NSData *)attributesData { SPU_Emulate_user(); [super handleEmuFrameProcessed:mainData attributes:attributesData]; } - (void) handleSetVolume:(NSData *)volumeData { const float vol = *(float *)[volumeData bytes]; [self setVolume:vol]; } - (void) handleSetAudioOutputEngine:(NSData *)methodIdData { const NSInteger methodID = *(NSInteger *)[methodIdData bytes]; [self setAudioOutputEngine:methodID]; } - (void) handleSetSpuAdvancedLogic:(NSData *)stateData { const BOOL theState = *(BOOL *)[stateData bytes]; [self setSpuAdvancedLogic:theState]; } - (void) handleSetSpuSyncMode:(NSData *)modeIdData { const NSInteger modeID = *(NSInteger *)[modeIdData bytes]; [self setSpuSyncMode:modeID]; } - (void) handleSetSpuSyncMethod:(NSData *)methodIdData { const NSInteger methodID = *(NSInteger *)[methodIdData bytes]; [self setSpuSyncMethod:methodID]; } - (void) handleSetSpuInterpolationMode:(NSData *)modeIdData { const NSInteger modeID = *(NSInteger *)[modeIdData bytes]; [self setSpuInterpolationMode:modeID]; } @end @implementation CocoaDSDisplay @dynamic delegate; @dynamic displayMode; @dynamic frameSize; - (id)init { self = [super init]; if (self == nil) { return self; } spinlockDelegate = OS_SPINLOCK_INIT; spinlockDisplayType = OS_SPINLOCK_INIT; delegate = nil; displayMode = DS_DISPLAY_TYPE_COMBO; frameSize = NSMakeSize((CGFloat)GPU_DISPLAY_WIDTH, (CGFloat)GPU_DISPLAY_HEIGHT * 2); [property setValue:[NSNumber numberWithInteger:displayMode] forKey:@"displayMode"]; [property setValue:NSSTRING_DISPLAYMODE_MAIN forKey:@"displayModeString"]; return self; } - (void)dealloc { self.delegate = nil; [super dealloc]; } - (void) setDelegate:(id )theDelegate { OSSpinLockLock(&spinlockDelegate); if (theDelegate == delegate) { OSSpinLockUnlock(&spinlockDelegate); return; } if (theDelegate != nil) { [theDelegate retain]; } [delegate release]; delegate = theDelegate; OSSpinLockUnlock(&spinlockDelegate); } - (id ) delegate { OSSpinLockLock(&spinlockDelegate); id theDelegate = delegate; OSSpinLockUnlock(&spinlockDelegate); return theDelegate; } - (void) setDisplayMode:(NSInteger)displayModeID { NSString *newDispString = nil; NSSize newFrameSize = NSMakeSize((CGFloat)GPU_DISPLAY_WIDTH, (CGFloat)GPU_DISPLAY_HEIGHT); switch (displayModeID) { case DS_DISPLAY_TYPE_MAIN: newDispString = NSSTRING_DISPLAYMODE_MAIN; break; case DS_DISPLAY_TYPE_TOUCH: newDispString = NSSTRING_DISPLAYMODE_TOUCH; break; case DS_DISPLAY_TYPE_COMBO: newDispString = NSSTRING_DISPLAYMODE_COMBO; newFrameSize.height *= 2; break; default: return; break; } OSSpinLockLock(&spinlockDisplayType); displayMode = displayModeID; frameSize = newFrameSize; [property setValue:[NSNumber numberWithInteger:displayModeID] forKey:@"displayMode"]; [property setValue:newDispString forKey:@"displayModeString"]; OSSpinLockUnlock(&spinlockDisplayType); } - (NSInteger) displayMode { OSSpinLockLock(&spinlockDisplayType); NSInteger displayModeID = displayMode; OSSpinLockUnlock(&spinlockDisplayType); return displayModeID; } - (NSSize) frameSize { OSSpinLockLock(&spinlockDisplayType); NSSize size = frameSize; OSSpinLockUnlock(&spinlockDisplayType); return size; } - (void) doCoreEmuFrame { NSData *gpuData = nil; NSInteger displayModeID = [self displayMode]; NSSize displayFrameSize = [self frameSize]; // Here, we copy the raw GPU data from the emulation core. // // The core data contains the GPU pixels from both the main and touch screens. So // depending on the display type, we copy only the pixels from the respective screen. if (displayModeID == DS_DISPLAY_TYPE_MAIN) { gpuData = [[NSData alloc] initWithBytes:GPU_screen length:GPU_SCREEN_SIZE_BYTES]; } else if(displayModeID == DS_DISPLAY_TYPE_TOUCH) { gpuData = [[NSData alloc] initWithBytes:(GPU_screen + GPU_SCREEN_SIZE_BYTES) length:GPU_SCREEN_SIZE_BYTES]; } else if(displayModeID == DS_DISPLAY_TYPE_COMBO) { gpuData = [[NSData alloc] initWithBytes:GPU_screen length:GPU_SCREEN_SIZE_BYTES * 2]; } DisplaySrcPixelAttributes attr = {displayModeID, (unsigned int)displayFrameSize.width, (unsigned int)displayFrameSize.height}; NSData *attributesData = [[NSData alloc] initWithBytes:&attr length:sizeof(DisplaySrcPixelAttributes)]; NSArray *messageComponents = [[NSArray alloc] initWithObjects:gpuData, attributesData, nil]; [CocoaDSUtil messageSendOneWayWithMessageComponents:self.receivePort msgID:MESSAGE_EMU_FRAME_PROCESSED array:messageComponents]; // Now that we've finished sending the GPU data, release the local copy. [gpuData release]; [attributesData release]; [messageComponents release]; } - (void)handlePortMessage:(NSPortMessage *)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; NSArray *messageComponents = [portMessage components]; switch (message) { case MESSAGE_EMU_FRAME_PROCESSED: [self handleEmuFrameProcessed:[messageComponents objectAtIndex:0] attributes:[messageComponents objectAtIndex:1]]; break; case MESSAGE_CHANGE_DISPLAY_TYPE: [self handleChangeDisplayMode:[messageComponents objectAtIndex:0]]; break; case MESSAGE_SET_VIEW_TO_BLACK: [self handleSetViewToBlack]; break; case MESSAGE_SET_VIEW_TO_WHITE: [self handleSetViewToWhite]; break; case MESSAGE_REQUEST_SCREENSHOT: [self handleRequestScreenshot:[messageComponents objectAtIndex:0] fileTypeData:[messageComponents objectAtIndex:1]]; break; case MESSAGE_COPY_TO_PASTEBOARD: [self handleCopyToPasteboard]; break; default: [super handlePortMessage:portMessage]; break; } } - (void) handleEmuFrameProcessed:(NSData *)mainData attributes:(NSData *)attributesData { [super handleEmuFrameProcessed:mainData attributes:attributesData]; } - (void) handleChangeDisplayMode:(NSData *)displayModeData { if (delegate == nil || ![delegate respondsToSelector:@selector(doDisplayModeChanged:)]) { return; } const NSInteger displayModeID = *(NSInteger *)[displayModeData bytes]; self.displayMode = displayModeID; [delegate doDisplayModeChanged:displayModeID]; } - (void) handleSetViewToBlack { [self fillVideoFrameWithColor:0x8000]; } - (void) handleSetViewToWhite { [self fillVideoFrameWithColor:0xFFFF]; } - (void) handleRequestScreenshot:(NSData *)fileURLStringData fileTypeData:(NSData *)fileTypeData { NSString *fileURLString = [[NSString alloc] initWithData:fileURLStringData encoding:NSUTF8StringEncoding]; NSURL *fileURL = [NSURL URLWithString:fileURLString]; NSBitmapImageFileType fileType = *(NSBitmapImageFileType *)[fileTypeData bytes]; NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys: fileURL, @"fileURL", [NSNumber numberWithInteger:(NSInteger)fileType], @"fileType", [self image], @"screenshotImage", nil]; [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.requestScreenshotDidFinish" object:self userInfo:userInfo]; [userInfo release]; [fileURLString release]; } - (void) handleCopyToPasteboard { NSImage *screenshot = [self image]; if (screenshot == nil) { return; } NSPasteboard *pboard = [NSPasteboard generalPasteboard]; [pboard declareTypes:[NSArray arrayWithObjects:NSTIFFPboardType, nil] owner:self]; [pboard setData:[screenshot TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1.0f] forType:NSTIFFPboardType]; } - (void) fillVideoFrameWithColor:(UInt16)colorValue { NSData *gpuData = nil; NSInteger displayModeID = [self displayMode]; NSSize displayFrameSize = [self frameSize]; size_t numberBytes = GPU_SCREEN_SIZE_BYTES * 2; if (displayModeID == DS_DISPLAY_TYPE_MAIN || displayModeID == DS_DISPLAY_TYPE_TOUCH) { numberBytes = GPU_SCREEN_SIZE_BYTES; } UInt16 *gpuBytes = (UInt16 *)malloc(numberBytes); if (gpuBytes == NULL) { return; } const UInt16 colorValuePattern[] = {colorValue, colorValue, colorValue, colorValue, colorValue, colorValue, colorValue, colorValue}; memset_pattern16(gpuBytes, colorValuePattern, numberBytes); gpuData = [[[NSData alloc] initWithBytes:gpuBytes length:numberBytes] autorelease]; free(gpuBytes); gpuBytes = nil; DisplaySrcPixelAttributes attr = {displayModeID, (unsigned int)displayFrameSize.width, (unsigned int)displayFrameSize.height}; NSData *attributesData = [[[NSData alloc] initWithBytes:&attr length:sizeof(DisplaySrcPixelAttributes)] autorelease]; [self handleEmuFrameProcessed:gpuData attributes:attributesData]; } - (NSImage *) image { NSImage *newImage = [[NSImage alloc] initWithSize:self.frameSize]; if (newImage == nil) { return newImage; } // Render the frame in an NSBitmapImageRep NSBitmapImageRep *newImageRep = [self bitmapImageRep]; if (newImageRep == nil) { [newImage release]; newImage = nil; return newImage; } // Attach the rendered frame to the NSImageRep [newImage addRepresentation:newImageRep]; return [newImage autorelease]; } - (NSBitmapImageRep *) bitmapImageRep { if (self.frameData == nil) { return nil; } NSSize srcSize = self.frameSize; NSUInteger w = (NSUInteger)srcSize.width; NSUInteger h = (NSUInteger)srcSize.height; NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:w pixelsHigh:h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:w * 4 bitsPerPixel:32]; if(imageRep == nil) { return imageRep; } uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; RGB555ToRGBA8888Buffer((const uint16_t *)[self.frameData bytes], bitmapData, (w * h)); #ifdef __BIG_ENDIAN__ uint32_t *bitmapDataEnd = bitmapData + (w * h); while (bitmapData < bitmapDataEnd) { *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); } #endif return [imageRep autorelease]; } @end @implementation CocoaDSDisplayVideo @synthesize vf; - (id)init { self = [super init]; if (self == nil) { return self; } videoDelegate = nil; lastDisplayMode = DS_DISPLAY_TYPE_COMBO; spinlockVideoFilterType = OS_SPINLOCK_INIT; spinlockVFBuffers = OS_SPINLOCK_INIT; if ([[NSProcessInfo processInfo] activeProcessorCount] >= 2) { vf = [[CocoaVideoFilter alloc] initWithSize:frameSize typeID:VideoFilterTypeID_None numberThreads:2]; } else { vf = [[CocoaVideoFilter alloc] initWithSize:frameSize typeID:VideoFilterTypeID_None numberThreads:0]; } [property setValue:[NSNumber numberWithInteger:(NSInteger)VideoFilterTypeID_None] forKey:@"videoFilterType"]; [property setValue:[CocoaVideoFilter typeStringByID:VideoFilterTypeID_None] forKey:@"videoFilterTypeString"]; return self; } - (void)dealloc { [vf release]; [super dealloc]; } - (void) setDelegate:(id )theDelegate { OSSpinLockLock(&spinlockDelegate); if (theDelegate == videoDelegate) { OSSpinLockUnlock(&spinlockDelegate); return; } if (theDelegate != nil) { [theDelegate retain]; } [videoDelegate release]; videoDelegate = theDelegate; OSSpinLockUnlock(&spinlockDelegate); [super setDelegate:theDelegate]; } - (id ) delegate { OSSpinLockLock(&spinlockDelegate); id theDelegate = videoDelegate; OSSpinLockUnlock(&spinlockDelegate); return theDelegate; } - (void) setVfType:(NSInteger)videoFilterTypeID { OSSpinLockLock(&spinlockVFBuffers); [vf changeFilter:(VideoFilterTypeID)videoFilterTypeID]; OSSpinLockUnlock(&spinlockVFBuffers); OSSpinLockLock(&spinlockVideoFilterType); [property setValue:[NSNumber numberWithInteger:videoFilterTypeID] forKey:@"videoFilterType"]; [property setValue:NSLocalizedString([vf typeString], nil) forKey:@"videoFilterTypeString"]; OSSpinLockUnlock(&spinlockVideoFilterType); } - (NSInteger) vfType { OSSpinLockLock(&spinlockVideoFilterType); NSInteger theType = [(NSNumber *)[property valueForKey:@"videoFilterType"] integerValue]; OSSpinLockUnlock(&spinlockVideoFilterType); return theType; } - (void) runThread:(id)object { NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; [videoDelegate doInitVideoOutput:self.property]; [tempPool release]; [super runThread:object]; } - (void)handlePortMessage:(NSPortMessage *)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; NSArray *messageComponents = [portMessage components]; switch (message) { case MESSAGE_EMU_FRAME_PROCESSED: [self handleEmuFrameProcessed:[messageComponents objectAtIndex:0] attributes:[messageComponents objectAtIndex:1]]; break; case MESSAGE_RESIZE_VIEW: [self handleResizeView:[messageComponents objectAtIndex:0]]; break; case MESSAGE_TRANSFORM_VIEW: [self handleTransformView:[messageComponents objectAtIndex:0]]; break; case MESSAGE_REDRAW_VIEW: [self handleRedrawView]; break; case MESSAGE_CHANGE_DISPLAY_ORIENTATION: [self handleChangeDisplayOrientation:[messageComponents objectAtIndex:0]]; break; case MESSAGE_CHANGE_DISPLAY_ORDER: [self handleChangeDisplayOrder:[messageComponents objectAtIndex:0]]; break; case MESSAGE_CHANGE_DISPLAY_GAP: [self handleChangeDisplayGap:[messageComponents objectAtIndex:0]]; break; case MESSAGE_CHANGE_BILINEAR_OUTPUT: [self handleChangeBilinearOutput:[messageComponents objectAtIndex:0]]; break; case MESSAGE_CHANGE_VERTICAL_SYNC: [self handleChangeVerticalSync:[messageComponents objectAtIndex:0]]; break; case MESSAGE_CHANGE_VIDEO_FILTER: [self handleChangeVideoFilter:[messageComponents objectAtIndex:0]]; break; default: [super handlePortMessage:portMessage]; break; } } - (void) handleEmuFrameProcessed:(NSData *)mainData attributes:(NSData *)attributesData { if (mainData == nil || attributesData == nil) { return; } const DisplaySrcPixelAttributes attr = *(DisplaySrcPixelAttributes *)[attributesData bytes]; const NSInteger displayModeID = attr.displayModeID; // Tell the video delegate to process the video frame with our copied GPU data. OSSpinLockLock(&spinlockVFBuffers); if (lastDisplayMode != displayModeID) { const NSSize newSrcSize = NSMakeSize((CGFloat)attr.width, (CGFloat)attr.height); [vf setSourceSize:newSrcSize]; lastDisplayMode = displayModeID; } const NSInteger destWidth = (NSInteger)[vf destSize].width; const NSInteger destHeight = (NSInteger)[vf destSize].height; if ([vf typeID] == VideoFilterTypeID_None) { [videoDelegate doProcessVideoFrame:[mainData bytes] displayMode:displayModeID width:destWidth height:destHeight]; } else { RGB555ToRGBA8888Buffer((const uint16_t *)[mainData bytes], (uint32_t *)[vf srcBufferPtr], [mainData length] / sizeof(UInt16)); const UInt32 *vfDestBuffer = [vf runFilter]; [videoDelegate doProcessVideoFrame:vfDestBuffer displayMode:displayModeID width:destWidth height:destHeight]; } OSSpinLockUnlock(&spinlockVFBuffers); [super handleEmuFrameProcessed:mainData attributes:attributesData]; } - (void) handleResizeView:(NSData *)rectData { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doResizeView:)]) { return; } const NSRect resizeRect = *(NSRect *)[rectData bytes]; [videoDelegate doResizeView:resizeRect]; } - (void) handleTransformView:(NSData *)transformData { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doTransformView:)]) { return; } [videoDelegate doTransformView:(DisplayOutputTransformData *)[transformData bytes]]; } - (void) handleRedrawView { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doRedraw)]) { return; } [videoDelegate doRedraw]; } - (void) handleChangeDisplayOrientation:(NSData *)displayOrientationIdData { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doDisplayOrientationChanged:)]) { return; } const NSInteger theOrientation = *(NSInteger *)[displayOrientationIdData bytes]; [videoDelegate doDisplayOrientationChanged:theOrientation]; } - (void) handleChangeDisplayOrder:(NSData *)displayOrderIdData { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doDisplayOrderChanged:)]) { return; } const NSInteger theOrder = *(NSInteger *)[displayOrderIdData bytes]; [videoDelegate doDisplayOrderChanged:theOrder]; } - (void) handleChangeDisplayGap:(NSData *)displayGapScalarData { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doDisplayGapChanged:)]) { return; } const float gapScalar = *(float *)[displayGapScalarData bytes]; [videoDelegate doDisplayGapChanged:gapScalar]; } - (void) handleChangeBilinearOutput:(NSData *)bilinearStateData { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doBilinearOutputChanged:)]) { return; } const BOOL theState = *(BOOL *)[bilinearStateData bytes]; [videoDelegate doBilinearOutputChanged:theState]; [self handleEmuFrameProcessed:self.frameData attributes:self.frameAttributesData]; } - (void) handleChangeVerticalSync:(NSData *)verticalSyncStateData { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doVerticalSyncChanged:)]) { return; } const BOOL theState = *(BOOL *)[verticalSyncStateData bytes]; [videoDelegate doVerticalSyncChanged:theState]; } - (void) handleChangeVideoFilter:(NSData *)videoFilterTypeIdData { if (videoDelegate == nil || ![videoDelegate respondsToSelector:@selector(doVideoFilterChanged:frameSize:)]) { return; } const NSInteger theType = *(NSInteger *)[videoFilterTypeIdData bytes]; [self setVfType:theType]; [videoDelegate doVideoFilterChanged:theType frameSize:[vf destSize]]; [self handleEmuFrameProcessed:self.frameData attributes:self.frameAttributesData]; } @end desmume-0.9.9/src/cocoa/PkgInfo0000644000175000017500000000001012140261603017037 0ustar guillaumeguillaumeAPPL????desmume-0.9.9/src/cocoa/screen_state_legacy.m0000644000175000017500000000655612140261603021765 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "screen_state_legacy.h" #import "cocoa_util.h" @implementation ScreenState + (NSInteger)width { return DS_SCREEN_WIDTH; } + (NSInteger)height { return DS_SCREEN_HEIGHT*2; } + (NSSize)size { return NSMakeSize(DS_SCREEN_WIDTH, DS_SCREEN_HEIGHT*2); } + (ScreenState*)blackScreenState { return [[[ScreenState alloc] initWithBlack] autorelease]; } + (ScreenState*)whiteScreenState; { return [[[ScreenState alloc] initWithWhite] autorelease]; } - (id)init { //make sure we go through through the designated init function [self doesNotRecognizeSelector:_cmd]; return nil; } - (id)initWithBlack { self = [super init]; if(self)memset(color_data, 0, DS_SCREEN_WIDTH * DS_SCREEN_HEIGHT*2 * DS_BPP); return self; } - (id)initWithWhite { self = [super init]; if(self)memset(color_data, 255, DS_SCREEN_WIDTH * DS_SCREEN_HEIGHT*2 * DS_BPP); return self; } - (id)initWithScreenState:(ScreenState*)state { self = [super init]; if(self)memcpy(color_data, state->color_data, DS_SCREEN_WIDTH * DS_SCREEN_HEIGHT*2 * DS_BPP); return self; } - (id)initWithColorData:(const unsigned char*)data { self = [super init]; if(self)memcpy(color_data, data, DS_SCREEN_WIDTH * DS_SCREEN_HEIGHT*2 * DS_BPP); return self; } - (const unsigned char*)colorData { return color_data; } - (NSImage *)image { NSImage *newImage = [[NSImage alloc] initWithSize:[ScreenState size]]; if (newImage == nil) { return newImage; } // Render the frame in an NSBitmapImageRep NSBitmapImageRep *newImageRep = [self imageRep]; if (newImageRep == nil) { [newImage release]; newImage = nil; return newImage; } // Attach the rendered frame to the NSImageRep [newImage addRepresentation:newImageRep]; return newImage; } - (NSBitmapImageRep *)imageRep { if (color_data == nil) { return nil; } NSUInteger w = DS_SCREEN_WIDTH; NSUInteger h = DS_SCREEN_HEIGHT * 2; NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:w pixelsHigh:h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:w * 4 bitsPerPixel:32]; if(imageRep == nil) { return imageRep; } UInt32 *bitmapData = (UInt32 *)[imageRep bitmapData]; RGB555ToRGBA8888Buffer((const uint16_t *)color_data, (uint32_t *)bitmapData, (w * h)); #ifdef __BIG_ENDIAN__ UInt32 *bitmapDataEnd = bitmapData + (w * h); while (bitmapData < bitmapDataEnd) { *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); } #endif return [imageRep autorelease]; } @end desmume-0.9.9/src/cocoa/macosx_10_4_compat.h0000644000175000017500000000255112140261603021324 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef MACOSX_10_4_COMPATIBILITY_H #define MACOSX_10_4_COMPATIBILITY_H // Taken from NSObjCRuntime.h of the Mac OS X v10.5 SDK. // Defines NSInteger and NSUInteger for Mac OS X v10.4 and earlier. #ifndef NSINTEGER_DEFINED #define NSINTEGER_DEFINED 1 typedef int NSInteger; typedef unsigned int NSUInteger; #define NSIntegerMax LONG_MAX #define NSIntegerMin LONG_MIN #define NSUIntegerMax ULONG_MAX #endif // Taken from CIVector.h of the Mac OS X v10.5 SDK. // Defines CGFloat for Mac OS X v10.4 and earlier. #ifndef CGFLOAT_DEFINED #define CGFLOAT_DEFINED 1 typedef float CGFloat; #define CGFLOAT_MIN FLT_MIN #define CGFLOAT_MAX FLT_MAX #define CGFLOAT_IS_DOUBLE 0 #endif #endif // MACOSX_10_4_COMPATIBILITY_H desmume-0.9.9/src/cocoa/mic_ext.cpp0000644000175000017500000000413712140261603017731 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_globals.h" #include "mic_ext.h" #include "readwrite.h" RingBuffer micInputBuffer(MIC_MAX_BUFFER_SAMPLES * 2, sizeof(u8)); NullGenerator nullSampleGenerator; InternalNoiseGenerator internalNoiseGenerator; WhiteNoiseGenerator whiteNoiseGenerator; SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE); static bool _micUseBufferedSource = true; static AudioGenerator *_selectedDirectSampleGenerator = NULL; BOOL Mic_Init() { // Do nothing. return TRUE; } void Mic_Reset() { micInputBuffer.clear(); } void Mic_DeInit() { // Do nothing. } u8 Mic_ReadSample() { u8 theSample = MIC_NULL_SAMPLE_VALUE; if (_micUseBufferedSource) { if (micInputBuffer.isEmpty()) { return theSample; } micInputBuffer.read(&theSample, 1); } else { if (_selectedDirectSampleGenerator != NULL) { theSample = _selectedDirectSampleGenerator->generateSample(); } } return theSample; } bool Mic_GetUseBufferedSource() { return _micUseBufferedSource; } void Mic_SetUseBufferedSource(bool theState) { _micUseBufferedSource = theState; } AudioGenerator* Mic_GetSelectedDirectSampleGenerator() { return _selectedDirectSampleGenerator; } void Mic_SetSelectedDirectSampleGenerator(AudioGenerator *theGenerator) { _selectedDirectSampleGenerator = theGenerator; } void mic_savestate(EMUFILE* os) { write32le(-1, os); } bool mic_loadstate(EMUFILE* is, int size) { is->fseek(size, SEEK_CUR); return true; } desmume-0.9.9/src/cocoa/AppIcon_FirmwareConfig.icns0000644000175000017500000054010612140261603022767 0ustar guillaumeguillaumeicnsFis32 F?DVXLC *o % "V #^ #Q #%q>I$&{W[$x$N,M$#FS$$F$$B $%J$$; #&j$}|{zz (#'11'!mDUY |o2 vb9II71SDD ^^W 32IX,O. ,2 Ĩ'd[TY]ZSTRSSRR  Hk6^,d1_+ ,eM\- @p]+ks[. M7X3].]+_.,U):$" s8mkKIJJJJG 43444,4,4-4-4-4-4-4-2+5-il32 a 9?_;L ;'7 9 4A"D<5˥99ьv{4΀2/DAj;b" rvnz_g9$bOYZ\' $g,B "r+o+{%)G43$5_=V!  %I(&Kb[~s|zsrtx{zwxxwxtU    j~jrK-Hünpf,eyrW+ƕir!ovs&%ɚq t!|iWS]ev"#˥b6/).= w #smoe_;w!Ģ\x"ŝjz4Ei;a# !Ťpxgrx`f9)ϣqySRW[\( "r}e,B $Ѧs}%q,n,!£s}'H43Ъt~5_=V!ǥu˱w!Шxǭx ӪxǬy ֮y īzۮy ,O~|~'5SXxv¶ń =TNQPOMNOPRQPQNU9 &b *eX)( *i &cL" (o! 'lH &xl0 'Q 'eV$  '\ ^~Iv-*ZN _G.nUy;*^?2Ig4)oFKN+gB Haf!tl)ao6R #C&N%bP0" %d  QA' #n  T> %u Q1&'3Qj@  IY=.A=l8mkBHHHHHG1xit32P   cd1 ۀ 7 K  M   j(. Ӿ F f  +!'&A@ H F+%,-CE H J /'/33:u H E# .'+$T J A +'( O I D -#&%%ѽ|pnpvx|D A +$$);ì~skhd`^VRPTbD  @,#$A>ưtrsqqonklid\T`8 8)"*+BCκ~{xurrstwxocZ4 G,&)17= ų cv S*).&Wķw J *%*\(ÿR @-#!!¿ 8 , -63 - *CBR . '&(E;W '(+/>A Z &+$-) M^ %.%)\`  ( +#$n`  &  * "&6`  #(!@C`  )#   *"'&F9`   *$-+;C`  1 l x ,$,& M`  1G67 I@/,%) c`  + ԉY'$! p`  (FYA?*6Oٟ(#&(` 8 MU^D (AB` 9  &ϙ& &#F9` 8 ~ ~ )"+* x (} *$* Y` 4 @ s +$ ^` 2  r' !$%` 6     & =B` 8      "$G2` 7 hfe f!!('AB` ; hSw3tj!k%**.m` > a%Zmt g#g%( e` 5 a*_pt eg##"[` : [$Ufl o?b"f` 6 a'\num5:` : >r;iGJ Wc[hE >6`   '&@=` ; ,zv{7Tqrp")' +I`  ()J`NF4R>$#*U`  %"B#0Qlhg %!"Z` 9 %%E&/M7" "'9` 4 #!?!,I$9o"! *1`   " ?!+D!E !A:` 6 !<*H3Js #$!?F`  $ {9z(4mjlg ('/<`  &  $' Q`   &p`   ' ! `   $ .:`   $@H`   $#@A`   && ?I`   && ]`   %! ``   %"e`    $"&`   $ =D`   $D;`   #$@F`   "'/;`   "% W`   !"$V`    " R`   $ 4H`   E@`   !D@`   $.H~`  $k`  !r`  } !`  x" )*`  v >/`  v $;*`  y  &:L`  s#.4#&$:Km`  s)8@FI+!b`  ^(".%5@FPX\ahwtWLA)`  e #=9@AFKLSb|` . ^5@:AGW_dcm` * X :& *:HHLdihx` - R-:FHP<4IOE=CXh` * p3CDCHGJQYYIBMd` ' -HHOQS[`dmsy`  [Wajx`  떒`  Զ_  `  \ ` ΪzpgU}vt \;0-"*'CA׏|qhW}vt!]+1-&..EG丠}sjX}vu!]-2 1(045<;;:865 320010)T `3+,*.) 6ȯ{tme\TNKIIGEDDCBA>;5:,3A`/(,(, 7yrlf`[XVUTRQP OOMKIH?C8G'`(7.()"i}xrmheba`_^]^]\\[ZYWTRMKJK`$+.&&.:Ϩ|xtpmkjihhghhgf dc`^[YS]`#-&%DF{xvtrqqr ppomljgg_j'`% ,$+)H>˜}|zyz{{zzyxusqqjv+`&.'/0BCг }z|u-`1*/+ 0˳ ~0`/(* 9 3` -$% O 6` +!#)5 7a) "AC⸔ 7a/  ,#)(F99c ,%.-;Cչ:c2 l x .&.' 8ʭż:c2G67 IA/.'+ ?Ȥ ;c1 ԉY(%# M<c1 FXA?*7Oڟ) %)*į<c1 MV^D ) !CE彙<c1 &ϙ ( (%I<<c1~ ~ +$--?EѸ<c1   +$,+EͯȰ<c3x '~ ,&+8<d2@ s -&" =<d0 r*"#'(<e1     ) "?Eۦ=e0     $!&"J5䣚=e0hfe f""*)EDζ=e2hSw3tj!k&,,0a·=e3a%Zmt g#g&*?̦=e3a+_qt eg%$%:=e2Z$Ufl o?a $l=e)a']num 7>=e1?s;iGJ Vc[hE" B9桚=f ")(A@˴=f(,zv|7Sprp!$+(",Kʲ=f~*)J_MF4R>%%*5˺=f{*%"C#0Rmhg &"$9=f~)%&E&/M8$!#+<=f{(#!@!,I$9o#".4ݽ=g}("!?!+D!E "D<ٟ>hz&!<*I3Js %($BFް?hy' {:z(4mjmg$$*'/:̵?hv% $''5?h}) !K?hu# )!$b?ix&0:?ir 'EJˡ?is &$EAͯ?ip ('!@JDZ?in ( (!GϮҽ?io ' # Bū?in&# D?il &#%Ѳ?ij ' sƲE(E>A@A>E :,.$ , !0;Í7,+0*>> *.55KEy,/5889ręSK1.4- [W,O͗Q ,022{"+)+! =Q &%*1AҌ9 &)+)GA +*02IGZ /-07:8u֤W/.5) R14S 0*- !B{ 3')9M 0''/<·4   0%,*F= 0)01Fȃ1  0'$%D>  -',(A?Y 0+*.57ۤS.,0' ]??ȓP /)/N /1 +#-&E6N -$ -(1+:>Ŏ: 0& .&.' $"92H:%5 .%.\,[ .&$#  ( (#%'![ )      (##=>      $$(#E.  *0$$,(>?v1/Qָ 3 )/+3ICͭkoZ51; 8)- *jʩ1E 2(''  F -;k#!&n  )B!""6;S ,m+g|y$""?7   !%+*D=p' &Sd$&.-$)Nwձp-+Pas1(&/!* ec"JEE9]*#) .m&KNMB]o!8%$)(B` "KFF:\Hv& ().ߛF &KGG;\E%#!?7 )KGF:\r(& W^mɓJ *!)  Fg{)#%'   O ($%"[r '!4EN  &!E; &!&B9*  %%*#0=ŶvpA ((*6?1_ʸz)$&  Oy)#' " (! ' ] % >,K  (#9'B "$$*8Iv)#69&(&9HR?1Tws) ,6@HM3%  /h&3'7@HQZ`dhqoYXB-  (?9?=CJNV`uuG  5B=ACKU_jc= :%.=G=?[ntmO,  +:GIR>2CC<:N\`P2'6DA?FFJJOTLKQT:# %=?FKMP\ghfxr> NYfntz}K Po_  #nw8t8mk@|sC ڈL ^ a b b b b b b b b b b b b b b b b b b b b b a ^ T D) o  Py  mR  ,8:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::6( %)+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++($  ic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1  @Cxi8@i#p [q}O (0 |loA oԜsj0_[426^iL9hJFN?۾/q._\H-3ݣJAmlZ a7@+/fɛdbt[$asL0_*0! ?X ʧ_Wt8yLX)83EMb/"B>a=Yx'aם#ʐ o?ڙ6oi;+A tɨ1n]\L۹MQAK>-{* Iz[3$s1:B\qJC-*)d֔mcݟ4a7`͒_2cv(s?wAbQf*I&=`޹g NR{l;/-,7p+׽EyS}:QiXkւɊD">P4:m>qz 6EnON΋v,z(;Y"nhAԁcqd*9)D\ك\e:4YV˶[{?bl>|,'\wylXi tZ6:R:t yk⇶Vь4v =!?2NݵU^XaJׁPC-hqPDe;E-3.V)ц6xjF`ήɔd\O+˻ [5E?tAN؇WaFh[*#FBChˇ\ŭnfe Im6 ?msZS^'bR`ЂBTJw9fVF_(h%@CtwC3Odg?'Eb Cg~_.U<Цqba&V[)NaHFYٟAꎡ^cza8"-l(lD6/dg#A }=gM60ieeBdxNv<vNg%]w aHR a[5OHj) b#ibW'x)b^*0jyͷ=#rK'Ai&QГQy)>OB'"e΁!-ֺb:;;7R 0U6_3[O'sEwe &PZ:%'.m;wD*W pxTae{?ZHszthhlK+ kf w9^{;z!KӶb;9=$%#5' 5dEMY~-,b}`)8NGAHurh>YN71)LidN,c<fiyY?1(y{S:1 "%5Q@F6BU;Nuo(X?y?θpL45`ޟ-v1IJT(#iRYaf/9xےL"c.Fm8++!?(Ğ ַ؏0CϚ9W \A꾪%JWʸ&~F6 g ʉ)='dᵑmd? j9Lҽ#rR=C1-+P14X6*Hv>>=.}g.C?h(gWs Xgi5W`W gg5̎4bmw+ʟ tB45t^4 lȋ^^NH&2ɒ8@d ;y9jN;P?.=Nگz#< 5`.n 3D޶0]1+QPTEyڗp[~2HҒ'\,]5ZJ -["Y_ª ۨQ{x< '? S.v(27<4Uk[;Ю)nF&j1>Bj^*(UpVP={|DRv'7-:kW/e> NfN=;]ynqub1"Հ Б$Np䦒f/Y˙;52s,rD`B mᬞu4֢ĔKѾᐊ\Xձ5$m'ayrs,co7|wZvgs| !x/иb]A0 _Yr)L-JACPkqJYfBbrF Wީ#^NN20׷TҌ`|ٓp)yDqIMZҽ]kgyxQ:(=WS?X`fh'[mڐGmF}Rw*A#R5|J =D <^V๲v ]-G\m-%/jwisnSHᑵkᲥQrYF'cٵ̗j^O0 k^oOJ ll@46X%gpҴa7 %J-Ogꚏ9054[^\I /{SKf9Vx@p;K@WM UߠAl}{A%+n  5HiTf<9qĂMd@d!p to u3-2 bLt}ċx$_=N&=)Zn@pB^R)j vM%q  gxlg  l@o컈W )LeϼU> 'M. N8iSu%M:.Tp{/zW\~(V&WY?jwv(AFyfŒl]TαKIS߂H ]\).NhȃUCX%lG#A1_=ʾH?qi+uz]B6nV 9wann;x ̮l"9K{bp䟣O~ߑ߼_[[#H޴/53%{Ť @Uxi@JnNc9HRˎrzhR ՘}ۦ %h: BB ZQ$N\AY޲C-T3@Y1)Or8N[" OQ<`cCXu OwϚEdb44QnԗD^d$eR-!lqQP0۽Rcx&`=m $\n{xd53˨bj8yu>`ӳt-'X_'*ᔉ\7Pkܣ!j"}Y t4]çH |tك2I/5}mV%}3ƳcׄgH3E2{v+oPt 6IH 7pl^1 1.PQ3ՕzR;²gHjUp m1C4΀Tиk#MNaRv_f"\hO3L-wYxݏV]zkZuT$"y!'=wd:Ѧ%WSobvv#ֲ[Jc|8K2`)7+l:Q>O*_9[S2@v-N);O=f,F`oD$UFANa RǗ_+|RHZK90Z-328 X7."{.DPj 6ȅ!rQlO "{hIQ]UI%ov tS S4ud@- 5w`~M |, #v.RQv eoRNV!)Gh߾zV+\7\ \AM#oQtB39 `>E,l0x|C-s6 xw z[YJ }991[@+GAC\pvH-H~Hp n<"on\,M,)(!HFQ'CjA#y2*O& X S X,1"e1X{rׅ*bO:Ԁž?¶L`*D⿸EQ b)YV '8jfX{ K/eVPsjv!ZG_9wMBS ANiJL8?Zɡ|/'qs WhOT"3"h/F1.໤}hU`yIfqrj X)>~nZEgǥyUp|>Nٯu}zbՁvw5@RO2]'k'MK0rjjۖ2*kNaIϱC7q+ďZds F~?==a,8A#i>CԿi7(R5i3IJJ^׎tRwNK%NjTK'F JTliXjlKg7Y̮y=pf2䥐D/=߅ xSk.up7ǀܷ/,"ʀNug>)4"Uwdkr!A5:*,S񎚎瓷(($c6A9TK$v=~42Lؙ?=]mFd:*K}lsd%lY YJ? I PWKX(0 aɛe#([Ec0yPG`=GSL29쮑!b2-< sA h|mkfۈQ#MQQ6"ft=zb=jΟ!Wvxw)+ %K219҂K(uvzB6rOpig6pPY>i+'_B<@$\! 9~BD씢`*Ew<}H '~.i]g2n5/8.Lԣ`8iX~mrpui҂clTKZSkx%/d;b u leoF#R|7yAۜw2qfRnAȤvH_FF]6PfV6,m~oj<զeXP2&k~t_WM{mCPY(*Vwy)Bʨ,*PfRL0WC4'5IAj4INfp7em☜uJA?c\/ >O'NVU0aXC y*#=W ( f%AQŕ䒂nU%+R#w!+my y1洪IYq{d۶Ѳ񿁄Be+(iD kD>o%yau9TJ^#@,B;Ξ?A0G{0}h<78"#я4ٜdžfX׶KBw*}n)dc+k:67O4d/0jl{q7Pa"+udhUXJϬmI>5jCWfb8\O%#TWq}9z&$0̗{Y2 eZˍ64%j?N,@zɝ/| "gS|\i; >z.}Z.ํX|` \ᦼ+\BO PGc0R!ݿCS$l͑(^$ucEj&b*ja&/IUk=<~Y"5(+NEx|# =%mq;%,sÏa;2҃_ĔƞM? v"=B(6!z)3 A|WpO=yl;cY_?n*i.#{dGM`;Wl@ Ra  5퐷W(,~#PGn &NIȀï62s2/ثB"^RJ>Xq޼L+/9_7EK3Zg—P b59 33 ?cNȎèub>Z3ʡϽn9YM:τ蘿 7*Q˙W,K/iһƸ{f.Rçp)PP肄VF;TFRK*E}tSH [`-3lv\c>N$hb'JD2#K~{#k%m4O/Gҧzb"}.z#[N31eQݿ&VD,,Tص lU)܌٬dvF%;"*\xTu(r[KS_l ^Ve7#q9+G•#Ԧp8qG'=Wqt4mHg4 'WFVw*wgo7C3Ӟu b03Ĉ\uFW}c8Rg2Cыbz N&~j%ȫ%/BS)ڸv"]#DWVzù5X,w@~o!973.J1\Bv{.JN:T؇vFFXٕ^uYX*Ž(L$$ f DTi6O"/~4TQv#پ { :Fn["9gۉl>s `67Y LT)½tY-,_n2uVL2-aN{-3h iFaѹLv~xD+FoύsRb6vl [%Y Sx ilrO$=՘xWLVu%<'c*-/W Om YeZVmhz Y1ښW(-!_ʶqNn-&)Dʄ2-b6}YD~=̨.S #i375 TT3ëCAiw'R{ۥ*TkQq̀ACȚVнdqH6$vsi]Ǚ WCc;&O; z?Br+| 翊-suXnofBW|:\Bꢇq]9HWMw#OxNfskf#MύC\keȁ؅vDyzRzzi:s;H9ɡ@F2&/-&TPw-Ӹjܾ()"Y0׼ ٛ;VV ?_ XkB)`졥,D++3_v)e9a41|(P.p/|x?VZqSjGm )N;HLp4]zƒO~h< q_u-&yju؊!&Lھ?pՠy#9wC'}PtpQ'~C߮#1Pս Auu/{hTuBB[сdcRlgn>w~3(yxtTEL:#DyO\z^m~~U67@m<4oI$Fyd,M`uec>~|3|Fۙ\!B~P8,de WeF`Q% !^?QggGE&7ixWk &O|Ent2-//,`0[^H%^V)#djt߾82̬2w=wJzcmזjPH}Fn=^1XJ)H0ϓW!ٺc #`+r BRŠ؆KQrD<tx\JWnqK `Q"}8й)gb ?p]H>n[Q@83D<řk26#oSe^VuJCk91yHO"Zt" S^z Þ&dz| JT^~~(}!"q3Ii.yI5gY4)[_(HN ghL R >h O_]̏jBpŢnVa_1!, ym۾S322WyylڅOzqUHf4 ZӖ`&43lM=2X?b<ʋz4X9)a"xW*{?)+XEi)z(ve+?:!(Ѹ=.꤅KV$#zn߰ŷa0Fbcz+ O.ul\T>5-Mp!{Nut4\V=$3#:8t)u& P$}ri3b8g~`n UnKX^Z&Q\Iwr[F#mڭƆb9[+ & yłs:dx_ʟ I#u =1=jLwArC΀HR0$C`vcsmW?j#"NLl @=/GL}?<Hlb` 3of*oF1[Z0+S@TJڸu{.%T! 둶 YL$KN`M2j+rڷ~ .cYmκ(%u )p Í5U.gP٪NYd(ѫT6-" r{= F\n7 "8~[Pޯ *lGNO~R2^ /c&-Fp9MQmyb.u QE3NhJA]ѵyEZ6֨ؽwkWPʍls/#ĮJUe'K: mKx†:eDV4s|ZBPp~mo\g` ,_9@}BoDVB&7nD/?Qg$a Ï6Oa̒zO/y-YY4-VKBM٭;Rwy1ܣИ>}jC5# /Md~6p C8%"󑎙܆n T0_ťIjgXqӞg^?ߙk|nf塮)Ng34<3 F_ P̓yS}{EG𜶎@ni88<#]ʙA}[U#eʺ xB̃6gx^RBQ*鞨#$}ϭN>UW*xoMl.ص|>,6hܿn?}r $VJ{E̜ qYa^jW a6gMK5yd?[_-B4_XPWrN [Ԍkךl*(*>Tݤ`MyP +;d! 2ա h5==&LoheP;J{-_>Tk2آcE 8:ǚ !i| Lvk"Aw7K1RDq<0a[5~{#WR\Z-|QΙF`KxgTR(Qfx~-}Ր'Y_`XPYH Չ޻v+ĭ WNi"(濓؟[/+wiN':wqzmN&Ĩ!Q.B'qhNORFєEahv%2yX˾#4P(1t$F6Tv),XLh^yjᆫu〿;SsY*7IWȟV U,Q{vS7wXEc&z>bWAaoi RJ +fy#Ԥa89LEc8_^ڴ/-} z. #CI9]iȨerjP$*@Ԛ΋v#pPJ=jŸ宛B ă}:YQp p(oH=J?Kjg5ڐR.~{^}^eNJkl!8V' ^A}_ %n0 P *Atد1 )g3;Q揞 VP{ii_#!7ptγ~3M@-g}]u?n{{ipWS?\KGi#{<D$ˇ;وJUA~8L.XF*4HFQvĎSߡ)AT?jhw3u?f|IgF雝WطoueL;0;\GK%}>υ*!" _8DjA"Zgr: 򕚚kb.?_g&=[OG*_c9^<R/LSOJ̋r"2303j{qAM JTH܊DSi{B1z/|%Xβ' XP։wM~ v8WR>]6A*Q'pK?h:66e0asOD7qFf-J>w襔8\d;՗n^DѲpq ܁{WUqbUPD1{>O ҇:W.AC_8݌TsǤ Ňu h,s`$;xi%>$ړ5,5pϢR!PEs5CF1VYjoqrdB^qeIp|feٯZ%fv5cb,g'!Q iYg$x`wK@_`LZs$ R-x#p&Bg X$0<|* &k?ZD {N hpqxY+•2ia, U4x J'ЄY988esArnWHB=ӵBHڽܖz+Vw^n $n'w#64#|M;BsjhAsֈbKqQY{]*=G7 L%FfTU~7u;Zf~LŠj-m]$*IHJatLD[!_ddUҠ>X`:+]R:߃ZTGqw6E}0fM`4Cz;rzcJSekl({%L$6`ydͫkT˟º-hB"cH9ˑ%XVdegb`-pQ:rm`ZYY <55j:BaJ{ 鐁H]*H3.Zь4LǙ׉2d^7z'+?xznF/TBuvJ#Jh9MI9rRe(|%8@ %sg'z(QbgR#d*:拲yZe>u> R*cKU$:q7s7(HdvYJ p@Ɉ3Z y*Xn_7Jy<] K4dAK<)-MLr^=,ܕ۱!-d X90g7 Vrvה$0QB:. D 3 evbR*Awnm OxO/%n 14h)o%UY@۹QsSNAt" )(,6M*O5_a gop@ݏāk9vTb`(n*kgBejFttErQ>fYIv޸|h`v⿫@u/:B$YjR~b'x$:S\ hK "D+wM< ];lUDϷ[Z?߳nS%otOi8ɐNVk?DMBԛQ zxB,Ww8پUV" b`lz1)+1eQK%=>lx+"bD],x#i_Y㟥K8xg A+ћQ}r)E(V PE;RG< F:Iqu?6( {}i]ҪNWii3PUnnOQ+ WZܥP3Z,2 1o$GO6§Lk#;^T,~1 ~yM:`^ƛW?%'bw]F9@o<;Ea"v`Dz}O ԊEq&4_ K/K(uTe +$H#i^^}(й#2V/E߶II'SPN[R(ݫ;[Sd֓*V̐J6˾k[p\b)@L";kEJvQtomixF?qa3E\Tx`SVmGGW}h`.3?},{ӄX5 $M0E-v[Y?JҳbR&L']16K҄>'I$I$I$^$b%83mK!JqyR.6o =khY^dO?s,cŇ%c<'xE.݀|6BxcT舕׈`Chp¯ac$͟R>;s.]IʐJ5 ׌n^dW4ZQŔFru]ẩ>|ULʯgCOuâ|įYM!K6E~{.O :Lp(Ƥ" #j$|$j]ך'Vs,Dw e C%NO07Xt:6@!<4=m0 c³]A:Ad݅9r ]2WKe+ew5vMF[VO\kɪv()GP{PTֲi>OXhՔg8jG2ԄنDG3^k/D m&hB]N_1if+s ؟11.$c2kdT^1⭱XX[*tm\Z7/MÛ'!% H^mUQajki5X%aBe+~J>SS&H ,3\1\{S NJZ5lM5a85d/ 5(èsR&X?g3Dg9 YXq ޟ#\A! *vC`xuzU}U:ܩ9ZHnRں@伷slmL? a4| EA_r+zͪ!0cA hp|(#l})ZmhVt0z%'GLԻYcFQQG9բ&hɴyCpK+];Ӡh~߆CHҝ2 3G<Ө:vV2m6t{,vxѼ9>:̌栀[KJ BPCqHA&2? 7ݗ<qߢ£*p pIq" e))pvxr4K37}M'ނQ0QiS@o=uѽC )kbIN0RW6d@Ļr1Ih›pU5-!a^ϙnRˢ)sY `4S:8"g;}tݦ秛u7.,tfP+KR{"nGm0Z$ccB fDelRDM"u7Ir\08PdUTXJuYTFiE$ϴlvկPq|ߔx6p2dcYN Pfb_Ii$t/JxȤl^澯Wp] ?+AltiZ| Uh *(S7X}_]12zhBR7=\B4 gm,k}䡠Q@̏P=0۟mxe+y8>հ Son3U7iŷQڝO?O uHɹwҔA~EaDP2Ur7.5͇)腟}"1"Q@c^Wy>_yJkpʲ6t8G]4T y}}C|>SlUUPg۾pnS|5 ^W<^C, Ze$*1a;ȵF] pwu׳?>-կ2Db0B)~, 49|yxdG? }6Mv߱e:Mp(*O>ghd$m@=lbi7P1Khɋ^xna{X!F]ߴZv`@^COIrT1xhJ}ªn`Ō&5Rm `7PmA4XVxsBObI3j ffkݜUsp߂Y25~dZހ=Fȡ^xJȷN q^D+iLL1 Y̠ Ꮫ&"dMfLy>=N/UAu; gh= bT );-+0r#xZ—z!@(ӶTusx=QˡCpW?nۃ`壛B D+$,u=r׮||8Auwf#Q kb$B>9BEfMo1{ '=ˡ>`a׮4uto_oAuq0=hR⾏;qr 8FxThY2]ih WU8fqkKjK=G9~U/E+"E"U/XPXDgОΖ\XM{wxWhqK+ןgЍRx<k1#!O]N.$ =Qewa9rK.F [ʈYNzrjiU([Jtߛ)/Uk~*:x.Z%4"pJdɞKՄ\RCϛ*@`ex:!q.$p+C!T/ԙ] x幣?T$on =ٗio¨y#Aƺ)n@#l[y葴xlJTSUδӊ 5Rq,ԒxadylnZGoQo%~7x?v#"W*n$ec;;ߺ}j>u!vTvȌm~7w}]~oa~0?ٌZVpPu I]q[9|\'a!]`N+nڙ+OmXFMLn-fN/o4 |G(XӍ8?" p{ uŒ#VNJ*)%ȥܧ!,>ٕD6\W4^jOʵAw 5dOqCXTwhC%(wFh5Y "Z?R`$ $/eٗى1C9-ȹ-$')DMRby> D8b( ؉ʹ&EC6CF.Pqy&65}aq1*YA_r}[ۀq@I_ٛHTۆYX`I_N齫\.r~%yc0Z+j&RBE/.DUQ[\KIi, (B C,- 1IάKZ T@BuJjzQLM]YHJqN:= 'bYyjJk zc2 cK=dI5\1-Owatj}pG(iEr֛W`hd}pGר6e&>jG%.lQ '8s!wB%!QiyverЍI9Py5Y 1M~L㊵ɫ8,E>#nV=s[L`߾|z8yƙUΑ.9W+F)?wG?3Y˳ӍԳM,3 YXϔ=,lfVSldA\1X.Ϟ9džqejWxA MؗdӘ!aE'|`˥di42I ݤL[m2|jG _ĥ}Vdњ5r/D;B|-J́H!(nj<24 8ZBͨ[ C'?ҴlY鮬)|ne%/UWgᏙ2vX|}Z;;\3ڨQ{Wj P@ͳk r0 vgvۼ壡9! 0c)SY CAuǛJכtˣC~lZG-jnKnՊ[e`-B"6@NPwuja~'2p Q]!O1qSz˽#fX xf7Qc|:5«;Omr$"jb+cn /r%QOc;,w)SP qdȤ YЅ!pv[POk p(]A @9ń/2K|){"v oB`XJ^-2䀀U]Y/hS<ɰ|_O:E.tȂ! n-{O"/7><K:}#M"L\kJ%ۄ3r9o2ݵ OL̗@ u;c]fv\]:s%; ~7h#J#/8(^CUVQ!Ӕ+~Eؠ[RVaVA Ɍ֋zZT/_oCwv0YKoPzt=$&H0mR i4n1ٽ/`a铈q姖2Gs:#rSKDn=<6Z^Ksl gf>j|.GҖhRN2&\]:ވ@]xh}I5A~Z; ]ǾT:)T>+q+;@'Hgjy YW63&A~e_ۥL>t$]giE9SԚz(* QnZg&F#RJ*W_x?j{Ô}5ȥjrPӑSc¢,^?]2TGTy%llhD49]l4zXJ,Y,:IHkf7vR|lhP2 iK셦x+s1B='l-ߺfSI!k qg4t?J}m- |6u7qvdrJh@h!Hoe^5 .1n `K*7UʼnTRqFSxGy]]X6{.Tt ڬD@~BMGg\_kn-zSy5V(M {KrLK<@lI >"l7踳[gA8 ֱ𭈛XJnȠLݭ=S y\$T)"rz} ;4ﰾѸVlS C96v0a9®M)Ƞp+KjEQæn7!k]~Pjo RXI;J067i5+S\'͒<$9Ol^"6kEW9m0 o^ryz.\mmmm2:Kk/Dks`IeKr{M>J}&*cb>;P,cpM Ơy[ޏ)dDeLJq:EޢɴC%}ePͽK'qԱutQq'P% e*)cHjA{B-Wn&u|Λи\ļ h:{WR6B(ݐ SNU${Vhʼٮ zP-ƍE3@0³u>pƱDϘوBmxi |Y)ؚ_u4=LCLh)32xү)>^Y0:,ӲE 9ƭ$TĹӖTFi,:6/2k) v 0Hdq!UL#+QLͪCR\@y&"Soݱ-3='Xlqq-m ź.E6eO| P- O} 'I&2AP{76H$}6`6Kn $szY]mQ\D*gAONk S*H|rG+v;Gxz1 Gǯ@v 5Ɯy>1MFE f]SgfMC(4S!:feoX>Cdv \:"bV qH0P~,'UKXXV[!CGMjgxk(vez]5`am\!ɡH~ދ83*q*opcrţ T=Ar*ۮyrGҚopq-R(1DE')dU0:p#c$UV2]דlk: D9za"otZD='k=jϙ3ϪDl0[dW8ϐ?!ܟrsLv/fukA>b֗_ЙIqEk # d>/67)dn gؾ<@vTmt/+_^fۂޖ+ӧդ0WzrMczn\EE9V /cC8_{"SMBM = E D:4'FH.zIPm֧$³y$ ;٥tV_AS ؎ ?gn0Nv٧* JI=xTO8&n1ٶLqv3=HZ-~-F YsL kFrMwދ - Sq(]wu436:[kB!J> BpYӢ,D92]b%.G#fBb~VRwb+>VZ#|QXԜ-¼[m\LL3k!Ðoin= ? 6UkZ D͔"Kd$B%; "dKJṿJbIYOf2nj~SuGěڻGaiHX`7y.o=2rj)09\^81M#Nd!62O?fZ*9W>tW벗:hBN+rO 13moT_sIYnnޛA Qx|^dMYOct&q{qnxMkm~0刌k]&S@chI{3{@+9Z Іj: ;o)]ȅ`2(lD› 6eŃѠ7$5Kq\- 1Rʸ3 Wbj 9@ʊFQx?[3D M>YP?vR0Bzm=.|q◿C!b2ݑjQPad0`{_ ssjn8DQ$\kNbAgu"t}v%}^b^Le ]CXV(,Pi ^u]ߛ7M"`GL?&r:R -Gm` %Ko-6Q(~wr+cU(kB2!}!!Y֩n_PXW(vn >ԞP0tq#$ jҏ&oE1@S-A?d=ф?;qLB)258katC^8U+6-kzCLt-7naD4ʕ-G~sf:E]ݘY#} ;<СS 8 kYb!ޜam6g3ȆARKG8g^hC+Q# ]įv[ S 5&*./a5 eEbN"_A/44,|)]l ]"T%W!W-W_ 3xR֖Jlq z>h#٫țwktVn-!A\ruC3-p^?2u#E11 ȇ4-_Ն275UД-`^wѺo?ZͻDɠZmzO`᲋l {ЙӮUgbWDj2kyk0|<>."wà!f+D<*?+:~hch{~~lYLknϦݎijFi(E\W^Kw~nP﵈UYn13 \r0uYrºJi6b4e:KjY"?Rbtcn@'P'^8V+$j\dcOӪf"*~dmHԧRAؚ2\H:œJcϡ^ix˵M[>ebbxC@q:Ew:ͯ. b J'^oQWoʀfL; haX6|yrSZ,UVT1dui[AsΉ2jvsHu=n.&=3o!) (+aM *KW0 #vWY9i z4¤Tl2bR(4|9dY._YJRLj0z;&#%Ұ,1c7Ke+trk f(-著rEѸAL p154G5 ;4VBp[q{68|yK r8:~A-Ӷg+*G9B<.ya"u2m ";N Qң)~øPjKZM1W0'$vT]SIA[~]Y)$Da8z5aFhF0CUɍa,6R>$hZ$ KCEu<8{Si\J+ƾ1lxaP!{F,7fqwHW}}MbCg K(ZPd9Z3{iQkd~hyuҳD`I;"hhUKb bВL<<x$F1=Q]gBI_0g'g=7L?a@v4ٿy a,DrVZg|3Qչ$DM|X^E K$F om2K%YѢ}:I9npƿ xk4Hamm*AA|2sN3-[~*lE[y9AR!Q_"&Y"d_e 6 @yivU[Z:8!=2cY<\԰2o[avX vShQ50,?>P6U&R11jW*˄ k:A0 ƂI2 U][`?C;~I^߄81\AO﫰ՉxV[`HK~EOdZ'k=enaI=qZ"O^B&'IOF~ ̇e|O![+m!j-Dљ/ *L;J\E 34Gw7#1ge\KGcd|k~>`0tdUzt}%F1T^FnPaf+m7Ao6f N.Q 㢘")Nv|jt~]oq,'%>E3qӱʜĢ|28'SXȻGK=;p@NT ,\q2~~~06nRzOc\-!دnCՉ~Υۢ vAW)%&f8!vHLoOQc;> ;`eW}kX)2G630$Ҕ LEzr*c5i7_䍦v 4g^N$X5_2,B^cc)YYByOo'I¼`~a^]_uH1ɯ &=A5gz4_sᬲHtY8G_ AOafC"}/Jmr`-ю Z#ϼi+Ry4!3+jArB>P=- sPc/6x ڶn@oD*nr9$KAYc k$b,e:Z|DͷY XqØUh靡9QOD4~TA&zE-H,9C * K_=sG_9SAL֔^8Y2c }_oC e%?inC+oh[73IOBexϜ ª'/b2Y*Yo2YK#taŝj _LЗIް+mL\ׇ蝵I$ OU즇TYX.|[84O.Lf>_mK7O܋۪vnݮ]}0ŏdkpk%=cd=;-)cFMy(Jd\U_i fBh=و@iɱC[9c5ywm|"Dr{<8t[)"bOyESq m6]Wiui" e~9έyM E:"]ݎguCWMv -$9`̶~c&$Þߟ,ǘjHSK[+gkh!Į@GrIK:,=_sAJ ,K]2+`IzR˃Wjt#EfW\ݍyNTT(Q߮K~9؜eoH`& ^ g`n6ךc˷bܷD8Yz;u^@/o1(""Z3 T1}ˁ܈W"#g}ZmX:<;һ_JhH=\\sV^teEPZiB &wpg.g#%ұH[FbXl&kTnqgQPcҟEݚAǤL¸Gûs#l9Xə4 (OAԐn][UVfUBIjk:%Zl`9'./$Vh.=(T[o '5֩/|;G* aN2X5jB%FV0l:Jm϶I\!rOY-T_{q|_-p+Ż% dy>j<V'(=})YοSk,QoCW/>EW6.rb?#H'[qg լ;nYZAw"«ðfD$KjcH@2cR8*f u!@gNysƌq!Vw=x(g[h{vV Ř"4a.TսaHLdY)N$C}|N26m2ζWlUX2ژWM[jhhPY\; !i8~=QXqyaECvIoTldpuZ]b6'L7R3D e=?вLHLJ7$:BL?sQRΟ޸g9p>9= OZqXSNȀu٧ㆋ`V¢@~n+In'6/Qh0ڕ+U[?kl`=Ȅ5têRTjH8A> X[#hZTQ@в{^VO ukasچ ,㈲YN3q?zcc;ƨʍ7u޽NHDJsMSE}{E@mduqƶaz8N;5i `f~$|wcO"CRb ;\8sز< |m|ͻŗc }h,P;]aYec6E/n`ƎM+s?S n#%In,= !W4ǥluҸيUSA7f#w)uwl(tG7E|xRA_!`r޽`~բy1\Ϡ54cڷ# >ƶbkOkYe>^).]N28iGMb@A\-?;PVf2-$yIZ.͏ /c5vKI'7=/Z:);i5gS5'tR>9K]\aCl*pŏ<#or=dk΅EEk`w> 8]ɋ046I8i+6 T/P /2XV>e_Dχ('Re&rٻ \?-#!7Z>Ժ/B-ȟ-9F8Kityxb5OLCGkܢRk8 ҧݏwkv 6hMAu :>Npاl 05\wl+\ ^بu`Ԁ LQJiBO .׮,M1aMnx1w#f$jyUBOPۘxPo[~Ֆ""bbT}W%uͤ r6 JPtc$hOvwE:Uz$rh08dilx嘅قδtٝG5h}gkw[94R<46{Wq Hϡ 5%o9r3@rp?=ДB"swrDiG2`u%\5WWޅ)e+, BO!m⨬jyۼǥTcsi$5j$jcfq硫V3[Sz??0]z.̽&=@[}~t5+%I>#8Z'Yꛅ,emSa%cቹXMHG{>Iޥ&dA]VG7@q?lD-R8GG#ڽvus x)IiC"{1*`.KoWS̐{ ͧ5:#)9l*@aI¥B9,UK˺ߘ{[V'qPaKzFP^Mˌv*1Yד}wJ GOJrb -}0S ñ WWu="cvxyJ~'C8jb /"H_P +4ؕw$Ph[Fct\<2ZN~5*M O%XwQ(]P]{F%c%C9)/B/sr7.[(ͪa=G)aNힵId^k=<:PߐzEx?B Pjq%wχ7L3 b,8Vq9y~7c-GzN+Uüuޠ5R.jЃBSwxs2_%s?$hQ^*{Scͻ4ckAf/G5x2s),zm>g7t}-Hm>0V; ~ M 5/QDզqVO+,SSʖv NaO |[ Xfm2ݙ ⧙UJҪF+f1G5|. 0g ͌oL!-aWbMAg3?;_)9aP 2K$nk?Y%}x@kD)rʁ Ԫ0,6Æc3 2ɾ^e΁;Bxj}M?!(ⷭX{lGڴ mϞR!Oˎԅ:6VxHfi =լ~jLhYgzWoqPa }aoz=) {_Dw/QC-&"-H%~Y%%6ww%䀹]cD#j٭^d U!W8媎o5`bEV|Aи` T,߹Ef-1ˆ3:1~raj45+,9?vP)*z0S,qv(Q4u3.Y]NI;7g M|GNj|tbe@/zWvd͍2XP"vNˮt)="cMfr Do(h@ځ"z%X@];J]g(hzkt'P;O3' EY_XεmZS7kIL|P9 Id'wW6s${@{ $"#MGMFʘYM0jK} |dJDr2=&EJegbttgr7]~r.Yε|&5d=|(Vo *b4Z&Q.itΆ ^KLEc/"τ1\r4<mSfH&F bvɠfQ8؄_2+Ytj 揋&-^l G/MS͐=k} ~ 0&mLH+Qzk5%s8(fg~0ND\bڤV?#oNeA'%`}XT|RIp2b^ NI e!x t +9\yWrǜq gFG-\\Ϣws.rvN(FX3YglHXwj}x:5G&('x2ysrn}Cf02".ЊOWZ/^d1g}j׾գqm}%.-+;A>xcHKR+@Ao:)58 T?gX=|iwPZ iBIVۚF Cy3]>E4;,S#pF9m8@ ?lmw+G+[]NС |[C } *t#s+ 0?Lf2 }Л4p1CY\~4OZ"n:g m4`>ǝ/7ZǢ: AnF4U?wغrFt㞽 I93Wcȍvt[j-B@ic09~_ jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 }rP({?1p(A(fvtK|  _P4C))z8/9iߕ7lxZ0'm,v>8#+ "'TrgDX]QU3CFH/UP`S+a-Pp[*qFkŌ rneU~C:u[dhbz3#`K(.1(bU MF @N~lw|Hgcp)TE25&`yj($&[@,C;IQhQAZm4 @ g9cK|rnQtmwxэU괾ӼCkJK1hY6 Vl.Y5L/IѨ`ZHl¦ P;mM> k;ad{S9v"Qj/Blٕk!w!8zG&- oS蕌c; %}{ 'ڵgL!ɕtϋ)Qʝmd." EhYtOMc'_\ 8XR`7½`Z FQ/0!M"~*y=v DpCT5ނXed \]Êf5ωHEr 0~ 7Nc$:\4; 6-űgW·\U&p#N5G'E:hxn¦W~`vqbK2b8\YWJwQ~9#Wx·$*K)օW#KVţq@zH( #Z&õ6ޟEr8!g`B! J=5P8!P$Y5v1(p遍מ5+!װk4#~D'No`x--`gp ,)+ 7Kq6L춫(Cszr^+gys_"~Zކ& F@&*>^_ABG*J"8+pNV7P!`6%Gŋij6L3FOTUkR%D^=60ielhyV N86cV`|o{i|_`7Ugjhhh28, %ճgTbta\~Kfz8Rg{m[K!Q/ǃL/A.F\H:Q-c>k)Yu@qHDx:Y{}&Nl[<N7n>2rӹߌ+$k03 &e?Nөm\*Wӎ8eCȇ6eXڗ"{;_&ŖWCu[ ݋΁ATߐ`&+#> 5ZTmsmY[5&cMnF_IYOKc l+ ).M#y[Ka-u. Hh=Y:9aUa]x23̩|?؈r"|,6܂9S}26 \Xl汐ϸJN"4)N MsHsEx@`l =K:iܫ,PDB:D : C*{;ϸp V?m2`0xm\CDº* B[ZQ~$i~l˿'0ڸֳ9T쟪I+r}QoW"|#K61qׅ 9EzF#A4?o/[aT#5|$7K |Mz7 ^^onk|HΈbf\z KJX /bEH ph4MA8*$l:4~:xR[%L$Nps;*o)P?iUQ{(̮6fN|>i40Q 8=PD@Cb$eM aw:@W挋(|(Tu\DLBݛ#`̌aUwi4rKy&-OhJb`p+ $*O_778$0ҢQoMPT"w2T!c#p%pk&A$]\nsNU̙tz1JW<5/taᅠ[S^ Qa\ 8l*AStB+Қ9yeFI3"ai*:Xp[<$ފܵ <?x ׵Zdp^4-&G@PƔD.9foξjU]0ʷrRS;&ۦaYۣl<4(ZГ%þb]@oH3lG?Mg5:Lfq>pssG\d6O!\M$(h:n!{y4L2 JNݟԛcͳ]> OH;!{u^26 Y RkqJ%Jv NhȖl/Ia 0SĄzެ PčfGuG4xi TXY j! Os5 T"\eɴd|&/f&tY~0\kdnGd2\GzG)ÑI>e1W2LjKSDY; g НpV(р*v[}A[E]B&#ϣL]`&!DzXFvd.n˾yָ R6Eo5EJ̳5'a4MNd$_}eĎ- ;r\" F*@\S_)cc R`JEitC;B[kjқq=՛7> |v.VWUJR 9؜Ex" -v/oM')>}htbPX"1MI˗ >E,̫ru)/b:a+ڪ+~JѓKUGK<+GL-Y̊k>Xo-mJ%a ŅB>__8ن>tbsTs\Ȍ-ksC+%@(l3^MRi xhVޕ@ŶW C*G|tO  B| 1y@! KFB)MUtX/6=6դxA1rWj "09R %g/q6zV2yw;~b@ M =yl盽A"ֈ}O%:ˌşMk`w*J*wȂwjJx&0iճ,*T1N=: cvli^lz$jLOCaSk5iDX`j}N463euh޳ӕ䛜Ba62a]0Fc@ɖw˥\U[C0-AѸ.RTuXiY#7b^m1l&C_FK',w,d Q K\WUX?פ/{q.a֢̎Q͸pe_JADRXB$Իmÿ|u:HjUp m}EP{H|h13w#x];غ`݀>{&y: V,?\ܠ2ˡ՗#=PU"xXS /Zbn^u(Ug/%+| cuh[Uqz_6]鴽ʲ=]sq׉]xY ^<8N:5۵p8=2^ײ'K2_릧_9 2ΖRË(v1+2_+pD HJ2wnQAIbHlqA4rP_w]7o+q*t4ΙNVoewOU!2]p!?ozs6WuID?p¶qw /vZ{&>@7)WTa5+W KGp.X0)@-x1Ł)} ]dUiy" 7o4K]\'[is WhOT"-=WfCٳ[QN'q0Ux*H`)9,Cf^ʿߡQ9[02ClijOԻ &w`oQ  |,oȵY &-/߉a`*HsChsV4]%҄Ү~~;KVrP;a~H !_n$g`tEjuƦ)fwDN\~ɾ%>րR7MÛq\2m.k6|Æ9s2LpA3xPBinD%eefb" ʌ dEiv)XM~0A鋸i_t+DO&!of4~=%I!ZOoYiJ4AY%%%9^O G'0#A$NnLThj-0@Vu] oGG  $)xrWQ`0^R+ 'ir豆zTH6˦<7#R̬Z~WhyQ Ja_x e"[pXw~ l\N_ 7[t,FPeuec_ ?ZvG|eDVLᗲ/]g~V[L9~-|x# U woҷFצ4C {w",,NO[LANG5UK (I1:o6h:` ra:ց#<`['枨oo[WW NC,d! ;[E>Wͽf&9TG?N09@I 'ː?LAp"e_K\:Ge ʗX-õdC?!24crJ9ʥ̩ӆc96qג gf,q'M`Yǚ >63·.ܚ |±-+&bz0㖉}O@/ؕA0u|rF/I7זf6q9񈐤MDctL_ 3!{){$] ~N ܪH'M o`ee*sQ~ -!]7/mEQ81p.peT5^[d뇏iG]nsL~빋fex,4rȔ@XZy {t|,5r3Z^S"poWӄAe Y nߒI,=$iيmo2o/OQw wä*Ԑ`Uc</RrEKV/H% ]YF^,xWOL|Z&(65l'! lE\d4]8ǎ0CKBt`y-y{sYl1އ2>k6c)̳*9Tzx_ч #3,_ E,H֙1~/"ؽx;p>+NUZf!tm`NŲsHto]mMPKl+kHaU3+}V/A5w?k'u5Jܙx4ON/56,ED/ȓ Wy×:a~GI*?ɫׁ.!e7ҧnFخS`YVF,*1 "mme>w APֆPM>6fy\մ~:e?(+85.P .< $gރ_5U@.oH q ;defrV-[-ܶ*yz\j,]y1wL˗Z7g-d8l6΋lK;iªƆM[avWaݟ(S7RASB}KQj^4^'gq_滉ۇvU[̞P"^nn&(k^dA= LƩ0O?k80k[WQö"?K3T'q>s]zwkcqe6Y\͂MdNUhVU=dÛ=oEV ) R0J<ߑh HB]Wx Yދ_7!!X`Hو SNӹ46qn T{rw0%;ro88'I&?p:ܿSY}X? d̡E/M/2XfaX$ӽJzy),)_$͈)A%;u􇑋~Uз#V"{4:uLxnjc N2ɝ_ԩKI81 4DBG)FVΕ0 !jRu{K˶1^ >’QuPZ!n K&\h*͕b]uX$dH'] v(`);vLXW9X!i,oucVEuzUɎs@k' H߻9ce2 iAY-XjwFUv=^sb7r%S߬$ߚMs;DՎ{vSd~D?oSuԨ}'SPMX' Y5AElX$ ~ 1p`*##-ѬWŽ׀BPMaiy ?@6.jKh&QF)i9x-$StvT+@:a9L e26I7vU*2ZlxwQ8D:.KD +#(jH,0d2u\hPpwafKoqpM5&L0g'oaCGМ!A'zZm$i p>^˪Tl< )S_ZFwMPaګβ;&e*y+,2G4c0eF'^.Mf >9VϢ~F޻{`>){utzl-@A 2kc]ה|m*u )hǀFM@vC! ';=(BMXKҵ=%sKIÈ2}p^*1de.>M`D7Ӌ@aO.,窲a4%!]IrJ&XnE>mșkOho;}kP{g 6'MvؠmF({475"_Tr]\3G4Ȫ.KΜd1/ףI4㴗pT _+AMBO.(b](FW&96b"V$! zI>ֵw$ӭa2Ĥ\zϘ~X ݞJf-sttsn4M?DІRkH֗۾C *h"ra- %˹@&&"ʉbZ-8:_vq7q? $9x U7i]H bg_\Acriy@hM.s͌]#dlZG%fNJ)6?jkӮ8mkٵ+fq|M\:Js7LV=TdM?=i/2+,oxJ^!yyuϖ$kC/PIpy?֔.Z3êV@:(:oGm2| p#lrJQIfK_fY”Ax57[JuЍeuc󣢂Fxлb#ETbG4xIc $rXˋ&rxQ;THX.MKЅ*ԏ!C2}ըO%?Jvucେ2.#-h5v^(עS"oEi~HˬQpdj gQo>+ȚLY{%G"$`>ng ~.S&Rsv)u~X \ѡx ;5"3;|^b8dTMj\?1KGZ+, *ZG$G̙"T7Z MJv { Tփl h8nL.%s~~Bx|%wta_::?Ͷ޳z<{{]%RJMߡ^xm& oB)e!dTiO w_Q@9}hd#+ЭoNpM>]< '{/l}CNXrqe_}}BiB<@گwpnXj]3 V|>*"({G}Go KTnQBͫO YJ#L(;m2swS\H;-<)|9܃!d-ciъ-@o"R&) ؄ (58|IhmV!U zs]"x|`|zԒDNT/rR8zaױ%;˔ՉArL!/t 5%l; ݄`|=b?;~^?!v\AjLgG8aڷ'2T&b o? ZMr(& hmR+Mjѧ4tx_C|Y[׷0zIe$xbeH)]'ͼT$yg$;THwY$\]i:#pM<RO;怍3d*JXۊ6hhPC+I݁W=ɡ(oour!NrD)…ȩCl0Jk9Iӟ);9a;ajˋBd-@^ACys4#dsitF TZ2^%VyW2FFAx;Sb}eDZGՆgX6*pF2)(nΣ@N..H+o7c{Ɵ]ZFP2uch ޤN !*5liG>u^ [ "LeU{o)XHQZXNҠ2*jAO:JYgMql\]/p^HXd)ы͢L2);(?z'dky*=:wP@-,P9`Sj#߇!U.dG@jY[D+."vCEǩ1Iɤ#z0vÈD =qJvSlBIwi~'2j7< W`+y6/M_E*z51nٟPf~d@o2TNWج9}*~0/h=yA8YO?;23s^0]ԥEX_G|9 9|$nn8[}=7.idq3FeMm2ڕ ?tU|n#M5HDqw͂q8U%c $qJYLKR%1e xG{?y"Uy!G,%aK Y_v%NbA="l@j~4P3E-g96ҹm>5WQw ˶qy uK72)r4z:%}tnHP&ԞLngU;}L!:ܢ hqaGo/SfdDw3fgBTpwՅ4jAD3%3{%@oxw]d,oUF-od(<1zgڹnHJ,8o9rHh3`&_,+0#:YXRtپ=yIX &/$pˁ b7Q_WGbtijO p`Je"Z'E+X('OƮ`=Se+l6ٹW Iq_Un;Gh`8s.4ϭly%uda>Ta/$]hcQPpZ<ڦ{Nsb; 弍ϊ'W:=׹;7u1%@񔄅?lpG+ۆGYݍC+)CE2 @9o58+FA6PoR hheG:sjaqfJgþL:7Qo%(JvhE:`>dKF-o~# cYLa|gp> `HizWTΨGնSK LZ }H'Hzюi[xgQ^2#7Ա'#.Iem"z/YFo;꼗~9 ܂8ƶގ*gAir<%YY6zGy7?w94$K*J?`f7] BqVt-pS xoM!:ݧSk0QͶcWug+ܝKsB1۰ c}XXћ^s`l^& ZznU=y_ĕhv/0Oxpɑ_)ҋ<4fҖmmgif]lbCa \;%Z6_ଲP+H}S[@Wp}Oήm̟/y-m/:WIZVF %m?C+`9qzGnbB t w$L?J{:$`t<8\tw?B JfJKCk`eow?˨ !Qy*qe'\r,EЕR(xА~ SkO vD y,Œ5nؐVNYhSV/:y'Yer3>cb$Ix}]XNGR{T1UK40y=aG# pⴶ5_B)r2_X9KVpP:A}^o^- 4HHTxRdOl=/kYi+:EB'C˸nUrA0b8a[ Q1[ LZwi}~_on۫omم/$ڟVbi Λ鍧˳t鯣 RQzڬP${H7#zLR L3֪12 yxMўuւ\%QD{.cۦ/wtԐ'JF*WNͫʈ=+y@,E0(3{˔N7+j_QrӾefȔQV{ٺg{mc)ffc-GSrɪB Ru7Tf1r%ml3VBI KړBLNxD ~֏d$ az(M2΁]]NCտUR8Q{woXsW>/7L)OfCn_viǽ{AZ5gZU>OI j^]Y;(3"+RDvVb1UX"p`m~= 7"=y~/y3Ь)E9sj0WUIEg`jM.;16/8I?s:5%mc"42!, gǹ|R\qbO!DWYPj(wƌwr-ΒfbG؁ސBe5Tqy #H?}ӘRs=%}!$s|6(ųnUٯD a>%бaҝ{yXga-iۊ"u3@}NcGsQ}ܼ8čݴ2s͚d^{MkjNS$I oUچ:+B Om^X\jws$ē̮ > {s#^e*X"v\Z,Y:1k x=GA"V U+ SWXBh(Ub5TllQ/#ƀ}퓓fJ?e_u.,7?,QS'vS~ɌH TU5z )#X*ej4!}O(Y,]֕Cq b\ҷ#V88O` &_1jP0FqM*2P 3sPאO(|/by_8-BEba/՟x\Ιƥztv˶'DbH XǧD.e-Rr;Q@Sʶ('P69(zNGIgkBWhj:>Y!'`M[5t"Ɯa(tF\N7(9gv&LBqcP*G|E`ycYz3^0=f/zmlEu:jSEtJҔ1y v< VhSq?} 􂂮:? .ׅT#VOrA{/pc(;ˮe͗C%,o Ho5}fG(w:ox]܎%g>{{ .q:^xKt{-~]޾ɬN3z B|>@,Oy6̵UeTxpD [Eӟ{}6Ȭ&+cr l(w꺊"qrn6dטXp,dF eH,L /1SjN _$:_6&^@L{5'9-09ۭ wp ڿ+tZ0Jńٓ-A=Aɲ4[RajU &O/ۋhCեJ.rjcXj=W.n^_E8[~m $7R70GŨ.jMfP'peA }AgFNKVx"t]a|2~LW0*BNb9Fw~7}oYV5h""F R[Gۯa$_AH|in+x2 Sd›&x{uw$to"V#x &p9 gTYEލ]QMk(9LצW~H|wp4QVA i 7)wúJ>PrhB(ꇨ7#wOi+cd8*in?Hݶ;r%uFz }u|%6r% Nd;4,N+Ҿt]`jĕuZ~xFV b4j!g;pMxNý-Ev&d|=3J5N@aȧ*xB~LO(}WsAHD*>Z+rS)`V"ڬ5! qg+l> t;k#nOܧ8Nh#)scQPr \Yp-Ǡϣ27#*B$jfE/n²EJk"tl,i&~ξZ d͏Bnl,[b[ hCnW+t.na3vO-'w P|/|W4q!17dZ\epA$du*/|,&RF3{f^&w<&؝!\=+vn0W#!2Y8 wrsJ_*wۓ%S(7o1)OaA嘜bHBtJ᫹#_`'=Q~ _B\pC,B.LᙇV+k@= *pv5bWnT%1ƼֈB]ƬyJZQb .nUJ Al&]kT{2Si!Rwg 73rn34f従;Y雜ڐ.g^F _=XT|m?Ni;鲔+ޗ'L*O|3\\; Q_K8}# ì"yX;Y-K r8`)#ðs.B@,""([bb?Y7 K 7njL4(0F[Ǧ˻ZM+kpU&P 3V:v'g̅JyB$k5um@tžE$ 0Jm.{0+izy^ɚ$]3(΁ok)Fn'$_|QLʺ#N{(FCNcxP- Z^.p#H֚ ELC/ʋ}ffR]@`!C(괸{{ \Y%T>L Ѡ"# `r("k )xi{<m$!$ с`-6K8?Wkta6oE" :x]3lݫaVà՛f\:J_tϟ}5KD|zد> MbMhɼZ_UʸgdO A* u)il|_zBi%|p@È$?&U]隭(4!1{[>鯨 jSR'n@9mA`ʛdm=$S;^@U$$ ꤰS;U(t4ʼn{)[HCVB Ϟi:zLQ"i0s)_%Bd.s+ Ugwbzۤ Gyt3 s\_Vy{DEQBY5k`,R4̰ eB#^T2= 1/y+m-]rg7W2>ӽB/s uvCйA^Q25w:oˁ#x06s]!^ j嵘a"zLkLY.vI@i? ڍ#W[M6g /mz:z~޼nbz/WO÷ua}q+"uPt],N'hnIaj,29VVcm3t?#yܕE]" Oyztk+Kq9}/ )j;E^Rе+FY|P8@ -0hܕuKoY]Cm.67҉sZ a6jlsb2?2mۗU1s.cKSfHVĦ<`K):| ԇ%z!"/ro~38#Q8hΊhwreLt2Kg>\OsѥbӾ2(R'h 95y"zG1${a 3C%9$O7"M 5ƈGŜ>\ּ u=K3% \շNM9po5fHեw-!` iPK(@\#M28/x pEn$} Mb0Xv%i]q{w i((UwJm; :J/<|(71L <%jQ3؀(2%XqkfPYB@kJ#x5{垴u#oj%WOᘬ@gnC86N2R4mz\=S^MmN&Ȕ*cN`ۊ:C9ۘe Eߢ)U*QU%ЭPg|4YUN߻Cg=\W` ə@,um$!Fd?/hDͷV14Jw^H>Huy/;iʨ4i1YBby)WuwsC A{\DMl?5n1`׹ޤ( ތd3ܗ 0OD(tjةg!8˖*ܡ%n7V֦dqֱZ{K|DX#`ۡ"MLȘhzœ+nO')(Ρ> v~7)Cdrmd Udl'JwkNCf~3pNziШ66D6xkv8*AK aT54|4/2>uV->cN A∺\e>hOQX{<*{j gd<더 B/TN*5ecʜeN.g i݇uaYq o՘EOt\d0CJY1OI~uJki{?ǧGWodLI @d3j#b2P',&ԉ IKo ?E& n$e#;:8cPyXRx΀ VwVn3ۋY2.ZŨn㻑֮2T9JX,ezU}Џ\(3v**~/k|Y+hV)T"X<;DWO @L|[mo8YݸOnwamkW?#%Pk<,/l̒L24HP]T΋Qblc(V82:gP+kTV/Є& L c9Ŭk;sǛP vL6Յ_|ԕ,hLk 8o>g"0n<iYO(|n*wE~q~)=ՔbOe&kQjFKICc]fncE݆ 5H+ j];`.(7Z\Np?՘1E[]>l#\FdZ}Hұd::ש4ħG"/,(W0kZ! AhD~ p |l R.o@X)8#R Idj})X>![ ?lW(I?f?}ӂvg[\V|,㲂 K"V PZ|1~ ، k2kfZ83e.F,FtΜT̺ҧn)Xn aG rnF=[1YΒ&TgC^P8rJr^Kzc"׻xU;9D<,8=06<&Y<>S<\:wae 02Rd.$}-Q>3Ύ~?{Bӿm*^CK0mvW0ɇ-rT1dAf6 utuEe:sLgJ.xL4v3,c^Yj+2+ظH;H7gK K ,Cru$%r cO웧+LzSgӷ"0seCnmzNnfR_*ֿ9Ӡ;Bg0(;81U?#Sm.QqzxU#Dʡ{ 4v޿3RxkAPrVgǖ-im(29(No“!1ǟR(@l_}&¾[;ct^q !'zYLaU۸RoN3Y=CwO_Τ Hs.5]2?vPTU%K;E#*SWL \} (&@ɓ3MC}]{ ЕA}$MoՔt<' 3؇v.qxƄ`$ģCS~oCLpi1?\l6r㿨4ߗNa%7[6@Z]h}0Y%*ҤS8>QIAxXRw\}W"!:dx;RPbCVi#uli X C-Kȸ/pA wZ@϶|.p΋.vՓ3:}.~݋8/a4R߫_A#/ɕ0{eG`Eq8klR)}J?Xeo! 4Ѫ;ƒB Q虝Y1jwb?~2Fǭo3Kr@^R% ǜCgغډ*]'I(ustzHAHz2VJ)ڲBo(S1ԃOOm_y^8ʳ I D㪧h5z:$Qѫ<F#Q}R94Xװs^&g}P9w>9x{֣ݨPE>HvBz(ych7s? \N=B{^ety{tg[L8(zF(2ax cZ,չt=g\T_\O~( -upeݺpc;$1ÜH(Y#e(a۱UQʒ)/ 4f>3%Ce?:jOQ77i,?2lg>gX)Sq68XS^tUsWH/I+$M,XVblriNjdmi!$k<4W _4AZT96J&e m6g.cu:vH Z8]m;,= MMyLes/r$Dž =>CG R+vl3i;YUS4#dMP{0j>*7iBRr ϠAap2J2SfO[H10X&4( :: @ĆUsE"޽o,e"hZſqϊ+Ў3h \zهZՁOJb8, X=HXQp,8I^7J5ѳjs}C>B=H A,ߴզ\+eʳr'?^ne?aY7QE4h1*1a|xB犠)&X4QEf#ib\II֊T#d@?>@~o/jIzj s:pgRɩ4ROϥjCF ~0` oh(G.c3HMnKnSaS=GZR\&=M)4~qˢDM8@T|].9?*@[\*oR,pІEtU0xC)phTrc]2ʺ'Z̘L+fAQIQgC%q%^C_04)$N]BǬ^Z??uX[IO|MI0=Lt Ftj\Xd7+}BVa4G0 zfJٛor$jݲYy`B\.5;n%{D|>M}6 0H:l-xsԜ~WR_%Z"+ְbh{ گx(1uvZWUi1XU\m#F /}NG(ByXF*O ۟*4/opھѷjps3=c&>bZ 7I".XwsoBl)C\Ɋ!G7l)*ߛ Ջ+tg\CTzW9-p팀xX1]"m. 8$q~HU2Fް")ꤣ;I!m %cm*&ŽO4ܢl?!K'pb(,:랈=3*Iw $ʂ,u^9pnf:D@>ePT:B,KnҎD~t-[F3a 1h :b> Z~4y:oH2b2#*Q\}=Ū!m?Y~n]#}B&a&f踕W0 U vdVR=B0w8qRjʞTy=5li|צq["9㒃\fOWw2`%t=iU'Lb|]nN(o5)Z O@Q_%Rմ'T62"U tGm:W{}S3x!a̗6%ܸd ,d7 D:/0he͉5 gҪ>dx"S-*vcKXJY^kHDbFL*xJysIĉP%fsQRn"(ĖPKA$4t$ Qј9dR =|(AW"ɜu].:[V}SiXw oܯBYnpCH63X^@U;=ߖ!ΧN1OhjGW yWERí{b!tǎhTЮ+k{IWua3Iy3vg axj z"Tu`Xy>Loh8FO> @JŽH=7B 2dlYET(P&%+KSkq L@u!1(F4˗H0`NamN}]7~/լ/Otsvv? iou"wxl4f AL,cB, (IxsZ:rdJW^cAFSk¶E+ѽ95cм/ӭM2%cuU}^+=5sOe^ջ]"Sdz >`,2Ȣ 7NqxDp?% -_E[o׽@!R|XѿowP[bHpt R˛sLd_Ť?5*zc붦3SFxďKM÷7%\?[^8 ܝ&d9DNw ƷZFLIۤ-肉">&,#K뽆(2d;*|ӡP;ULT.v իRa_?M QsW$]Sl(-lyr8䡕1;K& 9'5~A!fn']0b_G mCKwP\Tߦ/?p֩JHzSS CGE5/]EEYCKw-*,hJkV6Qh σ0%yŽaH jGW O &zvTT t ǢdOV`a˝d +*h>Ѽ"*1Gkl+#aSeQ'~V(!Udf c WɃК)%JD .\ȝ(s̳/֮F{RT AZp8u+}7 HWiqn Eُ|Ĵ̘&e0 @|PPĠiqicdٶXMPܑ4=(Q˿&F@LY,&l++Ѓo8(5@@G7QƉ` ʵ;j{?6,GL&d⪜i W>*~EP%+&߲-3[!Wno ׷P(}i .[}1tvZK\Py}V6!a>FLc֠˖~[wIV"VIᛵHh9N3@͡E,f+Ā88}ƌL Ϡ:cЀw:}1{\xTP0̞hj j8S3j3AHei/Zk>.qJCqY}1*f4k?tHǸ_\[`Wsw`:Ǒg+d+}TM{5Ry 7d#Nq $Nr2닭W *<!]Y~ќʽ>,8h h25U1 n1ϐlbٝDMz+w>S*~oq74\*(_Ar9]Lsw %g8=Zb4va!?LH쮥. :lAٳfY,m; 9(>nvݝO>"՟h̪tyNGǡLEzpRkZَx>փ6 > @ET5*zሾ af"0S —>@\# +\;v&pЇӣm ECY "&x!,y4j`鯬2C5Q@+ĦL2`#D̞]ayIN4j0믣{ T^)`<=EξD4%bI/CeN X60颰Yzgmy,]Cؓnv%^DGtl ‰?-Nr]i")f8Tm`4\]>oC UYm2t"1*zJI|Pf.la! ]$QsvNh[šHH=޷,Eu"-x{q(` _$NLIaIj.{Vf?`Ӱ̙'Z[7(<݅e!3  j"!*Z7: I6v B$C"Dw*ߕ?oB`Jm|ԱʴDQER쀸Y}'{bmA"F4TC^jWp^̀}+}:DU"zAE  ڎ C<{BȨ-Ai2ߩ{hټ_|=md~hsjB%_qȤw N_&H{F0QFW#@[IbRL`Ȳ8t{~O;.Ɏ6UEBj L0oΔ5Fh":Ѯ[4ԚK9w[!œ k~QpE 7g $ X^rO΂XH1m?tV}ԠA Ǫ(mv/~ӐNW{=^R_1=$Ҟ7 (Eq"nL{P1*rnv$ 9~S>ocu1U#BuӽkDthǦiTsbA*7tٌ P;֖V;H||rLW$ LlE Z-&UC<Je$x .<.qM MuU8ꤏ [&-4cĦpėW211&潔\Wvp'{O}NOD،k&L5ڟ[b.,_Hb֌؛Il*P])"ӎ)f*2.%ͻ BtTJ˜9"d|b919 Eh%:{[sjݎq?¡B( dR)BYDB&\P*(~W ϭ7ЏE '|GxKe_-LBuw4( `R(E3d'h֐:طBm<~\bȞ,]{¥#o8b$^{ypmKD]S1Z{*$~WNt6P%f-;CVaT1gEq~+ f] H,+XSBetf'$2cq %slML]UTM~$45-V{s?th!#&}Ӏ)pϣq=J8!3y1:EDV4o[L u?.~H.9%Ī }u7?+ZbQ3gn/ DSBC UPFc\dDH0D1ApIN挗&< CCcB*~ևd ɲ5N5#(M*n)_%Ac u\:JW+ő?،=lBie#iJ S+T@!6RE Ӎ0qnjAD #-&|4ΧY^^ʟ4VndQJ-T5U-6LB} lU?`h *,|>F (k|Ϩ,1`;++du}4'FehT_^sAQiSLwzYJ3ACn.ԾHh s0be:MI3N~dĐ,SO;Z`zjW`N0SO\ s*./gjZ຅K>IS"mG`BN^0ǐ5yE0Ƞ2dUaM5ɰ(f `MϾpΈPz$!=OV2y!GXҧ)R"FQe"h|5|+gl)?8n-Ʈc|uU=%`(pk,%dd]5 &*%al(_|&Ix񋧓F a9zG05 IjI˘[6ef!H ?0iGGyH)UPe^$7vM9Cc]>SE j=le6k{Me CpMod(J7'H vX^75B z@6sxŖ%]%˯(E""=́xeؗLM{VٝW}=ۘ~|dtS fc3g]3T #[:GsW%ad%ćH0wOD xKSYA.C/Tq}/.8$nȄ#/u `t+:ThtMwNsj7lǮ_wmY޹Nدlږ6wTo EgiK}Ģ'c`'~3B(>[?z) m0ުC6bϤD1wm&Y PmR?jZoNq>JOB}Bo%Twu4ӆ9@a!+:0;-`+noooCMXEU˼~T (AS|f|.H:,i[?ExYg"z*Ҕ8AՂW@\:P薷>P$ڲISăja) Y44mOmjLy:X \1XdGN?>%^3&ƸHj$܊+0-͎$IGfЋ-:4tK7 n][PU}Mv0\gOИboogI'V}_L,l`荗X/7i}87HIh/oobPX>ځ.* =R+nooErBuH8WH_B_b}Ϗ<{d xB ?X8iGB9wk0ٹE%wś+0 ~Gjy֩0§{K cIeyB.nkm}tAj'"%?_F\iEDE`#~g/Y?#;D@#|Ca *ȭ2?ZQ_[A $1x9os-/$M $f}x C/d/Poۀa { mⓖoGw;"YХ蛘כ6KڿdīȂĠ ^^1W KSip6(܁@`9XPJKSE8ߖj0gHw]jp?bFLOK[_-DS/Z\oH0OQbcЌLb:۾&k+9ߠo}83 ՘x1R!Ӟ`xTDm:DOҧmoz1Gm9>I՟stI[޽Shܴ_Uɧok$@{t7pRT;?m-Ϗѯ4|=}P(^.E M8~Bt+q|D`EWb.>sq+vY_]#󛙜+.]ڸK8QwӘjTVh 9;Oۨғ/e56TN[`kx J.rXJi_\Ol^F䐥8ljdSaӳ>j>9Qrun35C,o 2hSzEy. dIp㔚$P:p,*O>z.f+Y[P- !Q;^3ܵscY;s:-&sͤtORn3Ηd !G9VJqiD0׉i XPJ4>1 5;5PVTwRP?s3ytVT=.4!ԽTȩdžG!V))N҂to*bE/ڣXs\j޶ qs:Η+=Hz.#@b:1(S0BsI#Ժ 9 ʑND EUz͎nwA= a8VCViJt{K=Hna(a X]n8hg>?u5Q:uiŋUҍ*2Dn+})*/::VXlN Ʃ(o"/O+{6Sɯ$P sƘqrBV &-ݜeӘwk[8=20 >e[x` 4JZCzMd|EE zwoC;Yvqd]d('d,Ngk<+,wxlcr^Tb{q@4g˻2o)KeI+S1 Pd&ܥQUi_`8.h`VEEJܚ[ŵ| cl;PgDczSv1Z%J/QJqtNBie#6Hm6Ock2?FeJF5r>}[e•%rJ=QD`#ќkyC|qj8ى sc*<:F,ӝNpl~X^~?$BX]!(ѹm}]xK`֯}OJ) !;mhO(j,O&m;%('dj˲۬&LIo1Sń52:V/ ތcWӖ8,c 3Ɠ?I^FTKڄѯ#Sc&ⵦE=ʛ]7UU0P=qNKBN o]8O>z,2'75gC`NLc 8CdRO7kLҤf(S ʝS˩f&C :6TrwS1=/v`"4SG#:d܋>7ǍY>Dv:TeXe#ǔ(>1o+ɖ;=ő1O,bێEֱ[ ނ0:&C]Ë%NW0!2]PkZfkeTXE, ^L<ePXČK9'[*ug/ụa)%HI mE7R=J G{h;:¤b3ˤ/)RmyiG> A0ld,`h >}H p8y_C]rMDJL")-y'H\:hcܿ>" A5!s2MDEl ֩KC?6'x3nEst= h{=J6ˀs #sajY1_6ɧP,˦l6x5c깨J1|a1kV7f0aR,7co BHcw"<񄺶*4OSK_ߔ;FFqAג}@93= TZsdLrk+ BKІ}ˆ/XځCn1Y~FsτT5f؈6s%E^{Pg>v(5B7H)<hEӇȯK8HBTPwV?NcWA;ֹ3`W #nÍνvUJnCX<ՐO V)x MÇO W?$Kv݁Dی8EOs`ZvzD/nt Ҍ!x;p+X/NC#lX⛞nnhdk&Rs*Y٘o*:XG$4P>7} ~uIZԌfKB`l5ƔZ%Kɮɤi]1S Q%0@]G!ユEr7\2JDu0P$;DUtz޺:' eć ⳯E gdbPUp:5,Auw:L.ViG?zst*b\VIqn',6P9 q\]pٖ$;cU"d>ŜB=Pl @iފ${ Hc0f7s]mQah&q)RvK9ޘ2ͩQvh}*flŜ7[@@QwAJD^k8BPxi+RCHY(b`H|~a0zmP1Tahã]B\ŌQ%ys]LGafJFߙ5#sM9:3[hr9͏iG'ݧ+Lkp3}E@9W@Q1[L[t1=Vc'UnA`Q|,Xx=*:땟Oz;oDC|S S@}$X;o2mt b̀c_Z9dxL(wa0 \dMxds=01zm\|Md:xŪPB#5CjT\sws{VAwy 2%&Q-C- Eo]UBnuuoH[{u5ȹV.W᜷)p ۑ9ýBR=n(Zr:Wv\Mw$Cs ~|)CEޖupCj6,kMC񂞅vT1- ^SqMpGLqOЕ6Q 58h,b#ixdec`gksWzhmbI7ڕ&&GJGȂ< U3e&69⇨wRS5s m$`IK0JΙ_$TG"d7~RO) ?_4.QPºnHpov\!QX9J97()k٘7|@_ttxɄaӦ9a  ;MkKe}e)}cR x gQ%=i&0jI\Bq8n,f77&kcuV4}?i2PP&] SxR|09nHNSa7h/ $ +":"+]K6cx4dNn;q;d##O Q߃(} *h;6g?Bϓ$՝QSpD<\-i{ttg<:#;\a*v%ߥĊ\wNL,V.u};6hB032O0U^pQ柈@Ƒscc[q|џUž ʙ8 њ[)c-6 2&ZZpTGY~x[@ |+T*9PB᫾ljvK&q#dǹk ]_-!Ԟ Rw*) ZtDBk p|4Ukb> ,J|f,C1`3F-KAĠy@־Zܺvn E9i ]/ڝ+bI2M7%MY6OeNgU%$8rlҩƩDX=ۃ&2O^ *&` ÊsSuHo=agSWuܒYB7[EEGK-l*<&$:rV*5a!4Cy'Z`X$0+$ö*A%Tw.kEu4BJka)x~sk<@Ute t(J( >#օv;vf?ZXܣ^_8p=xryǍŘtԛu'VDGcPI(bdcdU nlb_Bz#{>(VzKz1uy,#Bfk"rUr\F؍Ҿآ #h{l)A$R%֍ "9AMQxC϶3Ts<셣t!K %2v%dˇc;\Uu AR%ijPGzj,HM:b'AOB3D2zF62,w,v)Lb=~URaiFGL(9Ib5T[Bt[mfr=Ո zƑ$#tkPhZy^]8O3@cs2܅=$WtN5ďp{ 8땄R0 09rZZcjTJ7o<܋5V).ZOM=[L?U8'JxּfI3s-m_BDD(Z@HƔe i|Rss)olNON'Is]2ư@4Ѭ'So1~Mb-| R;6g3+` nZB< Y*חLƣ :Ŧڑců,%VEմƫ!bE³JuadTjݾ"$^u ipe~% ` g3nky @h5B6unO!N=vd]0vG*"b.d cDz#Bg2"g|@f@|TwO~C,T@t~xBѾuA V_܍O 0R"KBZӖT$#\w61 sI&;c k AKq F^3tN"]]v^85& ;G0NąŏW 8S/n~916 Fz([ [#w-~ʡwhqFe-qU9S;mRӛLw}Adno}󃼋6[s"C6,9d`Ü&E"Ol'o(Cj EibW0g*FA(ro/UuSi6\}!7irU x{JmYևIu. Ҕ##Zyb nMX%nGMmPans^QLo50}/OefK&gqOaPBrdCMr(>Dn䳻CfUǷMPaBkeM U6 MwdCS=h rMl1M2i扵ϖ:(.V=,<,Q3kL+lp/\ 䌹S)'Dy=A^!7Q' 5^~]&Pޖ}Ч=.K؀8;ţUzgx_k#d۵2'm)FWM3c! O!7!d.8'ŐkMB5Su {%ru|AxAӡrkߍo>ĉ4e\G`MQ.m30,K-)NďHC&Od~%(z6ӣtL +==l ۼ6+ DtbB=QW·R14<꯮2 +S N/L9#g]]Yz/Lu8D'\ 4$c>qxPϿ% -gVQHэ4RS4jbV'9o3dEdᯉ3=Tƹ 44—7iM-{brIi1w NWxj~ ^i_QFts- Ts%g00fg opK-b+.ARܘ]0l" TMmWI`$֋fG$2Bb~cL'=r;7FM" 2,wMK6/;@|D/a=:*g ߬c{j< i0Uի) oCAa+ߍ@WPhaCQRMp fq0C8Q}SUnVm'VcyC21FYwm]fODĘN"ל& xSna▢ JWԲgh3hBT]ۢ>Zs"bѧ(:buZ@5}Z.e0.8z8Myiau ,~^|\BgLYȣMV,(x~ q[zKxieҌ/̂A_~$H)+# "Y!>Y5 gw0W1E⯝m(NM>;yL&.Bٹw0.V B{_EΈJ&h3e^i5Imp7KmjB!S1-J`*[ <S8`A G<4>l&,LGx!2LbѮ~fƴ51slۃq`&J苆;{`ǩ%n'v/ÎD%w[ `\dYvs"%GU`$^S,_/蹽ɟ{c1;55Jj,$i j>mW4О EԽH ,<&ngGu`8/"Z~ؼKG<wu55 q8|ş}9;хoG͋UzeT6jL \͒9/;!;+/mwq Ґfq/8I90>:yH vR+M`3?&ap\7 ݪo/\w:=PĻǚ0qINy+n [Y!xS Dx_:ܮ΋PC˶1NZR(j JofOV̸ |Ol`&0m) x8xj-_ycBl^/ՇzWFYʗɩs>{U/IC:#~Wc߂UM%!MR*l֘ уц]HۖEhOis #~ ՇC%H_ ,)H:ʧPMW mE8e1qD0V<XzT wEl[~vd/2.eqޞS%gX7<šR{F ۬Wኻcu|Rfiom;Q^E BG,^tzp!%@M^xZBa:nǍ XM21Cb%q5DZl<Έ2ՐxPFq '#~ qG]K|%G'碌 'aC*J7!PCiIBl>Xf13 "4Wn(>ȕeSn^⧃4bg{'Yd0)_ E@.wd-+|9ڪ!Iz{HԒL7:p,Ϥ >nctpGQ_D붶axpa} @N{MޫF4=VWr[{%V%1ۗso8٘׮iH9dDf 0;`#{&Xx{HaENn阀Z̞Tַ,GSr{MUJ>I5(υ\gfWydZ0wASJ8QptY)OLpD S 4=")Lm̰}K@ws=y(r%( D+-pVn']p(*0Ixi ⽀p:;@""F08jTo?lG|Aխڔ?VO /\BF'HV"h+ ڗ)ׄ i#WsWƱ%_JdmOٷe#hE iE7=˼_/a ^XEk۟ S0WTMCF}}%:Ǔb P6191-G(-q4rYu5b<ߐI5,ko4Ţ.4Kxd rKg>-Bc @YCTJ&B%=k:蠮:;I׃Y -95.!zu b$Y-yTΉyZu4ibmOu\|5VG=M]v:{T/ʍ!đWͽ'{%q=M}?ChmRKQ=覼ܠ5miǮH:(?C7I,#aTFA, ‚;.OZAG`mӓ ?kd-xBr5Q1M5X|t-<(}=p)Ŀ;d+ 64h/WD`cmb9ϛaJ0ja 'O]a /0' []Ј< wJuۨWZ0L"(6;Ų:kQAimdR]XF Yʉ(I2!=kб!pMcM=v~!C;ߕܚ^LA} BQ4gcSCwi5i>R@UUr*&[\fm Is'ey)n>8e. 'IZj:jp|>[8s )]gISf^YLX2=Peaa;1aN-XC&5+[שR|~H'kQ:F hN]_gPGAIӸ4UeSrFHd~ jCFx8(8 *U9]G[~9_gpu{v5L@=@Wb/|#a4QF+3݉˿ #aIgW9Ktp2Bg.1I4xAãddEԃ_̌> N@%#',̒ݎ'KcTDbVzJe4x_+GVAǠr$\o +l);d:5\E`Z0("|gOcQ\}D;n^]H7LE)@ /5 us񒟎6>3@.%=͖">2[0v{Q ˺zV tAjlg Hâ)SJ ")5R̊'35σ'QyԌ]`gUw51 ѾGZL}M4Oeb\-n(Y827-)j=!ld`^ٺQ*foT̼J' #F(VkmE&7K xyF7BQy̾zl$0u <'7\9#';pX!&PJ}m/WԇXu?|{ (D$7y !Pug ZRi~kXM%^ѡDt]g(H)i_ ;mYA-gZҢX;KGD7jx)_k7 ǒR.G_PD0y{ p'ɰZ|r lqp 1 g!`C`衎LvR }8F;2o0<},xooիa;ѫ2hwVj@Y wقx&,l k *Ͱ$O`'[j.YtelGflqq wڽ'uM4̐zanȨP7W7C:"f}'ĵW_T>H(Ws0pCE/{4 꾱VP HS ByYP(Б׎X6Us0XR}`187MK 谬dZ3$ g_U2l_4vkP"5+@$pPk\Qm,w~m("+[eRR۾#GD8VN,/ f8Gd:01Z-qƆ{r1L>3hr%HF}~yEvxN5gNFҰIDĨ`9yMѱXcsin-%'`b"oQnBR={KK!աlGמʯ,3,Q#L7W-LyY9aqS@] 8rMHyT=[fo1`NBACe@ ~^%bUla{\0DL{QgH%7rN딒skb$n$<ÏbWSۨ]GDa/LѼ^޿.,=Re7BL )3 &n]ktOooT#OD GM3FلO΁DwcŬG;4>غM4@wj2],+ǂ <+D{AӑUPîG8%>B& nUMe<\+Zם\ PŸN"0 lvXGSN EG*3)E:?N~a< ϫwڄys`n.[Ԅ.47嫳n81coLF5 hZ{nfR %lP@ D#raϼv{XI>I M4eWǺ(O+`Y WlOMΜ-[#hDs8tv4+`%ef^g]gS;A̳ 8"@VLZ,kR}|Y K#F(sߢHI6 >x._&"ϩYvաõΒ&)@t]}O?ɾ'ڟ>@=>}Gן/}mE>}3}]_Wwss?~?upR=NO|#k>M=z&@~뀝0E 5pdtd|3Nb 4PZ_oċc:  <'l_k[yGM ҹ$F?4,睛]a+0w te6A i l0 ,d+-/S3 oq|F yD# Wbmbny./?20VNt;k6us%G`-V9r[ PȬ :~#Wff'ZHbI%ڰ蓠:ғBjNR{zPe}@rVi`Tr4>e(W!zv йVx"A>sBw~(|E;NhսBj {46Ćf^VyT;((+ QȬJD٫[nOAZJ)>A5ftJ}H^a-<^p]@U%53Py_ ~EyZМY;; x1 ^vVN\16^ T~ m<'i2(tv'FN!{~gͪ4&9U,apw*EuH,ţcTXhjN 6Nvr#uШ'!M jm_ήnw1ֻGobnrX9bY#9^'`3yKnEDbZt@aY6,t9.6  PRͫl:Nhʄ$aB09icq|dCYXQS-&>_.9oӻD 坚̇Щ lk= MYʈzrdb }oQ|6hCBdo^89`̈́[/~w턆F N7 ?<5G-َZ2xb_jk>: 0/ R Ae"Gi˂O.bɾ(0#"Qa,aYoCZZ >zhLw!`a%x1dr_q*k1WDQϢ)g)̆oju`c Q7(HnD/v}=>\0F3:[cuZekW{!r>5y V8~mm-Ǥ~cBBKQľ<'xy].ΰjЭ !3PMw 3bp KӼ )Q" Io>g;ES*)tdp[i{@ω_a<\ K̬{?׹YڿR0Ed/UE}UǭebJi1R?S)}{q/Ig |7WMADyl%}0搠ч!?Iu֗X3-[D Nh'wqMh*jB xwxRȃ"~('Fعn,0qiΜ7 0+crZ^̝]g8oy@U a*d?y =&6Cch& ;9{(bbFgi49k.րBx|.z9dFW;#&Ao45}`wv9Qya=0M1,\ #f?#'GJQцb_*8uVV_-XtG{J5}h{7 bz练,%OF)=:ǯM@3rT%k3hM ꫘qK`mdVՋ+2adyHJ3s0{tl3K([1?O3.ljÆ(̀aL%/L1xg1~Fz`5tHNW0GmaiɽPsyƑ(PyU^#FU qOk쒚yCxtF$N#? F!1~ t_ DꭧP#ǥh>-GJ1drb gą=IF)|(+:-N^Ltș؜q#"A.;xȢdq8]hghOxX_Y #&NF@R=@`_)KmLَ=hiO|E|+ZH+wز^-9ڪReNm[!RRfj`PPugQ>kڕBY /+~if+,=Fj-eUK&}E4]Ω5x_=MQ? )?sHгqբC}U*E<}}**گwY}XD`(^3ÙeK,A /2jL_x4,j' F#aL{?' -* sh@*BX8@ ISG r%y|*E Fߕ.Cp/"gxFwk_ x]UT"pl%c' e2\ {xGt/vR47vo[٭„qQ6u* 9.b.> iɲQ%mf T`˴;2.eῘSܣ)T -ߪ:k.rBɤgp<1!WgfڌXN&Y ӪM)m`ziQ/(ԞG9Ud0>% iSR:׆i4JNڂ}ojcUؽoB*Rl阮+œgppTA>`ɼp{^9 L}t2H &WKP(gBF;#3)¢YG[E] wܓ ..f"p0Ia7l~|U3iW|'q~:Pʑ XڢE]diTq/ 8j`٘Hh 55taG?qF 0#H:6o4 %C)x[K:LO 9}p?8 Aͥ`tQn3# G OWȝ."D B\pć&I Q*hm fv揰- $c.禟P D5 vڅ'^ٟ}UsG>;ɁvLߎ?yvs#6hE}'/,h2P,3PQ((;hk!f]0Bl^5>4"c:1faֱ%tiD(F8=Ovj<,*DQ(eN5]|*ܐZڊ(uîQ,zT⅀,_jpd+JeK;>ڧ`,gAM+  B&w֋'NdSt/r$ Rt ԈҒd0B{&t#L:;~!ƂeLA77<o-B;N~ krFP0 n9%{%X$K7bcvU[;8s]G*`ƝǵTPu<׹"ԯ<7jv_^yvm4"S) 3rGB&-F|91O. B\Na 8l4!wC;01㻏jÎ)L5vr[ҋ;g87l*)|5"PxOe]iZQRTV۾ B@p+'<:dT0*z [6S~<7@/6 71:+ m?=$8/هdY G /ϸXo\H]#0 | eީlػ(2e'L1OR ЌXH8o *5JqVu7';1gi99 #7[~M.6\}W"Žf۶8J|w\DQIW[?NA7V(wbgt=c{+x4@ $#( `u{kgr00Ͳq7Ρ'B u] #\aze!>nh<(v Cl(C } ? ;BWW+Z@|j4{S9ФY$C})rYoTֹ`J{ v9ib|\lm1_k.Np54Mf;5[9!{;6OsqU)fpϟt9e,\-b> ˼/Ae>x)!T*<Q.C;s;{)N'/%Wٱ`ͳ=YOKݡ" lb`"S c9|Km#N$'ğ)ˢ|¾V542вwEcf;+B*#Q07du?/:)ifܿOnfEJ{\V޺Os{t$x8F,'=<ɡ1 Kܙ%+;_'Nə=}%{0z @9`HNdVp>O西x慀.NZjc^ `[gOSGW }6̝-ʹEW ssfSpkS IaiS0tUzŇxb/`1 KTEy=e[WzYm>/>F]JSp-wض-.żEh %m0CTS0ۖ!y(xJ _Lw;++9)ۈ!*^;G*'c\de7pWw"/ YހS4AQg[M>%3djaBF7',Q|i7"T0~0HK\w WZȫ#F?֓$o?nhbJA }?nia0SfDQJnj[+u%s:ָ}3vIi)XUC˃.4dC+Y!i ޠ5L$Tm P(W[f q٫<{ /(8I۵ Wd v8A^~5`<^$ 8=\^CI"*zϭBw==}J/wU2=ޒ$ +- 8r"+R9;AκF~$|hOary#3v7s /k(ʖ_e-hRT̫]xpT[O3%1^E+p1xI7;Fr~rPN#XCu 2n ˔B1PqS[TYAgĈ2 --$Ni/s,=ӟp0U hk6:eHQyu_]FI~L XzSg<¢K`)`Q\PVRe6&oKw;*A@ jB܍E3߆Q^!- }2OT>4}0${{G.>mXv&o _ɖgQ2Kdxo~qH}+72*]oysHb .fMg#Eʢ*\C4U+-ϖk f)#SyڇC#ܥ}CZ6R̉#0}ePbb>^{S2~wq>؆kI >2fw_h>VTf7 <1WS(en'+s44D /~\8C1iMY1G aWt0>9HPd|BfR֙ BHE}眉mѼG$?w:(Z:P=TT gLKWBSgg}35%z,T€Cߨs^kbfLo >ڄiO! 8v$Q D@?ZֽPBq #$|FF/73 76I[k<6F,9=v8MY=&:hozC[Bp߶/i[£o8LeU۝>^rzKVn僱m{_4I&{@rics=Cv7>Muo;I]ן='v${ 0P/w7wXu1ǩåB|κX{9)Vt6O;@Tz"зfYMWa)K>gohJ/'Txs7!7b0IqJ(}j_<JWj)VH4ȋ5 "5ldʙ3lGIia70$CXSgC.;δayD㜪7IlVliUp DP81zvbePw1lN vJ++^q!G4R[84DOyF~מ]l?hX?9 1cĵz,jiF}:G4" P?Z|b`?~#v6oʐRd RU)%G9t\n>P$ԇ l0>(IvH"-i<ř~Qf/u>hݚC@26uasZln6 ,{|Ńc7 +:ԌK}JEf[zZ(5q:$l_"pZP~1.^nQ \b MIfV<걆Wy)&JcĽF/C%kTʜ۹׼_s׍^KH~AR˔IB@ n[d&RaB2(҃  YaFmCrIґ@+lkJ+2JAQ`ˉͱ/LiE~[\.WK='x'S \v$PG8F; ?XJޭoQԧ2n q5vSsOli}%U[\DSu@J*@S-h+{\Ő0cDtt_U98li$.AX k4h h{)ޡ,z_%)?ޥb3 /=* n)ڥ}Ŀ`eY5&Z=U»Ú+=7H M#k{gSq+B/CD^+zHU܆YxRH |ԗdxkn=Zdg0m$wяyɳ}{F@+wrE,UZo?(ܜK>uM(`K~APt5(U!8 ꨩ9#.GX,GSp]Kc3;iAb *SiGf1!5|;(8b6Ljnn'#J6%jR/IkHujXX?x51s-5n"ÁiJ *~ִpFZCQ>Esɡ\r&@aT}xR3^Y~_`jۆ]5T̋A驓Eq{{dMr4iLz"Uj<{4u ?->BׯS ̥[C.̒`8J5GLq?c?&R7J;FbIz}UĂqM;.Y4&ˁ{ +HuD&,U(>p.U:E]4舟`@Qdb&&3 I{t&ȁs_#a[HDk3n\j8 2IdlfB0Hs:O8x\NyYKpDk+膳^Zf˅R# LDӠ{ER3В,HMtLeXM 2jg>FM% :%(":|u5wn[y'insYY8WT%鶸'7E@C:3R^B Q~!-S7Z-/d;75qG *Oΐ!*ӝb{9I|ު8{pdBD1AD<ع^N(0qS]1EeVS{TaÂ9L|z&DMhB8}B( оBLBǢE@$X $&eo6jzkT)e?Chm];j2󃒺 ݝ.B]9AMaG M 6A{IysjHԍV/? d~(#Xd,CsǒuTuY! .L}CQ,SYzpߦz!a!)G2Pa'xr:\a*k9ǰ)@$C:Wn9 VC3%W@:;PȤg4 YHFzzPx*;l[}cH-5| ށ57/F2|y@7?ws+reB!ͧ@B 8!O;bC@c;igͿ|^xWYBv><ʷVhײjd2/J,_Y>,S18T?^rR]F25Bt Cgܽ@$re/bȓ$pU˸xAT+ Aǃ@Gv }\,ζ!e\y>ZwmR*F,Pgrh!bv?jc LEf\ UB73 =Vb1`(od%@U-]hwXmYKm\vs U呶A7*mfVuۭklh\}azaT ' FuGR,\xhmDV7`:ßʊ-+0=[,x'Q!>˺e)=zh6B5 ܊6zr_!fڴJSo@ ;'q-謆ll1^ lW7* ,=m {`Wl&q'sLˑ ں.[\ !)ݾZH] #qWTʜmUi<*NHCbS0eظƷ忘 LQ,oѧϐm̛j=x!mxA:O(HN4}֝:A)܁Fj2Ů1!g0 d0@؞he+K@k; Q1fP)+4UcE ŞJvx`ԉ=){Ak(b~RPb<ׂ$%ړVRW;v:i[gA f=^s9tixG,;*T; E&2F_[7O<8@zOѦ-YY?v/p^a=X$7u2 uRSURմ4+3H>1~}?_"߯ʭ˿Ħx:fO)M죰`7lfuAn2. J_u[dxQ7q?RጴS#DKL7Nי,{d6 LL*ؼ]mfXM7/[^ z UiݴtZD3v~'d~.Dݳ5;gc^Dko F3G> - *[)M'.Sc/3Hne8жb]=IRUOLUr@h:G@ĬJa ܀J͖DiZ*:g7)r5XOWbCgswr,٦i~!-PhUNj [v>clOO iD]5@+%m14}#\G;94`=p}h wqã B ^r&-͓0^H F HZϗelQ;.Nlx.+`G!V:c@7ht͐qj!oh}}ςE.z1h@=췞wf>p|,,"ZȵC3^UG 6+4-ցMC(ź{Ǡ@!|r~ +KxD$tFKnf:J 1WU'$6R>);mXXv̀)0_*e w L/4ˎ"h3ЋDjߘ 0i˂4bI&Yf՚(QπS6d-v?+:x^2@g:~Z*l&tMiA*L-7ŁJ =#ijؙu s:zӥV~ Lp`׻"mv~l-dȑqjm[¼_4zGx0~~Gl8UB0lA{RamMWN-L4α9YjgyG,qmca1Q=*Z#!#(uS|(cʕh+b|udbRMh2#ޅW-y\JT.Z`p,;;#V&~d #44xKAbzCK;))pV^Y٭+,DZ4i$nWu M~'%S0AJA/ic@UPwMtJ4?{)+ur9ɳ}6\n2P`cD4 -*3&Jd+wfldg$}˔9' P58 ޳Da[7Ds\:*dH1G%?X0xE,>vFT'Vkֽ٘`g;Re0}EI(4kIvGOvZyUt{ƺpDZ R?ʐaTX m,uOGS?l#9y f;?4=r'檄즑%;8WZtN6\ i?ӊ2ppY6(o6(~[U Y"YpЛ?)8uj$FRGC)ѩm@ (qSnX3 \XՔDDlY[áI@P="x+?væh0dC(l;:x&FL ޓQimw!H$imuhWq?kOrAffX<ܒ`O.B(K!W3\P|Ă4Mj5ZO*O5xba* I* ե=ug$./A=W[?",D VLOm4:L MCYSZ'TU'˰Y# -t4$ .;泝JuzUM{Prqy_*v#9ޞ>$PrƍK<`֡ɀ 7,z7:2+YE26RN Y\dRD sY>}R94HY}Ρ,H::pͲ>koǨZpʯԻ^ >S@PEATU6Z#^J ڄ*:cNEl05i v}/KOwŧ~_Onq8wB(@U+@pWClv$,{ψ\n1*?񆍶ćȪp@zk  CڷRka6sTY3'L0+yj9/_oTNj10˩vU\"|Y@_spl^J #q"'˚ّ̌{4M;#{8 5 _TqËo\e|hmlY1L*٬Yϙ*#ܣ lZn^ }0=0Od˞W,Y]pmiiws_?t/Z18OJOGڧ['Tz|?R|>v'ԟ8t+`'`P$|}rey@ǝp?D@"2ɹ0xp,#׻2Näjj[=wYHD͡dEj{

)}fx}q=3 #p?IifO0? ئ>yt OޣJoݔBy˯bv &v̊&غKPn1PոK&#LES 51 "2Lgec~w5П,>\x9}%}ӉCDQ&+"@b<@_]؍=k灗D\`MJn+2QW)H訦ywvL&p(X:~Vi&>g ,s%oKY;4s3ȷrSp reNn)i|3p{< &0^LZ.U-.|y81h0׽代w/0sqO R>pх%$>C>Br9AI>Q03U""9]t ~Z/Ӗx=ꜽ; F8ю(02 #4dGP[ r"-lwF$uK>K/ J3 jP|:.Q? v)P*p:qw'f?J%jL+a[O>fG \ őK9hƷfT!Ѩv Dq_J"iWy%XU0OBNĜE) 6Hd5f1X69b9A~.V!8kVKkj6]hn +o܎&FO5khQ MsoOo&Q=GU&sn3Z $f|0Ax[@×%8aPyGv5`qje}/(t",;\kvubB߄`_q*um*8Tt "k$l%/(6eGȫutà -݀=CaKG3T@kfaonG3(٭8t6~Mb 9DTF}hm@" ܶ˽,ڍ1F5ANNH0gmJA?3;J,53hu)GZ3>r$VV<4hW]ɛ=BN.Ϭ8Yt/Xfb3+Ie2psaYQG\0 g9XoוJt2Ŷu͠ XVfx4|I*( .&pc~y#xJqGj}mا#}e/9&\:ܟӋL KJ(wU@? 1Ox~gXT=n%[]#]"bQ*k.{wV:Z ^̎ jv˶b7c;ZZQEy=VȯV<еp,OQ߼6#~];>Øt^w,3 g&L! ;Hp{+ ,AD<Wu~/Ink6$d?+  BW%5dUlx פW }em# _mdOd6T{b0w6E2Unǻ2!Z0D6e( )*}\pD|czGQ  r1lqv#$rS_swBi}eo7%%U48Ƿ׈zX}޺T|nel$ a2V?]67 iڦB_c0[<˔U>\Dzm8Q'"uC-R7|v9LM[KI Kf._ 0&lv_R+ \[oH3V (W>c%ՙRO$Y}'Q&EZh58?D&, sԍޱlˁ^;x: ͣ pU5:^bZc:AXDE>Gl6ufe. (Wgy1E֌ E/8CܫptcDm{*lK--9%GebKd{[_f_{c2u.EF6,̸ Ѡ횫xm{A>R5A#/k*z~B=1R#gI^XpyA:;X&s_Nr \3!0\ܩSN%-bqخNho\_s#^THY˰6eZ?ҡNv!AKOkc>wߐĭ?Kɤ}Fh|h󅠬iS*U7.BU]\䭬J>~r);sK3)g B8|_X`u/<4|8t㩢 d͞ޯNWP1YSn9'A)4Ҍ)>|EihmS})uTP ){ *>>ƬlQ]s^}X a6wIw}3̑^nh }31n'VrkjZG*ݽ}cg\ZlQer&F{Ԋ5v6Nt=Ef_r+Y4P"}ioI}_vxѪazTݐz% -^4LVfV[VAƧ&ũP9 qĚ7rhʜfwe&!bF~ :jsrτWf[ej_jN*{'!#gpܴT0f؛aaRf S "V_rq2Pve,.7dmEuK&AR],7XhfN+*tXDsש_DB@o;Rl k:cC9KXFS!,$ ڍԮrSP"R$+r,h`6!$lp߳jCuYd VO?i0 5Lӛ` }w:@edeFNߎUg%Ξ# `!2b]1 ^rKzk6FAiZ @]i Ni,l6eUǤcF )#G*8Ov%@g:||f^fre*}iJ([5-#v /D9/It/2":`.`|1.7VJxbD針ޑ1OM9B4#Wi-HkZ[RݫŀC2hCFhVoL6J)䉵!foCx|qf<Xo))L8 vI, UKA>D9fvge\ryk~ȕM V- Xzip臈מ^BtX]㧉q.ؑ3$9TZ8{z :ƕZ!P}'y\/\^u;nfһǎmW(dS6Ogx.LFM۶eoPCeOs3JZʔi +[hvvtL!r1#Y|8iYScM23O'tHd wC͊փ*=t{ J(k ;uC #Y\*/clP@:|HLŵyA Z /C*#~Lm/д66?cʪ^ {Pw>)/#٨Sb7HK<]|=E!+LIQcmn_Ey`˕mE1Qr1R ЌXH7$Ezݽ|gm2/17x!aa{)h N2hb:Jv E̡\Tq醍QC5EDs-͈/7Q  )f[=4x8Lh9'EDZ |z0c,-(L1B#d0SqֆE ZtKhK'"JEY)_cŰ7BTtUMn,u #oЦ" P#-8^5./\CE&톝P-6ˊteod-z,2Bºi\}Du^dBiF3FZYBp}Ճۑd39;&I=Q]^}pbA(_qSٝ]_ 5T3ĒܺtɧBΗB򐁖S4Qʸ(;'j|ϒWMsWH X`}>ǧ[k+Xw1v<\a)XXETs=*.NNM?!*0?gR :Q'_1",Ta%E"J_e{w$,v—f5'c-/!3_:b26T&.p1!5] WeW2V61!N,bTL&$ )]- pBfX鵳RV:v2㳨kVJ^`7C]/eI.7AHcb!M`T Ԁl8}g40(ΛY#wt,l] اgOՏ8V _G Q\P֖>XYVb']!Lp}anZ#Daq;f3yegOz2[&ڣtbߓ}UdvyʲIҮYf%(/KUr'i}e;2mk + A6~5Z[W62CwFRt\tzDV*rF)|qiW;c U96snk|MH|{z*3"w|u-WƀJRJK)Ȯv$"Vl2 ٞ vr?ARGjXtn0ٚOп%Zp ;ˇ FVxXO1AȻfPvWȬ&3aĹ^bmH*p2SAΫbЏz>+`Y %A맷*% ["7vUvG)֦kj"bܓl#3i͡~[AaoRk>m4Έ$uQ _LP/㋄ỗ&b^pjU6F8`dJ 8uWfB̮ LpwNVnd~i%J+pz45WDJgaFt*l3m҈jtF'0I6ERaҳոj핳p !3A^6zIvaTr*=hNXD@(qYtN( a6ZJ4>Igh+%_JG [hNO -wpPN3 dU"22 Ps{dQ &ݍO{u,JZi=vfwkEߗ`p 2Z?=2l_9$+U-n=[:Mx-f-iL5q JDx}M2#W뷿QFsLZihyԡU[gmqgBڔYa z>6,ˣ?f̺ aՖv- 3j+Dr~,ܛqoP2'.C}ώ(^XayЇ?#S|zI,{mN5hZi<"YeY+@˕OeŲuI| s1a+1KhG㚾.HToJ1iM{u3(L&12%q+gfJONJR1*G*հӣyV=؄Lߴt0)x&e JVl PKuȪ\VP?Zm|#M2OÐѺ s>!17x(NP Mmv]c 2fXLlaB^fbsN3N9p`-~޴'5!gc$nh6K&3X)8C+# ʰ4cj%Z䟾`Zzŧ Yԭ9%akhlP &ʴyNLAWxv&/l p1xʆEksw+ I.;@8 +Ӎaxޖc=,'KWo 3XXEiTI$duOGR1/;쏡,sN\6`PU06J[9WGO?Hp:J7=o%[D=L?_/G $?%[Ȓ!]$^Һ.,%AR7wcb*o'4n;G +%aްQzY} p2tw XAͥd5(l>vD!=4[0d.D8-2LmہupfC\G0o?.N))ZDGAaNLHT0bBUG , 'B\[PQ9c |0Gm`z~(GdXy:p֛i쨚(F0\.=H^OHaWF]Gb.Q=ڋz%" v}BZ"ht ^*lEa+]GpboQs+ڇŽ:?~dd;m=A*C:nRw|]qL[r6F|7?<+Ps X9k@A'ANlLxKm&@aC(Lg97~'tmzwJڪ=δcf<ޑ TMwцcn hOO"$틧8,z 嫍L.\W]}[KCK>qa@֜)Xgݏu3~SnIG϶!X8}~$2tAڷZhz[83l8$ 'RPcIi$1Λ@`d<'$ˆpȫ]ku },>Va>z 빠MmyP@жY[Rgy-wcuV"2͏8"IvTC v@@ *KOIr$ܟt[ٲ{دA&ZXp01P`*m!0@!pK6M=p<!(Sq#Vr;<0|Ciw TE?5E͂:%"bbS } MaƻV$a{>MB>:)H] _eYNi`' WLPR(WjGA9Sbd]n3$zyU:8zASI3@ۯȥ\5>M-beJ;i*g3)0%sJ-. Z_+bb ԙ8~PcnNygr|b؞U!՝_Q`4ui)s}p+zP؃&wۨFwV2NJt}v|ۿ5ٜ1;aCis <2?q#2> P*^ʃ҅U6U*Ƃ_e%A )w %}) 3XcD6C4y"7,UWpo~~ޖ!9%a3;ֲ fĜQcl$pM ˜`?햏J1f0 Ղp`uTI0Mc \A2`f2~uaA+h3g)dާP%`OlAfh9bh9K" {?7a cAoX,*04*=v\W(H 6N/7q몊'ޯ>]8a!O[Ӥ_2KܬX.;駪$O9|m`\}99`շ(n"@CITQpSZl KGi@dH$i2?EdN֏tzz*+ ;2QvaV+sfg1qOlkUZ)0bC{8lB$қw_27듲 Ӂ%H6u~EeoKBna4x:\ZK n:XؖA6kčIl-l #"'XnX hle&5?#h9FIyD!AJ-[PXX>?0W0.{@_*7Fp\*@#ncrZdФpN?7wpR5j2~(%@/HMtLeXM`2jgiOn.\5+<0QTfB_( IM ;>N>n+g!#ۜ^&uN?w OdE,ɗh891b "~=~ b-뼈ʼ'J@> ;D8Y,fHD~aBЄ RwՈ-&UAB #?/鱖;:~w? h :2'J b- SJmԟ]1GH Q]BSC|=JSn:lt$c9Ǽ}X<|ըJ+['ÙB>{V)FqZcKc:Q`vAȵԛkA W{YP E© 0)E?mhx5v#IŨ?x:3{5 d * G/iÐ$,Y?YV1  (E|I3hY)–R 2D6bQXqq:LM{i6C[Z ̾Ls7;:nR-P )NqVxrkp(- h Z}d=4":q/ 79D%Ŵlh69ڎDAoUU|FɮW'ez_ZASv50qkt,kSJwiw &݌1d4Y1`oqv\HSWX]Ise=;F_? ӛ?5;`,\E@w3@.NIlD@O82lƛ i\Q&nb _qX z;l8i D /"ܐkRq-ƣ͙ #@/:W\-/w~z2M {n⃙fM$J~p ,[?+{ %'!OA~PqY*ם<*!_&чqv~.1ƶ֣)()kh*|ana2bYkw lHAobhsj6wQz!%Ԛ@,}"'hWPiTWW8 Ê:Y ޣm rHIE@M;O M,C;$Z(=eKd|Bp8I "66 qoķĜxÅؿZ4܎tlF]MgF7y/A E9HQi&Y}Xt a䀛.R[ŎYHˎr*y.Yͺ>#E/KV|WJM ?ShMG`|}?lVz6K?u!9]=x2 ^ {}*a/QN+J#969X&i|bL[ %[w8u7#u! mO2>d1i Nq?ӎ* -QÐK O\H- @] \M-Q# ds+Z+&^]ӓݓNlDE/p£~b֎geII|wM$#ٍ̳v-)CCz/ "J{%Xms9Ula^O7 WF%,І%H1؎9r :!˳N֋d?u{su<|nR=,2pMQ7("CwZpHb &.wlrqfͪvw伏{b 8^\gu2"lյTq*CHp^nDVS`$!xA/5 WQuSq?{XXO`U+a nhLvR B2%;iy$H8HNBAcMYM!m^9,(@He(A6NTX g$W,R/ =?hLa(ﺰ*Y-"r;oepJ'EsS1{]$L?XypCRڠ!^M6't,9D^va\),Ott۩4)>Q+*o Z^}<BMP~ ]#&氩u}d8rSW=r$K_IJ87Ccȷ~e2nV b T=z|<)qpG0ȾXLJŰ'EŻ? "H֑"xO [!qIN@tՌqM^qBKXedv@2wh{f^}ƪX cdbx0<MckƎSf[uS{$U@GHX? ћ9VӒnNXH(}/|z}/ 0Ff'Y5%JgqQ@~ϒiMG'i `M^4@l*$N5f"5j%VEy:<95&ًVV!~IBH z&8% >is/Fm +{dtPavjY|I+X) <Ƹ- i7!Ἆ}@g5M'opn”\NI ?HܳG̜{ª +PN5pqnϚO>:q)hn'U-s'ݍ:!%M.V[eY<梾 h0ZKS,l`~,j~pp£F0l.vz`@4$Bw]۔'.uAZ[C͸l%!W#Y\ƾf+H#>Uu8aO8mwaAFC x7+YS:P Sѩ;5]ܥܚ`}Q?'NfA)|Q:\ c~'/DDIdyov@/&81Xҫ( GI!/Oxӕ} X@mAƮK,kNx"`V\~;NW' f&Q[{hq} . 0`y&J35`=&?S+J,-ą`9Gi@sЕ?pwV6?qCNjbymZ{sJڵp.9U}ɑȅRpEOo_Î!А hc1Rknͫ3WIS|ru0=?(LF-ϗDqi/ k]T`v18VE#*1_$!lyg9-*f k9q~Lz1l94Hڷ&ܫ0cR̭x\cg?^GkmT?wjʔHBL T8oxx.]r})z7$2݀R#c6L˽R[ 7`6:^T*[s,5KQ,JNR٬ WIz'UMov; ߯QrD`eF4tm;gf̟ϼI0sMM)ڱ+ozVkco<*SUȑjJ>վP:6(Ff3jU#{ 'sDdjxJ @?%dɱֶF1{ąqp-̵qesxѱ ॴȅgME+gSA3 ,,Kԣå٥ܑwD]hc{I<\1pwS`k,U.Uɪ.*csFfSpN,t-S5?3_GS $UX|7WSIyNm*TAadg4*X7M#CwvV=PdgXЈWz>&fF@GKZ@ {ΕL@l5Zc| Grh_I)H&gZtOMpT`%Dυ[d Cj[ ^q=g`IX󢦝qq[k3Ÿj%\H&oN*#IZa&"|G'j4eiwC?joaEm/\_QtyGwpPaK!t+`0@~ PxэMD=6)F83_jC5 As%ml95/Z=#8i;#?oTx=T +vP(Lc2{u:NR@ia ~L]Ik=bJ8 sF gDocax.9a+z)L @f#DgKo^hx*h>; ĵ/1O,gpehEňٮynP//ɨePs WNJrT$XӳV&|]}Yy4mTQl6 al5 Dp,1O,gpehEňٮ1. BBLbHK0I-nooo1O)aKq$d!JZL& YHK&3gBێEU=d4IDE1R mnUXH:h%-q9-X [j^JL'a`? ۯo9NEa6qV{cެR;+6z. ~ $$"19X0R {N~x/`B-A|yò͈P}7p{̺cKDP%sPfeiaƆn|wyhn) i8c}ie2 rWL ]eH#BƗS{vj1kPحKK0GOv~'} \55~ [al+}' AP"F{M`1及s;`B٩l00?eX2vݰE~Ç:#.@ $%HJ$:#.@ $%HJ$^uղH "-<ʝmsgH0b+"aK5r:`=[ RY$4JKʗ1aO5/oQJR<0;U]2aHڃw|(2|A4\ؤUj2)r-"DvSX=َ EDžc88 ^[ƹgaѶ6^]`kKSchd6 Ih.7a^l*u#3,] U 1J+JV־ss4Tr56/jS[xɐMa8}/dxI)JLoSYr Y@{~乙!B&dh>훸Ot&H"%ҷ]2/Sѓ""n-HLhwIBx^Xa%|4D pfX$$0_ٲOicnV Bffdesmume-0.9.9/src/cocoa/FileTypeInfo.plist0000644000175000017500000001727412140261603021215 0ustar guillaumeguillaume VersionStrings 0.9.6 0.9.7 0.9.8 0.9.9 PortStrings 0.9.6 GTK 0.9.7 Cocoa 0.9.8 Cocoa OpenEmu 0.9.9 Cocoa OpenEmu DefaultPaths 0.9.6 GTK ROM Save ~/.config/desmume Cheat ~/.config/desmume Save State ~/.config/desmume 0.9.7 Cocoa ROM Save ${WITHROM} Save State ${APPSUPPORT} 0.9.8 Cocoa ROM Save ${APPSUPPORT} Cheat ${APPSUPPORT} Firmware Configuration ${APPSUPPORT} Save State ${APPSUPPORT} OpenEmu ROM Save ${OPENEMU} Save State ${OPENEMU} 0.9.9 Cocoa ROM Save ${APPSUPPORT} Cheat ${APPSUPPORT} Firmware Configuration ${APPSUPPORT} Save State ${APPSUPPORT} OpenEmu ROM Save ${OPENEMU} Save State ${OPENEMU} DirectoryNames 0.9.6 GTK ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples 0.9.7 Cocoa ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples 0.9.8 Cocoa ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples 0.9.9 Cocoa ROM Save Battery Cheat Cheats Firmware Configuration Battery Lua Script Lua Video AviFiles R4 Format R4format ROM Roms Save State States Screenshot Screenshots Sound Sample SoundSamples FileExtensionByTypes 0.9.6 GTK ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds 0.9.7 Cocoa ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds 0.9.8 Cocoa ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds 0.9.9 Cocoa ROM Save dsv Cheat dct Firmware Configuration dfc Lua Script lua Save State dst ROM nds FileTypeByExtensions 0.9.6 GTK dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM 0.9.7 Cocoa dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM 0.9.8 Cocoa dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM 0.9.9 Cocoa dsv ROM Save dct Cheat dfc Firmware Configuration lua Lua Script dst Save State nds ROM desmume-0.9.9/src/cocoa/ringbuffer.cpp0000644000175000017500000001547712140261603020443 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "ringbuffer.h" #include #include RingBuffer::RingBuffer(const size_t numberElements, const size_t newBufferElementSize) { _elementCapacity = numberElements; _elementSize = newBufferElementSize; _buffer = (uint8_t *)calloc(numberElements + 2, newBufferElementSize); _bufferSize = (numberElements + 2) * newBufferElementSize; _readPosition = 0; _writePosition = 1; _elementFillCount = 0; } RingBuffer::~RingBuffer() { free(_buffer); _buffer = NULL; } void RingBuffer::clear() { this->_readPosition = 0; this->_writePosition = 1; this->_elementFillCount = 0; memset(_buffer, 0, this->_bufferSize); } size_t RingBuffer::read(void *__restrict__ destBuffer, size_t requestedNumberElements) { if (destBuffer == NULL) { return 0; } size_t hiElementsAvailable = 0; size_t loElementsAvailable = 0; const uint8_t *__restrict__ inputData = this->_buffer; size_t inputDataReadPos = this->_readPosition; const size_t inputDataWritePos = this->_writePosition; const size_t inputDataSize = this->_elementCapacity + 2; // Check buffer availability if (inputDataReadPos < inputDataWritePos) { hiElementsAvailable = inputDataWritePos - inputDataReadPos - 1; } else if (inputDataReadPos > inputDataWritePos) { hiElementsAvailable = inputDataSize - inputDataReadPos - 1; loElementsAvailable = inputDataWritePos; } else { return requestedNumberElements; } // Bounds check for buffer overrun if (requestedNumberElements > hiElementsAvailable + loElementsAvailable) { requestedNumberElements = hiElementsAvailable + loElementsAvailable; } if (requestedNumberElements == 0) { return requestedNumberElements; } // Copy ring buffer to destination buffer if (requestedNumberElements <= hiElementsAvailable) { memcpy(destBuffer, inputData + ((inputDataReadPos + 1) * this->_elementSize), requestedNumberElements * this->_elementSize); } else { memcpy(destBuffer, inputData + ((inputDataReadPos + 1) * this->_elementSize), hiElementsAvailable * this->_elementSize); memcpy((uint8_t *)destBuffer + (hiElementsAvailable * this->_elementSize), inputData, (requestedNumberElements - hiElementsAvailable) * this->_elementSize); } // Advance the read position inputDataReadPos += requestedNumberElements; if (inputDataReadPos >= inputDataSize) { inputDataReadPos -= inputDataSize; } this->_readPosition = inputDataReadPos; // Decrease the fill size now that we're done reading. OSAtomicAdd32Barrier(-(int32_t)requestedNumberElements, &this->_elementFillCount); return requestedNumberElements; } size_t RingBuffer::write(const void *__restrict__ srcBuffer, size_t requestedNumberElements) { if (srcBuffer == NULL) { return 0; } size_t hiElementsAvailable = 0; size_t loElementsAvailable = 0; uint8_t *__restrict__ inputData = this->_buffer; const size_t inputDataReadPos = this->_readPosition; size_t inputDataWritePos = this->_writePosition; const size_t inputDataSize = this->_elementCapacity + 2; // Check buffer availability. if (inputDataWritePos > inputDataReadPos) { hiElementsAvailable = inputDataSize - inputDataWritePos; loElementsAvailable = (inputDataReadPos > 0) ? inputDataReadPos - 1 : 0; } else if (inputDataWritePos < inputDataReadPos) { hiElementsAvailable = inputDataReadPos - inputDataWritePos - 1; } else { return requestedNumberElements; } // Bounds check for buffer overrun if (requestedNumberElements > hiElementsAvailable + loElementsAvailable) { requestedNumberElements = hiElementsAvailable + loElementsAvailable; } if (requestedNumberElements == 0) { return requestedNumberElements; } // Increase the fill size before writing anything. OSAtomicAdd32Barrier((int32_t)requestedNumberElements, &this->_elementFillCount); // Copy source buffer to ring buffer. if (requestedNumberElements <= hiElementsAvailable) { memcpy(inputData + (inputDataWritePos * this->_elementSize), srcBuffer, requestedNumberElements * this->_elementSize); } else { memcpy(inputData + (inputDataWritePos * this->_elementSize), srcBuffer, hiElementsAvailable * this->_elementSize); memcpy(inputData, (uint8_t *)srcBuffer + (hiElementsAvailable * this->_elementSize), (requestedNumberElements - hiElementsAvailable) * this->_elementSize); } // Advance the write position. inputDataWritePos += requestedNumberElements; if (inputDataWritePos > inputDataSize) { inputDataWritePos -= inputDataSize; } this->_writePosition = inputDataWritePos; return requestedNumberElements; } size_t RingBuffer::drop(size_t requestedNumberElements) { size_t hiElementsAvailable = 0; size_t loElementsAvailable = 0; size_t inputDataReadPos = this->_readPosition; const size_t inputDataWritePos = this->_writePosition; const size_t inputDataSize = this->_elementCapacity + 2; // Check buffer availability if (inputDataReadPos < inputDataWritePos) { hiElementsAvailable = inputDataWritePos - inputDataReadPos - 1; } else if (inputDataReadPos > inputDataWritePos) { hiElementsAvailable = inputDataSize - inputDataReadPos - 1; loElementsAvailable = inputDataWritePos; } else { return requestedNumberElements; } // Bounds check for buffer overrun if (requestedNumberElements > hiElementsAvailable + loElementsAvailable) { requestedNumberElements = hiElementsAvailable + loElementsAvailable; } if (requestedNumberElements == 0) { return requestedNumberElements; } // Advance the read position inputDataReadPos += requestedNumberElements; if (inputDataReadPos >= inputDataSize) { inputDataReadPos -= inputDataSize; } this->_readPosition = inputDataReadPos; // Decrease the fill size now that we're done reading. OSAtomicAdd32Barrier(-(int32_t)requestedNumberElements, &this->_elementFillCount); return requestedNumberElements; } size_t RingBuffer::getAvailableElements() const { return (this->_elementCapacity - this->_elementFillCount); } size_t RingBuffer::getElementCapacity() const { return this->_elementCapacity; } size_t RingBuffer::getElementSize() const { return this->_elementSize; } bool RingBuffer::isEmpty() const { return (this->_elementFillCount == 0); } bool RingBuffer::isFull() const { return ((size_t)this->_elementFillCount >= this->_elementCapacity); } desmume-0.9.9/src/cocoa/video_output_view_legacy.h0000644000175000017500000000446412140261603023055 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif //This class uses OpenGL for drawing for speed //if opengl is not available it uses NSImage @class ScreenState; @class CocoaDSController; @interface VideoOutputView : #ifdef HAVE_OPENGL NSView #else NSImageView #endif { #ifdef HAVE_OPENGL NSOpenGLContext* context; #endif ScreenState *screen_buffer; double viewScale; double viewRotation; NSInteger displayMode; UInt32 gpuStateFlags; CocoaDSController *cdsController; } //init - (id)initWithFrame:(NSRect)frame; //image to display - (void)setScreenState:(ScreenState*)screen; - (const ScreenState*)screenState; //size in pixels of screen display (disreguarding rotation of the view) - (float)screenHeight; - (float)screenWidth; - (NSSize) normalSize; - (void) setScale:(double)scalar; - (double) scale; - (void) setRotation:(double)angleDegrees; - (double) rotation; - (void) setDisplayMode:(NSInteger)theMode; - (NSInteger) displayMode; - (void) setGpuStateFlags:(UInt32)flags; - (UInt32) gpuStateFlags; - (void) setCdsController:(CocoaDSController *)theController; - (CocoaDSController*) cdsController; - (void) setViewToBlack; - (void) setViewToWhite; - (BOOL) gpuStateByBit:(UInt32)stateBit; - (NSPoint) convertPointToDS:(NSPoint)touchLoc; @end #ifdef __cplusplus extern "C" { #endif void SetGPULayerState(int displayType, unsigned int i, bool state); bool GetGPULayerState(int displayType, unsigned int i); void SetGPUDisplayState(int displayType, bool state); bool GetGPUDisplayState(int displayType); #ifdef __cplusplus } #endif desmume-0.9.9/src/cocoa/images/0000755000175000017500000000000012140306213017032 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/images/Icon_DSButtonX_420x420.png0000644000175000017500000017714012140261562023366 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxg$Gz% 3YZ+T5M%[I6P p8swݽ'ݙ%CpMlntCkQT(Rk7{{DFJ%Ȭ̈Hw;;9`˖-[l}[`˖-[, ٲe˖-[lٲe˖$[lٲe-[lٲd˖-[lY@e˖-[lٲe˖- Hlٲe-[lٲeɖ-[lY@e˖-[, ٲe˖- Hlٲe˖$[lٲeɖ-[lٲd˖-[, ٲe˖-[lٲe˖$[lٲe-[lٲd˖-[lY@e˖-[lٲe˖- Hlٲe-[lٲeɖ-[lY@e˖-[, ٲe˖- Hlٲe˖$[lٲeɖ-[lٲd˖-[lY@e˖-[lٲe˖- Hlٲe-[lٲeɖ-[lY@e˖-[, ٲe˖k\,/؆? 6=Rl}vS'{B]Eekv +>{[@O,vwL䴵cz=Oo?u|*yfOL[qO5{Xr›=Nv_$NkO5{bZ0_>#9l;$[ .(isB&{\9y._go?VZhlmύ|7M{b77z*۠~qV8W& tm')Sv뽊cdR5e~jxiA#¿?jI^]- m4 JlqZ`=A-(`rϏ9W=W{< H+.ICϣ(r|wa8cK)1}@ɤle+>c}s21H)$"Y׵B4MEY‰V2Zoo,}wc'#0t8}eIXq|$I"UU )\ZZYɱc{, }'mٲ ^Ǟy8cc98q"b4ߤ.FTUUu] &MJ;&ۺ$Iܩ)/ u]1pc|#ύf51!lUUUEf(O p ;#wjj* py "|Ni?_hȉID RJ7M3juu].,˲lVUvI74U77͛ i10<"㏿1O/:4MCYX`vI,"'u-abma W@i΍&IIDRʥi.{s~|UUeUU%Uc"u77,~ݞj{Dټy$I$tE}yfqfVw~7~x]M!H >#0'4vrpPg?1|"bu],$5u])Rw7G0~XT$tǻ 8i>gtD1͉@gTrҥ#Wsڏ RJX 5[/|߯0EQ$KY@h=_gZp^y7`÷O;1)2 g =7z$4?׼8˙at$uș?mc" r-͞a6ISSSM4E]}0+tL(&@n$ h$ZuSԨC:Z+965⬩%^yu,no3)%u- ,dR4MSK)KvąY~3'K5IL/s5;><uUbeޣpЀ Pbz4sWT^{%QI4EQz0Y `[ ` 0 wzwpz{W8T uQMp@r"ss8DpI WBPKCڊ" s:A4}RB.쐋n e) %63._(qUaUUHTeYVUu{N,- , !$ER]э HݵpH?示#OjjVR]GJU!b 1c9C ` %)CJnoQ|Wtva#IAA>i_#ب2!q< C7"_vB$ޱdMR}@ql8Ɛp1KgK8w p Q FBTM٠.@%R@»"?jqgMWUeYy.< ]- H8@b]Ȳ,ؔ)[ 45 gZoԔMo]PB f r a@BAH) g<ϻ=Qm IǾ&ĵllXT]w] ПSun}Om-(B5\` Q/1I (5lHR]4HHΫ!H;S7xߡ[bDysy/..؃ٲ:4MB=,.eyy}8TGd}0K=FjSej3 WsW ;v~Wxw0Il QE29풮[n5U}M$ Q}]w?sR%15@Se9p>z(KttRx'XjoDDC@R_)S]z(Y]\\\\Z\\4Zs-YY@ li2MӅ<ϕey/-,o7b~[C@N8Zo M~Ԇ|(hH͝HB%{K(qEmIkA麤&tPF`0Q<39GzcCANdK$qڎ[\Su^$q$[ KO-(jR.C133zSu=*MG [ qp\r<^o>ysb/7`ЖF+B.--KKKKY],4^~GߙY+^UBN]rn"\U^+L>S4+BN\~vZ9qnLyqq)ޱ;/֊#A ausO ^cqGJHTD%$Fh$Ug(C3-W|%μ'ԼRř,..0ݑ- Hl$pBPQbii y+$KslOg֣BP*4QU==k񃹲4/wOQn `O[q{ZJYP8; A$ۂ '~?<G{l BSIDڷ8 ИGu>0`(!DZk(F}Q5Ap9wϿ_ʲ:A W0 U _||n~{F^4!SEcpS HzCG9BZ"h;#Pgkd!sxߦn㚪_ZZ4{|, ]ѲBPUUr8plQJ0ö8m̌S-¯Lm-qoKdS$5hbd놪y;55MQ}w=kwB)pvX D|:#3"Oڎ !%R!H @_ s'.h^ͲLp)MӲ*9( H4xjI4תEQ쒔U Zk?DHB Q:)uN!0r&M1F-agSyK+Oj87'IDQ4>İ0닪|;I$cCĿ_9:_j%@uz]Q'37A@--UReDVK +ua&gřwqV"|Q''~Ϧ+5ځD]]0qhZBԕBM'1% w^Put)nxg4Kty4 ΂kVjRy|>\VeosԣF B*hy@{4`O2MfVPw)⿺Nj#A썢h8OR;9uC0 `RuAؼk]~oTJMk4ciCߖb#!~IB#HsBZuGZ}Dxb$CAHE93gc_-tcYUR4&8ܷ@dh$QEeY|izaFadkN. M#j [=MӴFr Z lF՚4v i<4M,|']<0ϔ>[*RmಣZ`PI=Hl$eRoe2C?Om?Clۮ$IVZ ,uQu|-n0$;?'wzצ/+ $BôFC؃{T{FJU'Q :#a#TG*Unض^<7[T"?˲+Tp>Otk*4FRu].i!˲Y_^zin(eUB :6Y ս.AGӵ]AuyhOR?3"tD}8ڧjEl8f K}T[U lٻ[G fT+!+t$q:(!EH!!CFȴ%KePw'px{sԯ肞,cݑ\V%KY@Di+.)UUUYY]lq柾CFǖ'?ӏAp `:I8IZ,uwmRuQm PQup9PAԺiô:0s)4jR AȄ:ޞ:0ZX!8Cq(N{)Yy]וY?=% N>.Ip%]RUUUyY](w^>s԰(sC,&4'jv>wЬvv&4u͞yZ~ikԦ۴nG$S .km}nKE}?x#Ov1GQKF jSz#̑PGQVe ( ćQ5Ic6{*Oy>e٥,Ҫ !DɢS:vG>7y]\ (ygygYv>oMԝ$kB=$m7LWiI_q]ý)Kw9Fb`$ΖK*`DXySt0iCSEeB0 qY[xVǦ+$Tݖ}˿~T\ڨ}Zɰ=.TIi ?*רԦvSCFt|GUWO*^(Y0tRwR[M4EQY-iz!Wx\AHa4AhIl8c dn&¢dޅQ74{6?~Wўw&9[[kK$| YD-A cfdTuk1ZMW m)(ĘȞQoDSSr3Gq$G{nk&Pu+,Ug醠%)eSUU0)kUwŷ.-֨K`4 )hd 1vi]%azghjU;m:bgqoy[[;bWBq$횪;Ŀ?=o/hd-B;kp iT]`C, #?} 8uU'-UgF%ZCZk/k꺮,un(N;lr$ez`4 S$;Iggυ܀Y\Dte+tg>MB=U+bUMݿkOn=pdu-!hC =0-6#2BvA{uQ굮4P=#pGQv,wT'PuRu,u7&>! M],ly9u|a M`V-;(F^u<<hr,O3}o>e04w>lmn8|_- k4$ !R7>J-4ېRղVp=7J?8W2o.q᭟9stq3o^T,0T] CKY@)U#s3q[!|/9s& #eHdrE\!t#EZF=q:b[ |tsg~NgS p .ʨ:vT ?{h| jިnTg1tr$P EuCF9GcI}yhvl @rbN?]q(Eq:˲sYiw[)RunHXěvR6W}Wǻ~٤ 0 7*4Ui:Fꎘ2n;#6TQΨױ#8Tcʋ'0CjQM,>2H GoPZK*[,P#pP/?k^ U`=4za0x[|QLd:Vh긖xQm po~jjsT/Sd錴;h9ĒK  E%?`fMng UWe4Ms}WEmY@u)г6,Eq}[/=w6M&erY!Ig}x_`'ièszͭԉz#["dO~Nwjm`&YWEq;vK5&O:ZBB.xSc6BDP"zٵ)\Ins Yɲ삡ꪪƨ:QT], ,jēIh[TS|+vWeY?V"8:Nnfn5`Jt.p;q!T+ fF jo #sFmNu\Ol-L 1kH2O-w>-=O@$I#o[lE;/ %o͗*ݵRX;ssht6\mZ5[.`ݧl2A.Gy=wy,EQ{ZeqRu":Ir1[٢(f/Y|YPI9oL\dt3{F%L~ڱ qCE9 G]Ugb%Tݞ nyTmo…M#h:AfKմбȼ+L+5%nu4S,C.{ӎy~f8^|GխzXuIt]R_ugl?) 5; ;0,&L?XJ5I:l wLr5l;] s~ai fZKA_U;qw*VZ. E9e=;))@%ԙBC{l$-1W0K=^t,[С{[HqIՙ, U !Z[!wi:JQ|%2mufsuv4OR{I:ϼ>$Da< ݏ? vqizz:রZn0 `_EG?{h"BXP}c[i02Ob c%kW8{~y(y6K]LJ$[ bg^xoJe+\M#Tˆ\ZF0.1g1t;8ڨ߼ EQ3$Inx[ˤ$NK淆aC~wvK^?9FM?jzԣwC0I9*[gޔG'N ;k J4,;}_}sV QtUb&w#R1#֞]#;̓06҉K|Rȡ#G `DBWEEQn>}U8 Z D36cuǍ$AoVF F!;-2nRj3`q0`?|#M՝jOV!Y@&o+l=s]:s~)E4Ҏƀ+nj~hZ:;9" c0eTw\;F%6y #V DQs0lZV]FQu:vG?}p!\!$FucDK[ Fn_Hc!??]ydfb%EְGˠ:!Y@9@io%[,.y~o_p\4[HӍuNS|u]7Y˘`VSg:.i,dd#Uwo`ɭ|*BlRu 0T]}?7~3ɮsr ioǔ_i*ABʑA8@ӡF#s3E}ŒӔG8\GW4CrΖ$K]PQVl'ouiH*{8aW[ \PRYA05{L3Q;#-Ǔ!;{ԔzYXKYE pT- H[vU'sR6UUU=[yv^:;7_6X?HOO/hy-Q0&; H僳PB6 C#" Zȶ-lѯᾭPn+TQ=Luw܅Mԋ$U3ڤWMu[arT5!}:_g˹WAɏkemY@ɩՔw"V( U˱ReG&{sɾ']x}xqY!ugHBhԛx}Vmo [ˡ$o[=oW8XC6V)!gb %ZkJG7 zg40[Q8ð `￞ًyTePuRuՂ], ݔNk EQ.soG_U vFJXT0?ړ.=B'BSA1rp`M2T$ԑĶ=wj[IL]϶BWAqC (vA?ԧ?8[{cTH y>Wׂxl[ΦF.>Lsp8[,?@5Pr9Ab%M%mM2a~^:17ldY*0HA#Թ2U8_"0"xGhjP$a-qd^>W<{8ަSP'&]ӶBE%I% ݾtug u! 7C3QZI0ƑAvzˆ(+v ==mϺz$fY4+!\3 U, J@$|VHwI8WϞp,R=XW :R_ҫ./ #Mo L;8{#/AB"zGGlDz leQu:z 8{/~c\@VQ 7 \[8ʼnJh{WB)dom2qQO38RS j;yX<1n5,Ζ$[%Fc+gfj:"k6tXaϨH|7!= p#ւRzV-TE(ÿ|o~q ] Uy鎦 U%[ʙĠSUg2:ySM;8l؜9X67; .:߬=U7@WJ]̑f Rx=[v6)˲S Nn5a7"~SAEo0V^Q/v4<0G7Ah)_Q vo={6Vz(2^uO[wG/d۩%Bx pbW}; ={Fvn_Pb0pɇ8yOToy>ezTv1Ug; H.g6i]B 4gO<3M(;^+d(7h:zՍΡ~zh4) G.]iNFƐ#_^ aCG-\ǼVKCv|B kBX -1|-%J5sT T32^088x8J/Eq&˲̫Y$K]H乱2EQv헗.\ȜTJ;61nȳ"HIMj&q `$(S>ϲ0BBBV ܶ%O7TwkVhU?l&F@iW^u.BҳXxz%_FM8Bpҧ7ˢQEQ`7۸eRwc+4r2[<χ?W?緎/)sHf,e~HHy[ _@giwBo6 xDgsa~!Mjz:$뎻K| Nd˵j+QTV33T TI8Da.&bިہf=[ܘG32{}b H\qP9ą翋]@oXi.eYCUwTݕM:/$[&ol RIKPizXz_4evd}z㬷oMH~K[!d*4zlBY[/&{ML/-O黱ΨzߴH$B,7^wfL2L9)jB!l}g(> 8{I4u!T݁y'>h +B]"1eޛq=y4TRh= R׶z31"_|ro^T]>XivIWk+|o+|=.fk[uT[H$2} z֑mD<`?>βltF\Mj[܅3p> MLCCM5w;~M5_Z;DgηЈLf/S*aV1$O= r Vh#`hn<gj[LYK88Zl~XF*ŢP-<#9׭RqWEU~ŋ7ulKEQl>j-+dkm.i:˲^N\h[ޒ%aD̘WO"M3ORтx4Q!Z4˚pxS|l]wI;t$B¯U}E՝T\QY] Uxvdk%n-nM]˴й(N%,f)21LE밆:ث4_5zS${H<8y/C] °}V}{CA쉢h:l6Vh(G~O;5z2 k$P}O7J R}ds p!.tkwΫO5* >FGزdk"u7PYMQye4M/y~>w],eV Z$CH7S7$ԘzFN%Jh)[4mp'\jX_A&ahrij+Pu?yϞ $P:a8=64W b%cǩoڿh?oiSs8.C{ؙмc%. {k}rT- H.[ϵPZBgl*WP9n$|#hh^ЉJ.l+Gj;^\8lJp_ۋc+-IA B ]U7 $I6GQ;Czjs \\jMѝS@1vm>IY1Q 9с=zԾHJ\zhy?Eq[/UlY@jBuV(se_s!-HԅsAz!#/3*Jtَ#8{R}-3*B@FZHL7xO"Ϸ l6$|#8(xj= $M2BUSyOh%* D!(\9ruW"F(k gy?:UQ|eپuIY賀d늩MXn+t1o9o89$ ՒhA߁RmRF9)]&.h_{~An;j/11u.fǁ{}7ݦV :> [[UoSl%xn&S ,z ʄS?B#nnAIC47X%.X*M`\0v U7ɉRul@T:DVy_0;P2S&g c@,M@IGcq=5yetZ]ֱA-<' & +}۶!$I⍶z:6N n;?R-! WTQ/pnh.VBGK@Yψ#F"[1{.\8ye,Ysn T+>~ž$[WE].y~.}诏g%qYFh =QAW6{z)08V,fKR݁.&-D-Az4)y[VhUjTu{j| mqq.WCNћH5mQ)V3#)%a /Ȇ$U>u,r,mwJ4UAխ+d:Hl]25]PY]̲lã, T8UG#瘰g4v9}%/{ *1h stRbW`/;֑ۓ$Z ̲+ꦦIl `?yMg34Tÿ$kUpI1i/B)βѢ#P+Q7Xb_>voyާ1nhsGd:V4+Dyi:_NM9EL|md: M\lRUwEQ/]8=fel8k׿hXްrU5egN4RyP]$н9;#AԹIWj+4 tVcH 6ooW͋%BT(sC;xd 2!T+tu%8W`\trDЁVZx ؓ$ɖ8/V!B|=Tݡxd#Oxv&\ZC6L[;yɉZUB=C.=7B-#[/9pbāfެo F,n,Ζ$[WEݭ7򜰂JuEidl̇GWr63Q06I+؉~ΑHIFvd)p>Ae'n`6EbPŞЎ;0 ' MݰJ b"U 6owbQ]N(wf}u(ۙ-)JUWK)\q|<-u|G\[?mSλ*Mѕk߂KvQris)%)"bnV,R ޱ 8}E(Bft GHMic @}Ym/73  rtԹw fiŪҲ,뺮E4Gۍ ;-sd<ύ8xPuBw*4 !@hW Fjn$Ky@Y*ϾV̠Ca`<bwwLZ.˲RukII=$-DUSwa+dTwM]Ue9_KE!<&4*u@#=0;?a~ސ,S 41' c.j6i;~ӞmI$acIB+8Kd$V3OU{\& x-끻bXƿaٺ80k3j@$q ua-1RrI1u-3B}/m{$|٦iVUUVU%TMLzلTu[Om?8*$hvNpCHe5ҼY.TCI[eQw2p=QxȖ"O\MEƀ')%y{yy춇w$nR?bq5]t&YԌL_jɳCvk՝0dl 5J0@B08akBU |Kwr (ZJ0PZ0(w:+dk *˲Ht)˲٢(ΊǏFo?srH!wRw)hFe{ gZ5l>ϨM{ Oe a>rA?`SEA:0Ӫ:C3_|=o=:W!dƥ u-Uk5+;7o!tĄ ).+֓R{|Qh)6HQe˵~znr[c*tvQ;Sw(*ej0Y *uga#=rMtEXGq(A0 Ap/~ݳ)frԹHԂ Ա=NHLp 8+eY-U'o*e,^Z@IQwP Y](ԏr8<s%1D hZPTIQh2KIYs2G..1Z-lԿ2B{8 @wI躮EQ$ɴVۺg]O:l 8-Rq>B.VBp#!eύ2ukreYo4T- H>.i%n+m9|(S@/lY@с UwV(ϲ y]IQv3E#12Ȁr#u2Hn;lo=-uo$q0 $I-دmJ+kl+Lf~5g$;y3`}W{b ʣ?ƭ1:1:qSQuAd뚠hmZCQg 7O2+PWFc)^wz7K2([M؟P6E3$$둩87qy{a$I2(xw˗wg P#AMV(CJh.{ԝB0If.'Q6gM՝ kqarc$[ujwdnFy8 lB Q޼fV HN֠hytGݩ}%~l3IFCʭOa/mZuDQ'I9ݾ|+CM3[HHJj9Rix Z@=U8}μ KⶭsYi7>Uƣld'BMVPRJQu_e 4 qrTծ# ?9b\b Y ԕݩ'x(Eі8zhs;0ܷmϾo9>_BYIJ@2@4z\'V|tgԬ M׮Zp<7~#1|/3Ya疪e'FݭVh%ŝM˲,lQ3̉cv^M݀9rƁO^d7DA[xT;̖Ƚa?]SSS[&IM ~Oo-9vAQuVԢ"͙}k4sF]g$`4\IU0\`:Y U|QNT)a1Oj[!%٤3ɳza`MnkC6 L| J NS)߻.>d}J݇`O}n?FQ7I=`w$ 8׾~RhJjف0t=#!H FF&PI4ݪ`{z G# 5Q 8g/d YGTم3sZk$yMm=3Bh{ FQ_-Z\! SzYo#q+nF.M$7yTu.vIyާmFK)Y4&|O~5ևwN`]; eF'!b\߀%1E1 @^5HF211#I 2"4Ye|g3}8DMP-)!uT]O5F+ uxG,|s[pX1,&QuRuNSEO`Dc[0H$!dV ι;'ʹoOn0-_$);&Ww2@(􂰘א=0bjkd$Ηs2Ead&6B]CcQ#v0bc F`ృjeϋ۷Ee~JieRua:!Y@uMQwlerlYvG}2Bi}߿yYovp(}K'W73 30W5KPD=0` ܸ %e`l#5:F]g$G3.GW,,v!番.jN9[3+˲l乲RutRuXe5Cݍ/Q8K}1=vr吵T6c>z`$GZq^"@R%Aw4|VSTg4'+ U!S6D$tʉ3joRL0ZLr0{@O0X:5ܵ{q8ɲ삡ꪪ,Ugi:[`k4U !m+j\Q_^ɦ0`Έ&V[B_sqą訴쑱b$GjM1Zt0nFlS9`>G='oVi=S-Us® Cu-RwI Do+ygG7-pi 8Id_ DUKd cLgDF-%9^EAtMDVFu@%T~CasґtLSu,[,XeBݭokA=`}[!yަz!})p d]ĄrH6%2GL)@LR%r6`Z7H1Jh$AV]!M׽ N7~xދ+B KRvnn՘PDZKq0!`Td5.(KH;%[Q%hlw_7s7_k H|H" Ft``S˕ oy9y,OEqViYꮐ'e5{Z]qm,-bxhAg}`$aRŲG):Mf VlgE/u^sfV$Wgq_æE~5`M0\P=:X3iyԣꤥlY@uwIt]<7B䦟Ku5WL0*s3T>02$0&8 iK[F >o 0 12{`3U  ^ ;/Eq:ھ[Hw9:[l]U !Z[,.y~.hTFBH,̗XZ(ȀIau#;rD| z` Ү!4l `DWFllψ19xyo9cK4|أPu,e5غ.飴} MM٫ޑwCJ:ukP"!{tN#b.zn F}(#0.|*PO:V"˲1tGe Mݭ9ByVʳvw/ QW#Cޑ"7HwF;#ji^4U]awvJep|O΋EQ<1n5Tx{[@uwX8i+TEas}kfU#($م 땺7JlIwׯz*BAl4uIH`4怮{j0H.|s!wt4Mʲ֡v떺[lҺlL_Q3;{|?=XDo$-n^פZ=-BF!PSܗ8c%抢ʲ,zTHvdFVL$꺮3U y_,J,)E#Ѻn$;H#7`x࠙}џ[4M{TzeCdFc+4al<jY,N}|U=HhT}WA6' p@PCsMti@^'UgCH-d#[!;Ͽ~2WEe#F҆Q﹌k+g`r)GSދy֪<ϳ,U=KٲdRwX߰2P2Bc秷CGT)@Mef F˼78tǔ*\b8~FoߩNwiYUJ d:[l[u98!yiz)su}oPzTFc$pG1P3D/]м,fn-#Kխ߷e y:S0{[E8: 0 =9qudAj%9,_ <ϛwc{w L-L#Gߢjh ATkZ8idY fo~~q3I̓ }<Ϟ׶r[`؄jb8 M$xSےMk3@R9ԈQ=#24؄.Q1 N#(d 77Xd|bi3!D)djNAX{ꍾl$@9,g0D`:a}݃d=0jG-`0㌁1 FJN$ʬD0C2v[{~REﺮ>[k}, ٲ5~sy`0$I5=zMw?X6m+"k`d:#Cn^Gi10@J‹w:l~!GQ+IIaΨNY[YE7 `5ɦ-G?3 + 3nҏh!z !kg1F%B48G,o^x봮뢮Z[ܙ\9B}Pkm a/md&B&^;0tA$(vAG朁%P)Z youHLDÈ#0R:)9xOpAcDE t9>,:>C%IuI|.[sX@uC!J&;I`:Ia;l?9>R N~D>X#R4"X Fe` 5 ʬ'{AxKj&~[>þ>qdӖ ^!f 8'k6΁aGĈ,vjW@\3u`hj 8۫ {Fu7ITuJ(Q}& ldf `4xjΝ(vocsl:xL Y 5B+&X`+ef/]Tx/hJ"Cv|Ľ`oEۦQXN٭-bmٲdV#8$I$t; طz;vr"k@ il Jzk3 n$j;vOi 1RvW<3hWǛAE X9&'ijec+K#-<'Ijjj*A {޸PwΤET$I D42U@ o3M`8C   MOZ/\x,˪i4MfiRwkc!ٺQ( $uG<"/I(-;xs|:|EoH!녟1[ε}`dwc᭽sI38A X!DWi~|G<;uh;Co8XήCuCcшdu]'/p0lx]yg i Y֌(`4fF`h:%\c $J@%CsǷW. !$ɌA'$x[[mTzh:qΝ$IRu~{s`oTIP[PĴZ$G F'ޜnGݍ83-v cp9F@Z )r(ڞ$Tǡy}_"&Vb$[7U78ru`%I'I9 =Ԓ9{*7HHZiAT6 $aC\Zk!^;2흾œTAQ4<;(%Ih(Rwl`);[7y^%ۛ# Hl]T$Pⓨ$f/SE3yD% Tυ̦"0)EmցQiu!Ṫ[g n\tc pw[AI +'@'$[7UvS=bZɕPfqFMGcj:;k 4) R%IIٚcʟs= ug fIBQ68G(twVhY[!Y@u]wG8>? zrTI|V:3R#橲B-";&СPFYPb3EW*w~iDw>y!-pjm.X'$[Qw^8AEі0 /͖}_DS e)0 {Fs`0ԗrYFXSD}P@$Ibiq^$s9< H`MGͅ>y(v8$Xn- ٺ˥x}Um=xO~sgRT@$$P}# Ag:F>0jծJ|aN./"`uLձ>U큶GO,JT*QY 8`-l4hOvrh5VUw`D#sh.hi97dQ#-$@ziuGl]+uW٪ u0e^HUYVXo9z- ܖ$[0U]u̾Q$[(>'؎#~ȃ`d-M$H u/k"`!c? 4M?HD4{3gI 4`W6]u)%#;u1%pV7޷ 0L[!vSwRZ$[=U$I~ g2XUzF#kG`M[ߞk>G3{FN---N韾YB̐ ')EPwտ1](F=Wp9*;g]GB Y뒪:zǟ`/J.AB:[ڽ#jPyBB102}/Eޱ"Oiznii4My>ouGj/Iy3ĺ 02$#m\2pYs窸֤UJ.>PVh*BRw, ٺ֨ZN'npy?_y}柞XD7U~7Rjkf;!G@+{B{?~/Sne4Mt~8.iz)˲X8}bKQ`W #a~D љ1]THa\`PF /DA~|`+,cg5M:\CՅa3ӻy~S)N], F jq:K|pEәl# FB,3O]Q<:SNJ}SyͲbe yy,[̲l6[Մ9JWo$4`4GzʽMp^VH+館PD|0x} g[ :d뒪KɤLGOeEP%BBV c.YU/ʭAf`jG.P3}*SYϲl>,ˢ(4˲,.y6s1&jAN=&00ld$,2?cj 5.OFRi$<0?;y0 wq)IqMxd A:ݱ'Q BZ'o:Ś_#2݁2Jh:@35s{;CsfYvNsKu]BZQWUUNRΏ^Н_K00=R%w IRH&z,MbV:J.9Q2ŎGwc+$ go놪8HdJlq^LxTs2NF#;g;4Rf˕3f-O/y~&˲ yϗeu]QCDM4UYyY](bfGTQ]732`llԋ g+Za{xJFܞ{AGpk+d, ٺf:3 Ѓϔ`JBs. E p`GA}Foey*si^<뺐R<Ͳl.sU>02ŹJb]CYgUԝtlL[%, dq ûюeFEQԎh{{[[w;;vNkr`>U /WΡsT9yns0"U \`7?{b~p6IMt!˲,ˢF>SwZ,n?

<Ӛ3zSBEQq/%Ir?˲Y]<peu8)0Rfww$,Kugl.to,큖$ɜv˲ MÊ-t?_P$r'.Oc+$Α`xf D!2P ^uH+úHM~je{x8ɻȋ9zr癦c.,W#ߗ"q:r`􈭐c+Tt\ESԝDuHY#3zAu uV׽aصlPw, ި:ҏkZ:U;om:O-ai9$P:׀#)xkNtLuʶ 8%.,̷JdqU7C{ynl$=Ld1p=40l撸883. M"\ZKJJr,nA[^PzAllY@5inQ]Uhl `oaӑW~WIpvh:jKIVTj0sdhU`o+9rkw8EQuPuFU' 1(I)Yi٤t/+I58'T]dHy;锌}}v :sq~Dx ϭCdRudUjfszI;ݍeB@+ #d#fB*U. FR /B~4mt/.qdYfz¨r J,i-}v:Puke=|}`dȹRzy Q FR7Kࠆ)0 dw#r0w?7g}RuԻ IZ(y0EѶfz.m,eg*0yE;ڭ_pQJCTHD\zWn؅ݜu6Nu)h/D~\e~-Mә$I$IĀ.H ĈBVE$IZsy/7;K`u ŝQ`dʜ ɻ Xy钪En(QDQ(Uq}u0l67xB, zTBol=;OXR QuwOUW#Ya j`RI< ]7+Uw/I%mT !y8r eهz`v:`Ƚ0BJ'ib]^/Id&UܙM"] X Vi=9o HonCE0D͗^ߟ</'\Jq`i=HtnfZEKԩU80tݐ@$8|Kߔ_dYfTu86T qXCQq9˲,Md%4Mgiz~d),qjHώ?%TnಞCjnJلTT#$H [^pP Zse+DnuewSEC T&!XcQ#LDO0Ʃk#Bh@A~c\+fY6|$q-v _cw\wI,Q,l-/! tI'F 5[cZL@_&Z-pБ瀞IA28ih46Zej.nSoOwZd)s#CՙHvg:>u%ㆪ[=Mg>'@~#l)nUW n.H'I s֡(Q 1GDFMխz{GQQOEL3_|ŎlmVթ:6U'(P[1VM/O^S]n%NdJf) 0`DtvMlRtD򍷵Fn7[!{Q[OkZVHm pySøk`1 ъx$V MסFI; !aE8WVA !=JFuiQ^g J! H&Fu熲]R;uP%9:7`xmGgvFQlFVȖ$KՍKՑ FZFcywɝoO.c^nXSO{d&2Q XiO<; `Kywa[HieVA ! x> Q✗yiI(.KnN~sRyq&QgJ΅]h 3YZ \\onh{Vj#l$[/Ujƫ.h4_qnAA%$p Tc2dmրn~cb`E˲hҷ0 ԡ+\+н,RQTtBjo`gVs7a~syOZsK8Pv<1[..n!*ǡVtf+&}{OJw*ٳxhc(jGQ[k˸7vr*H jAtUS{MC#@I9+bc:A0T] 5au. Ru^g +#xq!r% pUuX #Ǖ&bB \WsH6K;"Ee3qߍx12+0^޸T]Fcsq2,$I4qK&$d"`dDWj;3$9zeYfu_%-ϛ^c{1;elvEQ홲▲dkT]ZVxyw/W zD KerF>oȜEHH Itiz(A9Ǐn Աi.i?NmB^Ec*u˧4< eL悋N++SW( նB\rT>RA( ;l}Mzvlld(n_|7k|u yΌdi|Ol(rETT(Zi:HlW(|CM~*nF.Ĥ~`ԧQwb(="r0B:7asENR*N<6$EKJfT&9ge Gh7ר [!!Y@8v{2٭g 8ybQuLtFJ (}vr{ygDsq/$Iҏ㓠Fѐ.ip{nl#xe3az\Yl„j0F`D*9]5W([!=0fꓳ wS fssEgVȖ$KՍ쎺twd=<_}_܊!R KsWn0It_#ȡλƗyOijTuqYeU7;Xn(34YR^S Ysdb`d>S+[!=(+EWl=.ɥ\S \&1{}ahZ0g+D ۧTm pSO?֩'חQ$4Uj+}hw:EיΈuC)A= ' "`M;8qy+ѰsIRu]M*unҊv)Ë RwJ2m s%5ap% ]׃#S4|ZVH Q<B, YnL70 MDUiρO fe+Z8£Cꀺ~PI :!ՏZn tאEQ|T;`ȡKL+NT%QrL7w-[Id&Q.} Zʒ7/y~k+dMCՅaiyVC՝}FĻ䐌Á9n 0SųuFկnwPWyβlVOz1;Qf`ք-i:eٝ_SBd|DIh(_>m+TK,ɡ:\ $Ig[+u'Pw]q_YYYae4ev뾼^0Z,EםTS$=0ܤJ. I %' v5fsl$mє$ Tݨ_Rwqg,KKDjxԆQ)W)eO;m %" :_T櫾Ԁ88 @LnREQj}W5WdQuQzcv?{̝+b>UwƣbHT #.P^;ҵdo=et8EՍ}TqYQf6 ۛ~r& x*P(Δ&F) )\%iPrRQv଄G8frj6fX$[,Uח{k4^n5mA}/~t⸟]Z4\С{Td*NwFl=`(Eh蠼-[/oo|Sŭ>TÐ${^uGp-֑7( ! z#F2r]R& ׭v!YsmhQ+1'Ƨ^sMjClRvC֗- H@Ցqvl6 w`+[N_]@RBJ%%GB z:9Euvԙ]MW#b ŕ1 ګn>I(xJI:w:/׶B,׾޼_E}H>102 F,IE,N̨Qw]3B'2%CNEҗ<M 3$ H[5U=}-ۏѿ?\\B \yVNUw$Lgd\LĪݐ01J! %{Ι,n'Ir7I4Mn=UTP#8B HT UCc'5κ\Hm(n~T%!PuƔK)yeJtK_]@V-vdWЬn| ;'J< pIKpU ,Ghok[}lQwӚAZ@T]| (v3:V;NtO,"^, P:):8U%J4ï,ki2tTK.U$[Fq7s4IdU7e73^5RwL테Pv@eovHǃni&Fق5sޙMRNnv7ò.:IQJYamOGݮ[!3&GFSuQ(֖ǎoqv Ҩ4UR̓Q4]GUDž\[~!-!] ߢx-=C&aeiQ@ՍArO8|`u:!%8S"02ġʫn2"ϻTuYe~T|F~j%8Ea4MgQ,\{9sRE=tb`d+aCe]MwIR%lqםQʤzDp'<, Y/UKxߎNm⤄(dQB UR[רjw*2O>#uKA|% +a_΅_HtF'.$9U n#xC%p(H$ժ{Yޖ Y?j+DRuVPuۂ ho/۠Beux TS!dX#u7j.oTqOT-iz/˲;Ͼ:ǡڤ y36;&"}^W)^ k!VN\^נlnzbBZ6l:_ݎq2D\hk6韜w,V֭ Hww$ub((i ϳ,e`5Ukn3MM4,J4-QoH"K.4s;❄a)yEU);MGe)p7vVI 򩓮c+KY[! H$Uwy ~wm #>5:ō.ʠTub`Qu*ǷߕE~+MӹTݨa1U7>Ɵ:iz'(n_IYx|;:9 X{ ΢.TG,Te#!+ɉ+T]ZmQݙ04MgYv{_癔h$9102o>OgevG u]j:zDdhx7SRl{=f6h٤d+d( HI?(nQEEMSuG^3).^ 1RD EV5Y73u\4^(Is;x/6ynfYeBRucnXV(6V7^"aBLqJ`Γ ~wF@:IsE&lRZ 7Ky^%ջah&Z@zhUGQuVl67W>෗ 2HqeHQwr`d"J I(O]=-m.E~3IXn  nBòqϲ,KdYSw3= FNH#u.^Q7ϓtR鲕Y&AqttһB5P撿z[!g9FP. ;}߿շr^[R0\"pU#iH[0}XMg)$KP\Wtq^'ޫSu}BLQucPwlflRUwVR &|`dX:UFRT]QyvuI gLwM[ψǤơm_z_ s|׏9]Phws`T*N2̀6$ԝR^]BPd+z7[q  EU`d:-dnN~@ZWsb%J Zm{qr`d^W)ڧ6;TĨQUZn̦;3TT#u]'Ի$i-%)a^8!genWx}V(FlmC}N֓X\)i*N|:@@S5ٱr.;Tj^ Sġ*n'(}tii֩Uωᅡ@ݍ0k+ʲB$syOι.rpޭtFQtrjReH7U!TSwh "S'6/ mVj>IkgH^pnCEp뙔|{c(3 ('od]U'Nh0Bmv\0"zGQS$g8989Sud/2U70q8^IAe\=~sC8:ȼtEIvrD zT'7 j`wzEK'׳I(l6{#g+dǐ, T0 w{տ?\r66N_^``^u5'[*#v0 qP_oqlwW8몺 [nݨ$>]RifLv0YT[ MLU櫢ne-?ڤQɚם2` 1xVvruR;hcl<[![맪uOO-ciC:\+O]יi.HGI.PuI,@ǝ;z RwrߗsδP$$Iy~(kHsYO SjgJF˂h#`JI%D]aYH$)fLA; YwQuA WO7!PƩP+NI F8Q?0@Kԍ%` ]9 y$IQutH/2UZnl)8cyq\&y̥$\E?POP}Xu @pQc+CU;Itra~oQ1z(rAhll6k͒kZ+U+?/.g"W9GDxGBD0(1@,D~]e~]Su,UĩV1iͲ>ٙvRu'][0 0Ukj;> Iv/먈*+O@2@JErr-A7:̯y3FSwV`H^[F;vrǛKXX* ` R*=Έ Ɣa`d>Qq;Q\;FO~e% Fg's< 0M"Oя%Rd꒔n}HFW']>8ۍJy:IGpH$Imzoy7U p]B?-kZW_yٜ%%$P[A;y0XJȰj0lKA4P9:Mydkx&˲ۖ{b]840V~e3 v¾ƭ{R:X?7qM<΋}WR :siՃMsHQPZ#xPwOd3 D$fЌL UnG]櫝0ƄHP30뒚aY`h-|I8.[0 U um4u[IEUufh}O|2M!KpEeD:duݹWH6#;u GA<˯,`T('q:Tj;ђp3TrT_<|vQB(r#@cZ)eQ ,u|}>Oݞ<'@V«mZֺm,(M\'x"TƠ(v2T]hz~݂|5Qdq\I )Ab04fJ&02O!@<q t=,+$IUGPur NŽ#BJ){adMҼnk[Pwq/u7#{f[Crmb`d^RI )z8T rPÔ*=;g~D@b6?mOyލFXe\E9gկ;Z{)}Q۲3E%ڏkFŨN?;\ZK: RQuAP]PYJLdzf0BmyEKP\Ƕ8W$+*.I(qQE/ 0" (ܗwc;紪n.IqEQF[u7Ii~V)n*"b`'Ff-ԲDR\X|Am4ۣ(j7Mk+d鹠蠋 F6ac>/-Htp I'0pU繐<)Wʊx[{Qw8WR?Gpe+B ! -w0U|B`T(f%;w#SuPu:V۴S槇~wkrUFf Y\Cyclbs;"BcctA] PL0<8#&} i; ctG,V Qfc&?}:Am `yS'?LܳחչSBFr=`D_J9D|+`KCM'I2BIcPwC)<$Iy>} R';#jkHozCZవl0P|Xԝ% HO4PQu:vS<;}M_YDiw+'Ff y>ᶸEU7`{q$ޖ{: I q/8ϧi:rڑ7TLQR?`T/Ϊs%.8yW Y@z::U oر?ϧcܾB(EuPGtq(Hq%kN/lҳ F ZF9s 8٤TfYv{'ܖ$WB&MS Fv;EœS| 5zm,8Y@z\TtI]TNߙ^!.B$%dWOFzu_C}Oy>VeY=TIK=8B(%>0#`($ _u|E>Bj, MZVk=p?}|G"O8D!ѓ83F D{9}>ᖜvDy%M;ơR3qߏx9˲^UZ:i4#xVsm;6ܹew_#Qἀ;ũ=o/ Vl60 t, =VN(yۉ#o[s7>=cjJ@)<`>A+^v虣:V" {>$.#xY eo?|AzGizA|_8 ٤f p0| L f鶔? ݛzݙ>1)5Heٵһ6R\~Gġ瀄 n'vD_iUݜY<_i 9ee4-?\"IRnfAH޳|z:ȀUyQ(|Vj5ͦ;`u T]ymZ^ݎZVh<;N_ZDk0P\V Ā6@`6%ZMB (~fyەE={?ICխ֍RuN4SթRSwiϲlf͞ !Jút|ƹZ:#1t d`}=+|ڦvE;@dSVAm_m}okc/?q.^ K _A>, -!XƖ{rq'"'ˑ*zUi; U_Kk߫)۳u$Inq|/,Rmzu44RuuGկYHJ' !BJɄ)JYVVV&Ir?iZU7;▪]};0P%RJ^+ WowK{8-BHC5~`gTװyNuBPJ)!Ģ^YfsY-y^E9ZcLfYVRJ,˄Rz5ڣ гB,8˲$I$wѧ+/i/盺),˒R:C1yy^Rڠzkm? @!L9EQ,y$I1a/uC_s繍FkAyy!TT av~G(]Rr)%猱<4W[,˲&d%u77{9kA)u } }oPJ=BKqc}H:=ݑRBBeYy'ygYJTl!{Kk,K!d1ypp]B 9.IJY LLc8F!39B!`4n蹸ևQwI}B!<7vnV9Z[ g8_Fst'$kϹ$R &BR{=(8c ylD:a|Ⰿ5}Q~;~"~^?nGY@zn$2Kw{I'V1MjqR?ڂ=eL ٿ 7FRu/<(1iz @I0\bU0 &l)5R@ l[OF,A?S;#Tu^ Bi4QDF vvHCBEB%>ܠh5mo- mԹ^. C~ u&aÈjac!Y@vΔZ茰]7! oqcz*6gAabIvadRvkFGK B]}VDZgbݏUu͎33:qbkރ- Y(,qIz#[15$GfV HY@OsY ZPgzК7s){ )U\Dej'23A |]GGVq ]rBgIn{M'xM ~]GV< iڲkY]vY@zn8?(ldև]GOqYQ-[lz*?-[lٲd˖-[lY@e˖-[lٲe˖- Hlٲe-[lٲeɖ-[lY@e˖-[, ٲe˖- Hlٲe˖$[lٲeɖ-[lٲd˖-[, ٲe˖-[lٲe˖$[lٲe-[lٲd˖-[lY@e˖-[lٲe˖- Hlٲe-[lٲeɖ-[lY@e˖-[, ٲe˖- Hlٲe˖$[lٲeɖ-[lٲd˖-[, ٲe˖-[lٲe˖$[lٲe{DIENDB`desmume-0.9.9/src/cocoa/images/Icon_Speed1x_420x420.png0000644000175000017500000030064612140261562023044 0ustar guillaumeguillaumePNG  IHDR~LQ5 OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- pHYs   IDATx-q&eUr{[;H(JĄ1DX5,c#GH𶻜KUPU}@ uF,/~t|!E᪪:X1 &@b)^R0:kRJkHQ(Y,{&_~Tew_"W{fH M1/)(.@u"a(/g&?L&i)x k*0$"$ Y'h[ ݽٛܩ/;9|>/Ee&V4SLjTRHy0 `A8ueQ=|{%,SJ)V۩=x M1߂?DB BJ vLmV+䯽ym Z.0z>i;c9HSL1K̆v}5qcldG " c ,/pw_kdJ%e9[g(TpLywko bo/(1VJ;AdH{Z'"p03aY.Ϡ^~9}'+^|6{XN &@b)^"P:uĀ!A<ox-uX@(Ń@o| l\,|>72pÔN M1/S1fEǒӬ1Zǂqr{އ\]3yqVyY1fWNM,i)}@"%B;pNZA,3 X/k@E9[|-)Үc;M1SL0ԥ Y;N+u$0:v0[}wؔ-ќXE1+hn)bRɷ~DpDhA+R(@רz{oo} eecI;i)xߋb*'1~ Pcb~w}Q-${(l6Z%Bjo4b)%#:R|]ɧ<y@B!f(k1'!m~rMoFߝeˌ1$>HSL1ŷSvrɪ;phLqk4eD lzXޛlXf2۸`ca>S|S k`)EwʊYМ?D7oꃋ곒ݳY_YsmZk-c(Oc'4S|K "XyB)@kό"("0b4FʬݺLꋙƪ(,_fY!;;$r1SL"1kxv$$u<+"2 bЊ@ wFh+%W>kǿ^'l|n6M!`$ b_ *K dا!SE Q]oCGY\GSm狛YUUu][k03㸥.7)SL񍳧0M!%gHrD9e77 mL'gw=ٝ|fEnWGv M1/ ;[n( ̌u\ƢiJr1ps֫?X(wVe1y';1즘bo RPEJbA]0fAkED( Ar!Vhtգ>,_g"nuS7M۶i8{v$_v M1/Q uϖHy]S9؛Z+j"9"E 1QpTg/>\=Z沝mڶD$ƣܤdPSL4S| E7 uM"@݄YM@&duagoOrgϾjr}f(:Uw41 boc0 &dFe]'}}%QnSu-6ӋO>*7_|>_>kr},0Yk9TRvD#9LSL4S|A:H MȂmD0FrMQI$08ξvyϾssY印M۶MX awc>xS|͘TvSL11@9tpHtA+L yE$u!M'"Y1JIIr*z{ϕ2|V˲(<ϵz.F&0SL{b6t맀T# "2"hMP[T\3b e  C9Bm™n.>~dfW]˵^:Xniᠸ,POҘM,i'{{:^ٳXx]EI!'sq*0ɫƻ!3,,V,#Y""P8(F[AADMH@Mv'<>c׸rh:pZrx'a÷b#ŝ^Dy퓡[,^":v-U'c@HiC/x,JW"wMB-Iy]IJi{Y՗n"۸b6MӶ Bk,] h3 ۑs>rw_n䶋z{7`kklUCp9{[;AiE5@oE]JHI,kkE4BT%ן}[]k;mmSm:\4)퓃M{dH]"07z)J.FyHnyl7?'(o#0`:1e^ ;|ChyWED@5F 2-Z+[ Bߧ'?z?tɍm6m5ι0FJL ENX"*Uw#}WaEn`c9yA~~߀NM:SBߑ=ٺ- #[!uc+<0eF@geTEz>*6b5Y=Tu];fnƶmʿ@t*LlS\N#|,Ƌک-^n_|ݿ}Sm}oVjO?"&AC`C&NR=C %PBx՝rI矾~yd¬Ų&Xkság{o7}NXӝ%ϑƒǧʾ) q[ʨctu-bJR[8.iQ_YIS;P%ԝ PhkePq.~^Q}~Wige mrUU2zOxcG#@@f"v~ǀf)HyԛQv,^>ǎ\x^LzyGcSҺt{oNaBsD$P"R,"ID t jO#" Z"h)i+qѦ|+rߝU_|?v&tƋi۶uw&s&~ In}]$'ayo[0''ϱz^MǸPuxdt[P;ԿmJ}iͳ$ώ|kԄt:jF$w$}{ݑ ͲZ2G+H"l~w~n,uQ&\gD)DB2" O k^s]׮*I|HlF\f3ʲhM8^EDj) Cs=2g,"6*l\4\uڵOYQY,KU \@XBvc/A]zN;6 $";PJ?eYQP2,) Ln (E$6 MHTwyJhMa6iݴnX`iony^ŢZk-uu=^H0C:[ejܹ<:'v8W(H2"ҤHoD[l]bQІ/eȑ) LD^fyvffeYTʩSr;.rNX,k ܠ7٬˲QJzv5M_Z.fZ""ضЊ ctN2"2Η?Ӱ;vlŵҪb^mYi*6[腞͗u rI䱃^BٵsU!a/,5bmEnZэm[k9PyXfEfn}]67W Zr̔ H4 u\q=v 8fnm+jX^i\ h6ͦ*Xk(TQf6+(UۦZbEE1SD) ӏ>1ۮ.jۯ{h''2*xRpNӓUs"(X Ui}gh"!qRpNN}C"0OU %)Ѡ!Qhmm݊ҚlqO_ylj7V-DC`K8,\}ttL6PdYJ.W> X1EJEM@UJm.//V>MbKE+<3꾦,쬴뛲<;_;wァ9 ,{4,SP*H '_~_?JiZ3aJ)e,אX{'?7x?1X@:JFݰlGF4D9f"jv&deeY,\UUl< CXٝ;}8 m"zt,c"4dZy&KYn^K], Y.{Ź3f A:^"P>$>nJ'@pw"uK4EE~+Lɨs.>DPp,I[.A냄#L)#$'GPR>ug50jRYU'Ӽ^=ǮyC`86a@MwP ioQYe|sS4u\Qjmk4VDr>M~ny^4Y5Xo'$ӨPDk XCR@ 3y>S2_m,ڶvahP[ѱ8h0Yơn-ݿ4k=]<ŵX].u]bK(=G dH""Tor%0~ (lV(Vbo <{,ckk%ZkoÔK&/ fFyG?q傔((I!HҪ%MOX;ՌG֘XiCRZ+uff؝w>fʛj_0mk|Z9gRKxNg>f7L/) IDAT[(&QJi7efн\_ܿXZrAzt2N=1_N3%>_7#5뚈p^R5ygw>|㏮* - :YsjtrwLlC_;6Zp^L O~œ/˳iMπ iRA(eyY 0)KbX; P|:C@ YP2XV\F-r<% X_``73nUxpHh!oN|zAuu݊ۊK FFi~ i"B,Hi!M3@cٺRPӳ}7/?>o6bge >w^%* sp5k5٫Y<[eU7Yf-ɠC  K觏k%bA ǰo;uAGha6l6Sڬ)rkCk*a0  /i)چ7W榄gb9ZЉwשkeDd1eY43i\n7Bz3&nn& ekȚ 3Wd+f*rYMIDicfjfT--k c-L@ A%$ɶbZa<P 3?gI*FVlnv&[h2hP\8kԭCU[超EL@xDv#=*5"IN(pN0qh?y )t!TE3"QR*^g2Jh/~`K9H<csL0 }2;a.IIJ*Ȕkcuuz}ROW[ke>kefRScMN/!  TFJ`.YSf  " D"Fg:7 _h[E%H2Ҿ c `aTj bui) Ed ee֘Asrr>:)((* Z9>,CaeD2 ImBZ=ČeNf9 +3PGx/`@ EQg1h2+E ⚩y,t:ie,"Cȑ@lm-KÿfH33b U}^E5g#If$ 9b RtiYZh,ò@ o2 _:9(Rjw%\K@ C *@J,d {t dCJڣ`/`"&`P9VMED3Twϟi״vVJXnnnjCPݝZb 4|+m`D$mCk, JE(%#@&Dw#OtqXDD4=C'fԑu$'2Lag0Fg !@vi'' "Fy@)naM}P$0 %yם4Q5eN:g` ;^uim&Awa@w'\Q}"qKs 6)N$Dv*I!U4(QhF4rէk~ !kEqh`/$;2:|KP90t4UTlb ut3n{hezQp'J!V튂B5R$4Hv;7I&›u<^(!M$7͐Vޤz%HPCFk֎E3Na=t2hEP(:H`'K.P/Rr H$8oj`Vd1Z"{Q;WhQF@%fDp@I޾Nwʑ{C5 G}׻HH]#ASCRcJ[ }L SC))  qvM, F2TF~2/s\!Eq/9 Da ȕCL VnaLZ%ݤfM}EzFvkSn0FacU/A2uD66ƞ"NOץ$Vt}wpfZP[3j!9./~^^]ݯsYŋ36L@o]';93!TK:! ` ۩UNV*"aKqenDH) `HS܉wdX獝h@Hb3n6oqkCv]q®SVk$9: J{jtNj:`#EX 7!H2t_r><*a

HQ/䮻\H02Ni#DP"KQ0;t.;"}*=~2 2M%YY HAP7O3{/3/c]b^7Irܫ$8>? aw\BGw_n.Zi(Œr=zn_!PՎRqC_x W/6}'}z6E]"'|I^%ԞkJ;\7҉<;R=MUlHdYHdW&ewa$;w_Qkq :fD2tHrL&ݛKEFDDܯ -wˎ1nCxb1,yP` 0$DZR-#UVn3 #]SI.!ugIқ%e(bH]1Dk(=e帠KӍCǐ Hð #zv:z ZF2zٺkt*NL83IKKoSzfD=t)Hvcb8왫D% lg2/uIu0M@xY>4AD F @m9Xǯ=}f\Xx M  ÑTN6Ҡd0B# \_Ro2, LqoK9&Bq(M\:Eh4:PNUcM^O}'漺}vP&2$>],S*[܌“3[&S"! SɒBI+%Ĥ}wz>=SJExҿ1,A@,ֲlM"N 1Hb JsߏԵA:`1tG?a?&,ҩ٢(F~:CEYZn!{Azqp;7o01Q(܋ [눝[!ڐ^.>wWkSټ~8gp486(M 鄝^ 줣pқIbBaPYECюtM:ŝl8Dπ ix!Nc`GqvͽA|ޝT{-ȎkP#)"^?ظ (ҚERNzGR+2ӕY~<ǩAKCJ.'m,Pb:8/X@G1 ;vՃfrQ0%QM\$%5ԋАLF Hek2aX3]dJ KjJ!I%z5(KF$e3'ĎN\ӝ?HޑY^~8׎+dHl6(K_S-` 2 o_}8x*\E]JS ҎHNޫE_SBo( 8@i]t:G`׭@!w{|&T SK bc1:E;`Egx\Hmn5$Ti|G$ yPc_gė4рd(cҞ-\zw@x =tBC : e(vA6վv$U%$#B5Dp( dui$u&ЛS u# G&+JZĀk'cuh6W)}ki3vuE˒;3&LԎP@J>:VX\0  d.ٗ;6b/XuN0}՜_0A3o"}z 2  ilݛ[ʮ><L|K^H{zU!|Ic"h wI^zf*@!C,}ChX u4LB2vKjkd߮Sӥ7c˨2k1Eܶ)iwHz:u\g2!%K_BEV/ ]u}`HGj_)(QE`CgՕEeǜ4e!_M:0d4i,g0ȝj*64{9m]=5aJJuRdqΖhnvClZ ,4;i>kGKI߅ )"DMhF Ȱ1T=|v^qAyV3(5a8o*2zIcCORsϜ{)2b{D~I% OOiS JYD)dq 25Vjw X^н?>lݮgj/YXK""yJߝڣ;%si˕BMN@Qk=/sjj)u 8$$!\:Ĕv$C"NtϒL0(e):A nhOwSS핫#Q6OD4nE/&7=47IHtETJ~%D㢐l,凥Z{ 4L~ zӝ|v ˩l$]S׃3вUej]Td@ [)3Ds4P D)lpaNY`Wya})eFZӀI 2LʰnԿΈoɼgawmd F컳{T௨EȗF=cRڪ0]=r]<++R1s5FcQb잏JՒ́d1,@&$W"LeA$k$ՐIo\Yc>եƒƃ-}x/!8=Q 5 G/3|,hJo}ĶrͥC@" "^᭴vF@2n]`v}H*je.-E8X׫*\;/|n׷`4hxbweGZp!pvm`DzOA(+H]gu]Ji3d=uVJj3 IDATw<5-Y"^a'!!Ʒz݂ٳK&`# c~(%bviߑ/Mu$.06((߆_ELpHb f_KcԽP V"zPԬGmt_oFЖJ:PJ{RanTe_kIvZ!m1_ h /#BFپ%@! E^s۠D5N)8NFqʹDMN!$lePUd);o";nJZ(!3dmJdy*IYTZ]Nf_$kq]8@^UՍ`` %hfi6x|`_ ܢ,cqz3sUU(IםJ/- JȺrh|mC-"8K#K_$8".6mguvp9p+i+9CSomFUvVN2<|Cv4؍3r/c>17ORv8CƺhPcK.LHI*1Ś.{N!ƽj-Jiԯ6NQԐFCzkNkn"?!Xҧd[0ҍPlMYCFHD1 cJ.ܿ*юTo7B*%To?LA@رT;['c`)?zCf_\ ȌPՔN6eӢpwUZxQC˽jZCr/VQO抴EFpqj+Q4tN㞪Sv6t@!۠GuK[{S'7.|]8'va6aY:EA6"ñH1 Hf$a @ʎ]úuyVPvvkՉO욛-OƍɩQaKi}m4wPF,63SKtv'M%ǵS-28dN}y(0n b꿮ǔ(N7̐QDTBg4eUy)?zw4/RsRDD뺶HߝRcVy_N+ A#:hf-Ch;|NI~8*Qv$I^\P$ew0lM3r`Gm:Q-{40řGpcpID,sA0'na{%Ss>LQ&cf.E/8 '} ²}BY:ECY1պmP=F=-u$ݍV',Az<4k|-%R]i>pozXCݭy\&* !ZviI}Q:a1) F@ %v{h(\G7:LcQ 2z |D/ZnV>L"Tleu5 LAUɨɬPrϣ!;t_$uS%Gw4PCǾa֯KR%u<4$i 6?A7Xu?Ǭt>gNA xFZ eS{p5^B/>_7?=7/5Z[b=)RP׵mDTީJhק0@kuXh@G ;p܃@'ևTҒ6x5yrXͮ) **F` F"D;-z_«Ϣةg.W]uĊhs%uw`< S޴C## ɲh[!7LIv|}=hF=c7ӄ iK"$Ӡ^J盒Y;5{?#dK'$GI3@P@dYFn"Z~p^3Rgw$Yr%hG42&#IpK{ߓˡjR]Kp?a#"`/ɮj2g׮;{{{ƘyETGTJnU np<%Z c?VwuX!Wkw/ԡ{b/T15s&!eg3JNa6lnzb*b<cTa,wÙ=wM"mf+_uBh2tu,roVv8FM\d&1;u`Q*^;8VN@>@µQ}O1wq I?LJbde'${F~C)qIrtP_c-Vnvr,ʺꌉ=l߳뺞v2]QBke468KTHfxw$8tsn>z4%Ұv;'L1u} +&-[T;ُەf2i‰&~k-S[P^6nT@˾9e4zK>pֳ[}l;:*%X{Bzzw\C V9w#ꑲ"VHq5X,#r ǭxI rU #'Ճ!+gYGX6{E=GaT Nf`l:jꆮZ>_i>o'?pfYvm%G7q$܃E/ѰN~j`ܬj%o[SZH"?$hcK$.wlkG;\CLK3I$YÛcU:TUѐm[\_%&:xwMG\ף6?1OOjuسusJ4T^ɪ(bGjX) }?It"ZE=$7ƊG*#D({Êg߇ [Xϼv=XOy{Px͚! qΗ D!*Kuki~Q03=zo=_y|g.?6('<,|\.-ZBB7ܫQ,1L %o$#7Ćv2tn<`{+URXL€||P!Eq9페a;J`0pk-ᎉΙY-2A#]DKVAnYyFm~Ftyh; tqH1:2>vAÄ8VF`TGOZ"eGHnqGڧK9$3}2tǡ/c‡8 Y)/d#r䨺^e g}厑cg@2dz5}^rέetOt0v9ȍ1Y7|NZkL%^Q1݄!M`[&t2YO9Q0[7m[9ed\F3~,h"'d&;Uuv)3Xk{sLM#c-۩i}_ 9B9fQv@>z2eEQę!L8PQSc^YdId2RN$^me6)q`Qa5pqЋE0AStȡ]Np7]T,O[G2@I O6 t5/d>Q<:VC`j[*..{q?S3ݛlW&r㾪jB۶AWLcj$duDGD ^B6lŊ#QgsmaWy7nxcn,Z_=] IۻP wOȇ@`}[y@̭FQq-rowedlMk:*m7q2UeH~/7ίg"`! t~=c}+Y:JHmqǔ"̑q+T!*d1#luqEJ<O7]%2`0}ʱ*iFg!,XZ8,GLw8{4Mܘ,˲,+˲Z,˦i|x# }UHwԖ]B2ͥXA (d Y"-S#pg0~:p"!%NǶS_ ^m 1 9s܊[T]dN )x̞,SUw\T-5M;ٙX^)\B#P6}&p-kk& F#`1[c2y@6XI!P~Gb9%l!%+ >DI[sd;C?{z+4xlbsslmZhz8~-z>s{Dӽn?xC,rem[nޫ,$(ݱ"tn :>w"|Ljɱ"Fc/H!Jd%myՐ1}S]iHfjc;t$ 䐿ےKJ/!_ʲmT8ktoXjȂZ61ں;qd=H*sPK՗dPz$C %/}#f#9N:XyC6Rc$0wd $`>:k(dzq|zr]SX΍%`tܔ%>Gk?Wi60( Teʬ]5}%4ogd$17Q = ( Pj mtڲWcs jsMb!]5yW edž9z:+ Q,,3쨪;X cB:@{\ߒ&60xuv_ "F@Ȑx,~x6T=a#>'2)^o,:)J ),$cDs[/E0Ll@ m [RBW"C?eER]|~fl{G_{;?Nv4ُeyn,+EӶF'~U/B,9Ia6$1WYJevs>޾B{HDQ#Ljܙ1{[⍇FeU-Һh DV+D-ea) ]N)T>bh%⪀9Q-mm Z/,?íBuNHҎS` /ҭ '^Vr"z:~Cf^);'a ?lz9t$(Rcwqן_fLBF/ѢnM=n{0ۙ.)1fMydRTUՖelK;1+x $Ey?KV5IUIJ2L: _G'x7ಠcs];x ܔ}zW@nR/nL8bejZeRYudCd.nq/ 1K <ȢI%xrf'`ցXCQ0lc na-9;eFAaH H]^5t0)]e{G|^xf~_ߝwMYNIMr0P|tQ x!3EhB H vטHmsA4^D+c떪fidh:oyх6YDC.^;(fQT0#"<ׁQXUy39g*LPʈe"\?!+IllEFӤV <6ZE> ݀)3D gҢhqyI-wy|togLJxd^}Y\3ied2ʲv}%0s7R)S/ν “3tͽhhbYO@)I4 "T:#)VnڗKKUՃѲKGI~A=n.fJ=XF;Q3Ji&Kpp`Hz^h=Mm8]G8Kјx#A`-T/_P]/?û2ȯXG m򔲞4̀rn_fI#S?;QϤo=Ikr$pYWiCT!ȏbCDe9+8ig ,<,/^@UQ'OG?ξ3KvEgd>L(u]wZ)[jր4VO 5?71BRΩF@)j6-1;Ss\@}S80bB*ZRXDWęH$Uz/Ǒi}9cߎ!#$`EHt'ITFHie$-j0{#*#K*#``.|iTF.TF#`-H:G n2q:`?q} Bhia_-rO6pi)4>V=TdB˙tUU|qIJ٣dogLJ>_xh]{&&dryX,rr1ͽZ倀6w_4 ?KbRN+ qm^pQn H!&3򤦹q*C {0grYֵMؽI } H4ub-M?1IJA}@jר邩R5`ƌՀ-s@zj'8)(Cki *hAPC9D]@"@qbFRGn q˾{٧u&,` L'{Z+p]`cY:a2&Eqyu/[Ӵ/>8ypgx/v.-L plT5ʲD]m&\g2 Ļнtx?/$08/Tw:ճh~4=`D5)<I_ok-eL4)88M^4Q'`p84* HzFa M7 F40?-zձZZKzFA3M[H$HHHT^Wy/<ɷ}xwٗ}%tЎva +=;Fv7N {knڦ|8G22)3@Vv(Ѣ~'Oh{?GO3lft2]Tż2Ơ,Kg)VIߊ'^~fL#<@u];5)N,og;r =);"f9 1Uu!mĤ u]/\(ˎ.0 @XX;Z6ǩ*`@M7bMCM@K.#(Eҥ1ރՠˋ{>2ï"s=g%DqD"^1NUΊq܆0?אrCkxDSPtc={oW{<ٙM|2L&EuQmכpZo/z~ݑDI\^M? #NFւXdXFawά]@=,~hi&FM>~i^\v ذށj2"^oEMG2ZFFFb.*8y(b;U87$JF4.jgʍ]Cy[x/XhC!7ԋG3h^wB4TӋ'vO|-Y篧t:]LӪ(i_WZ_g?HMHFkn?7BxW'6*ثbi*YsҙpS>{KtN0=6UUGuݑN^!Ħ|N`e˲{&:I0P87 #}3DM ݏFMC}t5Ӷ*}ψ9fHp8.QPP D 0` @J)e7K}EWPFʍqK+7d/!C91:wuEgZTeC>wtp:{${O?3t6ʢNeQMUUS 6H2ێ-0Fi{&jԕW̰_`d*wv M0/v2Q ո݊C%SYvT Q%Ѫ-O1o"ܬD40t݅QӍzA›nv=lMGi$3 =90 y erI $B}􈊬llxo DgKf(Rt wwكVoDq&AptLynhDv[Y咫 P(N^ݯƒSӈ7VIAzo:Ơ15*0#􌤚(BMTImG! DTUn}ß?~'g,YMt:L&bhZ?Dk0MFEO J2? 15Ԍڣw9$~`d|$Y XX&9%E%u,QԮLM7ZXRܶ!L*IG#lۛNoR M'] e)AAwYĚ l B !14@kirtTU=Bᆘ r,l[Z5_7XTq'/ײ(~?cnf/I~6ήvvvbVU&'u{hC:o^#'@pŒT \#N* ?1:fB4!k7NIQ"`(>uKEb ;v8:H.b?%Y1MW'zwNyp&0+Ep8f:3@N2-skWuC|.N^ݟN&e]Ul6+c6Cctޘn#ޝD #:p aFXFQ:%DqΖmlAn/Q[ ҆EiJDS#MQWI$[(i0du[P8JMljn!D0D#9++[oF#u~-y:^ŢE' F7gĉA9#Lq210eY+I;Drf%’FfȆ[܊%K`ӿo.G=L?^r~C 9s3Wx2Y@ײZ_h%tu|8&ovvv/gbggMY2Ց*RjpR~Hb>Gl(P ȹydCH:.`Q -иc!n!nTHaf${LM'ݜt/Dyq's$ǨEX,қn )Ft+t M#j:/ARErj:ď頡;Bw|sL?kSXa|DW #}va&XW]d@p|\q6aqO7H,"Qd$@P-zMbd[ zEYth<{{z{O~|-ߘtdSOӫd٩e[u [‡U=٥!%3PUQ=n2SS?~r';a,w= rxX ZW2BTf v0`J H> TuT=1S\,&􌡷R}.0="@Gec)p$IH܋dd%\%?y<{o=t|to-.^~[;|IOlʲ!m[nۖUW(,N"0!-HG}*!go?V_nK7jI 6{Fн:Vກ+#FS p7xxj;K3$j tCCh%iŵF qXyzS|[vÏ*b-H }Q )b 7$RV_I ,YG%ě4=:ئ5eȼ8<9>:/W|OU]~LfGb2,ө)kۖրZUviKBp"Nw؀X]HrsS=wӠCokBGt@`19XTz-m԰~ q\10b`U8[ܜ["ThX-qL!5w"픀Q( TlF"gHRh:0HI,)>.0PԯDxс!{@ųP`8[Ęwۄ=>Οr.) %1#Dbn4 *o{9gloo(bŲ.YKA7Vqḵ7J +Cn}$IA~U0=Ykwwd$YjK+H. O*HeV~\8ڸDhp( Q\UBʛ"Ht7 P+Uo:H N3*0"\CHZHTOPCn*xdEsb?WF,J'{erDY뙒- ZyIo'=?|^lկ?/gtzggv7/ʲ\.,˶:;Lm) E_Tjz8;i-tQ!*ނ)QT44fo =Y iX&*l*4ooeb)YH+#yK)kG "7:d> .LT%FHjp=zI!E:N@U4_FHtg|IF^cH7 02-746XF0n%;(BdCTl73WWI|sy(P0g+imHuLmkmm_))Ni#n\H6\KzlqyYЛ{΋N~~}I?9wUqppP.jX,ӺakyHzSі(.awƐ%P$rd$G S>aOTuOY7jeJ|v0%eĊP F(\Ȉ,y6 dH1fʹ6/CQo:gIJOÈ7`o:K+#>"j:=:WMSC5 j8f%ҒԨkA\2=E@,+&*)(tvҲԶL$etݏ^q[~_6듙ӓLOG_}_fx[.BT,e]׶Ըu Imzw!YOFT<,m=bàkĔs̪2bщ!PA;ib8N" Rajb/Xh'0Oczt›[T&Co6 XdSi7sutc&ZB>bbHj0r,VxvhB ;ޱig[fP*hC^Kt(bP:tEw`Hʠe?$]ΙebYt%uA#ZF1tla[YڂJ.;:޳Owiuoּwãt:,ʲZEAeYR]׼eˬLE"33nc)v/`T8A2iǍ z^OHȖ{EJ-=Xۙ&n4S S[9hbKeQ`[cE#eO kcA 5|VbcC*o::8z%ҡTMg" 26 wSӱDDMljNH#Q 5Jbx _!L9A38K$uS29/ַ=`mD8By!U#@/WQ$"$6\zG^e7xH^tpzӉ >toB\!g3EW|&ESޯi6:T:-i}|;'2ѹ߯U^Eǚ'MӒc383.CQ.:=?y?=*z/>v-P]0kVU-11ö); 8H"T=(Nz|Z/BSYO%VZ^΢v;@hWu`UJrAZ0AA521T ף4+tx'`DvII]V (=(qGzp> d5%hG~^(<\/Sh@Ή$qiq ~ 0R{VY_^ T]-mQқ3zvz8}윾8|?~P[mZ^NervTذE qҖЃTE.O|*5u @!NFҽdR.Naoq)-+H0Hj*QzA&6g>n j'Ü%>0zv`ƂnFڲ0JXtm6##^F>QU9,: i!㠬Y~8G搀ѐ~B-v2ӎ>#;Ţ8˳ h=$݉ r~hc,~lZ8δ٠h}g~v~iJ?UeiP&㎄$nR% IDATF<$(j:hw3kc∛|sf@`x#HzEJAqlFaeFVENB6#Jzt4ڣ 1h,Ntѱ aV+t9[Z YbL+JD>Fe8H1##6{mEhey߮~ørZ"Nf52XH,Lҗn{$l9xI$w`?s#\b4~b+J#U٠o =#sSit.[fkC'75ܷnwqPb։saFxť;,Q<7^ l"0=,PBMTd圆ϱP[UFCi@{ӥ5b$S&|כ+h7_I$GH1,m h $ iګlsKN`3Jb@c%S!cE{: d]ʳY"4ψ/hڽ)_岥X*YNٖ;BIyРxAHx4d,wR%EziA]rAW-%m4ASp 1(leJ|>kl9kf/^N&E?b+(!*5( GooRK; ֜iƛNGHh't CsW餴{Teubj4%XP󎥗9ZՀ y`i L $qRrűQ+zFJ *HޢXSa~)ċoO)/>dVѯlh&, T7`E^+=k$äA rc ! b{/dDh 8px~C3Ƀm !m1D\qɘWhmqw͚ij5 v3E5T# BM'wx2v|DMxy{F2<c!1`/J ^Yȋx'OpK5P1Q3ҟ/5f P *l27eF*Iz*''mb}aSV# '*L$dD&g;D]-&>gt-N/O}r_vvf_.^UUmuJmNXpT!L#f5(A5P_q齊5@jb% 9xQ6Zj٢h,u,o4)Ȧu@=0V\Yy0-V7 nqeŸp!)~ 5ltIHMGHiEq tH Q FbSQsj:3J?_Q}YA ] F 舀Z NkаgD5uYHc-;@6!Ҥ~vlyY/xfqXeUWeYm>V'jE 4d#3|gŞk#ʕf&#"cʺ|RpKʱ(v! Yaن紌@ _*TwH߅j:ѥKw7Uw tRXL1&q5]Е5sN# KIHFO+QP7U Po^(!3"U^&i|<[t''?1ҏWOEy(˪,u]WeYUU١)'Nʓ󐾔HTBkb.2EHif3 eTV-UuKe2 ƀWvn.5A!_/Ǣ`±O= wZ&_Fw<#tXUFʐU EyyC0b:nVpi`īa 펼 'J]1mFco#`[BO VTNےu`ҩ0QQZ٢n >@ٌd3Qv!/iOf/;|qr|lg+F>_UuQUUU,뺮ۦiڶ R!qx?4"bXD~MRW 9$Y~hd VNmʲ,2޹l%v "O3dvca[fq)*;lzªipPЛλQBX)Ը+ aʤ&T;(!.δ"Ek*TDuH>{@)M$$K1hA(  sxE h(^s (s hψxd ܋/C 1Lٔ]WPw5ҬϞN;9~Wd7e3o˺eYeYMӴ]umMW|[9¤,V& R}~'"L=4}þ23q) 0u2-2~ǔY޺OmgԷhQP3AxӅ|TA8*Lc>-zqF>1Je%t Mt2_80xoX#`ڤWr{LM/CT U[; Pܩеs>A sx3RyB(a HncS( $54&6m+HC\CiuMلL`yI#~(>}ѷyr>_ꬮ뫦iʪʺje>e*j&ci.mC׌Rqje&WcUAa*0?v`({k O$餿hH`(.^4w]ᆏewVWWDܯCoQ8%g37]3RC570`|TM6GG,{Ih7ZkEx2D&2n%u>CmdgÓɗ'ol(ޔUuVeYʦirٴm2ACcN b߽Vj R#&߬(a?&UaQ̊g!Ɖ`˥EQ,j"C6?қgLL1Gr8`!sH 5ǝ>Q;2 ̚KHL;xt"E)  ,0J]Y ܹH o".Xq  INT F<Fd/ΥB49(I. )T0F,!Gk=@X2D q{soh;\?=6==9l6}YV7EY]EqY啫i+"Yȟzl\/ڻĥQɥg;^= G"S~{ZZKNT$HmT<gL›ZM8#GX>}&Y->~36 bZdt&\#ns=#IN'z,ؤH0:֕I"`@""F:KQAɁ_UMp"τ'F(M,dKdz€eSdua~MGt>99zowek?XZ-˺UUڶ] Jeo&ErhCp#bxB lFW iڸa%ʹi:UJ`NzE`k%cA@j n]"H j^vN voHkЛNz~=Ы= F"N,L+ *#oC;c"] Ie%?Pݱj ʉ?}Y+(XD8W64sb ;W$`DM'A ]E.vQb͂tߐvVtb1Df[s9(5֟5Ow?wїEr~6/.WUhnJ ڸ ]ܶHtM*7DOHOɡv*ޑK7Ec%nER‪@> H!DflE)^|v͐&e+y|:..//bqeUUWu]"G5*u†Tox: ]ȎD`ERVj5fV {;(.b9NJ#n:*ʖDf=yFd%v@ NXsNJ{*[?C"WU/=#DoX2dc+IwA zFJ!1Cmgۂ`ѷPv@  de#duÈFd#j:M tXK+pee$"$tEq\GGZhu!#`y)1]J72J 5.#`*$ n Lir_~N|K)?ɛGdyq/yYWMӔO$Ru`@ߵ3kC nRiGZF))Mo/1=l{ڒƕJX 8s\0c%6Zƾ#$Qɢ+ =$m^&[?J,hnLzDH*0;p; ^EJT(IֈCyr…In""IyJ"TtzΈT1mp`!*"F6^AgVȞLկ鈿),{{_uŢ8_,eY..m&䟴JڤRZ%xn"eC[I`*$ %Whqo(CRgQe SQ,@@Lik0'aNM:ccK{ǃT#oH㮙$%8e67B,9i[|JM+*ԛNx2D o: ZQv7tf5G%6?!eFƃ *tQd<̂ :гppa_- jWERX/l7 ]wIzvIЉ@iޢ ٔ^~Et -ǧW/e_>:>|w~U,yYirtn6sn{ jv7IӣSTIl܁fd]wg RYu2r2`7ߒGx\A'T09aQ[ߘmN3 &G*#Zi:' ^ohJ7 ~n7ݺq2"+#Z]EŒj{ ( UztRo:@0to`?t_ϟ>N˫7WWu9W8BݶoOZe!2 풳+gY!&,v),x(t4,,Q0vّxQJuFy7@Ay~Ngd+,^8'b"{qv7m@VEGHqo:am3#lM+IzDHPM7NQ2gR5!ј]uj&A*d oDmYHϳ,Ie$Vi"d9:ǽzF1WS#&1+%Fw5/i-N_ydUyUUU͛qEmBݶ2N@osH6nԘhP RJ:dhh T{"PAߛEK˥ z#ivw{h5 :Lj~Nwdgˊ)=ymw#aʱӕ{ޕ0@MxVփvtXψVFUsJcφM sVCFV`IC Ffk^71J>L 3` !gO 翠cU}YTW8+v]l۶u`]/67=.$9XIy0ÑץV&k-Y}C[i%Y0ڃQ;N)0RTk[vg{|g[y@ct4 KEᫀ'qX9Xzjoktj!MTFko׃Qyхn[`>`37Vߓ}+\NO>3&bj,(+F&+hPz *;yA;esfN9źxƀ[{_CWj LURUulP c 0)ufL}n%RO F:c6x&0'=q_ۥ*:*{P*-I 10D= FbdC 0 dQڽGLq蕅;רA83&M!(s (4ր! (/'b2Ju6J(MbteAIh/?#\OOv^~vEݴ8xuu5?+rt@ԍ"^HvUJ۫F,Z-5$R( d^y:2ڹveaMX mFQ9Q`m߽rϛh!N (3ě.l˯C2gt挐xӑ압F^BCAHm `@đrhDD"$ԵT7  gw&\7(1)ڳP~Kz]x}}<|u~/ʢv F(6e7{ނ#'"yuH>an@v}츥ccw3#SUF:/%&CmְE&'QMbkD {Lv b񿍀AdjS5ݠED6Wӭ%L]B>`/>'>:?߾xrEY~qqQ,*/*\U&n .aoH .jn>9f1c.\j|AS[.9QM>%2'\Iq"0v ذĽb8VfkDr1`YDc ` ㏽1%tPM옄j'8B|q[5 JM@J1"^M  5't#ƈw ^[Ȭ P%TLrFbTQ`$^QӔYe.@;| \P7_ =ՋG}~~՛EQ\:B#ƪVKܷ[+dخ|7&Ɲy~8af!c1GPa;I I"^IQTFvf7WsFr)"Ca`$V|@dD)!S_h6%=ytG,;g/(..˲,˥.7 sVERIlgɟA`ЊI &Ynv@tVh7I9zLe(I#/D  2%%T.Â=m8G6_3ʁ?ENTn(3bۡ}o'Ng_UYQeUK%Xt7Sm' oC¥BA~KNR dpslD$Cz_jTA96GH'7lC-uSY$zꐃx2'Pb7=/.udt4;0@xsyPErx @tCZk7EI6%!w !IznY"GHB _=] 0RM2(ak`uC5GcI ]6)d/_>r1WחW\^l2O_t{:z;/NսvQJv5hC5/_gVr<,`尰9lz EW5toYA|~uJnmt~̒o ]M^Mwo:Ld]Mz.L~i7̛Vz  :`ȶ7ț酌T-ir2=tF]ݫ_$S|vrgW?]^/,EUU[Q ]p\Q Hs7Ha?yZ!w%@?Mtqc=9h}b4detb;P,"wVQ7Qi0:hCn|8l]:Mk.AMɼ)m۩9j: q5t!FRaj: ٌ1; wԽ]-^8`oӲn;;?u55u=/rUt meaӰ$?!+[" Ta3jL. be8H)Q6F0+sMVRwt-ۉQstdg4Ѡ$޷x8ePإ;AψWQ}v@M' qck^Y$i7#])`f˜g@wOGՇGO?L//.^ś,rQ|֩֫66k;~l\҃CD謗S T+"7^=#J2[1L>y,I\M7FjgLł }s[(;~k~tkh:ZMu`ƛRg#2ō֛R.@~0M7B5B S>#_t|dajx=tW$UîM "_@R;NKRwYkΙH1-wR$9=ՠQׁ=$mUSC̴CC0TM7 F1O>< [Ф#Ƒ›6Lz}+=#ㄦDZFctHψ6ц=ꞑLzt,SAI-tg|GFWX}D? 5>}vrqk7gbqQ|^huu`Dk H f6!@;"{A͈v>7H&q.ylKI!Dq9m;^t<w}62%O4`+&8&R \Sl:K CL"K)oSQ*QӑӮ1/7Jiw FG:; ۆن"i$I ,u Te$nmRÉr \DJ9H02&S7^N'>:jo^]4/?ެW#Kr\I&ka@/#j 0` Л$@zӓHtutuUN&ov<1 %.q=<|jl+_~h57fzp7^{EZ5cqZ$o)II1@k F{zX,PZMH#@z0=!8Z.;UUu]40zȌѮ" @Q$X*$I-^G竚,ԨѶ &A%/%_֠\qb" E]eB(k<~`sϗ&+ޠ=$"H>DBbp᫼(IwY7~|j1v hX7M RyWTa 0*lɩZj_~}wh6||XsyyuZ.xi]Et78a;ۆ6@R0o'D5Q2r$BN~{HsT7K6)Iы TRzZ~W/; B$kbf.pkkK:p?O562J ސQjF~\.ϖWm.r/Aӽw> e]~'&IJP% ?Do4HXV} !J`Mz>WR"18I*,6z)`$q-FCkˆ]-R2nPM=󌐁 KN HA!~DT;N25K=gHz0GXӋΫcrRt|EE':9^}zQ<=3$x Q63%Sn #(]gh Zȸd~\O߃SHŪ!qn A0Ć-Q5(Q0P`(Xu$VX 7ą]7 tDZΒթQHOsFJD@2(`Ao:hL xk:5Nǀ4^|zo@\m'ӫf\׫*?_40F]^P{Kψh I/HSxn4m H5-;P7U #&1쁉Yk" a[E^'Lȯvw3R6CD4ҾrɝDFDQ%锂M_oQ* DzFTF\ 1vzFѫR>o/$N`&Џ\ +u崤ÿ 1sr딇rXd!i;Sq:ݳ{I4`<Um#{^G^W{{QIٴM3͚uMwF4Z" v&AbʭFq=$"ܠAܧ(3RkQ1d&,'5^#tzB6>w$Y?~$PqD/3e-(et5v;\UF%݆=C*` E]1j7Qߵ5r\M'.H7a3") Y دo{IP*TÐҙZ"X|餽&w^{;}7xbzV`TeN݇܎>QGoBU{Hڬd2}0c擶mOڶN>ܾ@jN`)A4"fxe]E%N7dzMP^hmx\*^&fS-ۻsM0zq( lo;HΊRw dhXM7Hv76 Fqpr.Ъ5]3KzFc&s+rɣޙxbb8rlŒQ3Rvĥ7`@lͧY6C1ig``_g!"[ 퓰؄>-.Q +}t L\b C[G˔Lzڽ@v<8*^v27B\b[(GQ D%wRWȯP(늸PFE$#B_P6i5X%h)#m"dPF"+`$2JEZ$SIDnKFw3*R`$31D\=뿗_̞O~pt4zby^u]V@7)b(နwv{z3'Y=s1FVh:IQȞ!$>-gٓ8mQ!7n3l^6ҍ`()4MPMtEEM^<(CthN)Mf^,;URuXe$IC !g@\/H")[|kK깗IH>$N~V=uŴm;afZzW/N;$$3ʼn9>CX|$LVo,HyQ:$;3 tH1vBeҪY*H3FZM T!Ӄe=Lh:ϻߒvSJH{F2FݲOAw1WM0SP1g=x>zj j1x=TMn1k&Gȱւz~0;ބ?~u;:9) T87CDuSUseWhz|н ۘظ'H0DDߠ#J =Ҕd&#{ ~Aa(ta;hܟLIX 2nD@9~e4]MX#e4@imJYe0FE:.0PE?]_ DIz0JeXQj1.\>zX..\)Ÿ C^ވkKi$),|Ev2H4v1ծqHk15{S%{Hf.E`sshAE֋PBә LJ5s:xn@썤'e2h+^k qi7wj E-s~ҼI|Bքxp<\ inH3@kFj:7vkNae侌@kGvͧwLl8j s[M'G^.V_{5妋Te4ctR/ 2'H1: ʫb4#$q8 Wq0k}z{_YD;JRwq ѓǤ_@IDS~=PU1nXt'cE4!Odv7l| s(f IFT|Iը(HK%(0PO"U% ;0(pqf"QHҫ}2U䖀!UITӑDܧndAS~ӓOz}]Ueح IDAT#% /#`B/H/<~vgHd{Dy X3T>N~_묩8l I8y!6Y<p.+S Q@)DSyO6ЖQumEd|g”:u$zzzwjP 2$ռ$dPU/C 9Z9x@+Qiqp=h2 =~[ |y+퀆^uD W{CVPhFyҫS5jz #=pTE]| o6u胫˫guj vqxn J792R85.Go=&ET]PߓzG]mtTs>fs`vAKw4WHr@u@(҂[hqlwZ@bq) *[9Grxf&`fS *Ƥ݂-\@JMTM7W(LN5j)Qo!c$mJMM!3Ji: v+b.ej:I Mʌ(,B"ެ2P VGo:BIl$+5R>nǎGT%tb;b$!c h_@^ r=G./.ՋL r`1H}7R edN;M)ZQA[114L1 YEY t6ͭsc)M|#4A lu b& "38fG"R!YcC#܆lv\`猴5ZXW8,5'c0 A@윪==(C159\(cnіj0G/^LFI]-HbY']%dۑl 4ЫzvWF{{F9Qj44]t8lq\',Q HPD={i;Br.HuAt3Yb"5(-d 믉ۏ<߾MUqvql\]Fѡz8@@Pv{ɩb{}4i* C St:fEQS"*1VD&6cHtzg>7䞱Xu!K¬ju0e1_'x ה‹KضDA2Ofӻ'DEZ I@sh65i)VWUIu B\K d `c `"Y FJ>4ojI3HM! sJњ20H$@069!DmDR!਴]z5ݔUF} WF*b-~^t>.Usro:!)j0kE+ƖQ7n-(OXB1*h7Oɽ[ܭ?h[Go_7gg׋fts٣?ucO )*D R&1IZ'޶Wѹ{0l6ɝ;wGGGGt2YkƘ9MEU$L=v2ϫ`xɺ=$H 8M0)1i6&v27=;1+"jBDDΧE -oO B]pz VSv!4D~0P&Y0`X8;3S8vASL"Qg$]P2ؘtۋ*-Ay.iБP Uk4i~46Tѓ@D*F gBi#1+JMDnd+fƋv6D\HN>7 Z{:@M ܳȳpH{SpsI|8-wߴӫřTXhC?9 i(4 nqV少%,l6ιj fdr޽;w5NZk*/V)b_X{,d2H^|8ZL -"hmAvh;Dh*rE"r,wz*cD ,IP]o鸝eI┭JuD1pdf&h9BkiN[?#Pc;2_R{Uz]Œ_YhEWClb jyҫV%!ܷ͂rN3;y{}/Nc0o=G?w'~X<\-;oeUUmk~p7ݡ?!{rB'\w{n/, N]HX@ 8*ӷ @\6w#K"AoHTSYC,H0eR'1[!;;qFibvϾ}g |65b٣J}Ek=2*&2ݍNWvS~N o%gՆ =6 UhVD z:c3"Cu7Ł|I '/^}X._Vzl۶Qf70쪊 z B02U-ABs0 1N[Zsܿ1ͧtz:Ýܭ"L ` y{dwЉ.[<Wl(Rg$ I 4 `B .rYb;XBp_k] 0 jsyVIP{Q4"z>zRC,Hʭ&ej]׾[hЀ0p!Q,IUGqTWaKHIeZ7R8HA+h1d`eQ"&E}^/Tт>PvJ9J'5R ;1z,v<p.=,0AtxKX[Ūz|uu}^/,˪iۮ݇IR E? TJ}D}T.( ~M鞃xB:QolOQv6fѯ_~Q =ٸI]|^> `!~%G7uy}NwHp}I)ֲE{`@ A <-h -ivLt]uEW` pJZIO1'*WU6+DK-Q<#AJ yΔ(პ'PF-Lmm>!֛zZw@/`hf;وnR!J;*$X&کC qEL5Ec(b2̬w'w_wu}Z5zB!L &eAa: `XFd]?CbYDt @ྤC"~$lቘ&S&L+p z.Rjl88C ½b'+\à3-Hn1Qʧ/ aXWF f\P%d@2LV`eɿ"ki>V$aROQ<3 owD3Tn:QQN[ުh ;1!*J1׿N~WpXr7`J# C62d@T#Nۿ|譓ʦ}|vxX,.˲\eYכn@@ڃrgO ]St#ghKq26BKъY6-l9q9X& o _s5%ZG$Yd?$u+kbY` ` uEry!()Aq)1mɿA!Q;cV 6='KW% R>u^8, Z!q.?e U_L,y;KPN+EQL#l 1yTsR5"!)ޠQo+SORJ-PR8xMޚ*.)Ih`ܪ$̞ k7HL@=o`v|,Ԟ;wnjuUUUP5<87S*j׳~l d"\uCqt XMS0 4C']$\IokwտJ=#GH*@[-o&_AU4@/`EZ1 .$ *b;"mZM' k fy8 ZC ;̡x&*'z5\Ka7_KzHfxi'ܕЌv#,d2s*. śzI.bHk%{ %y?Na ޢ!uc?#J}T f;0,ɺ#j:'N#4_>8 ^]/,W+Wm[QԱ'/GB.1Kî-(al2b>p8S@af)Źfv"Y%Q"2#";k]a= C7zwEv@3=!QORzF|GL K1N4a} ԂfX"kc ,M۶n|XDEZaEY O|꫞BE鲌2  ÕjgOaO03n̵q:V¼!XGT)Hd3b3UK|LVCaV"LHTqU,C8@+FT\:),DLwǣʋFo`P\njVe͇#R^d@#Zr/`_?(>MǗWoՋruR+\ČUEyJ*!pm8tu]x0m°h6G>AKv΍,t!0wv;B=#vLد.dɪ+9H(;@O }J 75z88e%=x ~c9EZ?10[4mS:%3̜,2s:nZl\ ?hA(R~UYZa$"tH) $RWM"KJ%HU#@L3J =-vYA)UQ"s'h@P77/~cd-25]2T`OsAtl1 w_l~P>syǿ|Β5de.,ɕ[/7۩E_0|2XuF7IŴ N2zfd'͆alLPGwvr"  P-qSOꂛ,mف;׺F,6o5 qQZ)Ɲ{GmD 1U5Hs׍XsmUA\rW__>}GL\R1`CÒ.7ԯzl9%b4Z Lyp5KT:7#=wZs3g7>rpaoTMmuK)H\sMqR~ȿW_\]z,˲l6DI;s0ܤ$c$7M6G.fKt}y=ũ6sc'Yv,"7QN&Ϩ0n_Uui&4 7e7 ɩ B)o;LwJW߆50dIhPp@%,usLyi'j'Ldy1UUNvӴ횉j23Kn목qǖsMSU(˳ɇZ'(˹54!c(xHAP|qxpb2YZǮrBEaU.7US6M{PuιĘ=N˫rz=^~nu^_TF|2k_\e7afm`ۓg_QS -ckeC ۉH,GX4/utެڶi\GۍPZh.0et7f/˥dWIvVM3Uқg*[D LϜ\.YeӺM)qK!@b眫LY]_?}kCx`vn~1bxk'&ehИ%K&Xkh㘗U]7ϖjжmf1=5GˋCQ1vzlk&M齣d8+-oC"nir8j^Di$od-N&sZOx2y.uv-/-8LM{զDEcd.>#xgWxp5櫋bjݡW R'VH[=Qprq],+cJZ ag't~4H>j Q%ܮz.պ6eU5u]72\}EG  d<# wfvl~2Ki+I=J00zڱwp`WυlG)w?,D ;ƹyӶgnնnS5ͲuUUe4-3ymib Zf>[L'XgPPA_&+zH>I/iDbnljޔ 5eUZG-^,3z "e꓉IgFdxMU5Fk؝DD;t38d"wObqZ0VՖanoF4 ΢W Ÿ?}]>}rrT|X],Wgj٬uvitHwgW! 7M6u#"[XLuQ( KDZm\rM,벬i\]a'BCd >I_5Bt?\`a"s*ff6Mg0[d#k[9#!NS[FP~wXU W8y UӶW:[6c.l۶fӶm/vMZkNql)M{D:_; ޤ IDAT)W_PYҲֹi۶릮꺪1QRU඙4MSTڭc " ?BG8Vaowor,H(eWԙ1N|27wlZ)8V9b#d`j:8 \_N돛_UUY=^^,fFE: 萀=Q$@hSSq0Puai'ɢ( ܒ 3 3;D9s/W8biB@v~)]**`(6X"ųjJr`aM!>^q'}U C"I^~Wƒ9jZ], f}fzDcԶ-s6 WUQEQc,DdT_BES\@Ǟʟ üU΋.9ڶms<~o]SMYZkk0C,!MݪBPI/:DL& ܔ3W$ЦP"48G0 D%ճ4VP!RS{f?/N?ZX.JeF]`[0iۭb1_@V Y&KVbCN,&BkߴA M9)o4Cv=ˡ.7Zh.*IzVUK,UI@Et t8seUUz~8dPz9'm[0l)I?3\#CԡB`}މUSV.dfB0U?;ׁ^oagٌ0`ܬd+eQj:Qq#Av@_.gg~0WϗUM4u7xFcUѭ%);\nOb%ݸ5:HF.v3k\(u>kg\jqJGDV48lrf^['PHB2nJg?uKъ=ƒZLVSv΃S!'ݸF]aavm-F*xw4u50T kH&F^{sfn:#4TFCF(D/H`|Q1 >Y-|bz:ߔ,u]0zzn4X)nIC4Aӎ0uȮ ow{HQk8^JRG~nd g$dS9U7? Mh=7UR+1a݄-܊e:YHmd\!o,dO{'^FEv,ۂ}?S#uD6d|GJd`WgiCQ5]rq:"K49Gn)N٧}vX]U|eU/+E fov41+#r5_|lښ[oöfA%I'v\kyP}R6Nr~3bxPrH#0s2W&^\t){Ou+ E0QZZ)aTCK#@&]j "E}ˎzVMrb{x5(w/C2cb. A{9}=z#z~l.Su :a.k}&3J|}.pbG < f;1vZ.Y;]r F|d{nzj.(Ќ@)''/OGMNe߽T> U@11J 48qx⾋ Zv.:TPz_/dy;9R ~sEV7ƖU(I.'*f O߮y|2.WϮf}V@CSF! ,秈4cEzH#MvD<(MV@1ؤ9kh >[VW~ިj۶} &=[zE@ri:Fh`N{wu´dF˦mCL&/j&K&=MgT̘).Q i02R l uYwAIz|܀*Iz  Gcc1JB#" p{Hi2P9n\o۹7D{;TD/O^rB d"fBn-pWO?/zYTsε#u7to`h-j8yv{>澓v F[=u;=0"I$}ZIT\Ҫ(naNAزny5 y $;!mWIaOi5 ]U;JR >@t![= Q+[whѓyS.!W>ul.Vz}=7rِTF ]nh=PwUc[o$ Q Ey98FLkF6DHK(F0Qڝ@BqU sPȚn+*$ٍ3?==]sHi8UҾ R ~mE宾bGk&d9G!$v|HG1#@ cs|ֹgBQu0:{i-" 9{'CS 5w+irB#e2C<#$>SтQ[o=|+0*A0mISpId߭`p748H,BϪ;FP dIfM?v 8ϛVaO՗o.uUǽH!Q+򦟌M,3)!uv*_3xqzFF/'#Wrnݍk;: ywYH*g2dʵh60']D^U^-}4WmVğ cjP|c }@XrP+{a__ TB?h.0"'Ur1W0'd5\ѩcAvnH ~ty|x馬\/VM4M5@=Dm cC\J0-, >#(y;h?WF9HuD/`6]oz~V+vH*!?<}Ɲ sH龢 I҇(;я8 ]oZ 4`I+שD.]R(I #A%yW(۳goߛ|ڶyYTuv9vʺ@ϙ= vTFvcvD&#@2fX ~2*"h:^Wr TBH*a. ڍ.2OHl$ CHoJY9ʿ U1e쫒dcռJaQFF ;_3gA0S!;kI.=޹cr^6uTu9-ط)} i D[oyJ pVFCkUm Hʣk`GVa9n3RJbo:tkCskPҲ]&`˞^M q~Pk1>sYـR~>vqsԝVoME}!+dgaVGwoN>/r9lʅ.a nHNG#F/Ӭ=d}1k_[3e Tl>dA?q,7C]O ӟQR'h導|0Re ` x8zx~FNj|Z_m6\U2F85v$x̌x>2-hVov*p3p]zI@br,x/{0rpOC SВhBY0r1nOOɖ_WR[j8b1;1?o0f?$. {}Q-Kj{ PHulb|:q$~4x_హW朳v`뀿p!w. @=m*l2PeV֏疁^{(|e7 {8;F/Cauq7zC} qiYyD;Q4x@_aV}wO:ڶ7|\1V} bet?i26 z]Nz/8rXDaGBgB>LSP6xhlmŎx[S0l2^bө+9xju|߫^ ^3ƪ^G۳c+.pkㇻg/@ˏp^\{~6f*rUus#@21* y'O3!0Q"w-5HF+G!n\ &C6M7D!c?b}YhGmGH߀9UUu7qhEw_˿ f9fbkgnr 2&M=1w2`N F mFh8&`; _Fz[# |WzCh+ˮ ZbԇKH5|Pwvd,Nh i𔿜OWj}UU3s?D5z F P~NEW4MYUUUWeY>=WgoPL@؎gvyHA` _+)vsrfkJnі ! m1k]M+#"gpK$5F/t~uvF cZ}wNo:~gr٬UGUwheCoBp<͆Ism[.˲\W'D4yoӓuyRVTm9J'#_/8y?Gq|dnݒ fN|`)(d2|q^sknL2цbc{lŌ\}AwiUaUu)U]Ue4 w /3/V►D3z]YkE8iU]ܥ;G'Ƙ]DRowߛ|MD3/⮵u~2PVoApeM7Vm;w{O>^ɸVFGTvCd3Ђ_yok==*ZogleҐ>}~81w/uιj@mrUU|>.IQƘ9ߢDD@/.<4F(N[ǿ>=>:>!E>!N91(`ٳhI׉>Yﲒh6CE)`& g7|pJ_Xor\WUbCz~[!}o. 7,ܺ,KWUU3NEQE17LL0z@UMClvrrr6cG-% &";R;2P0Tqʂ0w0n?_wK>O #3xNݷ|zS>/,UY} cL.VHsI:4D#hu]\uk-1KkSDd2U 4筵;Z; E' re~iw.>oKyTZMPq}|WfeKʆP"0zS~;s"v\eyl6u]`J7n~]؀#bfe) G&й-|`+09ЄJ*nx3]2l۰1D *;Fn+wUQvC<N\_4oo}ܔgMyR`=2ۊ~7`(b>Y+!`d*9+" ;i1d+bk2|ׇr"8wl}|?o d[M!sN+ܝ.-bͲiX5st7[ Qv`x MAh̸b yuO,&`H\e6jsVPVU 73hy_!i` 8 p*O~ٴgeY^7oU2N=[PqUH?De4V%>#VB#"z!L70nNiwgaQ7"VXDD@J\eA"ՖZmyhQllKնwn{ƢzN2=noRKZHrhȬ̪%ȸ$P*}q2T9@G6[*%Ϳr2"k6T D R}XUN{6+LGfو(^B.QzCB[z)S0ǨEJthEy@JnJ4Y< ,Lim'iwqĠZ5 2_0hN핊(DeA]6-%xP"eoA#Bs?eWCsh֨Df5(IB-E 7t дyi*ZXjNʁ,C@*$Pm:{ni|k`$]}:T+1M:L P5q'lp`Iğzz!`6_rmrp/fވffOEn1c+Q9n-J_@t,Ԟ!_8$/V(V7/Pѐ@}ؠt4SJfC-Bv"8s2%o~ I2*yB}}{gj5벣9ZHP -)K$lsCSI IDATiFgHt8`9!DmzKp윑t2s#UckIגĒVvEHPZrGZ@Rd=(DZܜ ǵ(4Q t*t[iy` :%pu%;KV 3H2\: YT DܭձB: D*ğA3R@؍-W!qdfTkF3m6fk:qE:V?*iAniV["SBu;KbcUvF@s Î(UhԪ sӉg(gZD'\81r "H^%@T#aezSz#i6jE$I. Q/< @:!v7P]@ W7pڛ_;^-nj 2#nQk&F@jYD'n=ʭ"f4"ZDFD@A $r/IdW(F3:o™*t|Х1y^Pn?b7x 7Qj70Ԫ ŌdF)ʾYL-|oiv$","̆$ R. ,Uyê2jDJDzT&q`r^8~/NbW2@N(ۡU~ )ۦ ].ݤ2.N1 j%''Xᅢ¥}aa nX hF)~#+ZYl68tZ";*鄀R]'!ZtvNT}qHJ-)yFTbܛi(_J$PU^D'&+B"(<8ݜ>n`y MOsavWj#y1;Z -Ż|c@2n\7yܛe.`$R I8#YZhtil}홑8~\E(0VH7ưZ4F~`SQe U^,Ts W`̝PO̱-mK,mlQZQ@" jjTgOOre;g!:t;ix-bbPɮ }"K* R@A@9ËɌlF'^Rfg{OD""oPJׂ>WyGNGo{?b(-6XzSl OusS1L3A0檯?QCX25Fo47  &*Ps KEZWZȯrf!nUdG BH#G\q2"}/ yG~=uᦥrP "҈{o\^?`OQ}0yC ܿ™ӝ9wO]+9We=ы6oe5m=T6nJx-2V3,7brM]a0 áryY6m?C"vXm!$8CX"x=7EQ4Ygj=7{f)BO+1wܲ}[ΞE0q"p|HўIǵʁኍ;0]Mf$H?Qx}ESTJ:]9翧%X +:ޯ(HjӖWD6Ц73A C`>r&R;+ [=Ȯ׏Eҧ E h9dl3cH|tmѝesU  !i(;*E4zY/}eR6qJ̟݀.Rda@u=pH=FV߰ro_:3Fwt2S7ܰ?}+VC$ #dؔ? I,h +~q񃸷9.aw򭛦U"@Ŗ |,APaya@mx3Otx `q,K'ހ`$R6HMV{@=0wDgpFwly;?WlԚXN"R`X#m\v{ Qc w{'I$vg_ J)un|?]&gb!R"HLJnzAM ,O 7]BȮKh+s3> bBBeSQQ+Jvg>ذelD'ܓ`DӖb,ԙ3*۷|o~fkM@dEb?a@3`dn8+?BZpjݹkF-N+gt/zա+2( h$, 1@b@c]A44=Mi݅x}rpSZJm廥t8>(%`9+ӵl zy;g4b9dWxc3#bOYCka%ZĂ M}:1\ _z@u9Nf#gt~y0g#á3e!-= %XP" Bi_JDhԚו^鲹W&!frҧPBd5X]KvLp6HoZgQIٹH_׍NWK"v$ 3 ˂G+`$a{w^w}Jtw9+6.iӁ`!#0v=X`Dұ"JhD79(*me; I}|⟎rJĹTeN( Iv[`mca0}2ΫN9v mnta,}DX,OT.#v!@'H0]p۽[MR<N+gtOj^vӦS1V`) @~ٖ,X2@"0ko$ e%9olKh>̞)utE%d^_{kiDiKz\fu"cfr$=Q>0ޱcw?p喱Ze.3S4-v5 l/Jnt`  ,DJ-%,Жc#m׉ v-KÅ0D֜7wE.?!קTJ v@:mcld2Dʍ T3Vp#gDRߚso{•[gf`H@@ ׂF7Y['"XN 4@CmZ_<5'osJ]96o~ǯK^:12TfJ[:KKdwDg7xuM-Tb:omyyj:1{ )N m~lDZz HaL=ԅ3K9w#-cӾψ ˌ5:HHbDl;eC{0 ؄VL$-C_G$1}4xԁʑxuVoo#]uke5j,<T(l'(p Ŗ(""+JYqXyŗN6G NdwBB%FkfMLѷw}e׍6,eF9"4y@2 'ifhj$Ɂ([%+Hʖ$ Pc1}C4z= |ȗw]9شm}M7m`4*Q,6_l-X;т-ױ 0 d;Pj1$qM X5Ե6J1>S*ȐNKnH,#lًJZS!u*ɦwضȮ֦`X¤YȖBƂ{r;=F<6^S-p]꧁6\X]=Q~mNe[7o~}ꁙM[/;a XCEʺvC;u\NQl6,dFdžA, Ieno3% L n˞QYًHȬ8w9=zxp=+g TDH &dR/ِC}S)^3kǶ?'7ot`pe:f&'h\c, JoN7U&sx7B)@@D$%%$o(={uG_;c䔺rF[ذ_[;cR0̉qt<Jm6I̖wcTuDqF63bB^,vt+_?zkO;<{a9(M:Ih0jCyS H rFo{GvEFX.,('XIE Ȗo`~T], or( \BD# | u=W攨8#Ud#Nmܺy03""(%63$1qsk bO͊y!"BiϔOXkDfg^q;T;"C:v[ra lM?u+ˮ[ZQ"h[Q\-Y5 (l -rf![J* O @d}0$Q@G K $2 NRAY~рr!جi5v7t`As`Hה+,X/ӥVl8``^f@˦ŀVNfıA0 ju ,հLk}/xз:2 5ʣ^:ZK%;2p6R8xyۇv鵣5!Z ,]HZ Rlv,7$:[nd{1|a!ߗc?O!.D\*($HII$ -R?l#4%pjU{&6zN[3`FRIkjt(GT]' EH%LVW{Pb kC"!D ϐ!PGM)G{A[>8Uٿˮ{/_y%]ĆHb-mӫX ֳ6 ;STۇz%{ԁhH0PҨ'5fbad91I8$֋_jJ0&!1Z*zvc[V _}$q*" @z;~ (zD= }J1;MGO},}[)27މ[7)!~% \*` r8˘TFMNvu{Ϝ]5(( v&E5BV"hH?D=;t{>}G~m#Wo8>ՄD8oJ#STYST*4 u!1H6$2qSSTOhRvԽ"_kE/*R$_3$ ,'/'Lz h-,J! @f٠=jF_xko샄Z; Ic%}HH3:=jm~OHn63bo#5K]kۣ8_}Uq)ay.=[x&8PMtÈ2pBl3M%#if$&I粻 @G͆Ć؀\E<8udDH@.5zBfX /'nʽ___?~CTWD "lE0=b׎ϧb4oˠ4"_{M}0m޲  tz,PY)wn3,43r LEuV` YUQJ~@ +a1%!(u I.vt]8$qExnY3"٧c!L<؉QCS j،/f2 ?b9Iy0IAl*eQˠnC7~{'YQDH F~fU+=F~l' Nr^HRW?|ՍaomCP7ӒNQ"FE6 7 eͬj>ȃA\\r%*GLǻ,͒ Z @DB%n R%1f1`(DQ[ܺ ޑS^}n\Lv Q]OS ܞl|ru͌G2#*_Ɗ_w^?w}㇏*" @:VJѳ`$*:<5`Ĺ͇$4n_cHX~fۇIḄlXr2oN}$Aޞk*jǔ15/N}!!CH T8gb^}ڈ$ "q-{Έ[ őAШđ_{k 8͵dF)HQ&Ɂ97dax͌^¾sOnLNt8>,NI(cIlfoLSJ& 5_ZF8N&N3TK2@;w AJ@!Ӕr;^yўx1D0JBDzn[N U3\.~akv+DMFC#'HbC5%aJҦCRUWtYR!y0LDq(%)'Sٲge'lkɠ\ =2pgd `g!ZuAWt 6K2lGga;ifmcMj)gZ-f=$20RMRz!% F-[)`QM9#8V0^FR{ +<6>V{g#3Sq NK 0ɼ#AO6\}~5^%G$ɿX~$qƙKN|CL)3NĒlwx&i݀S8:h l6D MlȽQʬ! BtcW e67*IyrsUp+` ZZ-N)HY$ dFe:HEa>W_s|peFSTD k8iiB90lfT ,uv@J"A|cJ?;r~ B$Yee+9(!oW)n*%#^8CGg\Vu(י";*i,32:ʗ>Jn~:8~oTĂ_8Iybރs y!UE-?lc(]?#+ 4W:x\~"bJ%A2"I{,5sFr\3J3v#rc/?oL=QFEtB &-0j}JuSD >`:'jĬ{ݾLXCqCȲS9kd٪R\nu N2CYONA+ͥ}|r$:Bd'j葤6݁KU+Y}*:"^F\}^k?~ߜ8:=+Eme(A9,u} v[&rߜn]N$NJ>(NӨwn}|iwZ_%~,'9ݼlÂmfmj1܂5.iƳggt8#FZN\1V]{Lsbj6˃0`TDH'-7uP/Qd:ˠ%}pu@cߞc~C$O+Ү1p&BH3=ܙQ N]pzQ'KtNo rTfj֭vԪW)`P3S.'ȁsC%=yTdF7]f,#1VylXϽԷ&y\x^Y.Δ3.@9)zF-Aʗ#%+ dF8#rv)gQ'~T~ջrY=x`[.e(锄r"H"= FgU+O7(ubُ|yN+q8Nښc]s*, (a5:6M 6ؠV5tKYfKm`$dVTug9#ʕ騭LG]8#"HGgW⥱K̷&f&x j`TDH)E\, N)!#ĀKɪUXk/Ɂ&23ڷR 'n<rBtg.|3͑Drxearv/cqA3ZD:4j Fp#ѐ(J[3JM 3g7Jnʙn()*9ml2?qGM9񊺸" @:],aӳ`d2wE(j' s ߼cD)Y; lsto̙3^E^Mgoh\ M3=;bpd'U^רWb$e}"6Q{CYZěr#$2o:?0)yF=ջjXթL2(G.(i$F~T"w2@)PSE\cSɲ\+XNTWӥTO+954' IY)M_:aT+1u aSD l|r#MgDW02B}w?g](3$IǗ$/5$չdN`,{sf ߧtj!8hA6RG$3i&IQ&|HaɕX(#7N4j,&;o>9WyQt)c(?gF.aJq4Q:ЗݛT &}_O/SߝD>(n"1Pcӳ`]lDrJ|H; ߯yj)F6.ZTxC<e|ke`rVI¨V"4 -όrF=Mg< ּ/ Le ̨z (T0u`W )E J8<1D ]c%8dq{$%zX<9k7֍sWBe v3P%R=ܧ`$90"v)R:UZjbgU ۭ3w(qF\ /#}k<ʺˏwmYQ70bO(T#""^P8gۛ9碜x~\}KR6"k:V'qS qR@ j 6(բ=_ ]8<#gD9(?BB8|d=)Ig-FB`hd+k{թ<-`TDHgtd;"E֟l9`D} (uc9H?w^Ԉa[Ph[|$%ڳq9cd/<u\ !֭Lׁ3Bo:,g2,LG8'z_>O}ojf猊1EtZI4Y0 S}wJx|X~8O~mT*$@iK7*Sq*`oĚUX@¨Ub4)lxQ3Jo9i7sF$fZ퀄c`4dGX ϝU{s?  0*R ⇣v?RqO=Q|-+P*X(u\ ZXdi̎g#Z5F鴯H8 dFy̨V?mBIkyF0(;3Uy0zuݟ{nߑMWj3XgTQ ĎIh`.Vz^q~/*iI|\c*yNO)܅D+ ШǨVcaZFh>$O?`bm*Dsrw[g;K($En8TxK^3J9'0?gl62]FEs`jEv+hfDٝ:Q3mD2%su8y?J|j*q6H՗ˬYآiPh&5휑oryQ(iry]8#e ^ #$Hٱ28F k}vgQQRo7a\rOeFb>3<)FI:`= W_~C(pFYHe~hΈFyF`(Kěvȫ3r'#KHR#Wܠ&~{{aM3*3d lxz-uV)[R:yIr8¨F?uL&I `ljz-Vc[e3}Nȕɶ'!RG_xjusyvV* ΨμT\c50j!l̙}Jlh#_,~-c*-?PF UbD$m՚ܐ-3 Q6v9#FPDoc{ju}#OTj9>qVQ-Tǹ+ pUK`~?$U=\I[iH$>vPfhiŲog/\sErHHHCQ$Fp[}HZ ό%3B_#BKk;g$#(rqk^1>Ȇ{F_<6/orˊ ",9N p5Gw.[z៛o~ &: IDATTqQK`RnN2gt^&o߹8ơ`Ucs즾$|'b\ B~ERAg@}@m疑Kֿ[;nМI @YLlPK ىlIۇu$'@z.^38HZH)BH$$TvT`xhݻ޽=^7g( }P,N0))ՃWՇw]C\H@tdVID26(UQY(oJ9Wln+FTݑ3B3gd_b(9(`ɤPBE0r^CA:.=? RBEQRfI ߓ`ڃ$ s(dG ^f|yχ T!EQjD"V(l13{e3;0DeHh7JsFyFҹ춟 "BH!`Y@9$4jr2HVށ/lH]/~=_7"Ό(8K bD@gZv&s?67eY) HVKU-^%ZR0JVTp}F" %gSKEN@r(("}QQq$Yq`o_ GmE[Կ$һ`D`͖̿~;6>qͷ f$+B(T IIu 搥xu7J߾{ӡE0ϵgFDN,)EA@ju947T~k~೰ͱTREA#'v2w(-1ZA"3  ]=:xݻ>qIƲf,gAQQts&V 2(_kn"gJܺ5.q3p=qNukH)BE  vY.i߲?w~qۆ`+-wEtF`#;(}] ",qFP0tk?ym7>>X2P9$jF<`AD 3}=2yFIg8}FRg$m؜7]6H`)Y1)H_024M94;}# |?};$@)QCͽ F --Y(0|Y#~wÂI,ʊt+^ `}WPΩ9 JNg'γ\PrOa`. @(ga4g՛nT~B"Naq9 ݭN `yBdg-ć7v:%EGf 3f9im钛Gί3S Ry>#v&`(RP*{PFB Џ(˲;Ⴋ }~f(23d'`Ėz ^1œnxbJ'2ZPRfld6,̀aacƈ))qE Ft8@kzmK` m)=?oˌ$3JM5˒Ka YDFİ`l'VcXrhnK7TDHgDx="= F1R% sF'.'&8}!Sf$@1l3Is!LLMnt2a!mQkf/垗f^,6#vmXAh0/p֊+c?\ܾ)(8" @KA4WYzҝ3Z;rO|C/N0V%.ԧH4UI(J %F(# F bh0|+QQgD}FV$]3"7 r~5ƒfDdD8Ն)vMm(D0XC,05e|^g>nc)qd][**0ʏ]AOsH pFСo ƪ$5%"4Uш|m`3$=͚<09ΈNQ:򂊬)+:v l6 uB%hh2>_eM}_o>u(2\=߇RF=|$cgbfLWr`3Ĉˌ$Fv/ӹfz#=Mi-FR쩕3yL͚y0w"ư;ab#d#mhm\ĔhcÎSAS͔iOw~pǥ}PpJEԃ'+#R*{!-&6v/ӭ )2SRijF$13 -f16ݛ]ss\Z ȃQk0zIg$2]<~NND!dcp>Z$hB 24rh{ʷ._R)Qz^K"{^Ɲ=F(o{oU?ztKB !HA`+vbZa$Zc5?gM&8 G{216 WBR]]{9{~s=uVu.݋UooK@g3_g:xYbSG̞JU#Hə$e:B3RNptXқ]E2r6:``u N2Q ? x4`x!em&LxlL~=z/y-] O Ն,r9_VF|9G4哣y=:R0] 9XQfNiՌ(=F3Vv@fDa;t]e&qn0ZFdYf RL '3+b)ABpLyt\_+4"]0${ZN& <(-^al#4`t%0Vl[cڕҖA-4#[k$,д3BsFI}-%gΈ3`se:$3:so1I粢X!q[#82+z|lTFLgw}/Д(R0$Op0q&'2]-{_?9rE,3-t%D-fhqC2gLLL %kWɶk[wv]G0JEQNMYEe: 3rb#{E A%˄ݿ.KC{)q(i=f{,w.Y+X]9__}u#}\7Y*`f!B Fƅ!G3"VĬ9sFD̞>J;g#[/#j+TN r4#њNpqȮ{nA9i&&g=H#mnZ)~ʶ 3lW*+/=-DGKe_yWTovb)qQhHגY1יw,qw>nKxW8⁲G A@!yr#Ι3r(O3<)m``כьv4#d4#hq T3̈](uųZ,qci nGKD=Q$K4v}S^G8#~qq M֥j&uOt>VDBGjh7}v\'a0U1i=aFB3b&{gF(MGMhQf^ odΉ{Ot79#nMN7]3M5#B2MtetfnT̜Qm5Jm֌8G3&fdL )%dˀ)R2ʂԿRYI@3{`<ó]>n,cJG&{ʼsWWhJE iZKn:Ɍ90D6sH-辁޽׿zÏ86w$9''Zz_'G~R~S:dFJz8x3⤳,(ьr4#de挚99FȮ07"e2#y(ip;2C%MO@S%`0oB䣻BuǦ 7ޱ+n|} 9"ݪIfF,F6 k(ڿWw>"јq$K&U1kqS;Zx5xӱڝMGM`NF\,Ԁ[^  nTxtxÏ)0}/Pͼ P*b ,iƒeF 86; ]JꁑȔ>O}ɑ?/G%5Y! b2<Q057*gc5`tXk(T3̜Q+f䮐0Uxvv'G3"M bo|tN۶jҌ)`q-sd 83:%sJDwǀO1 {z eʑ`zGʸ/+7_=x8zS*OM $l iIPQ(|tc׿:G՘D8[f1 "+! ;!}F 2gĔΆ&'͙W,60p>tX*$1{H\~l4'#gNkwS.sF#)K+~vpQZZT2OH% X McTĂ P"EbFC$\5*<>Kw?/]=*gzjT"iHśbEٗdˮCy J &0ڴysݛ?'_F>ȃWk쁈.0B])DO jXJ(٬(e(NtjFh͌Zɕߺ" /Ig qSTL\T29V=(>(:^OL.z ba y_7 `Rh. |7ɒ)״OKezD YG0 JX JoT",ߟ)Ee*1eNAJđF]AYȰ`U$js*9M8 f͈t4O4ug;v,Ăr?zſ߲x>\o:)Y\L;Q=A:B9o@Ę5aop$c䶩;hGY k^` WeQI?`IXYKA:Cp,irj1TO3/ɗwxv7@%"kCkd,'rt:>$e:qr5HHCݐٴfh q '9!wD}װ>Z+o _qIv%;vTݲA`:Lk6,}g2fˊ*9%DDaCrJ+`s x%k3sFp鬓;$l79Niͨ0u[νp|s8Աj `#z{<8ѽw∝2Ռ8G3JC3J}4#v4#غTjG)&lZ)^߽rxTFQRn2qr7J+-SFn3˼A6H{o߳è?~ :Ѩ`F28}cݝek+92;gG3e:32 obg /|RrC<ӝKW>#Ք Ԩl FH{L}Y3w2]sDɵ:gRfd&5>J5#&YhXi,vdKw^&Ԫ"`;Dߩ`3yWx$Uztdz螗~LsO"n'>#dQZ+ʴmKkFh%(pwΈc@:3;~aቃsUNh@) H5:Mwĕo8L <>t2sFhFn7K!53#`FV3/yB"/2+MXDϾubX`~wu YP"I˻$OS!H;WHIaCrld=/} "({#(*F37gDX9#Z4g$|Ɔ D 'ꗞ:6`OpKTo\?z . ٘S:w,up쀨(3"zf@3`N?wdq;Cf+ً|\69:C?yW=fĕ,2#١jF_H;yIDATՌpoZDS#RwȚ挘YQŒ^~D; 03`HE$PDJm6 u8,)XcL>(!Ô?62{tϯz+w3txQS.!:̀VL-#dU`׬hghʁT3rQaGx-0DW/~`x!MeF|5- Rtx9ՌjF],꫸^15;|j,+`C#Î\WD^e](?Rfk8wZHnK5/>= Q"]НjFIu(th;Ƥ͚gr挒g}3oc' `ToF*ÊdؿWνs?|f 5zV5Q#T 0*b% eIYÂ)A0'@ԢY!+Xusn3٣|?xTFיY1RvQ39r1I@֌ξpr 7t~9%3'x*YZtLFf+|7KAgB3B60psHb5C̨F",(y9@%F&djuH{6 гHDk(5u5X={Ƴ wa=<;3rfH3bQ7y@_/[8#[ OL!_3s@+$3Ոc6:UéC?yW#Fe% v@hЫAu`0J͈iF[֌:5vU5 0*b5eJ\RDՔΌ/|.*p/~*o!R5nNTJ[qfΈ2 LG<}=wt~n[W] (Дc~g#1q4:8 ֔#.MjFDWfF(zT~ЌXo@dq`cFɌ $X0slVn{Sq9S2ǔlXMg"oԥ i` Ӈ0p湣syJA42No}ĸPQtQ2g(r%gΨb猞-4":LiF #@G{FKZ29(!ȅ=z~>4Hh*;EݬkMӇ ?5t~kJNn"_,Jfxi-q`lMGQw2^ է ͨ$.w&bMf:@v^" @P"hH Ad4.L5;^ft5|Mi*'.!+/a9#ffU_Q H@s $,C FIWZYP- cy{O|U?tXڮKmkgd;t퓓Ռa˙m74<*iFWJd}XkJԭw0 -ș3"bQH ~B_l02DO^irjYsJa,+G  zQQ34--` 3̳C[f4ӌV J5pn{qqRҵ㭙2~›Ќ8@z?ReA-W9t %K;k J ׈) ѐ#f>`|~QNh gĮb n_ qY4M&B7}e3(ɐJkJt`QRz-4"n@A3=wfMy\L1>,=8-kN+>?w|O ض.5n:$v@5{/;и S.ft5廖;ݥ]xb IJf pVhFEЀ~%eB4y僑Nl M`DҵEHwdRy4/t֚R)#]:|_bMF/NXN\WPr gM3z[<7vn߱oͯft5)Lǀ#?F.L$[/gDA7]q J8]/J)M$s(M08!:_Qjbb+0rS) uB!"êlzNlxt~7,M)v,tͨx|}LJ'pC3Z)(֔&;w3#4B]B-Q/@rH~7[ZĚY2s̱b,I`8ُۀ5~娭_<}vA1KbRR)JNx_lY,\a8|~wW'`!.{7Tio#rӃsO1<0ZĻ|Mi2Ns WFAn 7Ԁ FfT((Rʈq*@3O3X F`D9mq𓛳sG6w7 J=lCR*RJ0e͵bהg346FYMmjі/h\SoU:I3]4N^R}|idxvUgQ~Gd>8"UPW{[r$"R﫨wfʸ~CiyF$DzƈdϔWݞMVj"PiG_m[ꕅJ9UmXzi)TMTf>ݍ ծmK&,u{m>ߜ}fvn2F]1=y5UyԴwV0T hx1wN\8 [tFEЀPZK`juߔ!+J~WWWT*uS*/J%p@y^RB#@RIT @yD\@澄VP) JF'<ӷYtɎ+z~iaaaR,I*$KePeDK<}DN 4 V*-ѭN#rK°qZW*jEÊT\ՎuJ"PW3K]=n+rwn։7n躁|U6T}z|ٙy_}w/я{ų\EKzJYU%cYkZm1un gfDR@X9e?)|+̠8cmtH!鐣Mr:aeUZGxw(ljju^89%vJKi9JC~onn ϟ\e$ڥHhJ.N=q/b~9|:=̵Ǥ(gK*?V%:♋{voݽ=ֈJ=B`jD.q|Qڒe_)#REZmR\T*3j!&V(KxSW\<$Ll9>`F&寧ꭟaʚgAei.\`rsSOOR) B>!Dx6G\On_g02cfRU)|EFcVM-,,/,,TjZ="7 Ln'WʾVI6ړ&Mp{L=x쐓ծl). 8jZPF\.!D% QL#ʲO{\Wuif"T]JYh4zhkZh#բ\שQd]@jN^,}@2v%`K$r9l !R_AIxQ@DQ+PkH@x%E)+")eEQCJEQa)L*U-Q[orYyݼR9Fь)y9eʜhǤ">pSzk~ZBD$3߻%&H %l)Tl4 q\^%uZ] VZ=rXfk\D]!Ƿlxy`dWR J)EhKyQ0#5*6[1!thryyNпֲ|4jql( HֹR3&Μ]ғTpksvvD! jK\:= 쳓ZZW"׀d&Hn0U|Xژ"u.oŒ@U2Ir]CɂXiHy:RNMFAH*CDE[M+Vn%[h]2(Z?:3$}n)nRNhLEQ BecuYv H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FCIDATxdy q]21{)" +2DJ}ev._Q(B("0.ڈxÍy3+3gUWVfvVV8peX/C12P{ֺ"|`Cxujk HuUХʸu} 6q!Rrq89RJ^]`cXKDm%.U7ZkMeynHcH)wZSZf׏(6)8MeXa u8#K FcL !8cL0$\2|xUJ26e:MD&"eHQNDZkm(7h6ZkmIeR&2S+w˞4]?w^ltH᥀$w*e~^f6/0$ccJ2%Y0Ƙ@n//EDQΉ(Z+cL*URyeye:4bUǞ. Z ]{׮׳5!:eHvRAh,U2 麮RJq\ι+t-s99.ܷ㕷1<^vsw fkRJo3LƜ;BysyYs6Tq̕ } stTD e+y$Ik%Z:yl2cR9#sb*ZgDcRTNyeY*M,2$äF$tTSS`l)C)ՆƁy-88'8|X`c۴g`fnywfS{LHN dPP 9 x+"df2pmnK E` "d` H+j//&I:Y¹(K›^L۝҉711&ZDY(%:QJeZ$˲42y$I.YӸ8pZ%V)8e)C/ %ɭ  8/P뺮"_Q~<Bc5 @u!Dsv<}^8 2E@(r K 0"H c d R%BjU`- ppΠ+  7co8geiRY\HWΟΞn-|¹?mcZ:"ֺk1R*6ZX)y&IeYq%I,HAC4 CMY;>麶hlh#*}<<ϕRRqqPrQ~B4ks{oeGnڵ1yW!TlD#7`p#@hܽFˉwGP'O!8SFnSJJ*fz +M,hz3^sϡm`sΐ,gӧ^ٗ=]\XZm VmcLZwzy,K$4M$QY({LX6F[ɦ4]ua/<ϓ{RJu݀s^sfNC78M)nݻ]^7uZ03fD4ip00&.,+@ cWf޵@Tbub2 ?Jd,>qX1H,ٿ 9(hZm>wnK:+S'co,-ԊֺEDmԊ1c(+β,N*pT$)0]Ed@\!a"AzvJ)kRʒ488{oܳБk  NUQ)Y aDn>%Tl*b^Jica}iWV Ph=Ko lեk1@L]`Wwk8:{C;`k9=+g^xԅz=eֺeY.UTii2 N({yS`ZK3_ T6ćRJ,Pyya @R:|q9qf6޳;>x۷l޷ƼAfK%E-jT6#i=XaơZ&x;G!25A0^',FSvwlUwq޵|X_8h9q:ERjIkA[kʲ,JӴ; *T}vLMZO]v D#8<VI| D8Nqbqy!ļ뺛uϾ766^fT eMqPr5!ڥc`{ـA뼞&0^m8[m-*a$@`8``4C]߼?y궳3<|'Oyyy+AR,:YEQIQeY!# \t LeHb겛o UI. C/ Cu)eqY!Ĭ8R͇{w޽wߍ:a]f)B E-idd9cYC5t-hWUVKlV-ت7֬hՓ0x;BaL<.ܭ7߳un_/g~x N-)Zav$I(Te:c=Ě ƛ"tItLkHuM(Yn }?@ԔR!-mr]w |w74˼ !C' 10FpY40UBEh FC`Ry̆G#7֩UHFۘAF.4`Jǂ67P9n(߾y7/ݺ+'~'R$ y_}10 [iv$niDZ*32&)Ni De9ZAPQu݆rFJ9'8&)嶝oև?zuw޽yHAJ J gU"nb>FԂR,@CDCCDlv1OzF ձڬ7'/ɨW*yvjDP裸0V\0h 8C|?\xɋ~ˋz礔 ZE0\j$I8(n4UkyS`V) ]{@4 D\V 0 |߯;br8[k3o}7pwSOuw!@0*hh'Z (=>4Vֳ@+ TYՀ J0"h6n~Qإ{p-S!i}&mҾԋ$a1ڲVhapA+[ݺFuGϜ#/O(+.xw1% LnqDQ*&(M]U?麲huQVs0-5\םR9ql{n\[gp2\#7@3#+QM`C{\mwK2"~.ّAЮg rdjpdC{(sZ* '60 2) aTek,=6J0^݊VsAEbZ"xsu?Kor~Ǟ<[ `9N(nULLS~l@Lmus 뺢hx{aփ ;/BlRn|~c{-X8T乱N=$hc䵢 _.ł2ʌǧUrFkx+P@babgFx3  >SifUr 9C ʞp0y}Ms7}ӏ}SY=% ÚM)뺛*ޘߴO}2ӄvnAP1 (pOgS6!٭3Q`T3>UvMޔtT+a \Ga_zx,,n+N=#xj܂]8ll3?w~ic 1`~gw7h±<*κyRaLaTOӤ`'yS@+A׼ZOz楔ٹns&D 6SJjE_R3IT14&?2]h>Ml11p+Pdi+KGLHz VRʞP@* f"EQ#x;7ןY<_<֫/y~ZJyiF5ӏ4]W<#) @ZFT}y޼[;ٵ[߼MHDʀFV*fΒhʹ(mT{ d,sBߺMWhްn fUȢ Gd۔u&V` EA bU\K711*WG CDf <~훏n?KO 4bo%kVQh, 4h4h3` p50T#J,`Xϫzr!d a )8j|`׉Wn:?}v_8g\=b :n78(1:,x4]+_'RJ.z]u?,֌%Ru}ouDе ٍ3j bYV4(;ڲFpQ?l+x"3~V=76oYAn%Y^_@eAD ݲ,`̐#ӿ! Ba f.cp9K7xn南^Ȳ씔y ~v}O*}L@`rѵ˖S@+aߓ椔w:|/;vv|NbnPif=ꍺc%8e>MY`RSGc즽y'њzYC8aFDQ4rdyTm2,P{3{Cq<[ԥXii'lk 7;K7lw3KYG(AN/聐u'kP=Y^ua2{%8$@㺛;&u[J}OQgc!pMV䩑ذ ͣ Qx4  !6V3**q:(⬒P0tiocP9įѲ&۷>Hc^ͳ4 4Fd#z|l, bFdh]2gN@n_|!1&ekMׯ3S]ż891QOR<{gGBcB랕R.,@^--Mt]MDʀq~S@2% " D =.u:|ܗƙsc4&°s^.9SR˩*sJûmeT:뷽<*: Clob @2Yp=/L8ɢgHTER-ؐ׫5іF m=)TbϨ&d6=  `#J8)7/O8/YsT`f=/ߺ?/>e[㜲wvwli望XOOt1 [׽z^j3oq]w{z?z;[Q.NE)c7&3$UV{li~4R[J:"Mp-)h `E/f‚{9dIтAy`^y>GUw(c4ApLۑJY,qTuaA&4 8u`-9pA@~4ǎ )XSi`1/`%Sr^V<` O00e 0g˾;|/;Y5>\_~`=m 62⥗[`@OiѶR\)˕S_zSGp*p6 ΃`HrNtH/`q,7&d`ù\bI &<L6fmڎݘ}gJ),XB4CW_򬂓Y>>N-n)r gp4 5 FLxr`f¦G#1$Ӑӿz-;X8)!y󖥔N\)G+Wc) Mڬh=h 4MVF&ˊ{?rσƌRmmR#Tn^*Qޓ 2Z]h[OXlF 2gPb9,x g_{o :{ 趍$Hy;zpo|_B4\=-(lK)(Nc %?bԣQ{ "Y߲sb#زy+^8Rs@1@ުa0Z0LH h@2WWrfkM N0`h2@pVcFiCR Ġ uwųsk⼔rIJqyU'zdF›ھrѺ$:e-+ `{\=xyKz r97hKX= ZM廡CeshLVMFPggRc tW櫯3O`g_8]%DsR,!eTdʓ8QiטT)c2uf'ZeC,*.T@7*C 8T`\B N᜻9wuw9Bㄔdα [{r|_n^3_ v`P8g(Va=bnJ8IF)l_'(+9=WetFZ0kda`?*Rah~vO<<[ /tǗR.J)v;v5< 3 KxW (Q_t]0o\ FQk40 7{}A^_<c p Yb De) 9Th= بabcYOpup؛8 8zufQ\wD{Rʢn܍։:QJZ~Z\)UOn1%ڂNJPNuˆ F%X$Nc9XrqGᔠdBB_J :7/oY9ʎWJ. w[[݀MLr"s ^8׮Ea ,' 2x4@9 G0kz [.a_X׎e֚A+&23ҭ}KtZuyMJ;9_wex F)]qDpNiDFJt& yu݃;3m.)B[iH\K:i kE> 5!= 䘊2b{&Nag+,O~ X:4iHgagҮI]V*RJZ$/dD)*rTtL:7Thh,(֚QKDEڃeKL˱ ;#ҵ]q':J~, "Vv؁`M5a) 5"Zf=Chg>cIh=o#>Fք^>Шw<[JeV(<^y2S}2 ]dϊR3"nblNL= -_I x+z3;,cKy//gY+˲Ne,˺y'Y%y ZRr3cf4 &}mIX@q,T*S P[,_J鹮[s]&lxw|Vʗh.zki77 u|7ޏ01E*ٜ?.~`-UGWl )3A"Hm% xLTC fOoao<{sRE+fY<1عJui`Ջvl6z}.s]?QHj s;\*xWl°`q`(4p+5^y9c']Ղk[u[RuIny^nÂӉ3ˋϿmo77n{o{wkiޓZ33#'B|5 s(a4v-RY*.9E !Atr|}g~>}aLB\B;NJDF֕{P2S@ѤwGa(gggz޴ݮk#ȁ|d{WNw$AHZCFse/ HY=[VJV4RvݓmAㅿ_Hz%q‘Zqj<_nTASPeB: 3h(@i ]j i#s&(`{X;E%NBJ麮{[`]R:qixwcm-bC ؄se`8v"B|:gh")8$C{xem E#sxQO5+9j{pܲguiBZ!Ds>t֔HOS@0i^L,]۶l,M[.Vz9sY) oUswᢈ!84Μ‹} [[^3'u;뮸_s]'gIX?u|;6n*fqK-u!M0c2J(,/|Haܚ8#dmU[p;*p0*XS+6X1M[7oDYSb,:Ր0ƯHP.5Zٜj}yޡ[?<__*0B!ӁM%$jgEBˈA{5R{Uw@%f2?off<5Ҩ{1I4MW4د8Ii uѥѥt7%ӥ0%['"yq !zvvP/I{ޱmH/^zlk=Gn

Aϖ**g ` V42MhkJy&n}ɞ%9%SBnxPJ<)a{Nuwff^0<3??{A5rp^uw5D RQΩ=b +iTԕ1>6G+z<73?x$#uHbg++4]Ld9IvQ$5(֢+0BL kqs9h5N0ƂwH̔R",Iuݮm;F|׼]|-}oEcf;HόMz`#ZiB r8lm`x1X𾹧=V w1@075Ɗ[3`i*kvЕz([\w}HS0ZcsFtj5QMZmy}??l[V3iK-%D+[ TZQ1}*N)ڹϞ#OpѯM^{Qe8i$XQ$Q$q3Th= dpn|_or2ԓ>꫺y5(pD{eiIqw=kA=/9coxl>yw ( 2ˡ 0UVL*e>^v(dÇYZDEkڍg H\/EXQQ2w gS4uр^fh46Ass7i|p1%6ځZOZvQ)eέ@r+z x_K?t3n_8ltn]Q+n\D+>Q F+#åJi=+&Pԛ=ȳ,K48|BÏΎn~} ` Hqo@VȦmi(S9(J0u?6B ;vHؼ|߆leѭ2%-P"&5V{\k6-A<Цn??ikB;#xp ALS̢~52pjVގ23 ^zx/3o-y^{Z9$B$q8$Iy^(!YΌ FK_wfvjJaJI՟:Jd/"2e_mVNbu}oA M?=7]q^y~{D90XyhTm 21𨈣2á"<*{c'*X+q 6>Xo} )bsWqJ@ҵ8i H 5MvvvVm pv\w¹9ŎBR`Fy]WC`4.( )N+M3'H^|sS_:sq/$IJE%%eBEB%ӍcEɧ{7h= o-4i6Hl 0i LYI$q$$I`%H7;ϞzC4n.3 vȣ3"m@0w 4/I^w:<ÊҸ o,~7?oNNؔv&/5W(cFMh`4;;1j{<;M~ZC>QE\WVTSi^T#" VYGqYu 7&#0*c:w 7_>S1I3+q|!Q-q܉8ZM.I#ZN3$Z7dQi8ݓRBBS1eRe onvH Rԯ*ӧcx?.3E]C `Тl,T;)xYBKa֔+{o{){0JoNtr0^HJNY+=( j1)540bzkgDO~9#7Z֙8EQvW(u"c21`GQ+2DmW`DG?7(n\mɌ2$Li6eY'vygS,ypwD c{hT`C-{`1+ZF_̤Nx/eˤ37\ G&: Fxo(S0ZU3r 333ah4Gү^sp<+ -{*a~\f Vi5M-Y1^ Kx3_)i2[:vNq|6ndsyNѹszٌ ʱGocˡq6P[UaIjI#L^ΰRZθJv筝At1zs3Kgn;zy0֦{f{bfƜVNFCK %Cgvq80a%'D MO0vOߐGxM.Y֚8%0$R% y HSff4VKw֏~mk^Oͥsl*1'G5DgПW #W Ag_6(;w?ąG&۬?{j|Ensi癕ƁQEKɠ+t.VqֽŞ؈hMw0DDV36#5$R(ޯ'Ҿځn~/n5*ac-:IC;FAd@X JI I0ܠ,eML^!"FDdhw9S@zf31#}C|~.1z\ IeUn7֋r"dH+T snaJ2ĉ.(vq|&nw$F4 c6nyJ V50@1j)^(DC F J/"],8H) n ۮ}p@96đQ'i 10Ðq#MC!pnz!E1 CKV"_0u+kX,?;JU8k!g3j4^g>_k{5Q\;n\Dssҭ!hO\g}6Nu7 /wJx/ Vt.tVZ1-lTTVZ]t@A&8Ś&%^yxTn2dwSgμՙQ_Z:sæw7."*734]m!h20ٞ%&q$=9& ˚0־ji +>3DczϪ1}_[h-0iyu]WZ0i4[0yw߼=a-`;R` 5#ٱDUĈ'},yъSQt:%+ʲ,IUV4 HZ/ L6-LAhui=i٘`%F}/q\\)*bu(H f9 pЩ#GdҤA`=$EX 3VD fVV?)e;c ,cƼgI4<R30tͦgt0nOvg]JC)bE\:*] nx_ enVF_ossQs"Snw,FQ)Gk Z!$Ilh @{5G5I4JQMyAkU  LβNZq;cu0c*0Z522xD m߳'A2-RjbKD }r/T'3tKhiI)5d]ŐJMZ5\o!y'zo J~ 7S'^r01#쉍.M&8X+ޜE|nlӹ`QɈZaF Y 'ɍQ#ߕU*JdxJk)2TN8Ȼ]>rm,7.o%72fQF6S o"IWkL%r4T3Dc '=_KKg_*nCD2EQ6u5k0uՓȘOgO0#ZqQt3nAL0g;ww4%QzE';N^4AFI^,@4+5Ker ׎eR@djֹR*3ƤRΙx}ou?d ar߬HCv<lָ`@688Tmͱi!o~xlD^wQO1]< mƁQ^lVM[9&v RuuǨ(Č*[uc{sNX=ehŊ[+g#@4eCWk|&a=NzDE«\kQ]?P~[Lw  aң?S4$CheEr:7p; ]X ;nvOwDD9”jTMrUۀMM WT75>oom{b ETAGR!0Č%ȠQxn1.zi|ޔ_9`tڂъY*FIth-0Ȭ)]i7jJ-Gc$Q2_)ULxǘмʓyrw;̀bʩߜG}n^q}''tQPV4AI Qá)4vpB&ƘU&4D atwmM@Za-{ m4z9ݞ?>lC *fT%zVnꏼF:yGo1O3Ϸ LݾtZIĕzF;0F! '4beueYT19yV߶%FFNjwhjS*$y|3"ʵ֊zlJwqR;]J'Z!U?ev0bm `~맿tGE Lg*`T/ $vǕ(v]ʯߚ"D`D6H 8]2A @ 0Q KO6g~Vrh;+ FT^ګtExQP yg  +n֭ܢ֒c"*yn^|ix%DDk%*>̂ү*[""MDjGI׸W ]0aLٯ<&Bך`bØ=Q,Nh @n]m!Fa[n{.zZ'ƘYn[֓hCb-kRyV%ԍ@)h4fٴ$ywc/>,ϷsV'Ga={uH>lļz #!nxxUauh#5#Z5]A`4Y luހ1԰3o8a0+U%Ib@O>O6@H@Jht3>M?>+&# J,Va4"ưgvu?/nb+)[3v{ 8k}>ٖ5J mPٺ[Zm{]׽oyDlU'AvDɔ'Z~>]ڝyFч +'cښQtM<ǿ'FkNʹnv;YNI2Fz&+J( ]NWHCl X]OBUͧs!*&'c9_ zS5a(d 7``?KI0G W`) Y '>?(Z־nE(p^cF]R:JzY\<?p'?"\5)IVg Qfp 5K1 [^o /+v;:Vu֌:ygJ t*V4%[zz;_}]da4̐0Bꁐ{'WN|ל0GgCx."P^V"Aɮg63FWg8~j XQ85(>#ADkRYA^ׅnez`l4A^ py7?pk7%vfwb1סhWؒ!"l?9g, "ԎD0V3 a0o5B!1+ܡ7"cLJ1J)e.F]Ox߯|+}燎b]FRJh40 g0yZy#/tP<Ρ `_0˨+IIfPSIe`Ƌ".<-]0fl,/ % 14@;  K M3]Tye$9TCjL5JׂdÈ_ZV֍wnǮscbS PnS>0~QnC1娢Iswstzx}ߏ;2AD FW |gH)yBpu9 ! 9gsf a}e[y段0PeFkm45(sZ'ÞN︤N4, uq/jJd=w8 `;ܝ3bŸSNZ!Dy݉3p^pV 4| $yA "_}oNI&I4ܟ4*J@W j Vzfv{wC7: 0śѰ?US2Wfe0*£;>O v^4C: vZ9]r @)(\!cLDI?W2_̆H0 i&PZ)RJk<$Iu] TNz6ʜ Hxf]7+/vk=tK@ٳtg@utb cZ #>wjaNfQwYkbnw(<ϣ44"U?MY:AUdy!@M PƋ41v7@=pfgR% rdi9MR-ьϲpC gPLTq.8nÀ@4w;nwO[玵O8ޓyB؉2u8 'Ev *v$7A8-E0А[ġ̛ >v{)vNY-a$I;I&N'( 0abKKW~1y8hZɻfvp:\AYdyFP xi^Ls8i_3083M鱛=}bQkeY7˲L)e&Hw6t5Ivk @0yvx_;s.U,8KfbWpV˱F(9{ HיJ_d9t$y^û Fo DAaR9)8vo>|y68kp=pʓ ^ŬlhLU4M>1 PIa0|ɡ5;@B 1$뉆`[{g6̾//ycgsyRWJ-1˲ :At8 L1;ɖ.([%pΝ!{Goy!KL_nEs!c &F `HSB)'\W-Aɲ,8uG a@\#M6yVAu7~;x3m3b)a7cCSv5;B[YqZx~BlwǻNq72,u#q:ޣ{UQNV B[m;/,8ܦw|ӷLА -q q̠8%QQ` R/,S0&̷e r8k4 f:!9+Nsx;07r>=,-YqI)|_L5Q2egK|džLnE /yM3'[v2o@NqƠ*đoVpΊ,LӠ%B6p`@6sclS|_β]S{69 WCwp $2FZV};kssnbZhlFOQ)B/Z QX| `T7:Oסn{\c$k4^4)KaEUF$<ZA0ch;ٱuugnuݛ/' oD@n8u|`=O/o]kJBe檜IN4 F!ɿ`կ2ÏEY8ё0NќZFB +*Dž@;nٲK}XxSٳ㯾(<%<-iE'lhx^Gh=m0Z" CDzZAlz5<'dv!678>vmF]0U\4uU6D,`5@ Ɲ cS1<*OlSn[i(N`Q Lp"Hsdn B+3V{7Ҝ!YR. !e[2qe3;JX ($IbA邔2]@f#,_Or8t4'Pyk<ΡÃ{wOpC?[=͎M0(MI`+W#56K}ivTг"#4J:ٕ Tف^1z`Fr+NF L10a"h11!5u{n߲ˇ?`IW2Cb<ϵM H)wOudGt8 iɕ `FE[NOH9V=v5qBv er|ԉNFQt,q<\72XI#Ve֋FJtfӭjAla]|h߃y2T_ 6p`d̠VTrP%"h`4 /(:{i@㕓I4"J@vL1+\&`)h(%l_}#;!"Rz\BQE'"B*e39h,˒(ғR4_϶v}Z'(͋OT34 TU+IaVeFtN&ܛ XQ$NNlFtv1wf.v@[9)}##mB*MLJt['^ʅeIi R68j4\ݽmӶ_=qn+%n1$; Jl IwշT$I"lI)Myc@ʧLQS2}%f@=,g'0nJw(mଈc83ЙA;8߸mGuRg}߿~NofIW*C覫~&X뺛;~w8ouUP*ώ W^妣amŪSOB=IQv$I,u#Oz[/zh^l4L# vxu>ۿr!4C90HY`ć 3R^# 3N=64 ڳj\Be]&֫aN4X3U)kLDBk-h 4V4!=ckc.>>B_ !.:IRy^ >d)(F9F”1F+TǑrEJyuƦ~jmkL6Y5NFQuX!^RWe#WAq4ADtқC,)vÎ%]Nv1 ð[u-*B y)@"CEMq3;CRٞooŤl]!mm^w=,kgggf٬j|y+}xzGɥIn .:6SeFe*Mc/( x!VL!̆eqN>V4%*o<l8fW[psLQ#E2H icSM?w7{`sF\BNYCf(y7WOb6qu]wuqsvtq0Ƙե1m .,:,ˊfYΊd0KbnV .G_N*u&-WX8UŒD4TSSY~,$YgIuTٲrYzu/aXeIQBW4Kr@ QbxcB d3R-M[[h-S9^=H yFbg"@Ko/w=Ƙ9wcfGciF/cXeYǑ6ѢןY8ttSF.Z10Vi]ʴ JA~Jۺ5H2 -{((iXLȰR>F||.4Z#}M'bt3 Nڹ+l_ޛ 82uT  3!ވS]h vy备ldhQNJcqb[2 6T^ c54 l}mj1W0vNdgY%+,rfSY䧢up]KvH HkՒ+]F;yN& ;2rVңT#h BLà﮳Vg쵗=Nq_i k릻 F܂h4jfs^}뺇O}ut{j)Ci `z sApl,#62218vٙAV6H#lQQT\u6LEǣY ՜;)NxA9@U2(F3A^t +:EH4Tp*58`0/qdHŽq`:p.GHw8ny _x;w,fas5Y[kTץZ@pVL.YbDE8ز7{y).av<՘Z&֦4̰nB~9)嶃<9纺o@ϬYp i.^βT$(Z: @R֊z[`T-0m40 w/}G>.Њ&B`GDp+%Q_ʪ}BUn4Q^D'ӯTRef59/V7J >CYQ4#ǕI*o2ֵY8~Aa@-ž²Q3.fgcLbui(]^7y74ܟĆ*QŮxwu]=tN 4 OQ )f&"}ϲTlmNMuA<ĒFdWlw15 'dGRĞTnV]ʣLUdQglhjA <}O-:}u%GQq'Mfՙue20; Flhlj;=;bW220Pw/z| 聆KEXl* T^h* gu#g$fJ]wCYfC3­1K4 []1{"YUL`d !Q vfgpxġJ5)c 9Ziǵ};?P$~‡;hr! &;V%=[r]|u+}[-rڍpb* pN0Uj /g:vp߹ycy[' I79$Ʌ8{6401Lrӭvh_O4:-t^غ}0cT$3֓hdUPY*Fp0Q3*EC!v\qFXWPPFz+`TZʉp}#fAXv?+G ؀ PR'R'Gmb0#n'/ [?w?."2.Qe69Cҝē$un;/eLχ̋- &({VXƩgn(ϰ(`Aq@^]\|ƙ ðn#Tefqų+e7i[y^iRnR#bo31Yme0gZ`@Zԓ|vX$(Z$I0 Hun40805M%5o?>=xt!Ʊ0(BB[3Vv(h>UA.S6$; }7 Y1XOL,UDC"*S_1`x݇XtN=0p*3V)j9x^Z(:z6ql:aM)-AJ^}IԳwBhCp9ܲT2@CWgJ}`wcXҤt=iavtWeIYEyKw;O?޺<%m&=iܞ@pVrۿs|r ﷤ie|hOՏtE$ q BJ;#ܼfn݉TwTqaM4ASLpS&{!. ׊2:\G80aF#l4U0?|ٱȹgcc [ p<G!3|3T{V EחhdZf(j&OwHf&@ #JVhP}cpLEm fI=7UG~$밫8)Y~yrVE"JtbNPY0 g#Mm7Xz&cn'1Qͳ&afd`{,KjAyS|;eQ/#=jS0^:Y9QpCxR[2'N{.e"j&GZlެzAPs]wq?#&Mlv2QnvzqѕMhGP_YX0Yz*ͮ՚*V~ 1} 4Ė/`EpW:![}HfۅExɀ፦ϻHV3eQ Gy"nJ*QQS* T${M5ڱB鞼7cb0$` (@rdbfsS-W> 1 IDDZkRJQyC 4*r:OFIwlP>6V(K$'w]Li U ܔzX0U1xqR9/AЊ(g|ԈJn\#Y <ϛqg>ߴ{ӭwͯhcC jHVFJ0~-r^(ٙ0g4=$8;q潑uYfhn$;*Fl6logh?2g 2!`ERd2#O[2'5ᚐe>^zy5f`mZTZg˘Eq7+P a{[)ʐ֞a妆LP4X2[gȠk%Y%+LCG֥TpGp8!A C7ȞiU-TVUVU .0q욽k pWpev|LtXw%`$HpQVclȔsb$z21!"c%k-1y ٙ P#~^?iRZget^Ǐ6;_ 'R c1Z^"Zq![^t!f[7 An*W bV9خm'1-7hQ ~_4\[C@ Q &*3d똉Sn鰮 x{)^u4ZU::nU0bXM[[[^_(qQV0cVJsJ!}Tq:)`ن=mS|B-W7cfH-mvݢ9zqn#X-x믦Цɫ)@UezC`4H SS>T3M̺ϟ.4 da@P^wah[{u^ "]ZkSU+cQs%*x$I,{~VkQ0r>O F{u9BBqoXV)+ 0ś0 78~$0˲‰#vV H-ngnvܔ'u뎳Վ_ ۘ;𕄊_aY"o{?ׯA3,v,eY{#ehu] ʛs`xoݫ?+HꢬHx%`(% W`nxJ ut`5h>NXO5;/Pڂ4Wzf¹-m%DyU3l*UUSYMRñtVu %g 8gH*rWve߿v"kMZkB\б+VE/8i:x/G[Go}ؚy<0*e\^;T+'˹%R:W^\`3 õ8w=8UYTuJ0Q%aApW~ʵ䣑yߝW!s4kœ4hjbWLwL|'MӃ4M'^u$4[AQ3rThIE_ wX 僕)>q$ҔZ?xq^x &nݦmL m|+`4̻ÖXrbUn`h>Gyv%``dshp'(rTp\,|攘c0^t^uI\p@LDʂ Htٚ+߹)qkktp8ݢ#̷ә'pZkR8މ} ~!+CQ~*ITl^5[&g92Pѵ7[aqq ( `0X $y.׾{_gw 0)1cPq>m%jV#4S["~XPSvMB= k=j*: ]^u4[c̉5!_%T,'ϮhAk1+ ' d+C5^մ*\A$ߒ2=-BQ#q0(/&_DHc ٢('?I]u\d<4%IWţ;sm3Q "^c.vj36ug3(e!֞6ĽA\Eсcfcv Ί-RI)eq)f~mK_8PS,*ܑk1s^ w>;w<Ͳ0˲UGdz}1Οn0 $E+׾qF rCX[6򉼁ժd]xa!Wyb0G]&$j[4gjcvKͪWR}ʪIתܒW%U,FNlPnlĨf RH%*lw!4 8%,aa'٣_`'Ƙcc~R{)-cV8 J"˲Iee4wmkkns_A^8g&G@  \ ZhۡIMi7*QpՖi*1Z25OQܤNK 񽧕iUCӖFlqidk^U 1׋`#^Ї \07k!Y۔F Gh# FyU6ź٭ٯ}ah7$IrZk9<9];K]]d,}{{?zͅ@6c+s\ְb { ٸzCub^뮽 ! GLI2tmh5(\DQa`]u훿u#3q :O@tQ}W&o/ 
9As^`0z0"9GxEJJ;̏ZyeY6|_)x_}"{}0h@zn0R6T0#yusB0 ע( Jݯai3'\Rn^oJ\E9e/l4bSO?;â|?˲IWVK='J%jsNMWh3#`P7#g\[/ڶ0TwR< TIf>UULUykP0fW;i%$G$+rXekN `sョ֮586 *r kw&Z?\%uZk5,b_)u`p0.\0;f7ա̔k!H.c.]oI)0aA =pgQ=SUiƻ.8 þBҕk_ uɉk[Ck18:7> (<EQ,=TL("õA׻E0 _2?AB֔!,V4kVCN^PMU`٦ 0(иo4ԧ 3u߉tUZO0aFߩRZQ f{FtQcyQ(l(2+]/RwWV!_B_yيt]uM\d rt(Cć7e$I.уH9muzEo3_%։4T K0RIɵB0 QRJ>m{H (ARʍkWiw|:3pM2,G􆻇6(v< xu4Ad*$^$q__%Ͽ9ܹ^TRlK9Tʶ}~aDU ?ս KD; )}2if_qhʾi^Ϩ1VӠӨOj|=ޞg""(m 4 `ʨ'JW,iM@@lWL.6'wIT0"栵W 8~ aJbDOqJV/Iiy>*bѣ}pL haC ATA]%QT^Wm_]|YJyAJ9((Bt垱@c&qA"XBl^7+Z+iCOEG))g4E˪'#Pu~?I\ +W?|)IVFWSշ#RYSU'hj{鷦Os2S@>߷#2Ŷ^=#2%)z]D;.&DiM8x{lf6)|f{WdOaO9Ǫ tZ)`d 4W/evKSU?( xtnL/~=$8C܀%qQwGڃ:"R@){0waL2kC~+Z[elmAa9+ i$O cQ0 Rhv«Ǧ1N'?Wj\w Aq5PC\uTImv1TG+yW3G~$ɥ(nA7}âT X4SʻԪ6"[ NlSmgTGC4* 3cZvFuCGe֠"-f{hV d'0uj3]~*[ռ[%Vø(s7-@l0@ ©Ҩɨ@G[w? O`0dEQhq.#A1I4r: xP)7/:`&bR4jMf/7ƨ7,*eh0j`b'tgE٭}$<@ڸky"scLsu3X5 ME ΣAMwohUGy,[ _z) T]Uz8aW۽/h* R]> I=Q3W芺3U0i:zDe "3F F8<,d%0xzY³dFWozs~y2vn4oR+ZP%Z17@Q[d͠U1Zz&gؐh[G'G՟YttL9M0ju"gF+e Aay8 >Ex]uJRʗzӂѼXӠ<;A)$I֢(W~zpZ򓽢T̔ڋMrz mV=M+#TɁQ"jjlU%E3=.:ϗI|KkJ-CR]X95q< L%ԘU"j%Z@h:7 \0䡲:\AM470 $IryYGhʟ:7cEQdEQLRf'<1ްfެf,L9g3 Bu)eHlAgU1]rGRʞFK"5DC:)R%X-ÚJaQ(rg~T1,sL見x3Q«O^y[dlLyc1 >0Ӿ%[, ~SUF@Cekn?sޮ&xowQ,ahOѽ/w힕C}c|)0B!ٛkTPӊ9ZRՎXa8d!  bpܽ(Eѕ(6A?"Ѫ EΥcUJU}1 ?HN SQwC>+lq8E |G<✯I)(B)|B gu@bKs3uHJH)6y]mѧ͡/€Qu-2 º)hcwNJE{<ʎA pZ0w7d?5etQV߬e7(E hXjQ}`4uyp`g2+kv`hjj)+;g)e`? :' F^Th@4XuԤ#^yyd什{ ԢtҰJuרThd]QM)(.qVW#wDK*E$rvXk='z@ 7Ishzia^ZBM)ebb}sMQJ89R=uU ;UQyI-Zc UIUTևEQL05ee^B ,f:kP lÿ4j+!d\yږ$f*m,jk/;J5xxP`qZn"FPcܥNh֑ b4hM˜>ő6gٰRW(H|َT% %MC6?Hc9M{eJBֿ};=)e%gsZ'ϼt*EuA_|cl0FUv=|بf1òwHQUVW_ڔ6DZT m&xVk9%jo^ψ=Aj}2jo s(MlΧ;۩l3FgZO= ۩| 2vJ|jpT*>jDjjHk6^׿.$I\j|*e;ߌ1(\)5QJ 1ø+x9n0IR%`E9p{$;|Vݯ?= sΥ2B͗c}Qc4[ (jUF5Z0=Sc#u: ]wUA+IApEs׿|Zr -STOWm:w䟖wݭ */|R}?|C 9}QDc{0vOCf|꥔N~[ -()<}jTT4JF/Q4!﷞{V2æ39Ј rE^/񪤣NR,IQJeZ1P~xk#dm $Y'5Q4C+X$#p./!Bb)l?_ƣX(S>N}|F"Ӥ~;D9lFCLޡuZRitRc3,< CEQz:ZaTmc#kTUR:AMס6MVP`)RN2bǫ w2QNzQY#x=&}6f|TyB662k:O)8m,Wo (֓$IZ}yyI}# oJ)2c$?fRa4'˻qlqd,X2l*/ar 蛗1"W$H8s/]P.hRȢevYJAq~r }1CX)=]hNDEAǽ0 70t k{#] Q2Nk mlPv*+ͤɮU/RɑJg @szR~#A{;)FŴQCИӭI=,Z483u zb6,eaE1x1ڍRI$ UUb'T)9NEQvhxktaf3'oךC=Ӭ6'61xsB$Ry3G:X,#!R )e9Os/ ca sC+m%D)7rckxhc&nZ&Bu43uvaE0 7Wn2,ܑ-*pn4%Q c׷iWO~h#@-\ Fac6]e=Jbxc7v0>`4C՟fBF\PUZ^Bq| %<7_R^ `#AǾZYo.(:Z1#Í,ɿQj/'dU†$(_L gA԰9u< d-ؼV>ZɿUX8uD)U(V WK+NDQ$8N0\Rn .]yn.|2.K{a3s"߁՝%?͵ F K!8r`hSlVЂ HN6M.z]"}. N|-nWK{mE[49`lW` a﹵+mv4z3]35]γiږ?f[3;>OݱM`T2eCˤZ66QٙC_UU'IF?cOcĵ7]sU WO2+ mwN1advSF`u<kβt,*jcQ80"a 5<ŎZTJ:V 81{K¥$l*>p9?s#jb J)噩±VI-:-'fqQBW~74 Ҿ\#z 3;шj~Ziѕ/ߙg(v|Ƶ{,g{;~Uyȯf!f͚5sд!j$ kfmH>>i Qs .K)7\UJ3'Vx%U}$kZZkb|KDQ}:q= 60EH3s%eJc 2BDwϴmdc6s*̳cLl޿XgƘ:BϝnIAl^^W`eΐY֛'ϟk Qcv.慵T\3d~hfndm38=sֺ@ 4<,sINiA1WߐRna8p]†jJ)3 艮31/Ϭ, ><B^"V{LϢBGURW'U4MP6>͸*]u31dJBkqtYIuK9^ 8N XRn]w^5agX390wCMu [5^ WOmLAsAI+*rx:^~}ߧ=#Ϭէl1akfKwJI bpB-)(zQEsܫ'mw# i>zg6|ͥ[ʵ5X|c&R( {/e*BH!D5 .]Ǯ9Xǐ6XrzjMI}ᾉư?:^NJ /[_Qvz޶PlGW-j|ɯu_:jW-u MW3c;;6Uȩ w3 2WQGߵUW>G԰!B{uQjm,9p2ƞEpQJa@ݢFHk]h cLR pA.20^{rEO% 2H !BXml'wJ\mPv@l[町L2`#d{;Htcc'~Iu0 Er pᕷ^ GE9Īm1޶glNT}ƐGzevӂ'#;dvrZD]gOx_qy}KO(40ɕ0BU7j1&֦QqLS z99mi`*+cA,b)-B-ӟI@Z9H)B8zϿt0v:܎IM(;*Nks3ZϏ :0zTsY8lk;^}v($Z F,A -¨}~|S1Em%UqƘZZVe#d{9~mzH^Ӛa5Z#L}0z]0m!+#55P;4p]0Oҭ(p@k,4/Fb8oET>`1ZQʋ,B@Oa`T}(`K#Pe8glv3("*(0 ؔm`O F:5n34=_*A8*/yB*Ko(SP 8*t. C)Ƙe)>GF"jUW]sZxRN0`}QYNEB=XT͕8ŽTBW 4M3&0 pXQZ124(GQ"kNj>J%ힷRG!se۽h\ۧs9`tZQk3.N}_֦iYF@ ǘjLr+@,tlpj"R=m+ʣZ@.m:(K s Y9Re=WAձ#`(`T`&(ClI=S˞Ó|:VF""X'Y>91CKf,B!cPy@ߪ,㜃1VWIח&0J܇JѽkIS^udIn8fڔ4!0<@)o=q&K:"{vB=ie"uFF-:R7h5x 'lCN3IvZkHbH" hx:tV+ "0ƤS}s,.ie/$^~I_*0gf֭VV}GTN1UTJ{+ ޡH׵BX\W20Yg7ꆅ@֦ZKtlqɾT`?1tFg2jf>Oנfo=v^dZDkPBi`b""KfDǑ,AΞXs0A/[WHS^O8i1Vu #Q8 0j!ut3u:ҹM&TBX`hֿS9zH\ߊJ[ TcKz2;.I[`D Lu[`h53ݝ_R,[g lpy6#@Auu B:@NL?ה܍UHpfueパ0 Ycx)Fck mo*}W"n GV8֞{20_f:6%`v#=K/ QD`( !cdV,T}dY5tҢU}RJ"CDTtB55 ."ʈVw>eC59c^?g,{Ԝ>x@UGk..|OpU/\:LВ\FgP, HQ>Q) c=u4mHLzUӬ0B7.]|S>&uTH+O:cHJKAm #keK2tn_9\ޕ*E:KΫޑqz?+p+$\x(2S^1ΜzsF oLWo`4( s0 TFwy]JzUAK !R +&i:6?ں=H4),{Hъ` dR.aH1Au Nui5YN`Ad́M9Q3S[T%Q$@ˌU4'c,(*P;9ͨ}(8"`^/&u*:Rkմ,HPL#9,_+0F1%<%饇ȥ`TsN B(dL8!%)Xyq BmhFRhcat+)VH!Ϊ5~=*PUQ&Tdm.j99n#*'#c,s0WFsN05 % b(=G?I7ӸKHp*G٥|p,ӃQZ'7jO~8WR_EmK/j(388c SS1,# s _EsJ1X7`34;5٢`a+`Y2I21ehH(Ȉ{aY(LNMPlP 3J7AryK-GS{= wfhg)hZwѼ6?5 uzhVJ'":kZ=ق1&y4\04]'٘;i:xT,g2kq`U T0xaz&4{;FN@Jd*<9Ȇ`dJ3V Tp |u,r e&k;>8 iǒP5tɽiقN TU28 3^ћh:~03)2(eU){H ڂ{Q4zӎg'=: rpY2X{΍&!aKe9xNF`4u+N*ZTRXHV֙^4_p`4Ϲٽ4\ 'Շ*jŘ?ˀ*\U:Q]d]qTbeϩ^Cy6j! ^jh:\?2K75NToA6-w .JyFQ O Fj;҉/;eTR-Q˩!lܥˏX +5Vq$#ohՋK%мi'>5AJBZ19:zR0jwFxX91RcY\S56:fOF4{%qqVG~~ BQ=p`M+)vszJ3f *SB8+@DېsETE|Q"$(*jxP M9Q( ƙ3Uwiw62/*5ucarkkX䆹 {9Pe p*,ge} u LE9 㥗 ڞ9AZQ`b.8-#*'.G#XI0!AZA0O/x&*JkI` V e%'g^Rz<*HՉZKVֹE-{g2ҩhz`+/3;?8QU?9M׺հ-c eǖQ}%pQ1:GGѝXK{4og:JUlfc9m v0S}jmqON ꟫Rj+rYz.2ƺsc\){P -dyqC3jI4n)厜r LYzU5*``LO `hxZ;Av08[`tFL|A58U})- m]80\F HVdS:|i^|c rguY94 VB YUIE`"3Z*ּGQ`xP !`tF'FBq/oUgl]}ǙLsĒ2|ƽah-?m@Σ~`(?k|݂$Fˎ҂0>[QY"2& 1Q:9щUFշ%umrHf glU4,u<DF,U8e,qwy)lМEbՐt5ɾqVJ~ _I5K6KuR"WmL*UMC$cBJ):4牸nS=}>s 8wf @c*+t-e9љ#cp@ZkscZ+H4 wUCʒKX{a /*V@c=R)m::*$G?י/o6AyK cU4UE~|;뱴2޴֤!̣;%E3S=s0:Qd!zZ9Ps?/+R:.`,\ G#Ubgf2-q9f*1TL4OSPe@Z?sbq~UMсN/ jk B 0<?CU&ñցQnۻi wP9y0bM;ʎ2|>W;UH =-tO%WY0O05 KQC+~Qo\#d)"ҮEbZq6Ž|D؝-Lȥ9OwUXCzȃ!D9ҙ5ݳ5tV)eօ:֦vnKprHK6>#`T= F0:N )6g}7ڔ P. m&]GTyWF„ vRQv}1nLzcIj 6 [VBu̺%* !Z߄ c,rUlUHOr:icR0Ƥڱ}~k,D%CVjs0: tk>4L1;+4W\$9c,;e5Sp0Y"SRvܦN*Zbw4ISvKpu HZ04I 6=E9aKހ1sCιtHlN%tچn~%leɴcs݇dTƶ[Ks^-`tFgX_f9O.vNօR y*U)uUNK䜇(_(]xе>hޯ, @J'7T]DG6WZ~лۇ%! bj>32 `cyTQv cOVh\Zk[E΍1Grcu95U*2: MQOB?ZOyQE#Wm~4 ^VA9ڕ8` c<yk(J.wR$ 8PvO R>eWzaȰBΆ>C+5} 8xpY[f``iĜs !)qvV>PZ%yc&FC<=1bz²uv@9s0,u*C؃;x1cumӨr(jH.&CU Q] <7k5׺5eܻ @9 +球3p}N #/NAc kq 噛A͝}ʈoe" I!\ܞYmO7)n\E+&Ƙ!}ݾ(g3J;0guv[=XkƘR*Z9 ;Z<)"ڟ !ceyąx0/UtĚѲʨ-J#lT99*_Bfڂ2[0FK.%i\,.p8" @v86!n.2JzHw{Г Ȗs0:_r&1 ?…H}n(ي l%ڙa0MJ§'/k`+0B$Rȕ]†uLG=kaCyQԡJ'!뇀`e3X샑1 ,H61ҏ I2V8  }+, C s[֢)jtuy4]!&@ Pg`v)Zk/z̘ў7aRo8fNDyt/DT`kw%X]n/!o\BI/q--BP)?;"?s0 UF)Y zSJ ,K(<5,Ć/9# 7g0ߜRaס> Fs@`z~`3kRړӒw0jNk]c&1EEiIedl}|sZg $. !R<%WVuQRjc|þI5*%tF`tt՟Y@K;>Rj_)5z=wkuQMmpq8րQuDk7Ú! \!c!uQaDrjtjXJ)])XkS^([wImkUQ]<+)L =y_їRFavڭ:ti*cXi*^,U>Qnj&F B >|IA֚(,YEDF3;s0:c`1&$yQ;y;uCMbB(gU眯%W=@m\rļ 1]\$TR-zN ѪTT>/;3LݏÀCTAah.69koHDbs)/!AĮ^h@iʮMSXJ|MGn6<9I0f m\]f}neiJ)ձWNE׉ 0 !@x:Z)g٠\!/nc-;΀9Z+*f iv1ouH[x2c,)ҜMUĕܔ3ahe6|pfkA\Y-~q']5E g7/x#_]Tt1UD@ga((rmpK/Z;)Hk@i4=X#GWFrФ`6bsR"vAC+۟I@ZR˗>Ĥ0(9eb7_)s-X 9)j%Xf A@B}e٣deY;W%un'@(uI})kZ?YS<9`b>2 1(G2]iRPMQ#oXcfQvmǫ*cjjK;F`!E)zE$ImTF'5$j4L4_R7bӈ q' <NnV0K.X%\DJ)$ (r~k׮{B+*]cYx I+?0=zL"ZiRv+H1F)UE1ZtQG'<2005_%Q A!€EkR0 q'Q9@tZݼ7OqTUIZk,Cgއ`ś`tF'FZ&?niUId2ٟL&ccsN< IJ)8N0A7/g? TKi@K*@1(5N@z3:tGu|dw3Hk}?zg7,FXS}cmZXZJ/fQ%qGG$U5Dz]/,\4'd2ɲ~|'lM>ٵ<R9ɀhQdREd29HQ( H|=|K 0<|OW{oy~/Mdr0L&yotSM>?GQ$( 8A.w~8ֶy3N X3,x^p҇2Z8X7l @_z1 0 \$qժ%Ud%o7L&i>0Ý@ ,` K`;P%^`o Rizo2<<3c*y"X;:!@&I٣W^?.=c5U܆wR32: (\h*ݲgL{>RPEc?ޕq 0wΌ\ֈ@  z7_֋ !.Ap!I^ 3IH@Jӓd2've>o6d9WϨJ: T]ȡn;YU`tzGZ]w9Iq0ܐR^owc{/u8X t9!A/逩w6ў1f_)5,"uO6uge[kͱRjooeT$1MUkj $ʓIw2aEѺIs:6J2e+jT᪤d0˲;7elz89Ӂ*$xC?7?v&d2;֯Ww>,7}xϝ{s:"RPk'n/dT[30'n0Hb eɕq .AZ$qEqBQڧKK'x<~e;o_?xo!0nU`tFOFy: fS ݋=4MhtD)%dL¥a8(Al !.o7n?#f,h`MDR]7K=s`SJ*<ϋtݲ}sU! ΍ଵ(¡H)uGH@2b eH3I!1d/|uݬ_z) KQ&$ӮӦZ+T>._{Ae/ov69 0QLs0:Q{Jq*ԧhWze٧i>UWGfIet2z{ozI ~Wag~s!x H%Xo>&nˇ?yHN6BEQf`a`QlKonF{ф0]^~ RʫJ$IA0Eٝvd5,˲x<F;JV3L9 FXT] `t/WHGp8ܮTu^hg*3H'Qa١3b'B\nFN]RJ#%YeݻaF~1mԁܣ}ϭu*^3cw*Ud/|TЗD/{9՟I_IBWBUĆc Ko+}%Qm&I2(/INVu*&k9-#6Ap@E!Pnx14Mo{pg<W֥|ݢ򓪎:u+^R nl+#T`DXF\?d0{ƣJ<+ur>ݲS*vc,+@)X8)g6c|^-SXY*hc,_0 /q$I ʊVs4WѡfrOz<i6 -D(BQ~?s0j!J c' } [g:,a{?z<Ε!Jdᖔ/ݯ& J1C5{T*$/YV;z`d,-_; VrN'kw8|]g= i;,Ԋ/0) /#$S0^P9,C$K!t?/? .q|'Ib'S%l#:|2pxdK_'  9(70ԭ?AW^&d2d8F{d$5nY\q%+\u$]Oy3A޼?[Cd K%ºL 4ԡoJb#Rꠢg;M@#v[Ce("˲(â(vO۟ࢌCfF4>'r.|JW1B[_Z{Z$q ʲOgYu ̣\Z ͎h4z0L>޽w^}o[ڦ;`,p2ѯ5X ,0w`|3Yۓp8?(StU2n @ZE ~zя>8Хܑ&:NZ^; ?;}(,FU_E׭gCZ|gdK.gz;!ȚڍjZFu/ܰȅI2G" 2$<0UҪ^wO DK$,hQ? QeTo>LƇGѽdؿk>b'KwpF5(ujJsM@^R +g?Ƿas1]`dTF]_Z0J?0f*Y+[pƖT]:ܷ/~\}?S,Sv4JHeY6ɲ(|oM x FL`侃6eCQSi^8"xoeKCa!^j|p_ F$YK$88I-H:Nâ.hl ΄5ǣÝpx<{w?vJzCg`#9#9X`7$h2|<Fh4rN j-1`ew B.P¼(c$IK!CYuݝrs Af cZѢȋ*g~<.]N畺#f8sF^򔁇-8saNTkm5,bW/ }QJMi)rE=-9C(Jҩ l_}sRz^4Ms!tۺt cZ':[q,yr/s^9}*u,ԝ??=i,FpyE mznYȞ UJu4EQIlax-x _É91^Z9G9zb Je 0 v[k(,ˆNʭy`>e+' |G/$h4aeOޭTHf XݝueiLʶ6CL*"HM࢜`5@ LJYkws}"$|eY2EQ%غƋߺ~0E($f hYeLE s\绰t(,ˆyEQA|3z֢EUҢ$y((_ ))`M3hcKI8p*EmH3ލÛfq|_ (g)^@]uXQֺpÃû#:[/?`Ryͧ21vF)0bSo:B H R{?#'7^+ xm`l8Uݜ KK(s{]-¡`8M0U20b3cqlF Ju[Ė1ZXkc6Y~Q6 mY p^,ف/`! Ax?`0|wWV?^ūol樮"I`mm68 o?m-( AeYCuudִ"y0@A?4ϲlT ?iR\Ds(э1le;Q=߾{o8+$f-`TPJq(D+gBB,Ta߻ïFM`0yQf<w l d;'u]R)Q  k-Rcօ1&3Ƥ̝ɺ̕Fb0f^,sA)MIl+F%E!.?~td2?G"ID l+$- ^w9.7kn=FJC(]92TR0r4]U`wƥG|;MӃ4M'YU1\c}.iqX8 x08o~!L!׉3\Y0eOVJX#82e@>R׾<|;y?ۉPk=."SJiʺsQE$U `4%ǶN0dDDZkJaεib+Iol][o iqx4% [WV#Քc@Wb%UH`̝@}Ǹ7޸}] û䡋?pƹhtKF'sbߨ; CBG]f/÷o~5BaIЁQ=NeeTVG Γv!|#FA+/FAifY,]w-8XUH]'%i:x/˲pӏҫ[ @0Pe'AceL&'x< {+ڎ*F$W(z[o޻R9#I^UFnH/A1;l}y>eَ AU,h^߈$I` 8oAW~|GAƠ sT$ކ;F' 4ޏy05Gii:3%x.qV躳JaFJ4L(q??>x@<`T @'@2OT$08 "iw}$kSU7 dh ҙ*%W&1,Rj$0Vjx|`ow_VW׾/\%b(5fU bFɽ)(, w>s^|'< &ɡ2ϒ(\^7$I^q׾~_/6ƩBM),w*V!@pzFvi0Mtn|iEnQDVI&Qa(&/?~f{˕xumF"pdJ^M@ԃȵEJAqoܽG#c̤*Z.*'9ТIj(_Y^wObÇ|k_ ŕ/B/iRduIUe+=3?S`fn5)ECX]f0IVa W/]L|ϴ*ÇYmO&=K;Ȯ \XehE%UFZ}}}#IQt_>}p$(J0NYu 7O)ngY>Kv};qUu @nL{1$g'($A7W7B3g(L6FnGc헹ڙd=ePUWDVs*Oo?֘:Ҹ\*;oz7|<o0.ƥ[Z;]ĩ2)%P+H DV<[_z BT"̕RbݮFYop( r Z*R+EivjNdt}977g ر'CДJDc۩SNod}h6=aQ/I250&݃Zy ~>xrl5 {;I(8#(!!F) ©(S'I&IjkfOמ Ý/aTC d hPa]SD=!f#3>= a0*.$ l -fuBڙ9&^s^C3Y.[xyot:M7zձIĮN./QA(Y;jMcbؗ7<7V `VmAp*t{/Tw;EG84dCh+{rc+( yP)rFE(Uά:H1{PA^ ?x];u8;YYwDnaapCTS賂ؼQZVj-:]>سg>;u]T |m+cJ#>@W ?d>ꡇ4^Id0PG܋:(4NU8}[y󗟮?=1d FZ1ȕ}D q$W aLDQZ>Ӷ1&Z'J\J:IJPl4ap%D̐Pܾ0]Ϧǒxz?3"6Im23A]{j#4F;Gh_XcUJG,v,u͆C׍;2ƨRhnZ00ݝ8 șjv{h,Apj=W>ZW?Yu sܘTj ,>'ݭ[+//J0s?|lAhi>(_aFclq&⻄.B.nSrB&ps ڂڼuC@ 5#\hvk_ⴽ!˳dw/Y{?s*Bo㓬hHUQJ4Mưm?M^i0G0="4 P[SJ,2X"=|!Dy^]QB48ukcnL2#i@D u :  %QgW2`^J0Jۋh& aLـAL@x"t_8nl6 9s};Go_GSW[oDm[ ]S'52e;xxO#g'R=?5ke%gdq(-Մ W̽{U!u/r;Bk|{5Cr ExemTX;8q^aIМk_p1 S(%S): JBܹ QKP`k%]yg.9gBs.{ !|Ƙ9c>cyR!ނbɧBqB 0B@ !4u-IPHuc4mQn:Zgƨ\y̽*2TkByrAkT+ X?2)3-t3#Aw z}fӳQR^?'o/A}5 Q)nw0]4\ ˆطd;0jzGx萾3n7ᦫ+e65tZnJ4bC pGQ7ZpBV f='40哔AN)QNP;P $9A:Ը?WS4M1{{{eݴP= PW˜$J A( Jp"J)y$IR+cs`Ą1&(11SJ 1J)#HsR,gl2z/5=Wq4rS6Rb*:/91!I1Sf1-ܖ-1Qj-6Ak>e}xDWBAݜ"t?g0*fM#wg@kax50 w( Ջ[3QGBFl^M"J=F?|ۍvݍ5 ) : ѵIrJZki1.)A?;<2B_&ua)הs*m rIE]@ s';Gя|/^:`tf U? ta߫FҴ*iV4ZZ˘ @hl y|g?k+!LF2fSF?].B #tD@}'W0 W0I$r$#8#=ŐݰMlT~DPI %+8!9RZ=umrMQaI9Am> V%1c`.Xکԏc ;9#M `pxIMF MAS2cMGVg0-:#;yޅ_ywK\E+# 5KUF.Nl0,H> :q,.Ty>U70p/{HSaq'[ %nQ|Jip?y%y_H(kR0ͭb%N- i1U"E7a$9 !o=< W>HI]! rP-醯GO8)L4 Lʤp@4#Tʽz.\o"L'xWxQ/-PwRV>4>2ʟmLKf &6 F1irGrIJ ьa "p<u`8G[+v@)vzFZaD)AFeaxh7IMe[pK~ T4QA()5,K("B)56/?j_~Bhx5-bGèx N%`XT$zgc1 a{)~?7uA)-:V3!DRUDc!AAt;atP( !tA4Kh,#l6vl6k):|ܳ_{2{?_GF܀J4Qn;0$%rVދqVFfË?N0 tugbF6Tw_(f ݍ ۔Ič1@8!{o?;y[c*ۂ2a848Sw(lssy%(шt;Pkڏ:ٺB>Ry˜\4\,Fn{o4 Fq9CL(BS"`rF!jn N{Щ/7{ӄ:TF57nҙf @4m/ZkZ~hZz~<{s_y} PԹ5F;9TjdY#y01 g)3ͽad^E:j݉(*)@44TwH 1?O!f{ 58w'$Z6Y LnNzmFZO)i4*O'Bs F4(HAg!Bg ?n^ (}q6tH)»#jijteH&(QnWnZ` =wB7F拚ͦl6k|@7N}-68 *EF(T!3+@}zg<* mGQy>0.\7=w}'cO3t5i.>sAQ)x(vm4z~:~sοZ퇯b{'Fhx$X&ń4w̶RX eDj{RzLkƃK#V:0 ;i&cuK7/4(q&bv(kFsoO yAE[q0*e202ch@5$9Ab;6[DVAssηaI]£o+Ҵ28,wP |w F.x-ҽXՖ 8#8Sɯ_4/b yF ;Z90B;0 D)ﭞ:x) O:ս 7{F܏hq$ QJe$_MՄ=uj m̮kOQTh f9a)δW   Rm~܇iu7FQ%IR7ZT4&>C>j[{<75 QEѨZVV;TՎs__[<7uf7.۸ZEMxmD{ ¨׽+PW[g?nk IdZ|*RcuFi?=OSf=/cRQJ!Ϩk |j5s#\#ÊV'ZP[n}s0FA){s#-??~@n1B8aEQtwF9J0̦?d6@4**VkV}l{qο;66qqI0ZE \ ^#Wrc _t:;ΎeCuBsynD(0)X ݍ' sJDk 7:@\ Q}u͘C}=hGx\;P06|h@eD0cIaZ^7k((MXs.qS4nJ%F}w3~`r@4Kxn8sN[h4jFh4}?i!?z _~k {u!YWڸ6@ ~_(3gv[pA]s>0 ?v;Z,KKHbrhaq`Uoc|ؙqa۽t:vǑ TѨL frB\TI:9LRJ$ }a=B9#PuH|jh?2*$ƸV9qp֟>K @Et8^Z&FlkbBB3'?W~ZVW;`D#0J[Ґ_{ũDpt/A|GGX~E9vF&9&znV@46{JTiVys>sp-'^aą>Q\C+S(ci/'Q(2 F(Lak;EZ[n/}o_^yyަz=t:IERJyN\e5 L `t!4 :7"rFVAp}?߼!$JSC[;;6θzL*FI$PFnDxUd}}㡓?pKFۮ?]F9Os*dw@iZݰw}W@)wP*c-MUN)5l'bBM@si3FF db ߸6LFS 6ȍAb5lW.~Kd]B\}="rK]t)N0J5aY@/g8ݼ~>7]3Q*~8e!Mkr&F.46W0ۚA}ҧY Z]!NOQe RJ3(5u%@3b[ Q:u. ʐ [%|ck8EU!ĵ 6 ؉x/ t 4 Ll3*8v3*ry"^׽DA,8B\\>ȯ=.x y PC@ujT2t]\rEENk3;[]oQ.?ǹε헢(\vkNgh\Q02Qg;D HwOc4>rEP*2n͛w5R^$;Zg-@ÎD7&~8JҀRoxÉ8!Єh  XI9Yon/3 ! !ւ جjAt80ǀiҕ BA EQjpܬjSA Z֪jB土 Sp죕5o' (m-Z;H)y՚Rg.rF{eT yqa1 ԕ#KaI۽;%C6DIL.Fo9UaJ)#dY6Nwzsy~FHC=v1cԅQtp &f 1 )q zZu`@R<؈kC_>{鯟F/8W=[}#A0eY&K925'oow@4aCF>BPPDM۞-@t̅gʋ-> ek jZbl';t,è7Lύm3霭:qzG`ߓOo]ț%m:0$QiF0~ !b@+::N)ɺJN hp qDu*LI+PB m_"ؚZ&ڨ.H9f?@6ڧ3ƮzxIZ0 8 REa"hZT0*Jщ5ARH(M!h&^#oFd~5._.~9&X}^oNFQqKJJ9ި Q}ﶹB6huz~b%QرxG^ +`01cX׃.7F]KwnhF< ܏ǹ5/0WVf̣˯h톗$IJ0:\#=F):+ ݗP7+IDZkU(g%|yK>>Sl"PAq)&¸uSJ0B {{)o_:;˵wm\sy޺yZm^iڍ((X M١|fJ(6HFAyjDA9 Ü#>藾6p%;?^^ i`1րS+rUH7fet ہ?u;X§O<,M> vE$I1&M#s0*/CAJAi_NkR1&?Lky(;OZMA{VSèX2##%ȕ)'vy0ōSL;#p2?wЅu./wR zeY'I88M< C98disU^[̒:PxjWZV<-|y5 djZNv?X{&=L@ԇ%c0ZQXNIgKR('P@0jmↀJ)%0P޶NZ8{~z|3ٽ~Y}y'M8I44cPNް'މ΃(nc =kxBE!gᝌ.deiq^DvZPṢ]݁aP[g|zv^ɞy7vnZNg7I0Ml`a:_&( CRuuJJ)%YCZx%|ngslZZi@Z驕 R#"ppP@hvi QpذLf0Ԙ 7Ok\yOWz!ĺyJ-)宔r/˲2L4N4K$MD&IRk8@vninu.`e_7 c CǾ[hl%/"\]B+  P|]J\DD/<瀔sq .]X#ߜa`<{&B]{O<~w:ѕ0 W0 . 4JjnV)VAK)%R:+SuU+Wq:wPo c0d^hD 1L2A(rnBQx@p E 8n⮖f=NWrk[)YhX8p|WƕKBJ(݃È0TXB!_Wx`vıq|) ëaENI#f)x. 3 H&@il!y%#4IrJJ܁)>/u$O}xD-?i8(Pڀpck3y7F@?>"AWId"5^ ~ٸ_<{Jֺcj#TN֙R*s!Ok*,ˌZ(ۚC*+J)O;4[KGa"W3\_E7\) "ĕQ Bz\lH*s(aNfS4} }-{ܡwAN۽EjSw7,.}>Pan*hR“RRLJ(R'h6g |Rleڌ $m8H ;(q S!$qP}yjeC'WdpCFsijG.|سϞw­OW>Xy﵋ֺֺc"cLN11&Zgc2tJkI)UQ **y2\+BZO\([PJ B{F)%1 8R1!cqBG)RR*!>!ħ! l:rϟ=qC˧εbM$6w3`5v3w0].5h3{Fv}z VFeM(P+Q}?yiӹEZ۽EQDž$_t}TA ?g&27JJ2Zk-]Iq]t-ߙۊd8 N6<$wȐML0G>p4_P)ߍrazb'Jd ; c`#O7<3/OݝO6~uK:0%[N%X IW0fȌdRzJ)dˆB8!碀!+A!AV?v#'-xţ'ϵEcD96rv)8sp02A:; OsD-A+dFyOF#(`U@^Uj|rxI]h% 0 0i,ݓ 4D}v0K] "WJ@5@5uZ+w~QO?xfk FSkV s&uᬧѾ%5|A/(rP j" ))"2 \Ob`HVyqF]9g ^;Ywo7^w;͵O^1%Ppʍ1L+btԘP B{(HS@v' KSF{ޫ7^gF7αOSm]AЛQ "i;C2γ`;oKiDy'אS<\CFą*"̍ z0_}covW0\hk iTCiƨ}Z,˴1FY瑔2I=ŏ}<>0 P@jZEhA9-+ N!8#VkB!: Sa|7V=RQ6(N{VZ ;;pgsogI:r n;F [\>njCCGEj>ge(nΊ^ B778cz O!+/!/fuD., dJ3TOdf"։ږY1.+Pk?YOGLZEQmaEQ'HJ qэФ8[uW9ja!aQ)%6xynR= (YEywj5]Z!~QBF@tZF"(qJɅ 890qF l~^FN1ei*-2[`f^ڟağ7Vm~补G=n$MTw3c8iԕ74v܂0^ !hq0F{ASvo)DD'VXʱs%E'8)׬TFq, a]! : nd@'Kr]F^.dfJ+fm JV~=qu%Knw%0 (ڋ㸛iy6"=EHa.1RuSP%T7QAc V5ys<JE^PG/^.7^dg}'5F5EQQ@ƾ")wo{`8~uh[ܳ}na*bJrD6LWܙr__ #BJuFą QC^!X?7d]t:QmaqOI2g-UȮZҨZAƄ蠒*R$EMyeYh4:A~rkOln]XǞ ~ FRxcԂPJܐF)r)Y"|W+1sbSD]"jsO9NXF)J |Ѭt+"S%cPRME'8 4zN}OzMNIR\sN Mal> j%㈿cG!F}GjkQmEQTQRӺmtw8Ʀ*]nJݨ26"| (Y*seYy\=z!dF0-԰d2ܹܜN^ `ǫk}GՑ8[ZkEh[կL? `4)mRvR#L|- y=-)'BOEn>tj_U ЋP3S[~1p-z}]*UjnWFι>r##~'a=aO@wVb맞8N$FE "LVn=A-@~vr/ @5ttz%7\?w`4z x'0I(u@j [ZejҸ%:L{~pi$I%Iҩj;AlAyVyk6v'k[,Y{#/Js.90:7KGzp2}8WLժ&@WE}C$NdƆOL觝̾PD%gN(Fʨ0ev{`Dгl? Z;1 Н7_~[7[g(MDqDD4iBtށiFS?|~Ɔ۳䊪]j"4k $ܘcBkA}!"bi3a",#-vIŇt Lf0LŘbc4v Fh++OP J<:;s6,ʲl;M$I4jdVPDӆFu>iQjJ7&&RJ9!1ƸyjA4|o|;4Mwʲ,RFiܮ2Ln5P Hպ4 0QN3ƸSOcQJkRZK83sQ[Q*0~xs y̓X^x RqjKkzcH1;6#V_kO˻n5 {0y&\=h&^:mԼxi=w:ZJD))b)e@H) S'˲,ssr;BK)3lèРa U@/ <:T#yPN9 BιWc9)>c,*Ҡ(JIJ!bqf4ENND ~DA^H0C|&@yXK^ 9D(7#$@ @02I`.2 ]:L\5OS٪{$i|6֩:qT)D)H)ST*,nY gDPJIζq g{vjU@x7i4 F=B*|.Aʣz11&c{QJ=JO xM-l2000}c a$Ldc<[nw2aѨy4B(c OhpFVMcrcLε֙1&ZgZ'SJeJXJ Rn Xw(M FOjD* U>4&I׆;QJ)-4+sN)L܁SJt߽'pB+݊o妔Sآ1|=q@$ݭ.|8VE9t^PQ,T5J)%N}¨4)-1FU* ( ar$ iR:3~~nXXm`wp#VqҖfq9b0ub̀ߣg 0*.Rynr|"hHc7hJSL4Ƶ)0Anˤ|8#`Nh|fiUR04Hf}6 F sQc)RjRHsè tlI!YTAoÀTZ*00 {~x,0H3 ikt3Vg\jU@45mNr8naʯaFiǷF4JM}@a 7 *UR` ͚wn|7BM$4mXu@T Hڷ ܄j8M&}f;tYat8(M2nTl;MJ UkUپćL=v'6MeRlѤnBLӪA8tbUcC6Iibr*bЭЬN:$Ms߁ZuiRf4™%'4snqfrIfguQ:S54 T HպTA41h.Ѵ(q *UR+8V|m&fҤ}f\ATAZu_iߝP(YЭyTBLiWVj7p"C6I:p; YtP ͪr~jURj8J@ DY6itjURkd&lIHK :6VZUiɈ+qn>3x>K ͪ- @ժTjM s m2k.؜TnتU Hժ-ԤA6hr;6ժVjUcN3_AZU{VkVv QZU_"`M٭*TZNzUjUnXUjUZUjUZժTjUZժTjUZժVjUZժVjUZժV* UZժV* UZժVUZժVUZժVU HժVU HժVUjU@VUj݋?F|IENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_SeaGreen_16x16.png0000644000175000017500000000016512140261562024417 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(cԺ@ `b j0t4xlIENDB`desmume-0.9.9/src/cocoa/images/Icon_Speed2x_420x420.png0000644000175000017500000034757612140261562023062 0ustar guillaumeguillaumePNG  IHDR~LQ5 OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- pHYs   IDATx-q&eUr{[;H(JĄ1DX5,c#GH𶻜KUPU}@ uF,/~t|!E᪪:X1 &@b)^R0:kRJkHQ(Y,{&_~Tew_"W{fH M1/)(.@u"a(/g&?L&i)x k*0$"$ Y'h[ ݽٛܩ/;9|>/Ee&V4SLjTRHy0 `A8ueQ=|{%,SJ)V۩=x M1߂?DB BJ vLmV+䯽ym Z.0z>i;c9HSL1K̆v}5qcldG " c ,/pw_kdJ%e9[g(TpLywko bo/(1VJ;AdH{Z'"p03aY.Ϡ^~9}'+^|6{XN &@b)^"P:uĀ!A<ox-uX@(Ń@o| l\,|>72pÔN M1/S1fEǒӬ1Zǂqr{އ\]3yqVyY1fWNM,i)}@"%B;pNZA,3 X/k@E9[|-)Үc;M1SL0ԥ Y;N+u$0:v0[}wؔ-ќXE1+hn)bRɷ~DpDhA+R(@רz{oo} eecI;i)xߋb*'1~ Pcb~w}Q-${(l6Z%Bjo4b)%#:R|]ɧ<y@B!f(k1'!m~rMoFߝeˌ1$>HSL1ŷSvrɪ;phLqk4eD lzXޛlXf2۸`ca>S|S k`)EwʊYМ?D7oꃋ곒ݳY_YsmZk-c(Oc'4S|K "XyB)@kό"("0b4FʬݺLꋙƪ(,_fY!;;$r1SL"1kxv$$u<+"2 bЊ@ wFh+%W>kǿ^'l|n6M!`$ b_ *K dا!SE Q]oCGY\GSm狛YUUu][k03㸥.7)SL񍳧0M!%gHrD9e77 mL'gw=ٝ|fEnWGv M1/ ;[n( ̌u\ƢiJr1ps֫?X(wVe1y';1즘bo RPEJbA]0fAkED( Ar!Vhtգ>,_g"nuS7M۶i8{v$_v M1/Q uϖHy]S9؛Z+j"9"E 1QpTg/>\=Z沝mڶD$ƣܤdPSL4S| E7 uM"@݄YM@&duagoOrgϾjr}f(:Uw41 boc0 &dFe]'}}%QnSu-6ӋO>*7_|>_>kr},0Yk9TRvD#9LSL4S|A:H MȂmD0FrMQI$08ξvyϾssY印M۶MX awc>xS|͘TvSL11@9tpHtA+L yE$u!M'"Y1JIIr*z{ϕ2|V˲(<ϵz.F&0SL{b6t맀T# "2"hMP[T\3b e  C9Bm™n.>~dfW]˵^:Xniᠸ,POҘM,i'{{:^ٳXx]EI!'sq*0ɫƻ!3,,V,#Y""P8(F[AADMH@Mv'<>c׸rh:pZrx'a÷b#ŝ^Dy퓡[,^":v-U'c@HiC/x,JW"wMB-Iy]IJi{Y՗n"۸b6MӶ Bk,] h3 ۑs>rw_n䶋z{7`kklUCp9{[;AiE5@oE]JHI,kkE4BT%ן}[]k;mmSm:\4)퓃M{dH]"07z)J.FyHnyl7?'(o#0`:1e^ ;|ChyWED@5F 2-Z+[ Bߧ'?z?tɍm6m5ι0FJL ENX"*Uw#}WaEn`c9yA~~߀NM:SBߑ=ٺ- #[!uc+<0eF@geTEz>*6b5Y=Tu];fnƶmʿ@t*LlS\N#|,Ƌک-^n_|ݿ}Sm}oVjO?"&AC`C&NR=C %PBx՝rI矾~yd¬Ų&Xkság{o7}NXӝ%ϑƒǧʾ) q[ʨctu-bJR[8.iQ_YIS;P%ԝ PhkePq.~^Q}~Wige mrUU2zOxcG#@@f"v~ǀf)HyԛQv,^>ǎ\x^LzyGcSҺt{oNaBsD$P"R,"ID t jO#" Z"h)i+qѦ|+rߝU_|?v&tƋi۶uw&s&~ In}]$'ayo[0''ϱz^MǸPuxdt[P;ԿmJ}iͳ$ώ|kԄt:jF$w$}{ݑ ͲZ2G+H"l~w~n,uQ&\gD)DB2" O k^s]׮*I|HlF\f3ʲhM8^EDj) Cs=2g,"6*l\4\uڵOYQY,KU \@XBvc/A]zN;6 $";PJ?eYQP2,) Ln (E$6 MHTwyJhMa6iݴnX`iony^ŢZk-uu=^H0C:[ejܹ<:'v8W(H2"ҤHoD[l]bQІ/eȑ) LD^fyvffeYTʩSr;.rNX,k ܠ7٬˲QJzv5M_Z.fZ""ضЊ ctN2"2Η?Ӱ;vlŵҪb^mYi*6[腞͗u rI䱃^BٵsU!a/,5bmEnZэm[k9PyXfEfn}]67W Zr̔ H4 u\q=v 8fnm+jX^i\ h6ͦ*Xk(TQf6+(UۦZbEE1SD) ӏ>1ۮ.jۯ{h''2*xRpNӓUs"(X Ui}gh"!qRpNN}C"0OU %)Ѡ!Qhmm݊ҚlqO_ylj7V-DC`K8,\}ttL6PdYJ.W> X1EJEM@UJm.//V>MbKE+<3꾦,쬴뛲<;_;wァ9 ,{4,SP*H '_~_?JiZ3aJ)e,אX{'?7x?1X@:JFݰlGF4D9f"jv&deeY,\UUl< CXٝ;}8 m"zt,c"4dZy&KYn^K], Y.{Ź3f A:^"P>$>nJ'@pw"uK4EE~+Lɨs.>DPp,I[.A냄#L)#$'GPR>ug50jRYU'Ӽ^=ǮyC`86a@MwP ioQYe|sS4u\Qjmk4VDr>M~ny^4Y5Xo'$ӨPDk XCR@ 3y>S2_m,ڶvahP[ѱ8h0Yơn-ݿ4k=]<ŵX].u]bK(=G dH""Tor%0~ (lV(Vbo <{,ckk%ZkoÔK&/ fFyG?q傔((I!HҪ%MOX;ՌG֘XiCRZ+uff؝w>fʛj_0mk|Z9gRKxNg>f7L/) IDAT[(&QJi7efн\_ܿXZrAzt2N=1_N3%>_7#5뚈p^R5ygw>|㏮* - :YsjtrwLlC_;6Zp^L O~œ/˳iMπ iRA(eyY 0)KbX; P|:C@ YP2XV\F-r<% X_``73nUxpHh!oN|zAuu݊ۊK FFi~ i"B,Hi!M3@cٺRPӳ}7/?>o6bge >w^%* sp5k5٫Y<[eU7Yf-ɠC  K觏k%bA ǰo;uAGha6l6Sڬ)rkCk*a0  /i)چ7W榄gb9ZЉwשkeDd1eY43i\n7Bz3&nn& ekȚ 3Wd+f*rYMIDicfjfT--k c-L@ A%$ɶbZa<P 3?gI*FVlnv&[h2hP\8kԭCU[超EL@xDv#=*5"IN(pN0qh?y )t!TE3"QR*^g2Jh/~`K9H<csL0 }2;a.IIJ*Ȕkcuuz}ROW[ke>kefRScMN/!  TFJ`.YSf  " D"Fg:7 _h[E%H2Ҿ c `aTj bui) Ed ee֘Asrr>:)((* Z9>,CaeD2 ImBZ=ČeNf9 +3PGx/`@ EQg1h2+E ⚩y,t:ie,"Cȑ@lm-KÿfH33b U}^E5g#If$ 9b RtiYZh,ò@ o2 _:9(Rjw%\K@ C *@J,d {t dCJڣ`/`"&`P9VMED3Twϟi״vVJXnnnjCPݝZb 4|+m`D$mCk, JE(%#@&Dw#OtqXDD4=C'fԑu$'2Lag0Fg !@vi'' "Fy@)naM}P$0 %yם4Q5eN:g` ;^uim&Awa@w'\Q}"qKs 6)N$Dv*I!U4(QhF4rէk~ !kEqh`/$;2:|KP90t4UTlb ut3n{hezQp'J!V튂B5R$4Hv;7I&›u<^(!M$7͐Vޤz%HPCFk֎E3Na=t2hEP(:H`'K.P/Rr H$8oj`Vd1Z"{Q;WhQF@%fDp@I޾Nwʑ{C5 G}׻HH]#ASCRcJ[ }L SC))  qvM, F2TF~2/s\!Eq/9 Da ȕCL VnaLZ%ݤfM}EzFvkSn0FacU/A2uD66ƞ"NOץ$Vt}wpfZP[3j!9./~^^]ݯsYŋ36L@o]';93!TK:! ` ۩UNV*"aKqenDH) `HS܉wdX獝h@Hb3n6oqkCv]q®SVk$9: J{jtNj:`#EX 7!H2t_r><*a

HQ/䮻\H02Ni#DP"KQ0;t.;"}*=~2 2M%YY HAP7O3{/3/c]b^7Irܫ$8>? aw\BGw_n.Zi(Œr=zn_!PՎRqC_x W/6}'}z6E]"'|I^%ԞkJ;\7҉<;R=MUlHdYHdW&ewa$;w_Qkq :fD2tHrL&ݛKEFDDܯ -wˎ1nCxb1,yP` 0$DZR-#UVn3 #]SI.!ugIқ%e(bH]1Dk(=e帠KӍCǐ Hð #zv:z ZF2zٺkt*NL83IKKoSzfD=t)Hvcb8왫D% lg2/uIu0M@xY>4AD F @m9Xǯ=}f\Xx M  ÑTN6Ҡd0B# \_Ro2, LqoK9&Bq(M\:Eh4:PNUcM^O}'漺}vP&2$>],S*[܌“3[&S"! SɒBI+%Ĥ}wz>=SJExҿ1,A@,ֲlM"N 1Hb JsߏԵA:`1tG?a?&,ҩ٢(F~:CEYZn!{Azqp;7o01Q(܋ [눝[!ڐ^.>wWkSټ~8gp486(M 鄝^ 줣pқIbBaPYECюtM:ŝl8Dπ ix!Nc`GqvͽA|ޝT{-ȎkP#)"^?ظ (ҚERNzGR+2ӕY~<ǩAKCJ.'m,Pb:8/X@G1 ;vՃfrQ0%QM\$%5ԋАLF Hek2aX3]dJ KjJ!I%z5(KF$e3'ĎN\ӝ?HޑY^~8׎+dHl6(K_S-` 2 o_}8x*\E]JS ҎHNޫE_SBo( 8@i]t:G`׭@!w{|&T SK bc1:E;`Egx\Hmn5$Ti|G$ yPc_gė4рd(cҞ-\zw@x =tBC : e(vA6վv$U%$#B5Dp( dui$u&ЛS u# G&+JZĀk'cuh6W)}ki3vuE˒;3&LԎP@J>:VX\0  d.ٗ;6b/XuN0}՜_0A3o"}z 2  ilݛ[ʮ><L|K^H{zU!|Ic"h wI^zf*@!C,}ChX u4LB2vKjkd߮Sӥ7c˨2k1Eܶ)iwHz:u\g2!%K_BEV/ ]u}`HGj_)(QE`CgՕEeǜ4e!_M:0d4i,g0ȝj*64{9m]=5aJJuRdqΖhnvClZ ,4;i>kGKI߅ )"DMhF Ȱ1T=|v^qAyV3(5a8o*2zIcCORsϜ{)2b{D~I% OOiS JYD)dq 25Vjw X^н?>lݮgj/YXK""yJߝڣ;%si˕BMN@Qk=/sjj)u 8$$!\:Ĕv$C"NtϒL0(e):A nhOwSS핫#Q6OD4nE/&7=47IHtETJ~%D㢐l,凥Z{ 4L~ zӝ|v ˩l$]S׃3вUej]Td@ [)3Ds4P D)lpaNY`Wya})eFZӀI 2LʰnԿΈoɼgawmd F컳{T௨EȗF=cRڪ0]=r]<++R1s5FcQb잏JՒ́d1,@&$W"LeA$k$ՐIo\Yc>եƒƃ-}x/!8=Q 5 G/3|,hJo}ĶrͥC@" "^᭴vF@2n]`v}H*je.-E8X׫*\;/|n׷`4hxbweGZp!pvm`DzOA(+H]gu]Ji3d=uVJj3 IDATw<5-Y"^a'!!Ʒz݂ٳK&`# c~(%bviߑ/Mu$.06((߆_ELpHb f_KcԽP V"zPԬGmt_oFЖJ:PJ{RanTe_kIvZ!m1_ h /#BFپ%@! E^s۠D5N)8NFqʹDMN!$lePUd);o";nJZ(!3dmJdy*IYTZ]Nf_$kq]8@^UՍ`` %hfi6x|`_ ܢ,cqz3sUU(IםJ/- JȺrh|mC-"8K#K_$8".6mguvp9p+i+9CSomFUvVN2<|Cv4؍3r/c>17ORv8CƺhPcK.LHI*1Ś.{N!ƽj-Jiԯ6NQԐFCzkNkn"?!Xҧd[0ҍPlMYCFHD1 cJ.ܿ*юTo7B*%To?LA@رT;['c`)?zCf_\ ȌPՔN6eӢpwUZxQC˽jZCr/VQO抴EFpqj+Q4tN㞪Sv6t@!۠GuK[{S'7.|]8'va6aY:EA6"ñH1 Hf$a @ʎ]úuyVPvvkՉO욛-OƍɩQaKi}m4wPF,63SKtv'M%ǵS-28dN}y(0n b꿮ǔ(N7̐QDTBg4eUy)?zw4/RsRDD뺶HߝRcVy_N+ A#:hf-Ch;|NI~8*Qv$I^\P$ew0lM3r`Gm:Q-{40řGpcpID,sA0'na{%Ss>LQ&cf.E/8 '} ²}BY:ECY1պmP=F=-u$ݍV',Az<4k|-%R]i>pozXCݭy\&* !ZviI}Q:a1) F@ %v{h(\G7:LcQ 2z |D/ZnV>L"Tleu5 LAUɨɬPrϣ!;t_$uS%Gw4PCǾa֯KR%u<4$i 6?A7Xu?Ǭt>gNA xFZ eS{p5^B/>_7?=7/5Z[b=)RP׵mDTީJhק0@kuXh@G ;p܃@'ևTҒ6x5yrXͮ) **F` F"D;-z_«Ϣةg.W]uĊhs%uw`< S޴C## ɲh[!7LIv|}=hF=c7ӄ iK"$Ӡ^J盒Y;5{?#dK'$GI3@P@dYFn"Z~p^3Rgw$Yr%hG42&#IpK{ߓˡjR]Kp?a#"`/ɮj2g׮;{{{ƘyETGTJnU np<%Z c?VwuX!Wkw/ԡ{b/T15s&!eg3JNa6lnzb*b<cTa,wÙ=wM"mf+_uBh2tu,roVv8FM\d&1;u`Q*^;8VN@>@µQ}O1wq I?LJbde'${F~C)qIrtP_c-Vnvr,ʺꌉ=l߳뺞v2]QBke468KTHfxw$8tsn>z4%Ұv;'L1u} +&-[T;ُەf2i‰&~k-S[P^6nT@˾9e4zK>pֳ[}l;:*%X{Bzzw\C V9w#ꑲ"VHq5X,#r ǭxI rU #'Ճ!+gYGX6{E=GaT Nf`l:jꆮZ>_i>o'?pfYvm%G7q$܃E/ѰN~j`ܬj%o[SZH"?$hcK$.wlkG;\CLK3I$YÛcU:TUѐm[\_%&:xwMG\ף6?1OOjuسusJ4T^ɪ(bGjX) }?It"ZE=$7ƊG*#D({Êg߇ [Xϼv=XOy{Px͚! qΗ D!*Kuki~Q03=zo=_y|g.?6('<,|\.-ZBB7ܫQ,1L %o$#7Ćv2tn<`{+URXL€||P!Eq9페a;J`0pk-ᎉΙY-2A#]DKVAnYyFm~Ftyh; tqH1:2>vAÄ8VF`TGOZ"eGHnqGڧK9$3}2tǡ/c‡8 Y)/d#r䨺^e g}厑cg@2dz5}^rέetOt0v9ȍ1Y7|NZkL%^Q1݄!M`[&t2YO9Q0[7m[9ed\F3~,h"'d&;Uuv)3Xk{sLM#c-۩i}_ 9B9fQv@>z2eEQę!L8PQSc^YdId2RN$^me6)q`Qa5pqЋE0AStȡ]Np7]T,O[G2@I O6 t5/d>Q<:VC`j[*..{q?S3ݛlW&r㾪jB۶AWLcj$duDGD ^B6lŊ#QgsmaWy7nxcn,Z_=] IۻP wOȇ@`}[y@̭FQq-rowedlMk:*m7q2UeH~/7ίg"`! t~=c}+Y:JHmqǔ"̑q+T!*d1#luqEJ<O7]%2`0}ʱ*iFg!,XZ8,GLw8{4Mܘ,˲,+˲Z,˦i|x# }UHwԖ]B2ͥXA (d Y"-S#pg0~:p"!%NǶS_ ^m 1 9s܊[T]dN )x̞,SUw\T-5M;ٙX^)\B#P6}&p-kk& F#`1[c2y@6XI!P~Gb9%l!%+ >DI[sd;C?{z+4xlbsslmZhz8~-z>s{Dӽn?xC,rem[nޫ,$(ݱ"tn :>w"|Ljɱ"Fc/H!Jd%myՐ1}S]iHfjc;t$ 䐿ےKJ/!_ʲmT8ktoXjȂZ61ں;qd=H*sPK՗dPz$C %/}#f#9N:XyC6Rc$0wd $`>:k(dzq|zr]SX΍%`tܔ%>Gk?Wi60( Teʬ]5}%4ogd$17Q = ( Pj mtڲWcs jsMb!]5yW edž9z:+ Q,,3쨪;X cB:@{\ߒ&60xuv_ "F@Ȑx,~x6T=a#>'2)^o,:)J ),$cDs[/E0Ll@ m [RBW"C?eER]|~fl{G_{;?Nv4ُeyn,+EӶF'~U/B,9Ia6$1WYJevs>޾B{HDQ#Ljܙ1{[⍇FeU-Һh DV+D-ea) ]N)T>bh%⪀9Q-mm Z/,?íBuNHҎS` /ҭ '^Vr"z:~Cf^);'a ?lz9t$(Rcwqן_fLBF/ѢnM=n{0ۙ.)1fMydRTUՖelK;1+x $Ey?KV5IUIJ2L: _G'x7ಠcs];x ܔ}zW@nR/nL8bejZeRYudCd.nq/ 1K <ȢI%xrf'`ցXCQ0lc na-9;eFAaH H]^5t0)]e{G|^xf~_ߝwMYNIMr0P|tQ x!3EhB H vטHmsA4^D+c떪fidh:oyх6YDC.^;(fQT0#"<ׁQXUy39g*LPʈe"\?!+IllEFӤV <6ZE> ݀)3D gҢhqyI-wy|togLJxd^}Y\3ied2ʲv}%0s7R)S/ν “3tͽhhbYO@)I4 "T:#)VnڗKKUՃѲKGI~A=n.fJ=XF;Q3Ji&Kpp`Hz^h=Mm8]G8Kјx#A`-T/_P]/?û2ȯXG m򔲞4̀rn_fI#S?;QϤo=Ikr$pYWiCT!ȏbCDe9+8ig ,<,/^@UQ'OG?ξ3KvEgd>L(u]wZ)[jր4VO 5?71BRΩF@)j6-1;Ss\@}S80bB*ZRXDWęH$Uz/Ǒi}9cߎ!#$`EHt'ITFHie$-j0{#*#K*#``.|iTF.TF#`-H:G n2q:`?q} Bhia_-rO6pi)4>V=TdB˙tUU|qIJ٣dogLJ>_xh]{&&dryX,rr1ͽZ倀6w_4 ?KbRN+ qm^pQn H!&3򤦹q*C {0grYֵMؽI } H4ub-M?1IJA}@jר邩R5`ƌՀ-s@zj'8)(Cki *hAPC9D]@"@qbFRGn q˾{٧u&,` L'{Z+p]`cY:a2&Eqyu/[Ӵ/>8ypgx/v.-L plT5ʲD]m&\g2 Ļнtx?/$08/Tw:ճh~4=`D5)<I_ok-eL4)88M^4Q'`p84* HzFa M7 F40?-zձZZKzFA3M[H$HHHT^Wy/<ɷ}xwٗ}%tЎva +=;Fv7N {knڦ|8G22)3@Vv(Ѣ~'Oh{?GO3lft2]Tż2Ơ,Kg)VIߊ'^~fL#<@u];5)N,og;r =);"f9 1Uu!mĤ u]/\(ˎ.0 @XX;Z6ǩ*`@M7bMCM@K.#(Eҥ1ރՠˋ{>2ï"s=g%DqD"^1NUΊq܆0?אrCkxDSPtc={oW{<ٙM|2L&EuQmכpZo/z~ݑDI\^M? #NFւXdXFawά]@=,~hi&FM>~i^\v ذށj2"^oEMG2ZFFFb.*8y(b;U87$JF4.jgʍ]Cy[x/XhC!7ԋG3h^wB4TӋ'vO|-Y篧t:]LӪ(i_WZ_g?HMHFkn?7BxW'6*ثbi*YsҙpS>{KtN0=6UUGuݑN^!Ħ|N`e˲{&:I0P87 #}3DM ݏFMC}t5Ӷ*}ψ9fHp8.QPP D 0` @J)e7K}EWPFʍqK+7d/!C91:wuEgZTeC>wtp:{${O?3t6ʢNeQMUUS 6H2ێ-0Fi{&jԕW̰_`d*wv M0/v2Q ո݊C%SYvT Q%Ѫ-O1o"ܬD40t݅QӍzA›nv=lMGi$3 =90 y erI $B}􈊬llxo DgKf(Rt wwكVoDq&AptLynhDv[Y咫 P(N^ݯƒSӈ7VIAzo:Ơ15*0#􌤚(BMTImG! DTUn}ß?~'g,YMt:L&bhZ?Dk0MFEO J2? 15Ԍڣw9$~`d|$Y XX&9%E%u,QԮLM7ZXRܶ!L*IG#lۛNoR M'] e)AAwYĚ l B !14@kirtTU=Bᆘ r,l[Z5_7XTq'/ײ(~?cnf/I~6ήvvvbVU&'u{hC:o^#'@pŒT \#N* ?1:fB4!k7NIQ"`(>uKEb ;v8:H.b?%Y1MW'zwNyp&0+Ep8f:3@N2-skWuC|.N^ݟN&e]Ul6+c6Cctޘn#ޝD #:p aFXFQ:%DqΖmlAn/Q[ ҆EiJDS#MQWI$[(i0du[P8JMljn!D0D#9++[oF#u~-y:^ŢE' F7gĉA9#Lq210eY+I;Drf%’FfȆ[܊%K`ӿo.G=L?^r~C 9s3Wx2Y@ײZ_h%tu|8&ovvv/gbggMY2Ց*RjpR~Hb>Gl(P ȹydCH:.`Q -иc!n!nTHaf${LM'ݜt/Dyq's$ǨEX,қn )Ft+t M#j:/ARErj:ď頡;Bw|sL?kSXa|DW #}va&XW]d@p|\q6aqO7H,"Qd$@P-zMbd[ zEYth<{{z{O~|-ߘtdSOӫd٩e[u [‡U=٥!%3PUQ=n2SS?~r';a,w= rxX ZW2BTf v0`J H> TuT=1S\,&􌡷R}.0="@Gec)p$IH܋dd%\%?y<{o=t|to-.^~[;|IOlʲ!m[nۖUW(,N"0!-HG}*!go?V_nK7jI 6{Fн:Vກ+#FS p7xxj;K3$j tCCh%iŵF qXyzS|[vÏ*b-H }Q )b 7$RV_I ,YG%ě4=:ئ5eȼ8<9>:/W|OU]~LfGb2,ө)kۖրZUviKBp"Nw؀X]HrsS=wӠCokBGt@`19XTz-m԰~ q\10b`U8[ܜ["ThX-qL!5w"픀Q( TlF"gHRh:0HI,)>.0PԯDxс!{@ųP`8[Ęwۄ=>Οr.) %1#Dbn4 *o{9gloo(bŲ.YKA7Vqḵ7J +Cn}$IA~U0=Ykwwd$YjK+H. O*HeV~\8ڸDhp( Q\UBʛ"Ht7 P+Uo:H N3*0"\CHZHTOPCn*xdEsb?WF,J'{erDY뙒- ZyIo'=?|^lկ?/gtzggv7/ʲ\.,˶:;Lm) E_Tjz8;i-tQ!*ނ)QT44fo =Y iX&*l*4ooeb)YH+#yK)kG "7:d> .LT%FHjp=zI!E:N@U4_FHtg|IF^cH7 02-746XF0n%;(BdCTl73WWI|sy(P0g+imHuLmkmm_))Ni#n\H6\KzlqyYЛ{΋N~~}I?9wUqppP.jX,ӺakyHzSі(.awƐ%P$rd$G S>aOTuOY7jeJ|v0%eĊP F(\Ȉ,y6 dH1fʹ6/CQo:gIJOÈ7`o:K+#>"j:=:WMSC5 j8f%ҒԨkA\2=E@,+&*)(tvҲԶL$etݏ^q[~_6듙ӓLOG_}_fx[.BT,e]׶Ըu Imzw!YOFT<,m=bàkĔs̪2bщ!PA;ib8N" Rajb/Xh'0Oczt›[T&Co6 XdSi7sutc&ZB>bbHj0r,VxvhB ;ޱig[fP*hC^Kt(bP:tEw`Hʠe?$]ΙebYt%uA#ZF1tla[YڂJ.;:޳Owiuoּwãt:,ʲZEAeYR]׼eˬLE"33nc)v/`T8A2iǍ z^OHȖ{EJ-=Xۙ&n4S S[9hbKeQ`[cE#eO kcA 5|VbcC*o::8z%ҡTMg" 26 wSӱDDMljNH#Q 5Jbx _!L9A38K$uS29/ַ=`mD8By!U#@/WQ$"$6\zG^e7xH^tpzӉ >toB\!g3EW|&ESޯi6:T:-i}|;'2ѹ߯U^Eǚ'MӒc383.CQ.:=?y?=*z/>v-P]0kVU-11ö); 8H"T=(Nz|Z/BSYO%VZ^΢v;@hWu`UJrAZ0AA521T ף4+tx'`DvII]V (=(qGzp> d5%hG~^(<\/Sh@Ή$qiq ~ 0R{VY_^ T]-mQқ3zvz8}윾8|?~P[mZ^NervTذE qҖЃTE.O|*5u @!NFҽdR.Naoq)-+H0Hj*QzA&6g>n j'Ü%>0zv`ƂnFڲ0JXtm6##^F>QU9,: i!㠬Y~8G搀ѐ~B-v2ӎ>#;Ţ8˳ h=$݉ r~hc,~lZ8δ٠h}g~v~iJ?UeiP&㎄$nR% IDATF<$(j:hw3kc∛|sf@`x#HzEJAqlFaeFVENB6#Jzt4ڣ 1h,Ntѱ aV+t9[Z YbL+JD>Fe8H1##6{mEhey߮~ørZ"Nf52XH,Lҗn{$l9xI$w`?s#\b4~b+J#U٠o =#sSit.[fkC'75ܷnwqPb։saFxť;,Q<7^ l"0=,PBMTd圆ϱP[UFCi@{ӥ5b$S&|כ+h7_I$GH1,m h $ iګlsKN`3Jb@c%S!cE{: d]ʳY"4ψ/hڽ)_岥X*YNٖ;BIyРxAHx4d,wR%EziA]rAW-%m4ASp 1(leJ|>kl9kf/^N&E?b+(!*5( GooRK; ֜iƛNGHh't CsW餴{Teubj4%XP󎥗9ZՀ y`i L $qRrűQ+zFJ *HޢXSa~)ċoO)/>dVѯlh&, T7`E^+=k$äA rc ! b{/dDh 8px~C3Ƀm !m1D\qɘWhmqw͚ij5 v3E5T# BM'wx2v|DMxy{F2<c!1`/J ^Yȋx'OpK5P1Q3ҟ/5f P *l27eF*Iz*''mb}aSV# '*L$dD&g;D]-&>gt-N/O}r_vvf_.^UUmuJmNXpT!L#f5(A5P_q齊5@jb% 9xQ6Zj٢h,u,o4)Ȧu@=0V\Yy0-V7 nqeŸp!)~ 5ltIHMGHiEq tH Q FbSQsj:3J?_Q}YA ] F 舀Z NkаgD5uYHc-;@6!Ҥ~vlyY/xfqXeUWeYm>V'jE 4d#3|gŞk#ʕf&#"cʺ|RpKʱ(v! Yaن紌@ _*TwH߅j:ѥKw7Uw tRXL1&q5]Е5sN# KIHFO+QP7U Po^(!3"U^&i|<[t''?1ҏWOEy(˪,u]WeYUU١)'Nʓ󐾔HTBkb.2EHif3 eTV-UuKe2 ƀWvn.5A!_/Ǣ`±O= wZ&_Fw<#tXUFʐU EyyC0b:nVpi`īa 펼 'J]1mFco#`[BO VTNےu`ҩ0QQZ٢n >@ٌd3Qv!/iOf/;|qr|lg+F>_UuQUUU,뺮ۦiڶ R!qx?4"bXD~MRW 9$Y~hd VNmʲ,2޹l%v "O3dvca[fq)*;lzªipPЛλQBX)Ը+ aʤ&T;(!.δ"Ek*TDuH>{@)M$$K1hA(  sxE h(^s (s hψxd ܋/C 1Lٔ]WPw5ҬϞN;9~Wd7e3o˺eYeYMӴ]umMW|[9¤,V& R}~'"L=4}þ23q) 0u2-2~ǔY޺OmgԷhQP3AxӅ|TA8*Lc>-zqF>1Je%t Mt2_80xoX#`ڤWr{LM/CT U[; Pܩеs>A sx3RyB(a HncS( $54&6m+HC\CiuMلL`yI#~(>}ѷyr>_ꬮ뫦iʪʺje>e*j&ci.mC׌Rqje&WcUAa*0?v`({k O$餿hH`(.^4w]ᆏewVWWDܯCoQ8%g37]3RC570`|TM6GG,{Ih7ZkEx2D&2n%u>CmdgÓɗ'ol(ޔUuVeYʦirٴm2ACcN b߽Vj R#&߬(a?&UaQ̊g!Ɖ`˥EQ,j"C6?қgLL1Gr8`!sH 5ǝ>Q;2 ̚KHL;xt"E)  ,0J]Y ܹH o".Xq  INT F<Fd/ΥB49(I. )T0F,!Gk=@X2D q{soh;\?=6==9l6}YV7EY]EqY啫i+"Yȟzl\/ڻĥQɥg;^= G"S~{ZZKNT$HmT<gL›ZM8#GX>}&Y->~36 bZdt&\#ns=#IN'z,ؤH0:֕I"`@""F:KQAɁ_UMp"τ'F(M,dKdz€eSdua~MGt>99zowek?XZ-˺UUڶ] Jeo&ErhCp#bxB lFW iڸa%ʹi:UJ`NzE`k%cA@j n]"H j^vN voHkЛNz~=Ы= F"N,L+ *#oC;c"] Ie%?Pݱj ʉ?}Y+(XD8W64sb ;W$`DM'A ]E.vQb͂tߐvVtb1Df[s9(5֟5Ow?wїEr~6/.WUhnJ ڸ ]ܶHtM*7DOHOɡv*ޑK7Ec%nER‪@> H!DflE)^|v͐&e+y|:..//bqeUUWu]"G5*u†Tox: ]ȎD`ERVj5fV {;(.b9NJ#n:*ʖDf=yFd%v@ NXsNJ{*[?C"WU/=#DoX2dc+IwA zFJ!1Cmgۂ`ѷPv@  de#duÈFd#j:M tXK+pee$"$tEq\GGZhu!#`y)1]J72J 5.#`*$ n Lir_~N|K)?ɛGdyq/yYWMӔO$Ru`@ߵ3kC nRiGZF))Mo/1=l{ڒƕJX 8s\0c%6Zƾ#$Qɢ+ =$m^&[?J,hnLzDH*0;p; ^EJT(IֈCyr…In""IyJ"TtzΈT1mp`!*"F6^AgVȞLկ鈿),{{_uŢ8_,eY..m&䟴JڤRZ%xn"eC[I`*$ %Whqo(CRgQe SQ,@@Lik0'aNM:ccK{ǃT#oH㮙$%8e67B,9i[|JM+*ԛNx2D o: ZQv7tf5G%6?!eFƃ *tQd<̂ :гppa_- jWERX/l7 ]wIzvIЉ@iޢ ٔ^~Et -ǧW/e_>:>|w~U,yYirtn6sn{ jv7IӣSTIl܁fd]wg RYu2r2`7ߒGx\A'T09aQ[ߘmN3 &G*#Zi:' ^ohJ7 ~n7ݺq2"+#Z]EŒj{ ( UztRo:@0to`?t_ϟ>N˫7WWu9W8BݶoOZe!2 풳+gY!&,v),x(t4,,Q0vّxQJuFy7@Ay~Ngd+,^8'b"{qv7m@VEGHqo:am3#lM+IzDHPM7NQ2gR5!ј]uj&A*d oDmYHϳ,Ie$Vi"d9:ǽzF1WS#&1+%Fw5/i-N_ydUyUUU͛qEmBݶ2N@osH6nԘhP RJ:dhh T{"PAߛEK˥ z#ivw{h5 :Lj~Nwdgˊ)=ymw#aʱӕ{ޕ0@MxVփvtXψVFUsJcφM sVCFV`IC Ffk^71J>L 3` !gO 翠cU}YTW8+v]l۶u`]/67=.$9XIy0ÑץV&k-Y}C[i%Y0ڃQ;N)0RTk[vg{|g[y@ct4 KEᫀ'qX9Xzjoktj!MTFko׃Qyхn[`>`37Vߓ}+\NO>3&bj,(+F&+hPz *;yA;esfN9źxƀ[{_CWj LURUulP c 0)ufL}n%RO F:c6x&0'=q_ۥ*:*{P*-I 10D= FbdC 0 dQڽGLq蕅;רA83&M!(s (4ր! (/'b2Ju6J(MbteAIh/?#\OOv^~vEݴ8xuu5?+rt@ԍ"^HvUJ۫F,Z-5$R( d^y:2ڹveaMX mFQ9Q`m߽rϛh!N (3ě.l˯C2gt挐xӑ압F^BCAHm `@đrhDD"$ԵT7  gw&\7(1)ڳP~Kz]x}}<|u~/ʢv F(6e7{ނ#'"yuH>an@v}츥ccw3#SUF:/%&CmְE&'QMbkD {Lv b񿍀AdjS5ݠED6Wӭ%L]B>`/>'>:?߾xrEY~qqQ,*/*\U&n .aoH .jn>9f1c.\j|AS[.9QM>%2'\Iq"0v ذĽb8VfkDr1`YDc ` ㏽1%tPM옄j'8B|q[5 JM@J1"^M  5't#ƈw ^[Ȭ P%TLrFbTQ`$^QӔYe.@;| \P7_ =ՋG}~~՛EQ\:B#ƪVKܷ[+dخ|7&Ɲy~8af!c1GPa;I I"^IQTFvf7WsFr)"Ca`$V|@dD)!S_h6%=ytG,;g/(..˲,˥.7 sVERIlgɟA`ЊI &Ynv@tVh7I9zLe(I#/D  2%%T.Â=m8G6_3ʁ?ENTn(3bۡ}o'Ng_UYQeUK%Xt7Sm' oC¥BA~KNR dpslD$Cz_jTA96GH'7lC-uSY$zꐃx2'Pb7=/.udt4;0@xsyPErx @tCZk7EI6%!w !IznY"GHB _=] 0RM2(ak`uC5GcI ]6)d/_>r1WחW\^l2O_t{:z;/NսvQJv5hC5/_gVr<,`尰9lz EW5toYA|~uJnmt~̒o ]M^Mwo:Ld]Mz.L~i7̛Vz  :`ȶ7ț酌T-ir2=tF]ݫ_$S|vrgW?]^/,EUU[Q ]p\Q Hs7Ha?yZ!w%@?Mtqc=9h}b4detb;P,"wVQ7Qi0:hCn|8l]:Mk.AMɼ)m۩9j: q5t!FRaj: ٌ1; wԽ]-^8`oӲn;;?u55u=/rUt meaӰ$?!+[" Ta3jL. be8H)Q6F0+sMVRwt-ۉQstdg4Ѡ$޷x8ePإ;AψWQ}v@M' qck^Y$i7#])`f˜g@wOGՇGO?L//.^ś,rQ|֩֫66k;~l\҃CD謗S T+"7^=#J2[1L>y,I\M7FjgLł }s[(;~k~tkh:ZMu`ƛRg#2ō֛R.@~0M7B5B S>#_t|dajx=tW$UîM "_@R;NKRwYkΙH1-wR$9=ՠQׁ=$mUSC̴CC0TM7 F1O>< [Ф#Ƒ›6Lz}+=#ㄦDZFctHψ6ц=ꞑLzt,SAI-tg|GFWX}D? 5>}vrqk7gbqQ|^huu`Dk H f6!@;"{A͈v>7H&q.ylKI!Dq9m;^t<w}62%O4`+&8&R \Sl:K CL"K)oSQ*QӑӮ1/7Jiw FG:; ۆن"i$I ,u Te$nmRÉr \DJ9H02&S7^N'>:jo^]4/?޴I;{x,Y{UUXXH$ ȡHq$.&ڈFD($FB|L 4&j$3}P ;k=V>Fw,+#3#=ys9Ngl+m֙n+\L=Z@"x8Z$So)II1@1=V=,( -& 55=!<#=" tU(: $qz+("oNV7]!5|:t[^{ߪcn&=zU:>>X.lVgu n3c)HcsT[,s /UbjhU581ފ]RGQG=_֯7Z:thCz CAT)4 .|+%.4ݻOMN0MS-`x[Tӡ#QؐIAَ I:v;.{!ϲOfoM ^(r|iJDDlm 5RĊ0o'4jhHV7&;!Rݐ*(M^9 N%5V85?(T (͝ ^_뵯E`:AQm'\t'QeiQT#L" `D锂M_Q*M6RT^ibStXFjE8}55#xю|hE(GjԧUeRөJZq[)| Y;̃+.ݜ/WfrQ kg1GL[XWw滾gDc-MQ<:ZcqI 2puWAuC}WѴ(Gb1E$yTOԸ4HXsM<;5NnGV׹CuZQÜEF ]QNN{]k}4zgҙ MoIC3j=#]E^UC̪YggA٭ i :SGm5]0v*`hzJDdzBdss/=N'$zkؕgw;5@j If^&лPb57E u#iݴjk{6TȞZ~|^w EE F2!f%mVj4[3\`#4O"+j6hK5]M(0ҧ2VT4tM+FAЬBUt` z 4mV)zr՛NZتÊ֪Y`P|q5ycsG雇Gwt:=Ӳ,9FNEmRН(GH GZ*wO$~P"2,c ǫOuD:)<+p#>ŕN*-%`XuUv\%D#i*a]I=HHOƱqN-0 oR)tJb h7/DT 5uP^q!Htm6iMG1@O4]gX@Qb;99)"Pe}=[ٝ7 ;nL=F3k{ҝHm^@&IڳG\_f.6H3F嚊4iY\q= HZW匬;"96, J%9DOT$7ThWnH,3ʈaP!Bl)!L SEDTEv SznrD!P\bU(GQ 4J^IB~U ⹮7j ٔNZ`DKjMZuVF)bHnhfڿwrP5tHQ*ЊdNZj:i$6%`Cl/=} 7LgIQ+ӔtPzR@^#8Pq$":2v.S}8meH@`YY >TawD ްv "6hPvJZvJP9 R=#Q櫊VYjޏt= .EXZ=.uTF؁:l҇Wsd]Q{SQMW+(K-bQum_U m.l3!zPvjqj~F[Z0D-: D1cpC5R+:{ҤV̢۟tU8vW*$gT ьef{*H6ҍ`4 M)TS4:$ZzX ez_ 5tbNwͼY%FhQ[JjY_Wjo0H5~Z5|D-l_P$Ԓ{QcQ HH$$};.zµ޽ׯ vܯ^0,yQ/m=~ڠꨫ"zUHD+Fm ,m;'El>2V֊JA} B#m| H]mJM);Al1* ,o-Q-p>Q[49>bR=vӠQ5 HyQ<$3utZc4mH5 JfjIZXRM0Ą7TeDMy+nj%QF*©ZOmB"lݻT(Aܔ;&ݻwj~t: j1xVMny7#b)hziEDh Z>rko 8lصq<_ϡ85GuSIP{1So)P_cՋa88PJ{t׭ i3  (N 6q/8WQ=1N"TR9`WIX Z4K EEtF,:h:RUtXF5t\$`vҫ>5 ]_ DIk;0`˰jI*4AvM\޼jAJ0MQHx`d׈= Fyhi& v4;zŲ2)N.Tw9~\C;~LJxJi RZǧ泖rJWS,5SS_,zeJ78qu+qg:)hN7+ʉTURVtlsUįM;5nׄnC~5(*5|mT"^ ktbj t^&:I;!v)(MJ3j"%PE-)~q#"iHׯ? 'GO&'bh:6@g{0zO|<6щIZhBk\7szr8[ɽ}^E5p'J@,J*.`ba:2-P4\W HڪfR:*#덀D5.SG}hzgfvLq< unW]Za͗vK-._]hMad=LS%ք"i~Y-! +4[QGk^Sřth;jIڭΛv7Y6@ۗ=gԑQJ-@JRP=u\[_ ;`1& :9'Z.13czYA 38?WvLx;mVq9h}۠A*!CHCҺqMP7&(5n ttkUfj|Zۑ.-ăwZ6[2Jmt@yFvhw:iwɭ2c5!aD +F-jE|MGhE4D j Q<`$!|Ma'B| ˋ¥sgf嫇G{AK]vr nc-F鏇f4H*4C(f֥̜zhvuy3aB݋!dT9]lb\ ÖX- ;"81idzbyc'ȐYf FBD,"S霳I`DZg[ }/Q9ydž<@"]te\P |AVX`Saj)7& eh7/ZLeXEjG·wF@I叧d ٤ÁVqIfkݕѩ=}(4mh`ku iBC7Vu("Q!Aqk: nt3ZMWxl(IJRmo}ayxxut2=fF띶I ]ߙ5H ;uP;zҶɨ%$ -ISP̧IYKے 0@*|bf`gp OJ"SD_{"Oxޢ8>Z6YdOݙf-s3/tΕ,zdWlѓ1erS!CǛA*a}WTDfN`,gzzgɥڣe*rHɦ6* u}h2SѝHl=ۅZMiKi7*:N+# )[T~9j{ө Na FTZ [cQ[}r𙢴;>>ٟ'ޛn+OQm:Tt;E0"0x9-*j}nfӪ#jiWFDdY&IKR'ހ<ЂO`3P*0,`\w1]`ƻ818Ю0v`̜ )!U;9\1wb`N7^ΏO޸u{(9gϡq["_.d`N 0W cZ Bi}QԹ9S;zb=^Q.5]K|mtBGB^g[TW猤#B"v{d9i Bi )GKƬTЛ-i\E&3^ZnW^ +`$ ˎh}I1&=9dnL3ǯ'o7p(MIXXA!){czw_ 0j WiHA?!_y|kAZZ]IԹ${.=ySG-0 `HI0"`I @# @6Yss% XJ8dz'>g|AqxO<^{5ȃ;d)G!=XGi&Kr8b2?-}V 9*!Ĵޗ^Yپf#WqQ#=6*}S/d?5j<<5A9`#XqNk_^Jv+|BY^'QgcUu^n0Z"0艏IPV ܛ6g#-rʟ%{z'|{&^<88~s:>Nl\.CkpaFMMoA)Pډ٨T5K*Kp<%띩:9T1j:œ1& `Y]^Tg]Ǟ䗿{s_D{ 9!0HS݈ƘZ5I6լ\~L%6s:*E{-'7c/?l9n^ަ(6Lgz`(1IU=b+ 2~8d@v0ŪՕ+$G~R`W5ĀU+`d Ei^He۵9U-y?U:uU4ISDjv!q8`V0( j^pѪDj-#tQP`⓸迋iAZD"hUMwJeT@&e}rG/!96.%w<O8LLӃl6Y. kmR"`T@/l H }6\,`ZEHlSH~E7F+ӪM.E] FIygygp~\ ɕ\T63*|ڰY^Hj'62k_!c&R6s D-NiͲL֍)CJ\A#V۰^EJ#uM] .t_t(jl+@n:XY#EZˈi5^;HT_ A .ȫӧ.(y2]:::ޟflX,eYXu&Nb/h z>%YuO9V0weOCXrg eY6 p8;`0e<K>oݏ?_8Ƽ28_x7@NU!KD]{ ajTP 216,,( eJ/qn?EƧO|Wʷ?" LR$39@)R"Cz䍖|/ B`w#^Vj eZ-3. HٹUjCBg c2Mk# 5KW*%݋.yeݿM뮋} mD15#E;?r7ќ☓&WT)RiL>y%`h*EI2${nK¥ᳳyykxo6*K0YGmK؈R!mRjDU:)o&"JI<{( RW{^ɧ~Sw?q?}'M p!r2 !ՈYYgfQdxPd%<3CHy()pAf`^fs=/Ƈ~8ƭo} /="f)-\k"F #*]*wPt!dr}/"DڟmU5MqiN=i7iFK \dk %'#U=`i9@* z@uGs`&vRE H4H1i3 h$D5rEIf(I^l(K5TϚ ( 9\q@no0Z>g:_r梴O.bX׳>-IR qUp@2I'2UʷVXD $1Y~Fp8L& nFvϞk/>8Oӣru5Yۂޯ=mE @ km`@I0HebB ;'0NxJ4,\\WfX⠨n]9y `az]l+v^כPK͍P%C!%H,#%AƂlptȌcxwWx[_ \6wfGIYYv ~-3;'̘pn毡߃0UIFV_G3b4ãT52fpw }SrX&̼`h:.L8wao$ Eyń_xEW4W-(A#WnZ#:dUiV-jPH4FIWpPƸ]׺_R6ry0C@adR(0:mCcgVE*CF4/J3PAKx=w<]>:M|Ev{بu AMuΕBX4:?}n?1CWy%LN\Z"?p"\ӓ,.1;Iw zRE0`rzDJ=gtV!H6զH5U&0j6ibq ʊR+0 BPÝ;H/SO ?n?/Y a.l#dJJH:8kX N;9~n7EHrH_ǥzꜳEY,Sɤۯ?p#dna)UPj"(pjl9cpFxS)FhS.{Z;T^`،`7}qĥ:6Mzt-Ւ+sع- upt7gdX,!Jb-(uUiÏǦX@ 眳֖_i>{[trt<k˜VX'lce+&K^Yw(E,Jv/c%0;wh<_y#_?ԝ;[ 0'LH y0Rtdi6YW*;ڮ2FZy\uc$ʑg!-D`Ep2w[xqWdX[q,ֺ ie@9EY.Yo.=k$)[o6UŠn&F9Jc":vK'$}&򴰓\eYz.ΫrΕv#c'׿8Z[8祉mY䁣/R'V \VpF {GWZ~MKm?lY< :$7E^GIru *ΞFxBHPp wzgpm8sQ5:͎;*#5ԯʮeɽQeY ʌ1yoB~h1dd N8)#Liyw6ΖEQesڨx<_FO^kɓ=⅓ూ!QZ5{As)I% k:^y.i "E+ jo6ح Қ.ARG/ x A‣0lp`Sd?{~fgG{ebi32ZEQ{.~26I7DjJ!Cg0;㯤n7_S%KbcpsΕeIbaLi2O{? ՀXX!d.vOl/( .#3xg<_FO__׿_|`sb9TQBU$HiEKYMV+"eR\ij!lWf58VcoM*̠00q/JFOpʇO3̲<Ϗe/M9W:ګ\ݜֺrY&I:;b̐˙(gC<}7,RgD;*BRD,|拹Ztl rIgd1 P>%Juꨚ6#]k Mkshn"c$I sml8kw j hΏK& ;v$I8hpr2s2f|>PԝihL+5ݶR WUъ)3,ϫ5e,Y1IJDi5H>8k]EX, ኢ`Oٙ@wwwǻGS'>_oGȒo>Xpaʒ1N #3@{EgݖV ԣ"qL+=ZŎ5cR+5E?^#ɛBSE,ANpq0.Ο_ϙ|)Ed ( "rRE9T[3qrˊeNLddL )p6jK_4k[jKV9>[ ˎs֖EQˢXEa={H✓r ؖYYrVY=cLJD O T3ABv{kioH ~)bWԙ1IzA<^jz4ce(0B QM'Ln@crNbą╋d2=r(˲Tn&`~().@ghP%kk, eY霈TSM9W YsluEQpZD(x<vwwF/W}Ҙo.,*P;QB*ºC+Шx~Jo"t$je.S6FD-e%>:hڿ#8Q%d+q>O~>{r%2goU!D(zzXB!s mQ,Ȳ7 Fp=42/ H*aG@H@QT=p@>D G7O Nn]=s_=8 iUFm^tLA[&Ԏ4M`0wwwwvww/F'G>+__Sy0E%v O=SyDoPz 8~:2lGP,\`%3q0}*pU:RCMO9j 0|8ejpZ'`h.!z3qR:pQ-n)|/qRXߗqdXR%:i]%1Vi䌕Ny J;lZde@ZGaM5^BUQ`/[ʉI֨DS2s} ?f'+莓ض:L@}Fk[n! 7x]gi1  ;;;<}O[Ap`[CzT {&J7%._Subz*gﰩ:іU`Q M6 gݨl1`.U^ur5 S$uW$hфR!d'cBsP,I˗Wvk+Iz׏騜xM5V [3RFYKbM`%1=vvv]~~/N~7N*,|(3TLF"\fDՒ(ΉI٩/(X:jSP&ƗwTDjbqS^uOc1R aĄ ! '̧%?q}W_RDJf^s,KLX is@)=Mݺi?~B6E{ [D1Dn͌թQ0Ledӛ6ܹrutz獖f>+Mw Ռ=Ťkmjڍ4M`FK~_+O|`㙅c\ށ! q'qP4\ W` 7Q)ICM\\9BL%IVU/"8OUư09jxG1< 5AB(¤dR2dFɟx+sf^: \( F\оI%Җi`HM5" x/~)Ԫ $:r04y}EӚ¾%P%=oypt|i?8:'KO9lGY]O }FoZ$Q+]Q}#p8px_o_zstO- /A?ܫ0+#Y-ɵ볜65tKt raggg<ȧ>7N-'L2Wz[ {k=3cтE;U ^l1 3;¢kvɆ#9!Ԏ WH$_!xu'j$H  1XXLun/OJ\;ף7~?An_9feYZ,ZS:2: NMy؜V_7XuqYX75Z]u _E@,D8Rn u/`rnudo>(<qd@š pY}[`{xgx8.'H7Qv$^❎Fh4:?yg}ć9(,QprCcw3~'DmK  AȅT@ey\.:Dn}-ZyJ_%ثj`bKTdyF`B+wpdX'?_ӝYQ kmi5Lڤx-mzIN]tFzUF]}#YCEF5JIMWoHlW+{ IȾWw[E`>ʲ\vPu ĶGz=$: ipKQur{g~ksK gqU4X4mixaw*Q چP{Zrd՘J~r+#Y; ԲJ_-%<0O9Ud0†(]MCGBu*#`&/Yaٍ/^w~p;3k,K\./{fwyؼfiޫntTF]Y+j8**]b|_Hgr~tekݝb1[VMɱYHQvK MJzt4 `pm0#I 1] FbU,/O+ݮ2 JYgY`Q:YB}Zh+N'u2IWiZF0JT UB}OI@,^iF>NIʐ`"j!8^:z|ڣpx\.gC]6'(mYʖ>m`͂lJ#J}tVkڰzcGN HdR>\O2y tyel^`2Mʢ:H0z+ypw0\z?;dž|pU(̉|Uz!Km/QSI3bu*bVKmfn  :_D0(s_1*#%{0JHD0ް"z M5Z}L]c'`@op8w'{w/\[_shRTCPD*'yױl~^8\VTG^k ,$ޢUkP4]/g͟+̬ U(,AHʢH"Mڬ3#f"dKeݲrGt03ȖlmɶDP}Gr{۽}/_fV @TDe%^}9L2sJuavKs$M/8NZN+`5/hL0Mx5$~0d'4}_j5h4r{Ww<_H4R S.__쮡V<5#JqH;?< }0^յ{r 1'ʸ ٌR 9 lp,p B?.oJN;i0b0Zk `Bgs?<Wj,qY)H-ƒA"Lױ4mWvIoW@ׯ! Yb[Ż}˨r`$HAs+ ϶N63p48FjZj0 wAOwl@jYq-50J\W=;ތPQ3Rܛ!҆3hhdVBwxa 8@UAϔdryߦ%2㬫)ҫ֖j+ȾvB@Qvs~pkRkZmht\\Zrktg3QyJ!&Hy}3aAkH7q. \D'3E^Hk3d# N5[+ne)ܘיa[ H<&]=\EaYw'wRFigJ/ cU.wҫքX&ڸ5o]Gt3|ÿd83&Qf5n~#ٜ qNVnz,LY[XCMF1dK`4: F3`6TVΥ(z3Inʅ 'M+M=iI]bFq`*2 ̶.lܧ6u\}w4x3Xu/PJo׺x3J!鲌f! G5Q_Z6sCo25b[^Fgj:x5Tzn*sFE 0n+[BO_c6U6[`[l]LZ xA*!D ]"4Z)Z̔u7I3 jq~=?Zv^nÇGo¢ac H5jK*7D0 g+d5$C@UPU,K/+Zkqo&Iɲ,Z)쁦ucՍ~ݰP RZj0 wAg?x96YԺS 0-a >9#Z;TѰ4Wx nVY[SHpUfئ^7pm9Ξ`aUheHr\s4 @ Tz y'v߹ZQWK2ݹ5*WfptEcbt &-.dxIt4s>~0!h2XחwdknJӴeYcL=% ~5$`G#|aF#N83y [)vmL",~b@ 4pe69*)w_U P1#x\0 rfXJ2]8wNAp^_k<ϫfя4{Xп g}!bο品@B1$+0yLh_0+s|-Nɕn7L$I`'Mj\ݢ4l;3B%YZ`y~CG2:Cmuŀ J=Tg}t՚H4jW"XoYYp`8ö[$F+;9ATZ4ڛwP=pa=VWAp> +Ft< 4No% я"DCht~ *X{ sWY\Ŝ3C'/Y_jcG#qjG< 68yGQ -yt|)6C j6M= t@3nHU\8i.!`K$ ~/Ø1c4K+PSl*u;ْ%ޒA{4/7Gs40EѵZqI9Vg02fsʞ}h#IBd:cҕ9s:jLӤj4f4*uyxF .IJ)kZa#Ev7Z[T;ۨ?zWw߀ Jnso Z3(nDkw& "<Ȍ(=D9=̨im Ѝst;9ReQ@,n޹`ͥJ \z= ̪yKa60lJ)S7(;:<4[ ~ <ͼXfdWhnu7duB2$t"HObu.c.8VэN!M誛^tG(m1} 0y)Vv V`>Qqc(ݼ:–#"$ 0U9`0BkF_`zY"TGlH #k֘f b/ӕPy~nfM2p쐥Ib框[NrGhlܡdZm= neNфHf[LF /γ$ IgDݓX9'fڌiynѸAI3\'0QEc{Ý{j?Z)̵ JÖ d2ˈ+Dp6QUSl(bPO@H*k! @l2r`-w 8a[v1ȮiDTxUr`*򨩰Q`T= Ora/]sx9n~ jan7J"uЖ5Fvى§{>=Z~\/ռ38'F'0I.ޓ`1cG. yE8W y Rʕz`k] ɲ!`T,zPM)Z¡Mɭu)\e>5(83S_ <6`"H!]6g2@6rdwdFКng;yUM#iR9`[F̀iG0,-ŝwyo,{a )#LI^u% H |2U9:%η:F7Ӵ Q[ SOie( :qFȒ^(͹px(O2dBH*owl}  n[5to-oWLyY UIx4浕yq.F$M$?FXҤ0nvޢ4 <ϛyl;N8iVR` t=uk6bH[@I! }߯y7'\Z؎b34-hMYd7KVLb> <2FS0HoyE\ɗ?k 7gYvTJuR:3(ý$ )'𥔡yu|q'+/z]w7@)6F!MBd0*Zˠ>'5nh&pAfQ󥏦_R.H)<ϫa !d=Lv{#OM/9$ ʂwưl<)i00ͮ}_AzWRG;Vv϶e0φ cV"P5L|n6^;\eNBkiniQfЪjPܾRI1܍y!kg0ǗxG]y&Z$ͻŽN[? n?4Ly2o@t9έ/ݨ!,QفQyF[qv@7cH'kkM |kj懔WZn{9 'yg.^Ac43sHz Eze,k.gi&zdD1XWr7J'gbkh{ #rZ ؉Vsڜ~y Ս'aI[u *v2L"`/HNc9l_^'җZd#v$qn\q2$C)eM1?2cc _8f4Dfxx8F1%KtO~JyVun_hniZ@=*<qEQ;Mv1&C+j `"Ů3M}J0*F+K} Y0*f2Yo;7xec|Ah"Dyy0>,hB_Qa #[;J QNڝ&IS 1p6~|dvmr {QYkRr]v$IbnjTTM>!_9ϲ,Mq3Y]nw9AcA}0uy]l*SQſ0q4%_1MS n/gm|X&+ysf&ul=N$IIdJjѰZvc%fG! aB!K)!D=ڳ!/=o5mz;uJ3e4MvXk0qcDCR*q3MugWV.!jsvEF KUO@"o36ʃ2DT#"_JUMWL|v:@4*ƽ켿#Cg0jtZ.tt#IҶd͝gݴIF<f- H>j%(I)}"0ڀIP`FUh=fcM՛":Sycv44M4LS4 0uC>ZkeYeY'˲<7S߸{9t-~q&\pslnw+!#NDBxD$frm B<9eW"bB/{fRH %:Bygki6$i:lvf nv$h {B@J˫QjTgό0vΨbڄ1nUсaGh~˜lyyӁC*{tPtҝZYywR-%!,h$CQ+(OɛFvKR+E1(!e8@ݐ`>f`uHtC>7`ؽI 0';Id3MVIn޳:&u$$gQ@~Pp[kg6Hc`i"S:0MAn]&:a5uS)β,hCn9eZ4'Z1/~YUG4ilElTg,3u&aU9!r|"ܠF[ FE=dhș$}r2j|wPsu%IVJ49x͜nc$G,/BH)Ybθ`Gy Cj"r t lI/yVJŅ-v&0%=9>7fƘjcu,7.& ;GJt?0 LwDH5IёV4;n4-1afcGt.`2_[-CO.aN,]nwӖy'˲bvvfs>?; >?dKnҴ$Ie8Gi_g61@շX8 !|ikѽ V^z 5c#Ӎ#6#j7ݰoLm{f 56)3̜3s^FF56TߘUU_ׁm ̒6#JTԎjHKh (tey'R#SpK2#kQT/lv$Ig{Gifm(Mڭ!MKj ӄaQ }KzrojLS vҘ5(fV TgGōkeW xI  8ЮI`4;n=f4Îْ1dY;qB$yn <4ϚVjwN7xгnv"gtmG6!{H! ET?982F (Ѕhhk0߼5ZxlV]Ί ^aHvnEW`r;xrm "A'ε-#?H06<[nc(Pro=J)qIjLd'\[<ϒ8N4β,ӕ4q`d0zuBocU۳ fcؒ._aIƁqs8!101vřJƑqְ7hD$|@`إ26holء$@砪n?Xǚɨ["B&2%`c gY}ObZ!R(zEQ})7v|xյecn{넷B.y$L:3Z\)+ HY|,Rh%:@F%zEog|`f 5s+@xrco6L<LX & iND)eRRF琧ԣ:c;BHDX ;/ٺs&F!-;"@H V | --kF $ ܀ 5 {+&PkJR*VJu$Ж((a.ѧKYʓR@ ̩ȚE 1ȱR俙`TC y$8i&kδ6Zc̛5@(_KiwO7^:ѭoEKTdfh^ ?O<כ_?t5][5~48O!ݍ3h4 oZ0 %44DQt-8{_K`A4Pm Ωdcm1d'g"j=l K,%PQv +<0ut_I^!˲Ymiy 0#QrUQVEQAyޮݏg YWYI3S-~Xo(X,fTP 4$I5Ȭ(_XT)C”? +G>ĿZN4n_.穊vYc@O= o{h}~wk_E?xk000;Lt10i\V߅c1qgQu &D9+Po]s,*-y6IǔD뷾 Xd` f)H:kȯEغ>r׾uN\x3sG3%+qlh@"zZ=?@_j[7*{Z,g9"7*ঃլ!%!cƘXky;t=~cUP@V>g?=?ro6o@<FoPG{/~(2=_{F}o׀fdi6}ޤ1"30zҤ榰v)51;ZA?iﮟƄzD[^&$znvzD7 5FE6Rz,.v|ӹv[qY)e:h(jG~^o v?zWb\n(ع*|IJ9k( g{NfO}CϓBl}nc:.7SJm(rA,>;+5G z?h?tj3f2ΠT֋*,xϱ}3xGn0IiCO<^WӺ =6NĐ6xt,SqZZ,A^B(e<"̦\]wY\P?zn+fʙ9ynj3MӍ$Iu:NM4w DWՂF1E yH,x5pWRYv]µ P/.1> CCnz< B2t"I]Jw\97i{GQo񕞿\~?ػvdXxyGA~+Gg:vLsX:{>qW +0_6K rtq2ƤJ$ne$IIt,K+rPq bKP}_FQ0 atg?v+Wb\^lĺtOX cTT60li7t@ d Թfv/Yni;`TV{>OE[MsIA*goAG>sOTfbjA )( v`S?>Ý~^xfRWrA桧`34_׀`tSJvmҏ bH}2 s$I}O1ـl FzNz:/ FNx`O.Q#3|Ɓθ 2(B cGRJo~~>Z\\[XXXm4kڡ~_SmzLpAHR$HcFTpDSdD0rS[7"ctA8>t.V$iN|1X3z3O}cO{$X @Pٵ\-34L= R,5ve/OmdfXPf|K9r?:ԑ+y ُ m@JA0؎(Dջv_֙Ε1OZaG#{|D?)T1qILY&0*\XX[XXXW]};KW7lW # $Ju֊m*ʔ]榃QɐP_ W_YZ[ZjyWWycV~'߻I0faq@ ٺk qѨ ҁ jT{Ş;wk_:N-·(-}|ّ_̱R8?Ub@Fnf5H@k&m 1@P}o]^ٸ+lwӜcN͎4LhRj̒qF7JbL'uE:z7vjڑ}^7lf: 2& 3 o'P(_׾d/izn_lZNSSQos}{7Ys 6|\/nͺ_@hzwҹF)M+5_Ȏ| X_l'՚8BX4ώ0!Mҁ 2c>ވ:(SavAv{4y^bcaaai~~~o^7 9_|.w"IKˌ_k7;X9}5#v m0FM$j>H(d~扐t3vJji 4 E=8]Ԃ.^ml͸`H=2Lno s Sc^/5mt]3:v_xsYsÓ1a(\J3rM9=.L$B''W;/|s¹n9ΤFgLtvǒެl7 d}quZSG<ϋ(X\\/,,,-,,q`x{}8y9"7Dv1ThfEMJPW^}1;<)7Vunw K=}#?s`áCg$9T#ddWԐ 4Um )XS͌􏦦4fđC|w3ɑ]w`KrV4rȍ씶 32dϋ  s΃W_:ӹ14 (݌:xOai\II4LF|mqqqq~~~O^;Gw>_MF(Xf$#*E}yF}ȵvtk o `'/A@b_8G[ntݾnINvW>O| ۻIþ-%09FdòA3C;칢2α "xDg9qAoxNRVהF֌8z3?tϭXg= 3x(7teN'bC0`H5 +Wܽ 4.4;f QiՐnfhf0]8ǀQ`h{SO>_:m&852a; 7!*ʜW_°-0[`0vt#R@HL4_14~oZWn'˲pFAJoyqs=|=jFT܂[,(6kjfe61Eרq_:h]}jJckF_4-MF2Œv;ft>/_=e&14#|iucʪ(Lgaƃ`! |_awv겯_tݾn7:NFds~#_ڵI1gzsF:n:0UM*rP V5unڱ/55':_gYf4 ؆9s ڸ 2` c戩Hofwr|Ad ܵ߹)͎qiZPN> O5 14ia`jF G~S~풒_:FizH:fTxŒ 0bt=`V;`d"򠛧_{Zįv:v{j+hf|SO~c0Gߵk:YXeB%0ܢkkF#zI%/ $#Pl:x[ݻ*_ҩkjnSY3zg>;_LGάg s AwӚ e@1Phb0Pqoasզ.HwL]}׿umkJjHfҤ$nl7}3Sܟ԰1uQ`TeF(C'x.)W?@u_ ` X0Baz8inTn>Fz@`~ؕ_kL$VJP7 yzC~{|z'5#kf1@_ݦ9fG'Y`KN+>DMQCwק7o|Midɣy٧zdfRMg^k7 ) ^'End̽-O ( w{eڗ7/u!͎H7-&piZ0j4Rݵvwa}ϻ寿/*l Hi3FAQ38gFcF+@묻`HͼO@_{|%я|O~{|z1gfL^d9CBD.ΕeCL93FaH\C58|߻ķmn7FU3ZyGo}Ǐa'l2`C02\Ԍr 0r7]4|)cX1`{0@0 hҝ{=޿ڜՔfMIRmChT}kRm,-,,*sFwaxݏnkb`^yg?_G[]$X`͑#SԈ704~DiGvv\2JSDyjw߱[|XKt!]/(=yB`Tz90ï=T9OE |yבɶZJv ʙ[Za3%2KwE;Z\츩4cLjJ[!a@4…F0 ߟMė_@+ԔA@u3†*[@"aL Uv恑l|PA?,izݮjʎEx}ǟGO~]ylu`C`I3SoȐ2LV"h0i FdsQv蓈-SJ0%2[ȉ)m W~DWҩ׮4ftg?GN]K{5# *uΉ* v3YƗfX9N38z.ʣQ((͔I/ݹwjۧۗ6.u'{͎q݀4-0z(6z鍪 bE$ ›d{ x'џcW6'5Ũ֌$wi fSv;îeӂS`T(X!_P=}-@r=j.4M7[5.^Gyg?{80*#$Lg\7 32 SțL0cI,SQu)Nz "" sF]X ק6sm55=~Ե ;Yvap IDAT'IlARQCrd[᭧n:]6 a A".[\;Imty=wV~|֔f4;n MSCޯy$F4U혛V;q_ޢ,s[ o:Stծ2]%[FB j@+ͻ?t]v$I&W[<3??{|ϥvE6V |r6lE60fXpm}͞KvB2 vR^NeC[;!(H|{w>ܩϮ) Ԍ??}ǏakF 5J5iPY3*ɶ2q* 9l]=^r33K)q F)lfDz]wo:u97|N ΎH7~T(7JbZaFFρу~~Χ?~/hWO4 uͨ @Y3vQ@{E3nq&TS-#rӺ5^yh5%?v[֕v݊<2ݑ`3Oc[ ;'lH1Xn?{%u~>ruUd@IT&%1HLlrZ3,Ye9I#7G߼|qf.y֓$hIwE,(ni iVa =@Jߝ0a^1(IHQ):1χ87`v.|V#B킢[_;u&y}J i0W$#jjuCXVTo7W|<l;%P@Ҡԁg"4HJQ ٹ n ƊD"d`KD!SP^b сSݩ-pH}ewI`T*z822R++ʆbxCyv3c>?SmpG F9Nt乞 rV("4+*eAɮUNׄ=h#9I&ϭzOUF1mVu#d Bx̣ͯ]qdkBU0FM'&{[kh&1BjJ"c&s#Iu`g&u?ӳs8tbŋgHx0ZUhVVմ>bM-o=-_:0Hi0Bl:?˔_K-(|Te嬨'_[D%=WUtYިl6LVݠ#@$+C5/bM<AJpp+)}=z Gi["ڐCi^Wͫ|#mKh!;i2+@[gj`[VSu:G1|Ӎe J„9 d4qUQM%V< ">#[N99ӎ(yX+7ٶoqVgY*K:E5#6`dTkݣ;/8vzڣix+#Z jT*m* 7r_KgbQ&F9#tvWR CM}DpF"*D—ݹyC9l`ϷFE.IgBΉ8HnV 2I{77@q:_հ?D`X) ?!5X֊ <2;`D,4EЦT)@ >1KRzڱ=i݉BN= RMjlHb(cJ*V2UQЙ6LF)_dPn =}1NFyK@F9#p ?~g! 5HjZadd|>Wy?[?_\/V/PNB0JNB/d7@Ǿݺ8 v:v\ݞ 0#倒Fɘ&7ϐXL*$VQMn) 7-2osC@s(u,0@.6oJ{ _R)!LrC&`u[~7NCokp2Wro z>VV0ڱMo{~o슯Cc(vT@Bx\wNծ2|D9ȷ _bk])sv1̴vR*8~h2>qbՆ|) R@N(De9wv&dB'5'g}{(rqf'nA\e/"ӄ OPTE hMN6gah|N+")Lq\]1@zJudo^rn'F q)gT1v䑩u=?69fDB!0 5 HF=3B!7::Zj:VŭB{?;~Ezqq7F.*( t^2kqy_r䓈ܵlgvj~m8:(ibtqߜeXuSqfX@*`iM;[xgH%y܀U"eklJ#ed6B(\~bmeR*D zYl[)VLf@1C ޻&S=Loۺ<`N9Lm_GOA ɾ 5 H FiXPkZ~ddRƫjZq?sƷܶ'4!!QG(zԎ;t,N#ik#0pYӑA=PGrj7c쩧Qv0 'HXש>⾋ ->~贘>b|նܺMR+`wLm_ZVA&`IԪlJA^D2IczTY|GAdĔHETM^ЊXWSd|0E{DV3L` R )΄!R:#e7&255]TL5"{9#zMsF?c}O9k@(XdBNGsŀX L}Dխ7ݿ?cMn#O(#Y`qo5rXyY=dY|ᱢ 0 )ebFP?(RSɘVٖ߰H$HJ]͡HO2:ڢǰi84 )oobc#tJG.=3ZNEi4&[iҚu₍41Q{LlJj5Cͅc(@&Oְg`dLF2F]3 FjTEL>y췧N;@Qu3< ]/ѪI^_*w>Tu_|݇v"U_C'0x>#vk hsc03>gl-t4͓FljAM$6Qr5\dJZ5]:6iڛsA,4zDI•Y~v 4XpF8M`mL5+lN=f+p"AVG& tCf#Bc>N; d#hl\g%zٿ3~jyG9]"J\t1ezvM}DRP*K}m]yp &(y@YI6zR0bH]K`Dx}|ȳϡg:zD>l6O6svv-%&!TMI&.f)nOw,ʇ T[01'.,'exr!2t*N&դ-2+S"IsA7cС[Y&`>D8 l\8#}F;ȩC5]_#@ጊ 4fl՚3`9& dSSGNO0Ao8,eӖ[KSXՌ07 $Td] 5a(Ñv+3‚l:"FN:ß:/ٙ~5]aFseEؽ҆VcLi]s/.TG({%`dWE.I7YwEw([ P^O&o]]|L)35 KMFjхVw{Քhcd&M%("2՛Ɛ 2(MbTiY@gvzOմ Pwl[@I4CtDibw}h'̨,gdӥ+8GhpFq@.gFUH5 8/m'̬3`4<< ].0J#rP(ܸj{o-/\tT鷼p'#, FRVH,FwbxWvD7^ _}9mE1kSpFk:w"X\ĀEh?k&xdytc+uחIx+1f}Un/.N),Q/gFVm# nȉDJMԗMg6v=i#L'#Qȧ؁OkMFC0W ]rV5z w~}q:~,Q%gMD_6zqGm)u_I0yԾ|xTpFw;<$ &t"w gRmKJ&R0b&3 Ҟn;QtwYOf<=ĬקgԟMGgXX!AbA(Hp\ӫ3b0s8g?FC"rGTFGGǪrP(tӝsO:_7#) 9/5z`f`d!3ZtWH еsV4^ݱa;a{j NӴ{Qō"b(ΞNbt6r8TLde\pC&`Ye^Ɯa"=,` :Slhb2]|Kdd隁Q#+NEf2\3>(K|Fx6`{+5?5fѫNFR!`#FFFZZM}|~ǭv|h[|pQ#D)(GA`5]Z7n#~,`@>A6 yOg?ѵǚf9k(82AKхVtj`ėJ 8BΝ=ĪX@K8%ztz2WuG6i Qզ#&'N;f#D)3 ]FFfD}fU =2>#ݘ|F`,(\YΨgĆ3b8>#JtaGiؾ73ߚ]N /s-Kl}D^jGt?Mjw!iE%@@΂X|2RfMq(Uɉ /txɃ<Ox'7WvZFLٜ}FNbѠoJ`Rɩz| 0R JF^ё5*w_GLCMBqSfTрl:B{Lͯ#z.3ZJfMwëwgC0W$ ]|~~XuOly|h*V' #e%0^>{3({iiTۿgIWEM'D*biT< Ȫacx=jfn;"[TrEZ]>wj6}V^LӝL6qX@J!ͦK_DpBK h+&h̅Ci6sёSߚn1Ѡ>lvRΣq@|8 ="hiL53s k$+Z[Ung×6T;A!Qyz2Jԍ^^`gUWg263ѡ#9uܾzdrqGRʋQ-f~tђߧ)sj'ۨOlWHYEX2_ A[(D2:r"҈h݌nP5QdVb 0 Ȅ6f}Fn6-grFpF ⌈b->X,n-J;}[_8T( *!詏>ᒤY٥g:exW|D yD V-y$vj6g|(K1\BR`))Ԓz}7:{Cc+o՛>AJP&p `;leᆓIav$EA7IUz]muc/d#Qf }G32]F_vF=ODN>\5ENgӉB~ѫ6>siy=h4εF݋ I]lz.8dzX\@xƢ9)tHE[8 2НVFHI,MQϳfj:I~_fψhgDYlRgHH5g4+Xmgq\D@#D/0RINuPYեoWrn<(4Ew6NII_8m*.K{3RՖ&'όNkj*dsY FJ2ZVV bsXiwOu匌pF{l:c"5g4VsG?±O7MChx^.X,nv=?lq]s8v JPJy9a #T95rG JBm5+;_ *НB?|6}vx:e 0 ]RkR0)iIxdzjjtx y9VMMj:TZޗ>0H{nl:AF0b>#r"}>>kzuR>~ӫڝqF?{?Fs^`4<, -6  GrX,nXVV?w8zeQMi02ӏrHlZ:[b`y5' J91?vnntfs  R]k`ԤDЖ3gNi|ōrզ2A)K6:XJ@$<-jL([Ygq@KrF v5n<}G?s?ou懜$vG2֬?=Fˏ=7 V*F9gZ^=F6 w5;+vH9\r^|P(H^@Ocu׍}j' FRE2eFy$k+D3cԷU >2t:Ft e>gGMGgDϨ3"g2"3B< (Ψ6WGfwcG& GoChx^iR#<[QJjRl* 7t[yNi̶P$QaF(zHK4 8)@9ĜFF9OQQ>~`#Mn^YI_8af;N; 㘙%.-B> ]SD?sflHCFȕ+' !(+Lfv+kR5:D3|NZ^ipQ6]9 L|F=n*bOY=珜AZuk.[}2YmBRoX77{D {g0L@Br^(%hAjb`d #e.g4ᲁC^tAuxr o+vt0:h4f;Nk5B~ Wb]lߋvpMom"GN6*a-Ġt[q\+-gD tYHiw}>#iP %#{&:珞l"6f$vWh&vbv_4͹Gc> FDgQ (tXe׳N}x.+Q^*z@| vrvp]wo/'i5Ċ0!r9GlOMG.-g`\!Sl:v  3_g>D#+[ \Rj[P(p뎟=Cb/<`dȩ#9`bNj$6V~Y3(YQJ${,o[S~aO:j [V1TYF=}`bN1h?˛n:Ê㈘H5qӓrF;A}F#/V3rR"ZOS(v27M#_ϷqNB 51!]0jVkm}čo]]9CM crC# t.Y&0 &# F$C};~+ ϴmp΂р I_)`8$=U={0A!qPC&R]w8#MGJ3}-3t=}F&RӒn0K6zjl%;>getP^ ʀ[Q ]o޷wO<?(1J9EAXo`dR F?{7iP)*xP w&~(LݸI_8?nbb^`ԓ߸|ÚWC7%4:liq$lR^O2z|FMZM="=10r8 A00t/ٞ[ d0DƷ޴j4[Lv $\+Rl}DGj15tz9ڢEI bƈ`uV駶|<}pI;P eO#f\}zz#c D/9$$ـ};/\gx^t9#F0V(vڮ6|<:ֆl T(=!o[ 5[6W WQz32^Ie##rC͘֋3;֏?t;Zf9jR0R&K.x`k<V^q#qd}znCsh=ׇgx^vt>E# T*|>;{7~_lc-N f|KrȕuRQYH*z#MVWF䀑:‡( =v?rU;apjͶ햩MR :,*^&`U]Wps 䉜G ͷb XʸE0YqFaN6z|F+CZDlA-G󈊾Gqٗͯĉ皳MyY-ti>_w/Sm@BE՜@Y6 l Qr==`I*nbrɰcHV|`{D!PHBӼ%:~1:ԍ(B |{,"߮dPٵwٝyF-xECu$ XTTFY\/gq@>4##=`DF:ιaȾ!A:ܳ ='(T=DAsQdmm5=JG\W,Uj[?\}s8| `TГ }*Vr8 Fi1#Sܧ<t F$h>DcE?kȊJv;mx5(lr@GairKR`$Tv(]owև~B=yEG %ϵJy@AcEF,gt f>#بH{Mtl:X僭0fJ""HiK PBw K$G6:1>BGpyr#jBZ>|u>7g]%J0t)yI#(4ҐTgUT aNF|`2`D$]n@<)! r DȦcusGMss) . # ow>STʬ :P=i/ F6(5#h IDAT,𥀑灅fERG矑??Rz u$ʝ[K\qVq>rFwwfCw>0b{0iF]HF,%H&)2ExϨ3JR",2(R J]"+8eM~Ȟ[!|E.EJoѦGhttd&4$u^ϯ]>b: *(A9O'ToTD,F0LF\{zk.@_a[<>ϡ2T֍+VuQ%х \8UC`r_`8U#y_O|1&'3E͘XTLdJB"HS(`D6-Ȅ;3zL}DgrF.Q<-RRݴsbߨ?vru .\>066Vj67u]t/E-}D B '`vKS`~0Rw1^@9`ouOfyhm6snEQF ExAMLZ{\XeG9 Toߺw|>tpFq+ 3Jt3B'+$QfBbFzjiaThΈ%|Fg e]pU9 SҩQf|W6jt^.w3C\y@0"WZzɀrP(ܴykWoR_7n  $8$P6k|!5]MΤnр0e Kv1YFD#ʈ.<P~k魫hNӉz.Uν E:|%> B#SO"^YzmhŲ#rHqѢ`V͖ͦt0B/ TQ F n'wLJdc>:O,- 0-PRxx=9trJsE z^^/MbP(ܰozm[}+Q" ֫6HF!䄀-EMs)s 8+RGx.˽e Ⱦ~p$AH|/ٍhc<^{Nv ZIDByff$IDY?r+џ JSV"U6h;vo(a(Yq, Q0 WS EMYm;~/M|U76ֹNfT}`Fov8#j>5;k:6-0zS>V`& FgzgDYq 8#]i_R3`~Q) Ad!E.O o7'}!Y3 H"Wǹ\.2jcJeMXܒo-}CGNIVZٓGT gF1 N؟K#'KkEvzpR28#q(y RO> u|c=9^v$IBrDT.9>!c~e@.}=}Y*")eEQqj0 $ C51GVUxן={:+1<^3͎DC(])3Raɦ"tfMK +RWn;0}]gΝzR#ד uI:Џa.< T >/<5W o?B"%-rZMXRYkh?Mom_}A;D҈XJfƜo'#sW $Tv F?OЫK8ͣ[F9~AdNG0J}$Du ᯩ+#RJD40.8NA>Zxrp 9TJu$iq, nBD3-рu]y׽'ࣿ;;t1V0ۊ8DHA*0! F!hl:\ aNKrlJL٩PrDO͎O (Df&3i+xLd<BHO \W?>fR!( ϕ^ \Օ\V+jZRYY*6r^S7<-Ȏ &a7`Dx([7k:p2n~$d_UӥGQي\/## 3A etPg#2;A%Z*l0z/nQמrJsiAbX(#|~e.Շgmv#%/#Vrx\Yy,s򬉱g%1zpTP}8O 4 |$ BB%dg^$!C>g&œMb 0yH?σHh/|cSoH2= 29|  <7ɀJ_+ň`lmyK';P(cX^}>/+T.KŢ}О+x޲rO;<|h5D#\VQQ"0 1N"g0}>#v:\5(m25څT@A}`D6ȝ m:3)&60>O1{fS{  "T(xoˢVUw @ddImdQdX#e1>V㓓srNOyI$D&$$ƑIK @`ٗ?w[=pɺ 0k/7W |ZSʐ aj6(&'ѻ?G/-tH FK-Q.ޝʿG:N#WS9+bGL %<)DtcN D@@ !Am@(#KQn X(BJ$r$6;BRDj,H!I%L+Xg62sCk_83FM6?[ZF !R0tמ[??㇯(lM3h4j'zLfD2>#Eeq ֌ t(Zl:)0ψQ~Vk*Y:pqD/RJ/\`+3JB @P(xv\Ml?{GTxȫT^w5ol6-?9ّm $R3#U#@=A{"B r '(Xsb,cFLfD0M!f @}^$N0))P $Hv2122R$&|'95.S9[҉{4L2J@ "ňFFZx(hD82T`$XJ} ĉDD'n ^=-ezI֘߷m螯|gnt6]H6Љ%ϯ&HM#ΤΤF- /Ȗm.(Ր)zl*}F쁑3|%W&dɸ8?ɑ'gM"B}J.[zƾ3f>z]? TǶ@"Z[v4=#^i7s1Tb^ݦaIkeÌ|BT-LŤ nJ0r2\]{]DC)Td.RbzџR:ٸn97zr dU+69`8/Cz76`}O43|m)Q`>@Dx#㰏A&p@LH.[B(ۗ$YY[[Kv-ݿ_O2]EiƘ[M(f^oDQ3;^̦mB3B1M1#{T\#rf;(O #V3]D^LEa@q ʆo7Νu]^Sn ΁AD-C]Ce Uf{4`nDU4b̖;-H<~\Cו I:N)5}9#JiBh ( @, `!cɥG R#'ƚÀ`Z !־ȅN+Bٛ` YI19D4#RCٿK=}Ebk͐r;E;l>#V 4ψF^p9ψ2.qUQ.e3bvYWrXE-'}YNN]2w { ΄K f76 &or%x-RW;<"s_ݷ,=^hPkJzR[  KEJQ&9%)óvdHes(޼G[s.fT*HoQX%JB< bX)H0 10hDi_>&zZoXZ[h0XP TSP `H%[H$7?f_SFㄷ u!¼ڕXZϐIl:6}FiF>#tݗ2sNR$)wK}F)} Z} ֘AyS~2$ anHs bf%E8X7϶Bm̻SGr;to{U`;%ͨ'{ ̨A_neWduO">H^$A# "P̸ZM5yvy$I;~=?hvb !HOwnh62#$9kw># yT^cf <\3"ψ銚#.z|k7礗kFyXƪ #~J?v"+p ͱ`WP@W) 5lk:O/ ~{o>'uRd7tF,q=Nc$!4[G=Aokv=`T3Ԁ F#Ϥ@`KUHώ=zFf ,ys"-̪0ጓðOZgf*DY?_uxP@`]Rt/{pQ$WĞFL}F\`FĜTzm 6 T-t&,$  v%V=LL &vMWcJ0b/#U@B\T ?cs^)+`DaF6>Ica#K"{peEЉ* c,bDݻtoJG L2Isΰ\N] kȦc]MG0*ϨMGFȴɦサ۝`CÌx`d_/"}R>%o㤙=(,A}u^ѷ򟎮נT~ "=e;ÌrPb"[rα~K6&'oꡔq3>Us*3>7^+-+3F21Wt~` @A'Ȱ#Hʰ%}?[COMKX! b[$r_TZ"I`:2\3RQ?f䏐Rm9fd׺F$3蹄^7r=Ȗ !,n:Ì|2M&]g;D~̺yN%D$(R l8ROnq]&n~[м/?q TR6M,(P YS+~@Re;>{.#+s1%E.\BU0 ?3 OS3 S/@\R'c"[4(.0⁚U93*?l zȘeM&|1"@rʃ_uEѠ6E{5QA7J*ǘ d@a|64~vE!]i#;R$ia-M:<a5#gF@I3µhF̊)1Ø|v5N5͍|l"dӌܹV`Fע$lJ9!OrITQ} 0q7W|h_vJ5 ՀT F@V/Q[#M 0*ҔVLqYɥ:R59(Ќ32:d3A)4c+)ʓy;JkuĮislhu^  CY yDm@|3{w~v9CÅY dZ <,$q8MF,^Lw# IDAT0>[jzgDp=_3"?LA<:JXx{r;ٙK#Gs d fD%͈J`D`d FfajE?,ɥR9@ߧdgVQ?ZT3b-,QO934P^Yc Q! t]?TAdaS2MF ܛͰfO,d@5%0IaWyO&iy[I&;*';щJc@sf?E*ΝTl3zr9v;)X>2]pFL7&CTR+ǎ"vc3H1"-#x}F\g,JQ͈V&yth9L=x΅Oͽ][qҩ磊% ߻5TdqEM-hF\dbf$Z <՚:Ps$;̺3lcd R?;'jˊfG5 \⃊$t 24tP {:g тXۑ^ 6uj>|\?7du%]`䅛 *8Ҫ0+g\%͐qB)$B*15,EeL t [z_j:]/Π5hX(TjA[y+^s͈KeB3*gQI3>͈yth9l?mW#knﯬʘ^:^cWW[5Tney6t'>2ό8@Q”(g^YoEC˘| Ұ 5t3R ܃  [ F7wN(UҳPVW;e/"73 0~˵iRUH3F(voa`JX]Ѓ~ŭAI2QK-jX2l1΍ޠψ,%bo?06SZ3%,<:-Sϭ;ktV"3+YJ/t6À'sCL)eLg5#Ќ}f74#4灑yn Ǟgly17cX&#LO`xBG.B90Gj@P;*`Q#Ug~c.fW@ʥ-S!WDZ PE!ߡJƆ! oxl Tuk+,(e!34F$̞#@c V2c/Տ~m?;2Sdovr0g*2\a43 4#}Ff>AA3',޽xᕵ tTNb@ H5n'0&͏",q (6O&ozfWrRÊ}S DaӔ~z"]|ٓσFʩ^T Fտh2'ʉ՛;*8Uv|#N3ȳy}\ 7aoD+1=MDW!ȧ+z!%\鿿<*j߾3[ HViF0><׹ψzD'?:9ѽ u w^Wqc{= \,")'E3!a3f<7]Y3zSRtSȲŬF5S׆4 .;clxQya,x|J'6pѦs+*UHKW&6TUʷoGH0@d\K[ 2]ﯽ_v`f6MD<#qEQf>#^8ܞ8~qDǐl_3&<^˧;Ƈ'4NK`D}4J05#ʙ9D^{}0bFOv飜=x9j㐔cT H%x]\(zv F0|.*6vS1QnZ8$QrZzs FdFkfDHDTw= 7xejp=.># q@Tr_Kь2Hę&8>5ڢD|ˀd7d@M/38uMMݮyFTʙBP5#k`5#ܛl&U<Yψ9fXŋ9V u=0JfH H2Du FJ}U9X97$lB3F;r ;@$8)Ș}fn;zm|8mhɦC)*7b֐#U͚A"`8ya{ǧ>kFqI;ّ=RAMҫ `?}x7%jFT3#]/ _KTbF|荒urͨRm?})^8x9VjĎ\W%^ ʃU)޾j0z `4y^kP Fc$ADiX?5zzm9%@Ey|ӌ\uWSc ͈IfĥyFĢ>#y&<:F<&=|j,u*"i>2{9u//eWϿt`"9|I"DDJaUʔ9,ON~s?8AaxᴱuƻRQEUQ%$B`lxyl?oh3`[*R6Os ">+8'UQޫdm.Jn:20TdӁ&K"g5zހd@"wgݔ|5`T&J|&Փ;n=y%E͈P004#2e>`<j0:d ,/yZ 0R(USn6+>8 T[\W^ty`͈ؖ(CS̨֌_(dv!@ӘO,`ie"bHl^vOi&秏~ 9L,+L]DoPngĥ>#*3*g2(aLrǧ柽Nz@KG8cqn "Ȅ} eRWdU J}>X&@h/Kr6oٟko;|p>&\=za=;˟IFS2anOA3#^<9sB3VP)sC{3#;ctP~X!hFfTPŔl =* 7,+JҸ0d3,{6>/oB3716ÄY U1ԑJKw`6C$c|nwPи2O$NBSu*Mx }d^5t8_&!n^gFL,՚Qnd@Ke3b挙L1+Ix MUW>½r&Tq%_b)=c l>3Y,QT>̕>cX Z@A LA UJI)ٹ2!ZSZ>qWd?D;q L"2:3_Ɖ O/H5d8{h48צ,"]iO ^Z^/A3P)M~w#Ϩne Ș)M?N'H҃ONךQ޺mI|o4Aj5(Ɠ-{-lRoDI3QV8'A  `)4x(>pЅRO_ P?g)}" @ Aa]ZQn@B,@k@AI@竿>פ+aBZ>¼ aه@wCsxۅl`bE;(!"H3U~3Yb ü, /z#  nr 4 H|[J)@102 4s⎔4b0% ̀:%)edRt"ˠjjÈ-pO9?") ~4c%Ki^HđfRcHI7VlHV ^ 9c9y(;3nw)INedjMx#- y{J^:ٽӗW~b6ڍH ޿є@:+{O2n19u&Շ;9}րQZV^ nRXR@!d-?Xow:-gN0bi{M9LeܰT m}sdr bfn+nP}gwCχ^ T#M{vO<jWVVfWWW׻n]+W0Ȁ9i?"Ɔ$@JF:I ؔw9VH}WC*->WcbF ~S@ ʮ5-q<44 ggg_}3 ؠ߭!mZ֫^7>C*fRj{b f~+UJse:!GQ`xxx}lllzvvd9zR-*+\VCFzkצ<Ql6ihh(]8wj}UzdbRj v[__* ؈c@nY,_ti>WP@(B)H}>YKQjz_kaU9B> A(h}tttW^IC_zM$R1T;몒 O RӀ aFVY/EU ðetFW؀&~k9VuĎeFQ:22zv6WuCR ]sPT{@>x62+(U0 hl&###믾j DWi-KFIENDB`desmume-0.9.9/src/cocoa/images/Icon_Speaker_420x420.png0000644000175000017500000025766112140261562023135 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FTIDATxgyX'"gA$ "e%ؔVǞ;g}㱭h9ɱe٦$f AdU:U}D: ~w%4hРA?n4hРA4hРA4hРACH 4hРACH 4hР! 4hР! 4hR 4hR 4hA 4hA 4ԠA 4ԠA BjРA BjРA !5hРA !5hРA4hРA4hРACH 4hРACH 4hР! 4hР! 4hR 4hR 4hA 4hA 4ԠA 4ԠA BjРA BjРA !5hРA !5hРA !5hРA4hРA4hРACH 4hРACH 4hР! 4hР! 4hR 4hR 4hA 4hA 4ԠA 4ԠA BjРA BjРA !5hРA !5hРA4hРA4hРACH 4hРACH 4hР! 4hР! 4hR 4hR 4hA 4hA 4ԠA 4ԠA BjРA BjРA !5hРA !5hРA!o70ik00ۃ7A;鼑U&BjРH1! !5hАjB2iACH yg(hk2bjR?DݯCNM3k3xSCJ Bz+}B B/~q+2 mv$3R>אR4xǛ!Ar~WG"H_bCJ Bj=BDdϑ1mFՌSqfDt-RjР! ޝdV=B* s#s"#1̈́1hJJy,Ke6(ACH h+"A@}ߧQq!BsB)R RZ RȒ$,def(Zj Bj=BDh3"8}{ !|ιc>B!B(Z=@ʔRݢ(:Dk !Lej!6Ԡ!'/4W o 6%B1}_m! = 8IhP:yk{6nH !hEj8(0 =ϛBBa'{O>xd4F5!zB4%(@4(``z&! 'Xkr2t;av'WKT I 3.|76FDhQ8qV+pr?}䡟٣=JR" 8A܎uX1@ .4xvc ӸMf!A TVnԐ4xV^sDTA}v[qv3yw`ϑw}3U BRO :ol0TpBF(%VP/:fU}4CTkMiGSlu߶ciCMENmjMAKR 2!*BVZ-nZ֤;=y̎ؾەiJ3B2k#\rq('6o0J!87AH[ɾQB|ImFP?yD`Ɉ qɆ4xWZ-EhۡvB[}Ⓩ>z[*"" * O>%`j׈178m䥍5$ C%%2DHRw K[EP%ynbp3 !g6Ԡ;6[\Jѱ(xEDtEs<]{ZT{|BÀ2gtQ[6C POQ%;>6EJ@bR1D)eH)!4UU6KnE<Ϗ1INf谍{N7Ԡ;1*v圳V%&&&U.`<;rO<|. DbT +MGf :7u@ )I]9.Z0$j#xX 3 CjQy1©'ZkchQURJ-UU)ReqmѨ8r9g4DF)M Awb[@ q{ QQ<9y'~7? " $,Nyn my zrcіZKcZs)RJIUUUJ)U *qcF|Mpsc6nQqu}xZð}PCH d4^!EyoZDj(A9z ;2/e W3 (-+^P ژ~00&r@e Z*~mz뺨an~ Xv3BYB$!nmQǧr_WtTj T.RRRRc(*s]*B %'lAf~zSme ^BjGF LA0voq՚ p|?v?G")K׶gP@icQ,C`PJÀ@)eJ3QP'c% G 1FaBݟ˯sv/]UU^$k*MJdtEֺ4ƔƘSh ua׹:3J\)U(r)e!,˲,(ʲ4UV4jSrzWrc+1:]#nEFjFzQbjj*l8g0a!ء~|ߪ8-auRZi5PEȀr_/F#t_zk uJNEQeiU,b9 Y 눉 ^R 4/xQ]/ yG&w3`ɫ#.mfn!%i( P^ޓ̷ ggsl(J{WH{ylN d6;/)!176.w`!  O B'xv- 0!CAL֖kʵ++Nv?<cJ1J])eJiYYQyQE$e*Mjii9xw60GMԠ;0!APKÉV3[<;z{_{'ѭ4r5ceEFZ\PhBh?diYdz_S\|.\#Oxbr(JTNPf  O)%8!$R NzH J4|F@@(pBrv(]q|tw:5]twkW=E]Z)ִTG)&LMLLygYy$I*N"&CI@h3Aw: xv<111'^8~?߼$J*(;HսAvnNq>sՔ LwpմWy?_eTBTTզmi}pи C\ϑ tJ42Ȁq 88%0 JH* )(PZn_t=~څpҏ9ZZ*1q-˲[eP$IR Ԝ6"qQԻ25y !5xϑdn82[?KGin `ȸHj +\l$T TK?^9:jzݥ((>QΗN*)6<ݨh7|@DI m Je`](4FCkb0%RJQA`Md ŽDSƛo$w*hr{_9ujTUEQ,^QYeyey$,K$&y&7)_P/!5h! DZjFV5^'~7>uO2iUrNj5F2GFb{Zp_*skYgYjY܋Xz6PjSͺS!ЕxNZZkT P ZTX5*hJ70rA(ڥrTQ 8zïQ=`S'>qdOmKg^{{|k/*J VZsSeY$Iz#&;'Z2Q41p+sd$&&&Vj۳q}H}>뾇wt +vuIZҶ'hQY#в?BtS?Zo!M4MYRJay^*A!΀fUZ6Z`o9uFk]c,WzH R9"& #BF@mFk'..` ! @`UR jm_/,_~ZŚaqɲ,iZY+,<& 4F6J ޱdԶx_G[SSw}bȭkr PIM4 mPu2 S}Sb 5|?}׾_CT4z9vi$Z4M,+s΍1&XQAnΥ (.ySHG*ru7UȴL@pf9iˋjeR6b4dʼnVS["lbPiIW;9Q k\-4чv}Gwk _z맞KWiR+QFQK4OӴA#&H GI?4^=Dklx˘ˮA7с4hDnǦwsǦ/R\T$Alcj$!vN!PJ`Bz5|K/1;ê/t:$I$$Iy^e)RF!0(Kl҄}p=*:U;DܘNiDBUURJVUڹoBu |eZSSQ=Bh{<O\(S Rmsܸx5`kSR" ȥcȣ?ԽrS_;y=9yނuԍ(&1m~li<5va0_!5h"\E|?>gGع38ۓ(Q4fKB"}:W~ qn"`? !!#>cc=KGT&W( DD iޱbǑcرcAwfL)@ 1(Hc KM?n=/> 'OE~s~Ub &=t_jljSȘd/RCH ~lܴȨn'&&fk2ڱÿ#̬[YQvڎz(;B&]dD^z)|Vn1tg4zjYes\!EHSovɬ#Gho EQ$I$4TU%9=<4Ob։8R*(~Df̧TD!yh;rҎg^q{&h1f]C (FB {AܫVqF0f7e"Q1;']z^?]E!!| AFQ}?zEe229@0<H.[%6ԠnFڽ853{=GfvwKX6ȕFqExC@6 loҎgҤw!I+nwՋ(ʪh8!De&BkF FnoF@Jic,䌅41-K}5?fd'쁣d1&dB;uB@C:V`QT2P"s}>ʏsճ˜u%^rDQvDFKo9)~ޓRu%8D->6{#UegiPi˴F"md]MMQFewP|%$Iuݥ^ɲ(˲Rg)BL万Qj#FǝSb$.C7fv( RYR%(11)!|pJ)r9gq'8R*819րs1"!D16V'NC'cw=9 0JS\JFkȵ.ӫw~=ҳߺ|+דe_B\}0 {n7QҨ~ےSY i2"؞C_>w#Z3Q䎹~ٹnR2(iSvˉ5rggG'H%_^w-zneSp8Kٙ+*(_P6HUMF6ᄍ%m q:U1#~'2(csfmęsιssqcS6el¬^ZroOhP0HM669+2І@z|w<ܷOw99c}_}u WeY6&۔#7W !5hfh3b\6dMNs~|bnwpґrRY Li$NMWKq (ʵEƗpdig%w:$Ij1Fo 0 jmu5 dj7z86o`=3x~+ɳ8hAZk Pu!PGLL!<By/G(9mgxwiZ._y+^{nzgp4}V:x~6XA:+&` @rqBo/VνzD n}OMkB*TڒKUJ4H*>ˌ:2cCg?/6~+Is^b۽v4Mʲ,RJk'`OlhBq; Z+IM6㛛$#!AR˜xu!:sQJ))"T<.<>8/W/vsӇf䑝W%-Q u:J@ 1Jjy|]3޿o+_fcS !n[i!%JՎSmo$Z2nqiJ9v !5xSu[цyDj '+{xdnPT:QWMz-  c髻[$9.u:^o-MӤ(J)Ua4l4>0dDYx9`P@K 4v-:IKnw27,Ͳ/f;*2l72wnnR{Z)EʲTy4aAޅ>gA D:E^L?mK0ܜ'' |_ݭwutڔҘ1vY9_sUC`mMդE X4)2ڌnh|{vnyǎ=<JJ]c:J;`d %nfW._j2r5N:$]dTf:l. }2RZHeG;lȐ~ClMNoʌIntYv3DTn,REQ, 20 AaAY\6_?wʾva#kUKPkrKN O%@];W{_>4bBeL[?Rl- )R"tݤ467 %FE]8n{q՚hG~CwOaI0i3@Fڒ`JFy$?3z´Ǿ$əNs-t:,˲, u GG[ hBHFSgs'y3يݸEzTdʲRJUEeY~aZEEQ,U՛?t~w;r'ip0;OPBa3$ o|JiL) "!ث0%!%k6+FРM{9yjV5nOuG|TmHȠW N7pkz3i| v^0-w4=v/v'`Ȫ*h0B2CQFۆa(:j݂fLzBJ*jm0dq9}_0Ƙ1BQJI1FJ )PJ:E*o$999VJ骪*GNYeY(ʲ\rϳyoWO5sxnQP{~Su$JBW0NÇ&}n+]!I⌱UU #v)R2FeަnvBj`T82JQ8waxK~Ĵz+N2eHCk3e?7~`zـ5kkknw-˲a2#HiTلjR? Imk=uL (_cn~2&q(D"$xRn1RJSRJUUq_GʑփʍGl"ZI^yEQ70 WZ{+V޿{n{{g*w])J y^W~jgi:6(RF)M$);f5U1o )cMk!5hB1 bkNQwG= 4ν[:yw QS/F//>'$ə^wNm QFpªOP7pffpH6MB[eF1q+ ù=`t-W"1GmƘ#1ֺpֺPJՏRRRʢRnvKl &)*˲,"+2)˲媟sGʛ4Rk'rNA-QVw½,ny??wc8F)%ƘdF[9R26B;:lA荈wZLE|?rgȚSu5EieJPL kD(E2Wϼ791d4'$}`TYWFFG@)6ZΫׇսÐa?{hRdk+ MMgR,vW/_YxzDkc uO)k3TʤYUUYUUyYyQyQUUQ9 5㈩,K2.WEQDQeىH%:;.m*Lkb$T0bJ#4*>rTV~ vfaITMR}=\U7SuD @v;lZQ<]GPrWi;h905;Y (` (zk/oiyOM{nA1Qߨ9#v.BΙ amddޮf#ndDRㅥ4a!)i  -S^ Q{'C eV|ֹvӝ|."_ZwR]TOJ٫WUUZUUREya۾ yTf rj(=ݰD҄(:ZJ(a ԩͻw>vPat6}JNRP;? Bsu.e{ RD(yQCH ޶ŘFAVq<E Fm~cpjS6!v7,,|myOiz;5]zd4,^DF9?!e*G6PBl?=7DaGQRJ'L%=*5vE0uN+ 0 8o:Żw;$[>\-]I:tϝRjEJ*TUթ[E/,(mZ,Sz!$&GjxyUUR* ԕ_tczE ٱJJmDž NY)䙁}NoF<{>Iuv )9suw!{sH_CH ('>)EQ$\tԊx6 }}aonOz @)*ɵA27UBmoT=Wÿ.Yz*I nw鬌H15Ss74B2Fi(3s44fƪ씆^0j/M1 !%yƞgRihELAܦ#(,w#avgCGvS_ꭞ}eꏾ{zJV0\j(^YIeU#&l5#&:+˲*oZiu_V_x9L7mi?Fm$5# p>%IV(ufIiJ +D31Am֍91Zg0yޑ;>{; rEeҐݴ׾٨l͈@C3DȞyz$:n쀊TuQ 1|Fz8W&FMdCe6 ac PPOa0JQ;&CKXKD9E/SH(B}"Solm>]}|leᲔr!V8^y/M)djt #ڍR[K֥^Qe>swm>o߬o|Ҡڀj 2Ys}I 󖐒=Ҭ#ˮACF7U7DZ711o~C옱ř̿h@^@Uz^oQ2&$2F-,7>i 5`-nC3\t#i}=n3Te@n1gf[vmӖɪ9px@J R Mhωr<t_Eҽ&\ `,(ֲ,yҹ6J獬) ȲRj)RJ4T* r.b,su7 J $*I@VT=~_9w}V˽QRZǏz #5NmZ7h2&&oᳳ%c$-ʠɸS( +gs\VljYIW mѠ;DH_oV -t?pn#63p3׫&%-rMڀO iRD``I3Lma mhm@A!ޭ N{&}n.|^~0 (Z$,˪D0O5Ĥ!KT*ճk>VxOqsSA5CWkx_  ť  -`埼LvCm46h P7r []kk%vRkȥ2.2pFn8YtO_+-A~˲^J[vdT:7JFaPA@uw=^bM͉̘*QJ5ZhT%SSPXS (q SALVCtm/Ӝөgsp 6;ĝs]k{_:S/!=(V4$Iii'&lD;D)ֺvRJJYh`\n7(1,+J`6ip><ߗymo@޿3V_րimФ6#cȝ!x&rO}C;{dD"V^NQ'S6PN ^Ͻ3OzA2EK)hH 5͢QQ6 );7E(0)TN DA[~R&L)z _^ D09 $x.=&@նH[dD+ڇ;߹Z7#3EJ-)"Sߣ4q0) DaǓa}㳿|[j/F $J?k(,q_Eoc4M&Ir-1r:Jh3!۩  eR3nLzSnEeͯ<?LYo917^C`SE0=M55*ˆ<*p2\!I+ieQ[SK;&cԑΏz~_s~󼫾AAYy1ah1h7ZKu U($8R>PY3ek֥DK.h\W#&R<1Bi]Ih3~AB ʺ0 EAjq~}AOumvJRMMQJt_yg mUNR[vud$X3R8sA|$e/jGQhEN̝ͱڼ}&Zki9ysl6"LBbB v;KW= I014`$ A(C@p좠^BV ǫ+gS{1 F0\I% ̶}s_>?{s~Yq՚V$zt(Y_ X>GGH~H>DF̟@T`JhIk̡g~'"]J9C(&dD8o'u !5x+Ru7DIujEq[_p|Z8qKi_z'#(ο?G<$I.z75-mFDhf4n9W?l_nR97֭@8KgRY*˲RjRea"4aq!SL#XTtʳ;;P2'`&on[PU#)5 kCHR(J+ k%f&=c}=]9bӢk$)4n) Pח1v:gԉ w6kIwT)*?:+?qyu^WJ)1tO?HַLCH To(lZTݞ?spAjtJhMI\NWFQ-^óƞ{'^]Hz[MF߬a+2׿i0%vuh33=l?BJ K)M$UUe,%16HFRʜu=zz10Ƃф[BޖdevرZ 9<vi֙칐^FlmMVnuT S3;uKO2zVqk/yI$sc!&%:“R,jC-L:;d>*t;@(w?+קڀX/@mN <~_gƘ%]Ha%q׮C!R2UGP!D=(>[lg;."PQf U/1K'Wf^/uݾn6Ki7ڪ ,uSM/]Wm#pfp}&$ARZ,ˊs!Dp'ƤRp1A)sRq}ι 9!c,5ct®'хW2 ľ,+$Y1v@^TWPm?W2Hyd;yⷞOT޼y+By,ՈSx9]lG gAsQ+2 f4<7"@Ef/} ðpu:}g\15Q.6]!m;Un0 }y-g3skvwс6P'⏾#=OgIr!I^o)MS(Uf-N;nfF$ufwjwWYU5YWp&5g0!28眹G9qƘy9"ǜx33k/e1w{v0( 3XteL RS*RKxN]{oʓzKb19/)~]* 7B&h :ʠ3@J+FQƠeG.ʵ.}7wTZ)#QJ B>w7mF!h[:((&0y=Ǟu(D6TՍM)+l (/?D~T٩4M/%I$I)61la6ImGpD]#t(bBUUxdh@&.)_?*A#MHԩ;ph8ĭa9Y=Gʑ(lv=/!Rj"&2ntI{88(y޾>_[frw1I?ǩ&l͈0\gGدzg9K4$ɂs4L-V$m-R"oSR}x؍\-H`cA}T]oGʲ GPL=E~y^~[19ygC>W/t֥Y~B*T h 0FFi\zygn=wl}RbE11\4ʹ<\WJ)YB8gl<.Rvl8jJTצ?.{z1(w *=PO#IMʮOBSuf}id D;'i+ "1d/1Z痦}l]LZ]EHd4XB|Z,EQ1 2{av0\ p%߯!rٳ,N!vIh|ZR*YZEA5_Oӭ(;xJrhfb1.]LͲKI,zZ1-F7a7\2]IpmJ J!3/c/b|Gԍ1鸭dN o+NMv6eP'֙M! y ˉGEVכ&9؍WRJZ<0ZkӁ\f3X <M8 (%ǒ @zp$9X wplFJ`uc5 {K_~8: EEЖv; |vH(mi'Kel _wQxy6 PqSiA)1E0sK[8saV;'ZipuⶏscG䕻 ðWe^EUUv;:|0Z[`Ģ1.JP;r}GQ3 ~oUkmViBrfb=j| IiΧiɲ,ۢn{^#v+8!A27ԸHm"HYEF㢥'3@LZ)˲EQ®ilj7=G^X|/AP/QZiKn)Ā X.%LԱ_o֋w(! H_[sSi3:9oхpצq%mFKANw^We^e5%*׭#l#280 '|ߟKZǩ#7{7FI !5,:IF(8[az=]?41ڪ i*'r)0Ī^?β{yeW$YJRu۫sn%7]fn7Y-ւ$ V0 8mJiDEڍL&TJJJYRYU/'˙7CT=H+ldM: {Ij@AL`#)h% t8O%K]y7n1/<uE(HEq<`fgǵqBwP& n4H{9<.|˾/GQ+"Jg' QRCH EtRʂ (jA0#سحr3s Y)RYHzW=b/Yr1˲Ii+˲r.zfmɨ7hh@s׷8_ۛfu&A8Va8+9I&DbU=SjsuΕRR*s YYEY"ΙA S?m7ĵRʸ Ti{K>ЕZ{#@vc,l%BmeYL09=?}Ϊ(7rdֺ,rSBr$,+9]!Ē1ߞY~ṙo.ApGR0P\b9{fQ}hJ\ `%^EQsGD%5DG[Վ6A[Vy;=_o4! 4OM8  (e׿'ؙ^TɲkI,'IRmg4~<"Q.6ըن ?js R@7*@<)vaGsJ)ae,\I@dz'Yẑ:ZƘR*Z2*)2)"<ϲ\mzܐSJI3SRJZ2Һ0Plz`Z]W{?{ϡJk-̢zy50ȌUi !V>/=lԾ}gwM-@6Q0!`P %V3'.)A7>QҨwSO&_鸯), ö3B=?gi_LPi@Zt* tWr;)WEqG1a˒JeI9U]9`7!""-Xӟ3CmipN>0cZG1奴5OvS C& "Dkg&o5  FQ]OlK'_нvzUkZRve<)"M4ϲʲrB02ƹAEKu}INUgUBUh?@|bSe}&PJ#%ړ=sZn+1td&MJx=A+PER!Ċy5sKSpCCLB (Ԁ6(jDpyAEZΊ.J2c˷lLJCHo_jwv&50 &=y{>'rnRzR#uٺBM.8٪(.dYv=M,QۛяfX{ @8Ҟ ]@fy 踔MS7!$6JqcPjBAwk`~>s>Ho;sw|WO,=Rj ʲ\h-˲Nyy׫ c"qn〛j='O"p7vzHkj )!3;GnG]7Hz2s5bWԝL4О] ܷ?}wW=ϻy  XIARG\ qC?7KH{s >vd' H SRa yNS)e6119i4 TJ, !D޵ӓ[W]NQr,/A{nK<[p$K(RF5uQ6'M##7Š  &;c\EޫTz\mQv$^zV)B˯fYZKܬsF?~2ZOWIF4^'(2 AJj`#o=Uԇ[Zj"J[:0&(PHch)a Y]V)^ȰwO[=}s_yu?B\B\4`v^Pc(TP6%M.FI!qSBӻO<}]?yW}_`cPYgSsN# !xUM&h0T/No.$B!?~ѻ/,JYY^eY=8:BAz7/3Q * BE[K 9NdzoޕQv#6W:aa[1's?s+ V2Ye*ZK[k_LzeKYu,**nR7† ~/[! Va唇FPH7!"%7=@Jk;.;!!R!Fm[)hMA )*σ) 0!p[Bܨvm'i!q6pu%ǮO'矺u?y%5!"|-IUQzؠd51QJx{1>2?&|cVo`* jk_(~0 {rvJEIu4M{A,ywsݛ+AqPLn% P,{'f~j QqEQ X r%h1N$fBf+"칆w~Gs3W;Ey޴bc۟ ^V(+HxokYR7)|mJ<_Ȳl  jVwXh㙗Jש%513HKk-DMGH,ˢ^UU_|OGSFV mMM6$ `ΤIrh2ҹ$SJ +k%7[~޹k}s>99y^-KMt&%SGJU7%dOF? >Y2nj8HK Kч!#3cue!!%ONw_ybT'vގꮞ2˾_o-?Rk4oz ZQ1DJxae~x:7r^]}> 5Ӣ(@_(UyHBz#dD 0 1]O_1\5z*'Fv5PBoZ fs;o9zdtW( 2-!)c/ ` U~ {Hu*+EQ,fYV̘I @;TkPb!6E ZS7p Sβ'Z%)<F)) &orX]}ngvt1wCE?4LAK B(LJ=3PEkZ*k=>?/GjQJCƘ[QJ4MeQjUJ$I8c̏ȩw>)IWh/5J@T0#.aVe(,˺j dEe0 <ϻ63H #r{Y.A}b]kB/;K!pT ~ܤw,1SUv7Qj(x"s !1upEH?D4?t֚i"h& }S?w{A$R#$\}$7bݽ`K/W3D|e+YԣRX+ݐzc,طٹZlIT:!e^!j3\ ޷:w./GQ)2RHIkEJ?y n20`X1yw?8s%SȕA5Vi*YXE'PwTZE-dȤ@fh;8aj%VH nSx@( 5mȝRgYUF!cB{1.R KX9o !1N]+?vmm->>NJ1_”<;|֙#Ϝ'pJ24B0R$˲1 Wy+pr'H  f A"'W̟}% ^unKa0aOw?wRP@ĚR{n20Ћ)t+祔 %SΈHBڪ/b q, ha899%LBB\|h9APGܥLfcg&B!vG;) /QBev4];MS#c,Xh+n`֑OjB֒7g7Y RʺN}-@RJ8Rʄ1ƅ}?BDB !Y;+Vsc_|h}dBt (0Yiָa:@(J,Лqb1a *KHھW=obB2Q_{i[I@%lvvI@@j;GO/gX5ֵpjؙP B|/iXjܼw4jyG6.ݰ!ՑlOPHo7ŀ,RڬbE֨7eYJ7s3k' -ЂWokyz1nc@#@+ (l޿щ+6Č⿉ Ss#"V8}kznq˪`!?CP%twQ>ka.yލ"JK*70|-hJ.}(!VbdAB ]wsB  :BҰ,~[3BOB#cSJ۔JFJ '?SPFi+ܲuSx] ~-du @̆n5%ZKouoP~Mm{6.;gN;8#@;U4TBiB#v4ھ/o>ڴL]^)r9NYYõ/l}gGGQf}zk;w,1"o"c=h`-< H0\ p)^~կ?x%8캋R DpY֖JnB9EUXf: ;;_=/y=v"ZM$I*˲\<[B\O}k0$H*%8eq=O0 WAzDI-R{ݲ,WoTcQG?̈PRʸUen<ϓVՋ(v_̟[Hwvc$2(m&bcr"Ǐi1ʍHfΌHSbPPe$IY !nY }Ȝ`4Bc޻cA}U0\iU":F0\ Aieg |v9 Vbf?7ʆ[4`<դSϤqjNk;pԥAeJ WƑ$Ç7Z׼ʅː.)]Jb,ˎ{ծ FGI Y&EHڴA (|1 9[fm&lim3hoJL.FoReYVeYJ<^Kk䡲%}(倖v7%ehOj>yƘ\)UJ)eUUMyU`k[Y$=ϻw[?Xule>.h!sWW|_%(ʲ,+˲[rk];P}?Q@`$G,|<+R& 兀Ïi+ .ԃdd7#H-MmfdA_fqe3 oxNZqjbװdj22(A@A`I3JA1S['X|ELd( \)WE1mY;KBhT$+32X  7k,j"[IGƑ)R+}G*BS=$cgvE,""H8 N_G-}3 0RHmԓ Toi]ҡًAU0؜hBwA\`% ô( 94hK*y^'`G67#wZD tƝ=[3Mk_6 8^qDfPmֵ %dc~TrQ dxw$Uh$jcdDFflH *+3$arQR!x RUJUU,(6sޮμRu4`GYU=?v'!(g2ؼ٦n(2v&cb2pFyk,e!R26C?WjcJNx7`ET;0KJ>N?~h`O&ZTJYTUU)mԓ[Ū3ay޵_NO0F"A݇BW0\ y^9d't}SyVUխj_z̑B*eI@K;3s$fNz-ؐnMnx[ I)Ӳ,]N y-}팮 c^v.93H.+UU-t]]ʙ=sh -(j YT pBQRf ϸ]Ǹ~3hMJu}pAArRC ~(d)!)wN_KN?S?"qFvIڥrgqyW@”qNxd#OŕMa*ȜA7j%b"\ }Ct%aBʵ@J{ Z##axcIy9geYMfҶCC@`cA5hFCMiCEATLV>6Y׾n.)(q@Dê$ 6 (#ІZd}{lsdN v!7VjdlWk+1MSۡbW.A._mURUU]޽+.\+(73q SFk=0\6;;Ĵ{59 vzar l a-B; xҾu6MqxJ|бRRNQh|0bӗIJeI zqJ-MDoJ^\Y;r+TfKn2*MEeC3\ԵFqB" ^j(׈k`{)J';4&B`텧-.i]^,r(nYjc?{$ٕgbno%=@(Uڻ֮&14c䌤HL6fU_4&'L6nv UBPؑ@"ޟ>_x*3psw~Fj0 K2+RJaV+& XR<%64S]m^ ^\5IΥ3ño']̲{B^>ǫvyEQhkm5% Z4Mv_VPfNj6p񤯿;3XR W NBsLbɛJ)֚M),*2Zqzigq [ $`ˆ$וXt [Iwt,|HEQ]SvG*)i!H`;Aq3rKޟ-o?Ɣ@dgӧٛv ";;D0p^ȩGn_E?~,z=La43Hs^m؁K@|D5:\<.")"ә>>_BPuewm!pY8!ĢRj%2"ΫʵE^UGhp8T›Ɯ@z !\ѹ+S'!K#ʛd ,Pv GO{Q4M^RX\ɛ g?{bocי@2 oԠ8]=*Kg..MdI^Ta|5j?}ҹa6'cO/-W+BR*`3ƄqhJ`cnk T>}}o-X;\kkI1T07k4y;OAߔ{ٷv㰓UaV#  !(O iNYUՎ6%F}Rp& ,5O]k24C K@zg}/˲keYne'";PY|Ox~ (8'`XM{Yi˲,һqe8hvTt e( ;K!&8l!%^]a"RJXk1Ƙ=c̞zݢ(zy,˒$),+,l{ȅ&%ӘA&`J:յsq/wVUoI[U~+iu)\vq͛QmZ$I<8ưjZz\Jwӑ×д %+cJg.R>f|bCEQUUeƘ̑`t5?1$Kw-TPbb2 iZ((ݰ#yǞk(j*b3˲~v{?f)ϽV>.@0jZKDDJ%vV1 &wç {,eَ1> @Aw?d13 Y[2{4ICuxa,Z1/*8rTx?<vI'7n\ںݹ5vSkYUvY[yqieeQ*;&c:H͚{c,˲B)SJm*Z=w/>ȸmgʢBupMpL^:zv;YLqXʲUU~{*۷{Cd%kUiA|X}|UPJ}n繞r.kr[eN1#WYcSjr2h+RQG?*;6\䃒D֩܀WZy7UcFY(""+lqܯ *dS!u($I˲,~8k2Z>Sgw.佭k/m\o_6Z vE[qz~$yeUec-bR5?n[k$S]7Ww~ӟ>WQdوy0Day~Ys# :"Y,pK%DkkuX]޹.UpZQ<>5Aa($&50Iބ8Zo,gX)|=Bϴی!D[J)|t ύV9A@J:ƯX0K̀Z(,I9Lykeɭ%猜zK} ג7C@KDTjˢ(4MApXg:'crbYt0au*끫Fy#=ckzsgc1F́/::M F gyf9lbOS^:bJa?T{gU ZTCK ]v87zn(sn?~k>?ؾ+~'"KxY yXFzU{nHPJ%anaxK7ݨNsF6$0 oqq`IlQyUU[;e$lUx@2ߣsja(xYӬAP]jF?ce8?k|n-co]HӔ=H}$ڬKtd5f-FƢo ƃmWős }=iu+1 cLx~z|Tȿ}}>Әx͎u'}<{Rc^ʸjp4A5J_U?AoAv}]YYYX^^RJ ܙ96iH}^==Ob6-ty~UUq}xZۓ鵝sH\@R"R*XG%2fz)cl473D4> phIq0j};eY : 4E͎ˈ/U5(5Ce\ŽW g<7󁓢4 (cۅŻI)N\Vמ:y?dvh_k]rLSՍN]aҢ賊,4Mw0-s/O0)BcКm_d笔 ֣( (0czGw\ [1f?s{mGo]wnUhTs'\ wE$$9gNTUecynI޻EwX7E$:9-yAIO̠SF;i醟c͔Vjѝٸ;M5gMD``Յ7+e pKOFhZ lV^Ҵ\q ?!w8dUѡƺPza6ֻ38[;jЃ#kh,-`#s1ܹ0xw(8PbwQU{*iE vg;=NLIeg dvמ>%_rqvnl8pA1f_u}?|r1lJ-^A |B$ŐCUUyQK:s!$`Hmb\9"BH9,t_3Cb3* >wD0 hm3 G HfLYGQS6\l_=2M}xFJveS4kr^PB>χ\W3Vz3$ -wh`bHG( SA1[$3()VK^`v=i43@MͲ`g;tWfnRu70߹zz{8y\bƺM6;˸vVwT)UK)KH^Om}({[v¤D v@Tr6ORP)!1>%7Ƥy3G d50<\sLW;ߍL#XTSWki5clROMHf\fZiL! QvnUwڀP# B Enb7Qߦ (NZnێH ǝy65z*փY%EQewۋ]8 ,ЀSѰFlB_. OaF.TU0ƤƘ^_{ 'S7ZŞi !Z~YJ)#icLU)/7:eW`D=] R>?i~-%;II† 5pbt@Q#V亶#k1?3uy%շuw$ֹ7Hk(/_㛂R0(*׋Ҁ UZa{;G;Ooa>NZ-?q bR $6= H֚,,˲(ڒ_>"wƽ^uB&1l bhAaj骪2km_X]Ke,XEτ]y[I)@\>RAD6zݎ@e3l, 2c,✇| <#@: }Vc4jq70MVi`3@̓F!cD$l<{7/fa$7C ֵ30J;lIDdUDNEfm.\$HnifRݓRGQtjt:8UErc wɎNUUѰgZu#lw!=VH5TZZb P !VcBD.>Z1UvdV"h1ڜ3K<[m,bݙZ@EIy/@q0 f#-Pctp{ j6s>X,0: ]9oH4D |f}Cɴ19@i xuĎsTǜp~`n𼫪Z! XVDypZ8籔RI)|_@Yk+kmγv;deA ~uVR <(xڕn٤sΎi&D3[StGtpX 2>6KsN ghWrGk =X3ic,I{2dQE^7Ptxz yRBʗ/'Rg(ZmZnaxXT?.Jg6eYɪ{ȶo-ͤ8'@cb(K ,b.w BSu#1$H[Eו8kNhtocBs(©1j.kmi= ؠ֯Z+x!/ [d 8==$7_J.Cv`=wQ)P p{@.ߎ]fSϒG JǤr `F,)֍R1e}}<*;_5%zeu-/#†iZ{@yz{ĘF*J mdZtcQiu0Eu&JVrq5U1X%ι+)%%Bٮ  }&=Fg+v`Z:?[\ˌ@hr;=JN)/ˀÄF泎PmRPm7 *kmID9Owۑpq'0Һ D  s3c%+V$=;$E![ȌXR!H|G[*"*EWFLJe1HCX<ՏUQ@815#PY2cL0ļ~'=%;N ܱ)g4n$7Ǥ:7FJv‹.PewI ,e9~G}쀨>vh47~jZ5t P3x@1t' ~.rq!Ģ\6b)ƕ9uvevECLr' |ab `1u}tf ܌ gy$ZBB v$XFN=hPz#1{ }xTZ~+ SjQvN|N @. 󘭎.Ic׵7~nJ?!tu@xܪey^`ޜV&"L#ayLF(hO3!"X *c˹LwYxF6Ѹ~(=`:@ӫaθT0niLN9R&|"eq8üb(7y6 ƂV9`ڃݛ+Ojҳ`#ub-GGk4]yJ-g,\c֜[znlQILКʥz.7Hy‚嬹%"bUU @hS8bfT6 :˥ 3FZ@8!W`]xzHgƁj7mb*& 0i >DD`F~\ppƚG0'y8MJrɁF.D lȐ@J(t0:%)VƌבֿM+ݷ4z[4}NQ%L0p3ozI!hA` @ 0rQf*j)GHl R:o0 Tci`ɔZp|r4dw7 M<35ʮ`tKUh\Y3 Ksi/!)11fMw\*_%`l]uvWy]lÜX;X "TPa f?&~5.Jwoh*fDH|o0!@YI眃sέfj1`)3̃9ODq=[a#e4~j'Y1Tّ3"X@˨ t'RQm]6 g ag4!fCo]lGǃHȈf| q%> mdh]:`uF䘅n=yx! .Y;v 6z C( 7<2PVlhI5rS0.nd-WbJ68Z;u4\JQ;0H4 S`jj6?_:32V{Qe5:cѤ~գ{@#eK>`nnKj@Ǘɣ, F5j;3FݵP[0\5b3]& 1@JH fׁ@\8VKhXs쀆 Ufx=F9&h&嶲BJb,&a{y_tɮVs>̫APZ?Kz/ZXթ(-75M==:7D"3H  s3*VWhnQ5iߞ+jjk Kh&Qs VԐR{zO flm[dS=wɃ-j'b|-ȲƓ`g1Iߥ7.$sCzY`p` Foa=PV!`1sb?Үfc)F&yg#.Rx?f lXR}>un j욹R#.$G?1yjJ87{eƾC w10D! un @9߀ E *KЊަ4˸ǝ:ЎT!ɽb+hpW ]za<]:F1$=YSE`-w8rK${d&1?%;楜`Cw<#^q@"@1HBb8 PWhhuEU=bٜb I1Һ(st[1Ɣ[R׹gKvkp i Nҁ|H(KqL3\&TL.C_= k'N6s<}u<qf!kI!@$t~Hr%8$#HΠh.[ Fj7ch*#Z[h+}__p&chx/@bƨdF,Sq1D٢6ISΚrp|I``U%8+6"\+{E #!d'9<3RA9ac!@,x!#s{793B$ $0[jֲH߷O!Rr!d)˜ j_<-ZfPܔDTնC]̃ ll1CBĠdtL1ݚ18Sp oƇ"2dJ7$#{Hw}xw]{+ߺ@3(Π@zHB0VglXr i-h5|$`4J`sWBw0YUUUY;y>)t{JcKKʥ6 !`>BH5(iw(f懇%cL+ gc 9BaS"1b.B&Iyk/Z0 = e .ʁMIHfϠ8CH81HA0Ariɸ{⏎!" ! j,*0aBdUW,K{8OBB1+gʸ: aw9! Z[yaE $\ɰ\Tj6(ɺdJD= 4ծݒVD lF&$PeVC~F[gO y!C]sd׫ gC'r$ƜmI##Y8C,#zz.h5FPO pDd;֘m~YYJvrq& SJ BDBX-Xr=(ee-!sOPs D%5 J`sH;ߙVƎ>"%0& ?,D򦎬~.7G. &sS0.: }`D{̩} f{/FnUUyȫGȒR(l3ƺjT{}#t5C[McL(Z3ƤL:ڢ8쬭XKˡu9M00&@:A(LIX1Fc<'B9PaU)Ponȉ8[8̾1&(R7 GVQxrYk+|R/cz'CKZ;[ЦRs)R1菹Y<5`f,`+vkgA׋Ȳl7˲(/v MwޱoA B)e[~R(Pa ,Էi-oz8B)%<ݓi]v$ 'PXRʾzYrᆦ0` Y:s>lأ#VL׃I8X$Qxe(nye~ֺ Fݶ5.k S< CAKJ/=[Z/ $w=nhoL8L)kU<~@փHblB _&!|0gK!vJTM}j=|:1;3C(AjM1/n)%q4zKH: zsXفܔ 4wG(\0QjFWg1_yWXN?oiieY7.OTv4^cA(BT[J-^=̗jT `XY3WMezZ,ˢqY_WJJ!By[uvo.؆|` ɁG@oTj@Gj.G"^^/PԐ`&"aK*cF {q~}!@ ֋O̎3=Oc%h@B4(ɹ^2 kbs`Vi:qeguJc> ߫HlG)xtZ/$Ir=MӍ$I,˫* D=uM3!PEQaؕR,_ya ӻe׷?oUUա A)RB솷w{Na&ꛛTm!U)ˍɽ-<3Hs) V!Tꆱ ڲy߳n0(1F ȺS7.%ߙ@0Mi`-$"F5Z|<`x6v.;EJRdIʫ#&;y+gMĄa',~/+YLd;˲6bYc3FؑlZQEԲ/Yv5@*?AA{c5һƘ]uRex&!Ev|􉓥M$#.@ڲʬ1ZUUyfRBJG{b(ko=8eLE;ڗ.G4אyg $05~^5ə;p]d^>CXtY[ [W|,;,C ݋j>Ԭ&ψpAG$(3wO[qUizmiH7Qd(}lZTiK8VqA,J)WOqZxTJf?7XQ\ZVU+"/rS[#A$l !:'0&N/}cLj i.AFRRʀ1VR? md8Cmw~ݯ`Hrz|%IppU! ..FhCU`Z' CC iy6?{k|<s6atN+`"WN\НcIu N[]tEұ?{gW~Dx5I~v$Id~nFf0 e 8A,\[{/llgگ@O1D`wEeOWEZERJR.l]# N)QU}y=|zAR*/hxFN)]4[p6BA2cL˒.7zH!ҰIӸ+K({q(L/`\웻qhg4,f#-d1v/k.64=`Wop* F3Y52.Bҵd`#ӿ?Ax'1LZ$~?)˲ZWpc{f;lt`4v$<;jEQSϭ~g]/.[1.S!a.nc/")G(1_k !t4X8پkoUGE}@b`o䙩I\D(9mmp>!c2ל&4wc<2GNaf 89&NJkb>a\מv'7D Húk#Û~湡G4 ^PbL#dA~9#ѕOB Qg8Ry걵Te~)I+~FNӴpe`GbSTulF`5;j]Q!3g+vZTT@}?3H!|ߢٛU쑊& Ҥ  R-!DwggfݬcLl fh,AB0? !pQ"η )f2evmYS!P=ЀąA%7uZCTBhKMFJlu| 6•32W"ˏcI)u9|h0|l@ y Fý9(s~x,w %(kЕG"ϒ+i^v$#輂)B'NAQTf+!dzFȬWNt?1!ѢڙPڂ+dRwt/|!i hDPTC˭3 6cH(c `j~k:\jP`4RQ=XaAɌ?Fu:;[{Yn߿e~$nIQOч%)3u."nVᚔ__O uɩI [`UFY{Y\gT xA+ZWwrd!{O[8J׌1=/3/-4P`uH)J)cyG-[^O=hvWt6:}YUUՈ<dyV10fs Ƃ+Mnls< <)9qzM!k1  \MȭTY@rCv70ao|!d#@a401`f\cJ֕Z0\,5 $`tlۨ 櫴ʳs'ވdt([z@eYVEaQ4&] t`@4wE鄭VEё N#>{O^J= sE!0@H7Сj,_Or(<, rqVA1ۑR..ECz;Y .,n#߀(wrdOSݯ*mh#۷/ؽ v8T1 *F|ɮZAdĆ ^ F[[( JC"R0l/,,qKƘagr֬2!NDd b!D K5B[ԃIVۑwc8v(^1f81fXιoy7]ՒJ ?' Wq?!\jVlYeEQ_=R*)\xWT²]:}ma\YT0|ǿcO\pp Q2weo%1rA g+6 qw}eLwI,.g?1FB؊q8g9s7 jMv\=-ks%D,ᆾYc[^dZz,q4QqPlԛX17[HP$ oo)}iZ>3Jtӄ 3`GJ)nn9 .|oox'Fn eJ9U؍Wcѯ*tEQTsx18[Ê0\PJWN M.#U-AlzcTKJٍW/,޿++wrliFkbGN Sxt?w߯ p]dʻ2Ѐ Z1T71f $cxM!in6EZ,:Ph%V $G C0@q$ H  )-!HU= CK^lk'\ nCViF!TօfAVrݘ˘%GI췞JEQ&,˲l:Jƹ?|,IAW Xf1,4z=N%S;g:,3nvW8>'ozO寶p{#qjU d"fKҴ\IMb*Q(A,)xwz1CsZ$L~ 0kznQIesu'ᶅ ӧA_Mswq1u,E|L,A#tH%#[T+ [YI%O_B3p X_bnM0M5 `p965S1((Y ]d}d=KP?sM ^%3 .7J 4MŮ J>j;q:ؒ;! p~&@Դ 2#8 I8U:VTEyӟ'~~yqeXwjT}0!`^S]8,YݮQUUM#IsޑlZqE VsrGFVձ2\"1 ykq KeY~^9ODݳ(Rv#O/_]B,5+,4AqK[}ddUDzd7һ vw%&Xf삱Q򡛲.CF)dU!! 0bX;FM6!Nñ 1n\`+)?FZ ^,hM#Hl:+{DIfجa b"!O5  p%@p(Π8 ƿקXlj4` ,$,XCМa;Octc+Q!ĢqE Jl-U=4e;6d7:jO)?Orc`EzLL)MeG鸔R*dۍ: GZ֙8,,==|A!4aٮui^4-궙nr8㸫ZUAxů|Ue@xmmv.n.vQ}Ӎr< 0 -X^zOݸ<ֿ AL1*,Vfн<1G|HPPxs˝\6Jh4!i8Ґ.P[o`^Ӏ6@fP XjGr#Kts/R~ѩIPrR#@ 8  koشxn$ `Њ8mAA`srvjY) `G) 6it SS&86c۞s&ϡ!h5дHM;uRJ-"/`Xmg(jweW7 6x!B\`jęGE^MVW֙h𼥔jVѱS|SZtW߿a - g [8̮k7ګ]ŽosYY][R.֞=zꈑ-B"Ǒ6iw}18p 07}PMNN}`џF_6$1i)=Myf4B;\8{%e=Ha 6HI8p%%@ 8sB A4AE[2r]Y`Y{ra+DJimtR܍; I:yu_soƽvu;7e9ppt_o|؜tK"o_SV1 `D 09hbR 0j&{ՠ6)izpPrD!̃ 9 N})[0@yW%@y ۷^׏H)Rqz^I|-=,9 L)pLFϔQmk5pFE =#x :N,q ‘g>wnd{SZio#s07~q~$rW$$9I; 2g~R$C vgIvBRnE 3rkFxvԼ Hml.n403Dl&N}=0Z˺v,Z(ApĹ»wrPe`U{>rnb׿nqugA'Iri¼]lۭ80\ O|Kco9C5CL $U=z̓Mώ(FKgc߳(j ?ʕo9v2u1f[k_'6 \i /7 DZypvRlr166#̨G(l2&;l|Sc5fư1a)ȴE]%/9dP`.Ⱥ-#(EUzN|rRj) 8$I*/&\lG0k\/ wl6IYJ:kwxjVw:v^xg >oV⇯mcC{s@~¿ʳ4Mo~dYV !XjEv{!JS?(|ۮ|ˡ՗d+lUUmyĥ9ؑ8 `A)xI-o>`*@Ki]TU/"Z  {~!~o` P7o-^vrl-5 cDֺ&wpmԶ~5k:5+k?TNG|k'Lx;2Y3CL2>['g?Tۋzh `p+ H4E {Cx!}s5Ilvϝ^ٽ&\ p#(Jo'4ngg\F4cX&, I`t)(;$``)Qլ#QPJ[/~{G_xg|wEZbe,R D̍Bn?~,46{^?˲M2!t:8W0{;nJn;G$#^r_yE_V~ Uڌ h{s׹h|B2p&9g*Wց$ߒahEn<@oԂ)1猹H 3%%;2\[A- X$10ɇTa+.6P& a 8^73:r-@leujQDQy74Da0:5Kp//7~wPw"5UױQDzje#ARJ;ysWۣ&޻ՇJofb vXO6~^?Дi^z^o/M;";NE1ԙSWu:wv"%N/ee^eqe9goEQ `%h-> AZE L*K8DZ-^\gs=CW{҈c,j E@Jn ѼuA(g [Cjc ] %rBZEO\P&D Zʃ 2G@ں9,LFb8|l.b* r@9҂[B̭cLC5\rܠE!pSz)V0܊|YiftDbRLF"l9nnhܿwXI)m3(:Q-aq)(n?;sodŷ690Xm@?MJ6#k?*.*%˲˽^n$YFBpu݅8ׂ 8}_Lʟ&̔8'^1^.V͎|D%(jy{#kO|i~>5usPYvYy/ovLi<*Τѱ=$cz[yW1 6wx־t#*;VŎS]RRhm14KF@p9'4pv,Mz| ad&zfaxj%IRTUؘ2Ò3yQ05]Gr)a4M"6k(uq)%WJV%A+v  8*޽ eޕ @S[npӢȲl7I&0L\}*(T_>{eY oFΜamieIUyy?AC1E{K[O_q'xUv1cL՟ݳ}4a:}Wv-4sƜM07Eǰ֒`1l:ehmaP |}玧{ EvIMK~j!)1\]=k=0[=+>b^ c ^ 8qa^%)媔O|/}Kg_+בk9kW"v9V wP^3+{_`tmH5OeJ)DZt:NEщ =ŝ2 5?nJ0[/!, _̳fe[MDvn[a.*}⫟m;x@ļwqAU>.h]lepUGN cћZkygV ٘1`Mi~S||ŝy|`XZf͓ 2E,Z ?Ǩ%B^,BHK@+oPUu#Vի>,NfT_944&R`Q  BTJ#VJ RE!Ċ؅g?w O/u#ovVgf*C_N*4M2N߯O JuQNw:8ax_ҙw/N %@ 'fjzWxzꪏK4Z *`U}gGGRV.|z2%nP@6B]鰷 y7$v&-o=^ Z˪{Bc,dI/.17P͛3؝qDs7ϏR8 8*zh/M9TM |`C$%GU:/<@+O\*^88N=K2 #6 4[2 ebbuVz57 tRJY!ss)Ps%PBsqc!D[/ !q{ij_cbX ^-lD`F;SR&qrBノ LZ[ ȳw$0LRMxVv:v},嵧?؛Wz3Ma o/a G:ᯒ$eV 1;b\'[V; .y/cFu4E`zoԒY7)eYg,d:hF/i\y^YkӲ,me9WsED1HQ@,s@6G71&RaQF$LA!@)z$@Ei!pȧϬ]:FۭV+X$`'ƀQU(x-&G5'.ͧXZZ^A+b!Dӏc,0X9-Xs9_䜯>מzS_:z}^ǥ_~w.7FbnV8wM.A:Gqg@w?$I^Ң(F%3eAN...v8O).|ٗ'܄ Hڀ]3Wۿbz,eY<_Ot/IZ7nǃޑ'N<7xVdu*Dvݜ=~]fQ09k&q%HJk]r΅z_rS 9(4Bp7ƍO* 0G6r(6(,%Ci 㩍ucD@3g`0dV+XXX8^`IJ92ڌ@9oh3ƺ?ӧO<҉ I%۷ۿX1L3&`o3Kivէn~eYz04 WqtNYmZ 7*9ȻC27'HIa7~s+z(~?7q-F+8Ujq#}Y:9O~b ҍlH&,U'iWUeG`~!K2@UUMќq^Z쐽{%xP@:LLv(ڊnuyb.mbV^raE a1(C(AW;-\~ۧUUqj%=P;g\5=8I&j#Qj:aUJBe-,Y]8rbxBkhZ:knWױW"bNuq2Z*3[(oƋҫ[TeneW$v$iYÛJ>O>3۸|!#I?a~Vq%={Bײ,HӴ<ȗVP+Ol3ͻ)+N<25ʲ,Y &c:(lۺE>"VJ-)N?Db0-4*CO*$ܯp7vױ#58ȻJv z0ujw`v.S؍WR$I6|D3|V80q5ڙO~[S?yc-زtdA\ }\UUe٭$IꈋQVJj:"k)u~eF{woAXd*u@iQmz1C6@NaяJv3h(5Oq ^>b| = `A40b'UUUEyfOZ|o<P/W̻QTAr7% @b7;stAUGQnYB}H`TH# s0&mDc\zaڥ-/.+`:h[XT*)9XM$Vr0?[3iH m@z ՍSn,/?Uy%Ii~R1v@sQRn7^XXXt:'8>]:W+_nZ/Onq `6~ G4Nz$[I XGC(ւ0:uWzt4)c\ P=v!xSb=,Y go:;Vsr4M&Irz!U/|ŪR䉧|%VZ/=/&/f g*@/h [(RoRo=$ ӘY@F'f;skXIQEQlvޫǾq"y ڂD/>ҿ|>4vǻV_OۗeIʭ{+F+A0j2)1`?DCњ!a1֮*Ӥ( &Lˑ8KmDD1H ܆xқ':Ͳoy~;˲4Mw~/˲K'fZ-Z\\\v8~,[O}߽]Yn`{p2mE\spa6_B?uOfJ$k0T'( NZᱸx䳿Ov f1@rx'O/ozd*x!&\&OWTogYvo~YT7)v;l q c{_Ie⫛ߘ3`;u8N[Avy&I2.kiVR USzHᐽ#&, eYYP[jWNB PԱ5 Aqʢ Ac玬D`mDQ3ƽatLNKwuxf43߱z1YQ1?H"BŲrں.%捃9\&KF9*fPn kzylQmg! "`&?S@3ds{w>z}3 A/,Q((MܿU:w0gR`o:S tÕ&с{kj"J`jp |9> waw/]CB]8fKkw˲+b$YeEQuNX\B0)hACMwj={o` `9g q Q{W'wIiΛ) ubka>oZ˰e$62hz"{W?tn~:ff|70{nCl,yeYf7V}J/.n-sNDA_\ۡ1qu:*]U&, {# @ g4lj3cvjk;( }PUu:(-tb'\=rMMkmOkKd~Y,y'yg hYz$j{VLov.,,8ǭo+G7ƥXxapIP`n[4Ku:aR]mڌh/xp/oy"bd.09pҢXOt'˲+릉I1H4a; &1ɀFngkv.}W?6!$m`& ` a` z1|K'o`#upGi5ZI;qtg\,ͭ;r44Z,zRK'-J֥@; r98ip07t`]:vNjax3Zzr{qytTupT&\6hx6zKhwi9,y$ |Bs& fHX͒{I띛~mo2+,Xr={02QYNn6)׈ѯt52fOkݫ*+(ݍ&ͧ݇;rB5eFT':i%7=V;s"Z> ]UUZ5J &dY6Dnv}4A?qϿv llPkXp lyCIP$o̥ZD`fX#(vv}4 9\뗶qʞkÁ{.2pxgXW;_%I~+Mh#@͒ K{HAc|k|/eɳ,ˢ( p37>_}C(gY9` % h곝җt+ݪ3P7ǁTcޅBwMcC״֔!\k0=;!} iCZk#c1Sq 'bEJ)QxVu,Aԗx>]^FzբK"v_]F,M $VrG.d o]or3g7 og(k޹b7MӬ(òR|;Ǐ鐠 e8:$p= Fy>5ͯ1U,M$ (;]-ucdԋ1NIfP7έ{:;Ƙ^UU}z=yC1Oh$|V[LXkm,EQ@)EADQZb2vw7 ?~ʼtv)d[vs؄c܍-M6)TGI(RJ:ֿi-L둒2Z`[0 v—;(݇vR8H#y#Jtkɼk ˲$/2kSuR]Ւ b>Eٵ>vwNzT[8 @[/bYnZ,IiNd P4<<&;zH)I&ZdԌ]L󳵖EQzR{WN^We,8(TS .KFqK?ZvAIe%]!Y3Ƽ7ݳaccagf  caRJ=ෞױj f}N(s`v%e<_w#k^pb3FkVu-,{擿7w_j0j=&g|_ey5[i:rU AQZC7w9zj:(aLc2Z*"M~[A\_vV>yga |kn  H)!AhƉo_XȮ?{^UUyQ*w)7$&1`D5bᦔ匍>TBpjZ +ά?l^?F@UiΫ,'\40_n}O?y7W^g_xȝ=g\Rj /q70 Ap\Jy|E'WZ?Wpk=U)hPTgY|(:v淋 V49>$`hDLrJLd&'6"- e;tYanH)\{2G,f%h$,0#rhH>iv3yq_k{ٱMӴ.ݡL{~R@yfxuߛ9M:ܠIFrDaՊ8DQRjMJyr Kk?}*2XkhatO@*08}*7Ξ]^Y旼zz,9hpA |R{qqqكgo]ӟkeHW"P2z|*<ϯ^-dø3ﮭqWArN $@X v?1o1wZ-8XQ;6pPY9f4L&ùtwuuܧfQ<Y(jEQԉh1U)Q)#>osg>yk/n=Xm_J:wg^ hR>ƀ\b-ba^=V~TUť~~,+M'1L[mm\blᇈ6S;& AUvz>$6=IPJ0 UAQR*+Bը9̅gx\-u5:'}ƋX"lvƋ̹#ͥN,KdYvGs=y]@`<3,>տ/f߿^"\ōbҕz`?}q%2uEo *̇4:8kgʏ{ÒF$,˔RJMTGOVX|BpDH W AB:jo/>1Qz1Qø G$  VuX ΆcPJq9B RH) !bT,H)B%q⧿SٕSO-mxJonm7[|*qb 䅂9K0_@9{f$IRVyrL.=q?;|o][]cF*0lzxxe4- vtɎ@"/ ]23mG~Z}. `G)B,'/.S4 q\~0q d47Nǽ(2kmc1Ǝpt}bC%rVIu):p^X$=tk[rSJ1)PH)/)Bk-BpƘ (Jp)e(%!E!҉sO?gvIM޾Ͼ}Bf 18P2W{Z~hүʲϲIl&I,r_3F;|Dպ;ߺ[߽f+dF۠ ^o7I$Q,54"Εi(~FaIh$h y1Ei(Rוu[oO%c2ۨ2\BAINnaFÜחnfICƜTZ,A9 4ިD#A(xVN'PJEJHJpƘ cj:Ğc>LWup$ fH 9f G+bb ic6t~JXKR#i8tMõrsΫs3y"](_i0$\4s3by9oq;.|.nw>}'ʉ5V3?}v+85h'ɹa -480gjW9w$e`i߭(D1[(9R; ¹ů._ž7B_qn:~7V;teoZ$=dd VG3rf =nJdOj$I2);.w7^H#W[َ~@YILC09R0h S_:gן6^ˌ11t;{`0('M4޻W)5T)+Jt2n|v ܜ\NjAtcsȑRH)qC1k3KG^9vС,-o!lm*{?5d^Jzj@Zfa ``dCJP/A]}B쉃?Le<ϯ%I2,(1jw%#7gKnh>̟. pq"%#m:VVEzș-$Iy#}&!IDd7xH X%bUUI$AK)c!Dn_̌U!-$`0AЕB+d7>~ӵ ')PXO rIWR~q4/QER/1ؠŹ壋+'¸۞?ppX'_ig%F[% Q'F f/=_a0[7:Z{ guX[eUv#A$THtdv nX-ݩH4!wn0 ~KϖW>/J# @gq%6ą2@il%+\|3ŅU Rr \. YA`F'Ƕ֨%%+> O.~peY^MJkIliw- .'sճRv;\XX[nZ}=_}\_K@rRd*# pZ3=mTrzL a2CC4$T;ikC+bpGJCN)UeYVH)0/lNPJwukӔ6Hr+k1&rgcWpOtò+< i7ø5ݥ=,Ơk\ҷcb~ aRy)$<ѓ.di6J4;D Dƾ$$Un00 8JfgIN"C02\@_Du;օJJ$׳,eF=GDE=P:=S(cvn{nS_'~S{~\֏'^!Lb ~abF$[%%`! H;]#C69x* 3Jw;gߔRRʵ>?qhab|HalQ$\1f50 ̠ut "ʍ1#B#BMbdrmF:+ػ1@&sΙ˶g7wDAAp!D$hs\YϢW67qF RތqЫ !0dMJ*$s!8@F8;]Z/ZrreSG^Z&EQȲl3M~4Ms<"GF NP>ܟ=[otAfɈܙ¬j+#aףx'>#Iz$IGޥo4hT*$c S$"`snB&& cL!&>s͎όx*-p`lsaօWɴXt cLe61&MIntG\0`%ݏS#eUzZYH1c13:0:0)r;ݠ*{.kbd?=5c0K.K&[B_0xS/otoVU: ʲ\ϲl+˲^eiE#"KU4_Ԕ:sss0 ٣|7[gz2<Usd߃\~G>p$IzW q-pa}@F=֥{sdF*=nJwHfƑRBA=rߍo/39%'ѐi `# Uf 'ªD믗DTXCZIλqD3k !@$ BmYscܢ>pF+k\_0s"?<J14\8Z]D n l051l$C(6a6ì=`p`ѓ^UU FQy,y>$zlޢ$Nnq|]o6_W_\ `oT\!mDgO=rG0L~h@B{ PW}+.w轕%7ILӔK)owN~N3 g('dʚC f4TщB{O?uDtrI3\G];IwqR,(KQ[`0aH,?mĉ3n30"G0{(0cc\ar#1fTJ'/6m-^:d,֎}d|(.k׊<(r,˭<y'YYeYV{ "L"0 DjEQtؙs?'_8nPz%[1rkD'ysGȨz!Iҷzޕ^6 <ϋF_V+}9s?+Z !V_Q9lw;6SJ)XRn:鮵|',+qb$P`jm\[ɒ&pQ ?|nŴV\4$F$iO˃C 8!tU1pN iN54u1&'+!g]ve!{n錃`؄rn=_:Y-udivһQj7U,^Y<ϓ<:ݐh k-D7??ߝ[lۇ8>ُ}~/}M]VF+{1s,lkM,8wi˗$y_ud4ɨۍv}~ i\3j>,Exv4mr5n䤵fy箟z{&='_#&PJuӁ\V}XyηT%$sT}"Fi-_B c4ۉhMvsceIIEnr6. *@L"d;bp`v<Uk3sկ_UUZEZEOcgS?U޺TdHN&v2l䓌@yտDZֵsv^zuQ]KjBEot'5 h(oabpVI{&N 0ư,+X&BB/[|]aG:vB[} Vp@e. ?b`DRSHi\JT q(G69#ujбN=c,DJg_7\B;nsӉeZvo,tncru: ruRUUʪ˲,%/UUU)ip XyjNvRLJ(:O|~G~w_UP)瞧L2ONe$zM60F+ikʧʐɿ}t_}`:\G8Z3ZWUU!2!I)|9:%.8NWf vVIFU*pBU 0页F$Pߍ M"/48bF%PM mwG[Y,0 {G8?q1օ , &zr0.GZWZB)U(ʪ njvjvfJnsθmۋVk%a T9BDD*;Gq4]L݅ *ʲ4.A#!Zk-wcLC Zk5zsՎRJUUU BDsNj8>O}?>7zc`gqE-2}_=vKg4}+IK^ou0l%IHF 6>O [|BNh^Iq狣.QWYۙ4<Bqt'`EgV!-DK S FKSi]A( FQ( ?;㌱I4i'sIF\H0CJF:q1*40C`(uJJB:nTsRJ+LUU6 @@V;Ӛc(:\>Jǂ 8}>^bʛ6U+Ue*;֠[2w~=gCAuЕ~ZֶtO^5@vOVL&|tY3Ҫϱݤ''鑊 L/Xov_< p :4;_[i`4G3 }uJb7 f1*icm@0梭َu[p;d8\ xRJ,˴RJӔ ܾ#Dĉc15#`k~YnwbQ =ze?X3/#i3Fn8cdh 7@WCG;7B$1A*YגO61<ɹ|!{t5HcnRC|(9CY q%c,bʢҹ kOÿ4MMJ߿1 6$j'݄zغhbhpdksX+nܡcĴU`q'Iy0_ nfLAIӌrfR(p" G|w ~y_eoasN'XQՄ6ẉA, iL@mw۝fGIuf'|2hKsH)[.8Z((:Ეp{c_ixe,pmQ qV+j:ȦaᒔP8>voړ~Ue+ ;ӵ_y{2ӐUxuyϊ"e`$fI0/#Yt{&#""_Ydl'{۾{!ݍ榍^֍VILH4spkQDV߾JlLJ`Ьmb2=%MDBͩ͟cltOCnR$ 64V3@)Ŝ;)ç _`2 aɆ@l +ngcvB?[W%IGH\1 Ee-FH|Iz%!CPڠ JmHd42|*iDB.6̱$*j a8႔rQJ$X9=gO977659"(cpuK]44WE_̲JIl%Iү 1@{vNFI'^`PڤǞIf5J+,kk6w7+ wYlm5fҰVRm+P֩d >z? pZQnRl&v!Y6@ 2(*(+ݸsg3zqRU,Ba RDQ$( (0l[7: 8tԩ>*^|]&6 :0ٴrpiLExN(?gNreד$Y 4Mzјh -&v}P!a{e f+u/ٽ$`|ݸ*iG੕b?^LZ,Xrߕ n)+9R2ڭP 4c`~?_~טm^ kCBr{ OTeiTxoY$k^ (mTdT*A^6h{>N{qR8pģ( aaFaFA H);A !!#>=q'α7. oow.[Y"VCn:*&LĀ .6_ĕG>B+Zxy_KF$[i$]Ud&ث_Q6h7eצ3ncY8lE$Ppb#^~Sϗeyi0Hy~#I`OӴ++żG2j|J-S2iԫ5Mc<)MfrQmQB3jvEEL1k֚] =5*E 9Ҡ(4BaiϾ:[1sίq7)\Et!(u0Nk[!,+[UVG!_@+ ð6s IêADP -F&aGB9!8s|3G>2zOg} \J`Zm׮JF\XZ fpfYOTr$W,[Mt#I^eJ۬Y՟PP}Bwb$ҝC4'ev&0}Zkeɬj+X9<tx`!L^jJrd*@7hJs,7X\ǢC✷8<Bl !2sP/%#פD hmP R(AQjRA[kwVZ-qaEQ l/5%&Z ]`]UW-y16מ;|'ʉ. Zj_(}Kp5AQ8Yr c7Ss;׉3{z9Υ|ɵ<ϯgYi-]LsiHF`\mh\Pc&5ɛiގjIۏ#ε)>tHqbcB^tbv qd%i-ܩ_<tO>q鏋uXkadJ2 `.4XW*3\6{%Z9r%T q ./>TiOBΔ!l"Z5?C\I_z闪$ɍ(<̲eYeY֥W "]HGOꢛ435.U'{Դ}CA#%`ɡnch楤t`ٕI; 2@)dH+$iIH?z?zWp \ p=4I"2UU!UپQ^dr.'1u%!g^>ufu@Q(RckKAUIC?AM(ڮ&Piwd3BZ]& $IXc^#.a~I˭w+Kg^j5Iբ( f!$E""g2>nwW2LJ rΗ_xU\etuk2,qFaI."mwd\uA̹Gl5<4zWW0'ѕc~Mp\U`0X|(4Myp\S=ҬDtgE_Pf'1%{Q)@DP?aλY$n)[,'V#K<>C0&` wZtjgmU Yc+W'/?vǏ]xVw ZE[a&UU b!K+d;mFgm |121W%<ρtHE P`ʢTʅ}w0kt2m.="Xyґ ]mZu`|Z덲6Ҫ,˲y/APe9f!$즅;/HFXpoyׄ;Zm{/7q~>/jEeYfBHJFkYe@쬌FZN\P ! 1`9-P-M[z}lf5ɭn竬Y!.b z><ͣpz ۬WE($4w(WO "C%Wy&>l$%{ 0% v\EƫIDd1 T_;QXlJ@-nZB~+*pm>p?|  Jkwlh&jے3Yf8IƀYQKu̓ܚG +8y] &A(^-͉ṫUF$eYʲE1("-p$TeL3q3EItwv۔AHu:ɈpҴ~Rc}[-,3i"҇* '^LB4gqWTÅeY)\5fb_Js:f_-[tSq[R&Ч#R3픠;i*}Ɔq᧬Yk3ƺ܌;=9Y)!FV)qka% kXMB{s滧.h[yUU5pPZEyHz)rn28InV3/j0Sc?7R-,&C7IiT›FJ{ZSQ;;c6Ɣ t|,L/on}H4ZMF;|jX1xV/=ٿxH+Yn`5nk|nY9;Hec"u`Bh3@_r;dExͬ\`˶\P[j#@fWJ@)5*)2u$TWCRJh7InVkVH60qs 8}Q׽>&)ƘO7IiB%˾#c!16q{eTOcq a;㦣+ls%U ~GմZƬj8[pg$]]AƘ 1vT Pub Tn|(6dY@9ws}xcugiJRiYR*+2/rh.J)r0d`fw7^KFMن^$9{ T6 K{BJ,>TU51UZcLq..d_Va6 KbkFb\n!1 >^xbGNv{eNbB{m8eL*+4Xf4EZg_W~ ]nt(@:ʁ%"]D'YHՎEnEiȳn+趎KƘcrU::ZgJ,˲(^^UZ;ujhR3K4&a讒Qǫ Fc46dޖn=m@i֚1Jk118ΙSo0sإoFv8 &[\HPQ / W8&5wyʲ$'?1o)tNb BlB7"&$HHQED15e֥1ZZR)U(ʪ T*,UM Q"e\ jؾq>VNi{BҴ[>48Jk](>/~$BXYR։T#mG#uG太E"nIu/dz dG{w(P$r`p_e!Zڰv8]$)i"R W~֕#J)Uik}Zkm HVG/DWEz>!p=Q}J~ шYf1"ߑs]kTiZ-}"z2:g0X"adU4)偹_qīP%hh˷{RtN6VNӴ✧ZkRAluADM"cY*Tð:A[)UjG\}{%^{U4Ze^#KBJlDiHPZkyNC=0KT:?.{KxJ=Tl;n-uy8()#c6hw[9&I6B)\ȋ(J@Js+5R5@Z&yG:÷]g>݈H:d*y.{Tk\x !9I'UUUEi{U|K>ʮq퓛Ź ]EhXrF/neX9y5G{qMJ)9 n@.դfuŴ JDFfV=*D^_|t= h; 8C]˕1T!";R*iTN7.sY|4`g@Tp9Mve0ewlo@셸ILTYn@ 17!?gʨI8؅*}phbl?=$E@!#&uyWR)o dr=UUΎVU՟'wZ䕍oVKn.{uiXl5|\4rh|7J=lلV">w!({qÌDt#v}=NcN`쇎hQ8R=@jR*2jI^Շ‡Gen=I]Klg6ݎ"i6Ah8j}$#Cuv^l'5S297wf?'f&%60VFo79] ,Aڊrb߼z(~? +k')1[z-wo3Bְ?qAըf%'BPӒiD14J^UGCHrl"jbHFzrt8 Đ Z%1>CDJCtZ@cHIh:ĴkeYfyVYq\}r){kٹ~t} KG`NJRw2#UsUJB@TGHiʐM!Q2g#9ۥ2*VnkIvdwa{q"?.Ǥ4JBfJ1꼻wTnNnVkj-SCٯ'd/kkG`Y!™툡WK{D6!Ds[acDD[iQBDD^޻=z{OHur>ijl<#sRj1@[Cs|WbNva[ oZq__kWzW_?},ΗkD \쐩3.z}rWqP9 13T5zO[!rln@@|nd]EDn*_Riߌ,v.c|g&\O(AĤ֎ GJ878^Z\ ^|+7Ϯ^BvM -ZxTѨ]i|\LKAcZrcCL Yi3+ jhwIozB$;4% !#QrwN:H4|_ReYyQq8^x. ̓弔|~+_=\9q;s[E!m2 ;mR|TJmTRkpkViu݊T]3BBh"jI;6MIË[ݲl3_ݑn~BL4"aB%F>uRZk]UU]-ea(EQEQ; v])e7cs{rQXoT-2lD1[* Q&BUeY˲,;}Md_DHFcy}ND]CQݑ 鞂Q mWKlUs.csΥ2h HA!྆q·$3*cLNyeY$ MӢ,)|jy›>h7 [L$|C|_|+ q8,6J&u95X. !3 BvPnz.ȊEv7)onӄW$!'$HJj| ԌיFHlm͕bL+! !@sbՑqsG11R&(5CS@* :s3 yA$%`hvS d4F iTdneC$AM2Mэ5&\FiDD<>ԤIs8|׎JMjICfB4I7}Øjv*WYpO۾=>nq e>Ǿ~ȴءf41y-OOZha MfrpyxxB𸃤,. C2vь'$ZkF&9u81H UZG2ӈiO 'I f߰I> &R9&'b#YhVR&y"iy1aLՄȈM!YV73}$OHZGbK^*%`ݞ<U$;\앨<< H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FtIDATxg%Y{'Ce֕YZWl==Z`z$;]$].֌(lwvIѸ$l6[X,H#GL.]u\{?{"3++2ʯYTExs{|cDf5YjV>śYjVRլf5Y 5YjV@jVլf5f5YjVHjVլf5Ԭf5YjYjVլլf5Y 5YjVRլf5f5YjV@jVլf5Ԭf5YjVHjVլլf5YjYjVRլf5Y 5YjV@jVլf5f5YjVHjVլf5Ԭf5YjYjVլլf5Y 5YjVRլf5f5YjV@jVլf5Ԭf5YjVHjVլլf5Y c9"ګkIӬcSii+YjV+ }+_iV>}:wpjVԬfhiYjYZ. լ٫q5HXͿY0=梬YjR #[v.͛7sT݆5Y 5Y`M}ﳕ.s]7<ϣ8`*R#5Yijd_^s?a R~i妀YͺE1Л; *.5BFW kZnouݞy!}/p `=Ē4N冶/\vT PF;l8p]YYiuݾy9._1zs1&liVT!}jn&ՀQ U(}_}AY<8'<;MO_9oF:CRͺ dwRqP L֬O435sҒsVZnZ9)xſ=^;>1)%(̫Yͺ47]+"L3 E>y+++AZBK? ?~:7C"+1<9fݷ.~l'wW:}c5'v&xKKK^[jۇ\=-x_>10uU+ Rd0OùBjֽ۳$L%>(7(lt~^9yIu;˟?(\ܸA+H.QJ(JnA7w4Cv20>`T!zҒt:t?}_? >Z)J)d0Ԙ-5ͺKgRQKji30kȘm4`4vu?r/?\1]Ơn]CzqcqgimG}/L e&7+ .0r^]y8qꕟ~v ]ݸ%$WJQd2$Iىj}hjW~i`}yyZ=zا~'_lw{"HE[!ܐ}'%I2L&x<؝ffۧeg]LG@' f"q^n/ҊКu*ZxTJ (0a?jʗav6TD3&\ F9 0r^;`~vaADyn\-Zoc)>Z`;iVn)sWH{Me:ڷ,D0jZ^~Z[?~SxwyPa, ZJj%!\Gu~$)$ d2 jXQ>k! bȵki"'@DhIL~zI@ qE}DJ $at׬f}FPWG ]aL(0t:RMi=܋ǯA˹+?Krfip*Fȍ R&cy+pRM) I0$I]9ẹ̀gbs6;e5WW1izVgMlӋPQܼynzkNHg|'3FFD.)`F3֏Ж- IIz\GsYͺ놧Tw Uf=b EzjbQon L~+Ĺ?hldžASL&Dcxp.∌>&I26 j3CCiϓJʍdǙUT1QshQ0[Vuէo~b$0։$*"ĔJ5<1 ȍ!I $8NLhYͺ=.ZnooxUpbwyH{aQ0v^oz^9h^9t <|uy H T;Jx .~>pK)5Paql: Q#5~@`}s6EJƛ"& }鸽^l|ǟ|zs?'Ȉ Qz#b!Y3@3׸蚔r;II.T{|hAjV~ۧ[پaHeFT}iaD4/غ:^o2NO|zXE,h VHoYz9 jI^Qlj*v8Oެ{X:ϵ_PIDƺү7{^:0Ѽy^vvHF//| W[umX*O$("Xk\Dظ|bΈg0Y i!jV|?!۬EvzAH*EY`~f=V4owGmx&{Ht'=;{_^r;}A MOvQ*3"J&$֑ qõ "HRvIu~PS?jGxT_΀vR!M4h-IM ~Y`Dnv+A}S?W/iNY$pTE8%Ikʛf5K/\~-tI4RvjmFN4$m Cڋ;%%30'V*x7}ݎ%unnApݥǿ玾D$A<D3vj Bd(P֐$lcpZO‹CKKDb35'^3K@=Ȑ*MD-՟!+!X 0ZiZ +:{oWZF.yJ"d%2H3|O9HR0Ͳ8Ǎ˗ᇃVrؽCS?һ`EM\P>3wQ Cڋf`dQӇyhDgFFZÞ}3~coKhb .Q"%I"(]z0h \zGh%-0IiձgHwҀaH{Ug2w*dN̓~{X8 Q>c&Q1\i#2`5ƕq\$@(yve׬7A۫;hy_oz>RV4nnwӵnzw"~7+ڡےXae15ДVNɱdga8cgP[k;Ixt&.YvIm ԐʆyVFӂѰZ.ng.^^mZG<;?گCrn 8R.# 3t1J9Y:m:md\gW&1n^  6ĆQ &.YrqnOUj5e)ӮĊi;ޢvYjZAu]twi_9p)R`Jt>|JlSq6@cɮ#E))*awG?DWF7TqI) &.Y{dlU0(wf{xHAnYiZ|?yޙ{g)t HKm3VkVzaґi`$z6IrFq73rrqhₒ$ IvӋdNFk}*e֊R3KTʳB ŊvnE:N.A@3nyeؗvJ[؉  2BϰuOxwO;41 ),Pʿb"6`pjvTWǎv:bԬff'`G:/ɻ]д3eEnmXZ=;y'_Wc O$.eyr@!e)6dIoT2Ϯ)*+)exZgyF[)v $Ibv[b u_IҞ=H̚X|Ny/'pExLt X}ygisӡK^쾤mIKgD` 0qlf$|:ldG#{/籦}>H9FynyYi nmVjt=;{=Β XckK ijC-ں"P ܧ 3e pp&ᶙ;8JDsgVxlTu>Pm;wV P}2%uŐrLQH J`.;n|: HE:aз)R=NW{_ B.~z}\rpi3ӄJY0;>(ӫOXR]"vhc`(3rjwZ3Zp$R(I)ZkVFU)fF'0{j"aTYƯ'J܌cpRLrNd @{dnO.L ϧj(-SCioBxuCF\ yv{$`J.8$1ih4 dȤZ)8֌1H+t$0j7t?AaQ{os@B6?+1w[֊u]_P6DvO'E˾Vto|7^{?{bD$f+7;YEi^"@k+aA[_bFڑ}pI5xX>H|uD.Z2ٸvq-L.ws10R] ;cM|Hk2D+R*cWJ)H)R)R'I"$q`(:[I3@5QvxwoD5ެZ@T['j۝V9>Ox+7Y@jv#*[%rwe^UCR 3BP@*xPYB7(5#bŻ9,9 4km8C@(Tvr[hkc8uc8ܸ}2mZbL3@QZK*JDUdj,aOҏ!mIξ[G"\u\ jkDr!t:^z^;vyAq{O?_ϷOo)c[y[mNg`maIo/GRv2]ӷCLgʱ5a(M`DH_wN7h9Κg)]9&>$Qí8zpv'rA<&}ljjfLjzưpuîﮬ_k| B{+=\4՘J;]$phqhܹ+[ y6DN+Ӳ 4HwIiRc7< K-NU =@ZdN< +nEw߼d `@+4GD41*bZR*VJRذ(I-L0?M-R:{6@>F)vS[ܰN2@yޚ뺇=;W+/?p*r|áĝHf 8I.,5*r5((;Tޛ=F6;唘L'K()tuZ"""h6˒$hy9Ƙl#LB tbm( UzjwlC뱗 hN}xthtƕ;zBDc*&ZPk=QJEZH)/R&J8"i~aցN4Kʛ'bO}V 8z3)t}}s*;UAX|@@t:8:/f GǟO꥟Ghiտ*\$6:lyͽ(>DqvOivY{y*t1UW-) 1ʬTf̠4M3F+AȈXZ%BHV  xY n[CdץP9N_wvVya xp; D۷ͫۗ?u^'MJc(cYBTHD2RƦXũ޷H-4i245`UV4X>pfgn(KJ-7b+n%#rZ Z!N_1O.VN/-?#Lƕ֕ ۛ߻~^QIP)5Z I)&Fb(J(Rqov? Lt܄d>ɀ(<|\]}hM%,A l j|_<8G=/?}VBE͡fsmC+ ErAƤ)”ҌlX^>3害jEYi&)Cl ]*Y?:mZyn0 Tc6)Fn{(^"t~}ًb)g2+絓 @PZC 5h猷ҩx!޼9\2s;7\QJmiR J0I0$I0 ZI{i&eMgM^FK&{G>r3A(#y^D=3Os'[ % ``# ,7l$ONtVejL(,=f\[L=ɖ+– vśSFM 63MRp5f( bXbRiӪaW/VY%?9Ȕu phҐ5IMH!8Gv[+Gl-|z~rt`;7޹ڴjAqa58W籦I,30.=*r]eCcp7=E`U 2}D }{q#= OCAm LTr+]dDJLPuݶW +{ qeU'zĬ\jݘ"5[L+7w:=8KgleLZb)e=ns :l,˚+ * $ih"8gDМAq@w1So#+݃V}gϺ* 7.y]x2X,*gPRʱ)5L&Qd2sS'aI,H :U')͌Z a}kv%2Aqy^_ya$Q6HYIE xnfT !M@>~@,s(#"(zNhr0Bjoצf#%3h#ӑaXIu0u[-עJfl$u@kMi3HàV ;pg{-?OIۺޛo;Amg@%*~qE$8 ( CN;'6'ĊbYSN\d~a0.AnTQ8Zw 軮f<ϼXXj9H0f3笼,5XB ˚UueHTⴵlP +t+{mBgxL3;c8M9Hf;EΔdw (Yʌ A8ΪÜ󣏾ӯ/?;q5aԬ-e]̹l0jYlvJ +'c@uH`H)Wʭ#*PQŹ wƢ7ʬ]W޺o_柽 +6RZ-ԶrtI 0·ؾRSiJOZ" $ݰ![v^Aj{U'gF5̒4AMIWe6M*|JUڔbs-;%ߵ֋'>ڗLWGJD;]Y3͠@eJ=ioi1'JODg|ե%8TSvm jx)|X>aY~Y9X夥4͹.˫`~?(!xz]iDs!@82VZ'_3n7>?aM7RwZv$(Fb<ǓDZ*saeLnk҃eH3!!j|oy6lhI,Xsn~~'?'G;ےp-VH4iҢ1הr6T耖(3uj3vPf-VP% 5wÎ);yv:rĜjؙ+,Dun NXדl$1@'f36c[a`=.l;J6[$#w,K2gωٯJ,,mu+^R&[D zthED!Hj$!Ɖ<ն}-9o}?n^&m>6$يhh48 0iLyƴ(fCfBYu!uLZvbSg^}K^ $& &f"c ¹0>\+SHrؐ-;T¤kNi{QX.UM]lt =WkF;ufdf Gї>X3']~|Zne q FlIpFYIl(NDΞ5j%VȦYO׭W% 5iJ_/M8&(S"$D#" D|Pš `qƟ(ijM$ٌhd2Qפ(׋[4 ݏ *VZ-?ymqz#5ǟ=~ŗ{NvXj!NV#;r4mm-.@!7ډ @Ew*ūGMe:;qTF7klySi_S9Ou5V,v;Yy@+X⊟c LPk 4f_SaYΙeJSuIWYq4- J#E!&q,q{vjrı*>֭k~8;JJR[I܎xk2 d4ML)o[_Ou8kҢ2ܮ$8\v}1ry-;uڒbz?W8t@6#; jq<'L0+se)J,"{MOXM TS_ʦ@d==e0*RuTMGY}fzjnj6Nb72̈ii6'XvuӧryS\;dLS,~JAS!̪51Yv0\YVxVqM4ՃԎ՚GD* [q $QCDsSm)aT;**#$Y\9^b%콼A %]uYe.rJ7cԜXYb֛f;7zR*+|"`& a1T>#KAH&b4! IpsZ8 ?o%%)5L78ޘL&x<iv J~i!?7 E\cB6j9~ڮ\m !zYBw?W^?~CMIxwp3I#"3p4ґՂ=DU+B:fPIVK[=ƮTVcQcT'Pe,: FNu2ɠ6ws.T<.3{v $Jϟd\*ڙISϑYW*L T#Pա"M9Q1ҾĢ`8J F H#k׿,޾Z70p{8GQ4bFE_4 :vS9&aܛ m7 kcWjqu.6TEOgV~Fj` #_*6QU7 0c_tua@ُW+u2b$;v q7Nl}k}!.{u`p8 *̨ʖGÖcB0q?Ϳy'?9TGL0pPwZqI"pb9TP@ 5`D]PK>!] :]L!ҵ)DWQeAP/ e:4CSulIhfp%t3^de7U4-(o\"Y%!l+gJOT:l*^ lZ#1HZWj+Ϲz]_bfhn=^AKNǷ/$0Ѹq3 _~GoDl\}0+t]x7^Ė JqD="bqCk[ʡ;h-.?/sNcbl:s؅hN5`SyOQm]>`NQ=xe^kP2+F2K̿7u[4ْ`= ܣqzט1$O[SYCA b( O&WRiĊ%(h`4QDC]qɕ$q_ d23HW8R nAi?C>GHId`kkknsnA/B5ɝ[emjvnKb)Y^>$N*:m0.r)J+L*7NIX~fњl}mt ZTόl%6-2Be:}T#ӕY+fJ9}^?xV1H§MecRe0lRjPuƤ̈́DZSɷ%kPK dYaSVsby$r_` 0iD&I154:Ɖ-_?$I>x<56x<GVmiiW.7 4no4 &yC9D(FRJr]7q]w"_B8owXbLᵃ[t{;ng)8q]{9{9 νX) V:T.5MߙO[fG<][׌M˔U hzNլQeWt0ҳt9`s!(d&q=-y2zNeNE̅aJ Xa!4wtZ'F>XgtnJ3l.1e].1,[2uDf&XCpP&hllȡgs?3~?3).mq|ux7䜇 R*Lc o35u4KYy!똈 qh !棗'ٕ;G4;5v%~wّ^_Zp4TbT#TG׻蒞Emej6YԺ묎Iza8ׂqhq<ҩ2].QNsJRBJ$m)(tA>#UQHx`RKx(er`KnT"b62;J GÒXQ+|:NcӆDa+c ܶK?.w$0 ë`0 , o^=Ix+dg. }̀*}.3Bnjuۮ8NWBY/n8x#ϼ=XqRMy&tIPJzZ6XڔL7e&$*3jVzM;Ss,f1U9u齬 gLYŵ0uӃY l:!Iƣq$SbK'VG#g?(t m1+!KrfCϹi,@$Ք>-PZ#7&0T؎4 8l?oߺ$I d2>6G&z(#׺Ez2gdSGJ)IJ(B:{;r]<7 Ḥ8K}/2m_̛/&tמ| ܴpOBۢͅS-d`OkEaF+vh7SѬQ뫩Uh&8k̑jlkP,=ԁ$]QU#Xj2Rx`f@dTsc`2alXUQkV:FU1ie5{Y-6+x0P30'$ CC'wks}!gԘd8Ri]&(1sApD} 1RRRs."^LH JNsh^G F҄(x(CˉՒҌJEmZٖT:,]}̪W vv F0S\tDdm_%FĜ1(SX1(P%!Z~s69cB9|<GT%Ms%>B c7zBZCk$I(cKgY\׽wWzkuj_[>s@s|pAZ;,ĊTrU *,@bޘLW @kAϫտ:V\T[vӲw'GFz-5F$1I2XRF>"gCVm2G u]j0Ȏ7S-Ɣ2CIC(RHEP:R6}K:$R6p6z@qc Lk cEkޡW~ǽ5v[c㜻1s!P ;=ݲŖ*F$]N zmI): C9C7]5}n ˮx6ܺ~?3,qNʸXfJW68-3Y2M}&<N]t;ʓg4i`dϐ֨>J0d:s%5ƃg|6@1s2@bFP~Us&U~̬7I&RbN)Фu$n+YMGI#Vq,`p-#/# \(l(D\:Bkվ112Ƹ8 |4%Ͻf!= , 5@jLey VJ)) 0ᜇM\洑&}?pqV#/~Zٗc/_SRjO}f&۽hAf4e~+YdD(S͑&n>ǒ03LY&u6ٟ*]\J)80 =`1yWr4Xyw~2:H G\@Re"?hF|N[MG\5#|ϔ 9Ha2"MMISq)k+|yXF+eݙ-φPljATULjՓTrS%ͼo 4v`S9G)lbPoǞ) Y0H))yݬ ߷:_i/،L ڼK6M9}A۰y˞?8|y7^sϙQv}+PWlhN{KY+TMc?ve4%-ʔf1'԰XEg !p֔fya{=}{OY?~4(bKv3\mq)B\vu;CFYkidLC FAce,dK|n6 FYP h%eYx0k )3JCD#Lơ`"bfANE|xJ&ۃ杍d2Id~ ߣHSE~u;TUcv-Rc$4r^q[Vk[Qa~N|Eg]>g{<0AuzXZ h͸ ;tu`Dv;զv0eƴ:C0ߢ ŸXi%TBRPj29Ngu7_?d̳ iSZD(.:$2Bo V} R9y<|Sa`n-)eGj wp)(A>0&a)g1Mx/yS5(&JW C6"z1vݸזw%Nƺ8o8 ~/|?rwuEFnoo_L]x<͛,Tǖd~hL _W}ͽct=uW aX^jKH Œ( 'h2 lZw(ፃCz'o|GSO-}Lw(D*q_ 6Yqw69ݦT;##Z@{`D R쇷Ded,;]X^iI*bTjM5veD2D' CrO@)B$UH3cpqm3[ז;!Pkt8[aM۟^_W,`cP,@'^# 0՘Ҟ&td0 6Z-? o F||x/`No9inhFM\|3eh#%5ۦh^6'.ՈrGcX cdd;FgqD``ࢍJ 8ͫCeR/`['"$lqGd0 - nFۣ>W? +!\2ViwL6hvbF5yr}#=&%Qo MGCg͓2tLkO98Ͷ'9{(~Yb6%F%/'*JdO\Ṅ@*#G8 ݎ뼹3o<'wzlz饹5ʭ*ꣅ@S_7Ezv N cɖ 0i "QA8/٫o}x/1r8Tҹ Pz(9`{ֿ݁͊W0Rs0h0 bSkhLJi9r6TdCˈU\r#+FY`d",rVDg7idH[gp9EIBNw RN3I$X)X#v K?dJK|RYI[coM|7Cd2a8jZۭVk3;$yvƿW贏=wb=aZ^ FzFh>*M?_03G8Xj~р\0zW)4Y6R.,'TY 8m(,dU~+|8 Fq$0r0']/$W/yJma$a*cmIwu{Lg?Ҿ$bi>>{(?xwN;ygj+-$I(Q (ڎh3NZ7W|C/O܃0HE`ܼwzJ$QZ#Kc‰4G{CQhب,EXb̌i&צ5T~(,Qk%fId12Gp34)*cAORjnŪ3jYR#!./Pmkq;]ӼFY:dÄٍb3Ik8(0a8l[qoQtg%%Ó.O-xU#\@-5` ew FNhn'0A3JIםo趫+})dk{#1 .JYQ>.Skd"Hyufx6eW%PBI&I$ aEL$ݏnܺSobyB(4=<`-㷰<suF\& Xk*ԎjuJ4!8Kku#k;K-?͡ⴘIN}^@/F@fT׀QJhreTQI"{pP:[1fm3d$YJ]vӜFc<,wç}νy7MonZkm{hԐ]O2cu otΒD3e0EQ4h Voɷ_zz9݃PJk\;:| :\,~3N+`-7U|8<Ɍ I̮ U @J=UΜj%ՖLks5 ,-&hnwܜNRtY ɁL3#.8^?$" & *snox1ŒV$fft\CdMywLhYiXS8ގx+G[n΍n~sq(p8 *B]I.F9`1Ēv ax- Ih.njw..w9>ܓHz¥ỿ% 9x @.8Б2_ <}RL1f EydF2M(4yͥTkHuggRQUff5Y=QuT.YKd3Rc_t.~Alav-!+/$;4鳕GUZ5-"Luu* j} 0Ƈ$(%M$qǃ$IWG\}sN?]9x@Cg%ٽv ft`T3F8zǽAx<57Rs80@?!k@{2/|v|y+ԃW7`T"g!ٱdJJ98 ԇ8t&FdshMZΒ+  I G~sc[W|߿n7q8 KkȟkF*#m-ovG Lf 4 ڒ PdSE J[8:>^֓7>xc`n+$ 挛;]-0\hw V:cZ'qF 1Kg3!)Z%kBxs?h thz`։ײַw8kgK@hhb r@J9iZV%deQ468Q9VFЅG J375$)o֤ͧQb4 dI F9 Uހ$tG:u]wp0q>7CSEJaڧ4k~gM伻:$jRz2hT$Ibv[m)7N7n_zvkcw'@o`F;Qu.(#%0#,/;á+`Da8RJ:`r`✧Ä<(q\8:7 eWtӑ,o.ݖ/x}P2(|s#i _^KaV'(H1*n126:n~mB[ʞP߯{_J" uu+R=SA<\Fr*%]~;4G0*ohVrDpW n<<SlGҨR˴$R8ø:9zf͹|u˾nZ h+%,l 2gY9H}H=X~eJzF]=&2V$IȤ8&IJG;ܝG>ux闹4z`D;tF (ilyKK<)Kv Huw3rQuӒ0؎$y锹i!czscd;.Xn'P?e,*IQM8N>ZvzUqEzpWݎzǎVI4.Jy@Yc;ޡCXvcOOnd;eS^MB-uKR[=dC #] z_3>Fƫl&%=0 mx$? wο~s.S|dFI0؎-F)4CLuW:a!$P]NE<0/,椓$Vj{8A4t'~|c5yąw>ukgI;_qZOs<J'ռpiyJUBZi&-hWړTb٢-)h{83D9vCiE1`d< k"M}nõŔbcxH)m)dĥOwysVp;s"p׵ʕV΅LIݜ(1K4 DY=#΍뺭 sYO6Skŀ>񘼠4eE"oj҂x@j#gL(qS J7ogr(-'y 7 %ز%eS>%728F]ㄝ,J%٠4@uQgĖӁ3Ƥ((Q 8nZ[-&S_++bׇNTڛCFԓL+dbl,B8mi͂r@cV.ys9؀bJCEz*`,,ak&fvbK%Ɣ3PJ$ؒrV[+=C}w{G}H44P1P~wFٿtP2`kǃ&_uxz@ډ%cMP,P,IhFI ZI28̇I,?E0,c0tnEG]2`JӻhRRNsHcRq$I$f#=kR'`-P_' [bLY3 kML)RKpymp3_X =cJa8Lu0C s7u8 |u9ӥ)PǎٽJzAt0%I*IGGqfHJ9+5x ᭷Osk)2.ڷ`;?X1.D)1۲}݃KJNb[͖ !v֑a0L3n_Hg͐֗xl)))%2Cvnז 9L 0ʔƌzygL8h b+D/b^/+@y}FZ@ !nUbg%ySyc(3>q.eyaؒQW0$I.'RȀҤ.N&+ͧWS 8hÙyaw FwaJ!'z\qyD;Ҭ$ERxIy@i*xeVK$J5>JKs-]N֥̟)UlztvLWN<{mKvzR7 DI0N崸[\q/{#pKņ*~CdE"%OcKu$kհ$;zHJ(2Cx"nj%r-nw FYG$(H z_mvM纮L&%L1 Ӭ` n-c,)>m'9kM'jڗ̨n/.m_֬8{ c>&cc7cxyrCcp);Js[/O2$-BwÖԷmJf<|!v*īq%]b`]OS,Ėr`5VFi0-"bUn Pu"$I4)4ND)+9='U JCU6*"$ԀQa06'w8& xsq]!DfuF ͚w5oH)eCJRkRJ)N('Ubs H"Keg+0|Țc 3&36]yLn1qΝlLYLz}FJ-tOBjPuɔj$<։:jѣrdYyY_, %@ -F:$@@_s&Q'xqxE4E_'͓:`71I "Rx<s1Q]@>IP'/]b`\&q*8Z0{4fKZ 0)Q j燎fٵ!},ɸrWps0bl_&5|lcv~cuߗRRjMfcq[G'žX9 6xAO$(1`Tv5TBpVcÛK 0 I؁--J --jIu:`ډ)TXavJh"DDcCe,Vȧ}t(zdCBJH0XH꾑f7Tuet4*ˢ,hM5_ul|P|/8kL;$`Љ |a!BN<̻i̩cV3mꘒ9 d@Idʟc,x5 0gC1sC0ҕѬ_h/ F5GxÜ6"!aHB^$gmY*)`YTQ-s H5V%=T6EJY~+j v .uhSJkha0K>rP}¤uC8Q=s&Ή 4}n S]iV-v+dܳc=& s={=0K3u)))eb,I(~T]z*c xD6]t⧦rL&AJ$5x(6={Yjk whE7S wAV #:]v{[10.Oj##L0D, InS#30/Cyw>7<̓fޭgyJi]"u|^}=|?::tE8 06f!&a a-5^rOyA.\I ܍f@"TYlitWaJ9(?Կ$CqW%6}>0"VH^e0 hU&M%sY-1;%ݯdtOK:|mȧDMt&NH+0p zDjx;Ó$u彼;"T368L](& ܰ[Ox=WfX*x88N\w[pLU#I'0Rݰ?H@zj񓝩qJxu2{%H+;}yF'I^{Tpw ;i"tKF<ܐ(xm@;r֏8PJIK>cޏ+R}gws֚qM&8y^u?ҩl)KN;]~& 1 R,g -t1n1# hv8kd 2;H)!~%sѪ< ~O7ZvE 9.ljI 1l(.Ds]纮H1bwaIcPL `7trg%#v Ff&A 'pl\HH{QKTqs5=(.z&!gJ^Pol^fc`"鳩+4`H`{5IW.C,ZB5 9$C،PY"+2ʬ̌pw>i͜)eYaz)QSHKeWH0 =˲6,ZZ~!)@"0)EEz~o Va𨤐4!2*wFi(\UB1xjW;}gCR?ȲLm3WQa` Vk34dKoѥ\IFHZޡZˢ( JdJ#k3 \+ݐQ D(@Ex 3Yg3p5! :(9Q1HݕaXK/5Rlpjp(Ƙ(+&'Vˈ^\|WO]q(W RaEg'0*Ա,0 ILwjurP衐fY4M88޲m{mbOk1cg&w11H Y6g2 MHkEScAF4 4LIK@eNaB<( Ȏ޽̩/.:+XdLdAWA0uH+m8ޓ>ϧ`;B`XEQ躮{>9=~dXݚaXmH4 ,RT YA2¨DOJxw僆8-%R*"GC ;NBd;T)2~<-m}$v>HJmJ*j3$I$I<؆y=1 .ɨk\ pH"U;c $ fR`y^&~x=R]q! fW?H? $dT䆦) RoRuyEw((Xcϲl^y/Y@ &+X38BsC )ӦGJ2]QZ-'I5)EP C%+uQ$B9)&B4@r9!\1{7'ZkضM}Gz$4]Jwݓۻ$$I:ގ OSO3MFC""@FPU.β,05솈F"8$vʗbۀ%^/R{G:Hcv3 - 126[iB<#.׆^?;ыB川e;:`siTeYaOq$DF%yN`uLs2B 68J!Ei24 $!!r[[vd MJ]w9MsD"$9L4wXKg$I#"[L@~~{ԓTzPNq1"uu\22*Q,Aw`*W,k04MaU9flVHzQg ʤeP@KM$a {m-XcY&jՆLJɥʢ̪AYi0Q>1 l([?._8T&r^7uT&$X!xiPꔛ'I•n,R{\~rjB\JRRݒ2!RH 0a>l=˲mXu; 7 oPH "j˭+%6݁%μ;х|vQ@i R"$"b?tUzaPŹy]ғ׆0-MYm2Ƽ84MSU71 $Y*öf&K58ReFT!H T? yA>ey )@ʯ2 e;!2&7(!sp=v?JӔ$+tUkQyQ(8n@eRTBn+ 3 Q*$RJ!E&@oyZC(AWΗAaƎV,kiq\ <ӿǤdzIy7AHR&VƒJIТJ@ِq} qMۚlQFmO "/݆݁h1k(3C*0eԀhb(ՑA:8ԣt+m{~z|׎3 ,y6IqN\!H2BFP g]~=˲4M$IaZnrEHD4_ijЅXQBz7w=R U^v?`HB^<73 Wئ|#M8r.!? B*ώyy@jREJmCݮ3F^$QB1ad؆R]yȨu0  -?n16cI=u x%;D![eq`HD"4̂>ىCvn @ņf`a}إ9ۺw ba]~h;V@Ȩ:YA2*~XI{PDsH}zGQI]L3|7Vh緆ƃ" 0LJEq#!O@p072wtq>/aMu;TGMoSG9EϨ(&)ZʨHC%a1 â:cך>9<*2jGu2.)b#0L0OeK |9M;UL +!^D'e~ K 3]v20Fl5 5}04kOh1NF^;kV#S D(_—nX E(zX=$MHm{ɨx( vo˲L0lJi$, KHk`2B-:907 ؠ 6>)ޘI܍h3 Co: rx($ʖXȧ›voMFJ8y%Fib?r !Ǐ ݭURyyE#-An|*ij8>:هz}gD6eTH!tCPFuiiڔRc\H#H!㐟{M!NL;PھhA[S!0_ 6*$rEq(B0  Ƣf:CpU z0VCc@ahw1Ʀia؄*!n͜-m3CQ~ABM5@ۻ2Bj50} qM>d~$REw;FPcxDyDQ.4/duNCQ7rj#&J)p(u2uTV6u7(U ru eXAuoɉt2I(60 Ung\G.a.J:ٲkhh CBG͏BeYiaUBH~ `YBndܜȨ|͕y5dL:S|2~$Kaa|Y"ڭ:_?AZ>yA$IB#0ز,ò,RZ%LԎ=5i\4UDֺcL 2*]kEO=I{qJA&wA2މx% 0 >6oK;],42WIRC8 m_zN;D/8^h(uyK}x($%V$EkiAr^l+)4M˲ tƬ{/Cx^ ,_^oPusԞю| B@l\X MqEj86@Auc} _ c$(?a~@khhtSGn|pשr]R:5}e塪VvRu /1`GBF:8Ȏ\$/u>KN+AlFQiTCrݰD$\'5BjWR(C1&!wI ʨBj8cZUNB'Of Igd9^+d֦-YޓQ^_yׂUFQzE~Ie {SG:xjb:#GQDͦ `0mێiU4+\j6-m~ :Yɭ0 }Pyu1cWx6DdT,:-;fDi.; _n4M8kf4iR?Z9On{@duXǪwEFYPR(U;g% 6feW(Z OK~}~?*JӄQVBvB|J}$ CB Al6mۮX5E)=4 3-J=$`2ب1ߦd bzTe:TzԞ#2˿)6Jȗr#a\urtd4wcCjPwZ8?ZdvFkhh"!efpvf4!Թo_Ȕqe'*[86 v]tENH!ţ!gA@7.'OލV*\~,k+q>Oټ5#ׄ4' IR+$ JAYm۶kiByloGZma2R&r&fn^|NM&+5 >N+anqT7UT&MH#JF5-,zX8˲ 84y~^N {G ji c 즓R@ "#9| oaOގpmAiR;=K㜯:+[%KJuQcCZ:>?%/!Ֆ@0aA'Ե8U .Yeb@PB@.eϜ$(}_SIޱZ+1lZF%;MH#Lb.uSG@-m*gݤaϺsONy]k" QkH] bn향2udV'x5@x7A!Ͼ:0tFXRȨ3Yk>hya!2w^JizabXP&FǑʩT+Օx{==$ 5HE4rnZ:"JugҲyJO][еd1+[_(Ud[AmsFU$8`#"#( W_kSIyw׻D& " k*#ajM T׍v:;ma'ϾoL4H E@)te3B 7a|U6J_xl杌W f0 B KF@hK ip"I쩨}bOCc|KuPQVNRmi'\cz5 ,0F``ۼթ&y B%#DoQ |w@=a]O (fA:޿=~D Rl*#݄#SýH0 VKǙ,S8;?}pfdj|4PnVoّ-D͕N!( U7/p~},ҏ}߿yޒyAiƌD`Gޙv<\ [NITJaXuH!mߺqpJu])Uw0SonĎ'j9j$/ mCy_?HNF\ bM/g/}@Qa_X($I$q흉aNjO iHI9+*NNM4Ns,t]שV,_Թo hx1 Af\8B`|4MAY(VJ@LNnTW/pv$r7<[j4C#71φ/\|HVlsHoYkV5ug-:j9Ǿg>O@ga@MWJ<9*Eɨ|zH%w#|u ˯dϟ_2 yIt0 21t#0/="#)D~*[;4ƍQVfQma/|_}{ם.W8 EH 7q.sR!Z#!a,=nIĥ nh4ւ hhNB%sDp~ޔnse)kw&J#3g ˿ɞ?7~AF2Rd) 21 m~R۾GQU#o&YKvcSHDFZZTfl>f' lw@dqFL -ez01AMe$j`@8*лOOQEϨLFE$P/0F] {KF*®ȳӶQ ZF#GHuZ!iAuVUʥmynFy<I(UPdr n1d s䫏MCQv9/=[^}% 5z^r Ff۾AbN6k Am ؓ PH)ٶmT*G-:֧. X 0 f,%dbɨȥCg0H2[}lmg~h469nhOddiBIF*s֑"J/ih+2].ïv^V*Cm3 3?_0~xD”NL1[UN2*t{BF 5kD(~P .>v-%EPb+XeC0u{@FbJvtl~5[lzRhh>7PE=F*T*notW sW^[vs2"I$`ѽd 2GHɉDcH"KѣЉ*sMH#NFj8KvD]IHNoԴxkj5ZN93o= )Af`XEBL%d?\2*H<:UE '/z=률͂8YG e b݈̲<fN]3,?eUTxHdTjXaFJb0@7pXZQ~FV Je]hPX"#!R !5C\k@%2$5Ɨzy#^Uigѿq5\z20"(f`*o FM3uoԛQ~yzeY2$Je:F E#T+):Wd=QyJbjZRV}3g_xg L#PF+(Sd2RZ@AkAA3ײ105H3 "DB51h@RJ2eY,y__eXzX$`Q FQZk$JdIJ!PFtH7/*g{ֽ()9.Ȩ_z(##y1!:ԡ&U*š4%TGEhjVVC㜰,/Ʊ_$c L y4)e`NFHё6pKw Ͻg.οzdF^2i\/2*ԙPHE/ XP1zdCB,V*kbbVi.|_xc S@ReAFXRKdT"%d@_Éoax# ;(ߑ0nH8U`ld+BH\zQ5M%YEժ511QVӎ5M٧~¯.m_lL. &@ebhdq}drtsnr Ϥ [QID>bqa<ɨ(\(-2ҜO>$2dԭLMzk~ ,P@sEuyoz-  `B@f>WξrvD+E|ϲ,1ct/!PAXF ,4d-Zc5Fzٻq2Ru-uZ6YT-:eyea]`Z%t40NFHEI@ 夣 ^)|`W}?y_fz餆ѭq:)BHi}kag@ΞT*2M?}MV%dLҎ!˭%:l݄h\ί0ywX\+mDQT8{\a?Dth*$Y V^]qHƈ$Ң=Vիa۶Oy3~%$P5t2ʝtP &VneW<;.<"l oɚw#qt3 Å V|TcX9/5c$5_5Kv#agف!+6ƊͱCFJuDzVק9fYɹ}/ߺ_i8@D,Q. ȨXzqL\I_gNקk0(,ݫAlw vr_4^d,VyCL'EJR^H*jjjVq]83OpBeX> -CgzdT*R@{(ݬ?pyEn-FA0/!te7- KT҈1@3>ɒcEJ4FwJbu^OU*mu*'_۶?]Ay7ZHDF( 2|} JcG& ;JtQ~n{ɨu it_$թW鈒I@'c5:햌_Y+z}Zme;GT^_DpF9 IZ{$ROkH0 mnS'jקjӗ0kAytJ2bq-.0 ad~Q5 p0Ȩ0ӄ4d$D"%wyaACCcȈɨZsi_~eX[dE4]:Aԝ810x _±CGދvKAAP.ѥPn|WN$"`ti^622*bd1 dU&#uϘ?뗪g{܅+_nHP4{ydPRD" 83?2 \}(хa؈ȏ(朳ƅA)݃2iB!Rʥ:eAѓEFZRF?ÿQNUxF9 lcx(dQCG)H_zD-\=sB]7V0MD킌z@']y5 @Mvl)#2(4>(C+:q*R"PE7}_ `% MNU$BBoE_Zxl%(z%y<,x29IݖeZfjĔ뺅~&/to/n(%gHFЕrKUrt>S  |?~е3i QATEq!U/U͆&@Q#UkƥaYvCddj5SeMW*1 ?K_:wHgtʨyJ $Yn@v-o33rizEkanTQ^ѰA%:MF*B)=4 Cd!LXGNFӹkݵZmRma?rN/޹ d-/,wu/ @͟R33~ oaJ.>vA/EQt7( $JhX"=HhPJu=0qI9Fʨ|A044fQJiF^}FStOW%1߿ |"aaF]%*%!! ;-c[}b#V(ZUFEQU4lOgN=h2*W%ZR44#ah>#J)qP=Z!qܲsnu?Wyf~Wn5@q vPA)AyEH&dK\~Sλ'_d_z&kuzD%"ڌ((H4Ͳu! GܠAWMF)A:\ud0d%P mD4|n`q^۵Z^Vg9ji0.N]_ ~id.D2jQiuqdBj^W.ATхs'ǯq|•(6(*la)]%,  ZKt[,&уK(d$4i2]gٶMSJeqci&ޏ|"|:, ^/!AMP1(B~1Hh\8cSg'N|JѸzE*;,D=sTIF^H.wVVHzR2]g@*˲FVsTZ=lq0:vێ,ͅ,˗5gTd!""a"~`櫋G(MӻqqP6aG:Ii4ZNa0$jݨZfUJZrgqa?̷|_[1Ȅ<'#Ktd,"EXdJ`_&WO4cyw8ވ9W!~D1-hUPQkNQ*7 #Z; hUԵ_Tj]VkJeƶ#e6 ^?y'~yy5d@ X׋P2VP̔7S|뗁/ Nr+>5__?{4MW[Md=bȏ8TLJɻA$+^U&s]p-^;ݩAyt;JtRe^p+ʔ뺳m3 S]ꅙ{}lx~= p o=W>\wmB'Aŀ Q$a "\ug o@Ezܴ9?;y1"| 4M$I( i$i,'ͽ再9 MH@Z8Vei Ø "ԧO~]so_قp6@J t#99Aec,dEiFBLQABR)~ƂaHG ^f@HZihBx%@a Bgr|'?3x@ 5d\ B6עĤ>urjٵ !y$$ ,,ꑪY!i/$DDXwKD<1'>4Bad&fVsùI7Fb4*V]ӟ9RJ&HzDXPeYI?IcmyS*V! ;7ԫ4HCC&Voq199iW*W&BSB P)%(Xe c,S$/ U>zك0vSF HQB4Ǝ,irJ)RBB!)RJJj1& qOӔ+2IpƘ`,@ BFRIP6QaWDHC+$ ݫ~ 9{TV4Mu]bB(RJ",deR`IƘTd&!(TÐ@2ݽяvۿ[}jhqpE,0is1,C1HӴx_VR݈\#aCNHHCCB2:A4[A3A!D ICcDPHYR|q]H^vveΜ&" MH?ߡd:/_|/d4vCLԐ&" MHL!HLN)9IKiU6l |dMD44Q/U]QNꥎ}0{RC43[c{7'|ЀtbܧFD#y"닆VHY5uSPr= 7G*Om}>>D I  @J.5̰3$&" MH!nwq CLl444!i0BOt B4ihB3"D@%amG! MHcDBޫ\[fg$ I〒U? IiЄU S;°3,iЄqH $^%ݒ& MH={$ > I】R/"=4)uSA04hhhBx KCCӾ54444FX?4444444!ihhhhhBЄ ICCCCCC&$ MH4444444!ihhhhhBЄ ICCCCCC&$ MH444444 r9jWIENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_Violet_16x16.png0000644000175000017500000000016512140261562024170 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(ce@"0ahe'd5MIENDB`desmume-0.9.9/src/cocoa/images/Icon_VolumeOneThird_16x16.png0000644000175000017500000000547512140261562024303 0ustar guillaumeguillaumePNG  IHDR CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs  IDAT8Խ A?47*P K0 3S˱#SdLds# wDMp(G[ eVX D;U°FT}r* : '=F.}568,\sas<o'IiIENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_Blue_16x16.png0000644000175000017500000000016512140261562023615 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(cdH@ `b j0t4fݼD(IENDB`desmume-0.9.9/src/cocoa/images/Icon_Emulation_420x420.png0000644000175000017500000037215312140261562023472 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxi$u&Hd"/$@".""%RեTj멪>gN395̜:R-R(7q$gFF/gf=" qD~fc6fc6fc6f`6fc6fc6f4111٘٘٘lll fc6fc6fcH1113@٘٘ llli6fc6fc6f4111٘٘٘lll fc6fc6fcH1113@٘٘ llli6fc6fc6f411qzggo6qM^}e:155W:?s-g@53@ٸAJ"%li6f"y0 fc6m +O+ruD=\3` l\c` uw%| `f wӞO= f:ٸwL߰y_ۤjް'|Iܳ1?lOar4^[nhcchij6fcH1oRt4 {aq"B#RDTY[[[Z"ҤnjcRJei8V j:@s܌ l#<!\׵q,rBDcJ)4A ^/M&VJ)EDR!H$8Fb0(%I41٘7/:jaȻݮvuue1s8>"J-RoADR*B 4۶=D4I4"3 } ޅZmV08q͌"5EI&4OhZB\_.\"Z U0,Q3M@j *ކ%3@д^h{]ENc3,Dtc.2 Z %J aژGDr<8XGKHG;I9-rP!#9CJU9"#Zdz=D Dz,.J@M"c163@ѕhX"[!A<CrsBp\`#r<ə9#*s!pI |MBiR:``y$ހ"ڜsKYTDJ ;RZysg"@]ys'+,4o Z%Ε#-0WrH14emwz'! QZZdyDpFi&ok2DXao'@B=QCQ.p ,'"DZ i 8W=w~恉@*y^mD "Lk0CJ oDdpy !"TG`spoLCcUDQf6"9RBg1csHWrާ̟<^5>`$ y f:z Ei4q@iܻ9td3ӵ{K#jfhBkQISj< , fR*M9X["`%h#[8ֳ\ӛ1_H%g+*TF u]t-BJ$(ԝ])MLa'" s@ {[1ֹQ'\4ITVNFXx@*7 bWЏZ&$ѺMm}Guu]d1!iJI@WU-7Q1wkɾgmDk`p]0a ,ueY1FRJ9h4VWWʊl4'jxiepiRPy1AI5h t jZ*^| )A7 adٞlsMsXOksΡM6YAXAX9<B(p8@4g LnFD@gR ; К;ﺮo۶8#uG$cHD, vh.&okiͽҝT}`H5(8րu2QGK~oaۅsܶAϵn 5uw-q^0t`z{QulHqziֶ}߷0;Nt.xɲuw<_;ܽw1Up: x7ʣ?~zq4Miee%˲XӷxLX8ֲ gz˚_)*W `T b^pHx$m%SR9@a$MUlxVQmC !`fљ$/74a:A/ڶӶ탇ϻ/_M hq{o'co\xs~Ҳew]wu`0A6Pwx#s:TM /0Zv"lfAXa:NðymfM̯?6ex&"ز/c'_9-Qi8,˚P5v>ckC{ \@ U1c+B`!U] c|UnBДW"㓳aae t%Zs&&=#f8[m۾aM=p'n8+|wnsoy㜟,]]rף̭vo]\"V& X!"0/ 8"E !pnZt9/ju8vw. Cx`0C@jfXeN+CLpҔ"#cX2 u; ^PF4.&:h60*{Mttg}kO,,n{!΁HjdGI*`]?~ɿ_=~9I˲N;su:bF4"79m,Ά /nE-g^vrDe nv: y nm{뺻w+w-i.U/2Hd9)" REpg_=!sW]u4MSUj+VOE "#4aޥ\^/n8) 2VM2xN)\"BydQ \ʼT]eY8n7 p[m޷8p;7j,@i0Rҟ'Gl?},~7dyeY,:y.yp8L(ʲ,kI3T&EHEE+Oaw٤]g8c[$0<y"(zQ=!_RS!wn}뱏>y)e?˲$YIm/k;҄]Z]qJ"rMq9ng{ a+*u!6>`/z%!M]G%U__)CV䙄fq$;A,O"]9Y/: ðqv6|'>{jJxb |,Յwen_"B*.d7??xo7-:a)۶:s1p=_@V#0ٸ蹉y0 ;PqѶp]wσC{,/N'.gIn"*o*P峖_ 6m1KpYEYeiJ)] k(B!.8"ZVбmXo~W! a-)"C?*Ch(LqRCG$=$s11V @I 2"b  ټG/3_O.?[uҲSxw=lH CB ` ;rG@  # ER'=_؏9ul"NDiJ 1.I{eἒON{޲,:cyq<{7h4B f[^W~%`e7oYTiy"69Ͷ]nrdžDHd$CFc)"RݬI(2 "BgF?@볚u:4MS;-5>CiNceYf1XDT4'AٕhI%ԣ_gz$dnMu] 4n +8^(dj<[ qsz>t1pz(@hʷe6g9 AS UB2 b ,i~gO-}?|/bI۶Ϻ{˞ AEQ/b~Xhi%l\=0zQk"D5 {s_zǞ܆N$bI.5^, g# SCqcy_.BDiB)$!Dݠn{h\c /;T džj9 J0z9Hm}h{7ŹF"@p[cAn 65f\׵< Xp]wy7<!Ptmxx}~j?tsA.CpMj;6䭽IiJ!|{Wρ/;Kw^Z} 4I8 P2FF^vF癪 c RGF6J] mQ AT?sufCd: /b-DDS6 ZoT10 mwg-#[oeǗE|f!(ꟽ|Ya2Z00p!0vOܴv?~T\=8ΒA2A&~%V(张{6\0Z3*}kˉ98˲vgn R"lI Mu`D-PМe4VBH2Ͼ:ZBDN'N4 ƥNs/ g^fă X `0 IrQKi]o%(!3H1g4opnjV9nmp]weYm޵m߹I DtMTXR#%`#1ԉzHd[ N>s B~4M,deR%]o¥!Wmb_V3(".!DEJGoHs[ qYrHk5k;-vBU8ξG~=_\K"xqi:4iols$HD8y S)8C?ކw.w{V[|F;kEu/{Q$b45=M\jv7LUVV0f*FmsuK :A̻Q |w2a" 2lؘT[R~ =u/nrQb9\wkå>M~3+RAeqei$R#49X<޲J̀h\X^rʛb ]['+'5dUwdkqڮxV2!GNDZklSy^KLu:[p]w8{/s}\JA,q[ M]s7O#Z,w.ؚh- _Lr0m=?vGxk+A I$RZ |j2PK訠,DpH@TiTkirM2 r&U@mr.֊)بF$0)od1X:Ng-v;o}û3X3 `dBoMpZ1$ J²EBX 6|}G_xֲE L=[} Q6D MS軷~Gr fEGm`Զв  BHy8f˲v8gmwا~7Faf 9KGBeӋۘFA}lcPT7?$A0J$ͲLԝL 8s]gcj`Μ/uc=Itfz%Z-Sv Kɡ̿V=*8-/vajqέ)t([nm[Nv=7 }7M~! D TQ1*Iel>M0ȋi- 0%_II툞*pz)cuwl:C'\pD 8sˣѨ[pij.&m*#J+ff&Rvnku:}?^aS7m>g>{ܘ#XllW(/qL_i:K5PL lep|>'OH)N'BB5RCu0x VOroӥA<9c[)E o:4-*7O+]k9$K14X-LV[@'H&司VAv{د>av .3`sN,&NyN@hz߇p' ܼ@& IA;^4)隴JKPHzG=>vKpՓBAeI"MSj&?v{<Z* ,v-ZJc3Y]pnpVL&!A`vAZv֊xbތ]?qqyeYu]G{u]nxbAR(,8R ex)*b>Ϙ.)XanF# TAϳspo϶l۾h |=y6JR {6*AAq}pG|'?saw)SZ?QRkwBFQ$4)[ F$f8}MxqY뺋w]oZ0H(Y֚MPDFjʴL0t$>rUE'|d@9-VDj `gC/?C"a%Ii$Fr}8m'c6  ZCAZ)PɮF]&Z!lPEȌ.Ե3c1/q`Ӄh8mѥqy8u`bvѨY$|>n˲:ߛv( J\ܨ+6-4M 9NIddu"lЃSA1;eu< T>PDRJs΃ Goq]wm=yM\<nh8Z8kRåј]W*@I Jm|P"7 "ABrlko3_4],k`YjZ 0ɾgjjm`":-l;WlkBewnTQdV]ޚnPnh_ hW&a(uέ;/In7ͲL)m$9m۶,[e;p]۶]ι~aɶEt8RXzיtP)Z_f,MɽU*Ӑb/rMmh]U2Bڦ)˲,SJ,˄ IdYaOްe͏~WEp9νPG<|wO~2l̍LVʿ(7`%)sZl/CIU`{sg_C t +&eHȘᯈ8fMQp՟}wvfheZ@PN*(<Veu ڒ9mMe[`P89б}bp{{/<`,].nuy8V6=Ppt]{2?qnۘ."6-)=82tynBcq/ )PJ)"!D$H4MTiDZȲLjj m۶|w0Auݝoݰc=jG6nEJ2ijRGOB[(! 2?6#csHϽ ٫d;B)&}A &lxkj~C[ P& ByݲU_[XǤBfR3K.5zxȍ" -{#?SbC!(MSdm8NӮ뺶mem{PP9cX׶E۶,nٶz7w󫢔(M1*[SE.5)\ "d6 t01\lyҏ{h0ضQ),(R! C!H1IiEYBZ<3%[?Xehhͨ@P<'JLDeYqqвc=˲6l{v8m}¶mZTN,g/g0*S:dl^g4l# ARPZLR% 9է ") l]tFoǭnx?_C|‰S/=wbY)"\B54&I*s noleGȫmm 4J+&g!{uH$Q"BKBPgE"`v2Mӥ8JLf9ٸ:DZyq-:|^gnkj rR%qm$Q)+̫ԠА/SIu!f[[0|}[/>s^BDe1DzжeYm/n9]7m%/PB#|CIy"*w`T,[FA1YhD]eZAeT&0^" T4a.6ں{ǷgO yqoW^8ee)JeH8Fu>0ࣟ؈1SJ,/֍;wXdJH(2OU~ RdT@DॴXDQ՟H@T.CP+*` KڋAb:nFn @1$(0~I!r*J( ȋC2 ÐmΡw>S +/x_ XQJpvt.$c]SgN EQdFP)L:QY-(W G(jwgדV)8 N\Xbv(I.q q$ZH(?d߳&yRJX 뺗m>k/_{xA34j0=d-Q3P"ksVeʳR+^!T0J }`+o>S!C v9Dp)Q0gytRxɫR9u(@hiR`ԯ g)z,DMȂQ Twkh;몺WQYշ4%2bmbl--<@J,kd!mLDI H)Dg[^s= Wn9+Okwb;.o޾ -<7H-5x(U}HU4_`dy̶UTtR/Rd:$v`# sOM.=yt4(±TX[-=fLZ𡔂8h4<ϻlEڣ\q&9QrA9$BK"`EZ8TNeJv*rFBG1!Mܗȁ\ 38Ih9smemI`*> zFXiwo?8v HRAhyqu3rm$Z8|XO| WTkrQY*ʈE$B%T`h#=)xB֞[$ݶ9)X'Ԃ{2TP @(`!XQUb~SeXBL~R߇Qԁ 4hUJ`BdT 73{]:%8(G4([lbHfBqEQ4}qWӏ?dƁ;z# &!^ΰX1YZZqmE{x̨$R`gV;A[(2 mF.0Zd4N$j8CYN(HDɜ㘋zjo 5Ud,ARw)&C(f (ANh2* *8pYzmADQFL)55-_+ c f4W7RK7zbHo&" t!TJ)!hEѪ뺗܋N]-nnkؖVUn IQVWyia!U.%R;fiIM JLSu ڒ^d>&O4YȁA I-Dܒ=pUђ*K陹:igE$97e䅔K192r06MH +I'$E D8i ZH倅@C fDE4x!dY&\$I?9s׃DOBvb +!b[a(\|  \ySYLEMQ=w#g:Ti:/4N76#Rԓy?8 uޏߡ^ ѩiSsed+sFT/r  i"ƧmS@u&zҡŀ,K/I,izr9]B*֠+C὆U9,!mg2\ 1 o\Q!2)dޤ>E$rF4vl4)jj`LX20T^kpnO2)|(lWJMW4Skh70+U3 ~oAr!Iq,Ky] DDJa~3@z뢤c2WF()IT+V\׽+x}еq,%A-9âƅ_,BhP?e7R`[j}Һ *)Tx̮M}$L7#I,UꛇŠ'"!鶝fZ]+l֫K3CCk..ƩFª 17`\P2=8W#zTկ$= f㍂ѤY3Bbf$Iq?I$Iα/ɫ'?8hK@ nʮ_jPV BVD57TDX)%bh@ebtXR^`rNt"#jݴMD!o;Yt ւ,] 5b4>m޴v"'j$ĢWVu]wFdN~~<' I3:MפھmzW*RS:uڠ7Lɽ0IJؤR2DWW<ϻ#xlǎv@mב3jEȨp#Q&EbNF3$jYT㭋=#;}6M6 =sQ#2jHc=QќuU"j|RKh]kPU[ةh qѷ`_RIR8,hAM_uMQY>-Ǖ{]d`vm;RJ(b/iz꟟8߾yALt/k*&\%me@Zq,Dm4&MXvZI"i͜oAYMygxJmYJe[/dh/\RTjRd4J15E;3r9uK/䂶 FQL)B1U7l/ MJ_J&4ZB4MS#J/^غ'R텄4a'jPF?5>Q[5Y&:M2ޜ,BXK*$?&svjhgZrs1ԨJW5DfdNJhŠ!z&:{q|-{{!] Hل#5!2)^:S;;ێ{[҄ WSyϥuz%@%yl_%Wn(` i@j[4Y*llMAh LMvmo~ZΈAy>L9WT/V EUe:7)W5 O4{o3f::b%ґgf[ I,Fa$':zkpa$^}s[/ H-`k|I4iSg-`Zv!L43ww d.9[\h5 şh&xnz(s"I]'3jh BKK3&D(ɑd3/ΫuшcbžA%&~Mڻ-Y9[0,G~eƒh9I(MӬ;z=Roz ^Zk}t*=V$dLW6OPzn>>cbW0}J4K$$RGgٷpH}sLCڶW%ҩyUm;UxUg.w4_s(ojA\LlbfhXk#)%ɷU{&kXTl9ړo}Rm4qBjTdp6^NӴ;&另Zk -l5deT{hڿ'(m:izoT$N^v]$y;l\ Фh†&<O!`[&8SrDfhjkzwL𷣆 6_wڜhJUUPB v=Srxr= #.kBR\ YG ʙWWu{h%Ib]M[W^2i i[DJoz&G}m3˲rwPAYQ$$ MiJIZZ ڽ!NKI4:}ϝxwcZs&y@cWF-پ?|M9j]C0AES hk aTHac)C0֣qTM>ǍFeN뫥zv@m\ !FYY ݞ|u 1Jl$t.z뺾eY>cR*Nd8$I(:oPz;Qv։. t:aFF*Ȳ,#U۶W\]<a8`0Y)&׫ X3SD$o~Rn4T$'B]Z;4AYZ4&Ne\Qqkq]rHj[ gy 2Q;k3 $֗ ][/17z * TTRՒӤrp9wC48&i#A6780'T9¾n/BUmvy|tǙ,k1Ze K˜KKDSi$jۑi U7U18t:V=[p]w8{[nB\f,mKA0#q$Ip80M6:1,yg{:w-|=6L in-Z&ٚVkȠ˪Ms-<- *a+L?,N~2_J" =rgbG`*4MbB!XfyQMsifhieƒ֊AIsl-=" cmہ뺾2&"&D5{ɸ01뺼؝N }k۶mlY&;~[?WRJQד@%I"n%f0\Q1BZSmYzy=u7Ywq m:;*7'8/?W4,mYiNEp|lXAvo,7f`Y Pd:a~|p@-B)6d}ی?ѐǢ|M6uJ8R&?+_~T75 rx,l*$+"D1DZȲuI\[|[aAxA:"m{ѲmolX>zxۭl9!\'.*my^FeYF8l(%]FLѼ:An,km7s-IPu݅>upˣw_d-K)ElRv&',sCp6lwn-a=Y v @J%02s%ANj"⫅ft4C#Se ,smTB I6n_S3)"f1Q LT*&2o]_lf00 \9퍶moo۸}v=Rd_:1/~wܭr񇑔ryް륣H-//-F/1Js0Zk'\Vn]q6۶{}?6JR'/ɴv{ZWΜ?W,:'8rh4~XU,9/ðv7u:A}mwwEn~f%A !ղڰRtM3-DZ/ 2쇣;2^9Z猈҉WҫGUH.!,5 9.m?QFDB)%J)U\HvqƋQqf3rDf# +]^+WP$Y{,pts}L V(!(VWc^@Dvcym'6vX|ynܒhRA\@ [vK3c^U1`Q̲Lji e6i bN} }?t]wq l,km۶=߹pa^bHAWlpz[VyN%I 0ỮH;e#VL"Nwtݲ}}Kp69CUc%=iz˽߳G޽}G߹pONbYqι{ua.w:`0GQERr앗l>cYu/JEh4LAB+lG:v{^oS|cO<[/Iϯf)0THAzX35xr1vi ֑0o0J,_!J(^$Ei%EJPb7sn1ιsmz8,ua-~7s D 6| e1 Iy_,-v@cb5RkդCc:2*ZM-nPj" C a$כO`_9{EDD! )I)kFtz]Z\aZA:ٶ#mowyC7u[Nᯟ[/("JSe$t< n}ply8aY5YMVv0s0츮hY> VUte*SJ:鹚J316ow^|c_O?Yz,:yKAa8 h4ʒ$IH Lmvܜsq^xw|>e/E3*Tb5?4J5߳ JaBKul8N"ƘrpgN~gmHN.z,e)e_1qDRBDJ!2)e*d>2)$")TQSQMб]3Dz؜snYs,r8m.m]C۶;2Mϝzٯ.BoA!ش s!;f1 T2ceQZdD-`4 5JȠqEcbՏ ա$0 Ȇ|߹08,!B4(ל@y^9q,d6۶8w=c | #,7P(_,"@?U'.>|ܫ,ADZHD !̯)yYEGiX=ϳutqyh۱Q,#>Xh)J/'lưw]w|;FG_|9۶Oٶ}q]}5p88NáHT !rILt8v{|n'ΗAz5]q`7>yHV&JQuRʢMC20Ė ]fh/#-U~AӘp,_4-bpK7~Gιbb)F+,gYOt(˲8MXQHh%i㮱V'+8PQ y(*纮ov8Nhvq㋖55JWxd -=]H"p  )>*,d;ٵ&iJX25YKXt 0bGG}!0`1 T@$ |k?ê`, O9.9"'y=qh{؛:|}.-ze)WOB$U,[P-y-$,RIXT:(F'X~pqA z^$ m5m9.J.iJ5 aNF۶wxp(E!x \bŒݑabf;}/K}7^˲m\]p<:pRNHE 'Hq/gY2}Ws.mSt ݳ0^YID\i*͈5-Q Q)(` doݻ/k^}5(LGd(i&]Q5HW 3Z96ٶM[g,:*<2r49 * x*r~,AuO|pMgo?XtdHJzsS%̍DŽ ~5ԲKE 80 3XZM!  D8=o͕'.x0$2i4Am]21BZe)ߺ󙂁U.J*1" k0uQ[>4{K_ ` 6[_{KO8,✇ly~{S Ah&ڤFRӣLkI9#j=ܺ\ \A|$WW: 7-̿i48L$I8^Md$IBL!Z@)z@VDHW{ $YqQ\:e$Fgy#ɱsǞٓ,+X[J"LVhuTm%`P]CJ?xX b P<H7{cŻ_ض}A)0,۶ٴֻOݺmMݕHpa@$+R Hg4R Pe7ѣ9M9A8 V#$%!ez]{s u7_f9蘩@g*V/!,@!j!WbѦY,I,$_[(@"@ݹǧGѿZV|2ιs{>ؼ@PwOGpiC@eʨlRl LAIH3 I@H5uv0DHH2$R@K䑋-(qy HgWyǛo̶w@DktO=z6 Bh)cLD,Kߊr_?ڏPA+ܶP㿺m9~f' Lm@dFR[JHii]"Q3ZLGK\Sd#p{*鳺Xv$IDZynJFIO=Xێu]}/~O޳yO7RJ&0ZifSZ[9\e3K GYBUB†?)Ո|2VlXY)Cٱ)0F s0C\8 7-FWpxf8.EQ/rDBT4%9+.W J \BYi$;8,FBCDtz"؜/Ka#"7&p;M̐ &GUIA9#"&Una%%D%4Qe2D2YV)i dER\ Eaޤ0BmpȄP18;ɫ7R^ʲr0 ,dP:_/nѶw/UApQ( @WGY> DAu50Z{jaid\VT(h4]٫*m 4hE&t?vEW0 J!phZe箩(!v:?96۶㎧~p~~?SRLcF  P*vkS'Z&W/OLk*0*#=P*< f{NTa黩ʋBH:nq~KawVC )LY0L@WGZoRi D{Fߩ5"BmD1Ƅ2#"9G鷶-Xf\ԿZ*P2b'st̠ %3FT~tGo,{`Tl*I堤x{^.:*_8 \׆˽;˷Ŝ^ qO8K~-ҵ!Gn]]}q=;NE E.b(&T>Q`XHk9`ZcTMr92Ar02Z@# C Rfމhzh&&EFjBž-D#_>Oiu$IHJJ^OZZ&8|-۶u]<_gwt‘U8=z#eތ/ t_XX_> d?EpEX P!(VHHRI*!*tަ(&uj 59ey(TjB ckF`/ 0'u:8 u.)IT6י +y=|[u?}xByKY-;NJ]a%mBҖlw%qi*áb2k%JA05.1amۖ~6mܶ GFR@<R,pBw\XQ󠪺$,N ܜ+3NXȸˉUdCFTS(ʨ"z"S/2gd|f"7BU_mIl! (9߽b"JRh4JCDHW/Zb+nX+bf(v+%!0 IdY s׬ӿ."ew%2BP"npg8{Wo$4=)'qNa5Ղe3K2:j$0Z/h `"b4i94A[`b.&hPD 0*sFUnt'Xu̟+)=jIBJ3R rF(QJppn !6S!L%Z ]Iz_1I1iN^8N(tbٱy|k8=׏TNYSs )Bs?j1z#4y-(@\P <\T"o2GZX @~Y 2T @HBIȄ&2e R\-[y; Tw .a8\yޢ[;_ػJ2?DjܑZAj>/YAux}lPsG0l|AL2Wi- 5ZN &h4eˋpQI\f7TnyW|Q,"ej4콖DDU]i$&3I`31mv :ΎNz _]A$*_ 6;PQ㣪6\*7z#(g'R MuY%F?KMR3aҢ$T &t-Nk *lN`AHƢ8e`{ L7p%MOyMr@_vnvg׭?n~v%Ӌi}7$T PB@Pe"G~Ĺv-*#%F3 dhGkר);jy6/OM! lI/O!WйMç?k.!R"j'_fFGo%S7됚Sw0tz^-a# ýq6 tl.$4O箁apTt50nREAግ 8yQj*s\+Xi;>byzabEu h5S.BPAOV},HAy4{ÛǢ 9dVű;B.w:A)g-Qv|}+k-BZ̛10tm tl=K Gy7@ 9} _X" RS i& ""3B#Gu=f] T半IRMР'T{TW)h&`Cӛn,ipQʋ2#`jxpou*2"bY oћm>8 qǛQR3Bjle"2v: _zǶ;_҉\NAD2UW`Ċ脪C2'듻: JPUgf@UIKe6feRtt!V4@-rǢM1wf.D鋥i]QTGF L;hp;|(KA0(ncpR@>TLktdȼ7hٻ +o9X=[ZDLJ'=+^+wfT*ZjgSј- HHQΨv$ÿ!cU TT%+#]}̣%*_pXϓ"ϼ~xBQ9'DKO| xc@kDN8&R ^zN5=<#ۿuz/A$yܭm|UgFFC&&7 5Nds`^oʌd*,iP bo:U"  0 "SPRIHI*GTH$Mr hsirLr-s] pUii-iёv0u{{]50TE T]AHAv\AQP7Kc0 j՚PTg65(}AhwKnfOLTSۺ~}qFs1FZ&6 ڮ#3<) ts 2 Y|4ANk*W%<,P[79~wޱQAQJHF#%4w}Wr1]`N-yWr}߷ݮ6t-AٸsO?hٷ A$ Py/#Y ]h["iaCiTa([m~1r <TH B()zȨ9ƱҤQ" ȨpgP*0ҏMM$βI;[KU;p$Ie=uH&A3@~syeeM鋩j9Sa U}R) TyծKUuG !iW^lE*n<Rj ul~7,Uv:#w{O݇*ge2oѭ:c,Tm.% TeZc"H"#֠L0RBA>rn(7HӴvLۮ#IV{/eG/B,u:~$Q$b0Hhwo!qanrM7/ j m䕪9cblͿ( *+ &F1XYjm,XU\8&~3U"hŠ/T4/Az.Nj}5XZ>|()T$iۯ]x2(Mvlnڗ#h0 ݹNNsϣ[||G/' E $0DpN`Ey8`8 ffQkIU`T`);mX3#BdDUZBXRꂑɫk@n{xu,.w݁n˜\ u ϚIY˲y</ 9m_ f室`LiRW9@РB4^ADq0"ûrXP׵Mz?hQY!UmWJ*R* hz6>;sxsr=Q*,&b'y]i\@1uNtPu'9?ʯX y8'i= FD,)f?-0"2 TwE|*MyPy*O$:4||P|w'8;3]Lt% ( g!hh#ZeߎX{mx;c~OYޗ@*ȧy@֊Z`A!Aik_A NR|7!$ 2VR'Ȩ~ݐnVY3#ց&p(ꔌ<L!$PJI~*a{g޿?NߤB CB^pMR Mf#>4.AnÿB>yTqmRZ(RetIadhI6m +h:+7SƬƦ|C kk/?0`3!!9pwm˻,!Nzq]w<EQZ[Rךq9m[Xخ;COr1Sp.+Z'mȈ&EPk7Ǣ¯ }! Mj zH*ȨV0E X* Ȑ+Y9'Ia"DO ݽ3x?EZPYIJIq$j&哮)0jd:˲0 ^t Als]wͷ?!lOGiTHSF(e E[F'hDNh a.ȵITpi?02Tԣ$}2ql9_#ʆr*28"ڜs{G|IJȱȈ&> cޗP({ jTZǵȨʩ.2Ī;UTIs2rfwkXH0wiO}K$) Twa,Jk[XdY t:any{ٽ [wƱeX_A[zd|N11}>0j8MC15]hbQI$6cZX#kWɥ&K@XIa`)qHоlN(R $IDK.ͰP޽E8eȻ7uݛO?Ëe/  xD`%}3z.4"$*KhlW5z~p\`T1Cʫѵ T/~ŷnf4ʊZ$ZqFH$IDDZm˜3ݳǾԉVWN9':;n<Ye@d+&h&ْ5 ib^lzΨiʅNJI;J2'aju2B\0;^|o/^$iդo"(Z)z^ vw9ׯ{̗vx1<;uk ? }]CxiHc| :B@ DxEԥ1hqkbZsP%}`mRTP')^}+'<'yWdr(ۓɤ\?U~\SiQU}ngZwn|~g>KjD(mÂi.z@KUKڽ["[Z׹/\(Vi6I*^k$jƃ2FH^Y¼ٸ8ȣë_o_Jօurv.3yD;:ywܻ{kM~۸zktCDU{~a6z#?{F4w?S@IJ=e6?O:}u][<ϯy~s2y>2İC:Hf-ֺ(1WUUUL׫1FUΧ_}O^w@I6'œ`Ie\x}f[fy:=6gE7R 9"ORI~mQ"o$$lp%; gl|jUXk%"Fsn(->PnALU'1U%zNPeO~?'߹n^ YJ RDKh3kNw{fPb? @N )[8/~0{}GϽ ^L&Eq%TE;dy2_iMkmdɍ1\׵ZZk\1vcn};'Ӑc IR FlO毛u4ݲa`K0>BϬ_ 0WFK*M̰PD3DTQb'b{: Ca 3&aC {ڿUY㜳Z|Y4a6w$pTwo=<^1=I: v7u$!1dž*.O-I?,P7~=eYOۓd/I]ו18,V*Wp`HZkuu]WZ뢫uY;:k_Ꜻ!RP-)QS7tvs"Z_{vzF y;5-T)BpM3(%l\MKrƀՇ RDU9H75М0_9l%${GU%k5Ƹ $QtYI4dw?Է7:_{uo:T"q I"/j"۬oscv#786D(.c`$Z:0j+BI pz7Iه(!~m<_,J7&N瓢(rcLmѭauz}S9OaV Jk¬RZ{3+y!ޛk~>r~翤 .ԕ\nTW}pX -| v>SAYNJ dP摃dq'`[F~v:NAygTI.|{i gQ7 ':΅4Ms_c[#~-2RvC[gl[n^mC©Z?`0#,pǪR?Bڃ{wG^QQu!!Ĵ,X; ~op^,7`sdAQ0pȑu]ƘD.'Ͻ~彇dv,D,94[D-p80ky>BW+S0!'A^a Dib gYj95uhAC8A LЌIe\S_[F9֜yDهKZ;JT t#O|KteuH.HÐQp==;xڢ y02.TFI^'0Y"ʔ: ;_u$W_(?;*{%L.y~%x(qUUE]וV`Ԯܲa@z@kqp^u -(眳9XkagaPh}or:]};~;O<BӍ})Q-N]F7"Rm^T"5 2%DPCқn%MKBH9$*31`EȘ x}%@ dBPv(MAO9ݹ pε;J#ݪN&}w^/ peYƉ|?_}iH%<%-Fr hHm^RocB#FF#;43Z(54U|(H@ )TT~_~wqo>y_L&FwE1dr#yua7E ) d B9ٵsEks6e|t`$藺 %E s%1P {8h3~Q8^ @YF)CǨ^-Wvx VF+ɤQЕeYTUUȴ@ha@#7@ZQNk-8<6Pxe-7wo~|< !Y+y5As9Xp3E "o̐!ЦxU\;&_6$h&/Eȼ΁g{J8lDO iTB˵ "(V%D@}}p<U:68hzR$ ,B$)%m+s\׵#"i1gB)˲e` ǿ7~={!htc<ñqmK:`5~ߤH%\P[poyo_y𯞢~  ¸ȫ(U$oS'QYB(*eYƘ:x6VȆWUH;ibK*$^T|EZ Lp-1cx|勺g{@u _VvxMetv4BK^X0OMILD"`1n}뽛[~Eq?4cɿg`b]/g`لĪ[Mt0^ \"M"VD>ÁD8Qt3xgy笵"Jz6,,(IʲLi*$QIB)9'[k "[׵jYkEQ8f&kmEQn7Qޝc_s1nW &`[Mթ978>r0"%K *" ?5wç.vӱ^K|GFA! ET6'?oKy_ǷR@j VVPw@nn s)Vkzz|.ٽO}0<YXch1&\oxrb;yo$VIæ#cL%NdYi%II)JLJ%LJ!R!D@$c9[ (΍svΕ\_a1ǥZWUes$I7,=У?7PYNA7>:;u[ :@?h0b0\N%D&/勿vpŪocJ)eڱ'?ٺ"=NAW#,װ$1͗QzyC^Fpvm!Q"FЀY!E$wp[LZ[j)S-1yϘɹ.}F|N= D B*8E?C\\ool{vƿ(+id02Zdz7^Hf|R+SFN"Mk/ῩC't:Z)%$ɔR=T_JBug6=-R[g3DS\|n̜[k'ƘqptI+k-+Yt:n_/?wͤ˗AB9r$QOtm!XYn|`%`$]IŨC/*V˧N _F1Itsw~{eY(ߕ܏ J-o&=~=ح=eyq<<q(T.hQU:]w?UH˄ mWIX…B|9OkZcAɉܭg޿ %@JrZR̫xe!b8bI&o^•?#ڮ3uƅ$u9QsnHAvry "\4L`xO _ B 4 &2ЦRj#{>xNn:6w ڡ0243ƺ8O'>w+B]Wvtvuq7s}cL̎:Jn'OCWVF f[[@@zeP4$*T/{j[5LҟKztX);'9ꣶr޼6&ڽP[HP~/%>/M&kf+eYZkuKν A20/9 13GLE<ZQ4^-Uk7.}_.zh'0kv`K f^7i>tFh`tP(vQ~O?{frrh(Z1RJfY6غ{/_y2.HY1;,&N0.0׿|2~ZWۣ<@эʲ,+3WE.|ݡ裪 鈠%FĒIj132fVy]0>=p\K*ĎWFퟝ ?Zߺ[??.UU]/vY)jz:F~.VbԱ? J8c=M(vK(;/鷡aOmvU. ͗_"x7ɴցI|7>qlK+"D͛%N?sOǗ'xZǀ'skOshϵE+#?0nx6nAJD`n_Zx<9<˲$WeYNʲܭ^:;%go'ʈ#犝?òO)'ɵ(Fk{{{ʲH3^Bta o=À"5^Ӯ])-#%3CkM^@"MNYk 7+ژCĎ/Qۄ8 T"`/¼U嵲,wʲu]FG" P)yl;|gW'CP82[7,+y4]s4^ $+H2Z! %-aR91xsiBta#H'y_TiFM5JD)D;5xfбܢߢ@MZ[ՏڕQ \qC#HWpzǿhts<|~27[h,23O%=9Wu9_~gF#{'ϻ(fV*Fbپ/+`̑pΙ京WdP[)^_%%|$GP,SJA)%RR*;/mU&u *EѢD>LҲL05%*@{7~<WUS~l]lL휫~5._տpn'H6}p`p,ni*q{5(^#6=ug@7xET=A9E^cfʮ`y:br  WHާqQQi)f   MJ«ΘJT?m}DAh27FۣhTeio6YIUU{UUS(y@ۢK?D0jVqg͓7nJ$RJ @Lpt ~_jx!J%S!EV@J)i*,K$Yg'x+~'1鰂k+B"6$*n7~qjwVY{eYNeP̫kmZ b*so?ȧDy«}hJusG5!]3&Ո .d@&'zdF+n(TO 8AGEXp`4odErS3.TCZL.TFܪh}z3)M3ԼNܠ6q8z͝1O}H5Q "L15ZF Ћ"X&ȶbǭkn !)wPWп':x|u4ݞL&yUСrmE%ꔓx0sbeE'X t8Ob)nIu^}$ F @:BL%ZLm !8MSʲ,IӴ$'>YZ 4hV 4/HK2F00& \}UU~bN[r6aP]sNп;\oYL0k3/#>,M A]S:sA`zF"jWP0 KWBON}d4M;n7L&T2geucHwP-Gr~[D iY/Mc}jpbJynEl|IhL±õ}'QUNUU.ffQU֚Z?ͭG@gIZi7!fWGuD fX!y|y)vR\_`TF>[M):YP`ř'nEZwsuOcmKKƇMUDXn&>J)dY&,˒$=p*;q*SnsൾDfsow;ouתqƋ,ChvE-ltfZWóB6@_xgTօy"'#G"h A$! q gB1*0 /$*;0abw| YDBg[ssc כUj3껶Fz$(_mf}q<d2<mm0ZH퍤 1,r\UծVdae o5>40敤D"2컍Rj$I?vJJ k֬+c H3+[d[ȿI$&I2 DVA v)<t6VH1mV_LEс6Η y̛$oTtDJAICo_=?I$ѕ8ZEdWkm]UUUy]#nҟy=z N=&ԫN&97$ɲ,KR^&-#qEGL#>?RL!${Rᱧ>UFf9^kcׁQ;Ϧ.6[/!21 7d9V8)Js!hV;LϾj=H5< !% <:,StMj`aP o4GCEi;he)ߪVdryJEZ/*b5`vUBxK[U ʟxԯǓ&ɕht;8Z̫W%g.ucn>}+k5.|vrp;gAHZ <3mEk蟩9 ,):QJu]GJOfo& %Ƙh㯻ѺD07.Bܺz{wUU5Y*e&Z;0!q:t߯/rF!l{0c}e}$PDOZ/}EiZ강Ik66I-Ќw;nqk%{[8=w`&jܿptW)6oɇNI]oL&x<=LFEQ!tyQd]^\Iku^w6r aQtpǮob%IiԢ햭qf5?׭?3sGGl5Zp"ߖR1C'IO>{I%?͸nM/bn,ƗE_b 9TK2:VG*c̼բ]'+k-,0mޅ_N/% 9qBtp qKWe/wYX]:f(L%|\M@^zLun nUtmjPK\w F zHL5 } } o{m>Th[X*͠s/Gɼgu]c572@B2¬ ;Xkɵ7QOCtpE|ȭK&| +XthOiW k0Y6BU.S/ a$5 *z&Nd2yw<_7N˻,Np—u]OƘOow;91HJ'`$B{} Ix<1vC*9wzpQ ys߹P;>@cq 8$$薂{~?ݗ/&I%Il4=UDfYE-'Q2)Zr!%`$$IR)eGJKl{Wj`jfW\kqp.0 )!0zulbOkޯ: $˦ +R)]k{Kԙ.Zo=6XnXݚCQQ>#=ŏ W|0dW[(W~/ 7'~\!\3*k뺪:Zw7  }GE05dsR$bjdq&B#vWlzJ6%1f3ZGN~fWRZsh"(ln|]W3'>id*`k{pR. QYhGSw 1g0j9 ?JB\q ~Lym]>wI7*˲ZWApHU# bh[d΍1#k^w ~ vf6=boJi:da$ $@JSJeJD!sˤ߼bYV2#:D%v- `a Ks@?D$R*Bt?yZJj94^ǰD'6˼'yoZyʲ[Fp?.nՓ>At7 ml H;е=4r^-A q`w> 80I$q2꧿G>AoL&N&ѓ.ֺ谴<~Eڮkv?%9I1 FQ@D3$5$BUw7S" 0I3nwR*4|[88{lZkZrXFzszJ|/{ H*eHTH)7dfJӔHE၌@GQX!$):#$!b6(%)F'$y;8;<~2[CJ ɣ'[4kB i#^0 H+r7b`+1#DkgֹǚB 3 u~GuRp=-d: x#^񵺲^A׶9 ԍɠHP4Vϡl|ȯ$C~P" ΎQ/K?% P2OBuX=p[J3;W;Fj睝c9QL X۹hC%.Q|>bb dD'BYsM"c,lZm*)c\htBbf2xYZ\U&^Ft #!N#z$Y)TBDRАP` 6?<'C5+ %yFD"%x$3Ó^Uǁz='n6t=Zϫh %P߾ثoZk'Ƙ2,JGqn|ėTI889&6u׀R߽QuL+erx*,Iܼ&#d w`G5̮3#jUFqQ#b C-W|q@B|,@`G>2čpEa+I]o -%ݪѼ+òhtK*ye 3I'^}<6~&}OM-V fD!Q< iOH)i̱B\X [Փ_^'z: I`5Gj=oq72}BAE1k&-Xw80jH +O"!_uH_Jz-.}D(Cnn :=P+0PK;>h5ݜj 7!%{k???U8ہz8B*Kd/ g iSZk'ܼ^ R ;&\pԠ)Km (RK@cC<Ǐ,&80޺ZnUJ眹ޛn^wo"8@=@ՁJ\n):θ,/nϺQ-(8Q<s/z+(YuH[F*b̅*O-*if۩Q;%',B,6q Xa@> kGOLm_ڃ5ɪQH`9Wk7`+!4ve=U][5Z|%}qy|y7=@N{J#~:_2&>)HKQCl||ߙlz7NtΕι:@rFBwOֱtՉG;Ǿ(K6T\QۛH@D7A|W~LF&^0}0+T&ay< Yc5TZ;VMŭϟ|cu&*$ P%LR4M{!%Ci}nGGL= 18 6 l-~{FMA{m&?pdry<ߚL&{eY2ZFnwkjq.9ʝ+uiͱfWV`&0t7t S[1kFH97f΁oR (H@H :QH / ڋ7$  j[((8os97Ikʶ7qi d,8Ŕ jàcybug ~pč%~sMHCE [$ $L[dH0,*Zuf>RI6C0 0Zw=$Z'd@4*߂Gp΁53>l!C]0:B [`H"Hű-0bwwvMí+>D[sa3Vś/#傼2u \}9WXk@ǪLh%k9ʲs !RTocw<&9 ӳRU̮0&5H*L^ x;(ey((ȣk<\LD$RTRJiɲtvzNhNqO<(}`s{PnHJ~ξbQW'ɵ[d\;sՎ{]o$k r97Iٍ&R-S Q,Ÿ`8"o8F(pZ"Tu=1$$dWB MJIi<:.9 !%3 J龱Zk)J-+x|pmQ_ %+)Mm<4?Zn=\|3'ن\%st崆ETJk |U@eοFC4lNu]W Ը錴ιqosC|-o;dQK]F oC? 3[/Kg^F'XoZ۰Dp@ʸNHY1Rʹs6Ϛ2gH{HD-f̞umAq A BG)0Ri6hlM,`h5|w`?"ŠT@d߮>wnGNW[q! b9`a=Hs@LZkY$]؞0ڪޯT!x@!'ZYK0Q8~L6o8`㵶Vz eJuqCpιZ[Πv #SrPӹPxv9rDPkxn\qܤ`~1Ӄ J\2Dg(*R }*ZLY?2dx(3!b/L;dpGzf >p%Q)UyiE۹ lpm0Vu-*ow+Q4٨/vTv(eW6ɺ$L $\@" ۺ,)UTr6دXv@%QzP)@X?m؟ۺ|e2u4*"/˲}"t-bhKت#vΙd*H9X {'䉇p;BH!\ޖ ȭu2QRp N&+޽($A>*a-;+'0Re43O~7 DY"D];ݱTkoDa^ZKG`W>2Q*PT]ӯTWh!jvM7(B5#fy VkMߩ(iLwho=$! æd"!n@7=(@,RJ)QI? r޾f`4(F;8pq$￀ǿ={ud2ygoort s^orXUğf1fD)leoo~JxwW݃Bt k`7;3$LRrVKTMkI^^ PWajf)R 8dZ F:8:q; f"Y!2g@ M e<&R;5dߒ!@vj>8Yަh8M>hni#qTnɕj.zGQ,EOŜdn OE[=4x] G9R݅߱RdyDȡam`Vud*XF59ӂ'-ZRȲLop/),cO{;Lw FyCW1H/xx/&ξ2+1X.^FezE}>1ZG0rDa~In\y!;SvIe^udw Fͱ;:Ab7;@/eYi\k0 ں&aCx\nЕQcGMea]'` qؼ 9STDc/Q j~}k&\zAI:xޑKрRkox0n{Iab/aơ-ۃܕ@-n5@暑k $S0=%n=x+iSuM)<[FMUHyoj\ 9gFҪ뀩ʠx !'IBt$x|t{F1TzL[Px<.  2Ȳ iYi c|{SN!R'U&O){a{Sa:~w\ HOl(O$ 爢+!*ւC\v6P53WӃ){wlof|(0: S{JQ账*¬5lX#,aok2br1v7ܭ#6|dSǽ)ZtH?H0)O.,8xADu #põivei`hykTFNy.62&̫8f^ΰθӺ_pJRJ !2\{>9;0ׁ 8PJЗGߌT֗GZu=*˪Pv˨E=r[kֺjRyw{'rbAX Q>ƂMfDԑRVj Zk0ZZKٺ|'Ohp$\mT5m`2PFa ʼn#"_eE5i%"HѠfrmN Q8hKjP%Sʈ\a}_UH@j4%0/14̨ i9ًBΐ*"rнEf']H۠]vwG6@[Ű3+Kèjah"!Y8LK)BΩ[v-U;OnΣ(5@*}el+7kUUu]:rK.5#Xф_{ Y>zbF}=٠ dٯ: 1`P#ȄI| %v \2;-뿃wئVah2AH8h0ĵzB4EZQS15/͜os0C=(-lsuE=ZӚo?[< ᛊKbX57AnQ;Xivьw3 t3wQ`k ̀ќ41M!R$H:vrX[ui'&"1#c8wUۼZg#ۢM]u]XkGw_*@JAY#Qz3"Q$BZGiCv)Bv*)DMh% ZW}}K,}_.dX>QtX qj5U(0:є-"!.hZ~ i鋞NQM- iM#;y0x57TJsK=-[F`-Tk!\Fr{|woح-Ipc}yReH=588gBZ&jh 洋϶轐`,km{޻ nz)H%pցD@(vv9\\QMqXq!0 ڛf`B#0'׸ZhdݑBV܆,X!#c?x@X>_ieIVٵQy#+$!c'DնE`333OHO/<w/#^Cӵ^GErlFU1Q+"AiT}$IDҸPr[Q\h $AJ gι2dJ Y6/Z81^Uι9W޵A&J("᫮n) Ɏ穡г0#끉C8$*b:^zdF4|eh8u{0Jih-sb/(u0HT~lgRoHDeLfÕsmV8'-mYEa۹\ۗ0Moo@͔w FFȃ0IH`[fZf  hvgz0Q,Q`(a 3|jvVvV//88b,4ZǙ"NC=|4=zq7U=<#Y % ȔDJ!#uJHh,0<*Fa%w`xGs^Fٵ͋vTۚGYf436u)DO;el^ `&ŝ xkNrvDK)=v[}w-XBIt*mQ\X @7u>j~rva#T!@5|'` EE!~"0b4K({ވpϵH i'IH'Zʰ{F͎-KG$=ч z T. ӱ`P{ ct;֏p_<R ʂ ); üx"yA"!A1:ya x  F~'/Z`McK\y$DJfH3 =laC !@D.`8@&%REЎ!tmK`0IX FQ}<7%Z-~`hEJ GF@. g F\뜬#^ w F2hnTgg~j/N8mjβtw]造f}!OJPځEŘD"˾wUn騠Z8:YG;؁T*HI!-tݵV.8` NezDI)|ֱw'f0a@Y>0vG] FNWtKu< H*feC5<0bvj DyA c2R҃hTIer_9HF? OQƌ0 ^Z^(Sx}^R͞]VFK+qK{h^΁ <}c5Dʐ/Ww[q""L:ópOlQXo}5>۩Y(As(F K$ ?TNmm>c2gvE=XIHnw.xXF-$ȳaQ=&qWlMÑ"B$TJ%Bsg H<: ΔH01d1¬ΘLєJ"؟Y@K e͚#BS!`BJ+A%_0w0ƴ#ǥOt+B0$fOEyI9?0 S0mqQRR* GV^`'ɶl(2Ti)f?:`jes>o %㜳-cf]U ]0pHcu#gó`t p`4osQ569|V&G>)mnAΟsVR_xI"H.1AH$!!BB@m$<+:i&Y)!Ru6=X<b0|A iF*  %AUpk]wֺ |H)۔%75:!QCrÖ~V)tp 7U'<-1AlZj;BƾGlrVa:j{ꮒLV#<#)}/E B"T2)< 1t{KJ9Li7MӤH;;4MEI$%IҗRn=>W-#! D7+1#)4FBi@sډAvt+5-1.6?Q͜ I&}5NJTTFh]"<Hm\jnz@ph!|Mh2W2D"HO )Z% Jw^9W۝{@"C4Ӿbȯ(kc $HLNBmfni4 ⰷ&=2HɊciSJmn>ʆK(At$Rb$l"P3D-R8B0p=FWؒٻZXkL"7IvSIq?`4r,>jUV,h|MbF־HIJH@ 7Xcc \1UB[JPkpD&M _)%B @a wQ;XDz,ȲeJDbyTuˀmQ%)dͺ MM~hbPhL:"( E8>2|,}@s\ʹ>]UC>HlFŇc;ڟwp,( -bNhJ@@dmsۿ^Ro  , ~X3%DG 8&qcY)4M!V1k{ĒHv:Ng?s{F20uoA-7Ǩd A2 ]stZkRsWs?GBEDJt6ڸ`?fJ.J+xP(XFz\0wFMrM8+.B{ѫA) T:rwnG6'BbcH4aG ?(!%c09jx4MOu^3 lZ@)̲L^fYv"MS_T-;[%RgýVD 1Iyz3$"՚9 mt_>Vk1^" HJHE\pt.SbBq?x$:~nJi.Rv~ϲLgׯ`mJT:C-PnBB x3n`Ƿ@}Z[c1N?3$TY+~. z>DZN#gy=aa'N^"Nb? lBF*DA)Ht.kiv.~%ʒbɁv⚃/h$Z+LRđfsbN ;0g?~/z{ƘS Zۑ;,P(Iv`08vϦiz_ϖu*RR0nQsnZMҴ &bW!ꉳvd뺮'5$y((Dt7emۙ18k3A-B2:}*cW N`}䂝ېř20Zp$M !)HTeh="um֕:֎wD6U&}34`D+>Ŏs{IiY-˒[FknP^(΃Q@$Iz^:X;e}esP }ɠ<DhI`AD;(Pv/aC}k(ħsD5JR0 *a}&H 3;iݢ[kG7zds0#I2,0GISx?db gS_?>3VJdatY|F-Y+F2Iec\}xp'g^Rk!ػ2Ϻp~x"[RƱKdv263sflɫ1v!^VzR !2Là?`-@tilǍү̬*u]. *t`8n ^}}/yWEB@`(B jc45^wS]4D|Iuvcc&u]t)Zt@h"J)J(#{;د b-#ZB+$2-[q#3@=tԚlUqd0r-0{F3IfjeR.RJ(j+y@Ǿdtp"Uk0ލ҄1`ï^{i4m̅:x F1'8ù B<癊ot~[ aSBJ9.kSZ/:)zIp8n9CPu-IiiJw~s&5i`DhH ( D_/''I2v|REUJcRHBV4…nzntNfYv.M7O_35c^BkZkډϗ$I D_):$ )平?_g6|Oxۘ8X0@8,2M s=|Ǐ]kuMF 52nWչh?Wٻf+h)SJRιBkw`r-ר~c= 5[6TA›A>x=(8()k%,CHl88j-( Z_ !rt=!D')ӁUёAiE2 (6Er0t`08 6sjy橭_yyo]ΡF61M3 AH|T,n*QW _s^b]W7s;Ƙv̹s!v.7ҳ !6R['N=K/?sNO^7 ځ* .,] g_9 єgAz☾;'ră$%}v{1a.ONfWB@J)$ ( [u^WsGT1$ID#誴6Ouoqÿ(A~QQs;HdžJZP4;`BJ"Z?Bxc(ɲ \uW/$fOZ31Ɣ-w^C^PyZH}4̶k]U$M;ϟӻDf$Y`@2܂;uIwہ؂]$Xz-&"L3V 1眗\k>͚驝;[ FAq7;3d8$Li(BDp$ӂ8w[>MStn[dTm9/+m\V 0?)tp0 /ƅcZ(s07.L=%M]Ɓ0t-h3o\ys+?~sn93s @*$ Bt/?W'>Sg\YxzkOѱsp3\✛"־<7\>#tp 8QRbgvٳ_8,T{R)%RHGWUe@I,h/P al$VJ #@'VKKdnJ&-s`]=`[*S*Kk^];u]7%ekZ꺮K)o~yar":/nlfR6#L&vY)tH*d y;@:Bv8n6(T@(8a"a/V1J]F8_S ZDR($EHU #snKK]/RN&O|#~ؑ/;f}00(Qê>ZH)0M rꍀ#cX]- *|NXgCBHw'BTۙN7/UP;``$B]zD%]&d3A$αPjSJ9H$v>a Ͱ⊛0`xE0ݍa?w:G:'?=w!%@YCWHx0j5*l9q /8H`(;Q .r98vz[ҿF"spa+9-7UJ|kLs:%mPB[Dav*eÅPQ;4n89?1ITR^VJ)E(µy>LtȊh[STWJ9y#RyvmR5;alGHM7XkGu]Z;g vqvF Je9g}+M4 nu*Zku+Ƙ94݊}e`VPMǙB5$Ġ;$U1"WPSB$Inc&CqSRT053hlԭ#iv0Sa`w5xZ`S:9}T7BVKP}~6{p#gYSOq{f/୫9sH,#B[94ǀ:;4fʾgf6m0fҫ ga5Nip2e 䶾ȩN7lmC( 6,Z+!PG]U$*˲L)ՓR{g835Ls{a`F#)_M)m Iim_Ży_-rSe@\ |ln']Æ{ym mL9J"Es . aow/zDž`4*ɻ@dC bdxSiEAi{;VVj0Zd!)P2ދvA 0yg얺gYieY²9eii>~'_}OvpcB-$`Dr,w,xڋFt=̷RC7 A2 )"`(ǐRTVTD'lO-La"Mȵ <3gԦj'TF< "Զ+s(PyJڂA {tͰ':u//߻DY BL&(80ѭSw̼eY$IґR'6pASUaj` |X0j|D+꺾hte<hX#ᢸ$̭mF RqҲKV%t),ʇHY͉4u}ܸX~{U-rYИ. h f6_*w:g1mon hnJFFIM766z۽^Ly(I'W?}V뷱[ o2yT93bf齙N0n@DCYQI @JıN5xIZ6` ( "p*aK̈́Ie?3q`͓bP3" OE (J:yK/~ib֢DxCuYf=h=XU%7|L4M$9l\|i PLHW`C}*Hk=jRUUiK/E` @Z:pSv2xEپ!+u38n?Yk+cLar <ưޖ2\XG6l-WQخ*Zt(-:{=/iϲeYR׵U1^_:L󠔒n7Ymzs>Ϳ;|g}|t:FW$.VnZ*5Sq[ F[TW@bfP4DGFFg` j3Rx::߻P'VfMh M`Y ~]}57ԐpC@o|;>6R^9hcqx/1/n~}o@RJDFxLUU@%B< ],&I2Blm<ۣ UQO:#?Ӊ[iČM1Ace3Q9`אN`vrkQYGUE˪U/D #CpɼD**B^h]%c*kmaͭ+7&d ּkQ3 N 2oAPMo˿޹铃on+Yu,K&,^c몣Et#mmmu7666z^w.˲GS?W&A_ $~q`cb"0jgm:ekkGLD*Hx_ԧ  %Z, .tj ^ͺHsyW !Z\?w<MC٦ 7pDJxi K 7n0U*S'٫Q!h<(V_Z"VR Y$}PJy{]y( w)9}ouTSx='׭.5Xdme*"WJ3 R`En}h`a DllO1L5aszuSY@xR5u#iƹ #ZZRRPJub@E6@S=eĻVݫ5G(Ol檧SqwqU5 )ʹObd0bP$IMA} .Po>IB4x,yKiL#fEZ PEG 8sG>= ~k˫9"lw ODQ Q- кHwF[`cxgrSliyxB!q @S3!#t ɝY?FPЂB7PgOK6KV[- occczX 6Qw c9Qa}0{GV{ZmNf VL޿qwyh \x'[\GޔYw(p Jqk4 !7]`4SFHJYUUK)TO^x9vLBd0퀸7xI34iAO ,..5=G>w|ߟEFe=*`riB^ fff:333V`Eǃ 8s}% Je+#ꪢ4`tV+ Rgxc)j灚#23W5,857VČ2cFWH+(EP f|y?wµa=nG/6|On1B'M]/OEa=ϛ`o# O xogfZ3Es茽Q.uTJ ".6-]gGr ;L#pN4n۠]ͦ'Mz0TL)&UHzly䓩UUUUeUU䭫t}=0nj9\cjLFkكEQy^R2!GVw:znZ0<}}ķ/w/tRaF*!oNVJ[, }S ꃑR}! F[Vbr83 Nn5>O,[k8i!QlXUEQy>7^J:3B$I!c\ b.qQ|ߟ':ȑ!O4Ԝ1. EJ %a:쵷 x90jDA;rUE333V}8Sqs_ ?{s?C/3eα#prz.NRuC`Ǥ~FcvCgbP1fE ̂99i}. Gϵ!8 E4Tj*_WBiZپl'UH|:( 0?yޞ]?yjPR>LT=wĆLd}wւq e-ǘ ԊRj-Q!m'nDMS)NiZv M@6ݨb0ΣǦPJ5rS-*:d{#kzH eG2[WSNuŹ88qZacCۿw=/a؉h3<2wWt:\lq|8f{qsp_[Ս17d$͵/7lvϩe&{)#M4){:tܞv N4 qg i#UU%Rʮ~Gŗ 3 `o~ZFp4̭ fB4ADvIz8WA:95L#ȟmζQ 'NY}6 t45Ef5pOsVZX۝ZY>՟SV xo?MDVn+ϖYBD(B iU!޿Z9c̷JB!Mj1CE <۳C_<ѫ؍џ~_>&LbF%M3\@P~T NzP=`AڏFwF cs?^ ]M"fRtz4s۳qi D͜yIޫy_u+%s9O$a{1B .yc{^!8"p#`pJaע>X1ٹ/GJIJ EnM)妔2*.ۓTu)7 ([^0K@vӰ⌏>.˲]OJK̊EF8p0(Ơ̰x]J<83U0Ȏ=xpPUW0h3 \Ji_{u<A xҝ}O׿WnK]0uS#?_t NVybfc-%e#`T5 mꦽ`PZܞ:1o;htw=o|͘*-9ӊ?_ԯfصXyY+B98TG [V; y?ɇp&z#@YF04n!T]_꧃X1htzwVe"Ԣ4QReacxsIJF`0n0q4 T0E?i`8Q߯G4̀R,,ӪƵ%#96TCt +j̦*x -g/5:No~0 8^(-BYnF,"nsssko~aχ>3z1dn`faQQjmzFRjJX&ꃍ#0r`.ӨeLw= TlfM߈nX "hP*Pa|w>Q\rqmPҖ )/2jwy_:*B"9HJ`ֺM C\; 6Tm%jqkTmͦj&X7klP^IzRVwF'0y7߻#iji$rQ*zIEQSo 3g@ZV=`†=-iʆo|sa8 EJǽ4M*i`C0LcmNvlɹg! R> ݟfSzWԈ 5Wә#p}=կDHt{`4``S&Q,MPjR [4nv:KM3>P)*-P ~l{?d<;z%ڎsaq p}N؉'?]MY' 4fҬ 1hj#`ЖCPSs^VF6m+g`uҫRAfE$0jVhgqXR,LYsۈ;`TWZugr3m"[dk[%1Rn`3PDV=ꕿOZ ﺍIp*@ 8n?zR>A j5Zhne~~T3Kh ܷC\{JDJUUUJ)}ƛn٠;7p?Җ?1]"8bT\<_cM?X^K2Þ>x`}SN84 ֙ F @/W*&6QFyɃxCAP p54˲Jk &Y񙙙q ?Oʿ.+='DʸS5Hn l5?т;gFyV ^RqB43(ǎck3(Bb'b9G-WKePT g)p2`"qn xC+@U0@˷ 0AtP1M^:nrn3lm v m$dTxl6@U cșKQPd; '[\x Mo{rLNeDC$s(6_C[ 7`m?h P=3lk0 COJɥLk= 6|<5@ D/X4L&ƁX6AqNݞpy&[8759t u-:f#g=y,9&R90kqWp_k֪ +g2xc9$+b>/?}?]{{gEBMX&"AFQԉh!{G{ لW}gE36^ *#0%7}VDžѡ͊7:A슢hW /;u+="x ` 2`C9J$an¦a'<>3)qqO|tX܊h-jIXiͷVX~<).,fP euFvc(jBRۀt[`33'\OL_kW>rbeΘޔWs-ͫ^s ޾;D̀ԶgB<ȳM"80D)";_j=?288tN缗;`ZJ`Ey ]"\'xpBեQ3b|K[;f āO޹oc!clS+0 /ڣI vc5vH'm0kԷ ۲,5 #6]WOЬ^9&iCy2/Ik kĞznCqhS- ͞&tv)!%`<ѕJ#;h?cAfUU< &hZ} jPR\_͍P0iڝ~ rnLty֪0BFq)wW=yt(I)HwSm^ooukQ{ ;gCgohKmzBgH(PփZڼս zj*[|c> TLIzl0Ѩ9gk(@knX \c R6dءcI|}? @Ae,UUs&)鮡`u4)ob7`]~ӉL՚xLJ0<؉G_';ߺG2G&ڙaf=e%~ht^ UԈ }#o.qZ8 ڝNgoEO=_Ǐ/Qp^lwv+ARm4S,|1翏oUyFeeYnju|߿gN͕ŽŢjg E~qX@UtU9V*Yى< "DoPxͪ*Oܨr""!|K]Lqdb-%Yޚdҹ*#$3`ܾ~_mglZ"H{R~?~7/al5 !Ve8Ap3']YLBޠ6fU0`4cLV͈ •El#>'}On8 0"/M5)2EA#ԅl3O1vTI} DhxvT0_EQn[Ng6q hE'}x/vqeצ@`T?}0SSЬЍst> F芠 c=T{TT9A~>~+g//\"K%t*n30Bf,Y F} L<nտs׺ޕ^w+RJrι~"{_֩ZJ4``J32gYZm_Rjl&U eⵠVDˤikca9* G~ WJڭexCD{LeԀ֍갚=#qP_3k^v{,2bJ?}B@ oZW!ю1Ƹى(HeD$RJY,KYU=(gDz`s`yF >}w,0ji %iݳC?ymZF$I,JJ)gxRO^-yMSu0gffQ-̴Q H'?/SwBz`b2dէ1g7>m$U?~7d&Y.j,M,Z\`桏*x\_wЇ>o.F#Xp@Uv*a015]Y0TG:_B{^w&I-dB1<։Z/, b83#ؒHi%6ECI)RR|sNB.ֳ_Lyx$uO9Y:1Dqq }@ ֌5q#u^V4L"ȒAP@},;cO^'~e誂eS TF ;+jM2FY_kn%fU{ s(7 d>t#~I_~.z7~bYƳnuT;.쾫&UEh8vt:Nݞxo0<ޙ˿{rDP$ߜؖ{*s6`39:v~:vع02$!l u$x?pW Pbc4VFX z]d] 9`Fi#6F xP|NPW謜A]LF$+ine+ "㜃s,=_~W<AJI^,˲KQRxN=р4eUx(ZV033u:V; a c_g[ ][/+B>&xV1TYֻ:pH\N M&u=#biv.z̙Й~<{aIe/59 }} ȩٞ{F̫nPMg0ϒI\zK^o(LJYo~'c!Zwrn9oLwSC5LD\J<'!3x Ak_}R1.7 =J9tm [~ ,pUl`f#v ̦2Ju ~񷟘]O}ܕeT4TչzVNuR",:6f{wQC,0 (*+D~KJ~hG]^s7Z>U0 M*&Jod*/mъqj/IM6&QD7 FF4 ߦ4@a@qTL3R͜!=@Gא8Vc^%n{fYֳ* 3f&S|ߤÕVJ(1K ι(ww⛅Â`B!:՟ *4woc15vfVSVEܱ^4Duo{f]ʾoʮO+aUB F}@/1Ӯisk֔ 3|X?CJYC֔FK${w/so7}F1+AJ0 ,ʢ(TUUj v,(y)h!(ax$ {{LpW3T43ؠgXG[Hs3:ŖaIUfLCSCI>_&ΠgZ~7h t?!MD379 d !e͍\Cҟo{^w뭤i+2h㢡..l3@D$<ϩRp=!8 zfrg_ŜK`xd]AAfl!(b<H7J^drH;`.6:6`4DC#9IhZr`jQַ$y5)He>9ĕ\y}އӜwg3Bun[XAQO#v}-0}_aZ-ffmDQt AW?y\_^elrB:_ٕj M}NJ!IkUgNb}kTHɘl.g*CoƮ+nPvw3r黻nꀑjv<5/׏i IK^z]Jd(L)%acj@G{ ssZ<V .8?I/b| k[+[qwךfoK+SeP}꧘grB ɹuZȪꚱ=,1kjQճH.>.Ǐ{zn5­$>^]͙9-$TNXYV!=x|ߩ/zW(miU7n$Iz5D~VI+ ")N7jN'EQt8 =O[[PH Y($8#B '.Hwsuv.rKo.+M<3k,/֖O܂EUՔ1Y"f bkTB!@|{s!0|R]#F`du X(x^)9{pQϼөw\Pb5U ֕z^"nM&f7O0(QhVa a,P_MׯƀQS9`xM &[&Zac\#Z0neR($zЁу.ӧ8OaEa&IiVUUaLNtܬqٰnǝNgj펢h0<ȧOBᄑ T*2';-#&֎Yw JQ#c `m6 ~ məʨj҃ɠ4ͨikE6"PI>ʺ=%n{F>Q}ȳ ^woyVUU# w[ v,K:+fx:H#Z|w/R({jxM&V\0Gdy6Ս@Q+M&PK N8A9]טٙ}/!6h-#Mׂ Az22wcgS) v[0j^Ѿ0 Ap3W~?vw1s+=rU(㎭ixWSuֆe mLdƦoZèR>n:gTw'\~( )>ݙ`\DX6"kP]z+RO_8^ֳ,K,UQ-+T),˸%swإ4&ijvH&Bp9wueگъ%9riW6Fνt[ս>B5<2j'ɚ3=[q]1XZnhHeJ' Ueѻ $ć}/Cmoi^〈i=MVN3nAp" 3G~_?j0^[-+mVlڦgO* }.\0ַ`U Oyׂ^RR,xk}F0!PvɬofZ59`oAEchݽYݟOren7`ջrqB*VaXQƀNF{,ZkH)yV'Ss?*`Ae52n;͈ hZ߬n& 0Β%bnɡzG5i_ZSw(P'6tfR#0XUy5sڥPµ&uZ S-Y7*g.de)Dy$IP;4:bDZaEќV/?ҩW6${&V2 %ɄU,:h8!02'$=raO1ikEFr4P . nk*%fXll2cJEۄLm- ɜ٘LE3NWY0RΠak`!030>շ6Ok?ZĐ$f癔rXQ7%f8Ƨ}H֬*~ԝ9O^m}gr&'@5 F*f|Mtk\NM=NT2κӎH/jqჳ?ȳV-z,R0IɄ~\t:3Y\FUUEesވjp?qFP`*x=@M%ԬecVt9֞+1 Ahs|-9׍(|Us7Z5=)1H\^~[?y^ GdGT7nBN_p%Еڤ[ ˏG<e/4DsUͤҺ_e0p o c`UQs0f@69{ȣ0rNJdh<ݗ0c10.OU>8,1zkygUUVQ7& +춻9ƥP 1@)(X91nųsf=&nn5ĘkSV̡E4'; 3UXY M "W9u0z 0jH?K7{FLCCOEKo!< u~el\*15?~n@k2tS-6^~45#8VD EJo?gN=# Q5@4 qo4mu!JuP- Q309QCajb]O4-"@nutQJeY"MSnwBxm~?1;>?t :vJ1;7SbMX#.UQӬ669͍xUS_p~/hp(c( 655{f=beY&EQTeYB Zva'~YQeY-{^+|8}48]pF|1mi8I|/}0p.ja6KzГϽKn6D1SH\E?Bѽg$`TE.,1Yޭ0{:k~ C\-όNnůw~.k`ʧ!qYC[5XQ`_עX 0ڲߌP=./ܚ /V_'[TUu(,z6Џ&,w8 i e(}*ym~YLB"s0\4a{4To`4}; \=1 4Y󻷜Hq0nL2Wx雈_=t`i\FIt<Eeݸ-N:kP46ЃrpfgX=49O^ y>Y50/%+-a#gA@߶>(ɬ F5wjgo^-Le,V{^$IYUոJ{Ǽ8EA^/}E.~\_`q񆽕-}[0JgOFG҈½#˔ڽ;Wv#g/|W$I6,KNA0Y0F4 ԸԶȴ֬(%atU''o?Pv%6Fq>.CAD[~*>a5 \!tvu> -V6𗊢2$yWEQ1i=WEQTIdPVvio_ fg']Io[# y.?n.x!A_扅4M/Zm S4&`4h (a'T Z˪,˲$I6R$W<9PBRW/t0ƒF;jUe+7#W˲rifEQ(O]) `5řw^x-z3GLt<GmFy"?ihֺHp ʫϡ|{W,߰[^o݊ʡh5l;JQwin m=`X,8Y{ O̴VO >ؐ%!^!WˋVȰjhَZ|pVH[NZk]eieFey_ |ʡ% i0jh*0rO,hk [o|/Yv!|5I+^TJYY@D S)v*9И{d; odUisEI]KFev%</Q J.>X%}F=Օsby#;{(4MW$m;>؉*iTFͧVyi&YyH7.̝-i8h#0B93MnIp؇ڼ?8iz-ڍ1)JCzLEcJ;N7Z+)}j۽3,M֭t.&Y#c| z%=]U5;Z8tvqN(zeindYeY9M:+k HKdz BK)eQ5(dY/{0fv~^QWw=ַFs(K?(?:E ZO4)JR6L7@Mx- so#Ej8(b#yr|t6mű MTvQ`dvۏ1 K8)tγ UၪMqTy%E۞H2Wx琾7 ͉5؈*Wb 9A ,<Yv fq+?$4MW4*G)R4 }}In4tv="$ õ n>w* gPrBms6pn~S 1f!Ơב7bpLjqGfp@#VGO4TF U!t;:qcv/>_fŋ q<<<9|fc6uT4̓>GwzbIU0<{EQ u&(00 =C8GGze Ͼ^Ǵ+喙I%4z&l<&|[WOsi롈? /X>ve&ҕw2TWQVy_{h |uGτ^jeu6B~vLҰmHzFQwRJYfYa zY>e&|Bmq63GgT߄3A D BuM?h?;>{C2v BDZ  ,p\ph"=A0ba}led%a,K\ΰJv{N_P]?9\EbUUʲ\YeeYy^eUUR2q;6D̽F(GQqaa8\ A@t`ߑ>_9p# o|_T?ddmnu7DЕ%=#a*t.@BM]<Z۽^oMk]8t幣V>zk1PrHyA׹.Q::Txн`o3W2eReV]NٛvLu(;0BKRx-OӴJ7g+:vH@ii4ۧ6B#UAPh /@.o {o!/H}{^/|5-ͪR"QmQ?>[/4GC-Q9`TT#n 2$lDj#LK\c{>u +^NWo] fKUUeVE(nYn^dQr;M UTB44qkxx=7q7r[n(/!M^44Nr .ٕ% mFKA5G%ΙQj8_J=yqsM|+W[WޑR.J)+UUmTUy,SY4I$Wچ.i{K]Ҩꨦ+y\! qb D3n>?_={`k){@P)x47 %I8kfbM 9Ú ޛʈ>'q-#zK&is5DQE⃻wNʑ+kWYggu,A8jɍ`P~jg{]Zy|oB&74]2L]׼NFq#zI2VI/ҩ}צ4Ve!mFl0P T&(y ]~UxK:euH|p?zP J R1pfL`*_>W 44<˰5UFB ˲<+kC1&,(qΉ1W/:p[D0P)1{u{6mXQ,v3p2U \*.dOJpkd-,<_d/=W+JejEkR )eDJyEQEQeY&REQ()$@< iQQ1X""/"/ ʶc[@4+XBB'>G~tFWx5YҚmW[jV?lfogָxeK=ƃGIN"^zd(4^eqGQRN̅/,7_ܥfl4ZTէM:4wQ2f鄯&IqúlBdza'TGC4L(ʤqw 44޽P K* 9< 51[%J ғ@vZ`f?ƣk__[|k_ZURj]kJ)ST*̤,LOVUUeP6[K[N)m$߸g Dyym_;9!vpਖ਼{pn+kjA% JE-A,-gg"ƴ9hP/{³B\Pe*'w?0vo%IQa_s Rʲ*^EZEFEqZ*8~xVK^_l HkPV`T3.+jyl'?7muF=m<\tTHR>Ii }}?^JY~Jyf@|sjWhwoٻ܉˲j+ ;y^eYJ)RJ$g')VID[~"{ IRm%4 agԔr1v^!c[k9?.3tm3c[YXY;_zrC_uoq܏|,YZoNֵ^&,օRmjTOd*7tj 1xBxs!/<"ЛאW|yfߞw)risss(<׳,Kv͜}gc卍k+Wߺq܏.8Z'Djs"ʔR)֕ZjIVfI/ø1zycs΅y1s޼ !% !"Xlm[ a͆q{L0Bp)|Py ;='+"ѤeVii~Rh( HSb +0rNldv}l8:[3uHza0n5TkH i; hi2V Km?xC}OWV^~歷^rj`J(UQIDUZ뒈}_Ɲ|\P20n_\9ccs9!c,bk ;s G|wLgN7SX(jwnb= ͈L3 dq̺C6lu=JDDu4yƚp=f^}Qөw=3v{z`u^m-0I)%*K/>.͆͏ not?f E큔R!|8czqdWB&7ꬣ4M!0 P үگ}H[f<M'Qax_ya⋧ozHڨ%䍷o="];~p9բ(V6b(5+Vէlܿ͵氫繶'z=\C~*+0ARH(hKʾʼ>b"fXӧ 4#f]Y m Z3A/X(o@7 HE}A0Yg`9`DiV)MDXc5(+|ezW`č(X3my8]_9}l,K߱4-K%!kZdϖҴ0 keJE X|Pfzŕ'W, ,<Pڈ 8՗p@vUW7Ԋ/&n{&&dEJ9M#c@i@蠵FUU,3eFK_~sOTck@yU/Z9vhLEŪj ʊhhvjzRsjpsbSY>{, in MGP(:<M Lq\F`NLI;q_feӶZS,h@d-J\^-eKhs0?r|Й!r&L+y'-^(歫=70ETFD$l9zf h3{laF=;F7+\JY`=OQ9Vh[}L6|'L;6&S%i[i"(e $m$jly~uי5mWFui@^PW3ݛG?n{zY%*00q LJJYeYfY֋x#8W0oWOZ=0GW/`ei*"rGTH,oB`i@IڒEj7zg[.o /,᣻^V7<[|(u;1yZIqV<@?֗tY#&Bʁ\킑R w0@R]54] }9x}G(9ts8VIf7 2U"jIXYAAJ[ j'(4 U Lz[- { gnHݽ~Xpe^w݂f}PthmVH[kWmB)TU[EQXZgObॕ}ɍ+<$ɮeY$I(|fN=Np_TG;Ge7X##v Ag2]e[YB,,z{B@-{8|l[ *r4Lehk1'ÀH02,5Ā-[6]C4\g54E3u絨jaꟙjm=Ш!f8a󧉌R!p-`` m[99zZwFۃ 8꾅jQ+Yz^iY%`4M^Ш ɽTIClRVrVEbWO{K`g JjKIy>ut;:D?P`4,WI8`08I)l+/&FCވAvúh793y i%eH 2Գ^V(@9M3G+$RJhj/^- 6]?TW=ÕQ <~[kWrhT}͕#2o+b#@l= tn^tk'dHj^M6hx`o @(K=sڻRŌ4Dɥ }eGLk,|Vi-j9xFOiR!#WK2uM-pU5IRJ󜪪|/ٿJi}eDlɾ%Z\Y} :  8'hmAȞ9y3͠ J;sƁ=]Б׍Ft'E#:Fڡ 9àN;Fگith0 Kq:wa>M`Zk,(76JÀ4jR4M=DsteG =IFHCP=biƗJXg|/~@M@<Ǧ8YDžʵ8oyo##`Dw$:m{J 7U{#FΜ#ٮI* 8QsP/P+GDoAp3VEQi*'НTJ7g'v +jpəL9Lhǽr,EQjZA,xo%ҠR+*`uRֈhP κG0buk4d#"Ν54Z-S{OKǃR&IE!l/imw FG m@f& ]gs20"t6PyV+sG{<g~K+rFnR@B}F;wZ-0$jVP@߽|ܟM cI!b][-}Fm\D1 8/gG?t fEv.RJթ'}moTH^sq Vs;飁T5ۂ64":bB0V Agg^zi R&E#wFl^lS}ּaYW![0r\G vk;_:zEqoFQ X~  ҽ(x 7Iwcؿn% qEќ/QRK͜m,y 0>W0r?T+ @X$աIwhlXA2sDwc ~}3۬<? G?y8N*v >8>t@zR] YGqw9$''UJUBZڕa}sGO?~hŗV6 އQYfWa>fh"!rg`侯T'po#tL8t~ D$0gS|Njko#;0$78͓AuJ7,+Qvb#WcqWq4@Mq;2nQyq׮ {<;p_{fLx7N#O068Z_6՗&ASR4Z3dSnfϜk00:Za>#;!1q䖳rg`RwKãㇽ.*ijyCqUҤ!~$>b|Hwi{fMQ=oDw 4H :~jzq$T`6SeTo76a$Ĭl̼UEҨW6ئV789)5o MJnF 96zSg3n)}TNZ1-+30Te?~f#QJ!C\8|lAKZ^p3Z,*hHp< nqj,ˆ{Ix ^ۦC2u"K8ttJI lu4Ξ'fO}xo%P.l"Mǁ%,c0]uY>ǻ.lw<^1$5=%AFH>&H%ٔN4:`hfLF?mȜӳYVCS9l z<ԭ/`ٞVoֻY.yb¦jb .'Gr0q/EQqRqi1MSك-8+#j*'76Y2"J;A<҇V /,xrf a}F0=pO@% /OEbu>VOBT--/8zfzޮ}b#3ARI (ݦjVS FLHOXm54M`B P˯A-ڼB Ao}pf/1Orv$m9iQ1 *d|kaުcέ ]wp_o6d!Uz]5RAz)+?nVU#"%^p(g̯Nc!f" #h<V)ٔ4rջ;]#l#MMk0ϳ} (z݋PkoCлbt.,:HUU+$S8~shgC-C9ÖjiǂJ!jͣ'^ie9aGaW">O١#OA9I~BhlsG3M|ɍ'FT!sK!D$IN$ywRA}o]f ҅ë_ٽ^]zs; oC3ǁ  bSZ87@^#nd\3OʒD,At硻yk6w쿪ܐRvӤTUeVUUjyAEZ ǥ3:.~o0$2q$/>_EVZ%e1 Tey~Hw ks-"M9Jiv3JF*#0_l$J كK۹?Qn$EYrv uG2 ;xЧko(~%2(b{|>h;weTTw4iQh @wp<.CfzzzRryώ/aGq1ŋbtoўT<pܛ7O޴(V14ƈZ1S^"͜pBi:ןgiFHH<`Y8ĀQYdGd Br4\~χw? &c9#tH!JQ%6R/O)lT1. dq^m1#NQ  ]ܭOœ?)oy~s)csltb̓hRJK$M4M$ @>H$ Gd<x|?v}|1=`4_CXr! u91Z1ZksZ|Nsk,K,҅Cly@ FeKQHg7#r+&i26q܆G4*v1~Cv\SGj|#+4.}Ѣ3)RH1l$h $@_}^=o'^9_hքC "s8l`NRJ(IO1c^I89u!K2в`h>Z:I e1ty{{{MJɝs&\³""޷HXk$ifiIgWc.ra,rl d.d!Al\;> hx9I `Kւm82,U āw&N 0w*R*,W 9h( PJsΦiF#ιǣ\Z@e ȨƘf盓d[W7#vs[kQJI<(Wٿa;_+Rƀ>.0jAve-Ђ%Emup>X?s|jWvH# =Ff!"FPO($'Il-o DMkO;NO^H- VmȾTFMGH(A ?sό术y)ȃTWgGÉRhhJZ+s9'n8J6p6Rf*`$" 眰Jk[(|å k[eJ)HI$Iz}ѩ/Ey[[FeJ.S$-s 9Տ[zBqSJRbw=ű :3G4+l 3g~9wn~7g#Ɇ·~e=/ۏ F%Hϗ\-\||O&*RRJXkuCmr e  4a88SidA@'!KP-"F6S7+:"zH)1MS/?wG9Ah hw<0jlN iZH ʀ$o}~C+}\By9WRJqb죑69ߝc}!ٱD0{ZTJ9cp8`r"Qt.t 6ڐZ13tT-S`ϺխDᜯy^'|wW4`T(i0 ɬ&x"UBs ̉F˖7K },30uO"q$췟oda`w HS8Lt2{֋VwR+J{yo!seqZ|" =N}zVȆ} mDW%75glsB&J)PJh4XF#>wbVN˯}ݍ{4=&YL`w|e.b=?^u@-W3ϥo !NRS9=t$3)0"τuDt{,F/݈ F% t"V:Wyg 1@=(si꾖.><OVv3n:|8KB_ h\k=yZBK)ׅ;B.PZwU/@XħrBtjFmkl z4bn\kJ)BhFŌ>oO|ȎdplCz8%@Bwj*lmF#h |~ gЪBt^Ju!nv#Ѧu `dgLB,Mzf2$^CFTDg[Jϵ> mR4Mw,[Mtt8ߟ^9EH h+-U(Ã3 ]QVĊ|믟<R])=!f`S Y qqA:t,G F{2џpjcMX9Œs9G֠RJ=xSaQ# +Xo\ b[W(vZpt컜( #וޕLt.SZ:2Mz-ǚ*ӕ*(ZLeB\Ȯsw@ `in^`}ۉ1I]睙&VҜiR[')E߀_o[/v TJ-O&uK)ZyMsl{7[75ңpڂJ+ů$l&wZkccdFTJhg8nLt^]z;p=U`r v?7BH&`7ճOϫYuSkj`Gv'32]]3$U.(c>`b20$(Րxj1wXx='9GRs4_x)c 6 F?@Y!ё(ԫW>;}_nO&*m !D2i> h1O_$C*@7i"L{oR+(Ri1hlgw%]Pڥ) 7))JPv;07 =1l^J:|*AwPHOUvŐHںhBNHt`T(-4){o* %KRJIvew =sU^x -87aB$O~ gF;<5we)*|C%J)s vH<<mpD+:<%m TÜLN)er4Jh5K~{s7o%{;*Iu5 B'hBHro\.%OA `Ԥia}>>t(`PsIѡ9-23+_ED &$nm^]dHT$8(J)Mt3IAβ=e!Bƀ0L1;ݭ_͞+cEi ^᰻_<]!ĪbM9ߑRPR`*Y,4cF $ʩ" % >XRA=:0.iZ T>'pl,חaS(9" -9_$?C' F0K@Z$2 (khxS[t9ύ1"NϸǼo CV$-NYh굻_X40e Auf_SgW8֚yΒ$Lt9Iǿ3eQ1jؾdI4> ɼ~ЭSǟZ)u7,YBl̹\k-C^[ovӏ:fH}i0TjZ0rA CRi|99FJ *z{8[z$/}G|&=I& ҕ4Hv3Hݟ4tFR Iص`=9.|s>UJSLm'̄G񡕎 l‚vP3sQ(d+442g5ϥk=N /RiC>m~eHn]!4w|iYWbdJR@ZYĿt5w&ɊbCDZk y],iq$'v_U=[†ө/Cu JRJ9 9s ]<Έ4;޲ݍmnŻ{;0'%NdI1R쀾4R? ^ q'$hP'$Z^wel]& q-(#~ cuU^:ʡ+Rʻ;Rsx9t uMMl)Z PcH-]W UAZkM1T*Rj2ѡ@WSR:<HS2zpJPFd o_:=R+qs~7dMTnr h3AslԤôbʷtXC+!ͼ*%H->C؛V;kRFVLZz}3FQ/(Ԯ\#|+b  :!ʾzfx.&+'!RJcLɄ;ȷzt'5tƏE@zԷbEf\`:R^ƗF#ynFo]:QzI,pN4Ho $rԕW ?OZtaƑiշz lr o`dZfch%/* bxx7&0B1DJ >Dޙۓdqw8y"]':͓렋aYD@zg7IJmNu/iU`Lz&@0Uqʕ/ G+ @cgxFs}x>xfRb9 D)Z8J,5Ie#BA[=V0ELP#a\ dmkb$9lȺfY^8& κq0!?[~F_{Rʻ\BV?`cel)PJJx=6LpsyՍWO3ozO V4MO[x R]!DuѼ>'z6"s?,eA:aD.6YR⸭ď*]j$WS]{Zk.KtHrs^>}}Gz$k/S?1js^yn?_V]+ ' JUc'ƒh-R dtaBk͵;!M|㥡Z9K/7Ͼu=w 4s~mhͪ >zuissXB`!U($n6bdݿ!!Fu 6@wfa';1*iS1Ld|gaԐK@P;3|["nt%se])ZZAe>@4";v7h] хBBVR|<O1áY{k(nm߿y/K`~ {JYuoXV-}h[s=?@™l'yTkўD@ )qsc}O[6cL9"yO4]Kt1|/į pߞˣ)Ŋ,Ҹ˄)\cֆ"ꮤ}Քuش| &Q%%l8VAd/R5DKBN`K#Ӑ&96 _ 7~~͏^Uw.'Nziys~s~2h^Q}fXqv8Pt_!@`@ BA?)x"N&.ߕ, seYK?>}ֵoͦWsG/>q[ctW9yoqs)R*k- g" @1`KML7#PL 2z6l Slpx'Rnqη8-< B-N_@o7+`ΖGhn$%:c_|()^[kZ ,J2ei}d`4'рv0 0 ͣU1#-b]^sȨ3/060 wL~轷Zk9 &NkmRZJi1{hyF" EɖD?yac ˜BPeV6sy1]I ]ݩv4aKd 狂Ӳ"1&%@\! d >v%kKAT/; (r1\PJ)"ssZ!cD&OqkHɖ+ǐ9l7RfkJpH-ug1/+1l$ $0}($[ NBzU20@>ٶg>{)~%P` 'Y7yL:QhVƫǗH U/T v,ڞWM8"inPFC(-Z"U%bm:!@s:EjwLݩN@::t04Vwm~g?xI:.P+Ey.RG Ldi8Gi4hq|]'h{}kfChl]` Z =xh3uh Tth ^&uo-ʫ Bk$p>-OE@8#oTՁ9 MjHCgck )ޠ2a "ѢkCuKlw{-EHXCrv:FOW@mnW\4%c' &9hIo71>3xtI*Z6a DWtŤR@?Q|I+~CYq񞙜WA-Ɗ>XApjYO+MQ`~ A׷7Rꇜ>)s=!tR8><yRJI ZޯzK@=H)2zٻ.bJ%qS؝I{@ƀ& uEZ6!!ˢ[2C C=tc/؆ B ezw{+u"A>jCZS" E[4`G|iHAGu ;aM(wktX2 P2bT;ghV<6 nB @lJ{d0phQZ :f$#KMHιMkZ[!wu DsuѼ`?\HGkAjn!A j~@іE¤1f7??Zqx;l!m%bF9Ex~ҥю^cv12~ @ [R\w=E@tS!5SRۉavvb~f95y1!$â܆Џ~ !>ċMbY%,;59!o=*}fD  mW.Y0퇡̓eTZiKKYCkR`inPJ(DL+`D ,ɣJPB5"J-ܜN;J)e9HO@>:(F2?GgO˿u}>c۰E)dLmk?=:GXR4鹴ջW7Mϻ&ZhL-N#r&miMwRA-=u߉[y"MH"8:())M5fT0cHuPb<}ΓS}3oDf1Q..!qrv\Se>MI kvA$y6aM𰊑U?;#CCw* 2̞z& z 0Z[E)Z@s< `ZNbGmԕkLU#(E-c`Km1u=+^D0jg`]_y.SHѢ= & *aRƢ~@g4ChEXGC<3/SHѢ=bAX`42>#;)ZdJ Ӄݎ-Rh%AΎ5qCyՕ71E@1@M, ڣ>(Zh~dP.{:E@mR0u1>ݏ@D" El 氝>;BQ҃=ZHѢ-8Ǔu>E)Z6Vh?i'E-BK-Zh" E-ZhE-ZhѢE-RhѢE-ZhѢ&EIENDB`desmume-0.9.9/src/cocoa/images/Icon_CodeBreaker_32x32.png0000644000175000017500000001007112140261562023525 0ustar guillaumeguillaumePNG  IHDR szz CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs  IDATXýVmhSW~NnYKjƯ~B(Dbpm *2v("ԺUjъզYow?Nfs><}s9\DDQiZ[d"NGmmmDDiZS;wn, FbFDtmͶxKKK8UCӴk\±ct 뿎b`MrPuuܹCl6ۧ3EU8pE!  `0\@ JNNR3+V|fH$nݺKTUUEVWfڻw/I/wv~(3k֬3grNDҥKSSSљXqqNA*͛R't Ɵ^/^Ӊ_ "@nXccں:tvvB񼓀]v}ӃT*|>f&v8qdRX, Pӧ ?dC()|ʕEiF<===D"Zx<ڵk(1ɓLѣG\t=UU9G$a$Ç*W*ۜYD.A\$x(Ǐ'"D:Db!YsVѣGi߾}#GpZUU\.lj n^WWG߼ ?{݆p8||||R)~?(DQrىD"Ad% r:pvg@ u8dZd2 tj^/we^N7 qf{)VUlʕx`2PZZT*Y֭[?>p8099  ͆O6j l|-XJJJ0>> 1Xcc#4l@}}}L$JlXlYݻw]9c)pIN( |2{2 ۴iDQjN7(cr "v;͛7# ͛@&(<zA Q,˔ffiB `0`ppFFFHex^_^|݆X2$^˅>6==Meeex< "H$d2>Ȭh) %KЎ;8c߿mƋh7~1vgϞ%MXoo/`^b3LUU~:n7v;JJJޟ$ e6l׮]cFn^,p\0͵]]]wT˫}hhhUqq1tSF/^xp.^6ma˖-Ǐaeiid1ϟjooWߥ*YIENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_Pink_16x16.png0000644000175000017500000000016512140261562023627 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(c??)D0aTct}IENDB`desmume-0.9.9/src/cocoa/images/Icon_VolumeFull_16x16.png0000644000175000017500000000567312140261562023471 0ustar guillaumeguillaumePNG  IHDR CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs  IDAT8?/Ca? HLҤDlf #U,LV ^I$X (j9M湍6qܜsϹ7)vz gE<`3:X KS4~.cq>j @3\5;Q&`7Z\F >C9t=>\Ẅ́"emm0lӹ ZUzm_O%Gpc20)H$T h`oa%t7if1>/dc- Y;B32 IENDB`desmume-0.9.9/src/cocoa/images/Icon_CodeBreaker_128x128.png0000644000175000017500000004244612140261562023714 0ustar guillaumeguillaumePNG  IHDR>a CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs   IDATx}we|ezٝl6[H!$@H@" AT9x%  PA¡I" !1mSٝ޾}~d rO uefy}z!A>"qB11gl$ut>e|+3G9,`]Y?;?BFw2DB$gYffQbf ! BcB[J3g\\nF,Cww7b(g2bfx^~8q"@eu$IbcϙDp$Io !F>> Ñf٩tvvh4J444H$Pp\Ø>}:]|\VVF ff""l=3Oea^niiy'ۋ6niinD"s:t:B]aXnSee%NK,ٳgQ:|㵉4J FBf<9Gojjى.R)i 7@ 3gΤs΅}`$I{F9sk6n-rCC b4z-Պٳgc8YADd1s,ُsJG$]F݋!jmmEWW <b#|6lCiؼ@QQ|^3uxxjҾ}HV?:B:oذ0#fۘf#[R<H$.]۷ol6K0n8̘1Ðp(++# UU?Pvww?lf(?g|kg ol6)Տ χb9d$"tttb͖-[:!{WT*ob@eG$A*:JĎS73… /$)_z.rI&M*U?C=TiWUU0'I Jan+Izs_hʕQH$D33wߝ3 Rt^Wr8`z:[6k?m(b#AV{uQ|tlvjEMM 044L&IڿE6/~}7Ȳ6DF{{"PwЩ(`Y^N;;;DL;=pp iÑ5 F I,k "(>d2W˲qƱC2Nu8 Er$ r :^xt8RXcZQ]] ӉFiV+@8x`X`XAD"ZL4 CL7ϔeSUU`T mmmL&k|>f{tYVx^\.S7W^yMMMөS6'G$A[[v}E]T<rtQ( †Q/I9NjllDgg'iFbP(@Qv}k\.W1c ]{59;Gp!z3f Ettt )Exz===5rMM r6oތ{?LQ jkk;T Ӊ޽hZ)۸qc EǏbAWW֬YkbΝFdcǎMQp)}tDx G6 UUU#w^b޽b̰lB{챮QBYVTTT sGG4la]ס(w1$MWUcǎP(Bnjjh4!c]BX\AG/Y$:1 R*;wRooyv;4M9묳&vwwfTTT1c(Pkk+uwwX,YVEX\= C{%"vD"455qR5h??6$ .܌63Lê8կ~U*y_>p8PUU6 с\.ghB4gv͇zhl:ePYYIUUUBpkk+! c"Ls У>*/_$3nHRhnnFwwuݜqmؼybѣ**++`?<\.:::^H}!Gߵk)Dz<zΝ;1p}k}{;V1Qea*//G2Dss3dLv7~{r'(gv;Ah={p)9b/^CvQA4W48TTTڊh4ʺ_yj~cTUB!|ؽ{vu,_Cm۶M]ׯ$ @0=2zΝ;1Tj1('ʲ C$QOOڨ"JAqP^{M{ tUU%ߏ\.۷d~?I\.qb\.ץVPHFss3KdA6Ÿq:صzzzNu6 p8Je03q088o(=Bae!Z[[J`XLsLӴƝ][)p8 Iۋf,˨B,{o۶mo~\{sD`߾}$IjH$]v!ft"p{)( |>B4MCkk+d:B$IBʏsor@eYFfF.d2`01I$ X,f֏@ׇ &> C!%< GpPi<\WW`ײZKp: 2zzz>R犊 {QB[+RSq"0?V+vq0]YF  "7drt]G*zcv>b(mG{{;rX,"BUՃ[dɩYV|>(ftTTT~Q":묳xBmmmD" "y"f̘]STIp8 ۍxš3񸫢F{>'X, !*wK.cVݍ_Wx$I B3汍7ihh?}Ԋ鴑Oׯ…  |g͇]c͚5سg2wyQuַkkkT{755qcc#r-8Q(F>myGD.dY#8@ߺ;~mmm|ӧJ;4w\4igbQTUUk˅c=Ry8D߿t*"|Nxh yѧ se8cL&Fee%q(ʐQuѕx뭷?$(;v=\Sahfݾ}T* 2P(*OX,衇,/"<~+++3&~S9zi+d$ ,4,~5 C%Ә|]oo/Rr "X,r)T__ϵrf_|[nE(|mmá}i˵s*"J\K/=?8c ?v~_~u]纺:iرw}^}ձBEA"`Ӊl6KpInc=3g4?ø֕$ pEGEQ~裏ND̙36n8;w.yx<+[n%1s[/^ByyyqA7olڴ@ tZKY<88Ȟt:dTU3p*B*B>'UUYA`6m;twA$3¬u=Z^^)//njN: v֭ڵkvSee%WVVD3yՇ۞~b&0g]_,/w:J.bHDrl6bfR)bf\.N$Z3gf͚\.D"A}}}hii]v!  pꩧҙgɫVTUE0Duu5WUU;s7I̚Q?'IRcc#MӠ( ^0nܸܹsgj|ZbH$lsssu8f MHQp<$)bӧSN(o23SGGoڴ^/-\ϟO466;izĎt: bvŻv.Nd`P]]r۷bq]OO):_|qV,ۘL&EQD>J}jhhb1J&p8xr L§K/Dov;Z[[f6moذ'N4\r .b`2e @W^y^z)9yi@&a{yOOsffBubxxX޽;::Dq̂yG-jQ_O07m$u]bFOCw=?{vu]g#/͛~<~xp8ꫯfb3{[o%"/\XVޱcqPBB̜H$8p,'O03ڵ/D"0A◿Ez^`Cv8}MDQȽ%KTB/{u\| 'ff/ vNP|qDZ$Ilg)8L׿u޻w E1e~+Kv;KRBr#˩TG8ӸJ~9 9bb۶m~\.7n( hnnw]x<Z>x<xGp駳E(\r _^z%r9l6(²,_:zj?yaxxofcEQX4fFa~ओNB]]"."cvт|;\O|ufd2)pdCϘ1;::?9 !].a.++㲲2|skk+' >sYQztJY3d|ײqȆ[lx^![\v;|>Ejii~x<uQx |DMDiz{{V@PAeM,X,<yaҤILȲ mjڹ\`HR0uK\03̙Ȳz :"4MĶm۰pB03dYi㩿555`fGVTUfC 4MC>7E؄ _b]Pqg|gF8nD"AFgXD6@4Cc޽P4ocٲeus6l@v3SCCmڴh3gt'C;@(U)QSS90P(Ŝ9spI'?X*F&MڷJ̟?ƍ3BɆr.(SQSv33*++ f͚L:}}}x@D[8\3ZZZ&IhF,Nb!EbAGG-ZEQ'|2|M G B\jgfͮDAtt.޾={мyLP"!͚ppcǎE,AݻV80f̘@ ˅`0.)t"RV+( TUe vUUرfϞl6#n|lHjP(ɪ3s:iHR;w.r-͂@.(fՅ2N&}}}ׇJx^a*++ckX$#CCC''"2*q {ՔX .ZZZ0<|>oB| xwc @*$Ip\0tÁ# gY(#JPYY)P7p$!H@eA pd`t.ifD"t:Mr2d2˗cn8"hN{f3B $"jJ,jr "GJp1u"q<3<|VZex%Ixl6顴Rr` 󰥥ŐQP>jgϞݲr:58GJu]l$T\UU6ºD1cgϞ!Y6µPfgKQ964oMP^^ί*x;w.4Mc!N=Tl6=r96DaXQehllDgg'۹XlM?dY[`+X,3}Fb[W:P2F & Jʝj% kz $VH$*qtHǏӧ_WL:{E:k3g"ȜR䑌A&͆X,!WZȲ̹\nrgʔ)zj&tI8#L,Xh.\ȡPoǏ?7nHc͚5Xf ̙ΡP(n7B!(ˡ^1XZel6\.dY6z9f=xZQ2Fy"ƍ1a|>#];9gO?w}oa/D}}=N'B!l۶  PUU`0Ȇ߿X,R.|>OdUUR .ꫯqW.f3΀baYi޽BKK R8(l`fTr8~&"iڲe#ojI6Ml޼|߾}\UU.x^DQi,$rXV6r BJ}P(Qb(8qe_~yjTw{뮻{q83Q(̪a#o}F:vo@AQ3l$N> N=T477C4̛7x۷o'^3(2fFt:Mw`x3&UU/O}36m$x0?X,N۷$q>`0wyk׮~jhhO>`0h844% \wuBټTCBr !駟 .,X.s9~EQpYgexiJdz[,*U iճV\pa)t޼yǰqF4cf袋#L&a,^oq+D.N68VUta nK,hѢё1 [͛7?dtvv+_ |M躎JXz?`lo_x1{9̛7ڨ>"?xܹBac˖-( fĉ1m43iV^T*e"E$lfvힴbŊ^͛lYYٶ믿˖-7|3gD,~f-|3~0c ̝;v o^?nvӟY9ϣ:B#+ j߁ܹJǍ$ F wt8?<\@ɓw1x<_WBu =A4RU}v̚5 wuK.FŲeh׮]9s&ףV+٬#f##(G L&vrV+aRJOV\y{G+R+Ngݺuu/kիWc…Xf9"{^ɓ'cƍxZhiip8LP(k;3ywy{n$ }@wq.r@T ФI@DTVVF(~g2D"ZiAx^3ؐV? Xn v{cYYtM3f ns=:,Xؽ{7.2>x^I&fSNx0zT6KtvNӬ)=dEPp뿅O}"_tE_$000@W]u Xt);Loիq1 9?Vv;<555rb)tzH$dL&)!ɰ(;vT__cڴiWZu>Ajcǎ)oHd2ɽdJ6;̙3vbYQSX䪪* rRss3N64+"8~JRbFYrp:p\^wO OT+f;{w6MX,r0DbQk vb`0HBd zraxxx&MB?g2b(. I6\g?{t OX3f.[۷YK)N(d`ZADD"x$"(ɰfC}}= geX~gyf>k#n455(++rd 1<h4 Á`0ÚQ$aI0m4fedY~t83'z+&mٲ+mۆ\./@իѻJET,bV TUU===t:nyGBF(3zׯ_ss|^Y]l)%ّr!lk]h"G}F۞΋D +̕nw ~su׽KDG̡j~/~1MVEWU viگ(nIENDB`desmume-0.9.9/src/cocoa/images/Icon_VolumeTwoThird_16x16.png0000644000175000017500000000557112140261562024330 0ustar guillaumeguillaumePNG  IHDR CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs  IDAT8=JCA/v)b#dJ@ ف;;[qY"!gs1ǫS9s3+]'u.1E$zXexw4ˀ*/oЎϸOA_Ï'aH$;;%LiƖrJ#Ds <]!^ ѯbRcNˀQS/UôQ2ʼIENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_Orange_16x16.png0000644000175000017500000000016312140261562024137 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(c?$0aTpdp8IENDB`desmume-0.9.9/src/cocoa/images/VideoFilterPreview_64x64.png0000644000175000017500000001043612140261562024204 0ustar guillaumeguillaumePNG  IHDR@@iq CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs  IDATx]lTEi׮bğ$51#JByş 11@0&c‹ <hRmh H .ێmg{?$'wgs!í{*9I` xg W%|BJ= X4;ypK̑!Rt>GNֲ$}h8ElPZ@ *a@Vm'$Vgंn]~L +=|T^b\pEO?3C"NbY!:Q! 'LwGGRkRߜ!Ź3,ai8{V8B%@R#~xpMd>ic\M6-b lw0_{|ݚ᪅VWcM~Ͱ8# s`e ڠ˂;sDވ 9Rw˚A% tlkJUq1xg+6:Se.:/9.8Ļi֥ O/ #X*8rW7dsvpxO:lK<;\:Sc2Ex&D`UȪ.XԪ)t`ΐƤ]IF_4W8?0߰֯/ŀ_SȀZ?t0Va_y70+ÀlI?hĻNXB\f' 3E?,X"q/% V0cF(/eVN v6 -g $iP4\ڼЬ94I 8 ڇkY2M2C7hIX]ҩ"`BVXWdq߲OJYo}Ds9D~?K^nqUH:"b\yrx-׀xoP̥m~  ˗pZ2Ál7\i;qt-qMjc: ^-)FOzS1̗.R{OJ8ɋmʹ@$=WG F1l,WP +~}+DF%]0|e3~(-Y"4*ckvXFU% nb@Q M/Qe+2z]o-n^5ƑXOc,F4XthؔQ|$0x l4/h)a.1piq: )d0*vTV_ߏ9<|U-4%ǵlfb d*Xǖbz M>;ݰ^pp g'9ad6C(j2s}9X!l J1-1 BGCikTr(yD7B.QPQm |@X&s:N[oH1ZvB[>01^q-PqNKSW`.Fգ3Ԥ FExY? -T<`)[)Hh.Ow-lS'WuwQ^q?!4({"IENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_DarkPurple_16x16.png0000644000175000017500000000016512140261562024777 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(c1@ `b j0t4 5ĈIENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_Red_16x16.png0000644000175000017500000000016312140261562023436 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(c@`b`0aj&C)iIENDB`desmume-0.9.9/src/cocoa/images/Icon_Pause_420x420.png0000644000175000017500000006314012140261562022603 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F[IDATxˎ$K/]{sAi(@z Λ!h,hė@5Q#j@ @H\ا{-3֯"22=ȪD-r}$I$.$I$ I$I$I$ H$I$ I$I$I$ H$I$I$I$I$ I$I$I$ H$I$ I$I$I$ H$I$I$I$I$ I$I$I$ H$I$ I$I$I$ H$I$I$I$I$ I$I$I$ H$I$ I$I$I$ H$I$I$I$I$ H$I$I$I$I$ I$I$I$ H$I$ I$I$I$ H$I$I$I$I$ I$I$I$ H$I$ I$I$I$ H$I$I$I$I$ I$I$I$ H$I$ I$I$I$ H$IҍK=7_*qfO$mۘKk& H. d7^3xzi'I5+~Z{}`5ӚIWGX%eٵ;-ݷ+LvMt}l/2p8pemoY|5!I!=.=״Ϲo^//fhͦ_ˮC3Z3b׶;3~΅m?~&10Қ]ɚI_*/ ê7fGY0yZW ٕ_%Iڜw>݅~i&@rc[/}/ȌB`?Iww9}#]xvJX[33 !Úmu$I]tm߿_ǟ~ݽ;BH6f쾵Adjff\I:ɮ6xzxxxx||l?~=CΒj͚9hf~:NǤzAiz NtŐ}_W___~4;b&˖ ܫA:4䣻߷mOn.kZ\~_xU4!7wlJkkv"y1~y݇w}Զ->|P%-m$% Hּ~h~w߿?gfS6pK̾W癡 =']44́mPha5߽޽wxx5$bw鯛K_"~9>>>C%I@+Zq{??>xc; jPqNҮ,= AY"|?Quݻw VO6pW^3[ZݻwW<دY0`6\+ggu-?Ҽ WDZxG|gcwww`fm^pƣC+4Ms8~h??h/ xlHq' (.XJ2%x'Ҿψ>MpO7oI;3KĿgM?2lS7qۥp]Yi_????΀_}c8ZMVA 0MމX"t$'8*LE#~:o7OwuM|[Z3IDh,f'mc:]1MG>z{ %|^p0"`6ܟIx~W\ղ !C-SLk~4?2_ٻB}|7Rj(iY4W?z߸̠; @s̈;v "$5!&מ];Z=AȊ+ 1- nadfBEz+- "Ib=% `fC6ŲWbcṫMt@U`b0&gy#/#}3:ffA,, u"g?߆p4/!}%95pٸƹ55/ivL<`@ @ iO/j !, WysLAD3t$<:%pprc,xgf?OC<]H)zd麿;$ DM3Bv󟽚H'B3@DZg򶂡D FKaXb,C.!?dO]3I@?tW \3`~=`9 ae_m,-̲w[d$9QI !ݛaV_g@)Fځ Fb>!c03]њ1@CŋbCVp&Y9 V}jY2& &yk<{)Ҟ_'$ IWE| `MwvvO`X@=" [tɮxEɰ`F% r}N-\zI`YZ7$1$&ЮtN+Th [}HڧVޜ;p% kӿIݥ(dWh [9XJ`L77 6tx>CEϱb̋>_yݞf6Y3#hx};=6yP6FSW>.t@r38 u[2m"`>L%:-xIof$}#{HF#Bct 6Z+N6'me.bZ2pFf-rke,L-ϝlxDIX,YR 0$2}fD_XEPMbpuɻB,uQ%1)faF&I@Ƴ&;adV L ^c>m `iUwCZKkʎ KJwTg &I/9UF#"-3 I‘bɀ|P J8nf$mNabf7tjK{\E[\$ 3CPp19?Zʬ{r=R:!3}Ӻ+YmHRߦFuC柍2 E>t_k8#yIؙwtOv2 /XqFu{-840Auil!X:ɦd,ׂU_:d$uHy҆)U;quP/N3mps?b;JYJLg7,y99 my H ;[n&ZY!HwwBvΓrTI9fbF9=CUFٓk5xgID *^=U%;z=T]$$unF0ZC3V~*XA8~r/|TJxhP1<'B٭^k$pF `1&-QKu  r(ƪP6bURL7T 'yBvqi5cyxYNb`0BFέ& Xl&t4s\(]\Ov,|; JOÉx84XBt6:Б]L_:޿"TTۈnOLjx5$!;I晭Bj1F0#8i On:ۈ91yigo <38vD83,!IZ-s71-xʮ+V=Ȩ*"V*0*L wq*8x9u.7e`_Xo0qGwcKRCr]NjH0xk!}s!.Z#I$>JpWƕV|}8ήp0bd 'Z4>)ט\̎RjCșvu4oDKdZÈyRn/[}UصLKKpR5U42*P`0?, &5p(էcr0&;&PľkQ6 Ϛz$t J:=Gue5ҧ#B!Sd$-^5e5S$ I(V`f,b6juVijm\!3m:4s5\YJYht ªP+'Sƫd iP Wv^E`>z?v>y!h"$]B9(bUӊao <00Q2x(;{͘eke٤!_S f^3*Ƌ, VjO;ܖ$I= sF}b'"l\X’TNNFCnǜ]2w_fU7#+gIB=fs|<^K$O #xL$ݬP!L3Ʌ؅; Bu(Pe{b.Fu>>r BarT~UJNI Bffq| cKQ$/.}2.N KꝦ rUZ7y;,7a:.u>0*k#1DTӹ2&4,RX$yIg@\!Lj7'H]8aapToU}"ד9P{ZyV_o Jj$.Q:LiC-U=l0*^939 P%0`IS(Lљ4Buw$ I7# )l2v ͅ;= |9y`͝ds\5`pZ,}6azd̅꟱n4,IIt*s̆x4q3fFӝwƣ1BB`7>ό3Ih/{F3#,gMzy ƟS&w됇$ I7 a/ =3C03y\gyL0wn `#r$S'aQ*W<2 QaՃ^^>"^G HҭPihSSQmg,$4}nHBˡG >8)OͦWOqv띦ͽ307ݹ93Q*_΅3yQ\430rfO<}XM9!I[y6Ϭ[ЬL]X=h^ 0䇲6Hcg`w Ӝ骎u:#Z3x˗v9 0ah~FOH3 ]k5M61\oФioB )@071-ZzaQ;qYgF1lh( Hj,,#s> pa9vDtV_ ]TJKRs[_^{CtN C̷mO'<|*7R`~̹1I@!nyegkROZ8K`Xc |2qbxN!{|;^@D/QT2it3%5?8IF0^,݁N4WcDu!/ji8ƟzNuѺEQ?v:MUXs9u],aTҮ"(^' HXZ pgFKES!i?) ?RWvN}^ZÈu1Sn Fhg1uXcN⒀$*Rf]JxIgLgFgƎs5퀦v-~UbF ]w,v5OjnN<#:r_F#vyHt"8x7 @b)<7%Pn SYW *:Vkr顫)qLFVH&H,?˽0;/8z Uh5wk@`֥5g=<]?ڸ(UaTmtE $)Ԗڟ$P?_i4MXGp[LgR 2]O*&2@;|tB1QyZ&G[80:vTǴԵ{d{MaT7\Sv BGzK/mT\!f0oQl$]d`>ą~Du(umT8g߱Eg/tӇ[d(^=3$ˏ5Hd5x&!6N^ΊV9ah3߮泐<|:rKza+0~M ?j$ IXm0PhWꐖ= xgxnC׶cg4'!6AE&$ƉrfD0CnspxF\ Eqߧ]ì%O¨~Ѐq%ID]-õIcuO%0r'wQ-Yj$Iy'NhR6xM09hUqF |\kRMH=* ^`Ti@3t$ 8Pt4ծ'PT0q'*/o:<WhmF WjL4$ 541ְ1@OhOĩו`= $[ +w( I@%q̃jH-3%`,!XGynBڭEL6whF:gfuPvP0w)ݜ[CtB6Pzj7xt$<p"@1;A$ HRe{O#{FvnHbL=3q[iA-scJ^0|Rאp`ĔiҎ4\, H ӨtNSc9x0=|2u18 B&&rSOiiM_ I1Q}CH$ I΍FSk߅ǎ/xF5.vO aݲJtqɐ!s=$B ]`qZ,WV,w$CyY힒ȹg4QwNcM--KV13s0hڭ]}K`5/GTF*Op 2Fp 4J(4!u9(>Fkh]I ݺ< 6#'{ ےzeAt.A@wX)aK0*1Ս>*CHĘ'haD YciLEٽF %C[ɪ=i$IJ}F91p>L7؟!\}BHIpI[eDHc)`T {Q$ IIDv^0 {+ #n"![CvQ DVItM-9>F0:׵ - 2S0 wZ;}[0*'w$% II1NnaS|[(">zFQLagyI@. I3` _2(OG ŹmܫW KEքbK0A:#i^v.n9 ),{70r.|?'kaN6%T߯G_4¨/O$ݮ,Xr4|4|=Fg`wdӎus rv冾 I7"qxO|cqr ˩̆;6nۄQ@0J If_#b#_¨$yH5ӿFUr(^w,+ڸ/F=$EզȱF ihCrh`Dׇ^#K NI}%4B50ʛ؈Op%=:Ț>vU_?n FyI.*ZB}zMvO^u=3vWk}/OoZaT,m (I4Mqa0ܱT{F\Q̐ҡ7췃t."j|9:$I@kĘp!;`T…HFRxjq:utow)- B"I@tVW)aT"M Vɦ{8:6aĹg42hOQEl,u/s >%Ҁ``sIҐT6͎07S@=F{ H|Ц`ޏ#JgZq0"@sY k#%IU yRX%ka4B0bj Sc`cz$vHb SWskQ%4$)a|F(K0_mNmćm,4zݚ4`b0\S5b /"}I@.xGiNigx=gT~~˗nx(*fKűyPEUvo !LGA$]g!KarSm2|8naW5vvq0B"$?';}'0҈cOdMsR#lgE+s0Zi]aTN$< bcw}0"Z<$Ocw&Ak5h|Y+( HI)0O#'KwچTkeCہQqgsDSZѬ0N"FSr}C*6 @sd6%7ܺu)kB}ghOo*]2phrmJn,4I$#kҐ7/|>Z c.`@)ԕƣFUXI@-c, baD>=rZZwf1E3XgWfPSc%U]<愆F闝N8<4z"X԰dB2m7v,@!YN hB23k@8!FF=K[jӄy&i]PFv}巎$=Mu^rFKƨc4a a2i󐘛e; ( (d' I"hxܽF_#>}jdžèb,9s7p@ΒPBFĘF}렴xu֥ "сOWwO+s+=C+kQ_;FL:IgIO-Ou`>``H}Y9na=FF4'CX=whPk#bZ;w.ȿ-*@D*4̳wFrc\=炜>~6<$v% {v$a84ug_vU0:]$IB5*ᓒeRToA5>v7Y FYa5XH7+nANx,FSc?yw|CBo#B$ω{O!&>vۆQ갑2삀$ Hr,"5asLF].=ǘTo΍jhG%I I5i.4j_.>W/mKLJ(Epe' HRP)eC>i ҝ諎?[Q$I7-n\;?h[N ]`mybPYjd.u{D$ݰT:q-R¨  "wbԛɟ<=V}t$ I7O$3qO4'OW#0uj9 d.,U94G0]ebBv61KH Im30*#:* H`dft$y0=xdӞS=CqY$ݬw_?By:OgIĎwɀ>OQ>&J / Ǿݫhaw\(6LȆN훂Q )\檒<$ Kzم:kk09tky"kCsQ>HcSL$ ݼί F|"jC G h^OFO9,ItRV|H^+ 6"!! kS0*_wLj%IEu]7 ҮFKpc8C*/D {!9#I@y` -yA`Џ תO0}EJd 9KIcuˎy6#<F vJ40ǩ־!5KwLِ[QqOP09V[~s# 6d:mF>Fk,eP _儆̶#Lb$ I;4TX=4λ}3)C74u3a7Q~3$I@y""Tk6cLy_a2-a[Czʲy,ن /B;¨ڎMfYc 6 W֠J1vI$.B $AMNqaaTHa͸ Ϩns='S$I@%m1lwhou=8QgiC (ӿӋK![}0I LAm$z0W␾.CnC 3Kv٫mYѹMΒUè: yG$e@O]lF>6!y?iY!YBM]adMj!Du$ɉ! Fno##v6aԚ`$ HR2nt£J 4a#V{F|EU/d *NnCZđL;:zf5:G[sa9FaZ}{vksfhe/Q^' H4!'6lF[![B?otMFx!$IA)wmӁ `<Ŕ v>/gFz6#Z4H̟@`F@ FhH4;I\ py[Q MD?!B0|?$ݠdUglz`?ӭ!7-T عDRjP ˆ~ a$ ܶАTSׁ}FsHnF($ HRmؿxma8xH9wRӶۃ4Bn+( HM˂0#0+Ksj,lF.o V7EF0*n|;UπIҍ+M@p{<#"y e : Svr-0a]- H``'`zFz`穱*o{(:M!!o Hm CjKYv= `ߪLH"έ_b.Vw;`kQ sE#O:<>; 1t$]]q#FcXGxd>Kڱq1U07x$ H7&%xC{ޮ=F8#WKqjCJ.]gᶯ^Fv$ I"]T :0s=ﶙ zs9 F }?;ϒ$I] T$0èIC1ey!+fve0S<# VpP]$ ݼrm2 `èvr]wjǮ1T6|vY$IA"m>y0d59&`ԳdIsҘtuЕ(15:q >t0-3$I@4f >xw=|&/ 7) HE1D* V7r[;sܱa0j#I@~Bll3g8Yh8lF|&4}&yHt1JTSt-t!KMbusسws_W^yc Js(Iv #~ *(Q;4i]NН"wtƐ!ό&/QidM.bN":/n0V" `By@_!< i)vgk 7MƸό$鼼d"ҰہQu[V,ؾ;5yV#Cf"~d$ IOS:}Fиr!x煱} Js[X/I@&i{L,H9lgHgzFU"G$ Ikhf`Կ]o`I( jrzLHLt !;R]զ7~û.}O*)8Q1 T$ < /i#0b cqx-{or4xc[0_GA,>}I@nCG^gK0x>w>[?ݖ$I@zfa܂f+0/uv<نaT{IPsUI@:!h2^z F2U֎yHĮ cib7xI[O;I@1ݱL3T09<#`Ŕʾ[ɇkF=#'DX>$`Tr_#ÈF 9ostIg/#:o2=$dɀ?Ć#|G ! w0`è2+CJݎ>6H #>Fò<jvy*-_v[^$=$$ M\X&0`T~Gw\ĐӥZ-yFޓ$Ԥ0;6af콦,gu9e3~0b - HRAJF}.㛂C3ȘAaæ`s}$ IRHvQy&=aw$I.ءI' <},+=!3rt=FCJ$e4i2`4L7= |ŘΑ`ħèN($ I ԩak0ФaFVv#<F7Bv$1{f`T DއTkW`Ę$yG$Е6las;Hf`9Dinߒ$|A1q Yq&ytKB}0*)ߖ* H;\1V' t|u!V` 2~^H.+yH=yk|pFoF jMt:ܸ qFV<# @ԟea!I7& Ƚ!MfT( yH;7n!q0 F$ I!n F !/PڵmۍhCt n[ާ~'X݇F vaTA$I4!Ec}_+# s적H Bv5Fcmf 8wngnuQ`oy_,Ht3cSi ShǾ{HQߩa|6#BI~TT݁η19AECaT( HRgMH0L$+xS0*/$H.(w& w'#} c71[RN}$I\ 0:>`4xuk}si6Ca7?! H o㼙 E}HXoF65zB$hB uehCmxF%@Cطe!ak0 IQض`4'?Y q0*Q $R)e=$0nFucU!Ilx[MVP2wjoݻoSQ "sI@cݔt0ʇ`oSR@?muc0Rȱ>;$ H} l'LW[/H{_ث Waԟ]=HyL?qvR`D-o>95-3V(=DZWQd/i{v2hf$ ?9 |3{0 M3n5yzM<Lٝ$i^b:Cu`T4,0Ë7fơj3qu7f<%%IzMYDZucC5=SB׸s 9Lm0}4R7$ IWGOaҵ. %aWqcp̙w̆Bd)Î`,v8$ґEC : ttOᲦ8'"$0&BKP~GFp<ůx<$xcrf]sh;k~N 77n$iv֍Y;3)FIv$OF IsQԚ~<6lA9dC2 b!N)8F){d0xB9,AXJ;paasOV811!>5b{z1cP+ם#Ic_byȲ+TnDQ2* U%G `,;աf8 :1]'$Iڈ45pcm>No?~<O0ɓ VS8G1PS]=qg/m~l1?ofkֶm׶tp8_~?uyО͵ov/olwҚymO]ם&k+Y3I@^`wmvCogMhf?V}sXy9#]۶uWOc><+욹{˗O? !Қ­\y˗/:{5$ac4x<4O!ܑ A 6~M dy,lI?N~O]uO0nFVkV6~P,߇~ !׌d/;5-$>m!ٗǓG\A LtCmIkۖwww!̎=djW>w-VgCSmۇm_evHk՚xҚcY\fyI0Zcy1>>>1Fx !|ИYQ]︋a3T^7B~mܼYP҅;]۶:wo+8VkfSo?Yx<싙'Jk M֬xI^Y^ݻf%I@3zJc,O}PYQ94ȫX_fօ5;mxͦkfk0$i:)0liܰ`%_ѥ[z`}m#kWk&J@B[3k]^FP%/q,WfS5v{Z3šAޒ$]_n'tҎ6S.5Ưm+So~ÿx5Yz8]PڅnnцZ%cdl{.7]a}ǎҹ/|)!kKk{ɮCσ*<#a޻s;xK|+XKkɺYu[T 붶YҚIGYC8ܶW&U+!::4p\Y5TC0NV+ٹ{JSU% HARYeܦ<7 tL [dk}͚M76[\3: @A@]2rk;^oK֬DqjHj$ IѹΚ4jʯ)P:æU9K`&I3pKF휱Åk7^0v p%i;~͞rݿŚI!iiZѹ3sិm_ ]aR׮$ IW%糸Ν]Ĩ7|-/.5<FԚꚽs$iCP.Ky%0>q'kv)Ak&H@6K3k*}rͦњ FZmq)d{]_kvk^7(& IKk[ִ|KP]{/kop욀$]7.}v+ozF5SېΐnG`kÚqǯ_5ef H!;I$*t $I$I$I$I$I@$I$I$I$I$I@$I$I$I$I$I$I$I$I@$I$I$I$I$I@$I$I$I$I$I$I$I$I@$I$I$I$I$I@$I$I$I$I$I$I$I$I@$I$I$I$I$I@$I$I$I$I$I@$I$I$I$I$I$I$I$I@$I$I$I$I$I@$I$I$I$I$I$I$I$I@$I$I$I$I$I@$IvKIENDB`desmume-0.9.9/src/cocoa/images/Icon_Input_420x420.png0000644000175000017500000023621012140261562022625 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F1IDATxg$Yv~WάҢjAA\rl9cic{fvw֌Y$@bhh ]ե+KΗOt+eV1{"ߋw9>FDh6huh6h6h6Z@j6h6h6h6hh6h6h6Z@j6hh6h6h6Z@j6h6h6h6hh6h6h6Z@j6hh6h6h6Z@j6h6h6h6hh6h6h6Z@j6hh6h6h6Z@j6h6h6h6hh6h6h6Z@j6hh6h6h6Z@j6hh6h6h6Z@j6h6h6h6hh6h6h6Z@j6hh6h6h6Z@j6h6h6h6hh6h6h6Z@j6hh6h6h6Z@j6h6h6h6hh6h6h6Z@j6hh6h6h6Z@j6h6h6h6hZ@j6h6h6h6hh6h6h6~B1־mܶaoy%- тGmRmu68F H-  Nt+R Hms{~@pZ@jX} @}gfnIŃ~lϤX߯}<20a߳;vgu'?x{R-,ew?oi H+>h#Ua@t,.:0;+-8RoW j7 Non|Z `0t t _j" @c) ɲ(֦ij֤ `N՟-͘LJ~qZ Hm =fC0 D҅//ι_|1Ƽs9c>cL~/csqνxbzzT  xD0Nҽc@W. ݑ@mZUX}i"("RYZcTH$It&2$-7K҂(7Ro|e t 2 t:w! 2Bs0"=`J Gzq𑎵$|y'Nu1H &I%Tc??HRȽ:MDLPF g W.H+E֍Q:VjāPBD?&DXkSkmbɴ։:Z'h4UiZ2:(k:x٬9Z~\mɮ Yv*U{Y6Ty ^ya !b)e,9]y99]@<;77N:Y[U?8a$:PZ,`9|  0dbm @nT| Ak(?  h=ڡs"MC\0A0j3ܹXvn6GÛ׮]z&ck턈&ڑZ;2ƌchee%ɲleY: Tj49 kƛ ՂU- dA{7[{SQӑnt:aq]8=!Ċbs㜯J)}׎X[=|4Z;z<7DqXI]"UDg e8P&'{EN@raEQ֖@@G6- Ef8`%$a` OTRfa ` s8W#g-p` JvnL7M77_zKځoc1(JRjtFId<hDƄZ:j༙-ˌx0 q p56BCu6N?ȝzܷz^ FY0"`/#dF8 =!Fig-w3VHW# qJtYQ͛QH;[Z-g@9V`,!5C?an7cڌZt$n^}}Kk;/=zZyގ1f;    }$I-YDӭ.Y XosDj[Z-M,B8{|@mr|w0?`4RM>TY,Kt p3;6}K,/({kƁ,!aYX"(0N;V;߱>ë n_g7.kmyAs>Fj<+5[-5Q{HU{Pт[y+{n qnw:NQ}yzw?> eK H@YPQ^y) ʪF30m@Β*5ld#ʍS Lahh hƠ%IXL&“v{֏^xz{/>m!E)!Ėr7ax}Vyr&^-og"ֲ‚ݪAUDZ8EQ7 r3Ѿ&\S}!\-b#)Fsgg> TQz\dFKP(GDsPT~X`DR1b0!AY@ m-v3\~dzb< y0 8L&x< Cy,}yn5tC!DO&Xm/_<=߽i)hninTW$&2[@ 5n-dBoHު[B0B/<9{B@ !y$١!ĺz߇8vk)LY^f@#XltYB1,XCw?/W/:zٛW/;PwJB)©E@QDZ]}(Dd'$I,խPG5^C- &iy BV`(/Pv BdgPJ}y䀨d{bW܉3/ꏱl=a7`T4KˠdI(W~%(cθ^=~d1ҳ[/>}kƘ˚FNSo4&D9٬mQZ,6ްZkUޠ4M 7R@-˞nŒ㇟56Ȇn`o{7%=cRv#1V]G/Fs1VBs 螼cw:qq'O eE%$v;.qYCBt e:*/T̞"XTB]-R453똬.D}fHMhXjze $@pG@.ˤEb GY=k}$i3ؾ}^ȜB$ DbU 5N\Tjz/f y0 \D)a{ pɄDu:wy vφlp07qNaVn rYaQ1aJ)eQYiJT%Ib,3i%u?ԛ)-ٵ@O Qyy"Rs !ʖ e 1(H><+"<~߃JoرSʪ=t}&}QX6 )[e*԰˵.iS]FF2@Pb_QhajfGu7yKXQ$iilN`%c : 5R3h-g WBIA181P= k+!zйC /uf4NQ__2p [dMRPD:PRNռn8TkXkӬIdU¦ӏl H-z/h)A d2B")e`q`j+mXx⁇k^mqu7<DX/)/KЩNr bݎAlu9j2OisY "f%8 ?&XV*>R2"׶rRev 9c,EKnv Y.9AYK 23M `Ekc0rG%HqxaNvd'4G7`Jv#ׯ>1Zz(7?9:*8QCU LR DKhYf˷ DZ~ay^~@]^+h]!Īwγǎؑ;8y:;{qW~?yGEblQjYd-d"\sBp'ʋ{KͤrEFHh2]dmk?Uhd2y/_Ui\Uz^KPwʳˆwY pG`I >2,gK4_dj66Nc() B92jc0k4R߇,Is5p=đ1f@sxҡlߘ]wk_FDbvJk= 1fd*Zqex&X2A@̐92@Paw7EFxbeS+?sw6Q__{SJmcnj0Z+IVVVI$XF#Uʚ-j{ʖ~-ꀨ u00 ^=)嚔rs~M)?r3|Prh7Okwa 0DXዃ)MlTlUnu4 @%Jv{DB#;W^[-QY{mgU+ee~-hAm6bRі^=ʇ<3#H*di!^bja`^csPE֘G@2gSɣ9QKy Ze Ȍ,qxޡ{Nӏ /|o}᥽מsCkv{Z4MNgvpTzMM mvΊn<(:NqǕ|_Bl::~ęG?z`po 7 ``fLX>U%e/p Uq}mq0j>TB?J}:zu,)ٺ'5n .eO93KhT*{-_ˏU̲ cFA򕘊M R?NtJrC^-s-EK&le`sR{dP`EZ)n2Nԍ?xwuao^?V&W=ϻVaq<ǣ &dLMn)[o5Z`t˳CS@d@j& W;C2|/*04 umۨ5T1#BeOJgl By,9jxAa\I-1MS]Vny2O0jg<'&yf ` Hdܫ L"nmg8 fHaobW{Oݹz豏W~Ov_R^}7 ð?FAA\Ѳ2^Fޘ-/--`Q(d n'}?yǙ{˟|޽9jĂ0|$W jXBÏTK F]X`vVhPj2*+14+0PM:_dYU{k v9T!c]"4@U˨߱f˙\oz*U|:XV&0曚]{t<1'_zD0Lػ kc K8 z1v:'@<s$b?˙˦XXh#ӄ B3w?Sk߼yV;Q  t2dc,/ F( p@V_+* 6w")gA *u%rv24/{5Dl乻"a~ I;3/|ҍ/)应7 {7WL2Dwpk/4M&IrS)w?VGs!i.Hu󓙢jKڝL=vE ?i@5}#[[ZTmi%ek.j.5eKEu!$[7Z$P *'Qӳ[(ֹMKTfK@눬L%Y![hsrE:0¢\1W~Z*x9#%>AӸ?Nw[hx<4oL&,FiZke1Ddcs7zɳ#^rFv)=a2 \X0EZn@z+'|W'_{Iu7<zrd=m"W;.Ħe:^IÀf,iqv@nGm˻tJ"ARf3@2s2<o}_63 !Z-g/,lN 8hp7DbY)ʚl\ʦ 09X-ԷMKyeZv3(SY ;?+sRM`dK%@+yt%x3d_{z53\hrbHk cVJ ZK/gnqS$0-Td/$, .klDo;6O=?__Sc7;Rʑ")ԧ>{lh F""NE }{><_;?S!Hט%uVubQ=grIYf+%08tÁe ١ dWyNWt|D_˙\xδXJ#́r!qsD-ŋEZ-Ur-ej `Km-Z V?9f2MKF%V7Xr(غFIrc< {hi6IZkf@_Jx+7=6u)nͦ <B鱆+<31cs#>{3GŸ%c,GBsP^(@ ? Pj3qSEEzVfE<;[߸#o@[ ݒ\VTK0p:ݍ36`'bpjǶZg#@i 2LԖk [)٪˔uWԗqPR}h|&ޔ]\g2Oak5RgY[7TPڛgW+b]dFs"'f˟ ˓Tp}ZaP3/J3#HN3)t0ں),۟L&ddYM~D DZk3Ld2^?(;V{$(1M BD* _'W' Z$d_WelsJRJ_WxokP?`$kkkjG(:w_'lPp9*ٜ ]Hr]3,Sv+zCjJf`qsXVrNK]u)vT7DU@5(UᨦD`YYPzx8GVh5XJuSjU?^mriϸ|lrM5:2U Y X ] 5& cHkeXk(RTin$`J)RJ%ZQ{u?@fqRfA|Hc if(4Hq @Q Pi  &G?O~I|w^8瞛b17Eh*YI%FJvAp&{y=? 'y: xy(DlV{j)Rer3#6Mwq޸-6F5VHned xohO3wzk. /n9pc <+iUtT"b5==ըo/ԴQ)̃dkA[*, F`+XG5 T*p1>7[S( `T^g9[:GRyt'0M@I !"Ky)T*gJDDd5 ,_2mH3m[SJp<ߔJ)+(P)xPm<>מ x8/M4?m 5xQv`ŸfYfrFJAvann+/a ݸheIBJ j]`.Xz\7 |>t ƹ{q Va88MӦYi-˻|o3:JfTH5Rf8;{K5eDueji$|sQֲ e:MDͦޭp>/Ԍ\m~ndKr "Z;ss.s^d0 79c+qF{ij1)LAjXKKKňH9 fKEAjS6`T Ԇ(unia(Jw- ~.%1H)E{^Z }ϧÏ~ -ثq#\4+1%?; 2̈ xockf7Qde L։:3dcUҾ@&.f5s#uCڑWڡt:ݧ|F:r׻?O"L.oM>tB[+?Q`5P EY)KeK&E!3Z \b0e3yP;NC4;l`:Es}b0b̽%s>@rZ+c-Ȉyۺwq1"RB$IBJ)rv Bqweee ĩ{:=~XXmAMTIu:FA9Ҹg|ɡ4!3R`=&Іt9G'~Εq)ݗF$^Why<7ofYWJM8}?RFAt>ƉoxʊtF `cKbwnw7vws-˲ae4MGN2u+4M'N0oG5߹=wx,^D/ԩKW\2|SwS+UձjaQo;z2ƂiUc(9FC]Ϩ75cKU+^SoDek>;M])pH0XƑkdݟG;B?(I4MGY -8BA p5 a8|_'] sq*3ͧiS͔? yT5(Δe9Op"uVi~?t7QZcl$ձn~Z{3zܕ^vQ};S?[hqbr8:g)Zy-Bp3D $79^?`4x> /&Ie\)}?<'>N -,! 0h$4f-k \zּ'g?+G&߸Kד$Md/MAe'i4dw%lh7]ޟ=|$tzP}u}EP&WlCYm.izJqQ e 9#4ju -/f0>`j1ښo @{s5} <   41'I0 VBN~q:^õ0 R{Z:%"e1p%ܗRƞxwc~S,>vSXmaѳDx#~G^xa<ޘL&;ɤe$I4˲qeC0βd͇#Swl^jaD FT3\CgRۨo4խˌ% u`k+=R4곛jύ@K̨VDfV l}t /H ȕG 8 `k'ߵ=g?˟O/McZ;fE FBbǞ<ީ{W:ӗwg0i`h&,ExKcP 3x#U6r9H00:+aO#_kډZeYfv0ؚ,Qv̒n V(Au:t8,JuBbkgs\2g1/9{.]|- ^yUGI)R}?h-#?OTb.RSB;«T6tj*VT:o9O|_ W?<ϻ>@)(,&JRj|iO_<|ao+A \Cձ2WamZzY^g/x|"±*E RӒQ5[n>ZKQWC er?4@\Krag+'Wۯ_qs.}g7Oq'\;rw衳sXe`3Q, `dK`T%B4RFͻ9Sv`ȴ{n`aF+$#?>kpZ;2LRβ̦i*9t-K-&;~eN1|쓿#crfh;¬ ?$S6|/y-7G$~ ^V`{ z}tTkA¤ a2[3+TQQgF 6Tc@.* X3gTgHuT2ϳ5eJLLjR 2!v; w<~t[󧼓˜͖d)- VXQg3 wg Djo+4Э|ERnv<$T!=꣛ײ?}~c`*&Yc]הJwUteHJu۾NS <<#ƖpSѴMv~i*md-/=iԥןGѵxoRJ?Ns~铏_ #=POS¦"B3RsՂ` @vEݳ]ꙋ(Y%IdIlTۙ԰4CR((8}?I~!3f r06IZZdd/b6??=r4n{ÿw|ׯ2…2>UYnQe4w O0$ZjoC[?oȌFab bA$^“wgE TF2c4 q ^JQʋSrvX03XPզkbY5QRgL^ \Z qKS3dc0xJiT aaSF+dCp`ɜY!i 8+fF_d`ʖW1 0Ko6!r۵[C>RSh0Fg_~Gտ MIie-]Kj뚲:az^/t:A}C?:T(vl?Т/1]1 z _7^@sp8VJeQu?O>OxubZ:^(5haDH4yŔonj}ϧLr|["Z3Iͧ4cݯHqԿFO;e>cdZ,*u&P@4jv ƀ Z+@J`e!αhzex_RtNivBr% 0QIBFIFŸ"4r[Xeզd9,g "pf8CqglIۗL懬yYP0bl~.M0|rAb7>Lgs;XU,wZC*d]?u\g;N3rFMvӽPI zuRJt(:alȱ/I,a_;IshƞC&^hM}<`gف,B? nLJO=..l64[*murݢĘtE`Ytg:Zh$<?q=nV!8Am XTk7MѲjˇ 5=E:SffQNPVߤPT[ɀj7ʽK0|撃|Cx2>( ADH, 漇r2 -KM^CYր3y ;ς`@ 6]!S]Qܱzyb^06l Z5 0 30CS! 2@(ĽG<_;NEN&IJo,IF #^Ύ( (Z/ /[1FEfTv= na_@ڗ.?O684 XJF|\+z!xb> oZ ݝ&g,|Ɲ);ƞQ\ qVIöQ/z_E'|yw=M]g 1q3kSkg'0 W ݺ?LnoA9Ƽ՜K\<7F u3 0b5Fn_!4O$y Ab3yc]_!fd{eX)r9ݞ_9g/}Nc^Д3.8Q;}kb`OkGH<5N:sVKj~s+9Bru큇J-]Kب#/N -Iח zϡj_.ʳJG䨺#w|>><}-0$IRI&~7Wzڿ+<9fuL7+TβhkOԵIsW%O"oyϨͣAVk5B.9+-+\!$mϙ40.㛓d?IR*uBShس+?~EvNa Ad՜J?,cu]T3;O0C]gW W:d22L$KdW[kc@$ }(Z p7Ͻ:1RB M3Π ;D1>۷;{b~yl*6 ST Y|ߗR@q;w},o\Jdi^)=t9Rc7oڋ:0H5y+Ǟ|ѡ&LLryD ޖP]tV C9{H~4n>}=' !X*Mt2 8Kfz}}Mk7 ae*۶aѝU{&F ZfUI^gUӢGDh&}(A/#֟w^6i`0x}0\deYU0 FY\iOwp9agd.S~2}g۬z݆bJJvWY&3pxe4aZxd~L#\ tZq(;'b^~'e2Y(Ǵt7/lfPhf`Ωv]1,9;/␽w0^p8L4qkSMH)4M'Y%Zkz7V/;aS&<ϱ ^;S9xA_eul K Ll21I)`c#*/4C- Of3k +/NvRY 4huIGi83M3@ ldKwB'C`lNwoo$ht}0 $Zz\ф)pk`]->;|7vԡU CyN18-`*}1[\o^GC2<ι !_OP1ר~Y4thWޠ8\vwcTj1BgέNg:b1ngUKTS+?י|,?& " έV !眈Ȓ,FJ}7<Ƅqm'liLWꮐ$VJ%0JFS~.Y{B7VSֳ3Mhxs.~hwGZ>FU0*7klƵF,h)0;װپj'˲~$qiD]>cWm"2Zki2Li+߼zzM CلDNYVc λ:[)"yf5t H_ϲl{<d2(2VRD݆-#Gtɲl{}` = r "?3I 2Bn--`Guo4 ι ߈YNB0LT)X91&Eo5&/7P-4uvUw r!CsΊݠ1vJQwwIݓZy,F}og1%&y2X h=fH MS3jd;^G%ٗHa4riM` NDk=q[zSڻbna""׃ɴ։1fb{N7NYNlv8 3. ~FSQV ;`3GeZZK^gr})MSD)5ZpN;h!>J3z, P2nQbwo(G*'+kMߋ2higK |,ȹFT(Qc>|ψj{sWP#j0*\>h3) ;A|4Bt=y4}QʖRJ #Bv:ҤKJ!@71+ϮesFEhӠ]5.R幟9m?Z#B5\̌Rxmʸl}I-8OtcA]h Y"53rco<$t8W(Z}?w2H` *)5Y  &wPA ðRJ0%^xǣ(( yrLý\p祄'{Q]tD3-~$V:v\z|[3j{__rayYGƣ"ȴ綘gv@1hZfolUpLzy-nQ&yiRlkdw^ꓣIaIψ&7yE6PSԤ]jϨVciH.Y,prڶE 0bUdnfo$q<֎(!M&Ie֥c0 8^q||ę;zÛ0ί)Ơ6ȍ|?&/GAЇN̫wq)Fڌ1fcֽLF]}@Q^vף( ŭgS,/z fܩ θUh,M,0{WOD/ {‘uY_hswQx'ggkRzhWA- xjU"ҲuLrg. 3YgYjsSATc;7L&XV[lZCP Y/f^ X3XJM^=ZE^q?-qe孂xnM ÜxM6^L@sΙr<$I,KReTI)qvq|Gۻ~{m 750!)8)t{+v'řc"c<>Gn8jT)xaEQvW{n{" SO~+3Lp@٩}c 0m$')(ahmT'Ri1M"%jW]XvG.3^!R]_)Rg۰L_?ġ@TXT-SF]cinqBw2Z)Jĕ"ms)zԑ]^=X61M؈uZf;=֣z׹~^-">GĦRVcU0fWIYBX=uG?y}?h;MAeuf .AAaw\:f:w2 #80i1 8lמc0$IFiô08\J)< (EQt(a>w~pϟE͝\nQ-U6i7lJ?LW{=;cFRZ W>O\}D lWV3k |16cօP)_?nҚAJpK6BUV{~0KT/9Ynl:_zΞדgGYSP9="c 3=^KU9*ujj 0ZvCjwY謚(0ؚ]^m͟.3%~FJ  i-$g0+p)H[3'G_WZ[Z]Ԡ3i9)e qDž|[~swdn^!W猃Y c,L=./"!G4+ZO$I)#{ApS_{_鳗]90[Ŋʂ XI`+ Dv!jA23XwVuΪu LOݙQhgq+< w;BMKs!SJc4M$&IksNtV\=qV4-T}jNPs4P7gSrݴ pmq[_Fwƶ&W4KdXU(軜󠳱酜;:fa4hwPutʙ*5dFX ̨zѲ1?Zòea41 W;ҹ`|Ϟ/}쵯&;7cckmGLtj)!@Wz]g~߇Zk}|-03|i\Y9Ndde-/ǜRJރ >v:E6yr\tt{`k7ƕ-Ut|J9&WT`[Xk`8̐ffzn@YLF )>w|gvFG ^f1)MġwSg;<_7nL*1QޔY7.%0ivRMJ]%85Vцhd]Ly̝9w}v<+;_fȊ>RCzݗ ^VXmms :o2aOجlS͋JlMW cb A?s g/I'7b l=+롔2rRJc "RJ$Ix`{ŗSG{BNe\+J*K8Fˊyɑܸ7?heM^Md2'IjM+` 7c !бRff cMGw ,pzK=#47 I_'6H+a?C L43{=ee6VYh4:4 sgRi` ]m?LW.7Vy{&Ze5*/a\ a]Z cfRXZ d.$|&nG 4T2j0otjlz-\1/!Ws=u'Nx !ĸ$:Id4{ !8S1u\79 1[٥9s dW'X,)9 w8L Mrvgwp8.eGH){G{I j-XB*Qu3jEZGˌL¨8-FdGFes윴 `s9&{$pb"+_{lvZFL׉1Eή;+gn`cpma9re@dL"f|vJ˧霸@N -')`dUDLÂeEz&Nl!&~Ha%ǀfwdZq/`i`-7Q9rn\>s5AKf I4q_\W~߱w>编h.U`+a-d}l~qblZ#K`2U\vc/wDOpxu8nFQeko9G~=֏<ՑS6/U^RhЭeFՅ}WeJuzmȌj ΰ Fjr)NJ vg\r-@P n C<߱ɼffm2MhffR?Α s9fLcd*_# >+*,,gQ%B"&Až2k uzmF) (km}%6sO#jFMfTi nWxך6d5 8Ѭ˒0LG gW{qWyw`A |GETm>7K# hR`ʳ?z+gVW`5iBEQa?~WwHuqK :7A"yP*lA%zj\ۢ4/S:KZ?`k 0VTFE.(؛D.mŸ (,4qRjiXHT.▁Z9DK8Yeآ*`罩N= Brn\7 0c2"ʬj}.Cʕ{q^nh\SJHT)".` a{G E('yiYxXizWtҿڻ_ya0'{^r~dQKȘzM J'8Kw l&^̿&_+FᒙeY1ƥeG 6|?|C; hjVgjhFw=gTJ]tt4W4)GySNv t8;,Z#TL:0#3@Im`_ٻJG3 9 ynp kX\cq[XYAY9rblG% Ǧ20˒>PQv}06ud\_͐~Lvg`u޸;\i*)%"~J}ˣsߴ/Fkp{0 0; t:qǫa:|w쫙uUj3*ZzFl[$073*'334_*j*2]1)8 &, ^NDka9豂%q*3)y/!JP?F7Áxzxty<_F7Gh4&IfYVd<qJLJ 89C16)7i-cc -'w:]%l!KWA '6_ ꛶`ȓaWA՜i䙍K-=j"9Y.j,R&˗dzl\A0Ww9~.0up}ʹYƀJV`WE,&H=(eHFK@5QJ}$ƅ=sO[Vr^h[_Q8沦wkÑ>~?ͳJ=iG2q;RJ%Y (ڋlke}|?x#Z66ˮ=[y6ML.k n~o卍޳drs<Fx<jf9gnt:0<~8k_c]^(MWd4s:xaԐa13l-~0WTM/Cg2]iG0L0Ozѫ{ue2J:ogYZR(-S <=\m}ikp&]}$`;kܔRez7~*WԦ/MAYJY-Zzs,;AwY=#6mǜG6Zψ4(6H i ߱Sqֻ.Sg8{_71P2,FuYeIe4M0يU0ikՑruBoe ~箠} o"!پe-5jlw5˲4Mw&xOz5R,0)LFjNE9< `~3<;L.O&ɤDZk6ĎY. " 0 QF?f;/= K#ۺp-q::,i7r,sN Kսw"װcVъg'[یo;4{w6N]cD)5QJ,i:q_IiUv̈qzʡn{"~\v~O3 34fF9&S2]ME=#Zn!Q5QQ1O*T ~\n0噑!CvkXS'/ 7~c0 d1R,2&H4M,K1r8}|샐V+YbiZTql[6A+dJIal9sKrz_Gַ6C1 828r͖ Ti*8Js467g*2K8 ل^EW;yFstYgm]&L|9YB5pq9D,$PdYΟ)ZB$XdETy<`eeNv:>'~72:`L/!CC][[oX,aRMf4dFsj(dAvL4[حr)/68]Nx|}0ld8ku5'uV4]νVJx[+w7_9,D(8$^fD͉JTɢ%`T Au|3Z,] [@1gPX"艮uO^㯳's"l1Cg:6݀,É^Wqu*<l4r笼c`,2yRRӖBcqg^ Fv}*沦/O|qL2sꉟͿs齌}k'Qqd,0+`څIEӹ 5!u#=(hʕn?0bxe`r<Wi$x<$I(RFob+*0 p{m?=b\[V tHGDSGr/ sJcx,8dGH(ųM)B6C1Wj81懛;}",PhPȇJILrq% = /J!tV!D)UTh\( "]/:P*fQ @řDE. C/zCNd>{[Yfa 0*ڴAK: T.KՆ3Qg73VP`4eC0bWKd"ޜkqhQ$ɑ1fi:v~\>`UÍ;R+Xk=8yDQvE4]%j0ٚQN̕* F,\A2:1?7眵sJL0<|,dĦ'\ ewF] sBz>c*#`+ފw߂9< <_zcgk/:Н9ϕutt@&7@,$V!,l}D%er9AI6#t Tt(g2bR؜ gv1١Jz '5\&Ǖt\B !O.KZS]msRXdkCG0L#u@SUݴD&zpnmRJl-lGF\s-sCq5(RyPuh L&Dq}dko"=ϋ 9 ueVJ"éT{iu@ Da(8{Ng-(Nƽ޹ͿcOo[ !Fn֕7ʀ$徜|sռ"G0k^9I20L4F{#Qyʛvڌ10.$tyf̓掲D+ѭQ5qJ,X}tѾg$ @*_3lV8`QΞc1W:1f{3LfbAϪ6$ӡWH3"{%:0#{yUGHι.|ZҏAN`B_ЇwÑӁS6[8[1OP,bO;~7Ng ﯄ax<L&YZ;8 (I)EE2 NE(60<#w1'?>K JF:3`C||P0&L\wlZ7 B_wĹqDׁU!3zs`2 Vo$X-zFNR؂y"\(S=(5y`ڂɫ ںe:WDz[I ir@k2-mɚ{Wgn36C\p1Z^}?|oz3A\ `+$II $I&IeRJ&n8̭]69B0)<;qT?8 nkAlAp4vOW;ϽGߘҕ1R,tf,`Rh2C` `։1K $x.r!Ξ$znQLWuD!It6mFn=ymN4(Î >0kAs  <ԀlMW& ^W֕X. pUچ'+ni:`*T#<5c (8;a<[=O}_2|^U* PHSi*rThus5!гː ~H?RQNZ7Dî 0Zxs*5P^q獢`2td(}ouK|O4M4i:JteYVs54ī$W`·i /}C?9pc9Db4پ05Q`fro 0Hf <`>^Cvԥ` P$JLJb <~=C ᱔;ZF $+v!d bAg^;}z{J1&F6IfUUF #(nQ}O~x~j7c@uJ |Vf+ٹ2 4-lڂcK>*vFl]* 9&'cV-l4K[9eI,sg?4v/`eQ&7Dsll߹O/ş\}i2eٶRdY6ZORR*sTnimi:9K`$˽}g `T F FJ#gW/H(o [tm5>8rcLQTR5` 9i/i 3\zOl^%i ">!Zjd$ @Y(lW/l(BJ)$In瓲,~sr{kK>vs.3j|6N?h̺25Ai s#PR+BODyܕ^$@đ"%^•sdUb;tl;ΐ&4͆jZa-N%$0+,Jj܋.y?ާobڟ'n6ƌ>^ - "~$.*B (!־xW򗾲68[Xh_a0҂K Z1?~ Pϲwa(eY|G/dqks&D5Uૌ˽Y/߹uˈgB%3fh-FV; * 3wy#jz7D@!w eYn^YJ:Z~+E OEq/4Mo[Ƿ.}zgKzVe@HG閎)jf `mk+{?k8vY%BO(^ә$I.$Ir߾Ψ5{5Uj HeFBha)ܘCn+I`b(Bՠx HO:)QQH[ w)]A *WRW.KP\5@ZFeXQy-9B-F9c'!Z?ʫ7ֿw{p/x?]U(~DDfr앫^yuWz.Lȡ]zc/Pֺvv=EnHqGO݋(a{y˲̊(/eddUNHϜK39&nH"h`:5 Ы2Dxjs5h'xj@_nRy($c[Qf4Z˯}IHF `QIp&쯭G+'B1a4pd[d(5 rƕкXqO@OwqO,{8L,Rw0}(+Jʜ$Iiv{_)Uos/iZH9 (K{ntuC/ 2?1vw}es|2mv9Jo[o2X듭C|VzPJ{^/Mӽ~; }^Cȕ!lQ3 ]QgOЖh(5s_?gރk?ھnjFSezg/o~/_>l\wwN`m Dry5<)XMK5h\T biٗjʷWɵZh3uzJw!9T1b4X٪tuÓࠨcS/ᄊ rm1.kr*/ Hi5ǢUohJ r;389ۭ6*6] Z$5>3Ǔ_@drs4=FdeYQ{/831Fx=RJy$I,yVVV&Z1|7GQɺ\;p>w)`=p}~sFDIJ LkFx|<N&JGz1mf ߐ߄(<ϳ4M'ޫhq٫~ѓ[UP؀t@rb"9ALԅGw tW~_B `Ei_z(ŏJA~qKB9 viڸ7cNAe7gиAF9)`dsm" l%F4!"ͣ~?eHGD >YuI c7RaK֠3,MDQoL<3.b@D{H5-*'IVG%<2Ѐ}4eO骡4lAFT5ð ~wd7alh4d8?88cs'Œ[ k.R9;bn^r"g@Q 02b4T(s5s'\gFՃp@Cg͋+KFׇh3LyWӡgP YTv&WesX0-+ߺ.@f~l[^x.`Ю0qqq,1 B\'$S#= fܴ+ʄ Z#PU avf3uNբ~^V׼\ ͦBܦBd/MJ)e8;/~?C>#\ Qpwf zËMӮm0f 3(0 DΨ!u143.rRUqcþfKU$UF]BCkWg"N3@%'oaG_]*hEQVt̖,`p t*er)<0orҋ7OPT5h%!mܼA~ q'f}m4w|fT(C0u.֗mh߃b"fFTWds@zH(amOd/):`t#аizZxY8UXpL͖uP%a ,U3`lIYe92H Xx2Q3vBY}2Uk>}/` w~drs8;88(Jon:O%eVrP"}_]u%}*2 hc1<䎎p{FUY@BBUlo;Qvk4hNܼs8E4oY{y ISgBw(c*"YɱV`~BvxJd1mTlFAtlm[t 鹀ƻk֛`䥃-Vxmձ4c,[Y !DǑWg ev߈vZҫf*1\OOu&%8;}cz6Zq|ȧZԖXQŸ %P޽Ui;h4F6A+Q2$8a  +dRϞqɛƿu1[??` f^h  F|Z~F,({Pw7e xw<ȵsnՕ!$3sYb'&Wջ|uI=ugUxMKK6w25Pe* QSبPF FA`(%W((Z6NJ.'Vir\TN-P:TJL\H܋ 0zq)4 ;2pnª)ln\iXƫFaRj(aegԱ{(Qq1F;IbRžzsҵDZ[SKQe!aB_+v˲/byrz23 jcQy>.bX>g{ۗq !TPh%/W3~ _ i ੯FC9XIu}˵ 6sh7b, +brg.q]&MU@HRDC@=XڴT^B[zz*E' 1jMv.88s٬MEW)x1B7*N[Mє N`thНPJˬ2+-Fx0j\i<L)E8,ˊLj' 7CԂP,s}`1@ߤYk.F`l}.(!GvmC+Ӥ{ZXSJS+ʶ) a_&}=| ,#sighuekX((M8$`k6#{2ꡢʒEg(qO$MDy nuyQQ$2I$ごree,"! >3wZNaϟIhqrȾ'6DRʈhV|\Pu:!C+*CJϞOW80c] zUϨZc @*`h+?gTQ݌9[َ'UC fFBEzvXe򗠯|rE[IA׋(s|}?^z(6}^Q"'z_yH/̔+c%Q_xhXk!ܔeiێh@¼^BDQzxeeev￴_/QX֪h~}HHVl%vj}`)M&qQ0ư~n3f]7?oҕK+++zZ}W6RJ[_,dz^YSCCYm 3j;@~Prh#gU܄pn2d+ReEm(5yꇴ-CKvU.]alwSh$؎o潄Pux]\+nӺZ,ՋTⰁȧ&JDq΍i;5za0F+҃]?o{[iXN&IQTK`5PXFQ ^ `pf0\z/mWֿ> \kY('8<狔U-?8T:$w@ [}Y|k?1>p4M^',yEAZkŌ_R$Ii`0X R%M/k˿7|]}8)[ MzΌsz`q0 2Z㆐j8xMgtmltCQtA"dc#?$fO(=OVIun͞ww^/ȌL`Q;!>*px:Ͷ(x qlY! c\/6 "44,[뱺k-qOq/A+~(,FygEQ\oDEQ$QO$z^^w)I׷~oοO)Dڙ-Z'A?|.k 3~t}wKD@1RX93/1xEQ?I~0˲(*+2B)e7C3(MӸsz~^4qo^s~m<)H X@oiYɔ[rTKA[m}#,(u녠 0:̨FcdWD,*بi 00-\"Hz/Md|[ -fSpO /U.Կju4@BC>o1S4jss <(RU)fEg+k/?{|>?|kM@!ؙ*Rȴ!覞b6iӦvf`2 KSjBWb0jBˌO*r#!DJDϹ da>vBDn"&4:vwl|0j2smINp*b_W"‚jA.-JQ9UJz"7T34sWV~?yto?};XkwCc̘sfx $zB"ZBlJ)}K_X9/o N- uҺUS FC&hl$EĈd, ?Ƞ_Oѣw{k혙3f.99@Bop鍯m>C~!>=FQhm!ݠ[(FmdҵH Ix{wL(Bhy:O>&ZF}>݆yh|\K !}Z>Ф/vM6 SrMh x )i7 @Eo˅ˮY(xl\G@51*,6{_گ>~yc "0p7"s/zK͗^—6_W7t)  e!, `dg' X_$k0 v<zhޑz !#O}%w 6{/rp߹?̓jc$.aBD3[_o|/ڗvrc|!5LiRbº0r˱ J$En19vT6 9;ʄf{\`T>kK](lD#)em(!fHǴ o;!+¥u+ vS頣 T}L`ѢWw^5,#YHݶuSIV{F&NДEM7\B  LPe 4Tbc͡ThgZ̈D CAo|ʕ伃pfZ=29֝ U@f & $! ]5" Hfc[d9` 3Kԩ .c+^m/k/+F!V^? D 7|Z @[X xPXA@꧲`@*0 ޱ >F+B1N:KXmy4MFBpZ`d߱,ha)!HИgjt4=' 6@I6WDX\PD' tx]Kvi5432 pohz` 53&.搨H õnFep jMi&3 0{PL`1eV(^S'_D8ݽB)-cwb'2 \3*6AC&1t< ̋Fao=#4&4[%$2QVEN("^=\&.jEh1XLnx*L$.Y`d1v=ޠ7Ӭ:$=4m)mQ;60jT/b֥L}.ĆljJ KfK3g s q[ky!*$?ka/[:`0 lkc`9~ZnBaP/ !o0%+ 83/-CX'eCG&m*9XiÒӒE$TQpUc=ezq\V6 j37w~Sa%h[mD-׉LwXn+!!d6`G=!@b d" 3$l|n\>=$[y5t S w]s`$n@Ȓ`̌Z;c(dR1툜,cJX5X?s_Ў%f;S^p{C惑mlfA֒ZO^wSgDu]ڵ 8_@*&LD)}vR<tl*f6E}:iQ9@MEA׊#rizڟ3_4-wiZ1dx6U A*jCF]٠Lg+ߣΌ)|W0~|x*QH[43yL0j1-H"SQBDxy0?$XgBXJGƶSC.߳ h]m@k>AmLB02g0 }L:b 'l<=4rYl^r_ d 2{04B䩣 Fn}`$@}'$>fJl<lƂ0As$ja؃em{ރAʟԲ#fK6TTh φlFɬzFkJmOt P D`בFC$}F~CW0EesbiQ ef`"IڗU9%fFs ;^<0:|Aq-%fk\h Op(YOv>z0rNi ( )bY-YF~$GfpH`G"0,Fܕ=&MMliJֹ̆j{YG {{.Ba ƪ5#T4ƏF%YC ohf$ $0U 'jGxc( v9]36!q0Xb F KЫe;^tO k,DhI6֜/R"E'r;o;qvz cv;,u-Zgs軸.=AǞASVj0b_ PCvRkLNtq N Jw*; f]}?fhHhR-{ ``[`*mUeA.q8qºr'DjDj>1ÊW JU+3fz^Y`ȆV#+gլw\90f5 ẃr/ jwH`hgT2OȫOWEn$Xۚgo!є"e V*S#Oki L}L;r޿C"6f H& i'mtWrq9P㖅N(Mlp:^0KN:yX2EeDpC"AJ3CXVm@9 F?%0<5͏X@:U%GuDŞ 05Y) j@t3-˜S jrW[v:xe:bE4;lt@6>bi,Y LR8 2l$cg>#p h`TmcA 2&}1Mը'xMCZj\|! 3bO.a ۩&,-s5+FEoY(=yD 5LᎆQXK4[Bg 0<Y¯FSrm׹.ARsJ9ۍBYO &9D k6sc$7tg]eK﮵ehcF Hht= E&\ÑԕgzY,+}{=B:) fӤvZNtQ1~Ьթ`$=I?jP2VYDDCpM㯉AmRQ؏dZDCPD)ڮljΒN]Rzxum@`騇Ol0etvV`Пi^,?X0 9Pp3җs2%6[w oBf/? afY'̌ˌ,4lNW85k߫ ʗL`TPzLuUZwAX0 ? QEF W";uW T$3-ِВU"F<ygI@ilTe;_="k--OO3X04dGI•-ȸ '5C((=$3ZxNfļxܙS/=8r$%gFTL)Uyf~s 1#y]f(_y̨^Hpل{Pofcr{t8jPx>AhS.ʆ g_D䥮hJu @%x+ܜ{O$3"0k5Y4#t׶C`430cüdfTILXЉE:IǝAJ M a<7q/Y;.0 ug+b=% @1p0atG=TEYi,fd0m ۚMgGZgѓP~-{ՋkֻZ}cLk@Ԥ;J΀(ڈO%o' 2{KJ;W8*CXn%:sWf]KpXmYys>`tgD[k7t5^EEN-s{Pۖ !UΉ51P?FI;筚0͌\3Fl|Uß=RjlP^ᐬ#(o5Z"P" b޻s+,'w,SŎzbtj~[v-SiW^[+ݭƮ<;"kKiH8pI^C%])=je5%f tB ]Ry̌U`4]#l"3ru+iegqeY(~I}Ӽ HJ !""Jsvv`d;2ẍg$`0`Tcg{L+hDF_%.K&(CuXA d`Tњc$!0ehtk4=*2cf$>" QHD$$鯮ʽWVP0q,<1T g5!! +Cl?۰nu.Ԧ /*=#%Q׋+uܧeHRʈhXzCzlj)MΤ.ґtF G# #*"4 T1t;(@mMOP WA}z kf46\<3:Wr`.KbxӉJR*3̬3q HmP2[c RRj>͍WF 1QY T q`Μ_w<ͻBB(tR[R_WJ+eYfZ낙@ լ3ZeYf7o`j$@α3#' 7"BYqsCV:g/Y/lLˆ^o/90l0QE װGRj(QYyKv JvU@}RYyYcԾ>On]_T FSȌlǠhDT;v~x qeHRʊaQ9׫h3cdF x#nUUi?`ԾͳH PwZ i=$=ėi=,I) ֻɝM}aT ĉY8`43h@4@g'Rʨ勴L=%;&bֹdbT#x>iQ%Ad;7wNˀQ^J95aW.(?ܿF#NQâ(2u?2_ JZ.ʲ)v?p#RMr$Q`g3k(AVJ;bIS@̒LT Mg;&b3p|ҙ(,Fi4ՔP^FLf E}7B_T0 Jw"?ԝpAR˲meYfyR,n#}P$(U^0T!Ny~ȓQao}|ꋔJ)E,Ҽ̈Niyg(B$us1M8jBf鼘f]@ZH.FXFЫ}G#}c  JGeYE1VJ`_zaf*˲E~ljy᫞*Ýu>Ǝu3V2K5tR@ m oRG/QCIg3awK+⣲,e(v19}mly>,rG)p~$kpF> F$Su;w&'53VԏFs,NE]tIDq5P,cߟ,ҳ̐1A"$>{~̀\J/-FX<M˄f6D-ì PD|o)^xU~wM1M;+e(<'eYVd;`BqigYkuQEλ+1/]`PnE`č2]Sfo /xf`8qr{#ݷjɠY ҉#(ώr<0s~_yI(GeY>8{*`4r F>`E #>=؛㫫fr.dTK1%`M`9F343jf@~Òf>C[HG{@:R$H3D{Jm1[t<"`8+a CGO`o^Z4GyrE=Z qݷ"!0!H$K.?WeaeYZknU< P8׈0ZkeYv$w/v᷸(@"r}t#<(N"Iم_8wg лO"$@\V`msPW;v0)FeY! fdHʩ98 %x{AS٠Yܶc*hMxR,-@BD?'uɨ,9\6 *J{@f`i*_;uJt,(FE^L/~?XAN_SE+c ZyEN t R$=yŲ~<06Bwc #UhL2|~R $O7Vky6= h42Ƙ<#u̚23vSn$)P3RRZ`D3n\`BwGٽp(5Ld2QJ)&-kB0@ R*˲,8qzv/~w†H(+UڅО0"rTHc ?r`tupxx<)RZk/=֖DsB9Y`tp`Ti:SJ>N6c!>f.k۫,4mZw{b?`Έ$%0* ƹl#*֟&d'˲aQ1hE%CD̕f|e$q)zPm "K K@*(ŵg,GY=xF~o3H@J"˲q$;q׶w3ߘ# 1dl i61QyNDt,>.Ov|up8spp=yw$Iio=K_x(lizgFKcbM1E cEg1E'fI~qvًqMW~r0Ƕx`xTA {?Qyy@o{d{2y>n֧&W? ۻhep1Py| qfu% ""!}d~aW_)kYۓdeYnŪgUs s.Cg-P2aN),ˣ(I)I) OƿmZ ЦNvؤӌ5ȟC`TeF2(8_~`tg< ֲVyn8II\+Mr8֊tsF ,R?Gѯ3iX!=W=^rl6eZˀ#k,FNˌ"{x#TQd2`TZ R)Y"W>3f mB6]` *D&Q8D1C@#@xg|;7_:=dp8|8'Dk:4 |l)$7T$P$k-id2TD"W>v@P Hܻ@6(_GVRmGȃ\|W_x88x8L&p3GY0=opHvc{JIU{S fV-`to|֫ץxVaB# HsFpm`;tXp(3%G- PoB+g70Ln ;p{8yuQ c E!,z4M7_'Wa4$ؚn }at"L J+f*P%NR# f )6qisxFfP%](`n sLs^{HAkNND*0=l zÃ)˲̍1jF\;ŕTdf[|T[7v}Q^/A S A.$$8`;JpU~We|@,@C6{ÃW^=s6x|g2Gd2yy/ì[%-s,%َ1<ϳ Fk]jz|:|;~yxM߄%W0֕EvϝU%V>gX^̎M@ԇ߁g{[x<Fw}f4`}O݉"c˲Dezkٵέ凓u `F4o'tB1tObn.;D$`%햎ll<3~fnKv{FL,p~F @?}]~e% W8>;R̬U/i kmb_||W/AO`*F<7kt&חL材i( "00wo76]Xwl(Y=L&x݅1Fwf]@#dIheHn*,́1lƘR))FiZw^+/mUq z"u-Uh?+Y% J:(<]`zxH%\"Fx:`8SA(cDJסW{Z1)y((2kCWy5UB10L Jm'={F^xW~ KQܗAh%hF`S -3>lCؽ}.8!FTi,T?jﮟm#kPk=,H)EqG}ueFfAxz,$ZN֥cRJyzIzg 5!Za{ ą2BQ܇us@@%* {OFȝ!0 _ꫝWx1OFdr2 ,^!f׿pA/?*wIdۡiѳ}=#:~0WIH 0ƺXsn^2C#^|G^)IήA'.ػv٧ F0F^ծ$!)wvXv{u [Zk,2/r\A_W+_Og@3El,o$e']J$$4y%&$0:g3̬0&Cc2Dk=QJMʲE1."Wf{v|dIfAEBdֺ( 8Iai$I AE)eM쉍$BDQ)^Wv?)(WfpT:v .mIJU2BĥXǛ+GrCbs,ye٣xe0˲,RkuI1AYTm,ʒzõ_Ο!\/63zu5fQcJsPTib;*?}_QeYf-KeH6 d|ʲ Qv#iѮ|Y0jdcM }[|qzҺ!Sshr`Y1fmleEV6Ȍ{DDN7" -wveYM,%%-f 3#qH@i!(B@Zp01|-Yu}VΊVeYzzr#?s C)ard ohSL7:0\f+H]']eJfR}_:μxNY.f߽iwQ=ky(¬8DVL;EPJY0(R'[W0TLc#E`FD & ]]< d,( Sl$zŬkeGY"4/vۘѯY'7/۱Kg ñPilsdѹ% Q6 vFYVEQfY6{^Zr7z#rU(t9n0-$U:Z]Kk 9v٘+5+5nN8cyf7 W&>0ZvY0ye`TEe%j%-72E񨲗lyR[?[;=F[fJx"}'-ډ燃еx\0Z-,,Zn'ȒFEQѲGBt}h9Ks֠0k(k)L&~?yi?6(Jt $s 9:F@?Ġh{;L.>, 6!Q$xl,uث]k^3 / F(` @)`[}ՃB0,2#z l F l/ZJeYy>."_PhU&⎠%fL ˔͔'uuZ 8;ݢ͂]2; KmEvfn]ey׫On܋ͯl3wQ}_eHIrawb2CET4^O?|&0 ݙ,U%2TiQ*^ l#{UJY>AÀepxNaQv4/-mrRDyn(S7,-+'pQ7_<Ȟ,ܠ.˲6${^o{-{vf{\yh& >k1@$2,Z8B}{HKObq4nޅ+@O( UsLt.p#k(1#3%‹f(>9^mâ(y7ذw4/3Z ȔeDO!ۖ*7ؐXp^fH2yѬh<+C-ֹ;ޠRe q :3c9݄ N֣,,R/]STQ)ߑ27ϮʉT\r;^ꬡq_`D]9D@};T7hDvtTU,cC< (-Txhl(9{¢:ە%Ykϒ&U9;+^c4{e(Xku.E%*[$Z2&AۖB8:50+. Fm"ͳ,_ۯ- y%OoW1<ϔR K̫˒u##EwbhNpKl"RmQa4j4M\_ߋ%R\3f8>0r/W" SfvRʸeGG/tyWdήe0Ȼr嘫Lzn Lw15.=,!5 }gvYyR!,vֲ% HGD 2yt:sh31km1ƔeYAٝ,~jGP:z`tle@D3=IC@H^hLjȉ&q_vA${<87X#lDZ-b' 2bG x!- 0y#EY.$P) 6h'N573Mse,Lh u(5r F ̝`DDS0l܂ݽ{{){eY>,b;2̒Zfq٦Rl}e_üy7<nj8q}˞{|用1xQQeY><}opFZָx W2N1(EtTc>38H&*d(n09 )(2mwfz-D, _1Κ!*;|V٣E9j^|c<2> zޜ?ʘ}|B%5T޺d#uL3I/-@mAqҍ XJٗx,v OFg HkF`D[f0Pw#{ROdGâ(@D(nsfZk >'9NYkcdHpp)"2X/wMuFEyߣQ[>oi3S`TUYkbq6ԝR_|ru )+Kx~}'0ƶI!ֺ(<]}xQ蓛udcGqA9G{O``YRJID T*YPl$.nXy:fSgcV[Pʢ(gh$ " I}71=mqeAgG Yҡyo }M)U[LeY`-ys4OV~\bO)h-kUDL2(y=k'jK@PhReg.0ߨ > @Zj((V|fRT.u*pI{<5bsZ lbB,0;ZBD(3d)J"0j E5J$ _+rC&heܡX"aGgV&p`d #ˣ`a @; G=͎N1K';sp<-rWk'$VxZUdFϬ,{HJy!A !x} X@ۺ`40r&3#B u]-R+]2Av8͎Ny,!'e ϸ/fkgVlI^>`_ z(sHeb HK; !$xu3)c IOzm>G+G#  qIFP&#,4;:=^,iR\9!5z ]FuA IQjfc_ i%!y@* I쬇NCy71(أQo !`w>?i.&zyZ aOeNc2! ٲ,G$c) ` @P(-ON`l HϙOEo54j`t,*2>~f (0nC/A5볣AesNlwT9c*ثo?`2`T٤ oKPdPNr?gC5["ϴs5ϕhEK>Lj F\n 0N1#ˋobݏLyS)1.%[:=NKtT9zPV)Aٲ,wdyY$Gphd0f+]X21EǮOʕVLBj'sXg`<15$HےYK)xk"xXneA FYvh;2|FUFdvB` 7ܫ<,fYVQeX(jOs%-KdZkM照*^oݥhճD5QG ȕ\&}'Y:vfJD$*7V0ЁG#wd5Sm"St6ABղ,٣Ax,+S:44zGVOտF<`Q5+9~{=Y1vJCEU*,\ ,u]eY`d (eYᴐ>aF=ջ"3h,֪;͎NY xQ;'.y1>Y\o U{*J)eE'Y! #xmG*=Y`z`DTE9`o: 1ؿn;܆>^ꉏ=<*8=>ǙQew$EQ˲SJ=edGmGYAX L,*6|5<˲I5(/?A2Hei Rk'h1UJ9bC=0Lz#ơ9VVy"OF:(&rƕo+ex)w4suNqnEtUyz%m_Kɚ&{( $!bHtR&5uI "B l*kW*.X`>;} r/p >1?䠵6jEnԿxܚQP0"_$,DuyTy ђ~hIJ)|vkk"ѝv&ܡ]痝`V ELDƛ$FeYdY6l9.xyJ>=NY:2^I,w*\߆AUdFZP(2rPUR-͏Od@EUQ$W"Yu"nvwCt3^\?ԁ!W"OaoK ޫyRϣA8, XQ啴?f].`5 CV"2"""?,7gK')%*~<Erug,;ZNٳ9dZ~˂QYOsFK$YsKF"2C9G*hYϣ8=X*,,w޻}}~=:ٙQɽ'[Z+uOw;d'7#즦:tąZ$("<pgG^zzdzɌfŝE;eYV]M8ڗ'/3!P̬}"R=3p'd8\1SXkd\(THPm~F u[Yi/j`T>@Ew6~,<*y[ 6]RAGc":e'y*n%#Q{%={0)|ml{gJ=cK5L^H@)sd)o#XQ7Z~.H4FKu"ɠ'${Fwxuֺr̺Sϣx:YҢ.7Y..EmTvJ]GnpDl,GNƖZkP?5,iћdy^fY6βl/˲'ob.H걮C.M\^<9r[̥oe ,EQKzžȒ,P xe8ݲ,Ïߊ4``>̨*y7]Οsۛ+<:O'N1V)e,+&0˲y?w@B#!xȸ4OFp`)oxZO}̪,BrROK$Ue<'YEƗW q1I* FBF|Wp&uW(O,{ck2~68 <-@ZToTܱ3LNFO.n{0mփ1dF$(?Co|Eq/˲O~|fy02(GA_ne7&h3FYJ)Ӫ#7<8,xFl˲Y`4mO&W~/~Rr@  F*7 F9W /POedeY[8=N&%K'7dZ__YJ\:pt ! 3eS7LnF ˲,Ke O8-LNEDb""V~t"nٿ27.Vzeae%@#ȾDwFYvg2lO&i<Ў\wzO^r9] '0I(_[,(jRkJQ)._kO7Fp7(t\ SDOk='ZoNwߕbBD^P0˥iv B$BD [*a0׫')<6D$  Fw1Gهqdrc<F${)/`^R6GW6mڣ׾%H$.|l၏B!/c&KAGѝp3'EQNг6`=}3KiR*=!A cO>_]Ǔɍht`w2=A͉En+ *K<@N(V]U1~w_/63# =0I!@1jX %LgX3?H|Np=GYe*zzdz˒f$3!@'߼߹{盓WR1XȪR9?/÷"3`yu獗/}?˲O&ɭhto8xV]FXdԏ)xj}_k-)6Vzwk[Zk7}5o%k}d b 6n'QoJX[PD .p<"o/`W/Pqv{4Fp2LRj탄8=Nd?B;KjM&nPҫ<[.`@z @I=ƔcV8&@[0jXP9Dz)&ʠ'| z=q|2eٽxp<FQh$ivtz'/KzY1q,UB}=K[Kmr kXqَQ^)QQ[@_Wo|OQ7Fd`<oFI.ͬhk~&}:՗W_2^}Ew)e$Iz`meeekee\׻PH^%H6Aq .}dz+ 69}@w!wsg>Hoe(YmO&durui Ozdf\- 8=Y'ZڱIΈOUlB8`0l ~.M i^{;w%b]zW ӗcjd7+jW/ ]?r=&0,SQQYʛ3 HXH'>8q~pQ#-+g{rSo߅{z5)Wcz?Oo(v;EQEeپEQ(r/gJNul@IbS28Fg4=VE[;#7,/ z ®H΁ @r=gVQ~LѕKg>%2eY=ʲlw<<y^M< zҢLI.qCPQi$`0Xk^om%Ir&87r.e2vPZ+2U"z?ݎc&Ƙ1f:PJʲ/b0˲̗J>OfGqrʔEQi$I{mۆ0WNve-)Q "ĉnrimۇiZkZ?Oow9ۘosF_w;W]=8-@"987m9֦jDgI͋ommni//Ƙ{^)J)/[f_VCAzћDPA !Bu]|g$rBa8!>'=*՛|*H3^`BZ+1RҪ$\>)Fc"t|)I$vpd/L_zmoZ[0GqoZ nٕn݉" _Fj*-XXܛp*b<2 TۛVJH,N 0*lVO"$ ?-|tݧN{S,hu/|mMk!TFҧ.9!LkV-TH߻hLG槤Tңr;7{5LM09 P +`{0'dE8e7"ެ7J J%߳4KUojK"oRp$WԛJ&lo@Z+|_d V"b<>^Up2jio:Qoћƅ`NzӵRM(Z Ѹ!ު>e(ћ4 Q"έ>rEB+_+)2al3z( қ>QwTJt]fA Tҧ6ݛ9Y_0]h E!{0'ЛJviKH5+UJtTRWi{SIxo@)~/Ei-+ڛ^ݗn-֊_ZRmA "`:7۟>7b 6dE MH5EkdBkҽTW*:!5{Ep@@HH  @ @ $$ @@HH   @ @ $$ @@HH  @ @ $$ @@HH@HH  @ @ $$7b~F?,IENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_Green_16x16.png0000644000175000017500000000016312140261562023764 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(cd@`b`0aj,IENDB`desmume-0.9.9/src/cocoa/images/Icon_DeSmuME_32x32.png0000644000175000017500000000273312140261562022624 0ustar guillaumeguillaumePNG  IHDR szzsRGB pHYs  IDATXí[hW3;dVrS/!&վh/A/*zJ>KP/"[-^(j`֒hF$ٝ93_f1a;?o 0ZFcJ~lAt]Gu0kihx8Y˙&cۏ?" gܓ%rW._u>@v8,-20 r2_=׌DMm dddQ=d׮5ܸq#O8͛SSSh7N[.pB?t:Zdo;?`۶/}ҥKue`[~N%&s&䟻"_@ץ@7?EfΜ/LtɯsȆ '"z`L3]X]]ܺ%ltMԎd}Q:Pʧ9OR%\Nۈdva _]pUr9-o:vұƲR (3eA(%q"NC29KEWh&`M3qr$tuݦ*J&Sh8q3 Fʙ3+l"h!UfDJyJVV"Źa;]y.*4E $( ,=R˴JlٳFtgAGٳaʏ'v5k Nٳ9sp44K]]շICC.;с@G>6Jsyw:L> o4#A4M0"_̯1Q n;ps֬e|vۆ? 2۷뀰q/47!JT#GZPʞ~&dd^$-v ;vhv dqZ29ē'pDZc+|C8낮Gp@$hE<6lfJ"M<JJ_K/Zӧ Bn_P3KR|)a^vLiWPxt&3R3"3*?*646xѻ43`S1`qB8fL31͢20 w WL]WȴiH} i@jjZf%OH H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx%Iv~[#"ʪںz_hM$ ٔ4&6HmhF#r3"!R8$7twRYD[}{3s7E.YfTeċ$"+ +[() + + @ + +) + + @ + + + + +) + + @ + +) + + @ + + + + +) + + @ + +) + + @ + + + + +) + + @ + +) + + @ + + + + +) + + @ + + + + '֑;tQ/+*D $8V(p8~$^7xH)5RJh*D(Qe@&"z)" zigEQ,,[i:ϲ,Nr,,\&.Q\_SVXFDE  xsPH [,nEg^Kpe^^xRQS0DkyOy|f|>/DMmKQmyRGG @ v& rih0DѨ7{x8$9$ɱ8ODQt"J'ϾӃz⾝Gg-rL3Ă bRHŽ]q?" 0<5&l?G(O|3O^_|_AQWJ׻R`0h4bO&l>Ţh]Y[ PvHaUFNX0Nqkkk4 $It$R<Ïu7mO~x&HwS`;"H!RXcPpolnwgtD`!hf\ (5ƏC=9|K//}q ZKI\zp; |f"sHݭY[ Pd?;JHae֥(Ih<;;;x<F[d;$IFԿG֕Lj.:X aIPD @gK+"* fC+"lp"ȴ, NO}-'ſʋO_|KkJǯ$Ir_ ^o<[.:stDK&B P-dˏº)`鹭h4:Nz{$9uě~>c} i6/0/@!="b"Dd(E~@RDN"GfA3A P \h d$z௾' ~oO$I^% +`w2L'I6LhI5t'FLHaut@fTT?gMP0sT3}e@)  Rdt(/EB*Ɠ& e L+B΄HX!BJ{ӣcsc/WFQt"㗒$$I$Q,NMtm RtG[ uTE+u"*Ilmmml;$]_'3$g`!EP-fj@ZXۜR#i1 z (ЋINAd`,Gvό+~3ޕFQE0Iq`d}D6"(CTTlG+ FƂC" cOgh'QE(.9,^ҝqT^ΠH MFp8vvvz㝝cl߿?cίNrʒM}]Ȥ2'@D&B"o~:XO+݈R1EE!6[,X0Tp{+^{{}6&J8Rj1N]] JwZd"#WAHau0†0R`0mnkggp8g8>}O?_}E"g"B 1QLD֥d]TCCy.d*(0"f0o=yoqNK GDIUJgtEF f-u ޱcǶOF{[~GB~̦'S@,XbBޮ}4ZX ԼI`%)5H Tlc.@"H(up~O;_rvFFADfY9TmON H]Xa,"xkkx|`0xxgϟx'//- @4]+\:9Awdج~u2v# li>㔧rƌMz(">/0)Q NYQV(u$ͦDwfglRXMQh4ooo;Vh4~ '}۱Wd (oaܑ#wN'"Zt&N1b .9'?%{qSӕ@e>ZvQ\4 akVggg}|< o{{۱ \*:͂z x uI7O{C[͉R`^'! &̬Ӄ(`3N›gZEDD bb;ne?-a@ +F᰷=>fa`0x}w~w39C `H20JHsXulEJ"Z##*4hYȾQo, ; fZfY~ P*?[D"nau`Dm0z^ǧ^ﱟs<_3t0#h:&(j`n -I2lLk^cQ "EHE&7Ř 0M5u/}/5{|̙:wc?JPD2)7 ֵ8hht`0?_xi\XjC=%HV9@Ԅ4K@҈shȩ J"ݦ6׫ )(A`F0-~Aj?;ޭ/`iQYQE2t,`kHauh4Hh<[[['=~{_߼Ђ&VqFFJK ; iԄ|73vv#p/$% zVjن^h" @B3>>p+̼Z/-Ziͳ+ BsJ5B.nȇ`0HG[[[G~Sg_T@"0`- Q.G8iJ\  +`2qS Qo**=JxϠt*oj%ʹ$`E(Gkp/? ?sg[|9֝l>gPj*nq]Xa]_ploo;vl{{o~=w'@ !@ݵԜ ";FMi,˫Mb<3NճYȤE痧MY"!ZPY0;y`Ϳ?/ ( P:;M)Vߛ(X0 nQ]*-hD*dpUM2KjfSMWܾ٦ݪb*[CB D$`zJ1 +4@;[?Lpڂ$)= (Z&2*aDd^MDP]ר- ry)=?:b?Z 2=uWQII, sO:t YYxLү0\xFKp)pbO(JG.t}Hau`~牌bIyw |PXV# 4 ,:E5B^R >R=DoLB0Ve- pJ+˓3 R(e9މ0 @ 0y"X}g@h.]tW? e6EpX ~|եkɮ>t|eѪٟTvMY7b(5 D)-FIa^] ̈́G·{߇kBO(svhRXF7FǶ.2FHJ-(O-Uz)):nFLj`K5tRR mn5W72SRu{bY$̋058f;B*[)u|( PURvaH=TJԟ"F:[Z5EZdz|4wHܘKTKKjDHד|' e{Ԥx?gAS"ĆXӌ!di}Fp֦V[x.~$a]mz-a@;ɑۚQ?RHX CU75<\ͨڥT\Zd^-JLDJ56TZ2BYT;;Tʦʾ$rRq#,S:6"#@$Y, c?z/{(K4C RXFaF0֌Dj0Fb6UpؠlO<0UQr usU|g +ث%Dʊ!RljrV f*@I DA ,#?_;J@"JGF>hHaXQt@!3^!{ɨ QVPZkH8!+ (!f"P2pH+i::B_a'b^ȓxR I; #֤|:ϐ(% +%fA IG;7z/և{\@HJF>l-xFsgՀv9AtP W`)o0 #5ZZ-Pq=C0 &I tjjQx`Vp {Xc"΍}jHelIR `t0z?Ǫ( )Ce"#`䥽zRJSOݹ5>\J^35Ŋ`uDK+^ΟdoUݷ*aM#">)#GvED d`L/ևOg\>H}ޔ> /2O<1W6M&2*ٹ>mB֚h#^*p5;^,VDCRgFRҮFMDC&E0hQXsUeI &D\' zi(R$+,xs',@V/EU>Vaat?֌2B0^kqS-4Zt^Jn%2rCċ߃W691y!Kiv6AR0HD7d XAɥ[I)jh}{aPM0Y 4nCF? 8AҭMJMφ)EF'gշ Z0 H~skgRZ{i@,-R˒۫`u.XϘպ7-VhQwn2JVtP,e6}ĥD4 D\b%"$a# / {JVcՕAeV!"?azT$K}kYbpWMU?n]dUîF /'zgJ.2υlMӞ]X4;yއcYSI߁ ĨS&A 4).a{͹J.aٸZوGiAo\6!rMT 00?. ֋ <|߹3A j+F?e"ȨXFbwF~,;t: \FmJc k3eW!r[[>d{5"6CHD]II5OIVʺEDHMsD v|Gxm= }OB 0ф"6FC"#^yQsxCÈ0~9Ǟ۷_ce]j:5#&Z #4][tOsAɗ8Sg6Ai+fLyA"g;6,:}Ȥ읊qtu\=7z5@&U @ +F70b#qƨ~48mY7s5 /5Vªa* ȪWբL6"T\KŜ£*-i'{r,xF;Ȩ4P!dBs W-@PՎw!)aTF#E׌R###oSg_Ƌ/ȩ+j"9n4"niX~Ԗk1Fʝd^FKNusQvNaNIɛd<pS~Aw?A}wssW4 020u#`~`0Cz00Z#i6HM`ᛧ k E1;P+TiQ3צPu$g#^ؑS8qo"+U ͝Q+ldi +RQc@L 4r.qoAn^8zGF0,gMW׃SxaF o4Dc7 X"XEpQj-xj奶ZIܴJ+/bvu\B\ϸUCgf)6zطC#;wnJ7FNT} F{Է d~ Ŧ*CV'm @/`hL])BB)Lhnuʌ$K}ȹ{mX7V R7[8L )g&e-յ}.XD}렾Shg@5.ܹG/oQnhʮZ2}GmQq%w]JBRdlo C tƭm/ڼ  Mr/Ӈƌ7z~?/KJ׳N$Eh 7=?ԯ=շsd!,n2 ^jG)ҲFduEFv  0yՇdg=/5#iM硲GcՄ{[Uy3Le*Ȕ= E"fq а"%"#4'!싉'׌",=7zg?n졂jXo4}cxrO"jzUUk #{j7AԏQf / Fkd]teCѨj>o:0XUMc2=F )Sl\N 3 `LĶgǡ/3~ F᮹A ~O"V3v@(##i j<w#kF5PtiD(jJ]4E]JڥSU9mow8m{[ڍdqC SNdA6XZ QqY &vւ}2.3^ٿ}~kYTvt)7o(@ϺvpFua_*v5 iWy lzmV:n;lg0k%zZ-OIlDsQrb IejjJTI+3<fzdJs)H*4rٳF|oJ^p;7(V/3g2L Ccs6Auu]#M"Zd$ݑ80H*x5i 90"VR{/t 8:ԚnB9N BOQ#Qq!+PvS @ Y?sy~wp5OX=QQZ0D pZGH<; xT&IfTD|Tn)zTv yw_ @`bl}m*Q9}>Yxi D *i!fą&DVZlS-!OD e=}pjH,pi?Ǚ]sy~6_RDS`i,32º#'"V/I#mQb;tTy!LTWjFh d74tkt^6\~g')ԛқiITGrE@lJ8p;쏅V'6 riB;AJ'u@ˆK+0 ,8Ù]|7Ώ P:x";;F37 r&PmD-M'׆` *Mg 0 j^yA -7trpͨ+iI#'4ZV)Cy;#LZ tuT=KnX+"둇ٺL f „\HSkg97#p<#K(FZEV^5u^4,\dPtmG^?jes1snAsNEtFyFJM3OӭK5]#J+׺k١ :UqIceA}R)Pɻ*yW٥8*?S \:RDRޘ SfLD6G\c/pXhe'O(m(Վ2$]X1`5+``m\{"FNMR#$؃q@gmP3jF/"JC:0H[ M Qii3T;~g[\D*4xsLD%}C~ L@ J=L%2@ 0h jvN]X}u6&M7z"OY#n~ߘg*`O;tifJ؋k J&ĹAPDd5vIh<1^M9]$T&Y PxxҁZaξ^"+|{Ƒyb$"f&1$gG{h7Ha._3M dD 6t ד`HZ^zV-Ro/DtVHn_e7u~D't4_y@'Zځ&]c WK!wRi-Ħ@ rk#YC=D4yEp׉{GO7oh(Rt)E!B vMs, !G#ekKD7]jD\@jBl/27- +Q3}Qϯ: "!Q}̈́J+Ub 8T#,`I1=E!0GjÀJ){ c\ҌN3o꿑&#Pr3p4 `FY1j:gTZHhUΚtLz]u`p$l `hDF0MtmQeQ+J5]&814N٧TZ{VW8ub(Dsv0 (2P*! eDM$fx%rqv?v> Z6@;4M>%W9ҼvSӹז q!O9BBV FpheQӀuvЭVv7YUȵD򌫠RvjF.\$qNΞAt\z\K uk'T.dSH$U '[-ISΎްPPNBtFFiS3Z3֌֌UoW3j388iT+i:3α^%!#PZD:퉤R3ZWOj6Ӓ7JVoQ"(+D`Ө";'!(ظ3=fT? R:CR2N>;?u3WFWvu##atr+xv@:nFHQ~[3i0&nj:n ZtiFhq`;=L+'hAj3nMZ3:h,~U5;Wp@"߹>%"Ԡ``"\QS}*=׈K 45%k3f-X.s\"xQǎo'/27HQy4 uT##g DekTj#$а1i2-vuER3jvFѺMFx(ϨZZ)"cog~RQysj]_ۃJɤ9FP%f9>ŠJG"H4yZ`>0e؟k^}N/z[!䉁'yRXG FO}O^X}yFCehq?6զQ*{>#?EGIF;(2t;04Vt:Ƽ65:vSFmSpݰEM2-5.I3qF 7zlTDC[uqA$md盛Fp+Wr*=A ͘/5Q ֌a}`:/ / @N/מ:';J!EaPh FF4:Hy}FvxT^0v\c7=24Mr@ke?U+9iLl5NMڰjwKzjߖr!tq#Ba#&s?e)JEJ`j"eE#r5i7tVFZh\4N}a-I߹:_:J0j :V_5#'ۑICü#nz&ˆ[qMtF:^[j,bwtYMw4]5\÷ChΛ5q썢ШP:0TЁjt?)%*'WeQ`jiQz2n M+`,. HP`9n>Rng( 1uCQ.p#-È=iwMn%M.i1 Feە[&$h@UҖ46Iӡ@kjFXMɡ5_gjS5C̨ ?"m\ōw޹@ s|Q`,Y c+k됀HR=piEDcyW: %Th@oF0u.2VLT5#t4#m8JN:RȈ7R5ǎw-c% K4t;00zQ ݺEFҝtSI.\MXQ֎mlDh6|a1(4H2Ii1qQ_Wơ~0]2<. pkOST(yc'.YW2Z "rD<|kͨC]3yFR0!`tZ+φK adMHu9rxI[]qqG$=vF=K[hH6ψ>%.MRKrtpr1uJf31gA,\H3 ȷ)rs^D+(b !R`, q]EǗORm[RXG'M f@ԌP ׫]`{0jNzmkFEm+~yFhzmoQ[_ZJֲ *p`8fTZ|}FDCm#n0,9p2"MiX,2KM,v,roלȞ"l ]TeX&R(tBȖ^dSzDJD @ (R_ϱ<7' . #Qǫq}m %rnH:Ri9pw=J7MkFeWԒjDgJPВҔNy? /"bQ@g6z!2cM#dDl͖ѭ{e!64Һޱ)[iRIL vY '|A*χ jVՌ^-"¸vk82#$n D])`hȏv TZFM5Jy5ZMIkͨݶMFH4) 2j5"ѶȨkښK='-i¨ӂ;e}YUU;_X dia~&N]'%KMR5a9 !WyBZ$Zedg<%k1T^RuT3;'ƯW:xY *q5_L߉د͘:wJBm74J Fg'Q6C'  _}7nH)f֌^֑Kc+VdViw32:TͨڭM|e Mzm9(uZFr8mz튌<m2 6!)|b#]d \#2}βŜ >0l+, As[]H<{+rsP0Iuȱ+cW:!R*wʂ /VjXv@Mnikn^[쀚Q3B&-;ڐ.cQY/sk8]3  @cƎ֢&MF݉Q(0u"5\#ynFJv_QdAdzlkCU41 jzG ZTQZ`*)ɢh# ߟ17:ц;٩|3nK.2*f^OLʇ""M/`hDFܰ+Z'Pe5MUaiɪ?tyF=vY;k!`ԪbaFZhCuEM"%bKRSҭ;)h@JQ?Wy"M;)* )L$ur,է|蕂)F׌^5EtS Y308Tݒ׎</[0HGdtPz5u_?\O:ǎ]tZR6 #qrт,|Ct3Eςs'$l-{7k%)nB*\͉m( '.OT3IQ30g\')p;3G$V ٚƁa)`k >\,Tv@RQs7 F5YMw{5tzmvܰi'D3+lFHԭqf`>ɰ^:¨"!;wFNR?X<;qQk!%svAb*Z铲B 9E$& VG pRZ#[ !N_y7`M#`a3Ws a2v`$lͶfJ6\Z^CoW" i/^JޚkZ##EwCFb#]f Yޑy0?OIw H5" J$&Mܮ1WA[D;m8R O oae`t0z3r0˱:gl80@JETvwҶ#W32E{n8uTQgxpI]bRFHt9ԃ(9pj=I:^Nu)YXx=aT:hiOі6ҀʦW*!c+dJĝPy='"Ded9]=`5ԙoʯwaa4 =4]je!9c+ax Ǝ!a#&ֱ㾀i-_t*і5i:i6vom6JW@Ipѐ9c>͐F##DFZPŶn?EFޘUnF8u 8Ika퀺uZj,Hk-4 &T鈌6t ##l1fuG#ȷ+;ɶLՠĥP#zBJ 2Z_"N\!BEg vSȉcy/=uwzk/HF^H}Jeй`Ky5#hf kUs7{ꂆ:Y:tMe3vK{x}mtDF|H8$:ψ!(2l!t' j;6kK9LJGN,WB,Kk!k@~wMv`w qiQ`&Ӳ ED <îfSwH4D`t`E.R@ȨBDT6znC60VtpzEV`ص ndxuH7;ֿN?<D>G F՟pkN 1!&K 3 rrq+|B )\Uꐬ/Qd]y!WfR)h"Ma^H!`ۍ!AV>4 iՌEMèMڽ62jiwjSKyuφ}F ivwd 7QeI phK1fHF80*]gdxTE;e:P9FE^dU}iB>0b7NGP6W Fޕ9p[~驻{w>800:dd|`C+]MW5 AUIqMV+ըEBZNo+SPASAeՁA)]snR¨|ce5wpC\RU`?/}3ϝU$1D:}(Evl Wf-z :5_~̭)*Ϛ@ 0j{{QGO"*2`JQ=Mk )`˛npu0Rt6gRjOŭD]gԖfLzmˆj:.YXozO'tBKj`[첪[r,[(ȤAA B (SR9Zdb<'-ɱW; %yRvFk#' X/Z;&6ĩīU ^nݨ vKf$-{DlhilB#o*n¨ŵ@r(ifj:a|jf5$6R5!O |lMɹ{h+t"&rjqF#kBL[@AɆe8n0dQH#1v@`-HF`}/hd<`-gۦ!(Z\l,`EQ]CZGjV6`nȚQ}n4Xșy8w:6"XI rT*!; H MA[(ً5g9~'7"D V#LS( 4vX>:|WuA`t >5R t!؎Lz0e aUMw8Q4Ϩ,OcS<`QH7+^oFQ3j_!l7FlAFϥDbbNiaJ&R#%Tr "2m>sfAI`2ږ6w#ӌ=a`{dgEO @ 0{=O~0ڭԌzVi#>v\˚ jM-54P"u}FmAұY'5Sip>HlCm<Әg( |#u]Y_i:  & wUTĊhYRq3 #7VDJF.Ideɲ <>>~_~o.ʿZ.j0zw;>tʞ3J'0t+(!ߛNoP3rNo:ε{T[Yo TܷtԙF+:n\)+guTF>˫>%O,?VqfA`T K8P"*\O O8t`1ǎ_y엟 c))G =nY_-,cEFvxT>@=MxeddU)5^zݲѻȚͱL:e:MkFjrY`6I7^xf X:_kxL )ykA%@XLD+o҇LjHF9m J˦W`Ła<КȈ"# p a$] |nVܵ1h Fչc:ɐgŁcVijI*R2GOP%&JPQB[A#"[XbDU"ͳ N_~/=ua JDJo$)}FCqз؎j<n/Qm"M"f%MMjHE05Z}On0Z WwGHSyf>#UMt2 "7ώ(G. ]P|qUKP?ig9F0<[(+RmB$ v? 2RaT3F"g(D"Ba`ԥkE5I&9\y]3V~d%}WEJVdƕL:x*ؓvUyHIQiOEpnwQQGfK D\3vY'^}/?{DDя~t#(}h[ȸ8h4ݳR_s >IFqHֹv+#<I7ݦcQx 6Ԯק7*"kF]_9cH$F#HZIU9"#SUN eۭgln$\4%sÌX_ !3%0>ʛ=7J'7RJ}!`>r NCHQ*7"M`tMM`$c"5J(GDFhUp}0-N3,FfLѧdre͇H J}9QU 吹tͷ.C&g)j Xd ҩՂ!'O֠DT 4݇?箦f^!HmdV{v"jFmM#>Ti5mъ{mkLJ|`sEn"j;g)QZ t(Ke%ArJa'Ďgw0")]"[Wb$20 Lc9#tCW#IO~M {{&WWS, E5!n &~ͨ#E< F- "#i5J=fW3:QښѭQMeap#OSЁKpwrcɫ) HIHI饫DfئvnSy@+r@6/:Tuڐ?x~m"%"%"#;KW ֌zPU DJ" , GdlzMt(1@:F͈hkF7]ͬH#w.ϜP[dԬ!ڤ i5JF"ݮݛH6gozmMl01J2~`tk`uC[<*RbOeldVrRp)?c7*w1bekJ="( E YV`o@Nn~nw ]'TA5#'`g Lͨ/7IEy\5jD-M>FuDkw(ue>. : MץZ ͍`:ɐ.[#PFFCsMPwnJ!B:0RK}~/ª[S@`ǎSxunMm#[cVa$5F6hsIכt1(H;5\]kmR|2gu);Xt'$R6}Bg KSJqvԠt;FIk iFe;[[[5 4mzAeQ :}@ӫfZ3B[#MUoQ0Ik`,gHbu9 #~p /i$ yM6bRd#%k` On͎"e-l0ԈL) ++L"a4-Oɓ[/?>Bꂒ>JSw6Fw`P֌ɕnyQMQs`RR΁m_v@&MmQ5ɊkwquÈFm rCa=a`$p`\j\`$ohԋ㔹V__8rVҌ,y-gهd]:G!z0 z&}ػ JĻ靝^ߏ^udk;CtSu``tرh4z`0<ໞ@ 9eVlE=&E-tOI᾽΁z?Z5g՞xADF0:f\;GHFFEfNF0.NIZFJ6)yYLRihY"34Q um- SFBV0D) D[Ƕ^z=u߳Ƈ4THՓ78(/w[דV<֥耺 5zǏloo= ?|#E}j% tfahkG{w54; # RFŚuc;a$8aAz`\Nr;=vx@< /^s TfϔI) %X+!EeD J=jvMڿ`F^Ҍ46ޚK"=;6W?Y~c\~6t?K4G՚ ^0BKĴ!xkk7OFo?*`@]׫1͝F|еh:HFAe{nSm#efHi3yѹQy' edĥC{TY]t-#%V$f0j R<[=hf""ZkZsQmg:9W)M`n5o-o'_^+)9[7@kF3^qBFJ/E?m]è>U5tN5Ϩkח#i̓i9/0f+.F7Vmo3dSz~LU%6o:Iy;xM?;Bq,"(Bj#y=X D fD:sY,YQ{nm: qG7[[['~?+ԋ>aVZ X = .Ut#W¨mkQugT4]57nM)4ݍ4v6ւ^<`t{O1Uݝ' /wK8a;\TFC*MdE8UZ=_0e\rE}w=>v s5d<-|9'i8ŷh:p8L;`0xh֧`זjAa7+W*U)tYDcγFti:?3zaćzjL*`tȏk6CNs"sY78qy;+Ȟ۶Ts i&2e#%`S-kJ鲀o>·߷o"ZEQZkez jDDtn ~h4:5 z7o|>s%ž؆="BnV*xޫ #X6H6rqDZ~0FtIX:,6CTw /w*R 0```DYΠ*9rPi 4.XX!ߝ]`1#lm.ЃOo.yaTdYx~oItU7T]26`0?_?y{^Y0tVV50uƣ?Y}Q{i$Fze]#]02c`􆃑Ǝl4՞g]SYU9;sV#e!zOOҍ!R Dڞ5l+zzzwqr_yQ,nRӦFU+WYhY:1{B%)SQЋK9q}/OI~n0FiH#"u`lmm~`8|‘Ef ̺(U4 و7s={u+sÀ`u0jn"1dJv֌FŒɾ/10F`1ds]"^ҊW?(i36RY]䍾QOՔ"eҜk,3"?|_: mmmyomtmpjk-K$L{?ǟDrVm>^i dzpoʞ1Wu¨q0Z'^ZqzyF<+0jFFs֗,l#tUjʓ̥##ѝyuw3"H a|'8/_ {h>ϳ^p#i+eO 눎&B";T$zw5{ FrȚ0\7ݚ 7^ւe)0 0Z2;:xB+!v^:(t s+FOWT* ~P#3J{"E彑@E/,h4],|^(W  K(JٕPRJE7^wϽ~]/^PsLi宂w<6rCQ҄`oM^'VƝP;1(-0O!FF0*w^*}OtzU!{TXٷ4h'QKߝR&}BH1٣?@W\W-<]$ w]d^F`0z8>޺1_jl7T;kuG5Z#n+_nq0+nQGF"Ƈn``tm0=ikm/ U&4Ovb`37zRn!Osۏ_7==^`JA@c #Vh~2?NUN-71EuF`킸V쀤߶?AnFIvt+aTݫK,M9(`Uw4'VRsC GxR[ًNRBI} 2cf Ss(~$9 `0HpڑQACZ$I`[q7_,rZs)hw{IϨKt\vuF~In#uyF n[oQQѵRk~e@-Rא,#{%\$ AUіԋ;Yk`k{{wq|p؋-J:hbB:p_ߏK{=c;̵zSZ쀼P&sZ[ #\SNՌP4RqjFGF.E7dcQэQMEJI#/Q1*^O*&"m^N0xxma4Co|q|&㓽^o^'@;5t֎(R=Iq|?gߖ E*U'eÛZEE IFՌPO?n|Sٍa$7^ւe>B 0jy0QZ)™kMeT\?5{i9 fAU%Yq[Ř քNig0z^PS @:DTT{]8>zgN?3LcX {ځ~;\Npe[Y\#GQmH7F+nh=dCwGR?֏,qM-Ȳ)2DdPLR*(vR>oxDDqr`I=DYoT蘶_$qvH6HӵH r,06$`zkIQ V"]i7rr-uYP; ًuS†v7$t7^ FRr F8;#^# #>Dhnlil90Z 8fd #\ұFQ5e2=/E1{taf;!@3"#!T  (8lTD8&VI[`*`0POQk.@HD kr#O'y.1rHXFE FKyb̾?&qz$)gЋ˫3B@ȺX[H:SтqҤ^js}I H9Yu\ʭpcEFr02tď@P=X|ؾcz=`(P?Ū_ 0^XC8BOhBˠ8m5`t`ovSٵX`?m۵ltoQJ)jz97 ^-Ey`.5&j_VA ǐ}1~w淝!`tazP*ޑ\+D""zрqkCkZDXkHt5iS f-"Z.!i[ $ێ45-{ر-0Z L'k)Ea"eL?{zkwwe?<""*SFq}FDxDTJz}s9/^b@QYCyr՞_6Bb^nnO4˅&DNBM+a[#92;:a4Z aDvvJ(QUL>{z듷=,]N(zw2W"$##QM&uyGgUxH(9i%VU=x#GF+wj/NЏLD f.֬-ߎOZkEQ̜3sfj|f(ZC) 쇀dIQa$o1Jf0R bM=lvAkq HT$ $w"H:F"hPa fΘ9Z""~Ԁԕ&@Z_N[g)qjHpF} 0Oz^ɚ0j,+M###T?.`N=tr@@3IAA&2r e`tC`T&(DH4M,FQ;bNŧi;rᄒ8(8T 0%0rD1$h9eLkY U.Z>;L^Mt$I?IQinDyFMW$z|?9/bX,vp5!=;Jd[# \Sl",yQ!ɵH͑Z%3/*{%(ux#.ncWdjF*Q&2?蹯N;tt:}e2\)F"rXb5m*0 &`f<_iZ/y\>3qB Psw9&GS=Ob&88#+`3lYIA.|A-@Jޝ >b {P(59)2JAAS墘y>OMKtRgZk2Yw)H# E^ZQIpdݱ, #Ys⬁t=5^f7Qdh>W0?蹯?~fGKdX,`#KtX,0" #+/><` AفaLZD&ϢDJzON]V`aSM 0fQ3+a8Lý'"d\.4-2zۛ23iiWWz_Գc?Y)+hg2u3i #iD?cP43"A 8Wrldd2ٟTZw]ܥ̴RsI_+6uƚە$D*2}R[ފwޛ %;i}!F#;ny[aiQsP"ׇ(BQ*`TN] 稅Rsє^w[DOJH /1f 0:Dӫs0|8߿'4.io3EѢ @$UFWYr.`p?޻Xḵb0ݽq^!a"#Jԏ{RӽcYߟN/xOw=@GQ:#ٴftaT@é4 2}k .x0-Wb=ĮF%XW鐦)02* pKȋ-`w-E߸SP fiQ' ҷpf0S˲ #i\l|eWUCRk-F7Fe"\MfڮME^A͋~Bqsefȟҋ`B"'@HeWb1Y.<ϋQ!ԐnP-Rb$.`0.l}~e~ΨGLֽZ(5_HCر!vJi)Υo9sb}[30N0ЖSZ"d`t3`3J H}NZP"ZkIte|=`p$1h 0`$ 6(^^ڣG4\..y.:jѬBc)l 8YZYebzkIxSӷ/z_%0V' #"D@3V| O# Mgdd2yu2\f,2Fr^ !7Ҋ`t0*Ah~HHۑ*JIJ÷Oh =`qfbPx ͟I~d||>4&EGDwG*j:5MvZN4^w9IW_w~w*#a9B0F#M# 7sxUL?> iFzMzn>p+`$ٱ1WPBKAIj  u]`V+UNN& gσ/~IvOy>X,^],|yEG#5e ^/|>Mb[dvVC?0'bhhQCƮ#)LHk9dmCU0ZΌ Q0HqcT40#ya,Ew?t (E*%5'tIsu  ~So4ymgt|y>_NH!uH;!j`*X.(I\Id$ŧ(@ifquv˚HqMŒ$|(Q@=Gfgg;a4Q;jmQ*h*F7$2:ΤW^\-V>owS&J3&` 0A&J0^`ț?\_gr9ϲ̏it#DIνa6q܏x}ovrcA5 LhHvKQ$Lݥi)qqWJ /?o%PQliN~3`|0dFȂ,Gal'Al\dt+ >utP ״YN#{))h5~PB3H JNPz #S@2"~Ꟃ_7߉ll6{m>YwEGttۈn][[Rxڋ4*"O4N(FQԏh0~&A OYymVoKmA0Fұ!h>ϑÈ@&RB4S3\0dZϻ2w$"}V¨Lٙz'4ΫuQ7[Sj}c)(J(:$1D`tIƥ({OC?Gxd |x~6j+i6 at|skʽo5tHّWO4]N}TQ {lsvIGdtSlŲrYl#7v"3}rTM_mQ&: J;A47뎌3FݘR[nau>)ՠ4'Nwfٚwx D=ų7mO^<{||t:}el6iE6ё]Cc5L"%f,ˈRj/X)Q| 8/('g@ZV;M3Z4-ÈF^mݪ5ݧWjF¨ Hͥ< ʍB BbnTW*2ptwV^PǞ,TP| $8+}r')wȨOGW?=|> bF46_;i\Y#R*E|>GQ".?.IymQD 0zQkfuQtPFVMb@I { ֻƃхdrœv7aT`+y}`F7F/j6orٹM (9yL,$?QH Wڍ^#(P< K߽btt:}M\ ey";Jj)5uPBQ9l6s{g{;~hYMBиFEM`TJccH_}O.^wtX0$]Gm0<Ď0d+wu}6my9wP);F_o'szGϤRKMa2(~(Cܗ\x7Vzq2.xKwqo(MwR٫i@?+.o}VsT+*vjQiw`1feFւ F*t)@"~>_Gb>{պv}F]08fhn @zaFeUۍurJnoWoO_<䔑=@$A@heLRɊ LH_:G_HAvhgб ˁrk}}adAM.`DT/g\xԱ,L!X,ifZl =m.Օv#H&g F`JDI⬄g$[ >ߖHb,1jYcc6*q//E )k`c$Hc*9/A?ލ>6l6{f:h aqs}yힲ5&$݀yCDӟw{.(1i:V056%L'=/ɧ9J!V$Br̿1?{0͞f/+bvHK47Տ;RFXG00BMlݺW-Rav-2u҈xk&:xl#`HWSg3`s0LtAYKz`;;諳tt:8LŬoS1CQRu$&)A`|oG;IH:7h?FYa#7a!@EJT^+wl--ytJM6HEm'G "@ΦQVo PݩazҺZ>(2eg/53cw//^+[E@Qd>M'iv`D-5aOQdhe3$ A_~_`<t0ؑi#2jFGzynRN#]ޖ9n.PZ̜Źlz/QrChPJ)" #U y,ӫ02Wm]H!)d/}/={;g tzɩxlEm KuRhQ+P7ilۦiϙaW`P̜廟~[c1gAQ(zK*/Su]0"2QʦHr ¿?~tt>a6]NftX̭w~@Vbnp$`: iEk\h(߿]w{֣Y8禡P@PHl9Y:_wp#P-Oj"(@ֹԋ<cg̟,˳d2<ϧFi&o}S`3nXdTBˍuBff7_RZkiá^ O޶{l")Ia1oÆWrWշ |^lH)SR G$O_DFt;ɝ_[g/-vg4MS'H(DH7J0jjP̤(BkEE1?eW-~OC<>Q9`|A=Ciڵ9c_A)\~.rd| /!zs{i7N_fK̝K8 =UM++#0+# *x}j]E0uNuZkp9zҥ|CrݱQa66S֗R`Oš_ts¨S][59 PsȽGvWu=7L^f| iQYE!5MN󺨨泗\k]h< JF !pndb`s<[C*?hSqZ Ȫs6X|}Q}rt|e6]fWb;u@t4fBu_#"Qʦր%A]s8..3wqhW(Eb}[^TN44!2<7_@W_B TҺSp]!"`0:Nب#Q\ Kx-Ψt9yX\痬/$MeBqu#n۵? ;ǒ,XkZk<_dY6ɲloWޒ/}y὏A $2_ LZAE.E%r^dqd@ԏ \ i,ȿ%}/oCM& |>2wu֋ !tP+2 7@PLJэKӹؓQo~n:9.nП=,EQ#}|W~cѩCA$1C\"Q&V&2Wrh4ɭ kǷ%=M/}37{SvN& bqEEDWߺm]w[FHG哟d[ʮ-͛PEȲl0.5X|w_W'ѱ1) +٤U%.B̤Ǔvzr ||ųg{t]J_ʖ bhnSM M"&P0D[Q-FȼlSXm<}wUAR%׍QE<F`;dWrB^/]ǢSo:fdlX(b*̦K6gQz.̿3}@ 82%P\6b\\\O,MӬm "}U:uBR8np0KtsOnBkae=hen߿?#ڹW^lxz hAPBd6#lڛX%6^Ut\/> }Pmڽ/Qe_NrbQ.=׸ k:zFGo(%5AAyl8!V%ueYb\Ά`0_/zNb??ћv?OφFΛ߁{;zʸ>gjmDHE(^E~y/gaorgwy9ji^Y,r9].r,"FJxPJ`7܌PD`+0jg.2"tQ%6;|Q eSU~dSEe;;{ޫ{?|M}҅wG&'zCP;giR;Te+I,DAH1/g@vCDٕ3'/~gXy_Mr[.hH4-"S-FHou[EH (uՓW*E-N4Mb S{B\۽^o'IOO' W=SZdE)$['?D]H"rd /C_bbY N? .K$[^.|?˲,&r\.g,EQ4&K^ `$jU':$`/\9n}J"[ 6}p8RzICco+I7^}'˼?+hxL4:RC@E AdI4$_B%HQ"a?ɎGn}(IQt/4M'J,ltH5vn˔ݚzR耫k *<ϳ,Kżz~?$II8޹?Ir={wDJa)7JѿPXѤeHIE{LO?*?TLOowOmO_~#vgvnw>YYk}빞fWwo5R,*(^!"cD?;go,(sέs4Y1viI<_E|y^V΅@t DI^7R^p} u>̟[7?UwDncp FQgYNd:Md29-QFQtz{O_s,3Ҫ*j,9,:8"V'ONgo<%Rovuv%ڤ($al0KDQX_Fu e߶kX%B]MFPX3K( i6LVq/&t2L8M&yE(a|T)5ZǧJň!` bPc}8;vLnsιZYkӢ(rcLVEVEf5EQ`6޸k_7^'B`[ڴD]Ff>E~e,aG*IJ!Mt2,8>L&8EQ4Z+v8)+4"WO>;l̎Y9"rlU`K1&5d{,c];'Mat@jOjT7[ Thys9g,˕RIEѤ\k=ZQJ8LUR ޾W i) {C!D\\aĶ/EGV`t!t5k JaujE5EQDZLkDQqq<8ZO(q99AIS6{ueyPj&U4ṇ;찏-rTy㙰cQGH=T糛.s)~6܀91"jZkZF%\ul\Z+7?r} zcϠsyC@L$FїBm9\ƢؖƫF>]==D"RƘG>R*H)(6sDPu K"DV@\ە*o+?j}nO(U'Q⥩՞c93;k-Zk˯a0@x䜣Zdf?f+dgO]FЧHȶ@䥗ۋ?[N.9`^ GƢ)b VT:DDRʟtZ& v+mnM1dh?F7M>1!;#~JI O2mh0ϙ:oә|.00k}/Qv {1W_EaTyP+AOsvfwU[DfF@1}=ݷ`d%vh01ÏtBɃVգ&cF/Che#) XD-HtQYRj3"ꖱ]GME ]wl}>(蓝Fu%hI`ra!ԁ]z׍߶GD Sz`{-J)iz͝ "ܑzk{]g2h`4 E~lC H5ɠ DM02N6DC._#`܈aFF XV!Z7 FV\*L;N.jze'Gx"$.@}o - La 6#'B`JƞG&BYٱ0[tH60נF۲tT.ܕ$qw9ac(@"13'}zS za5\>=~T9K 0u(T1^쎖ƓtE7\ﰽACd3uwa~/P40i_%cx;h kzZ-*ꛮ7eRpCvaeѡ`ɱn-uSHiv8?icGHD3'30@ L1j.7~_/z6M`>@A;48V QRW |ĺM{;r[=+U .0ޟ>G TC 'G)>9mqz .a A]#ʹXAa@~]D~st[RxmE`G{~CeTWWY4IaÉ|5} LP3>R]5ဨ͂+0:Y+P!Rx]Yq&q]O|x;,> !)6~\yWk] TyϨhot's GFH~Jc7}jw8wDCmѾ@ݵC8^Hrc)DEmߞQE@9_ ` .#` FKU9$k6 ~}pW{AvF qx B﹏H5EVPڅ `0 Z;sWaEa Ϳ˃:] >vw cH R@vcbҸ?A@0HnQar]F|0hĦm/R{FOWc.9x=^]e!Ca/-mq`p jO Դfp@  :Aܕhs: ^ڞ+@U('H]| Y81Mk|Pk`^v;C}/N=r5]c<;A\O8*M%b1^_;;n@Y-FTϊxd}i VaTi@7iuVȈN4l{G/q~9HF5; CsCIA.b'T⪩;KuC6h>UPFQ xr} e'A T;Cm0l|rw Ѻ 7 .2]i'vq_-YnБPǮK԰Q['FFQ;a8CњmA8T=Z3 ^8oh Z`tL: EHFs:`=@4̌D^Fp0*ї~ KmF㈐[^!q(\2F\TD~8VT JW>Wt]EbWo @`[\ё9*t1!.`x=lY##ol[)%a`m\p$mwL:2*%HC XvxAv_Rw(D|a sC,0:B'>#2 =C~Y)ˆ5(!HaqX'  ]Mr>Qp16 l{. bwq1VmeH ґEHjb'`S6lre>&Q9~ C1sz# `alO- *Π$ /WJ`theMq/(a4t( [ݽ!}*7 ڟGF|*ї~@#<<nʺst d)>*c~.V#se1㋒n|wn^qӆuq ϹЩCFeAI1Z! STQyM9h GEF?h ;5/DI#nGn{UaZ0I##04.@B%7,}a:ا,k)8u"-aʸc^FQc{-#Q43H㉐oJVAUXqDI  #Ⱐ1.v[ FD:eiwٜ+e%D;+0Jܟ 32:io'Sw 7 ]Y㈎\+* #t'?sJʾi 0FmEI1M21awqhm0ZF4P̖9Zzڽ-UvC\bp sIJt!9033;"r`9_8R߅(d@+l3%i;֍\?1U}](CDrΑsGĞ'd7V]FUOm̴[0!"$PHtm)! ] 2 `SqWItQѹ!ED9KDggH1`7{lXIaOu@/"$7Q3HCsQAD96U7t F B`sS]֚ pp}W١(|5]5EWBbCp#ZKZOƳg%HmVPh>egD۔3"\o͊/ۨ$e7Hr]918U_U FPFH+(3(Dan00*nkz 7&.#9z9 `C9 Ro$ 6UwR=@8"bkm.ʈ(Q{Nף)0ʗBC9Dre:XItM"x#]ώHlBpT>C̡9C˫fi;gɭs.Qg-^:BpͶɍF|T3́pkt%ιP:""B] .e m*#u@aŐԴsYk \JD ?<6#}c!e`TJJ  rgFd9VƘcq=pic * +:M\3nk-EQcRROSrVI}`T}_! nO-+cLn1C rhЁPHC[̍}bfa#NtEN!eg1fy:Y|@FHv~5ǖGm'ZEEaJw\+l^=p%z6sHc6)Bg\kyn<ό1Kk_>u07v u=ξWckZyW ĠETe} i(BdD `渴:ҜBZ{("QGt+emI@m^^41뎈ZZ*|eyb7#F}_G,\ 1(1Vt˜uTa DGTHEQ$EQ<3 Ad8PM GI9[ErZ=βlѿ>+%U{5`26=[7&eك4M$I*l8s\T%RH:2* Et}qk&LQQ&MU$4}o>L5)V>uSǦb@0`? |-z!˲{Q<:@hU t`b rAU()϶RWYkmKJ$y=}vb@i(0a(g_gYYVՓj* :v5Yk7p@$bîj&BvyH5mQx́'ҳ$Iʲ_[`PT: 2F:c}s4$jy^8\&h`#[5Q,} u*%W4YѵNDdW*II˲7~oGO΀S@Ui'ĕEu|7 6_OoNi~$ɗI,Z꺦׶?z΢ ] o}Jwpŷ{^WZ$*{C$gQ$_dYɷg3` 0T'zn3)`Sp^W?Kj\.$I 0r-ysH"`ѕGI,n l|[kjk^9V R[t~Muהb:(v՛mX|J!{{[ [~/Dᎆl7Jٚ=({?H_1 B%"z)|ߛ9Oo_N;4u! FJz'yjZ=;;X,T!юHt C+a z 2rl9 uEIP]\uU032;[-~_xM(gJΏnw0Znk)CP#Gusqo4M?Nbr\>Y.$:je|D=ʲ kvȲE ^$I` \/>Uv o(ujl4T]D0ByHCpZK `DБh%" ".?(Ƙ[k*}~wnWj:h` M8:5++ :`oL[@[YAF~x8DE!Bs0~[}@ryoZ=XV_%IlZ%Y)2j*Kt4d#BI5rcbkv5)= ]X>sTEd:NNNN;lt:ibS|'XnvD[&BݑM6<+ԦIfv?JR -`?GOo{yO4MVIeYcjDT-I$ %lI˵IR*ZGqOl>4_fNӯM&-ҝ[xw.`|L>G fIv.% i:y/rد.``o >RJh?zO` D˻'+?/Ae4}4Mi&~mO=:rp~5DIHQ J򹮼;%-œd::=995N_fw&ɝd _./j/՝w@~ c[Bi=*0.}Y9@Ab0;R@q >,x{ݹkc(y('YAyf)su?;D$ QRS (uEQ4Lt6Ntzk:ޚL&/q|; D?Z7-흧en x@mkRz{|tNeUV"K@g--Aū/~u祓O11iQO<e"OF"腎0ZJkˈi2Lft>Ndr#qߌfE779En.R{Elpa|803M:D<6Gg@3)I`Q1DŭK[kιvaYEqV2˲$$˲,t[.C :I$~PJu~TJ+.f,d2$(QhJRj"dG<]fuQхZnffV,^đJ "ʈ(seD֮+cLjMBBZEƌCDKH$ $u\Д^qݜOqO8q6}nkGS煾^[a$ёH$(RSQkX8c;hj?K Sw#H$JMv9mђil^%lxSKyP#P$eߢ;>jU.^K]N`޵_{B$@h@jZP ?H"Hty0a{>玨i+H"Htu`D}`jۧ0JA$@ DÀ!BW"H$ ]L]==O1]&y  H"2su}Ox]+H"Htp ‰/u%@ DiH@rѯ D$ȁt}k(kH$ 8$I$D"H$H"H$ D"H$@D"H$D"H$D$H$ D"H$ D"H$D"I$D$H$H"H$ D"H$@D"I$D"H$H"H$ D"H$@D"H$D"H$D$H$ D"H$z JWIENDB`desmume-0.9.9/src/cocoa/images/Icon_DSButtonStart_420x420.png0000644000175000017500000024540012140261562024247 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F@+IDATxi-Wv}Nޜ7a X,EJ(J(JآduKjm{W[^(y^ne{V")6IE,Px(h; E3~!GR[zx=<zI-c}X@[l׾U  hC>> >@uԭSXﬠm#Y?0o/,m(BJ2YsՏ54DN[=ʂd/ض\st1qs81qDDCD1El!1$k":.QRODD $I!PqK"RJJ$Q80h5̬PM[ ui gض2<[8ܶm9,beYhYBD3Ƭc 8#"*$ `a2 $"BJH)$D$b)& !D-$Hj`%g#ckÞ:pg?gݫ ,466tIk̲,t;,bږeq۶-˲,ιǶ,fو먷-D[m> z?@ƆΊ2f|D1%K)Hz_Q$b!DLD"RFq')E$qEqE" PU N:1I$hG;ԭGBtF8\ |lu-ιcۜs1"c"eS smW\\sAuW# q"Dʟ gA@Ǒ޽2T޵$>!"J >| lݻ9{{"_( @B"'AMR0IX !(80 (d2Q$IH16ƞ5j[kvMuT^Rz! ԿX⎜Rz(߷m aYeY98e91ײ,O9 @>c,P=z情~0`wl录= F) " 6H"`ZR@0n"z+.@ LH @`_B`qbxn7Zu8O>޽h8]}rGD#)e(QIbq$I$IEQEQaXPSګդk')"Q?SR> $@(g@[؞9mm{m xXs#bs b1zKKGZpiࡹng~ϊT7=KMIpg+lu3u8s΀_+C>C@@240?2Jg0L$DD ~~@j- })"0Y7ݻ=ٺskq}筛"7CXJ)I)GBb!&QM0(q1(8A-@ T>WԱG^RBzrI?O^S'u1qy}q<Dz,qss{>clg`Y`O?}`c{]>K HD$@8HB`1 $ .Cs0H%9T[(*ed TzgX~A !7HI !)%A0  =S0i!$W{ws}!ĆrK%R%%I2Jd8Ip<GQ$HFžLP՛:9b$@u9w K!hh60j ,u۶}˲|˲y_7!0|Ńߵz`>J $ `Z" #R!ńPd 'T[i *6~ g`\({Gդ ~$<A"q3Z{ Ͼi W֮v^$IӆVI (IqEI0 d" L^0ߞ)2$Pa(;@g 5ymہeY=eY}|169{cϿt|鳻~j^叄 ',5PXi ЍȔ:b0F;TYKOZoWROi\#1[i%H %JL@" $c-k#O/{G; Ƈ[?xgַ?I,9,ks[,kЅKG>}S%XJ/QMmTGw66I@ʴm&Q14R,WtoSP"d b @H8 "vDh{ܙ/m]yܽo^޸qPo&IbA)iZtg8KnƐtk7U7B*6@bmcvV}u]7p]7,kg-X[/9Odz6c #D`#BJ) :TݛI?f#2Ϸ3Lj}fˈ$ 9! <PpkS8懷N䞔~o$IEVEh4dxT{8kj>[ {7eLe` !9+tjiͨyĆ|߷z8Nns`Y<|Q`iy_=u,=9?$[  B8x~SMd?˖5Ðpj}|rf?" $AHгCpϽlWo5$]N]]BAEfEp8L&h4J4IO(})MXjQE! .ݭF",纮,3I9˲,Z,k1:_?}s{Äv@ S"~RZBf>0@)AB32tSeVvB.1Wu'HHm!D@&1賻}~?W.l]~k+7oE-)=q%Ir? 6&d2Fh4qU*utڒptԭ 1۶YV^y=qm۞,kٲ|s_y±[p+!25 % ,GoL(5)Cm nS ?b$d `4e@I$ &dIL0NJ]XKû|z;I;mBs]Ak~s2lFxSʲ3mtkumcd3Ԧr=)քuJҤ f'" % kS/9+{`޳w_7+܉yw=[ `}<o?ǓC ڀĜx`"-䁌  5=tԭ')>|l^m{sjnw_x_8xKX#(@6:TikGQvo,mu7oz3֟$ҥ I` R @"ؼo=CǟW޽?N$7m۾u|_hs4xkk+L&x)(s51e` ;ԭf5,D^ 8μ8m/[۲s+??rkoؾ=Q,a",H93y.2',e~t`DMW둆OaZԙOR⭞*hߛ|QG*J/4[ B$Cp!5YB[ hٕ#?u~ڭ7_(\,뺷8ŘFd8F &=l)"Y4jYwis"`d@8˖eڶ۲}O9~̞ϯ<]AiC@Pi4? ,[@5RB3^]~0^050m o~<E".,p-P D*cIS{^ѓ׮l۾i-q? Zcx"d7ԹD4uπ~?ЀhŶ] zs?zrA" \0˄CK9nFʚV]JQ$G}$m?VnOZkg*cڐ0CeQ˓!P"1&\ %0p6{}7n7ǹ8A1$Q]%O+ AtDi5%vԭnjR'ϳQm| kuO% >S { F!JUqd-U7i36FE3kR|ǩo^?̉ZX)9E9iX(!&Ӊv<—?eY5qn{oA0X%@TvKO'ՍTLtԅɳs *^}]]pgqݖemSqkoo=&!H4C@C"as Q@M`0sFMN*ض|]n6yj!Q ;KCH9Hu0yQi|S|HfFIR@疏̹uʯ7yZuݶk}pq.}Q{@hIڭLuH4YѬ}D`0 A.۶ڶ}+^z?~>[ DL@`S!R`p !N`ɈM̎*yjhHK4c'oDjPI%NT9(-OM3Fnt[JD"p $ܹ7w_od8fY qn{ 0ڊb~x%[jF*1vgRm6;w VTbDs~R˶mqgeYNŗϝuEHB KtjYr|`oZ݆oSVWlƚCFَXme%O$G/דP3VY.Ԟ~Z>0<#0$`D`I Bp`"%lE`hr/N ׿9q-˲*`y}7\onnqf&zR{^*AaƎPKJ`= \Ŋ=[r]wml>p x~pFLJXe*ѡbERt+r -Fߣ}B-~>5UeniMœP PcYOP4y ='_M-R&?r`K9,+&mK\gV;}oF=˲ڶ}qWliT/UezїO|zx6\@TIfXڌ!rAB*MR*kj" :TvFSf4́-: CDšh!_$]C}A Xvg8m>tW_ܟ駒 nND9)#BWHR6~jk#:;|}L,50#WA#jJX?2?"i%uؕT*4i,ߠJ9(q3PF2͹ lmZg1"l",3˟?ǮN\eY,˺8}uTxxz]-ATRDBCFٽԭOKz=g0-y8~qͯ [:ZL BLT~Z.y 鸇& o<;q95F#* + !i+*-`dU[2@(₁E2e  Bk1}g;}߿[,m7l۾mۣ)6PtRDij.gXr!g;j$z}_+/OEdN`KIEcke`"klݮ&,"ƶ(bʆMcnl7~84j?*eok6B2ʥ8W>LGeVV4f2]M3hJ P3y5 gtsvnq`R6 Xۜ=Gz_W0?a-pίڶ}۶lFjK&$C,H Y~$)ҾKtygϻ4ja]mȮG3 cIp=JO=<)yNՊ: Hc) #+IudG:Rf69HU[*J adcMjL}FZHfuYA *FHrad?eʓRN>ݡ%7&V~g ʥ<2;u`m+n3K+?^ok_7hǹ8NΖTmIgEs@%DŒ$]R´ݭOG+"urAy^۶9s#m~'0"*b{.1"MD:r @Ks0fu$e4*PeTuRD$a*}KuoYS@!%ClMH^t֔՞PId3̓ƵrArsz3•W1L5?vX[]p ջ_08W-˺e}۶7777'0cKSCJ\P%S#($@OCHD0%{*}Esss  8q=~_|JDٸ,$9(X)SD@ D@$K@$4 2&$$YҟiO65˖(50BfTjBM#ө(aA~_~ [:^O毥MXahj0:mNe+0Lr Z31HlMp@?ѿb_ 8=۶=˲ڶnYֈsEQq,*3HxՕ’4.F :w>zIcqs~uݽm ?W_:I|LG &Q6 j@@eQ o$Q!3;IթUqHeyƜs6j t@\,KlEFA$XN{;0Ŗ8>!"LDx}^ԿJjN֣MDZ377wyu#ų? S,o;kpE1T@'3'HŌL[[@(J,,2d:N@ed4HyX^NΐMW*"4OEPb.'!@dGy&;]c%eJ@5Y a8dT R,{8 "d `3&ڊr8._ _z` 8=˲sYy`>Pj%tԭ^tfdY}-u݃; Ͽ3IHIp%bɸZK5'd IH@5>f"6D MSˤk 2ᛢ7G`]C܈u*H n9*ٱ \c9*P{Ap-RNL%k{Ae1UaA_DbA Io3z>xf>c,;eGD]ƒ ORWzDe:JR']q 2uz2n}mgp<@(H@!K%:D9t$ XҷLhi Mq=M5i2l)x$yTjFz j`u˹vQeţuRb4Mq6;rXjyzْBLO&πF,WAR:ڄ.Zp' B16qula//wی1[essηB"5 򳆺cvP5Tc <&roRӍRqyg g0 X<8V# ka R"$:,$:Q$zO:9e,20_I2HpmåP=HA; MPcyPn\%*aMJA*`>MVmںHoMeG{UVڐ04@qHz`ϖ <@U%g>4hY)J3'X  6 roKS{css~q xkk+JDyJفT}gHH^jHz`EۊB{]=Ͽ? ݾ}'XzYP}<@}8^+"%Ñ B W]FqsnlMI1݄f!QP uC^$*jYr( Mavb("h?tUY(.Yv[ ʆ)H4Ցl j߷*=60qZCgp+ 8g^ٳ|/p'{1sn!zֳ4LLA=Wʲ鴁|)<;Jߥ}w#QSH~U {qŧ# ef`829Nj+"ƒƎkh f1X#24Jvz5:kr$A#.ޯ[Z+ؔm{=VR)+7ZIsƥM.䬙5fJr-*<3`zef` %F p$v=<߿/e=Ŗl۶3ư`J)L3e1UH`TY3??`0XQS?ϯ$LkD-B@)3R"`oJjGUBf II&Iv'7 P>3 '4 &hԞhX:~HM#6Ã.ISy8)2ɾsRmhfU )7 u;7}c)S(/1y]I#"9"O)PYq^Xaq0g/:ϗ~}Ƙcf+}f"(=(/ zުy\=ȱK_;leop7p; Y;GR9tq47-H-Z3Rv Hf$r;Ƽj/34&&eU/Y2l Ȭ4b))dX,5*1VJ{2=.%)zCeg =P6$uFrd()C R #,Ʊ%'#RTLBb鎆wX'6;$l/ٓͳ_c[ScمuSɎ?$7aԭGFUb{|?8ɳ{s_ٿ ><0LP jEiTdCSQPfXŒEsR&rKēYE7zx4 6pX3*I3t LuV`%ё7' *N*)z^PD eFLG`֢42.wa9X)5!X';$`}3c~, wt^ADs8jD`G JUKxA?ѭ#f^g}wnn7  yaqNg~OH@PʌMg5QiT]cݨ30#HdY'XcঠV !Tvq]i `$ Vd#&7%Mat:&GƺY/ǍFjSxtf.9,i~Ue8.UDXԌ2]#TA1GЎx[(0q$au@?3_x/lDhii} _`XՁPP5Ϩ4;6DψxLD$)YTh'W}.M=kGjycHS?Ra1Iu);&}ƓJoPG*g4bŅ}+w!! /$}.^]B?S@ `h%j*WmA!w)ۿ;ԁQ55h0sss`uO--3{܃XB6"ؐD!zXU AVv2;$)m4A= VK~@gkhd*d:j]*@~)5S11G,XΚvTl:0s>T/#LcC Hx˲/gp"RIqL $^`y_ڈha&%-A)vCj[7dAV_]RCF F `0حt7%0SĢ9r8Fz j@ LZQQ_2GJ脤YGR`oL&;an!"z^>õÿW^RK~I3 ~6´ћ$:Ѵ Z6]LWTj4m;!gPOP('l;PP@ݘIh 1DYM '>,)_TlIH\l LG&sIf1 s'YYs??uZDڪ<*P R:qRFQ@R0 nxws/|˿<\k+I8 A()9T 5LdխV!)@H.)BJ $%I9h8'IxfEgws/|/rUvZZcБd@hci}eGn)Mk-q#9fd@ r%5?jexdXK-4I4Xve>%<_sT2+"Z 29!bg?BҜlHF0Rӑ<1w~_'6}yyIW飁U2G"U{r2RF `Ġ*n!#uO~ q}{@"R[ti˹ZcyZxjnh(Hhoe˷y7$"! 0M&d2يhEVA- ׮~Oϼg!XX` P GX^C1G0G$jcFZ5tjld/5 jgٮ)?p6/Kb)kNd) T3Ta~f7L-DiQ6OdYwX)1>卿'A,$ #HDp{=~_cp)2Kf8GJEHU >`L&0TPF{20:/?Q fAo#AvK|xdDz`*;mDt TE3"JJA)L&c"IL8q_Oq "BSN:R0刊=,8=N;"].ӽ$Ȭq 2N$RFqqO(qFEvm=ƅs1= UjTo0Id߷gfMT.Qk6uz}nr^j/&*&h=|ȦS䓠)IsRͰTH{OR|`?PRoXj' Lf( 0p+//:3{@iMBC d9/$MkzeeYsss|F랹?ŗϞ aBd5#kF0=(SJ{O#hȌ%tMq@nj$[6J"KH|e ӁJ ҆ +"^H&ʥ6R ٔw,M E>0 b[:wA2Œ@k5YƛRkԪTZjF&Lf7I %%-z8nQ|G\LQMsS?% je FRBVzM+˽+Ug)[r8Iz6ĉ DM XJuDa& 5 үgq&|i@ԍ377`ROrw&[^muCp,&#Z yo,;$: 6SI" RHaC"$$I8(( o+u/6v6onܹ\omHn!P[oH3ki6Sٙ ӵE ?[P fblMR|XJVaQV[8:qzMAKzPoUOcNEEmDKz6Ͳ~ j>H2ͿciWJal! 1f(aϞޭ "ʁIJI9 =g$H47]ALԍء`3Q뺶#K8KEQ BTRx F*H;-VƍSt,O{- t)ZVS}or鴝wkz ӣԑvD$b2$B8P7 `%= G 0gVyS[0CjzJjw+9rZƠ&N%3s`ehM2daLsY$T$D@@I:<6"S(-(LˤraXdQs 6KP{~+1%D$@sð⾓`㤿_|\ʂ %KtLGH;ڀjfZlG??|0(. YH*XjOT)$HMn-MPH|R1-i,^w.S:A\@=H*Sd2)%J)-%*.ޥaǛ~LFwZ;sd<FS#%-GAJn:cQo}F$1itG9A6G!Lu$UDEZ[ŒAUɌP-04.QB-<|g$iJ%b `-8  $9޿/SIEB !Rc߁y_yw|*%p; p l2@=,dbz`0 ^ucŧ~ם``aaL Վor7J/Qٶm# YfMP$5}uS/`;QQ6{H=9-e.HZ%<䵤ԆZC9JBXz$G=z/=''ν+aQH)ICkyg?zW'O;QLRKQ, N_}ǎ=|j3D Kfn6v< + RoRJQᄫeA%ћʓF 2iӠ6է= $Pk\#4TeITaK9kMIIDaE|+Iu?}x޵Kמ~yĥћ[άtƇ[ 4Ztjñ_d|nU 4l5#S-=J?X8՟O,F( bf[Ť[dy$fEn֓g(Y 1؈$ E6 ۵`_y-"ʙR2"L& 0M59_?!̺TG][`GWg{1JUjwkO$CK5(,MH\504 x">/%$KT&ٙHĺlӤ$D회7hӏ{=›SgX]iʦl0)L3B4$QLWIw PG5]MkO275s$0=!jUX@̾kXJW͸"=7i,+˾SɰTJʍ$#D`g!$$`c+}xWID)eI"l_U7j41x @|ޫNoVBnwp=NRi:s3ZiuzS,fN ihB5JZ17k.Q SJӐ $R6 0KzxhK='_<*R3PÅMG- 9Έr jtkkSۥe助=SgUf>.df..jEH@ar@'L VFi,J;̾)D E 9`B;xnK)'BH@BFPKЙvNjYF]nbzr?={{$`Sx@I>d螊FQ~"dr9[6׵қ3#L$Q K&ƤؒT DYmi \A~+o?ѳ0UQ\wP Ĥsn8 jfQ FLG|b!0g0-iDEi">qlbyĨHALiE&2pWW*_ĠcZT'\s:HVG9߆{ǿ4GBJO$Pc`*ד7/";kŎFMuL NFw]إ=[X@g)GDsrwE(H}<ez{J` D[j(&Nî#L ĒCC%LP7=V[J$5`K{&qG_yӚ{;W*OFH۠<2}K)ee:vR˂qz-HRcMdLg2K2%+vMHsu*)*8 Il6J~3X#/,5$T(fT+ig!aB둀eC{0Bb@ RQ6Y[SX+@X[D3 ^>6?(p凲T!J= 9El"C+ïqdžr&I*DTj= QYRHTT7BSݨ Xu]' Uћ%v5ic:0u9khlH%,w;05$24ԕL6ͦPķ( xh;3= "f!y +SE#2yO j1YAK]7r=M t5f]Add ,+qsFbŀRCRd!y2x3,`sB؈$A znk~kIL;4QIU+8@}\#:@䤺iu<{ޒ9_GO]&eh");ғ;gf3@vY5ϨPrJ9J)e6)0Ӵ?iM-0Mg%$upj*!ԧQ>Tp .oRי5oЕ 5#"yږʡ1ď/jF.ND\<YsCv́?Ս~,i2ez0mPlj'j8V% vvC"5b[qoq֭.8 pPߔI `Am'0Tei5#!7SSLQxe2/G$T !sݛ҃dsJUVDU{\XQ/X8r¿>^RM!0I(KbU$|GHwiR]u]}[YWĦJ̨R3nbEռR415eTY Xݢ>@-ҝ ^Sb Fᡉ15xYX(M?ח6~oX|ug3- Pkp7kC*qh0#Ck榣&JWM`=rMJk&ftiYGS@IE<4Atv@d8ŐEiZZQˑ_03Mz31#)  \3DPOf.~qG#f7f'fӃ0@,QE LsQxo['/_ylpށZ=Ocԩ >ϴϚ>ψCaL߃dәkFEVԮ_;iR0$jY֪XTԙdΤIi6u*F*ZH՚S>* $F61quz;7]]`Xz1;V۩ I{zzA,ucz90bDWP5fi 1&#]O3 [6fC- ԄT>(SKZ)AN6#]"McKFmId:RE捭o<>p/poe wC H%&9ZNaFק4v7j&e`4t4cI|!<);$ Iy=5J(PR}G%f1HG\0'FI@JH@" N$DO9KYZl.\\3+K\z0 tfjҧǎfaHhYɤ:uw;s'NϿ?J ")b{\КɈj#Ie\I«Ռ#%{Q u'+?iœ䴚%wBӵ%:=:+@*5#zPgP`L⃊1θ HL}KI02`2oŏ >4024C !!rt{7.9g_Bk bHA7 M2]%IGc#{d;*~r[ )5#&tԇ &FV'8L $P9ͱX K5`[ j<8֗_z0!zE~FQL&zIcIO =T^oݮ<w٥kP,@aX*GkFa/+`7n06 X~zu_$XKUk[iT1)3=h}KQE0 GY.|ޛ6O]s_W 0Vڜ,.rjjwjA&l>\X!2_M"D!4_m)ގ$(I^3.Ԑ$ aJߌj͓; >u1`q3U+ɹa y_zˎ}߈haԬuGSm }B I+5:cz=7yˮ-.x'~L$n^Bӡ|er_wjᖕ)DeJ# >^YFki8Z񑾸N7vMcKLw1wi/(MHKĂ MnKOΨ&0jc]lj`4e"o { lM@:ZPy"0'0̤5hԡUMՕ2CrI֛$1X"CDd=8|0G}870a(*mYIfIO Ȏt B(&A<8Ρg^ @P+"3mld> m \Q I&0*# ͽ$66VT>bTo " (NNZ tCΖ`ݏȍ;ϳ_s<`QmBx6^SBڵՔ?2aGӛ^*nmXظl`FFd(dF ٜY)'Eڦ\,U՚$ b4P՛8m!9+4u9]xaKxy^o\w+T=|1hlY~r O2C{T22AVٷܥ_|mDPHBP;95lYRS @5 OnfIӔφLRSidY6`؏R-l6=x%C6tIozQw23Sֱ=/aey  I՘;ƚvc2 SPlT:CͨuU:3"%@8I #q1pll|UV]J.Q!wTԋ2m-eS0i!BT q"r c?x +:Ir xLKe'(#i>/+`)%%O%3#gŒJ7Rfd؜ $iYzQV!`-}CuEMqTFWKwNȣ6=r^13”\ʒ=}wui,0 ޞIS^hvLWm5Y[hF0'0'0Eŭٰ=1V(Di E2vNTmTpV_5B!H)ѳ9DZujw8^zdqDQԔobICFv{/9<5TSQuLoFaǐҸɰQCVj==FmD v\{a&xnB$YQaǣ(6\#k~+{瘵HMʍMfYc[M ՘QI1('志bd JOU,ŌqGʍMySʴ>D紼sD BQY LV0wȺ2z7yw?MUOL,D$ 6L#u~A0.q|-:WGqƐPQ"17UWeUc.רX2Nz2̐nb#&EtYfz`z㘴HE /Dnܺ|{urXHj,zWW:4MmL>gӵQC2 Ԕ0[c0LR+&? ,Ev$QGݿ#(KT顒bKB  n={Oi[ܸ0 7FQ8$51G,5}LoeXA8]]vgC6-UfSKK΋Xk`DN!a0i#!oQXmI)ScpoP%6dz(\JjzhCv#Ͻn (iB^_=fԜP0j⚤CκD 4J{C~(>(5*LubV>CuW̨!#/CB( `82^/]:yqozqEfobO ّ! yuWgɲ$լ>>j@{>(OJsS,lFTK`(5]݀<4#322)ىQu`m[ڎ!> d R^ֻ$5`jK(Al%I'Ƀ#^}O=, MO2fƜR3*IMSXAkckځ) S[xCR }D`T:ݙ~J2w eoGQK?OYu.*|c ,+ d"9K.͋oymLRHD@fIO CjcG58빾=[rg.[=HB&ʹ\GP!.cZ6dOL:&P9Fu#l8ǔW+'O AQoPSJQ]QHO.Ƀ`F0&0%a,-,3`L~,LZ.^f.(T)\=g3c C Da*ɽm3PM8IXh+8({B:3PH~t[ j>bJaf7th+Xa_4.;ߎ?u=d2g?,uFq<7);zS˧/\(MD̃T|N kF{Č>ZdgQ|cFSb+T321+2d F+ʜIEztl$ٯPtSNp}/?Ͻ_:0g(!@d:ӂqP: j͸I*00G ;3|"fF,d:E`MKSAj:-LQj4Ii0 ,#~Z`.f/cjFZLChG%nIÚU U{IS$)V3\uy56`I% }DvAjG{_:|PH 8*v-B uJ&0(H$cj<5 ``XP"pITO ́#=MJ[xXyƯ^8:Ҿa/w,6|JjK ,7t0'70*$)d25J"eJԓrjY"cZF9C Iy\u~7}߿xW>UӃ1iK!5:smA$Ƀw/}%.` $d:6=&0vÌ: A0 ?`dj=)~gR%$LdT}L 렝b- %X?U8Nr󼻾o;o%u1֎,ŎVm{G~t($܎d~h˝5R5ajbw& 7d-צl:j0#&<cmAcGDi G|#`Kczh|`ՖZ?6\u=g_-> ,Nd@FUCUXlhhK X40* 5ԓQOBDzDd5(]Xٿ 8$Y?s{|JևK= 7@RlHlbFB`˖?bX{ð]j3=R 0K0 USPXF \ ܫNQ@HI5mf 1](XT0Փ(3=iHm_jYcj["-ߑ ֣oQ18,p ]p#O[Wv9y]u7= a 5AcHr@=gy}q,Z=寜O$/!KZx0RF,mXeBت[V5*:{#+J@a󌪻4pCe0cզ vܚ-M nz$Ib$> p.mIDqݹx{߅s/2VOH1M GI Qie(/ese\xXaFyP+J +b~?i7{5uǓ$VrRS6u]NfM/ͨba` %4]K(z`g-mnccLyx?)0M?6|2d xp+p" 8ČJb [SU>K^SADŽ!ض}{U M 8v 5X֏DZq;Zm{?x`/(RUx=`N͋rtOJ m@SLBEC25fagҟpG2mxMPig2=h3^m7}kkoX892b2 #Yj|P+?KOvUj_xԗ)QG;LS$@ΕC '8y7X%cinx\4в,yl^,k׾o30J>*g6\St0jK&M ׌f/Fj[`ܔy#14IyJd"URA0x$kg{,XglIO]M0=TV\w9Sa /.eL JDsŦ|*&(O@ `?>۶뺎=۶,Z⫇F1z,@TՓ3z\luETkSM7w&t5#cMa`0~fGczh 27xSι7޹s2 Hl e1}HUNWDiURdJYi8 #iļtO G !۶y}0 [q=Kn]`iyS |,Iՙ4pՌIݲ6ōQޯp͸6E/Y[{ggḚ"TM0* AT0˲&AVZ1h!cC`x+{vVfnp]ws$74:ɮJ ̰rc;[ PU,0YC%8SdPPi^ fᦁS#oJC^2\R4(w MlzR͙jK2 0Rj\88l^=GŁk%)3D0}AOع`T%5Po2UOjlJMu\y-ߙ `qpzp :hjY֢8}(;Fᚂ&jYiru[5oYϿy\H$o`̦ær}f ڠtrz|3}fb`"'ՕP}kH>a0YMH$k]vmyгF瓢 Zcv &'7)'QiV #l\zvc@a[;3TNkڒeYy8}۶۵rMA]!A^#3#IJSIi@)n:jPJC\)fDm~u3|N$̢ԑl-dQL5da8Qliӏ}^x󕓀N?uR[,[dFe.8ŗf,h1Q17(?.<X텛գ'۶畊䨞$fsc#= ]9=sm۞m{iKB $YMn:Ͱ9MI6Ռ'A^1{թ%٭ 1ԙ>qLIB%/-|tO{뷮l]}|%6FTF'>)4ZaE#r򨤊 C~DZ>^d˲m{UzfIO\W1}wٶ=`-/_zaDLtd5^%I^weFF܌^iMHòu46 Ql0B +!ڶ7&PfHMILjAlqkK4:w̜r"t>qj|0փ ]d߂06^ #bڗAx{{='ߵm{_< C O|'@j-߶msq\qze-z݋/ j x?`l̮%~( E AU0ՌQZ0Xs|%m[Asc4iLr뺞mہeYVN>5 I۟IUR)t:8HȲL%'M3GHTædQjtaI:WãfKU4=S!T6 6$Y{^quҍw=d6P$(5C<`T4RQ>@핡M`.F,*${E,;㻮ksΙr=fml۞_>L* JiY ˛>jYcJTP=P]4f`dM?\H0ߙdf5=4Rxc?Xq|40H5*s c(!mğƒ$Q>=~Wd! Sh\I-88c۶Uls?U45lKsV i_>>Lu=M*B|q?j#K5#}&5,H`Τ֦Whjy0{P3 Wo<2+%FӭӃ(alɏOy[n}xd߳[8L =;v-$Ze|ScVC҇}bmug!{;exemA{|Ч,;lck[pe-.97?$ Z֙E6dE: jsǎ7^M2LY cP*=0@CCj`kLZ5bit˷[l- BB(0ŃeaА1TZ NAqHa= k9Œqy=ig8qq: 0_Y-jOs+)Aǩ6pSS>c !`#s|۶2X>᪭zeYܶmDz,s޷lgwOHQ9Sv3bU1#cRҖ$Œ:dM녢TpewLƃR56LaA\j8^?nܻ3:qE6gBCF F`6)=̙FVϋ J  #]8}۶=۶myF>YGNmI=eY3ZwIz_6oP@Y^X0jwrPHj384fDSn^Fa0I& i71LP97Iy4'hy9LdֻxC1'kn]xrqZ:X T |z=:F@` ~~9lDZcLK ΎeH?FLm[J cŧ.aQGSvvBAjџگ2}cOkϥ FM RL5cwc˖kzh%eCmJ^\RxY`$ŋ㍣o}{ǓϹq@$8$) F/mB*N(+^i[`$cÈ-kY,q۲,4iXoOegō9.s0'$uRҩlZ;zwvQ-[|oN%@KLMnjMߥY+aڔHH䰥i2vMM(&!uϋ/xׯ]qm44}@ T FMXTF2Da-d-ٶ943hfq˲l˲p )bHZoGlՆIPlWhzӘ$"Sfϓm7e&'2#=liܶ\<=4b! h{hr{v_< @ơy?i`8Mɲ׆"6 BO*Us߶mǶmK4'N R?21U9{Yk$} e&Ùw*@/)aAj.!f'v /<)k:y#z4ɖxLx^{gx=8_8 m` )R:>y`*cgSImT0R+KXAl9Y嫠UӰYҿw$CGq,%ɳ{ %[zYqY*G)ðE*u2\F ŒڬM`ȴmm[d"Nx`hlm2=a8R ^&G[S @TkNhaaWIJtY(]@ D|MyXfu$!DJR'΄`U]p| EndL0QH`j*R9jLFN;NS-ufDM50\UJ3bSŀ~ js![2Mz.^ ]ʆzM/7y;.]>&\r !r5g)!}Fs!{K -H ș 1;`[=ιTԑ>VihqιeYܲ,1pqB !e1stZnz@5ZT@R f `3MIMտ5_F3:pnPʖczh쐁> P0zV뾟]pGW^V _} [$'m"5:0Bza?`TQr5#t`s_O^VGOm=iߖe18/+{1:Xd0wuWp~>f`6"Fbn#A+ `LgSĭD% 1&ez*/#L0 qo~ߋ''+|dʖ I !3sQAq#y=  в{`s1zZcA> @J3P#sޛ;qf aǶgr$i#uAIjd/#xF[.JSd:xa29 ʔJ!D"QEqq(ڌhs[?`^qRe:9&ǂQ)xj>lɠlIvv!<&(}q˲,srӻCI0IH ;IA 2=C#א4zKoAFM zRI&#d*[Mj06CǤIwaƒ-՟OR,`D-xVCv@*;.ϻcؒI0i-L̥$IJ8788llN#bs >Z2VϘabF2<%H}ؤ` 8R6cǥ1Vs 6cn?)TRCU"KhڠW*^;&Qm#Cfv7F#6pF&Iuyv;-mvFd'xR8( l `+IK.+W?x2_>< H[0~}ǀ3_ș_`S{e۶5)RݎCi;,.n$*7-o345fr] ffT5jXhKdMcجFk7XROonJ0 hnD4U<C6 Ph3&Y`J͓߻pϳ>_8Mb-'NٙpQD1 tE1A֘ESiXŎ,Ƙ]{vVPhf$%savH?nZQ7ck=o8*f>" ;-UeOPj̥qEqox^v_yg╵]mDi 1];A- u@1$Dz,9{lS1ҿ9q,IHO5XݩMI%ht5z 6^8%hF0" o>̲X=tcK Wp`X-ImtzV[A=XǾsKik2E`0|BP0eʹlsέ)ɮ]Cf۶-Ƙs_91ČJ]Y" cNjex[]o`DFi8UQA%ڤ[;fśfz0 lNk4=hI|Jm&l}Es\PX@PvWҒ+ xc_yi7MmЈȜsBUƘȔCH#t50z.,Y#jJښ^av7]mL׼,-̬tD({ xaڔښAYGKn޽x{2_<[?WocjMq `(A Fm6em!}, +l1 ]ƘYgmE ̨Mz0"Mle^47^cӫk X1N{dzP}K(6 Y;wO&yhz cw& FqFz18t=Umf#5"aGڲsΔf1/.;wcҋ2Zީ4ή49SLWn4fFfj³қ9g-Ue`dLYCrU'kѵ7/]۸WblЄ:RJ8?=a`6 B( a4zceqzD>t1(9AJ3AHsQE3T iItdȡv0H"|tAvR5mLa6,Ֆxc-{׮=9c"8Wc-dQPi% `"1[6}}ڍ&[11x{)Hmd#6ZA5& 8uF7],2lhFs RfiR);b:`(czV[* Tť0qE,7qow_^{X}s!@"zB(!Z>L""ZmOcH$lXÎ11q_VRUզXboQ{H0Yd`ԖMZ@&:G*iܥr<WfSjxw|[/>ėOZ2I<]ȞF)g J0ׅPZcADGϐfWqFDYX 򺎤H&w5`+˜-d L`hb5\4mM%`._ \@eI$0%dǎv8@R0 \$ P5ޮ(sI6کTϒmXQ)v`L=g]J`cOeWqDѱ 6!GTQfCg3Y όj9rm~KC[N衭Ƌ_BK٭nힸPS^AE&>Lx/w^?;\>P[D= c FxnZv'}9sXh!=rij3D9X"Y8ƦinUC'"8Fm`dIM qiân}Df`KfڙL̥lźO{wX>0`HӔe*)$U!d.L՟+q9l ;kD# +M+P׷'BDaP]2+冫tI3v7Yg# \5y3ӭ>*&)oZR0L] [A 8^_%wrn>ȗO:ˀZT(@J `Gc1cHl{Ǝ>I@q$; 5i6u0|ZRaFSttkcM̌j(}FY*uVǖLo?UR-ULcRKǽUg޻h}0Iz¨Ⲳ]`,WES*'8qCQpD@$ݛ$u%3s"UiZkFC$ !A~y{vwvޒ̣ n4Zeu鬪J¥naRUf[32"+32ݎ{=gO쀆_8fDy ^g4ɯׂ&MF PE;&$ &4aH D\[Y/VkZ_Ճl&`\q!|`bT.<Ċe*fT<*xƐX:1B$80*f01FOԺCO+` aa\UZbKn ,2!N [0qܮcnxڥ;s90{q E3Gw% %Ilc ^ OaؖUĦ `L`[ u^A 3 K\-~$Tm&9J6|"pF jFO0gKVk+x[7 GAqq7VV[ՒǼΕW0)ASaڔz=$.`-gI14qcAg^͕:PRyxG:]穊:7#L7~ur0 t F !g:-V Va$e"=nz)aavaup3X|l_L̀2('Ԧ0`d*t_3SƸHq.ٍ]Bh@b1Ki P)K2NipO^+hizF&#LY`D#H`*~ZPr:=0q܉y^ps5y/]8{3glc@ʴ48HksjGk^Iv8͒ '#B4iψJwT L5g4m`i&,QU3N{%gUD-mD0. p0@ixV8^mԒKVY<=ȘX}2 L&JUiǐ&٣atz!TR0fK* ]+olф`$?N0){FC&%ũ"G.TV6"z`LeaafI/}P}߇W.==^cgw@q HQ9+@ )AL' V=a!tpEg vD'%c.(RX0R`D4&b XI~I-e= Q.Yk7 vXxfUΥQm}D7h7FL@?gsΕRf `,J))t\K)G2`T*P`D.U3`o Fz]HoҍXV+=1&RhFq³߸c|T"ҸtF Ey9f3H~3&@2:pjvٵN k]< \0 B4B7~mQChFH(ӭFiȸgGUR<[vB0%JJszк_jxc9yO.]<#D=WOu1)DZeiHhA0Ҁ>8 liG?faZt(cRq(^Tӿ|ofjv%gF٩+% Tiu`1"bܳwxy+AL٫2<QL7_oQ`d \7F4YXUC֎`KnEb)jԮHJI`m$YDmEQ^kx.}_t?:n$`dn ϶Y 7F孥IzF4|`Dfa0w`Tx3 R5bK(̕_H)̆(18C[k?s1&lHd/R9;2, $eSRo >4ύƖh3Z?ј2Hm`h:0gD%q+Mer\_UM &xʶ2FDI$RBJIq(d$Lezh4aɯu~jxX<`DN=k*0+Ov>ڎ:k|lL/FIKwuƭ3ک`49LVxF"c˜K0V&ED2I B /I 6µ+_R9lZl^_j=;ysf `'u6QM7)e4- Z j ZTZܾ˘Ѥ`4qyUռf٬sZG99ؗy?|/J"Ws슏wm+X?b`u 1CE('1u $Q<=tcʴ[F4MFFB$x]sUɮZ;P;b(L9g{4Zј\=q۶O>xt1ΧQi+u[B3!фe:S P #)ݘmoEDJXÌPրMPaC80RZJ(s V&xOpRj"V4 2k7 [Q^{N֛s;IG&y Ҋ:2FA_`T7H9nj%D üҮ*~QIT"n0CG`DF*)[FjʞS$.)`YQɲ,^՜hlV;a۶Oض}gܣϯX">ڂ8$ 8N0K>Dr5um0Bڛ"%(JHHj4 m)pI@@J)"" RYzd%PRSq`DCю# Bb:0 8O|k_jV4IFmsqzzY ۶O-:"?3Tz(ۋ!lK_| Y b)e(+d A7b4&{fFbǷh3DZkȼbT몵s"fYh4N^wfffFc󼃮mmg~SuOÖ1+{F{!шRJILV2_|`DC^'gMFi*?E kLؑXN٫UÊgyg5 htD m{>?}i߽/y|5 %psDqxZ^V;g;G tE:@z~PEGRWhyhCU%%* C X2 0f0*MF4@ghf4 *,=h D`BY%h4L-{gʟ<|~Gt  (J E KW)$`X`࠸K 1V}OMUTvPj]| }X"4d{&zF5f F4L7-Q 3Ŏs`Xe8+y]v4+%{`MPE^l6gjڼy9jͿ|z?_|p2h !bW Q/.\ɴ۠JgBTiDvfcVhJ0R/% (QJ%occ Gq)eOMDcov q!xԦMc~p0lg`D4n'=o3֑ٿ}}o} !9`pHtP)p(F`:aYC!P LSQGJ@&?QJ))BI b] H1$ډR*VbiquMX,0FI(e_1~۠ժs",YNfRmt/~ ih#48Pw(8`,FHeF!+6鈨'ITXab0bJr0W.)LXږNLf$WF)0 tFnoﳜĵ{zfi`&XjkoU-*ϕ!Lʊj]ٺD -:}zkn.r<'l 8A`J Rs5¹CDH3)({ 0n2+T[%)%I$em[ H`M(&Xb>E e#fw-#*静%͍VDS;Cy9/FGm>՘wߋ_k'>Vw bX p8 g_A=UngB\2ziHD% SjD%mU)EbT\lՐdcFhF4T&zFD,^jVSeRWj~q8s²=<߹dWpy1q$~a1@p ̧I *ZF>c>ZMXK4=A? .c_J)3on6Dc@$)QJU!Xjqւm"<=`$eHժIs8JD Wy!q[ujߑS>̜]ook@ .G cpm['/@`BZ"`2ƣ2тB)0'#]`_kEx(TJ%RpiDgUx/Z!5NRRrNphğ}`(QZQHl6]=:yށ{K≧zWo\J+BaY\a1Xz?]TTR}QYY=`A/^h*”`Xf({]<"T?÷Ӳ줔R*$@-žs` VeIѱiZwF&a͊N'^w7OnחpT79L 8cXIC#Ttd{I>k3`WJ`Ի砨"Rq$!m8m`,A s$RX)7w2S`DHm*;?^jm+XPz}Vj{?=/y5"hZ ,ըt=0RQfFJ"k2}HJ F㜧}d 'הR2r>m6V i$=L$5R@޾6N0e9*/i? 4ʘS FX'  ҧ#J)$Id$g\OiKNfHe4"R;L/-',!Ԉ׷H0e:tbđr0d'XR&fE?733ӨjzrB~7vX|߮bV \` _g"R]Q`ݲ^ZFTRFD(ӱ% %C%(Ili+;.iIqK)#)e]d,u5ƛGm4ah΃`Ȱƈ]WU-lLˤܧWO/C3 p#,@ͦT`q;e`Yd+걗bϨX˾_D4R) ;̍ 0!@ 4 g[$5[**2׆.RJѾYάHnF3l0Al7PVU֤@45+?w>ҁ?o^Fi3@vZWi =sH,!cȼgRDߓ40Ү\L)na@)(2N"qh*zi!oå^MFa Fڈ8͈% +wF['Zh6F1Ih̙G}#5 |tRXp9\<ﴐJFz =L7TPTQpzS:;gJ =0F154ja$QɈ}y>iR/ҞneJn|k1y`v% #'#*aFw,hz0bNgiGƗ ^ V@4 +*m[!S;I w8ȁ`w*Qㄺ \`WE`jFIf߯2ɌE(JD I&`0{1f P) јTSCa7 9wejd1PuOo/₥of<| F4L75a#$$Q责#`}jbEӳIBq˲<ٯ~}+?k7:h:up9H"JE =3TZD p4戤)jhT'3f%9) m.O,% .7;mqqkݰr݉ޝ(ٍ+;I0I?`GsF͊"0Jfwܘ UhCha!-ض}f=v_/ZJbY .Sp{`"*ٍdH}>.݀?jY6gdz؉4v Pxu; H a`-gKw*iG8Rɭݵ)V\Pf^0) w("Tw4ZZ rs_×>o|/}kMP `p" fd-4~JUrH2~V& oFtbIjѲncUTWʔ!vA &zO0p8eCRv]s@e5R=<6 :t FOAa0Ji,YZ_V幍Μz'w4okp9S-XX<eQ\P6/4Zm͠LdR* uF,sg5Zh$I$Rc{.};.IPJ+Z'ms~&LƂm{;FeӎΕ,u$+ڜм>3w _g?ÏVw.#B)R `0hsw\H HMueo?wx|K q0$62$I͐䐊0aO85LŔ2X҇7~ @F c t; %f&΁QHruFhl^oqNZugc|x;e\\l)8\ + vQ-V4Mh^L14o?|>g῿>ZW< 5F)+c\k>5/ͦlQi+Oo)LG\\I(&`un`I:JqqR;r/K%PɇRJ-QLH~gW8k(hg+9ejݭ幱Rn=kڜv>j ˲>~[+\aqWdq60jf@Lϸ\/!e:r`ԳS8(ZƼZRv$~$ јw%픀Rc?%IMM/tV#q`DbFJڭF?zNLOWbE!Z0zyG=ݧ{6޽ЂMk<+UЕ晬HN 904B"'@=' $ji7e d/\J}[FƫA #1 \AuCLa_Zjn=kdƗ!`dSdž8})ej.>q^On lx#" yJ; 6ܥ(^Ih4\ DsYheY'z/-#?#&5r9lmI9À͗*fnv?ZPLG 90D=CV!u/BՆ*eF4b3_7GX~}BM=)sY(c"0z8F(UɩH$r RXC*7?D[zLp}0NwK(I/!u uJ)[ EQ Ī Js^yH}(d$qEA$$I?_[0AcJTMFa F&X/,rhSCj,Jܲ3O|/7yw1X )#lX MuOV F}R$K/T`E)R}VT%L#jf Y#e8.&qJvq52BKv DQ%J)Wo^x  $`D6 Ԉ2(02uDl0u6TzQPΊ6W<;dq۶O>u/|/nf/np<[.SY({"ZAD]4+UDd׾ɘe:gdJ(Q,QRpe+pю\!H=q&@iWO; bODZFR7W  XJqXp)&(ӕڭ FN9=T ;zst{ZBu x+6 *D猊3ҿ/`0(?@+m'NE)9Թ}5ZKEaGFO9EQ#(8$IZq?iSLP7UnM3gd#ӎSQn#0Ł8PvMy SHB9.8sgz+Ar ]^y+sb*/Z0Y4SMdGcEMG ,y1/[F]78װon&IJg9刁aHea}ȒRJFQGQqܑR'ojyh~5@]M`D(ƀ$~7FRfPHP HngE;n7ラ/'8Gk{!Y 5`l ,s4Z# R!BB $5/3CQ5(XRV0A ,^V 5u1(z'&|`sN2aCǫ>V)dL4x+3`D#]ǃQJE`U ۘjvVSjڼp͜N?C__-M؀+7ɼ+DB;2u|.; IjAC`Ҏ턒4H*$ C?v+{]=!$࠸FT# hJ[CIڕ`;&QѤ y3м}O.s44fp,h)wG`d"x`Tڳ4(HͧbPRFδ(;ό ui꧘]Nj8Gar3#HvQ†ދ$(ZrU{o5%1$R 0#v< H^0]]%XVkGE zQ39۶O֚?{q5__Eh2BpAp-"5B`L{h[ aEe~1QtVPCXnR"N gG;L p@/ +q(a:p'GwT,ݍ.nǭ$In{ğƩ8N l #Hm4BJbOv7`vڙY95!0ڒ\/F e%[RwQ6r+&>I,q 0q SSyHlk*"HaQ8^qy7NIĈكthbTwFg~vb犬hXh^quce?x~ W_/)`+xV2:FsY~rty}kC9zŌ,j=b;0aIgh =$LY ЏEjt}㶘=6C @ڂptZq^$H!/^v]m.eB3O^ysus0 ۸#%ཧ@^‚ xp-IQVcAW`Er XϘ3* 3*#;U+w,gȻ  F R#UZq(V00S-3U*avJ)adw~iv;KKJ$Kf@@bw1rH*bE墅<'\zݮ^ٜjRS3 [u2~UXa 1<ĕw.(C%' I r`SdQd  f7O\T-`RcԺVYWo0 [Adðu ($I 0 [Q-}L@8gIE0 oWꍕ SlTŊ-h)fEGm>nY>/ҷyIYE1 UйV' KrCh'V*" qX e tF=C_fG#w;]vh`A~cj)I[qFQ(ݵ%S20n-v?;*PsIhIE01oS @ph+YFfjڂ9a>ҷwb7>r'Ҝ"bi>c<20bxQf_(os|)tnHA=1t "}#, oaƷ0\ jDnW[i\/ 2vJQEQt}?(T&#5Lg>)%0*JXʙeVkKs5м#Yh޳_}K'޸Vb49\9rk ^H HQPfJ}C|zi@8 P `G?]Ì@0bP+`Zn-ajID74 QyI ʳRJ8޾}e#9!P9T6M\ _h0;0W;sXVQd{OR FJ? õ0 oڼ+3Ggw,U_7-ј,k*B`=8罪yz}^mhƊ|77sG+?t}4œ~`K;*Io5Q\=w+\ `4 Wxw =A|80\aPpfPcF]++ާJ@*"HVV[=~zAnYP9#ze'n<{y%l+<3D ^ј Z}ܲS ?3 D`T`C{,6==i>V"Z(z}O>b]!YDS7B-ϮQuL,pӉ0\ѕH{)HNh7:|Ҡ>eLRA75n9lBH#gTF X5`{N _@hI˲Qce`Tq*ȹTtd̞4Bߍ"C20h 4B{7o, j_{Q,a~'hDĸ] >]H,$6I$a% Û3o=鯟p w|#`dzau;``OdԾD] +*- y)޼G^x+BYHKt6A圁T*D7#T !Fw_0++XMdit ḍݐvb0Ү <}3l,qކ0 oA#ybq,i-kߓz  JmnAX׺)fe$L F4܆LFdfe{{wزSm練}+]ŧ׻sf W  Dr;NVFQ>~PiiZ#(񼀡*]a8 㻔1lv@ˠE:uy/;74b⳪TvԐ) cH$ oβy7o?@6T23*ݜ ro?+W=bECXzCtymۧf~sW/ez),p -pt)+_4H'?#$tVH[ 4W {FRZ[af^ j0mw:z r-wn;_hiv_[7.|dbHvwsRJ)-ym\{߮-=Sœ`)G<c{.&Jb~w7+ڴмZ6_key7=/ιwc\m Kfgp8 ^؀0א$ sXȻ/P1èM y5QOti)~7#@8iYܿ \g_GQF}o 5\c ;d7 Թ! fç{o3Α}6~uGJ5RO\M+SI] DqyDf=\<ssxUm4; p  շq^vKur I@NHa\VJ("͒V=[r+~Gz1M0jh0RE`TZ$?Dw=M͊2)h4Q۶O^gG/|_~etM; zR!_BeQeF~Ҡ(! .Cm*q如aos*M1=E0 o6\h\$iŐB %pkAm/LLxin3` F9J5`fYk4s.ϝ>3O??_GVQ A:Sd XL`zLfgYZ1$ЀBt2Kq*7D>Rn2[`DT[nC]vn0a.8oXӿiؑWL;vKn(XҚyKn\yKI0[Q& ݽ(-X|b[Ŋٶ-|vv1B<;8Q۶Og}*~P`pIca F(s6D ZXzv=JϡjD LWd7B5rQ9W#*})7F9>T3T"x:sNvApfTͽv eiXR)SX-n{濼٣J=Pjw%h0Rꌣ@`b nsR{dsZ[0-:ȋ_y߿ Ѵ9j6<ۂ-JzRb;% #2xyqCaT4(6#h|ZU'c`!oSsM VQEղ*f iX B?|=K{IseWx~o?d (&88)}#;qȘ'I`HO&V<-ZȤ-:}G^_>mW'>Å\ۂ%B`}@@.kٻm:0`};pk6gDyV4azFͰe:swQ&d` uM؝_Ag1cGYD9WXvpaI2Suݖyˎ\y'="i!Hxr0B$Qw=3}ml4wiynмY#4gw^:WNy9/v 1ghA˸-FfhB[ }gL҈QtU(qƨ{Pҟe:vA _ѥ nt!hW6dUg8cn8Muxw7EYH1@\0d!˝ @R%0<n?w=ⷿոYO?/Aa\(qi F[RVT0 e3C:\ h)`JeQ}I?W`KYg{;G_|oaG" Un,FPnueu7>hζ>zFI:?qW%Rs{&eE KE 3s;g|k3p8"%*"w"jPyO2E魹#xFw 3Coh 0nP+GQ] f]v~Hawݎ*t4*/iR$IS#pu%۶\#I2.ŠbU!DZD "8%va܆ha^mm'l>s_|/}O,".,hRn Z-2W&P.δ1;'s'$~Y}.`F%`0[`T֘`Hu VWf\v;Q]xOɎvn,M˒2հv]]v^O),p&R뛜PIF?@J;3g@Ȋduм?>'ܿ޻_|,W0xR)7,E ܔr9Ss.Y$ e~j+3G}RyWn >eFY ,#[ h};W{+o2jvci|KF(2P}?pgq%q5_}jx#U1K F9fl/$hh8FÞmjZf}+g#˗qk9@ñ J\{.ˑ€i&@4KdJ7@5R_ `Dx*cEw] )ᢆr7Mh Ù==7-7/㝋-80o1x\zEj~u Y"cΨ `SSIs+әFy/D`cߓ`?(3X6!oTu۹nsBD|m`IPR$ 뺷ǹ6s篽}}у`6Ltt*0م~VMJܚt{wPC{^Ɵg{Wt"4818Vjj8g,V==n#ϞTΝ!cNd)F#EFNz@nD@u7Qv8>T2h zLq^ 2t& +:*vҤ$U%1&}m^ums^w-$XAƄ$V R%uOhB29۶O]j:{Vpv0 Rݰ8WRvT$\PY AeYmm۳ÇIPc~V`4t9w1+@PmnY8p~{/-+P¼Ҝ 2x0CAMg~?rRR1-RWne@zkQ1F_lpOs'AT~f ;bH[̒1ҹ$4z'+ȶI+*r1w6shZB2ܕ#9Wp<_snnw'IƅJvҤ, %xAiٶ}۲E{_~x@h DfT@;fEcBN^s_×<㿼z Mc ǂt51 aEYv%ӫb.lh,Z02t7`L x}Z3$՛)2rTr> +``ĸu/A-Oz>vNvmGQ87]塲RY7|sqGwYmeY3?׿$y0/QRU`d^ƠJKPo롿s2ܾ>?vC?x ?:0,\Y++Z k2K:ʀJ2+)5P#iJULl]Qf́xF#Ju8 ;3s5N'vot:nk7dBf;U4!Kg&1IAiYdYVM8߿4dt^*|mUmEh^nVwH _#_,3~| Wnhj }9=*շQ4Ve rޙ"g+hP@VAO QJ !nR],))U%廒v E$"9keݴ,޼qyl/]>Iѓ7E_l~1+M-QQ{E B=KWυgelIiy38fH-L_>)rA7v@dd)V(`+>MF8TQ˅jv{oQRnAJ)FrʲݮcG $0tVl,jkk̯1kY )He&w;劤4yz>y#4_O>S VV48Cp+cYEeo[.QAmQ.(iFB ^r24XYO̱K-PWo?y*0Fi08c 䍟ucBNs\o+:Z, >*Žvsɮ&&IeYF?iqD L(yꢻXjJT0Z+XPz}Vj{_8g|kfz魶 X_dH(os!V)fRTJ{3tDQʊz7B謁=%^T`JG"[CϾ݋Ng}a(Q0I0>r;Ȓ0t' 'EnkY֊eYk^~|wmPln±{@'`|#@Y/p;Z\ј<`s?||vtgX<7_*TJqܐj\N%nҙsF(rlFQM FB-cF"X{#* ?}jӹjZ *:3]ɎC *%)eEt:m!-pnV!昵$j*JF=wUJX{l=@4ф"+,<~/WHaA&.gpX`1IYg%3\D8}L#ԁ١Lڭ*rsJ e=*M e5cӚnKvz^5B&2se?]F8`D ~ҚB8s?|lYsP lF0JT2ͨ cHijz~@KO !3Jq9ĀDe:ʿʊ,H)N?7330BzR#gxoS+}}o]nÑ \tb37g<3 hCTjQj/{JVU0`JK[AW,tA- #n*Tuw;3jw/t:kv{I'SJGngGF2@UR,1ֵ,+cIN%͝?ZukTp+vV# )'წTHe isZg'/|޸e?|*:DC)2n#,@KQfcsfMHeI-R <(?T&N0z,Iy` H=U!!V߂Czl]чN 8͌qBq]-d؋%!3Jqnjs΅᜻?}yEYV?Z@9$` TOeShEP"m[!S;Is ;} ^H)̹  X""Y?]r2ŏ2TMG@ɢz#HABHrfy0"*=*0Zqds\Pc+C7[Tnݮ9o$ǔƕh p]뇆 X C*n|f.ǔ$}cksKasΝ.q:IAҞeF>|F0К$4o.,c<߽d}GXɴ *í6G?Q*Qy9$>zF9ea}ʜ#*02 EWn*rW`ya.ȿy_qn_ڡ9U-bnou:;Fn+)Dd002KDbKIqTW4(Ysܧ\y1fa8 ܢX_1%g(-,^dHxX ب@544O2тmg;i7Nǫ .s4r猡P$g8  1J5? j;2ܔ{YzF+wF#}9F[β@28^}+nBݾ}a1bFÌTTnf|N nTn%"&XBƘd>w~)><%ds/PY+4lE }9=oKǟ7.v_V'F3q 3Efvu}˟"#,+$)0\}LVdQFm>t9O%,P]k/c. ?OZ~$øx hoRL+ٰ٤Q2:N18sn55嗽}16#8&b R`%/0$IaHעl̩|3fx޿O01c)3Y r"ֻhȕyD9@ɎdDH̊Le^.ssDR#9p1CF#1.!/'0?t:[0R7R{TwJv-ʤ+ 5d3%} q vι` ƘX:oZD|^Y 8=FW*%+דrgⳍ'kINA"ZA'xz-ˁ)=j(ZM w^`=4%^@.UMTіd7o֭O=I|v/EmGQM0Mhϕ H˚a"0 -'ai`X'wO#^ &P(o20ʚ_$m|P](וIl5Zuh^&Zm>8I˲N?xׄ'xJaj@e˳<8tY,+R0,w&?g(*me1ퟃ]Y>y쯠w;VnWniR7omoeHp]O*$5|9>@f11&8bυdܾ*;"U:AA 4=뻜@xnB#B^ jYsG4 h4jh;ɇ~y;;66ny )+bg({F9fTetTjxjVP",Frw U 6LyHY`&8_U=u+䛝NBݾj E]4R$Ey h|JN%ApmUoÂR}ƓcHFY a@aXIV``$2i  jM+D?NBպjnu:V~$Mk4x\MH;b٤vT?(dٯVJ!co$&c՟p)/,sG,U"G*`"a ,U2s ,EIjP%%@ٶ:lhj,dcvޯ |}Xp )"+V*-|T$1$s. HUA~h0JP+r#K ,;Qj]+L7kN|ݾjnv:LPԍ1!(Y{}b v $xLOF9 Q s]ױI`N, 뷃G )5u뱤,glCpa $kvDd !\l6Z z _GފGR*pb Jp*5K[󠆸/P:g}REтɌ*2m>J\s\XP 6 308Z5gg`nt^Wǎ0o$*tWO2bB0R1i|ƿ1~9fYhʔI^Ǵc`(eAIp!nqp{:"*s-˂yVYfcE8psso/xm L) `3 uJ'{+̰<*T>t.1WCތ5+ P=W pe:gF?CC4]^[[tV}NȌF>4`GVGC f`ŤqEZ6J̕2ܚY<Rnq0J 9m3_RX8AQG#f6l6fh6 Z`Ɗ{ӗ׫X\)46ع3f 4$Q\QQj-}! =#WCj8+t 6c)0.#=p0xd_'N|պv#K}`4L= 3RcF/UfgI)ƦΞDs'H)aRY .09<%-P9ӆ;`5$8`PBqH#]O9#h4fZvq~Ɐ_??ŇWڈӸDP,S Jb24Ab$+#U(Q?g2*-ܪQ!ҵlOh+R״o8s<_B]'z<h3 FZVF C }^y_3&*@y5ٞID〨(13~.$疕c5&iN(6 tv0/Ӽ58#JNS 1#!ZҎ zPzwޜ9?^:g}z;foz˭4OW Ffji+N02Tɩw.$fZl&Z  4Pi8+ym\{B=[ ՌZV#L7mn!NJv;dVB MQƔߩ?x_=/S` p)]QI:EbA"42zFsu]ϲ,hNoLJPw~a .LMi$=:2ِ"J+{=r89`d"#R02g &D̞Ɋ +*yMWЫu?e8߰^3 ׵k0I0B`dU@i*R5^Ł)@SR|\b@O͘mFƘ+bF2m0͎cm۵k7z~# /w;xmtR{I|T F}r79P3D 2?3FTpXP'npwε LvT6RruQOqߛNVuEF8q{d 2YP*;E!MjLKD8~)-t-i?bbTp)Pc< R!2##ceYZPg=ϛj=;os[L{˸B }QR2h@k"ͨt=B.B Q* <,A "#&!zӝkpNLteF Kz[]V'$w)""yޕ @5{(Ht36$*0!KYHKPD`R@bueՄOo\."?eE}!~.9&$Bgɷsn`@ΏQϛ.5Heraq ozn/:Fb+Qჯ81PgUvfN"r(b(RJ[E'\6/UtG(-i L,$Q`HR@RǶ2v~𥕄m^Ae`d J˷Ty *Uӕ s@32]{9)7.d *nmbqg8.@. od`tƀzYѰн–QRЕ %TTᨘ-I) (šKRD$t1~@d(=h3{:(=Rv`MB D8̲˲Opk?nZ$L?dߛmPS.`$ j:"@JeUPә 9*ƈSNw7A, M#8.B^gǿn=Б%qQӹnv-hR0~֨oTz`^ ZԳ2Ph(48I)eP*yH|(<<RVQ醟Mn'e3 Dt)0!$-y8s`3`W{G>;}I:HdrCO'TUHbD=#SzIy)wIFN m `vjǐG+w'A`tj-wV`TJ>0o4| ^ OmiG섎 ( N͔͐N"D4;% mJV`;PA f/Qm-XB,S5S's~>Iiןe OITJX90-yzr2#rՏ)pSQ ʢk" eEm?141; :N9S~naRDm]'TtJvȶ&oH)}RJR)RJ6JUoD_π9u]4jB F(1`v{_u-RBgqF`=y@Jv\)gJa噑g/ _x.Q1J|߮h(aH/=/_WU=|:pZӹt2_NN$3*dLyN &  \ 9ާM&7 J@)'RE~SO1f-O@t0R` 02^#Iʔ %" ,XBLΘH?ɪ*'NYˁS΋.c{FTWDy)7YmT`M`B`fr þJ=ީ-]no :QE:v|nXh؜ nԗIBJJR("LR"ŰF'9R *v:R#sH%Hh,ɀ2,W (o)BC%> mE}ٵk0BIxiFZ j\|sѯۏ=x RVRYl۷qT;>ju ߠr83"s|vMH;l083+RRʰ.eW?֞)qBFI+>{)"lTq@*)) 3]4/Ks5ؑ۸@[?b֐*:*._ O9Cv+R/UDiFF[ F6 i[.Zyʿdsgnrݾt;N+ piFJWL$5;!U%HԖ(MJ4Ae2!2RJ|uQv|,]bJK\LOdndmX)H %i8c܈@7>3^f(`DJJ: Ln?jH(X*^+7 gEmY@䍟-@=rnBӹnov:n)(;U*1v#RtL )etW,RFj?{)X993('W026 "bQ?UIG[nGcQo %VCQY@nf&QOW`y`4pF$in(`\7! w{xn_t:tnv8 %ݨ^ѨW0|Dd edF{hkM7$IfI)%$_P>aky)5O68gPq2*[FZ"I2]Z`ę?"}.*s3pHp*>`UޟgX>j΃ hsTZ}8(<ȱ'qx^1E # Injzy#soˮ2pv" a[h[ ^R:5$J)GέW~k}`<-U)}q E)kJ@F.1=R&! [B!^0*%PԔL#ޟH?Inm eLޟ3bP]zsïAR۽not:nEfQR†GRP`RВݶuWUғRR=; Jq$A=Ij܊`,|bc@ IOQ0sZ0,iWP> 3^:en*'҈k v.L'`;`\ڟB^{=v}Eѭn~' 0Ib޴tÆ^>0B)B!^gd:WÖT<J|lƔ0Ƥ8A}D$ $ fMvEpK~'fzIł%6t (7!(<R@S> Ў HB, LPKA]msPtO &0*jV# #΍]:U${3ޟm,v.wvvW:N;S~Ѵ*i0=!u`Țg*0lؽ1$w@lJPb%l}%m3]Ea$])ew]x$:T/4@Qz1R:r=` *0~01fyNq͈,PZz rG8^_u#GߐItj]v7:έnvqZ=pa\nK(#cGyfd>`N\NJY9MCJx[Jt Ϗ8[Kc^ڵ뭧/\9?Y(85= *0n0ʚ`B@u/@^![g|88wtLV*itÜk o*ƔS!I!P8 R G'&m9%JD8$IvO>HSMk޴$ LX0IݷY 8!^n _N7>zq^lZvn0WQfH3#6gi';R|Dyð) zV*2]EQqVjI]uاOÏ < MvJ<7n-#pY0,>|?|_ל~sfAzqJd…IS^7U2 =% vwnPΆl%/O)TƖ280 nƖdI/|o>4o|~2`QH#^f),$^QF#ƌ9#ZLH/=ĵx3 kkԽ!H(ύ-}a]sxAsi-ƀdg1a,hL OؒRǡ+(Z9{?Gz gԼP-$UtͶ ~lO6 J/dkP{{!?m[vha+Rma\lĨ요EYh@K״bQ *iQR+eNfo)C( (:z}'['.1u !fρ9T AR3%]ΟkU`4fŸF;݇ 1򻐋?F#:?x a,ve۾IKs"5ayniRF({7Jsu;n@`؈r[PRJEDJJq? vXcح5/0 mz]vuaDZ9W4 #캮~悑!`(DŽJ%Ui'YG]GO(уɒɖtJDF 4SjGQyѭnxg.~r[ 'gN )X,Ayhցӳ (%200:!3?=`c`)5m i?-I`d􇨷iXg : o l-yzy*\A,vW  )ϩ)Ѩ! )FEz}˄RZ}k&K'xA^ f XvA jR(m&) ǖіQ*@A!mVaT Rs!\\u=ϫjYf50sm [DŽ fSئ{CoA͞A% eA.UOda 6FCt2#{F̈QNs$C[Z~|sg?&%oFQt;0 W0\NVEzFnRp7IE +ZP›-*bzLeَ㸞yκ;8΂mm[:z{u1p{ V@K@$Azv(߸E Xk2{zqmTɴls@%;PKo$Gc}9jǷ(Zx% 0 ۾09+蠼z XQF UkF| \Xe۶mkD8Mfm۞ug޶};ot͎׶7=?V;RVZKdZӊ=ֳ4eJvQ/h_ Mp'6HI 鯐}"F,u6j^ҍA6tg#Q`ĆŴcS{Õ뾐#m@PuB~ܿ&T EQԊa'N~AEN3NhS]6:zbE UkI2'$¶m۲,[ j585mn:3cY֜ms:}˲' =1{j =R@$*A\n(zԔ`Tj[c80 C,x"B< qf٠xԾ!u7{}|Rr%88ni ㆰQ"! 4wNa?+ZJQ3LeMe89繎xGY˲fز//āk楢RA@|ӳO;e%UyJ+|S;F #ʔp?* AJ ڗV?~պY;皵j$YMd-N0 QQ )aRnbUTƖ&QCl& !l۶qҖٶ]ʶeYM۶BY˲fcdv5qT?$)}n(Iz)yv= 0- "3wV:ÚImPZʂ>/h^^]$iK)[q$iGQӉ880I$s/"6/4,,o XQHպ4nh:ji0M R,+it̲885۶=۶m pjXB4WC[V4BVY?p]HblKEƉfRomYZ)OٖJj]mGQʔO=X&΀1s= J{=,!$_NijKSV,='ueEMs3^wԮ{$IGJNq7InG`0 d#I L1Q+ Zro^88mۮ[UU,. !BF|+Ck_&v"jjp88 >s |`|ZbϬe3,Đq`xT3(]ZS0"%`k0J,l P nPuPp 6u㹆6lû5to#J)I(I4@eC@044Ƀ*0Zw 0MPeKIȅeYv&'mɳ, !8eY$G9wck1t#5(~2 bʼnK*(!; Jq=ROF*0Z{76bm\(dwbziT mXYMMs'ӀZ Uk=bm gcʋ&"H)LٓF1͒Ҩ Dcǰi6a+&aPz,}* VH0202o@BըKRc؏,37HS/q%oaTFj>0eYjUTP`b%B'dM4TXT&abLÀfRf6 obӔ&@wN+ VH՚m、(abA i1MPWҢ oOZ TQ*@8`!_OZ`$#6˔}*6TuJ/8czմgV4&z#h`L[ZcTlh}bHaa#E0Iz:ӔSI0PXLs{S@T sip*QDI 1;0K)aO2 M+VH x8 "،`?Ō_0Iz |_BժZ5_@ 6|6!MӘ'-M @UjYp*iB!m6Z/unӂF8*VH4-@hfѨFаP\&Ujyp= 4 LFzk#TP*@VP%4 F1iiY/CZPmLv*VHժ؄ UsF%kQZ/TT U jR&4xL`VjUTjcdc6ok;ڂWjUTjmPm$ jUjUmQm16}ժVHժQ PKUvUժVUxTZժV*@VUjUjUZժVHժVUjUTjUZժZժVU UjUZ UZժVURUjUjUZժV*@VUjUTjUZժVHժVUݸY_9oIENDB`desmume-0.9.9/src/cocoa/images/Icon_DSButtonA_420x420.png0000644000175000017500000017343212140261562023337 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FEIDATxI$Iv-U5539kx \=7xpCn[nwyyBSUeVUVUV16^.TLcYoWDzD`nGÈ!B"A!B"D!B@ "DB"DH!B"R!B)D!B@ "D! "DH!B"D!B)D!B"D! "DB"D!B"R!B"D!B@ "DB"DH!B"R!B)D!B@ "D! "DH!B"D!B)D!B"D! "DB"D!B"R!B)D!B@ "D! "DH!B"D!B)D!B"D!^^7 dsF)g:q:u`LA<B )DW 9_I C^WBx@pEwFDaYQphP1O36C "Kwoϑ+,@cWyg.5:%?qtNC$bnn4݈JE+9)Lf鱽O_ ' W)Y\~pP uo-(x1iq?;MzLkRʛw?aYBͺt@^uh?;]_c/o/~_b_E))^е~:,.&\#l33Ɏv4iii$ɼr=Oi7’`sYa^2! @ @P`:yflJdr" JaGy-~rIʏqi:HӴ,"[b1U*xi [!j:|rB͎0Ilhsxo}OLHO_Z 0=! 3`pOh1bq@)-P!WB jQi akas.QnmEQAGҘ1ܧn [u谸-F>B}huPU.\/5P88z} HQ_Ώ.6QH3>C*ΐ2 tq<=C0(DQ$~$I_EڥOfBCkm"%ČR HmI2@rfT)} @& D0'8f4azHH7ԋ8n^y_.\H$IEhIB^9#Nܸ+5kMgA`F!(MTJ9E2|Ou#&XQkS.qi %9C$c8 Nl&ZL0 iS23HGO{e|4q㞗jP`WY) jmnhB )rsfĪ%%H^KB/)ҤLZw  Eg B'X!4I Q\ޏ?]\r34UojZ7tiQg?ze nj rދɀ曶`7i@)ӋpVHtnrcJ~(4ZN:lp%Ia?  FFUA[hј` D2 ݼ4nh<-LrA-iU}Q&2&ܚ@sE45,Vn-6x_JER'IɒN$:,9,1۩kۍVv#%imEQK8R.GQq?ِAYdqeJNjo R6RD(,hQ`cQu5 rcܑ޾~o]BI)$zrnq ir@d n,]2^R.ٙ4 e!|Д43tNݻӊ3<";]}Bpr_cBШݦԕa}!-r˔\vlǮ-̨3n䠫ǠߎGU0,ю oGK)WLRSP{>` wHRsk"?\<+ *ODZWع(Wuɘblf)L_mYLծ=MiotsUd[;R{NcAڵ8X}bUJ$lGn8IM(x y՘x k e B8![Ȳ8^?xoni57,VT`,=ɚ:+Ԕ)FUFjcW%B"dRX<}OeBqMks؅v*I!CʐYN:6+\B^n8*} V1 {Ujh*-ŕWg?~VT0ui ^jth Pؼ6[}(V i,) a&ٯ:&A cfLdL]? ۳B3>ӅBWԥ)o1(h.9SY[3H5kO 4)vGk(37V0r͖f@ 7ˍ ETsHfH~T녧iV (6fX}6YN*1%I"{^/M9!rE1j_Ҝ@5ˢ޷@{+fXۖ'hhQ5J>KJ"ܸ~\Uko>Arim(t۟83;P% %ˠPs_8 ْˎ$GfX=T5xh.dKjLt`(Nd9kݺ144fy%tSHyo,a^4@ҋR;ԋ#F!ij()MB 6vFP+@z:tdؑnޔ 8t%g6~Q̩6%Htv7'꾿 reZ*>xRf`#+ko?sqNji>I@+4<]}Ȓz!BU Dp>Od2CdU礔K3˫WVO{'Tjw%k5ͺ"!Vc|*~߭]jT$M*MMG&)KΕ5]zk#(LR$I{ssȎyȐ&fHdh: ʎN}2C R2=6J{eHu `j<WsjԲ"4g|̓KlZ*%d(j9[p2 oշ;v&i[Jy$,x4۳ H5 gᤒ0km&/'1cOn{%VD %q\| 7/Y)$Ifiߡhª,@"K+Zs} .REq%Ii% hX&X ;rݸ90#\Bɯޔ +u W X_g1N ̈<%*PjPhy r#RA~vԡWf/IAK";4f-M$ɼيݩdCtdZ8 t"2%3d4M]v4/\/.]^s R@Fw͒i;0Le:ϟ,QUCǍ,ȑ{XMr -ņЁ'YM(ƍWU!ĪSn&#<\ M>Q\TYΎNCfpI})弔rO$IŃVڒj.="?kA"ҵIi6F/=v LK?;F5q'wgM)\M4l4θojs'*/&Q*Kdž,""PIHK]vd?ن` I& j"4ț32-5͊oT}VoU43U&Yl 2+ d7a1I$I15BnԱ6z4!R᲼„ i`q6L&zM9 = 躟Kvήl'܈| u}0BDX**94sk7>Z_;kBjp}R!@:aBMie0 %PƓFI0bsdF[ym0E`Ke:M=#1k|?6H*K4AǬa^[s;놀Ice椲лVtr8Wj띙V\^P",:6ƟĮեqi2Ür7pyO8S JUNjy1)45nJꔵ+C[VQhWV6B{=*C@5jN?KҾPk7|bUJ鲤PP^_B Rw4$gg2\g̎%30(Zӿ0qo m^uӚze E큀z:v猼z2u?CnK]\?~g(?gGQl)8EygX%="@#jx [֯EdEx2G0+\R]69\W"#Tn%6Kt]CK+I=[4F-;7jy!_Z=8zHW%jJ{ZemգxJ%@v֛jf-!,)B\HŎ׻\ 8Ymsp̌)\YN(u~ +jBw_bة/o8diཆ{F&v*)h(٦UJԠeg%a~ |=)JNjivc΄#<(څQߜ!!U&|m21wG%Bƛ!/pe0cgg:W}=fg^WWS p=ug5@1C)K UhlaoM!ĺZ)9E-=5'Ց†ZNh >vaCsrp2C$3q/DQznsm%<A@ #`lO7өKsP[=碶ya^1[û~PJw{{ߒ/inK)B)gBcZOfQ,G1dH#b2]K qGQg.mwnV 2avGhmUyq6f tt+ݍ k[ɡRJkEdd|sIYfEVJhǜizHMvgM7iξzzq3loc^Jza닻ǥ +iɼ}{CĴ1+,5``@ ?F 0rL;X1|!VзAzP ,Am$VR/K"_}sV)Bp}庰@th`n!5%̐ie3q? K*4c\ȸ-g؄ZPQPS/עY/ԚErKy!TZ): k"L~,Y+oDQOl䆧k3|H'm[oC:- iaywo,^1{簄Ƴ44ޘs燜T8JΒegF֦k63>?H|xƓ%o]eD~i+9Vq JQ\(r3I(1Pl.b!K՘wةu9 7~"87 shD1mQ;o?;3 ox1K|*3J0NGcf#.3WHhRɣ*3FWjߨBJ#L1FE+qۍhQK tPT ^?HyeCeK^w1GxD$ɬ#3Vfe jf3NѻfՃWJD5  ȧW 7\[:?:gKs?kg[@쌼a^ 2a2#e?><]=FlRCar-l-]wn V!&eM Zqg]2љ .;R\GqO=V&Nmm sP՞ <;>56l>ƕORFWZ 5? [d^K;OwüNR֜%-uX2G^^z71ű2 hERĘ 9π.gЌN2Zx5<};`6W0}2W_A WagU!ZEKIzn!NqpV}'i4v.3"O&dFSlιH$r_gK *V6ejujd@q2d4*mjV ,խshjs5eUL=:Kr<إҦw S ߚ-VnZչDA%f | Ȃuəuc)RJa9)JáF aVwz?=Ex HԶhP̃EA6n {'?R,5]kk-!ʪ[3J %/3t:ݒE_O{ǁ@`drkS.yvoc I$I!7E‘ 4ufP[L*0cSz^Ry)Ki@k+ 2`V}iסqO2ë ǿł? Zk*;95?3!MC7J9>N ȣS hA1ΠK3(47շք7\.>=[@%O7`t2IّoeGQO$R.GQv8. ZCh.Kѣ;$34本)=c ɲlk0l 'Ogr@V +:rRH7QY {^RueBftt8W]Sn8ub0|3j+ Gk _*2CQ$88^^7ޚ}TA 6BҦ,kudy,!j%pn߰Xy3 vp8| AEPg6->EbNj8|D`^&t Xt 7 !֜rCY lw5'Hev=7[\jIjqsd;{h{iuhpfv.U5NKƇمy5z2}\ͩY ý`?.}_E١*k;rkI޴Fhҵg-]bUgƎ94jp$[uDpQR`@]KwcBHڡ070mnZ2rLW:SΠQ{H{v qG-nfa0wO,;h8y?<>nAܼÈ$ARWS[+ɳ:dyo ֏Paq1]r$ͤi !|P nGMF6,Uͽ^#3 1y +W>Ň2&su0ʣo1b;NkMް/Lُ<ţe_yAeGpeqey_B0hU@)VO"j(M-e&կy$uܭ^O&ltQBe,Eњr)MS&!Ƶca= 4dW )ĉّWfh~%SKkgn%ev>(_FUG猨2#B`C3`7yYʊ<3G(MP@|,eFB*" Qb3 Ifq$\CeIY̖CԴ-o[v]E~8gG{G_}Tye;\w\e.REe<,տ;(@% dFIT~G{D j8*mMӞ2jQQjhe D$!9i>Dר:X+i,2(Zۼrm??25(T7g@ RcSh q{MAӊnU N]&` )7P@MӨh_ G-+QsgݽcqJ RL#^AE+v&\cw0m. Te"rΎުid)|^2~T!MTdlIeOnK:Z4~ee"22s Re\W݈TJv& 'wP HnȪ#TI73͑St&}g5SQ3V:4 & BL>v38{^/cё%M)p꾖*px u ]D@JץkblDZpd)Ko}k~]j%5MI-Bm|vY}XFuz߰QQO<Ͳ#3v=c`-0H;)+7p])Z Izdl5E 7P1p4 JO2#:@g%3(M)BEk~&vRq5D9bT(&3Tu#;h)< cmL<+e;{TԺ9rCeٱ˒VrhUmPxc G[oMS@kbyχ95@J$[+T9:BU ڠ][LMqc7l o݅Z|&1g5C@VXn&YFfYC5.˝D!Ii+8^|-Ʒ <%jٔ7bZ4uБ^}Eb֖9bﱊ`F˒wນv5~]){U>_ڲN0\C0~[WkQ-%I2ҳɆho*LH#ّ[ cv 2CWv'I2b~y-^ѭsE% FV2zpjjU:8PPL/Ԟu ;{:veyeYx:=ZeY$yEp]P}7%IT/-7J:6ԆG<."0\}s6-^R.q?2G`pl:Dۥt^2CכR.H)׮/? 0@>5cͫSM֎ Yɦk/_Y ~WXˎ,Zӂvt,<_o%4aj2Z6CLQZ{QEvͪAJOaY?7n ˏ1GEeGpPe~0r_˲̇Rny!zC7NL+)o#4v}{nٰۏ18*bCi (%ʥwmtV7P΃i2 B 4 Kl2&+^+PkD$ql~}[Wz;yᗠДѶOJ^'s> pOnk\}Y(Qr@ (){EQ<DTRT`*6 n1R ۏ=DÚ>1wף(Zu ^/>+/9(Rg m5i~j+ ec2x5Y0rO![ɞ^fI iΤi|a*@v +J *Mjq̪s.#aQ$)h܎pD Pl=W*+>-‘EQ#= (,)yy%~oDLU'R%nڀGG%>>y^<1a0 F•X<n[@ZJԹFӖdjϐ@jΟόuiNc] l$ɜR]O֞d &#.j=Wr1UPZjjjMQ;3ncj9σbx{2n燞24D`r VoG=htD)Dyϭ h^(QQqiU%{g>O7"ޅn.nKdƢT{^?I)՟_Хx&zJ̟l&FJ(ŲT.DͶcgzO<|ϒdIYT Ue;(<_o čaϜ Fe3M%IMZ`512^* kNp5cGn< yYeFh@ JuɐW`m&B|Uhd*Ѯk = VǗ,an -?Vȡ mnxuCkGvigTeep8Ev=u#fCӿ|Bcog'dCU0r# '>sV鍔+ noYyqn͊LƝ$ ]93̌^6ҘR0ay?}Fz "zAlʩeGڧ#6.7Z~ 22l[p'zNʆylgm)rV|s{ FE=P51`Tgh[3.6c6QNdP 5 !"%;H7YnZ9KdO2@8x9#Ƽ2ҤŅqќryfy{iaAi]ұ]isw܃ەuY/ "v>wvEф2ľR+K-Iovx?8XāJ]#ʳi,&i$ut^ Q .} X3I^wadŵTFHc2%ݖg^IMCfH +l?)ʕ}"~稄uMLSnRmƇzP/Е/*'lVXyے*wnaOʀ4uUn=7Y.J~-KV*a᥼alT̯q|/< .R[`Dw:42ìrY~{?K2 P 2R9Ccu%땤(DTv/m0jxn0w(v,a&M{k@ZkmQw/>>bk?C`j4kzT|9@@܍a|Rz^b aNeId339 vkJ8vhAJ'y']}_T%8E$>TpGZ^OF~$!vXꮣz;W24=dwx">8A8' kGP sD0nE+R$If$Gn8њ)U=W|ZfvԸ_rp:2C4M+2Õ\[ʵ}**h*Gs03SDW޶ّpRVtpj,,(Ou*>+X}ȡ8>-V`,YdYv8 1&|gbݍlfv<7) " yy k~fӽZTI(:q]=?DXr@ߌߑǔ;~5^~SEEf4dt 'Q#K*™97٭Wy {3UATv~0<+W+7d[ֻZ!;-`ҫ۲b3q!ɶ\f Dˊjqx<+s.,aFJ X_Q(ɠ4ofGQ'([Fj(34uՂeOjՔW_sjYVaeY>$ܠrIڎ>ۋIL /*閶k0BCA\/o$x_[܈h)I^כzY%f$iWdjlW;̐21Rҥ?g2 h%N8_HV*]Nnƀao\m|duZYJt8M"7{5bڪzӮ>pMَZ1TbPHvwLYd_rm-"Ru$&6 ̓;Wr9# !xICGB s?n7:@Ĥ bUжQ%8<ѝOiE=ĤLiRcV.Gye/f{2L;7r| Xu( h2E ^WlGMH#9A#?` ~y!3$IhQnlg䦲nD#oqTT ǞLvkKۘ;|tӭ˲lhIcizH2q > ܿ|q.Yw`T|,Q/Uh%) \T(jǢHNX 풑W1 3Xy8WW֛WPJ7aXl\^ ji{Tۿ:+$2IYѤ2ݸ4䆣?=30 F!#3IމPV}v،!/JQr%-i:i,A)\#[T ]mh_V^rݸj'##3q X_SaY먵 }Si:{qb/YQ V!!?8)2I$EObKp>7#*@jQsVeo\t $]꺛IJԹFO @o1Jܲ.U^Z%3-aNJm.狟gJMkVU#z]M^#_UuĮ%#3Lî47"Id>8H1ƃ v!`OMrm)󑝼Ө3ҽt(m bJPkNU! Xe:IeNMf`h Q\_~ȣD9V(=_N.Z+3ܵCIr@^(DAscC|Zv<߷t2äܤ$9V m9r[3ߑq{P1w *3viKH2CF4yEPIl=}`~]& /_c:57k̕k Q=.Pnqs(&:Fi4{ˊ/72NAfh|2C$ Q^W"Jy *jvF+AU ]ðeQl`W p{ָ,'yy~Cf1ҩ J)yWN?ǯWFR&pv 冖 *(/Q%U<o !VL&;IGZَ9HckЪ-{"Pk(Z.mAAiOsfvKjJר1 c2A%imv2(px8eY\w2΢֪("˲e툯yvt&0A*4R63pt_$ TJ/#J6Rʹ$I4Mu}7e u.4U.- 2 Rʕ7}sOw3TI.@&}5C "GȓtG+-DEfqGEQp^28pj0sGn(r{<333f<`4=J`pY/k$yS' 5\~_$|כI4(۽^IT%+^2CEkWw Jt!-hiSk9!ehHY)W @T(>+b;˲};sadq=# ˄RkI0D?b%QEWfhYp$rC)7Eí{w,`Rf(#@SAq0p+ZCg%V8Leuk7g3n1(7U/)DDfR^gi_|ðVY:0bVٛP%f]4alhb*?pkiPncyo[e,˲ dqpWRJe&-)c;f*MaF>6 Mi;sr3I5ٮYj|:F޳YB$IƑNx%vDMdH#{/cxd4M礔KBK\8SХ.=qN fT5h#=MNY0{bxז 3 s| ZEQ p_Nտ^xF&;=o:0jlh 0v%["qƊ五r9Ih MKnv/Cju.OfoWUNd;uB9 R+`|qػ; PZ!U7{ !Z?SJ)5<Ϗ,)rk޿nY! f=F :Ц#<F 7Y:2"rXBȭMv{^|V7ٗ=K"7 u}H Dzz%3$I2c _>PpXA+VTfZMu5b3qJ0"G@.{_%Vܶ6Y&!7}M<EQE[=ID9 @ȗqZv@9 Akkب4 7H\l)$Mn/}+ o}3,UM̐$I2Er_Z˟JC 4E*ߜ&tӂQM|hHpC?JQyv]tv ;`jˆءG?g!s0fT Fm̈Bݖ5d,9  s%s9wMJ\4Mr֡gМs ].i V++j/"#)=f]x0]UiokJwQ'ufL`kB\amvu&3LȒ@cUn EQl{Y@Z&IgZɸkq `sS*5LA,`+[b3qq rʂn YH_k, KQ]ϯDžquuŹ1?|m7y#ϑ?UWps-9@h=>Ip8t}їTfϨ*QZڤ5EpZc2)(+GWWQ-%I2z|^]rC5hG-ۛ`zG΄|u^ dK^Yߜd?3׏֝E'CfhfF2T6X2 Y 'N@ en DfNQogI,?7LIYڴ!OuĸGVdtl"ǐ$ƻɞVv H',1UNigt0Mَs.$8vW>ʒp館v5.g3A# nU$0ws!eb/oߪ%;=*5aBn[N!˲J!""]l<`3QܔUCM0TҵfWP\n 6K:3.i "RsXL45_rXʷ%3vhE~,N&R/Fimd01(wT`Ud,ˆeY8_L\G"T_/cfFR:FV8>;]f^],($KӴDZWr i5OL-H/s2CDZ^R._/>~*5T͉K+iBF7{u09d%v d(~}QV-2Iꮒ$dI|'eK*7 ,;ddvΜq*"_p9|UgJ#/ =.`4Mg4>(ÐԄjQ9E;IK8AJ$I((Z_\*efgJT3\Ԩ7?gqpX%@r8UٗVΑJ\7nWX/<1;; `~Y;(%X @ s.\#g4Ÿ0o]uEMiBᑸf4un!2Hk(Ahβԋ B]vEfH4J\Wo1{O 0rw{5qf|>U= t2];;C6B#،G6;ڱvYQ%:K i*RZK)E3Iw~0\l}eKv 4Tr(m bJP:\Hax- R_haLP`g(Zxv*^MO3_Q(iC!/U(<[di`/0lw!~Wvz>ŀ0~L #OֿʑX&~T -Es@Y,߼)X#o7>icX"Z6&,q:izN RJ̰,d}OA $*8kHh.@Fl궁T4ppP 7=[]طd#+z ck$7eY AeGEQ.w9)IhL&?D_[wdl)0l%חH/[)^׏HtW(# W7^JpΎNMfzqK)2Ç?}CZjƯ"qU`d-%tBaw7pXVL },‘̈́ @f%M*Nunldfۃda#WEA" |9LD;-= 6w?B$/)jj 4@:?Tbw^V}exi쐦&3i Bp`L08Μ#*pg3au͚٦[Lhh*e(K] s"7D`;^veC *7m?ݞbX]nFR605.4do !ĚUnd' ¾vCӃZ(M; 3DVҎ^| "3X|+Wn,xgӽXJo~ȾumJ'OƔ:^ P#c=*E(pxep 2CY,`U3놻Gv~# X=}A`d>'vWG畽-3$ΚH[K09s$WސRN&ɾrdeMش_ d&o 7~_Wo C ʍLjkWfp &VDp:#FocHc'Q ^'EQlٹdgHf8l7 S Rn,˭l) YcDkks-;eR\Cb zdlW*ɐ!@)3 Yg4y*2=q'?X|/7C 0^kQMfpe:3RYw)!zX wX6dGEQ#DfytwAy䆃REQ;yDf8iii.P٫(ӯ W e"w`;nGc9#w:j KD3kx.]3IKi񽣗@ rЮK!jW&AgDfќren굅7>t?#̕j%`=Z`Dd8ϻIn薛F#6zh޻YdIY8a:7<QÇ1o< FX6>XDdoqnv8sx5;+78*@Ύ ;*aU7+.jU/\8:v.J) g_"3pCn䡀QVx0reH@o}#u,, rA 3LȒ-QW9#7gY_VrfސGj03Zw"wl-pP]ClEъr!~$rÉ/zٮ: X u-Ue:rd=-a6%$kݣ“Yyp>5tkX*E eԐ8D'7:EY<6-Ia\p9>Kn(,s];K|gq8ۨ󃑇Hr5:¬#:8Fe"{x$pmH)m/)#%4.BΩѤ5u ikBeG"3H)W7٥P:7in% ^D P3rvf_Bcoȿ`#߻_[ݺ];{4-d v2dQ-E[=0F z~`0Iw3W#! Y=sM>.;冹^o)7MΒ܅5RĿ&)9'TRxgVf/o%` kS#,AJA\5)Jsi4l˿HZJB@]cM$WsWk,L^ɯ?,Kb_֦|t@#3$}VcJ{r `$Nj>z]-ˮ^v4} Af%aHn>I*b]Cx8j+t&-E _eN s 1=޷lE{wu ޔΏZy?U cѮI}LMfz=̰~uT,5P#Qۈ9ao/Č,{Q[aNɑ;,{T2Cf ei䆢( Gn(b'z犽- D,`]TٛSxpYVk]gPR>+\ +:z|^Rr7IVw6ܝz5M^I@T$2xa%}X2HES WtoC6*(`Tۏ( }-lHƛ=RfvE$3[&YwaeYeKym{^0#+74|*;>ϲo'ID(+NdDnx11GHh$@YVgsuΰZ(ueGP\Jđ뗾kaR=m:2m2nm8Oo>A?[@~ۑrݸ MfP;0xgK~w.D4/{!- }Vt7vZB,Uܧܰh3^ز~NH/5.F3i9D椔K3W|ᓝ DU֮U76_Lao"u9JGͿ6ґv,;͎^=2&pR,;,bw,R4ă FM\u\fHrCgB&PH@ؕhJEI^tInR J &WKEW9JftfQ]_}:gR.`]Gl %vs鳗<:kZ ;<6"ڙȋR@ܐ8|(홇ffi4ѽv-qjm 9X2{.}4e;>2B H RvHx"(1 HNaGw t[s;bzv1G ΔͺmzH@B/tqϖj1.CGf eiAEQ phdy~Mْl{m>Q{ȫ9{snK㍧"; Pktqyݹɦi:k^qaHݛ¬.u2ʗ;~a@ $^/\xe?z?[?@Rn-ǥR '97b3<|#32ƁIJ)ayeK[L`Ȭ@g~F 5Y u+kT*e1L.Re)BI)#/K: ‚"R&CPEsx^:`||;Nd6E!v}?5e!1nڵlpF`(ކ|>G"&;-wUsH4z.0FUykN7iat@x :wa#3zlnAJzP;{9PtM ƌ7j?jvr䅾L?>G_zD.bRD$d Y0>rC0_C $%p>f@ d{I p;rIj Ըn^,sd-P}(p|C=1kAtZ2Ü%3O־9(P˵6$ng>+E ~d SfẀʊ:V,p8ѽl^f420u:Y.6ykYX..m:rC$ыMn 2 i4GrӚFt?':l#x!?r~nUCB7 ҄̈Fv5bR(?F~.%km&.a+l{1NjMNQ+,`v;%6YΑuU#~n;5\!Yq$-i8^Frv,P u{| X椟7n];CO!dҥ^n5n!Q~"6ieF9,b`@j-l$p6!3t^B28pԀa8yjks/:0B+Y<7YvHD@YB؏ ּMnF/ 8ULUC$12klM[gZNn6N֯|7s\ASҘք}FL8sI`8,.J?sd`0hNCd]/SB y޽lnaSŴlϒػԿ@;a. D98Ic 'ZS<ϲ]@ 7bQaNJ<|eo/|wF# HEq SJўְ-)G~wXp[+ęM 3J1fGH.˲,ˎ{w.5@mY33"ȦL1+1pn{%ȢHҕ. )rsicd]+/F0餫\QVɺ{Gd8^R\/'p~*`!,5r;bt6,;PpT`d0v|%Ǹ]œ<- vd YҤrd'( Wdgۃ7knqR9'mOEL5vD L*",i뵕N&ܲ$H*,Fq74Z >'+f(Md6!~yw@QL]Rc/C SdF5,CM`<]|g;` ' zidLk,+qeEQl'bP]PfG*NE{`DTV bnիMv)I4M&]ƍJHSNEC#60ھ hsQqڇ~'^XK?ޮ, i"p|Vǃo, h1s/, >FL2p8<RjeFe΅ixձ*Yy;̒^%|`4ZvV1U3QU($)EW3>{MJ\4M#lnR).9#~,s4MedzR!śGq ]k{YjxN"6t8gT(m' |z9r,:h\fp(+se&6EQ(ܰwf`4ϟ1`GkyR6K"Bk`*/oviq,mrɒkMXz uVu3c/V#SQ[!}{vfTKtfƊ x*)fkŲ ;*eQleYuRjZ;|N ~oӺT~j/&[My|~g);21D#:74I)U.\z1MVxh@)Ҹ徽q]R KA(3THqR]e:j.&Wh/*)nΠ|%m̖ gN.e^۸0W:.b(([`HNk"aH 0$|8mHQ(+Vup$OInxĘ i« D\gE0Jn<3NAfR. !죍2dC2P.3r Uf5HdN6+p~*T@ !e;GReE,˲T^ q^۸Ӕ"mٮpxXnzo-HiIIe:ژ1T;55GYUj %I2 M OَB.pD&ƌ %OpDZG Rʕvr܊W ( -QƢ^ݥ̈%"C_HTa^>pRZܑ(R *a' 8wcw2UִhU}%RO`,A0EQ"fڢ+>!c5^ 0 a ){tN8%iX2ڕLq͠ ՜B#5 ҽѽT[P[V80Apܺ+xYQ;]ҵx4θ Nz3("< gޗjvn LF5V:.0+f.kduH/ܰb }[x s|# Q;SΊI4̐y)raCC`Q4Fu͌J6Ќٿ {Ș0Hp0Aн_`GeYVx4F8^8 v(R<ʎj1 H^Ȫa#9U]>h2 sRJc3ݟn|sP`ggaa>@5%\e a>R&cfÔgbɁb?Uvy ì,K2\Js] p*I$p2}|$Kʲ,yg\C2#q9 m0!s=BgJ熦U+)ΒFtEL/xR,i:cc14L tdgFn&UI*=gQ4<a^J[[{trkxShLG-9 'Θr_Ӥ5DszG @)U@DzcL1J4\Мs Z_#ƚ{$b7 47Z "j""sg!TAs6n ]Gȕkݰ3uI[X7 kUiX77K_W4cveq{Sb)I9[EQޒuU^s$ M ݺ\ћ2n.DZ!3Wo?>Vf'ʌ4Br[*OΟČZ`W0%޹qX-rghf4M84777S 쿵$ :}IRAky ^ ʼnH!Iq7;(sМCCkf%F @y 7-Uf̰\em&5Jκ°,+A% `#:%OӴAne(zԸ+c쩋6zibbvfƂºǖuɗ=2 aNJm.K#\16F ̨CF/U'Z_Vk1ǰ L{bAqYE iGQ$RJ :h,> j'H ϖܿY Bq,>> \ 袄X-1#ɳv#57w9DU:KnD ) .e՚\Kđ&$=rCHsuq3gfc]lv4-EfR.DQr iP,;KX]7A5vs^ϕ9.^ĕr!DZPhlFzCby  R>@ݹ$c)|^;w7>8*dMf0`BlжkfI~Z,ISY @H^9do&s=ʲ{YyH?{^b0r׫ῧׄjBD *p;~g 3Wpēڙ^wptt[q6=OlGs$Du=kD5-O3!C!3|+oX:ɧ{Њ3k`,Ӵ2eTi6I2]^-Ɍ43Z84)0PB?&c'ayA NWҥw47֌CעJe^6@D P|RΧUTr,@ -(ߗMc TW 6cFKne7WX8j{*&ͩTj2(bPPA @cX(J)'<Z!KXG*Bfь(P2E$R]Y~+|3%)\$;iE^r3?P ?AKd>M~GDžRjgGnin  "m"9"U?4deo,||W@(!50,߭,O#}$xFiٕi@@Pj,P\J"@[pbThhΡ!D]zde%[3]k,5q5A^& (+YM6|wTlyV5g^QZj_ԦK]ϘTnH+JEPj, &hE(* mFɠtaJ| UINfLNϽ:pcj:-/34| Asp u<6jaNPy8QdzARfFUFff^rp&OV4nN{(Ve m6#kqn˯̝X7#rR^zGY3D& X:V|?dKid$IR)\EKqfsӓ z,jBf2]5`JWmyHSg4 FMT=#D581+'nvʪk+)n`f0g`̂U (7Ϫ_q2PL F;8rJfH+T 4^)@0xRkN Foݬ)pbC:6 Yd *_+k7Rʥ8i'lT䆧Yvp! 5sh U薺i d^7$|ECFor>`T:d˒p?Qfn Br]\9#HYUip6J;XMBAP{lQ{O<-0򳳟huW[rTeP(5l6Uߴ%>"; FSU;$Q57%b@hk 9j_Z NJ;gȰaH]7je$Y =Ƒme!ڟ7{`%մho䣅z# F=ɾU%U)N(ky2sƴWc :KAC"߿g9Ԥ br{^0Bަ*L4tgT-,G|烑#,*2k[^/R19U(¨yV'h8|kRʅ4Mg4= EQmc0a  nn,9Oy#|cwLO4L6UFz;R!j F"݂Y@a4dILǫ#Ԓ:Ftb&2#:Ef4/;ENYy4lmKZ) L>@)fF25*X RШU"Fz2.?ǗY3iR CnK 5@:?`iT֒BN,y IqE{[GF D69UC'F#+èLWgHۭw*QV{T8p*0:MftQ@=׺.ӑHd2#]^TgKfX5-UEާywƝPJ-\t+)bI<5p""D`rAŲ1̐$I2EѲL{s~gU\Nsj:GEP2sQ'0T ЬΌk 2Z*918Snc4=+5D*FZ:[U&zg'РI$,P56lߴHoO-O(s lꍥr!I^g}TG4tfX=d"RghA[m4puzZS5`(V6ʸ}d ZThԘ'b.h߅?/0j]-EQ0hP1.32t#@͵)U2cLQKmc9Q:4UJTeIZ-,mJ4˧>sR` WWq?˃aSZh\v„lٞZ[CV T:b$̰Ew~A,ӠRPmҙz$*Cu5 ͌Z;m0b(=E0)߰:q 0`G}~rЎu*;'3F%'#7F[#YWr'֖I$Bl T(R $CH&D2z_}fn2'nԘ8EÊt FLXH.ghⱥVgTWɒxT?e `kҿKH9Y۸ֿER$i:7#7@q7CۖP%U{|r]Wf4\9IIXW꽝aGQ.+&yl F] k@*}F=Sj[^)j1hm)r iBL.Tg(Q*צd"X=xzr#3\xc[_|' TVRg~QCP `ꃑnV?)7.7&1kP eBI)41c2] j `iR&co5YRVV@id8^˗~ ٗ3ڻzk/+0 `5y2}JCe @[mÑ^ oM_ʢF#IF/oY{wߟkpxjh&9CZzSJ %Mʎʹ@z@ɕ  }a]Hn,0I)EjbNJx}OAup'cBFj( FJǜ; ( ]Žlm!ĪIz \L$h\@.|@PԭȔN8CfzqK)2>xO~AFH纹`+ӱ^{mo([lDccFCTHՕed3%)\$iϚܠ;OZ׍OXKsz܂sȿo,AJEw~raUe:z 9KXU5 #RI}9|Q'DW+9- t-cԹFwwTGG<%5+5oy/ػ1j`T_Щ!=-0rx\?< /f fFߥqىG]gIYY{]pb,}Es>:2-`%wF2&ߙXd^H~YM0],UJ~ jg^3 dt#]~enQ-qYp8̈́UV *fܼ{VWj}F smuG[Q%Iuyo4-%Z$kQgDd5nyHH`>])}>FHs$Mqhs^Cp5R,v"RUnW~C45!Mؑk9C΁3k"k6Dt!`ecF`{ɈJ3PLrPI`:R3|-D`i=WZ4Y@$M fkl?ЖZI0biԠ3kM23)g@0B9X@QUw t=JR &pִ[3eLY0n,2@CZ:ӂD ,ձyp0jt4WM]aTW Qt$bC>._w[^nl\go54f= Tы%30xdk6'\Y|-oCe"@G1y8"" $fX'L Eܘ2]Ԩ?{o$uf {D+ (R"E*UZT꒪kfLƺm̯yӌ/6Rh[jvQ088Zk`d})Ȕs2h@ob}st;7,&Ir*jd+%{NpK@ ԸHNX*fE!f$Yhs/I_'i~0erwW`T[8И?C)ldPn#2 ^ 2C.)_ JIj\MqKK0oUב;SJnL n9T5Al NȖ`dYI:.|&۴OeD4I͹K(զ$2H`(wjpcSUͼ3(o~|,sκboJF?}F|pto/>Jkݱ֦(MĆ@M$|1FB8[>B`]Y!Q* Ȃ•vyuXoeeHnlwB$I$9J)NɅԔ^" VcL%ѱh.1/-s7?[.^87ҳ2ek,Ɍ)p?/Q8"{KGJ,˞+)S/OB|aHfP!Xh#rg_$^ QYcyaЦ!0BM0jkZ[[m(fAaBw>\sᬃvDJb 3n~o:[8PP`eJʧ^otXJR1tMlX{I1R?Y^{oόp 6p/xWvTvqC%,2@; 7+q/Z~_7@vF jԄH  ~rݐ!IB̰|/YfcWU aš-I\M ;(gyIŶϕRR)eG)Yk5]Y)d&f_58)%RI) sK:8alO/z@'k[}5ZB.,A,`d; 'qg^OO9 &&a(_dGu)`mm}qN_ s ZTzCCy#6 Гju呔4˲R*u);#K tV\+@1PJeYuR?</)LN*5hГ,;ፔ;7 䟃g @,賷Z B}]gS(-;40r Ps0$u1Ck}f;V˗X` {26=(ڡ 9둪b@=qu:r]ZaG@z-Kvc(') J)ϔRGoy30xsQGޠlWTI[mJI)nZpv`J$[B$Ii&\ }! UגS;3Dr\bB$ɂb1uA ' !v(QN<~dky#z18}mGKӇRʓ,˺ZZ*yXRKXFQ8k-RYI)ֶS*o0U,8nUJS)euJVY;Bq7}T|kh  5QvZOf4Rřa ÿx&7.]#S N%;f`TOfi^gѧX]A'gR3R*4IqK(yq~#J_ȗF%CEy]W >g68,$7eȤMӧyb9Iv}iu\/)n( Tܩ!gmiE Nɴr$1XZbU_j|go:X#2ìqvfZ:9 .މ3uQfY:S0veצdG#RQdPd60*^u,Ѱsɝ׷F!V{ssVel!n0hV vϠ aRtsnx{\zGq/ޣꝽBW: 몔쨟E'بӶa40Qe0vA gz=1{}ueY]l& W!:a`l'H)OR+?*B>ʳ#gbJuŒsEtC(A?NT}uP=4Ѵs jx=Z,R peoM;z.iG"`4x /n}NEkȷf[XYwgŇ;(8>N`Z׶+YXxWS97n#s^1Ò7Rd?yQYt3f5%+t~m,`D* Fx$ŒS(˲NiCbTig0^e:#P:EO҉`_\Z!`PV QɒwG_o #bB]) CTXp)5lm}/vE\dDz2aP#ϓ%fh-!Ċb}~M֒ҙAY8JBHGY1U ac |.933*S)kqnv?ۑ}GgJTk=LgQ tΎh߬܈YkgIB{h}ug-8"*@O%UZXbv[7wVv7s^:vsMOB@z`O24#L dZ K݁ҊڠuP'J q`T*ցSwB=h)ɣR d7nuKv V[ȍͅ!e!F»zE?@RĒ[;r(ݰ3)9?39a^0ȇcXJy{ݓbT nmm[kv,NG +ABzafT$BKx2X5!F0(hehEvp7(Zx!Ҳc`N u\:(C idGFv/Ӈ( #VՎhsqw}t"+FYW#4>FޗUvhٻs5vb|Ru TW)W)noƼ3@PaF0k|`DHZC w SRj_kӘ,la /^mnFJiڕR+W NLke khe,} #@ܾ-V19Yi,YixmfgJ'v#}GgK7>nq3묶*-M\ FFkP˕By {WŒUP*(@5؉Jg4MYeh xsB܄ ֚:ݯyh {귊4) gUƀ&[x]B,)Bp4̉,Gv6@&8r91T]ՙ3o}q*qհ-NpPCN)Nw6:|0j,$0Dkf+RYGYaGeBկ&RJgYiڑRkײ_Pa"EY~^Cȅp/怍/bGyZ.zV F;CucEbm(b @4iJE_{0M3ЊaIZY{kV ™@̀L>nV0Iv* OޑU3t,+vJML$novsÙR`KFV&%,t)*CbX)dC Oz[8B$I*,i}ݰ!\vE}?lޛ?KP-SaQp7nw3Bg}mUݠy?=Jʭ g 9 oCsf!vZΆus@|lhF =տ; gJDv^zʿܙ6 3%_#d] b0B\)n  gv`ud4E<=Enҋld\!.Y<%q/r7c[?W)4p-`4ʌPJjs'i ;hz-'iֺRs΃·6Fv3C@!  b$h _wLDeNHJ0Pb󎼲n3#2̄1S 'Ov+,;˲e{ћNȆŋR:XSp4!̃yi`TT9s-լl5s/{qCm1V"fjgU[^φyæt8۷T L)R} CPĔ52В+U$ǏANkΤ 1Û NӘ҈!MSYև=P䥁00οe}5%yod< X$xX !8^Jv HsM4˜*fHV/럿H} Ώ)wP(Fӽ83#ϛU|8~;Q/R'E1F#BٮBpnHӴ%K80 WM *u߻2q}QR)۹1GkfcsCbZ6P n]`TaG3GGqQۼӿo}e.Ą&Ukub27M3zvZxX ~*f3 uUHRTnӂ;󧖆`ي7(ۑFAiX-Mv7s7q/y6dN} ]̰$Xcmm~˝G)pY.U\G{hHY7rs z~Dԃژqbi}Hc. !4 dZ|TJy㤵GI)ο^;GB̍tnhKa: b׮9߈hfYqV(P@jX7.&fXb[ wR @h7H(F&0o.\QDhϰJ bS`0CZkmEp>ju?b%en%)7|0Ѫw5qKBU0\6tZՐHSN-1d)K(@j|bJ)b(Vc~7)읪h7 7qUg78?6H,Wؙ'p'v;vև/ Abyƕ1,h jOǵ\02*J4x~ J!ˡR"1o*v|RI$MVB\) Pћh$̫m?^ zS>y_m(>3"C #?źLgvƞ7D)u+K#ػgF3ئQC#)ʲ]߱pJ(͟>o9I(5Mw]Hc&$$i;?}ؗ}*QRgBb3PÌ*yA/GJC)=U0]94 #ks4MϔRGTnGHPGJ FUAj~ _v &0@pѠ:v7cs =4faERq Y, :Y&߆ \]E̐gF* a3ɖȓCT}:*RjF1E3\U xcLIY`Ikdit%찅n*%$dA^,pvvܰ$Jv ʹ0$TfY =`fXWN ӚAByf4{4ZҭarsLgYLLcF#„&YkͲLifYv:lu틕(S`(`TRUkLr92M`d UV8^8#nqv81n"fX, ?;{2ߝe6G EOJ;™!/ӹBp:fz')pkwϫN4UѤy7Ac6$3ɿXұ5jc:^^ʬ(ΐl߮7P6Gilu4Y`m2]5\0'ijHSb6pώMEِh}C0.qF@y^s@? sBz7M suv 62K2,tnXVm:QɒlUPWVK}˸ $6ċt붟$IpnqC+Hv4Aۼ_g8 2fPҵK~}%v{0kl3cUP$={^traoΓ^q+f&f \h]Z|!4WYcH'g7jy lR+'fXoP9*\" %2`\t8 }D* 1C\74 !0aqi}cZ )'Oy{ XŽ`T!5;BdG[B@Bԍ术{ x+"D)ҹ@Ґo]U9X~ͷIGɥ&gf4,f83*kw0U1ÑȌ)Ab<T+pe;U&hB\.l óVgi΍vק[)'6ȓ-yaPaI&X%foſaGQW+lP$Sa F$Sn;v}RkqF fѴA*j(j7tV/6! ա4UM 9h6YRaKeI X(^nڶ7\]x! l4Qq"X✯E텝q S8Z d^oz-T FEc-g9Cϰ)wzח:HUaC3!E ↣|P#׹LJ-n:xeqg-!蓭x?ۼ%X,DZ8!Usnj-q9ߺ㿹-/^M5AU†ou*^0QՅ RHa#C3W&qCa%TL=Cg5#e@n~R@(tB$'g$I[V4%#CƋ2ugG}q,3 w͙l+ΌiU?2bwhD*_h #Θ_7-C\&ZSJ)eiO=X՟=E))`H%0huU0°87"%w[Ye I ^q!0 1ûb;KwzN`ehX{U#|ffF#e8O^ՙƎ91Cv ޹vKh0ub/^$ rqn9 LJXMt6o9IIke n4\!fx |pxvS{/S ? %,pi<`!wp;n˲n(j1CY (?C"ap `TV* "rpU0K1rp Zngk1R,ӏR`H. Q-qEYO6x eQԊdDMg}2㠝Xܪ]Qg3/j@'84+5n| qgI'Z 6#B. FckmvUqZKE7'j=!ZEI1ltId ]v4W3>l_WN4V;` /7ANd jU@ W&L3qqnoowv38maSEF^@fN wUIeaA履q@52QVkݩRȩ-( OF2 :n\ q/VٚbuP(M3ޣ vVnlA3":f½"0H;3ǟbٞ vGYu4-ij2%˻W4ʮ?>\X^z0%}`dәP/ IgK gHW| QEVzo\$-qYnz0*X >=촰;a+) NtN|̋gJ8{F|' zɘBHvl&BՊLmMq-"CYn89k^pq^?#dȌ#J>zyֹLjf#s,c)ʛRJW$)D,x/F՟e>O;b$-嚨J+ Hs8nq,X_y=ʙt:_2q>v[Ck̾+Ɖ8GnbAJJ_ﭭ λ_60*.#Nj=ß>o9I(;Mʀ՛HFnMb?ͭ&ώ28`i׌R_ i Ծw1Co-K;;Jg[きϯEQu4LA <>ͧr8^lZɼdC庱uB$XB\[3Xe/D֬a|gXǝȩGo]e b Gqki&q1H)eEpU~hqe՛zGg/v΀S3Kx%= P"4jEV-X іۃNG z(e;(gwp#3(4dYc,&,T/cHSwZRYc)Z/W~8*Fn$k-dև'RܰBqC(]A4A 1bݏ{QsZ3z 9}c&N3r]9MqC7h7=gQRbchb{E.val$23$I8nEQTM=@z83*6bRP"(Oͳ™3AUf74nA թRj9Eir 9ypmI^9b%IVŹa irqT Q oS.`+)ӕ̨)>cx1aeR^"bv%I↡[Ź:v{LRM`J X 2xONo ID7td3#!n|~ sy`DЉ71~a'z:ʲ,MӾ3ap11CqkkYIёRH)Կ=i-,tn(ƈFn5"jp^_Q}Sc(P@!!GEqIV3#*Fp!W8 .{1WuRj3C3&8dܷZRi4=Z,O^B08E& \MmfmzՅ$Iڜɾuլ$a1ӣ 63)V_/j E8*; shwOoD ae'L1CKNML cJwc4RneGZMzE2Kk GĠt7[dUUe{vKJ$q dG#h9]XXI$Qp7>-,w`])SҼ"ܩI q $ " s\OsFJ)=!e`D50y[eIYH=)RpI۽Er2u#7ΖI*ͮ'pע(ZnIiA47m"I(Vc[GPّn0Y$#F>3۱[f1bY CP i`7=IF˽-vAxUoJq影e17$h(5M<9ݸQ$qClF *71(QmR{cguu`&/){E 3J@a$Ay,gIx(R\fr o4 y96yV?-uYc,@"ī*:LJYWڹ7KZk>JZV. B(ɵ{g]GfpYDT08Fc,_@[40$Y s,LE aMa?`@ "&b`ZܓRI)/fSbA2; -Z SЋbl4`}Q#iySSW)@D4Z^splpC(WǙ\ dtLxu{?X?)B9sN*:~vO4ch.lXRq2\Z,z!YkRF%JivHꜣ,9:n˄KPιs$ы^eYcB*lߗ:H)cR<|Qh}]c5-\G9eZ뾔w~gZk5f o!\5C|[XgI12u qC9Qы1BbBhNV@o4K]Y~/45axu҈LJiΤR iZ!DF)= ;*nT켆RuE&\ \n8猵VcR*˲,Ԅrl~u)scXm%ev,qJ)'D5XT4dInf9B!G圓9%LPC*ֺ>"*y*qϥvRf9FEMsܒ룺gLġ2]9I_ _M6t7I !^Ew'OYkqRJᄐj>ONڦV7|6&Rl4sN[kVk7MeH2ʎ( ^W~#5Di6*rUi?n7, =;Mϳ GU.Ұil4X~ yZorxZ ,v2eH*"`Dk;Ҭ :nq1`@찚@ JlIfH.0(Uqg:oϛ+ouPf|/cϣqs\UJ_⼽T9YtK_˽E"ěN%o_iN/׻дhkx@۩g! |ʽ9DCi/D!BA!B)D!B"D! "DB"D!B"R!B"D!B@ "DB"DH!B"R!B)D!B@ "D! "DH!B"D!B)D!B"D! "DB"D!B"R!B"D!B@ "DB"DH!B"R!B)D!B@ "D! "DH!B"ķ}]K*76IENDB`desmume-0.9.9/src/cocoa/images/Icon_OpenROM_420x420.png0000644000175000017500000012266212140261562023012 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxWdWz&~G\*DȈH BbX],b,[=ֽ3;3kc;+zlalewvfz[VOopvfM W\O3p~;/1'$OH<<<<<<gJ6#9OZ^!y<$Gx2nۑfu6u15<;|zq_ZHZ5)JEqa 0V! !<{%.u4 uX'&&*Fc,ALAp1vo|3NFQ쟙jP!]7%O2 &}07z3]@!ORե_%pv,޸0+7]qq(VSm*;EHtzC2+FcZ X7y͌ALȌ1v͖ Hґt%L MmF3{GcLJ"$(!>/13B`d%jĀL1_7$++/ϮH\Z h x;ч^%y ( i~@kǬVZmRLax2T^{G^}}fY\Q. &(A5B6GOtwI6kif@mؗc68tUPmS<.q{ɋtޯ3P=0I(q$ކ82/N q߀ΝZi@Dcv q7A֖ГEQ,LQ<D-DG{B_0 :2q/ A&^ym^aSA]ύc,J}@eMii !@@@1jD#rDwPcǘP@N J PF`BX3N jIp4%>>7'j TV#Y/@ 8qE ( q!ϧʻ J /|iaEQZVZWWWM#SIlano1 J3έJ9l M I ,\cY'>ATFYW[/3ic3/.Z 4uԫS-k9_+ Ť2ΔW(KR!(1Pp8d0S}kj BBp:9#?~_Z( ][-OH,9gJ%>M\ *PB A!.ߛg/cKhݽZQbu ݂. dQ䄲<7ʯCzK [{)D e5"!'7A+5 Bμ^808#*#&νxyJ0\T*(DȈWI{ +dۮjRVyQE ~GZڠbODi"Ap7O>,b!*g(j j|LPełK&TQ$_#9Ӿ%7>g/67CϿ"(Bhgn4:1[ pǹ(Zjkf3wyI"~Y<Ђjc{*gx8c!1l @ HC\?ǭ cϔRRʖ1&RaQmQ($I5l0:/(!$2VGGW?=/ADZ E4(0~8Y|7˜0 (js W $OF{ {q"?Us j1؁!] p^Hv XRJLk-m ֤hجFv-'%Kk 80 B!/_7&f<6 9B珂 !801ţ=80ˊ]O\Mguv0 YhQeM0?yT@=>/<>KvYRH)1F+l쒐Hɭv$n/Iɉ$PWl0 ðRkZSk]+ߞ|U=59PfecSSy`4{J0 8lHiߪ.Ht^TJ[APa5(_3$876Nr,^)NYE$64M(R !JUd\K5à" fi±!P AjZ[!l7 R_]W*c8b pvpKgO[z8vu#" 3]0VGE3bc_zLA'y LJW,~weeeq}}=\(Ll^%n2N)B1ƘKl%AA4/.^N~NQ@H k$&caV((96 <u77ɛH(XO \T]E <8 }SZ4Mr!Hi7N=EQ<ϳ<ϛR5?]_yqzKJ)뷫NF{T2XEJ3ƄRD?7.; xO}v~TcaAPcc^<{(ӶZ&m0pM"[m)WheYK)넊>4LFENmm!EQȢ((ZRr볕 c66 Pk#a|?cl7Dqv[٫aي;ϔh+Dj.<90Ɖ3mJ2mA~ռ^BH<ϝ~ -n%~mzP\yI)TS\|f?9G[ Fa.fOW?<zE ZQ1]z<}DWP aGtɮs EQsΫ16 M[{5Iy_J.lE !d avۚ iyr؉h'؎ 1Ƣ( 0 _ i`d9,-!DZE&C {BoSoec4hza qǜ\!y_QB>/yA%GL>iva0% àZQ9So~Pb 唊bQ)UPJ-Hh[g\ɮ.7X)Ȥ^_}bA`Rc\L{jcqW*JZ nɈWC~Nkmn{/G=2PUo{:EQPTjqOax ? *ۂܼ׵%! !.s]7(<4B)W! `)T){3Z&HL)((4lO SX>}tk RRI4iZJ2"蟌,[nIL{W-yBz Vf亟B" er^VZ^ |!@(75 k/łr]?2![LlEH{)&)B*Zzmy,ΥhZƐFLrώ4_y~'j$I!4t8_ 1>2L~ĴwՒ''FF[~o"#st<qTVFcVFQt:>q1Hc@({nF\Mj !(2n^)^Z+aJ)Z5z:?;U]WVW߮q,]=r-Ԋ2SJ hEQ֪4:{0EVf9mEL}n&%MvO!aR㘹UAW 5ƐR.ZkJ0jǍ(8>EљOXkHm\[o;>F%͢(!(bBR:Av} RH}֚1̤-)eSb7ka[h(BD}ۇ߹t&RVR^VW GB t< Nc/RjqTw1FEaZ,RJ]Ew^Jf RLJ>1əuRCT*,"VVyA!<Ri箉#$ZBpD0c u !1c$|& _~~ȴ.ҋ˟_Ƹ*椔dy4[o ! (3}&RuqWsIcZ (z ?{y9J,lc ceeT?2D&ǀqudйUa'+ZRJe)E̲LfY( 5t?i'D=ʟB5,m"F8F#EQs^u5*ؑJۙ7tRD}33'/)5n md1%WoAusDR!ZygEQl_T"C=W\EQ.>Rj]"E9qd<Bh h8OZxZ?ZZƘTG!DBY4=)=})(* cLΔRR*B$YifIv[eY&<[ݫ|S#(hǼ^F#V8AA0N)6(u5JiR.&$lc3/?׫c7N3%M]q70ƪ#R{oz ]!J<ϳWފ/$2閄6!֥w==N2aFrBa8ߜ>|v&zB TJt6 tIIOk~Garjp65$ZֺZxZWVZm7M"Rwvxt0dz7hTkXǓ)S'扙ɩ$2; h[hkUepC, `(Ɉ )?P ! ! "~@L3 fUF@A\ąq; 3je{%NfVscGkdz.O;cM9vz +~Zw`t^t}j72iubҝ+wnkƘeb a.aE2#j)l. E!=B𞐆PG[4x4>>ިVq 0Ⱦg~7!>/NA[7 @@@jc4!qe쉨 `5 QJ`3k'u]|*EW;+61SBֱeNvHLݵz͔;ZeYyK^/N~p5vs%Xu F&sHBP 8AYb⎐( ; к'#;#J6gӵQ2)zΑvFf7RFFiđ(`ľ!?JiuOOHͯ{T׃plll^p'j/}?/}꫿ud\)4DL j :4!0؅RDNs.صK_⃢(G,˲Vg;3nSH!_PIe"MvRY p>9CiJH5W]BN[ a@U hm@)؅I: f\]F˕She@XICHhe P;: <#V;B2Jw޷34%ĭb!϶b{}'Nt#(J6QK&}ítBRJe is%Ҝ`LdD8!( j{H p cu)eH:16u|/!$ R2Zk^^^k+#MvbCbڔZVyV FVX'[J# D m6M c A20]s څڝ]y|RB6,߁_|۶3j, W{"G=aυ3+j[1AFi!L4It- yp/ɕWU6Wk-0-DrP!pj@"b!B  n`SXդ6yRn7Bg6*l"-'xR*K p!BervG j Kz(*χ sN:f+$BIM6-;R_JAAH2ȥj*q^)WP}a<)Ty,t$@fx#z4\ XzZNq<_~w~G!oK\9qjFi aLl(%0[нٓl[Hr}z@ޯV_90Y^Otn$Im{4lS=AFo!6]E!4-$ia9Y{/~6dھٱ_Cu4(w !$`.X44 c7+ D+D"R#ܭPPL0(1%ƚ(q YU /TgH2n^qyUe^vm͌22}ob,d|G(aIaJ@%#`Ppˇ呕*#m@8sDQiq 6(jPVKbn1C<O:T*yRɫժJՈbY'p]w9hCzRD8j5p SA?t楯|1O"Jm%m7PHД`Mi- 2c%n ck&RcU+i% [H/~"Tȯڿo4f?ߍ\a@A, _JD Ђ;-`ri`dU('BaƩgoԵ ֫j;ܵ!QGdGo0溭Ȉ:uD+ wݓĀQt778(dd*-|| }v+W?Gx2ϡa@5 @kpcDHQ!dxB 1[siεRuU=pbZ2AJ)4)M$g.&X;S"/6o)_H-2VJΝP(BY&dd0 ht`z2 ;Ύ3J( . DҔB6ԑ8sStNF]~#t7N~3ز/s!GFq"a 8n/q.j@L̀6f@Uyڪ@n*"cU0Vˆ\ _O EJVkEQTXG!퍞W{O =<P9++lA1v1G AL4bm'|p]eP,Bsc Tot/~f\1Fcl*Vk(,V$YKj4MܣQJz.S=F!$dY&()Щuq~3`ㇰ:q6A%f̠b.IvBB!Q4"EQ%1d},jA ZïͿt֩}Eq-\Q+HVZknlƭ'W)n)*]RH)m(J)9dѠw)RE8 2u]};H)$I0 sۭ< (k2vڊڎw8ib}#MBvyQJ9c,W Cz'6MIF"*B(HVŪ')ұ *Qs&44f7*<5[EQsN aVcc}+ ʼ G"T?ͲRד$OӴ%(rU47A !Q)v>wF(;7gBJiDVN$k1 LN`̪r(vfd4 `)!mel-Rd3^/1 "$7|9 :P-(tEZKQ-ʑPBRJ u׊& p9 ?wA k\W $DԡLLp m2vdn+2)e^mcve؊ m=rvf~x= BxAwPSl+6EQHlK)הKO $(# B#rk '.4v{{sOHOƾA J)XE#4M@ZBk-`W?Hg;e5vHo>~+y#;LvdWDφoikY(.RZX:XK(41㐚rqJiF>|頇+~ +'@kk+ 7FTe2讅mت[]CHۙDT R]~>tg+I`sFewRJε֙[0hhBlvC9'-϶0~Mv;~P]Ωj=0HHZ-SCIU[Ò^_S󤎺C^&~ʉ aT'~}z;ʜ@4s@* Me_)ba.Nۨ#o'6akc39ZjHU[!h-c' .:>D4gv[놉x 0FV#Dk]jcY;@j@ʵ렮ۊ?cg{kS44rF[?R ֨,]% :4 1!LsO2#D),N~ޠ1mW+駼9٪#z8vez54hBG=@! *+4J0{?ѼOyBS6e+~J7]aVIR&`Cѳ"y 1*/~dd!k!QBhHqmi{]ي6~RnG%ݬ@3_+{o)gGJh؜#(`DGQG[%D ' H0y2-6yF ȵTJنF) Q`s)QK(Clw62ڵB6fBYmg;kzd2 |γ !lSP%zb=t>Rm 돦eC\gSnr{h2 =$[vA.3yğ>VHh(cMu !dPNv%}̐iahmg"3;QOƌOY=BxݼttZS y S \7NN!&݂$G帛Q_xk1gVwaZARZS T20 Tc0 cQqB)\sA鲛vw{eZUB 3(a+ԮTHd/ o]t/=e؊ $sb0^;=FQD Q8yE,09焐1VV?5mqQ]=B&S|AIRs!<(096 0& 8XRf]d}! GJ#OFwSFimZ! )(\%IZ\P`>-Iˎ5 0ZB\}VEbز{^gZ7RQAT9JiD))! 268Eݓ %MN]C3A `h %%j cSa !, }Z$tݽ!-@IZka)֙1&RfJvYQI.ZV.1i ӄhf#%WS>LvT7P 9AhF6Z֢(眏QJcuBHRq{yVJg015!U$67BnS:A`0Ƭcn(,~@2cLN1-cLS)b-fRiU*leeh6SnO+Fr%lՆ͒u a7]rhK5.QxRq|s~1v1vR:y3'NM<|dpN(+jy@o,\ƴI`#$r/o(E6/VHݢo\14қmnq6Ruw*,)ڳuc:w[3Sl6Zk)wݘm>}1AS9_/2fS 0{(ᡉ.@v I?ꛎi(2@z066MLL4jځ(f 8Z7N~^}Gq)2H4JmKd ;rPwtOqT[4"J2a4\r_G ˏ#vNii)Kv:F_j%E P@Bkx4%0ʀ0{]фn4l83.BPXigҎr充%yR ` Qڦ$2a Lmᬒ=]˃f>i@-4Hk { cO&F6 =ж́;ds=8NmRXYZ Z.' H CAcR q;pH mK+jh5\9 A`wIvJd{Faꐔ12PhDA p0 dq@qrj+D v|C66kZZr+c :Q\`WT. b7 !4,$0vvlGOL޿rz7]JuJ)ND<-gBb7NV$u@xj`E0<+~?NQiDsg-c36+4(n&kX0 F>Ƽ /7pRXr m1c`{HERڶq{mR.=څPF5('Ѕ[5@Be܄#nw%ʨ]8?(m Ͷ-v.5H,iT4HHaʒbIpmkXcCa )$Y0@Na .~UQ6ʸ2ÌqcZnDb2r0 #dV5 93ሪåbrpG0hmK:(Snʱ" Q^F( E `Yq8R~V,:1RS C5#vm]~QQpA )+wrvx=#0{gC)Z[b!(WypdzԱ_R?0qZM4M++w|4l0;r]J@[QVz^q|4 _淿-LZD` Xˆ# !JC*RC( c {tdar;Pt0Ih,n12EM(a\ -q;lSZN[#ݜz*cRBw RC I 2X_!:G5WR0zMXGnnΥ%#mraR 1} ZP h.V 0Z9ƂȬz!uNDKalʙ r~a ZoǙU,N]XC@JN+Us;AU;;)7U%Ѐ)2S; 6֝a!N;Z 0v"Ц]n5Ɠ DD3!G !8"F00ufg{㎲6r@(`J* R rWnWi_f?] CEzmyQE!~'kX{n9 M!`llR'(:/Ϳ_m((nG'5%XS bI.ڙJ o_@J Y焔J#Jk0ʡX3Q5IBh;%ڵ%]VXl9Ӡh^g?8 S% hE$ }V-#N6v]O2k^ ShN`IS %s\@n``2QeI 3ZRHI>ƀH ©rQlp`Uu ̒' paV2Ym"qRw`pfh ҪT{Il*%$rc]8 Ѡ$Ǭ[w#h絖he4pzH e(B vq+q1b;sapJ)eDoT=3\+h !!sQHvj@QȄb{W[7(  ԓcGR!.vi M7 6Vq< soW^jK(!= m @aX%+wg#ʀ:V=ٮHb#{Yn9WlYe$:և`J֥KQ0@wf·caz€*]91wDƁL7BP ݥPH8ܠ 57ITJEDPb3$fkxT90un߻+agV(] !F6[ԑSPAdN: @**k2,8(7U[60~I O)tԈSx;atsRem KuUUDC,t?NEmDc鱳=XK cnsJ qqE@)$ FJ2V[ T'(h]C[.B}燐HX=PNg zRp'|/kLV>mJ4 !5405+bOѺubq<*7ll:#BM;ꯧ+ȤA]ҁ3]魍ÜiFy~]طvQs >.HCD+<Jy:.r7}k6XwGFXCS}*S9JѕJJEam$A4BIcUK`9L:jϗQJ)"GFyCFhw/]2`wM j7JZ7_<b*!A!4$ar&,g0:5j3fHivi=1设Rq@KAc}]e!n 걧= Fj.֦ i4՜͢W$#BP`` 7BRJUR~3I]Bl0J#َ1FTQhc_)I$BAqL/q_cӘ;cG]WJJ)[ZU1cyBxDslxdԨ%n1Br忢z=@ͮȃH5L(ۘv^~Js^FU+DӜ_׳^Y@h@s\_?*JcE)V$lJ)ST.Jk]0COXm֯]?]a+eov%-Ja=q(20 z+Z|,ZVV~B14Zƴ:OĿ'(%P0[$ i+I"MS:þLKf N)UՠV8LE/W2C7%v9BXv 7D\apKv}l$INӴ(BH)(ت/WHOL`&;<Z$YQL׏RM/FeYnIBDuJPFk+s($ӭ\H=}AL͞ڂF,ELjx)I,vy>`1|"-wȺ(XV jZEM?yso,ȥ d Us+țEQOdnEQZk5f;OFFYoUUEH$c|GVj]eEi0G(L 9NB|9IfYh3+5FY} &’0 YVq< f^_ BCsȮ|"_H|eKi,ˊP[F%=ugj~~#ңPTJ҈x2s=S cOVOb!M4M<~cC*sFhB_]wwY"(ru83Otv'?O4 i27KE.z$;A?!y"x:N1ۑ*Jƣ(:8ugQ0DnxRBSGυ(E'6ڬ>B=5(Lnԗt_ZF.UT"! &/R1Ri=~X2d[ӘdB"QRd3{[M,,eV)e^I>Q.uve6/!iAw_uh4jZ p?|f/~eR kD_UaljXu8ZZG˽H! D=`$Mvm˥m:ꞈm&hAV]{A̞៽" і'/4#˲ln7PHmI6X"ws>sܷO]`~9mݵxd}GK1W+vXȲl%IVۥl0&;Qb u@d]Z Jߑ_:?~ H J3,3y(y&Iy.]d/Ϋ"'&j1]T*A:xW{鶭YW DA|GR{EQ,uE֩-ւ.OuMAN!=:✳8yVq<A?+ƍD ڪENGP7>/9y/wj,+ f;쐐}䭯Q9||BC) R0m[Z;y/yG=`xR* ^yx-kTGI|G$#9DzzW;q\:+qgo)9V\ u;  Dq($I\aMͺavF($G:!zx<*QDRRTJ$|/7tOoʸ]:əz f ~R4]K$PBlzAGqe/43baC#ljZ w;O4]x֕|})\+.B N<yx;z388[Ja}G$O,)n[6<@/W'zxP9PJ)T*[&93U4dٞBPU\RsN}vQtôyjHl5u !6n}ة qΏ*lan]Yut/Mӕ$IZY=Y׃]3<|{NKBBw=b!|ev{u4lIg#9:*\:B|킛1z>n(G({(\=;D_յf"QH]$&V:Z=;ZM4QGM.<:QD$ ک:jq8gG_Ƀ*Vn]+XoqϋWbei;RWGj::xymv žت k($Ii}Ѱji$шqvx{[ǨǏ}N Р B49IE!\+.fyxx:/#뎜kgmzclRG[#H)` @؃G}~g_O$ a`-?חѯp$&un(##Ցȫ'ry"PJW1ì_C$!mneSt 6:RFQuyG:oL4Fl,cܻhQ:Zm<UyUGnګfKpw!4@ 2^ǥv0 m`lx#REQ4*zϞ|9#}ZCI J ts kƱ\.bEyuQщ/kc_^CQHH)7U/cTGuu4  @ ()W֑PGkPGdSwȅ ({oA}=&I:^' VGG!( W.@:rh*$W[wB?ꪃv?QGhqGQt /`@*(0Jvmwisu<<::UGCd^8E+L!\IiZ(^UG#IHtn4d*J;9|f:p7HF4y-VJny^!WG{OqܩYwtcrawۈⵋ8Pi6bY:J"oׇ#^y:_wR ܄wuGFB(l@.4F^B"v1nc鬯;VGZ-V G~o% Ȅ%+u#?펜B=lRHtc.ŝ  rQ&!,cMFVUո,!9?|uAH4 oHDș~hr@ƫ#ݨftB(<Hb95SԩI2; TʼO|ܛn 0Ȥ'`;?GcJ5z#ݦҍw(PW&|J#6Gu4&;QwlpDnܣ:Vca 5IՖ@)(99Oʊ^yxju/@aZ);;z^шL) g6M<Ek4aVGQs>}g}mv&Q(D+no +UQGv?:x`saZx`'h #.|O8l `J; `5 r-QHs\3/bOuw?5ctZ*ΎiE.mEo0ͫȺǭ0htMvljdV 79?tWNxnVgԠ{o_;zu#<ŭ+JfZȺQ(!NȷQ}<ɐulAp٫zLӚ\.F{hD/uKi6$R#ݤx׎DV@9@(Hd0+Lc)e;j%IE!'u4 %rIMa."VVrqΧϽ䩳7BJۄ^ ̿7_b!M5 yxmut16{_>6< Yjr-ԟuv;\5uP] CSG4룎f_៞[,4$rekB,FX.Eq/˲EWy:s>}kڑ/@JL99oRGi>h$ ɘ2%ƺ%O.7vhuJ׿r~mBhB~_ 4]K$ɲ_E-1s>{ts>,g--E:eB"Ei|2wd sPpeU?Wg\\B޿ͱ b#ՑPG/~WgtѪ#a+q[QGG-*u4&;c+C튋ǼVVEjE|Wzu؍@+dJ2 5gl/-J|"F#ݡ&utw_uY"89%KN=F@K ww?z~ap/HE!oGh>,kR WGWu'?+aػއPJnӾnNV.n++$ؠnGx|KQus>o[( ~7؟y;JQGƫ#WnkνSG $`V>¡Z{+^8!9>10G œ ARb]RMU^& IaKPF!o"#}8 !ETvPGAmv+RA9(0\?uhD 8uPc`a#:( CqTqO}#?]B#LQ 5Yut%:*B<&uIck|Pyq(Mvzu4&;ؐoؐofOQ w9j|o*#/} 6` 1ɥh>ph1IGPGf$c4Qwd#4wi"/Lz}ݜv(˲ҷjHk[\{1Qvu T*qVk2 ӧ7ZBjRݏ~}f}G$yTuC^yx:rI83G_+7ܾۂ@ۼJy^:iBҝISGS:`*#n-m (^E hD/b;J$PGx{@"c0bHӳNv!@(%̮b&AuQ^j# A̜wTnr`/ yĵaՑcwZi?99wޚOq^VePfLגJ芬h #Vhyh}DYqiZ-a ȩoTb1Fb:򫟨15ZNӴu<3:T/Bag{^&!1'(5@ (qd ]u?u4E~k?\o UGP#_cZQ,yu|ڸykyۨ[/b-F\}Q:+d4qm?(A@)(;ya&RGZZVxs>U8v~wF[`լ+3tWy39,[j^yxDiҹOK>?}+kPPƀq V~טmPy֓$I:xNyא0 B`"fb+v|èaý0QvJ 9HPJO%lzsN(Y7]o~JfkW>UGY^yx<'h{W UvQ'leXu܅wB255+@A@w!mJJclW[TwTzHq(,]7X<<:>|;gokB61`SG-CIݱ:o=>QFm#ڀQ!I"JuT׫qOa88pW~Ta%S eh^b6Bnu$܉:^yx>uȹsر?]2"$w95[[Cj}(;58e j0Ɛ!hPo1o48a`[) +9\AKq &S$Ig^yx>utw_ƽ\ٕy~2/s>dnӜqmþNsN+ vA?xz+=yKb-'3O/@߹ZLxש4MՑcϪ}_90NjPBB)eKP fQGZyBzⳅ~H`bL{ y檦J-4yn9V>8LJ;y/QGcר#`5^+7[9׶HJJa>Xv?bam>_Δf; 1V5Տ|𝨣 NH41XC|ǫ#ݭȎQ{V!*n Ѳ뇖=dў#jIW m]ɶ:J2^|H gTe(R0CJySGwB7۪ F@E<OD$OHOdG``BҶݺcNjq>vzͯO]m Rr P~qw5wyGYiށ:2^yxJu4iѹs _ZP10= aN>:f{h!Q ¾˺ d dVQǥhw荦VJjH`(vUe؉:5yu;ԑ{;go.$~ՙ"J`f4hCQTVkQ`_<}_44,, X> 7J)\^uֽHsɓ\Z*$ -h.˲% |G>rGZنxFA5*xE =_4. B5@?QnEq/IiQGÖo㙫#aݬ}썹iv#P}񼣎,[K4{jhb4Mvښ͔6(#.Az^FMrΧs_gF?ylfu$I:z2<w>812Njޔäw@[ULQg iRhr) 0E k-zJQ1:xrs>soqkב ۴F-zu ZnDS3`E0T*eU}AL:W'_@ \||VU$igY&Ryu#ə_L2TQ@)Y0>5[p:Əx|PәOª6®"=D{'#cOY`'// A $kXK ͕(u;co#Q9{ 򼰉&|kpxR,8uwԏx:վŮ!Fө!aQJ)T*aRӯ}3_R0C0ꏄi.{uᱷQWdݡə_ǎO*dCILr ,Onj˳QGO}jr dc .RJ"gƃ 8K čF(eNT{+-]s̫#=pg9[n y&`O1;I==uT.ǔq*nZ)o2SGQRiDQ/ CG'>[/Ugkhvsh9Iv$6H{u{Q_Lب-e꨻UG{IEu6ӭ8yRj#";OF׀Av8ϻQ΄UeWGWEQts>sƵ[k(FKV]-ud L4j}c}K0uHRJ( jZ%:R0u~)v5.[D]쉬9QGw>Y, bBa{`M}zAWU{=0 qWSSw[sm]ՀAvˮ@b]H=:2^yxuts!ō۫V 쩻fFYՑOHO lS7%ӛjCu{98V2o ~prS@ eʈI~1O(QҥC#PGw?]S(!m"> `y>}xՑ7= ePF6!s}ӇRʂ *C'oĝdg`kֵ8KB{EQ,-Ց.UGGܭ)n^C W~ÓbSu=QG^!=Nwx]b;2^cq\Ve p7:qPW/^[u%0`2wAX@\}=VơFi @trB: 7tT5%26q`/0>RTBeiWms<9;u3!c(@-Z(!BhhcLi#0 ˚uaz9uBH| L"-UvsՑPGJuWVmaKo=Y7XOHϖ: FXn&4 cI-uwϣ8?poΡ;j 0`B.B ({Y c_ z$h Lc;(nuTYu*nڞZȕP AEQTFM}OBjHr~r](ɲdcϾ|:q|˫H[mwD9LvNT>RyuMvm3a reuRJ9v+$P0qt7ҢՑ~&'LלUmv.4b0Ek?{ %,eHFRhbk֭^%ˋ\]U:xQ4~|Khr!j:uuՑ7=VS]q=A[((!$70?>sޚZUhF މh_P;E9 :k?8~F>$-`dd4Eݧ我7 vY"oD1ۯ04vصPJ}A:Ҍ|Js^ϱXYd$I4M(\krȓ}3/Glf0F94TGnH:ڛOqrT .9o0ƪ^k߯2-QNݹň~'|eI4$ɋv1\n'WFnoEJ#̉~p|J> )% TFa>±[v#3h#fWo#1*`%5E2 QJq:V|^@ mɋFk_k뉓iEQ+idx5aheUϾt6h0_Fݻ16xqG/TGmOB"v@!0\q DƜԧfgߚۅ P%EA1+0OZbǓ?PhcaJWձ0 2f^8s7r4bb0Ĉh#<$> _bS,dZ{  c$#ggք!_ Ԁs4?%[Y-&Iiy9gmw>'D*jSG 8oŗy6T@i!nGRGuKFNAFj耀OL6W}c/%12J߻VP&OT!3x+QJA.u16sv/%XŠ Zc<1FQ VQ<ԉ>,eOaoz%5 \?%/1% 7<_Ltգ*'d%Aщ)uk?SףjZh2_LW7aDnɈP?Jl=Q9w#OHOAC\r8F?t K]ey@Ez2+ՙVP֣JD! )uL:oxE $VqPTJ2˿wur5 0牑7]ڮVGއ'e!zP#(AzTkM5(ZX <ϗ(R>3i"![MskV*zE9S_b/N0"dDJ{h#AHddFً6Fb$Y %w?C~S5⣴-&IRRJmr&;zȈA3$x"MSH$ZV8 `3/}܍;Mr=CU*4pP#oEqHud}GϝBzQ(ܜ 1 )r,s^eKi64ͥ,+l9Igۊx4ݤnJuE Pu%::dw=yb&~_kй侧EHf'lvfC1uZ:s!:čP`>NY5dYVl#O>F!HRT8 p?|v&Wo7;"0qb:һWyBzjLAvd#E_bV R*7ƀsZZ HB"(J)/RM1 !s.#}Q7,R֚(!AZ6Ɓ/G/{ݴHv͠\wꨗxvȗz*NS41l^r\$.}^2Vwڮ璍Dz~)F9aRwI/kt?Gk;]< ҭ6m㯻Jw| 6ϧݛtySSyVŪLF)7Zޤ|8FZ}>=61 v7YD1JA%52JCHhm4iK37v*u'$1@.Nfe~D6Yd=Y 1 [-H,HVK}yKy^ȯPVeoFN}3wG>i}Έސ vG4^C9e8ڦ3ɂkH7I_{wWjtL,Ԏ\&P.Ln.<7K7z1n%ܚ6Y2g,5x멊dѥޤkDbOUwhU,\m8$L9Yw{j%c͍va yE}.h5L=r\z}=վr9`GhyrB ^Glm}vv{=EJڸ}&>WBRB]%@- -{l@4[ܦGTY>W趇pqNuQo3~5fڕl,7s*1J*61&cVLI1I!kYvCnJE|RRW}=Ч}ۮ;z{gќse4ƶ] ^AJxgTI Yݿ?Is<·yv.=$PVRgA7ٵM77A,<+dX;\y REe܄=ԂvqT޶d5j"OKxY#ATs(sF©D"_4 a&S}rY}N 5XZGהY( C\ֹ@mQ}є[x^ϩ>;L*_&2 ʣ˪j\|)Om&Ɂ5uZwXڠ͜&0yX9\ÇKJeW@rJٕbVJQ1l5q`GB9A8Jh{;^q%w _ǿ|nfhmYelqғ$#R}p+guԻ1BpYrN !(=DYFcznаO,η\eȎG>68 :A>7a m }v7ғ68+n[ JIwq=Ƹ*dօ.\ʮdC*b&g4^{*u}W6kl 3TߗZ5!\nRPzN)~lR>D)c,z WKΜK )˻:3cu_? w;~By/x*Bd6-,66k.:) 5ٕ64ڒٸ=*%&yzg9VOKaO k5]֬vsNgtKwg펌VsRJo-+t& sɒ>kNfJ rVM9즦4KŬhRt 7]MtuYW$ɭcȲ)Lɥ0>S;Yʇw?{ 0+i7&~$DlExʵ,X:0,RxWS`f-5cnqbu\SYIsEyƬQj]'5uMD[lFf5~F9vʣv`E &ݗ__O?ncsG)[_J=*ʾSZT8RJwYa:ƂPSOYT꠳Ymenc_ӻ!rOm٤)_JnK:6Հ{|i&Z Mjl:YgN}F.om:!eTȪX+[ēsC}`W.Еy".a >ENdCs] \c,˺*MV6 yM!\^BPI!3S/F{V/;{uET:.R܋{Bm5-]YZ%)kiTRO(z65KyӔsdrsέg<׹:+Q5Um7(v-j\|ns[sk}G>\=n?m~RJI ZIysca;?|?Y&UdT?Z+Nc#hcYYqvo>Z9&ُw)p8>,ub}VNŔVdЧ 8/+W%a%:|K_>vjx|OGǯg0,\qVdm}NÖ7R_?ˉE?nvn T|+CW1!?|뿽eŸK5j-hx?Q.G?Gll$.tRn~npv{_QJeշ ]#DksJ-ɐcq?a?3_FRX,{MT< !BV\463ws>w0n{wwwp]rIG|:$Wh\RJ)v(iRpl6C!-^m˟WHNbc\ h*H14 ð~xxbњK׸>xi-[m'F$&)RCʺU-XKB|<{3Fw\E)rqH)gbus+3 wHDQN+dX|,Znuhϭ3\.~~ vZ6wT׼1O]]B=%BOl T~F ҥzH!gdW5k; 4.IOV\8%N^w5Uvm1vF"tU͹u.ӟ{tc=2Z6otjȮt:~cy]&|Czi׶O5QrSY7&etBHNT1W&HFvȲXAډ Q{3:׏qIOS/TVL j0k4ީTS] :#]#i+0\oW萮pFeQ.!t!Iw+1 )tn=뺪kֽ.+]ҵ ^ ](r8ޔC.3b02tc{̹KBdOh]%aBި $|rk8;!N!y!z01tno`O=g/[. ɝx$ޯ>'}Jk嚪9*ޠ 5QECl6E+$i=g]ѐpBЇ B0}HWCC@.6 7$Hh׉4e  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H H H H H H H H H H H H H H H H HI^UuG IENDB`desmume-0.9.9/src/cocoa/images/Icon_Reset_420x420.png0000644000175000017500000024600212140261562022610 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FA-IDATxi$y^_c{KVjA-@ AEQ$CRd4ԭn=?zlfl̦Mm1Gh4 ."A X Y̷۽񲶬߲^xE|;13Uzի^z_zի^W HWUzՀTzի^^WUUzի^5 ի^WURUzիzի^Wj@WUzՀTzի^W HWUUzի^^WURUzի^5 ի^Wj@WUzիzի^W HWUzՀTzի^^WUUzի^5 ի^WURUzիzի^Wj@WUzՀTzի^W HWUUzի^^WURUzի^5 ի^Wj@WUzիzի^Wj@WUz zW^7z3R_zً:̬-W .ocX5իfHM6o}X oԀUUx 7Km<6EzՀTzIC so`XQ R^zsgQ`y3@m;mއd>LjW H׳>OM>m m}T͛HO5@իzzF2En9LKz޷UR~h}-,߀VN'I}@2v^UPT͞URޑ ]@\PٶM  )%I)IAe !D}I&N$ &$ncbu~ەR:Rs$8J)VJq$qTE P58իz] ( Z۶-`c۶ȀƲ,KJ)& XB""ADsT{#0`f Jl@ǸYk(fZiR*cJ)$@+ CmKW̢ U=1Y T\W|d~'sQye>|ux'-RJi۶,˶,KRJa"" m>Dd$iGy@2ɾ ]І-13k">g|?afu1EX)*IDqDQ(%@3@i(y'Bu$ 22/;3 S}x@ E@EO%ٶ-\ו۶mۖ뺖8J)c!"W}!l"DQrd?cMyD$v?"]RGɕ[7,I69)D1DkH G3GHk3ssG$ITDZ(J$HA R'! A +Fd``vh ^79ү'>mۖe9RJײ,G!:DKDQv#pznrv?ʚF5Ww=-43l!{_#Of*c300܊kz/Y% I꥾bJv s]3jfR3|?4"uqN PQe WaXUެS NFlG5`TKv1x*(c?J۶-qu-˲\۶]۶]!'i@ȗR6 iY}ݹkJgҞҪ6Vcu ˖fP1R Bx$7@e*^%ňO=$m5[lWx;6 }Y3%" ze ppk]Wᠫ(u^)UJ}o}@k=80aaADQAb$SQƫ%)Z_zSL5 Ւhkm,H뺶88eYeY4#,ED-)eowV}'Nqh{y,; Z q@SG`)H% O_2R^"lfmiWs6> AnE @H~ zQ!,ܵ@s]D'k^n=vgהR[UJu PR$I@EQ4 Q{ү9U&.50a,e/Qv|)#0$=fdWʾ^2De --ql]q|۶=˲RʆeYM!DKJ1-lM Z5`$:,pvw=;8j 7g_]{+k?}f J Rj|)I8qoSV=Z1THeS*yPu*(s̀Zb=\ <?E"+*{ٶEUf|!#G CQlJ]@ba-R'zQqW=;}~W:}~`sRm̼$f[Jn0 pTs*"`hsA&N#kx D۱fIN+ͦ庮nmm۶;e-ѪeYR;>xN랝NvDCc+J.aBҜ]HTd NyćojN*ƣ14o45[D3=vV)uqI\LgckwHaqeK7dҪFʜ Ă*B7jlh+^{?'Oo q_m{q+]}+ í~?{Ї,:ގ4c=RIn 2d9Aep&M\- C$-͏QV[DOl ,TK;ЌMKԬTKRH3b رhڻ~ovu׿W-iF Ɣ (w(ܔxEڏ]b:/q=^oe5Fq˲v¾>P$ \ I*h^7 Ѫm;mkY֞{N<ɟڎ 5kh#M!( +ތyjUVdBY 4*Lqņ][PQM ]d˲:|{=;BʬgHr #EAh6<p,$뙒r +.jo[7OCB٬!*2(dBٞDWٞMqB4;8Ssle,f3AH@0CJJ*4"5.G -{߷o·?/Nqe˲[uƯ -~?zqI%Ÿ1cKcnWݔyv5 @4\׵ͦl6F1bD,kmv>z%MMJDD)P2LF ; 0*2R0iH!)qg\cbDE9Dp1HKjOy-wMS^9oIG;Jc(,MiRfqf3H_=^8?Nq8ٶ}u+^}yޠ톅*ؒe6Q04q׶z`4s]>"y+m6܁zo|Co/"8+(2wh [;'4AW ~͓I\!ӡly_jEf%r]2#T.3}x4 >1q􁕙X$C&lTZb{\g0ߛ>Gx"xe"0TE mϖ8t{ҥoc}JKDƛF74[bA$Zd:j4 }sN*¢ual:fl6[׶ͥ~o>t?_g@$p!RDȬZ#YPh󉞒& E0AA+7߇Rɮd,b)pqaߗ[dk,oE!c4U71<'эMscŨnҋ48uI kHIc 5׋-e/=7n[y{G/em8\׽7,v@1UxelifmF%2 1Fc&FO> \-րTeEb/y kɶ3e],ku u^/zlI܉IKslJ P*!7#IPFUH"]6F+-z۲>p;?˿[:f(4/ƈQA# gՍ{4_ޑ2x䪛MΔ,7!d*W$'3LWYWK~1rp r=h)N7-!N# )L@J#RoN&|0wqYGnv"24J A bID p&H .%ga-t~'~?<׾%XRؒmco醒.[;~j0dEUh 2Bfhxqmޱmxx]ZU W3|ڷmd4Jӈ5,.*@hRf˱ @\1yMHp9o/U<1XJa4`H3LX:(Fژ *au5ᓱ8% 4`+͡@ѐuޝ㟸x⯾)XB\,mnD{AiAw\{f?7 k@zBN4Mnƪ{9`c{>k6jn)ias{J.Χ21mݞ).9LΌ^#.԰rą1"2 P ruqDev2G^Sٳ=z]YU*ԗ7 dVV#|* i|!AӹU8)(D6UwhyN'|_䷅ !/tǑn70Cumv#zK~ J5 ~r:jƪy{98α[~xl-9"ˑCIt SMJιX|D6*fLuyg>y * M&tOmx Mޮr-MrShR>yZ+nru7 Xr4# u䩩C\SVL^d$_Di7!EQGǭ@Θ1z}h"(3iL,B )QV~|YJ9LAoC{f<:NNF u]l6ft:Kfs89hO~[@^*Ċ R0 hBGpa6ô8#<5P<$d$;3ST6ay!_|C9 gmFO&ѹXxDnd=Q 'G`F$5Ght]Ѹ wT2 :g RBAa3RЁZ%51gϑ?_B[-JrMv`@)O]WZa~.Pu:[[[8S߱TMHteIvv:V\}8]=zw;4w΄ 47˙,F(T7 6w)dM(.d(e6z:.jbαߛ̲͵Lb3g1zϥ2"2ZIrT|RIAi ;,Sm*?]@SFKRi!1J|$2 3gBP@:g&l;#-FE"%i$IO1 ;HR +oNqBBKm !I)(8QQW J ƈUtu]jeYdY%I;v`^__34nzQCs$N>u;s:CSÄa4irN@S3myf“ Dr䳢$1i?O͓u &+fR\qڽR,W̩ 60l?*f4#|yzXA$5X+= G=AI)eb(>"3QиUA {p|t_&•RZD$^2s$*+ l찀ȅ.X^^fSzx'Bk8N~,H֪9u6D7DD8h4vt:KFcy9wߝ' q)XB7GNG\(%RQ=v9wN*y*4f`N^WIl\]CQ3+e<-0廔MI}eng]xLՌxL3^zT .;DZS“"Ied>A  YJL3*`id3 P 5$\T{gNZOst SH !`0 I+PLiA nv-V۶I)]!N\ض=<\yր*EjZ+<8O=z/ Ch XH]tͮAfb]\4 OvDmb6x7'^COLȄ\^ՙĨT4@bFhw FWte?OPLW6z8s \Z")N/D:OR`\ `e=MB;!LMǎN2m-M@iPQ`mSӰ/߇RCDaKRA Je`46OQղVVVVd>˲Xu냿;?Z[G`5 ! !-˺maj|GwV FSLBrv{}^t˽?_=xf4%!&2:Tzb.|ʭ@EC撆<+&A: n*l:\@ J]k%`"Y5uI_dZ-ZFuc>r>=a:H*'Ml j'Kx7~=]#_dG΁-Wr`>4(ڌJfZQiOXeJYJUDA> J-RSGUCɶz20GnPѲ,s]6dT&ԒF#BѰynwu;?{;okBp>`FaʅORaOn6-O2BP*3d"MI|\:t.3*3z*_fQ*vyn^SSy^nґSu1Ŭ(,PIƔ՜DxKb6lrR h# z!#ьn+Y]?iKOؐ"Jk3em[mgiil6W~ye PKdhefnq8suW6u1*`&DVwt3B8eY#')#?x,˒N3f#랼E+ԋh Q:5/ g^0Wvɑ\[G\2w AS?9@jrՓѺG0CY.<3t3dgՌJw2ݬ{tbLQ!ӕ23Ws5*O%NYQ!33,m<d H K8Vq$8a+BȄ`E}1+W?;uO S.d`M `dvAqNO~pש{w+]\C^0CkfWWm۶}u-=yRJݼpY79v =R0LrlLjfsBeɻßxJ$6Kԯ8WhYђR뺖eI0!shyG]׽OG^ (PeT`MT sw2΄ J14S-hqByMƓO*tfL@qa*!w%t+0:*frsMJ|dFeRlDMeF8 ׁ҅xtUx(pf0#H.(~d9Ei fMf eA% h d qeFٮ 8XԆhҶ%g~Q״aJr% Rh4Vh48s[>58TP1U bSt7Vr#3u]*#%cG7 `lw]y0^ TJ Wdh\|RygwO he1Ac?{~A ,R VBH-yqYJ2u$GJ+DjK NV Fh4&S}Ï~-i9]:xltNLőPn8l> ޣb i e(@nT3 )(0Mm<4Ih~N dg T#eNJG7Dh@P;j&a+Y"o[I02p JF!׬5.vJ 7̀٩ ;on1?k@)-J%  A*=B0ql^wac@p[?VJ$IFOR DZd )I#ufP&' NAV2IX첇@r S'̭cdWK~zzB.4r%HǭۚaK@3A eJY6ҷ*uh<F1K,jwv{?"fNRZkZk$I2 0 @RJhnt|"\ތC[ @Ā2 #%]7vKv ye (R3R)[HMF4XNv:f^5Oȣ2`Ԏi#ͥLU( e|oXӺc ͰvF,NOTSuPjR릫`F$IH+Pu*f0G4Gaˆr措۰d-8nc B H/a8`_nb Y+.XRasA1㮻[y2O/J Ѐ)K)ZF#?H?ZR@WY4,H4c#̐DWvsGYqMF(FY1T?H*=G I57../9sE0*55NGMtexhUنiGf〸sW=L}hϜ:N2lҔیDZUX $.н|/`+\e$.`ORd ҶؑBIĵdIY ʷ /хQ WFJZ!Hu%IDLVHR_+2]wc7{khJN9-Dl!HSV2 W˫JK@UUD3 (Z"Mg"h&h7:SvLc KxY{ЦGPzhs>H)(T$)B(y۲,hVkl<8|753gDj`)h4$Z $0a@i(amZrE2N;[JVfxkݛUB^0t:Njzw[7~==O\a_0W_tt(/#™'t,ѓr-]]SG٠l~2֢s>`<`J%i֯`\yl;_EUZ",9`ٶ69n jBsŜh#SNcӎJm'㊕CD H@A!DHMЂ,rHXL^\Ë^tٹLyUËoKo~tcX{VgdHV0#(Nh4Q2׏s#;*1GSu&:Ck)8iJjJHM8{4e.(F8O}~>/Z8I$ 8R*ND[%=ϳ[Vj}y~3'?~*HXmͻR ϧ,R#LRUFH%s=w.r)#y!Jb,s -۽)ǎFLgo<}9Hp1J;saFG5c]1s~ϩ)10#1=#(g *GHd)r ' ֆ@q sOs?Bix0hvX2X+Fc_ZJ@ki#1ko uV637=[<>DfOEk!G"BefXMdI)!WJ*lk[KË._.sp=SvSX:pvkZLv48Nbrӟ0 Pʌ O<}NATbQSzheYB<>ajxDNW$8oږ:Dl68uE !뺲j5M~szG$d~=6Isޓ 4Ѝvorر,i۶k۶8!Q-ٽ5R]Uf0vj1`t?ulq!J'jtlٓ=©$n< B9^ue<&=T ϫ4憒ߡRg n2*dF13Bk "^+/3O`g]VmqN۹fࣔ H=1sR: +ʜW?7# 2ʁ#H Rl4mɖR:-)%)=YjDsέn< ݇;X޹ʑ`DCtZsҩ9Fґot/aghqVHv$X~L-)uב1Qdځ˙JqO~Bj:DEv\n4<;{> rוsXnM-Q XH] B`t:Ja-Օëຮm,*Uk@zF 8nN1A\׽Ο/j [laL T~䥊"tyBv?51% (;;m59q@et\\!Ӎb#6!L d@ګ/W.&c}_Iq4 CDa$H)R*Z+(bf>pB e۞N%d))> !d|nprZ !<ϲev}݋H04ӎS'8T8~T+|/}@տqN:{#8Q#fܛ£=I'T#7X1<ƚ-ba۶cYeUcөӟX wU:s]z߻Œ^iqT`P!($ASQӹ 3#=;D n5HT8xE+v!FT^!mDb\#im Ib/ƩVh_Ní~Od0Iaa$Q$QQ$hÂuoeN۶hP2iSeR! 0e-9meyeyme5,zimȨW/[¾Bcu%TA2)O]|yK%_;ǏZYOF;Ӹ$(%xD{q|sW_}/?U&"_)54&Cg=v+]7HJr]$94:`T Q ZV#X0(a^{Սͦn{l~wa N֜%^3d7\*M̺ ym@ h< mFkCѾI_1f 'G*b򷾂&[W;w$I6~$I7~(8]Qbഹ((۪k&K83"qCqSD=Yeٶd8g۶oem?jYm':WV[Sam@6:$b F\4'zŒԨ(4EL^=`e04x<ŌH5.M 0h<'_rGkJ@Jٸ]O3!.m@0#]5(&)G4@  Ճ]]޿K^ض4 ۮw21T46Mj5Fk/{l$ͦf]8rS`4*'1Ckw] i-:?˿}Ձ׮i'd:4nLLy!aFM D]ݍ W%;c;i!`8.nZ~^2Ӈ]=;O(=L qMH@70 M$})`bz, ̈yLW ?hyW!r g*Ʀln8Ƌ9<nm4ϵV[8^(6(FQԏhE000I QxːyD!QS 'LF#"!'q乮۰m8Nq;X .]=䁋Z>$v`@44j5~pu>.}oN$ap8b JʄFs\I(H $a7@,5V qҿ5a>wCՑ 5Y#uVr;Nl2OWÇg^̈́dž&x5#F9g;Y#:tYq;0γIY(M36@m^Hvp/' {"鈵;ڭۺEf D(a0DQaq'I¨' A %1y5-ZKj[?2J$HA0ɶmu]6 0ugxv轲gϞ|/nwC wҲy4t<mkY02TٿkԍT樳|%6㜸'>} kqtIq*a܈mOL># ԅhk.uSSeP`KU;*ώɦU.E)$"$Fd [Wq/~KOghE~wk=0 3 a8 0HU8*2 LteFo m(2_DZPáeY8vN5ive}m7;7v3_ۯQ 1 U l8fЪ(s!,Nvil- &EHAJZ#Bb o $izeD A0ň0F QQЉ :R^lvv/ Y8- l1rCY70ay!Oj6vi;sw=W3AbqQgS: ,Z|taչ+rSG0dc JTcc2X>(HqyM7<ϻk<൯8ч{x7Dk8J+h-Ʊ=zR"Fձ۔9P#N®4A hMD܅j6=sEa(ֈb(a$*TFe29xtXm% CH)-' Zb ؅xЊhgu$clfȷ7|R]UhĎLnۭF3Sw.0LOxQL wPe)Ņ)AG=$Ͽt^V;/r/AAaEQSˆf,G, "i'氥2p,L_W$Ip8ziZEkw{_ɳ> @JDiN(NQi4isޅj H(H AbF'#XhtXtj62-8au*ϫ 2T8IK\)RT.o:uѢWtlBc\~癳]Qu\P:-*mtN_ ' 0nTܳ93Ub9heaY|39+OƮBfxՑ4KeR[ؖeIsTK{ hv,@$~Zj4=;ٵG>hЫCHRf4.ir3B~c F_3R' zLW5e+3k= 8l AQڻ]o}/ոw0oҿ]˲ĜuRNu-j4;]=8y63 9B4LѮ 3PE0Iv<!.#(QÒ&,w{vϽqrOKp86 Y!02N1/TG-*]ESSWPYu%]" 6 c~M?Kٯ:}S+N&Q^MO8VQ*UJD c"HØ$Dqx8T?*sRژg9M:mU kKq뺶m[3YPmj,rfYl4vIu?؁[})H0P&*m5T}w~M}&.mq fT3 3XGqd RY4?\_G[/K~p8<pDxmW^f(7xIHaNNsZb(bØA0j4]/7OŽ~~ڵwiJ@`=?J3F 01R!JkIYiV'55t(RH%.qr e9 ʓqvӷ@' d[}X_k/vUՑqo+ 4 L~ =ϳͦj:q]csߧFq9ԣGWS;'h|YJ+|.}xqiAp~+. 5D[``"S ֌7$m1u,p*"SʾY)rhb"[6h6[Il勃S^;}}{÷m @g0A0L$q!VoISDR03eQ-bMb<Ցvv)wp[Vhp]'َxaHujT@L8@# 6~c 'tBSsw+^PQ $FHT/ qEQƄW#~ V~5aMQ o ɕ_'\2[ѳԔMS* ]7Ͷ#qxVws[] v8r' 7\B(HǕ} Ӓ@ړe@Fqi,Սu4ƍ ۑQVc.nl=sgD8bK/˲-0,K7dTOFn6Fy>qCG$zƅPSFdoF󍪹gSL.HyP!qLWZŌg<  LHY*w7ܺ|f 85^ 1- 0 s@4[  J>~ӌq*!=TL2LHyaK~$Im;tNO=d= NBЏ0Њc#M^7>iB167s `45rGLHZwf|SxD{ևK[r;̈*d 4KT}mۇw8y?ɃW#$ud:Hy!4ux:}$Hc/iq@&폐@4RPj2M^/׿WGGγN UFl 3+fW+*E^Ozf[Baџ ؓ]`8ypRJq*INL"G IACމxp}ЅΎM0NHimqm}֐ `Rr~͜4ueO4bhBt,m۶e ?FaHL#=<w;af0\k^o( i!1`Ҽz ~p@E%E@2vTzpbZ) fo (Z`:=htxJw%zܧs`,?~ XhHMl.+ ud`DӞ=ibE>nL$[ͥ`@& w6K\)#T&ސu$m#̹Cm[Fm6v9s`oا\5rZM7„&f]֣&6L:Ѕ&;.|Uq9f9U<8 o ؘ+bRiE7ҷ$3< ^`0 \OQmڽhv@h]<wr{~It&;*" iDW66K|' ,ȠluAaL#QT#~<:rH[5oFf13Wо|c,5̵_3sځNJKQ B) עûf۶m3m[o!iϑ<ӵn۶=Kʪn!tZr; xSۣy|6 eAl? lAĿꈥI?^zz~9QfcH*@h;noѶP Bo{*s&1leZ Ӊ>hmp@;S*FO5Cg:mTM@GƆ,2h ILAOLFbNY=l.{ٽ^o;u>$&z}h{[N~ymzr eE.x.8TKco|(% f4T4ʞ^n!=! jk*w[ti`Z׻vnÜD Ha D5zikڼf%Qd٨!Z_(f̜J@?GD0B*w-FyBs&ϥnSnW 'mZZ9;0^‹|zqj&.A<blyf`L#w䌤bpOAim4#a僎3SdQR[ H8;lލFyu~#W* #Ti#!zFɬˢhL5#TٽH\.3XZą$'!AR x~:f0zKnZzQT@,ya@aMua]TR*cNhK|~QE&90MNkIVio6Q=:}FƇSwtQ06J_Jo76KɵmMqu~b:* NoWRYFyފ8{m>xD'cF\j*:tՙRsIu%U+PQ3DVϾg@<+G;7+~l۽vׇ FB°ޢn.`ʳ%]f].5,{nO2N8"-08^4vi 5r#!T؁x2i`@‚hµ+RvMm#)TGB01B7R i϶ml6[pg祐/ QөsdⲄl(t% 4%NHekUDrәc)D^}`J;vFIE.AzE5 /q!2`ʞ=n TqI)4Ә:i2M+*E+G:r178eI̞H"F;#ڑ8;w'~{iyn`l<X+˴YSfF Wft3 6~qMG2M4VD +w.rnՕtݳ[[[sI\'mEWL ƂnRGf$I $M/Ҟs/k-jb1mnx`T}^lܹHg(QfѕNq4lUk]+ijCqq[JT28̕M߉4o8U#߰]^}>zhtM,R^3=5uz۱zg$}YKt]k1c 4ؽ'sA`Ȿ˹ #8{Q>;$Կn:=&48 !Rd^AϯX" þLK*)˪:j0y@^RlYBmy^<|޻>w-\t^I J#& oaG괆EHMɐ0!I)I!'? wݖJ7͝lf"LeXY\UCUDQL7xvOOtB2Fx WæQȀp8q<-6+ANJ-U_Ҙeo (NevjZewWwzēk֋[՜9]RvqaQ.fYflYG;v+&J]2͒p4UWx+Pb׬ji\*0lRfS6 ˖]/'/>qe#_zg{0YT5X[я(#0՚1vt:+VkKsIҳEtY$FN{p\i !ro{Y{[rZ7ҁ8uQ<l:6\#nK|5 g:'BHg*1 pl2[5-yF$xk Wg}+G|kmmm]jF`lYfE*cK@ygSjm[kmn/5=zS_|w [az.GpJO~\rX:0r*ޔš$5Ruv}~(>w+Y;~Ǟ}P,<8H b3$'0ru|V"B+f0A%)3QRjzoǚ^5#TWk^׃O{Cd45zIJ,Ắh6^^nZơ~=~tή D`dPNL `H$ [[{Վ#ym[3h7C 2Bl0Nw5~Oywr~|(` `ǵTZ0 0̨L+}y <#(p_!S0$ĵg>ቦA Jmf1NB F5KbIkXRyjNjv5㮟[r| *@f44{`}:N X\Zg8m5I.]IpQŞnaxu?OSwSwyqZ=td`cxĹe)/ ӕ8?(u#zak7H4Qs'w~~fkkaFEkwvzNeJ)qh4viۻƁfg#xvM˯=5HX#!Zw0칐aH,Ɩ^j Z,8ylM?n@Ҁq}=y=\]w.{Z?uk?y˧Y>|` +-^WCo201ciY6]:ˈ [O}VGGI<7 ^vzFFQ4zQp]}t:vh4{_^Ɗ_A؍XC'ztA:y `{,[(v |!G(\qd٤YoTVd1g`X)V X?w|(`%ങg1{I, F U&5}&*Lum}t:Vl6{w잟V5iKRf|.m˵m q\۶m)eX#TƆRpzRHqJ(Bz8&Ş 0mz}nUWIy׃c=Ʈ`INhF /9O&% ] M\9B"c?3rʴf$!-Bx"^Ͽ.B ^6\@Tm0##!L|ٴvn4ͽ=t|OOm}p=n,(:I !N$뻮k~Ҿ9gl 00A0ȀuuApe['{n}wVOSgO*6lS ԌeaV6 IPAo_wz3e q`T7L$˲aF~^jZ{=;]}.t)LnbfLl VvYV#8$=FYy*fVZ($ItL<Ek[/ں'}}{G|{I@,RUF!Yt2F&Vg ?BVU'gᩆ׃~~z IĹH 5j0[! [fYt]t:~4ݞ򛭓|<_yvI7$[:'] 7MG{aXU 0$3рDa&J t잨*0bL &CD/p ,tLo0(ӕ3^o48UFVe/--[;s}1k:fXݏ1qU wRʥly hM;l@5U hRRJk( =A}sTc õ+?oj{wCV`P J'9j@,,=*tS]d .s!Dh*~\|u%~]8{UHc~$P Fz3庙dYlێq-7wN|onp@$o智MF' `Y`ֈPse-zQܴ]K P< S)RI$*- zIy^_9\@G#>Xȏ 3M<x:tu(=e 8;ҷ~!sEQqa~Xj Fz亙eYj٭Vt:KFcG:;y}O~~=(54i<^$R w¥ûfLu uY1B;")6FY(3JDEQa;kdkq|hcƥ;} K &hSDhuL`jw ̓̈L5>'6+~u0 $Qm.Q Dz@ ee۶}t:niaoyWg֐D&.i\+o\w1MF&_W)h4a zCbbgov$5 *qzA0E 0e& 0 fVYaa2\׽KAww_ݳ[mt6iT<3cDH m$a_FW}:.z`0p=j0GdJhfiw:F\u;2lH78SNQD\LsLHyq a^sj3^Z ]c{v>yn3 =1@S.c.uԲh HK`oc`pɨp5#]Qn{N4͖y;l>ߺ/l[aHsV.)PKaܜKd]s@$dJZ{qt#y~?[fmS2 oYJk$84 L+(jFz&S$$NïA=. fRp8aXH(`T)M%4ضMBY/x [2IF73q*:eP [LXd :R&ʚ!cPflh0;4EWyb`4&d\DBtJ&eˇrIv,ˢ9ˬ ޮ0P3SkY$LIkaL9ԟ0?{.~6,BJp2NzHx{JiS8?V<`0xm0\&45eEej0[%Mm~I IWp|ǽopugCB UE?Q46  kCxˀӀh>Jd@CrHH+=Gc @h)4ve,G4Ʌ$/n( аZT%PM2)I{UKAX.Kr\Q7ڠD,.⪏yL9Kcf$P6p8[9te78/_~[/gyÏQs@P1C#6YMRw$8Tp8<zרz-+c6m+.yZuvѪAD3Rl5# 6D tćBMPc! ǰ2`5!RcWk܀2cIC[T.IHm(5b]4He1ISFID{'mBˀy+ Av6)3MfNS"Xɞ IANt*%hY3\Z钸ωO1)KC,yJxZe8m(n:@?}s"Ƙ1Q7Q&\DN^W X^S^|釷S/x1C * Rt4 "){GP'z2 `$nָEZ FzCPz:l%CHzD)5q@J)2p1c8s|>(XB[mAI+l"iYbtn/]zpHrҚX9bN@Rp4A VA+ !t>֠I J43`AViR7X-liJMJr`dek 'h`.Ilp~|ӟ4(&,ȖʀIA$0p85-֍]{:~/w@L/@JF{ n%]!i, K^6(%cp88pmDJ) PH-mv+@R!ۈH"m>ʩ-d !.DEdgg+1tj! dH0qY&U5w905C=$SjK+DjHCacڹGOJ:c9#-ˢ$IºQmSU}i0kI}LYc01AJėow;Lr A@a㙿~N[ ÑTq@4c~Hj%CWafMiA$IPqb*< LD2@n}(OR dpn>J""<74ٚ5u;[~la}3~D@ou_ ~·}¶!M@Wp_S.=3B߿:4yRݼnuz Tֺ=UJWJ)Q%& !0K"͙XϥRQb"`עZ"c]忟1V5̭irhw ʋ-#V%Hd7AWT X)ӂRɐ,6ضFi9^bZ$Ib3(j4kF1-/o:]`7q ہѭv6QMM{`4!Cp!c 1c2uibFɁb_>r7HGG=x&N[F<ϳm[p ۢ7Q%iJHO:TW{ ݞ|iܭ܅)Sar?SW!t11LiZg $A8?Lɤ#By0"4tRi$Ie˲Laص,X=NTLjz)o5uk0'TtFJnh*0H%̀ũ\\iCڃ`_ԿDŽPIk (=8Qݪ='W(L:>  ֭Iڝ$(1jid@z OLQ?}'ֽѲZk " vGĻ^Bdv [qD4% *+P]w}Y3j7`QIU#c>zk zݫpIs^A(MxԝVUI \8*|Gi 0at++I$0+`CuBwyΓo546 xnW]it1;(T^b}΂[$8Kjܔ7Ir;X&#%u?$`h F:-Vv+?׀ sH4n0E {LLtI\@hlȮQ8Fݟ؈g𸕍VAwC;qjvܓj;~FHpWM^Ҩsm\n1&vw/9O"/eէ-v0]?nl0*u?oqsmn݅OJiܴHq!#r !*x9hRUzU޴ UTR甆z@WUzi34q0T~VUzի^wrWNԫ+J@WUzAU`|\ ʮ!ի^=%Re laQdt2;VHW$RS*($ӪZ!ի^WbHT)xܮVHWuo%ҰR9b.ҐjUzի^wjDz8gXjTzի^5"PϱjTzի^s@Jn>2V+zի^ם\XSF`@WU{7i30p* a^zի^+ɰUk ի^WH`3ҕKT5ԫ^Oذ'WSG誦gxnzJ4c?c6`'QU:;?+Xolj4@GAk3@uW>v~GYLՆ@\>'H BWu߂hW {{V_G `47MV^i7^4j zŞFM *-0qQMe3,rs>h4n倹;8jpի^wFl=e dFd~QoH_hE wF0wJ5M:ؔ)7UWu`t;=SYTOCU`DCvwFleMM U^uȰ^;0{ /L`|WoyʎU$ewN lNi2hBV>09k4lffsιy\$IE7 L4e4e33cfqfH)4|\ͶTFRx 8f:sqDĤPJQ$$)%,,vL ݁6s݉|׮b zݧh=633c̸k۶m90u&l6Vnoog4Mi@ LcG4\@?vFJk ݱF߿_4 gffvrckI)EZk%RI)5RJK)֚Z),˴R 4H)iL[}k'nw =*Ui,}v]/m:sqG~ͫo-kS۶۶y^lA$[[[2ePJ;U )Ͽ~De5]YP^%ߥ;V5nBf+qxpfgg'h3浲=JZ+""Uf2*,+RNi)MSZx[4 !C&U ‹S zPT0rG4M4< ۶Ooo}m?=^tE9_,kq F#ގ0(jE~V=9k !0qWBDi3}EDZ=f>/6fҨ*-TJ4M5c]׭iLoʠ`T T7jOtf9˲:ٯƟç\payl\ B,ZAF#PaXI݁O?|?5k ݱȃHmm:ʅ{y!I"•$,\ DQԀ*1ʪ7}m>Xe i\@7Jx)(xeYRE΋v2VUј1%[وﭡT!T7Fm[4Ml]=hI!#~~~T6N<~ߙ /th<c8*83A7A7KHER]ZW6@]4ZgTkVTV@*R BqW5|X涊شjF$ @Qiȱǿ?Jm],kEuWFE 0 G I0Ls:/uPߕM$eI) U+N5w M9#C$#`i(UCeX.J)pG>`18M6#- #W"")eqk~oFPwQ ]kN Q$UUg&̲LeY&(Q4Mu;]xFxѰ;h4f]=jY֩=_9篬2Dfɯx,19RG)t'87X}}a_qeYm/f5 Lźe0=h=8 dY0 U뺑m۾|O$|R"2(sΠ5r4д\ ,aT 95A@ ¦U6 ( h>W=vg08t`}5ZQw9 _km/27]iXEo*u"AqF!!zǡ!kZ-nw!qN؎{ѯ?wn2 Rp` g,AE~CEq+ 8s~9?~͊W,Z,k6M)vI$4.> LwnӧH;)$&dq$IFi+OXS2w{aBsZjp&`h0'l+ s@ԫZѹR*c(_f@ c P #&Bu6J3("p}͖8j ͇?s Gвl2ߕEA&PkW|Ty&,]V*1J+b)@Z4M7c[Zkj4zssSORF5굇CuC%ޖeVe:,z~﫩}a猔:M WCppMy@@V~} u N_^gZͶ훎,zyV0}?IU7=DC((,˲PJߺ?~{tJ x %`y8l9 XPt{}!+ll*XqX6^A3-rpiF(}Mΐg )$C~eXmuGQb%BSp<G0DkRooYd{;M7,#ya]e iR7t]7ZFEQ4ڮ^0 fl۳,ܙg=S:}@JhZ.nj'n4la9 ^RHF9$+5wg~'_]'[Y|Ͳq<[-,T) r4MDZL4RjmiF`Uy`#Q~ie4-i*sD5Eg ҥk 5$HB  iBJl& `DR劑Y q4]mDk_Bs?v:`hXŰ+_xeY8 퍻˿u/Q5T8j"TI>sb :Ǭ'iZhX`)DP!2$dHfX\̰a;sؙo}TzW6/uK-˺iyfs3nٌ|O(J"^ ٕRXidY)/6idž!HFc`4 uC*3)mS~ qX`-5lƐqBKE"U)A'GI",4`@)(Ϛ" fj<//p+fDİMVGx,NiVue=Wk3אe:h7{3MmO:GŅײF8H%!5T#2ܘOsu/.o^ɫa?6faFQ$8aOuc$7*ITJ*%/3!3f7~ʋW3檆Lt8/B;8Ȏ =Z_U(8h"hM28%QX J Vf #%]'fYqU8)I=ҙJe uVlZƜ8xc~_)`aa!nXh- 8sIF/` GxB$<Wo$x'|S.m_egYVV^&lV/BnLY!I4MXJ_*/*c a F74Ai@if"Fy/;{d0B4sse &X^AAqL\6#0zy-Tr L G/\oD0I$"e8׽4%} ɶmxv{lv]!kśggN~Խeݰm{q%uVE]`c&5`qXfYgY(h͇q%ueObPȡ1(x$h(ILuq0 E Z)DU ^'I*K!#hX`qksm׶؅$IW$aA+ `T^$0A0y#gffl6ywҶ?[I Aa: 5{p8a$ ?\z<7/+`Z1`ڌ}?vIPJx}{{K@"JT†H)_n?wͲHo!#0p7c!=nBhl]F} MUG 8)MjO,n\5ZFp\om~(cQHT{10JY%tڭV`88釞fNaj[1h{6Z.Gpm[pX !s(aoqi_n||{׀iqqMSav0 eᶂ0M 4nlx4M)e(+//1Lٜ}0R7YƘQ$ԃ*D&ÈgMEA*M?RzBEEsYy.s-0#xh-_zdno4nlmmI^+z+u4 v$P5Mn7:lٜs]tѧ?ym+[4ECa9x^؝QclkXb |:u/48nnn[[[YEj MRH|Le vZ}fy\ \8N9I2zy+`,*wnဓk!~bpg{t͋u>Zx^1o+㬷ZB1AFQeYnLCŅ^βLfYI)C[ҕ#SLꈱxp@^]|I3"ʏf8z ֧X_hPDTƖ+T<@ Rڊ$T搢QN?LO=W7י˛] R cHUOFm۶Zt:vyٶgf`LQ╁P?py^aa5ĉ#>ĿSxEq_o6[JQE٘YLq$F'n|Y aer~=(heJIBFA2Tg4|Bw/*M _@uu &m*Lc# MHO)Èˡ)n"|8//6^JnwFN 0ͦtv{<Çz_~_6kC+VN2gqZQ^Znq0F\4,Qn1n.8ysOy4G?z+ٺyѶy۶F0vш!8v7X}@Bc'*tYeR+|&~Fܱc`"( dt?V ӱwTT㱾q4P^2>YRa;i`yUed寈;yt𭿂3Hq_ `u0 TJoD5u`4uu:fj<{5s~[W{k$ O!r񼈡,ԥ tT+/ Q/JϨZƜ>an,L1N B7nc{؉#O>o=ƅ!m۞wgq6kuzmVm@ lRH2Zo{DKXGHe 0AQ>IWvlT?T@U *׍ӇzfEZ7A4)#e|`30 ;?|s;/gIqnw'I(I' #E yLkZG=;ek]7D&4<;w[ƛ*BuzQ6k soR]0Jvu<3I0 KpdDAb=4wwf7>Dqɲy\[)8$8)X8Ei܈NjiNPJM]k=lRu&5jy( Z:W]6^ĠY_}M} y/GgZd3#R74  .so zY=& a^QvAq F)өURmZeE41oyjN:h4rѧѯB!4,GFEu,Q>+ ]Enxt#f*bf?)Sc ϛ c21otq1N;¿]wi*7m^r]whlqm  m@VH;"ѨP],˪H|(wFş<)|J"ǎP0%e9\0`r?41Zt cirF({[b:w5/9k- Z]}?8PFޏzNiBuFi6}:vp8<'\(r; `Y,/n*U +}ƈ".Z`o1r6 bYj>Xq[ņPۚCۀG p J 8}w?Weu(EuWS 0LPKݯ@(bC$3/$Ͳ,Rrrck5ar⦌z7u}}?84Mu+ʩ^]UHZvۙiw:CFy=x'n7.FPh<sehBF{+U#ט]QQqF4Ƣj|y%8\;(φqKJ [Npm1_̜X{e~㟼*3$pfEnnGQ1?(}b*A4JecxA.??|7W@ETbD{gOʥ__۾W,\,놔rьذm{۲,lllI!*wDS䑨GB9@20L[%h ֹCx0[W.ߊʙ\*-`w+ 2eLՏ26B(UKu˼k"|D_2}hnai&U iuACѴ0Umu:wff533sjk4gfɯ+ۍ_)lѽ W##8$QI6`\*8\E~U Rz{.yS_E~p 4X[b\w3'>/|!?Q9gʲL4քp"tT*&G*v߈sI)a MG#9Ҩ,X 13X4+ew Fhh+$*+N hԅj2.0A` _D_$m/A,4"u^F}ݭVt:͙v}m~_*`в ñx \^NE z{pK?+9B_- -1}YdBy4* 4R 166c\ogO|3iۛD$i$yiUԀO F4&5NL)M4RJmZ{f7*`D9A`LS  (l02W F(R[yWvjc b2 |}@eov7 MMUB4F'P'#QѾ}Zn{wqslj7W|Py7r,czͯI~c`{"SS[* (T-ַ7%ZT 5$<4r>.6n{x:br' g=Ai*ZI)G!/xGUfӜf e4);e"}a&0bIҠ|0Y1NHrI#^x2$ vע(B!R#Ta7:\W #Qhfff՚k4{ojʱ?yinBEmx̸tlL'M}#L(zWJFgBA"T)sht%b#]3Ʊ`i?qh͛`ѤSdQ4HS)IGRu& c RbzUr7 mJPbAƋcΥ3k$w˼t†ʓ+*.T3_Fߪ>PIt$I"T#B%^ Fnv=l6:_oyOKxUhY ó{ԉ-*jD}sJ1enC=[2T/o4l\6U*ER#+ojJVE?oz-͇fX35װCN E?l8t摔RʲMwZ ':M w#+Գ*.^btnF$ͯK3n GVB{C![\]$Y p# C?$˲Lkh'Tzu:F8O<ҽ4i$PieYkl{Lg+aԷ̢P H @ŌxA (\}**a}=vA-se?ҥwo/ 6AVuD{# ^ 1zg_ 7{ U4FIΜT&38ǞhƥcLp !eY7 :0=˲̌n 0k{kJr4,bpRYG}e#aT4HC^8FL) /K++qiT:m3[9@ zt/H)4]0vqkuAkc'nRJeR^mw‚B ,0oh:Qu̝^1SipyƑDz$Fk>T7(s nӆ[9pPguf9eYW)i,0nZN"#uNftj"L+wV!' -`FI0d-ԑU *idzrE 1{#谢|gJA[әsp&,0aC֡N0 (*UuO>{H;hRb#(˾sD+@i0@= lCZ72 ?LC/x83IVB vs>=y?nk}"cc, 0KӔވIED5u0꺮tNӚ9h8soD"x+6"XzʨLEOYm>zyPSYO EnF}UJR2#z>h7@豳i.iA&qJQ=_Z!4/)VY*3sO.4{M0у/IO.~rA=>U.ߡL]$ 6S_?Kͷ$e9am?55D`cktQjnhs>8ιu-7 mY,`d/驣J.Ƅ#]oӘq>y5V@ިx-% *oO*XүƱvq(] p0F1ҭ䑴ٖLӴKo[_B^]hd(aPZJe_a\K,՗fR:;]|cLq\rc,KDIv],K4 n{N333shp]l~[_~?@Kh,8`xEUUQϜTꩥR =GT3Q_R ' `2h6DaA]A*o `\*xgER&KQmAaVƛt+(]GRJZm7L0ք0ShV?Uwb  Jm;={?B1Sajc%4P(?S> #>F Dr;7333j4͓>o7?/t6 63j:] UQ8H<@Oc,.tUES> ؁g 4v#0BXOXCi( N])7ȡ8X+ΜP<*h00  ]@ŚWSEXA%}Ư#83!ٶ 9>27=`UԀh*6L]׵Zn[3333!q=0w-/^]FYV@8,Er>Cۂӕ*;UQ/g>/ >B4+61 f 0#nV_cs2ZKAl~w |ߎ @Q*(F8bshK7iaD]DBfz0a*N=k"LժhRY%DZtNgٜ<8|/}^Mdi}6$KaY@3)MKq'U 0*n>먂q`λh4!@o`Vtfoaz;Jti`$OB"L7#ixu3PS3fqPbnFJiđ >߫1yυ  J>(#;zqvcBp˲2ρ [h Z-}:T8E4R"ciQN۶?{_[  hpYFĺbS ʔeU%aRl+}#{#Zv^_m'i(V0܎(NDt~hu08eJQ\;kn4= jwW0G eS'JvOT&*G 2,fKW\ιc-i4{6Z@S]ݞm6G<;8Ι졧_`_G}WcʋՍ˺ˆV0 ]C:oF#Q  ]  y^r%yt8nFQvEaeiOD % 8 o:$ZrҬ:i`jф>$QvG`DLLLrPL&y)H0hM)5VW ot^:=ι+p-r,Z,>(*cxJLVxn\/_yytfnQuO:s٧?o?s~?|s[!flk3x"DW=*F* (t^kYq7#]7F4EW`WqjAla$IIf$Lҭ"pn^8!Lpph\a`ᝁQa FT K6R2-ҿxܙWSyCѰ,uDz,k6 KD;7uQ \׵jv{_<1qN۶}s3> ﯃ 36Dz).Bt4V9AeqSҦ1pNjOh%c*5w|?jf<#sIBi/8,Gŏ<{Y *M eԻjpҭʼaT؏! 2T&ab9fE1 3K~wJl <۶]t' 5j Hz~u#t߂hFUUjZfs8qqn|[_r_^Zkp9 'XL"oT*.*)_TJU2ҹ7RƵ[SF#`T0 #9 l p6BIGQfaieVN;':o~o|wӗobs;EGhL,WETD}009x#7Yv#0F}{ FTX\!1kkɓGQ-Aij M)򉞯?v7 BF3%YROLDava{Yy7_?ɥpP%gPDX!!VDY;xG_s;Bm ˲&AVCFf\Qjw]y',:5s_e&x Ljp32sX cD# Ud;ˠ)2ZW|9$oW4R鞬7+567En% 0 #; H;ϟxnƚ}y?R官y|Vj؉(I$"lZx>` 3(؃ kNf"]T᥄3$rWO? ~^ !f,˺8βA0 e$$Cw-ӞѨ\o4Nqvl4B,᧾/eY `1"Ut }NzDP *rFpo4aovʨxgsW$nFAeEz&O'8o\ 1"IA6Gza]J$͠3S &$k0* X~B|:.~{q^=gk&W$8`TZa= չCTFJO Ca4ЃQ %@Sʌ|+AlUBuEeݸD*q iRq2+7V\#vT*OۄQ(H:ʧ(9`8QLfy,^)E#-+;HB#% X[y:'~cߍ]Z - EQen!4qŇ@l6fsu݃meY'}?yk;[x6q6A0*ApxtK0*teEC#}ś+Oٙ0A5T:K@7b(rE$ie-^G?(xTg=q iM##W3LAQ ˋϨ"Y=ciR!! 4.+?Wn]zMq<[o4[aF#HӸ{nz*NI ݪ jZnhzèxXryU&'-ܒ6L8UYb f5!Rmy={t^1o뺫Fclv'iOָ>qi\.Fm &g'!`W#\9da˲N_8o_e.:`sV(Uʩ aU)` XiI0s襟㙓c(J#)e5T1AOΧn<]eE]$[7oT{024S=0ʾ 0*Ni `:hh] +%"h!8R5G i0;+<⟾l,}lYּ8K6͍(0 ( 4qBx/e\鵌ʹhx\QຮhZV<>۶ڶ}Xqܲ}?sz90#)B0pbH۳ kJU%T "FzaF+gf޶ \--Nu7 QSCuj(Me*GAJ)cd#/לX2 en*tɱ0bT)6݊zIۄQqJ^5 pFyHw\*+ [EW lIC iF .}?;[/⿾n^,8ˎ68;N~$IDZLDI)J10B=MsRL . qt="be ˲8VղFl6<ϛq]wֶe,m;'w^xsuj+k{?5L!fk[p#"p`cyhFj0 W(1 SMG2qtz/0Q^K0 A/cGͼE }_/`vݾwG\̲,β,PJmŏTQ7CDA3F4KZU~gԷbI[1x2#S Y ̝A[k"ĩJ<3wy;ˋ7˖e-*]]o6Vk;I ȌIV#y hhMv0HaZaF4 ۶9sвB9z蹯gξ'S]\_Dfpд)֦UtYU,F9p/l ;R9pk%em0{s3%I|9  HJYѸiin:5QRy˝'~d;`*QjBG.c b`V繽7lJTϑ[m8R` (V3P07^%Ƭb8XTQXp\Tp8c'V^ҵm^R&h6ݙ?(8 Qi'8(=bHntݕpbĈyVղ]jڶ=cY֬m-:w_O=cK>y}hࠗ'8qVAjFJrC}r՞#EPpJ+q`Fzȿ^k x=5\ J(L-:讠b]/UҕRtWUUʹFEΈА,B/g GfAp׃ 4-FzD!nBuC z bv5"7Nc)eڦŏ?ya4D;e FY&4\0XW_O>>`a[Uof.|g-¨TLjHhA@y`2@\C  wP9a3.f3p< R*HdeAWݭM4^g3_{Y[>ҕo^,kMkRj3˲2Ȳ,̲,L$I4(Hiڨ'`r8MbWlO#,5MSF\qm西qoi΋a^}EQ0ARoF=;BJ>ׄt Y_Jpc{b4D8 8CBd(VĘ89ww?r7>zuu񍟼.Ѫ8J-ԶR+aeqq,(F*q);!v*\ $c@ڶt!hٶ!f^3grwum5r"&`H&);hWJ*SATizE%!|}&1^uPu}"G&@}}}_};o4 Fj u4_}>@GPRJeY1ɗ7.,X*VJ``@p`К&rM@C^@_6,'i'MgNigL^.+s[@dҸZ2+ t=8m@ a̔oFXH4{O<ϿuBt/״JMSM/Y$Lie1UY8Uڨv#M !8VlYNl۶۶]˲<3\)h !:}>Gz#3sgg6"7oMt 6<X̸osF:,(߄ 4~!1CJ*A4s*#*zJ龃X.K@+~7|܁_qt)nw8#=.o۞P]ƿͻGQ TmY,(`<8Fu<=+czs;χa@;ӦϚW}FL4ꧩ"44H*'n#M7CJNpax,!@4HuSiUeޥ^4}=GF(.gȲb/;Jax.EQ8PQ7Mn=pr?niEя|7S(ZG+RTBD9NJ)@I3+K6!2H,B&`m !8L!x~e9ssn !!s9o2Z6Cy>5wh.oxs) 2 7څ *\yu8*sGXE j+t‰AS~)bR%_t-0ac_X̹7Hax.a$I::mhyG\9 ݅q>]|ٿ{Jg`B H"9#fq30@.>~FwoAv0 و3h͝-yEw F*Bi3'9fDO!=^)E[Cxe!8b` 8Hih[@ 7C\@\kܩϼ;g<.ewjw[ׯWRnQ"" R"J֩:#${RJ&k_֚(2#ʟy?pscܼL!c1-e9ۜs1r=skrΛclf#sg:y䙃OmvC?a~&L` qڌ1s.8s 9wsccFgN9rCOw6:Φae;ËWCt,,д3"ϗM w9DU(`0Ɗ7{3=r|vξ#ǚ~ +J6_H}ir >M57erD4tp5lͪn ڄ027? 4"DWUN)t N^|u87'h;Ap(5ID#< ML~RH:"6am~ o hoE,Hʜ#VyEuWg8k7}?RqRb~=*c- $%3d zƯw FX,<Ĉװ(,nuYqN94GWp3*]^y8.7b Lbw O)bDba)g-4CyMGs8p;MH[kqD_]̲`}`*Z S$ /nX[²fhs?r0sHC* Q؎6 3]&T*I<U 厾3AU^0[)"=0bTDbD}>Mz(Oԟ#*'s$YlĽaDf ~ uxpt؁ƋA\}A$I[N5I q2Rv7G5׌8ܨ獕F6); SW߿n&4GQ E%h]?s/=[Oj$+TR>?Iء!"LYLCc5=WO4l/ l×fd3hXp8ȸiE)$D>lo=u8v 08́8MUN}3Ѯ8xf`sݴ448HF)Fi5`+H?ZA7ʊ p""wO+.'j7X#BYA zڪAP*nUu4{~ m}xġa02Fȝ-(iQ8X)5 /?Wűg(2b_6_j A5E|RJP19'n2Y RЩwC0Li2g2: gP&L'8@lJ<N>u֌NgfMYqu z$˃#;8aPy98"L^͆-jA @)BMJA,Sr$B.4 6o64#NV©3hM.tÐ H:RP޺LHm|:g`̨5PBDFmU Ug UaUQE4T-[*ѣW 0*^9W3%GtOn* K_(S!:H#4nEViۭ͋_n -ő2/.N``w-W^Egu 1ieYj`4TJcHAc y:$pyVwFJވ2?9 8ʋXJ R5qf{(71* 6n\?/ (/1AJ 5˫%Mqz/RLPm%zܨDWFLJs(m9+8D Q;s|jţG*+\s}:])J>'UUged" P?#~i`tm{{{na[QFStn7(HkL.*v,|+G|RFU`z0 Pk#|qͮDvzEHxyәRPsTnlE&o,dGETSbΫۄQuefbK0"iY^T xQ<i"0*aU?7i{<֫۞J;TG Szu.T_^1l+/La T(Zѕg۽89Hh *K+Vi*|G) a~H0S7=0a@UhLk2S遀evm Wthz֋220ڈ(#JhLYWagt'Q†Gҗ޹R&#k^sWϸuf\p7* GI2OD\J8&?z%4r';$= woQ#F @F3XbA4Aq+!͌bB^&ySLB9#Lф D@$a}W* 1 Ɍߥ2]EA rt0hP h˾szS^"UsBC UTkcUmZ=y.x) nF]v[QEiaiJ "ot*I6BՐFhՌU[7Cnjg)!33E0xݿ^pp(ax0 }SY=Xh (eYV9'c9o v5JeysΠ3uaTVd!ˇ᭢N^HOsA2Ҽf1c9D\J*Md|&n84NhP^XtFIv F zʩWN? }]++ ch`m 0*rFi&c&U \/@v8,MHJ+ŋ۳h/nzǖ`y7' _fOjͯa;P)P('͍N;x/JR3'V+$šGq}UCUUQ0T>JSDzXa:*g,W0eUa,9lH6z' }5gARڝM 0qE!4bcj ]e[xɇ}bRް,d_3ίhUSa7Mxĸ_Xn$Q>4]~C3/d3'F/_A}%~aT=L+dF1 Ơ=3ϕP*WTdAԙ 267fl=~oˆ6˪ Xn nj}jO `QT#UCp_ppM*qa5 vA<0+?>KY*rEcڍ8Q #`t`iNU#m<|fv]`hIwǏGeofLS~RRO63d 9Wo>.fOhBU¨!WI(7Re(2p20SFjlJ sP?1gdKM}B0,.]*QŁ2}E44{VU+2*83ޡPN帇"^20 *~Fʇ ;w~78XZ{rKnw# îJ0Tnﻵt(YeR׮]Z;%a1B|.;~%K(J[iӘq IUzꉱj"ӳT ۙrq)=_`0ʪӺ2ϩzS硑pk\J*60 xN )A EZiW|W~oÔ{Fn蕈2" z%OƉ#^ -EQPTQy#o~VH1GJzox:HY97W=?Fa>Aa>ADU4T&"}.H7 >q>>ʙsp %SRZwFn3EȁQ@RA%`20E339%Pvʐ%]1}eEl*EE9+a&+ tU* ӽ*`F UQQ9!GmBE v1>ʥ}NX ~k33f[A\+*s[Lq!A}`t?iFhb*H`Ƶ!1󑶔Rk'_N n$I!ѣ qF7@fju$%GHU; m P,͹THi V)"(UcB8sL9zUt ^984Yy!<1vSu\#hLh<*Gկa^aa2WL #\{z]qU(EŰ||W{FfP7^mʺPwg8_} 8ͤtvѤFBTHƱ!Ȳl[Jl\}D_ve֏89$I)e6pPLSz9jwVi)M*:kj-W*l[6(ʻ}'ꉭV0^Y3P|,+*2\G}[9)@l `SjߛF\ 誂@RSF=u1>J?jC~X.nXU=OD&`s1F` ꞇcu7xKY\ |JƸ/TQG;/ߣ T{L4Nt˶%v}7K$I(YEYd>ꝍ31@E5|eY %Z'KGY%_%< 6 OF}1bRyyϝWQ* =m^%4AWlDhRCoAʻ: T eSL*g@)Z ܲ 5X0PM7RY\J\G<(029|dv#!V~8n];x( c- T)lSӫo~)IlA*v22I!M{KT(4 (e-u|y`vN9M@pPJt`4&(SYW>wEYxչ3 {JXJwtgzἲ4֞Gw m SFf_哂42v( z6Cty`L@-J7 rv F6S4'ѽ0`Ct_F=QgRH TXxkF211W[PK?JܙًFap# V ,z@`)n4&"#0?Hw 4MdP$IPm)\iR:2JDQZ| j!4 , /;rTJ%Mgtvбw:*,.Y70yU*fFU *|n~t3mPxc^g#4s5?13*V4*$+A vsC. z | \uy1+gƋCS{Sn;Rka!tLn*ۂ>0~UHvxz&8BrιֺtL(<&h&*gļX8)(c"WʔRR*i*=ވ7/Χsc[ ʕR^h0GcaގC0ֳ*Lׯʿ93a:3 } RAv;hȤT69#䔆eJFTCx v8^`af] L: B;o?2FG0\004Q_Ѧ&W4&H+@۠PbJL)5)3q`0=!/D;sJ&DTIRT)(#zܡ虏Ձm:.T%r= 'O[bƫJV9"JBּ$SRv~ 0hss "F䌆*Fcp 98`Ox 4wg{)\X4VbFR*A[N׷5%R0px ciD1k88R%)%(i)RfRD)7 G b JtT>`479k#{p)BL~la;1uL,]0 Tzeu@+fW/Fb! ʫ-+_CGN&5ߏ0\`84MS2D*f?金29H4&6n >N;)ܦ$4V)BY@IJ7 5⍛9qIV]_AzOhk^+sKFjS*'_7#9#B_^7t%Gႆv@}Sb`?L""cmiֻЋ?>{|}n] > V 0H$6]抦q^FZ 那Ҟ)0A!;کjnԩ+〩k"Tt˂,<%ip R0ARfb03Me2k=jSeEUQO:1d`QoQ=x FakyJA ycfTMşCl)oޘ;t$Invb+anaqd\&4N F{,!=#6hh'%2 ]gXUQH45 zQ%W,b)eI}./l}va9G*!SfL2]{Fb:4ޱ縀ou,|h@~Ta4 \!9az%_Xssg!-30 ׂ 7/3;hèͰH O:lvhDa6Srq\FQ;@ibb(aeq Ju{~?zzb<9||"ԽrpT} \s-4uhhçqI} [><^K,O.2'ujhDO=z8r!I(0\ p3"?@Hʹmxїkc!@ڛ*ix-iz=`9 JB4+ReQeA!K/,flDރ)Ryo3/H oӕv00b_PnE?<)(Y^5ѣGOɼaAEQɲ,+ک{'sT=SFߕ %pwNuҸʿ~/RE̲LfYidY7ܞsӍQ_~*<|> D&uF52zV?eow)z _㐵}crA/FQlTv,FTiZ_Ѥ|&+?-M*=!Uv{)l7 Jl̡0>Jxcl(Džz'(<%IfFgYi6ͮeO{͵kks8 [ OQ {D!J߂^yJC/9A$ A-EQj(+}EQD]cuk &NqzLhWpG|/MnEjQ=gƊ'Y'rUTad[ʨ3*F:˾JTyljC"[R2plHTSqSP攔 %iFiin517]9+7=4}dss)ScҠ(F5dw_Ȳc0 +\c'ޗYz.qEz)&AhRON@F/#=*UHS(ѧn $F(%J<-̒|IIFcu~ƹK>z$;xܛ4(`Q ™ 0OoeC7W_xS>VN?w=0 m\78˲DlBHn+Q4/b4"(MNwk>%{hBnĘ0VJi"*h4M$I$I4MƦe;7:.;ЌA/yeްh F>sA ]Yv"#9@.lAΝq,U@i&iṝƁh}?Cʈ (JQ%k ugw*R67z$ U]&8F;LZRF-)B-m7-xFx|i'OX|kNzGstR 50a[U홊Ay'3P&k8|\Ih9({.ɲ,5N E}ӜЬ?LW:5n{pQ M ;svS‰*c>j&i$IFykt鈛[^_ss}  P"]ti5jQ+Bt\z,x1Pxjƻtozȥۼ$v,GQ%IUʸw[1瞳sV5 !=BGkF5^ ^ۭkY"ol)t#lӇ/NIno'Iaq7,LϨ4*vntץC5B0wQ^Sn(S"HxYqqhBxFcuî8ןqͣ8xc0@|  sgJs+5[ R\n[1g qC/ ;=\>~j)M IV8ތxTͅI$i&Dj L:)47*P5Z0!r+NYi(~Bo7*1<'Qr$ yL+G\wh+[X}ba#\s`9lBz4PX F eGXB#^C[݌N[ m(;Wݚ*\--Jx մ]WW psRn)˲Lk=Id$U۽He$Ƙg;??>} s{]R}.h)(eӍܾ$#QEv3T)M/݋9IyO&KkmYE M mPDԴq;jvxCRɁ\/$|T_&eKȨ~" {WkRl cLb$IZ(=0=Lx|w')r}hg ?q  y@H(΅# s\7Aa+gkduj| 6(ӭw2Ģ\q!b^"B)8 @7߀ }I{Iu'"st4vZ;b).:rk+۵hMڴ* qCUN5B 1 gv(ъ$iYR")8^-eY)RTJiI$Zw1]c\PJ@5U_z3O >9!"E " ׿ШB_ V'#\}h9¬jV8+k뒸N=B^?O!(hS<wyBK_ 0r=9;t''gsn⽟̦sn,&R@Y,9_nuR)QӴC%]域'y?dL?Cf2*A59kZgI)l6SQNc$hKWkSJR)'Ǫ/!=?>>x4I.:H?q ?^V-N9 @Ph\,<*fJ2 ʼnٕR `!E]Q T]T(Y TJ|~P$@Ȁ3 g@s?sbh;BjZ*<$.ٱn_vY8mUB1ͤRJJ)RJE9u2QNFJّR&QR}ՕRvI79 z'6t@v z#H{ ;@$ 򒅘 jd%%EɦAF(!7$P6 SB6.(Cld7I7P(B> !d!t6R}潟9(s.$FBm$"z幕oڥAV'-%;9rɮiobZwj^/ {ZDD)"0QVZ)eʋ2JFJ v$B#HrG]쏳|;ٹ7#V# S!f(!z⢐z0g@>H^SɧvdS !B7+#/fF˩i79^\6eY!<;r}%d%:m$ j!6$5+}͓N%!6Ƈ|PBbIZULU9Չj#"((QN"RXFJFFJ4#Z#FHDTB*wԝY;@<|x3*IQ($@ @ȌVx N/#"BXmCȝdYp12rƠe\aM66%/1wkovILT#)&M-Q NFFJ"89F )%T&DyZFa(&#EWVeT|(DYEJ)(7M*mei-YgQRVXZ*7?+̉IT=OJk_@07K@$%y( mr,"+n)R4bsP&cm םi#uRz9İViy%-K !Z<~DH>kWFJ*!*am+ji#(1DXB,"~ijWf[#$!5}6`dZ8 fZV IYV[)m#MtBj#m6ٴ%9!oᷳȦ&M&&?6<6hn9)m&&5F-Oc'$~A5py|v4QĻH&ᴑ[Bb/9 Y5-魓S"uכ^$fݥlTN$64g%İ&rjby& mn3!ߔBbV&o#{M ۈiZVRj|XB yTmL$RVN&&Qm,F@,!9àDP04MAM^gBj;7R!M9bsg崋K|u$mgW1 oso4=AHj[~}&m%bXH{/UMZ3dyn!Ŷc1,$i(]M%&݁oSFC$,00H[HpsxERMð5 DEЬ{W tbcüi[J@[D,0PVۈ.a<0 s'0 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$aa!1 0,$ayK1HIENDB`desmume-0.9.9/src/cocoa/images/Icon_ArrowDown_420x420.png0000644000175000017500000014466512140261562023464 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxgeWv 9<H T%THNֈF\HꞞ^VY3hzĒm苮XްXH]sΞ{uEHV"&f3gΜ9svM3gΜ9 9s̙3gHΜ9sə3gΜ9s@r̙3gHΜ9s̙3gΜ9s@r̙3g9s̙3gΜ9s̙3g9s̙3$gΜ9s̙3gΜ9 9s̙3$gΜ9sə3gΜ9 9s̙3gHΜ9sə3gΜ9s@r̙3gHΜ9s̙3gΜ9s@r̙3g9s̙3gΜ9s̙3g9s̙3$gΜ9s̙3gΜ9 9s̙3$gΜ9sə3gΜ9s@r̙3gHΜ9s̙3gΜ9e'@DSpF^ngWtux#usSx *gCrMZ<!9 9s&NSHuvə[Dt o_vwv-Nv}tNԧ>SU|}%^YEqȬ&gHΜ!6~S .|pə Bv+VyFu!S9wԧ>EJ9۽ -}l@m/Ɂə3g7FB+Ը}ya( D$0B=o"`|x?1lvLdē$MKszҋϞQJM֛Z-ԦzC)fǓp8h64fTP[rPڣCWGlJ?{~A}'y)~!q'};>pߡL3fP& LSl%L5@֜?w Aa) e$=p^]Kgߎ7R0/q16t>'I!fd9{J3X3434&(B[;>;1/Ggya~W跿9ƫZ7|?0 /z~5L$f|>W0" 2 yK{-dwk~TH~/GQ0Afa}G|C{=Ovf85x0MP=I&QHA} b@A0!AD`b((R@ RfZCC}?A̶tJ5oi2-0 x z? n{~ĝsHyQ1^_:KeVP,G$<@3C'#*ehO0R<"k' ͈F̌ѷxG~S'[/z7yV=# S  e2=@2I -Hn?zϿO_M"ODe6ehXQJFCrhU:dzFGas#>/[3s-`КABd:&DFl%-״3'1%~RK@yAp `)0U*\8<ʼnA ~/`'"g+Ej=zJyI. TəkԦ+`4}H߿+ |wsDg: 2Iaduh0ewIL}`,cOJ0S )`+U8Kl=h_|ڼ,Z3j伤]hQPt@rjaw  a`0|y<xv#6 YSB'ot ̖-.r<#鎿7suFDeД'{~w_ fJ)VJA)3 5(u:n5E$J>t׽^3p8-󔜗xyHΜ]{5Th4z 8yģӔLQʰ'DE7]?0 )]M`Ts0.ƹb=^0Y7 3 #}l;;g/z$IfQ6]M&\-Zv>nEs@rv3NlF~Q|'=#Pi&b Zk35@;bPp]yfSҍZ=.Nm~YL˿u *8MH-c=׾$h4$QQ aڤK5d^p=J. Co4~AOc4P|˧jM T (m}g~uoRwgP?~ŜLW/]8*{CCGT^Ӛ,RIyz; 8: ~jZWZsCrxG^0 姞`Wi%kЅAT3qYC&n^^F *c;FRL&2)X8 p◾Xʟ Bz|8)t3#6}XgήDۂR^Ga}G{x7SμKYO/}PUn-8UU7.yҎt!"mĵb\{]\0B\Zyęg^wi0Liqj .$o9 9s,\"C~zcywޏCoD kAkfPWuF\~sq-tRަuW5O*O憺tc6‰xs0I^ H᩷pv`rCUbmFeqA!*FTSZ1oC=ɢ Q "շ~l9fټ&Ĩ,f\$a28I~}a0!TrtOyp캅" à|_m2 Cy]S&\?T] elv+rIw]xQk%\ʵmo1l`|tfP*볧Q]'0O4Nz}̦`a7Nգ@7˴ժəAi[a}ߗ|z6:z;1g:֦*[d]vt0,"n aTšڻ)NvszS5)zyeŲԪOZ4 ϞΞcw;}rAR*4 n* c]sUgΖ/<-'0 {獤hm&EؠD?m~T u59Y-}W݊|VzGB g3ȟ֖ΌlZx!yuh #c=? }_*RPW9Q!;e9ZO3#r(\@ju֪9U7-`pꮘcUK UO"$#3 5RrNZ.L@vț)gozρX,~v.lN}YN9u-AC O7L+c`k÷gn S1^Tt!枘YzNZBxdlj˷ÖSXŖǖ{Hy>[6c''1m9H4ǚ 9a "96"C&{B'O0.Cf:5~sQ" 5WS?JZ^kCE7<`A7dbpUi#$2sf8zR W$/yHΜ-]#Z!B=;Ma4^LzC"=Ժu&gQ6!I)=!GD~x>D13$r9w BmfX0nZ`+k6Z/߷ET]}] U:.ÇhtnɩU՟>a8bS"$"y^FL747HΜFB4a<2JtTs٩)7\1IRyF ~ HsmTusT695W9I{=$" "O!W$Q8(0!!9sS7ByDj@).6OC-U.Z(@]3:ZËsVM۹#ڪy4n3tSM׀838GX[t^ҍQyHΜ]-WjGÍF{nO/<;gTM[7ٞn QoST\wdn5mPOq%OTɩ^dJXLp}Uamښَ@DK@D?`b *rH\MWS@@@膑 VϨEn?. b݊>t aDF7x3#Ϭ F伣]py$g7+1sր_ǫsCFutyh pmuS"+uQ=hYhi?Uю?/8kƭ9S$Z7CQ\ mƬ[|WjٸuWQ57㶜Q%Ux3mW Utw.qSU^u Ъ#'B9aGsOf e;}BWӄOEeZ]R茮Stow&)`!(5l[95X&Dyp@rn l˭]Af}u 5[6hjjȎƮX9Ϩk}m~SM9pəyD "6Nmځ ܔDmEP% "ڃ2ڀ\h>3g H+݀@[s] lٸztKjW^̭!A]sZCnlwzSӵ*kp]Kg; $SCrZB:[Vcj}]]2+u04/u`h#g\;4i "*R`plډb叮7U?$gήƖm"H9n;5J%jnڕ tgč0] @mm[Mh5adlPj!a~w|ةv3gc; SA}u#a-nn[3jt;*+N\}ׇF2S12ə sڭ m@Vpe\yWxF-~S铷7tmtj ArQu|3Qv!;gήWod{:*2%v0jwwYh`5UxN t ZZ (Jet5Ƕ8əo%G\+ ]4tt`hk*·n?]&ߟ͡Cgdj ʆNF;X d9~Vg󽳍ZZ!P<ہQ=cyF]*kVG-/V :rA.ַlHPakd})1h}[JsFma|ۮ jE7]Y!^Ckx>v"ɼ\'v58t>@4e=*{:0蚚v@]pkeuFFu0wQU-g܂]!ezK&6icxl5Ձ[3޼ ]ŴsSJChkvlxHə}DZYi8ބrFMSk)zROD/P3jZޛ-&٪s\xy|$gή`P0-R9KG tKX.tu4kVc)` bpءFu^lYV@Mtt`eD7]Mg\ *63vh8s;9e耜a/ۙ!em8%s5][;^4ɣ[污EM- ^ --m!oy {R.DhMٵQi2kOs9~Y7ک6I˺mzF+Z_nN/I׽+0^`TE}E孞ۙ``Q.\q*Z|MC&9#XgT3ꠥpw{ TCrܞ3A:svc$ӊZ z[TΨ'^S!&uyF$lMU;YT_< aBHΜ]WZ{< 5vtx'1huo:^)nlJ$zRL+2/5;Q^3ŷ$gJJ#3ރWEK6\6|r=|WoKy)d΋%PҞ; : 9}MB:t\] 5eRliZ'-gdM&߯?5<# c E< IE~HvZәvbvwռN5] 9#xFm猰"gԚl4<2G.dnjH; 9svMG\k:0jqZ7-PkmQ'u GVdY3HknOܔ!9svWY O@ŪQjp#w{F]ᴮZ%#$ڊ^w3BVth+%Sa[Er@r֚ 06^R|[ pZt-jhpL^rF E%[2wV fSs#3g7hIiʨvVuxVu13*~¥֖ Ms. oR8"%N 1bfL F\?[~<2m8ZTs^3Z"ܓ/Kə# llknP׆G5[iW'N:0TY/._-tH;ioG?S8 9ۥFZ!zEᠥ)i<hv`Ή0t؆h W#gTbuޛDDu4\W7J]3ZhUV3ҭWmF:LWɨ]rLzp@r 2k3.P|;zamD @-w50bl?gd{]iY sz#-#guhPp HhQo0چF]10Ff (M;˓3gחH:RWFӭlԚ'mu`h{rg=&?ZLDQyPN԰׌(8:sv[:KkX6ϨuT9t-Bfr5̀Q~q0'i5"s}lp@r솜yHl!|퀸 5R5Ъ.z0C:Nc'(P=E>:Q3g7dE O[;HDMW&zXS̶bE&in9H:48ə#ڈj0Bevo7LWJט;ˆX1Yϑg&ƒl[Bv{Qr@r캮2+<ǀAq$[3F0u #p`Qy)l+b:\ϛSBS$aOcu!;g4/][$L@]MW.Vˆx9#I4Fm&@N!݊+Z_]{+@dS6 @9~v%0+0Dc6M+Fw tN7x uxk q@?݀@X֡LaPaWmOMaڽ l#Z](F  ٭ЍXKAu]a~; 9ȯ5CW0B$Vk. F;QhL'1|.ۇQT Մ-pz+X~VyQWatu۷ ;ĜyFv:FH\ Xc#qeJds՛ivo!QқDtW[3nPEDX&m F0a& qZ^˕銧+SwavsFkKaD]ӎa^K@"m. 0d$ H0[^ZYhn1O;^5QH^= vBjT_X@@DK.jbE-%duٛ1wxF{FT 4W%Kf3];{ȼpҾA5G-U?u(1U'.hcQ~01*+d͕AG{FyF:eL1K^KM'!曾NW&w U0[FoZ mD۹ؗ~>y'0AH!A =B""Bq,K֜VJ$I8cENT'I ;TN0LP%ta;¨KڝI,)B7F_zꐖh[}zRRl[R̜- ҋB$ItDZ6a%X:|]iۧ>ƶo$á }RB)ADvYJkjSTiq$IEQX,tjX% kQ\fF4HwxF7 F g $paOcaϔJ́p:,4eyaz^f7kP4k6ffCTJ(RR련[:~ֵpȚo9Vo @4dzy=!DOJQOQ3 /03+)3'Z똙JXkHt$I$"x>G"i Nm`;`Z Ya EI f(wdنW DXz`0CcG$Hiؖ!nD&.,:;ђڞho9Xa#MuMQ]AgD$|3`sv ~Azkp,!D4$"{ zf7/K "fy1D)5Idx<^ufbHij umZOߊ7)vlI`0á? ~yR5)>"'\;#9}#z{#)兞@.ag^[^x+JMfpo$IEd4fl:&,NkY X-]W(1*&|nv,_+itcK`5^({Fk:vpa`8{ B| !։h}|wwb|cၣp/0-r UOf<ڈf̧L.]|ۯ.~7֗ 0kq3I$I6t>/b6`R+h7h; :!mAx<~0 p<б{yq$C*Lƹ8fiVl5e&bÇ GXбj K♯ ZJJ a^hc:Nlkk+&x;RJ׼( cI0zG#q1|̅\uuy/(.p0l-ּLzŁp?@Z-7d1A0`}?1!o;ȇ>𩷿(' //>lH3<|hH"fhLPaT3&sKSXǾZ?Sbܗw>_u}?$Ap_zl6܌)mcAl J%D%`߬:~J`tZ"t+` e _تk!fV{ ~- <鷽{}'zgxQv0Cj*NB Zj M b$"ֈbb5{`;>qz6^|}N$. ^r,nZkC%n!6a9{4֘lHo6摐Yh4֠04v`௭x8s}p}~-O^WKH#P=}BГ%c ϓHkP X5l0]F.)&z!ѱ~ɿڟ|K3J)_uR׻< $L&|> v|8ԧ>c(9hۋh p<0 ApRʓo}=|1ǫ3'Kx\y wnpFmFV{Fͬh9n>[3HJ@5*oS {-/M?h'<ϻm Ox}_-|㕳NRP=dD)$ "sbeD UIH" ,R4I0j?քg@ja+ SL164Kp Ͼcwiyo?G}1m)~)k r+-%M#*4ǣp 

WF3/YBJc,}BA'/FwN஫A`HHd2#$B F$0dI14"j8?<yrߣ:~6|τkRH)y'}ߟI)l$Ib/Q/9m焼}Ig|ӴߛH!ЯFi!6BcFk+D׮SC5a0z,Fw}vwmG66)B&@%x$4&Ϡ@q1_}I1[$ :Kk>~;?~xv})~ƞ)b*L(Rp@{hۋ`mmm}8z'|?}]oh_/5| gFOR''="y~YAJ!k $B&q9ֈ #9u<ϻ B,&IRgкB]+}Z325 W#V$|n3OKaĨawMFawkێph4Mhz|߿s~[֋쟽2UKB_}_K2 KAfS+aԼL' FJBgPZhlDq< 6B䡏>pm 9s_6!DE[[[l6CPwڽ %M#{!^!`p$ ;01<RFklY0фiqzk+=7KC!D_Jx'hCJI/_4Ui^ 13 qQ<^-?xA&-𖄒ajHWF_[[`pGw|?~p2> 4fF$VKt-` ӵ-BeF* LHaD÷sN(J;Ro yŊ;6"Aުqa-&[QVStȮݒTݶ3 2=`<۷>➇|Ϗ»| lnFБš/ =+YtBtin0Z@eQKT';DXiN44M6UkCިZFh8atsyo#$e(ɬ("*Cth)r )*l{q ~ u -R\Ojb ƥD RjݏL~Oogi0'M(%,3(YgnV -|&oFZ3&1fQӡ uJY'hmm-1N>{??z5>KObBa-X /2 Af}RыƥK$\m0\w>f>x(zL?M`&hBLᘦ؜DGwW Ad@:^}F{K ??3+0C =|w< rT!NhH0Gj`Tt5jYgGgZqX^$nR1椖?"*|9apIĵf''O^&y^ke5oӀVHBjaXd :f V HM~$o\O>{?a&]@֗ P!LEGVf.;,4.A\z(Iv@._e١pǞۿw/,0I5DOHd BV_$F h-|hªdg/B =֗$]@B4a0w[OuBĂRgYzY.uuӸ0R+FgO]l} zѝaǃ?׿q4iΔt1%z~"T 1Sl/awMV@sY;}}Sgᑂ2oIPCi 46g 4?leǵKISJT&[ r)8JnuFFQ0@?obK(UCzD)d.|epyMCj0bnff[Lf \\DYg=F8StbY(} L7U O?>Tiڬ(ulb$`[5bbʛFE, <ĝmUP]]M߷oZFo{;~g/E c0 DV >h`0S3*)nsKR Y\"#{\%}F%12#)zw#/n̉:Z+VJt:kR=U:Qp ^`}$9tb. IRzе l[x~zLuoJh.A(".aĨa,gzi 0gCJ\4Su?TlO)ߚFIm+DIuHmM4Sűj;~a͐ulfăW=Aہ>wy(`D/a~BeE ->$b 2qb ")9{Jl>IHήg8n-@qf{,~4MR*"U'e;!]?8*zƣh< 0]?S靺G87WHTYiIa:tK`.le/xKl} p~،]3w!y/~yY06Ci`iDcO?OrPbjWGY$BoRծ/<.fAɊ ##> x=}_yĉH5FKw!^„2/:A|MS#E.YdiG*wFg zLgq$=;[ޚw~J$I8tiʵݲQ1Z}1-; {1 C0 Fс^w<S=' ^[(AP>Jr:*._,1|{-0E~Q]N 0X#5E;_~zYFet3V]n`Fukڈ t0*":N+T; t %<6~W׻{;/K <`z@(E62)[Oi@IAeÈUWb-s.#`Bڝ(xYazCsߥC=E ML1&BO}1z'I%I&IR:e]W_P]8#A%DωŅ^ozԧ7R[`$IEQDZN8!]_H^`08maw;~o>yF͙N50 ^t_jH]ml.BG\ pcՈ4rJԨ $TRy<;`<*5E _ \>x6y=7R[I8^,lBwG-]%5w)zh4[|?ĝ?a(qÓ'@u83,ʘU!. J;'ZElPtVL;r(R64$= F#w=iR_hCDZBURu$zk3c[q.}%x:Lr(uyIc+O08t9i\Mοa.|o A>{UKw#9~_z=_xy?N b"(KT f.tCV8 UCkvF!eNZM`> 7Xoc1sVfb6''x30E'g7~=K~s88RН ]CQ`u~/|Gƻ6_X@ ue'v@ElʙHt|S,q( ;pZ9 4tmT񚸀퍊p bga ]R^(v5'Wc!YSjYJESf3f:FFɹVHe[&[ӵgR" Co4z'X|MTC2"80埫vӹx?2AіԻj4*:oYbd{F}ݓ#2KAH*>S:|oz~mks04 &l6:Bu]a<xG$!Dz N|} Nݿc*[वⲋsoDWj:n=қ*zЭr+r!+!ù09% t)y0 @+~'~j;CIo#lWa(0ָ QC)-5I`dw *%:ݚ7) ea^zYʲ-"QԜI)xF}uF=}񯟍ŗ^,LMQM[o#`̺,6ra俓{Bf]W<#ŝ-(F*^R~WCvmT`]JpB+Edl|z^ zlXDI%QҞ{x 2A[}yX(kb&zb3"RH[ hH/qUĠ4EC2הoFNodŸ,l/9$4mw{?O5f2s<򎊗*E6O@ OPTLbLfItQQzS d=_PA_xHVG;e8q1~~_Cbf20چy$!eqP/4.l,5-uw.׷ Fw5GVRf9'߫\;GB @h4;z}=}G~mz#_yyV &鉠L |++44Pҕ-B{X(_ZÈ`dE#p8 Cd=[P:N5esExz^a!nv-Rʣ]LBXi+IJ"_l,p7R`K-i#ʜ 񊜆 5EwUP.{e~g~dYKc64m4Lpa.<5<!̿K"-+RpT:OXJaEJR O്#0 `KJ)өR̀zBJ)zyw}͸ U/JʺampTbKMmr/J+kPPGwVɋjT>pnhm"jE]?ab{OBƒQy(J*_ҒI&NNOǞ+$y̬RlyH"z ,1@ڪlj{)J*n٭jjMY=8*]*/!2H@RB( x0rn+!kkk3w}~[o$˯N lDPףP ~H+ugY١lw2oފ"{ڙ6 a Wf,/pV$$&{=c;yz^w}7В (-'0 |H)פ<ĉ͘1PLbc:ېuФQ?s]YQqV~Т́sD+d6aEdAfkgX.͓dR2VPe75Bc 1/~ۙAZo0""6@DA ؼ.~ۀn)f.;43Wgѱ˥M׊hra204g[<$!y,uvp4y%:֥׬28(+q@*lH*p;LM,oIee:gn4:W#F(K`?IPb?޻ϋy(^bH y@mQC 2x G}+ NyJ7 Un:[F[BxTt%ghy߹ꛚɛ֤L+IYcс-O C9pK~^zC64ȚA2{ri ,;N'~?,6; H4ob,E'sڀQ(vKll'*ݬ3FT돬DFEfE#aB-t*2Q>qy4w?ԏ̣:/$%6O:, T%Dצ+= uu8_ePܜk֢&(?:dVpʦfS j)S+ 4 ll Nby#aRʸ ] JAxC)ڡǞ8=Oٌ Wyu%50GTD!˭O5(*˴ '"mUKlFލ"&LH%QZ!G[Gbx"g ӇM%c'NOǞ14HY.SAH'*6XM\G7ڈw.} @ XRbИim''~#?wRk$&"Tۙ< OP`U}z}_TFԼBz/|Խվ3 Qsq7sq}}}h4:1 N=|K/l"85ш4,/)RףUkTa' 99,O47 \hSٽUT^!tհ5nQUkQ-@ NḬRxHh,af3 q9<)eO1 {FTVt;MB|֭qYUmߪmF\Q7%QlxnM]D "P&%|ڒls9m(S:TZ0$ $%JsyI)`.yzv %|!͵(ڌ22 rC;TEy-u $`Ib\^.uN Q@:yFQ0FcOOϕ0tW0*NVȂwJY9+WJ3՝H[HF3T+S'P'@n2IÍvMR,Հ9L@F}w/y}?B,Н !`d$p&nH"Lhī'N%;M#kwsA;~(4ώ H:BGR ñ۟{bW&H"=Ok$UE\SB-&Y2!By;7BAΈF +`TO'S/j3@-'`(a#!4G"ya !y"RiDNYV)E\tt}+:p/2| &DY4fBDyꌠ.!U)wWjv_lYdJei35#q E@ ;苬I!H*۫!;H)% "(XuW¨ J5P5$PBp;dK^jH&@hm p7f{^s;B~yp"%D$ÞX4$#0WJ#w}{pSKyHN3-}g{(Ls)ܲTPH.PL5ld*KI~džY?yai(ɮAx!KWxL]uF;L`T=,OL\xh ӡ:mUè ͒#aoftϤ5!9 ,IfzP86`ĝ@sFzEhցag0 ٩.Fp+B#L [t{aZ) dm *tǫ06gi)Gvny**<ZEG/ϯ*B"Èh]|-.yj+#n@Y3g<-QL\ݕV-QJ=#b7\93Rl yf91fL~yRx.,"UpL\{MΚ"M5DۇIM)ma*cABAYI4MԚ6 ĚqiC갿|X^^^KTpe JY!JLc0ksClUO r~^tL4͚z[-JAnrF8npÈRDK#F+\wSBx{ey1fc*ZBMPh0zpv*)+| $fs6c$r)Pƛ0)ո4IAʜMe3DfSSV'g{ "y|xFmqzȖv-|rF) E@PYj{J]تUr0*G;eB/nw5JaZk6'̩O,`•7 xhB{F֘uaE1(vqcyf{tsC\QqSμ[lgO9'#Zګ0*$0 TSV1 &^d`0s\|c>`u-*B X mM5|\g62`L._s.Yr%GE2mɋ[=#;wd%P^sx=相/JPΧ#It*y|PZbfzhF&aLF P[ss RҾgNTi2s^zcKz&VnG6Wwx9U0jx-2eS)e,¤wG7"L˹<\X\xIFla%K nvZϨ JPЭqDI{mԑE4TRf~q1--yj` $(JjRiʸH]+IH;$IIQK=  (ey+|Saļzq\5Ra['Q :(y.o%eTH ֥O[#t䌸޲10][ ^}#Ym\+oDt%.ϙϬJI$aKMI .;;ʀ:N^KZ:2knҶZJHkH^@%Z|jvk##7F--܎2*b.VJ;.[1*d5,ygBm{#T V1,`dQ Z;sc]zw&䅊nV-I0]mݑ0nwPP !TL,Ⱥ/`)3ϕR$I4Mo٪Ѻ4IiZ$o|g.o ¨6?]OiޞWuuzݙʆUN֌EOR\@Ď8[KhQ#Ŗۖ|.]0tuqTW4jnרT<}z$mj2KUdYbdJwU~_y^Ln@hg0L )QxzkCuA)5KtiR+tˎnb6Bv:ԜZz-(eMTMwE0< #XuuX9Ofȟ57I)_D lIW~ eoܐvn9\0QsfxT}TM)*PۓkrFE[(z>HHp2K`tiFICm掜t`*<4MUǑ9l%BA4tj4K=\ܯY:^5$s:rȜnن y{QmG7`TڕΨ5P+dk: ݮːhm5iU3`=L2 uYܶg4F("Iw!vW |X-(iǗ4}?<~4FզmF=am0j{y4ҸI$1+)̀Vv3-Nզb"IX=>uVo'ZW/ ][{*LǍ BV^aL]v|6>.?w+ YA!O< ccV$(Z,(ZU{v+~*}~pE5PL"X&/|Gzkq_hX,"KРhU]#]|XlFQt1|;~ ϥRd#*jazaTnAsFrF]0RFc.vGnm-phf}f5GNh jxFE'i68猚0 ka- b{*`r/5^<#.:O kV(ψ2( 7^;?M|E$xGe\%rp!r O)FQiE(:޿rJBA%Y[}A!n#gt50oMFjQQEUY;{Q㽳=:kmohmV6/U *7L+hY%'<#uYa]^iۃڸquWP+ZUuq)_F0uQaU~ _pR (:EbXja;i'ovb(P^^IĴaE' v bc50X Ur~˨Fi F64U%fX-_{*N V|}*&rTEC=y{:Lǭ4|FE--k姊{p=$V(YgOׁg#W8>X,.fI%$^?r6ސUa; @'Ih>o-L㗒$NfKA]sqjv*a+5Z`T^m-xY;Ykku~lݧV΃Uj:{Q&jKhd֫ad{?+6j$%0*#H_,N<$/DQtn>_Z,(b+\V.d$c*xN4evyXL^:H F|5!]soJ46a|\_OVP뮜`ڛfc7te\%LkLSaꛯ;(snLoyqNNznzi q[660YHH 7`\tsQ6ltW$iv#=W.f[|>|y!% A;mrKrF7 Ffֵy*3aTdZ񚀡+ᶸn+ZԎq܅BʶzUB[\?i9 OTܶcq#Z(T]_Vxy=_QQ0}mo$q|>?;/MY$yG 9tKRqK4Wޯ|>NSRSž0ҭ  #^#ث0tڌ @61څTG+?.p6w뚞 ^JR"a#_t{0B17cPnZp6>8պh䡺=~{qp(_[,f t3";+tGiE|i;:`wl:N/Ko<÷[IеQ~DwطtEnqt-CCHQ"V%aT/\k%BްXt:<'}wyk48I^NsX`] 8rFFޯb])ϣ`pèk;e v9Izɞ`# Qg_-~m7J1^NFޕTGiE7TH]!;m}^ ݩbRnyw^J !z 1"L]69ٮdMxbjk9z h)AzFFF=y> Tt+-^8^Ng'l6 Q;X-fp'M^YZSX,[[[B@Qp}/OpE}F+6#{׌$A.è`80H<~'t:}i26L.NӉ\*=./*$Il6R^BH!7~;?Oٷ{?:fJgz`v9lF}6Oa:Mh(E)ӋH_z ?wfًdd2ٜ4MsuAi]խa7M%6T5if3!D$Hμ$WsGq; o*)Qμ F20,,A9]1՘99]k !. H / }l㡻b1n2d2Z,QIK͑QW]i{I` wv>I%I L3/_U:KSk(4tmc#$4`4_X,R##=3  /on<|ׁ[,N&WmmmmXo H9J{%dGT[5/ Db DD`f1>"§ŹǞ~u_@:\KeۅAΨ FQb>Kgbd:_ž7r_gߞL&/mnnL&,H)σժ:'jA؎нK3l()5ȁ"4G XI: Tgta' өў/u^`4[>{[孭FĐ(nQ*DBv \G@aT*O<#_|ý.(M5h/%/=St:}ykk֥t:(60KBu ۫=ڵnw@S(MS, sq^XљY~\i0RZckW ## #ӅGak9N/onnu%!.ݮ^]%!Q)UltygpmO??~JxHUI0bӞYnFFFF0j:f @~_þ׷rg ^ܴ=2vZ8v u ꗅkr(%|gëұ/=OgPJ_iuQ}^&[qu6Z899,Hxq髿^(Z̿=L^2a%gО7j8i t:*c<%,YSzyg >P Ztˁu7FI4FFF{!L'@ \<*0=l6193JxHjyCN}Z!U]= JyGi;%DЩYxFh>KW##]#["'Q .f-KtfX!NtU<&+|μxgCN  ˹0"<ݥ0Kћ3"sY.:orF0N8m Vv[C ^OR5O -jҬz1vZ`ZYf]!Dc6Iv;MD^{0L8n0;VzI'S5I0!;3KrJcxgw )LpUxbLn%m,L @,ggQ.4N,- +1'?뽤=! ݡ%t*jUP:O,~w4w"0buܕr0r0r0Ea:u_2gjhUN=UwCv꡻PS:zމSBn$_ ][f⫃v}匤Wv`;RXkw'k*]n#|G7YN38=Pp. C ro;+?R$v0r0r00e F]9U5G+FCq@pe9%zJ_|gC|?>J58ɋgy{ck0 "1 FFW FFRf] F/~zv:|on *$PUquP38֧Ap_$egU0|4јM##Mw!` ww~J{^ˉ;\z\_ ZiƋb>L6lmm}G73/hm$AxAϨ0Қ1$8###I=?k37FU9hO{H𔀪4vlHIЊqW3j9k TN_899Fa_:0̿k<=!η]+>|#:Ng@AZM"Q'| Mn;F>8h_)H0%<%Zeʻk)38֧"%dI*рlRj(H999]WҾ*z<匊ׯ_ R[CZ)/|W> Zś`!Q< b} fnq8<#ߌ"13J- uzu3"5M0w0r0Z]iNg¨"`(h{tSg +^<u,NA4Gћ FG^ց!e#ַ~}K{HS:gzPbph=y#Z>FFo.IӁ / BJ$ )$Qp=ZX#uhUܟԟB;2IeDPnڍ4l{^d-hW-]1:BPHeDlYhΡW䍤 |gm]@QF'-MW,v@k9ȬH=|[rUHjGQF'+2ڑlS02 0f'#B!QJ$%=Cy_8d@]E͵tGFA[ Z܅2bQ9)%SK H+,1u"+(ONo:kP˨B"3$Wl F6>L"(㔦KL%$j4ݮ$B) TqE~F G| xhnPW v@஽ۗџ(" )$B)u\Ԉ1:PDMd$:kcdTރz;M2:$? g-]#J\Owp4J1w)B mD)^pYyJ*#/s_sSFZFfgQտj:h4I!JiGJˊ. Y2`xH1謉퀪؛2z;FHR[J_oB]!דu!=2$$#R@l:yH_Sҟ#fbhVX餮K,cA=u :PJL]RmFd&AD:PFM6 e;bK.`$]|_F (YQ2J C))pHK. ZV|):K8eezxR(:)$B)=v/e1[(lDF$͠!#Y۱PJO(%6iyS`-$Ibi7]繹D(i+lꓨRFO/M'MALR`ʎPJO."1u)et2V\PJ"WxFuS0 Oed$uI (!% PJ)]6(edm*8v7S($B)\?k)H5(_A)#p=h,^M7et,sΎBfCJi+,kzm:uHIk= fn3 ̺GMRC㜑lmBwct//z+vMPJVe Rԏ1e*_ʿ& Mթ;DCk!C}߸yU[[[7FOPF3!J0"%)[JY7ΜV`Vx/iџ<Ώ!n|5@.kgqݢn_fv^3Ѹ21DfIJ#%c61d+O/KN .FJNkF@ЃxFno,# `-Z ; K/AY\V~vι2xE lxR9h)3oE!v{Zk1ؗo[S|.v% (Ibz2MaDڻ|fyy>vu]}^7+Ef#}rPR!1+n~<( ޟ$|$.zÿjF1JٔѨp 鏑hCki\ry}~n7yi[EQtX7b5q <-) ^'H EQH$B@JU/ЉPCeoU.]zCHFnA ?$$6KކXO.>g_<:oyv;ιj@FӤ(Oٙ+DȁH/%BA)i$|i(r~,Bc$WpdHF`e4=Z  Js^EQ (5=q_=|>jn_7|Q9&(<\EӒҮ$D}=M42RCUh[7z_mXW)qŻ:;۾(tHFz\}4x ?OhȻqm,lL5I 6A}wgƋ>onZn/`(2Pah1}rR>8}-zm-ܫ?z ԛYMZu~_s*u 6ESFC߱SS!0tLBr+>}76_ܧ+yh۷vteYѤ]25 LrR})1!*UU眯puZkͷ{_}sDHZ9&@EÀXhvN)h\4sbY=;#$U_zoڽvNyn7n O^4,#PF$~2aQKi05nefђ9ZsOݪjB9]~Wk{?,BQTp.v0$?6}w`w5unWUMbwh 폑.Yy?uv<vP5ݸͯp2 #'97^ ؁km$Ih4مY}ϛ 76ڭjtX`͙7`g`,4 e[Q4?$H- 9I=PVMKvg׾Uz;FͻnrD%]":"ګ2"HAckmih4R\m6kFt8e[9^3^}YzbQLDI  ^v6)$ v֗b Tb,-ͯ\BI;d=~m},ey(^wnvݭ^-(#B!2AH%a!a1%IdYȲlaaaal.7,4]Ot==/rgɊOVY9Y|f< fAw:+y>i:c#_B] FغDhڽ닛זn/7WU9,ˍ,EїP^E,ˢ*iF:.PFB"d7/ QFB"d e$Si0 h 8 bz[؝R qaJLQFdf1YƜȱlj5+v߯&/_&}l?=ě2"!N.&E~ōFh$Rr#^CD32"!O&I0yeTIhcc׸Kp!?&2Lòorto6::7Ԛ Y7ͺïmNzҨq&IhX#eo0aQeGUCף$d}i0)eb'B"dRJ&iT$c1iZ)PDLQeD($B@JDK`d +*0Hڏ&&B" NFK{dL3ijTtR)~rDSFhT4u]/TȰ0FBc+ PH H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FVIDATxidu?k-=XH a2TlP tHvc).A$&% EjL3h/c)$jq3Iq"eˀLwWVVUfw{{7*?D22ks=G BȢ BD!PHB($B!B"B!B!! B!PHBD!B"B($B!!B!B! BD!PHB($B!B"B!B!! B!PHBD!B"B($B!!B!B! B!PHBD!B"B($B!!B!B! BD!PHB($B!B"B!B!! B!PHBD!B"B($B!!B!B! BD!PHB($B!B"B!B!! B"B!B!! B!PH~y^_vO_hr_{@@($BYHw݊궿?0#y B"dOB}v"2B/Y]fn[~ǻc - B"D( V"8J i@ʊ[YYq>`w)R"dRɁM!í"&YYYuw)WEQUhdѨL&0w{J!=Jdmٳg'Nz^UeOѨݭԪXۭ4}>#b\y 33"0UL @|Ͼ/D^%pɢSNVUuz5o;vTU̬ݝ'yRJi~YbHEf0'@÷=$hGપ*N}?U{U3Uu-3pL&v|ois)-ZH!H&C!"1!Eɔfpy ZN߲\ψə3gm3$RH)-/toZNF[C!+!fV;E x ֪4=QU~@}&%K)-u#dIm_FJiǩ3sJVttgO#H Q0qs3to#($BQB#!'!r\znJw7] w.`wwn|MN)- +CTi>S!)M:$G13=}v=5kgO=<R0RB(4RrEIK"!,%Et4`zT6 jmwz?sn(-Ji}BY Iu"!͍R%%~2T"(P WCsz{''xbD)-{EF0;هhns€ʅtajL=sJ(%%!D &]n!,n\@)-G345LQH쟄}*B=թñMqY'@tV%.d#3zuJi.W#B8œB"4)Ml`6#sI6>ݸ21hxyM8œB"ޤ#{wm.V|‚bgJ2C@麿c3|O7(Ig0do0_Z n'qb -HתO3}|hW׾E(\eD/QHFtkgpl&ooV^v xjY,:,Mg!=+"PPH쳔k e]kEI7KfR_7|J?O)}k(iAùB!*;J! I#m4kRB04WUO=)yJQ QnjWbp> GKřp*}-%'(x*N`X[~?=i9dc%jXeG!rQ!Ū7uSqKsJ}[^ QJypJ06MgA f($B6u!y {B8intd7\x> %kG7?( 64'0UQH,.݈Zj1~v 웗&p1d}w(E\Y(n檰,SǗB"dh?FHڀʒ¿Ur!Mج/9^]}n ~R:t' oLCCUEŪo .RW$LL (8 ABɭ+$,s8U.'0jeaOi=C}|(dDȢl{ĀJX mͅYyV'JakkG7ܟSJ^{m/, aU)8B"dZ"6-ɚJ2ࢌN8AX [E+k# tos2IX@!HԺU]} %guW EvZ>d\) N=#pmT@)xd.^\HhɑhD!E ]dQ3Ib 'ҾK|)E\pO"Tm` J){b7U vCY!;F73Xi (a]9\ D:9S $c/azmL1^Z=woC?A)P$ ulJ$ Z)[I}m.^\@k#tixXRZ έURJ K,N h;|w DȂ4'EI(sMQRR2nC+.I8))iJ( ㅻaӀskյ{?G)o!2썰PH,袹+T T ڮW~岽p)ԕSz$9 3T*95İi 9oTTaY*;k^(y"HC {KؔX{F^3UREꂔT MV*}˻7s?|g}#VFJ!iO5j+lIE `ⳅ‰ԃ\+6aX9Z|?^4k`5ͶNB3@Y$hx洡,,11q}#N(;CkcZ5.8FCb=V_f4ôP;/WPH, oUuyvEݜg]g5 bmo;iMÙ$^K|2q)0JӫFWSDDfW5cD! giJRFIe aȷ* ;Ɲg}\KdWZHݙ/rhkg֫wޯ2}7Eja=X!QH,ZF"[ i&w1j$ajNR ITc4Uu &(_ALF"SQ{]vmFJ@(` t)M6}D"ZΉbGF(Hcww*V$I#+@bVJE!g0h V ͉j]1}-%6)vBCU($B"&a:62MiوI'B.HcC7'3L鏋w"4>ά$>PƎQpw$Wjݔi8kM:K3YXktd3fwKNq"leP*xH]|%0w 9X!Z 7İzj?)Y<LSΖw%!6e4ɦt6{4Ocq1*4O[sAQ9M̻>~X)Z,X!a.MmWMU]v6zݟR otyIF]SCB!$t3RU-x[N:,MERPI}`eu.|^I0'Ahxv}eݧR2#˶1B ' E\4{ X+=#e)4մ0X7A6#Cc|fUnL?Jc*VIJ];,Tk'JCk`3T?Fs'5r& tPH,*B5.5#5j2jwu7-uޓ0N,٥=ߙwp8-87lVC+'OT'~ƙG~ $%(B"dR0`Z8OF龆e) Q$.Vӥ*:6D)='*p-'´YHx#)M06A;aAQ 6͠=wl?էI5͕); [)rd=(&e_{H eCü$ c^}&^cSXϤQ\ؚԀ7)u_ qجrLOλ6N )PLY..Ȋǐ($B.\մ7|dd3Ѵ*dY<ƙsLmx'Miժ;Q)* #+P ۵AE!ܬ3z 3G[Jibgb%vB"dgJtwSt mtS›R,Yl w1R¦#v[``h8$^e,3pF Vnl7{o8~HKn8$NJ;n"QH,Hja&R8a-ӵB"Тg^=ʨG]оW/Й> ?`;#- \Ye el/O*ؠ/7c6Vo) O!NH!å$f{=$#шo b3oL5NS}ٔy ]ǒnrtvY(#)0~0lJ<ݓmgR[8E݇ȐPHRtt@զ(-tqAb>y :sĔp԰T&h_I1+cgVkB3V`Q & nLRVRӵ&`7ŶCh#s1ERn!zҶܥû s='*ccpT[7K)4>5d EY[]}2:tvB-]Jj'xZ ƍnkiSCR¶q$%14/k+V @kF ;8oX^Z)I.HSXB"daQD8Vۓ̦C(hjfYD4B.e6w쌚V튝it$zuqG4|nE: )ew2ыpA+L[ X1i7gzgR_>I7}B"dqR*gWw2JO'ݘt_!vkڕx m_C; ʾ<2BfS t7M䄃8`0RG pdϯ唒)Cͷg226PH,,Btɵ?ߛ ,c @\Xa#Za^qÀՓzo9w~/]Z)M(=a["QH,G0oPoBu2θֶbt##>biw{Ω+x蚬Z[`uf)i+T-%EsJhžT1s4 ׊s7o=;B"%iPavq6y> (,F/$[^]sY76}vEfݞQ)dHgtVUNHYIJ÷R; =p 6Fq9`̉~CK)e+ɩRH,H"qj## td3)2T ]q3="&"XֱA&,=&_x 80nVI$V\dߗCWPC8 U]9A3npQɞ~[Ο-\Jz7uEfQF=$ EK)v|шƊhdd0<&tYǺ(Ev&)ivkO`*}3I@(C[hPk%S>V8g(}W3=}am𵢮 7k9ջ7~~RJC2DȂ#F-*M_24; oS);odd!(]V=1\6^pwm/kB#i}|SH,I.! tCۦW'wKi^&,1"xV?){ %|H Uz&BxNIj*C7uK-S2'8aT {J ukc==s$%ՐsbYt.Dܵ Zg=enw6,b&ZJQxĮ]Cukj[ CPWŗ\H[W"^`ka^7`Tﹿx8R.E4u탰7DBQ}Ѩ4x}Q>]fJ9-(ţ8!Ȩ|RBm*KC(pI8D .g'N lM.p.ldOϿ?]>x)YJgA_H! U=4יuYFEoGKyk;]0Vbˠ8LwOs^t)@3Ѥ4Vau\/{p=W`^!N`# EK)Hp6+n֨|'>7hyj\.ݪ(}>AIٜ. k;}pCp!7l&RzCXksH!Qvngo2ްSc-0Ok!UXVmS?h^J ?miv}R_%%,VuCɼ"ZfTqo&>LUVz={Ͽ~OWr:ymg{Ԟ! b6$2mxhdi:ԛ!X'"SҀ?i:NN1zJ]EKԏ' ;C(=P0l0sk\WVOusО_'o=kK2Y)~vY9j;RL[ ##H6ֲk^ 'tjb*<4h Ht<24iuӺ- %UX 5 7\x?pů{/d~R !ThRymcQ'T`qexn IRHwbj/6.$ĹSkV)0o=c\+_|?xReOYd.1Zln75zd$&CT62j7`;ݨ{z_0!$N-s:`[k ͨu3*{8@)yY'h$ FGq ڠA֍)82j29[ Y;";ȩ+K{Fk~f;9meFFPn]՞}s+J}5X%0԰ƣ=6k3_ҟځIiW ~R9|\L)mMlnݢnvdex|EV-73LO1.F1ƉǐSSw>.h=+CJXI(ߞ0MpYٟIG)8_rT03<;V GYsc"=ִZZg m^ aTA}ukHv2^*zpt8g[C.v'^]e%_uXYYyٳgWΜ9sɓUYB"ϥKضKGaD2Qk$2 boQ5}~!fԇqE|($0NF$Ң9'~΅ ~)8sUq7`qW}7D#&:2[`Ԏ`u#$$!н!CG40 w&mC:7D <*a89+ t8i<&x~W翆#$rIKE|ftw3LEF5a #z1J1ѓ}6\D6 iBLB^n|瞃*^'a僪F/ #%B!#m#ty HF b{(.zء=<",UI|BiZ i)شUBzMŴI8|;eTo T9WZQ#Ҟ՗~!}c.`aB1ĶCI66Cs{tSwaUOmbK!GP>./ћn vEsJd{\1{W__q`RPH/"1EVc(#d%)8M>=I\4]ypֺy!<ũ`¥)Mx 9U Rƣlu]ywwe"'%db($BCFҕ!`/d45\g" @,)’)5p{FAx%Jʒ~Um(O9ƹ~H}&Qz󱱳($B6e'.-1ӋQ$m26}n yCVHGR`4.x $HpIRaS*~]*/y*_YL<|6iջuquR9R(% RLE9FFv'l_-Uڡ37X eEDb4j]#W_{vmˣeok<<n4X_?ӻq%OVJ"bO=%d<]w') C(lN|ض jN4/TSA@jوT\ld$ɢ5wRjY.ḂX~}X?ٻK qIDAddM2($B/Jʨ=YJmAO1vk1Ѧ(LLIm'\^AD+4k np]~Do@Dlgg'U%%QD!Ņ9@r(OX6rѼISvyZdm-iLl. QM HB[ΓQz'4(pM/~/[K)FLmk%RvD>nYe-) ,ʲJҾm5]Ro;QilW佡M,{b5zq( ?ww^M$,gdF@;B"`v֤Ms}&#ˤKV"%1$˵&1e˸XJӥ;g˨m]U7\e?jWwnõX;]zW}<:݌0G<D>( ,vm{FaN?_#,Qкg$6#85r&2S ]zFcJw7_-/sNEĶ5+($B'cg Xagd4$MM }˿62B7 4tGKn Kua.d=ȣ7X sU{x"QaOa{}Q51htҗ}S_WZz~90>ܙI!!G22hFFN?_sS .k:֛M#o:2B<(*) '<f~p+r{L } ze勿ae\1O/> sfbR@LrRLũqJ;ei]`e 4#4OK|9S\nfncB"BP2p*etddAVW.]~lگzѓ>]xP 1o5);BYH)㠷&1BQFeƌ <6/ѕ;d292bʎB" y5>F:PFGFj\BdD>7HhmqQ*`@E tk_W綷 綶vvvvxBHB"d2vLRFGwHH`1]_z k^yJi>pxe0\ݝL&׻E!Bb$)PFG>M'X|OPW>%?yr8^znkkk8QFv P<!!ű>,eted"5 ^q ?Tۣh2Lj;6)QV!W et *0\X+qO ëp8FI]^mdw C!rPFB7~zƞQ׫¡W|'wvں2 ޞldD :H1F)HR|QW[}r{{IFx\u DwHQP! i< @&Jv@B9#1(>^??v:asۣh4M.#nB#[#!IXgۮ֮Ѳw`V׫^" Ck`0x6Hv !!`>Ck6J0BB/UaϨ!DȂ#I\0)6PFқA (v_X?%JY3G:urL9BFu+Єðf3 ݮ,ÕǗ7]KiEU YXBZ!}$\h*_]FMg: B"d0QF4鵄_T퀦 R|R(Y\uWJݕp=T K(BC %+Xp9ZARM<#Q*Ѳ(Fsg1Eҕ;FH,U,  2`,e4_FEYQN/]\nhg7! |reސє \xZ៾|~+֓ZMI)EIq$0gG!tb@XǗSFӽ\֛NgX~ikh#"Ĕ! DP]P썑^Jŀ^) ͕!Oxetm9Cͣpp]XgG! ] \VSFe}xBW[neRRE2ݲ%E LМ19DMU&A qӏ.dg ]dtS:!QH,DDMJ?giNBÕ GWFHul3QF!BX~*`(P]U^_~te4!iםaj(7($B8B5-W Eg\>*@QVAEF QhL< R'q`Q9:(ոw$KFR!zwQdvKDb$)ViId\HSjg?sFFfMLqzM=+aʎtM ]i-5H{H! CR6' J] =  ^F m_RoIXeG!ZNjRPH%c/#G]Cz猐($B% } *Ha=~t|.2ؽ D!⎯ ݽy+ &#nm;vP,RU$ eHi丸H\du`-JFv2jTC]*`h~9XR˾J׹NbŕQM D,DFh/_\e(!\aDB$ CN84JE(`p!M/eei:bDbDb$LmxEQQI\\~KuQ($B%ezمyt;2+JE7J]LFtNљ2JYl%gS;t$GHH& ͕M2i(fd$E ! R }QQ!ӓ^"0<8eʨ0yuE|OY@!0H}\Ў(]8*勔Mc;EF' #vp+`0Ua82~o)&B!TLs5ȨmZ*XQh(uye4)Y7|<9tro1B"dRc[p(;gd" W/B0etfk:A!QZ((9(+*PU.Dql0B(UߑcSveqh:;XA➑t^daÆGM]4ݾs!sEz=L!oڮ{#$B!0ssAt`)/롾̙fѬ[DȂ} !ثB5[Vr8>5nmm=GRt$+lh_ ao %H`M3= pqx9t`xeS2 noooQF^h(?Y[}/(K4\h!RLD!p-'TMed"a>wB-ۛގH%|i($B .$!^ #ЫR ed|ov\C*GOXHHnw'gT@U:pcdlT?;^&DF7$Tӥz0y4Wbo~@mmm=C S~c?cSvd"iAbiȨ(h.=|]ȯԁX/)DaID,wt.zEY"xңk^O  k!ɨm/;($BQ8̋[M54%<#tyk^G1Mp8|fss3hD)ɭeE($BAB29'sH?\??,r8J 舊) /.($B]V򔝙5a1rU`+C.__sXpp8`0xn88FF etT%ŗB"dyb2ܢA\5Xp/ԯyT?tٞ8FFet%ڳIB"d$'&(&5oF(|W%j12F2:b22Э]Sv)J"!,6BJ2ԋ{FB.E4w!eDDȝ*|u#[ 2"B"M{Bv*ew'!ReDror`]{MrCT4q"G! y n#(# PH>ҝv;2"D(= h/mba PH>ҭidl#}( nD($B!LH-DS!N8w{r PH>^PHB"xSRB"DP&D!PHB($B!B"B!B!! B!PHBD!B"B($B!!B!B! BD!PHB($ BD!PHB($B!B"B!B!! B!PHBD!B"B($B!!B!B! BD!PHB($B!B"B!B!! B!PHBD!B"B($B!!B!B! B!PHBD!B"B($B!!B!BYj}RKIENDB`desmume-0.9.9/src/cocoa/images/Icon_ShowHUD_420x420.png0000644000175000017500000013530212140261562023007 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx˳l˷}cUk}}~\K֕@L 9 x4R6MwЀoMB-0c9K m${{U͙93gΜUv}^+lj:vլo]tPݴR]tu-~: =Hwu^X7^=@ }y.]\mUkks (uҥ˭YWAixэ`kK.~ktZ{W`o9ѕ>խKHq^(u}뚥եK60jxix5 f-u+KiYE:{D @{50DtR.]FY pZzU됚0 3DDJJ.]|G "3&"Kj\$xe&?MSt ѫט@?'޼yx8 pt~ -)AR.J+&y߿~_W@e%u@n#xO?}aGDo<`C-ԥwϴ IU{?Wι߈;~N^6Gw^cRCyz1axw?SCf~KD VCٵ$]di ;P%:;sPl;kH~q|{8~t<Od vbChaOsQ|1tZ#^~W:<na|+߯i?*:wAX"ޫ >\EزAņn,ך -Yo]jyO7٣i|L t{ʓoV g g] >k?V@$~vbE g!./<v8'tejww:+80<2O3}U| Oa0`/ <8# m[/ەZqqŪt Qrq/ո`hrDTi XhS_ m[3Q/ӧkl" 8Uwá tA|O VAruhf~kL`e[{"t*k$y_9ޕ6/" '^9(8W|9K6'_3~o/L> ïq3{VhUufAh`40 0p PZY_'o#A̗emܤfi=l z'm5[%L 6|_layb]+@lF/^ʌi0MZeb 91-FQXtw!L =l5+VsjWdm ǩ,* t5ؘ U' 0'PJzv=́|?kH%FϤhh;[ da譡+W7OoAښt غ{mn? {Un-ClMvA~b1?Ru yOWmuwknVAݱ>K+h;u;?R<ՅV0p@` g(NAZ!=с$ꭶ$ Izwmw jz"IKb<*2˨/x[Il]ɻ^v{uՃ4b:Wu}-+H]G Zս{;׾Nq~bizǦ*\ũtopL`b-kv"ؽO 00a M1c)4(EDga2@"U%(#6F k9Eu@[ӿu4Qtx6#f卉eL wt9uKRsM}q>XT-d.KRֻ} [ M f VJw%OC9>gK {ψ^fŬXLB6N5%(őgɞ8? ⳚEU%$Z,J5,\p#E;OUEσP)x{@.y MOeDl{To]7Y*wݱJ]֭/nm}^[[,SX_hj^Wm֝-##3F6:Q'0b`W[D (="{Zc`TK\ꕴTJfԋj3B^Hi@-n71 p6!ڿg~k,$]eT%m5K'B5~ݻbGi*$ݜnϹ]Q՚Qc<*]_Vdvغu= ,"HLǓ} 0'DD) 8k0#8F&8& VK dQ&w:K5f*PFr ,y纘"W TRˬ uxM/kr芕n^S0 ČSBŚ,Xh,k.8 FǣUU(hmkb{|Ef`+y^ !+/eYܛ;Ϩa9-B ͊q5*x'n"(L{,(#'))^ჹ< vL U)/Z5v,Wvm 2v@b}Fv!r.TXF iS ]pM`X+Ӻl 0S3U{{0+B[,Ta->3my7zaq(o5ۢȖx9VvR_fptAQHth/-,Su#KxpKu2 kk<ۉJߧ\c?pTJE)Vm!T"-x*:NPr)1mLd)D"4Uj H:=ŐPxj$IHL1ŗ9>#^#h.2T)'#%ACX2=t,X" sd$FxRYҘTQZa*܁1XBjlB}&R&cD.M33K5,)Y|" 祑 >Sb*pVYDRmP*l^#1->#"zY3:k1+yn-"dU'N9и{b֦)t G5QU}+Uezm])bMvwQ:ʕE Ӌs乊6-^4V*8-OS;Ev˘3eCSbJF&#8dG{(zC\6&Ԛɺf1(QV9 Q:x.PlL1-[Tv-J՜< (WY' Zm[sF'8i2"l8TkNUͱPTRq="EP#}YpJJ@0fLr BvR*#rb6~S)_sJaՋu lP!A A( >x||RΠ$tvR]Jjv3ʁ¦xxdEH_o_}߈a5[cӭ]'r^jp]l\ +?g'V w͒}IIhv#n8 cy驘u_ؿ-_zjW4 N9FqG/1s{1QsQz4imKkU!}GA"w]+-dsgI"A o/n ӯ_l.W˷]4/a<ݠ}˶3+<$qOIE@B%ݴKSom.sbu% +1 xGN|~_'sh]l{6فK&\bp<?;GOOy=jܑؑ4JsVw4L\vK' jRԼ*Ait_|G޽~ % `ԥW>,{L qybYNJ/-|]`xɃsm'À,ČqIK*GFYPy>?{o>_NAN] 5(M =<<<p{ p/"eJB H{* L!/",EU@H]]bn]: B-juoF)WK貫#iӦIl,]|qCJ\_Wqqӭ+d$ G0-T ΆdI^(]p(Pҥ(5IJL ɼ,BRj"..Nݷ'1~'޲8L-@øK22lK.Z-V0TQS3IK4Y酤]S7_P JU:Nkue@)\ئL ZPv׉~Vk\l.}H'҄\b!ZI >tF6`p=1StI᲋ * Xt1ܥs:fK+EvKn9ur;(Tm^jBlAA֖K =+-HѲnK; Hfj̣zVT%e2uǕB̳`9sIJhURl1UJb; UBOh37taR0 4#@D: 1ss¤}nZW=7^\D{JYytI[+MA>7o͛7ap[MR B-@`嵃R H8>L޿?^|>{Oi&@ILȃ֮*IKӴ.>|ۀɠvśh)@Xn33y}駇}{oq|d܈DL-ٳty԰P\,"yDD<]:2'9œ5*4t@`IR7}Z"biA1qQ*qݛ7oo߾͛7xxa~0 !a Q.ظzU}B|C|4MSi_s|88],u ŻՑHAC_xun]g%h0~kѴ\|<x|xoOo$GUucʖnFU.,*zoU~/o&7{n*3>6Kߥ-NRu??8[LǗkQ?nH[CTk@3? O~3;Eå^{&80@ FDR>QL~Bi Lt'lz%0p1VYH ιp8<_4 fZP'sEҝzrb5.-'$iY,W|תXDcVסm@zčdFpz5|gՁࢧ|U4^' Yظ*r?vUI _=179tQ ~y N?7;#qe!m8D#q`y3a138Bԩ: (ƺ7ZU*G` Ab9wd1cTG8,iAӼ QZ,vq:u#/qHkD hkb9߅L2I{mT&4Um yqnVlѳ/]J % jy- 'Ed97IAL %]ŎsK'J.I ۷nty" kFJ9x {,hR`&J@iC?Ѩ [FKbT(Nι08~21˓/?>|'TTew9ѩK(82N|PʔBY*1ZJe̎Gf~tzO "qbʀ@{E+}NK[IhdҢJa:ء%XS6E7Z4$#e2UH+Ƞa l%\V1UInN(؀ "+(-   Wgx1EVV޺9#/ϥtF޵dՒ]>}mlQ5x<2L#1n Li̺n"ŭhʁCdCgDxUhs]a1* ~@;R W`JZLߓ.:23M hq,E_,1iqirb^Wr1b|fZ R@ 9gz֮դ<,~FZ`@+P{,R~7ET*4ڵ^t3 (YYҢPZ 8M_!JS*,;rqHhs'hR:Sl'a5T]: UX ִH3/eWD${M 6UI;YrD72 =]$ 49ѝA(Z}.ĔTd/+`DW-އnk; nyr1ߢ_I/-nj_U[Ko>h#'uHbs9lAOA>YcIQ * ͟ߗHw̵mZK Y N)Cl2$ Uebn^J:,\>D#[tbJ?-u{K@ VULZiYz>p5 @6)2).0(HEv i;`hX+O[B2jVUWAҜv_>onY= + %Ȝ҅XtR*M*]"M,{I^nƑi.q\쿅 Ab)bM0'8%TO&ŘD~(lqܤ(Ȍ'F51<br"Y2;T_"kbbY#'&W09ӄAHb\jevG-Ω()犓3r̾V^ ~U%Ѭ +4)T$7- iGS !a"nLLI ^ 6  B'Yj; khtĠoTĬҠ !¬ 1H-Y%|X)h}[d.cIi̹v[6T*luyS)R]vIV؈⹐,aY?44*<ĶF kbY-Lbmpb11}e`!Qh1FK “zdD:QGਘL΃ ,x({\cXJf A&=88d "*{heQ;VA~Z3]!a .n:"3 R-NMRZVt$h$O~MZt64Q&-צt8*mNvXS lJk.xɚ{2wfHQ+Sڜ{i Z-y(/&_LD x#qcp`f(UfО%`5?5hdJPZ{S4}+.B!m7$ǽws<,RǛ2R朷D0m%??ßdDDTU),,R7faI|mg(^{`MN0"fƿ[W#eX508;\RKić?_iX {NC{%(u$mdvn cw5ڒ 8+R HsgL)6Ow<4M?9G–feً-Yz]"j>YwC&fs:|{'Sd 2t ࠓ$bg9sL.[E-jNd<[ =٦Q9˳2|twt,0H H;]6;Nt:,f߬;<<<|͛7g"w~q.9ИF Db,** *tc0fQsGWwu@z!+).^Q# chhsnD3}j0% /g_~寧i:Qr%Pϻvʇ'yG # t` &X~͆5`%t 1VWpٙՓ: ȴ [b <)XvH-'dIcBމ0,JQ,I=Eiw/󧧧SD dVR:ilLJa7o޼'rJgGwdY|@.&a:$4R,H#]vmߩS,W t .53uz]PJK"-魐wZωZh)ͮ&+om!GZT@Ԍ/u{5(խ 2\j!Pyt ]4ǎ1 @S@z^L4,a*Zi rZH/K66eCjdGr?"SW(fQQsS! ŔbPQ b!m@Y/AP4‹'/P!<<TU,ޘAc#T&1,JAiem!Cߎ9v{PFЇ; Jm4t[(I\yv~`@ӂ8Z`*0 hQ i|Sbx*鉰KD->|0@$S-5msdM^Pֺj,(1R&ȬU jtjLFWUiJO.ZT֬"!!2c6K2124H 'a~p5Igt7il%Z0WeVα)R]hL"?< LnIrv]j(qn5^co*PjֺPZػ*WV-emey4ʖ衈yΨQBnV)cr1ll`dI TP A:RluRB2%-J!oz:ǝJ$+n5u!HlѧQB⤦8bvܓ@jfgQjGS˴o)xR [H]& hgY؎?tIto5p u2 LI&ZMu\rXeԖ;T<0t3LD'S+`6P4gYRV`Tőz-R F% :nlO$4XzƀMFk;r.ZS̈ĒY=ݥuw. JAc i-j0JLsj"df{0{U>iKhkԠ Rl:zSem's^e%a 1Kc.jK>Xu:*&1'S:KB ڪfޑ=JKiF$X$6|VݢLUcBEZ7gJ"OPp?g2HlR*QkM5y#Y$*;YW$%Rݑj'Qt<*kfjV0Gp_[v+ȹ8?cRZYv7I]{f_uH]zi%yknȗ|*ݢi+Ou*"2W+%Sy(~cJƤ}m%ZnK.,.Y'yQ*Hiޡ(Uk3XJ;{ @չ.Kɻ:n{aZ%oZAgeY+JU: (*KϢJ}VPp_%xViYia;) c7,]zH1bfCTYs7wrH/IFb(7[D|37D"i]oc3ty" AZL]$4 c]Ţ1H/FURHH՜O ec-rS]\:(XKZmnEƇt ;WRr #.QɖDd-/" &&/]29۴H]^ :Ws@{i]}ѮaqHEehz!d^<:'D,.<2m ?.ǽ^jt}Գ: x'HP5t9z1e_r xYjLxQ׉Hm0B^Ac]\"mPM0Īn^{&dֶ҆b* b)0VV/̓/Rԥ˷Ѕ0}NS\J2 Y$]tK9ۓ.XCt0MjT4E>#Sλ׮˫T FQ$ VX(Sȫ(EN0㔭 .ռ"e7.nR;"%\:Bg!%KlU-s\#z.l ( ۙK?^0JcFA"8Fn*ڵ>eiwR%+'Ͳmu$,F&w'5FQ)#Xxu+uF%-cU }JX.lrf1v@zd)fSFfir'2BP5qgebUscSWZL06uH,5L˂|?z!j t@X1$VP@d"URwץkTipK?$ "kO 0%HVdW zald+dpng<}8C.tm D%ItZ}wy!0$R$׃WNfdMU*YHw >V+"U,h ޞHl"N߂K+1IqwQwy #2{J(+il8cMcڋ+^j`DT[*/WDW߫X.уBLF lXo໼J g4>-0ip, 3tbWgד: FFE+@(U*gf:"~=XX[d}wyFRTeM]Q%+誳d3JեҋXID 1PKh TR>(YT4_܂nty-s4TDĵ=zo-CL~*dtttk,]vE.֘P غ<(J&ײ/r7뺼YQ N%Ĺz/68Nj!;R%]#Ck̇Š*eDž (-# i.]^yd󀨠i1o2 ^bܢCbH]qq2*!!^4^V\5bH٥+$_l:kv} `L{ɲK1s; Ȁ}"gƑVVpXr"{ a.jn.T@*F'/-%. +g,T#;Dw7#}" -8G2G]^*9Aέz[@[SacfRT.R%I^CL "WĀ̚j윳YeQKp=ˊ1֭5Ĭ>JRS`rI^XҰ !H4F`E U%+D.h~j 2ںCl|Zv u˨`ů[] 15Ɛ* 'jFIz׌JBRf8d:QDCH/G6BЪGKc9/ a94&c뢏.O_\!(NX]v8o^N[Bk}/.]: EdlEZ& ;N;gYH?i41i %wD.\ul@-GV HEb^[FvBrY~ nPH$jK#d*;H(RTKd!ʒ]YFJ "_w#/ kqPyFz˜-"2j՘bT^+ty@+bQ,u `vQFa /0m%.tFLʇZuzAAh M}uyދlPv(ѢkТ$XR!Yv^J"RL׵}%RRņLĢ>޻JFjˠ-@ZSTMGh XCtO`iNDkVBQoYw֞^bn58NPϣfc"6ݵH>qmP"cs:K7Wi@DMQoY/SI[$9MH]^FMPڀ!6Ȕ ,E%HQ>?; 4U&x˨ ɒyv]r.L]9K,sa) ?N1\,{}M+sË0Dt@z"dz %$7`>}05jfI ۦ$}!Ɔ,#v=ɮK!ʜuTԹ5ew w8x٦k}7JƨqQT.^ VjA[: u,5#d7KC/6#@9sUEi| /Aե˷@`NLێ ;`QTH/Fye\ieZ%dمY+GyA¹!tye"hALP]1XsH 엃D%u@z1 L \1K*jm҄$OQjEr"f-m'l+9(87W;u^lȋWQQbHBzZ: 0~+oyѥ˷TcL5 kl2PUDn"EH^%3J.M c)= a wv򭞟XK^Ŷj%lX`T:tKbmH6YA6g!k_ȹu "QW.}eF\XP_n; GL<F@ɥwraHu:&vޥkSaފBEe tdĶ()9˼*cnDeIJHh2]|'sfhIæX; [ƀab\$B@2t2J*"ƑϱT1KE4b[X]^xYڊ~UccHD0q\"iuH/ =kPBOJeH(Ślpz^$: t.~=˫u՝ "883\ xiiQQBiwtSHѓX2* ;}w74(0( ei NjNupD`X]DY i\o+]'@|r|0NAC'tyxDn-4a08\wfO`d tHwHdĩ)EZuAdqځ1|l4pTѥ뙠J0X_ȲTKIMZjSK; cD̄-r\qL+FF{:4,{W0ey 0rL" Lt|u!L$xS-kDЃH^LHZAurهqHNq 0~ T_ R5mM9K I "MP_;Թ1CWHdDnG;1;s&#f2Q4v#%| BTMJ03-KgR|$3duP1 2N5#ԷKDxߟxL J5`iV~Xc!=AP3çy<AɄ WMZ.^zp}ߥ/U%DDPL4Pm`:$Mm*݉bI-E6 0=ˮ)tNuC>Uㄑ ЄQM{b+e 6cvկ8^ 6ca,Ţ1a~ZǔcZZﳩK Z@]XF6r}mU̾r֑4ɍ-._TW~RD'tHV@5f+LaZ4)eMT(s* 2+I0{8TZlbV3AgHD4YHE^sוҰ,#`!.D6e%02nHN_}fn?vꘒ v̀EHS]):#C }=C m,<,Ax:q_-7$2{`Rjݰ}w\̖rmz z:?v'?/E7806D9Zq6& ˪j--"*['&ں#ҒRic=(srgqWד KF+Uhk;;\i|Ri-]8]sq6y/嘮 e^|R'.mI=H8NQ̡u1c@W%FOE[>߭fZDGE0(֕i%Bb->l[.OFT,0 d@:TU^BJp)A%nFG'yտdn5Pգ* Y[ WBT09ERV k4I]ӱN(EP WLӌW<޽;7?{gcLdĿ!fq),8::=Gݷ&`bI ^2*5<61gM`A KJ!u@z 43b,E?x7k@4i2E;?Օ$AjQYy鮲yR&8-GY@vӝ7؃m}Z^<mdw& O劐-,)%lyh#;?4݌RV@R(~-k|xzxM`>`p)p:K:V5$, *gݎ.*bW\D19(tt{ZUXFiUJJ`E^AAZ @8ʉXPi-1eΩ\ZÖJ؊D@ s]=Œd)Uv10.k2YyKąh+8-<+ΤG_L(Qat a` 85bdRckJQŢSyJ1@~D/ ^ 09c14y5C#be-QٳYq$+0. w|FSF 51=%-Tt EZ]@ՠ^U'œ 1;'{%.tZQȅHyNY=j%LA$0һL1?W^"[Wh=q| nIh đUAH3yxpLZg'A"3 R9^AR'fj'!R49U-XuN8_7g ꠪͹6M+9]PF0x.0b5m"YANW=ZS)"ADf9;"ƣxbHX,qt+*d0}hX*+Ԑm(_g{26B8V~ExDRfJF?\Qς l)/ſd""Gj6*" 2ddFD2AEaQ &(zPYsd"Z Lct NeApcT:yݣ옕lQ(<^OJ c#78 9 bNqIfc> "NaQ@Q"R&V>"0לĿJȋb1 ]>࠳77Za"vf#TXNR5dQiaC9gcZ#hL;sĊwٛAn"Bc_L; "KQZp@[dBx !g _gPҲtƇްR,l)ʹTL%&ğB3sʎnuȲG7heFTHG_d`E'ňv+)y>M|?~@ bBܭpfumZpo96P;90Еp9E򘢝P86ɵu^?l LZmf[5BXP+ˣ|KmT^^pwe)ѻg>@.߿3?'}="zkjjFu1Ko6]gٿbFBO?;RjsXy,oع: cV81囝 yt:s_@͇7ιGf>X4,㺉itfjYk]|C@Aj\d`(:$"r!B -jPbH2N못cHw*ym0*L?2`&=0 gܗS3Q95wx DwC[_ ۬kKD$YD{Dr1:," F(@ : `Z3+쾲\HMӔ>O1xQ{qq(z6f@;h e|/Z ujL+YI8: A @sXkBӪK*F ʿx(kѕo7՚/ksh/Md4@vFe⛬/t@vYHRf\!+P#&JKS(D P[ݰ=[-o0 έ k tiqFܕoEҽ]!, ]: 5LbİASܒM#^pĩ'BED`Qo =m]o|-U[IzA:c &^iiLܥ҇&'E0Jݧ׽|"#DutZhZ50[e۽ssWq]vy[_~{+ PjC}0sŹzE>Ŕ15kޕBAe%nw\Hokt %pA؛c-w]4Mاeu^T&\\e޳xoI%TOiXJѠ|3-kss>}](*îԨV "D,Vzt9`1V,fz!ED1w]YtR*KPC仳 bԚܗ4n}{,0 p8p8 x<2 jwc%UU 8t:!LMǽu7bIӁ;(}sAvtι@|O?}͛<<<0 ?dO}K,$4꓈|6M/qt,:gtkRmn>O"M 3rUFgF;h@!궚7CBlV;n{_JN @~ӿW_oio4:6O7[`>~ T%_ong3@c[ Ytۏ#[x=x+鉞Z x89Ɯܤ|'EmZ֭U5ե~$00 &Ϗlmuw}!Yw4. 0uڹ03?<IRMVBDEYnJs$^mx {_=~+맧 @h,5E2p2.ǫ7}"8k0y-nBơRXY!S"W02`1 N[x.'&s7vΩs pi?{2\}j$:-Gbh vlD97bZZ )KK*(uNC0@ܯs~{3h\嚥(\P@P"рsi9uRVElR)FF(8s̆<| I?|su(=cYFA@$ D!&9R(ȹl40n7f:KKuբ{؂\g@n"ijMyԃ?q\"[3Zs4j06Gݐ-pd A1'M\ҋl0Aʘ(OoEzq{y-h|]=ĭV #YC:l$&!:ŊQ/Z@ .&*ཱུFORN匲txa IsF-u ގnv-t]u3")X XΑ|?C9wSuUWc= Z\2kMB+sC{~˜LϥS<GHQP`LQ{AcϲB%Wg"0G cK^d{ K+`,{ΤX(Y)J`$Ű+oQݒ_ٷsA}b5TK@T-n`o=,FBLr,3ҝ4|n%r 'c:EKoYBm%\P>ֻ$Ӡ\]ָpnp;1[,dZf^PhloဇC1# w9 J %]: ݻd%b>8(HGbw(ZZ[j|ARWkeP ˈ[FgXFe7UYeJ3n'גntap&xqV%V'Bѥdb`40| p p$C2jTŭG7*"eTR,ntvK(YF>eD[uQ" n6_"'ހQ9WhiL?߻ppEB`/O1+( `R8 RNPw҇K8|0@Z)h_j; ;20kg'{Sp`3F8ȾFA[6b~kL^Dg%s0 _S7WA"vK-sv+T)w$#<9 pTc:V.^0G1TuRՠrܹ5[pG2#c]1ݳ~agAFPŗb'TP8%j.ϐZ?YDN(4\,Ŭq& \%pD)8Gb_ himn&McøPP,t|(ks0Z[Hxeh|Cn`e1Z ^b1l*lH$7 S9) Ŗ.}u@ !4?C?Q,ca)1es gcnP͝BҡX  \)}B*41SmjdJ$BO!7B1)HyL:M_+^DBhH%tV?82\` 0:Ctzc"=&֠p8_ ' f6Hre,G;wʉFV;xMiUo~>M4ypݔP0R2 gi$91A.;U@< f@j),9sM7-|mC:ϳ~ !4M:s3fh0`d%4ڛEVVQ J@c&y>Mt[쭠rsХ9j.;ШigP48tKYHĂ|H(f,S̽]p& !y޽ ιiw"rqʿW؏fU#RQ,;<,"{BzEY+Ep>1kU=|@iӹ$5]R': ٲ#+F8RPj- WGY.`ju,OOO)WZx]zb_|"Uf(,/QRuRBrZ:w 09ZJPK{ug3f < hR0TeixvQ'8˷RE3duE˅$J`3v}e~ kisYUBLf4Ρ5"Ku.nifkfc "p5R4!Kl0Z5>κ|\wKc:JpH]ⱻkŗRbMp/,8O}W$3ttZh.+-YS\APkB `H{nk =Ef]k7+Ǝ~mMJ J&i8O>$q UE yrS[}yV8RYC֓͘܅ T3Dw0zV%Kջ Wؠ; V5w]˭;Wk/A*iU*iY !ru?.>DU{t-sX875RS3̨K2[>`uP}[j#޹\䂋N/%ŀouUs i F$>CtBDFeWfu+ p1sq޼yhij1BWH9/k9:} Nh ,m+s:;J4 8զ|ZJK4>O5KF }q[Dग+q|p蠪LqdVQcH:\u\wgVk6L 8Q ^?o޼ O?}k(PL>T=0 R=Z .c39@*{$`;Ua<>>d0"Jfi{mdIfԧK$1,KϹh9pDgT0ODp<ߊ)MJXW[H=+T(5Hk)R@jjj{γRTaǟ y-mߑh(7@ÅUћn< >1܏,xs΅BvzQzPUsFXFZJ㽵͵>9e̟[Do}]2vx<ҧqRtLB*н@Dq:~?ҟޏnd0Q,%8좂$5XLq ~Z9in?yOi""'=}Lk.M("A(Zaoע/w#M鶥KR˿DZwE|<&*>LDk78nc޵=s/{cY3s!:# mu0ۖ])oJab }+u>NΪ7RBDT"USC֛?zc>'5t@zkb=NX#K=!8nKMƧOp` 08q 8#4xRCTMyoBJɿrj(tTZ\`W=["f" S^$NxUE55$[ڂ & { ۾Xs 8[u#$-@Lk5K.(Eax`*a6J)fA U8-+ M\wVDK]YK;uM.sD$fHlg.֢\dc9.}œ)V1T!GRGf1Սu6KNzRD v:rvk+!/|ςi8f}P ˸΍Nà1if͖#- )Wo&Gaxt8B1:_X\6I 9*YifE(SWTb-Sd-e?Ej,5| 2W"/РEm.Og)嵖Ac^9ǎĥdb ,?C۽UUM d }xZpA B/H,8wf-%1zLgر8 J)Aʲd׭ (TB2B𐐆B `hfW@HJ A';@\|Ǒ߹xdώjCM\7s[F*(a!DZ@Dۍ{,yNSP<NtmH9u%nUXۮ#+˃inzINդ֍ c/>00ppASDrLP&dMXt%Ʒ|Ԁ+hH TmMϛSi]|4i.3iL4̿4-rP4lL%^Cʨ옚U(D,> LaMGS"-]_r;:??P1X<  8w.K늼B G`K;J1b9v+栘Ξ0>v}U{*PY5ݠq|m6"O$i˖q#@ptyM7ðXJG#q &L!T$Ι2՚pq0;ob68f_ԛm``EV,6Ņlcekj%VH(ƌr="B$%dYK${VҶ(hھH_I)rdmݬDõk*+qH7(|$HPHb)A_\ל[\ oܤF-HbC.2P:󒮑>qE_v1g4c ,Cغϓ@:j ճFI`9>Ƶ[HE׮֎Y#nW_eI 4u-ZMgcq&·NhuAϱͅ($jn]*i"m];%Yb2kl'։%v*caub__6X'hh%ٷvHޱnW`}~Z+kM@b!b͖C{>Y~fI/rYtFGfkɒgSdƗ ѣΥd俰X %eb|F1Nh%3͂p'ί>iZFU.z݂.;JM,f@5YCliFضbEiAu{t|sjْr)Ӓ ˜ DSo"7 S]@/+mEWxtޕZJe@brCIGnƬYb- XJv ղ7U (i&#lދY{9kLI#] +.2IwkFWQ뛚f`. thsLB@~R7/[Ba-VK EdAXZ鳋7Mӡeryr, pu/:5Eq.`Nɢ.(JYuZXLR UvB똑Z~)/Ηps\iU9DK,9\)Nb[?l szUe$V tyӅEX )}41Vc/xln/OrTT5UǢX(Ȳ䆘蠈5;XSib Ckdźi)Zvm5DVsrDq9L8!a؅\d [9@*x" Jʹ0 ]j )X~ĺMͭc֜2 @F{ixL^I91-~]y$wBZDRiFPR93&/@yL<"E+8J9(Hb:>N!S "TfRlF$7@PnT*bːߥcrp-gq2#&&[[DyK !pjDUEb ? V#ӹX4zCVO:p&Ҡ7.Y@Gg<_5 ;$ O綶Z_6k_ ߫a,nQ3~7&3*:"6`T;oCB`/!`Ï1iy? !vb:I~sewd,"'ytջw>?N'TkЫ#6@|>14 f~ kmۀeP._&^7IUp8<<>>HU?:{9HCyYYFl=R[tZ%r u,U4bUZeoZ%`EoJOӟ{>==jSЖրiXu̟9\X*`- 5{:Nt>3$*Pzm1Z$沛Ct>s3VT[=EG/> x<~1ɃDbchcVkPw `炑\TW=UQjܮ$X gczv"4(B__{W}/-c @Q%8%@ "CO4.= zuȤ(M Y?FzOtt36''hU-e%nqUS͋:,{ji]Qd %,^=Zy{8Ȕw޽/cus\MBgy} J[ƈB7ne;Sw2jL0}tF7~\R#I˽|S3v;ȒPՉN-4šrl<> `-#,ҝ'e'EZ楋g:1F5PcZHaMWvI.5L AKiՕW/jXb! @tZJ%8˞L`QSZeih(5ZF_I)ЕuR}U4-,M_;Uh/%W{H&5n,]-uut pե /dÆP1Z_ZKW^<<2oet2.e zE@h/v ۳7]wdU Whu,{ v,5XةRDfF$rmV6aM`V%K>P{ti!&;"~5W@[XKz^~UnH_#0kQq]p嚺K1HtrtV&MzI6gy`Q ^\h.͵K=Vۭ 7X[H1wݥ'ŕn .Y23s13DDt kYoT4^8972@LL48k20't"7<8qBK>6cIsHY{t1YN'7Bk["^ :m+= uPTZ\%7=`qap4#?<<q<02hF ]* >>>>~p8|ob sF/ FYWQ39<>>~ODǃՄlU,[wB.֠$""2t:M==}JpF^KZė[{Ӿ.[@w~s߾}{O>}Oo"8>n7 fk(93{8>1P'v0(_[lG9;̏ȹ 잵U|EdR/9?yi 7^^깱[s66^õ8JD٭x||7o޼y_MFE2,C\ѭʬE-B`NoG񿆈6F Pπ@ۿ< ?֖/;ҵ55#OOݷw+dZPWWt@ZJ.Qϵ>mW?ūb\qp8  _o &f Hy!`ǽkX irb+TY\o4Y=iM%)< ~O;o"XFj/Ϲ섚{ԟ:Ϋl`B5OqjgNԚY kl'O{?wyps@;9tŴg 6\ˮds SƯYBx׀2;p8%2|=~ y9['bA#C,$6T "ҹ <͐'q^cg[!~O={HJ+^'|_XR3Z%\d%6)m.Yqj~V`$qaL<wl[Z)uۮ1x)c~#vo2m!MIz>إ\Q@v\f: }7$yWsBDƋYg ~BD--]Q.X*n77* XhJN?@@0A%'m!{|/S$2$xoZpF@6t0NBV+F%"?{۶qd9Ȣ@ F#=AI NbMJ!e?!?SL\dok<)k_g4og_-ocx R;M|ϻHWk1U1 3c[m3 zB^l{u]fvg}r荓TY<15ї欷ymc3]7ۋn%&aWEđ{ &4v#HX!7WHjj,jEoovIc3M[U9felю־id+"G[%UDe-"MUno'/kq&t$k! _ȍfi˲`1"ʚkf+s>UbAct(Π:mo,lN;!M$ab,"ܐ'3뺨{t 1,n eYVUUeY~wwoE~O =:Q&Ak;3fNTGm&M{>t &;VGzqCj9^&_|G?ߍŸyӍLެ6#?T~+7Շ*VH3$<چv^U/swo~ُFU_XSҭ1s>%X=8Oz_#'nw!f{,<Ǣ(sDXz0ʛ @‰U#MUW" Й <ɑ̇sc$,%H8oV) UH:\ch3h@ I%k !@)Վ8B@PlTJʈ"p Xix!+QvEp, @@HH  @ @ $$ @@HH  @ @ $$$ @@HH  @ p*z/IENDB`desmume-0.9.9/src/cocoa/images/Icon_RotateCW_420x420.png0000644000175000017500000016635712140261562023234 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxdu ~o5ܷ7@]$ARlTbФ 5=-i43@lnkMK8 E APWVKdoKdf1HyFDaÆ 6`H6lذaɆ 6lذ@aÆ H6lذaÆ 6lذ@aÆ 6,lذaÆ 6lذadÆ 6,lذaÆ $6lذadÆ 6lX ٰaÆ $6lذaɆ 6lX ٰaÆ H6lذaɆ 6lذ@aÆ H6lذaÆ 6lذ@aÆ 6,lذaÆ 6lذadÆ 6,lذaÆ $6lذadÆ 6lX ٰaÆ $6lذaɆ 6lX ٰaÆ H;Øx_~{g]ZBadƭ}8mX Ms;ݙ߰0M|_>Jy '6nG ٰ>s=8\=nחz[OBɆ j44~$ 1Ƶ֭+/=wnE{y'ҒY?BɆ L`i4MRO|N*W=zB{Z։Ns`uuzi;ndɆ  Td];( m}9?M[8nL $6>YRcXZJj"t6"[~{'zJwyyt:ٞ $6l, +) PQI)eO:-"o98uNQnr{B>` s)(EQμr RzG=8xp""iADve ȼTó6ldƇ FϏDZHfYI)#"si0|䣏gtzʊo2%Q˔͔l Ɇ  eLY(TYփ/;Z'"%pO:~_ɔ@DLkCDlgg'RYJ͔lX ٰacj4V(84M#uxo>̈" q_ΓeeQ1ADZJ6,lذQY2eX)kػ Cp"08;p>/B{FD @DZeIJ6,lذ1RHD%Iz7;ꑎ Ʃ֧[?& '"&(1BɆ 6f`RJDQ4Mr^|O%s@Ap/qSE2M~w2-Zp01" bX?;}!~u7 @&p%TJ6,leJYQ$2˲H)5Ȓx'xfu#C"0pp^WCȔ8H43JMP*JxJ6,li^?R'IiK)م/%{[[r (^8c` 1 S[ҿ\v|g2`0`Q%(1:`d:Ȇ8qױ ؅cLpιsΣ Ҿ> lX ٰqfE՘9I))MSe2 ޸_'Z:H5Aj@3C >~dssWƘE_I $IhZc1ؾ $6nOMQJ)JDiJ)CԞ~祝#'˜ )XmA p9@&Mo1R+O^x+ABp!DPյM;ذ@a} MS5I)eɒ;^M>ǹ`P*AU>P4YRJO[^}]Ƙ9wM3Ƃ 9VnɆ yyJӴ6DRʡ|i|/ "8 91rNRqR_;r2~cwXz.//wV[5T@+ٰ y#̈́RJHi(kfh)#( Ē1؈?TkJykiIxQſ?wz+>cgyBOKb&^S lX ٰqeE`rPSifYFm.1jq" fp57tVGR"eY}:2i Ae'ϧh81/#Hf<N㎩T}J"M8"8c?w:MBBq!s]7 0X6dzFnRXg $6ޛ iV"lH] `) ٩{Zߌ1"$iV&M܉Q!bѻU/}οBרWb+&͖lX ٰ̀;˲,M8˲z/=z=0$R di spj0CB :r}ψWfcJF0+ $6nC8͎` Yl,W@ H"d4sU΍jýD 8) H5wڂWɖu10nR8cA; $n \rwg{8-qh a?-ٰ@a]Ȋs% !vgYH)ٗwAOBG"(#V:ߕ`;B=G)FhG><5DK52#z~>4|ۏsλbvs>X7 pH6lpf#Tȿ,b)ee@ܕ?uci {HsgdFc!k{}&a(5z/Osh8^Y^9Dm φ >P$I _.JҏxpHM#E )φx1 VhJDheT8Iv+_wq\π5qv\ IWD˧<M͖lX ٰq3sH>R\%VzwrT58~woNAT16g&+jE`H5a.͑RWq-u5/tlɆ ?dviq%_NN"v(&HmQP#"-Q{%O&5g'Gu}}'kO !%yyZT+7[BɆ sklTeIeRjοuYdN49H` *^ϙ>q使g q=Sƻp8r88͖lX ٰ.FCv46t1@sm&}bs-8x9)+#2:|A Xti1)1{\0L5N8~gַ;Be!DqˮnA(H$Q̖@o% $6lL-MdnldYeY6L_}|3}4#n4G|Td>y+ȔLxb1\g$䜁9C@. 4.>~ƗՋKB8a^l 3nddƇ:jo}<%KdHJMy|:t\ASXU#G>D>#@QY^dVtʊa|g-(.ENy9 hOn2L*`@7t!xEU csV~㵷YR$HJ]~u%HWF])Q) 0]HpÆldʊ\LcܜoCP'Oa ]w>v~.zB:s˞mn8"*nc޿cy#`\)G*W~pP T:uK2w0SxرyƤlXQU+y{q1Ep|G@dpc맖Y7}G$뺗=hZa5`+-Y ٰqϭ(E>?{ 1!]uc !\r]Ƙ+}os=W/El+t4Lg*j/7a+uH1…g`pDfK_X;K_fYv.˲i^Nd3p8 0KTfY194aaa,,lXݒ .Bpp]W!uBp]q;{81ϼwLS΀\x<Ƙxs|`[Z=r8O? 69VR4qVVl;3`0-/@ċ\V͑&Rd@iĊ2Hj:ƛ/ z4M0]x3 ý0  ZY@`@at~2./kquyEe)}L5َ_w8p}Sjs и%1c8LD[g'zl! p='\u\?xdu',e87( 0!|`@.G>h?g\(Jn:繾;Bqq@眷8-!ks"1tWN\?x{.V׽ᣝTT18!yV`K( jM~ҥMg;ʼn4Pb R|^!XMURKvET [-g(J6Cle=+L( JTJD2^-RMHAH$HT0xs+kg^~)˲w-I(v0 a\>+`p@qC3 > uu]뺾P2&t tV?t^Y9t|xvQ*" w34BEfcjSE+ߦZŬ /g+EMih+)$p MN}P+Ju+4j' V2ECWBτ$2lӐRJBDL0vt]qKg_R^0`ڌx+\0ȻU`YaE4 Fu]hZ<+)BVq)阬 !z:zӇNZ]=r|X'b75!!Ng%0 .Jق(OjV4@.GY~AGPʥҺ=RtilZit+U{Fb6=!SϚFKG%q鯀@eI JUE]!ADdBIP>|=~c'{+Gu[k뾔@b3TD!V8U;U ]I%4U/M)΀GlG2M + |4D5݄W DwV ͲȋYmhMXG1-~'.)Z" D`X8X S20]3`)il9ƻ[yYs]9My-!8N[5YPsBZZ;>;=wuE㤊hBfTl)!չa LS+"Y7)$o 3U;zɍ"j8')g]|>$Q qCb3M#7qBnŽD+eM9'C]2!waFH8pmud{~2ϙ24M7eddXyj@L #2~m}!rvяu>}woة$XBҐ*_qp)M;,7וm@ȩj'Kk5Ь/ ~r%d&J%<RE&1VؕAW#i=FR&aTvo(ܽFbU&{L#]Np6iyQʦF_+l16i2w\fQED4\,; vY]1`2` 0 ID![4 XNH6V& BN)Zj|,[c- !:˫N=G;?HNL2k @A W,8 ToVݚF4Vә}eyy4@X5j#.#R4yePfhƨ$TCiIBnD*JCaJߡn(#2@*$ h:+:Lww>WO,Pד$ٍx1I"‡Κ,,l6,9^.ŵZ-tZq8NO7oˌ%!JomG;u~NF@&5vffLkٞ\_|iohRAkGgƔFYLG2@*zGZ((EI y14[5]y龏 ?< =~v#ix%08R e9ĄA&C2Ж*W䥚U.o-,Hڹ+?3ҀIJe٨EQhJyi+oQ0˚lIfC .L6Z-m:B% -qΗ+BGб{ZV$;V)CeAnYpOo+VM~PRz:F4LG︲MTo 2[gTdM@\7.㟩G \RX}9k*0X[ʆPrϽGeȌPbtUhɔ9":_k )Z]_`Ms߸x>{gW 0iEQADZLIW3y6k@ ‚2[y^8=qDˎ,3Vɻw/J!UvejXl3tJF`5TVgKMvG@02K`)j4]\1.CBMW`5!WP=z/r@OduA"S*AS.n(Tz?T]4ݨ2*=,|Y(5͉U%RcS9&#~ B Dܶ%cW*x+gݭ3LYmfYV))X`9NH~ƞPQ}c 7"ZBzSG{["(Db\[Cr70{vԢ$<<†*_y)5ChZj0;BG/BM W:4ːBɃrUP FV##]`+6Ž|X7vr(dF<®bT FTQ`2?gb^IHCiB C0^yDp=cT3 K#0I)7,Nt/IaIiRa'ӼyDNHK7TB;ViZNiZ]u{.:9_,-G?u=?'q!"l [3(X#rS^ZCzL ¬M:ˀD(K_+vQiNT͚ 8iL.T$S3?GϏ iL~S.%IY)*Qh1wVY%8Xu |䝇Makϗ|*  b"~Wt'>}l{b,Pbhf\|&HP~u+64n _@Wg2JqW%a@YVΎt ^1*2NZfS1*%#Ȑ+QQ=*</+V7惸̀J0Tr1U{VؤC&5D#T|AQ>hi0.5Ƒi \qׁܝ;Ik}UJỳi+M4M8(8N05iS#~7~c!/~)Ӳ@ ZD 0vNpݮnvZy=uܺO>ٟ}OQP*\ Gq35c/#jbMML2`ֻ TT3#YjOE]Ұ*JV3_+2=[,m<[) &1Urٮ F%;&FTI*J;`O4^uQ?]=ȚP^S,oDA+ Qzr |*ƒ=p '^yk/${[RLִ-Ite0($"p@q3Ʋ\q:n[Nm@dJrkB5q !]{xewD#| #6u~^,!p੄nzLmSsvUcYPm4òUuMŶ3 E4R iSI}7T3}2 1/fMT"b# rQD^J Xe^i j `#PeCkJ/JPd Ջ]H2Bjd rD^~w^ټ5F&ve,ˆIiFa&F! PF>L'UT0Y Y-2GtC *D nt:筸[ !=~G:Ofo G{йK'gJB3-1F0P5!SKSGZ)]Q_Ύ6P XE4M V`YMeWo*9;TzUt̨ f+cKS9{*˿^xQn\ Tv#AD}0QI.l TF<(BǠBf U &Đ8>ya「Zoi7˲aeA$) peMt#2NHz7fE /JgɈ;|~~cā]-TjB`ZoNW9sꐙttisQ |=j|P.U *4*L)INej/kz QѤb~SSsTdi %xeC\UUWk@Ft.p<4rv(ňx8%qE|Iu+"J;>~]Vrm<FtK/@C)s ;tpߑ6V$ <{+O{3ezR]) M I&IEQ$o`vW->YQ vNSh̀GzG_tuO $6S.36>8 \32bMwfGW4#(QC&Rc7ԘUM􃨚hjq6DE?j(߾ȩTZz8h]]%kǂ0R Ѻ Rtmn 4|bv =$2%q0КƛkЩ@qe-Fq6'¢b"FiTG fHSDI[k+=}ڋg~\9{V)UdN;44oAQGDZXi, fBÑ<7뺢8nzNmZD '_;d׆)$#`pb. Qumʫ'^JRg4e6*߈ ƞQtۺZj)5(N^Pvr95v+PXQ]^UMf[U0(U/HXRUTc"MC0ȤOFj1SdR^hZ+[*#Ť d(ϔY( s{sp}{tpϡ6f^k֕ ߴQJ*@Ji$M,,IEJtCS/)->YѢmn^nNg5u;suc?|w+ qFhWbܖ/i{}rT+ Y\UZ@(]*R+Xe-Uu}RM>OB #`}](de&PySGU^.-_,椧S# V|7S]7xZX" %TKU R6z-|YIE?eM#PpYj%"(i,L鎨&sx.yn20O/{pwpg_xo;.іz[kޓRRCueY$4Rqq4Muz͊jS z^}_<89qc?ȧ~7:^%eMȞe|EKs0440\n`MUTjً&JPEi֣>DYZI5\}M REP͜T櫁@[g:%8TKsR^cEiFG-iPs #YրI;gNI,EHYylb^EpP8 ?_ʂF )3J=ZKm]vi'(#Lm }WFb<y1{o O0:ƃG8u':^xu{=;DIDvPk=TJEJP)dYDQ* n6>Jwdd"^Z-]-_O /S 3Bc8Y"fzDm#3#]ʆ*̇ {Jf:0hB%W?%&U6RlPSWΐ~pa(X2*zgMuURɨUk:*5j*EPQ!ҶF0L!JamܱK( ^2]G2" v&< K~}Sy ULTo8YF_ɉ y.9\_`ޣyKʛg_so$ZoюzRjWk=0ae^A%@C5ACMnYZZ!uzwr{?ۿcG?; knsfӦ6۳B @y%}eEVzn+s+uo Ehs|D9<U/3vY j3Vo_(ipT0i]0Q*K'mYKiPEN[_CO& GEaqԔRMaM-KB) 9C LZ/[0Z(3i7adSJfU2̍\W4\'75S芏{]\n]r?V-0Tng"9A7\fE~nZA{wSޏ}xBV(h[18䔜!i>JCyΨ|p-rF_kjc ]a?~M]%6 Q}j:]*5lL< iSCSJ{ eCfT+?ff)T!#9 8 J348&-bc8G`wpʫr #۝N<'OJy!UsgX -V[URjv&KxM1v.gFM;*UWzS*CtXO < Xj.:HW65T8 8)dPvU"i'*)ngz}1<\C^FzM+/A]??ۋ+K7:`8e$I$Id$j8aTw+HY -/%\dEvYZZ*zEkvy'<ϻÏ>ӿ?J$Pg >gMi-de~hBVS)`UtEfTRT颖~MɁPtq]RiKpާ{ FZa\/A7XF5gF`D })(zf5XeT.M20/Xgȅ R$w.y5ȫ,6ݽ|8oh7V[֛Yo8,I$I^3}i0 PXs;~tu;<;ٿg~3 RׄZ`p9Gfx3?2j]%+2*k F34z@lխ3ԆLBvw@ٞN#U) )26o^fԴ}wn^!O$q0Hjm~a2]˽<`)s W^29,tkX]\_꾥)"H{J@JY8:q08 @%I2mkDv!}Y%v}uj: 8r|;~ga7CL*t@r}"a2}1lU/ei]R\U!P_W-J6ΘJF eºpa\ 3<]H8Q6B7)iԆ^KEtO{7 T- #j8M%n93٭ 0C$yfH0f-`+Q$O 3paf > .>1:;kKݍFRjh fYeY'IH)83:]iZH[ }af8yKKK~vvywxwG>o߷E?b#`Z 9ZFAbr5Tr\Fp*m&Ui2MYo0Nj+$YM7Qgz~KuuQ TKMOZ6Èh9R~V7Nce`kVᗤ Q!h7o>d;r%ȯf ;?yEP>tq9#-yîAV%Ii&I*dEBQZ }`/ZZZn/w݃VywW}nG ^fHC@mYscajI$47Cy\-*;ytc\+H2#]IWTt 䠭JLu՝.=*/ ͻ]*4ݭv6`Dzv>s0E0=#M8 Xw򬨀$;?ҋ{K^mcPYR(˲0M8˲4I$MS)Zk*CH7iU  8vt{j9jNzw/gze"5Z8- *gNj_wTl 9T-4%T"{F&]R]0v, -;0))deArgiiit:'=ϻS?'k?H\5.|0rc`jWy޽w$7&̈́Q鶀QQFFpO'LS)2MP"`I2cpLfČKwIr1hQ*e8. ZO]ڭKr/HTSĜQ[>ZԚ@HOfFYΔSRg`o}90Ta0H&!fD pryfD瑼=8[ogǖZ׏XyK.mi(4 J4MteB4B抚>U@Ku&`ZYY)`t>?䭘س{)2e:^dFǸq6y{DF hURTѥR.P2:{ic QpliЙТ: ۨo4 F Ӵx+++奥#nNx?#=7JCIT6b>"2sT04cG`F!A;̧g+:xՍ[=֗ƾp4q)VMSbF6k:cΨ|M-khjEfj.[xчFlߪo]eF8|$H^!7>y_ n${E(Q6Rl* FH}HJvޑݮ~v:s?oĞJdRCe@K.(dT+AAVѨd76ե2]?7@+m hZ^ FÌ> x͟3eF͟ 4{MqV [Y?0qcnjD,c^.߆#!o.y΃3R4 $Iv$3PqlzCYC6ߌFE4_4+;z_HsF!mwK |?z$h p(LCQi CqkFN5ɶFj4j׺VNj)L޸aff{AsF /y \T$to:A(*FI0+ ɕss@Yy%$o~+%w郯i]Iz 2 $RnR03kF3n}Ku ħn.--u ;W'wS$Yn Z`cIwq/4'{Fcc,QGJvƩu xWӵaz_h3Y)ƴSzNu`R`0jSMk42Jm*Qs*Q!2fpXU?,ͫD嘻#׾qգw~Mf(^Od+8GeiRl+,.ўV[4Y@FĒ]ajɈnvNwVV?'?v'wRĒ@*13e:|>4Z7^vSS~ZMK*x5)tPϨfCs`D 3>ݳa ýR0L9&JQx y$o|++cy9Kӫz$qEQ0Ȩќ S zFX]tZѿw~zGWN0dvBn1)äi!Te&"wS/;2TJ^, +MjC A^Hi]v#ng0a>Zf3N[t^ȶ50%-cȋ!yW^Xm]9zWd^EFQY%SCOhBZnZnCu{^cyO~¯|1+hEz<3YQ3"^!+XxR@A:4JV=euݨ+pa2y R1YY0OnMA>`[ -(7jwv}+G={9+P4 5冩T80. 10aBֱrnfzZZZEkt2?״fٱ&ΠєhFnC 3e:ܞQhˡ8 a,!'Gס@oS$R D J-:zB;b2R]}xntuݻ?'R%Hf $#f`Dp9SI fXydjs?Bs !Jˡ=~Д 3Jf>2 8*\ b귻8h%p7Eg0MxY;d/o}; %/j8ގh/Q<4Wfs)MЇ. !;gB3GEv;ΊG=ϻ_Ϭ)bFJ4քe -FTAɏNUp%n"Y{F%DžPi7MBAO,Ciҍ5Qtzƴ72<QY1PD`yLjL5 diyB A󂁔hA@<R0@J}`d~O6m9ӂdW^A?ݵҺx/q|e0\3 1 i&nDbh-`eH TGpjZNkVuuݓ_;N ѥ*7YROo]]]egQeVD$C iwS囹3ZLAznf>>FIxW E4rfoaݔ8, `NU)x HIs0F"W Dj,gv/,w͔05Cq#7 HXg!!҂t`'22XTJX"dД7YQs@$Fp8Q4#02 q,?)ƋM2PuJ]ۅ !{;H^6OyZZQma8,?f5i?B`!d43;1j9Nn}?yީ~~Rxa;րTC c|QibMh/jkkku8ز8a=zmBǯ3>&`D }=#Мn=8Jb 0`g+Y>H`<30!F stY1'0#kt4NBw7AJ¿~]w# B@:/ bO!z+n5|ġ7|q$@k~4M,R"RZyY,E ,>@eGTG#vu:^:>я}rAHiHCd.gcT= m?ZBN 75lc)@r2]FDۜMzFu9:"KDЬzr#$F Sı>gt"~867Oy-rEa\$IT2>SpcY%.Y}4wԔU`=vkV8ѣGV{pɝRHuS|2%i*@%(ga4q{[F4e^SϨiS|i7fOV-35A3ƀA!e|PYyr KoB^}j\'kw}w`iu:1o:ZJ4 վ !\v"h8H90@Z^0d\5~G^@W]~!wQp9kQ]p7 a$q$II9ה ِҾ3ћnnZ%u{/ν.= >*DЦĦJTw/M|f2E`41Y0*`a٢W 2\|`OV8ۋ!g{ ŷ .K;Z-owli?TJZX)k{{QNRٱ#M#^iuaun8N[GOwϿ8f0bf˜2/_ ~S]uǞO`\zBqlE2,g!dhv4ʒv뺇}/qO)H !WMZ*ޜeDPU]ȿQɨ+$hU2Թf4fvӴY=YUˆM7ɄQnJJZ# +Bo^=n+ú;JH)*%pJX)2R %"( p{}@zh)&] $nESh0 *'rjBHP_n;XjחXLZR*al`K)TbgR̼WEH)i͐&"bDcjc]q_Pm/;3w8@)r8XK@^}ɫ_<ک/'Irq/v?ISD/ܬۖ,ni43;u9 81F4oZ;mDSf4m4"@ ߟΐ;/Oag]K}w^ґiI)`h`fYI)cY4ɲ,5,;oߑndMyq#ru۝G!-&0rm#c``+H^ x>vkX{#KD&+ 8 s2"\-,~庩Bus]Wx{wg_:v^#P 3o2a6jlWjQcf)87|8 DW];uI_ BA^Q$R*kP-*^XtOX @zu|;Vnu΁Cǖ@v)]݉C,m^Y)I5x&i,DgԤx{a\0*v\p7#^|ן:Cۺ{em[en{i$ 4 JPjZAٔ,h,oa8y}qQTUg&[#03卪g熨sE]בp?W|=/Yp8܍hiiZ2A/)y " dguymuk'?skHBI]1|=癑.g{.%7zN`4v{2?u^X]X>F{{{[I$I I(MdD#ivi"s+vK} >aﻞw|hv $(U #A@/#y/7>rx;R0 v0 JYQ f ' @-uq̋8R{mpȩΛ,Uh$21; 醖Iq;Ԕ7b 0nFSsaDBZL7F\=G:7}q\h_|=gml[Iln&IDfy[eYfZBjJ6t ZTPdGMqFzFr`::09!6~ <֏ وh+I]#'&IiI)R6߉~inALsnu8mqz=Jl$ۭ(v2_Du #'z}8^4Y0 0 n +R9`΂?%qGÆB.|Xr(+/lzu^`赱z3s^#h-QeeS#9@yu86>TۻfEa$ :b_5dD`M)Q==GsV%\m{of=-dF=v`ȯ+rYwQw=8^~OI|v r /U9 " LM\N-!D{A]N@Jx(O!LA?ed/Y}#00c7[0F_; Nq0|\=<|h5wf m[fq۰ "#)|Z\0ʞERZS´ҙ{VHOí){WB`ɿB/GZy9 !mE4(YbCoL}-f#׋#x 9~F(A@BiJY!w1WB=%U7SID  -&b…-ٸH&Ss9-Xuζt mln8|3\ *'gF J "iʙ#@2#3E.&%1xil|a[O^y:óQ[A]>ח¨Եo#u[Bcw.WlC¨?W,YpE~qqAWU[+08 6NÒG}YmMw]Bxn_H8h\|( UuÝRaǭtŪoh2]h2ݭ3j: p;O[cuw owbXFݴ/FfYnt|n |t 665,WH(n@eZ8B811;ݞW"ˠY0u4h<4 F~SȌD#!s/yppp8y7F:s֎R[#2ݵs?4#&6G8ŵW`0 q3ʧͶ>Q-$>-jx+zp (QL)eY0й o!~KtO[;xx0Κ~ѵp8r]R٬Ƈd71810wfXf ¨JG=F(>-PkR,VozAq11Y\c[WZA=/]5(˲dэYBfMed87꺶;uqt;^bzI`e{H^Kȗ*?rd/Apn8^pltMݭ/ڬ HvcL08caZhW0MTͻȎj\w0tJӏ r[%^X c뉿gj0 t̸Ȱ+0{XM{V8=!RpYad`fψ$aP{}2ɃOCfo 9#^{fnJ̊uOOVjad!M=1e~hjwGaU^]3qbn7Ebڲ>#sL00aٯ/}oxT+ Ѵh?0ohG9yvrKPN?zq(GI(ӋeF<\g慚Po"zꏱ}=&AQ2F_MϬ ukmVdC[+_`˲ޑaA3hαV`ww0*Uy"V(.U@{* g PәHK0vsF]g=]s?Fz?0,Py&3M7yt( ) v /ZT8o`" -H. zd 8?/F5\Ջ{rp7IHJy~EzFUBspXɝ+X~P@#VR-jkfvFa}{Oxgnم z.?j y.ݸୗG$ɵ8(ڋ8Ri,&-`4f |u[BNv/"KVsnFyH:X?_^m; ୽s{{{LfiHԔLi,l iN ʩ$(Ueh鴾 `DP=F%ӴtB&E^rp}b$&;,2imp64L@,BW)11Ȁ31KjEܗK$.=y KkEz4%%:H)5v"0_эlz9M|~0Pn sd4WpPg8Hd;IɎy.cnLI]u|p;:HL3 `I*OWEѣg= mA04{;Z((mȆһ%"Lkf[g܀@φQ1AOE|hf4 FzۀF>H.Ũ,Jtq`Y&:nð\7khsj\uۣoLCg $ c\k_zϳǎ-=h0 ˃`s0_|OEn߆!/KIEDDvagtܥZ,`,oѭX;~+ff` \›8d3˲iqhooo(2IRD6븝Uv:9T/I)R*#Dk s8X.}`Tz0*ݗ}\c@G;Yi:L41橋t.jtG'vu]7&GZN"H }PWҏX  ԸdȌѼ=FކAE&C֡~%Ziq@ah|OSFt0jaLFgP+ WR]) M-<ĦlhV\z˝-_NM`ܗ_^J+:{. ÷i0oN|aHPHJR*ZGڅk)ÞJg9.؉C7 2wAJA9܁ܺU.K),&Iދ6OZ/uB~GL29DySį}_?=e (xY}q0a.@[eJJ)RT]8s< ͅQ =eΚ0j(P> ` id%} d{*&dYfYfY&,ZVVjف8,qy׵9KfHBou57_[>/hwwws8SY0~a;2)LR<5@i[czfD:&fmo(u?04FX F{A8WPjO)dYiQ݊fdGV T㜵Z-<߬w޷zf [߀|cǗ~: Mhk8q'YȴUM x͐eЌli"cR,'Rpov6"c*./QQ֢Hu|M$OMMIB|6iڹ>ԮR*Rx+"۸oTx*OFQVMW,ۏ{ZȆ))WՕZ٢vL90Pz,.\}PɮÞµ{ooo`hް [J^0S:%RH)5n\72#'aT,nFe5r0jAH`$5nuz])I)Odp pZZb }A&16sܕ>X7{eh^1B`,V2ݾ5Ծ"";l`Twph @A@AuwWOKgWeYW<9 \kmpZnZс`Db =fh;qc-R9oY"k8 # _068+g'o+ T ޛ_t:V_wː5 7?_(y z`0<5%gԁX_bλ:ZkcLn+29=M+hfNz%L{v;jUZk*yn,s5'}30b1ei@Z7޻*O'k@2SQkn`DstO #kȗ 9"5fhv/ sJ()6"Zk7V0b1>J1yFeYZӳw ʐwFn_:#?ƈ26!q0"_MiA@B\ӳջn%wEiphʲJ)9 Z ϘE0b1'L9!#޻G:7sa]n쌾k7)}A`DƨZ ) PM2FށZ=c08Z{uY0bK}{GYW]Yֺ$`MUrc'}0r8c3vq^68Z/zFx,p wIgHa۬Tދ|2 EN`Ch3 s #yF;'A vd}~Jػ_(Xzy #3g0c8O#Tu)DBB%Kc&ìfH_“;ޛ]QC1a"޴DSOڛaG/xU< D57*QG]=@;[yey F,$1d22*cLYYY}#YLj'/'c0Y$ J- !B)1tH͢ubH_ļݾ1Z6M>y 2dR'`i렯Dܓ¨9JHYD܁Q*AhI8(0D #Knuw{ݰ,QEDP/$A݅a@ %Xv"PJ yҴ-n; \o0b1E֐FpC^EOkݻ~#A_H!E<Fyf;rU dB2^R JJƎZLK @X!=+ Y)͋lӪ^e9(r,R8g=8OFtx6> 5=XZC!XK)CTZ4τ{Zu,tq}w:1rt/"]Cq'٪ =DPǣYh6Ȇft vO # peRXJI)UJV Ib5aJ @cq,K}1}w:+rKk}/J)1Fuvo=m`a00S 0j$TfP4R&R80u@W̬5]}}<Ȕ4M) f ;|Vb Fh?Ph-+[ .$硖N" B2 + bCyW#c̽"|咼v'ѤyƎ,΄Z0=¨) KTW)((RJN$@1X,3$L8>(eYy>,b,{?0=% ! !i hzC0"_:Q70@0j>K8 JWUJaA3v3eLڱX,t<0-ct>uRB;a<``4:]g0F'Rbୃ:^>AFQH\)Xc0MK*T{&[hO#!@k F̝#S$vוQխA{,AvOaH  XgHE1i-ygY+aYwo?0$x GèF{&nu:QP.rX՟hjy u)r0 zI,bX.vOsIZ(aZ.'/ovؿ.ԂQ>ɝf,-3jo#{~/*ZE?^_R.+aID֑9=_:z" h%yy(+?w"sIÏо#9 FSv;83`ԾOQ:A(SIVN+0LuvoNٱX )ᆃ$߸&ܐeYVY[WBR ȝvχQEDpp85yI0R4=~:9F˥؎7WJAaqIp:Vii|RaޤJYe<eywBƕY qh}MphA{Gܵ{ FMk)9c린s+kJ :Q%qGS֑v,D%,p;{&Ϯſ۲J), v!+Ӂ"?&*m_0"hU Bz@$BϮ X `%NTIտ?#:Vi4)q8k<?$wig4Jm_6z2gD hٰIĤeDu3G1 Rav80 'h:Éb -a07:(nn{- n0"OS+ӵVKv5mmheUd(=}A)riǁRJM$X,ֳ)mm#眳eYpe٣<Ƿ?Y{ <wϾFEqw8pC I,PcbC5]vF;\㒆Qw`~%ʪr EiSўrwK{['@x8| ҳRAEQ&IҞtb=@;~&|8,{Oy=DgR3E3)hthD{_UC*}cdD!YBd/S p-$I8Sc8Xg!rI}I4Z{p+˲{EQQ2>f'W}N0=d&{ZJ*UW )¨90)p ֟_ `3:lN\cX$&Eg%M-9櫃twm t^5_Zq3[|`4ڷmQ}Y`/29R(%^{D+0}t'0\oj:b/4#,S«<ϋp_vM6EH]^gUe;+Ap2NMӴo.+XC&u,2`0βne7:+;ju87#RP݄I'*0I"Phx$_z 3Qmqi:!ܰHvI,X9q@yOM*ݙ,:uv$ׯNee;>gnwgEwIQY%)3w*-%^dkI,ia؆wgX )1sRp8|?zD>GG&u(T~Vʍ:} ΄ax,w: X,qHOtgyg`g0zpsw޻;l"UYG;j$\품5zJ=~)Az+Z|+҅Kah=MNmf%$;u4Qs\Ҭݞ^w(p8jvsHTKX3֧ݔ]]Mx^èYO$9R(Ld%I$Gbb&E6.Q`0˲EQ\?a?,(߆8Ӈ$5 ߴǩM<@n7(%M@@W0<zm\"vI,;i@J & eY>5nΧ/~KH&B FM=TZJRV=!0ȇ%ZZg8>$Zq%.b[ 8LӬw{ `p?xt{MD9D5V ` aw^oE%@] :B米Z9j$Yt:nkIr %Xce~̬ʷN~_I( RJERhO+CGB%;_|6TP훪/DyvJ)`Gs#C`圸t鵯d/GQt?INEQj]5lEA]OB1eb =[|jAeV#V?sn J0!D@A*"Tw,0\ڄ HVhӇQCmȃHd} 0u3ȚRJU}Bkoew$yi/I,KnLc !ح!-7i^ungW`0x0oy~O~Y%gs艒߻z9y30<Eѩ4M׺n' |ZR[b1<ߝk}YO*˲ ;~Ae7 ݏeВA4gܞsS@ԝn4Jڛ$ %A)@<4zO~c=-Iw:N֒bL-VYiϻ$Zk!PJmAᒼp\7 )?5_B@Uw_K:~p59E$dVk[GQ MN3(48ZR 5X,ҳyO :L[O)6CeY)RF{D/IrjlPz$ v$x/ hlzDU_ IRJ (/vגZ8֓lo/ُq˲,ʲ9kIӜX,ұRFN1Fm* p8(2R;? .晟yN,(P^<#n%$<< ա:}n(4A4S@[$|0j ~Fݰ"FuMDR(wr Xea7.'c=0oy+@@ ޺<]#FE$!@D}c $@Xk[CMq}[_y+q%vqc,[܍'tb1Jޝ?L):Pe;!D{oB.A@l5c}J0jy~f Ae=H_'x/m}g)Yh%_?sϛ?vEQJ 8pb O>̀R--*z'ZRRJ}Yb|Ev -Az;Qj(=MZFPTơQjx'$<JhPO|fq}ioii)֖Zkg-pzX PfI 91|׽zAF͟}QSH46()6 R $z24,KRgIB*dCJ,>[Λodouݾ1&Z۱I׼=bvI,8Bi;s{7?x!66V)ߩ;)ϩ(-q^vAD)[FC&PB|i!@XAݗ[k?Gq6]'5P3\@:nPfS==<]wĭIlT"D5qnϹJ!}F$+IɻzH (0vN8]8tck(k$uݬ,Km8ȱטKw,4#0y{ZPʛ]}_Kx;'pF,P * N:=EaQ (T`R@:}G~R:x_uq=X\IgY\Yow'c˅1Fc܌ҝ|\cHǔOaRnZ|Oء8IնM'DgTGsOFMGF5`pW;@5{_/-u?|iZ;l(MZ@:. vIɧ{h -N wV>#מ O>t{wG 眫'IcPJ$A (}U#)Q:B7m_ܭ4M{ƘpP1X,qR>-ܵ>wn+uV.:QrJ?5?XjmH6ڳJJ{R XB謬O忹]McJw$Ps"lN֖Ɲs|X>tG>":.4 9lz:.@Hg%anƷNs}km9IM.b G(MT J!:yᅭt[]ɺ]_~"k|QdRVQsRK#H' [c,$U;갬{,ⳓ7{Z[]QԂ $P:SIx"`r_%?v-/@CD ?AOFk+R(])QD@a=AfGq;Na\ڏhRדX,C ӻ9D4wq}+ t}W(Tĥ$Dk9BCiJ'$LV__>^{?ޗZS'Qk;I %tܡ<(QӐvIKOl LBHYQRt`ܧuGbtAI ("J`LSwE)$;Jy盉+yS֢({O{w]%姾ڛ+jU tm~0jd`XփI>=R'w2%(#Zs{OY'zN/?kb (adxPj=y=Y"/_#a7ez"[;}#QNa~BH!Y a.Eow_7;v(`w_E'qb 1R唼}DGoC4WkK?R:v7֛hEiV4k$ l 7^]^2}{۬'՛fǏbK@b(}N{OvޞMo^%rNg֠]<j1DRvRTUjM 9x vN|\G?9yei'X,C4>h=s,[]WO%Zj ^BP2uWmMOI@RyVϕD6A0VčlmӜ i֓jD-Lڛi %P:oʲ6b1Xa~؁im^4*yuk\l#|{Iv/@]qB8UHFoGR 5z05: sX\9߽z15DdًeY_Kj^[LRu@b(M\X$7TbԐՎ:tǹRZo=])"(Xpzd@$p0j>9MUO}J Aa+ >>^g uݡ{]'8Yqpޣb1JSԆ$(ps}vhwuh֔J}y.-o_)^KJvN, ba=T='ш=!PRT=]уp @ϰ~vWgJy~%; %Z Jr2;4 DMV9猵V[ksTl]~{x#6B !Gu+U3֦|'1 Ґ+W.ҍRӭx|Cb p!m0L=}䭵Vµs8;W#\}2\yx*xcF'5f*AJ"0s讜_?N@v䜣zlh(1X,PDugsseǹbz}ZqI n5tyx2#QNJC,Nu_>}?ZnԌzGQMxJ,uPڷ&`` oж9Wed/~>N"MTXAzonu$~DD>7|R4aJ,t47DE{Z&s9 HG7y/{x"ZjT$hoC> zl ="?ڴDb@HR`?ǦN#^Ayc]c(X $!4H/f0DƘf:PZksR_ˋ7?@._(!|5. QF{ AG>Y~_`HysMoj( `g(X $!4HX WG}㔌1ijo?~g`YV/Ih}v/nP eUFVuW{WFƠD %zBvHx>(i}3V2ƘZu\JqcpX{U4@%hFE;x! DhT7h1ZƘAIvvԉׄLN{@pnl+oT #u[dbg;Vy&\@u}(J,tȰ PkZ;8h˶[: W\|k[Z{BE ۄG+<5*BMÔ۽XKא_C!Y1J,aShgEǿx\3ƢH1:ܒ齝dwn=R.>m tH}iDhGXts!DX) `Zk:0a %tҢ%60%MKrKn`xxh{ijϩ^ֵ˯/WxA56<(ڹ:{d'4F&x@wΟzW+ !zMII){~_yn갃oVr Ś! ?zJ&|ܔڗCMIR* *))`0,{hŘcrbNi). GfRAaEQ$4M:J$Ilq|ZY&N- jOAZ{ MT;%"7* Sxq3\.zew~?enaocҬ%;$tJc`}|xۡEݒDDI5,,M~;inű~x! s~rkB._ByZob I0zRg P,~ҹWϮƟTQJAAJRJ֕ڏ4 H-!-=E:S-!C\-1˝NgvL'8>ie}yv]l)ʋJڌVkDTf..S B@Hn7:[;_ϷZk}([`0,2S]%ĚIĜY`]')eP84M;i.%IzǛq*9/_OmR.]6 km$P-F4Z3kX[OdR<` 2237o8L,CIݒ8[sSȫᴜ$J$IlDQtAr@]c77iu_d rUP8񚒞ohb*DS 'N,Z6#?1|p5 ~Ȳ,bV4|[b0H,Ҝ4{-ۻt 8{STi-I(N nK'W:d [/7Qw|)ېRRAH'Ot|}{߳ccղ,oeYp0lz,s1LG_x,!axLqIIt4]Md-87UWo3Y|Gx {BĠ:6M4Bk֕ Bw9řO O7|QŽ`x8{^1 t J4,`b1X&% χ ?rMm0q4I5qEFE'z&xsǿX]'b%7 vyuYvK|!@BC':8K^W^1\+vЖei1@b1X&QG`>`Ied^+cZp܍mݢ^ 7!U&5&!w΍Ƣ~Yda5}c?ݿ6\Z*~e[p8 `0y[@b}~ni(rK `QQiq/'IZ Ds>lĊ:2D`Zȷ֗$ @HN©.>ό17wx40zp84ceβeٰ,ˌEZc H,E:XoQ05M GBI)ea휚xERJ* ҃>W]z:+/C"XQ7j-y!HexC;˿=zoXkcc< ì>X-H,5J s4L@4mC2 T\q' nEA,aZ}М}4v _蜅) Ԩ+|VH;tOu)iU~{?pp߳niw`P C^Kb1X#uK20=pͶ~b N2:Fa؉a7 VR˖棁}aߞ+\,=r"XY_)%6:!?ॵ}/W?߲޷>nk~?.wvvL $vI,9iZ;hU]ғJ)(5Q(:a5:A,)R̈;9=Lw&"ry{"= CD]Dlһݻ߻'✻k}~\m[~ܹsbB $Z L./[Lb M R 'h9'U(TaaRé#(:Jo/d0ܦy8 dzr%\2^?Z?,r~]%1X $pnis:,m]ZP#J)Q;'(vaAԟcTJ2RBy$C=ЫYaҢ%%KbUW*WW~bkkfYH,&dVySobQJ)h(Dqa*) )e, Bx"D;vs;ƘmN/z4mR3C0g}2:9=@'Zk [gpb{{Xk,KԀJ)A 0QE8s&,E%`Z;Ǹ,ZKY1dXXW+Tw~w >LsL %yN\4LZ_S ( Q  P* C!"+ez8^g<ݹb }A4ki!7 JbĞ2R J)aDQA)EQAJID䭵lp@b1X QOL H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- pHYs   IDATxٳ$u{,־uhtc!I !CHI&iA623kz44 E83F@n-3#ݏ=DDfddr3˺uf9~@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA> (91g<2ADX~`xQ#%ҧsq9DAAtB ZG*S} 2|B}@j!~AP8sE-CAi> F &H-WA9;>> ˉ_p]9N]"L }buSk=;D8^I iA\D?q}E "Hy1H Ej -9":y޿Aͦsqǽ㿉 ?v8  M,!H/ަ\O2$"HXB rx,qQAZ%P/:aO>l~T.23%>]TD`E6>QO?0]D ~󥫗j:1_Y-MMYJID>,geMhS!66F(VJ+"m(8f0o9Yf8TRhTh̲†ⶩ0]=&AAl&t6uͭs7JRF3k(2Aʰbb*WR B*F#0U4@!Z?UVElSwEEIID>ۨ6& QL_JQڋ^?I86&^c :V:P|51TNVgť(Sq`e7(VJ6I PQIG`ɓY[6=ն(`9M݁RKJu;/pq\=au?@`#8N4 +h@k@')1 hb(G(RP`r3BTY=Dp!8F{qxO8x/EwE'V &sT#@"J o۳=KH-b:Nz$$N(NcM~|§Ĉ$# Mb$Nm LnE[9`74Hw#Jc F[oAIy`%Fso,<>v,Iuo`.3%"ma<*1kMDiUHID>h g,y!(Dq$&dS8`ta?m({I'A{)Q:4~n|NLn8AVǶU,l="%T\mŸe~r$d (: 8ʆ$|-NT +/H }hbzdhp(zI$i1}( yJ^[7}rRvd7eFݽ\NjTBN7.SQ'O/s:Y˟9d#[)+./-VG`iSߋ')AAz۵:!jҸ?LRda`nv[[ݛ7m}+K_ލԭ} .vih`3GgPc("(jEF)8G8M}N?;);=󓑧pc?:8; #`B@{p:>肼uZnv0*7 }v.Kh@i̇mG !%I$ }m4v~s]W/CuK[W=P `rb/GwN89{=ao!ze ؊ˍu 5D*,1l8CqxGOr}'7ϲ<Ψ(8.B@|(|P_Qn~5\P~BYibJA+h ``<ܿywǞͣ?dO~Sog8S:)Nxt> yNXdtчmY}^l]1-JuѾ.AAZkmb]5\QS"x0L[i/ڦYMF\޿׾v~׾}=^21\OTcN'u}[`NL8c~[q`Ђh3͖RܰYjCp9ELGױ=W?z=;|oS{q8~4v>}WvOεKw[wn׶ݛ+ػh3s s[*j0tjO p<z{7Dl׿n{}}L)pͨbPͿQ+J"Wʤ@JkRZ EϿ]|=3Aλe?/)<֧gyLGOΡ!`\*^ZXFV+1Ze6Xo`z_I>cM扚vӤz ý`{dHl7_ڹ}xK߼s_~ʷ.W҃[C.'M8k`4)-r A>`0JrNhۀ,Rd4LA4֗?( U((jo \&#j^*v"` Jz#ѣ/?6Nv?=?gYIda0^BOEj*[e"kDS{21U@t }{|=)޼oܾ'W/_>Co'*蘁'5tjfLZF6*"h} Qe(R0Q_Leh8rIs:TpiMчT)|3m $*N+IC =ǷuR|Rlg)IOǧx<@^/)[ZSZL,UsNXN |iUigVj]n 頿gaq|~O~4woor=0,WѨ2L;1gA~XsF($Zm . 4>_S-`1@*2 )u{epWZO4pSEt[ozՕwNG'SΑ5fܦyyQe5mb1m2a^+J>}ҳ2 `wwl6g;Y}ʍ{w?Ok1܏y|9"`>+EH2Hz@3j: 6 N!FȂd_a1 t=-\(JY),d̦(sM:re\i9z@@ 9B++z٥|w_'{?ڡ4Gv0NHtaXW Sƫz g좖ӦK>!vH˨])iɞNU;tW~/]ο߸~g:r=F/($@QJUդ%2c.΂-)1&>Ż0FUxYkZMSɦٙU+Tr("p^E yaOK)pwxwIWsɼ7 o~H!iĉ=aAole{̵մŤ*KifS".'& },Ԧk0"v/]݉[Coy7rxڗqwW%rwsSIQFͭߖ" N5=3B6 j 8ЏC;(DY3q"7M0zҢJHJA,(gO!CݾI+Wk~(ѿ;O>qxOљ68G~$8fړvD%*_{ Y   E2* 4^o4UW7+O<)]t8u 1-)h4Ĩ)Jj✵s;;&ۋˎ*1-ݜ(5!h6Q`U6q%J eW}" т \ur@ `8Qc77~7Ճ?2/R V7,QP}1Ы"*.:@̂ 2ipń$QfdhX"rٲgAԈȃo}F7WnF\}B!BˡˮT*!{HGH߹wmE{oG?G?;ws8ϰ`oL0Ÿ>/KԮ,&ڶ"c9=6|Tb> |"9Fo%H $Jan8k~W޻ޭ_UWM)F3OrTVIJ;(h~ M)qX۪ؔ=pN ~?#o"I Ȗm_ O'ʹըi(P3Q8fGPLPJ! UZNJUv\K+(N_%"`7zP>wO~m 7޶6QXiE0\sƧR#M 8,_ee/[Һ&'1{}I>I Yj`"Qld>0\=;Ń?.]J1V2ZtQ[*S EdkJj7[ X`Fq-8N  @',aR; q#YZq3]Sg IS+r7*BӟKQ-N\Bbܿwt/&o]ھWof.e´I8,PIπ!݃w޿|Is8-,=VTt%8LzE=ѯyv. b=T vT Ḯ0WƺDC͝r{e:ԝW9&*CE_ Ly4ୃ_WKX(@rcTӴ((DbVU67Ӧ%Vó,XѸ>e}] }n;f\gӥ`0(r%O_7^CxpVVޞQ9sۚ0b7nP1Ud\LAh&~% *M>M@h}7o~/Ŀ+_ރ Jx*&6\Uh0~=sycן Of[IuCMf6 n4d^F2j&]ߋ,(2L|*Lv@s`R. ozo;:ڿ7I8O=3{^Ř8r#N./lU/h% Keָ^dED_Y\׋ge}ƳXGϷ~A lnޫ߾[[K0LzxRfHtREEՀ. EB-2y ^)/M,9j RnFW 픣ӓRtDyDU݁Y> RH"UmZUc;vM{5VbTOuB_~g9?il_qgLJyϼ1'`'vkCƕwn{~{yl{ſُc}ꞺdaJ"((w.Bx3:o0u r.|h(guku݄79wt0D6-Xq*.WdUQ UJ "-R؉"^zޯmkC\?"(A,!6;X((#ԦU* 'Gfr IDATOSpPOz`yFsI\+Q< sfLTC^Wsߩ.D7oKY0q5OlAh=6wѿ{G[?;{ׯwxȾS{Yq<98lxS E,eҪDکuA,A4Ռawpo^_+l&'#`T pEm5X`ʦ|SK]5Lv-XǬ|N^.n[~ߣJfI0kg^qL#|ӴJrZִfDyYWngs੥L]`_~yݕu2dtd~G>?9$tr*ĚG,Qt.=pu]vi(I?6q.s??qSZHM!s | ywۿo_{m$6NO^F U[%\ZEu-Uͺ\*7^:L8* v>,v,鵽sǰъ"̦dZKsѬު*1s{?SmъUiҊJ{-$}<~)>x\I_d>Y;;?{JF '~(v!98k]|=y·ymi9,XfE-{Ȝ³ j5``(=5,": {/JeݦeWVDI ~q_=_k$h@,Nsiӑ\ujvF 1r0ri4V. iØ#4Zˡ+`.bQd꫆ nfOU&궂;]ZmSUn[uv2"hܥ+< kkja5bD9MIr},Uo`Q_D>Ѯ֏CMz]b``;M֫q^tQ(jhUWA^5*eG^CU3Jd@b$BxPnͫY)NQ0 DHeyKmߺXF]i:0iX' QKvRVuuX;8TFb 1xM˽Gx=}{T@Y&!x*!j|m),usTp?'ڡs]Vh>͊\.DZJQ qgw߼;{JU%c]|(mhZY(U\80<Ciq &MP)B90!03cyTX#P޻UuQW'y ec2xKpr~%HjխM Tk3~0>vVՀR]Bj♫l"C]A//88͘Im CڠQyloW %O q5%F-1X|l_`2bKj`=wR \A_A2r7w-7&3?[8;;{֎MΊbtI^P^U1QBȘ4$&mL`$5t33?Ё 3(s`LgA3\|q0z@y1Xe.;gYT&}Xa+Kf*En۷׶W 8S4|;nGF1r[d!ؘD$V5xZ>dpFNiCgen–jm"ĬmbZ/o yF6vp02h"~[_܉/:u:=Yώ&駿;9zwb>̲ǿIn3W[px2|a&PNȉ&(PEFUBAGݠ FPL3Xiͬ5pPAWd:>q,\g.tƲ]fI񆮼u$n0m]e2ATЋk]ױ0"`֓JSPsO L``ZT?YDj$,VA l'Q 4T<>?p[Z˒w~ڲI\6p{"}K8s[9|x==v[GogI9 OM(;}>YW䅳z[OyϼֻbbffcWΝwu2zHA!Lb9{L0&8VU֗!2,D`sOHA[)`;̬T@htE։bުz2IlR3V@% \J8fTF,L@@D "ֆ9p|WE`]>,&Aqm`;jgj!Ž^j&Dzpؿ=}}F`GUH-vi+_RS>7X`Dz$"c ؤzpFVi=9V[H+c\5 U[HdfM_Ct6ϹM~YYg'HCÅS},m[5Xd Q@nN@9Sqz⭛I4y3 ̨\0Ek5si,ɨ/SY"*.Ѡp)0s`fVA'u2tRZ4DD8 A$I`T`q`bvDZf7KY-뀬6!f]tݲ4"+ 5@?N41@ťaC^[ie-;Sq~\Zl09dڎ,`{`(J92NnTkmD+wk iE6xM9uvKܚ2(ۉTcn)1[ TlÕ/-_YDv"V!βAp9D@!*@F" b E ";"&>cTl-H')`GG,:rU.&(V!X#p̌ĘsQaQО]fAͼZhq93XBP\Y @!3VLgAS D.# †k]( `gm5$,PTվ5Sk,Q$"50|׿~v%gF|D.uGXwaqU7Q\XaE W?{?,A#( [Ri*J+P˝h'{7)FsbY-fWɒ0o͵71VgIi6VDUͷ٫Rf.SfV'0h"PF AbJmFfrbIY1`(f#'VsSRۮǡi13 6LD 8dݘ W_ ;Αhb(A!,^C l0;: Άi0Ubkcd\ŘBq)σBЁu8;>>?q 0#"p>=LO1 "  2"|9k-ة,-_ KZ&Ljr>{՗vpQu4N? S)AmiBPr[b4UA&7PaZ'=lc{WAjt;Bbqcr;"DQc2Z؟]ؕO<.6 \?Ĕ/& 6L}醶5[ c@YTu*vf6ʀRX!noP"@X 5A5Xŕߎ$4ƽ ?lč{5)nxVbvr۱o09IvM6 Z{F0 ;V0 :F"PqJy0DAi8(V#Kٙ3@L4:-l u/>Nsw:[ vTWԨ?T6D^tn58^]nAe5j76)oC-ԫdtޛU^6 `<Ȥ ڂgܰ̃F4BHH &'Y?8qSG?)L>³WAKX_ͻKIƘUQ R J\U@BU{Pu=]6u%,ڕzX|z UP@0<[VXl)F][ib5ݾ'zF7#y}lM';7-kο_c⬵}m3Ec _X/lckWª ӚY7\ovݵBz]97{+>_uCʻy6?[Yf U6Q37(Ή*.1Ď.K1&W@!~c9Lf="HʁkE5YWYJmֳ~I  f aݎռ g⹠96V{pjo2;(hl|1F<21H.9&Ub rm)nEkqpE 70̹W?C%DJ4lCrUGӻPEliU>%2إOe#о2G}d3A=d3tm\WOM`C:g bT 1S53V&1ѥd>A$YxZCpjG5T_lnU˵>CbDqQPNP ŧйu-aMhZay-]N59D Yiۥ!Pǜʝ6*QKܛS4˫Z8h^UsuRoع8jT= >5j/A0\#]Ttk͓dsK7g ,`YʍKUs=Q ͪU 3,uVѳ2*RNsLкe%E H́:|i [f>5t:ۨ7(j۱\[$P1 b[pz0o8K|LGK.Od+Z"MIEˏ+f`\{p*?[[uձuĭe5DKzJd,аjLMWṖ+\ͨǸ%4RkG\} Tm\GUƍyPSyX[ V0&zA$֩ eVlP69H=ubuUL;{.g;*\I<7`(ezZmҡN̰aٻIZB)E{*}iyMiha `T5hY>@[jZֆns ˁ{0A׽L(v'겴*{cSεcnyZ2@5W_8m߽^Fh]9#Z V}v۠6HjLDVD[-tw{v;a#5Vh=KvOɘ}~- A#X U44bG5iJ u'uZLI15Zw>]NA2o87?LZg^W7͹ M# nшZpB+Ґ eD~rsP<0Ϸ\Īxm^1H\&έ Uې: 7f]2Bǘ ?}h;G@fBXpUۜV#vkq*G(6תq\B)LŸg]\q6Q-khBˡGTQ妦.yw]L_YWos WK"TÚPu|8F?e'2wXdj/_]Zk!"7v/* .DǘoWj%oO֘/ɧZ0>#Di_h'P1Tunk(4a E EK5aAL6q׃lN3iYcӾ9M] )PVQf l! gݚ$I+q̺tuWwOϥ!\ ހ $r$5ɤYO52IzYJZw  bK\="="#2#4뮪ȸx|9u[Yc #V;ά*ĄL]=eڬM9ue6^㖓Dou7bdG5U[>z({+mPKޭiIպ_"1 ,^]#@lb'f6= ^[ju1`cQЊ&i-4$`AQy-ƾ~̉Q:EG(3dJRg0R;U`Ěm*on8]gΜF)J6mp[Tp?EڕAkc4D1qK4Au& jZ<[t<ɺ)pI%A":sk0Rc?;&\,nOB}lhP +a#X5jyU+Pb2a`.d0H* 0,fyx1S#Ή`(0k&2Dc~m~uh!e$B"Ek[FTVp TJk lQѶJ򏀾rqp3 HY,G jXcacRD8Y + 0B?Eؽcl'Pau8c3fh}~UԐ1 ]` m]Df+[U3 % \xyMA#uFDIwy]6i9>Ipj\Ԋb Y`PvwF\Mm'7^$qLRRu50Rj~1^pWtEebu(h𷻖Wǝ5F@ydHgwIkWx UQfe/sq30۵AӪ 1l.PԢa68}c hwҍWU"~̈́ tڠec?~u/쎒 >JvT觊G|UnF= @یj%2anXW k%߅Sa"$hB FNDm!oɴ55(y%$,V`Ę",muQ&dsZhM\ĉ,,q0k-H։B?:j W5ΫnvlCJHX"k?5J趰tl38P&4 ]}V׹cvveu6ux| 1 ʂc`7#$ƵqQ9qow#T-*m'lڷ6ڗ{>@Ao- )uY6(C}ml#|`ĪŌńV%]U ?JZMmp5Yu5>Y]Ub ZmxJՄ%{3*eHU{4nީ]| H[z]T ccY!pCyH&Yb=eE f4 # Yc!%6Źَ~I`ܻI~A8H*;Yj,X`O5@Z{ń)ckY^O4ݵM ! hPT!DL2[2}̃NEH*.*nu˭<rn߹:bfuTs 2XT:WaTc+" ?OIg L+8+ _rn0N\m4h}ςٹӡa K@}p%BmA$K I;sTdРJ(QQT9`@sp(bZ.`e{U͊tJfa `Z=Ō:=Nv_[ V}+7>=֕ ;4+#n?4"h LW96f }rTLklzTm1=י?EIӠYčL@[w;3Wܦi >glX;,.Wr@め g/3$czzHԫe}G^u-3̉JwL6+BGz֫ &>%怜1N։CW`=**Μߙ.$$U7ϡ-9O*E-߆jHG~5R7aQE;܍_7;S۷hԷu joPmc$@ZZE U> {.ơĔs8`= P|B F~p609HI N[%>T #xaݞB`G l$@$V6IFu#H[2vD4=hLxSukH{uO9i`{ɐְ*vrSi{WvkC+^Ȇ]B+ppH[T\p.kPzh汇sm\-Cv~"oFPC (N{G]' -w_?OW]6nn eR/`cW J?&);̈֌ h(0XIikI.lEgΣ H8  &nY/mvR s[\P81ۮJG֮k@4cc\;PDŽٞK7s{Ch0߱-Ϛ}S$A6+DpVQƠK&i볃v 4+L# Fxڟm`1#aEEIS@D,Sqcq7Ha*&f-bDDKЀt>P7-Rs9#}^icuAg˫я4@֒1*ךivيʍl.}ͣM~lP.ѩj@;sx9XZ{IBCW}&@;W)sIq wY~/t#uE,4 MhӾ^t5DyǢ$ܿ퉦V͈ ˔\>dL+crnXf99cq0Y΄pj4˄c% )?􌵾Vi_4{Jy*5ŰΫpN>GH)78r``$+Y4A'J]`dn%W)u i\^ѲHtkCw*0K}r~1gȨo"o-Y* VT6*1nO8ܼEo][mp׿hwQ>`1fzNALD  C,%=K3,K27C !\c`0`#&^z`CVlMPy3K~9uW{'0X:@Yb:֏hSL@(lpTXVZjZQ' v{aPV[v;Z?>eʃ 'VJkRN.ƌ擘,$Ry!sh,O333Rfj M9sz91pf$ 7:SH++lic Șċ?vT&UQ芀z rIV[+6Fdc* 8ڃJvm@+X {YϏsh#q'=7R7PRġ,c[5]od|ù@_@wDYIlAsHs~d_Ҷ6h*rUVs,N?ajÄr"դ?nrkyj,ت2$ E7 I%:s0iHgug`ΪWO^͓:ϭ6^I 5FXuSQ}yc0U}cE<儓r~Ae Tzzg[UWY@_ʟZ/:Ol} qpY5!Z9nT΀|Eis$x8g?s*&w vwW?QE{_=YGɀo)1ln@-| [6NZ9DmR}=װ񙾡|/0~ N,vW3LPA`;VsDUX(OU*Mk?t6WsIU3Cv-L0(fJdPҬMum(!mH,cGHJTP0 UF}w˲d=cnmI(0%P QU.X7\1J@Ԯ8kOZv=zmQ ,k(iO0 F}2 k޳@>DŷLR!J >u !c?dg VB:ϨX2BҶɠJ9ÁŢϟyɍHJ>P꜔w>ZL`z[w `FY.K2E6<|fd f-jԊ϶4܋ F:]n :FͭSsV )cWG(cXa=4cWg`w﫺"X>D+?:yeA\S5KjO IDAT*NG |'9ʧUd]ߗ3R>A@k&j%墈O?̊'<;>A(): L]hu1^ rSJ LkU$ s \r)VV!=Fd$`Ll}b;R2D+pxI]d6ED]^IvY$'exN~UɃڀM6;ۅ i,aX/);']rAɶ^&m_BF[}dbiU,;3ChO3 erBhvm5=0ƝqpH& UU;rBUM|ڕwr.l E)7si yuʻ ŸypOάU )Z<K@Alq0ܷ0~r_*d 3D'PRk. u`R#F?,@bڲN eU2%㿘ߚڟFҸ\RKwT?raK:EYrY鄟F@D`c 1]R%.sSyM~/V'N\ynVfUUc=MU]5ZE4f}Ҳ9ŷyԢlcNZEߊ2z~fJHaɀ=e< lk8Tce x spMU+*.欲kb?a(Ŷ- &6 a E&Jظ -0:Ks1/?.s{)h=ҦBM%?&5sGCX6(-&KEfE7f"!sA5֪u6=13UU$tNHE+qС#//z\ӥQ ~{i#*,p05"NA"5+8BQک`ɮFB|  /jvOx_ù; g@v WnEjjsE `T)*}wؿ%UrOYp~y褽[ֳЌ[{{n\unG󾯜Y'j}'ߗQmq# `4N^b"?)4rnda=phpМq2d`%E%`i^Pj`+EF/#$[P紲{QڔU&ʒ_/-=Yj š]fh5s23 W5 W'@dNLfX?Q(l١0-,6Ȁva( jݹM 3mQn6e6GC-kg@AZYdpTZ$W )f8xWŇCىA~E/ hea%"QDS"&8_i{ pW^<%]{ m`4-׮ 9϶tCQPBߒ^QUU"o/i$D ԂYƠ$ T]qn{PV@4!UHEQd@PwԑyIm^t_ᰮAZ %PFi2,Xem:66 >b Wƙ<!A+bRQXCjh1c#j&w}k?e=\쉥yR 9멺/9.LOhXh?%>PiMӿ~8{Q\0W%ʥz!aiW=020.EzB"{G8\p/$jک(B\zlD@AkX/;"b% Xں ]V шqRތ(b3# (1KT̂ 'k!1nQd 52ZRFJʅ /m6ZP."Ň? 3t9B 뽐oeiMҞ@lN)=Yj`  fvm6FIXW[H+%ڴ}D.Cí-ae)s3ĩn 0tW"q&@9G1pp}w \|\.)?Ll$Ib.Elʘ))8$ YkagF4c LXH˱4`#OEpW7W5Hxmr<> @ɶmpbD{m/E횲 δ:2qfAQ.h-X2*҂Z Rnk\[N iA7]yvUs3ȃGrU< r(,=lm'4j d#(b+& MF_ZSU%c0.AHCdU.+_HXTt`6Ο'C$yjP<7(. ej/b=KDR2KIB2Y"F . ,H*FG;,..'ģG~2]uP U#`A3G 䍰^Vs|ۋhwgɻC#JZ^, yu%mH [@[@ԥAcO}R`颇yRINȏf4|//3ys^bи6N}b@5@ dnY  0CB.,7K[9~ tRjt0Zۦ}d|a iFukXO B~U4FUas>ĸ@p'b,4UMifP{ L<?K`L#;ט>Ȟ+dpYV&#OU"EYZZ[J%&NXXk_gie[QLΘKcL&r?=ٳ$q /@c &pձy+jJQ9wűhlp<90{.@2LsFV^:1ˁ ?䥂èB3;+rr H?!@!=u剺& K0"*/G߹(xy|Cxd]NUtlQGQBǐpܔZ咄\Z8 ׫{ "%:BM[iFDҾawMY/s@@H.'fqAIW&&cD8k5ii X^K`~,΀ ƒrNXZP0ʀd K2c(yIDenL^JZ){ 2 4@bqi$26jv|CA؋QPX<AwV8XT=D2?"f/<E6wD5!i/fC}uKna 0WHS`4WYpT1r%`%4B]"'ЮS]G91 ve 4Pf@!8 o:rUGJ!hIюɆ\۠j9gcX* L hJZ#m5E^cBk";m"AhU XGH10 ?c"uTݓ*z)mNSHa: .W{čȖ\啁 [Z jO%\ʚ#Q ,K$ ,2 .Kke&*r%V:>nJ^"qHfZ*5_%N`*BvƯIZEULU$R L3p)SU [+LYE?F,YyjfVш [RPU+_Ŕր옰\xD>" $3Ƚ DTi)z@0pۮ^Ґ訝/GI8<߹XoBxzHRlU]cu5GCTPh.F+t=+!j-AdGcA:,\Rz`D&+$N3&qUNLhVNTL"XbgUn+~)@4eu|Iޗ<3 {"avBYO,+970@j` h ]J92gd(#&$4#-\)DJJ#3M,LH]!tS(=yOaJFf}0 ȋ8wR /b(>aHL8,32gů 8x+G#ԕ哨u{ Bϗ7f%J Je^*H}$SI~C>w`b7NКPZ2^jeZc(kQuU|64`vnhy -!=RaP,Բ5ώ>'q~8R#ՠc[R/ܘ]öu>;!ha#$ &$S(B0Bu}QHG@'ϒ+D`= qnAźW*+8\1 } S ?w[久2(3kdSr_Йү+OLG<ұ1fD"ʈ'R2L2Kh" IFFj(cդUGZu67u#,aG~Z=T6Ev;V7-csG1 t\ҧKꁚ[!,3]g6N^B@fi\0U ZXiE!nYA|%Cdդ1QR&%Pe쾨vp OSm tihQp(Ʌċ%0_7#>,kl?(zqv ŪJH:3$7#aX"sl3]רxLX&SPbШ#'>Mr]tIl=GVNK@/40%0'.s!``L!iKFʭõ3qHad8`T%ۘe&KZq)tNUhFit@2lviGJ9u0aʒI9x1,0SdPϨWa Bs2"qb,D2NKpS}&p 㧝!fpH4=84‚*`3yYsu.kL]YbcM (ܶ* KÅF4Hء%ew@KMMe ( oOoy#̢z^EԈ7v q͚'^xRn 5 AJWMR{YnwOB_IQSUHþ c{*ޫ3|ٷ. (/ 6$\(l5t¡FXlj` ,2J$ƌ2dim)1 V!#1"a5T?2_3y.k۟ &w)%K$H,BL RWecV5 8gQ!${sHOП}pil|PĪNnm69A+]=5/H嚤.Mfa85mkQ;nJ]^ cwmvAC!#قqɱY$}/^# e VvBuBPH8]gCGkX\H6pxİU/4"asay)@B:X!N`UP"rYEa|+Jn^h`wGոxid$"yP@Y:Yy),e95eH@X]W J:!WϮyѶ>I/YW~u W+{ri%fGO}C#Z73qs5owR`H8 s!q30iQ*wڥ m `buՇQFkʝaʵo$@ 3 啄`sN(*JpqR!$Q4J[:5h2J) Yc & 'ºVnضM(P)0BG㌪ =ŧWmX@ aH@i؈BV(8W~{o&F A+jPgp94bUzo?Rx99pPl$@,ddJR[L]d@Fj7peFP5۸"\i5xu|BD!134ZwKz#=x -F)Q#ߊ䣟"|)1^͐s@f/tWբ6-6-,얯/R9Rt}cek%&%<9x{~?:!.pH`q MEA!.GU2^8!=bXDj!)D-bP6?V!- leQ]Sw mgVS(a@)>:k}_b~g.L䑠 ȕ& IV!]8M.&p @4 2b=@e[`{ ;RMhI{. Q۟Ž_󥟙ܙ=>|KN {뿕}īUR?X~u΄A2mEC*i!%o^aC8m! eKbbN_}O[8޾Y `*<|2b1p AvfL^5[jB]@KЯ7& }' 6@k~_b`n+~-qs`}F=[}Li._dzϥ÷F{b*@.U @E~hHԴ 0/#4 ٕcݠꎊG^Ӹ읳´o|j{>L c}& .a%`Uw0Q IDATnF7A""d" +!=t)]hJъcKvjur3jm߬s" ,< ۩9;{ΒUi"y^ȬPee$v}T̶.I.Hؐ -֑ Bp}Hq|_og?}gwO[qgۖ7g TH8+z@ OQa't}2Ұ Bv~Rs^^GF?i[w]508f*HL#t번_yoAh|>h dEərelڹ'V UUƋQwGbșUTуf몹 cA['k ^WEFUȁ g١9{zDtV.l, 9_ w* mڞmM9mI]!mȈ:>*f0`o_w{K_u3/Nܹ% BgmF-㰋1u>6Dho乣C@jGIݐq +~԰cWm­~/=O@Z`0cMOqRބՐStr1ѐKDq(N g:"3D .2U')ƉUÓm*_J'zsW{}w_k߻:L;g,=:_Ju~>_^EQE+|`X5^`IDR$ t^`9MQ_1Q"Oӿ֍;=ρӷ *n}a>>72B g!5C1nc e^;sԙ؏#]mDٻ莆mR=d HiKa=XE5 IqkYG2"՛[#@1&lunj x=\ (xћ<`XR-S/W?'; ˼Psy#6uSxgzhNܝ8lVlqY(=GI#uB @,z HHHE懺6h_گk+ x8i8~AvܛʱL<8n(Ź*x~iJU$6B>mK@8۶ckH0*Y:PbٹHRfKqsq>>AF /үϏ 栥r+C`kV>?M,p0  J&^&Li-41R&u[Of4F]º[Q|i䣣._.n%||e'39'~ MH )m[cHI34Z#&E\D@%0><ܸ?|3o"룚jߎ⻯Ǻ7O,T  ֽ#k5FrU);{JL/^붵 6.ܿggSgNjL~/2@8R`πc4u fuNG 7W:- 0?O%S1Qd$LNЊ|Xܻ^3W& $xmujP*@<N )9NR',>//UWQtgbo]OaHi[hS")ގpp#ƭ{?{_Wo;Dl {<盁>uzvEc֢5)qw\M-[siڿSIcC0+.65ۥJfæ 0}|לs=7 km>8Lp}v}_^Z8pzG٣W9#)VKyr@N[7r]mG=( #Gm ΁'ql\gίV2 4j  <׍^$JR]Ic BZ4& pxpի߹syd 7"s@_¦DIp;x5|:R `r{x{vqlp[Hಞii>ؽ ءkpGcau|0 H8~+nU !-WܒAtLUk7 ),(' l?2g|InRB |2 C""RWj;igp~!Ep/q_#~߱ƾ`{spXM7z)@#:*2*P~&Z=o7nrq=g,tc'oWxcA97D v^ԍe:n9vCl;W'6#(*ntqȹB6/ <;n ʠOW8K"m<#=/ӏ~f4zWFB.l5ǁjw[[h=lLmҖ2P&$bew}VK i"d7GWY s7̠ggȓy"UgZ0+7된Ю@ =ytڑQX/Ĝvoo+?]}[?)^s: Ȱ8BȬɼt+{4@*=-`wqTo+ Yaﳷ.o~yY"*~O_ ܶPK@!Sx}O0oX2L9!t!:*Fs9F FGL KF d{EdnTMaVњz!Hu6Xv|Y'Z;Iӕ:Ysxz,C`y,.Q>?bZbAX/`$u!n K} Ru,t `"(ʼMSyů5oͻ9țt ]d$[aC >ћ oG~KY ,,+qvxwHǑ(1"]tFv4tC?@V l%'DEZJ^U``i!Q2|ry?r~oW#';^EKzeͳ)Hb現ߝsJ44dhmzۣGqj悞;pZ$w.\Q⿎"09(rd& |OX>u}c\AO% %"^2&86Yro`6 RBװ]0CL)DGt®YzٵE=8&ã~nyl/rc.6ڪGF'gɟ^"c,򀦴/"0~6~cc8g<C( _QuVb̙!RÓHHJ] ! wwF.&Bmb{*FLV>e+9/Wf1Ns7?oB&޻Hew~sﵗ+UU&͢3"8!h ZjoA@kAFVYHH4CgȞnV;232nfs0OyDVEd_!+"<`I: M?d/Οp/%S$sdmúyS0MOgCecv?ʒXOK~>}:u{&p󤆫C,T  XTDM'>;}א8.WeaJMA~RaVUK0&㽳x'CFp{9>$GG%C ӬqP{)0lZh4Gdtf?-hb+#=/׫$s (p^5կW/&_ԘgUP9g}Pf)Ya.Yr(QP{/D+kxUsYyxZrFjuv KMn @hֹce]ڼEWLjs@p y{ώNb[=h^}W֬!L7ʳGOK*X|34!&q93 -ne ە+)`GsYZ!:[}K~vQA[V9.XGi.H<Sԗ(%HtzEta9;(_}_>gc^Ï3O | 0~37K̋C 3r~v+f+] 1dρW_/ ~%8ƢИ!mBC ` -HƩAF~ 'zZ\OhnL): wd` dh#ArplB \|3 !57W=b*YY?IJH\zA֠F* u4U` ! ד&`.}:)NJZۧA*:.>߆ɖ/,9&rws&\"<)ң ],kGrX ,$+Pu,g˜ugeLnjըFֆ A=`:m5+m_l pa$& b"!/nu~uC#J-̊M+y< =DxTܕKIbF&ybTO% X &I\j`C &\<Q . ' Kށ|Zuf*uÙPY|P}f!xƯ ^C二hkOb®- ZX;|=kBh[8v(+_Knjԕ׻ V\M??p6~g)jB= f !FCXih/K? g>,fl@u\3qRG8mbw3luHߘ s?Y#(TV]zq}iUxc+y\I^*,p)FKtʕݖvI˯ a7Ğ;j4v`:Ku.j5Ӗ0' e L-hf|ىE#Y#9uu(I,dPRcyU۴]rk\3UZ~UJduo7YSsQvi'PXֵǚˎir6s _W}F:N]D2oaԵCrDHbXclnyh6=^L`622/qjWӈo\ݚ7<`'Covi]` %cP>~8z?wC6î^*a}P0;m^p:YED T`oNtDiIwfdDiqVUЖEjL2TnU4D,v/7T) vf+mvҕs&>}>I!uM0Zp}",-$Lz`O!E' IDATؐ"C?J<ٗ!Qw03Qxz ` Ar);'R[hP]Dqp=p<}B7 s 'orJ4#F6".:1c>WXA&r&i7mu :iKpS;M]_I]E*1?C ڬy˪i䗚. k#\mA֏M;)~?%)=!9s4 Vhl+Jr@.׫)cu!"%Zr, oƤrGCvSWQ!8(iXa1kmS5}mk-ݵOW>uU`}^5rURbNm,</Gv=$Ȑ⪷ ZaX~I\$B E g@jaqҁ hrŗ+4͂=uCqN*Lsb`€mtz]Һ (i]8nY]qm*]oZ%ݖ Yt}•]ĨP݆;-]֌V^u+Ƹİ,}99wP-&w빫S4) xЌȀ tibSд*7u|gF2yN06Ijٯ%Xu|k[c..rmojmQ505Ӎ-`[D"l7pHM*^.tտ)L|Ӯ4aE64Q> dsutNKߕ4K`:.΀6WM]'\XeP0{]ɣ&ê) z\JuAo mͻm AWK&ZR7/ܶvF]nضoMd__e<@ȐGQ"=31CaԮ%9b{"}ph q=6hgsө|[Gcb~6a[.Up ؘfX=[HrV|{H.`-43lZxܴ"Z׶L6ռdDU7M5N&Jb,g&8 FTn;D5bۇ|['.⛊W8pHw sk$M%,|mtJѤn+sj?8 U!* 8KܺH3yњ B kdpG<* eغ ϯE ?x}N4]Bv P]Eݴ]7uYF]׍nMFbG}w!}1I7!2Mh mg"Ikƭ,6Қ7J/] fKbTe`xS̋37{X.Πݖ(辞Du*HPv]NݔMͨ$]Bu7qD}.2s6:;$@\XLv8~ȟ(>C~px).M7&r5Κػ.PՅsfrقa!D Bx%JaZ\ycc][!`1Ecu>a]D u Iu2bgP]WEpm8 71m:w m+;T`PS;Q /&$MG? hR  -L-.ZAqY\Xk:B4n,YJK *58d.f[i9zȤ GlxM钐 *HwP/6vvms uqa]=һrek[]פ@#$  xZ7 k@)Y/ikw emA.ݐC8$Q\75jӾiRk28eGQ&؟}WuB">DSXSO+C[㐺޷϶O;nn-ve{r7$`s6dҷ!;%_œ "bSqHk xTeWh3n.p 0"yr9?*a`ڙ@A~/ `SW&"ynĥ! ]=g)uJw} I?CeەHfĨoIAGDž-۵M<QzQ9.N|nTc; NJ\PW)NexYWNN*8pr 8y|};̼[Nlgҥu,!,75t9BCA^G6ꗱL}"QXRݶp\w);mF65\1Y^`k:|]5ioر2&b%4'Tu^?8`0OA@1LGUOǿG'H>(r 8$M03Ղ Mp`E'tOpa{Y#Y󉵃eWwrՔG'QteƤ63uBeC|6\Lmۦ6i*Hw,|\31nE6wɁvM"}Ȗ2]]f۱е5a3F @Iqgƥg6IϣK#%sOyh5g{Ѧ6M'in/lj'ԄylA`ii^k]5oS?f6K8z.Ť/,$裴Ö/n~߷oUh\玀O.uJj8uW:.PWN?ŵ (}2FՁuʇIŬ e&U/2NfUUuu'1ixL92a?lͼ)CJ=@*h6O*ųἹSZIPhdB9'a1\!`&[69]Bzo1 kʮPwr o3~E .!]F",^̫" Be@(#|PWgAPGA+Q z\q8@-I U*(,xRA!mm{U)2w%LWC۾ȑK<:W^0C$`ft+xS^mi']j7)3$XTlFTA^q:%,SB?|W uxJ8TʩLi1` v!_}MqU{$t-}kGU[K=dqZrlxE8@8?>@ J@[\]t Unu]oO&v)Tn2_hWћsJ]i[5?oK" INsFva&AFqa梄Vb>ɴiF'E]|O_̸f;E<25M^}Diy;>;p8~S;NI*J/dM'./вt(Dܹ |M@FGy$wI:r;kCp(57(l5$$0~m _b_Ek`D١ 128ne[l8%-Ǐ}vM)!(CmJ T+ma.%]{uLA*")!9Lsdf~VkW 筆,+m/!ȕTT?{$ *fp!u\㒶o;撃 =7!u֯ޔ#L>-mz>N_!\眺6x1*KOÞY8qB c`|FHyVtIe{+[kywMr-8yZ8F$L_hv18GF8Ǹ*\\gB=sɾmתlK<gܥ.⸋sY҃P%{nۨu'mϫĉK ""A|Uq_1K`9MXD )}z[ަSRAzt@_`ȼ}7a}]~5Ѧ(!dOW&ҡE:h"k*5ۮnhBxy{4\JΞhʧH"M<]E:%[R _D>'m#9m.I::uw cHUςg"c9&HGpj]S.I\MjwHt7 $I$|%zyMOvW$4 ݾzri k8藥Oz@J$caI,)o\>@itE:%@ξ.FvCm5&$;1RQ}3x1"8ԋ}wͬ{k *Lo(o煛W]Ʋ~y-Sbfx/j_2L dW=D6?stuo:؞9aFuytZ>| @bH~dbfdȮN^*HߜR1Rn[:MЛ<|I3]"7l&JA3|!~0wJ5lkk>݂0B$yi~x&n*L&;*.MR $EQ(m#Qda[́g2G:J]ea&`M]}6D); kbb %%d(2GV$}-t(7 wtsq+x@ף2Zy.Zlqٔ5m\>\+-NU4)rHl3c]!_Ƭ~cYDICWw|UEUn⚺ Z߭_7 PI r/C% ^ rԴ Sx Q+G !c4MZ/;`Et?|cM?c 2 aKx_TEFiWm.-0sH#FGb/ ;. wPX{ xJ^b4CS ] A k4MbD F$Vg\ttUE3u;/K*mUN3Mdg*0455&; j8%>%0\[,&V" 8%'<ʧ\3]!"7n+%UEĨIlh]k_Ar.N)B54³C024e01N:Q ( 6ڙLMCF_IQ6I %ZZ.wqJ*H|ゴ(upV6gw2Env a?BI8Ja%kȁPA0mhz}0V`A.EnUfMiӿS# O}q,.D }Xj3(7&Jۚwv]S"n Q-Bα]]RxQULsTq$@dB XA0Ԧ7}͚TAmθ$!Ȁ% U QAR;pC7t¥'zWoTr%JbS>'Aj2R'Ssq?nf`wia⢍6iHgHh^M$~G430S׊gwqAIQ.NkRߔ.VX%CDr79M$ RG)!Xx)qhĊ!pۤudȽ4 $|*WK6~@%I%z)= (w)1Köm櫰xH{8 e}lAxla1$@bl]Vkw T ?*4K-%#52`Ra_pP(}B5$M]umVʐoX%,f3Ig#;B⚌:AbfYTEe!a&)j @ +gUEˢt5:Wkˡ>=ڶ/0 =F=i7_c'XcI$ iQYW"L1d+sI_ kDx`Zni*HiQ֚&B +Cfj KO NX)" hT&-$Ҧ7B;vRC(P^|MPLD($ Y*H$;QW69Uv`)MRC2,2cs$EQ&#:6Է@O󭯩 HJtƧNQ!6n> }^煳m;4BH@̻?LBZ_|XASfQ}n\*$EQc3;ӊ B!{Zrʧ2$Q ӺBbh~Fl$5,BIDATh֔j4+>@§?|&  #߳u"([ֹmb@ k)#a F,3 ZFЦs2$9q&P iQUkno3hQ0dhS2I& }MX )S W#cSrC޵:ZEhP`3#I6 %pʶey9i(!+p J>9Ȇ .~Zgu&Q8q{4SAREvf0 zֶ6CSb)#8H4ѳqJ,kk B Ħ^I@ ]kc[TN@pҽr_ S82b&%\xc )[>ջl&We,ksڲ9YHiS* DC8" ۤG$.6.k1vo"Xz,Ϟ ); uqJnC϶NYC2}9N& (6:ﶜrJ>uJ ;(Gi8̟F1 IeZ(_vI6utYqړ2dc3%[96C҅ɳ7N)5#ZTpBM 'Wp62F&|ϣ ?-7*H(_(J:mVKų{t͗ ߌ#6`׌JJ5HOGg| QflE'i|9(OV F0^0_DNiV`MmE M鄦>3q3m0-a)J+D )t )ܞS&4:-%5  /{ [ >\:%uH(SkGkj`#71̀[ӌKjRb:IQuJӪuNM o@!>OX+A i Ӵa )6%]D uI G#DM;Uѫ%߷&9 H  02+TEQVL_j=iS.8LKiz>qJcPaEZ>Ĩ ).;şdfg$̝R SO3ct*qJ~[UEQS"J_WmNiYЈcR!޷^_՟qJ?!T24N=PAREctWgoǚ- Кpĩ|96H0>O_xTTEy  K&fز{ 1#y/'o( 41fHUEQKF&Q]<;p?hꟈ{<*.fh,%3 h/qMq"Z(:8ų~A(?OoIQEҮNy6f*"C3V(n:eV9%>NO,.R <>|uo? uHSN);̘ t6ÿT(r8şoxo)-Y/|o )N 7Q< (@˂t)LS/VTEyy[gK1*H. x{g>*H(oSwh(bѥkBן2ViQEQ)ie:$EQuJL_1)XuH(7wJ?dl:.NI([,Jo)ݴK*H(o(D_7ZCv(M%:`1Vuj0Xޓ&CRENKo}!)Sz)᫜SYuH(ޘS:$EQuJo)-[!)S>BSuH(tlIQEE;mILIQ~~D )MK!)}NB? EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQr?%0tIENDB`desmume-0.9.9/src/cocoa/images/Icon_ArrowRight_420x420.png0000644000175000017500000015612712140261562023626 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FтIDATxY$u Ͻg֎ZP [eb$JU$(R"gZ3M=<̃[)VoR+vKU\"#|5{<5kfYYQYfv?C"??C?$??@???<?@?$??<??$??@???<?@?$??<??$??@???<?@?$??<??$??@???<?@?$??<???<?@?$??6l ? ~l'ԏv2:Hcm\/dGH#gk|=9D~!D7VDHtz@o!C| 91rP<@Ïc.(u:0iF>m7?@YC?Z~G(<VE:@"+%}CL~x ]+JjnL6H~q4@=ya#Uey]#y(.4o/, C֚* CZwENDY$1眦)DCҀW|~l:"T'"DZ_uADRZ)HQ03c,.l>g<2-jRσ$?QaA TǪ 8( 0ZGZX)!DFIE$e挙̼0,4]iH$Y,Id9pꊚx~x mWj@*OG $RXD0zh4(8DQ `P)5PJR}"+zDQd)j33LDfNDds2󔙧Ƙie,˦IXl6eI3)uEPi<9ngoq변rRk8Y5I*οkh B:5 p z00 [JmRjK)npw9s='wncZkh0xD1$s3riDo>wuo~WǯtkƘ}fe`0KdXft?],5&-bϊуq=6/SꀪI?!p8^ NApBk}J)u:N㡇8s}[5L   $FF@x殭1o~;CX*MKߜ\zKW^׾\e1W0^wl6x&j%^Cu>R/D EIA;ں}#<;~V@M`/a|c$@X$B|r h@I~FNe#fzwo)ӫ_? cKaEѥ8/k~o2L8NibSyhIݵ/u-y(y;䰡">R }Rt Fap `4 띈Lg0m=yoNT0IS"D,@ЊϮz:XSl F" $\A{~yx[>=z ^ (^zW{^Ed'iYy(J㡲s eb]"EN# u"h4FQo4 8DQt> ; OPtᵄ 3$  4APB EuDtq D  @L$#eL'|ҳ?_LߴpEѕ~t2X0P:9;cpaS?7 /1O2AL hXm^tyjk00RkXd RH;{{ʕ?$㽯A0 _RW0/)4-TP:p@ڰɔsGVS)B#aAFSq(9{=~{F~xea?(9ȂӺI`#*WHl,V@@ƂPb 07 BFa_Ϟ{~ww Z?+.A|2$,sލ5JGZQt粣/jpDB:ُ#U):p8ۃtǷGQtOE=_zLꂡ DFR( r@Tcr𪴘ҥVyE MP=3 "p/[>q>~w{y[)5Z0 "i#e׵tL"/ .UW c#FF( pgg`08]Q{Ǜz] e`b"D)P`*tHZ,I@3j=E (К0MF  o?sK/yޟ؂ݞR .A0Zt:M<N C8r)eVH!{F%x$SGFu4(:ozwGQ[{'֣3{, z iU=8-V59gKd?JHAL`DD8N~g/;tn:FJD/" p`z[T{GHYtL"\]*Hٟ{m!<$T:`kk+F38z~#IC10 h!W&iwk*K%iX`**f 2peX㹷ஓ'/ WbTx]+^ÊL#Jj|R@IJ!F_Z]~ha5 ;8l_N/LtiB@)2N#%W}(DA~C E0g=VIsψRJS>YP:NHF/[Tݡ`@ӷwwqk@DƪِK*:v 8"HVA̩#DJA1aH=tm.>b @5NPBVIP!ntԹUNz-h8htv0߾cRL3` R@ Ad+^F U{H`$HNQy}AR M&P6S?~k-(ʮ9K!q\QXoPz8h8Ozۣ(moy1F \MQ9 K{DU#:ߑOJwf!QE.r|rS}_0l^G%Jb6 `/1x-??#c cg}K:K%a 0B QR L~?p3 q|;~=5@Y aaZj:1c3hݤt:Ǹڳ4Fvì xNE"*_LA/yn!kiΌ/<{cvm5GH!5 M$jq+t@M F`p&;{W&Y^y"EP6Aف 8mbS>7߳-.r"*JPN#B>j? S!$a 0Y Gl_t"(h8@Z'!jOqRHpRu*p'{(οq儑STq,ցVC7#FM.4 `%]׀z)Kp% aCgUB-!E\(WF6Mh0lB,ç/_ϡ&P::>ȧ6HU9kz7+]״ŠֺG~s?}w\[08 }HS:/ͻa#n"W ԻMaO]¤5? $ +İQU1ք1DB(3a?5xܶzUDJGI=n=̭tm2q# ll8~DE(?3EGiscѭsgI9HQT6D5[=jǩT6S*v @ ,X "#g_L?@KQ2Y:<6qS XwX_jMJݕEJ)`(n}ĩ޲䅯Rs GU(*AT8P] Zjp\uJe[@#q$[ިOPT);<Y RH p-ܿ3T_s1u#;݂uH"BBg5 Q/5 `z'(:]oEƸ`%wc`qpw:,dTŪ˶@nS6.9? p%NQD9lگ]rPPFl\Un, $693?1T_޿8P:0J>e,jJ^)[_7DfՌ8(Sa^E^oTɒeUbK)Шz]Nu܀S=b*_[MDȬ&v, _.*~I*5_-i"F e}1x-;ͯP:J<6 F\K0ML׵^T]``Џx; óa~wcwml+R)PQGB]MW|[J5 J5Q#5T ?~+_F95`i>)ǀV%l+[|$dpɑz=`$i&A'2ʯm_*Rj;RN.z(Naxm vS16z)re\=Yx3j+^jj88%նYr=q dgRݍ Z}kJ`@J4ޝy(9mz m\dWFZìк 0zqǣ NAp}} W Nnji:jNЍ,?^Jݱ}BpReKR{rWJ> P N$ &]/5j* Y1 L2 5L12ƽGksQ C҆所™eAu⯇ے/EQq܋x+۷yFAD-"ęr5!bwÿadKu!'A+ʣZ#|r*," {kjHřLbsVBi$( &i&tj}GJM#{is˒[ ݽh}tK#ZkqAAp~CPDW$: \Nd'}cTh *r=X\HّÍd>ɽMQC Ru(物,>NT~2Vu0 z?w?#i"$^vTia0Խ^/hvgξsknsW&,Yh, QPVD4z F L#M瞞L68TΚ !j`7r;B !F0pH=?wѧ6H6*: cehDM>_75]w`( `>qG[6I]6LPRD^ϬI-ݶ,`$KF @%tؚݹ5is+ ׭M94"iHwZuE F"2ƾw^lYmxQfFHjDoCqKuUAE0 Z3o{MLnjl#"BMl`#Pj[U~ωFXYHY\|.*w:rSx{kȾmwUEKEzOjg XtubH>}yR6e# Pɱ;Xq`Զ0 +FAyᓙ-%)pRKӡvIO=i{і8Me*7t7U ˪WR1+A'e{IP)Aey)BPJH߅]g0&2ܱ=T]oCC)'끴y)g='D@mWR*=0wsw&OO46*y?Qr\O!gn%xو v@ Pʡ63K^v9r#r""HU6i G!x.ϭ$Hv9ÁwECiS"bmi###j::aR@-\PܙF YS 4 R"6 (n6Ҁ@7DӢJF+^(F۾QZ4$r߻"#Dl;N7o=~&\^Jj H4Piw@i#TO)5_Tf@,k"X&v̇e/bOD?h>_j{K(d}6H09)ryˍ>!)-*ٸj!a Ƃ۷J~GJJPig(rKe7#u)ud#^셝 ARFid2Lms-iKwjo#N;oNu;QpM-lTEBE@А7 - 5Hs˦]\o]Tg*]T uE䬫#rĥb"S2l* dEr "[?{JB}pD@$@4pu?P=?wQܫnjs6I}`D(8Ht9"6,EWkN* -faIހjO** ^8ed5.,L]"R ȶ 37X5,ù@]b tK.+/jP nP9n) ?n ji:P @(f,A|3V}2-ָ(# ܈ZY~ڄ7DFVk^)-$ 1F!`jAشWa}bJ 4PmՁB=%0TT0O+ oy͙ܦW>Bd: V&atȪԝ[qf U-:ꀤ#iEè.r~4a$ :%KE>}jHx)i<ʡr[u)xӲyE* aqR~5(|_ 8~_?W=nJdUf<0485}Ea(H`p n&+dĒ洉vn@pdZOUwtpagٔk vΣ**".j;]^4+4)c1 }}ɯ!l8uR\-m'T L_ב;VH-âoGIc6ۺ}7UHRyӕE2RrQB^SQձ~,!ӞC&,!= A_]x(nWc:h3W nZgʇy&m""l6UHky9niȷN[lGakk䀒[aV! Wj;Wyg@6ry.2Ol=@žeEy^z_E 6Rb,:Ը*S?s1O~Ou H"57|oNd)&f`x1KH@9 ;n(Ju#t探ץ/VlKZt^xEڢoXDPcfS~dCN-7 J2V!XCI)pzW{(@%LEGF98F$Mf 6 EеBk \XpK i^{Y|ʷ+Aq$p͡Pi6# Q@Ǹ֊+/~bZ0"P3BPc,A,83X~;: Z}/iȉ>LڔhIDrfNeH2x/bZJU, )^km]ʨJн_Ոȝԙ}+ *r`Iַ%Y=0 ut`C3ReFEb#&5LM.1FHsqS?{J7 \MJdFHӔ0s""IQSwj=}w ǥ~H pFegҵܑNɈQM*[uO-*^JVe1ZklI.Z_S<1pi ~b#4ߕ/) F6kc8˲Scx ^Uo~NZ'b.;f]a9Ols^ XaDa Q۠ȶH P`a +A_=}x(]&!HySHMKY|,1S3\50o] js.+$Mu:q {VVj6C\JKAyy)#,0%. ʋhl!*OR\8@ӱ&{JB S$ 4É@3+J׳Kc$Jdya-P>fb&IȲljK;ocVQC80n4"6] "rF+JTơ]Գ2bE\ 9*UAձ?R $RȰXi\'8Gz}?sqtog\XNg͇,-,˲$IYM,O ;ɥ[=&];:6S|v@|hi|JѾ22+d`*-%jE®gF>gnMDtB"mјMڣ́P c0`\䨧cPZʢF6aNflǭS}e$IX,i^3}y=}|7D(bQ[ qWR2-. -vwo>ai;YXY5eemilMR3;}L U=JB D=VG {0ed Nzj_ȯ Rv˾73%54rI~nT52X,$Ii4>GmQ>9r&ڭ5:4nܒ~TZ#ږȋWJ =#i0[noaZRűEGN#Ѳ7R^VDJ)2'RžRrU*+"<!@(0ҹG!+$89ɷ}x(E[n!BuT)۽iЌ23s|>%I$ɕOuYӆ,uu0J[m[m#ZFF q\[ҽAzX.#RuW~+&[$ B) yg۲UQX1ir&ж`nH`\3N"=_{(&?͍N$Ir5MKs{ӏ;H=ֱhvdõI,n Vӵ󮊌3n u&TuYVaGi礵K![d(f9r` YP Agdӡ  c\'8Wӧ>|q>RZ}Di#${jkd߷2jj70Y,|>^w)~Q?SgQo`'?,*Sն~,|>L9"H.%hȼT;7Ie_~Wߦ3(AR87t uU[G*͹%-"bZ_r[ J .g\u<|(PPJg5JL6Tf!غ{KFrB-*"8p]GY@CcWIHYpe#=}/>顴Bd灴6D'oAh3$Il6zW{+~sߔbۛtèg$-$ܟ5 O[d4,~aAYskJH=%!+@F k7N s.Aue(.`vB|ɻ' sO3Aw j;bk~:X\5`Ae3dզ6X'<=컌 hXu/?uTn01h }eH!dsp¸")N#57ʔi!mf^4ͤ˪捡βҮSmWDI|6L(z5o3wbMAI "*]F+ZHT|%gY[COk2iiIZad`0* $?*B.P_غ#)m-RQ+VBNI.TEIOI+Ĺ@<72`Όl Ό"={.埠70r<㡲kQimB8 :: mWL $"IW0|)׶>{^}=tRNڎ; B[%'Lӵ޵EF5o_#R3r@ZB u n늢^ کX 7H` X k5zY8[DJN"@ T~:0, ۱]zĘ*s -т1J@-i: I۹0ro%MY{a֧ӟL{v?N&i\-è IgW?;TzK]GwYGF9rII~8 );]2'[IޑZ:)>8Iuvrli ݑ,,%8?uqH\_b`(˵2,?nj΍uY$d2ax% þzxw^ n%2k9h F隑Z=QZD^hۨ*fbrF))P,tV`8p m=d[~MRb>JToV\ǹ;2sHjp<God_yMɱTInzνWc2+paxYk=N|#^*P2`'E]JMז:ZZ4@ŵ%Z^Sк)ŨR$ㅗxjY8krQDW80dhۦBKX(T 0䶆)$ <^y`_K0s v"5~/eϽqd側i+jQ'j "l,KTkhcuo녯c'_}9w;ٞ;[Z %HmE@1xW4&HJ5IЁrn Xm{tڟtRyQ%)B8O7J~҆"7MWa+nr΅-rEG,ˈ(PRK`xv;^HIo ADBb;:H?3-tAQk-cwm )'~đUJ8e*()A='A`lWmm(}{Sy邑e aAL  p¸JO񆈔&rOXDHn?**%h(-)DƘl>ϕRR*TJp/$NΜ iI(azJ-I*w` Ai:}X2m|/f=%SDJjv)\ .WmpF 2%We RyWŮ q )U%H<mDʮ-J*Sw|FD ( ħ>;zv4(@Z3:y*E&h+ fCk:0ȁ 鳫7z(u1D'}V0: (`jJٽ-\VvuD t,mYg2MotKϐRWXe6WDD *aJȐ""٢F-2< 3;J;%wlmS3b`<7X `wW'H7=cstey*6v!ҏ[%5%Sź9ł $Gmݣp4 os-P8؁aUlzjrʮӁA֞R O:thm 2T&YeM߁ئ2)d&O)gߟg3L@hn,\k"r m+v4K H/3/}Ai;Uv"R*C+ ۔(+e)1S@3aQkM!`CV:a\)˒PXa\7 q|h,)3SFUeY+nࢭr$LͳT黲tKg]^dƜ!\}{ulϏ_.<6kqCm!62?nEԜhDIֶK鳟^yOYhɟ4A2iMaqǤtt90tDFZn)hjc 9Y#jQ{t{ۢW*Sydd8R|b> ;""r ,TPk|; k9 daH Nlꕇ~8>Pi^԰8=#h6 5fT1ȳwKkD:UwF +xi+t+Sr`pS;"s ;Զ-dz7׃IU|.NYóLgOSTf~TbIS!nPdW#Eyoŕ[K[< X; KS9d+VtqUW eiv%ъ FԒ+o;{JK OO,#uX;n쌴UtQt4#^#MLƘMŖYjRԊg+.j]=黲9A銐(۴rD(}'^JzatTnO.Yf;ƥ%}Hs]3ɤI>̧>W Q08 9ݲLa4hޚU:`$kBuڝZFJj{+J懞[8ȭE.Dja&Y0,0N0rM][vZ黒FJwNYqpwb##XQTUӀT ӀH)PɄ H1X+l_eԘƥڠִ-B*KE>1*xyr A` ]mRʫt`6M̒z0rwUMp(^Yj8^xVڝ6N#\︀QaJVH$8!z}QS. V=6t]q6RD.<6Jq[0@~cxEiyQu6w >zjP o10$HAHF5"j*|-wLj?˭riy^ lTJH,CɊLyS))A qJ.DyY K_m~T QE Jہ)TrTMR3ZZuѷ :#~~y(>q4Ti$M V9 jxw`Zo_FPiINW2-;[gbTAڐqTt-_2@*oaHg@d0¸ p^8 ;PR #Mܖg'֟f?6 Jm.J(}xUQy}sVÈWfi 1Mr~uwjBu ]^C62N J\+rPNgvȦAe (gx"M WPV @BwxȾ.M U'^WBIwI Jg?q,g[j:Hgd`:N0-x}aTa{=!$wp+`](r6Q智, h>AQ y4c(/@Ջ<}aPrOBݦFH~PXu$xyP6.fY7R*Mh'4zVu* .W`"#II,o2M=}W U-+W %A>Iy1-J98P'{d 0hB0$I .~d#TOy m* GrihoxO;fFLܮ!k) Å/|/ ƣҽ3PAW/qHyv[iD AH'50") %%"3se=x-u-1^ q Z2qH".I"Np wwE.jJHW(@[8)KUwE Gb֘ I $иze'ꅻFJ|#,^肑p -}=5mP]}Pd*"#t ːOns8넑,ܚ,Wfd5wL[,˨T4D cKx% 'S\AP[1K,+} %KPUcba1N]ZANyR{JOl=szR[DZ'rAi:NAE ^=#s l醑ӆ3d}Zѵ:" ;)Sh$XIGbvXŒU[Q(g)kα3 o'n[>eycہ Z&@8N>Z1RgH} NKҹ/JŃO d\U'h`:N1Vwmú"MeN >0*.U IKJ38-DzM)T|ۮx%/@ZSNL`)vA;m].(\nPG;?;⁴Qܺ@8h4 a 8av;JZI{7?t{==8q*oDs! 5an(04l*zTOwoRv0kJNkk O(jjp=< ۅuaT59tBEEj@" εVT '/&oِ.߰ i07瑌 Iw؛coVAzQv: X0EuF_v 5DMջx]SG*]!\(dHɽ(#%nv1T7 @rULSP]vŻ~mȡ&ƹ1Pv?<^vH:@5ug~v`( Óa dg3=УNsăpwaǂo$k)c9&ȫ e]JlZp;9+y=\x.K11w6 *_K^([_/XTlf*^3R{IZyY -ɚr*R\D1I)P"%X@94}U"3& 3 #Lcs4ad}\&HSƵ{ e@*Ui3u{${m̵Kf)YTk) RNr5#BUDe GJ(jT8$Üγ8#%_ l6K: %"}CkA#ȺpvAB0 p8 FQ8 `w(:0 Ap}COםeJ3 f"D"!pNlHھi&]x;X9Er.dG#{-|隸B!HPE fb)VR:Qn熤΄$J6jjgeieWDtMBu ݟ!M,_7}/I=! nZb4I %e$-#.-==])9&jB)[VB%^Saʙ _RNVV) Y p^#_ϩ4|#GHFT` x{{{dAt* a^Z~>x~mk7g_dzЄZQU=[q]&PkR22SwkJie  e&ܴXq7Z}ϛ9A~U5%dЄtgu\B]؊JɆE)G,'Ҙlb(~}bۖޒ2BMSseƔvFMYJU8,GE\ܮaLWYH8WY]YL˕l5(hhT SV^o\lR`ҨS2/MMZ]:?QґR2XFjUTFp8 ;w[{~ѓ ,"J7@} !mA8xs Ըˋݩq[*1rzO")P\㎙H4҄bnt']᭯SD:'Bah9 }${L€1+ fƄSEoUjU$x¨"ϩT) {J).k٢`n!^UC򾳙 ( )̧<}1ʌj^G/FKWDH+4QdzbGYVt` "hF`08·axGEv=#?Λ;Y?4 RmC!!'P"]=ihI퓂t 8VO ,+_G+kLוɊ*m8a\4uAU74q6+5aDuRat @SP|è+? .[ L!ǫ;iϭYE2du3܊.yV"1y&\:8V/y;@/h[ں t:]LӴERpaԕSa8p8 ;~lǷq|`{oz]O}඗R2sy2`+z !TyN;+(n[uYUz`$kI&80BݸH,|R,Ҧ5## V8A4l;N\Z`6\ \Ʌ‰>#[ 8=B(U"RX Ww'^q߃/JX)i hE:xhXVia`0a=F(/SdR|y"1΀F0@X"ʫâEsmk=5X</`d` )e%0Fpu`o}Ф>9ZJg78jŲMRκ|ށK{#%T/j;JZ--nCV@h~HX1[ԥ{~w]S0TJm1}:%=u`E Fht=Q=|g?zyf6m0R@_V UdULǡ&HbG(k#i9:R7b?F6Z*"ibpy?AVF]d 8k{#wmU:R\Mų]0ZKۼ0`T^\ /*}g\A5ABHi4C@8wLgg7JRJ+v`:.yvH((a`,h4:聝gꗿ+Ҍ\9v2T٨ȁQѼQxp`$k?!a$aG`aԶO`$\i:q`$FRXpu?<-W. FRKUar?%wVW 0*7f2^U0`~6^QzPH!bq,IRHjeM?;k֟Xh=/Ik 8$p# U-[aމ'vFѹ^ww{~dۗ̀E`2& ) ք* 0:Xp05t j?0YQ)B( 2H!9dnpe 3^ؽavҹ/0&M G՛:%jJivVuvT^*UVZB*6T㙀ـSA1^z$mSǬ""UiM(# SVsFFzw{OSߒ(縖DČm0=# #Y#M׽#Y /9=ڰc^s?Ci7#p"#%yN 3+4WT#2tҕ넑D@4aT_u4(YƦܫtvpꔠEy4Ul&[Dȁ~JE8ZAB{1a .]a6O1=7yGʚ8JhO:r"Ah0(*hDžѽ|w}- \I0M a' "atF2^g"FӹH4wHVnw5ma) #D/SknyR]9WF>6*:NYU;tu> H92+2sY yCè9.zRfŞRE1FXhQPUJ= Q0,΍DH11fn״ژ^$2:.#UFv lh8zwq|}_|W>yuI7ʲPDW@O"P=GwNҾzp "R+:m7ˡ-?։Z҃lzUiS|N!Cz0Dp0O;(Go_|ח>y%Xsnjh XR2f\%\#i22*Ќ0r$aYB{n3U$puB<)g'Iù +@UP#()v!,'&x쵒e`ј w}a)3Ƙ,MS̜eY-.ỏm"8i[Pqt[lw779tyy0)OX)y7(r;EHI}YYM˩9YsjũO7: =3ZEiݒ4-=J+ gz$QUcgTKo<F6CREJ6MWEtm)YaJQ+Y KN llϡasWIhBznX"5 F #ڣښJӕpfQ%sLq!t`kwUtÅ&ġFjU (OO lb!iY-4M9cHɝ ;qwGMe05pFQt煇{^oM ҬrpsSTwjT}ﺞk#w)!*z]J`[숚xƤ(z0v065gwq1qkedd)#hLEF]ihY$TuJEZ8:p {N7ؔ]`ۧ/Sw hZ 77d `kkH1'ޞ]cc4MbH45YȑIm:R:zީ(n{qZd)=EyUu$u2Uw6TĭN+tҞf[99 OZ #Y)`XIDvIB$e`T;Vi 2~~GB4͆dvw"T"B^qr,ں{OE;tvjFf>ȶOWO?|8d4-E$ ۮH9(ʾRuT p'Q_onɕ Lyd$9 ]H rmjhi܉aiѿ"29LdQ2::&%^Ψъj͉f+ Ҭ QJ &RP ֪xvwB2ox4 jWJ/g _5oWfQl$PٽRW-K¡ т-'^5ϼ4J׻$t0,ggʢ%Z @{(.l9={:Iq5aH8GEWU-uSw8Y#F?@tMPNKi:g$!^3:DX\yiZW&:jzmq܈ Q_-ʭèH+1o@@\0r{uNInPfH s"Y6k'U\NI *g[vj.q(ɴ`k@`2tè#>uJ\oADU4kJGJlSS"ec:;,ٶr1-1OУ;g'_J d. LvBG%e*: TEaq|2 'gy꼕Mt\Et,yאj3j\ F Y¨;>.z튌T,e[$tiU)-8yZ=V e7-y GF7Fé8V@ns)M9oWDy$DIucPFDU?^e_!ʥ)+`yрop8\󬡸s#$pu0 ~lSA\x>)^Vkb]A P摩S0,3TWRS-Hd%o XUK$$֭3Zلpni+YֱWP-4.r$F6GȊkOHF{V-ղ= !X(JI Yk*MW)l(kb{W~ p>A|G˽^jzt<3i(IEL^tP9z8 ;O3 ȌY>U.5eXY#`ȢYa6I<ٯ0J[C4`\~ko4]սҌ׃Qcś7JB$ Z#>2a0r")*% OeZO8(AU,Zt(ڛuP6Z"YN{;PV4+ԿK3h0bbyK8_zQ͂ Ȭ m<G%zqax"3w}5P}eoO ܨ )HzN3{u-FuY:=5 NIߚ|aX{LyZ}gY j(N P,utGFҙ+U,9L6NdRUMKK*W+I01w{ᑷW?q_x6(IZU/jX32Z'J"(ApRk}m7ўje}TmEMB&4tm JPyRZdmtEF/!֊VdnPdL& flŤ:p'Xh ='*K@Y3Vh)2hO<+HgM߉SdkVJv e/%Y^pVT*rR^qI; }>~Ig_[nclfܷNqp+ Svga(ۈY:o38ۜ%b0VťaݭhdtLT,z툌 IaԊmr0jq`H3&#Wr(ஞKFeia ò*F⑖pmlcʙHԳ*< o&*Laq~-f)H|@mݮ'_p;~Ǒ:54[ݠZkqa? N~o3,dR*g&t* aY^_Z:4-A59Hpxo:0@=2*^b>7'JaⳀ4IM^\tϵ FiiF45[<)Eγ\/q /- klg-fT^k.$6`xNN+Ч pZ_Wtѭ) Z:`[)urGO\l W-֒Si{\ԈfHq1blt׵:!p[l7GF͡`$ZuFm,GF"xb6V&pț"=E9rH nSyYKCD% v \Y!zVc Qdc-Z'τa84Irci#tw]Pk=ۣz߸gyhnGJuٞp舖봭eCP;Um(gymR׈FFFX#2Zk`oo, F&x >&# F5]4wtfqtT,lbVMp"j6U}%A1Yënӻ`a/ QޫNԤ(Q,N{qye3h)6 eJ{2F݉s- ޘcv$P!`$7F.`&U"ZQɦH #w.XCc` `qEq:MӃ\::ua0 #uN=E[;W(kiQ@X&ȜvlBS& ua v(FHo1LKP00E0^y]` (ٚFHё[DgDRyhK}݈ l`?yU `jAA(t{;(Gylbc#UTUT|D3]0N쀩6qwHZ& #i6Fibԝ<nF8*F]d7FYػaaaHi%ʽRn.b:Yewp|@LVHi!qXIu0`5=<<^n,b jRh;.ɜs6<0*۟H %gh170000ro++8f;6@GHk f{,@+k~`Toޞ.9.m;4xX=<<^٩J$"yd@æ9K 53/0-Q-I:{7F5Za4N7aFÄ́M " Q D0a2R:jɘsLDRsm7 (M*k_g-[%7Fn+uj;#V8c?ݺp07d`Y1rٷDMD$c΋rMs"ޕ$`FHkY䭉uePI#ڜTy¶`0HVDA$BѴ>d!,ˌ]͵"I4ڞJG6V/c\+*탔W:q( ^Is_?-KLKFFFo H6/c'6/cfƘE$ith"&v0'Ib,[cƘyI/ *$90bW!aV`Q)&tfy4ޞșMM_B_Xecimֈ[#c=-],4M,cgJ y4 J7W,V4+#4aaTXf4LR=<<6F'q"6cc~e,YVnGH7 e ~'Ii:Kt}S30A@`RSHE#wRsyiֿ>lu:'^~_qt` #ya#xyȨ؇uL_!d˲lX,ўC{ ֨)IDeY6Nw^‹_h/D@Kn]#>m,X99yp,PF&ɰw`$7Faatti (GɫЋ+t~$$IifJY(`֚K$],4MƘO]0oZXoH;6SRVѪ000:‘lF[P~'8eٞR$ mA}ifI4Ot|ADL jLIGFh!! v ?8hR,ni&I$lX$žO٭['mWK4$Ii^3W^yQ" R=zR;Reh#DDUPZA!./NW4$|>_i9IUֈ́2$Ii$ײ,Dׇ P#>0Ty3MwH$yyym& )+Ý,^Mdw>OFFGG!ejo)4UEwiXPPLaoH-˵? Vv $I.-b1],EAe3kd@ZU31Ƙl6bq%MW?7,AO5aT; n.i7)ۖFFFG%2"\ 10~wne/I$|7掺;Rv;)wŇVܐbx5ӏN MIEڌ-X~un5i0U0b<<_Nb0Ƹ:vH7*]45|>Nťt>aٹBl'J;NYh!aaat`D֕AkҐl ~qzVLb4vglEn6 ?_b6g|rvu9H,"0x`$"+:~u`d<#xu/0mja-bxi6]n\Mna*:▴I4ft?_M'~~v<:yta}ykd1rax7|dlA"𵯀_Sy$l6{y:^f$I5Aji_聴:R5%]f/s_g$3dH!N"K=*@5[HȚ놑b (FFFV@@A+0xNXe_f/L&+vkba1kDnS#$%3se|>M&k|7_K(NM~-װ~F7F.'1(Fzyy:#a% {p|=g?ߘN8QHˠM*/aNdru6W% " \&ݥ<=`v#q[0Haaat`THEP`^}?;?Mmt4Y,Iem:~Ui]sE`+_L&kt-zK=zn&[؃F:9肭e #yRӊidaaat$`hOHkHt@o4Y<3N9L^L&3+"#@G ]GNdSw&Il6 %uodi Ot@L+j{dF?J+kL,3癇&¨iZ %#(`. ߔw xt:itiη@ԻЊpكCfX̃ A\ZGJ{E僚.@G$08gX "lzyy5:E W#/mOs+t$5um<S[Α-CLit:)R* ozrw.@ ir nX $5L<<< k(a.)@d2yv<y2¦+2:(:(>Ķ=%r$K霈)i"? e>-PAfj*q#ZH@ec2N<<<ȆGai?y= cdo:L<˲튺6񑊌6H}raDH)I"""s{NC3XUP"f쏓VNlFo4tNN0*JK*(0C@;t/OOg-.t:Ͳ,e%:2+Ru]+mzꔗ]s?,R!7+","W _~jnߺ! ODS!dKZo!vnc#Fu!HEd-s"2jtt@j HڎWA, ,l[_|yCЖF#{-=OR=<<6FJy~Y|k/a?3L1_W|>?Ffr@tt$ZmJ%Ќ1H1f1w-W7.Ǿmл`()<҃neuѤpa000l@JuBB>̋{ۢΞ8tx<~y<_L&bna14SvFHͧHQW=jIݹ&c cLޥ+^x嶇8tpNX+a`c=#yϒD ~TW i4e*Xa>ʝ9Yޥ5`$RKMoZc^[YPsjϛ?zvaa #i+dȾ |! x Kl$<˲e赤꼨xͯZrcr)Mtf1fd /?k`{0{޹(.{^Q{?uw!(Nˉ~U[mzxCغg..iʦ n{{ ҄V瓦8AɌIԍ6H]DT |.!R!00+ `Cx~ɿ,LJ;1\,.>NU|, wG7.˔{6)'lBR-0lc$m7X.a)VhFF__vdre<$I1]ѡRuHiU HmP:LAaES?a[qoGQN;aLop~lOtF'#<}30p(of{A*'a]DR='H>p.*_ 0 Nܒ+u*+`Ӂtdڥs7T}CF/^)!7lX,4I{Q]xE0 Q v"h;ɵWOf9pHS$[,uRahjqQU[E-!8:xB{xt,I\팠5ֆ"KۈJ=⫈@; ?DFF#֐ad2(*B%Ї>!9*Q*]5%DvUc,˒$If4 0^ڏA/:ZRֱR*"2(" ]9ى ~.Ayc5L/g=5JֺWOFatԱ&`T6iſu`tXǝZqA}v4y[|~N'>I&PC¨<=6(lL=HrFh]c #!%`҄VNM'qw/iԊI-ut|<Jm+3!H N'}'~O>7WXLӼVKLӉvM˟ITa[ttx^ǻFok B{4V N+aCKu;`80:7O$,5Rf FDEzuF#亁,n05a$o j vR!$Zz]'ڐ7%݇j7l}|o%d 0Q ڦD>Mwc#ZSER­։ 7=vO_z->} IIj]֫# 4inwj]nrda!oz3 F{ oHzae$ RZ):ys9P"WMG,h\eate]fX-`ӵWch.v#$_G2@ ڏ>pōLh݇<ևѺuFJ) Ð~5>9n㏿'~m|v?XƳF )E B=|dY-$u^ ڢ>N+7]T4Wk?:m0"ƤV")Z@J)aH noo*`t#|=?Ko䳳 Fd0 ej_-ɕ"HW¨=|/}GǸVNa&_{F uĻ~'}O3Hf67uuq;ėd٨JJ]H)+`7F@F~ig){\t-BjxM08 ?{$q̪:X @ (ʶBa2I?E?ҳ) eBepH]`]\*Pu.}g13E4w1;=/++s0}s fC]Rpz:xk/W_ȫomC6vID ҏ8#waL5#lщȧ@jk[aGR ,RqLzW4ưqQ,Ӽ NuViyJChz~ p8aϿ7/v=W0%@!4̴wpZ FG#U(֌n+׌`\[QmB;eak{4t8cբ>z{0V=+494("Í`0'~/||w K4PJ~gZq*ZF LpNTZhFFp3"?f;"%i;.!K.Mgc~Ut8̓<4\;:`-M'8V nxyd,`A .MWX?Ą;* :7ƬSkjEkFa`DQqgmԛ=0yQ2#6ƒL~OAuJ{bu<)VH".hdU:ҢoA1 zcQ=_v-q0J PfAh D }Օ5dp)dE WMG?1`L@0Z3iL~s&`O%f uZhV?K P 6qSRJhsss/z8~__ʫonjqB1!@Wuф<\eo6 0:2 %@ !7^={0B\+` r3z|StźR{=ws"vK>*}]R2c5 ⍍p8t*}_=&ȥ$Hɮ5Ns+4ԋD׌)S*`7-gT_ttT`o}_wjS=n a2=J)[`p>EQ~A"H'FB@Pu^PxNWۦ8Ӽ@g/pFFA|iOӍ_.d:홂qv1QOd;x-隵?_8rPüYTN'%:Q}_×^{*ͻFS ""B`CգkB$ߛnN5]՛ uGU:#FLv@DQ֌.k y 2ڑR/`(ik> qD0 u:qUkv#< EUU4EqL{Ɯi={3N#Lo:Pu:~3-AUHCאZ &"MW]=mvH4J?èF}[^gEIP *,,Q-5W9ApxA3t`y`>MWdBPoza@~8Ʋ5@3nLYM\ 0+;.`@HX"RRo3S\t#"0}ʮj(bgl¾83* CèhEF3);R]R-X8d3R:뉼]Hhr=+DPRF.7B,68]}4֥o$=uQUv-uHfRvTfaMQsͨ׌4׷ M Pb(J WȀՊ<tsBV~``zqˆU0T #kpH-i*H*N\㎖hYC8ay-H2"XtHT]Q,NZ!&VjUq"0)*7v<60⢆V{inb@ TV[Ru` Í^W3*tƹ0m,DDP`Tql+B$Ӷ(/J̓<Հ0Z1Md4]0h^a髀!gWj(AkYFatWQK a  ~>7u^}} 2_MD|C[3Yk7Wy8L7_ A*KTU+pߣŬc-*\N @<g~?7We O\,Nll"kw\ݒ>(A@:`p8,^yo|O7B jDki:!ˢG5: 7=׿OoY?$T-P0*AeFvKs0}W`ch**øݾUvg.UQN`0v o|k8Y m\ynZ/rZat0B(#k=X0*)?BZ~O'ˎu`Pu^/`p>ESʷ_bx;M5Ըo,mzU kΈ,<0_3Z5ATu`xP`DjZ*WO|Jٵ U7ALEywzsnJEo^xww܁ɽXm@A)TxAR GT‰aԪ4]Q(@zg6Zrɴ =B4aԮT]LRECEaKz#t;{w sXHUi:)\jAkAej:U?|`TݰCjYʮ"QЖjr#rG+xGQn0 nBǏa ]z_ށ2SJ}4FP0qLי)`D SwFt0*Ǝ?pkFwn͜AtDvIq^;tˏ|Ϟxm(s!k!%Z,>%[@Z#0:v@yF;~!AuR3Zli H+4FN!0ͤ0T^/vNs1 /=/Mr sݳE7U)!eꎀaԊ4/)̮K=0*cwIZjt_XwSu:E#J?ſ'6h=ܐY*l@[!% )|'< [1v u몘YZ8X`CqN'z(.Ac/ۗG?va30A? N͉ EC2Z#P*f枫{av- CBDP,Kj;R""qJgS~ycnfo|*5]wn<[0:IW@ښ #h#J YDIj#Dv5qv;Ng#KJG, wYfh1~|&-WoNՐ<sjD~}Ff!(3ƣz5Ep-NJKRᎺn7sA<ݼߺߎ`bSWޭY@Xt[(vp(n^l~ZAjcpF c׌Pc9M7!cI. ¥J'O/XcPn;)f@N0 /(< ʷl6HӉF,wZ6*ui`uC)Phiǒ갆Uvg9 ?j½v: -tGzN .u6.{'8 o* ΍4X&Kx #p=T!Pzat 5]8);J}[g ً}x aFAR`6mܺtrk3. +,uvak`(*jc˗ #mzռft9n);NtJ.HF#aD*H)՗Rnl>ӻ [)P}Ԣ d$@reGPu%L0kFT`'~ lLFjivHtHHU;b|ŕm+:q43VJ) PAJb_y;bԼsQEAʼ jr!Qֆat id5|ͽ/?uat;p“tR5"G7jB:tݾ]*XB O>uֺ]#(GHn:WX¨LV]"@Hѵ(M%d]r Djq[+f>pj;k817 P[) !:Rnt% 26n̳aȏ,GtCF#%4 }*lN`ݯa*}zmCD&։ I!GH<+㉆8B(\AtDuR֋ZfFSKC= ӷFGrYg;ui;M5Pu\3C!I)BDؕ7Gk,Pf%?Hς[CBBF׿؁aa$KJ 0:@j1A\*h. uRo֒S 1V $ @4{,Qc œ_~+0U~]iv׭My/3Nٵf<.HY'"@#ѿ'P Dh0Ӓ2pH8/}WFFB }Ff0\V1FZ ~d̔zgABCl;s)72z:w (!5/9atx7"KQwA#ѱHT}HY*KuEo;БuZً$14"V;U7zq !L5a%0ZJ{1Ʊ5§Vk[7 S$"Jb.ァ |h́;0:3Bt E}F]6Xއ⛆؝vL@DUE1ag-`@U)5惱CjC9j,XMʮ=GXk z<4_0%kFDڭyĩ]8^3Qʪ죢'ck5"ʉ(7N 0ڲU*%eF Sp];P%PՙfkZRl%PZ#,I7BBo4ݘH -g_ "y׳ꐴֹ1&֦0;LjXiHJ#?\O5#馄jRvH NPUa=:DCTʬSڻu/R ѩ9#r0=WMΨ]!(:hL(r[]֩֔@JRRa';BB)( .`heg[1ڗz6EWBN>^km:1L`J裂t+`3j@Z߁`A&sycF0,*0:) =}*0ocȮ0xPz\;wEZ.j8IМZk&˲41fOnF !cf3*_%T!]^v?M;SB\7pNٝv oFy,˲<'Z]qkMb]c)HHf$`n# "MGn8 |Ckm3z;]_n caR.Mgk 60@`;2Ugo[HN!MsM˲,ϲ,ɲlWkӹ8at^Чv=$!SC;Z菙bra-Ykmy$,Fyߍ>oA)OʿI ^ڍ \5}Fg'0Z|3U2Q5|i;cI,g["PZW00rFJ>#;3< g?eWWpv~į&7hoim+SN>-yM%I2ɲl';vwlZGgڭTm6E".n5@TmmIdyi/˲-1u-֎ХX0:<u0:caNu4>a2MQ7D THt:Kd;?eg@ƍ'ati:Yw@Wa.]i\eP+v6M;E>Fj5>m7M^wJ޽ VIW 0ZFEޠSߵ{S g֠Ȓ<ݱ VN5т݌KL&t+MO.ݾDlRF|>`G #8!a $`FqUM7}aa?ٱ,TN}"b8kMi$$I4Mo=2Mە.J[_QÈNFt4+`PPv?dg8ּ kPпE '.\Ot<.;_z* kI èጊuH׌~0Z w ;@*jec]k[@'ƞ$`ʂ3ygt2L$$K74I\r0tp0t۠00}Hgྜui:i\ 8w:M4/mׄRY>Gx+I[` @9 @ClY#!\;k!>fPBSX3hhVq7L&;V$7:/Q>ືӼkQQ}E.YTӱ3ZËm}>m<kIeߧ%hK2Zk$I:Ghk2|$vs,'P(\rmAf(@n=MpChՙ3f$jL\*Y''\⒊"!b?0Uu 0;fW@Mŧ.UcެuLcKۡWѢH4^[_O&RjGJH)þ??x Mv`-6v p-^e0J1y@M1`=绝} y a喊E ,:#KRw)isDd2.$6~~O)DRg`X4S>-hFwww?a;AԺxGTyU7醜;btZ0:h,6Tc$I#!@e{*p Һu! @(?FwGZ;ZQpF%ߚv8LM5d_Zk d I> ?yrkb.ba@A1}] BJncLekFkzW ڤJr'*gTD}8{'gFHۻ;G u!zP@Ɩ`"Z#lvoHr(`}UxH~:n4dooog2 j h+wYLQ\"dk1yeADdDd.{: ܽ ]v[sa?j`/\{ژ~8?0='8M>E b{;kIA"` ]㒚kI>&`K4@u(Y"2Z=̾Mٽb{>a@mVJc5<09F DAD)Go~λ_Fht{ooog:NF.y\>Y$`R̬ S]ҼЀ4RFn!MSpcS޵68۽on%_'j@)vhYmcb07CP! 77ۿL̕+4Fh5v$i:o͈aVroXd 醡s $|5èiQnQ om<#c13|}?|aR(tʭ-9Ev?\}Cѥ[*@@v Osѝ'{_,}4~4J$I<^2.sbk|+!Dt0BE iSyNIkMIc:ZZfG^LnwDng2tՙC2~\pF`kOUWaC`@+O^z;N>L&7h4ڙL&{ILֹvQ:]O(su2FUsY{O)v^\׻t{vv/$/sj(@ebΨ4BXV|́ѥ&7|~nn?_<$dr{<o,R+F,pILXQ!`jBJB (nvn{\(NnKܗYdg||vlڎkKwFs  ʽBH7krJ/zHtt:3M&4M<ϳ<ϛEV_/bH,RFHx@*B%TANtznw#sNbE0|k>.=2t?(,r@$VMEׇG=35>%TZ7#;{m0p]Pn?w 4$ɧd2Ii-E@ 1X $kE(CIRAEqǝNt:8EQt> A\R'̓Φ.+qY'U@..ghݶz( ~Q!GC[j [oCnMؿw[Ymiz'Itzo2&I2ɲ,<3Ƙz"ab HG EkLRQAaq܉Qma9 >yoj.m`X ? й}PHxgT(J ۂMG@ɧ@`n^wzb\\:7Q7<βl;˲$Iv47NGte4QpPjnZ]"b(}F($|OJ)0 (:q(FQp@)5PJ R܊;^7Q.; @6.SlA/i/~lKw{Z|e$˲q$IU@d8 H5È@b>;AiSZ8I)RJz>aaFJ(X)I)#)e$"*D %KDQn͌1:3L,K H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxlYv߇}g;yW\]=7# d(),%Ҷp[CO%lA$H4ЍǪyztθ{<7nU"_aw$"͛7ooS-͛7oH޼y͛7o޼y@͛7o:޻ Ț7$oGD.Aul7$o+=Խκ{)oHގsCiN y]{@o<< "ZP^!=e 5Ju_$o{U}ՇP>>6n* :y y{`Z!ZuDi ('oH !h8REj0(4P@"B0@y8y@6Vh0`{{;aEu h %(y\;/̼zvfc `c c 3Ku(1eck`ֽ !.NL<s>٤ؿdnҕk?~,y˲ {eY766&EQzirWǗ~໯ey[Dvaݲ,1<ϧyOkt:-$)]֞9L> zx} ⦣BRI ;@l0>$װ wugR|;O,MO_Kʝbs"ʽJ 1 2Ø@Qyꁭn=\lٝhꏟxx,˛|,[qe7,onnN$IJ Lq? n<,@+̻*DD9uѢ·aD d9PtG@XX|RYz% lE9(\V<qWDȺH@PURX%A& ٧?t}wl6̷ʲEѭp4Nl6:U`%0Z H84S{:@*(Up%Bf٘"{LB@y#YO-!@q3XdNC!L9) bx{;sދ~×0Rō(nq3,۟fh4JfY>W^7ʍw\x̍`{УLeg M`rVA:@ "{Z\[`/&+/+dg{Zl$s)BABf 0R6}SO}+o7Eq9 ëq߈`0Ft:8Ns[7.<{ )ZqYM@]l/޷od|2ܺ ;hB7~дMV;dEz/Cy&3Y\ֺ'"v5PZBDULIHIP2#8ֹ?Яͧn|O.oto-(9t{8 t:&I$Iގe(B͈`Z8=<_~˿'|N.rW0Ep8 6ὶ @O@~VD,,ʲ?QK5y Y ZԝiX>r (OSW)EFbgRM.[R 0@afR@ t}G>su?ԛOܾ0 /GQt3 aNA'IbnхӽRUFF7$ow_%-ULMbY ~#;]h%$OwjKGxfZs )C5EиAo Z>UKbQba8"@(B(aPO}ƍ?޸o~σ4}CkvW(EўzEQR+:K(I){UULjOt][]1.N5u 4W9.uJ":]FVгZIvX@4ۓdωZ3QQ,/AHR N+',H`10֣'.\gǴׂ X)N&%<Ԓ]4N HގZD:1HPHȉubH]&&Ay&q'$N# LZZEH_ 5t ].sj˸+m@tvU+^sJ,X63J+'΍㗎_RjCkA GQD{{{EeDž7$ow D MׄRW͝rk.(7v 8u$<]H2t =Гu?5{jGJRRJ$L&EAw<P (|ͳnBoJaCZ R{YJܼܪ:g p1!@Z%,4ߌ Q՛+Kv-7ΣRDz)M5@Q_<\*bo:&!*1H(i4_ (RJJ)@eecz7qB47c$o*c[Ӷc*Uhyv,ۑ ;wDő p_uZQ薽!shVKQ2?-<NC'}6N$ ?A+Ev'$ DSE)>elygQNV]kdkSD/Kt95ϴo][}1Tϝ!voETݯ@iV5F'5x y{tcG2fldͪkd|,Ma1v<ȺL傓Ew߁'鋐tkB@D;)'Hi~mŦ9GE nvI E[?j)s[uR M(Z03V=SO{]y+ oDd^V~PZW%IWۑ=TFzOEl R wfh;-U o•;4 /Ls--QFatX7NclT@1Ie%;4O4O2r-꥾47%hLܸrn <|K_5W*o7>P:MoHkjOvn;y x_B>ajN喥Jg҇%$Y֓~5(=ʨy{^Z=~޴庰P}gjBPxS*ld9ő9*   5af#A)3W¯}*ot: ;H)o툪zqS'(7䬡HCyVՐxJ22z]x^4sK Wq,9*y"MD %dcVjy3ݽzFbDBdu\&3'ß_ ;,%˲bgs0fX oehJ\q[YӀjƐVtv>M5T'*,SBFNtan.oyRޫ:ݺ꺒Zq&pʭ*ʂG1ْŧq,W,e:T $aH@J*~j gOTD )ٔei$IPe/œH/<a u[pt@2_2D:n7R֑QZ}ʒxҺy y{?"=`]s%K ` Z݇JKKdjGُ7l:TH[d4 zqǏe@(bYzF澲nj7RdUWbØ5U,;$oGG.I.-szTW"]G8ҁRá#ޙA4A؍vhh¬1 ["2,CpYG6ڷd f.Sezܭgrg2oM$M43H+4%R&PLo|7!~/fN11Ɣeɍx$Z庫*FLwHZkK P=:w-sU-}&xhih ju4C * -b#b<ލҫpeYy^dYf>R]*DyPc|$zߘYvC6HwR ܭG( "(Q544fQкj<\%M){ e/ {&K鱭~EA5zUj$HPr=0a$X2VC1M$m$jd1xLY gFiB% r=f1Vi,*{NNgiŹ!Di4'0fӷ>|!m<5 F777766QvI=bk]+BvD]vl}BR@+ӿﻚz ;oय़{{0$`#U^h>}H[sth8t8q$6GPj0"6`qݵ]AGx`[|_GMJ+ֵÄutp d(A`*4OW e] (ny_AFnkM0`B}bxS8IYQe禡$7eȥKSL$ ^߅}V\Hu?ܾ=* 6"=@{h ˈUFѐFeY*)#R nC|,'8}>8s1PCH^\Tzݪغ*|y))] ʨ/HJo#+D]c̔m34@,R -RDDC{)OULh]g H+Qd|ek2T*,HG< G.Oc 85U%ܪo*⥆K[[,]P 8pOK*T "OJt 5a$q2WJD 2sPf<}rD?xWp7-reYeY^ɲe^'nvHގRK:ذ6;_Og*0L2[Ire2\LfF-B!UPRquPJY8Y,pu8BT֑glzfag ><h!)&UTInX`!6v@diHU5J.MٲkCd)TN!W,+lG>RHF7.—w h4β,ItYwq)@vI\CWǍPߎG-Ć 4s^N7tE' $xUJ69BiC@)gRJ:HE"H=˯4Ft\tg'?@:6 NjƂb, -:RT0j^_V@E٬9qC@'ϕJ"#I Rږ>b XGlyOD_5oՃQ7h^V]G6[M+b1fd:eY4'J5N+"BD=dɤRJk˴@kj!Z0Ziq&69]y϶Om#c<6 vU6dKayVC馓N9M S j-̃Iy#ּȅT LSϜ7.x0 o h4M$gJ%ZsOg5x y;02EwPX k?>7ňH)N1|9weY`:+RZAj   0 `0 vw|O'lx9}ታJ+Xpۅ; Z!kfNMkʵMmbYr0ZTuqc0ZHzۓK/|&~89i:͊:V(,UIo҃ >ۑ5v+k[v"R CD%lrAiRZqeY6w\[ *pa( 0a8 `3㷶`L6>9ٽ'|Ax1s}nT2sk׭e^2&KTYxՀhJYȶPhAtY5e^G)%;ԓ]QT\xgccciڤj\%yy y;Vu7/{b8kF=ʨuE$"aA8e>( %Zq/(?c[kD(8jl W5aϵY[eq;顛 D %B3<;'K?y'`g0$06ˣJ%_#,QR0jo,KEW- N7pm*+ڣb[!a﮻m"?~aanacu%ˎ1O^j]ց܁2ʨ^,,/2KTҪXһMlXJ&:Pڧ Paf̥-"RlFe$tH;fkµR0 Hl2:un#';&Rع3:waSz*((uwy y;>;tfd/{j``IDxLbj,=ׄҪ w54 .ơ;ΝgوaRDx$u?'g!*L?/4d-5rn v^xl=4,uJ1ʔ"fKۦhp&Ȳ0 7\V2}^FHގNh2MgrlndRŜqAjwj%ޭRSm}$v*:,YD8ISu9ӎtstBN*4HbCtRŒK):mꌪVBQ]((E3(H jyx6y! Í0 bW|QH.Eђ5R9PEuĪ`Wjݲϴwqa;9p5GR%6 MSyIݮh*yg?M=::SA'V$bYQOUJA5dGKFn:k3 sf30 6w~~i4DC"uN<I;IjjpZHݥ[3]z^; @uW7O6 h0 5+@:$oGH4/V\tuRp{Wnt6{칮hMuԷ+ S@0RK 03eYNS87$9έ/Ǐ4qu7O(G^Ǐ1ZADu`0Hk"͛ JgKh v*Y^+ꫛ!b[Y&˖P Ed-(ѺjYc%L-* "t[bPeI$`p;k~}cH*U}Ūh ׊eyV,Ĉ1nN:0>\I=[ܓsh%JY{5*y}f:*d(2Od:v4eٕc7J-FJ7e56u9g̍=ٚ":[]PƐXoW? prm+JHk( +$oGEuwjd{WSt[%/J2@we {Owԕ#nf!WB=X0ƔIp_ܾ:{*pާOZ?sQ% *H[QgG#={d&pJJ(@)u*_lUm5ͧV.jꪤB{MS=$S?WR)U˺TLU4M$I,e?O4,QgـtQg|:lUjol;쌸s+eʬ0Q)p`RR $xu&I7)XZҳJ#M\z\t]wuT']@>wUFVdYM,~WU:5\fҁw\j͹I悥6vf`2F`nԩyBJh,(RN~whYlm>qqBYFsPZEuA TVl̇۶LXt(YM<˳Fww0v.;0j* y2H.)a; cj=OS ;ڎ%lnBHDQHD U *݅Ds/Dj(MTeyU7N Ea VLXr-݊ͲIQEQo] ?fksx4`$̍$F~|Zm$ f ɸb\shB<Ta $k5OxOj5f,.?f\c׽bvՂn#LeR'|Ucyslʲ,N S@U jJqڐl,AY@uUX1-?Kɚ|U*(,iQc+;JI-L>)|-7'V ngN`hrƧ7cdnMreH+wyUY ߺ煅tᶲɝ4ś!i?H 1,UcxW%yeYΌ1ƏE( arUqɒ bcp1+w($pʪE5a괼Q4mzmOvu'rQ-L^/RsA0jRju0Ƙ,scLn{vl\b>6Y*cF}pjgIkb̨NJ~!- H>-5]ve`V楮>dY˟wo޴qnnNoO6]X~ћ6.",ˢ,1Tn_K7)1E3N)xPv bFj腍}}vћ8\VS &ЀQkŴf:/7v 'RǏ)JX\x8cJfΙ95Ƥw- T*DI%̵/'tO^,fTBM7]46p% RyP\y^1y#֚С6鹮{,Ko8w| vpœv͉-L᠔ލvH*/uӵu]7]FwRTgbpCqs),;oH>pjU/r@>|Y")˒,樁jl3ֻƒBX+Eܹ9~rZA,IXhEq7tӹ/Fw>_a,"A@^ZWLEmEԾqX-ȭVFZE>mۂJs=" 3[4ٟEi.\!HzDfӡ3d_r5IXE"-[Vwi nqsYTF`H3A[JZ1R-"Rdg\9ifH5ۛ|ܑh궃_FNye2@)"F@gR51]]$en:n'u&N(aBm}ĔR@JYɍH]Lnu1.]5IPdbP +$.aHg.Vc'ћrlU4߃&;Sg½ϣ@ntրRP8PMrc .0MW}nܒ5|U Fʌ$9iaaގ!\<}W2eHqj'~;gݚof٪$ B~-VőU%`"bN%5>R@Y.OhX. 8$)L 1S b žI^5<%#Hӭ_Ѕ:05Qu7RU}p{U׵h"j](\Py#;H,ZeTgAH%tn;[fcB )IscLOx- #:<ćTFFD>5}|!bm-(-i/RT M`QoCFtyV"Ҳ;Iw#"Xä7 Sɘ(˲\7{Et$',CRK8edcHW>-H(V p`s'V]eF;SɬD:+\J:^Ytm2 @Iz@Ȥ:enywᾮ -ed;ES tH~Xc[q;)+tُXU4[w wdYNKI"ofj$rxv̸k[6jMHގ6ZYv=mzcLlpOĔu7[,P@ %d )$zs;ӄha>z1FuYZ"SQ7Τfr#;<3dsrWWEH>Xcdy;^*ɡ/iƠ kr02ojJBR4pjc1NJ$ ɴǡ@?N<'p11&(reV:7$oP=;'9{jWY: ^SH)086ñ#Ȋ=YdYle]iTUQHP'7f<[1(2cLe'K@vԶ=&[| 0ZP>ҟ,ߔ^v;-{5OkZ)B" 6ƶ1enIF&%IP;Q7)H 3ReY9N<50bbf]OXhJ4_0AA뭷5`HZ)*ةi&4ߺuD %#Hgec݁Q;k{8Ͳ('eYΊʲN@_W=< X1#9BzŠztr D!q7@T@kT'Y`#Puig>,5.IloDZWHA1&1fREREVEFX%e@vV25|cYL^7n~e$=NY6b!.LMZk*b >\z>H[Y:0U5|.D@`n]0Iaq=7f\EyȰ;˹#*UD ]0uQzlenfV[Yv(Qt|*i`0қ›R&PNQ8|m=%V,rW$(AZ @vT0:3q:dZ3Is5c]/F~ICU TRjh'i(MJ I l/2N&PA\мU^<Ӣ(J?Z7%o#cjY#H,kЀ%0oJ$ &[_:F]eT_0pm=Yn"1}Qu%W|qv+Lr/IeYlǼy y;:ɵab^kt`<%H7s>nmCU>&k}uJ)qAj|l)ƓK~a}'R *$d^}:e)b?˲$ŏ qo} >DPr1 LSxau`M7I:vhta'rYZבn(%a0 (Aqu v[5C@ fv%97+EQ|yy]WR1o$oGf` 3*XpaiĄ'X|>ETm}-0 uqCCO^0*W98c彇Q>Di 5[b'!WͲleYZY|fwy#W,[3jNt7/Lmp'N:k^v8]C &oKu%Z0 MO}Bi a/<<3eT9KVp+8,oy4˲lE7SWHގj]:?kp=7wHZn2Օ[ĦaO>]UBX(`0(A>qϜ2.l!%W ;7m`UrRXsќ KEQyҽKf^BH>>Z _Yz@q}fIMTFVų&c={ u*~( `0 (O>cgNAZ͈ཌྷ3fI ť|0)4M'i mӻF#K i.5/=zaD9ujyPJ)5`0x~⋏SqIK;&? N @}rmSHYeY6Ͳ,s p|BWHގ@=\6SNsW2j޾xU<"@׍:SC8`0Ϝϟ~k'lհ6Ķq#e3n(#8li 4K pN緲,iAbH޼BvԠ͑˔/QF|:Hl] W ) C= h4xj#|-Hflg*}6$wn¨:"$(In\ mW HuX?lo%:`083|#?2ݽsvLHWn:vblP^ Ry~-MIy5jցQΛwy;<}r@o#$wn:tvˍEHَYp::M2a1Ǣ(:}_{Nbx>_DA?.nH5:> Hczyb^4Mun ,{5חƎW++oţsʥNg`TEJ zRF}sh4:wp=r}*ڠu'#;V\J]xpol6MdeY^e_20yyfl,4RSzP6!iCHUJiUEh46666N Q=>s /M2 BW~ca,]ս ߁Rv|eW$$8I;:lwo-҉͟{@y y;KɱřN:iډ,q"i1Twy ӑ=VjFyr4E~s>/ &RKF&wMgw+`&ߦ׹NӴM(\f]_wWuU7@v4rc6|MtOC%y.#z35b!WGl %n:FQ1:6qSO}ogSi 0Ny`Ӽ^ult#\uN%E׿ٵ~lvs64ꈱCj~]Wsgx>1 ܘnͅ;mqʝ.DXY6%vZ@ @WI [[[ۣ`0x(>Fz$c(4AH@i U"#FUv"PP;?'N?̲R$gl6y7ԑ`uA,zE^!yʣJŘxO=xMQ]/@U)ImawH>Thsssyn4=sO{砂0%2#( VU 4!`]\$InMqc_S v9HގjXFَG鸽8\odn&?pveT߮YO[msFMeqmll ;uf8>O_O}1;g#"BeURhFv= W7oIl61N]GuRROoZe(+$"!xrk98stݘJٺCZDF]7`0766-kgGу O?g}{.1EW)ۙR¦J` Nƨ h&o~og $IM۳ly_#:5Hky y;`-m+F8Rd{,&6!,.(`mll T0:ࣟ?w1(%6q t FU2 MPHxxi$t:v [V t-SGTλ<Y*q?+z6lAnZ{|jqE@PukMWk2tN=4 8У??=kЩ*NQgt@Ǘ e782677666W(zO}?ws/9kB C $R`N 6Hم_蕑L&d3ͦEQd=0z7Pùy y;0|~_~W#_OoO . ]v; NmرMi@j|ijwN N7x|{:N,ˊ(:2xꨥۑ9YGHbF ْY*()񻮶m RUt[ :$rMv RÍp8<>q|_=?BGN~r.OsF`l83)#P]=qi00DΟl6{s2\Ƿ\wwȰTXfۆ $$oGԸ!]FMׁ*42jiT/뺫JOnje0NF>h(" @U h4ڊ`08a>3_U31nd"g aϤ*eH0r " Po"?řld2yg2\L&{lpnDEuql@+$$oGU!Nf2o4wR7Bܧ1\aׁ q* "0`@1R! ;w~Uhkp}tF<5GQt&_|vGOf#-#;Bxȍ`aK]i#* */!o|vcg>^L&x<͒ ݪNXGʨ~<AڛC ,$)3d~_4 `)UCםCS_:(Q#"JI(88 h4 a[QDg 8gֿT289 !"SYE-6Ża){ZiTכPu\o}k61&n$nsnNޫ)SHۑa>B,ݭa}0%29_)IbjTŊ\s$Ё?UGU epqsѲTn4P `0 (Fa dg S}_Շ+;9^$1 cMg{+0Bz oMǦ9JvÌwWr]܀P#Ⱦ/M]sU0ʌ1P Q:jC6ޛ҇ JO`dP<uR s]>svhW#ԭ9ZzZ|omQHqaqE aEAlAqihG`#zv7_,+ *$rn:%ndиyFV5Af!a`d?<~OV5J(SO{x|y2\{iβ,˘8n؃>}fHގˮϪuuaL& #w`6̫u _@",/5]s- A@h4iT `aA0 pr ::>:sg{K#<}i ] bM 3*]b2W%,0U5G=ZFU1*@H/A}#䃧t:}ۥvߜL&{E2:VA_v+$$oG /Qčջ #Tlu[~F*VJFSI#b :APE* C(tZkDQ֢ b@k=ZZ-1 sy>c_@4 vI\/Jh!(  S@̝/؄Qa`Bctsh¨QA9Po"}L~)7tzu:ޞNu(uat:A` }_(!tҗ ](#ݠQ~d5cG׈0FZG$ í,DTV @DEx(vn@@QtNCm>q*>y؉HM ^n+%vg;`TPdS}~)u15X:FXK`de FQb'cjH+4OH:nG\:7'o#vۯI2^Jt:1NofIiQ1Xw #F۷ %v+`$+ƎaTHZ])Z0 @$`vdX $ZngNDHH%%0͓PK20?s~ÈDH:q2Ga4RJm<30 Z22&$e\);o3rsM`ZUK`d3ܸT̹2r_gӵ`Ds* Uh@Tʐ /7n="s2\NgYz\t0butgy7$oGX[@6\Dl&ͳU7H oĩ梈@@ ,~7<~<:3 lRawyLDaq~'cA^gAldLJŜ1>&%l۱hoD)M 蕇jTrETŭpcm*wiƍ(فMgfܡ@FkPC|}'^z1Mfflvs6NI,scL`TPCw FSGM7$oGPJR6Zp{~- B#o2.NQNF1fxm/G(h@! R+E"'cV]Ft)6eKza# eèJ\hRFFazau2Ϧ3 ep5J`p"[ܪ" 4ʽoQ|!.?yx<2ͮOӝ$Igԩb*Z{`$eu5)+?,qLw&V^jXMB-<8 \Ֆv2*.?TlJlu0f^n  ke9;N4\"+jh>TRF1)Q/".T`K Sb @?c{|3N&Irm6ݞf{t*2w`u{U#d7$oGLPUhF ]TQj7{cCfjŔA 2@Q%"F06Kj- 5ܬqaUǟXC\2~KŵH\Dž Re}:miL'AĵP#itü}$?Cn>g_g^Ͳjג$5v$'I2K43wD`4xEw#]& .zJSHX9wZ VtE%J@]wRFVd m5I]d[ChwuFO'R@U D,4Sr ,XU[2HˠSZ[U l]SoKSg>؅,6O'Ir3Il6NdyZĖQE݃q-ѝw?{$oGHY!(Ո11C׉<}D5$>'2ӆ@ wLd P`oVfY":?F]^:tH[mC|rHpUՊǍgl0oTHy|HE)p1F\5{ʹϿXiޜfi'I2I4Ry]ENeůFU ^y y;@r1Cv/Q4ifp^v5vsH 1&"!) f%ec@+>TD؊UȰ3ogndH*/`=ꡊK`2nJlGm5nrۉϼ]ΎV6FJAE P 6_6W7Om]9عy~}2HV$I'I2β,Ͳ,mZFFn}#i¬wΦkz ;+p [p_󜃆ǯU]~Vb*8d:>XDTub%# zzowNӄQ8"hj+YPyyCE,.فhXLo"}/ /&Ϝ9~c_4MogY$IUO4˲,3q"=wO`$G!@vTekʭZ #qK =}ҨcifU!z` w?fuTP+ N܁-u*ZPm|Pa^$εׄ4K+n$3H=H`+g"8㻸RUk[u6NiR͚ō7Q-|[N}y߿Ne{IgY6I4ct`׼nԱ'ȝ&-d{~9;Osſ=7i ` OgDُan0`f @Eʚ^BϘ,y y;@Irc>70j*]P-'dOr9/Y7kZփdݸ"ZJqLsH%(#t,ޞ/sJ 0`0y>|+xM˲4a_-;<eH@K\Fa>0m/-vS` UJY/SZDYnpv Nooy/o7}G~ovo(r(=wyieY9ʲdc z >'%toH*lWqy8owIƚ@)dbgOl<įo<ߺwޘ[oE[NQEQeY8MIe˾<ϙ``%Jk@vDy$]nn(LY}\X2%J 4^w).JNxٿ˛o+?ղ,oeNQ;YUI4M3K,Z`e6KhHގ퀝|}70jFۅEh:1KJ`.lovJdAj\ʕ QHO~s_ۏwW,eY*VQ;ydY6Nt$IeY)ct@DC 8[(mQɦЪ!ZFUW 0ϐ0|Ln*SE PFb#?؉'~'gw_cnEq,YdY4K$HӴ(˲*5J{4T J}Ȑǐ<M H۱ TgHb/ Ȱ`o/iFw#̗5sQM<ׅn2Kb K9+1mŇ>ܯ>Xxew~7~1Z˲l6&If"mIݟ$Kt]~w_-EEQ#Ҽ'a$!u,֮ͧ8nZ\ԩrTng0è5m(*Bƭ+ R t4}=;y#_G?n~O?E~9q_666nf$If,fEe,;}P/pM|ڷͤPZ3s0e$=祅Q:0꾾.Z^̎0 VRvbL ]u(J"HIty7Sn~>}=7~B};Aen Ýp?t&IR&IRkjݸمDyy y;D:4vd9MwXMi>})Tv \v (R:36؍P P ڮϒ94RÙB.rs5:b{{>"D&֢14F+׺DP,;WnS_~٫_APL7bO&$|6EQpϫuԒSFFHގ.AwF"p R)##j]*u6`'F@!AL5(!,P"5漴c)d1J(KĩzU rV"{XZ)W. nvR "A2~0zÿŇҗ赝];LW0`0 d:YEQ;CCIy,%$oGЪ.fq![0ڟC¨EE޽޻ 'u?j R!q.FU>(ũ < G tqjx 5 ˌgF(PT2@e )[̼1wk[1 M 4I."hK V6lUTY0Ir7։> _Ư~{A(EQt+0 8frf7.Ϟ@v4V`# %0݁4Rw'<43(@!}y ~N*e]KGjy"@HѴ05B Pm͓PǠ6NBAo:v4 bX cm&c!H ccVFzNTFcX #'RmRTOkD`d뚴{kܞ~Sg'v^ .ax- q'lZZ{wPa~j#iRU Ҭ3Fҧako\Fv1!yGt5c-S-\.&b""ED"`fg }8-LT8 :N=}@) Ό[$ r<3Wq=w00 ʀXJ+Ϻ#>@JD`H CS&hfK3qp/O/T%Zmaa8sj Ru:zwP'Cry y;z5EC.Ě0QV^t`h m A @E{=IKi*b&R+Ѹ$)w^9Ji&" JCE*RZHqycݜ&vzᅧ, @P.\I*Pg #]U b((2&q= K%C190OS\ tg/cژ[S 9$+}$Ԑt݄Qu4 ۭA@8(#7P"cAACA(ެ@>.p5-ӏ{s/wןZRRzZk=uʆ oY_CC#'<QHw#S2vŻQit0RwfDrcLyiRe}c{cKvH.QZ[TTA  FA Afl<4[&'vpO[(!& RPnl[g/`T [@PV[$`@(!ȩ*E̩$!@@j-RЪ}D‚KF {p7WH)5p-mtZu?2PJd =<QNFʂ7..J>ocT*\`eǽJ 1Լy 0 +Na8 0`0 QaA-zzo Om=C+ZNJAJ ~a3}F{_bDBf$2V@ۇrR+'(*V JA &I\)Ԩǿ]8 R H~j]!QI֧A@vvn0 #$H;.l݂[oIKeq b"2DT{ =d>2TЪz#8 8Q(6 OoDnjq|'f[lG*0ʫNF/a0k+f 0ʪeR.^\JQجB* h%%P2,Cz>`z#&"RAd2{x7a}WugB@vi~ wҎ0et`1U|4*B- TeYRY5 R( 8aE(6( pT~~ÜL.C7'UxY8X$ (ui Ux3&rUIY H$V>URLںӜK MO{XL3\-鍍3O/uv,r\e9*h@ @ XS44h@vTyswPHdè#l\=sunT^H}ry8(DQ4x#8EQt0|qt{gGsC PTl5aT]^.믾 vPDWPʺ$E !  u7-#(XpPhviχD؇qJt (j( ey~7$oGXq$5Ɨbҽ V:C`=, r5:P"ʹ1ʲygI$N5q8qq?9_x((8 B /11TqFFʝ:j>+2RB2WJbSūUƦ& qJ IP7KfSSi0o~K;,${7PJů7~9֛#-Aj.lb]< F!, >KF}PSI})C:@Z8/"CNy:I4IE(`g0lcq8Wٙ;/g}"ҧY]Fj(JzXF٢4& 4u1RJ .SoD6hDNa9$uW`ƌHڳg0ڸGbw 5ƿ_툚 PJ k({ }6-UR:ˮJphh]]wt-SuZve-YeZiǓ`p8 7q~tw3v^9_d{ ЕI?FuJ)U 8б%Q "̄P+bbRVFo"A]*{(0DJD wfҐ9 O:7M*9a-NeO@vdPKvg0"ۻκV=]CSI}JiYr*2uaqqP<˲,$M`03okgT~Wn>w}Ss!Q`VhM\FuMa$BFIH@Dij[VTS)q 5!`AhcJ,6I) D];>N~" ,I/с햻ɿ4k%l\J퍋F5W)-o}h w꺫dPrɔe1Ɓ)u6 ,v`<7ϛ7޺g6ձ dN0ƥ?0l@Wf1+@XY89"(]'LowǬHhdXW&+Ŏ]o(;:e _P@vQ5 Ec`orw^H)@jvH>M(I RH8J P0Ƙ(,M4˲Yh;bo0eYEQyfY6|Zddqrkg}lA9֛)Һ<%.Q&4H(`V6.$.Nʺ@4JN) 0`)a񬰣M xoMz#O={H.̜c f.Ewvvvs) $IU͒a>ǔkèE^ɦ[e;9#hMl… ǫ@!6" n,ǔ ll?_Ol/fN9+˲0ƔJ;$oGeW99ص)ݛSm#J ս*ɚ@: &9}*$Mpe6I1LORۏǭ,q1J^F +n!\)#X1袬N+qV+dh_: PCa\wN͉b9aF)[&_'?0sy^eyse%9~JHގ;0IKŽO^F[Se:PSH`ݺ)e䭣Ti T%v] ʲ,,scLnION?:&/Ξ' NBBmŕc>'Uj[]H@P2NߎRiaq3̅cōϟ^0lkk+u.uLrXO;$oGJ )[s?.%呁Mض),, D,$=P[Ve-[աL(YEa\yƘ1s>b>6H/> >ۨmZwU E\'V6Aɼ5WMTgťF^`Hi0 F\xzh.Otcc#˲\&IWۑ3yi'uHv0FWq[n2.k t.>,zfIKjhciڌ1.4}%~nGm5<m|z0jzmRULb\E K[N* gwJ! Pcj CDa( G^˲mmme.=8ݲxpz@>:Sm܅]ta.x;n:@ezjRjIuSTKM$""eYl6ccTV Y,'hx&6TRv3`dm5!V8; U]&8Tɞj~Z ECP(KuP@HSd[o҃v,ieYNzߧ|J@vT86peY$IiTR뮯WIHގ.Tv\>1晝s{ q] adNݦ,Kifv8aM48_aT1,@~ 뭧FB 'F&Vۇԭ(Q!rpuElnnYJB{Ûw #`p)GFdH<(Y %/*(tScyrZA*͙:A@t}U'd7Ev1gRM?'ץV- ;+NI,Y`cc7>r~'yO$<7y G՛׾5@gl|ad6%jG}.kibZ%9zYqPly> NL]PZ84R*.'7K2Pp u#UfJ.HfޑBdkLN2 ,U*')"07^ YȕeQjGh4XRTR[R%';x y{Nݹ5w%4A C;rzMմ.ցgR HJY?~%*w#``LJ P cr6m="c߉V4#W.@ci0>Ny_p8ؘ%I7f'5cHb; $oi[";CQ #&b?tL ^֞EҁRHhR*R7g}GEX(]FU#2CHH``%P%~4) V)( COᷞ /^p84MK[GՃyH, u3e}j%ַ_cPfzGkj- '?K;Qe%3(XsIn2%7?rYyJx"Eh N}綮Eѵ`p{cccJ,U#a\0?4 -e.VdfQ-J)fcm- `xAw6}elZְYQf yNRs*H5`%f' BVj>=u|cǃ/q|}0d:y9x;¦[qa2 H0u\p:Ltg;UM󽇲,4Mt:Nf4M/>}G:0F83U_cbǟv:1\B$9^9I5=x0<= Fx0X=JPٛE7#?!8[~۾PV\8(%t:L27^{T~xRYQzVFuvf07% Eb7G"M`GX-P&h.;ϧLE'`0֪Bq}̛{6}ŧ?x1$Z{Jb(,Mt:ݝf4|flf*RHۡ~w #FRK&9ed+ ~NRJ %` ҬZsQxk8Fae5JLHcw={#i,dK ~q㯩߾1ei$lv;MkY]~4W"U*\WTF& bS)#{,+O\9A: .ר >YpdNAp*p88@{bm%02Tלn?\\'քt孌/9]6&veW[ .@vf!FpʇMvͱ+*W+hT'anV؎pi tqz#A XǛ (}_2'$o͊\"ۺH| 5l 2J\wyl6KVW}p(3P !uhUYRŌܱayk*C@ #=>(6 CQF{0y y{oQe;6|3 OPJl)I$,Nw ^%|vS,FqvNHs2܀v?Ў-l` ogTEq0 ǀxx y{_M% tP_*.K\wI$iy~ol25IiqU4jםsU Ҹmzup)_ɉGJ:p8 )$oN\}ai*ƾ1bc]m9߇tPe)<%fQY꺾wco/d`&QZdߩ[jӔQ0 Uܝ=,$k@F$n#\ }]uYlvTUՃ|w-ȘPܐZF#ΜQ{_orFC!ApgzpZTyz^7.ӴIu< !^`5aHf춇ҺseYUUWUOU;=@l Nb?%faD5&ȼsJ"bGag7򧭵yڔS)T&]yDP9idJ:8E81+˲fsGuk88=N5]:ܦ4gtbO;AyJ\GuUc7!*T8 7 F H: ۴wKUU51W7#,lA0ZnKݥ=Ivl J!u<Ƙ=knQ^wvT۩HOم=>T&mwm`d6jtPZX<u]WUUM>v=NzpxZ&m#`sq?4]*pKu% A}cAe;Y ,ON $եg# sRWG^۵-65bO˲,;G?}w/`)Ngj:6ٰF:;`% ;햭k'R .睤O۔ȕHQwjlD٠,$Kッ뺬zQut_MaM2gQsE }GmCPF2F`=Ka<ϻHt^tK*svǷE+Jm s(3aY@߭S wM]]3{?vw@6 $}{_VgwI٥`$_Ao">&.?01y5:,ܶJ:wL1:UR 'a8n(*Y ND*f2w\ Y0B 06Jm:2ď\#%?&Zlf.>&!1g͈D $ե*f65QIu"KaTr5iq~m=e9)=D\VEaAƜ[hF ;, SND1&3Ƙ);@R]M As}ɮD><2 ջϲXnqPXsӤך6pF#2_ g5br"ʌ1Zc'HGap(n:a!-##D":2%dC߸go eFdLe&uʾH+H'$P͖]/5 VUh|LzohLkFMU,JsHG^ybQ3!"cLZ)TW8Ua$WF97j,׸2ͭIxd,<5A !Z8860pg( 2/KZ8cLpDD$c,F Dzv%0 e$-KӭKH IQLBkӓRH!X=7lΈ rF݈R321)-qH:Ic5QsxM=iukm&KDvQۈSˆLXښMpMGIuId.ɧvًÈu?xc(VY"l`/FłpcU cLlh7zCz%<adP!v@,OY);}@R)TW11k#tZ‰PeeYf1YX; [ozh=`udl;Cn,wfMD!GY#_g$qq; G$Ԁ(ݘyyncWj1淆!Zzbٷ43:G¬ݾ/ цNY~E1̲lZ_[l# :0ZƥÈ>Ơ#fsłm'{H󼓂N=iʅ/5\;Z !t:3z{n[gvC@|8PY#C0`Ru'·b܍ k]d1v g"R1sא8l;*,(l8 \5߇A G0Mnhd1`(kg>'yP*{5Z(l%q|ib2 !nas/IɊ I$rFE2I9`D# ąt8չiTs9~$YMT $ĥ|nQ7FBHCY` BnV~`0z7,{gpI Bf ,$Qg@$s߼%mTq0c{?rݫS@R=1 žA/ݶU8t F'( gV8$eY6{pg^i?Q\wtHcǭ!d% ZRڽQcŖA&vC'srι5 vB $n`$ ǦRwg^"ˏUٴD ;ʆz[Y~+ko{?~ŒoC<3ȌL@R38Qu ?ޏ뺞VUUu֏V$Im0  `DgQzE>S#"xzlwwws-/?AX7r% Fd4 i;4*g/F@(6Ѧwq/$>!Xaw=H*Rqd:˞-&#}H@Fdp< Û~`/_}Ǹ` "7m,F,/瓸@daMB`D&C6zG+NA*'Q/M0 QyupΈQZHnh.bHWFf](绻;;;7y??߾qp5c%d&(n{H ckSur@tdcWBx9玜s,˺M2vd96|.60Zl!bvD40ZnT www^g^Wz۷='jX kenM{?QA.|(9l i^cztTιQUU+o @UCs,l6+v[hU;!:$e)qsl,@8+m%ߝ]^ # DB?;CZ۔[鎲,/zOo}}yQ|;()o (10w.c(p=?qY -AF $%'r~gD ,Hs K_N:#iGd UZe@:|p8|֧/CzǴr`8̗p 0t_ 9Pʏŧ_A]eYN:C4]?R @@#$x} 5:@)\.8dau.+ @/+N6KmNEQ04~Ͻow77`h=n LYnLQdsK 7WpF7xzgrTXz4f,g :^3R . K@;y(r4NfeH׏H7I4ĉˆ%B S4$yX8bB.FA:- 4tYW9H',Zp8< Ov@/w>'ҍ/>WOz V7(-tt>30>({b3bbHnqL sY/ja;2\3b7oBc۰{S?);t:M H˽Hk)@a Қ/4n+]mDh"0axxqFO &.J)Xׇl߷~?zEQEqe٭<ϟ־?7qQ?y0؅> ̀ Xas yp\xSB&~r^y?_W䎖붅BIz);iMK.Frf4E愇4M 00"0p }QwtRsfEyLoۍKo˲P׳^/z(yEe~Y=m}Z_W/O`7o>/߾Y0 Lz)`>A#|"⚑g"0B#CNBޫ_t:x6=N+JeSZJz 3¨s]A+IcXҲ9%c+jk)VaX 9: uc[ᅬDFa >Ѧ\gY'bx8Rs qG ܓQJՑl+ pc;x<}4fŵM ZT $%S?;$:#a҉OzR@< `{ `"dAyY(dK%dYh,1q\Zc@'9x{Sx@ƘZkQfɌ16ƘzDԋƘ 1;Dc#W>k_A^{3?1>XJq`bS T# 8}#`SuzP} 9zteY?NGdY;Z,!zI$%}&[M~44-(:081zc, LN05A{pƍK"D䉈16 ‰ֆƘ?rۍ1&^9&1&>4A(m@ց(傈zƘ>hHDýgo>ʗ^7~־>z8ig鬆Fbה1n ׆g"@F·t@T=n ?ʏ&Iu֎V40N>8 sS[O3v<]Ii((AĔ]BJ"Z `l=E^c(I3VttB% @[QPADyso?|慝Û}Q_ܛwx@qĪEmҚU9P;=fT Bs "27г`}<#,vnYP?|vPyA(_/kFZ0.h}İd`mx0rr bsmoߧY-\_x_݀N#Xm0l뎲^x;?FL;h<Os۸M**RvBaT/ؼ=C#Δ eq žy 鎥Gaw[¤%__^o`o,Nm,^ */` CNݬsLTx6֞*O8`ȴ~ 6NH$0!fA 79T h٬*L) }4d '-rv2qC?"}K?ͦNӏx3{6v k;GxP!Wϥ=Exa7pwj\ #!u֍(9><;|Mqуx 8ukH $킇|tI>ٝS;ψ?2mA:%sc€1ZؘPRW>6rrXΆz0@ֆ=pЬՄ  BˏCqc'QIkGKp/ X)^ם~ T]#1. qF~J!Mss{AƎo#&3fcȃ{78ޛL&G,Vm3O@R])L(& 0jovrsJ $Dl i@2L !f `ȵ]ƍv,{[aLL[$4>$6>NPMea};C^,o},DKt;3r~qQZCꀈS: N~' #tgD <[דϾx7F'ɸ,9簼#6 9Vr izk~v| wD88iEԌ&Bu: xdRo 3,*>="0aXQk%K”;u&/;O|AY$ev +]h.RBDs `L,_:A]F{1U7޻+%Iu%R`52K|r:0ly6- 2 XBeMY_edYl5HD-`Զ Y=/ˆ9@izAՖvj?LtE&|@=.s;?11Lwt:[UׅѲqHLy!\dO:8H@,Pl 2>",'[-4*ǬQg*oasV6-pP:]. im9UȴE Ɔoߓ䷣hԤ֍UحHP%\OFݯ !5$H  0V 3`Q<ldb5 <'. ɢMC;܅b *ͧm8WfYO?;xxL&wd2f-ʺ'!A" IR'FZ3"9{0ٕbnߠ}{oFY>8>4LN&h6]jt9}Tg@R]3QޔYȴTh.Ͷk/8KϧFDYSG(0{x0?O=|FOӻx<~4NeYN+rZ]i$P h>905V(~a$s埄0Κ9[" / ;?w(_Y̦;t:?LMWܽ{|;R ٔ; %[sqFW4Y`"- 1wLSC'Gqznp? PU;l6{0N:Ѹ,*z *LO70YT)T% 8(E*iM{I H1bqhF> : #P/@cAa-d.-&Ҿh f*)`4ZڃŔ]zS+IeiGn#`6'-Ɠ;g^sݪ+l6{4MQC眫~+Dhs/"bjaR -u@%Hb\xiGJ #, +c% JqF-M%.ʳ9dJ,ƥW%ރLHp8X!,@Rl6plXitj~UuTvpv13i#-4l]4#ϙg!>Stncπƀ; P=ӷ_T7ދ;𘙧~:ι~R97jV벪뺪]!ppt@*6f[':;"uJ $ՓLmtHUUt:##fs> GDxj.?Sw1J )B|e0^8yfNn5{YsV8e0`)ӌ#_)TڵI= 眛L&3=UU˲, @\QSP-uNi{N(A:j#"4z:+V@H6maH+wL+MUU{1h4"b1yBePR"Q@XaؽceGKP9aHMi8!^6t=w(|UI.}ʲLQB'ہY-BI_ sOX֥.Hۺ8mr[#R ]`FKܒ9"5,+.Dn8Va-ս}sV9:J{h hPq2EgVE)6,]msZ "չDZroV@"]_nϪY#ꪝ&Hm MPERt-bVukH<6) Mi@t^R 6-3NUJnH@At vYSlrۺH@dU]Ș0uӭUm- pZ JܐH@h%rL…eR=yH-L\{+T O:0ZJO%m{ETmPAR NӒ `F\rAtt^(mBH@Rm化U8+NS"峦~7J{ eV:wZ'mqY 䂾J@R@@ [q־z IBXᐶIl1[uE,:3R R*礁wRE|mJ:5V9U톰).]`T $ե [k`zI{T $չ1@i0.JKSu I!T*ZKRT*JRT $JR)T*JR T*JRT*IRT $JRH*JR T*J@RT*IRT*JRH*JR)T*J@RT*JRT*JRT $JR)T*JR T*JRT*IRT $JRH*JR T*J@RT*IRT*JRH*JR)T*JI?85-[OFIENDB`desmume-0.9.9/src/cocoa/images/Icon_ActionReplay_32x32.png0000644000175000017500000000775612140261562023771 0ustar guillaumeguillaumePNG  IHDR szz CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs  QIDATXilTU͛tѪ%bR.U ($hВK(ĸmcVQ@AQ" .)URkA(ZfXu_$7ιsσ Nmfp'*'SɈ ~KhlNטM˥ª*3Y3}'I_R5v/Hq>`7ߨ٘;o20FUJ\|}=\+ ኈ0EРp858PsҥZbZ(RY9^V@_|;ηMm\)(3~kݮ{vݻԅsA&UVh{x(rBrB=ZȍWҖ5A  H!$FM0>՗]f|Be'ӓ^ Ϭ0@m0X|XAAr0["ʻa`5-M( 3#}] K6CuuiX59|p_^{#, wfnVπ%:zA)e91" c_BuXi|m 2;$0 ΆV/5Mx:Gר0';%X~}v[gUy=zX fԩlDҴ) gD1uazC`zx_$Y0^Jo^9|*_o PIIfO-{P:@y@eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs  IDAT8Mj0F 2ڋ.K|n}k]1|` uF5Kb)~f>5(o3!`} pZ @?_u/ RJ=O ˜}<麎i5I)M̾jXpp#{JQbc !ι^~w5朓,_pN;YúkxI=ok~yQYpG^ ?IENDB`desmume-0.9.9/src/cocoa/images/Icon_DSButtonR_420x420.png0000644000175000017500000015611612140261562023360 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FyIDATxY$YkFdDdU^U]K P!f`PB2"'/ 8"A!Bl f =ݍFjںr#2wEw/?Sէjedƻ!nfnιK"!Bނ!B)D!B"D! "DB"D!B"R!B"D!B@ "DB"DH!B"R!B)D!B@ "D! "DH!B"D!B)D!B"D! "DB"D!B"R!B"D!B@ "DB"DH!B"R!B)D!B@ "D! "DH!B"D!B"R!B"D!B@ "DB"DH!B"R!B)D!B@ "D! "DID- {r}`C[b!Cg>t Dw!B^~nG `"D,҇sT! @t;w!l=m "RFu7!>8p- `-H )mQv$G`KX꽏?8ݧ&@Pa?S0m/:\.aRm@0Ài[P q@k[ J]|`O!  Z`4h4"!wNeBe)}w d6lPGL! F4Ĉh2t:vvvtbCqEDt*ĝP `frw.n,,eY231F1ec( pe `ԑ)Nvt(cǎų,>~8Ii3FD DXS#!" sh$w#"la)M;MY)1)RC.Gk !^0Fj2Dtz,Sq?:0XR}twA w>q;/Kf.1eu*˲,󼨀*seY$w N0Cd1HyPS:h<ϒ$9}gQ؜ D jn|qgy*- Dˌ8EP0s@)3f˙9g,c<(,4> )xENEg~W`@@ҹS uR2"'^N94$w;TCDb__Hs^0&ȽI}2Y֍LT2+|^._]0K~o;o^g @fIEd%"339s1&-2-"/"Ͳ,ϲ,OӴeo>B XʺI)(S":ykΒ^np>VxTf^>E+vRpϤyrn!@nq,n^H HI}\E6 k icy<񞧸z쁒z"TGMc"ӳ @.@#ھǼ\8r9=zu5~y{\˗<;0,y這<7,1 c̪((eyyj*g:$UK{w)C()\)".Lq\8)<+J#h 2Jn$aA:'\6=3|KZ)| Q.Ck{KP1!bN]V+oW,U1M"f;؁6(ţӳG;XxB&{ޙxkW_y+eY11怙0iU*˲Uj4-WUy81L|D9PS ~e&`)Fk'=9b"D **w1 [UiXו#N}H>o8D˽IY? ,2~nB%{ۥ0xy>y7/Aq7GY\t,["js0NeY2wF}/A@5>$ÿ6`,͸@HYIV0$VS% #XqwNz7~տշOq{oc.ey,d2`X,8)0҇Yk5 *N%!T=JhW;ۓC/؆6vI^i߯ldMϥUD( vsa&""0 EҢڱcg'{O7ο~_Ox?I\h49r4R@`Q0R$arݧ?3>u[?Z^fE$$$InL&|F1U6'զ*.0Jvm *ݎe(=un ]e@^!M4vc㓇5oZv_Eœ!N]WHat?V9'2ex'>{'n{W?X\y5Lלr\yS7|e۸V>b D[ަ>y9$ߣnxtD\]؁`:bh-Cn 2L+QZgFE>/jTWQR%kо3uϙT'T[@0"fDH1Ap34J7=W^Zq_M|>qTl˞h@l?Cw>;&TuՈ6L=-lqݖ3tEڲox m*B-s:4]ĭe^jcKw@9UP)hhvG1 , 4ԙ/ _[WO>-ohߋbEFѭh4Y[%r .CȚZr:uK $r(c6w)~ َyp^e4Һ(&!;[ e@u%8:nS7JlyhGklܡ`+ʛݗ!uӳm\]"JLuN}>oGkZbL78>xV+!!(UwC)RV5Vv G:Lie;]yGO2 {]V!5@]H(n/@]cc,w賑5(E՚ 1A`QFv=1:w/ןz浗RZW(ID u #}$@56Z !m<^٪^+wtI,[UɡilEȗˌ:v>(0)B)6M`W'?݃# = j ~TC ;9sJ.uU,]$3z{I:&waɰzhMv}-r?'D^ Y%oKd$-Z9&?"I,`X^ռ*"PIP,J +;ىGD3ԄbH @G\ T( pXW`l<#i$V/5 _O#1\`Q)mb]߯zΉvβ eزYT|PdC(* ,jؐrNmIwlSlxٙMy"PN$&4D,&W#Ε c"JR✈V<@I?)(UR* =ܲ]͎,ǼH`:-)ؒUPb8 WܓāRY[ʦPl Z[zy LKl!԰2| E 4nM1vkJFu{Svi''-*WS7#J&%V1]R"`\-vw:?RJU&0HQ%nHT:6Ȥ! }y-6U9Wqe`f'/N90z <Ɏnn冤ak'IvzkP,atLCsI*'dAI"QbrS+zVbGp I䁙@$}=\4lf+RN[QLiEn.KN4_1&QDD+_. P' @Z5ށ!@zHhv'JZR'z *FYZ x ZrC$y!ɮW ߚhgI=ncD>T%Ñ?)u-Uh S|Cq9/!K|Bp1D4@iAN8Dd~:f,U RHt /FraׂD;F%I"9$3_ʂѷ!#fp'?ȯ"@YWnj47#+D\桸i,cHo[rx,GB.ק gXQ[S{E1cDc1"gbQ]ZR@HH( C0C&,irr#_-W&pMh7d4F@HzyHOK$O` b*ܓ&KRBdW%9SI}\tx*UWHZOUM%E@kAi<ƒG |n/_a撙,K.R,η' P@ g4iCBo*`# tIubfLyߟF >Gtv TdXZdF=.-0d~8DL 6?Y\}1PX1 X&LX1\x'g#g_7w_͍11,˲4ƈ1]>Jx^>*)H )0d`B[%@$Cn@0d@@ƇmG=fSn5A6H`'q( ЎiB`SI#Q_P)"" $ ( wT0@cO??\I9+2/E!*/W8#E( a(rtCe\-c)_Zl}"j uSfΌ1EQƱ$aIFU<]L8QIh8߻VEn|֒е!1(uz^ar8siU VV`8Ȁ6 d*=[ Dp>HU2E*_<6,5c&Tr#e_]ifwTF,u΍\96723LeiE&˲C`Ab  )R W$R. }6ՙȺ>;(ݰYl"d5ۭډJf ܈Uy` 7[:7nݾstQ"=`#R@W ɽݚL}t'vQVQg#^ W̋'>_?+`6-<4-1y)( Kq`_"Dʰ<Op\qdJ=yk(oA9T5Wl?B}{~Vk'P (H`P#L *v^N(M@%Xu׃ye#ucR-\ZBP˔L#,{ʾՐ|nZ4Y0+Ͼعڍ/Wlr[(cIU՝tMVS@ Ð)%>ug %zrF@HaJU0xxq{,FJIkϡV@5cCKs4'`t1Ii0Q4A{ tIOG̹=q:0l)&jM*'"ZYdo7o0 5ƖlGJs+*x-K#} !ƵWvdO?gsk2f4MӼ( Xx_p!&R=2BE03.15skoɕ.2/kEQcRferlwPY&RZidqbJR`gE*y*EbJ(%;iz |9}c8c%]dJcڄcqIBz$31B*=׮VBMZqВ]i&AEn!qⅯ/+W{,[dfYf9Cl+(zB@ 1$-od:-^-"[*٢t|oZ]LfQ;ɚ;zv ">YW+ RDR"T4?'JH)5RbQ.W7(e"bNVjXy&azITk6bbz(6vr.ƌjRWhc̪(jubg@2 n(QZ䝓RJRJ)"ZkJi#T*PZ'|Edt7fvʷK}rz _U(!i2`5Tx] tr^ON`pΣN# 5mP~kBR{e4ݜf K*=:bICvC)R֗|2<~CrCG`Fcj Ut kyV$6.0m%:%""g凶&(((FQiEND]z?7xzg&/|098AP`cgO^)W^[{!*Tf阬&[nm-tsHD$(=G^"[~EX=$W>w֥Fѵx|k:.WUUte;VaI+)4HB*Ȁ۵`3 sZE a tdt@crND,i cK:(QIcwq<8I8/No=+?zO|ձB&&K~>ƂeWv+ѸGn_5OVrՌ(Kڰ % Z ӿ|*~y<_NriIKaG w-FѺڶ̨M`#S:ˮCY爘[hJaJ;Հ$"(˒PQ)~5l$Uq<F$IfIN珽˟,yM5=$HjLψM7gהv}}*%WS.ϨnI),҈_rEť,G3ǮJ$WlXVKcH K2hbL! XzZU[JtyF,y:aIKw6r]/ u~@1d( 8G(Ih4htlWvNjt^>Փ7H8|CIatz#UQ ]YbgtqV:g<-XG_]xq4]L&{xiSqT]~YRC O_zZ+ի 356FHʇR@TI+@ ̖dIۀT/ 2ƔtezZ8'Ir0l<izmw|g͟įS|4=Gl?/uz!fST2jXZqBhͽUPS}k'izQ rEx}K4IKl6/,껠<鮏%dĄB0f)}Njd0$À!Mԁ@|jw<F]=ԭ i0 VHMqIEj4-Kʲִ(n<w9cE}UY@_YX{\ioQ8#,FO0]⋯3.`ia+&t47%bz X]ߠS6Ip}9^A@[ٖuo/ۙ'JwRF8ZTSQeYEYyei4M <&y~WG~_`7n-Q_Ψmʊz@AͶAIːBmY9;( =~]y\ǗFэd2b+RosnN|H!@ FdԚz%R 2]w,xڍ]Vy$"2{[4$v#mbI>(u,˲Gjr SZ`G5pg"Z2k1 I;r"W Ѐby;?Dh4:6Ln&I$`IԾ6C@ ѳVڝ.͌Qʱaw}PIxWTmҲ4(16# 0 o`Rۀ&.df〩("uUYiʒWϾZ~/ֳPDvti*^S6͍8$r%u5~`0h2qי'k/?3.4Id2/c@=,}@ l%ȠmPwPha &֕CO\! Ƭh `"l+۹Lff̥1("/25dƘtǿ7aG;3e[^x gjxmSI~cеyҙT1,ts~|>w$$ɭ8y>ԏto>7-"6wTPUorS}^ fDOUn0y3/LW/x|m2,l"RR2H@ *K&ƌrO:R<n&t/%mmiСT0cKR%1BDLWx#=9""i[~fԲ"MZeYJvlu*Dꢉz1P`e"H 9?vK/h4FZtlGC]?Ό4Ӈ  H"턱 P_ąS'L~1JMYMqae}wϻujъe4MfCˏ0o K}q<9^KJ\L7Ȍk~5UYL;f%UD#:,J+r#ӭO|bw~qFi$su罽?`!@ :;sr00bC\L)vСӪcd t7탶M@4Ďp+6u-ɲqx>{꤂ƍu7tD6kvU0?QbA9vb@fB=8ޙ=zdI$IIDZkn%M;RAi]pgԁσ>%|zc v&vO}t({LCӇIyt{Se-I50hg_i c8SW}w:L0f̹=0>)Gb f2xdz$IQ>vNVSǐ8u5q@3Pf)(uуI}F+Wf7>)F1?4 2,S{o<큚/l6kg2jhtetʻWsm7ώJ Fu^9* -%啃H}#|` 0>(&'?vp}RDZvJa4Ji҃;j.Ҝ3it="[VMI{1ǻJ6UˇzC)1Ɂw~_;1sYejZVY]N/fXLa qv_Skgʖ(6H{$ Db㓳9uhj'Q8bt4fWa!)y m)v0e5Ϊֽoϲh YKɥG(lӶdʲWrZJzrT);ȡk>֦ƠBܒe\!;!lѸs B D:;yh2UJ͔R(("atyY<=+uEC$Q{QiC]}r[Q3}v]f}F0NDIuۏ%9D[\]eY~QAҥa)_SN?`DO@ !-N ndK7T-N JGrF7Ƙ<<EQizs|}l26lxs;PԀ"\nR5`bhz Ma0>vhN(( mQ+HC2 RlCa_zHc鯦 id:tAO:C`FwrKAID,SZs7|v{FAI1 rJTJxR"| X߱yAk%]Ohwp509y]lQs]YEV377%W2i۬\2X-sn5]ְw69 ӓ+V;e4D EDqugS?>.PH!]y =w^F'q @-hC ^$"\E^EZ(\~{y,@QztU6s Hg4N|$'g^!xbTVa JnDc$H!֢QҲᜒn~ѹ^rN7IM Pmd;cɌ1KcܼHo1 L۲xһQYy =!@#*Vȝh3was0U<諊;UU=݂b_'PtwdæǐSH̹d=őeDܟi?sl.zͶllIr%\,[bh"RdKm9<0 9BS McY٧щCgt~l餽l݇;q, =ݡ@LV3 7Xϓ:njؒ]WcE*:ڔ?k3|B}DNH_hx3!mf~~VcH J&M$N%38(缮cK ~IꀑX@ƲTW@ۯ0C _㻇Ig;MtI8DrYFv-JXFizEavX/j # XabØӝqxR'RթI݌^Y[@ YHoJw={"m[3LED[rc{׌o+ l/ Ire<՞,--Kd91 %̝_ RdlQH!z AЀ+76t\7Ȍ[>^fw<ݏsfvad܂J`rnQqI 1#Z_1`*. 0[% u )I{rEJ\ysKU͒L׬Z Tk̨pvQKb$ $nVpyF6"BfQ;$ޭEK§@6mb $%(" !,5Xs#Qk(Hi1G]ǻDH!B5 *Czg%QIR+u#BkMʆVJt'*X21hC#_E %V\r0E]i@E.$+CH1Rubp/ -3X-2U`)![>dTZqs<'ncw>iE,-{F6}呌@.=$d Jv1 >;HTpcEqUaxe33gȻ[!@1$GD4vN$ŵ(UZ`9wE = w F(Rnt12e93nӐ50 H!zŲ"&H>ҁK_Z(hNƍ^{>RZk(!Q4ٍb,"8{0J,L$Ҁf&&0+fΌ1yY3CHxaؙSS"RD[lvn3d;ji(lO`EE(ZZQ2Vb0Pj0ռrY<*m!@i^^ǔ["RQfd7NDH!/7j:tg[΅z+["(։Rj<9)!`QmVf.˅58E~wivP^3̩1&/p CICՆriA]8rIB .>@k~e[zF 7,w[qqiϜP,n(P˃ _fTlkyq:8odeYS>a# a^\\R3ꂑA5P b!eOuNJ)$(ZRٹ'w3Aխ RFEbs2TyeY J%ևA}b%H fzb{9#ur,^>̨;{6Zk8(hEιg?+ȪD~@`TtUQ ^\Î6K6`,ˬ(C@ɶ2bc 3# Ip`j[=kpY! 7^]p) uݞ$H%IGQ4Z'O^v Y恹s`TbIÖVfv˲,Ӣ( ׃ǐ # uB r o`F} @=x0#q nT/Uq%I2hڙ>¹ ;bp0׾KwČ#(XA%&bi̲,4+MoRrØdUq^ݖfF;+`?tsNZk$I(zwO?40p<Ӎ`$wW|z[ɮQqETȌYeeYeɸC;0H!֏Bu0Z-qW!:yDoSުnttKC+EQq$Dk:'w/GK*0DŭM.ߺ*?`,EQ䛏Ȉj撪cʽzJ$v庭uxqS_~ 3?-.7@^54棾Sf,&0du9&'GyY΋XfYEQv@lzO?b,() E0./<| yn2:C.kwȀ! SJDq$(EQt_өhSBAZEy)"@`>h2Gѱ$IN%飧>G^¤=T1#@F o?cE 4(I~3P~<,7UcbB $ZFi<ꪷ<#a@SMU cU|0*c=Gd6NDQ_OjvmbiոxHOmȞWޕɬ93vLDb hByUƘ[EQdYʲ,7Ɣ p/RUpg مXU[5z)˰QjkFRk줵_z,%ö$;cGO(Nh(Ξo>YXeU+ FL  F\?uJ݂uV8pr]叆@i)h^; )D^_+ FmΌe@8*9$ҝ#2坫8x<;dg|>ݳ/-a2F=7K:匄p ͷW@q%L ʲ<̕{&ݟ1eBc]`H!z,?TZ]1-ƭda;"'hh qHuZhx:FG(:7~癋{n, Pr= )')w;c~;`FD+1_.zY-,˜ϊ:(b%qdLWx?*c"PQoߑRJt:F8>{O}rcHZ٪:_wFڗC{ L¯Eq34MWyl60{ЃHu1hwo̴Oؗ:v@v+ =yh쉚I!An=Xj2ijl2L'Ir6>{/tFj%E]kz_q3ҋ8E[dKyʲliڑ۹|ӍĀ/u j߹Nø'5${vaCCt`T"^,|r2PeIB{#8d2ft$>}&yRr q'-`h@BZAR2jK6Js5^(rϻnrӠ@ AdsC izzaCF"bSj 坮Pmf 'M: 61.;8fx|*IG8~{|z 73pjmD+BOY Ef$+F5_9&]_/zei\LJ]ԽaKDuU6;)!Xil-/F}ͭMjmW2]5sGJD!= 5 l6f'ə$IW~˲{nyisF#E5A=3}|ǁ X\]zWQhVe(OBYײ,"˲u~o ]C隨vJqumt+[xhP0FvRl6Lӣdg~WVz+Q0"hUx{Mp̌%Pv/h~~&_=~|ݔ!VU5;wB w"Ż?ēq~,y_Ot?MӴ,˲F0Muw_@vR]d:EKḦYjf|;/ƹ\X21r(&RLT6U W2=lw@\7(.L˲j[VChK}c#€T"ÎFSEkk$E.0mA|T ;Hxwwwsb:O:/G?ыRY7<5^3Hn$lMTI"Oo_y~iZXV]v z0[ *Hv!8P4ƥ4aC^>v Mta*dh4wvv&gdD{<7`V%D 1M7ճEVcqe|dFvg7}|bG1Eq!Mӫ.wQ{j;||ф7>`>TQ;Nzm8<:F~ Tq#= oL&l6?~|w6NOq/ɯ;/a GH1)D܌#j =fT|*9V]Ow #ueC a. !ua  nNfJZqtda)F>*GѶҜDvwwwvvvNO$I3_>o^aAke-egF,Q5TͷQW>;_W9L0ְ9#JoqstVSE8qJ9֍e^ʲrZywQ vVrO@>F+ă!0$(y7] q䃓^0H`ՀG TE8;vlx<؉?Uo`B FN'\!]o U#l_\<{:QZ\\VW]e]ZE;wQUx^B@ SI`j\&ʼnz.U)v>%1A; 4tl6;vlwggl6{|<|v~}/߸] k+qud:#H{F*RN@.!{/-y+MKrwleG}.fX? B 7>="[f(֘sg[ֶK;#Cːߦs;Nرcf#h>[əٿ}ʂ1Q *h7B; j0rr]yM+ Lp"wGyzqZ]u,bpK{5q#Ud)qbJ;3F8ٶtv-@ X >nW뭨Nd2Ivvv&l6;3LFϝ8{o^Tg>V@ AC@HZS+ΘΞ0\@@:j|ΏO(VVKbX|;vA}`q3º)D Rv02]JqcFn).1$y@\._,7Ae1CuqFD :Ry4&C`$ -0reu"Ԛ:Z03֔>M m?x&ө(t$d2www't:=5ύF'$ySqG2'H $0q=McT0t\i#ý#h@)Wɯ8h>_]\.Wŭ4MWeYmbGw9}@ qr*b:$q^g ު-HJܑ |,@heKС۸$T$t6͎FG8M3_]\!%#a2pE&)ӯd:Wl%802ށݩ؊:$ P?~'}/].]V/reYmk#8Q%a@"RCUr`U-;XFFCvhz*eeޅ˿\]gFlM&d2Nhtz4(zⓟoע޾BT2ϏN[" aF{ FV=++'E\./kG J]UZ֞H!GHXH`,y/pfJCUu@HlqE<@YԩÎ\wVCUt2(d2$II}/?_;ҍ~yQ D6 "Ü M Q֛~'.3b\^\.WE?vA}`Lj.DC6KcY`PkAjnAIpŨ& yf^gGGju]ض趘QETtd2Fht)u?7h}'gm5_vyehM&d4%h:v8މXE֧(:/=wxNxJ"kcGYˌ 00sˌr#i5#O~Ǿ7Ņ|~u\M=Gj޶ i=NH;(ԃzSQqV=nͮҭ;T(7f[9 zh4iw>qw9:EIi3O>~ Rϒ_^͛{(R 1b "1MClႠ(-0S0R jdPW<{1\|0PʿN>@Rk"RAB;4YK$mU) 67AAE9$d)&T QF?#h4Zk5ZFHkF$Dk=xETkZZTJ?~Ǿs3\^|zor \XA#rxqc_TveŌ^TQ(AwΌ~b||>߫J7䍆z65>;(R[,Q-[ ^s9ЂU6_bޥ"ѨjV%N R^֚8IZ'I֑;8RIE#TL)Z#ZS_ԧ'O=7S i -Qa+HWlnQY0?}gUHPk0D(}O_84Qb7+Q`?pH!ɎĈwT}Uj|4Қl#WԠl?y:aE?!2\QDQ(|i ֤RZk(("EDJkRDD:c:"JR:VJ1Rw+fDUJ?qמyӟ?sgwws|2&$ #5[i:&+̖  .nD"ƭ F3[4ðF#?gT ;0rdjA@⽿BߗϲO/7.\;888p#%r}R3:L{@5ԛP)MB 0j1 %LԔU`ƞVr;0Qn$'N3:F)kI)\,fZQǏOSxfY8vTG] Dw"_@ߵ:1E<9S'xz'N~㏜zdIAnp+5x%c|<ۃ)mSfV S"HខAk&|=7;M\]9gd0{MG dK$E@w˫'_jY_Qו6j  $ + FENPe/MΈS]80HiobujQF=YU Tw$ħ?wZ&a&.Fu#3SO> vϜ(ӝcI2E (RqaU$̖=e?Bȅ;eIuFEtx2:gT-0תH F2# d?SKb|>jږChPdD+X ڽM"׋dm'/Q%ހTEg"ݷP՗Vql8?}ӧF\3\S@19lU`!f78 <%#+-ӹR )#(YO0;@+¤qƤۘ # AsQh=w[Nss2] FaF^QYXPj/w6vrH"Fb_ܹϦxXt{-PUmS#4U( @ /mK1#qj#v$6 vA񤚟DFlwq`3^7xi/+(R5Ty'"GuyAJWˁrEXBqhܢ>aA)H ȩ!kIʮ*`T5ֹ>0;#; 2:6SHxq>_3/\[,+ #:z   (E5+Eps fؒk!vjvKKAHIO͝8FT3# 5(r.T7V2] m:`#|G.Q ~wZX,ޛjQ>Uu0lBTH!"+oim7F%{/t qTJ9o4Ò@([B5χ9K,!+ n-fYs\60d:v(hPƓ*Tӑ\1@吊n Ϣ|nbb D7//Y+ƻ?. j<nE>%6!)P0͟ u6 a˚5yrh l$ @*N\ɷXSˊ8!\]5ٿ9c->.p`m2B P2#f?gp-ױ5JUmRKv0⑱0#(;4]) 20W^Bazzgt.Ȝ&l)F;$j)HH"@ ѷs>IK!rT8#!{?L D4UU[*3YUz{&닉0KL7z`%vdDUU珎p͚J߽F_\qŊ5$gONʋO<4}wZ]\,DƘ|Jm=L$5;?A#?DQ-:uj*]ӥ5FF' "[a; n"h#nn-^ +DQkFOc`q6}X FM5|ո6ݟ*D;8k`'5SfWqޠHJt&W{Lb'Y~s5=T m7z&H 9H!z۩r;:,z,8U%p["@lM05Cn. ["!7IݳL0N/׋.z>sZ}G,% D v#%+{Q1.P_S{եryuX\_,i.cwhh(ʾ =HE}t F,jNܑHfQ= v@!P1T>䊬g3bZv44mR%;7qg 4e/yi`[PW--074Ne=PFwa#)t(zQF@EʖwKdo| }G_Z./jZx]c6G)pHuBeWWs>P2n+o`9GeO:g䁑Awltk&ڒ9AxqIWciIwF{9F%$"(XAE@y ׿o'>vEwppp)MknVeeXo`Ff)Puug!0ꑱZƬ74$;QjuaR/ n\BWM>B4**0QÐ*wjm#w5@-eUΉk8FT9!07&Dhr5Z_w%(P/`DQ_3o}Ϫg9sb~eZ]YV7r+F89˟/yn4 GA)1a X֠ȯH}Vi `?GQ%hWk/מkI匨6%m0Lȕ5{!%Kx5V9%:3>#J`(.@.M~UBz74shQ,eYȶ@DM0r= FbPJ@QQs`TrUOF-a#;2d?4S!m(/<_׀?i C";=srvgy<]][dٍ4MoilѶ@5B)R#-qFro(rF0t͵NS\)z].=uKR=3V HMy O[]=3Y]\-ˎVyel`ݜXuZ«,G5l4 sWcF@i '>y돖*j5(Mw,˼+\/z(a! JehJMQR"k0 Eɂܹ |tHֺ3Vn꫚k P`#0~+[9{ݫ"RcVy/2  Fn#FC5!EH MD7.K t0uNknj#w{*ŹGQ4hEZo`A۞lr: )k(8@w~0.6c?ws9DDHD{drz6fh(Bmh(wa+}xf)C)D+Wཱྀ^*50R]yq4o/fl6FJk-=ܶ~tw<>B\|47@=لyb҃r^s}_Fw 8F3y }o|{Ƙ}cbTD`i*C[xm @ ѳ呒mFܿ(V?lf[[cs} 6iuQzN/n7FC5Qy= `Tݿ (K,-q_;{lgc̼,˹1&eؗ sAmkضIo"R֚45 !`$̨ZQטa`ܭ`w.Tm5mO׭(0U_,ؙ# KfƘ1feIE$ϲlkv*M`.Ru.َf#dFy?*؍oq[T즲Q3eD'O֗<*+Gkc;o}`fe4Ƥ*˲ 08Iv;BTKi Y4_ 6tw K7BEMތJeL(x^ \o#XQRdGkH\WK)XdoRuf[|ݯ7eXb(y魒O[TS-zYH!ŭՂ2mil]i#b[0&(RE 7@#mv0$3 ,`h@ Cf8`R۔w?$7c7} cG y`MHc1vb;g_X]|lޭ%3EQEQ1fl7} j%/)D)Evڨ_ [g_lnj3렝h@9Rmp("Hk@`\Yu$g-w; #19e?F U eGF A cmog1%(MI^ cA.cw8W;%3+cL'3ǷC Jjܾ #/G0M#$jMXiv}fΪ"tmwԳRz'-{qCBcs܈ [ͮQ5bag'˯^;*X,H>0`"F b ՔS^^MWFH` 4l0lu%M,iY8d[P HUMZ)q3yO/eDzhr&LWD+mr@1#M5F_xיynYEc(#7&]j7% U%K[F%eraΌ։nv_VyeYRxM T}\qMX| X߸O]0(K-0j r:̜eJtX,bgM'p#R߹ZGyg"bR*ѣ/w},_4ޅJDuy#56 I=/VP)ˌ1O~>/1˲,3cLXx/#>]e1"Tn aD%ҵq1/Fu,m LI̒94rFIݜ=q_{=NAq kZzim%HlAغWP UEӔ9hu;_{d餻ywWfI-VH!zV^hBʕ}r40r7], d#l Fh'Ϩq׶@CDRų-( %",KDQ$8^Ϝԙ3Hky `TW⮘"zQݍm%-s(\8k/|ib^w(,KvLIGjS+݉W=$!@ `jU"M7lF̞{uWXAQz M1eHeY$IqOϽ??VV]۔[ʋ]0e;;fDmRգU^$ (d{l+ҫ _/_٪UQiQ%3|>eAg!@ ыILx,3XʻFVH y Ke@Ö,U'c ,r8ޟ=y_{ *Z5c!W3;غ @^Rd0D6i"G2yd~yGי5feYyOS={X;6]A b }6`EqwGps+a%J>v=t< Z#ǒ,Kβeql/~Oy@!k Fb$hIUr9iCLX;.5tw0@uEr98NdEw{eBюl̋ FC%tYP,3*W N0+;`Gn V;cp5 wFD+lDffM" aTeZb2gϗiZEVeiJ+_>ɱS2!)ںPVۡs]ՏݺwpP`r:0Rc7u;<ĒF葢IHjXU_ϟf;czu|)J{/ )D)R FU<+3DdS?k#u^$L+fMZq7qvn?u}Y'vy Jz`h`T}nLv4CЌ\q 0Pa2$3צoRU(?RE!@ +EmFZš,3X'U2;5PKl>@C13Ȗ˥VE(v}po.刢saDd N\,]2b&2՘"6,qĸub.#|DE* t4,EqbR7v}†M >`a1̲,],Q%N}?KD"ĀV@VzFU4 0ۑʹIY0RK& "E 0f2u9vN(1'.&t:CǙYQH!%&Hр1F AvtBWAh\w4 5x_LeYRe+W ~-[oc@xtd;Ev..M0#(7?w@~"µՐR@ &V|C)O19R>oP kSՇ?TDR`rzXlE=0Q5jQXambIu]@%m*P*"_V$Inޤxvፏ=RU dZQИAFY/;HCq'K哘%SB(F;}귟2nS9TV?Ur}H)Dop+nF׬ȺIurqC,iDzM7Ntq|=IIEǞ/d+J\J3,^B3X\~qJNMq02,%rL54yj^?0,vvv,,y\^> =L?ЯFݱ! ]I)q=8ntۀ"uVS4DTXvC~VDgN%9.],q_xgg͗} @)0ѰN F #(`\ț"(k͵Z"pP&i1X f#ze_-?8B)1:KWC@q4![Y=]#tƘW†VLmjAmPjQˢ(27b{^ӿad؎mK1U%3L gM@.dB,(Q+4.6ަj|fLhl6{dwww6N$I".m5UY=LBT/BEX,M'="6 Rܦ"9g-7]d)4MRQ$7$EQ?;_|IF@IwFbhX@#,;&WŨ2#&Ym+  )n?UsOOyJ €H!zuJu ` Fe'cGۀRuv %]xlǎ%QYyX,8Elg헞8ߍ?OMKG08_oQ#!āYD!JA1^OTܞ"Hv!lAXw`FJ?"+ Wg$!3Yre3hdlc';םaؾ@b]^w"$(Vn칩Uj0^8l4=9Nf8# {v]lY@ 1˴@RO|`Ѵz&$w}o P50c4Mr9_,7"Ky\+^*}0tĆa}SV;eyHl>I+đB)i"G(v>q+Jx|~6ٙL&IEh-}tI~U*f مX?F )nBF^5wOCѮ󥻖WeiAW8w_~bM>8Ms瑏F+dINd@PΠ`)ieiHa f#K LfN yc2,ʲ̽RpБ@?zb%@ =FsA(g4ȌD |n>7\%%ty\.qrI;go>Ƀwp=)ģQu1R\فrm jPZ&QH1 _6W/] .P$k<J: yeT:*4ygtZ.gO5 5|`Ta~lldزpǚnK qDE)4-f_}3!D`H!Q[dA#"HU?!ݡ2:etq\5v^yb/n\zt]n\XVgY3UdFZZr; Ô*FvN3n$z3 KPDJwIlK082FgK_{hKT'R`H!d:Ɇ#{[4=pot7ԌەpnEӿ~sOّ$+Gh(sb]}ՐDrcЭWAZO)@C!fDdΠ$O?qWT[ƘyY+x tk6B@ H{TeI|`D8sѣ~`]_cHC|Z-(s;g|S{iU[>A)Dt0x ^՝iW RRk%iD;.X~"Y0 rSց+Rch{ ]k36<(2˲|Zju)˲G?dA.Q1cl&(hC0Nc3(LKLbE/_%;FOM3x<$;ZcB@ &H揠TG6ڥIYqy:Al.n0n*nZkZ^~GYRօ9ծF,0lsJ,`c– |,&7eVkk-k`i͟Yaǯ_JJG\U!85.c%75^FM6Iw@BOjE;o|G}ԭB>f˲KЮTcB{`dʙ`y.nE=]B F}NΏO (V>3WW~V)xY#Y NKRNb`d>`0-[nJweHw7V,}$Rz"cf$^/eFaְ%,ꅭ`EN%@X Q>Yħ_Htzv6fx;0$AܫeO; ?m<2;S r;I[.jH+=]R T) 0W* whywI"Za)$15"( E/ҷ'twvwwwwC)&PdQ%DBRB 3$"FR2T[va?o=(KJEo~7>}FIUqey.HPVALAU/Xm&0bmR,aY'D0ӏ{{o=՞1fJRm=j&,>!)s3~b02mNb[A-5]QnVKi̭?Iuc,-5'fvR%ݙa֗IwnT8 C`l"* ѓ_Ndr~ggt::*bM#+@cF̐ Y.]`>`'~H~8̤5),bZ]D]]i'0A\Nsp+"šKgYI//Pa6Nӑ+݇MH![aM|8 `xge\.boX\I蔾' (\Fկ  Le/+pewvʬ&[ > % La.ɣWo&I'9vQKY)I7#DBm.|0QHm.ÔCGҝb\./izṛX%0E{¦8UlR {s FXy k/T %_HwKw`\^_VeugzK8Kaio5\QUX[n\*/UHNrTIwV3V*K,&1 Se|pvggGZ+H!6(FlY5 F|}~€$mWIwi.K酓?iuʝqlk! wFկeG2fXUCbGږ% x8\>@ q2)N*E1K:tb*rys\^N³qĥ P.d;fFUT M]U'l%j/)EH"`k;g ؔ(sޢ|;gd2I:Uw $%Q696R0R3%KvG!B 1Cl&}?нܿ^nn(e$4OUyCDsɪRVUJ6Vee)̈۱c^ڋ|]:).ҝZ,l6f)B(!d%]sd?K!I??>~6F`=zj>zOǧt:}twY51_Gu5>J]9,2j/.='Eka~`V) qHoq|5Oy#<5UDh|6 @1^b!g  HByY .*J"I Ly߉_͖1&*mg6 sﺯv=>?'WHPvUHh[ 1]^%_Yw1ݯtW$^;|"@r%d׎Bkc\ 3δz IA`MY8~v+xw/ XG+۞/`sS?$Qk#!2OZ?+($IfEo}l_U 8 hM327˶{JFSsx 2d۞K!$X6Eٗ4UZGDNG/Q#EKvWn@J>dDi !y)mkY᥻,8(a89|~}:͝mI{##Sk FC,"O)% }sA* JmVhTI$ q,W/]q`]UUJ)e<'w~_Hh{~W>gptp2ҝڐQX)@PݻҝYBӘ?0ۖy~("RB; #;U:4BJR(")0ok  &w|#fcdG@ [#&#+mi 8DZt%Zk]ei,.wϫ?~-¹ c?dж幗wmul BgoQUBJi×8G ;⺌%;FwjRc if&-:JJn!\$ݹJwʲR40+QM6³g;c! Bpji9?~tGN;$mkY D`t$W.m&Y1;zKmFDk]TUU*tiUi-rYQ[ +$Fh+P"z~ XlpؓtgQUU.է8?ˇ@^x:ҝMk mZw a5@ӪB4f)IZ#)4q(>}]F]t:}`<?4dDUK &$|$$E=ygHFԠaؕ~jIw׭ts~%L cX |ZnkH!wx mwyNb tV=[Q2G'FUo'O+h*#!`,Kvs=BydT Yh ؊;$YeՒaNN;}R":$aZS4@;c .A @q(abBsqFJ# k>K<r]^e%(QvX]#H,q0.̬EeT?XKU`b↓‡^RI{Fn 1 ڔ=~ .{h/];0{#˲K:<×B2\[QEFyz_iYvq F;Ph~cu~<DŽYLe72aX!<1޻GOkqBOUVJ<ϳ$Iniz5˲ /N?\}T;\-ϩ9 )A&DIh(h]A%s|>gL&VzYM{~ ѳ~_KZ#2 2 3 wtteY2nzTG*H6]>dinj uEAlM.yQ"wꍧg8~z4=ڥS(2ׅ #鶓`NɈA;HK4f74X[RBCKR6g%UKƻ|4Mm{nJ`8g?E;QowY2!1v'{q=ȨNtWyi<8wMZU>tZjc1VHwgc<-/힒!yď,fL&j^ S(6Y._0.yMUJwKwlQ(R-rd43T#ߙV:??J8Υʲ0 W8>5NL&*\YXAbwݣl1tdy>yTAKwuŪH=KHaL22WZf8Z#oqW%iqdp6{>`0xz4N  !1!1_y-s iEҝȓ$z']}dx@لʠwJFGܠ b')!Q@8C8u݁ ҬDDUUEA78adN}ReCt+H~iidohCZD*p3e3{>)0cJYϲ.4*KǾ.`0yYRJUU;y?4դ8'{H\!1_I\UHGHFi&nt$Ir=˲UH2IF~[ ;376B 8MhX(+DS|`pj}iapRc4EQS!Ed$l/rҝYRS-nKwog])@..JhNjWY-rEH lPmWR)]!&Hs_X+~nDŽ,x u6:'7D%nuD;TH;{<)T,d2ҩMo~VDFuAMԭ^D .JؗSGBc/_E $(7d0!1tnkAF/ܬ%e&9RU^ @drad?NwouuqCdmޝ@PN54TYBpѫf_VpP^ca<%V=zߕm*! ìPJ<ϋ0 (t#<7'ϟ9!~j2U r{HF##`$ٟ]/@dT`bBVh NWޝ^0-uZUUQURJlf:#vѶ}&2-+~ D CiwTd&ZJJm;4ݮnI(*2݈I0Z-ݥiz,^TBPIdO"2fn?LyP3t~R@p`aLCUc~ϸn*xW;Tpv1!1v6Ԁ7Nd!>פU\wTK\we4Myc\?{:G)uA[ Yc#&*h8~Racl+iyHj|L"XTp}_!:l?$3Qݽ&lfj;txV)Ҷu O2ЮduN#%[%koFa9hO{#FϹ÷sS>&$.ZlQQ cV%%Y]*o/ѿ U3;ee` jRҦ>n+N(O]ܽtc` 2$o#v٭C@,54g%9 23͑]w, צ"h+kQMůNϞFzddpQe@(  :hiR q,噭H0TiG1z(h4iӲ,+6԰1CN;\Z &$^tnalNF-]=Ѵf,Ywvpsۧ8,4M(nEQ4 px^|vn&"`adTiGDAAA^jIBX0N651W;v̴Xe W-1Xcf892=/P.5JKqZWeYpv݉?HaHeQ+##M4ZSu7oDHDDڸ4+ '[V ޚk"A;AD(k'!#hAՕRT7-mzn#'I 2j6ꍾc2+#W i!@DBvhfQr| q$aL2"(iPggnkW tG]>OiyR|7}-}/--;M˲, vEW(>'U)ĸ6|x'do! ] 'IY&9@4IBC/`$n u橇W_ ~iT,:sr$[/KL{,%;SyH 28T(2˲:(/ߝ 0MKn_>tu.|՘Uif?$.qA$%H!0'yC >NLY D: ѽ,͎m(A'C$z'YJƜKw[Q]p^}O5}9 W td\΢#BHsռ$ᶈl]@葄=Mq HdyhlƯ_p8LRRPJ)5e=%J"{]瘐iEr2ݜҊ3btgvJ/q|5 Íǂ??\LETㄤ]fBF> .i껁7h9A8FZ+8@ Q($כhKk .@B6KvޥKs~aI2&7V(OZ$ݩtwIw?$q MU:2wڊ^\X@fC:6KZ!ML"7|E_ OFǦd2nnNf3^LHLHy0탌 Dzn/(Rh}myw^Kt3IkY(k< ihbd V+BCpTTa™uC8\GFǣOo(;+1AlfBbjY2#҆ ׿Ӣ;;Uei$$Iy~1G 6IM#!)vȶ0MY2sՒO'33UO m0 9hǿ8O 'V TI¹;˦&$FիϜ oqHujZWUUUY4e٥<xQ0$-ȥ"X E utmKw;$v*xs 04G,5Jq*3Tp#&&D`Ɉx@3!1#w.ٔ^2:|Wsgt '],}sD%R2N&|UCTI'ڞRC NΗ` `*$i | Wo'.xcBb.^s)b}ȈƯ44tHw$3dyLWHF {v5:jIxDUǎQ0M„@*GW/~EiGJ">M˶o&$F|22v(hJ> [t ;ZB$Iniz) /$ M{ !VFFsO%ݵɨ`S;7D RUQZ|Ǯoqh4:1LN~!'K7M LH+TR"#?+!v;,˓$Jze? #S%95I2􆦇9)PsHWPu:R,rFRH AnӇ&$Fjn4Q` r::t&9+xꪤ+y_xQzTՃER2 H!T'za(1ci"=}ztO^*8 >^HGMkCF(U];TYi_ ($%;$G)L|4OFM!AXr2Zè [WWn* ѿby nG^8RRYl̢Ï%* P"B"2&|U& +j=!@HDt;8y# _|&q|%ݱ-5g٭v'nz|&(u?Q2[/ʺ>םIw҆8u>:z+!'vnwK݁pvn1H\&k:Ⅴ@$%PB)IIa#Q *@Z9+ђdQ)RTʠRUeo+ePiwۥ}k[g; .5;X~BY0㳷(NsĄhψ0? ڏ8;訤>RJw("IY$8ZMHD+%#J, ʓAUg{~npvUYAN\N5 N9+UX~.DV8QY>~@H˺w9fWa2 N ~bUVp&%&$&xsBF ׳py^jTHKIwUUI$Kq8B ] m< QWIJ{b(""@4u0z ]+#ݱ  EF.xHi%;ݕ4M4eESn~ïI:)LM _o R eْIiJSs@F(rlsϥײ? uL[Hwg^5X4i$!#OLb#'g|PJ}%sID/7:Kws)^KKq8B#Q *ԗm}d4e 59UUl8Ǵ*!$9Fq$?ΛA4~n8>5]Y*8 龖섰ט,#%#FD{H,͑Ze;zeu˓"R.CQ\ =-qο!lޯ+Eygh4zLH;$#"'I@[,1pՃ&Eҝكtgд,K$,.oΜ^NhUrn?hA)O!ĵq?dVp&$~ jh9r2D)zCOX|FiYδ;:)eٕO8 +8 龃 ZϙꟅj.T;0{=˲K:/ U.xUK"#,͍SD+Dc'7~YVx߉$&o1nZHF8\2"]]*i`”.h92sUAW63%Vt:e+8cO%Bv'#Z!a2jm €+C',2٤RQ矋QJ6Auz|UGy^" LHewմ= Ɉv!#dhìvZ/lזfٍ,.29/g4h!hnYXC2T$('7~#'Gѣ&ɐLHe= ,EFENyȤjrf$W,qjkK[zQwZJ>:kYgرc;391!' htӾ;dDMFQPGH)GUUY%(?Is2U> 9ueڭ-ZVWegRbB!l?ȴ\~.WFGY%-IYKF2=/_ (LL]BF)THz ΄]cvODSl#"#HX)݉t7 (r']”}qꁋWa栬ޜ5"LY ş^㗮ߓ391!U`]Gt^G64NG`2DDp} ^W2rȦ8T+*p\q?Xw36,1!ݣQODM36!#!gګtU@$$n$#O9 _|0<5JwLDLHr>`R#$#u*)c]}6\=<)RS^Kd˵=0Ξ t^!YW2S I F#ɵ7ސtsy$&{tvfdvd{5 W㮎;#&&k|"%p:&C +&:T"//o(:=ON&< !* #(Bh5 HiHM.spd>NR4T-Գ2W3HwKwiZݹn"ZRpbɨu, L?{zuMtz|ccc80 vTI"n[E`U9(!NBmgb1dn HImpW-BK^cPJ<0 7(EdxP'Ƿ}뽇axeY^Jw*$#^0P1 $ v8j]0F{Xij.DcaF\fC@NHi)mr!(3ƔDbF[P#u;,qE( ɫ?|iD(!nq*w2`BG:phMۊmD\ v28 ZTEJAs[H@ HB8|v:o0 sܕK~ \=1!uL"ݕh4뙁 )!G(hXVB6!e ?Ti̭Qd ܴ Pӝ G GU4aBJ@k[습N11hUI}xJbT}ҝYR?q*ֲ"iX#r;fB'HO.;-79ɑO;/ݙ񹨩]_RZ6;?UJ &&!+;Dh+ʵ>Ec{V.RiDJTLS-$3V65kL }Wm,%:̰*ۉIxl.8aEf˘\v$Vu,/lj i!Uije-+Gi2Ix=:k7>$q+|ߋKt^_ߘޭq!a/s;]!aߕIs\R+TJ$^rmbuX%*#qk72DZ+&{e/{Զ叾k}ٍ>:-1yicݸ\6:ءr_pX2n];=WELHw-s%ڕA]*Zf2b䉼>cok, *30o`0 +LH,mi'w`~WTJ;UC\m>bA% EexXg0A1!ͲȲʋ$Ú$9-3Yie]~^FF> i1E={5&B9qwn-"wK>ALfڥZf.#;[][^~:ʄɾ,$_bZjr2ݕl)u i] i}VNJ~Q{=ҲyInzֽEL:V H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FD I|!K)$$ IQ!R"3]WBB pCD\Rz(9 IB-Kc݋yC%$!o Sy.KH\ !!IH R/{I)]*s]r$/}<'sB:'I+繴NO?IHouc|_l-]O/9Ʃl3.>?DOMK.Ɖ%h)|BlĦze/tܐܑp~կ~C~b1`fw2\q#? !twgJ)?N<#!= )!IDG2z}cǛ>ܼv3hfd(oDV̂]CtD2?ׯždww i JLBHH⺤4Ǐo~_}ïonn~chf?{*^DJMR${_1=ֆ$#!$$ZQB?û>ݻwݻBBbf?nJBZP{X%9?o:3I~4{BPBxٜ`@z~@"'ʼn避Ja]>5?HGB I|d$!,H)nڧݭY/ujY+.vnB9Eq&f'/1} Wo q6͋":?U0؟rF'e܌ 33ƀΚHA4 $N88͍Ul$vc43uy71|i׹)# !!ԩ#C^c$wf>leCއ\?3&F܆'``Áh*s-E}HJxe9$woq[ ހ  ;˿eG&6ŗ@{߶] x !:uTs%"!6z]xN]v$&wdn$vl. 66k0KMY ucoLiN` ! l9K}֞S !$$LRsyȮ(W݁8.`h`bI%("Вܬ9ERr^ :6CCԟ$xo ٽ:D2FҜ46X؆C鷕k:!IDOq9C㊄JHۊi1)dQ<qV$t8&/1YU#!P*B IVI|2T$5M X[*(sVȰXG6 BJJBHH#$$9O-&r8e1ˈ4Ԗxi#U ޼{-)JLBHHjrQV0٬ ,f}R&2k,2!9֠. BHHRNpDJAN[[SK?Ў,]5BN15_W{IGS !$$q:RRqWF"a;[ '*'1 cbk&cqNI !!JD3/lk)f.42J.Dׅ*T|xC#$4ElQ널+"$vyk+i~!М-iR*У'5b,yrrNSl_I I|tIdafaP2H[ս.6&$#!-a)i` ?%Q2BBPJ')fm#CAC? eY\Ұ]*瓸\]e6ٝBB,ՎK=WЧ"JȽPm+جZkrfNiIfdHN Ie߭bFcJ"vLϴ{KSDZҮչ2E χ5i>'ZtG@FKsF ʞd j2*20j'sRtIJ$J*r&k]L98ۥk!m'ZiW7»d|.Addswq%$!$$=NH5s Dž kiu`DhmSGҒs2vV@%\ ;GytkT7 BB|J*R-#54>Wd4]{`3-H!!m'O' T(WV9%%!$$] %ot'Em"%LUvB HI5L.~{NFKj(,\t$6o)q(u- OX[!!#/ℳ}T~V͆BHHƊ_2h)񄌖 ǕJ`6m*VReg6)Q܉j DÁB Il*"|c,VmL c#R]'z̭#:eͭ59bҦb+TnX #IymBBN<* XϨ%]qa:S w /BB0$K* fO̅ޖ' qyhoqdt4 ) @VBHHb{(φ*冣+L~ D r;" !$'+k]SąX~DhMT\BA#OBHHOHŽs!N4y:\L8AX)%$a<,ID2ZL2ZZ4ݘχI!!m\F$Wѩ-d4Yĕx3W?N!!mk$T{l)q~FuR jT !T$D!Xu273"v3xɈՐe+P!$$Y!_/:H {# !$$= ɪ3Z)>Z$dt< bVZD !${h> 2ZL򹰈#O5SQmw%y0%v $wҒMn&ܛ:7E}ȜQSM&MUJr+iaBB0$Ad6IțdĜѼ(ciq1;!$$=%@XGagxz29#̋!8+coTBB2^=\f3hɤIX\3ZݎY4k[mx$6DYyj⺤x"I Y+an `b @Ǹu7j6- ͻ;{uBv$BHHb )g) [P\XM7|Ʌ3sM XG'm(N Il9%[psᄌjq]s[!$+ZmMLBCJ1Bb9eW.M! !$MS׈,:|w ᨴ{bdĕd~= PٷBBzBB͆$at?ULq9`@ʋw#!Td`fhs1n4 > hYfD)X]d1;!$$i sdu޾$lђk҉\BB.RRrCW 7uFcZJ2/%3%#!]wgݴ914~|?yS RhZV5F" !!R}\^ܗKy7tZFrq+*(!$6!7XMb, _uF\XF1L2BHH߇l"|t V*nIF2[a9-#B i )'l?!PFX!(AOvi+C7;3?Q[3(1 1ڤO$jZkw[pa:HF<+S,A0Fj UG̶[Df 3$$= ΄t^v|R9қ#wf0#BBBRbw.&#j2Y2|v0tCJ*BHH=CQF'YWѱLڠAH!!m:A9O"ytN˨jWo!ʾN;/d.QK!DFB ;``c9fp73ɈhO!!-"Zu疎V^(2&KCޣI3HB!mG.ah".ɨ!UYNuʉ>DL]Fmߠ5R]evB%m(!aoFFfTe'PB~8zdTHȩN B%BJV |ndDw ~v CBHH[,Ȉ'K$܀y<ѓkX!춎C߯&rl27VR3jUg^\FE /۫k I!-$0<ȈY) #'Ȉ+hrl]iDP:BHH 'd4izxjɨ 2,GBB!!%2mWdĕd4&gɨpo2BB̐Rۢ4Ɉ-`8%v `1} !kTeK-OFvt/!f%C^ҶQ )Hcȼ4EFO*~6lH!C@Bi>y!q^^if/ !ؤ@dSo!ҶieAJ/a]Ft32 !}1B(!}Vmp^F|Y/UBHHbL\(# =|! / 1 :z•ѐ1W}kazP~ uHBHHz 6XFTdT& 3[BCvGYilPqbq9,x0׆HB {J0hHaIF-O$#/c.E73hC$!!$o-f27)Y,HJHB%m"Ȧ>92j dT cmBB[5R>ד7UFȨ]Pꪌ4j'`X+#vQɈKɨDH $^v6#z J2j@ B5lg.j:DO^[FDB i 6VHjd4NҦUv49$:l2jJauK W!!m]ID./!#GLfBB`Ș گ10|qww˔4v'$ ,R^MF%Dn Z$6.# ͥ1qqGȉ##BBڶI޽x 7XF\MKrՄb΀b5eYۻO5R&B i8r'm)Rۅ|~#>}9.pb|ܷI!!F$݁`ìd4[ ~|~h[0w`gj-6=KTvA1?%ЉaceKN2MPUdT[8q+I!!m/΂^.#b1e2׻XF͕i6lnZ* !$$ SHӧiYF`:!iXv h#9ʃ3 Y'BB4wpȇˈ+ɨЧ9ʈYB'BHHb)Kx"BR~.#$5,#2$Wo!}#\MRSJ2DF>Aʈ#bZ+68,}etwtx0$BHHbXؐܟMF_oX"mc.6A &#e89@Ig"xH]탄ЊčCUv|Oz>}~i9}B%$QZ3P|^%E]{ta`FY ! *ʈNd4$0y;!$6!)vQ d=gQ~k' c/'⏿ܣ2li9)rBsHIfpfypB&+r>:%$!me`/W!#t7 !{4dx阈7Xgt((]uBHH7_#Pʨ^u -CBHHlj/כq2l,BB[ H?Ȉ$#o wh:ԐH{G',jdo%$!aD03oe~uȨo@>BBSMܝ9 dD e@m+`XnC)e-6`uw !w:5lrgZdd!w#Iy9K!CcL,*H !$md Tr 2nXJJBHHz 6.%3 9$]x{$ !$:`]#4͠N B iFvt{RUQBB67TNfv24ni.FImҫ.߃lBHHb˔a1t6i*2˰\OUwޯFF_[.(i`8EFȥ֕_1;!$$tTEC4|k5b#!jWQٜb|$03 MWQnTVnB iTy\Ͷ[[țK宒ú<'V| )DF0X^eza0gpp^uAcvB52fƎ -#42 VB>BBSm!qʉ^v"XcYNB Il~ȝuȨX0,BHHb)%潑|KQCȏ C[#!$6 0U(RFW,Wyʰ!SMoAsHB iӐB2Z,`l˨4Su@pBB.4T=j]QRIJH&-6-#Td1 ^gM|S2B![a!$$A|,0W=AFm2BMZ !$c1) %%M,ddYFVdH <$`4rɛi2%.Ь eT L)ehQueO@BB4{Ų Z-k(\"#;`1/ՐB ϼ 2jokdUP+26U%Җ1 KJ%۳l!&a;3+" v^F,v-f#WBlNO;lО(Zmv4"$ӂl>d ,. Y^zXe*% %$#&[>tY22:lR0FBhe(r3 t(fօvݮ~3 cG73fN>oDHk|>)%73{73D%f I\_M @JƂl;0nZ6q5IF`FBH߽{?&Y*<,|d$++S}C˗/.i&sM$^>\vH0d4}.E*sFqe2b{ss>|BRJ))m5!佻SJ_޿ׯ_֤$!IH}S$av a8Lgn8KQF0]+` bn~K?!t777q۹jA@ل4䭻v !m!};)꜔$$ )] #pCn8VGmfsNVbJ]hYT$Bءsh`°% av)W HxzYNC|Է\Sk;㎞|SxڻM-χ??wWI>}:`(3$IHu :9eR I0 wKcU+Cw w c :bg#B `Tl|D^zrIJ֐<5tЋݜMQ 6NE'Uk˓rvɧWdcKK|cnnCםmFcnbO_q{a,aC.@=bt}$!o?b|O)k=XdX>7!(KA3x4$::;uH1sK<|'g zOK)5υy06ߜ Wdm;{]4+C2󥸽pYZ|C,WUvfa@qw߯ߟ޵ ntEFې1Aī2$ʻ} G'&Xހ&BQ$nP!!P\t#H9! ,X:@`YO=.'xX8 .c$q9Ի F#a熴 SM&e Hw١Ȩ%!IH2XZЧL'J[0+E!'h7GϲO!:ɑqQb!Ο}]T\);O?Kd3A2 #u,aD,CCC+5BZڦ԰$%!o~s7 y}R4f+dHR@"9Q)ȩtrY`6v&^\Fï')k#OڡT8W6o Mt^JLxUJ'(ZR)vcde %C&#CNO6&. UPѰyd[xxF'BVhN]<ְ́|}) ,?zki fCv !+c(Y,6_UFĘֆ1%C0h˖dش& (I cO*u7|v*msyq%uhj=KRW}M QF5%e)2p>ӊ)7C |~an))ID6|LɨӑR;0Z@DB# &2*%c/f닲i596KVK 'adta9%#Y=Sb,(%y;ly>np{pO =NJ$CH'C vm2j@0LWS2 I$#k[Ȩt"k<-ӹ,Sdռr^F4 #s2J>n?O][6w]T-1IH*0~<5h>Nm2뚆a& EJaGy;b]29_ѹO$sFȟ'=Cr\6 ۭ%2dwqID:㜑csv2׵lOj d4쯈$# al[*DFOې~}8?(u>n΀m_gVl$!W8A s=Wm ŸEg!!X$0hpQ2*j%?UJ^2Vtěq89$d$f*;OE#PE$^UB<i`JMٷd$7[#$$X?ܲ$d$Je]-)Cww|EN+E c_>v-G6#5)Ρ'2DKqi/'OuZN(׳juawzge}W1=-heWJal/}oUF]٬zO~{>svQ[%( I<]F<341|RDnfV0;7vbM8v$NN>9.g]ي8hǗ7. (!K8͚\/ȫ[9-dҔoKȬ,f|N%I>xT&2j5Yޏ/`mj`:g!ɆG9N<Ӏ0 X2HLf019^N@<Ҹؖg ,Y, e jM}KB3(ŸeFƔ7o_0`yG=ˉAzj[Rf^dT?тUR^$Vwή1*mx\mkkJ6>6m7}L |peÐmS]5Y3D]:o0lg73?9|P a#II7r!n|p򦜞a1)!t,+ vp03t0 {Eb,'> ENͻ}/"QԖG# ́]9v `0O@gEdnwx_N+U ={rgyZ)EvE \ٛSPtL 8X>?"`>]):A?&x3 wx%ؘ:V<(-*Ϗ>aa .ҬC{*0*?rl:xQ0>Ui|&si_0$!o,)RJi?|wCf2Qy %/s|s@Te<'/>st|7'n0I~j־ϟ3b`~pgOju{A?p~O)聐 Kh>vl_ݟ~>~p vDtUQLoO*E4{wRpׯ!!Һ:e}_~݇>1ޛَd({Ʉ"*:{n+q l)2r3u >p8|V߁"IHDtRJ~8ϟ?]}!̬C.#$cQZZHLx6k抈fd$~~?)8?*Rz&]|/4"cB]uu1Bb۶2j#UkN<% E@^I&RJR}C|_&¢N|xNI).|l1sIx4>Kǹ*# ѐ#7Mkd$!o{; 4jݟ31WY]Oi(_-MRBH\D$"t JBOHDkl!!aMI>KGh>JH5AEo!]b6CKK_e:qRJ ZKFVi IBOҚ4t=;!Cҫ"IDXi8]pjNB3 i-%IiM@7K X TsѪ{x"LjHsF5$1&>'!V) H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxg{\Iv&eL޻nuˌLH3#3_ {3:wLˎ4jS]eIc~c'2 @ƻֻň.\pŭ.\pɅ .\p… . p… \p…$.\p .\p… .\8@r… \p… H.\p .\pɅ .\8@r… . p… H.\p…$.\pɅ .\p… . p… \p…$.\p .\p… .\8@r… \p… H.\p .\pɅ .\8@r… . p… H.\p…$.\p .\p… .\8@r… \p… H.\p .\pɅ .\8@r… . p… H.\pOc캿mt.vnَD<~[\la[t߸o 6͍)\1r{M,eCgn{]b7q5u.;=9ޢg Ptu m{p]z!9M3Ɇa~pI1И 1J.6q_ ~3Z{f=pǞH7sӌF7N70f0[t.FƟٟm\{?s7!:{`#́ԸΥ& 6Z[ocmc ~ M~ύ5:Pr1!݊= 2oϻQt&XosX89PrY`4j?md/MO޾qԄKM~~ǜ40 =gqh "bK)c> #>7!Z㜓9I)IAD$˲B9 DrFI$ܮr1)ya;R Zi=^1+qΉ$織R4MEQ2Itn8!ٹssNF^/<99>q8@7ǨmD>6& *O4KӴZYY)-`unX Ѹ,OOOq^/ 0}?1__OS8 o "!,Eyr,,PZw4[хcHgH v^ۍaNa893ƺ|鈈 mv#hf6VkQ R&UUDQ2c,RyW1lF̉\\`׮]Quݩ 9}ٳ.׽>?DTY}!---Iǎ mX^ 0t:{ 89bc6ˤMc{##"*(R.UU5 c,R.VU$I( \OQpwܪ33%ؙt:;~?(}w6 J#w#1Ѳ |1Ƥ" Ca)09@&`fHRr }}UY}. 㭭 -bB#2XO_~גTe$,, @>\.e# xTtax~? `d77ȥ@6MqRJx0V0eRt>͋, }nQ-. mچb8^yy7 <1B0 8`cNf9NgO) ÚP; I}X0 @Ǐt*"jeeEeiX$6cGk]Vntax{u/=i }DD`L%` RJpARc >8@B/W \Am)ABRI,W ?~eY’1OJi҉  NTUʲU^pg/}qA@bnoB950o C ԅ HPDBJѓv\x᫿V(TU|eeE^zHND *XK ǼQ۝p'❻}b&qj!I`Cp,AR rAH+ Ҡd*B6C)$4& *%N{(^'?YPU( l9 蛜)1,s9UU%2LB$$A"zׅt޺ 3t~1g21oM0̀.>$0H$K/~ pO۝:on#n7bgFz1 pw??t*j. LD!![Gv3fNa'L{0ŀ#8Ѓ3=}Ud) RQIT,(d>GeBRez"/そK",z>qt] ji$I(tu6ߝ\ p)5W/A%XcǼ~@c `@Ā.:!=6aRJפPiExywAp}ƀ_kñMb[#͎~v;(=^Y!: +oԅ-C90# 0U)!K KP%*B%y p͗_tewNUU\eeY)Y);90rtM+2Z^^.AebQ㥁bHhro$Ut SsR:N57j>j-UB~"W?_$PI5aa羲GӾ p_۝E0K܄J縸Sugã( nnwOGNg~?G!$7$>cJR#!QUMJ$Tu[?^,KeY l0Ȳ,G]hwt@4kXYе PU᠉:fS% L [3|wJ܁=XykB=:2̒F4R7.};^ w=ũ b0>COՎTuI,+/!OhabkMU9[?.\T0 Eevm2yNX^^i:_٧$ʡM֛Γhohk` CA)d< % +f B?{sAp,nwGn \8|\KձI0QEѾ >rᇿ['rB@@>C|1xZh0) *"(djFs |ŏÓ+:yOrE. VVVr> ,ys%o>͛:PK1`6sfx隔>jɫy_݃7va͒NgKц._au ~Eѡ(z[n +U@"O+PbCTCJ R*])4iD0cȯ\;?.ୢ(>˲J$hi. mB`yyZ^^N$/b:sWRN(a ܒƤ&ʠZ$ajL!ӪSlLx`/}.Qv;z^Vz\(ǒnkv4)CSu^o=Gz|שU!Uj :!y\FO*I(P B.$J"}tz%οsW/v|+I̯ ,x_H.& !(s9 ʕ$Iy~?镬DQfp6u~/ڠtř:DA3% )P'@}pT׋8F9Vn+0);084;En.BDI2gpD>7'hTΆ-R7 LH%R׏R2|G埔G:U7i*2 JnhBJӴ\YYI4]Ȳl6_D}g)B[Ǐ$ P"Th> L:1Tzg B6=' LǢ(^׋8)kՑֻ1=.gkՑZ=z]Q ӿG_ޱ+<)y7|">GuqC Ԁ@MHJE͊YAHJV%Sg,y(,$J: ,:[΁ R>+++4My~?^TeYo#oe 4C;'7:sq7c2d{n;RuQSSS=mz con᣽w3 eފ1pp9\eT4@$傐ZĠ`1,}cw#rLe͗UUTJª<IdI,iz9'J*)ˢ7`dBx%ߌ* -#׿fᵪOJb/ ?}O:^׏8 p=;ױ~Su~?x*a޻w%Wjr.vrP+$$'R4RHR!1( ˥T`V';!|ɁK$I.}E!):@u#Yl>/i`$Be平ftFN6AMITDߛtDQ-~ɏA#\ג(cJÏ _{> ãQxgqݤ`XfGӪT]ǽ8wax8O?wj!VI*+5[Eh#)kP*B^R!jdD:$$1Ŝq'H*,fJeYYU-PZb4ưU RJ)˲i`%˲+i^by6+,,T 5Y?%nM MOtv/Smj;A0s{N-(D HI0%Uk RrA(+U7ʄDVIIfTP8K}%Yv, =ls6pptLi=AIEQ&I Yg+ :aRhc$7.M9g1NrV% [SCl_yJ[ vzFN~{0#sNMMnsteDlPBj$څATڍ`GUT]%$*aI"/ HJA!Q֒jRIrpi:mAC'πD/d,>D8pL=➇ pvz֗;푪[6Oy(ax9}J j 2ou\c 5p/"dR%DvTBIT[%bGi^Jd1I$MB!G ɥ vȼI)͒4ifMZUaѐ͔YLyP7O*%|7Ή0 u]x`H FPU ;:qc$#fmǎFIyEaq3Q}+|Ls%C'XB0Q%Ӯm]Q)2B}FCYz3K= $ |c0s9ũ,.i:$J6bM mJn@54K*u-i}fsg?_3+)*d Ɯ#E=d z9rpِDF+-$K`z8 7x xqo+0ņ9 zV`PoǮg꾹ĥT@RH)BR!ZB3#6J$JIWyI[6N:MjF>q|̿P7A B5UC[gEt-vH&oʲ,MuWE~2 2T㓊;riwr P2("M-~JO_O>[\-@1J*y$m7!px8Ia*>Cl?1-p0Ͳ^( Mu:a=O{[,RqRȊ~Z#m)vQUHuڎ0#}VYFXxO iV$IfYUjZhCc 6S؍dJ%ieW.'I9|T.pKH[u:'[.mGb,s= 8~exg(2nۉ(:J,8vIՍf^(uGḀ̊R"0p&ӷ AԲ*\Ȥ*l:#C4D$W ŕOq$yoeYv>Mә4M4MʲunR0}̒6oVRJQeiRL _SAfulԄ˚~5I VCЙ1Y5h`.k{H~9a7ˆa8N>9RukҨ~4=G|^$~rBHByGhTd.H򳒀($!3HJBHk=B{7B: U?.X'I<$dR#\#Ua ބrίT*#=5ORt'ݻ+umlXl@H'1YGW>|'oeBy $IҲ,k2-fI㤟jIBג4M4˲"λ+E6 P uӳ h\а?A3qjhl6bmMr(7P!$ǽ{^oE /CRL. O;Tn[AIy&jkGԤk,_TJZdvۮdk,8xDy~.MY]])˲XCȰa=1&H N`Ɏ,TږBy+0JJo8Q`iuj(G$$ӛ$a "p 8c`aRsAg&u:oHd[0Owta/?{wu%GUre@RL7!W-R>A{ U2R6Ja0rx^Cv$2 [.@ZP Ŵ}0ˎJjA2 Z} TI}Q.H$gg>̫?Gc~2MӋIiU]y>'UCcCBn\ o"fIYvo>{j g8&Wh=`556rcj>ꩲ֡ g'hG0A;-v^ Fju tҸԝj=Km(z_ϤӋ9 $У%T K\CB #?͘y y>' i#c&؉;rtYHݭfLޛ'|wc\G Fdgu!~jΚY5Փ1OKO|-vwz='~h}GQNOO<5 c7_}ɅN B6`GJԩ:Sߔ_]I6VzJ_K^ֵ#pp2ǹW~]eOTm:l$aGNi۰k/gY6e%{TJV"f p^a,-^( J6I^zkGi8NhZszV<ߺJ*HI` P5ﵵwLQ[5#/Jfuc(f`#zeu4Mmj׍Vׂ?w)u1͖/dY6Sߟd)AUU:,ujj4ʚ*՝1 bR;1R ˗g o4ݤ }zl(Ap/a{{. ԩ:!!WuG8B^ƹ~NZ.iiG+TJ.8WUyBfDFn-g);ǎ l4!],.y޼$/J YJVJ KhۥbyI{a`N*IC7c>j7:HՍdHQN틢?'_D.!+ )!|&}їƾJ׽QAא /}xu []Nd)˲:S'-MݍKM,O'o/g( ֘έ;oF97H!p`͢,5@*$>-=Ap< ÃZ88OkZPKd/ וZ!cj,9o=iLQ3 (mzԪ԰% |'=<ϧi:kRu0O뀑28@r;`d #c' %kQ=6'^e?lG(NcLVSSSFp( cֿB@͙U)ADUH8Wk0l5xO&Uz)I4`48=/ >X0Ou=G-K0Zظ[)H98\e!4 I3-F04{xRcFC 9'^EGw<{wWE;12R8VQrE]G?rߗK%3Y!u34 dy&J@Bꡒ C9pխ q51#̟y⓷}|M< zS]ϑm0bN*y>wFzkaP$A`t9I/oF왺 ,ҒmK-+uӽ%u#E y:\zApL!X0q$z^Eѡ z_yL Aqcd-۸2ٌ05B[a'")5 Hy ..Tnn0%<ե mK!xY8,iE[)eƝ3I9l`wk0j՘`Pì=.0s=&˚.cx*|ރxs2Ŏ(z~?E(?^PU&NiƩgY}KH$ـ g:bDD7K 1w-Ge=X3Out2Mfم,fOʗ0RJOՄ Fts2𛗪LvdǯޛKA,0" bɳ/ZPJ ckaތ{H._;Y[wF7ƽcCԅ(%EܯO'C%7 wbGڝ}(q^qν Α,ɁHvʮsv~ߋxw9H~;ATR#5xOmE>,m1D)oiw: "O^?hRMH.wuE}eٌkO!U"\8@. Zeu%O\qy/]H3HViafjHo5AqGC_Kjؠl6կS0u d]O~i,vwM +\`C=G,yjכBǟzr3 Ҋ K%&:HIBlvɌnޥ(J׭!Ec$T{%*0gXx:Ūw`0X2OMn*IBpw|:@,iCZOjTUU7˦ie7疒)̚$' HQ-Ui^٤}igD׶1Z<+=N712Rx%aC=G0 8é~{(:~[WK\h0"p҃x27ÊH5rf(-yuSfkc*ucϐ}~,N=1O nԕRwkD1smSwRx bTe Y*ڦc] k[WPI3dE-c*5P SI%pޝWα(4fܹ_[n*T=|gE0M{0 t:}^o%Z_knyjq}7қY]RJ;͒KSw <` ,2kz[Y$5Jb_32_R] J}$/|.?}䷫80\R܍gHRw=GsqE]O^!޽{J1c \/#z1J4] -sHW rd3<ǐ]9~H{E$`0XȲlpS,YkM\8@, #n^[>w3ۧo,dE&+!Y%GDN t=nBڠgIeC?kZ>hؗLnS; |*vEQ:Uw ã7_uRȕ7eV92 ZI#␋6v [[1I2k.c,tJ}W$hlqeӿ0DU73~(pi ).zwu'1p"5=,H+±£_x2%=F t$橭8^gRu Y޾B)H˼C,8uZ"A *[7jtjf` ᨗ*sTTdR2{Smʒ1kii,.[ iVrCw&) ڈUVS)m* M>$]Ww|R ^}?58, 8c=R~EG>{a32O*PuXrfRh!o: .] ;X,~*:3.i2Oŵ׍ISU- Fq)ueUUoYsHKkڰlŜ`nM#8t 3FBUR#}-)ۻWC^fIn!Fp[5S06OOB3%RD|fah,=jB2RB [MgXlfQ#aOp?z4O\(l\8@ wv:{aĚh4?D-4 >*kJ-IўXkGTat$aѧ^x> Qz;jJC6%14<! =|wVw$1ԸQq(uO~uՓc,T/Sig 91qH.xIe:;~qX2pmz5M+Y] 4),S0mwvnݐ+*uXU~y, \w5&]T'K g~u??Œnw_cϑ-dn/#|k^ $d)!JSrBn)m R`tLu IZ5% ^!?ÎX5v%:SGyW\8@MҦdD[g>a?sIe^庮45Z`vcP VQ#n@ ^SyP#Apav<1-pqg&ݑ29 Q7svzWr'Uͪ$0Ik&YBQ#"Hm jzClF1Ȼ% 叱O}M#dDԑ@=,dn4!] L$ݏ?Eas7v;QXǟ |#nq co^(UNf利410Q%{i1n^k1g.0 8q"f~]ay*󏌐!Ms뎀mxȶ܅/uV o=xidiiz._~|>+Y*5fdzkPl;v{hRKܘf\ܞPk jڨ}bo9ٷW}^0'Lj=KTEQ^o9:Kߜp5(2,!0f4%j!B$V3OZ71@3haXU3!4`eYRU 1O]4#k. ݎ;:eaYג.We*rQʟFԡ"v# iɱvKU)$P]g:>lG;ξ8wΝ$_#U7 }w: ( O}{9SRe8I%d-fsr.xr'ŢJM">Hw"Ϧi:I^k7Ohg ͒Y^UUeY}f,;}Ӵ$YeVQ-e>\ٍͨOQ kKGehy;G !2ߪpb7n{8zQ>,zh<[;t؃_MP  t< X#ж@ Bjic7c0c񽗰ґJ$+C@tsNIR8EfnKY2,I}>9}y,Eݗ#іiOcbI%i5? L5̚IZ A)q=ޕzF1aGq#EqOuݽawO-RAB* #1R5G B0H@!FI2(e}1 νW1C^ISG1$ZzF Oe0[҅ۋ%a Qxe4E/fvo i׆9jGx 7r|t@=$=D)#(nj <Yn\m cvm{axË7.^?R4<+k;B]/tN IUޘյ d'cYg,4 4Mnyꄹu{hrns45+ J0ns-F{'ySP~flgS?0'8#L"5Pg U}BH0ΰK>x]yAp4nwW߈ |}zVMՍ(t:^7tFQtؓ/ ,i=Fe<N.//gu3c,4Z15Zg gQ6)8EEB' ;0 J I? Zzu1-dznw_uwc!-Qe"tQ==4uMԌ#FKO.{|c.$aR`~n)'Qf?̧w7qoc$6; ~0 ax^kVMFCr{jօE>jTg`Ź%s4y,NOt`fI*C2,fʫ ? \i3BSO Q. #c!Œ\}XCj3\Ⱦlѯ<0 [2!vOb98zqǻLS_^^l*dW:"1ni7I I(IڡSMVJ pe6AR(ŝgX!zQ"~3TƑ2Oy 9ZҠkf\ҝǒ6M$ɒv_LnL4Q I9tR]3LRqg]C+k#qXxDrOax$ \   sbs/~O痗,fD4r\%u0H1/!*,Χ|i e)`E/ s0@~.}687<$ɜ^н_]1\T)DS96ABV \`JA![G`Ԟ[q9O_._Mnf X暧tsҝː6*_R#e~p*)Wۿ3h-`h~!)i<%J.30 mw`7lznwOE 8gW_ T(%BS}G9SpeW3Ih3g`> Y~{؇?=G2OBdm+I@5X5re;o^-DU2lh V}"ɡM Rzȿ cqVjqI Lg >`Lҿ^DCvO<(q܏㸳e9ZeqW 9EQtٽ+b9{^Tx׾u;W2{qٹK$xD3PXEU|i~hdƿs$ c # iAj"B%hc:2^sG׽IvC "ٿ EQtа1o |=GƒGQt:naz>KȖ+\B=V d&eAr`Ty*9.C~.؛y_Hr$W$SS\IHvn_\8@r,irÚ2LI KoW3*SQkxkJE3O#h$е$ӷdɿeGMjBD)P𾧻Kw=LG:ΰ &7sa02=GSSSn;a7_W{%Ç3ȼ1#4vM7HZx `d>XFBi.ieY wtSSrG X6Un;+\B@VJzRef٬CGhn"[S!` *g#RH}@YJcѯ{0eqa'zZ`dS;Pw:ЯsIwwgARI8<֨ZLՌiJ[]S!?#+s!fC:tԵ/OFQkfIceyi.iz%˲KW .}rQRxlkcW_~& &z_K ,ŒaK($Lbă^|^7v;s8Ƥ6ĒȘq7#ȡq K5sP%USʺE3_70 N+=jb#`Z 00,P{̙T`zؓajG7t:Z>Nܰ vLMMHr?{w'II $mS6Ofd&)rp)Q՘.i Y$=G750VӅ$n"׵$I,.}a/A `LoJY5GEPay9 :hnOt{{SטΚTS2!C+ -pb,K7p,Be3§_gRXfK=is fl}` U|Aj4b'x)V X!J1nTZ~FU^ogE 8vj@s+yTU+Q큫XTJ5n+!N`S?jq{y_Ԏ CS`'5O2=GRfD q~C24MTa?`S/橃`!IAe9U7h밣K!$$&ԒgY&Ib.vo&Y)>Nm5xVk-c $k^X 6Y'=gTmŜ%\^9SMznE:)q i5X8y } ~bg) !CjG]?B6)h5;P/<#%ϭpJ]M4SRV:ugd秹 Jim5Ӈ-Vzo& 2_5ce YzR"ľ;0{0<a7FLVKhyjGNܻ7}iRH3VB81>{Ȥj ͌ezM`P^>k;21Og4 3:B1 Z5x5$ ^0cgxiltZ#Q˽j=f$B(!'k@I?]8s |ޤQ…q_3=G~?x2<`*+:ƀMd`QKTQkNFï 7qSxl@Y]2YcTuk춶rZr, q,-KARL!FN894BhhTBGܩRȂƕ#xUJ8_=7e'wή! nۉx &4ω0$l<KxgSY]SzyK/"N. >';vSWQR_!IXГe@:L2b!g d{]]; ?qlsY2oÎAp_hI# YH" FuQӓeϐ2c%hLkUDrŇ?ýSއej, ӭoybL H.% X Qy ŝ|Gy$# I뛐+"9@rq-h=oBʖgY6K/|?JV`mzb0jKH5.ָsC"f/P dw Apиw:` $o|C zQuQƿ͋ fsRB$B ڮ QwFD`g. Iqm#dNue}Z23FYIMTK d,,JQ@pU#}\kC6@iZNCG*'pSO"tj,ԔUF*${??rg(en3$^zl~hP$-ݼR͵t*[#ǣ( :9Ï?·_Ru#x !׀kkI{t1O6 Fh=0r!,|74;/%yzQE]+u N7̎&͒4MMn&z)r-Of ldJ@0׾lZ͔LN/r)3\ 0}(r 8tw^o |d9BfGN箇~<\>I@DAȌl6OԸ2I(5X_33OQ~ ݿ+|,sI S'@N]fkJݍwNg$\wk`4H0#"T;쳾h;8(7m#C~ǦhoE} 8WD3t爵k$-5+!4i_G>x?@q- _שuSk1 q,i v-xbdY]};-5"b4[ɤL=Ka&ԪyJhI{Δw<xBiZ|io#z>,!k~<9qlSOYҁ8wJ7vDQ?cwGgD!B"zHye#3~ ahFm(!Ҿ',[ek mĐ$"9@rq,iCJŌr/,˲HŐd>d&EeqU6(y( |n!zjpL?=Ah_۝t:F'|0{^G7poǮ{?x9 tP0;.2Iݒ *!0"pDSξN uNJ6V|$\l^n\ o"6^]ȲlHM *ug1v+ՓjAևƔI ,-OI+B G(}d~~= `L-ɳXgX:?/f^7<3#B"߈>1mD H Ϥi:]Gb` -3a2˜kG'^:s5Ѕ$M. K,i!˲p[O spx5Qڊ0 Se[GK$]QBדL!#$(Q >V|EÒ,C8@xQMw:}a9Ox̤P)oJKZ捼[ڪ9S2ٗ_>Sy~A fYn)TfkRuf\lV(Sʼu|c+Q|sܿ?],fp{{ZrsHAͤH\5Rww>ξ{;"Qb%I3AVЪ4ԇF؀ >VY̐U|™C2 T&"vgѯ<(tݝY6ԩ7yoRu^og9~:p9'vbP#`@S3:m ꛽wW `B8,!Ja:fj H.KVre,83WRV@ H;5kFctLN!$r,. )cs&p{/_JDHvnkGAzN7 û}/ȇ9Ntf_%aRͮ"q ;>.#izc1ϷY H.6!m |>˲9w{?!xYԘ]ٳI^av>G^l⏙I Cl <9DE)?kZҁn( 9&u8AEVt: 8xqާJI#c-eQ=HHts̈́_C ws*>=GW4])S'A%{8 H.6%cH+e٥_UJ^VFHXXu352k_.qj'Je>S-iFuyq$KC|ΰ8:N7 C%yaQu[0 =ů?O]NaPb!W?fƑQIg$tNljݸyC_t69e',-iG1O]/, F]8@rqCSwRxWxηIEḮv6N Rbyf($f2 R\DFDVsR2T`T_(6L?Ԯ |wSaF~h*=Q?Ç>cj U@)= ֬7lNR3i:cdί162p(ϾB/3=h!˲03O8?Mj/7niDo ODqO؁: !Z}Ю F4),̌$ٌ:zͰ#e!:E}yKణAs8tax+?|z2 +ь#h?J<`j7 kBm) 1L=#I{8EQvc=v_G>أ?}Hr )- yl@$AҘyF!ɺJ.02Zr|^tkG9݀y(4ź*-S\45Rw!M{N/0YyL#,i`T BX_b% 4P,XQ+6VpL ܱ̤q/ݝNPǾ鉙`.\@VR&NáV"ڌ$AVrio8 %C̢gOy$I4MhԵ/o`ژqǎ ,iC2,K-pXʲl.˲ ?sbRL=Œ6FD`P`q1׳02 >DD-QJ0]I@TRRJRѽO=8zSSS;zޮn/#/οz!{wr*J$5RIky% b`TNJ<0BB0,iS橓mՅ$7!m \7.dY6[|eVjԸDq뮌 R3iH=0Oۻ>+g@ސ թ$IAb݁,ܜ>H.nKǐW>eL|Y *= R@h 0sU)d͂z9a0 !QU:nс;ǾlEG8>q|4c_@FWrJ5 @TAR&02"Ō`'Mv X<Y 83T(9S'$su$H.nMn\ o#2,fd7"B`:;i ,-0uԑ0Ff(󅆙 k0R!/|׎Svwz]?'wgDJB%E~ Tkw% UEk*JlX;U, jܫ?ʎ<$\KYelz%ԛ1H\܂2,.n'CZUJ,,dȲڽ5F< 4Z` 3 YDE!Pi*MpEu:;/~j>[QdhQbFi06Όj1j$=JC/pNJ]JdԵtk1ۇz!>$H.nK0 |( ;SE!D R㳭%.yM`dy]EKnޡZ>g"DW@%xfuxy;_?8,;;%R,$*!PP%7RJl c HՕ)Oe4ML`*ưuUuCjbt▱QIeb <R5 ˥-{6F Ku~pRKɈJsCa/ <ŢCу/|}{3 \-PjvTV hiӈ*IJŌJ!f,P^|tmqp橄SGۉ5i\lj)p1%1Vll cCG}f( W#|Gq`rjxo>D@/ԩ[(bFfC㢭=,45#$ D݃TU*&JB%$R%*TB1%b5z_3A r\U[#ɝyu$jvҖG~xɺ=A!}0^'Ryl \ p=#mƢǘI*X=]11n%Fdtr ֍wt]`M >xlTy|_f .:뽠ɦgfZp iKC#Im/ې%mQv jey_ߞaݐP$e)$5PlYPF $ H}HbQf;l۶P |l0<]sN7Hq4P4M/ $IFL[iufYv9{_QT:omFp`&l $Z Ͱ< F /jҦ`bC9{ Iy[h&I4MI #; wiKUTHX&X)`'I2#gҕ>EHuN[Jq0SwQ֨ɬ2DekVeGT&g5_%,US%ȺӡVP1'5@'ATjMz_ F[Ktm!D]cJZ9Q ڷnSA#>|j?(3+URe1y$ wfnKrD$XG_!I`Lˀm= \LRLWKT`c>t02*6$t*QIVD폧ɤkϛcZ8X P~S)O$I  È ɝFL$Җ\B6%ڶFA5)މ!x F5l lՌhȞdP%HTȰi`AG>xGIKwF',$ɬ$cSyBETv wR Ж4%v{'1 ؠ \βR$C橓4y-Җ4&X{WoC%O4I8}O>$򹺤n2NZM'm02vIթ=iۛn`V9z7<$I&Ibr =ĥH Lxdho_)2pm)$I2od?}Rn 5`fd%ӷTƝ>a如aF@=?@] FZȐeY wtG¹$H[Ę7sJ}v&O4]6,i<w(E zhئQc s B63VCf0M:Q-" \2)ِND#G Lfz&~ꋦ8{Z m%*F3;4WG`=ƃQuߤW #곗Y:{hn0,iw9{-Ts4f  `.d&Ycַ7S2,.Eqqǻx2T=W2FB`O^{woޫ̲b$sZ8s4q!h`D. mI*oX(Q{!C57GnJLJ$繒($*3Ult:@Us4%jԋZ0Ȳ,'F9v4Ӱ"~;@ڢ8~YURp=*i5>7 (yg6z` F3 C̗(?9vWwSKL_cHZz#H[e M+%#qg.^EeY$qxxQqSv+B$xwų>~_4Mga,rI[ǎ6re{|ku5MR/I<1fwnю9&jgI,iz9gd) 'ټ [`R52(> .NkUaG5vIkR{:0"2IH[8tz&0 2$e8UE~B`O5b@yM{wGoE1TM2ZbؑgB@nxgҖM@LD ; ᗘYvϝq_It!Υw>-fRe!b#AL6]"Qy~%M$Iz $:'d) M M]@4X݌D>KZ/i$@I)EQeYeEQ,TUuG\wb&jnl+rN<.TUP,˒,Rf?_2܀k{& mgRj΀2w1_bp+x "QEeYJYK *s~L[ +BAUUiY9Q@:vtypœNɰgaAX$2q 4%UU%"RBtGTțǾB0f 6`r)e.(*RsIGKmF*xّ#ߜA^JM9kgIi$RD‰𽡜K5AiD"DT+ưIGŎ\\J5=m n-y$5O*tG7NȒTdX n驰sqR˹50u~@șnvH̢!gi xH!**{dDc1fӦqk#M$$P U#L{{8t#NKbHƼfM$er!w.ljIwrc䩒\;o!33f#~=; `|zn09vI˓1mJ>>BKwl%MW36,1F%*̨ J}i ;Mbx(`;iQ80ڼR&i+Ɛ''cQk|ZdXTޤ 1eJr(UN|vOLn~] D$KRj2kXZ뚾VEzP@lpHH)oGmv96ֹ3@'ǂ|_3KZO9FcK15u-F (R I nt#CZ5$:@ڲTl$,iCy=pBbxJ*0N6]Ɩkea#.n"m. m5jubL꛹Ik!ʪTV'*0~:$m0b4sB92leӮ.C:5@%$A'ȹ>Y ;!=-# Hj&N̰g#pLk,<PWՐUBk5Z0=vf<.ndH`E<"%ٕB1#%6"qǛB65e:`Dkda7>w mR̃rf̒3w~$j95p} \l?7 .n*ɦ}Ր m$eVbF}cl& ApҰUBK2_xn*l%;i*HmWR;qn<;7T 3s+Њ?R BbJ͖Ze-#z m51ƭ4fD4 #=y\Ou}fr%< Fe3.̹XV +8(B07l*1srrHɀXsh4xlFk_ $I$eUMnS;@^ ɖ[0R]uHR%j՚.b/MgҖ4YHSC"ҋnkSfRQM ~rwr5#®̠ njI)-F @!J!M"VK H[3k25j]'e 3jI²M2"ץ me0"3-<<.>3@l 1#9fO)1ZH[/k VPݢ V;j0SR BmErwH[a51Rv"HJ $dY?Wr1>[ 7Vj.r%cXMTb5eT c#ndCdFP϶HFMi~4T@'V-l˭#3њ6YO)2(g 3"Zm:Fn " bj:V#@tMK:/rPҖ[5)I3F҉qn%~qz-#Q*[Ad52w|:@jᡱi)gG#MVI-ҵ m0'iH[n.LǺ*MDUW-ֺgHulҖ<*UVUfZ)s#(nvn%0_mx uҖ|tơCn޲:o-3FitMHzu]lR)؄˒uk2-.SG!d"@)q[] `dfB^4ǐB%|z8c.ew+8y Im[ F *{r2eaH9Tm>z&"H/2,iٷ5l=4ɾ mԌZʹ*IrkVzTLVY`DPoC6ɐ`jH׻>TSNϑ0M"u[\tO6H7#Ɔ~cHH1'7S1l4; {+ȫidi+QhT*xѹ#{ubZY7";7sAl02 )ugB:/;H[p 0w>H 4{ V7o^m0Rqgnb;> m[4 N3]p-9?*$$ Lou̼y<x J6/pyVH[p$Y&USNP.neDu[FuCr;u!}.6;n=3*^3'oыi.1[1LfWiEscH[!5ZUjF11O({kf`/m!0#ҒGi.ik^Y0$5p~ƶt/3.fׯ[݇Җ;92H,"Go BJg[ @J f]. m[<+ɷk5燢ZTڲ[Fdb2{q.ri+/QP1ƕAJktUԍ2-F5CUf7ǥV H33t6e.n֬HalkQ <]lލڅ-FVk9s.RqZ,N\]blt$w|:@ڪ&m'k-qbg5uu.s~vcA4 m[>< ;D% HE[F>${e1m\Hc4fD ݁s oc#2^a$=]bf@`Տ1pc Ko%YO}ɾӑ)7-#stʻTV]7-3|FŌh]l v$;U7W͌sԺ-!FU=Hr'z[}8^4ǐC"͌m*5Ix.n&CA#quŀm}!cր H[!ikƙJ H&[F%Fi*,9rf"gA GOXmXҌF&+2*X$3lVfpVDtd2 l]08H9:{^ԧ<|u ,E41n i'y"ygi(R[!O0{5gVBH6`T-a; j5HMzK'UʞQ>q$ym}fgGȨ]H{i֘G&~*k9 !t]4P_upR Ut犺NRxԥZeC)nF욆.=g F\!2X ޯ>uEF1流Dzi2~ trj.GFڥ)sKCГWMJ2h5R=pRkNFiIԥah1bg@ʴ^[f׆Q-A|e<Ƈ 5Kn'ϼ( % q-jGsխ98\3gT2qL0o50Sv(Nu!m&:ܛkZ[gT b2=; Ѝsւ|g{+*_wab,@j2(Q)2m{GmK G=tK`D@jcT]ORdJ}%|o!zXU$Ρ"[=oɩL&Rs6OGYСYY416B0ϕR)g!Un F%)X1?94zm J%0S@j)pQڎ.8F"|gxx?ڊT!}nDHQ,Rs>ƔQε !E"WQ..{Ihq 62+Xse档Iu&q*?M6YP< z81Q!]bNiAc-M~ `<ahd'NGOi] I6$1zb#F]"3p,_U-fO 1MXòtT6Q@jni:wDCH{JhGEWiHJQĉHFihH#RٷfWh3@bU#VĢF6*n }{ n&*tq3z*1F`qwQXnn1= C+Wd6 %υQ-rUx [K4|gç2:^FOڡ': ~SS0*A5pX zIy6MEgVƘckֹ2#◺!" [wrd_y,NPKւ`Rp|t$DZ*lD& ܅<^= FOUHݻn`_ȨlTȨ D_}QVUtWq\G ȼEV0Z(;n:F: .6K0}K3⌟ Bj| .*W#}JОJ*iD%"U1lntt#ϥq(Vm͢$гW/_[DԒӔ"8zHhGHi)MhXEEFóh#=otgЍ4dTA^ tYdt @)H<6M bFtxꮷ[_LmjQDTs`g#m;<`dkLQ#*E>z&>y{ rwAd ]z-ctdDvV5V%RHDRJ.FfR;䂡6w*Ghu29DKЄ]؉ef2ɑIU$ RрհtXZhQ A{w7OZ5#rmz& &ӁKM*eWE~ko0i]ffww~'n'-grڬ !=oNfvp \r+RZ2Y6)i^@jPjg2=LW Yc~秾9OZyhrꥣhAEz'v"e<x]:G|3t8VE_~1~1c1"4U(@jLƘ\*gUDQRcp<??iy?l:-<B:֞}&z?3U{/_ǿ|<?K@{%@ -L"釿DϽ5]Zw"}Ǐmku?GU "}K}Nk{H3B "+)Կ]O?޻ ܯ;49Uf02B4^DNfvx8/t:rAeGQsrL8,[Iu]v>B;Tw@%[B 'CH*H,~o٣"H.E?B7]9O]3.)WS-}cn.=~~-^l!ʺNh!)[:zaA%QѥT=Qҥn&Sx~F4'-$YC[B+Zn)-wHz^ B5(- BRV&j$b҅>ѵݣt Jr!P;Q\U=eFKrG4$%{I"%譠z t2`B+CV@,;FMw$VL'z~ ,`B AId);!=T$<0ytX BR_<HI B 11!@B!B!B$B !H!B!B$B !H!@B!B!B !B !@B!B!B$B !H!B!B$B !H!@B!R7>IENDB`desmume-0.9.9/src/cocoa/images/ColorSwatch_Yellow_16x16.png0000644000175000017500000000016312140261562024177 0ustar guillaumeguillaumePNG  IHDRh6sRGB pHYs  IDAT(c$0aTpJIENDB`desmume-0.9.9/src/cocoa/images/Icon_ActionReplay_128x128.png0000644000175000017500000002132312140261562024127 0ustar guillaumeguillaumePNG  IHDR>a CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9% pHYs  6IDATxtT?L10!] E,ԶJuil{Vuz?U׵ۥkmkOTsPvU<⩀ R5H6@B@2!d}{pgr$;3sIf>>>}/$'9INr$'9INr$'iZ~e@' K4R-@Pn<˓Ò=@P"eQhpRL(9,|S ,#D*\ۀ|v䰤ADړUVXo<С]_D,i@qhibc’V 쎧dEĒ <5SBo!RJ\XX7 fΜI~~>E>Rǩ9q_, x%0 ঁ(kΜ9,\bƏ7M***J}}=[l駟#Yo|E.6X]YR 6ȩSMb!0鋂m $s[naѢE̘1]yjj8y:: |5 ƍ)S`,ƎelܸĈɻf x' iU`D]Gpqgl*0c&{G`Ōإi y3=T`I _nzd?E7%Xv4@1SȊ `^[֍O _\5Q \iPSϟϲeXlYoyex1ػw Q-jxrG !ʻ|(Xv}aA86xJME(:-@~vXX[`11Va[믿.(2J#VJI̠h{KKؑQV KiՂNFRJhK'a8`5ʆ擿ur=pM7E)LY1o^:ߴtv&Z_&oL g+,ݚ7-h|/ZE~DX n"5ި5^Z宻?)yyyf/ ,ի]]|0s2i,E+c喁`~[bIP"; Nt{L#pkaq1c?8ꂅ Z1Yq?>7ས4-]:pW=Ǣ`x  Yd ]vK(7o„LEq#ҧ½;Y(~9qX\ a|v3,uʔ)vmaŋw3*U $0ɌX,+jZHmUTRh$gd￟J=V<JFJ cXƸϨe'>L՚]BK1q%rpɒ%y睺 ~M/iFgVtoV,4iE̪udMuP&k QP6" kkS x1ID$?+BX9 ^cW0)--xEhh l``òN>,F[KX xac/-|>'EX rwr%)JLUW]~?lF65<Èr>j(\<&9)JnFϟdY%qG' e(#Hº~:3PӚ;QA՗q>39;< @z{F|J+x RTS@ :,ǥX;iK9z(twgogw5_fZC-F^a1bG|>G+,  EE Y2-ŗ]ֈ r»Q jjj1cw˪M3`5覦&J|.eoF/aO'*Z˶!]1c5W_};e-8-/ Fv6H{jv4;RݚFMF±c;L2'-|gÌkw@qdtkZDhZk=+_|$ ;2E֢o ƛZ3-rH:]^KUȰ#M=.ԏ 4b<IlKZ)ԣq%\GިqMop]P4p# WU [7ӭ6L g3Op]m9d̹~_kS~7 xwDutVsLP 1*bt9a <@h@޶?Lf#(NFayE<5l2ED!ӎ-kDmNՒ_2E >6.-Џn̏߰c>`!fa5g-L (MEX3~Ҳ=.Kdc%R@D, R k߃~ W$~KOŢ: n/;b{(Ğ{hh3K#H!ķO*f ކoj2S L1& qO7йj/_Ro L|ޙ6pb}XchnFPm hU\'V`:Pb7s༇-3?u  5Iס?ob:yE%ln`{>s'h{I=LopDc*sFȏ3KeW-0JlE?7N_ǦюXI…үΨY;t4Stlӭt4G,XL2 _Md1X:ȇA?9d64OF0`,FP0f* dm=8s M\,(Y}ۘv_bUsoF}87n WG? t ;4(F_ʨ,o3PG3];w5৳v䏤$Ē ]`9:x3C@ߺ=0 Ml^S#+MEAD'u bE#)8]ۼN|@jN c}gТ :Tc~㠞^Ox'BMH);6ml܅<-s pmõ[yz2sE V]XPih'?g]eH fe3kX|T^CBw֛ne@/!{|=IkaBjx{QP)7id I| S}8lCWEV0 e2>&y*=x~t5W@oMM㞿-ȧD%c1xqDYX]{7&ӖHWӹz2eɢRni {7 i].f>+ w{Q|rEWsD3Y@;ʙ5g;~;'v4YHa 4o5Yee>bB He\O 5dHͨ\ALsf`n&O,-'/n@R/kI gl#]cVa1+s,#~$xyYQg69'˄I Jm !KD6J==v'xXp~{Vc)/N%n@\TZdh\3yC{Y3oVQl#NnY@?1iQRZ qN#t5)\qK&M,`"Hxʺ~Z]OغԨ{pX`*+=!E9PZ*y&tdx@QeZ=@\|x@Ȓo%?}oEIƒ΃#BWsa!fϸ/d?KxO1 BW#gOuoOk/> m + ˾=ge K0Svt׆&B$MB BJNZ Uw=5=oe_Z IPU ^LY!ݻnz-ˣO-F?7=@R/AkP((}&mGِ#dDݡZ@a/IStv42gE.("R$J5=Y)hN%-!!ŋl_ #%=|Ro`|^߆> :aXm:\}e^% p#'X%QRiֶ$E*ULW%h4- ="p$-2(.?|E>_VHɨHh mK^G&mqiQld$xz[Rq~UkPT KhRBbKW3ҿ͢FQ91 -D.N? O]M ҢR2KA F~/O ŋ-]MY}L[bOË"/,9p(@.zCQ.դU梓mH!5TZXDzj\xI0bTO a("q<]/ne3MJZcIr<]/n57l\nҢ}uQH Z?&,iO /<M - KNr$'9INr$'9INr$'VK(\Z=$IENDB`desmume-0.9.9/src/cocoa/images/Icon_ArrowLeft_420x420.png0000644000175000017500000015216712140261562023443 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FɢIDATxi$u uX22+z߱KWh!W%Regͨ)޳4f޼fLF\ ͓@R" غkU{|=#""5˪\cs9s/v/_/&ͩ% }ׯ~J=릀 FmrjF[[[QvNEѱ0 ) RJm+ :vϙS'w`RNӥ ̆I:jAS}뻻r}xKco|{qmFq=6c$F?l| 98`4@ Eh{zG?t;~O|>gߊG71֗:Ε^w t Wcϫ# $C{<:j0ZI0 hkkk0 uQE0 nuϿ?{_pnx95T0@G!@|@)&@`@3cjSc HN<}=}~ګ_]>(.w+^o덺6d%jɇ("CxRɯ#H@(v`07666n{*Qݿuש>o Dc2B"! PB!0?RE6+00 h 6@ŒSw?sw?pw ٯEQZEGQt\v;nwEl4%ԸwbAᭇQ=#QjQF*"mmmu'NsoE3oɟ}`De#83`Dl!"B $ @s/Nrdp(F-fB/$B 0`4Հ"ġN;ڹOo]gz% 0Eѕ(:d<'-jk_7)$;NH~u`(D~8 :c~: ;C?_L6EF@`C PTAPM@ ?r~BBL) d RY8p&iAwpN}য়x??7yo*^`3Q] `$"dZ4{(!Ewtw$"Thcc#:vƱcǶ^w_yة;:2.5=:Q*SEV)"((@MzJB" I)B$@3$@ЍO?3O=qSAlAA7aEQ4y )4<*oZ/!`9v`ss~=t{Ǐ>˿.Dc3Х죣TH(ۥjj>Ҷsde9)WA!T c0F@p2/<[s?_>^WRTO)юRjA:jȎlmJGK)_7Fmn(~mnnvl^H}'~O{dG2E DEՅP~-MI?2eP@   Ĝ c#TwOVJ 0 RCFtCPH-C׺˂yEya{ssNc'z/o}ؓo?qiԀ+*TQ' ǰHB Z,2  B@`B#z?zQF"BIf8pZJ~/re$/n6 0ѱczǶw:'>IkIB e($A 1L֟ m"&!%XE @ 1ӽç~^_Ss5" @4AUҚ/#y_~VY[w*{n#cQ~kbb)nSؑFDHI2Zwvo(SpBQ P5gi?ԥ+B %,g4M*c塴f0t}z mUFǷ777Oollia_Fan`p`P{ˣ}ߏoA3H U;2_D.{*{, mY#ZdP N\"@ !T@$@W R{d;x޻_rrjSEk-Zbz^9dpd_F}?|O?;#rQS;<&M27$nK i/RFRS8Ϥa rn @D@be@`C8ǯ?} i""Sc,MS1Hi @u!eqH~5N~ Q2^(ҭ^q ̮ uFҠD2PT u5%_?)lDrU䐹V $3:Ē9ajc=s%W_@{_z:I4Z1mNBtM$x`_GFi&sy!AQ]o9FfVSUi B`!Ѹϋm T@/ ̌% cdOݣ_~]W߸5 yix8r5"opX<7~Xꅑ6bsF@6)vi_8Z)L'2sL¥lEF8)R '+I6$ <{ϟ?cS,I4IDZBwn]RJgWFwɯ#bo afe0樕]՜sj;?y,9P]7;"d3"f׳臂޵ڏ1f/M`0g;iw^Q>ȇV=2І4ڝè@Jk|X΅P .yURj]jR({s^>]K)_Ӻ IR`ƂG7x[|[t:zt:MBwm*+ #ʡCv~y|ÔB,gĆѳ#ݺtJ.ȂHܜg7W Y \ ^/-R,\3%w s q/No _~{{|Nsycccg4M'IZSI@GѨ;0~/zzB!edN.`Ti!窨?TeawjvT W)Vf^4L^a$T bП{7#(.t+h'IbPԤ*a۰X=0:do==S^ ٤~(Ap nQvrCuN!lnpUu;ss@P]J&mH rs2&0b'9vw2~}R<֍+O7_t:z$ԆT:彨@`Q0Efq0B֑` _ͭ9 v@"ᚃTwR:6HSˡTB-T:V SU(cw n= 2Ξ=WN>}sO'^EQl:F(K C /CQ޵Gz Y`E(T'bj󊘫uF\@ܸMcJZ4 9(7L:UeT{GXrZ5M- 98\$ߩ^~l8~^vN3NiXJ* a[I#@䗇ѡ豧sF;v<Fi\wW֯$_F~42e0ja#)5GM'Rہ!0'm *uHX>w!EadOqզa;#Ck;_]s׫}W:Πu( 1 JhSK~l"q6{BQ-Y䗇`Ǟ;7P}kO# 6~>r\I^ԔԜq6G9& qM%uFVBu5:lFQU U%8!qj\@VÒFXE; `6Owg~8_~NEQ0 yvͩWߛ00Oscۛ.6 1]r)+AUȕN#gF++c 5R !1jXYV7BR%*+ uK(KCdSh_;EѠ( QgW?>lwR6d_F7unD^L*P@7 Rˆj,p\S9dPV^oF2WjYlTH*=wnhb-0F0jʈ0rGz.(e0 z:"v+9^*|_`$s9#aeF>\Ϲݹߕ^qҨB9fם;A}@ʫ#)a"_ع:D"':\"Z+THb0z܏~}܎0K">WȶF[ {7u WjPn!" r4MJFy sMzEv{3Ĥ &ﴐ󡺵\E/;$|ܮʔQf0lDis,qgDmל3bOѽ۩cڕԕQrn4@U`4k ܭ;ʨցSnjrڵ$" $L)3fH~OE_o=hB]Z 6(ga0Q@˩w\hk+&0]-Jo6UtfH4ФxФd@-.@D%'@@}$1"hIE0qyU~r[DU_o&=TۡP="1F_]H(Uh4 stѠj``k`f7]6kTtymN]@|N$OszU4쨉ρߜ^T@J!9&MSn_k#i_כ1L R菱MG@RyFl&덜{F0v@NkWrP]Gei7CMtmȵSCԈ`|*:$ۮg g?ޕRb16D*NTכK]CBM:h!;t,M#$P&=7C5L7Jf+ $L*ƇY}U,I.A ɕ Ƙ:ZZkA@Otz(MwC0Ej2zF3BlS50&w:BH#1 6tD-#$u ƛwGHd96h00n2_GK8l50TrFy䎉-_#I$̎N0ɀk53Wzӛ 9܁h}B{Yo:B%3kԠޛNv6]PQFR-Y{vV)z bKTYh`WFى@9YN\a`[Ƙ=$I8tAiR6WwèQ"1 vҫIRj3tsuF EUu5jXQjs'LW՜xId<&eԸ;ʨ~y 1\9I d^$iZq$3|;imRVs$4=2eт 5J F$̝0݂ j#Զ0;tںvsE--a:70}9F{)R&V”ل) (^])ye/Mw8$IQ:Bkꐼۯ;2L=w*B,5`#Pi`j]QڽuHtqc. `n ӹ}H *@i 6k 󪪓*l-Tcb\qJWS^Ot$$q-!>lwDcƳ,e_ pZ+-PH͠x u'>]P}m'A¶z Y(U?lTvH 6j0=q$!LW`:#Y:սƂZP,XgTSFuR^dlO!E P L+߆D~{$Wfl6q0Af=6]۽ۯ;FW$T_M:#ct;t p #v`Tue@1 YRʘkt]QyF-J[;0H{ԆȒ0]]jݵ/\Z핷pE،q+#$I.fkl8Nj%]n;۠*$$l50ĆKe;vtE2{j^p;00SF9 jmEˤ &s-6&Z[Eq:jA@%72_c,$TWA^mwo l6>NGIV- 5nLG,e75uaF_&u֛PFy2*`m퀤Z䌪0ZKn8Af4QzvLzgqR{2߲AOTlVDet<XǼlve:̺ VyAN/*KYz7]uDvտ gr D}P!WW5FZjVeTm4%- X ڝ[m2(EUØ8vlva:^N8vy'( ɯ#.I6L1тA"7gw^cRnqH{wĖ0ݲ=ওc!Eܟ/.0Mցl(L_.v~l4~m:^{tꨣev ;n23Hwx[%)uӅ (iQ> v@F9r$v'7sFҁA`$mms9&.KQ "*>UPt2^?}lva2\Nl;0V'ytb۸~{ ݉0z*z1. ="wԵ\7\ΨCMͷjFMEB{s!.Hk6 6Z PJQ,t5pƙVkeaƂYjRVOǸݽk<N_L&d2#nkTƼ.P}ub2L(rFT5svFl@@Dto*ukkZU2h2ʍ CkMu^WHJCQB{/|_[&+x<6I$̬[QE>\ww;O}s%T_Mjv/TUyd<kw-o\oJ hk2?8ʨM4*ecǥ=.5vm" 0zxG~@=ΦߟNo㫓dql)EuG^1ݎӺHHw.p"NvWQyUm}Oz6SV:2 ׹ K:049ڊ^%72j0_.stMua@'x|i4N&:duyN H~%>龲Yfl(B/uFp՝ep=8_c5e4u+W'tnkAcEzAFH!RSi04N]P[AH W>gh9h:Nm{znUwWG+Nx_J}i'E"UEdtțS=嶺MzuHjuF.ҮRjerF#$n[W Ǜ -MK42-tI_կ|g?1|_MƣF.tR#L>(/^O0Fz(trFFp h:ߛN]X9ctRSX0_ivw *Q;0fn'ZN\ ){M@ *T0O 'O(`p889Fi2j}붆j_ FF/zF ЅE(Kti`Dq_k00Is.bd7+dYVvc]%g4't fz W`atrW;pxa8^8ajΫuFF@֡$k6L2hf0]#{e=Ck`07J-Cu\gĨ6JECn7ﲥᚼPM^9Wj~FsFaP PdϘ`FWq+@Ofh4x<~eoop8facU>n>ca-d$n:>kϝ{-U˻)!, g(#Tt9'MW Va$ i]SF#$}q,]U,⦃#iT60Z:B@@@ @^|?9|g&w{{{2j ә}:Z׈v@0m(e2CpKzәPVk̇ظ=,tSN*,l/(uQN>rFsQs! W>s>qr38]h("1qT`7@"#$6qt pP-7ry{7 TUӢseUeԛ6S,ٝgH`D20]dai32/00*ЛBtë FFm6N^!I@0ae  ' "A&#ƥQqO9ixCTv tyiQ)L׶׶Ҝ3BO3lM#{u($MO@tS`j';y2CvFrD0P(zecǩ (ykwQjف-vKSn shڵ[k1aa$ QuFJL6!ȓ?|Oh]P7 F^]TatI}zfp* lb [i @\kZӭ8Bb?h:#^:\>=֠$j3- Uk;A 3Εџ ?YE(iiXm^[ԥӑج<-zӥv;,T5MRڐ3j n\b(unZ,PF܄:#kY GjI$a@smP"A6\/}O0zuꎹe#yE _ u?FaDsy.lca;0 00ݪn9$v@l)\V!&-ד:c*PغMWg$)U]t"Kf|W>dglp3LFIFuV-U~yÐJ0s^NI}z65 ]"PF<+H Ɯav@})Ԙ{:#qLҪRZgKŦ2Ǿ9wߢz挲  f2~`4nѲzMQs;p%6X4HyHF8.Xg0tYF]QF`d h10È+ e[;4 [ў3j<Y` 50PFm_c'7>;7_%兤%ya$76:@<{9!k750Tv7a:0ʑgҵ;07igh^XEtv}n`dZr`d0 (D'/MFFriiVD I휖[)%쵠|u 8#=^JH}q'L D)vSCKŞ+BFu`FM ݹ:NmAYHz)t%0:HuFX=g$B)@ET`_ Fpxy8N&PN"Ga>O]!%G  aG 0ɏ>wIցaH@ȶ j0JTq X>v\rcBqnѲv@+rFu-a:,ޓQe'j:t2~񏠾_~2}4^^EJ͘l^H@%Ij\ LŇadEtx2. }a<}80ڛN22-g\~~reU_SEm7FZTL<*n\$0J1M:RA dQjyFeTmΙV;.\lLn%\4BX-]oFO"zFnws10JD3~lTpAVPUDѪ0B5|-  V0e`؛5h0m*7(!BA E\A2a5BvtXQqە{ɢtuAl0H!Go2^Ǘt:hS"N2(@?`"`f7__cbq֚ Me eJj~$MWHGZFcǎ=G{Ŕ'Ҍ(Q6KU PCotE8IkHYdiE0IFj{V,zu>aʹJE #2&_M'+i1)QFQD"8LDF)e,pX)er( }-v6~03c1ZkNr`% E7&dIﲻa@Zs7z)!k b#P)ej`Èm \\)5Jm5tL0Ր4¨!qsXgؽ0A`;@.c?2={F3Tv70T"U!9j`_{(X֣ 9DD3s*"1&Z'iZkq2l6o .SE-mOWz 90W?FHK7]Bǎh}3j^trI^geA,20,Qcz[X Ew0)bV,$~ Re'dczU܃xvl"A;ζR1I'& :|۠#ZI) mS)>9XDƘY$I$4d2I',ӲaSao⛫zCͧ^Lt36AWB}ANw*K #^E(9`}ۤe0j溫mr:R!7Lx{Ed%}c|W4mvDO &3DJHI@Hen^ @@+^)(&H̊mxRw=Ӆ,KMi[,Z7YD0ٽ>G;c"뗇v,f"2ylzرc8'qφaq:Ԫv_#rg =a>u?v|Cͧ^a3 kp. 5$7#^Z[ tqYehQk&ݢ gUk F AXt[~}w@˷RHJeAMUJ DlHQ3')k*@L*0 D D-w .vW2ƞJ' ({h.=eX0ٸ"݋3K&xW7^zwy'_k^`0fx<Fif:%`0ޜ#JP?i`h{kkte0ayF :Ԭ@ɭKvWށAPѫ̇⚇THh]W`r$7NOE Z Ā['P! * a6 !K=ETqca7w 3xo2De/d™b."@2xwId*{ WM eU8;*BK,mcA`ð%۷C+W9YnQ !AԀ R0).S`RH4ð  M BR ;1kzgy*zGOK~o}(t:+Znz߿1 t:KĵntWWHDQQF.zޓ(& R,FPֵAa$Ғ3jvsu/ZiWAKΨk >Wk0j/Fa:jUVհTx1i@*@@n)@u`)T0, SlJ@bL OEYI[1FP!U1@U@ԫ\~gSnskZYHW?9.RA!Y=~_Q)raB*B͜ ) @7kNRYʖOLGhc*BHS`2 6zQt?GF/.sNע(v/zl&t4|L,3k uZ`TC9#mj^vai^eYص) #F9zUy<4׾C!+dXgONךlUkq ʺ-U EE6L1*+PkjxMdQ@4]Y%{e[nkSR h@}EI2B9[䪑jƎWMAh%L' vϙ );F9ڟr$lb0" rG^`^wY#ʮCSfEaYWK/V!7yU0@HYX@7!Kwk#HdPJ``<3$@?zxMl_vۗgW^4M_f'ɵp8FhLS|P(yS-Aadt͓ͭ~L{ugOշ~`6:  vR hQ}{Th4~wGH5ut ;v8vw{į??wc]O*c$gDM'K`dPtݸv@7ec[a$K6bkχE0%MuءO4@8+O"۳ rf.Ldq?l픇퇑C@ ":D*hF؛j(N1K5^i\:N_LBJJa^ `AbGeg/-1P 8h0zFw{{{ckk`0?t;NF:jU4RΤWiPF{N`/40o V،ũp/)4__#.5*Ņ(Ό6ʺzY}o-(lv3VZtmOՖ"A($Yh @!Rv Qd'~?{F}ROD]TJDCL&y%U}w%n-_mmmuǎ;1 z/~2E_]L`tTyF@*akt90XȂt| 7]hY ,V/7X z-Jdhfı:)#TtwrwQLYO.z0]6iֆ)S-T%HlY6fF F` "/؝ 4ո81ܽǣO "(T" %POwpURxa[Ǐ6770zѯ?w|a;3LLM6ϨK;R9ЌnLo-댤\qnu56&xF0et`dϞxf0&E#, eʨGy!VJn-ReG1A56-.aj_{vycd@`oBiv~D#9~˿Y(3zbii߯CiaCZT*zvݷ3?q|c@ ȭݎrS!k;\\e䎐{ >Ϩ2quIN=\sX0eFԵ{ʈY0T\@Z,M\ TzF}Rt9/ʥ5 F9.\~ PYS䢹'[bU6 #uH0*Cx@€! 1(LS)NR5zNY%1&jPrs~?rA `ԅAaaF~;~ן'S{#f 6 |QhEԆ 0:ڍ9kw #v`Z rFKtMv9`$+khfUQe4.WaNa:*Cd ~YWjȎ _E5* EbcH`$mŠ:ש_,QzgE a%f] I ._BEck/؛|X1F%T9d6$H #/677Nэw[u⯮Ā93/-"K(ga:il:v܆sF :0Ha o40Feҭ, F) { o]y"*.QFll3c?e풭!9RUFs! % i?`Q#YErm9vCvBAn$BJ%J, N"x#0,0 m[(0dq]^-@k`1Z1FfYuRSIRn*Ẽh{{ogz#7Ogѷm٥^1Xgvz1t!ōpI,UuK`ĵ-0FSo~T>V3f30~6#)=(2[ʶ5Y+8QZ<,Ɖ,ؤ! 8WeRObն:Q+dQɥH zB* ז o_LJ# @` hgҀ('v@`YW^L95Ƥi4MNm%msH71T4hsssk0t:O~W?G߶gWcna С|Q^yG) b@h`4鵩7݁6$nhz0Zmhh ILe$2*4)8F"k HDP;!<pq^Q<tꁇ̿~8^$hf@,gl[`خq[hyW;^-zm7t`(rG >rFE6$6&eEa:iw {6[ݭ-%ɘN¹E-Z'O' D!5;p,HinhURkѪ5Os@rp2#T$DU@/;OduKB`/Ln0@'dĩmF*S^ &^=)һ{N 8sٿL)\s-RGs0 ÍhsssvEQ~cU/)Rcc@t$LP\Jq ES۝pFZ[5U䴅l t7VK0;G9AjO 2O&y,ZYV00M-WFKtA9y^]7{BUxW\vU ;#Kh>Uv@]`R2dpO{]nW:~:L0 UIm# rI~t:<{flzv e'^u{U X. %NxźO9eFF3vab`u`7D3jtR8r']ng![N/{V|F 1G[Yaڧa?n`@RG <7O*BRDy3D,tW<6c *N=6xż]v;`$,c3rZsdTRZ&v`cc3 ~dӹw'wN5ޘ1 ۑMx.uCF *90+#Fn #Aza1x0>a$ueM'qRs9IdLvuOy$30 jȺ׹=Q+NL>Ŷ&)_|m:0`0:hJks^\TaZ0{4h+Χí­8;$˜)ZzuF K` RYE9=j^0] #rQc&_BJA2CB"}^N3$GN%k rC<5^w,Saj6YGۀRkDڎk8`sN[ FhYap"$j?'NҖۺeDnR%< 8?#vq*#w,R,t&iLOaeބ0 0j5eQ9~TfKPgTvYBR."YzR6y*R :fq lQ=GQt^tZ *ZTR=-Hja0 Nzn{霾ɷ0f3AJy:lLY")ԈM-:0*:wVjZy>sFa$8FyJtf)FM.2R5/H0K^9WJ.g҃۵[P-tsF[3Z#ZM tE/JkR^&ɁS(.VYy3`;h(}^;nw6NJK!6TthPJ~v[Q ? oiWe9zK&D:)6$h\4HBoaT/l=\-;|q1ڋ+9VFT_|#ݤ+45E 'U}nLCXB͇+jD- Z4T:纪;n:<͇yn!<܋&X :A w0=γQzW;8SQ] D:z`zұ0 ONz`9vs_+vS2_ǤX&t,6hѦt;a$"R̦邐t5K[4 Se$uB ZTʻ98)t%vRn< 7Mw`2`T5x~vvM#a:T!T 9 q&p> < D!w{S/Nw( 1e3Q)A*v;nEѱ0 O?C, B^Nn'g$mʎ*oí#$ɒt0sFFZ3{qCmэH?ڗcadmJGѸUFe^FQe$tX&W#rj+N5L;8'QwW\mʼt{ ZA)bҩ7/FQvnw<ݯڨu55(FQ 0w&*M TtWcQ;_ p:N0LbPΫ_)DQafl>i EQtAtR'~tҬwnf{4#+"whDj{qTRuOWÝgEaat`tFEWv.; -fvFٗC)P1,Fu=&-QJ~( 1fQخ[`$ hMa&{{6"\0;sV`SZ`D'z'bUzxg@2,h=ݿ{At Re/]uTR*TJuR]T{P ~N@qeE͛BnPٸk} dIOz] FIV_&aataTNA-h=*w u}.$N#A ða^KR e*Z5A@aV!uR=u՘j#Jo4w}1| umX`$vTQF2F[F !F"yy1qH( PI0vEeT. >bR:JMbmyBZ!ئJ`sNI;s^ЦZ#ε,#kUd b){y iΧ:} .0Q03ltTGu(" ЇnNR ($sf,d"4 &U-{Oyr{`$-hF֍oQap0v,,aat`4w Civ(rF-0l,Q1>‡؄EJQH)̻_b: ) dݷȂ7p;oUcєVwnr YH6BX`@f7GRyݒko~;xj @+AԱ(TJ妆E) E_R ( [ Fs8a;jvHhsjuF @W(6Mgay`$FHn>0BmUˁ xi%ϱnzωF)+]k(R@"@@~kS4 #^x2[/~kSFGFdb:FFwy œ @@Dm=־k9("R:ɋYZNR=8paJ?l;xyݑ0{ֱ7 FHvJ(Ts {>Cu)ȾDDJHeѢj]/ޤ[rFJh7цѼ!SwFFw?4I 0|SVv *kV#De ###@eT|xTr&82L`뎔\pUt::.t'_SkJ E4wVhQӻ` śQItèM (|kHߘ388ͮMl61z2(u}: q$t:L&tz1NT 3lz% !>6#}rFdMhr0fQn` xC/[v$d2Nө=2 Ặ3ֱ0v]S1ƪx<6Nߐo볽k8Fr0ᩔHs+ babpрQ@EPt#b Ӌ_f5Ց-ZCZKetBvX!7l$Is4L.M6\8݅)feҸpzFY0r9Ɍ(E1hHG]Ds?rOKq>N/l6Zk#pa#︿|?Nd2f5L2zbm@\}.|R2Tt:A0 rTօ'P*Z&g!5Mz]r6HqZ`$-H0Hb####dR!T'ogx)~i#oF%4MS4a]*~OA 4Md2QJJRyΩ/wo}?M(Q%ZvEmVF+3OTi{îLc6FFFG F$%(Pʟ+go|~<2L.Ft:M$v muny'58R(वDCR*"h'?_}O<91 6B`0DgfR1kgtFH,QkL':¨^#t:Y:cwG?r/˓htu:8λ2#Cu0Y P$W 4MHH)σ͗N|? 0PIFH `<000:20E  FDف{?詿gWx7L+vu\z]{ @)5Akf3RJ }& NAo1Ba5c^{5<0r-cCT* \򢀔He-ȆA)P@aH̅uey>4&Uhl{%[GCQRH]5T')J45ƈ1F1g;? @Qбsʂ(00)c2N=*Q̓3:5R5YUq9J2N7UY=Ԣj p:l- G/S~a: O7m@V} H|\w8>?N/N+D{tiRY!\jɛnJoQ咈3#MS9%c cởя?5S*%Z`>FFk#gb=1LWc50T[dEBxE K+Z+`G7&5Q>0Bζ >0Dڻ=FA)(D֜ͷ!d Y=nS(DTq/Ya0gccEIl\dY/ǧ H1N^EQV%#Em@N^{r})0R ^E| d[e0ʺ#n7lPtRQNfǃ,Ǔa~og9Fwr$Glvu:Lӽt:fS-odV-MQ-[ٛ؎quO"3ɣ $ %g{i?0zrG 0ZgeD=:d2ESI셽Ȋ'(b4l7l^^ N /QXq= (d?3\);de=J@dYg5qo索|sZQ6pJ8@De!D ϩ`Rz,&dC%}ldϽi2*U  P^J"$E/A%W[{8y쾗48wfٮ9>xq"nzYGbwUAT2Ih4ϘG޵nʘʤم0e#FF9B]EYB,]B{rP2\&2T%b~L*T8v"wa;Y2ha) 6 !S~XuP98s8$B({\LsXҭ樽\2EG> %e umdaO E* !zp Rdz w U*"d{xqyzo8&I^8dzl֩:[;w~#H ,TԂiˠCI$h4fo*~v_臱luB*;;pP^ FqlOZH!F! jFHii0:E؝?{+cfINiN1 3k 8iᕯ90kf6:$W@,"^>H2lD-WOJ2n3lgllxAR5p7uFGFŤ{3?}\""fNgp6ksiPW-kEP.FDB-X4,od*Zvn̙|nT/lC~،OojQı0:0"lDtwozo|}&I2N$Q,*piӢEmPZL&ٻ=#£Jڡ?y{3<~"j0ڶ00vfƓ$8v ?})_e׋+a"JHq [ڒe CE*kFsQUGGHo8?y πY8bxata,QYଓkׯMqd_]yn:u&"I:wsMiaXAt6}]?RZΓЛFwnVqߵ+% %{6TU-el1xKF>LGa:W5 mlyFק8QWvl+48 JHe KTҪpZF }: JzK$~=ttim(x@|c0-PM9c~H`4L*oPҎZҳLkeE(7p:۠ĵwUJ;Dw%Nՠ?y>`|& AЍ Hf:31(HPQFp8F3C7N vwgv??y=۲uLDfYj*WBWF%J[ByV щu;̻q(~NlJs?;?yCٔPQ`<1fat[Q#$y꤄wlCyDϾn3G'~J()R"2RZ%^ ߭ X%4W|?qxGiPBׅ9!<`A7ۛ)3>|f}F;,8ataDnn_fw[M=IB*`$ fь'';f %t:5-Pbjڇ'tu%DŽ UE>!wQ سJ05\dW^NGy(8|`t6) lgKUF-ǠPU.q201D"7'v5az 9 .=Ou66/}KRz:4Mo$|zT^eUw0':=P-aj _>-uUPd006BsU zerF6ZBL6|9]oWrJDd&Ny,n%RǯRHQKX1RUDo#Rv!`#K* 21˖:~_6RP̴0U`ԇIv*FL A'?zi\(Lad$q`hgeL9iN)Ul;O5O=cQ>fَpl"&T=yWPz/2cӲn| FT vRlsgпPL1rEf>w`q5@nn@ZXU!vsWc%VqIPG^3DxvhKmqCQku>cQ7.l-TKYn0;f0dX;Y=~[Bg1kjVq}yz ?NtsQ#wSte,'Z~gxIٱ-u^ ^5Dy0:2j5d̳gG,[(,|G5ZGVqkgJo 5#;@ x&0PYsV1ㄎ.WJ97CNRJey1i%:B9^|@EjKEg@@̼Hf.MCV^]aVo3drK*+tW8f0+׵`qv>|,!2Z wu[N _|jwm_%EVu/8VL˒JFDKNnPT[Ah$"IMKz߽q^~%GJp4+WIkzțj {EE59vj[jpb Ξ +|O&ex<܊U f* Ʊ΃0I]~ƽ=taN-Pz>{(7Yu\9:#]8Yi(xv$ A1B=߼cQm#$j A3((T%R,^o!C AlX@W΄{uQ}D_Q0`N@Pǩq=}V~_;33=c8}lr|: $Ff9\Z2C`^*ӎbmڧ"2Cp^P7&sVTѼ JTŏR✰}YPyYʁS{.p(Jxn6:!`AaЋRΈ&I m vvۛSwދx7d`"xNIk{ C;'>L) ![ Q\*TFv>T 1e\=1S̅QVF5d2E"]eϱ5LJRHg0l:N+N=v-" 3֚qZ;'k#}|~ կjSF;Pz J@hè1c,|Z$ \r+FV1N(nH/\" HL`ۜaP@0Zco}by鞿N2v>õ|ҲYݚ kw٭2v(8ܘ@?zv$آ{A"a,Z~6|W6A͡$AT Q(F(ΔTqODrz-m1d;5 4D(EB'"h+$)Lbo8F['C.s̩ΖIӔY7lT.6oɯscRZwo-fɊ\+܏gGlT/Nèv%7pꇊP^TMn]cH6<9]hD6>A`7Va9PQ fsyed=߮Ӑg3fN45P745buZCM Ho!vbnZ!/Aꟁ̔uMMR&voTwUR 92ΆU<E"s›{-P"DB7Rƙ!d}@4N zǟDk=K1y>I3aQ> ^%KNilBt()h[;2$wܯF2k$7:)@9 Ȇʭ].;!zS Ja(LRޓiAxhK_z&wZBIl>IZBt;nBB"@Z FPz-#èkP<3 ) &d;P"Hq*8 jm<*(dZq-E|OK:|mIL8N45t7lGBw~=Ϫ$T!9y8?EWk{BwafpD2M#5);'7+_fUFsx#Q3#if5Ux )dGر kFFZYR\ww;:.t)] o |//wt&v^ {[~ڕ)3L YJJm 3b ??~`?ygYyY:u'VR*1vau.ɒeM_Kt5"UowNyJMǴQ@DCD|έǵXWJڗ X KG'Lpϵ"a)FXMx6х?o?}6,I423궖^J:u fᆴ[tUl F+K*.(<(ش¢$0BgןϹvmڒS6'[{J*ڒ^SlUpcIXQ if}xȘ'pokkk$Ii᭤Hso"VikDK Y'$dfzNo#羻\#~Z-ѡ2Cm>SlG">QVqe) /HWR+Maڛi$E @b%tcLmˎ L֥"T'|ļ;Wu 7cR/ FA=QuЁ)q{/؇oWD/kE޺~lm 離 uv;a4D(Krv\`G" sYE4M1Jq_V5IPCOs-k,DqL{ǸE{06^4njAs =>aPc)APA=fS^:;oQ0j~^ P[ƒ=_ `0F|>/1+6v.e nq#8^U3N5P(P 5Ua-q!OXZ:Ƕ*5+j&ګmGsW-R3ѣkAvE0 <ϗ]v iuC\v-׾ \VPY 'fXJKia'}YJN` a}meM-ibcv8C #m7X pU FgR@*z\\e=sۃ`aFǺduT BjMWOVd?O`_K˻S`BP&kj[ 0H9r n.rU֓mFSpseo%,#]x|jv paVƘv>]o& NL[H!osQM@ -MSM/(4\5p 08T>tIz޴ \u".BXAaTAFa@+!ֶRjG)0#vPf ɶURO)p>b݃L j+ =d"p:j@uhSRho [#uqNATGgY]:+FA 0 |`pmRA¾:PZ|]k(o)}hyWm[ZgFg;k~T;jߡnZnz!c2LH80QRK$:ex o/ykMYN k.crx:ބAiuwdzK3b:dj T>.{] @RҐ"" RZu.Bb-ýHB zTտoSq67/D JI/kj ιPr^V\׮|IaSPD(J<Dim`0S@el@{%=0v[( ߮/TGwpM0ZxJe01!i[HX i[Gn +yH=^4ۃT!fDPw@5 "W󎱔)0N{OW^Zz P ("RpT`g]wtt* s1K@WE .QZuY?+&6yE_X .. Ƒe7DP9ȷ6窛,hcRze)5rU܀QMF8-9 h@|_#넍ha*8X'|;?9}oawhB@IPa[( NFUGv:Bb-fH]/MS|VZ*.A _s0BQu8^XF ?f-a XfZ4F=X!@ j~nU$Bf} _s`w W@*9-F#8m(X) KdRf6ZH[Gܙ@-@ӊ 단c#\[ ]3 Jw'4 52l^ +0:M'aR dZk|}ѫQ~B\v)8P2IQ[YxBe|Ť.0zi0ST'l|GvjeEEQ.YD^I5A\$վ{`,#Vطm|(.oj.ٙҾiC5{Jo$,t!ƘiQqYYUZHbR&[tpUY9~ {#3Q ƛ#~0$Ӭ` P? EZx B:$T8e[\nی~H܀ `hO\UWooW}ЄK0t`Te5]j ʹu \ä,y<[GGYHS})@z ,7tD6?(;4 X}%gBF'7*ݿ;[^yy#NznKBI]?'YڸU=ϳֺr)2fzf)}7A;\vQwֺVe_ӣ@2N;'-YK4ɲXN,#Vو< J`k:RTmZ>tQpxBpY_FM q̔qYM,Z P#בYIw/WjTEY~Nw sͽ{;غG`Ӹ#N%u'>sO]mk"R+QvFS3[W}QUXcKn`|Օ}b 6;J5YFap&bLq qm< A_iiEQ@?4^y͆ͬJ:P5>nnOB`;S օtP 'W/E<ʲl/MYX^qS` jyZT}GA*hl-hy2V 20Wg![,{$^$δ`d;\v2^Ҡ,*pGj=B:[Pvxt*:&/Fx 00E@vpY?HiGXG6mwdN>sm&x:kP=`iR7VMlk #\v(g( N{$&Iء:P&110*Qn`}{q?*{2Zh!IR- tLj1S>P->S枱;4栩gPC]h s#\{7.n:q?x[,)߈9(#} ~慨ݲD؜]>->B׆FFW@aJ 0]UM( ?I&q|6UQVeQud!zWU7RTgԮP8K|:=Ў]r[*r0m)Eah ໿?|w\q|w6=f$IҢ(ֵ `4.Tc+ Ec,P#ճ:P>'ڛ{w5([9F_`gq6ol/(nB'K7!#, ]} y0ĭT9vn H?%xKД~O{Q(a=8=qt|?o.n~;Ͽih^EVee%WԂwDbnB20oG@W@ P;*#*X7aYP?ރo]j>5M'UTo/ fu <g]UɛZQqm缉 3ݡ5b f[GV[G-PO@k79~uu{W"I[l6{48˲,Uua;%P$a߽Ȳ!V}tecUV\Z6JDm1jIc 5BZV਒w#t:rOP~OxBlvg:>Nq= edV}ZiIa]M*rJq(q Je,;f6EԖo_A>kç#gpu S{#1?z{q5NfGt?Iy1X"N~4%60)ؘh`TQIh,C -3[kmyuU>>}>wit U[P0/ӡWψO(ՅC> O> |l67OR"Q׾Qbe﨏 HwTUig Ҧ@C³,WZ֖|{ld{~·l dkj0ľ|aF|3Z;1A*\{{~xE}9wfكld>O[+PZg:: k9 `7ص2'h3thoryYcLi-Șo7OK|0R }AVQ{Qj'sZA"WP7Ƿ\$q|w>?f}Qڽl#8A sHmŶRBD`D,A e)Փ1&:dʲ,1Ș;|e?pϽZ40Ey) D5`D9nzUBwgtQ.0/pY=_Wn|^/deY.GӕkXEIWؾ+ҍkyOoLj XjҾ.jv;]RaAEhu~<_o3)~D4ƻLѴfہ%˨} 4cgK [},$Ƀ|x>?xiREXj*v  DP: Hǂ) x<:7.F:э=.?$lRg) ӵu`Wj-<@{6-0X!>@Usw^)˲i>LI8>xeYJ/:*DH"Ht20UJ p0 x<Ohta8^ W 5|Qs/@5ivIDƀm"M#cD P0%`kAva߂yo ,s]9GY=JI8Od^.epBbH"RkL+ᤔ : (h4:7KQ] p̃+3}y/|`PL6%;kyW*ڬh(M.5l߁})ӿ@k炽5oxe,˞iAIݮ؏wVݮ.Euw<꒯츿|Uc8H$@^, s Ryu.嚯Ghݨ:D$CQ.-?VWah{ DgM-z?0{P^^[]Awu8 _J7{xH$ D"H$ D"H$D"I$D$H$H"H$ D"H$@D"I$D"H$H"H$ D"H$@D"H$D"H$D$H$ D"H$ D"H$D"I$D$H$H"H$hb7IENDB`desmume-0.9.9/src/cocoa/images/Icon_DoubleSpeed_420x420.png0000644000175000017500000011647712140261562023735 0ustar guillaumeguillaumePNG  IHDR~LQ5 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FjIDATxidU;"ΐsTCVYIB`/$  kĨ mCcvv_7n c XB4Jjsb[|3ds"rSɓD|{Z]"BP(' /BP( BPBR( BP(JH BPBR( B IP(JH BP(!) B IP( %$BP(!) BP( %$BP( BP( BP( BPBR( BP(JH BPBR( B IP(JH BP(!) B IP( %$BP(!) BP( %$BP( BP( BP(JH BPBR( B IP(JH BP(!) B IP( %$BP(!) BP( %$BP( BP( BP( BPBR( BP(JH BPBR( B IP(JH BP(!) B IP( %$BP(!) BP( %$BP( BP( BP( BPBR( BP(JH BP(!) ח }*諪8YY=Cw0DWB:`FqpgGX?;I(4,d]̊FsX@n5c}An"9/7uvܬ~{U-73ywLq[b5Ȉy:K=7 %;PwdtL?s"s8inйpu:AVx,HTr9\ ~gܹs677)ht*Ʉ9Ls~Fty?s]wݕmnn@QL&v<lAAĤe=":w\t9s enoo?oK"j^b(>3766:,6Xk˲,Fi&TNAٷĶmoo777veYKD,bssSf⋶yýς{Ŋ9+!)W#p:V:s~Gb:<Z;zW _kE-4ǭ-jZVoz8W~n,ˆyʲ2_s2h9eF)=,(M~m@5o`!jeNN+Wn߼N틯zի6/]t:Mk<4vMK8RܖK̙t:-cvݾx{k_f};p 6._7IS9?{  fIJHGR'"CDmc9"z쫿>~_ߖk766ںt˗/ 8JJp(b?wjZYƘKnsku_[:7lnnܹsg.\q…2wnV8=O 25K@y.h.&g .3v|ƍb:ryeAeϵ gƟxW'8{=:~^Lζv("PK-߭i0 ̎87""6rk@N[~?ZޖG=3gkvwwt 74jygȌ19 a=/njZ{vŜ3BRZ!߮1QȎD$lN3 ^w|HvS-(,zdV=;̜1sKD:]9{~g-xn.2d5z?scVb* #NqGqQB:ۮI/!SjA$;ܛl|'-DH)1ژ)u@J&BIi%/3]j?!StrZ{^o*]ReqfV K" [!G I?MeZ˙!Y D 9slD䆈z^ tքVRKGN,3 - H"wO}3~RKfcc#>QRR:&fAJOe$P~3"BDNad` <[gΜ11 {^QmI%'%̪0@"`e(-_y3ƯA^yD$y "`P6GIi% ~ȽER (#'6")!`I)hO- &yz;0L)x}iY;jS<H a@ ;'~WތS+/s> l1HItb"7܏";%%CJ&J sTas>Z5o7oƗaItjK.tОf A 'Wcv$)3Xo'+?&k/" é -AxV%%$E3GPi` UEKH0avW v:$SRRZhc|Z'FR'Ka `m\|ݿ ~yPm`8j*%3:H&(!_٥J"uk &`Hk⿗ʓBefȆ/dL)2`}!5o>_Q_#<]fAgFITH>&ro `h2rP &-r# R[5ɣ~X %ɨSbJzMF$6 Z 0X|k|ݿ#JxڿΠj$IE x ]f68D!hS!,o{7?V_ʑ~g&Jp﵀@#A۸ =AY2^wͧO~\3"D.(>OJHhnIu_DJ@$4 LD w} )@Iie!"f 8L"ȈEdܹ $X;^ WބF Ř^ൡsHin_ 8/Dn 3y^M &xFz뻾̄))efI{.&d2"2r0+[OWބ;%աTM'* ujP 3Ƌ4[J>nKqʼneIXqsJSa#=}Q4SZ_.0G7-dIYZE@$_zڿk/@3#+_sejTD IqJ/Aĵc-9(+3dqMy{_R AIiܙ*7@ [(#1ĸlwuw>p5() OF cjIqR 2pW;B"o)2B7cqӀ~G3CHJJ+{q- $s+"Έ?Gdbm@2qox`wgJJA@[v5m ,I &n>_2s>Q '#a@~gy/HIԞEL4#UwP+Uc"H 9n`*oz/S3U07j(%$B/ct*RNׂS GJo}()!%F|@J\||F2D,Pŷ>֓';5ڋJJ 3aSlRBR23RZY=ɆL1xÖgޫ/))ٙ)ʼ"ĞXx68!ڧz%8^z ae2|_㗕Nuzd.=$o!g)I}ci"^iTRZR̯ oÙaq%<fg1*wm?3e)[ϾwNIrљ8%$ŭ ]M!?y [`5T)G,-z{|~#%ȅ̎DH朚 %` -ﻲe͔N%8 ' )AY8qm.!B`MNhRPuߕ(cGB ֝0J!^ ,E!x{gN?N#Ih"ye]e+*VG,!piN-(6Pn{e()|&) ƥ TJKƝȨ[ˋϮ;`ttbD$¤4JH%F!CqDd\,ZN|>9Yx. q=%%UˌŽPPؠ5-2J ^B<@$N1 Tp+[_UR:M7_Y?"HJH?3 P+Xa~_5gI@|/[{E? ?rTMEd%.M2$2h ii)2wekJJ+KVW(qUCR,#Tf̂B+_{"EK]+xMs%"͔VU2s檇4aA9gȭ5aKfR'@nVF4@a݉ŕ+W3dI:Y8*8 7}:%4&NP PJ rK~BcZp-txMۀJJ fo  VP gA׹eƯuCF)I7f "„]oJJ'oT'7Z? )O##_;GJu'3LTL؄`PiJJ+yӮfSD0eAZpunCx'#lYp¸%ޭ/]WR:A)P5!NfB /j`AuXGɝ40fZw;Ҋ3SyHjL3AĚ 2xX];#lZ¹ps[/fJ?fTi>3~[LحD h1͌U+~ʓfJ9PXRE %!9)/<-=R0Ofs|G % `73W#U+KH; [GVFf];;oF Rݷ 9R `ʘ pcPկw륟wn[_b^B1:X*8{1"gKHvUF\/$I<2ORG3* gFRs2( <BN vh7Ywry" %ƍ3aWW?fJndC^*)!#I I#)Jvi8[QdaI}}H-ၶóJJ+PCdg#eE tȋa@ (~TֽYvTBlq'!p{^L6G~TY}JH'!UN  2fR!_7]J>yP{R"t`Yp8 ?()K6 g!$޶a) r. K|hd`)(]z|t2`[#ݍ ᆳ_RR: IдJJ}H64}XqFbȑ3`(=ڒݍ5!V0%7l7,r{^NIN $z:K/"dν9?6K0̚2 7& xTޭWj,u#%Ϥ%É3B@HjO.2K.QP2}8aOape?7NqVMR`φYp32Zҏs9VV3C2!-  0KWwq n.7A' ׆(N7/ r|Scq:" aÛ%pO@BOIIt3%%} p39ɍ%dnޙȐțC2:dxIp.'MV.]{k'N͔wcE} \%$2e +e8&l*y@b4K^|)&P~[e@OnutҨp"NeEڟ 2OGaK?w(6%q l2:>K[s"V0&9.]gƏÝ %[0H ZޑI~ ɊE}/F_0p=0߼]*Ysr {øMῄaxUĻ^#͔N˅-X5q{ ï<9Ŝl(~dp,BlGI>M?O'w'O7@`2x/޳}?tKDjJZ IlfRjMiK(!uxT٤Sr $*|uX2.ꮖNfGZM/\dX{䬨ĺl8󯺐$Gy“x"U91p&ޔa!1N%.ޭOÝt1BBArH9*xXvMUvT5ïSғFYϐ%isMJ%p݉`6q{l$lK~U YO+Iy8B#aw(٢Bp=[w6>ρ/))E止PBRJ݅54fҏ$0^HXUB{HU4wK-Z S2  ^20o񙒒9g9m+00%v7{^)-ܐ09՝TRnOrKa N,Px_zo;/nn0WPMܠE^-9Kv.IdYE[mYRÌ5 ht'ŵ\Ŝoy. :A%$>ݑ(Uo@{u֕~ȎFTZl (JZJxr˸6+[G;s/ Qps1%H"2'ُ K$>N[#$SMmW7qLX277w?._SRmF\/^XXۇ=% A8UgrnD*q*3d&3nʼn:.c1!W&.ܳ{?tz1M&LI6}~d'4SMԇ{= =q'32𰅶 ( - _ƛ3{O\$o~՞+)ݮL5&Ȼ7H~M byeWCXUQlDQ ?9yFvŒk.ܳ?t(Fٚ{i!)CHE <U? (a_Oۋ .J|廐 4IY0dvC AYRJJؿ*02ZXQXƄ ]b5"{)&9aZ玼FA1%c)޽5M[vL}qAXMW*R SIV8O7?ƛ.'sv7!Y( Wł \{Jw^))? n l$HKw2SeJS[m!\#WN] q;ٕ}6;u!;s~s~.=?^VRڿhW}[C!)Hih\ϨvY3zcz]Im׆@Л 8;6 ٩)ܜRo86?ΫC:~HI`RJq ֑;ȼx?C0l>wdؓ?G~4/3GƓP{F}$b8˯xƓW0XȠ7)! LS`_3Z$^MVPT:B +0왈s4Ji'2!SUz&TB8"%.1K\3ϔ %0 "BWsw\+)-'7.HXeFGxpsBR2] '%c"X9AKH_tr&Ӊ^w xK?*)K^|I.:XZla/b,e&ɩZzF }䉆N @?/[IE" (>%oa-0.YnЛ0uuD@1%[FF.[FNeee8JTj lX F%2f7ɛVjt5d!AolQcr6߹RM}%$r#yYWf*PrGWpl] 07Sb}|/ӈqu"8yu$LVaYNBER)e_+fPU/{ۉ/pT`<)/l0pC;w*qzOtxW !%7E'D@.)Sk xy[v.}Δ%낹3bY﹅jT+6gTeZ}B́jsIa8{NWfII)y`"g[GzJJJ7U`Pnч4 >/ `4KXkGsd31nֻΌJ%/llb+JLcȹ~q;(Άθv&(!)n%C(ŬIAdfIR<䩌&R1AfbYeZHɠm|Xo^$rqL'DI;+\JT͖w'(z9,x\R\Pɹ٥WN̊rٟ)#8$I6ך_[KKr6}߹;|'֋D?HFFKvDBn`#*?}lRﺔ UVTÍ_h2%% .Mזqs-9GqTYk%[e&'# PN %ʩˆHAh1Il YŝA&6.u72UgQ<)Z!tX`O8wqw.}̔<XEj!)EHHl5e:YkPf$3d?XXZY<2c@L朁, $c0Ё2\;w^1Q p[Q(3r%^hPb8 ^XT@Xf`&Rdp_K;!Eߐ%cmFJ[1  "1]_ܹtbf'RBRJtC,~mKP+U#:fJ1IWS$UAֱ/6׫sU %4 $ya/` cv M:ґ Yd!epΊb4,15U^pv+e$80 .0 Xq:tEroͳf"͐L, ۾-/\DJu?7w b)Lb)N(%*u[-TzK6rYpeII.X5H \'N 5C3|^`2X l{S3Y;Nn˕e 4VPH#3J ʂgӲ.K:GOh gS&`m;KƋ#LʫHW3@uG^,-8wa_ܹw)sx唸*!)2J@2JzM!IϨR/S!'wHETO {n)0@DYIU/q!v @?,2#~k%%WkR/p"~{qd#lP` 9{R gѥdc` n]˟=)1`Fws(G(!)PzaTs妀kyьThbah1OPh&k¶Μd#-KܜyG#N.m oz i2/[GBd l-qqJ0N1NռȂ3~Vfe]eЁ?t#P*K8Y_l|K@[pw`q Ja1n:|/\ĚgJ+ĖcMuJH'v/ejoyO]R'sh|X{yE3 h ȊTˆ`j*^T$J^FvI—B'! ,#aoTL@~W,|%}[d+5dT3g 7DhCAQt`/!wdչ%>'nJX:K?bH, OJ2KroQbYTcy63JQǛz/[&K%AS:©:9 %zS`:*ˀ?ޤIA84C Iqe;a01X3&e-5֦K+ \B_1Q}pe KѤR0~Jv`֡ grΛ攔RY2)FߔoĻ>PECEBU3x"j}&BO)3@zR&p¶@Fo qF-|8|m)ssv)Kƴ;v_sקL@ ^ ):XZ fnN!A3!aŗ\(ٕdث|;7yˋҡB.[rO1ggg[xWm%%`hi<%xI{$Qt1ojV*alTsT? نQEJ.oe P ӉnΜ~gֈ$fI9Y Iq]_1+`}hQ\0w"tFԖd3dK7Jk {b VHDUI$UZh[-fj")cȀW-")љ{)6 L*.6!@J7>R\ϹD_.V_ا&#?`M2mܕ%0Mno;;Z'R"JB'J!)!Q}i5Dfb+$;XՀ*3 CR+'>s)~jb߭BmVZ|oT\';liRVOFeB@U)͆BO ݋~O} #cR%aE!xp7uio\wݝWCObL创~@閊Y5 c+h؇!,pC@6n@RKuB)ž$3"reU;ۡb:t;emgWKMJ 5ݔDFQIЌchq{X?kdbͶ&Hde]5oF^[֐3#=3\~O+MJT4VUB:)Rzf$sݵ8"2dI (21,AYLGPR.nr!lC|jwT8; ypwHFT/\ 0(_!?S&9OP8%e:!0ٰ+ГBDKK\‰܌\)<%zbarKWnHITZ ;%$-|,$Q}ڮٲ yqLW .2 F$̛4,ozF6d:BHVT=&T=#/3uayj, Ƹ%Ds_zyV|GfQ-Lu%$n=jEj5oI|fl=>Qu5zG <1f$e͙b>ᡔ'\Y.ʹqoӯ~aZA9CN|߸H)` %TDz!J"tBH2lG N;>ۙPu$e^ xxfo & t흻W!bHžٍfv&l]NVS#PV!H*JÏD"եƺwȚ kt%á1c .Yl CgUޔqvÀ~o\SܥAilb6n\Bzݐٷ0 %("J:>[t{0|/C\Y 9S NX .osBϨ9 A%7{DPsClmqeTҸA71)򅞏K(OAྏ Ppİ<9;ɌSS!Y` .g[毽`II\Vm!xq񚃰28-05fRp?h+IY$i7_bB 0$&CȘ1p+Edpi1avK/~޹S)F.p RBR,OZjnGM'޼j{lr}`D9Kj -z *Ӳ|GnT 61W}g~D r) Rp~ A~wI^(«rPm9d짌ICo>akzyT*2+uR"cAOhf:ؽև; tH)]ڧV)-|Ѽ>,cz$VnṯLP]&c+-q(puQ*g=6߳c´>W'¤9EeHw(Cvkoqa@~֒0mEY8%sSћTjIuόBG"p~ͳ!Ʈ#lbK5&dC,PZ% K/~޹IJ"2&h^X IqEXAdnm^f$s2mdFDPcUp(jf` &Tr*c&-ȅGAJDjx6A0bw"8ɀu$%6\LnAǎōsJ aS#%1<00T&)9Z/O^r:@lz n tk(饅RߑdoI1EH"9bfѼU!210R/9Nn”|/8O2oAÖPJ{oz|#< )H!ص%.n0<5#d9$ŒB  I9P{xV$O ?"yYn"=Pcb UcSCgu3 ܒD" d(cHn@V0䂽\NxUN$>3&HbNq]PIH ~%Cta8Vo|?\=z[%HЛXéW]?;JjԠXNQ|2O]˪j̨@$'4,@I)ȒA353ۙ@![j-7Z WLRRr[W^W-v CJq Dɨ([e#)A͸`TO,_µH)-1Z|%!_"6a ! Z' _~ukϟL 4:06*!X?QQ x5rs2wTҞTYĕ2/\XdHry5H qE:\!DG'<zxYTd6؛2F#k\Z\ ߿&D({YTsx6.q" q!g*H]i՗Q(JaMFyw?1xpqA}7rRG)|͓v d-#yFi UU.=Dw%;a&Z/*R7c7EKhj-A|IkTA9~j$N4 cɟ!JܻCP$D+O Zq3[gcf.R濗Ve۟xERϏac;Μ~u?s =Q2(T~Wr= O ͦ=sȨY;8L#(K5_IK0rgFq '(z3D\DUFƸ$`WRp> ldfxZ%1`+kL/߭l\iV[$='hמiU"N}WX \8·{p{Jl C 2}u0Vn D4+3jHeFG$:ilL¯stHVKlbRc6\5Gbx- ˤA BBm&`|$@KJDKZd Eᬃ|hvxVM]˻ t|HTȩ?ıPkóKtd 9%+^++`tץ^v~㬃]QHf*!)r%}]v@賐@F![``̨6+A͒'3!If T$ne03ڏD,FI2jȴ5u }WeFC 4J{:qr"?4i4Aȯt&AZB`0mD[Yfi}tRJ^eHa'5O!1Sퟠ1SD)sIEJ~oYSfr번=ކ2K=YEEIV Л2D,# s_{M^ℌ‚F%$I)1CFn KJ}Wyߥ/ȶ)Q/2|"AQ']f <9C ~!菦NζMԌ"G*C j2Ej@W*ŠCS RK*zR "@J|UX6GbGg7 B%zBBc[;|6 QRBR,a Bd$xzf. VL!xqT3`/\ICXnudT") ˜63`0M1.,`^_ IiU^W#%Z<}6ƞ<S(/ɞZO)wB 6(HGԐ):'~T>#4D`Liiip2{9S:Dd"ix#h$3@F_NdF$#z~Oɗ$#G:DIxPGIUa᪑yB鬣svH`*;.~ґʼ;,10 c fAweA32IIɎ~|0U Uók=xAJjQjHn5㇬\(n JtFڒkZMW1…w}H?HgN@kt*D929g$2(0 1D]Io6Cb z2K;H9фqcXx +aooWPRp#ڜW; omLطT)L2,L?cKoKIU)] u,J'XnUMwdTݿW$%8 D;*~l]ˡ8$Jy׾SC%N-FeT.r!4.qYl ݽ$|O=x֧BJѡ }DY̬t% z3'`KĄ}@.8UBOH&P޴RIІUA.2_:@ae0tjze<)-*͖>^2UiOup qRȘDD<* *zA܇dl%1g|QʁX;.7}_'I !#[ b̠A[2๛'Eo!$"ɴ14}Xq2RbLPxK_iO* M #x+' & WY *l 3a!cWpvy}_G@&&?BJͅ!\qgc([^2 ?IG!q ٲ'ZO)~*rO0غԹM*֗r_g.LI䭬o,nV Q Ӣ8wDDo>"MBXqC{eYd$,!#GzUɗ⨾/'~ ;Xs!XftGq3% 2)4o>3%U[#vX yO=xNgMJ|@pI85W 5% LNX|WF'HL,ؗ}eV&AC/(`#+elIɐ2.8wIBR Iq0gMX\KF =%w)g-hlbM& JUڗU; f(),zB@J2KsHIX<,׎ⒿpWR)%lB +'HV:pxR(zH41e%,Z.07X |KJJJH$AN IBF8.J-XĘe*5^ 1MWIF`'ĸ5::|,&j/OBl 0,ƥO_A.;)HV\79,2SkHF`T U)ϺDgZ^tjcȔ)U+  U[*'9 -l+evF"(FSBsgvܹUII 5ތlqHdF7GFA@|y%Qne\pDI8~BO^h>P:ij+sGђ(jQc'thg6 z(l-!<p4(d.QFnF3UJ%/եU\ 8G/(29" ƦGFa{qm1 d -i2- !,N}wvڿQRRB:EU h` ,zMF|Ȟd$ 2y#(sMO,éWQ$J Z9/+5%t(Ҹ93r1h9#¿/`_R&EÑTWPQ|S#,f~Q˸!Sԫr3UtKqP˒߱deeT}"a%m\9L +h.tRU;Q8^ hVɈ|CL|<5l>5?(0 #,1IotھT4DșP2#IJDȌe\+{{S7LsuR3DIQ_6yBs!||'1A 'b_3ܯ TT U՗S$Bfa(FS׮Εc̔6VBR%bѭ,KF_NgA^i^HUfԨJ5zO"\1'6P9MZf bc`gnx)-ΔF.%!ܱ8gC 2`ص'ó$KeTU qddũ=>QGa}[UǵE\%gf@ť07L4SHI 餳$qvE2 QS0z%i&M$ p`zJy6u'r.ҸJYb \z  Ci@.B`XO>x>677)%%`PZk}auFS{GQS2KxIól,IRpi}S5Ֆ6!{!l Ymwqg<IZ'2LG綿z9Z4o3"R I /$PL9ddىJIWK4*O]TD@x22L3"^n,H@-KDXd*)vKF&@?qu'7%x8ZOJzI3:,.|%mwy;GuV\F5B@hAnDGAWY$jOJJVl*ŧe{&;{MJnЩ''%i!)Y@g;!ɨϻ{W'IAfY^bFxYR2>/Hp;2!r6=+77Cg`Ărʸѝ"3@?qućBgOD&Ѩ6]s9 zQajA*R qKzVKK I3ò;7u-r2XRv!l#F.49/"&\tR9בu裐܍~1`"RPK:0<*OL(􂂛Lu]bdqn+₋d7&~E6[t \6}_)|ZND"2֓ )~ihTlY"cfɟP$I30jD.3 JvR %V"(Ùe$@)- *#[_oWtz JAEkLd8 yf,B߹EFO7(0 |ͳ!aHiwM*'g$֩Xu+ %c0Z`"W@ \O>{C>[0F̘GC?9; 9$r琑ZO"駄. ӏ 3I^BϦ,"ғ !32HY`tW_7o3DDWe/8teRbTR} 8?%2C阁nb (VQ"N2 b '%9y@var[\=ɇϒd?2Jz8tc 9r#>h*pd</"2搒߽(JVe q0Z$_}$骲rm(9QaǮ?[LF7K3M@JH)'%'SRzw&n.;Ȉ<," Sɨ!h%8;`E% yfI0|E/CF@J3TLѰ# .+ҝ.@JPR}&pz9\B%{ פIr!#QzHDp0>]Ovw8n+zߐ 111z"!$٧%;|2ĵxdtMG $ۛWk@FHJA$n̆PoVsZ% S2RoÍ2y0'0aL3 צ"mo A3bffkmY->MEPV(2i gZܯKIU]k'-=QLKz$}me;߀Q(E(˲,Ƕ(f&t"ɒ~K? ɢ22h7Qh4VHr.E#\holkC<1z7~1cɉcyDb?.`!Eg!hgEF5XdF/p'o´1,,˚i~MF3$łr]?HWH %;fF޾(RHԖS-Lw1Ctō&VH",Օv,ҞQhyÔnlL }}df}ȦYos>IKv+vA}d4cM2J:%͒L&#GF|džCxrQdR231Ң %$#esP6>^}?2EQ锓96(!)]">a2̦c[ԝ@9A,@ z2zǻh8NK{2ƙ(i厘ZmϡxQG&˓ɤ7 !Ѫi!8,!Cdn n=d꟒9=P<(#P<\LF_h<R<':Qps'l82zdp`0 ph)6*!p̞c##٧Lw2-zNɨȜ8700O?6zK`^`0Oo]q΁\htƸ_OF7G#xݥW.o?6_z/wnc>+"\PB:epF~حLwT2K ќd@͘Fyxr /vwwo h4*fN}JFTFjy /<]?wg_z<MFmdղQ $#8`|gd$(, ~*##ElgTs1yj0|뽰wc0 ="M /$%ˌD@Y朿Ϲ.m}d4=3 v`]eb eHf 2CEFvW%&Q܀>FzFortdBFp<O2K.~FV<32n5RV,}˥ク`nRd2)S!)!Tɞ}X2[0N{)bUIɨAFo2rdD'Q;?dĘ_j@ƥ֡LAV0\Kϥp8 h9b )72vm y;FwoT2?gQ- jKbBn8`~(;H&QjfdeNe@WїȨG2F)sGW9sRB: )ɎʆіAe:۝dgC6sv1|zp8dT.*ϭr-a9dRdtjY{ų[.t?Iɨuh:lcYY`bAAfr>,2ZϨwq1[MagF.ue ^ d2!wLElXC ^%SMFQf{Ʒ\} kdF{ѨIF8; ڏtcSO8d뭀f3#q旴yxp?^2FPa MS0A|V.AynYV2Z8Kn\vQQJ{62p^lBLJH2rdT%{[ۭdTG7]3N^?A d/=(%#OF )E 2(ycNuq'*ztCfTEerf!ZXq * ht2'xh체+f*Ut-K;yz^v׆a AF1?,bfQQ*D5ݰIF/y2E1mQIiwXrrǛ[DF2'3Jp&3R2Ol7S.fFn 1ٷ1!V2:sF޵<ɌdTo ͛g}:JHƙ μC}FOfdt(H}!%2JouuU(-yh~Έȫ2`002ݰɜl0;͐HssxD2Y!7:2 JFrm eO}0ty7E庐J)CnZNIqg>Uˌ<2EHLVt;חLW/(Ѿ_CȶrdϻvG2z5tvNv J+\-[ClRdtjZm {Ѯ'I"ZN(C +y tQcӫ>d{FU@9^S[TdA.KvDwWS=+! ==i2z5/0eGOt^~'>XÒ 2Oڭdό[t1-#;zF_*5uv -|F%;@n?Қ$I [Rg2+Pd`i 3U-;3jүȊdJIHD2tdtlk7e_;'Ҋw l)~(vYd$JL %CB>5w"N6 lfj# gdA-pP`2JFzռ)3/o>@F[;*-LGn> D OShTB:! Rx+d41܊r}#Fmd*&ΌsipdtܙshV rI7zJȨߓuJH'O&j=MQd4gDm:M﶐,jgM5t.fRJL퀮y;֎Nr/w>:M'Ad(f3ЫzFOF#UC[dq{&dt\v@~y>ev@D IL^ I 1BdF" 3nICFCFG&D@Sh9Qf.o%d4<}D%؉8giXddKAW4֞+QNHF,(-ʐCI6PL2}DN;ewB 87A@H&#@睻QP/I'FFU78+e@T+f=H3$4R>3gߛ#R֒b`KF2J7dTŬg$,Lg襹b VhiZ-g$_xt RY&`3$jtTI'h6[)2 %;/+hdKtT Ŋ`bY fV2D~DxCye@ d4CF9( ~f̌3va 2K/ΉBX\ҝKF`hy2BO?dDkb &,s3Pނ9>^dT+9EpSQb``T0dH)'p fn+e}>V2yZ]&)Hw>#t`Q>d%3M7*!)nk-M ;Лrj2s>3bő{i j;5ݳuEFWqRR* Iq샷y2rNOH2sCfryd#gt6\G/3͞Td Go_ wNfd\FH:e@>jCodg6!0/=zfF{.b*j8 PM#2#jy22TJ -&2lo<♇;3{4CR,lܶvglzʪ4D(UPgq^;8!GF6x L]2BrqucUZKF ĂWMye]Ư0!7(e:c 6(wC/<>C&%J֙ϰWr^d9#blԛACyᇵv;Z9æHR)dw"ɑє _w2j 7n+wյg֒' c.G02J_!u^Cr DR$*;J5$#2Π dRLws`דbZO݁Q#C|WdK*q1kڝ00dt$fW cqx ޑe: y2CR,e k#`v@95pe֎/nn|KkM7sdԔz{CZЭ @đe٪A Pv3ZUY/雳id;n{{]߹dTSAhKXV ' !܀6rv1t~rdF#,wj:%Ƌ% 檊%pY2 AU%8Y (.S2Jn K5C:C`'MF0-gkǏxou3^hf*2ޓui$3&SbI|~8}k7QetjftCʐK;d&0NIf$\@Mw$?43tt(k谗_Ҿ%KN&Q܉d,] `|v13%+#(PdkW>yL1AKd%$$g\ԗ`*ۚ3Wiz}FXN?nh`VBF3:\0(6JjXƥGLIJ>^ݥ:A.Fyn'${t0[;fFGB.<"4CRꥇV8e:ψ6rP+;2zmME+ȟ>n 1՞M^'}( ‹3re>#SO~xzu<+$ܦW{o:U|f,~%;͐Nꘅ̭ӸB쨝}FO)Ƶ:x, .eZ.3}RHDUve 0dF`{2gdtƺRSHF&P%֞"kG(!P=b;Sc$֑md0-)V3(f9Sȕw2ݍ'P<閕G2 e;4Ԓ▂KNr&#HҴӞTp:2$qjS32t`p))-MĺQ,yA*u)NLo޹'}7)L/2Z"`0Voz _Dh:XCbōrv@ckw''R5ݩP}HCk3r?;se:]d2JsLK+-Je⟯Rhd}ai%ӖU &Oܜ9(`}N-3 ֓Nꌱ qP{7v2g2rO?|^{FbK؞l.QTp\?֔t8")u'arm9;0gtU2ͱ)2ɐQ-32$/*_dcZo%Jå` 7J! @O?=4JF{M'AFD13 K>zFX!)?'@F\h[NMg>a{FJF'G5V?X1~Iz]{Ȋ}4C:LȽKxK=V 2sj:͌V(8<<(tjt;#E= N- Scr6mwaGNhEΚ̂c" %rv"R'YWH|N3LJvXŒp"rvLSP3#})sua)%=6dffeuS3:7AX>/e)C:T {iZϔ}ae2"%rqj:'V2"]ט=2*V,'Dg\gL2DhzFO(\@uqdD&i{OxavhtQ˻K ֱ\ RxïP2:~Ƚvddٹ}XTmz٨" c~3tVB:ۮ+\(s@M;xL35ctgd2]gtj)"!dƬsHeV Siy2K3fj H_&@X>#d(aRӄ j`K*b9 [W?/{'fFV!^R(k:z ~=!)n~\v3, f.ƟyVJF Y2wFMȈoglmVeGᕱVz S/NG32mb[͌NFRޑDU^p9 3qk[-7gTMwzO%N JH[FM271ܜQf`:xiM_y~}ToV `?tJF\_1nCR,%  du72r:F|Hh/&‘t&:0 ϽkwXeS+so5WU,e9:\laIp^ ,A\fDT>j_*SO Iq+%TPr\|:3vٮ3W%9?̟{2]rVH|4'%$ŭfId2n0ό֗қ1a~5\f7t'LXwn׹J;cv@r 9@}>C}:>K"v ~Q0$^5Z)nvD ۰vBm/7gD 2g0Y%;UgRlX_.1y(Ut+!#!K23 IqK"o3Bd 'bh1tZoJXLFh9fd94(qJtAbA&(63P&IWjbOE5ݟtڞ)󂪅meFPnw u&_z*v$UPB:<6y2,8;>dtUl*b CջTs]{/t>6 dJ+u/jTZ IqR]t'T?9#,-7lѧ %;l琑Dw38gȹv PJE _ t$`/KRB:ހ sY h$\b􉇁?<~='{~Zb"\m9did'^Ohn__r{62Xt2 703nkBFn^d{ ]^s^+nE%U͕]f,GD(Z)_^I ,< 2}}><2+Ee%^"5]a?WVH|鞋 zhOhO# PSbN0!\Δj) @` `{6џtdrz׻hdV!#;PWZ;۠V;ѷ^|  ^Rz2*iq/KMe_?(!_fp  ~:`Lv?ԇorvR`0H2#dYѾg~n$j0Y=o<=7x0<7 v_v!3*V 4%$ite-aO}x+?ɓK^/IfĘr\hH3NduϧeΣCn<.O7tY%UJ, NaE2IRB:9'].2'1C OFRL׻nLsHh=΍4/1pWv+ '1}|s\h4z֓QȌsȈV-&%$K˰Lf@{軯\'~$x<-lMWh}yMRbsZ9g콗>2M2h4N'E%], ;-)BJG2u xHF$Pv7`<O<q#< D'c@e亟36t/up82(ړcQיDܐ$}E%3yolO4\h4όv{ГQѼ5"(奙%Yf0s ?/uW<ux22( (C܃UfUBR, 4bZ[e9NמzoP~w_{k~R۽Q9dzR~D M",mQ(H^~?>ǻ蕠if$%9-;ʒyL&,d2Q_o6{G1>,h4znb: HeRl-p2\ &/_+7gBpv`2Kf>̙Q2Zl?!%3cLZk/<Я[ Y˓d:~Q%& eYŸ!=qo`(b:&p'sygDheNIHDZʾIQ.(D QGyv̙V;˲Vj)˒㱝L&h4b)o765K̜ju:NjcrkLS.ҎFb8Zk=}ΑHook7۹iZ@ FQicLDDLYl(x:;/AEh2#9;ɤx̭VkBDEQV`OF8!-"'%#Қ)Җe)!RP!-"&%'ynpYE< eYtn%<އJHkFBs}<97nGhk;/ʲ>sйQ2R(!A@'^ 4Ȳ&jx2>rйQ2R(!ipFPY$4IIn!(O9;7H.0JF %;,J 7h^%տtI?\td8PQ^,7 @ssg"2dusg氄tgH̊n,~kt7ܔ҂&:JQ2Z,i?dž%#ҚaI͏Yg(%5:7rRB .{5AeH氿XsC.:zfJH}Ƽ2Aeez<XόB IˁI؇)5ύbneɲQ3m=3 %;${IG r 3ύ~=3[Ͳ(2d#[ T֓:7r(49sEX`8sEP/;BP }  BP( BP( BPBR( BP(JH BPBR( B IP(JH BP(!) B IP( %$BP(!) BP( %$BP( BP( BP( BPBR( BP(JH BPBR( B IP(JH BP(!) B IP( %$BP(!) BP( %$BP( BPBR( BP(JH BPBR( B IP(JH BP(!) B IP( %$BP(!) BP( %$BP( BP( BP( BPBR( BP(JH BPBR( B IP(JH BP(!) B IP( %$BP!?IENDB`desmume-0.9.9/src/cocoa/cocoa_videofilter.h0000644000175000017500000000447712140261603021435 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include "../filter/videofilter.h" #undef BOOL @class NSImage; @class NSBitmapImageRep; /******************************************************************************************** CocoaVideoFilter - OBJECTIVE-C CLASS This is an Objective-C wrapper class for the video filter C++ object. Thread Safety: All methods are thread-safe. ********************************************************************************************/ @interface CocoaVideoFilter : NSObject { VideoFilter *vf; VideoFilterTypeID currentFilterType; } - (id) initWithSize:(NSSize)theSize; - (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID; - (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID numberThreads:(NSUInteger)numThreads; - (BOOL) setSourceSize:(NSSize)theSize; - (BOOL) changeFilter:(VideoFilterTypeID)typeID; - (UInt32 *) runFilter; - (NSImage *) image; - (NSBitmapImageRep *) bitmapImageRep; - (VideoFilterTypeID) typeID; - (NSString *) typeString; - (UInt32 *) srcBufferPtr; - (UInt32 *) dstBufferPtr; - (NSSize) srcSize; - (NSSize) destSize; - (VideoFilterParamType) filterParameterType:(VideoFilterParamID)paramID; - (int) filterParameteri:(VideoFilterParamID)paramID; - (unsigned int) filterParameterui:(VideoFilterParamID)paramID; - (float) filterParameterf:(VideoFilterParamID)paramID; - (void) setFilterParameter:(VideoFilterParamID)paramID intValue:(int)value; - (void) setFilterParameter:(VideoFilterParamID)paramID uintValue:(unsigned int)value; - (void) setFilterParameter:(VideoFilterParamID)paramID floatValue:(float)value; + (NSString *) typeStringByID:(VideoFilterTypeID)typeID; @end desmume-0.9.9/src/cocoa/coreaudiosound.h0000644000175000017500000000310412140261603020762 0ustar guillaumeguillaume/* Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _COREAUDIOSOUND_ #define _COREAUDIOSOUND_ #include #include #include #include #include "ringbuffer.h" class CoreAudioOutput { private: AudioUnit _au; RingBuffer *_buffer; OSSpinLock *_spinlockAU; float _volume; public: CoreAudioOutput(size_t bufferSamples, size_t sampleSize); ~CoreAudioOutput(); void start(); void stop(); void writeToBuffer(const void *buffer, size_t numberSampleFrames); void clearBuffer(); size_t getAvailableSamples() const; void mute(); void unmute(); float getVolume() const; void setVolume(float vol); }; OSStatus CoreAudioOutputRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); #endif desmume-0.9.9/src/cocoa/translations/0000755000175000017500000000000012140306213020306 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/translations/French.lproj/0000755000175000017500000000000012140306213022640 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/translations/French.lproj/Localizable.strings0000644000175000017500000002247612140261564026520 0ustar guillaumeguillaume/* DeSmuME Strings File */ /* FRENCH */ /* Dialog Box Titles */ "Open ROM" = "Open ROM"; "Open State File" = "Open State File"; "Save State File" = "Save State File"; "Import ROM Save File" = "Import ROM Save File"; "Export ROM Save File" = "Export ROM Save File"; "Select ROM" = "Select ROM"; "Select ADVANsCEne Database" = "Select ADVANsCEne Database"; "Select R4 Cheat Database" = "Select R4 Cheat Database"; "Select ARM7 BIOS Image" = "Select ARM7 BIOS Image"; "Select ARM9 BIOS Image" = "Select ARM9 BIOS Image"; "Select Firmware Image" = "Select Firmware Image"; "Save Screenshot" = "Save Screenshot"; /* Menus */ "Execute" = "Excuter"; "Pause" = "Pause"; "Disable Speed Limit" = "Disable Speed Limit"; "Enable Speed Limit" = "Enable Speed Limit"; "Disable Auto Frame Skip" = "Disable Auto Frame Skip"; "Enable Auto Frame Skip" = "Enable Auto Frame Skip"; "Disable Cheats" = "Disable Cheats"; "Enable Cheats" = "Enable Cheats"; "Disable HUD" = "Disable HUD"; "Enable HUD" = "Enable HUD"; "Hide Status Bar" = "Hide Status Bar"; "Show Status Bar" = "Afficher la barre d&apos;tat"; "Speed 1x" = "Speed 1x"; "Speed 2x" = "Speed 2x"; "Slot %d" = "Slot %d"; /* Alert Text */ "A critical file is missing. DeSmuME will now quit." = "A critical file is missing. DeSmuME will now quit."; "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME." = "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME."; /* Status Text */ "Ready." = "Ready."; "Save state file loading failed!" = "Save state file loading failed!"; "Save state file loaded." = "Save state file loaded."; "Save state file saving failed!" = "Save state file saving failed!"; "Save state file saved." = "Save state file saved."; "Save state file reverting failed!" = "Save state file reverting failed!"; "Save state file reverted." = "Save state file reverted."; "ROM save file import failed!" = "ROM save file import failed!"; "ROM save file imported." = "ROM save file imported."; "ROM save file export failed!" = "ROM save file export failed!"; "ROM save file exported." = "ROM save file exported."; "Loading ROM..." = "Loading ROM..."; "ROM loaded." = "ROM loaded."; "ROM loading failed!" = "ROM loading failed!"; "Unloading ROM..." = "Unloading ROM..."; "ROM unloaded." = "ROM unloaded."; "Emulator resetting..." = "Emulator resetting..."; "Emulator reset." = "Emulator reset."; "Cannot generate the save file path!" = "Cannot generate the save file path!"; "Cannot create the save directory!" = "Cannot create the save directory!"; "Speed limit disabled." = "Speed limit disabled."; "Speed limit enabled." = "Speed limit enabled."; "Auto frame skip disabled." = "Auto frame skip disabled."; "Auto frame skip enabled." = "Auto frame skip enabled."; "Cheats disabled." = "Cheats disabled."; "Cheats enabled." = "Cheats enabled."; "HUD disabled." = "HUD disabled."; "HUD enabled." = "HUD enabled."; "Volume: %1.1f%%" = "Volume: %1.1f%%"; /* ROM Info Panel */ "No ROM loaded." = "No ROM loaded."; "%i bytes" = "%i bytes"; /* Display Mode Strings */ "Main" = "Main"; "Touch" = "Touch"; "Combo" = "Combo"; /* LEGACY STRINGS */ /* General */ "DeSmuME Emulator" = "DeSmuME Emulator"; //"OK" = ?; //"Cancel" = ?; /* File Menu */ //"Slot %d" = "Slot %d"; /* Emulation Menu */ //"Execute" = "Excuter"; //"Pause" = "Pause"; /* View Menu */ //"Show Status Bar" = "Afficher la barre d&apos;tat"; "Hide Status Bar" = "Hide Status Bar"; /* Dialogs */ "Are you sure you want to quit?" = "Etes vous su de vouloir quitter ?"; "Are you sure you want to close the ROM?" = "Etes vous sur de vouloir fermer la ROM ?"; /* Status Bar Messages */ "No ROM Loaded" = "Aucune ROM charge"; "Executing" = "Excution"; "Paused" = "En pause"; /* Preferences Window */ "DeSmuME Preferences" = "Prfrences de DeSmuME"; "Interface" = "Interface"; "Controls" = "Contrles"; "DS Firmware" = "DS Firmware"; "Yes" = "Oui"; "No" = "Non"; /* Interface Preferences */ "Execute Upon Load" = "Excuter aprs le chargement"; //"When Launching, Load" = ?; //"Load Nothing" = ?; //"Load Last ROM" = ?; /* Control Preferences */ //"A Button" = ?; //"B Button" = ?; //"X Button" = ?; //"Y Button" = ?; //"L Button" = ?; //"R Button" = ?; //"Up Button" = ?; //"Down Button" = ?; //"Left Button" = ?; //"Right Button" = ?; //"Start Button" = ?; //"Select Button" = ?; //"Up Key" = ?; //"Down Key" = ?; //"Left Key" = ?; //"Right Key" = ?; //"Space Bar" = ?; //"Enter Key" = ?; /* Status Bar */ "No ROM loaded" = "Aucune ROM charge"; "ROM Loaded" = "ROM charge"; "Emulation Executing" = "Excution"; "Emulation Paused" = "En pause"; "Emulation Reset" = "Rinitialiser"; /* Errors */ "Error" = "Erreur"; "An emulation error occurred" = "Une erreur d'mulation est survenue"; desmume-0.9.9/src/cocoa/translations/French.lproj/MainMenu (Legacy).strings0000644000175000017500000006670212140261564027316 0ustar guillaumeguillaume /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "About DeSmuME"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "Preferences& "; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = "Services"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = "Services"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "Hide DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Quit DeSmuME"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = "Show All"; /* Class = "NSTextFieldCell"; title = "Select Image Format:"; ObjectID = "212"; */ "212.title" = "Slectionner le format d'image:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "215"; */ "215.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "PNG"; ObjectID = "216"; */ "216.title" = "PNG"; /* Class = "NSMenuItem"; title = "BMP"; ObjectID = "217"; */ "217.title" = "BMP"; /* Class = "NSMenuItem"; title = "GIF"; ObjectID = "218"; */ "218.title" = "GIF"; /* Class = "NSMenuItem"; title = "JPEG"; ObjectID = "219"; */ "219.title" = "JPEG"; /* Class = "NSMenuItem"; title = "TIFF"; ObjectID = "220"; */ "220.title" = "TIFF"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "227"; */ "227.title" = "Fichier"; /* Class = "NSMenu"; title = "File"; ObjectID = "228"; */ "228.title" = "Fichier"; /* Class = "NSMenuItem"; title = "Open ROM& "; ObjectID = "230"; */ "230.title" = "Ouvrir une ROM& "; /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "231"; */ "231.title" = "Fichiers rcents"; /* Class = "NSMenuItem"; title = "ROM Info..."; ObjectID = "233"; */ "233.title" = "Informations sur la ROM& "; /* Class = "NSMenuItem"; title = "Save State As"; ObjectID = "234"; */ "234.title" = "Enregistrer l'tat sous& "; /* Class = "NSMenuItem"; title = "Load State From..."; ObjectID = "235"; */ "235.title" = "Charger l'tat depuis& "; /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "240"; */ "240.title" = "Fichiers rcents"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "241"; */ "241.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Load State"; ObjectID = "252"; */ "252.title" = "Charger l'tat"; /* Class = "NSMenu"; title = "Load State"; ObjectID = "253"; */ "253.title" = "Charger l'tat"; /* Class = "NSMenuItem"; title = "Save State"; ObjectID = "255"; */ "255.title" = "Enregistrer l'tat"; /* Class = "NSMenu"; title = "Save State"; ObjectID = "256"; */ "256.title" = "Enregistrer l'tat"; /* Class = "NSMenuItem"; title = "Close ROM"; ObjectID = "259"; */ "259.title" = "Fermer la ROM"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "260"; */ "260.title" = "Edit"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "261"; */ "261.title" = "Edit"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "262"; */ "262.title" = "Undo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "263"; */ "263.title" = "Redo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "265"; */ "265.title" = "Cut"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "266"; */ "266.title" = "Copy"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "267"; */ "267.title" = "Paste"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "269"; */ "269.title" = "Delete"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "270"; */ "270.title" = "Select All"; /* Class = "NSMenuItem"; title = "Emulation"; ObjectID = "336"; */ "336.title" = "Emulation"; /* Class = "NSMenu"; title = "Emulation"; ObjectID = "337"; */ "337.title" = "Emulation"; /* Class = "NSMenuItem"; title = "Execute"; ObjectID = "338"; */ "338.title" = "Excuter"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "339"; */ "339.title" = "Prsentation"; /* Class = "NSMenu"; title = "View"; ObjectID = "340"; */ "340.title" = "Prsentation"; /* Class = "NSMenuItem"; title = "Size 1x"; ObjectID = "341"; */ "341.title" = "Taille 1x"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "342"; */ "342.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "343"; */ "343.title" = "Tools"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "348"; */ "348.title" = "Fentre"; /* Class = "NSMenu"; title = "Window"; ObjectID = "349"; */ "349.title" = "Fentre"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "350"; */ "350.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "351"; */ "351.title" = "Zoom"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "353"; */ "353.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "357"; */ "357.title" = "Aide"; /* Class = "NSMenu"; title = "Help"; ObjectID = "358"; */ "358.title" = "Aide"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "359"; */ "359.title" = "DeSmuME Aide"; /* Class = "NSMenuItem"; title = "Go to Website"; ObjectID = "362"; */ "362.title" = "Aller sur le site web"; /* Class = "NSMenuItem"; title = "Go to Forums"; ObjectID = "363"; */ "363.title" = "Aller sur les forums"; /* Class = "NSMenuItem"; title = "Submit a Bug Report"; ObjectID = "364"; */ "364.title" = "Envoyer un rapport de bug"; /* Class = "NSMenuItem"; title = "Show Support Folder in Finder"; ObjectID = "368"; */ "368.title" = "Show Support Folder in Finder"; /* Class = "NSWindow"; title = "DeSmuME"; ObjectID = "388"; */ "388.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "Status Text"; ObjectID = "398"; */ "398.placeholderString" = "Status Text"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "424"; */ "424.title" = "Rinitialiser"; /* Class = "NSMenuItem"; title = "Speed Limit"; ObjectID = "427"; */ "427.title" = "Speed Limit"; /* Class = "NSMenu"; title = "Speed Limit"; ObjectID = "428"; */ "428.title" = "Speed Limit"; /* Class = "NSMenuItem"; title = "1/4 Speed"; ObjectID = "429"; */ "429.title" = "1/4 Speed"; /* Class = "NSMenuItem"; title = "Backup Media Type"; ObjectID = "430"; */ "430.title" = "Backup Media Type"; /* Class = "NSMenu"; title = "Backup Media Type"; ObjectID = "431"; */ "431.title" = "Backup Media Type"; /* Class = "NSMenuItem"; title = "Auto Detect"; ObjectID = "432"; */ "432.title" = "Auto Detect"; /* Class = "NSMenuItem"; title = "EEPROM 4kbit"; ObjectID = "434"; */ "434.title" = "EEPROM 4kbit"; /* Class = "NSMenuItem"; title = "EEPROM 64kbit"; ObjectID = "435"; */ "435.title" = "EEPROM 64kbit"; /* Class = "NSMenuItem"; title = "EEPROM 512kbit"; ObjectID = "436"; */ "436.title" = "EEPROM 512kbit"; /* Class = "NSMenuItem"; title = "FRAM 256kbit"; ObjectID = "437"; */ "437.title" = "FRAM 256kbit"; /* Class = "NSMenuItem"; title = "FLASH 2mbit"; ObjectID = "438"; */ "438.title" = "FLASH 2mbit"; /* Class = "NSMenuItem"; title = "FLASH 4mbit"; ObjectID = "439"; */ "439.title" = "FLASH 4mbit"; /* Class = "NSMenuItem"; title = "1/2 Speed"; ObjectID = "440"; */ "440.title" = "1/2 Speed"; /* Class = "NSMenuItem"; title = "3/4 Speed"; ObjectID = "441"; */ "441.title" = "3/4 Speed"; /* Class = "NSMenuItem"; title = "Normal Speed"; ObjectID = "443"; */ "443.title" = "Normal Speed"; /* Class = "NSMenuItem"; title = "Double Speed"; ObjectID = "445"; */ "445.title" = "Double Speed"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "446"; */ "446.title" = "None"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "448"; */ "448.title" = "Custom"; /* Class = "NSMenuItem"; title = "Size 2x"; ObjectID = "449"; */ "449.title" = "Taille 2x"; /* Class = "NSMenuItem"; title = "Size 3x"; ObjectID = "450"; */ "450.title" = "Taille 3x"; /* Class = "NSMenuItem"; title = "Size 4x"; ObjectID = "451"; */ "451.title" = "Taille 4x"; /* Class = "NSMenuItem"; title = "No Smaller Than DS"; ObjectID = "454"; */ "454.title" = "Pas plus petit que la DS"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "455"; */ "455.title" = "Afficher la barre d&apos;tat"; /* Class = "NSMenuItem"; title = "Rotation"; ObjectID = "457"; */ "457.title" = "Rotation"; /* Class = "NSMenu"; title = "Rotation"; ObjectID = "458"; */ "458.title" = "Rotation"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "459"; */ "459.title" = "0"; /* Class = "NSMenuItem"; title = "Layers"; ObjectID = "461"; */ "461.title" = "Layers"; /* Class = "NSMenu"; title = "Layers"; ObjectID = "462"; */ "462.title" = "Layers"; /* Class = "NSMenuItem"; title = "Top BG0"; ObjectID = "463"; */ "463.title" = "Top BG0"; /* Class = "NSMenuItem"; title = "Save Screenshot..."; ObjectID = "465"; */ "465.title" = "Enregistrer une capture d'cran& "; /* Class = "NSMenuItem"; title = "90"; ObjectID = "466"; */ "466.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "467"; */ "467.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "468"; */ "468.title" = "270"; /* Class = "NSMenuItem"; title = "Top BG1"; ObjectID = "469"; */ "469.title" = "Top BG1"; /* Class = "NSMenuItem"; title = "Top BG2"; ObjectID = "470"; */ "470.title" = "Top BG2"; /* Class = "NSMenuItem"; title = "Top BG3"; ObjectID = "471"; */ "471.title" = "Top BG3"; /* Class = "NSMenuItem"; title = "Top OBJ"; ObjectID = "472"; */ "472.title" = "Top OBJ"; /* Class = "NSMenuItem"; title = "Sub BG0"; ObjectID = "474"; */ "474.title" = "Sub BG0"; /* Class = "NSMenuItem"; title = "Sub BG1"; ObjectID = "475"; */ "475.title" = "Sub BG1"; /* Class = "NSMenuItem"; title = "Sub BG2"; ObjectID = "476"; */ "476.title" = "Sub BG2"; /* Class = "NSMenuItem"; title = "Sub BG3"; ObjectID = "477"; */ "477.title" = "Sub BG3"; /* Class = "NSMenuItem"; title = "Sub OBJ"; ObjectID = "478"; */ "478.title" = "Sub OBJ"; /* Class = "NSPanel"; title = "Custom Speed Limit Window"; ObjectID = "552"; */ "552.title" = "Custom Speed Limit Window"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "565"; */ "565.title" = "0x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "566"; */ "566.title" = "10x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "567"; */ "567.title" = "2x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "568"; */ "568.title" = "4x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "569"; */ "569.title" = "6x"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "570"; */ "570.title" = "8x"; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "571"; */ "571.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "572"; */ "572.title" = "Speed limit set to: "; /* Class = "NSTextFieldCell"; placeholderString = "speedX"; ObjectID = "573"; */ "573.placeholderString" = "speedX"; /* Class = "NSPanel"; title = "ROM Info"; ObjectID = "587"; */ "587.title" = "Informations sur la ROM"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "731"; */ "731.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ROM Size:"; ObjectID = "732"; */ "732.title" = "Taille de la ROM:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "733"; */ "733.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Maker:"; ObjectID = "734"; */ "734.title" = "Maker:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "735"; */ "735.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Title:"; ObjectID = "736"; */ "736.title" = "Titre:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "737"; */ "737.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "File:"; ObjectID = "738"; */ "738.title" = "Fichier:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "745"; */ "745.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM9 Size:"; ObjectID = "746"; */ "746.title" = "ARM9 Size:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "750"; */ "750.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM7 Size:"; ObjectID = "751"; */ "751.title" = "ARM7 Size:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "755"; */ "755.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "Data Size:"; ObjectID = "756"; */ "756.title" = "Taille des donnes:"; /* Class = "NSWindow"; title = "About DeSmuME"; ObjectID = "774"; */ "774.title" = "About DeSmuME"; /* Class = "NSTabViewItem"; label = "Read Me"; ObjectID = "779"; */ "779.label" = "Lisez-moi"; /* Class = "NSTabViewItem"; label = "License"; ObjectID = "780"; */ "780.label" = "Licence"; /* Class = "NSTabViewItem"; label = "Authors"; ObjectID = "783"; */ "783.label" = "Auteurs"; /* Class = "NSTabViewItem"; label = "Change Log"; ObjectID = "785"; */ "785.label" = "Change Log"; /* Class = "NSTextFieldCell"; title = "DeSmuME"; ObjectID = "788"; */ "788.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; title = "Nintendo DS Emulator"; ObjectID = "790"; */ "790.title" = "Emulateur Nintendo DS"; /* Class = "NSTextFieldCell"; placeholderString = "Version ?"; ObjectID = "792"; */ "792.placeholderString" = "Version ?"; /* Class = "NSTextFieldCell"; placeholderString = "Date"; ObjectID = "794"; */ "794.placeholderString" = "Date"; /* Class = "NSTextFieldCell"; title = "http://www.desmume.org"; ObjectID = "796"; */ "796.title" = "http://www.desmume.org"; /* Class = "NSButtonCell"; title = "Enable Speed Limiter"; ObjectID = "835"; */ "835.title" = "Enable Speed Limiter"; /* Class = "NSMenuItem"; title = "JPEG 2000"; ObjectID = "848"; */ "848.title" = "JPEG 2000"; desmume-0.9.9/src/cocoa/translations/Japanese.lproj/0000755000175000017500000000000012140306213023161 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/translations/Japanese.lproj/Localizable.strings0000644000175000017500000002205612140261564027033 0ustar guillaumeguillaume/* DeSmuME Strings File */ /* JAPANESE */ /* Dialog Box Titles */ "Open ROM" = "Open ROM"; "Open State File" = "Open State File"; "Save State File" = "Save State File"; "Import ROM Save File" = "Import ROM Save File"; "Export ROM Save File" = "Export ROM Save File"; "Select ROM" = "Select ROM"; "Select ADVANsCEne Database" = "Select ADVANsCEne Database"; "Select R4 Cheat Database" = "Select R4 Cheat Database"; "Select ARM7 BIOS Image" = "Select ARM7 BIOS Image"; "Select ARM9 BIOS Image" = "Select ARM9 BIOS Image"; "Select Firmware Image" = "Select Firmware Image"; "Save Screenshot" = "Save Screenshot"; /* Menus */ "Execute" = "0000"; "Pause" = "000"; "Disable Speed Limit" = "Disable Speed Limit"; "Enable Speed Limit" = "Enable Speed Limit"; "Disable Auto Frame Skip" = "Disable Auto Frame Skip"; "Enable Auto Frame Skip" = "Enable Auto Frame Skip"; "Disable Cheats" = "Disable Cheats"; "Enable Cheats" = "Enable Cheats"; "Disable HUD" = "Disable HUD"; "Enable HUD" = "Enable HUD"; "Hide Status Bar" = "Hide Status Bar"; "Show Status Bar" = "00000000h:y"; "Speed 1x" = "Speed 1x"; "Speed 2x" = "Speed 2x"; "Slot %d" = "0000 %d"; /* Alert Text */ "A critical file is missing. DeSmuME will now quit." = "A critical file is missing. DeSmuME will now quit."; "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME." = "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME."; /* Status Text */ "Ready." = "Ready."; "Save state file loading failed!" = "Save state file loading failed!"; "Save state file loaded." = "Save state file loaded."; "Save state file saving failed!" = "Save state file saving failed!"; "Save state file saved." = "Save state file saved."; "Save state file reverting failed!" = "Save state file reverting failed!"; "Save state file reverted." = "Save state file reverted."; "ROM save file import failed!" = "ROM save file import failed!"; "ROM save file imported." = "ROM save file imported."; "ROM save file export failed!" = "ROM save file export failed!"; "ROM save file exported." = "ROM save file exported."; "Loading ROM..." = "Loading ROM..."; "ROM loaded." = "ROM loaded."; "ROM loading failed!" = "ROM loading failed!"; "Unloading ROM..." = "Unloading ROM..."; "ROM unloaded." = "ROM unloaded."; "Emulator resetting..." = "Emulator resetting..."; "Emulator reset." = "Emulator reset."; "Cannot generate the save file path!" = "Cannot generate the save file path!"; "Cannot create the save directory!" = "Cannot create the save directory!"; "Speed limit disabled." = "Speed limit disabled."; "Speed limit enabled." = "Speed limit enabled."; "Auto frame skip disabled." = "Auto frame skip disabled."; "Auto frame skip enabled." = "Auto frame skip enabled."; "Cheats disabled." = "Cheats disabled."; "Cheats enabled." = "Cheats enabled."; "HUD disabled." = "HUD disabled."; "HUD enabled." = "HUD enabled."; "Volume: %1.1f%%" = "00000: %1.1f%%"; /* ROM Info Panel */ "No ROM loaded." = "No ROM loaded."; "%i bytes" = "%i bytes"; /* Display Mode Strings */ "Main" = "Main"; "Touch" = "Touch"; "Combo" = "Combo"; /* LEGACY STRINGS */ /* General */ "DeSmuME Emulator" = "DeSmuME DS0000000"; "OK" = "OK"; "Cancel" = "00000"; /* File Menu */ //"Slot %d" = "0000 %d"; /* Emulation Menu */ //"Execute" = "0000"; //"Pause" = "000"; /* View Menu */ //"Show Status Bar" = "00000000h:y"; "Hide Status Bar" = "Hide Status Bar"; /* Dialogs */ "Are you sure you want to quit?" = ",gS_k000~0Y0K0"; "Are you sure you want to close the ROM?" = ",gS_k0ROM0X0~0Y0K0"; /* Status Bar Messages */ "No ROM Loaded" = "ROM0Q0f0O0`0U0D0"; "Executing" = "QuW0f0D0~0Y0"; "Paused" = "000W0f0D0~0Y0"; /* Preferences Window */ "DeSmuME Preferences" = "DeSmuMEn0tX-["; "Interface" = "000000"; "Controls" = "eQR"; "DS Firmware" = "DSn00000000"; "Yes" = "o0D0"; "No" = "D0D0H0"; /* Interface Preferences */ "Execute Upon Load" = "000W0f00000"; "When Launching, Load" = "DeSmuME0O0Bf"; "Load Nothing" = "ROM0K0j0D0"; "Load Last ROM" = "gяn0ROM0O0"; /* Control Preferences */ "A Button" = "A000"; "B Button" = "B000"; "X Button" = "X000"; "Y Button" = "Y000"; "L Button" = "L000"; "R Button" = "R000"; "Up Button" = " N"; "Down Button" = " N"; "Left Button" = "]"; "Right Button" = "S"; "Start Button" = "0000"; "Select Button" = "0000"; "Up Key" = " N"; "Down Key" = " N"; "Left Key" = "]"; "Right Key" = "S"; "Space Bar" = "000000"; "Enter Key" = "0000"; /* Status Bar */ "No ROM loaded" = "ROML0eQc0f0D0~0[00"; "ROM Loaded" = "ROML0eQc0f0D0~0Y0"; "Emulation Executing" = ""; "Emulation Paused" = "\Pbk-N"; "Emulation Reset" = "0000"; /* Errors */ "Error" = "000"; "An emulation error occurred" = "00000000n0000g0-NeW0f0D0~0Y0"; desmume-0.9.9/src/cocoa/translations/Japanese.lproj/MainMenu (Legacy).strings0000644000175000017500000006523412140261564027636 0ustar guillaumeguillaume /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "About DeSmuME"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "Preferences& "; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = "Services"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = "Services"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "Hide DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Quit DeSmuME"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = "Show All"; /* Class = "NSTextFieldCell"; title = "Select Image Format:"; ObjectID = "212"; */ "212.title" = "000000:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "215"; */ "215.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "PNG"; ObjectID = "216"; */ "216.title" = "PNG"; /* Class = "NSMenuItem"; title = "BMP"; ObjectID = "217"; */ "217.title" = "BMP"; /* Class = "NSMenuItem"; title = "GIF"; ObjectID = "218"; */ "218.title" = "GIF"; /* Class = "NSMenuItem"; title = "JPEG"; ObjectID = "219"; */ "219.title" = "JPEG"; /* Class = "NSMenuItem"; title = "TIFF"; ObjectID = "220"; */ "220.title" = "TIFF"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "227"; */ "227.title" = "0000"; /* Class = "NSMenu"; title = "File"; ObjectID = "228"; */ "228.title" = "0000"; /* Class = "NSMenuItem"; title = "Open ROM& "; ObjectID = "230"; */ "230.title" = "ROM0O0& "; /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "231"; */ "231.title" = "gяD0_0ROM"; /* Class = "NSMenuItem"; title = "ROM Info..."; ObjectID = "233"; */ "233.title" = "ROMk0d0D0f0..."; /* Class = "NSMenuItem"; title = "Save State As"; ObjectID = "234"; */ "234.title" = "000000000& "; /* Class = "NSMenuItem"; title = "Load State From..."; ObjectID = "235"; */ "235.title" = "0000000000& "; /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "240"; */ "240.title" = "gяD0_0ROM"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "241"; */ "241.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Load State"; ObjectID = "252"; */ "252.title" = "00000000"; /* Class = "NSMenu"; title = "Load State"; ObjectID = "253"; */ "253.title" = "00000000"; /* Class = "NSMenuItem"; title = "Save State"; ObjectID = "255"; */ "255.title" = "000Y000000"; /* Class = "NSMenu"; title = "Save State"; ObjectID = "256"; */ "256.title" = "000Y000000"; /* Class = "NSMenuItem"; title = "Close ROM"; ObjectID = "259"; */ "259.title" = "ROM0X00"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "260"; */ "260.title" = "Edit"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "261"; */ "261.title" = "Edit"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "262"; */ "262.title" = "Undo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "263"; */ "263.title" = "Redo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "265"; */ "265.title" = "Cut"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "266"; */ "266.title" = "Copy"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "267"; */ "267.title" = "Paste"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "269"; */ "269.title" = "Delete"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "270"; */ "270.title" = "Select All"; /* Class = "NSMenuItem"; title = "Emulation"; ObjectID = "336"; */ "336.title" = "00000000"; /* Class = "NSMenu"; title = "Emulation"; ObjectID = "337"; */ "337.title" = "00000000"; /* Class = "NSMenuItem"; title = "Execute"; ObjectID = "338"; */ "338.title" = "0000"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "339"; */ "339.title" = "h:y"; /* Class = "NSMenu"; title = "View"; ObjectID = "340"; */ "340.title" = "h:y"; /* Class = "NSMenuItem"; title = "Size 1x"; ObjectID = "341"; */ "341.title" = "I{ Pn0000"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "342"; */ "342.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "343"; */ "343.title" = "Tools"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "348"; */ "348.title" = "00000"; /* Class = "NSMenu"; title = "Window"; ObjectID = "349"; */ "349.title" = "00000"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "350"; */ "350.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "351"; */ "351.title" = "Zoom"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "353"; */ "353.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "357"; */ "357.title" = "000"; /* Class = "NSMenu"; title = "Help"; ObjectID = "358"; */ "358.title" = "000"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "359"; */ "359.title" = "DeSmuME 000"; /* Class = "NSMenuItem"; title = "Go to Website"; ObjectID = "362"; */ "362.title" = "000k0LO0"; /* Class = "NSMenuItem"; title = "Go to Forums"; ObjectID = "363"; */ "363.title" = "00000k0LO0"; /* Class = "NSMenuItem"; title = "Submit a Bug Report"; ObjectID = "364"; */ "364.title" = "00n00000"; /* Class = "NSMenuItem"; title = "Show Support Folder in Finder"; ObjectID = "368"; */ "368.title" = "Show Support Folder in Finder"; /* Class = "NSWindow"; title = "DeSmuME"; ObjectID = "388"; */ "388.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "Status Text"; ObjectID = "398"; */ "398.placeholderString" = "Status Text"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "424"; */ "424.title" = "0000"; /* Class = "NSMenuItem"; title = "Speed Limit"; ObjectID = "427"; */ "427.title" = "00000000"; /* Class = "NSMenu"; title = "Speed Limit"; ObjectID = "428"; */ "428.title" = "00000000"; /* Class = "NSMenuItem"; title = "1/4 Speed"; ObjectID = "429"; */ "429.title" = "1/4 Speed"; /* Class = "NSMenuItem"; title = "Backup Media Type"; ObjectID = "430"; */ "430.title" = "Backup Media Type"; /* Class = "NSMenu"; title = "Backup Media Type"; ObjectID = "431"; */ "431.title" = "Backup Media Type"; /* Class = "NSMenuItem"; title = "Auto Detect"; ObjectID = "432"; */ "432.title" = "Auto Detect"; /* Class = "NSMenuItem"; title = "EEPROM 4kbit"; ObjectID = "434"; */ "434.title" = "EEPROM 4kbit"; /* Class = "NSMenuItem"; title = "EEPROM 64kbit"; ObjectID = "435"; */ "435.title" = "EEPROM 64kbit"; /* Class = "NSMenuItem"; title = "EEPROM 512kbit"; ObjectID = "436"; */ "436.title" = "EEPROM 512kbit"; /* Class = "NSMenuItem"; title = "FRAM 256kbit"; ObjectID = "437"; */ "437.title" = "FRAM 256kbit"; /* Class = "NSMenuItem"; title = "FLASH 2mbit"; ObjectID = "438"; */ "438.title" = "FLASH 2mbit"; /* Class = "NSMenuItem"; title = "FLASH 4mbit"; ObjectID = "439"; */ "439.title" = "FLASH 4mbit"; /* Class = "NSMenuItem"; title = "1/2 Speed"; ObjectID = "440"; */ "440.title" = "1/2 Speed"; /* Class = "NSMenuItem"; title = "3/4 Speed"; ObjectID = "441"; */ "441.title" = "3/4 Speed"; /* Class = "NSMenuItem"; title = "Normal Speed"; ObjectID = "443"; */ "443.title" = "nfn00000"; /* Class = "NSMenuItem"; title = "Double Speed"; ObjectID = "445"; */ "445.title" = " Pn00000"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "446"; */ "446.title" = "P^j0W0"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "448"; */ "448.title" = "xv0"; /* Class = "NSMenuItem"; title = "Size 2x"; ObjectID = "449"; */ "449.title" = "2 Pn0000"; /* Class = "NSMenuItem"; title = "Size 3x"; ObjectID = "450"; */ "450.title" = "3 Pn0000"; /* Class = "NSMenuItem"; title = "Size 4x"; ObjectID = "451"; */ "451.title" = "4 Pn0000"; /* Class = "NSMenuItem"; title = "No Smaller Than DS"; ObjectID = "454"; */ "454.title" = "DS00'YM0D0"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "455"; */ "455.title" = "00000000h:y"; /* Class = "NSMenuItem"; title = "Rotation"; ObjectID = "457"; */ "457.title" = "V"; /* Class = "NSMenu"; title = "Rotation"; ObjectID = "458"; */ "458.title" = "V"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "459"; */ "459.title" = "0"; /* Class = "NSMenuItem"; title = "Layers"; ObjectID = "461"; */ "461.title" = "0000"; /* Class = "NSMenu"; title = "Layers"; ObjectID = "462"; */ "462.title" = "0000"; /* Class = "NSMenuItem"; title = "Top BG0"; ObjectID = "463"; */ "463.title" = "Top BG0"; /* Class = "NSMenuItem"; title = "Save Screenshot..."; ObjectID = "465"; */ "465.title" = "0000000000000Y00& "; /* Class = "NSMenuItem"; title = "90"; ObjectID = "466"; */ "466.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "467"; */ "467.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "468"; */ "468.title" = "270"; /* Class = "NSMenuItem"; title = "Top BG1"; ObjectID = "469"; */ "469.title" = "Top BG1"; /* Class = "NSMenuItem"; title = "Top BG2"; ObjectID = "470"; */ "470.title" = "Top BG2"; /* Class = "NSMenuItem"; title = "Top BG3"; ObjectID = "471"; */ "471.title" = "Top BG3"; /* Class = "NSMenuItem"; title = "Top OBJ"; ObjectID = "472"; */ "472.title" = "Top OBJ"; /* Class = "NSMenuItem"; title = "Sub BG0"; ObjectID = "474"; */ "474.title" = "Sub BG0"; /* Class = "NSMenuItem"; title = "Sub BG1"; ObjectID = "475"; */ "475.title" = "Sub BG1"; /* Class = "NSMenuItem"; title = "Sub BG2"; ObjectID = "476"; */ "476.title" = "Sub BG2"; /* Class = "NSMenuItem"; title = "Sub BG3"; ObjectID = "477"; */ "477.title" = "Sub BG3"; /* Class = "NSMenuItem"; title = "Sub OBJ"; ObjectID = "478"; */ "478.title" = "Sub OBJ"; /* Class = "NSPanel"; title = "Custom Speed Limit Window"; ObjectID = "552"; */ "552.title" = "00000000"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "565"; */ "565.title" = "0x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "566"; */ "566.title" = "10x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "567"; */ "567.title" = "2x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "568"; */ "568.title" = "4x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "569"; */ "569.title" = "6x"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "570"; */ "570.title" = "8x"; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "571"; */ "571.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "572"; */ "572.title" = "Speed limit set to: "; /* Class = "NSTextFieldCell"; placeholderString = "speedX"; ObjectID = "573"; */ "573.placeholderString" = "speedX"; /* Class = "NSPanel"; title = "ROM Info"; ObjectID = "587"; */ "587.title" = "ROM Info"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "731"; */ "731.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ROM Size:"; ObjectID = "732"; */ "732.title" = "ROMn0000:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "733"; */ "733.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Maker:"; ObjectID = "734"; */ "734.title" = "0000:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "735"; */ "735.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Title:"; ObjectID = "736"; */ "736.title" = " TMR:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "737"; */ "737.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "File:"; ObjectID = "738"; */ "738.title" = "0000:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "745"; */ "745.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM9 Size:"; ObjectID = "746"; */ "746.title" = "ARM9n0000:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "750"; */ "750.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM7 Size:"; ObjectID = "751"; */ "751.title" = "ARM7n0000:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "755"; */ "755.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "Data Size:"; ObjectID = "756"; */ "756.title" = "000n0000:"; /* Class = "NSWindow"; title = "About DeSmuME"; ObjectID = "774"; */ "774.title" = "About DeSmuME"; /* Class = "NSTabViewItem"; label = "Read Me"; ObjectID = "779"; */ "779.label" = "f"; /* Class = "NSTabViewItem"; label = "License"; ObjectID = "780"; */ "780.label" = "00000"; /* Class = "NSTabViewItem"; label = "Authors"; ObjectID = "783"; */ "783.label" = "00000"; /* Class = "NSTabViewItem"; label = "Change Log"; ObjectID = "785"; */ "785.label" = "e\tk"; /* Class = "NSTextFieldCell"; title = "DeSmuME"; ObjectID = "788"; */ "788.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; title = "Nintendo DS Emulator"; ObjectID = "790"; */ "790.title" = "000000DSn0000000"; /* Class = "NSTextFieldCell"; placeholderString = "Version ?"; ObjectID = "792"; */ "792.placeholderString" = "Version ?"; /* Class = "NSTextFieldCell"; placeholderString = "Date"; ObjectID = "794"; */ "794.placeholderString" = "Date"; /* Class = "NSTextFieldCell"; title = "http://www.desmume.org"; ObjectID = "796"; */ "796.title" = "http://www.desmume.org"; /* Class = "NSButtonCell"; title = "Enable Speed Limiter"; ObjectID = "835"; */ "835.title" = "Enable Speed Limiter"; /* Class = "NSMenuItem"; title = "JPEG 2000"; ObjectID = "848"; */ "848.title" = "JPEG 2000"; desmume-0.9.9/src/cocoa/translations/Italian.lproj/0000755000175000017500000000000012140306213023014 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/translations/Italian.lproj/Localizable.strings0000644000175000017500000002304612140261564026666 0ustar guillaumeguillaume/* DeSmuME Strings File */ /* ITALIAN */ /* Dialog Box Titles */ "Open ROM" = "Open ROM"; "Open State File" = "Open State File"; "Save State File" = "Save State File"; "Import ROM Save File" = "Import ROM Save File"; "Export ROM Save File" = "Export ROM Save File"; "Select ROM" = "Select ROM"; "Select ADVANsCEne Database" = "Select ADVANsCEne Database"; "Select R4 Cheat Database" = "Select R4 Cheat Database"; "Select ARM7 BIOS Image" = "Select ARM7 BIOS Image"; "Select ARM9 BIOS Image" = "Select ARM9 BIOS Image"; "Select Firmware Image" = "Select Firmware Image"; "Save Screenshot" = "Save Screenshot"; /* Menus */ "Execute" = "Esegui"; "Pause" = "In Pausa"; "Disable Speed Limit" = "Disable Speed Limit"; "Enable Speed Limit" = "Enable Speed Limit"; "Disable Auto Frame Skip" = "Disable Auto Frame Skip"; "Enable Auto Frame Skip" = "Enable Auto Frame Skip"; "Disable Cheats" = "Disable Cheats"; "Enable Cheats" = "Enable Cheats"; "Disable HUD" = "Disable HUD"; "Enable HUD" = "Enable HUD"; "Hide Status Bar" = "Hide Status Bar"; "Show Status Bar" = "Mostra Barra Di Stato"; "Speed 1x" = "Speed 1x"; "Speed 2x" = "Speed 2x"; "Slot %d" = "Slot %d"; /* Alert Text */ "A critical file is missing. DeSmuME will now quit." = "A critical file is missing. DeSmuME will now quit."; "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME." = "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME."; /* Status Text */ "Ready." = "Ready."; "Save state file loading failed!" = "Save state file loading failed!"; "Save state file loaded." = "Save state file loaded."; "Save state file saving failed!" = "Save state file saving failed!"; "Save state file saved." = "Save state file saved."; "Save state file reverting failed!" = "Save state file reverting failed!"; "Save state file reverted." = "Save state file reverted."; "ROM save file import failed!" = "ROM save file import failed!"; "ROM save file imported." = "ROM save file imported."; "ROM save file export failed!" = "ROM save file export failed!"; "ROM save file exported." = "ROM save file exported."; "Loading ROM..." = "Loading ROM..."; "ROM loaded." = "ROM loaded."; "ROM loading failed!" = "ROM loading failed!"; "Unloading ROM..." = "Unloading ROM..."; "ROM unloaded." = "ROM unloaded."; "Emulator resetting..." = "Emulator resetting..."; "Emulator reset." = "Emulator reset."; "Cannot generate the save file path!" = "Cannot generate the save file path!"; "Cannot create the save directory!" = "Cannot create the save directory!"; "Speed limit disabled." = "Speed limit disabled."; "Speed limit enabled." = "Speed limit enabled."; "Auto frame skip disabled." = "Auto frame skip disabled."; "Auto frame skip enabled." = "Auto frame skip enabled."; "Cheats disabled." = "Cheats disabled."; "Cheats enabled." = "Cheats enabled."; "HUD disabled." = "HUD disabled."; "HUD enabled." = "HUD enabled."; "Volume: %1.1f%%" = "Volume: %1.1f%%"; /* ROM Info Panel */ "No ROM loaded." = "No ROM loaded."; "%i bytes" = "%i bytes"; /* Display Mode Strings */ "Main" = "Main"; "Touch" = "Touch"; "Combo" = "Combo"; /* LEGACY STRINGS */ /* General */ "DeSmuME Emulator" = "Emulatore DeSmuME"; "OK" = "OK"; "Cancel" = "Annulla"; /* File Menu */ //"Slot %d" = "Slot %d"; /* Emulation Menu */ //"Execute" = "Esegui"; //"Pause" = "Pausa"; /* View Menu */ //"Show Status Bar" = "Mostra Barra Di Stato"; "Hide Status Bar" = "Hide Status Bar"; /* Dialogs */ "Are you sure you want to quit?" = "Sei sicuro di voler uscire?"; "Are you sure you want to close the ROM?" = "Vuoi chiudere la ROM?"; /* Status Bar Messages */ "No ROM Loaded" = "Nessuna ROM Caricata"; "Executing" = "In Esecuzione"; "Paused" = "In Pausa"; /* Preferences Window */ "DeSmuME Preferences" = "Configurazione DeSmuME"; "Interface" = "Interfaccia"; "Controls" = "Controlli"; "DS Firmware" = "Firmware DS"; "Yes" = "Si"; "No" = "No"; /* Interface Preferences */ "Execute Upon Load" = "Esegui al Caricamento"; "When Launching, Load" = "All'Avvio, Carica"; "Load Nothing" = "Niente"; "Load Last ROM" = "L'Ultima ROM"; /* Control Preferences */ "A Button" = "Pulsante A"; "B Button" = "Pulsante B"; "X Button" = "Pulsante X"; "Y Button" = "Pulsante Y"; "L Button" = "Pulsante L"; "R Button" = "Pulsante R"; "Up Button" = "Su"; "Down Button" = "Gi"; "Left Button" = "Sinistra"; "Right Button" = "Destra"; "Start Button" = "Start"; "Select Button" = "Select"; "Up Key" = "[SU]"; "Down Key" = "[GIU']"; "Left Key" = "[SINISTRA]"; "Right Key" = "[DESTRA]"; "Space Bar" = "[SPAZIO]"; "Enter Key" = "[INVIO]"; /* Status Bar */ "No ROM loaded" = "Nessuna ROM Caricata"; "ROM Loaded" = "ROM Caricata"; "Emulation Executing" = "In Esecuzione"; "Emulation Paused" = "In Pausa"; "Emulation Reset" = "Reset"; /* Errors */ "Error" = "Errore"; "An emulation error occurred" = "Si verificato un errore di emulazione"; desmume-0.9.9/src/cocoa/translations/Italian.lproj/MainMenu (Legacy).strings0000644000175000017500000006647612140261564027502 0ustar guillaumeguillaume /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "About DeSmuME"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "Preferences& "; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = "Services"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = "Services"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "Hide DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Quit DeSmuME"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = "Show All"; /* Class = "NSTextFieldCell"; title = "Select Image Format:"; ObjectID = "212"; */ "212.title" = "Seleziona il Formato Immagine:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "215"; */ "215.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "PNG"; ObjectID = "216"; */ "216.title" = "PNG"; /* Class = "NSMenuItem"; title = "BMP"; ObjectID = "217"; */ "217.title" = "BMP"; /* Class = "NSMenuItem"; title = "GIF"; ObjectID = "218"; */ "218.title" = "GIF"; /* Class = "NSMenuItem"; title = "JPEG"; ObjectID = "219"; */ "219.title" = "JPEG"; /* Class = "NSMenuItem"; title = "TIFF"; ObjectID = "220"; */ "220.title" = "TIFF"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "227"; */ "227.title" = "File"; /* Class = "NSMenu"; title = "File"; ObjectID = "228"; */ "228.title" = "File"; /* Class = "NSMenuItem"; title = "Open ROM& "; ObjectID = "230"; */ "230.title" = "Apri ROM& "; /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "231"; */ "231.title" = "Apri Recente"; /* Class = "NSMenuItem"; title = "ROM Info..."; ObjectID = "233"; */ "233.title" = "ROM Info..."; /* Class = "NSMenuItem"; title = "Save State As"; ObjectID = "234"; */ "234.title" = "Salva Stato Con Nome& "; /* Class = "NSMenuItem"; title = "Load State From..."; ObjectID = "235"; */ "235.title" = "Carica Stato Da& "; /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "240"; */ "240.title" = "Apri Recente"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "241"; */ "241.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Load State"; ObjectID = "252"; */ "252.title" = "Carica Stato"; /* Class = "NSMenu"; title = "Load State"; ObjectID = "253"; */ "253.title" = "Carica Stato"; /* Class = "NSMenuItem"; title = "Save State"; ObjectID = "255"; */ "255.title" = "Salva Stato"; /* Class = "NSMenu"; title = "Save State"; ObjectID = "256"; */ "256.title" = "Salva Stato"; /* Class = "NSMenuItem"; title = "Close ROM"; ObjectID = "259"; */ "259.title" = "Chiudi ROM"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "260"; */ "260.title" = "Edit"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "261"; */ "261.title" = "Edit"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "262"; */ "262.title" = "Undo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "263"; */ "263.title" = "Redo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "265"; */ "265.title" = "Cut"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "266"; */ "266.title" = "Copy"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "267"; */ "267.title" = "Paste"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "269"; */ "269.title" = "Delete"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "270"; */ "270.title" = "Select All"; /* Class = "NSMenuItem"; title = "Emulation"; ObjectID = "336"; */ "336.title" = "Emulazione"; /* Class = "NSMenu"; title = "Emulation"; ObjectID = "337"; */ "337.title" = "Emulazione"; /* Class = "NSMenuItem"; title = "Execute"; ObjectID = "338"; */ "338.title" = "Esegui"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "339"; */ "339.title" = "Visualizza"; /* Class = "NSMenu"; title = "View"; ObjectID = "340"; */ "340.title" = "Visualizza"; /* Class = "NSMenuItem"; title = "Size 1x"; ObjectID = "341"; */ "341.title" = "Dimensione 1x"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "342"; */ "342.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "343"; */ "343.title" = "Tools"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "348"; */ "348.title" = "Finestra"; /* Class = "NSMenu"; title = "Window"; ObjectID = "349"; */ "349.title" = "Finestra"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "350"; */ "350.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "351"; */ "351.title" = "Zoom"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "353"; */ "353.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "357"; */ "357.title" = "Aiuto"; /* Class = "NSMenu"; title = "Help"; ObjectID = "358"; */ "358.title" = "Aiuto"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "359"; */ "359.title" = "DeSmuME Aiuto"; /* Class = "NSMenuItem"; title = "Go to Website"; ObjectID = "362"; */ "362.title" = "Vai al sito Web"; /* Class = "NSMenuItem"; title = "Go to Forums"; ObjectID = "363"; */ "363.title" = "Vai ai Forum"; /* Class = "NSMenuItem"; title = "Submit a Bug Report"; ObjectID = "364"; */ "364.title" = "Invia un Rapporto Bug"; /* Class = "NSMenuItem"; title = "Show Support Folder in Finder"; ObjectID = "368"; */ "368.title" = "Show Support Folder in Finder"; /* Class = "NSWindow"; title = "DeSmuME"; ObjectID = "388"; */ "388.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "Status Text"; ObjectID = "398"; */ "398.placeholderString" = "Status Text"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "424"; */ "424.title" = "Reset"; /* Class = "NSMenuItem"; title = "Speed Limit"; ObjectID = "427"; */ "427.title" = "Limite Velocit"; /* Class = "NSMenu"; title = "Speed Limit"; ObjectID = "428"; */ "428.title" = "Limite Velocit"; /* Class = "NSMenuItem"; title = "1/4 Speed"; ObjectID = "429"; */ "429.title" = "Velocit 1/4"; /* Class = "NSMenuItem"; title = "Backup Media Type"; ObjectID = "430"; */ "430.title" = "Backup Media Type"; /* Class = "NSMenu"; title = "Backup Media Type"; ObjectID = "431"; */ "431.title" = "Backup Media Type"; /* Class = "NSMenuItem"; title = "Auto Detect"; ObjectID = "432"; */ "432.title" = "Auto Detect"; /* Class = "NSMenuItem"; title = "EEPROM 4kbit"; ObjectID = "434"; */ "434.title" = "EEPROM 4kbit"; /* Class = "NSMenuItem"; title = "EEPROM 64kbit"; ObjectID = "435"; */ "435.title" = "EEPROM 64kbit"; /* Class = "NSMenuItem"; title = "EEPROM 512kbit"; ObjectID = "436"; */ "436.title" = "EEPROM 512kbit"; /* Class = "NSMenuItem"; title = "FRAM 256kbit"; ObjectID = "437"; */ "437.title" = "FRAM 256kbit"; /* Class = "NSMenuItem"; title = "FLASH 2mbit"; ObjectID = "438"; */ "438.title" = "FLASH 2mbit"; /* Class = "NSMenuItem"; title = "FLASH 4mbit"; ObjectID = "439"; */ "439.title" = "FLASH 4mbit"; /* Class = "NSMenuItem"; title = "1/2 Speed"; ObjectID = "440"; */ "440.title" = "Velocit 1/2"; /* Class = "NSMenuItem"; title = "3/4 Speed"; ObjectID = "441"; */ "441.title" = "Velocit 3/4"; /* Class = "NSMenuItem"; title = "Normal Speed"; ObjectID = "443"; */ "443.title" = "Velocit Normale"; /* Class = "NSMenuItem"; title = "Double Speed"; ObjectID = "445"; */ "445.title" = "Velocit Doppia"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "446"; */ "446.title" = "Nessuno"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "448"; */ "448.title" = "Personalizzato"; /* Class = "NSMenuItem"; title = "Size 2x"; ObjectID = "449"; */ "449.title" = "Dimensione 2x"; /* Class = "NSMenuItem"; title = "Size 3x"; ObjectID = "450"; */ "450.title" = "Dimensione 3x"; /* Class = "NSMenuItem"; title = "Size 4x"; ObjectID = "451"; */ "451.title" = "Dimensione 4x"; /* Class = "NSMenuItem"; title = "No Smaller Than DS"; ObjectID = "454"; */ "454.title" = "Non Pi Piccolo Del DS"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "455"; */ "455.title" = "Mostra Barra Di Stato"; /* Class = "NSMenuItem"; title = "Rotation"; ObjectID = "457"; */ "457.title" = "Rotazione"; /* Class = "NSMenu"; title = "Rotation"; ObjectID = "458"; */ "458.title" = "Rotazione"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "459"; */ "459.title" = "0"; /* Class = "NSMenuItem"; title = "Layers"; ObjectID = "461"; */ "461.title" = "Livelli"; /* Class = "NSMenu"; title = "Layers"; ObjectID = "462"; */ "462.title" = "Livelli"; /* Class = "NSMenuItem"; title = "Top BG0"; ObjectID = "463"; */ "463.title" = "Top BG0"; /* Class = "NSMenuItem"; title = "Save Screenshot..."; ObjectID = "465"; */ "465.title" = "Salva Scheramata& "; /* Class = "NSMenuItem"; title = "90"; ObjectID = "466"; */ "466.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "467"; */ "467.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "468"; */ "468.title" = "270"; /* Class = "NSMenuItem"; title = "Top BG1"; ObjectID = "469"; */ "469.title" = "Top BG1"; /* Class = "NSMenuItem"; title = "Top BG2"; ObjectID = "470"; */ "470.title" = "Top BG2"; /* Class = "NSMenuItem"; title = "Top BG3"; ObjectID = "471"; */ "471.title" = "Top BG3"; /* Class = "NSMenuItem"; title = "Top OBJ"; ObjectID = "472"; */ "472.title" = "Top OBJ"; /* Class = "NSMenuItem"; title = "Sub BG0"; ObjectID = "474"; */ "474.title" = "Sub BG0"; /* Class = "NSMenuItem"; title = "Sub BG1"; ObjectID = "475"; */ "475.title" = "Sub BG1"; /* Class = "NSMenuItem"; title = "Sub BG2"; ObjectID = "476"; */ "476.title" = "Sub BG2"; /* Class = "NSMenuItem"; title = "Sub BG3"; ObjectID = "477"; */ "477.title" = "Sub BG3"; /* Class = "NSMenuItem"; title = "Sub OBJ"; ObjectID = "478"; */ "478.title" = "Sub OBJ"; /* Class = "NSPanel"; title = "Custom Speed Limit Window"; ObjectID = "552"; */ "552.title" = "Imposta Limite Personalizzato"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "565"; */ "565.title" = "0x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "566"; */ "566.title" = "10x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "567"; */ "567.title" = "2x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "568"; */ "568.title" = "4x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "569"; */ "569.title" = "6x"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "570"; */ "570.title" = "8x"; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "571"; */ "571.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "572"; */ "572.title" = "Speed limit set to: "; /* Class = "NSTextFieldCell"; placeholderString = "speedX"; ObjectID = "573"; */ "573.placeholderString" = "speedX"; /* Class = "NSPanel"; title = "ROM Info"; ObjectID = "587"; */ "587.title" = "ROM Info"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "731"; */ "731.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ROM Size:"; ObjectID = "732"; */ "732.title" = "Dimensione ROM:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "733"; */ "733.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Maker:"; ObjectID = "734"; */ "734.title" = "Maker:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "735"; */ "735.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Title:"; ObjectID = "736"; */ "736.title" = "Titolo:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "737"; */ "737.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "File:"; ObjectID = "738"; */ "738.title" = "File:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "745"; */ "745.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM9 Size:"; ObjectID = "746"; */ "746.title" = "Dimensionse ARM9:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "750"; */ "750.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM7 Size:"; ObjectID = "751"; */ "751.title" = "Dimensione ARM7:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "755"; */ "755.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "Data Size:"; ObjectID = "756"; */ "756.title" = "Dimensione Dati:"; /* Class = "NSWindow"; title = "About DeSmuME"; ObjectID = "774"; */ "774.title" = "About DeSmuME"; /* Class = "NSTabViewItem"; label = "Read Me"; ObjectID = "779"; */ "779.label" = "Read Me"; /* Class = "NSTabViewItem"; label = "License"; ObjectID = "780"; */ "780.label" = "License"; /* Class = "NSTabViewItem"; label = "Authors"; ObjectID = "783"; */ "783.label" = "Authors"; /* Class = "NSTabViewItem"; label = "Change Log"; ObjectID = "785"; */ "785.label" = "Change Log"; /* Class = "NSTextFieldCell"; title = "DeSmuME"; ObjectID = "788"; */ "788.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; title = "Nintendo DS Emulator"; ObjectID = "790"; */ "790.title" = "Emulatore Nintendo DS"; /* Class = "NSTextFieldCell"; placeholderString = "Version ?"; ObjectID = "792"; */ "792.placeholderString" = "Version ?"; /* Class = "NSTextFieldCell"; placeholderString = "Date"; ObjectID = "794"; */ "794.placeholderString" = "Date"; /* Class = "NSTextFieldCell"; title = "http://www.desmume.org"; ObjectID = "796"; */ "796.title" = "http://www.desmume.org"; /* Class = "NSButtonCell"; title = "Enable Speed Limiter"; ObjectID = "835"; */ "835.title" = "Enable Speed Limiter"; /* Class = "NSMenuItem"; title = "JPEG 2000"; ObjectID = "848"; */ "848.title" = "JPEG 2000"; desmume-0.9.9/src/cocoa/translations/Chinese.lproj/0000755000175000017500000000000012140306213023011 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/translations/Chinese.lproj/Localizable.strings0000644000175000017500000002164012140261564026661 0ustar guillaumeguillaume/* DeSmuME Strings File */ /* CHINESE */ /* Dialog Box Titles */ "Open ROM" = "Open ROM"; "Open State File" = "Open State File"; "Save State File" = "Save State File"; "Import ROM Save File" = "Import ROM Save File"; "Export ROM Save File" = "Export ROM Save File"; "Select ROM" = "Select ROM"; "Select ADVANsCEne Database" = "Select ADVANsCEne Database"; "Select R4 Cheat Database" = "Select R4 Cheat Database"; "Select ARM7 BIOS Image" = "Select ARM7 BIOS Image"; "Select ARM9 BIOS Image" = "Select ARM9 BIOS Image"; "Select Firmware Image" = "Select Firmware Image"; "Save Screenshot" = "Save Screenshot"; /* Menus */ "Execute" = "bgL"; "Pause" = "fP\"; "Disable Speed Limit" = "Disable Speed Limit"; "Enable Speed Limit" = "Enable Speed Limit"; "Disable Auto Frame Skip" = "Disable Auto Frame Skip"; "Enable Auto Frame Skip" = "Enable Auto Frame Skip"; "Disable Cheats" = "Disable Cheats"; "Enable Cheats" = "Enable Cheats"; "Disable HUD" = "Disable HUD"; "Enable HUD" = "Enable HUD"; "Hide Status Bar" = "Hide Status Bar"; "Show Status Bar" = "f>y:r`h"; "Speed 1x" = "Speed 1x"; "Speed 2x" = "Speed 2x"; "Slot %d" = "[XPp %d"; /* Alert Text */ "A critical file is missing. DeSmuME will now quit." = "A critical file is missing. DeSmuME will now quit."; "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME." = "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME."; /* Status Text */ "Ready." = "Ready."; "Save state file loading failed!" = "Save state file loading failed!"; "Save state file loaded." = "Save state file loaded."; "Save state file saving failed!" = "Save state file saving failed!"; "Save state file saved." = "Save state file saved."; "Save state file reverting failed!" = "Save state file reverting failed!"; "Save state file reverted." = "Save state file reverted."; "ROM save file import failed!" = "ROM save file import failed!"; "ROM save file imported." = "ROM save file imported."; "ROM save file export failed!" = "ROM save file export failed!"; "ROM save file exported." = "ROM save file exported."; "Loading ROM..." = "Loading ROM..."; "ROM loaded." = "ROM loaded."; "ROM loading failed!" = "ROM loading failed!"; "Unloading ROM..." = "Unloading ROM..."; "ROM unloaded." = "ROM unloaded."; "Emulator resetting..." = "Emulator resetting..."; "Emulator reset." = "Emulator reset."; "Cannot generate the save file path!" = "Cannot generate the save file path!"; "Cannot create the save directory!" = "Cannot create the save directory!"; "Speed limit disabled." = "Speed limit disabled."; "Speed limit enabled." = "Speed limit enabled."; "Auto frame skip disabled." = "Auto frame skip disabled."; "Auto frame skip enabled." = "Auto frame skip enabled."; "Cheats disabled." = "Cheats disabled."; "Cheats enabled." = "Cheats enabled."; "HUD disabled." = "HUD disabled."; "HUD enabled." = "HUD enabled."; "Volume: %1.1f%%" = "Volume: %1.1f%%"; /* ROM Info Panel */ "No ROM loaded." = "No ROM loaded."; "%i bytes" = "%i bytes"; /* Display Mode Strings */ "Main" = "Main"; "Touch" = "Touch"; "Combo" = "Combo"; /* LEGACY STRINGS */ /* General */ "DeSmuME Emulator" = "DeSmuME j!bVh"; "OK" = "xn"; "Cancel" = "Sm"; /* File Menu */ //"Slot %d" = "[XPp %d"; /* Emulation Menu */ //"Execute" = "bgL"; //"Pause" = "fP\"; /* View Menu */ //"Show Status Bar" = "f>y:r`h"; "Hide Status Bar" = "Hide Status Bar"; /* Dialogs */ "Are you sure you want to quit?" = "O`xn[`󉁐Q?"; "Are you sure you want to close the ROM?" = "O`xn[`QsN*ROM?"; /* Status Bar Messages */ "No ROM Loaded" = "lg ROM}Qe"; "Executing" = "bgLN-"; "Paused" = "]fP\"; /* Preferences Window */ "DeSmuME Preferences" = "DeSmuME POY}["; "Interface" = "uLb"; "Controls" = "cR6"; "DS Firmware" = "DS VN"; "Yes" = "f/"; "No" = "T&"; /* Interface Preferences */ "Execute Upon Load" = "ŏ}TbgL"; "When Launching, Load" = "T/Re}Qe"; "Load Nothing" = "N }Qe"; "Load Last ROM" = "N k!Ou(vROM"; /* Control Preferences */ "A Button" = "A"; "B Button" = "B"; "X Button" = "X"; "Y Button" = "Y"; "L Button" = "L"; "R Button" = "R"; "Up Button" = "Up"; "Down Button" = "Down"; "Left Button" = "Left"; "Right Button" = "Right"; "Start Button" = "Start"; "Select Button" = "Select"; "Up Key" = "[UP]"; "Down Key" = "[DOWN]"; "Left Key" = "[LEFT]"; "Right Key" = "[RIGHT]"; "Space Bar" = "[SPACE]"; "Enter Key" = "[ENTER]"; /* Status Bar */ "No ROM loaded" = "lg ROM ŏ}"; "ROM Loaded" = "ROM ŏ}"; "Emulation Executing" = "bgLN-"; "Emulation Paused" = "]fP\"; "Emulation Reset" = "T/"; /* Errors */ "Error" = ""; "An emulation error occurred" = "j!bVhSuNNN*"; desmume-0.9.9/src/cocoa/translations/Chinese.lproj/MainMenu (Legacy).strings0000644000175000017500000006447612140261564027475 0ustar guillaumeguillaume /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "sQN DeSmuME"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "OP}Yn"; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = " gR"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = " gR"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "υ DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Q DeSmuME"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "υvQN z^"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = ">f:yhQ"; /* Class = "NSTextFieldCell"; title = "Select Image Format:"; ObjectID = "212"; */ "212.title" = " bVPf:y"; /* Class = "NSMenu"; title = "View"; ObjectID = "340"; */ "340.title" = ">f:y"; /* Class = "NSMenuItem"; title = "Size 1x"; ObjectID = "341"; */ "341.title" = "N PVP"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "342"; */ "342.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "343"; */ "343.title" = "Tools"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "348"; */ "348.title" = "zS"; /* Class = "NSMenu"; title = "Window"; ObjectID = "349"; */ "349.title" = "zS"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "350"; */ "350.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "351"; */ "351.title" = "Zoom"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "353"; */ "353.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "357"; */ "357.title" = ".^R"; /* Class = "NSMenu"; title = "Help"; ObjectID = "358"; */ "358.title" = ".^R"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "359"; */ "359.title" = "DeSmuME .^R"; /* Class = "NSMenuItem"; title = "Go to Website"; ObjectID = "362"; */ "362.title" = "Qz"; /* Class = "NSMenuItem"; title = "Go to Forums"; ObjectID = "363"; */ "363.title" = "[W"; /* Class = "NSMenuItem"; title = "Submit a Bug Report"; ObjectID = "364"; */ "364.title" = "cNBug"; /* Class = "NSMenuItem"; title = "Show Support Folder in Finder"; ObjectID = "368"; */ "368.title" = "Show Support Folder in Finder"; /* Class = "NSWindow"; title = "DeSmuME"; ObjectID = "388"; */ "388.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "Status Text"; ObjectID = "398"; */ "398.placeholderString" = "Status Text"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "424"; */ "424.title" = "͑/T"; /* Class = "NSMenuItem"; title = "Speed Limit"; ObjectID = "427"; */ "427.title" = "^P6R"; /* Class = "NSMenu"; title = "Speed Limit"; ObjectID = "428"; */ "428.title" = "^P6R"; /* Class = "NSMenuItem"; title = "1/4 Speed"; ObjectID = "429"; */ "429.title" = "1/4 ^"; /* Class = "NSMenuItem"; title = "Backup Media Type"; ObjectID = "430"; */ "430.title" = "Backup Media Type"; /* Class = "NSMenu"; title = "Backup Media Type"; ObjectID = "431"; */ "431.title" = "Backup Media Type"; /* Class = "NSMenuItem"; title = "Auto Detect"; ObjectID = "432"; */ "432.title" = "Auto Detect"; /* Class = "NSMenuItem"; title = "EEPROM 4kbit"; ObjectID = "434"; */ "434.title" = "EEPROM 4kbit"; /* Class = "NSMenuItem"; title = "EEPROM 64kbit"; ObjectID = "435"; */ "435.title" = "EEPROM 64kbit"; /* Class = "NSMenuItem"; title = "EEPROM 512kbit"; ObjectID = "436"; */ "436.title" = "EEPROM 512kbit"; /* Class = "NSMenuItem"; title = "FRAM 256kbit"; ObjectID = "437"; */ "437.title" = "FRAM 256kbit"; /* Class = "NSMenuItem"; title = "FLASH 2mbit"; ObjectID = "438"; */ "438.title" = "FLASH 2mbit"; /* Class = "NSMenuItem"; title = "FLASH 4mbit"; ObjectID = "439"; */ "439.title" = "FLASH 4mbit"; /* Class = "NSMenuItem"; title = "1/2 Speed"; ObjectID = "440"; */ "440.title" = "1/2 ^"; /* Class = "NSMenuItem"; title = "3/4 Speed"; ObjectID = "441"; */ "441.title" = "3/4 ^"; /* Class = "NSMenuItem"; title = "Normal Speed"; ObjectID = "443"; */ "443.title" = "ck8^^"; /* Class = "NSMenuItem"; title = "Double Speed"; ObjectID = "445"; */ "445.title" = "S P^"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "446"; */ "446.title" = "eP6R"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "448"; */ "448.title" = "1u["; /* Class = "NSMenuItem"; title = "Size 2x"; ObjectID = "449"; */ "449.title" = "$N PVP"; /* Class = "NSMenuItem"; title = "Size 3x"; ObjectID = "450"; */ "450.title" = " N PVP"; /* Class = "NSMenuItem"; title = "Size 4x"; ObjectID = "451"; */ "451.title" = "V PVP"; /* Class = "NSMenuItem"; title = "No Smaller Than DS"; ObjectID = "454"; */ "454.title" = "No Smaller Than DS"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "455"; */ "455.title" = ">f:yr`h"; /* Class = "NSMenuItem"; title = "Rotation"; ObjectID = "457"; */ "457.title" = "_s"; /* Class = "NSMenu"; title = "Rotation"; ObjectID = "458"; */ "458.title" = "_s"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "459"; */ "459.title" = "0"; /* Class = "NSMenuItem"; title = "Layers"; ObjectID = "461"; */ "461.title" = "B\"; /* Class = "NSMenu"; title = "Layers"; ObjectID = "462"; */ "462.title" = "B\"; /* Class = "NSMenuItem"; title = "Top BG0"; ObjectID = "463"; */ "463.title" = "Top BG0"; /* Class = "NSMenuItem"; title = "Save Screenshot..."; ObjectID = "465"; */ "465.title" = "OX[*bO\& "; /* Class = "NSMenuItem"; title = "90"; ObjectID = "466"; */ "466.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "467"; */ "467.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "468"; */ "468.title" = "270"; /* Class = "NSMenuItem"; title = "Top BG1"; ObjectID = "469"; */ "469.title" = "Top BG1"; /* Class = "NSMenuItem"; title = "Top BG2"; ObjectID = "470"; */ "470.title" = "Top BG2"; /* Class = "NSMenuItem"; title = "Top BG3"; ObjectID = "471"; */ "471.title" = "Top BG3"; /* Class = "NSMenuItem"; title = "Top OBJ"; ObjectID = "472"; */ "472.title" = "Top OBJ"; /* Class = "NSMenuItem"; title = "Sub BG0"; ObjectID = "474"; */ "474.title" = "Sub BG0"; /* Class = "NSMenuItem"; title = "Sub BG1"; ObjectID = "475"; */ "475.title" = "Sub BG1"; /* Class = "NSMenuItem"; title = "Sub BG2"; ObjectID = "476"; */ "476.title" = "Sub BG2"; /* Class = "NSMenuItem"; title = "Sub BG3"; ObjectID = "477"; */ "477.title" = "Sub BG3"; /* Class = "NSMenuItem"; title = "Sub OBJ"; ObjectID = "478"; */ "478.title" = "Sub OBJ"; /* Class = "NSPanel"; title = "Custom Speed Limit Window"; ObjectID = "552"; */ "552.title" = "^P6R["; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "565"; */ "565.title" = "0x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "566"; */ "566.title" = "10x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "567"; */ "567.title" = "2x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "568"; */ "568.title" = "4x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "569"; */ "569.title" = "6x"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "570"; */ "570.title" = "8x"; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "571"; */ "571.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "572"; */ "572.title" = "Speed limit set to: "; /* Class = "NSTextFieldCell"; placeholderString = "speedX"; ObjectID = "573"; */ "573.placeholderString" = "speedX"; /* Class = "NSPanel"; title = "ROM Info"; ObjectID = "587"; */ "587.title" = "ROM Info"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "731"; */ "731.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ROM Size:"; ObjectID = "732"; */ "732.title" = "ĉ 1050 10K549 851 1038.36 461.00 com.apple.InterfaceBuilder.CocoaPlugin 851 YES YES com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion YES NSApplication FirstResponder NSApplication MainMenu YES DeSmuME 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: DeSmuME YES About DeSmuME 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide DeSmuME h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit DeSmuME q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New Display Window n 1048576 2147483647 Load ROM… o 1048576 2147483647 Load Recent ROM 1048576 2147483647 submenuAction: Load Recent ROM YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close Window w 1048576 2147483647 Unload ROM w 1572864 2147483647 YES YES 2147483647 ROM Info i 1048576 2147483647 Reveal ROM in Finder 2147483647 Reveal Game Data Folder in Finder 2147483647 YES YES 2147483647 Open State File... O 1048576 2147483647 Close State File W 1048576 2147483647 Save State File s 1048576 2147483647 Save State File As… S 1179648 2147483647 Revert State File to Saved 2147483647 YES YES 1048576 2147483647 Load State Slot 2147483647 submenuAction: Load State Slot YES Save State Slot 2147483647 submenuAction: Save State Slot YES YES YES 2147483647 Import ROM Save File... 2147483647 Export ROM Save File... 2147483647 Edit 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1048576 2147483647 YES YES 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Delete 2147483647 Select All a 1048576 2147483647 Emulation 2147483647 submenuAction: Emulation YES Speed Limit 2147483647 submenuAction: Speed Limit YES Half 2147483647 50 Normal 2147483647 100 Double 2147483647 200 YES YES 2147483647 -1 Custom... 2147483647 -1 Disable Speed Limit 2147483647 YES YES 2147483647 Disable Auto Frame Skip 2147483647 YES YES 2147483647 Show Cheat Manager... 2147483647 Disable Cheats 2147483647 YES YES 2147483647 Execute 2147483647 Reset 2147483647 YES YES 2147483647 Show SLOT-1 Manager... 2147483647 ROM Save Type 2147483647 submenuAction: ROM Save Type YES Automatic 2147483647 YES YES 2147483647 -1 EEPROM 4Kb 2147483647 1 EEPROM 64Kb 2147483647 2 EEPROM 512Kb 2147483647 3 FRAM 256Kb 2147483647 4 FLASH 2Mb 2147483647 5 FLASH 4Mb 2147483647 6 FLASH 8Mb 2147483647 7 FLASH 16Mb 2147483647 8 FLASH 32Mb 2147483647 9 FLASH 64Mb 2147483647 10 FLASH 128Mb 2147483647 11 FLASH 256Mb 2147483647 12 FLASH 512Mb 2147483647 13 View 1048576 2147483647 submenuAction: View YES Display Mode 2147483647 submenuAction: Display Mode YES Main 2147483647 Touch 2147483647 1 Combo 2147483647 2 Display Size 2147483647 submenuAction: Display Size YES 1x 2147483647 100 2x 2147483647 200 3x 2147483647 300 4x 2147483647 400 5x 2147483647 500 Display Rotation 2147483647 submenuAction: Display Rotation YES Rotate Left 2147483647 -90 Rotate Right 2147483647 90 YES YES 2147483647 2147483647 90º 2147483647 90 180º 2147483647 180 270º 2147483647 270 YES YES 2147483647 Custom... 2147483647 -1 Display Orientation 2147483647 submenuAction: Display Orientation YES Vertical 2147483647 Horizontal 2147483647 1 Display Order 2147483647 submenuAction: Display Order YES Main Screen First 2147483647 Touch Screen First 2147483647 1 Display Separation 2147483647 submenuAction: Display Separation YES 0% 2147483647 50% 2147483647 50 100% 2147483647 100 150% 2147483647 150 200% 2147483647 200 YES YES 2147483647 Custom... 2147483647 -1 YES YES 2147483647 Show Display Video Settings... 2147483647 Show 3D Rendering Settings... 2147483647 Show Emulation Settings... 2147483647 Show Sound Settings... 2147483647 YES YES 2147483647 Keep Minimum Display Size at 1x 2147483647 Show Status Bar / 1048576 2147483647 YES YES 2147483647 Show Toolbar t 1572864 2147483647 Customize Toolbar… 1048576 2147483647 Tools 2147483647 submenuAction: Tools YES Save Screenshot As... 2147483647 YES YES 2147483647 Show GPU Layers... 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 2147483647 submenuAction: Help YES DeSmuME Help ? 1048576 2147483647 YES YES 2147483647 Go to Website... 2147483647 Go to Forums... 2147483647 Submit a Support Request... 2147483647 Submit a Bug Report... 2147483647 _NSHelpMenu _NSMainMenu Media 2147483647 submenuAction: Media YES New Movie Recording 2147483647 Open Movie... 2147483647 Open Recent Movie 2147483647 submenuAction: Open Recent Movie YES Clear Menu 2147483647 Close Movie 2147483647 AppDelegate EmuControllerDelegate InputManager 15 2 {{81, 659}, {550, 450}} 1148716032 About DeSmuME NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 302}, {128, 128}} YES 130560 33554432 NSImage NSApplicationIcon 0 1 0 NO YES 18 {{13, 10}, {524, 290}} YES 1 256 YES 274 YES 2304 YES 2322 {490, 14} YES 6 490 1 10245 0 3 MQA YES YES NSBackgroundColor NSColor YES 6 System selectedTextBackgroundColor 3 MC42NjY2NjY2NjY3AA 6 System selectedTextColor 3 MAA YES YES NSColor NSCursor NSUnderline YES 1 MCAwIDEAA {8, -8} 13 6 {495, 1e+07} {148, 0} {490, 244} {4, -5} 1 2 256 {{490, 0}, {15, 244}} _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {505, 244}} 16 {{10, 33}, {504, 244}} Read Me 6 System controlColor 2 256 YES 274 YES 2304 YES 2322 {490, 14} YES 6 490 1 10245 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {490, 1e+07} {223, 0} {490, 244} 2 256 {{490, 0}, {15, 244}} _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {505, 244}} 16 {{10, 33}, {504, 244}} License Item 2 256 YES 274 YES 2304 YES 2322 {490, 14} YES 6 490 1 10245 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {490, 1e+07} {223, 0} {490, 244} 2 256 {{490, 0}, {15, 244}} _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {505, 244}} 16 {{10, 33}, {504, 244}} Authors Item 3 256 YES 274 YES 2304 YES 2322 {490, 14} YES 6 490 1 10245 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {490, 1e+07} {223, 0} {490, 244} 2 256 {{490, 0}, {15, 244}} _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {505, 244}} 16 {{10, 33}, {504, 244}} Change Log LucidaGrande 13 1044 0 YES YES YES 270 {{153, 374}, {380, 56}} YES 69336577 4198400 App Description 6 System controlTextColor 270 {{156, 302}, {374, 64}} YES 73530881 4329472 LucidaGrande 11 3100 Build Info YES {550, 450} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 7 2 {{121, 962}, {400, 100}} 1685588992 DeSmuME Preferences NSWindow 7F8262D5-9D3C-423C-B7C5-79385DDE5A70 YES YES NO NO 1 1 YES YES 8DD2F943-8717-4EC3-A3C5-30068405F029 A9C4AA28-77F8-4AD3-96D8-A67306997B4C AC584A31-E187-4BC3-9981-D18A2C8553F7 C9B4F2D8-9F6E-4ED5-84C7-E13EB3484A3A E30B98EC-D044-488C-A4E0-5BCE53366462 NSToolbarFlexibleSpaceItem NSToolbarSpaceItem YES 8DD2F943-8717-4EC3-A3C5-30068405F029 Input Input NSImage Icon_Input_420x420 {0, 0} {0, 0} YES YES -1 YES 0 A9C4AA28-77F8-4AD3-96D8-A67306997B4C General General NSImage NSPreferencesGeneral {0, 0} {0, 0} YES YES -1 YES 0 AC584A31-E187-4BC3-9981-D18A2C8553F7 Emulation Emulation NSImage Icon_Emulation_420x420 {0, 0} {0, 0} YES YES -1 YES 0 C9B4F2D8-9F6E-4ED5-84C7-E13EB3484A3A Sound Sound NSImage Icon_Speaker_420x420 {0, 0} {0, 0} YES YES -1 YES 0 E30B98EC-D044-488C-A4E0-5BCE53366462 Display Display NSImage Icon_ShowHUD_420x420 {0, 0} {0, 0} YES YES -1 YES 0 NSToolbarFlexibleSpaceItem Flexible Space {1, 5} {20000, 32} YES YES -1 YES 0 YES YES 1048576 2147483647 NSToolbarSpaceItem Space {32, 5} {32, 32} YES YES -1 YES 0 YES YES 1048576 2147483647 YES YES YES {1.79769e+308, 1.79769e+308} 256 {400, 100} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 268 YES 12 YES 274 YES 268 {{175, 50}, {199, 21}} 2 YES 613547584 272634880 File Name 268 {{376, 43}, {96, 32}} YES 67239424 134217728 Choose... -2038284033 129 200 25 268 {{15, 53}, {155, 17}} YES 68288064 71304192 ADVANsCEne Database: 268 {{15, 14}, {454, 28}} YES 69336577 138543104 WW91IGNhbiBkb3dubG9hZCB0aGUgbGF0ZXN0IEFEVkFOc0NFbmUgRGF0YWJhc2UgZnJvbToKaHR0cDov L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA {{1, 1}, {484, 81}} {{17, 16}, {486, 97}} {0, 0} 67239424 0 ADVANsCEne Database 6 System textBackgroundColor 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{148, 14}, {226, 21}} 2 YES 613547584 272634880 File Name 268 {{376, 7}, {96, 32}} YES 67239424 134217728 Choose... -2038284033 129 200 25 268 {{15, 17}, {128, 17}} YES 68288064 71304192 R4 Cheat Database: {{1, 1}, {484, 45}} {{17, 117}, {486, 61}} {0, 0} 67239424 0 Cheat Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{92, 12}, {314, 18}} YES 67239424 0 Do not show File Migration window on startup 1211912703 2 NSImage NSSwitch NSSwitch 200 25 268 {{141, 33}, {217, 32}} YES 67239424 134217728 Show File Migration Window -2038284033 129 200 25 {{1, 1}, {484, 75}} {{17, 182}, {486, 91}} {0, 0} 67239424 0 User File Migration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{16, 111}, {366, 18}} 2 YES -2080244224 0 Automatically Execute Emulation When Loading a ROM 1211912703 2 200 25 268 {{16, 71}, {274, 18}} 2 YES 67239424 0 Automatically Load a ROM Upon Launch 1211912703 2 200 25 268 {{34, 41}, {227, 26}} 2 YES -2076049856 2048 109199615 129 400 75 Load Last Loaded ROM 1048576 2147483647 1 _popUpItemAction: YES OtherViews YES Load Selected ROM 1048576 2147483647 _popUpItemAction: 1 1 YES YES 2 268 {{114, 14}, {260, 21}} 2 YES 613547584 272634880 ROM Name 268 {{376, 7}, {96, 32}} YES 67239424 134217728 Choose... -2038284033 129 200 25 268 {{15, 17}, {94, 17}} YES 68288064 71304192 Selected ROM: {{1, 1}, {484, 137}} 2 {{17, 277}, {486, 153}} 2 {0, 0} 67239424 0 ROM Behavior 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {520, 450} 2 NSView 268 YES 268 {{97, 463}, {96, 17}} YES 68288064 71304192 Saved Profiles: 268 {{195, 457}, {265, 26}} YES -2076049856 2048 109199615 129 400 75 New... 2147483647 1 NSImage NSActionTemplate _popUpItemAction: -1 YES InputConfigurationMenu YES YES YES 2147483647 _popUpItemAction: YES 1 1 YES YES 2 268 {{462, 457}, {116, 26}} YES -2076049856 134219776 -2038284033 129 LucidaGrande 13 16 400 75 YES Actions 1048576 2147483647 1 _popUpItemAction: YES OtherViews YES View 2147483647 _popUpItemAction: Apply 2147483647 _popUpItemAction: YES YES 2147483647 _popUpItemAction: YES Rename 2147483647 _popUpItemAction: YES Save 1048576 2147483647 _popUpItemAction: YES YES 2147483647 _popUpItemAction: YES Delete 1048576 2147483647 _popUpItemAction: YES YES 1 YES YES 2 274 YES 2304 YES 256 {640, 394} YES 256 {640, 17} -2147483392 {{584, 0}, {16, 17}} YES InputCommandTagColumn 155 16 1000 75628096 2048 Set Command 3 MC4zMzMzMzI5ODU2AA 6 System headerTextColor 67239424 131072 Command -2034482945 100 200 25 3 YES InputDeviceColumn 175 10 3.4028234663852886e+38 75628096 2048 Input Device 6 System headerColor 69336641 137216 Text Cell 6 System controlBackgroundColor 3 YES InputSettingsSummaryColumn 136 10 3.4028234663852886e+38 75628096 2048 Input Settings Summary 69336641 137216 Text Cell 3 YES InputSettingsColumn 69 10 3.4028234663852886e+38 75628096 2048 604110336 134348800 Settings -2035007233 36 200 25 RemoveInputColumn 67 10 3.4028234663852886e+38 75628096 2048 67239424 134348800 Remove -2035007233 36 200 25 3 2 6 System gridColor 3 MC41AA 17 1402994688 InputPreferences 0 15 0 NO 0 NO YES {{1, 17}, {640, 394}} 4 -2147483392 {{584, 17}, {15, 102}} _doScroller: 0.96411483253588515 -2147483392 {{1, 420}, {624, 15}} 1 _doScroller: 0.99843505477308292 2304 YES {{1, 0}, {640, 17}} 4 {{-1, 37}, {642, 412}} 562 QSAAAEEgAABBmAAAQZgAAA {{197, 12}, {247, 17}} YES 605158976 171971584 Click this area to map mouse input. LucidaGrande-Bold 13 16 {640, 495} InputPrefsView 268 YES 12 {{13, 10}, {463, 401}} YES 1 256 YES 12 YES 274 YES 268 {{72, 44}, {84, 17}} YES 68288064 71304192 Display Size: 268 {{44, 16}, {112, 17}} YES 68288064 71304192 Display Rotation: 268 {{158, 38}, {126, 26}} YES -2076049856 2048 109199615 129 400 75 1x 2147483647 1 _popUpItemAction: 100 YES OtherViews YES 2x 2147483647 _popUpItemAction: 200 3x 2147483647 _popUpItemAction: 300 4x 2147483647 _popUpItemAction: 400 5x 2147483647 _popUpItemAction: 500 1 YES YES 2 268 {{289, 14}, {72, 22}} YES -1804468671 71304192 YES YES allowsFloats formatterBehavior locale maximum maximumIntegerDigits minimum negativeInfinitySymbol nilSymbol numberStyle positiveFormat positiveInfinitySymbol usesGroupingSeparator YES -∞ #0.##º +∞ #0.##º #0.##º NaN YES YES 3 YES YES YES . , NO NO YES YES 6 System textColor 268 {{63, 72}, {93, 17}} YES 68288064 71304192 Display Mode: 268 {{158, 66}, {126, 26}} YES -2076049856 2048 109199615 129 400 75 Combo 2147483647 1 _popUpItemAction: 2 YES OtherViews YES Main 2147483647 _popUpItemAction: Touch 2147483647 _popUpItemAction: 1 YES 2 1 YES YES 2 268 {{158, 11}, {126, 26}} YES -2076049856 2048 109199615 129 400 75 1048576 2147483647 1 _popUpItemAction: YES OtherViews YES 90º 1048576 2147483647 _popUpItemAction: 90 180º 1048576 2147483647 _popUpItemAction: 180 270º 2147483647 _popUpItemAction: 270 YES YES 2147483647 1 _popUpItemAction: Custom 2147483647 _popUpItemAction: -1 1 YES YES 2 {{1, 1}, {429, 100}} {{6, 206}, {431, 116}} {0, 0} 67239424 0 General Settings 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 12 YES 274 YES 268 {{18, 14}, {100, 38}} YES 2 1 YES -2080244224 0 Vertical 1211912703 0 NSRadioButton 200 25 67239424 0 Horizontal 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 3 MCAwAA 400 75 {100, 18} {4, 2} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 {{1, 1}, {194, 62}} {{15, 53}, {196, 78}} {0, 0} 67239424 0 Display Orientation 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{18, 14}, {150, 38}} YES 2 1 YES -2080244224 0 Main Screen First 1211912703 0 200 25 67239424 0 Touch Screen First 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {150, 18} {4, 2} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 {{1, 1}, {194, 62}} {{218, 53}, {196, 78}} {0, 0} 67239424 0 Display Order 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{15, 18}, {126, 17}} YES 68288064 4195328 Display Separation: 268 {{339, 16}, {72, 22}} YES -1804468671 71304192 YES YES allowsFloats formatterBehavior locale maximum maximumIntegerDigits minimum multiplier negativeFormat negativeInfinitySymbol nilSymbol numberStyle positiveFormat positiveInfinitySymbol usesGroupingSeparator YES #0.#% -∞ #0.#% +∞ #0.#% #0.#% NaN 3 YES YES YES . , NO NO YES YES 268 {{144, 12}, {189, 26}} YES -2079981824 0 200 0.0 0.0 0.0 5 1 NO NO 268 {{305, 38}, {38, 11}} YES 68288064 138675200 200% LucidaGrande 9 3614 268 {{263, 38}, {38, 11}} YES 68288064 138675200 150% 268 {{220, 38}, {38, 11}} YES 68288064 138675200 100% 268 {{178, 38}, {38, 11}} YES 68288064 138675200 50% 268 {{137, 38}, {38, 11}} YES 68288064 138675200 0% {{1, 1}, {429, 141}} {{6, 45}, {431, 157}} {0, 0} 67239424 0 Combo Display Layout 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {{10, 33}, {443, 355}} Display Views 2 256 YES 268 {{118, 278}, {151, 26}} YES -2076049856 2048 109199615 129 400 75 None 2147483647 1 _popUpItemAction: YES OtherViews YES LQ2x 2147483647 _popUpItemAction: 1 LQ2xS 2147483647 _popUpItemAction: 2 HQ2x 2147483647 _popUpItemAction: 3 HQ2xS 2147483647 _popUpItemAction: 4 HQ4x 2147483647 _popUpItemAction: 5 HQ4xS 2147483647 _popUpItemAction: 18 2xSaI 2147483647 _popUpItemAction: 6 Super 2xSaI 2147483647 _popUpItemAction: 7 Super Eagle 2147483647 _popUpItemAction: 8 Scanline 2147483647 _popUpItemAction: 9 Bilinear 2147483647 _popUpItemAction: 10 Nearest 2x 2147483647 _popUpItemAction: 11 Nearest 1.5x 2147483647 _popUpItemAction: 12 Nearest+ 1.5x 2147483647 _popUpItemAction: 13 EPX 2147483647 _popUpItemAction: 14 EPX+ 2147483647 _popUpItemAction: 15 EPX 1.5x 2147483647 _popUpItemAction: 16 EPX+ 1.5x 2147483647 _popUpItemAction: 17 YES 1 YES YES 2 268 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{118, 9}, {262, 262}} YES 604110336 33554432 0 3 2 NO YES 268 {{10, 251}, {106, 17}} YES 68288064 71304192 Preview: 268 {{10, 284}, {106, 17}} YES 68288064 71304192 Video Filter: 268 {{119, 328}, {196, 18}} YES -2080244224 0 Use Bilinear Filtered Output 1211912703 2 200 25 268 {{119, 308}, {154, 18}} YES 67239424 0 Use Vertical Sync 1211912703 2 200 25 {{10, 33}, {443, 355}} Video Output 4 256 YES 12 YES 274 YES 268 {{16, 82}, {239, 18}} YES -2080244224 0 High-Precision Color Interpolation 1211912703 2 200 25 268 {{16, 62}, {154, 18}} YES -2080244224 0 Enable Edge Marking 1211912703 2 200 25 268 {{16, 42}, {91, 18}} YES -2080244224 0 Enable Fog 1211912703 2 200 25 268 {{215, 14}, {60, 22}} YES -1804468671 71304192 YES YES allowsFloats attributedStringForZero currencyDecimalSeparator currencySymbol decimalSeparator exponentSymbol formatterBehavior generatesDecimalNumbers groupingSeparator internationalCurrencySymbol lenient locale maximumFractionDigits maximumIntegerDigits minimumFractionDigits minusSign negativeFormat negativeInfinitySymbol negativePrefix negativeSuffix nilSymbol notANumberSymbol numberStyle paddingCharacter perMillSymbol percentSymbol plusSign positiveFormat positiveInfinitySymbol positivePrefix positiveSuffix roundingIncrement roundingMode usesGroupingSeparator YES 0 . ¤ . E , ¤¤ - # -∞ - NaN * % + # +∞ # # NaN 0 0 YES NO 1 AAAAAAAAAAAAAAAAAAAAAA 3 YES YES YES . , NO NO NO YES 268 {{15, 16}, {195, 17}} YES 68288064 71304192 Depth Comparison Threshold: 268 {{276, 11}, {19, 27}} YES 68025888 0 100 1 YES {{1, 1}, {310, 108}} {{64, 110}, {312, 124}} {0, 0} 67239424 0 SoftRasterizer Options 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{207, 318}, {169, 26}} YES -2076049856 2048 109199615 129 400 75 SoftRasterizer 2147483647 1 _popUpItemAction: 1 YES OtherViews YES None 2147483647 _popUpItemAction: OpenGL 2147483647 _popUpItemAction: 2 1 1 YES YES 2 268 {{37, 324}, {168, 17}} YES 68288064 71304192 3D Rendering Engine: 268 {{195, 13}, {181, 26}} YES -2076049856 2048 109199615 129 400 75 Automatic 2147483647 1 _popUpItemAction: YES OtherViews YES Single-Threaded 2147483647 _popUpItemAction: 1 2 Threads 2147483647 _popUpItemAction: 2 4 Threads 2147483647 _popUpItemAction: 4 8 Threads 2147483647 _popUpItemAction: 8 1 YES YES 2 268 {{37, 19}, {156, 17}} YES 68288064 71304192 Rendering Threads: 12 YES 274 YES 268 {{16, 32}, {129, 18}} YES -2080244224 0 Enable Line Hack 1211912703 2 200 25 268 {{16, 12}, {124, 18}} YES -2080244224 0 Enable Textures 1211912703 2 200 25 {{1, 1}, {310, 58}} {{64, 238}, {312, 74}} {0, 0} 67239424 0 General Settings 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 256 YES 268 {{16, 12}, {223, 18}} YES 67239424 0 Enable Multisample Antialiasing 1211912703 2 200 25 {{1, 1}, {310, 38}} {{64, 52}, {312, 54}} {0, 0} 67239424 0 OpenGL Options 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {{10, 33}, {443, 355}} 3D Rendering 0 YES YES YES {489, 425} NSView 268 YES 268 {{163, 329}, {220, 26}} YES -2076049856 2048 109199615 129 400 75 OS X Core Audio 1048576 2147483647 1 _popUpItemAction: 58325 YES OtherViews YES None 1048576 2147483647 _popUpItemAction: 1 1 YES YES 2 268 {{17, 335}, {144, 17}} YES 68288064 272630784 Audio Output Engine: 12 YES 274 YES 268 {{16, 12}, {148, 18}} YES -2080244224 0 Advanced SPU Logic 1211912703 2 200 25 {{1, 1}, {364, 38}} {{17, 209}, {366, 54}} {0, 0} 67239424 0 SPU Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{18, 15}, {180, 46}} YES 2 1 YES 67239424 0 Dual SPU Synch/Asynch 1211912703 0 200 25 -2080244224 0 Synchronous 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {180, 18} {4, 10} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 1 268 {{145, 10}, {204, 26}} YES -2076049856 2048 109199615 129 400 75 "P" Method 1048576 2147483647 1 _popUpItemAction: 2 YES OtherViews YES "N" Method 1048576 2147483647 _popUpItemAction: "Z" Method 1048576 2147483647 _popUpItemAction: 1 2 1 YES YES 2 {{1, 1}, {364, 71}} {{17, 16}, {366, 87}} {0, 0} 67239424 0 SPU Sound Synchronization Method 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{18, 14}, {328, 58}} YES 3 1 YES 67239424 0 None 1211912703 0 200 25 67239424 0 Linear 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 -2080244224 0 Cosine 2 1211912703 0 400 75 {328, 18} {4, 2} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 2 {{1, 1}, {364, 82}} {{17, 107}, {366, 98}} {0, 0} 67239424 0 SPU Interpolation Method 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{44, 13}, {246, 21}} YES 67501824 0 100 0.0 100 0.0 0 1 NO NO 268 {{293, 17}, {56, 17}} YES 68288064 71308288 YES YES allowsFloats alwaysShowsDecimalSeparator formatterBehavior lenient locale maximumFractionDigits minimumFractionDigits multiplier negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol usesGroupingSeparator YES -∞ +∞ #0.0% #0.0% NaN 3 YES YES YES . , NO NO YES %1.1f%% 289 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{18, 14}, {20, 20}} YES 130560 33554432 NSImage Icon_VolumeFull_16x16 0 2 0 YES YES {{1, 1}, {364, 44}} {{17, 267}, {366, 60}} {0, 0} 67239424 0 General Settings 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {400, 373} NSView 268 YES 12 {{13, 10}, {528, 349}} YES 1 256 YES 12 YES 274 YES 268 {{16, 32}, {197, 18}} YES -2080244224 0 Advanced Bus-Level Timing 1211912703 2 200 25 268 {{16, 12}, {217, 18}} YES 67239424 0 Rigorous 3D Rendering Timing 1211912703 2 200 25 {{1, 1}, {494, 58}} {{6, 229}, {496, 74}} {0, 0} 67239424 0 Emulation Timing 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 256 YES 268 {{18, 14}, {165, 38}} YES 2 1 YES -2080244224 0 Interpreter 1211912703 0 200 25 67239424 0 Dynamic Recompiler 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {165, 18} {4, 2} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 268 {{243, 15}, {72, 17}} YES 68288064 71304192 Block Size: 268 {{320, 13}, {50, 22}} YES -1804468671 71304192 YES YES allowsFloats formatterBehavior locale maximum maximumFractionDigits minimum negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol usesGroupingSeparator YES -∞ +∞ #0 #0 NaN 3 YES YES YES . , NO NO NO YES 268 {{371, 10}, {19, 27}} YES 68025888 0 12 1 100 1 YES {{1, 1}, {494, 62}} {{6, 147}, {496, 78}} {0, 0} 67239424 0 CPU Emulation Engine 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{16, 32}, {145, 18}} YES 67239424 0 Use Debug Console 1211912703 2 200 25 268 {{16, 12}, {118, 18}} YES 67239424 0 Emulate Ensata 1211912703 2 200 25 {{1, 1}, {494, 58}} {{6, 69}, {496, 74}} {0, 0} 67239424 0 Debugger Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{16, 12}, {462, 18}} YES -2080244224 0 Use ADVANsCEne Database when auto-detecting the ROM save type 1211912703 2 200 25 {{1, 1}, {494, 38}} {{6, 11}, {496, 54}} {0, 0} 67239424 0 ROM Save Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {{10, 33}, {508, 303}} General Settings 2 256 YES 12 YES 274 YES 268 {{16, 117}, {182, 18}} YES 67239424 0 Use External BIOS Images 1211912703 2 200 25 268 {{140, 86}, {240, 22}} YES -2070806976 272634880 Set BIOS Image... YES 268 {{15, 89}, {120, 17}} YES 68288064 272630784 ARM9 BIOS Image: 268 {{382, 80}, {100, 32}} YES 67239424 134217728 Choose... -2038284033 129 200 25 268 {{140, 59}, {240, 22}} YES -2070806976 272634880 Set BIOS Image... YES 268 {{15, 62}, {120, 17}} YES 68288064 272630784 ARM7 BIOS Image: 268 {{382, 53}, {100, 32}} YES 67239424 134217728 Choose... -2038284033 129 200 25 268 {{16, 32}, {230, 18}} YES -1543373312 0 Emulate BIOS Software Interrupts 1211912703 2 200 25 268 {{16, 12}, {236, 18}} YES 604110336 0 Patch DelayLoop SWI (speed hack) 1211912703 2 200 25 {{1, 1}, {494, 143}} {{6, 144}, {496, 159}} {0, 0} 67239424 0 BIOS Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{16, 61}, {205, 18}} YES 604110336 0 Use External Firmware Image 1211912703 2 200 25 268 {{140, 33}, {240, 22}} YES -2070806976 272634880 Set Firmware Image... YES 268 {{15, 37}, {120, 17}} YES 68288064 272630784 Firmware Image: 268 {{382, 27}, {100, 32}} YES 67239424 134217728 Choose... -2038284033 129 200 25 268 {{16, 12}, {149, 18}} YES 604110336 0 Boot From Firmware 1211912703 2 200 25 268 {{12, 81}, {229, 32}} YES 67239424 134217728 Configure Internal Firmware... -2038284033 129 200 25 {{1, 1}, {494, 119}} {{6, 5}, {496, 135}} {0, 0} 67239424 0 Firmware Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {{10, 33}, {508, 303}} BIOS and Firmware 0 YES YES YES {554, 373} NSView PreferencesWindowDelegate 9 2 {{235, 426}, {620, 442}} 1685586944 Input Profile NSWindow {1.79769e+308, 1.79769e+308} {620, 180} 256 YES 274 YES 2304 YES 256 {620, 304} YES 256 {620, 17} -2147483392 {{584, 0}, {16, 17}} YES InputCommandIconColumn 35 16 3.4028234663852886e+38 75628096 2048 67239424 33685504 0 3 0 NO InputCommandTagColumn 181 16 1000 75628096 2048 Command 3 MC4zMzMzMzI5ODU2AA 67239488 272761856 Text 3 YES InputDeviceColumn 222 10 3.4028234663852886e+38 75628096 2048 Input Device 69336641 137216 Text Cell 3 YES InputSettingsSummaryColumn 151 10 3.4028234663852886e+38 75628096 2048 Input Settings Summary 69336641 137216 Text Cell 3 YES 3 2 17 1386217472 0 15 0 NO 0 NO {{1, 17}, {620, 304}} 4 -2147483392 {{584, 17}, {15, 102}} _doScroller: 0.95844875346260383 -2147483392 {{1, 325}, {599, 15}} 1 _doScroller: 0.99667221297836939 2304 YES {{1, 0}, {620, 17}} 4 {{-1, 60}, {622, 322}} 562 QSAAAEEgAABBmAAAQZgAAA 268 {{19, 419}, {72, 14}} YES 68288064 272761856 Profile Name 289 {{510, 12}, {96, 32}} YES 67239424 134217728 Close -2038284033 129 DQ 200 25 266 {{20, 396}, {392, 22}} YES -1804468671 272630784 YES 292 {{14, 12}, {236, 32}} YES 67239424 134217728 Apply to Current Configuration -2038284033 129 200 25 265 {{510, 390}, {96, 32}} YES 67239424 134217728 Next -2038284033 129 200 25 265 {{414, 390}, {96, 32}} YES 67239424 134217728 Previous -2038284033 129 200 25 292 {{250, 12}, {96, 32}} YES 67239424 134217728 Delete -2038284033 129 200 25 {620, 442} {{0, 0}, {1920, 1178}} {620, 202} {1.79769e+308, 1.79769e+308} 1 2 {{235, 444}, {452, 115}} 1685586944 Input Profile Rename NSWindow {1.79769e+308, 1.79769e+308} 256 YES 266 {{20, 48}, {412, 22}} YES -1804468671 272630784 YES 268 {{342, 12}, {96, 32}} 1 YES 67239424 134217728 OK -2038284033 129 DQ 200 25 268 {{17, 78}, {215, 17}} YES 68288064 272630784 Enter a new name for this profile: {452, 115} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 1 2 {{235, 292}, {620, 267}} 1685586944 InputSettingsMicrophone NSWindow {1.79769e+308, 1.79769e+308} 256 YES 12 YES 274 YES 268 {{18, 14}, {190, 126}} YES 4 1 YES -2080244224 0 Internal Noise Samples 1 1211912703 0 200 25 67239424 0 White Noise 3 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67239424 0 Sine Wave 5 1211912703 0 400 75 67239424 0 Audio File 2 1211912703 0 400 75 {190, 30} {4, 2} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 268 {{130, 18}, {224, 21}} YES 612499008 272635904 File Name YES 268 {{476, 11}, {96, 32}} YES 67239424 134217728 Choose... -2038284033 129 200 25 268 {{128, 47}, {348, 26}} YES -2079981824 0 5000 100 500 0.0 11 1 NO NO 268 {{479, 56}, {90, 17}} YES 68288064 71308288 YES YES allowsFloats alwaysShowsDecimalSeparator formatterBehavior generatesDecimalNumbers locale maximumFractionDigits negativeInfinitySymbol nilSymbol numberStyle positiveFormat positiveInfinitySymbol usesGroupingSeparator YES -∞ #0.0 Hz +∞ #0.0 Hz #0.0 Hz NaN 3 YES YES YES . , NO NO YES %1.1f Hz 268 {{356, 11}, {124, 32}} YES 67239424 134217728 Choose None -2038284033 129 200 25 {{1, 1}, {584, 150}} {{17, 56}, {586, 166}} {0, 0} 67239424 0 Audio Sample Generators 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{510, 12}, {96, 32}} 1 YES 67239424 134217728 OK -2038284033 129 DQ 200 25 268 {{414, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 Gw 200 25 268 {{17, 230}, {566, 17}} YES 70385217 272634880 Device Info Summary {620, 267} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 1 2 {{235, 296}, {350, 263}} 1685586944 InputSettingsTouch NSWindow {1.79769e+308, 1.79769e+308} 256 YES 12 YES 256 YES 268 {{97, 44}, {17, 17}} YES 68288064 71304192 X: 268 {{119, 42}, {96, 22}} YES -1804468671 -1874852864 YES YES allowsFloats formatterBehavior locale maximum maximumFractionDigits maximumIntegerDigits minimum minimumIntegerDigits negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol usesGroupingSeparator YES -∞ +∞ # # NaN 3 YES YES YES . , NO NO NO YES 268 {{97, 16}, {17, 17}} YES 68288064 71304192 Y: 268 {{119, 14}, {96, 22}} YES -1804468671 -1874852864 YES YES allowsFloats formatterBehavior locale maximum maximumFractionDigits maximumIntegerDigits minimum minimumIntegerDigits negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol usesGroupingSeparator YES -∞ +∞ # # NaN 3 YES YES YES . , NO NO NO YES {{1, 1}, {314, 74}} {{17, 56}, {316, 90}} {0, 0} 67239424 0 User Defined Coordinates 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{240, 12}, {96, 32}} 1 YES 67239424 134217728 OK -2038284033 129 DQ 200 25 268 {{18, 202}, {314, 18}} YES 67239424 0 Use user defined coordinates 1211912703 2 200 25 268 {{17, 154}, {316, 42}} YES 67239424 272760832 If this setting is disabled, then the Touch command will read the coordinates from the input device instead. 268 {{144, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 Gw 200 25 268 {{17, 226}, {316, 17}} YES 70385217 272634880 Device Info Summary {350, 263} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 1 2 {{235, 434}, {350, 125}} 1685586944 InputSettingsLoadStateSlot NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 {{121, 56}, {212, 26}} YES -2076049856 2048 109199615 129 400 75 Slot 1 2147483647 1 _popUpItemAction: YES OtherViews YES Slot 2 2147483647 _popUpItemAction: 1 Slot 3 2147483647 _popUpItemAction: 2 Slot 4 2147483647 _popUpItemAction: 3 Slot 5 2147483647 _popUpItemAction: 4 Slot 6 2147483647 _popUpItemAction: 5 Slot 7 2147483647 _popUpItemAction: 6 Slot 8 2147483647 _popUpItemAction: 7 Slot 9 2147483647 _popUpItemAction: 8 Slot 10 2147483647 _popUpItemAction: 9 1 YES YES 2 268 {{17, 62}, {102, 17}} YES 68288064 272630784 Load State Slot: 268 {{240, 12}, {96, 32}} 1 YES 67239424 134217728 OK -2038284033 129 DQ 200 25 268 {{144, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 Gw 200 25 268 {{17, 88}, {316, 17}} YES 70385217 272634880 Device Info Summary {350, 125} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 1 2 {{235, 459}, {350, 125}} 1685586944 InputSettingsSaveStateSlot NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 {{119, 56}, {214, 26}} YES -2076049856 2048 109199615 129 400 75 Slot 1 2147483647 1 _popUpItemAction: YES OtherViews YES Slot 2 2147483647 _popUpItemAction: 1 Slot 3 2147483647 _popUpItemAction: 2 Slot 4 2147483647 _popUpItemAction: 3 Slot 5 2147483647 _popUpItemAction: 4 Slot 6 2147483647 _popUpItemAction: 5 Slot 7 2147483647 _popUpItemAction: 6 Slot 8 2147483647 _popUpItemAction: 7 Slot 9 2147483647 _popUpItemAction: 8 Slot 10 2147483647 _popUpItemAction: 9 1 YES YES 2 268 {{17, 62}, {100, 17}} YES 68288064 272630784 Save State Slot: 268 {{240, 12}, {96, 32}} 1 YES 67239424 134217728 OK -2038284033 129 DQ 200 25 268 {{144, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 Gw 200 25 268 {{17, 88}, {316, 17}} YES 70385217 272634880 Device Info Summary {350, 125} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 1 2 {{235, 399}, {467, 160}} 1685586944 InputSettingsSpeedLimit NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 {{17, 123}, {316, 17}} YES 70385217 272634880 Device Info Summary 268 {{30, 71}, {411, 26}} YES -2079981824 0 10 0.0 1 0.0 11 1 NO NO 268 {{20, 98}, {38, 17}} YES 68288064 138413056 0x 268 {{412, 98}, {38, 17}} YES 68288064 138413056 10x 268 {{98, 98}, {38, 17}} YES 68288064 138413056 2x 268 {{177, 98}, {38, 17}} YES 68288064 138413056 4x 268 {{255, 98}, {38, 17}} YES 68288064 138413056 6x 268 {{335, 98}, {38, 17}} YES 68288064 138413056 8x 268 {{14, 12}, {169, 32}} 100 YES 67239424 134217728 Set to Normal Speed -2038021889 129 400 75 268 {{112, 48}, {156, 17}} YES 68288064 71304192 Speed limit set to: 268 {{270, 48}, {81, 17}} YES 68288064 4195328 YES YES allowsFloats alwaysShowsDecimalSeparator formatterBehavior lenient locale maximumFractionDigits minimumFractionDigits negativeFormat negativeInfinitySymbol nilSymbol numberStyle positiveFormat positiveInfinitySymbol usesGroupingSeparator YES #0.00x -∞ #0.00x +∞ #0.00x #0.00x NaN 3 YES YES YES . , NO NO YES %1.2fx 268 {{357, 12}, {96, 32}} 1 YES 67239424 134217728 OK -2038284033 129 DQ 200 25 268 {{261, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 Gw 200 25 {467, 160} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 1 2 {{235, 276}, {516, 283}} 1685586944 InputSettingsGPUState NSWindow {1.79769e+308, 1.79769e+308} 256 YES 12 YES 256 YES 268 {{18, 14}, {444, 142}} YES 6 2 YES -2080244224 0 Main GPU (All Layers) 1211912703 0 200 25 67239424 0 Sub GPU (All Layers) 6 1211912703 0 400 75 67239424 0 Main BG0 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67239424 0 Sub BG0 7 1211912703 0 400 75 67239424 0 Main BG1 2 1211912703 0 400 75 67239424 0 Sub BG1 8 1211912703 0 400 75 67239424 0 Main BG2 3 1211912703 0 400 75 67239424 0 Sub BG2 9 1211912703 0 400 75 67239424 0 Main BG3 4 1211912703 0 400 75 67239424 0 Sub BG3 10 1211912703 0 400 75 67239424 0 Main OBJ 5 1211912703 0 400 75 67239424 0 Sub OBJ 11 1211912703 0 400 75 {220, 22} {4, 2} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 {{1, 1}, {480, 166}} {{17, 56}, {482, 182}} {0, 0} 67239424 0 GPU Layers 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{406, 12}, {96, 32}} 1 YES 67239424 134217728 OK -2038284033 129 DQ 200 25 268 {{310, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 Gw 200 25 268 {{17, 246}, {482, 17}} YES 70385217 272634880 Device Info Summary {516, 283} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 1 2 {{235, 244}, {305, 315}} 1685585920 Internal Firmware Preferences NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 {{119, 276}, {166, 22}} YES -1804468671 272630784 Enter a nickname... YES 268 {{119, 222}, {166, 44}} YES -1805517311 272629760 Enter a message... YES 268 {{17, 278}, {97, 17}} YES 68288064 71304192 Nickname: 268 {{17, 246}, {97, 17}} YES 68288064 71304192 Message: 268 {{12, 196}, {102, 17}} YES 68288064 71304192 Favorite Color: 268 {{17, 154}, {97, 17}} YES 68288064 71304192 Birthday: 268 {{17, 126}, {97, 17}} YES 68288064 71304192 Language: 268 {{119, 152}, {169, 27}} YES 71433728 0 330548400 0.0 224 268 {{116, 120}, {172, 26}} YES -2076049856 2048 109199615 129 400 75 English 2147483647 1 _popUpItemAction: 1 YES OtherViews YES Japanese 2147483647 _popUpItemAction: French 2147483647 _popUpItemAction: 2 German 2147483647 _popUpItemAction: 3 Italian 2147483647 _popUpItemAction: 4 Spanish 2147483647 _popUpItemAction: 5 1 1 YES YES 2 268 {{116, 190}, {172, 26}} YES -2076049856 2048 109199615 129 400 75 Gray 2147483647 1 NSImage ColorSwatch_Gray_16x16 _popUpItemAction: YES OtherViews YES Brown 2147483647 NSImage ColorSwatch_Brown_16x16 _popUpItemAction: 1 Red 2147483647 NSImage ColorSwatch_Red_16x16 _popUpItemAction: 2 Pink 2147483647 NSImage ColorSwatch_Pink_16x16 _popUpItemAction: 3 Orange 2147483647 NSImage ColorSwatch_Orange_16x16 _popUpItemAction: 4 Yellow 2147483647 NSImage ColorSwatch_Yellow_16x16 _popUpItemAction: 5 Lime Green 2147483647 NSImage ColorSwatch_LimeGreen_16x16 _popUpItemAction: 6 Green 2147483647 NSImage ColorSwatch_Green_16x16 _popUpItemAction: 7 Dark Green 2147483647 NSImage ColorSwatch_DarkGreen_16x16 _popUpItemAction: 8 Sea Green 2147483647 NSImage ColorSwatch_SeaGreen_16x16 _popUpItemAction: 9 Turquoise 2147483647 NSImage ColorSwatch_Turquoise_16x16 _popUpItemAction: 10 Blue 2147483647 NSImage ColorSwatch_Blue_16x16 _popUpItemAction: 11 Dark Blue 2147483647 NSImage ColorSwatch_DarkBlue_16x16 _popUpItemAction: 12 Dark Purple 2147483647 NSImage ColorSwatch_DarkPurple_16x16 _popUpItemAction: 13 Violet 2147483647 NSImage ColorSwatch_Violet_16x16 _popUpItemAction: 14 Magenta 2147483647 NSImage ColorSwatch_Magenta_16x16 _popUpItemAction: 15 1 YES YES 2 268 {{17, 56}, {271, 56}} YES 67239424 272760832 Note: These settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled. LucidaGrande 11 16 268 {{104, 12}, {96, 32}} YES 67239424 134217728 OK -2038284033 129 DQ 200 25 {305, 315} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 9 2 {{702, 413}, {700, 399}} 1685586944 User File Migration NSWindow {1.79769e+308, 1.79769e+308} {700, 250} 256 YES 268 {{17, 345}, {666, 34}} YES 67239424 272629760 You have files that were created from a previous version of DeSmuME. Would you like to migrate them to work with this version? 289 {{362, 12}, {162, 32}} 2 YES 67239424 134217728 Migrate By Moving -2038284033 129 200 25 289 {{200, 12}, {162, 32}} YES 67239424 134217728 Don't Migrate -2038284033 129 Gw 200 25 268 {{17, 309}, {666, 28}} YES 67239424 272633856 Files from previous versions may not be fully compatible with the current version, especially Save State files. File migration cannot guarantee that all your old files will continue to work. 292 {{18, 21}, {182, 18}} YES 67239424 0 Do not ask on startup 1211912703 2 200 25 289 {{524, 12}, {162, 32}} 1 YES 67239424 134217728 Migrate By Copying -2038284033 129 DQ 200 25 274 YES 2304 YES 256 {700, 195} YES 256 {700, 17} -2147483392 {{544, 0}, {16, 17}} YES 25 25 3.402823466385289e+38 75628096 2048 67763712 134217728 1215582719 2 200 25 YES 89 40 1000 75628096 2048 Version 3 MC4zMzMzMzI5ODU2AA 337772096 2048 Text Cell 3 YES 141 40 1000 75628096 2048 Kind 337772096 2048 Text Cell 3 YES 259 10 3.4028234663852886e+38 75628096 2048 Name 337772096 2048 Text Cell 3 YES 171 10 3.4028234663852886e+38 75628096 2048 Date Modified 337772096 2048 Text Cell 3 YES 3 2 17 1388314624 1 4 15 0 NO 0 {{1, 17}, {700, 195}} 4 -2147483392 {{544, 17}, {15, 180}} _doScroller: 0.92307692307692313 -2147483392 {{1, 197}, {598, 15}} 1 _doScroller: 0.98918083462132922 2304 YES {{1, 0}, {700, 17}} 4 {{-1, 88}, {702, 213}} 562 QSAAAEEgAABBmAAAQZgAAA 292 {{14, 52}, {114, 32}} YES 67239424 134217728 Select All -2038284033 129 200 25 292 {{128, 52}, {114, 32}} YES 67239424 134217728 Select None -2038284033 129 200 25 {700, 399} {{0, 0}, {1920, 1178}} {700, 272} {1.79769e+308, 1.79769e+308} FileMigrationDelegate 1 2 {{157, 261}, {380, 200}} 1685586944 ROM Save File Migration NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 {{17, 112}, {346, 68}} YES 67239424 272629760 This ROM's save file has not been created yet, but there is a save file with this ROM that has the same file name. Would you like to migrate it to work with DeSmuME? 268 {{270, 12}, {96, 32}} 1 YES 67239424 134217728 Migrate -2038284033 129 DQ 200 25 268 {{144, 12}, {126, 32}} YES 67239424 134217728 Don't Migrate -2038284033 129 Gw 200 25 268 {{17, 48}, {346, 56}} YES 67239424 272633856 Migrating the ROM save file will move it to DeSmuME's game data folder. If you do not migrate the save file now, a new file will be created instead. This will be like starting the ROM for the first time. {380, 200} {{0, 0}, {1440, 878}} {1.79769e+308, 1.79769e+308} 1 2 {{157, 298}, {335, 163}} 1685586944 Save State NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 {{17, 109}, {301, 34}} YES 67239424 272629760 Would you like to save the emulation state before closing? 268 {{220, 12}, {96, 32}} 1 YES 67239424 134217728 Save -2038284033 129 DQ 200 25 268 {{114, 12}, {106, 32}} 2 YES 67239424 134217728 Don't Save -2038284033 129 200 25 268 {{17, 59}, {301, 42}} YES 67239424 272633856 If you haven't already saved using this ROM's save, then not saving the emulation state now will cause any unsaved changes to be lost. 268 {{18, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 Gw 200 25 {335, 163} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 7 2 {{235, 88}, {640, 480}} 1685586944 Cheat Manager NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 YES 2304 YES 256 {270, 335} YES 256 {270, 17} -2147483392 {{256, 0}, {16, 17}} YES 20 20 20 75628096 2048 3 MC4zMzMzMzI5ODU2AA 67239424 0 1215582719 2 200 25 YES 36 10 3.4028234663852886e+38 75628096 2048 Type 67239424 33554432 0 0 0 NO cheatType YES compare: 205 10 3.4028234663852886e+38 75628096 2048 Description 337772032 4325632 Text Cell 3 YES YES 3 2 42 1388314624 1 YES 4 15 0 NO 0 {{1, 17}, {270, 335}} 4 -2147483392 {{256, 17}, {15, 306}} _doScroller: 0.99689440993788825 -2147483392 {{1, 323}, {270, 15}} 1 _doScroller: 0.99630996309963105 2304 YES {{1, 0}, {270, 17}} 4 {{20, 49}, {272, 353}} 562 QSAAAEEgAABCMAAAQjAAAA 268 {{113, 12}, {185, 32}} YES 67239424 134217728 View Cheat Database... -2038284033 129 200 25 268 {{47, 19}, {28, 23}} YES -2080244224 134217728 -2033434369 162 NSImage NSRemoveTemplate 400 75 268 {{20, 19}, {28, 23}} YES -2080244224 134217728 -2033434369 162 NSImage NSAddTemplate 400 75 12 YES 274 YES 268 {{100, 372}, {209, 26}} YES -2076049856 2048 109199615 129 400 75 Internal Cheat 1048576 2147483647 1 NSImage Icon_DeSmuME_32x32 _popUpItemAction: YES OtherViews YES Action Replay 1048576 2147483647 NSImage Icon_ActionReplay_32x32 _popUpItemAction: 1 1 YES YES 2 301 {{2, 33}, {320, 290}} NSView 268 {{16, 402}, {129, 18}} YES 67239424 0 Enable this cheat 1211912703 2 200 25 268 {{15, 378}, {83, 17}} YES 68288064 272630784 Type: 12 {{14, 320}, {292, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO 268 {{103, 331}, {203, 39}} YES -1805517311 272629760 YES 268 {{15, 353}, {83, 17}} YES 68288064 272630784 Description: 268 {{114, 6}, {96, 32}} YES 67239424 134217728 Apply -2038284033 129 200 25 {{1, 1}, {324, 428}} {{297, 16}, {326, 444}} {0, 0} 67239424 0 Cheat Settings 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{76, 408}, {190, 18}} YES -2080244224 0 Enable Cheats 1211912703 2 200 25 265 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 410}, {50, 50}} YES 130560 33554432 0 3 0 NO YES 265 {{75, 432}, {168, 28}} YES 69336577 272764928 TmFtZToKU2VyaWFsOg 1292 {{29, 419}, {32, 32}} 28682 100 {640, 480} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} CheatManagerWindow CheatWindowDelegate 256 YES 292 {{17, 4}, {294, 14}} YES 68288064 138548224 This list only shows the first 100 search results. LucidaGrande-Bold 11 16 1292 {{214, 220}, {16, 16}} 28938 100 268 {{133, 369}, {136, 22}} YES -2076049856 133120 109199615 129 400 75 Unsigned 2147483647 1 _popUpItemAction: YES OtherViews YES YES Signed (NOT IMPLEMENTED) 2147483647 _popUpItemAction: YES 1 YES YES 2 268 {{59, 374}, {60, 14}} YES 68288064 272761856 Sign Type: 268 {{59, 398}, {72, 14}} YES 68288064 272761856 Search Style: 268 {{133, 393}, {136, 22}} YES -2076049856 133120 109199615 129 400 75 Exact Value 1048576 2147483647 1 _popUpItemAction: YES OtherViews YES Comparative 1048576 2147483647 _popUpItemAction: 1 1 YES YES 2 268 {{0, 237}, {328, 134}} NSView 268 {{233, 213}, {80, 28}} YES 67239424 134348800 Reset -2038284033 129 200 25 268 {{59, 222}, {150, 14}} YES 68288064 272761856 Search not started. 268 {{17, 222}, {45, 14}} YES 68288064 272761856 Found: 284 YES 2304 YES 256 {286, 176} YES 256 {286, 17} -2147483392 {{224, 0}, {16, 17}} YES 102 40 1000 75628096 2048 Address 3 MC4zMzMzMzI5ODU2AA 69336641 137216 Text Cell Monaco 11 16 3 YES 178 40 1000 75628096 2048 Value 69336641 137216 Text Cell 3 YES 3 2 14 1916796928 3 4 15 0 NO 0 {{1, 17}, {286, 176}} 4 -2147483392 {{224, 17}, {15, 102}} _doScroller: 0.94863013698630139 -2147483392 {{1, 294}, {338, 15}} 1 _doScroller: 0.93888888888888888 2304 YES {{1, 0}, {286, 17}} 4 {{20, 20}, {288, 194}} 562 QSAAAEEgAABBgAAAQYAAAA {328, 434} NSView {328, 397} {0, 397} {328, 397} 2 0.0 0.0 15 2 {{235, 143}, {500, 416}} 1685585920 Cheat Database NSWindow {1.79769e+308, 1.79769e+308} {500, 272} 256 YES 274 YES 2304 YES 256 {500, 287} YES 256 {500, 17} -2147483392 {{224, 0}, {16, 17}} YES 25 25 25 75628096 2048 3 MC4zMzMzMzI5ODU2AA 67239424 134217728 1215582719 2 200 25 YES 464 40 1000 75628096 2048 Description 69336577 135168 Text Cell 3 YES YES 3 2 39 1388314624 1 4 15 0 NO 0 {{1, 17}, {500, 287}} 4 -2147483392 {{224, 17}, {15, 102}} _doScroller: 0.94773519163763065 -2147483392 {{1, 249}, {568, 15}} 1 _doScroller: 0.99206349206349209 2304 YES {{1, 0}, {500, 17}} 4 {{-1, 57}, {502, 305}} 562 QSAAAEEgAABCJAAAQiQAAA 268 {{17, 370}, {120, 14}} YES 68288064 272761856 R4 Cheats Database: 268 {{17, 392}, {63, 14}} YES 68288064 272761856 ROM Title: 292 {{14, 12}, {114, 32}} YES 67239424 134217728 Select All -2038284033 129 200 25 292 {{128, 12}, {114, 32}} YES 67239424 134217728 Select None -2038284033 129 200 25 289 {{390, 12}, {96, 32}} 1 YES 67239424 134217728 Add -2038284033 129 DQ 200 25 289 {{294, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 Gw 200 25 265 {{378, 370}, {42, 14}} YES 68288064 272761856 Found: 268 {{139, 370}, {237, 14}} YES 70385217 272765952 Database file 265 {{422, 370}, {61, 14}} YES 70385217 272765952 Count 268 {{82, 392}, {401, 14}} YES 70385217 272765952 ROM title {500, 416} {{0, 0}, {1920, 1178}} {500, 294} {1.79769e+308, 1.79769e+308} 268 YES 268 {{233, 54}, {80, 28}} YES 67239424 134348800 Search -2038284033 129 200 25 268 {{20, 59}, {210, 19}} YES 343014976 268567552 Search value YES 1 130560 0 search _searchFieldSearch: 138690815 0 400 75 130560 0 clear YES YES YES AXDescription NSAccessibilityEncodedAttributesValueType YES cancel _searchFieldCancel: 138690815 0 400 75 255 268 {{17, 86}, {294, 14}} YES 67239424 272760832 Enter a search value, and then click Search. 268 {{17, 100}, {294, 14}} YES 67239424 272760832 Search for an exact value. {328, 134} NSView 268 YES 268 {{17, 86}, {294, 14}} YES 67239424 272760832 Click Start Search to begin a comparative search. 268 {{17, 100}, {294, 14}} YES 67239424 272760832 Start a comparative search. 268 {{116, 47}, {96, 28}} YES 67239424 134348800 Start Search -2038284033 129 200 25 {328, 134} NSView 268 YES 268 {{17, 72}, {294, 28}} YES 67239424 272760832 Click the appropriate button based on how the target value is changing. 268 {{17, 100}, {294, 14}} YES 67239424 272760832 How is the value changing? 268 {{163, 13}, {150, 28}} 1 YES 67239424 134348800 Value is now lower -2038284033 129 200 25 268 {{163, 40}, {150, 28}} YES 67239424 134348800 Value is now higher -2038284033 129 200 25 268 {{15, 13}, {150, 28}} 3 YES 67239424 134348800 Value did change -2038284033 129 200 25 268 {{15, 40}, {150, 28}} 2 YES 67239424 134348800 Value is unchanged -2038284033 129 200 25 {328, 134} NSView 301 YES 268 {{197, 191}, {109, 32}} YES 67239424 134217728 Write Once -2038284033 129 200 25 268 {{17, 20}, {286, 42}} YES 67239424 272760832 Note: Enabling this cheat freezes the value in memory. If you only want to change a value without actually freezing it in memory, click Write Once. 268 {{17, 262}, {128, 17}} YES 68288064 272630784 Search for Address: 265 {{149, 257}, {27, 27}} YES -2080244224 134217728 -2033434369 160 400 75 268 {{79, 230}, {38, 17}} YES 68288064 71304192 0x02 Monaco 13 16 268 {{67, 198}, {128, 22}} YES -1804468671 -1874852864 YES YES allowsFloats formatterBehavior locale maximumFractionDigits negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol usesGroupingSeparator YES -∞ +∞ #0 #0 NaN 3 YES YES YES . , NO NO NO YES 268 {{17, 201}, {45, 17}} YES 68288064 272630784 Value: 268 {{118, 228}, {77, 22}} YES -1804468671 272630784 YES 268 {{17, 231}, {60, 17}} YES 68288064 272630784 Address: 12 YES 274 YES 268 {{18, 14}, {190, 78}} YES 4 1 YES 67239424 0 1 Byte [0 - 255] 1 1211912703 0 200 25 67239424 0 2 Bytes [0 - 65536] 2 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67239424 0 3 Bytes [0 - 16777215] 3 1211912703 0 400 75 -2080244224 0 4 Bytes [0 - 4294967295] 4 1211912703 0 400 75 {190, 18} {4, 2} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 3 {{1, 1}, {226, 102}} {{46, 72}, {228, 118}} {0, 0} 67239424 0 Select Memory Size 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {320, 290} NSView 301 YES 256 YES 2304 YES 2322 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {{0, 125}, {278, 53}} YES 134 278 1 11523 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 4 1 6 {463, 1e+07} {218, 53} YES NSAllRomanInputSourcesLocaleIdentifier {{1, 1}, {278, 223}} 4 -2147483392 {{231, 1}, {15, 172}} _doScroller: 0.68253968253968256 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 0.97142857142857142 0.94565218687057495 {{20, 20}, {280, 225}} 530 268 {{17, 253}, {138, 17}} YES 68288064 272630784 Action Replay Code: {320, 290} NSView 301 YES 268 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{101, 133}, {128, 128}} YES 130560 33554432 NSImage Icon_CodeBreaker_128x128 0 3 0 NO YES 268 {{17, 35}, {286, 72}} YES 67239424 138412032 Code Breaker cheats have not been implemented in this version of DeSmuME. LucidaGrande-Bold 20 16 {320, 290} NSView 7 2 {{235, 230}, {640, 329}} 1685586944 SLOT-1 Manager NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 {{14, 12}, {168, 32}} YES 67239424 134217728 Eject SLOT-1 Device -2038284033 129 200 25 268 {{181, 22}, {105, 17}} YES 68288064 272630784 SLOT-1 Status: 12 {{12, 51}, {616, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO 268 {{288, 22}, {330, 17}} YES 70385217 272634880 slot1StatusText 12 YES 256 YES 268 {{18, 14}, {180, 102}} YES 4 1 YES -2080244224 0 None 1211912703 0 200 25 67239424 0 Retail 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67239424 0 Retail with NAND Flash 3 1211912703 0 400 75 67239424 0 R4 2 1211912703 0 400 75 {180, 24} {4, 2} 1151868928 NSActionCell 67239424 0 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 268 {{85, 15}, {409, 21}} YES 78773825 272635136 Directory Path YES 268 {{496, 8}, {96, 32}} YES 67239424 134217728 Choose... -2038284033 129 200 25 268 {{15, 124}, {482, 28}} YES 67239424 4325376 Note: Changes to the SLOT-1 device will only take effect after a ROM is loaded or after the emulator is reset. 1 MCAwIDAAA 268 {{496, 120}, {96, 32}} YES 67239424 134217728 Reset -2034876161 129 200 25 {{1, 1}, {604, 162}} {{17, 140}, {606, 178}} {0, 0} 67239424 0 SLOT-1 Device Type 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 256 YES 265 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{18, 16}, {30, 30}} YES 130560 33554432 0 3 0 NO YES 265 {{50, 18}, {168, 28}} YES 69336577 272764928 TmFtZToKU2VyaWFsOg 1292 {{18, 14}, {32, 32}} 28682 100 268 {{220, 17}, {201, 26}} YES -2076049856 2048 109199615 129 400 75 YES Actions 1048576 2147483647 1 _popUpItemAction: YES OtherViews YES Load ROM… 2147483647 _popUpItemAction: Load Recent ROM 1048576 2147483647 submenuAction: Load Recent ROM YES Clear Menu 1048576 2147483647 _popUpItemAction: _NSRecentDocumentsMenu YES YES 2147483647 _popUpItemAction: Unload ROM 2147483647 _popUpItemAction: YES 1 YES YES 2 {{1, 1}, {604, 56}} {{17, 64}, {606, 72}} {0, 0} 67239424 0 Current ROM 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {640, 329} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} Slot1ManagerWindow 279 2 {{230, 19}, {286, 522}} -461896704 Emulation Settings NSPanel {1.79769e+308, 1.79769e+308} 256 YES 12 YES 274 YES 268 {{16, 32}, {171, 18}} 1 YES -2080244224 131072 Advanced Bus-Level Timing 1211912703 2 200 25 268 {{16, 12}, {187, 18}} 10 YES 67239424 131072 Rigorous 3D Rendering Timing 1211912703 2 200 25 {{1, 1}, {250, 58}} {{17, 428}, {252, 74}} {0, 0} 67239424 0 Emulation Timing 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{16, 52}, {158, 18}} 2 YES 67239424 131072 Use External BIOS Images 1211912703 2 200 25 268 {{35, 32}, {120, 18}} 3 YES -2080244224 131072 Emulate BIOS SWIs 1211912703 2 200 25 268 {{35, 12}, {132, 18}} 4 YES 67239424 131072 Patch DelayLoop SWI 1211912703 2 200 25 {{1, 1}, {250, 78}} {{17, 224}, {252, 94}} {0, 0} 67239424 0 BIOS Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{15, 32}, {177, 18}} 5 YES 67239424 131072 Use External Firmware Image 1211912703 2 200 25 268 {{15, 12}, {130, 18}} 6 YES 67239424 131072 Boot From Firmware 1211912703 2 200 25 265 {{176, 54}, {27, 27}} YES -2080244224 134217728 -2033434369 160 400 75 268 {{15, 61}, {157, 14}} YES 68288064 272761856 Configure Internal Firmware: {{1, 1}, {250, 85}} {{17, 119}, {252, 101}} {0, 0} 67239424 0 Firmware Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{66, 18}, {154, 19}} YES -2080244224 134217728 Save Settings as Default LucidaGrande 12 16 -2038152961 164 400 75 12 YES 274 YES 268 {{15, 32}, {127, 18}} 9 YES 67239424 131072 Use Debug Console 1211912703 2 200 25 268 {{15, 12}, {103, 18}} YES 67239424 131072 Emulate Ensata 1211912703 2 200 25 {{1, 1}, {250, 58}} {{17, 41}, {252, 74}} {0, 0} 67239424 0 Debugger Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 256 YES 268 {{18, 38}, {145, 38}} YES 2 1 YES -2080244224 131072 Interpreter 1211912703 0 200 25 67239424 131072 Dynamic Recompiler 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {145, 18} {4, 2} 1151868928 NSActionCell 67239424 131072 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 268 {{198, 11}, {19, 27}} YES 68025888 0 12 1 100 1 YES 268 {{157, 16}, {40, 19}} YES -1804468671 71435264 YES YES allowsFloats formatterBehavior locale maximum maximumFractionDigits minimum negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol usesGroupingSeparator YES -∞ +∞ #0 #0 NaN 3 YES YES YES . , NO NO NO YES 268 {{74, 18}, {78, 14}} YES 68288064 71435264 Block Size: {{1, 1}, {250, 86}} {{17, 322}, {252, 102}} {0, 0} 67239424 0 CPU Emulation Engine 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {286, 522} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} EmulationSettingsPanel 256 YES 268 {{53, 18}, {154, 19}} YES -2080244224 134217728 Apply -2038152961 164 400 75 268 {{107, 212}, {136, 22}} YES -2076049856 133120 109199615 129 400 75 Gray 2147483647 1 _popUpItemAction: YES OtherViews YES Brown 2147483647 _popUpItemAction: 1 Red 2147483647 _popUpItemAction: 2 Pink 2147483647 _popUpItemAction: 3 Orange 2147483647 _popUpItemAction: 4 Yellow 2147483647 _popUpItemAction: 5 Lime Green 2147483647 _popUpItemAction: 6 Green 2147483647 _popUpItemAction: 7 Dark Green 2147483647 _popUpItemAction: 8 Sea Green 2147483647 _popUpItemAction: 9 Turquoise 2147483647 _popUpItemAction: 10 Blue 2147483647 _popUpItemAction: 11 Dark Blue 2147483647 _popUpItemAction: 12 Dark Purple 2147483647 _popUpItemAction: 13 Violet 2147483647 _popUpItemAction: 14 Magenta 2147483647 _popUpItemAction: 15 1 YES YES 2 268 {{107, 157}, {136, 22}} YES -2076049856 133120 109199615 129 400 75 English 2147483647 1 _popUpItemAction: 1 YES OtherViews YES Japanese 2147483647 _popUpItemAction: French 2147483647 _popUpItemAction: 2 German 2147483647 _popUpItemAction: 3 Italian 2147483647 _popUpItemAction: 4 Spanish 2147483647 _popUpItemAction: 5 1 1 YES YES 2 268 {{17, 45}, {226, 98}} YES 67239424 272760832 Note: To use this configuration, click Apply, and then reset the emulator. Also, these settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled. 268 {{110, 186}, {133, 27}} YES 71433728 131072 330548400 0.0 224 268 {{17, 162}, {88, 14}} YES 68288064 71435264 Language: 268 {{17, 190}, {88, 14}} YES 68288064 71435264 Birthday: 268 {{17, 217}, {88, 14}} YES 68288064 71435264 Favorite Color: 268 {{17, 264}, {88, 14}} YES 68288064 71435264 Message: 268 {{17, 291}, {88, 14}} YES 68288064 71435264 Nickname: 268 {{110, 241}, {130, 40}} YES -1805517311 272760832 Enter a message... YES 268 {{110, 289}, {130, 19}} YES -1804468671 272761856 Enter a nickname... YES {260, 328} NSView {260, 328} {0, 328} {260, 328} 2 0.0 0.0 279 2 {{1572, 795}, {194, 241}} -461896704 HUD Settings NSPanel {1.79769e+308, 1.79769e+308} 256 YES 268 {{18, 174}, {158, 18}} YES -2080244224 131072 Frame Counter 1211912703 2 200 25 268 {{18, 154}, {158, 18}} YES -2080244224 131072 Frames Per Second 1211912703 2 200 25 268 {{18, 134}, {158, 18}} YES -2080244224 131072 Input 1211912703 2 200 25 268 {{18, 114}, {158, 18}} YES -2080244224 131072 Graphical Input 1211912703 2 200 25 268 {{18, 94}, {158, 18}} YES -2080244224 131072 Lag Counter 1211912703 2 200 25 268 {{18, 74}, {158, 18}} YES -2080244224 131072 Microphone 1211912703 2 200 25 268 {{18, 54}, {158, 18}} YES -2080244224 131072 Real Time Clock 1211912703 2 200 25 268 {{20, 18}, {154, 19}} YES -2080244224 134217728 Save Settings as Default -2038152961 164 400 75 268 {{18, 205}, {158, 18}} YES -2080244224 131072 Enable HUD 1211912703 2 200 25 12 {{21, 196}, {153, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO {194, 241} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 279 2 {{1651, 276}, {204, 521}} -461896704 Display Video Settings NSPanel {1.79769e+308, 1.79769e+308} 256 YES 268 {{20, 18}, {164, 19}} YES -2080244224 134217728 Save Settings as Default -2038152961 164 400 75 12 YES 274 YES 268 {{18, 14}, {129, 378}} YES 19 1 YES -2080244224 131072 None 1211912703 2 NSImage NSRadioButton 200 25 67239424 131072 LQ2x 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 1140981248 131072 LQ2xS 2 1211912703 0 12779520 YES YES YES YES size state value widget YES regular normal radiobutton {18, 18} 0 YES NSCalibratedRGBColorSpace 400 75 1140981248 131072 HQ2x 3 1211912703 0 400 75 1140981248 131072 HQ2xS 4 1211912703 0 400 75 67239424 131072 HQ4x 5 1211912703 0 400 75 1140981248 131072 HQ4XS 18 1211912703 0 400 75 67239424 131072 2xSaI 6 1211912703 0 400 75 1140981248 131072 Super 2xSaI 7 1211912703 0 400 75 67239424 131072 Super Eagle 8 1211912703 0 400 75 67239424 131072 Scanline 9 1211912703 0 400 75 1140981248 131072 Bilinear 10 1211912703 0 400 75 67239424 131072 Nearest 2x 11 1211912703 0 400 75 67239424 131072 Nearest 1.5x 12 1211912703 0 400 75 67239424 131072 Nearest+ 1.5x 13 1211912703 0 400 75 67239424 131072 EPX 14 1211912703 0 400 75 67239424 131072 EPX+ 15 1211912703 0 400 75 67239424 131072 EPX 1.5x 16 1211912703 0 12779520 YES YES YES YES size state value widget YES regular normal radiobutton {18, 18} 0 YES NSCalibratedRGBColorSpace 400 75 67239424 131072 EPX+ 1.5x 17 1211912703 0 400 75 {129, 18} {4, 2} 1151868928 NSActionCell 67239424 131072 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 {{1, 1}, {168, 402}} {{17, 41}, {170, 418}} {0, 0} 67239424 0 Video Filters 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{17, 485}, {169, 18}} YES -2080244224 131072 Use Bilinear Filtered Output 1211912703 2 200 25 268 {{17, 465}, {135, 18}} YES 67239424 131072 Use Vertical Sync 1211912703 2 200 25 {204, 521} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} DisplayVideoSettingsPanel 279 2 {{149, 108}, {301, 560}} -461896704 3D Rendering Settings NSPanel {1.79769e+308, 1.79769e+308} 256 YES 12 YES 274 YES 268 {{15, 77}, {206, 18}} YES -2080244224 131072 High-Precision Color Interpolation 1211912703 2 200 25 268 {{15, 57}, {134, 18}} YES -2080244224 131072 Enable Edge Marking 1211912703 2 200 25 268 {{15, 37}, {80, 18}} YES -2080244224 131072 Enable Fog 1211912703 2 200 25 268 {{185, 12}, {45, 19}} YES -1804468671 71435264 YES YES allowsFloats formatterBehavior groupingSize locale maximum maximumIntegerDigits minimum minimumIntegerDigits negativeFormat negativeInfinitySymbol nilSymbol numberStyle positiveFormat positiveInfinitySymbol YES # -∞ # +∞ # # NaN 3 YES YES YES . , NO NO NO YES 268 {{15, 14}, {165, 14}} YES 68288064 71435264 Depth Comparison Threshold: 268 {{231, 7}, {19, 27}} YES 68025888 0 100 1 YES {{1, 1}, {265, 103}} {{17, 241}, {267, 119}} {0, 0} 67239424 0 SoftRasterizer Options 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{73, 18}, {154, 19}} YES -2080244224 134217728 Save Settings as Default -2038152961 164 400 75 12 YES 274 YES 268 {{18, 14}, {107, 58}} YES 3 1 YES 67239424 131072 None 1211912703 0 200 25 -2080244224 131072 SoftRasterizer 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67239424 131072 OpenGL 2 1211912703 0 400 75 {107, 18} {4, 2} 1151868928 NSActionCell 67239424 131072 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 1 {{1, 1}, {265, 82}} {{17, 442}, {267, 98}} {0, 0} 67239424 0 3D Rendering Engine 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{18, 14}, {120, 98}} YES 5 1 YES -2080244224 131072 Automatic 1211912703 0 200 25 67239424 131072 Single-Threaded 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 67239424 131072 2 Threads 2 1211912703 0 12779520 YES YES YES YES size state value widget YES regular normal radiobutton {18, 18} 0 YES NSCalibratedRGBColorSpace 400 75 67239424 131072 4 Threads 4 1211912703 0 400 75 67239424 131072 8 Threads 8 1211912703 0 400 75 {120, 18} {4, 2} 1151868928 NSActionCell 67239424 131072 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 {{1, 1}, {265, 122}} {{17, 41}, {267, 138}} {0, 0} 67239424 0 Rendering Threads 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{15, 32}, {113, 18}} YES -2080244224 131072 Enable Line Hack 1211912703 2 200 25 268 {{15, 12}, {108, 18}} YES -2080244224 131072 Enable Textures 1211912703 2 200 25 {{1, 1}, {265, 58}} {{17, 364}, {267, 74}} {0, 0} 67239424 0 General Settings 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 256 YES 268 {{16, 12}, {192, 18}} YES 67239424 131072 Enable Multisample Antialiasing 1211912703 2 200 25 {{1, 1}, {265, 38}} {{17, 183}, {267, 54}} {0, 0} 67239424 0 OpenGL Options 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {301, 560} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 3DRenderingSettingsPanel 279 2 {{230, 30}, {288, 511}} -461896704 Sound Settings NSPanel {1.79769e+308, 1.79769e+308} 256 YES 12 YES 274 YES 268 {{18, 14}, {61, 58}} YES 3 1 YES 67239424 131072 None 1211912703 0 200 25 67239424 131072 Linear 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 -2080244224 131072 Cosine 2 1211912703 0 400 75 {61, 18} {4, 2} 1151868928 NSActionCell 67239424 131072 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 2 {{1, 1}, {253, 82}} {{16, 189}, {255, 98}} {0, 0} 67239424 0 SPU Interpolation Method 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{18, 80}, {154, 38}} YES 2 1 YES 67239424 131072 Dual SPU Synch/Asynch 1211912703 0 200 25 -2080244224 131072 Synchronous 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {154, 18} {4, 2} 1151868928 NSActionCell 67239424 131072 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 1 268 {{53, 14}, {100, 58}} YES 3 1 YES 67239424 131072 "N" Method 1211912703 0 200 25 67239424 131072 "Z" Method 1 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 -2080244224 131072 "P" Method 2 1211912703 0 400 75 {100, 18} {4, 2} 1151868928 NSActionCell 67239424 131072 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 2 {{1, 1}, {253, 128}} {{16, 41}, {255, 144}} {0, 0} 67239424 0 SPU Sound Synchronization Method 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{15, 12}, {129, 18}} YES -2080244224 131072 Advanced SPU Logic 1211912703 2 200 25 {{1, 1}, {253, 38}} {{16, 291}, {255, 54}} {0, 0} 67239424 0 SPU Configuration 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{47, 13}, {132, 21}} YES 67501824 0 100 0.0 100 0.0 0 1 NO NO 268 {{182, 17}, {56, 17}} YES 68288064 71308288 YES YES allowsFloats alwaysShowsDecimalSeparator formatterBehavior lenient locale maximumFractionDigits minimumFractionDigits multiplier negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol usesGroupingSeparator YES -∞ +∞ #0.0% #0.0% NaN 3 YES YES YES . , NO NO YES %1.1f%% 289 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{18, 14}, {20, 20}} YES 130560 33554432 0 2 0 YES YES {{1, 1}, {253, 44}} {{16, 349}, {255, 60}} {0, 0} 67239424 0 General Settings 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 268 {{66, 18}, {154, 19}} YES -2080244224 134217728 Save Settings as Default -2038152961 164 400 75 12 YES 274 YES 268 {{18, 14}, {116, 38}} YES 2 1 YES 67239424 131072 None 1211912703 0 200 25 -2080244224 131072 OS X Core Audio 58325 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt 7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX 2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn 5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK 0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb 1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX 8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA 400 75 {116, 18} {4, 2} 1151868928 NSActionCell 67239424 131072 Radio 1211912703 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 1 {{1, 1}, {253, 62}} {{16, 413}, {255, 78}} {0, 0} 67239424 0 Audio Output Engine 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {288, 511} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} SoundSettingsPanel 8215 2 {{107, 480}, {580, 588}} -461897728 ROM Info NSPanel {1.79769e+308, 1.79769e+308} 256 YES YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 440}, {128, 128}} YES 130560 33554432 0 3 0 NO YES 12 YES 274 YES 268 {{15, 89}, {131, 17}} YES 68288064 272634880 ROM Name: 268 {{15, 64}, {131, 17}} YES 68288064 272630784 ROM Serial: 268 {{15, 39}, {131, 17}} YES 68288064 272630784 Maker Code: 268 {{15, 14}, {131, 17}} YES 68288064 272630784 Chip Size: 268 {{148, 89}, {245, 17}} YES 70385217 4199424 ? 1 MSAxIDEAA 268 {{148, 64}, {245, 17}} YES 70385217 4199424 ? 268 {{148, 39}, {245, 17}} YES 70385217 4199424 ? 268 {{148, 14}, {245, 17}} YES 70385217 4199424 ? {{1, 1}, {408, 116}} {{153, 436}, {410, 132}} {0, 0} 67239424 0 General Info 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{15, 376}, {186, 14}} YES 68288064 272897024 JAPANESE TITLE: 268 {{15, 312}, {186, 14}} YES 68288064 272897024 ENGLISH TITLE: 268 {{15, 248}, {186, 14}} YES 68288064 272897024 FRENCH TITLE: 268 {{15, 184}, {186, 14}} YES 68288064 272897024 GERMAN TITLE: 268 {{15, 120}, {186, 14}} YES 68288064 272897024 ITALIAN TITLE: 268 {{15, 56}, {186, 14}} YES 68288064 272897024 SPANISH TITLE: 268 {{15, 334}, {186, 42}} YES 69336577 272896000 ? 268 {{15, 270}, {186, 42}} YES 69336577 272896000 ? 268 {{15, 206}, {186, 42}} YES 69336577 272896000 ? 268 {{15, 142}, {186, 42}} YES 69336577 272896000 ? 268 {{15, 78}, {186, 42}} YES 69336577 272896000 ? 268 {{15, 14}, {186, 42}} YES 69336577 272896000 ? {{1, 1}, {216, 400}} {{17, 16}, {218, 416}} {0, 0} 67239424 0 Titles 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{15, 168}, {186, 14}} YES 68288064 272630784 ARM9 Binary ROM Offset: 268 {{15, 146}, {186, 14}} YES 68288064 272630784 ARM9 Binary Entry Address: 268 {{15, 124}, {186, 14}} YES 68288064 272630784 ARM9 Binary Start Address: 268 {{15, 102}, {186, 14}} YES 68288064 272630784 ARM9 Binary Size: 268 {{15, 80}, {186, 14}} YES 68288064 272630784 ARM7 Binary ROM Offset: 268 {{15, 58}, {186, 14}} YES 68288064 272630784 ARM7 Binary Entry Address: 268 {{15, 36}, {186, 14}} YES 68288064 272630784 ARM7 Binary Start Address: 268 {{15, 14}, {186, 14}} YES 68288064 272630784 ARM7 Binary Size: 268 {{203, 168}, {106, 14}} YES 70385217 71308288 ? 268 {{203, 146}, {106, 14}} YES 70385217 71308288 ? 268 {{203, 124}, {106, 14}} YES 70385217 71308288 ? 268 {{203, 102}, {106, 14}} YES 70385217 71308288 ? bytes 268 {{203, 80}, {106, 14}} YES 70385217 71308288 ? 268 {{203, 58}, {106, 14}} YES 70385217 71308288 ? 268 {{203, 36}, {106, 14}} YES 70385217 71308288 ? 268 {{203, 14}, {106, 14}} YES 70385217 71308288 ? bytes {{1, 1}, {324, 192}} {{237, 224}, {326, 208}} {0, 0} 67239424 0 ARM9 & ARM7 Binaries 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{15, 80}, {186, 14}} YES 68288064 272630784 FNT ROM Offset: 268 {{203, 80}, {106, 14}} YES 70385217 71308288 ? 268 {{15, 58}, {186, 14}} YES 68288064 272630784 FNT Size: 268 {{203, 58}, {106, 14}} YES 70385217 71308288 ? bytes 268 {{15, 36}, {186, 14}} YES 68288064 272630784 FAT ROM Offset: 268 {{203, 36}, {106, 14}} YES 70385217 71308288 ? 268 {{15, 14}, {186, 14}} YES 68288064 272630784 FAT Size: 268 {{203, 14}, {106, 14}} YES 70385217 71308288 ? bytes {{1, 1}, {324, 104}} {{237, 98}, {326, 120}} {0, 0} 67239424 0 File System 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 274 YES 268 {{15, 36}, {186, 14}} YES 68288064 272630784 Icon/Title Region ROM Offset: 268 {{203, 36}, {106, 14}} YES 70385217 71308288 ? 268 {{15, 14}, {186, 14}} YES 68288064 272630784 Used ROM Size: 268 {{203, 14}, {106, 14}} YES 70385217 71308288 ? {{1, 1}, {324, 60}} {{237, 16}, {326, 76}} {0, 0} 67239424 0 Miscellaneous 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {580, 588} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} ROMInfoPanel 279 2 {{1360, 99}, {467, 128}} -461897728 Set Speed Limit NSPanel {1.79769e+308, 1.79769e+308} 256 YES 268 {{30, 43}, {411, 26}} YES -2079981824 0 10 0.0 1 0.0 11 1 NO NO 268 {{20, 70}, {38, 17}} YES 68288064 138413056 0x 268 {{412, 70}, {38, 17}} YES 68288064 138413056 10x 268 {{98, 70}, {38, 17}} YES 68288064 138413056 2x 268 {{177, 70}, {38, 17}} YES 68288064 138413056 4x 268 {{255, 70}, {38, 17}} YES 68288064 138413056 6x 268 {{335, 70}, {38, 17}} YES 68288064 138413056 8x 268 {{32, 18}, {133, 19}} 100 YES 67239424 134217728 Set to Normal Speed -2038152961 164 400 75 268 {{203, 21}, {156, 17}} YES 68288064 71304192 Speed limit set to: 268 {{361, 21}, {81, 17}} YES 68288064 4195328 YES YES allowsFloats alwaysShowsDecimalSeparator formatterBehavior lenient locale maximumFractionDigits minimumFractionDigits negativeFormat negativeInfinitySymbol nilSymbol numberStyle positiveFormat positiveInfinitySymbol usesGroupingSeparator YES #0.00x -∞ #0.00x +∞ #0.00x #0.00x NaN 3 YES YES YES . , NO NO YES %1.2fx 268 {{158, 93}, {154, 18}} YES -2080244224 0 Enable Speed Limit 1211912703 2 200 25 {467, 128} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} SetSpeedLimitPanel 279 2 {{162, 281}, {213, 198}} -461897728 Set Rotation NSPanel {1.79769e+308, 1.79769e+308} 256 YES 268 {{88, 119}, {32, 34}} YES 67501824 0 360 0.0 0.0 0.0 4 1 NO NO 1 268 {{85, 161}, {38, 17}} YES 68288064 138413056 268 {{85, 94}, {39, 17}} YES 68288064 138413056 180º 268 {{44, 127}, {39, 17}} YES 68288064 138413056 270º 268 {{125, 127}, {38, 17}} YES 68288064 138413056 90º 268 {{127, 69}, {57, 17}} YES 68288064 272630784 YES YES allowsFloats alwaysShowsDecimalSeparator currencySymbol formatterBehavior internationalCurrencySymbol lenient locale maximumFractionDigits maximumIntegerDigits minimumFractionDigits minimumIntegerDigits negativeFormat negativeSuffix numberStyle positiveFormat positiveSuffix YES ¤ ¤¤ #0.00º º #0.00º º #0.00º #0.00º NaN 3 YES YES YES . , NO NO YES rotX 268 {{24, 69}, {101, 17}} YES 68288064 272630784 Rotation set to: 268 {{27, 42}, {154, 19}} YES -2080244224 134217728 Set to 0º -2038152961 164 400 75 268 {{27, 17}, {154, 19}} YES -2080244224 134217728 Save Settings as Default -2038152961 164 400 75 {213, 198} {{0, 0}, {1440, 878}} {1.79769e+308, 1.79769e+308} SetRotationPanel 279 2 {{230, 408}, {441, 133}} -461896704 Set Separation NSPanel {1.79769e+308, 1.79769e+308} 256 YES 268 {{30, 73}, {385, 26}} YES -2079981824 0 2 0.0 1 0.0 5 1 NO NO 268 {{389, 99}, {38, 14}} YES 68288064 138544128 200% 268 {{298, 99}, {38, 14}} YES 68288064 138544128 150% 268 {{205, 99}, {38, 14}} YES 68288064 138544128 100% 268 {{113, 99}, {38, 14}} YES 68288064 138544128 50% 268 {{22, 99}, {38, 14}} YES 68288064 138544128 0% 268 {{249, 51}, {107, 17}} YES 68288064 71304192 Gap Percentage: 268 {{358, 51}, {66, 17}} YES 68288064 -2143288320 YES YES allowsFloats alwaysShowsDecimalSeparator formatterBehavior locale maximumFractionDigits maximumIntegerDigits minimumFractionDigits negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol usesGroupingSeparator YES -∞ +∞ #0.0% #0.0% NaN 3 YES YES YES . , NO NO YES 1.1f% 268 {{20, 48}, {100, 19}} YES -2080244224 134217728 Set to 0% -2038152961 164 400 75 268 {{128, 48}, {100, 19}} 100 YES -2080244224 134217728 Set to 100% -2038152961 164 400 75 268 {{147, 18}, {154, 19}} YES -2080244224 134217728 Save Settings as Default -2038152961 164 400 75 {441, 133} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} SetSeparationPanel 279 2 {{230, 202}, {173, 339}} -461896704 GPU Layers NSPanel {1.79769e+308, 1.79769e+308} 256 YES 12 YES 256 YES 268 {{15, 112}, {106, 18}} YES -2080244224 131072 GPU (All Layers) 1211912703 2 200 25 268 {{33, 92}, {44, 18}} 1 YES -2080244224 131072 BG0 1211912703 2 200 25 268 {{33, 72}, {44, 18}} 2 YES -2080244224 131072 BG1 1211912703 2 200 25 268 {{33, 52}, {44, 18}} 3 YES -2080244224 131072 BG2 1211912703 2 200 25 268 {{33, 32}, {44, 18}} 4 YES -2080244224 131072 BG3 1211912703 2 200 25 268 {{33, 12}, {44, 18}} 5 YES -2080244224 131072 OBJ 1211912703 2 200 25 {{1, 1}, {137, 138}} {{17, 174}, {139, 154}} {0, 0} 67239424 0 Main 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO 12 YES 256 YES 268 {{15, 112}, {106, 18}} 6 YES -2080244224 131072 GPU (All Layers) 1211912703 2 200 25 268 {{33, 92}, {44, 18}} 7 YES -2080244224 131072 BG0 1211912703 2 200 25 268 {{33, 72}, {44, 18}} 8 YES -2080244224 131072 BG1 1211912703 2 200 25 268 {{33, 52}, {44, 18}} 9 YES -2080244224 131072 BG2 1211912703 2 200 25 268 {{33, 32}, {44, 18}} 10 YES -2080244224 131072 BG3 1211912703 2 200 25 268 {{33, 12}, {44, 18}} 11 YES -2080244224 131072 OBJ 1211912703 2 200 25 {{1, 1}, {137, 138}} {{17, 16}, {139, 154}} {0, 0} 67239424 0 Sub 3 MCAwLjgwMDAwMDAxMTkAA 1 0 2 NO {173, 339} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} GPULayersPanel 268 YES 268 {{195, 5}, {226, 26}} YES -2076049856 2048 109199615 1 400 75 DeSmuME ROM Save (.dsv) 2147483647 1 _popUpItemAction: YES OtherViews YES No$GBA ROM Save (.sav) 2147483647 _popUpItemAction: 1 Raw Save File (.sav) 2147483647 _popUpItemAction: 2 1 YES YES 2 268 {{17, 11}, {176, 17}} YES 68288064 71304192 Select ROM Save Format: {450, 35} NSView 7 2 {{75, 507}, {580, 592}} 1685586944 Troubleshooting Form NSWindow {580, 592} {580, 592} 256 {580, 592} {{0, 0}, {1920, 1178}} {580, 614} {580, 614} 268 YES 1292 {{364, 339}, {32, 32}} 28682 100 265 {{396, 343}, {168, 28}} YES 69336577 272764928 TmFtZToKU2VyaWFsOg 265 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{364, 341}, {30, 30}} YES 130560 33554432 0 3 0 NO YES 256 YES 2304 YES 2322 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {{0, 69}, {523, 133}} YES 6 523 1 12163 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {525, 1e+07} {223, 133} {{1, 1}, {523, 202}} 4 256 {{524, 1}, {15, 202}} _doScroller: 0.99248120300751874 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{20, 61}, {540, 204}} 18 288 {{125, 16}, {438, 28}} YES 67239424 272760832 And that's it! Click Continue to review your information before submitting it to the DeSmuME team. 34 {{12, 50}, {556, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO 269 {{17, 273}, {546, 28}} YES 67239424 272760832 In the field below, briefly describe your situation and what you need help with. (Please be as specific as possible! It will help us to understand your situation better.) 269 {{17, 309}, {546, 17}} YES 68288064 272630784 Tell us what you need help with. 10 {{12, 332}, {556, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO 269 {{17, 489}, {546, 42}} YES 67239424 272760832 Do you need help with using DeSmuME? If so, it never hurts to ask! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your issue quicker and easier. 269 {{17, 539}, {546, 17}} YES 68288064 138413056 DeSmuME Technical Support Request Form 10 {{12, 478}, {556, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO 269 {{17, 455}, {546, 17}} YES 68288064 272630784 Tell us about the ROM. 269 {{17, 405}, {546, 42}} YES 67239424 272760832 If your issue is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.) 268 {{17, 347}, {77, 17}} YES 68288064 272630784 ROM Serial: 268 {{17, 377}, {78, 17}} YES 68288064 272630784 ROM Name: 266 {{100, 345}, {256, 22}} YES -1804468671 272630784 YES 266 {{100, 375}, {256, 22}} YES -1804468671 272630784 YES 265 {{358, 370}, {209, 32}} YES 67239424 134217728 Use Currently Loaded ROM -2038284033 129 200 25 288 {{14, 12}, {112, 32}} YES 67239424 134217728 Continue -2038284033 129 200 25 {580, 567} NSView 268 YES 1292 {{363, 339}, {32, 32}} 28682 100 265 {{396, 343}, {168, 28}} YES 69336577 272764928 TmFtZToKU2VyaWFsOg 265 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{364, 341}, {30, 30}} YES 130560 33554432 0 3 0 NO YES 256 YES 2304 YES 2322 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {{0, 18}, {524, 62}} YES 6 524 1 12163 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {531, 1e+07} {223, 62} {{1, 1}, {524, 80}} 4 256 {{525, 1}, {15, 80}} _doScroller: 0.99248120300751874 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{20, 61}, {541, 82}} 18 256 YES 2304 YES 2322 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {{0, 6}, {523, 65}} YES 6 523 1 12163 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {523, 1e+07} {223, 65} {{1, 1}, {523, 80}} 4 256 {{524, 1}, {15, 80}} _doScroller: 0.99248120300751874 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{20, 167}, {540, 82}} 18 288 {{125, 16}, {438, 28}} YES 67239424 272760832 And that's it! Click Continue to review your information before submitting it to the DeSmuME team. 34 {{12, 50}, {556, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO 256 {{17, 145}, {206, 14}} YES 68288064 272761856 Expected Behavior: 256 {{17, 251}, {206, 14}} YES 68288064 272761856 Observed Behavior: 269 {{17, 273}, {546, 28}} YES 67239424 272760832 In the fields below, give us specific details on what you OBSERVED happened, and then what you EXPECTED to happen. 269 {{17, 309}, {546, 17}} YES 68288064 272630784 Tell us what is happening. 10 {{12, 332}, {556, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO 269 {{17, 489}, {546, 42}} YES 67239424 272760832 Think you just spotted a bug with DeSmuME? Be sure to let us know! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your bug report quicker and easier. 269 {{17, 539}, {546, 17}} YES 68288064 138413056 DeSmuME Bug Report Form 10 {{12, 478}, {556, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO 269 {{17, 455}, {546, 17}} YES 68288064 272630784 Tell us about the ROM. 269 {{17, 405}, {546, 42}} YES 67239424 272760832 If your bug is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.) 268 {{17, 347}, {77, 17}} YES 68288064 272630784 ROM Serial: 268 {{17, 377}, {78, 17}} YES 68288064 272630784 ROM Name: 266 {{100, 345}, {255, 22}} YES -1804468671 272630784 YES 266 {{100, 375}, {255, 22}} YES -1804468671 272630784 YES 265 {{358, 370}, {209, 32}} YES 67239424 134217728 Use Currently Loaded ROM -2038284033 129 200 25 288 {{14, 12}, {112, 32}} YES 67239424 134217728 Continue -2038284033 129 200 25 {580, 567} NSView 268 YES 268 {{342, 55}, {224, 32}} YES 67239424 134217728 Copy Info to Clipboard -2038284033 129 200 25 268 {{17, 52}, {326, 42}} YES 67239424 272760832 Please copy-paste the above information into our tech support webpage. This will ensure the fastest response time from us. 268 {{342, 12}, {224, 32}} YES 67239424 134217728 Go to Tech Support Webpage -2038284033 129 DQ 200 25 268 {{14, 12}, {112, 32}} YES 67239424 134217728 Back -2038284033 129 200 25 256 YES 2304 YES 2322 {{0, 157}, {523, 14}} YES 6 523 1 2305 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {597, 1e+07} {223, 0} {{1, 1}, {523, 443}} 4 256 {{524, 1}, {15, 443}} _doScroller: 1 0.85256409645080566 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{20, 102}, {540, 445}} 18 {580, 567} NSView TroubleshootingWindowDelegate YES readMePath licensePath authorsPath changeLogPath descriptionString buildInfoString aboutTextFilesFont YES YES isSpeedLimitEnabled isCheatingEnabled speedScalar isFrameSkipEnabled emuFlagAdvancedBusLevelTiming emuFlagUseExternalBios emuFlagEmulateBiosInterrupts emuFlagPatchDelayLoop emuFlagUseExternalFirmware emuFlagFirmwareBoot emuFlagDebugConsole emuFlagEmulateEnsata cpuEmulationEngine emuFlagRigorousTiming slot1StatusText slot1DeviceType maxJITBlockSize cdsGPU.layerMainGPU cdsGPU.layerMainBG0 cdsGPU.layerMainBG1 cdsGPU.layerMainBG2 cdsGPU.layerMainBG3 cdsGPU.layerMainOBJ cdsGPU.layerSubGPU cdsGPU.layerSubBG0 cdsGPU.layerSubBG1 cdsGPU.layerSubBG2 cdsGPU.layerSubBG3 cdsGPU.layerSubOBJ CocoaDSCore YES spuInterpolationMode spuSyncMode spuSyncMethod spuAdvancedLogic volume audioOutputEngine YES YES isWorking isRomLoading statusText currentVolumeValue currentVolumeIcon isShowingSaveStateDialog isShowingFileMigrationDialog isUserInterfaceBlockingExecution currentSaveStateURL selectedRomSaveTypeID currentRom render3DRenderingEngine render3DHighPrecisionColorInterpolation render3DEdgeMarking render3DFog render3DTextures render3DDepthComparisonThreshold render3DThreads render3DLineHack render3DMultisample mainWindow mainWindow.displayRotation mainWindow.videoFilterType mainWindow.useBilinearOutput mainWindow.useVerticalSync mainWindow.screenshotFileFormat selectedExportRomSaveID mainWindow.displayGap EmuControllerDelegate YES hasSelection hasItems cheatList cheatSearchStyle cheatSearchSignType cheatSearchSearchValue cheatSearchAddressCount isRunningSearch isSearchStarted cheatDBTitle cheatDBItemCount cheatDBDate YES YES Input_Up Input_Down Input_Left Input_Right Input_A Input_B Input_X Input_Y Input_L Input_R Input_Start Input_Select Input_Microphone Input_Lid Input_Debug Input_SpeedHalf Input_SpeedDouble Input_HUD Input_Execute Input_Pause Input_Reset Arm7BiosImageName Arm9BiosImageName FirmwareImageName AutoloadRomName VideoFilterPreviewImage volumeIconImage R4CheatDatabaseName AdvansceneDatabaseName YES YES romName romSerial supportRequestText bugReportObservedText bugReportExpectedText finalFormText goWebpageButtonTitle copyPasteHelpText YES nickname message favoriteColor birthday language consoleType CocoaDSFirmware YES gameTitle gameCode makerCode cardSize bannerJapanese bannerEnglish bannerFrench bannerGerman bannerItalian bannerSpanish fntOffset fntTableSize fatOffset fatSize iconOffset romSize iconImage arm9BinaryOffset arm9BinaryEntryAddress arm9BinaryStartAddress arm9BinarySize arm7BinaryOffset arm7BinaryEntryAddress arm7BinaryStartAddress arm7BinarySize romInternalName romSerial romNameAndSerialInfo YES enabled cheatType description cheatTypeIcon isSupportedCheatType freezeType codeCount bytes memAddress value code memAddressString memAddressSixDigitString CocoaDSCheatItem YES YES Name IsDefaultType Mappings YES YES intValue0 intValue1 intValue2 intValue3 floatValue0 floatValue1 floatValue2 floatValue3 object0 object1 object2 object3 useInputForIntCoord useInputForFloatCoord useInputForScalar useInputForSender deviceInfoSummary YES YES version kind name dateModified willMigrate YES YES YES YES YES YES enabled cheatTypeIcon description cheatType CocoaDSCheatItem YES YES YES YES YES YES YES value addressString YES YES willAdd description YES YES YES Render3D_DepthComparisonThreshold YES YES performMiniaturize: 37 arrangeInFront: 39 clearRecentDocuments: 127 performZoom: 240 hide: 367 hideOtherApplications: 368 unhideAllApplications: 370 terminate: 449 showHelp: 493 delegate 495 contentView 718 makeKeyAndOrderFront: 782 makeKeyAndOrderFront: 860 launchWebsite: 1101 launchForums: 1102 bugReport: 1103 showGeneralView: 1683 showDisplayView: 1684 showInputView: 1685 window 1689 viewDisplay 1690 viewGeneral 1691 mLoadStateSlot 1775 mSaveStateSlot 1776 value: selection.speedScalar value: selection.speedScalar value selection.speedScalar YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 1869 value: selection.speedScalar value: selection.speedScalar value selection.speedScalar YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEnabled NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 1872 delegate 2025 prefGeneralView 2093 prefWindow 2094 viewSound 2251 showSoundView: 2252 updateVolumeIcon: 2268 selectDisplaySize: 2306 selectDisplaySize: 2307 selectDisplaySize: 2308 selectDisplaySize: 2309 selectDisplayRotation: 2310 selectDisplayRotation: 2311 selectDisplayRotation: 2312 selectDisplayRotation: 2313 delegate 2314 displayRotationField 2315 displayRotationMenu 2316 displayRotationMenuCustomItem 2317 chooseRomForAutoload: 2322 selectAutoloadRomOption: 2323 selectAutoloadRomOption: 2324 viewEmulation 2380 showEmulationView: 2381 selectSPUSyncMode: 2451 selectSPUSyncMode: 2452 selectSPUSyncMethod: 2453 selectSPUSyncMethod: 2454 selectSPUSyncMethod: 2455 spuSyncMethodMenu 2456 chooseFirmwareImage: 2575 chooseARM7BiosImage: 2587 chooseARM9BiosImage: 2588 makeKeyAndOrderFront: 2611 value: arrangedObjects.name value: arrangedObjects.name value arrangedObjects.name YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable NSCreatesSortDescriptor NSRaisesForNotApplicableKeys YES 2 2928 value: arrangedObjects.version value: arrangedObjects.version value arrangedObjects.version YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable NSCreatesSortDescriptor NSRaisesForNotApplicableKeys YES 2 2937 value: arrangedObjects.kind value: arrangedObjects.kind value arrangedObjects.kind YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable NSCreatesSortDescriptor NSRaisesForNotApplicableKeys YES 2 2943 value: arrangedObjects.dateModified value: arrangedObjects.dateModified value arrangedObjects.dateModified YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable NSCreatesSortDescriptor NSRaisesForNotApplicableKeys YES 2 2953 value: arrangedObjects.willMigrate value: arrangedObjects.willMigrate value arrangedObjects.willMigrate YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEnabled NSCreatesSortDescriptor NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 3044 cut: 3252 paste: 3257 redo: 3266 delete: 3267 selectAll: 3270 undo: 3272 selectVideoFilterType: 3346 selectVideoFilterType: 3347 selectVideoFilterType: 3348 selectVideoFilterType: 3349 selectVideoFilterType: 3350 selectVideoFilterType: 3351 selectVideoFilterType: 3352 selectVideoFilterType: 3353 selectVideoFilterType: 3354 selectVideoFilterType: 3355 selectVideoFilterType: 3356 selectVideoFilterType: 3357 selectVideoFilterType: 3358 selectVideoFilterType: 3359 selectVideoFilterType: 3360 selectVideoFilterType: 3361 selectVideoFilterType: 3362 prefWindowController 3532 value: selection.AutoloadRomName value: selection.AutoloadRomName value selection.AutoloadRomName 2 3558 value: selection.FirmwareImageName value: selection.FirmwareImageName value selection.FirmwareImageName 2 3561 value: selection.VideoFilterPreviewImage value: selection.VideoFilterPreviewImage value selection.VideoFilterPreviewImage 2 3562 selectVideoFilterType: 3647 makeKeyAndOrderFront: 3792 value: values.Render3D_HighPrecisionColorInterpolation value: values.Render3D_HighPrecisionColorInterpolation value values.Render3D_HighPrecisionColorInterpolation 2 3830 value: values.Render3D_Fog value: values.Render3D_Fog value values.Render3D_Fog 2 3832 value: values.Render3D_Textures value: values.Render3D_Textures value values.Render3D_Textures 2 3833 value: values.Render3D_DepthComparisonThreshold value: values.Render3D_DepthComparisonThreshold value values.Render3D_DepthComparisonThreshold 2 3834 value: values.Render3D_EdgeMarking value: values.Render3D_EdgeMarking value values.Render3D_EdgeMarking 2 3836 selectedTag: values.Render3D_Threads selectedTag: values.Render3D_Threads selectedTag values.Render3D_Threads 2 3895 value: values.Render3D_LineHack value: values.Render3D_LineHack value values.Render3D_LineHack 2 3902 boxARMBinaries 3954 boxFileSystem 3955 boxGeneralInfo 3956 boxMisc 3957 boxTitles 3958 makeKeyAndOrderFront: 3964 value: selection.Arm9BiosImageName value: selection.Arm9BiosImageName value selection.Arm9BiosImageName 2 4025 value: selection.Arm7BiosImageName value: selection.Arm7BiosImageName value selection.Arm7BiosImageName 2 4026 contentView 4057 parentWindow 4058 makeKeyAndOrderFront: 4063 toggle: 4068 previewImageView 4127 setUseBilinear: 4128 value: values.SPU_AdvancedLogic value: values.SPU_AdvancedLogic value values.SPU_AdvancedLogic 2 4137 selectedTag: values.SPU_InterpolationMode selectedTag: values.SPU_InterpolationMode selectedTag values.SPU_InterpolationMode 2 4138 selectedTag: values.SPU_SyncMode selectedTag: values.SPU_SyncMode selectedTag values.SPU_SyncMode 2 4139 selectedTag: values.SPU_SyncMethod selectedTag: values.SPU_SyncMethod selectedTag values.SPU_SyncMethod 2 4140 value: selection.emuFlagAdvancedBusLevelTiming value: selection.emuFlagAdvancedBusLevelTiming value selection.emuFlagAdvancedBusLevelTiming 2 4141 value: selection.emuFlagUseExternalBios value: selection.emuFlagUseExternalBios value selection.emuFlagUseExternalBios 2 4142 value: selection.emuFlagEmulateBiosInterrupts value: selection.emuFlagEmulateBiosInterrupts value selection.emuFlagEmulateBiosInterrupts 2 4143 value: selection.emuFlagPatchDelayLoop value: selection.emuFlagPatchDelayLoop value selection.emuFlagPatchDelayLoop 2 4145 value: selection.emuFlagUseExternalFirmware value: selection.emuFlagUseExternalFirmware value selection.emuFlagUseExternalFirmware 2 4146 value: selection.emuFlagFirmwareBoot value: selection.emuFlagFirmwareBoot value selection.emuFlagFirmwareBoot 2 4147 value: selection.emuFlagDebugConsole value: selection.emuFlagDebugConsole value selection.emuFlagDebugConsole 2 4148 value: selection.emuFlagEmulateEnsata value: selection.emuFlagEmulateEnsata value selection.emuFlagEmulateEnsata 2 4149 enabled: selection.emuFlagUseExternalBios enabled: selection.emuFlagUseExternalBios enabled selection.emuFlagUseExternalBios 2 4150 enabled: selection.emuFlagUseExternalBios enabled: selection.emuFlagUseExternalBios enabled selection.emuFlagUseExternalBios 2 4151 makeKeyAndOrderFront: 4279 makeKeyAndOrderFront: 4280 firmwareConfigSheet 4466 configureInternalFirmware: 4467 closeFirmwareConfigSheet: 4468 makeKeyAndOrderFront: 4638 value: selection.isCheatingEnabled value: selection.isCheatingEnabled value selection.isCheatingEnabled 2 4648 window 4699 delegate 4700 viewConfigureActionReplayCheat 4702 viewConfigureInternalCheat 4703 cheatConfigBox 4709 delegate 4716 cheatSelectedItemController 4717 selectCheatType: 4718 selectCheatType: 4719 addToList: 4721 applyConfiguration: 4722 cheatListTable 4728 removeFromList: 4730 cheatWindowController 4735 viewConfigureNoSelection 4747 viewConfigureCodeBreakerCheat 4748 cheatListController 4755 parentWindow 4791 toggle: 4819 cheatSearchListController 4922 runExactValueSearch: 4928 runComparativeSearch: 4929 runComparativeSearch: 4930 runComparativeSearch: 4931 runComparativeSearch: 4932 selectCheatSearchStyle: 4933 selectCheatSearchStyle: 4934 viewSearchComparativeContinue 4936 viewSearchComparativeStart 4937 viewSearchExactValue 4938 viewSearchNoSelection 4939 cheatSearchView 4940 resetSearch: 4941 runComparativeSearch: 4943 searchField 4944 cheatSearchListTable 4945 delegate 4946 cdsCoreController 4955 setInternalCheatValue: 5070 value: selection.R4CheatDatabaseName value: selection.R4CheatDatabaseName value selection.R4CheatDatabaseName 2 5073 chooseCheatDatabase: 5078 viewDatabase: 5079 cheatDatabaseSheet 5108 closeCheatDatabaseSheet: 5109 closeCheatDatabaseSheet: 5110 cheatDatabaseController 5119 selectAllCheatsInDatabase: 5122 selectNoneCheatsInDatabase: 5123 cheatWindowController 5143 cheatDatabaseController 5145 cheatListWindow 5146 cheatWindowController 5147 prefWindowController 5149 cdsCoreController 5150 value: selection.AdvansceneDatabaseName value: selection.AdvansceneDatabaseName value selection.AdvansceneDatabaseName 2 5182 chooseAdvansceneDatabase: 5183 value: selection.nickname value: selection.nickname value selection.nickname 2 5478 value: selection.message value: selection.message value selection.message 2 5479 selectedTag: selection.favoriteColor selectedTag: selection.favoriteColor selectedTag selection.favoriteColor 2 5480 value: selection.birthday value: selection.birthday value selection.birthday 2 5481 selectedTag: selection.language selectedTag: selection.language selectedTag selection.language 2 5482 value: selection.value value: selection.value value selection.value 2 5484 selectedTag: selection.bytes selectedTag: selection.bytes selectedTag selection.bytes 2 5485 value: selection.code value: selection.code value selection.code 2 5486 selectedTag: selection.cheatType selectedTag: selection.cheatType selectedTag selection.cheatType 2 5487 value: selection.description value: selection.description value selection.description 2 5488 value: selection.enabled value: selection.enabled value selection.enabled 2 5489 enabled: selection.value enabled: selection.value enabled selection.value NSValueTransformerName NSIsNotNil 2 5490 value: arrangedObjects.enabled value: arrangedObjects.enabled value arrangedObjects.enabled 2 5493 value: arrangedObjects.cheatTypeIcon value: arrangedObjects.cheatTypeIcon value arrangedObjects.cheatTypeIcon 2 5494 value: arrangedObjects.description value: arrangedObjects.description value arrangedObjects.description 2 5495 value: arrangedObjects.willAdd value: arrangedObjects.willAdd value arrangedObjects.willAdd 2 5497 value: arrangedObjects.description value: arrangedObjects.description value arrangedObjects.description NSConditionallySetsEditable 2 5498 value: selection.memAddressSixDigitString value: selection.memAddressSixDigitString value selection.memAddressSixDigitString 2 5499 value: selection.volumeIconImage value: selection.volumeIconImage value selection.volumeIconImage 2 5525 value: arrangedObjects.addressString value: arrangedObjects.addressString value arrangedObjects.addressString 2 5566 value: arrangedObjects.value value: arrangedObjects.value value arrangedObjects.value 2 5567 value: selection.iconImage value: selection.iconImage value selection.iconImage YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEnabled NSRaisesForNotApplicableKeys YES 2 5580 value: selection.makerCode value: selection.makerCode value selection.makerCode YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5583 value: selection.romSize value: selection.romSize value selection.romSize YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5584 value: selection.bannerJapanese value: selection.bannerJapanese value selection.bannerJapanese YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5585 value: selection.bannerEnglish value: selection.bannerEnglish value selection.bannerEnglish YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5586 value: selection.bannerFrench value: selection.bannerFrench value selection.bannerFrench YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5587 value: selection.bannerGerman value: selection.bannerGerman value selection.bannerGerman YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5588 value: selection.bannerItalian value: selection.bannerItalian value selection.bannerItalian YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5589 value: selection.bannerSpanish value: selection.bannerSpanish value selection.bannerSpanish YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5590 value: selection.arm9BinaryOffset value: selection.arm9BinaryOffset value selection.arm9BinaryOffset YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5591 value: selection.arm9BinaryEntryAddress value: selection.arm9BinaryEntryAddress value selection.arm9BinaryEntryAddress YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5592 value: selection.arm9BinaryStartAddress value: selection.arm9BinaryStartAddress value selection.arm9BinaryStartAddress YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5593 value: selection.arm9BinarySize value: selection.arm9BinarySize value selection.arm9BinarySize YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5594 value: selection.arm7BinaryOffset value: selection.arm7BinaryOffset value selection.arm7BinaryOffset YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5595 value: selection.arm7BinaryEntryAddress value: selection.arm7BinaryEntryAddress value selection.arm7BinaryEntryAddress YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5596 value: selection.arm7BinaryStartAddress value: selection.arm7BinaryStartAddress value selection.arm7BinaryStartAddress YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5597 value: selection.arm7BinarySize value: selection.arm7BinarySize value selection.arm7BinarySize YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5598 value: selection.fntOffset value: selection.fntOffset value selection.fntOffset YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5599 value: selection.fntTableSize value: selection.fntTableSize value selection.fntTableSize YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5600 value: selection.fatOffset value: selection.fatOffset value selection.fatOffset YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5601 value: selection.fatSize value: selection.fatSize value selection.fatSize YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5602 value: selection.iconOffset value: selection.iconOffset value selection.iconOffset YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5603 value: selection.romSize value: selection.romSize value selection.romSize YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5604 selectedTag: selection.audioOutputEngine selectedTag: selection.audioOutputEngine selectedTag selection.audioOutputEngine 2 5608 value: selection.spuAdvancedLogic value: selection.spuAdvancedLogic value selection.spuAdvancedLogic 2 5609 selectedTag: selection.spuInterpolationMode selectedTag: selection.spuInterpolationMode selectedTag selection.spuInterpolationMode 2 5610 selectedTag: selection.spuSyncMode selectedTag: selection.spuSyncMode selectedTag selection.spuSyncMode 2 5611 selectedTag: selection.spuSyncMethod selectedTag: selection.spuSyncMethod selectedTag selection.spuSyncMethod 2 5612 value: selection.cheatDBTitle value: selection.cheatDBTitle value selection.cheatDBTitle 2 5618 value: selection.cheatDBDate value: selection.cheatDBDate value selection.cheatDBDate 2 5619 value: selection.cheatDBItemCount value: selection.cheatDBItemCount value selection.cheatDBItemCount 2 5620 selectedTag: selection.cheatSearchStyle selectedTag: selection.cheatSearchStyle selectedTag selection.cheatSearchStyle 2 5621 value: selection.cheatSearchAddressCount value: selection.cheatSearchAddressCount value selection.cheatSearchAddressCount 2 5622 value: selection.cheatSearchSearchValue value: selection.cheatSearchSearchValue value selection.cheatSearchSearchValue 2 5623 animate: selection.isRunningSearch animate: selection.isRunningSearch animate selection.isRunningSearch 2 5626 enabled: selection.isRunningSearch enabled: selection.isRunningSearch enabled selection.isRunningSearch NSValueTransformerName NSNegateBoolean 2 5627 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 5644 value: values.Advanscene_AutoDetectRomSaveType value: values.Advanscene_AutoDetectRomSaveType value values.Advanscene_AutoDetectRomSaveType 2 5647 makeKeyAndOrderFront: 5720 aboutWindowController 5721 value: selection.romSerial value: selection.romSerial value selection.romSerial YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5722 value: selection.romInternalName value: selection.romInternalName value selection.romInternalName YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5723 value: values.FirmwareConfig_Nickname value: values.FirmwareConfig_Nickname value values.FirmwareConfig_Nickname 2 5729 value: values.FirmwareConfig_Message value: values.FirmwareConfig_Message value values.FirmwareConfig_Message 2 5730 selectedTag: values.FirmwareConfig_FavoriteColor selectedTag: values.FirmwareConfig_FavoriteColor selectedTag values.FirmwareConfig_FavoriteColor 2 5731 value: values.FirmwareConfig_Birthday value: values.FirmwareConfig_Birthday value values.FirmwareConfig_Birthday 2 5732 selectedTag: values.FirmwareConfig_Language selectedTag: values.FirmwareConfig_Language selectedTag values.FirmwareConfig_Language 2 5733 selectDisplayMode: 5735 selectDisplayMode: 5736 selectDisplayMode: 5737 value: selection.isSpeedLimitEnabled value: selection.isSpeedLimitEnabled value selection.isSpeedLimitEnabled YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEnabled NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 5971 selectedTag: values.DisplayView_Mode selectedTag: values.DisplayView_Mode selectedTag values.DisplayView_Mode 2 5972 selectedTag: values.DisplayView_Size selectedTag: values.DisplayView_Size selectedTag values.DisplayView_Size 2 5973 value: values.DisplayView_Rotation value: values.DisplayView_Rotation value values.DisplayView_Rotation 2 5974 value: values.DisplayView_UseBilinearOutput value: values.DisplayView_UseBilinearOutput value values.DisplayView_UseBilinearOutput 2 5975 selectedTag: values.DisplayView_VideoFilter selectedTag: values.DisplayView_VideoFilter selectedTag values.DisplayView_VideoFilter 2 5976 selectedTag: values.Sound_AudioOutputEngine selectedTag: values.Sound_AudioOutputEngine selectedTag values.Sound_AudioOutputEngine 2 5989 value: values.Sound_Volume value: values.Sound_Volume value values.Sound_Volume 2 5990 value: values.Sound_Volume value: values.Sound_Volume value values.Sound_Volume YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys YES 2 5991 enabled: values.Advanscene_DatabasePath enabled: values.Advanscene_DatabasePath enabled values.Advanscene_DatabasePath NSValueTransformerName NSIsNotNil 2 5992 value: values.Emulation_AdvancedBusLevelTiming value: values.Emulation_AdvancedBusLevelTiming value values.Emulation_AdvancedBusLevelTiming 2 5993 value: values.Emulation_BIOSEmulateSWI value: values.Emulation_BIOSEmulateSWI value values.Emulation_BIOSEmulateSWI 2 5994 value: values.Emulation_BIOSPatchDelayLoopSWI value: values.Emulation_BIOSPatchDelayLoopSWI value values.Emulation_BIOSPatchDelayLoopSWI 2 5995 value: values.Emulation_EmulateEnsata value: values.Emulation_EmulateEnsata value values.Emulation_EmulateEnsata 2 5996 value: values.Emulation_UseDebugConsole value: values.Emulation_UseDebugConsole value values.Emulation_UseDebugConsole 2 5998 value: values.Emulation_FirmwareBoot value: values.Emulation_FirmwareBoot value values.Emulation_FirmwareBoot 2 5999 value: values.Emulation_UseExternalBIOSImages value: values.Emulation_UseExternalBIOSImages value values.Emulation_UseExternalBIOSImages 2 6000 enabled: values.Emulation_UseExternalBIOSImages enabled: values.Emulation_UseExternalBIOSImages enabled values.Emulation_UseExternalBIOSImages NSRaisesForNotApplicableKeys 2 6001 enabled: values.Emulation_UseExternalBIOSImages enabled: values.Emulation_UseExternalBIOSImages enabled values.Emulation_UseExternalBIOSImages NSRaisesForNotApplicableKeys 2 6004 value: values.Emulation_UseExternalFirmwareImage value: values.Emulation_UseExternalFirmwareImage value values.Emulation_UseExternalFirmwareImage 2 6011 enabled: values.Emulation_UseExternalFirmwareImage enabled: values.Emulation_UseExternalFirmwareImage enabled values.Emulation_UseExternalFirmwareImage NSRaisesForNotApplicableKeys 2 6012 enabled: values.Emulation_UseExternalFirmwareImage enabled: values.Emulation_UseExternalFirmwareImage enabled values.Emulation_UseExternalFirmwareImage 2 6013 enabled2: values.Emulation_UseExternalBIOSImages enabled2: values.Emulation_UseExternalBIOSImages enabled2 values.Emulation_UseExternalBIOSImages YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6014 enabled: values.BIOS_ARM9ImagePath enabled: values.BIOS_ARM9ImagePath enabled values.BIOS_ARM9ImagePath NSValueTransformerName NSIsNotNil 2 6018 enabled2: values.BIOS_ARM9ImagePath enabled2: values.BIOS_ARM9ImagePath enabled2 values.BIOS_ARM9ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6020 enabled2: values.BIOS_ARM9ImagePath enabled2: values.BIOS_ARM9ImagePath enabled2 values.BIOS_ARM9ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6022 enabled3: values.BIOS_ARM9ImagePath enabled3: values.BIOS_ARM9ImagePath enabled3 values.BIOS_ARM9ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6024 enabled2: values.BIOS_ARM7ImagePath enabled2: values.BIOS_ARM7ImagePath enabled2 values.BIOS_ARM7ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6027 enabled3: values.BIOS_ARM7ImagePath enabled3: values.BIOS_ARM7ImagePath enabled3 values.BIOS_ARM7ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6028 enabled3: values.BIOS_ARM7ImagePath enabled3: values.BIOS_ARM7ImagePath enabled3 values.BIOS_ARM7ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6029 enabled4: values.BIOS_ARM7ImagePath enabled4: values.BIOS_ARM7ImagePath enabled4 values.BIOS_ARM7ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6030 enabled: values.Emulation_FirmwareImagePath enabled: values.Emulation_FirmwareImagePath enabled values.Emulation_FirmwareImagePath NSValueTransformerName NSIsNotNil 2 6034 enabled5: values.Emulation_FirmwareImagePath enabled5: values.Emulation_FirmwareImagePath enabled5 values.Emulation_FirmwareImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6037 enabled: selection.emuFlagUseExternalFirmware enabled: selection.emuFlagUseExternalFirmware enabled selection.emuFlagUseExternalFirmware 2 6041 enabled2: selection.emuFlagUseExternalBios enabled2: selection.emuFlagUseExternalBios enabled2 selection.emuFlagUseExternalBios YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6042 enabled: values.Emulation_FirmwareImagePath enabled: values.Emulation_FirmwareImagePath enabled values.Emulation_FirmwareImagePath NSValueTransformerName NSIsNotNil 2 6048 enabled3: values.BIOS_ARM9ImagePath enabled3: values.BIOS_ARM9ImagePath enabled3 values.BIOS_ARM9ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6058 enabled4: values.BIOS_ARM7ImagePath enabled4: values.BIOS_ARM7ImagePath enabled4 values.BIOS_ARM7ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6067 enabled5: values.Emulation_FirmwareImagePath enabled5: values.Emulation_FirmwareImagePath enabled5 values.Emulation_FirmwareImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6069 enabled2: values.BIOS_ARM9ImagePath enabled2: values.BIOS_ARM9ImagePath enabled2 values.BIOS_ARM9ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6076 enabled3: values.BIOS_ARM7ImagePath enabled3: values.BIOS_ARM7ImagePath enabled3 values.BIOS_ARM7ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6081 enabled2: values.BIOS_ARM9ImagePath enabled2: values.BIOS_ARM9ImagePath enabled2 values.BIOS_ARM9ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6088 enabled3: values.BIOS_ARM7ImagePath enabled3: values.BIOS_ARM7ImagePath enabled3 values.BIOS_ARM7ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6093 enabled: values.BIOS_ARM9ImagePath enabled: values.BIOS_ARM9ImagePath enabled values.BIOS_ARM9ImagePath NSValueTransformerName NSIsNotNil 2 6100 enabled2: values.BIOS_ARM7ImagePath enabled2: values.BIOS_ARM7ImagePath enabled2 values.BIOS_ARM7ImagePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6105 selectedTag: values.Render3D_RenderingEngine selectedTag: values.Render3D_RenderingEngine selectedTag values.Render3D_RenderingEngine 2 6109 value: values.General_ExecuteROMOnLoad value: values.General_ExecuteROMOnLoad value values.General_ExecuteROMOnLoad 2 6119 value: values.General_AutoloadROMOnLaunch value: values.General_AutoloadROMOnLaunch value values.General_AutoloadROMOnLaunch 2 6120 selectedTag: values.General_AutoloadROMOption selectedTag: values.General_AutoloadROMOption selectedTag values.General_AutoloadROMOption 2 6121 enabled: values.General_AutoloadROMOnLaunch enabled: values.General_AutoloadROMOnLaunch enabled values.General_AutoloadROMOnLaunch 2 6122 value: values.General_DoNotAskMigrate value: values.General_DoNotAskMigrate value values.General_DoNotAskMigrate 2 6123 value: values.General_DoNotAskMigrate value: values.General_DoNotAskMigrate value values.General_DoNotAskMigrate 2 6124 enabled: values.General_AutoloadROMSelectedPath enabled: values.General_AutoloadROMSelectedPath enabled values.General_AutoloadROMSelectedPath NSValueTransformerName NSIsNotNil 2 6125 value: values.DisplayView_UseVerticalSync value: values.DisplayView_UseVerticalSync value values.DisplayView_UseVerticalSync 2 6164 selectedTag: values.DisplayViewCombo_Orientation selectedTag: values.DisplayViewCombo_Orientation selectedTag values.DisplayViewCombo_Orientation 2 6226 selectedTag: values.DisplayViewCombo_Order selectedTag: values.DisplayViewCombo_Order selectedTag values.DisplayViewCombo_Order 2 6230 value: selection.buildInfoString value: selection.buildInfoString value selection.buildInfoString 2 6231 value: selection.descriptionString value: selection.descriptionString value selection.descriptionString 2 6232 selectVideoFilterType: 6239 troubleshootingWindowController 6442 window 6443 viewBugReport 6444 viewFinishedForm 6445 viewSupportRequest 6446 troubleshootingWindow 6449 delegate 6450 supportRequest: 6452 title: selection.goWebpageButtonTitle title: selection.goWebpageButtonTitle title selection.goWebpageButtonTitle 2 6457 value: selection.romName value: selection.romName value selection.romName 2 6459 value: selection.romSerial value: selection.romSerial value selection.romSerial 2 6460 value: selection.romName value: selection.romName value selection.romName 2 6463 value: selection.romSerial value: selection.romSerial value selection.romSerial 2 6464 romInfoController 6467 continueToFinalForm: 6468 continueToFinalForm: 6469 copyRomInfoToTextFields: 6470 copyRomInfoToTextFields: 6471 backForm: 6472 value: selection.bugReportObservedText value: selection.bugReportObservedText value selection.bugReportObservedText 2 6490 value: selection.bugReportExpectedText value: selection.bugReportExpectedText value selection.bugReportExpectedText 2 6495 value: selection.supportRequestText value: selection.supportRequestText value selection.supportRequestText 2 6500 value: selection.finalFormText value: selection.finalFormText value selection.finalFormText YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable NSRaisesForNotApplicableKeys YES 2 6507 font: selection.aboutTextFilesFont font: selection.aboutTextFilesFont font selection.aboutTextFilesFont 2 6589 font: selection.aboutTextFilesFont font: selection.aboutTextFilesFont font selection.aboutTextFilesFont 2 6593 font: selection.aboutTextFilesFont font: selection.aboutTextFilesFont font selection.aboutTextFilesFont 2 6594 font: selection.aboutTextFilesFont font: selection.aboutTextFilesFont font selection.aboutTextFilesFont 2 6595 valuePath: selection.readMePath valuePath: selection.readMePath valuePath selection.readMePath YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable YES 2 6598 valuePath: selection.licensePath valuePath: selection.licensePath valuePath selection.licensePath YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable YES 2 6601 valuePath: selection.authorsPath valuePath: selection.authorsPath valuePath selection.authorsPath YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable YES 2 6604 valuePath: selection.changeLogPath valuePath: selection.changeLogPath valuePath selection.changeLogPath YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEditable YES 2 6610 copyInfoToPasteboard: 6613 goToWebpage: 6614 value: selection.copyPasteHelpText value: selection.copyPasteHelpText value selection.copyPasteHelpText NSAllowsEditingMultipleValuesSelection 2 6616 value: values.Render3D_Multisample value: values.Render3D_Multisample value values.Render3D_Multisample 2 6625 value: values.Emulation_RigorousTiming value: values.Emulation_RigorousTiming value values.Emulation_RigorousTiming 2 6629 value: selection.emuFlagRigorousTiming value: selection.emuFlagRigorousTiming value selection.emuFlagRigorousTiming 2 6632 cdsCoreController 6655 cdsSoundController 6656 cheatDatabaseController 6657 cheatListController 6658 cheatWindowController 6659 cheatWindowDelegate 6660 exportRomSavePanelAccessoryView 6661 firmwarePanelController 6662 romInfoPanelController 6663 changeAudioEngine: 6680 changeAudioEngine: 6681 changeSpuAdvancedLogic: 6682 changeSpuInterpolationMode: 6683 changeSpuInterpolationMode: 6684 changeSpuInterpolationMode: 6685 changeSpuSyncMethod: 6686 changeSpuSyncMethod: 6687 changeSpuSyncMethod: 6688 changeSpuSyncMode: 6689 changeSpuSyncMode: 6690 changeVolume: 6691 writeDefaults3DRenderingSettings: 6692 writeDefaultsEmulationSettings: 6693 writeDefaultsSoundSettings: 6694 changeRomSaveType: 6695 changeRomSaveType: 6696 changeRomSaveType: 6697 changeRomSaveType: 6698 changeRomSaveType: 6699 changeRomSaveType: 6700 changeRomSaveType: 6701 changeRomSaveType: 6702 changeRomSaveType: 6703 changeRomSaveType: 6704 changeRomSaveType: 6705 changeRomSaveType: 6706 changeRomSaveType: 6707 changeRomSaveType: 6708 closeRom: 6709 exportRomSave: 6710 importRomSave: 6711 openRom: 6712 revertEmuSaveState: 6713 saveEmuSaveState: 6714 saveEmuSaveStateAs: 6715 toggleAutoFrameSkip: 6716 changeCoreEmuFlags: 6723 changeCoreEmuFlags: 6724 changeCoreEmuFlags: 6725 changeCoreEmuFlags: 6726 changeCoreEmuFlags: 6727 changeCoreEmuFlags: 6728 changeCoreEmuFlags: 6729 changeCoreEmuFlags: 6730 changeCoreEmuFlags: 6731 openEmuSaveState: 6744 changeFirmwareSettings: 6745 changeCoreSpeed: 6747 changeCoreSpeed: 6748 changeCoreSpeed: 6749 changeCoreSpeed: 6750 value: selection.currentVolumeValue value: selection.currentVolumeValue value selection.currentVolumeValue 2 6765 value: selection.currentVolumeIcon value: selection.currentVolumeIcon value selection.currentVolumeIcon 2 6767 value: selection.currentVolumeValue value: selection.currentVolumeValue value selection.currentVolumeValue YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 6769 closeSheet: 6799 closeSheet: 6800 closeSheet: 6801 closeSheet: 6802 closeSheet: 6803 saveFileMigrationSheet 6804 saveStatePrecloseSheet 6805 emuControlController 6808 delegate 6809 selectedTag: selection.render3DRenderingEngine selectedTag: selection.render3DRenderingEngine selectedTag selection.render3DRenderingEngine 2 6815 value: selection.render3DLineHack value: selection.render3DLineHack value selection.render3DLineHack 2 6816 value: selection.render3DTextures value: selection.render3DTextures value selection.render3DTextures 2 6817 value: selection.render3DHighPrecisionColorInterpolation value: selection.render3DHighPrecisionColorInterpolation value selection.render3DHighPrecisionColorInterpolation 2 6818 value: selection.render3DEdgeMarking value: selection.render3DEdgeMarking value selection.render3DEdgeMarking 2 6819 value: selection.render3DFog value: selection.render3DFog value selection.render3DFog 2 6820 value: selection.render3DDepthComparisonThreshold value: selection.render3DDepthComparisonThreshold value selection.render3DDepthComparisonThreshold 2 6821 value: selection.render3DMultisample value: selection.render3DMultisample value selection.render3DMultisample 2 6822 selectedTag: selection.render3DThreads selectedTag: selection.render3DThreads selectedTag selection.render3DThreads 2 6823 cdsSoundController 6824 romInfoPanelController 6825 content 6826 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6864 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6866 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6869 enabled2: selection.hasSelection enabled2: selection.hasSelection enabled2 selection.hasSelection YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6870 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6873 enabled2: values.R4Cheat_DatabasePath enabled2: values.R4Cheat_DatabasePath enabled2 values.R4Cheat_DatabasePath YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6874 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6877 enabled2: selection.isSupportedCheatType enabled2: selection.isSupportedCheatType enabled2 selection.isSupportedCheatType YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6878 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6880 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6882 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6886 enabled2: selection.hasSelection enabled2: selection.hasSelection enabled2 selection.hasSelection YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6887 enabled3: selection.isSupportedCheatType enabled3: selection.isSupportedCheatType enabled3 selection.isSupportedCheatType YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6888 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6890 enabled3: selection.currentRom enabled3: selection.currentRom enabled3 selection.currentRom YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6892 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6894 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6896 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6900 enabled2: selection.cheatSearchSearchValue enabled2: selection.cheatSearchSearchValue enabled2 selection.cheatSearchSearchValue YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSIsNotNil 2 6901 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSNegateBoolean 2 6902 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6906 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6907 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSNegateBoolean 2 6908 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6912 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6913 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSNegateBoolean 2 6914 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6918 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6919 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSNegateBoolean 2 6920 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6924 enabled2: selection.isSearchStarted enabled2: selection.isSearchStarted enabled2 selection.isSearchStarted YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder YES 2 6925 enabled3: selection.isRunningSearch enabled3: selection.isRunningSearch enabled3 selection.isRunningSearch YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSNegateBoolean 2 6926 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 6929 enabled2: selection.isRunningSearch enabled2: selection.isRunningSearch enabled2 selection.isRunningSearch YES YES NSMultipleValuesPlaceholder NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder NSValueTransformerName YES NSNegateBoolean 2 6930 emuController 6939 newDisplayWindow: 6940 changeScale: 6941 changeScale: 6942 changeScale: 6943 changeScale: 6944 changeScale: 6945 toggleKeepMinDisplaySizeAtNormal: 6946 toggleStatusBar: 6947 runToolbarCustomizationPalette: 6948 toggleToolbarShown: 6949 changeDisplayMode: 6950 changeDisplayMode: 6951 changeDisplayMode: 6952 changeDisplayOrientation: 6953 changeDisplayOrientation: 6954 changeDisplayOrder: 6955 changeDisplayOrder: 6956 changeRotationRelative: 6957 changeRotationRelative: 6958 changeRotation: 6959 changeRotation: 6960 changeRotation: 6961 changeRotation: 6962 changeRotation: 6963 changeRotation: 6964 value: selection.mainWindow.displayRotation value: selection.mainWindow.displayRotation value selection.mainWindow.displayRotation 2 6966 value: selection.mainWindow.displayRotation value: selection.mainWindow.displayRotation value selection.mainWindow.displayRotation 2 6967 selectedTag: selection.mainWindow.videoFilterType selectedTag: selection.mainWindow.videoFilterType selectedTag selection.mainWindow.videoFilterType 2 6989 value: selection.mainWindow.useBilinearOutput value: selection.mainWindow.useBilinearOutput value selection.mainWindow.useBilinearOutput 2 6990 value: selection.mainWindow.useVerticalSync value: selection.mainWindow.useVerticalSync value selection.mainWindow.useVerticalSync 2 6991 writeDefaultsDisplayRotation: 6992 writeDefaultsHUDSettings: 6993 writeDefaultsDisplayVideoSettings: 6994 saveScreenshotAs: 6997 closeWindow: 7000 selectedTag: selection.selectedExportRomSaveID selectedTag: selection.selectedExportRomSaveID selectedTag selection.selectedExportRomSaveID 2 7001 emuControl 7003 inputManager 7004 inputManager 7005 toggleExecutePause: 7009 reset: 7010 copy: 7011 toggleCheats: 7012 toggleSpeedLimiter: 7013 viewInput 7108 inputPrefsView 7109 inputManager 7110 prefWindow 7111 dataSource 7164 delegate 7165 removeInput: 7167 setInputAdd: 7170 inputSettingsGPUState 7296 inputSettingsLoadStateSlot 7297 inputSettingsMicrophone 7298 inputSettingsSaveStateSlot 7299 inputSettingsTouch 7300 showSettingsSheet: 7321 closeSettingsSheet: 7322 closeSettingsSheet: 7323 closeSettingsSheet: 7324 closeSettingsSheet: 7325 closeSettingsSheet: 7326 inputSettingsController 7391 closeSettingsSheet: 7394 closeSettingsSheet: 7397 closeSettingsSheet: 7400 closeSettingsSheet: 7403 closeSettingsSheet: 7406 selectedTag: selection.intValue0 selectedTag: selection.intValue0 selectedTag selection.intValue0 2 7407 selectedTag: selection.intValue0 selectedTag: selection.intValue0 selectedTag selection.intValue0 2 7410 selectedTag: selection.intValue0 selectedTag: selection.intValue0 selectedTag selection.intValue0 2 7411 enabled: selection.useInputForIntCoord enabled: selection.useInputForIntCoord enabled selection.useInputForIntCoord NSValueTransformerName NSNegateBoolean 2 7417 enabled: selection.useInputForIntCoord enabled: selection.useInputForIntCoord enabled selection.useInputForIntCoord NSValueTransformerName NSNegateBoolean 2 7419 value: selection.useInputForIntCoord value: selection.useInputForIntCoord value selection.useInputForIntCoord NSValueTransformerName NSNegateBoolean 2 7421 value: selection.intValue1 value: selection.intValue1 value selection.intValue1 2 7422 value: selection.intValue2 value: selection.intValue2 value selection.intValue2 2 7423 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7435 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7438 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7441 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7444 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7447 selectedTag: selection.intValue1 selectedTag: selection.intValue1 selectedTag selection.intValue1 NSConditionallySetsEnabled 2 7448 value: selection.deviceInfoSummary value: selection.deviceInfoSummary value selection.deviceInfoSummary 2 7453 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 7482 inputSettingsSetSpeedLimit 7484 closeSettingsSheet: 7490 closeSettingsSheet: 7491 changeSpeed: 7492 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEnabled NSContinuouslyUpdatesValue NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 7495 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7674 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7676 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7678 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7682 inputProfileController 7685 inputProfileMenu 7686 inputProfileSheet 7687 profileApply: 7688 profileRename: 7689 profileSave: 7690 profileView: 7691 profileDelete: 7692 profileNew: 7693 closeProfileSheet: 7696 profileDelete: 7697 profileApply: 7698 inputProfileNextButton 7700 inputProfilePreviousButton 7701 profileSelect: 7702 profileSelect: 7703 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7705 delegate 7706 enabled: selection.IsDefaultType enabled: selection.IsDefaultType enabled selection.IsDefaultType NSValueTransformerName NSNegateBoolean 2 7719 delegate 7720 inputProfileRenameSheet 7731 closeProfileRenameSheet: 7732 inputPrefOutlineView 7734 inputManager 7741 dataSource 7742 delegate 7743 profileOutlineView 7744 value: selection.Name value: selection.Name value selection.Name NSContinuouslyUpdatesValue 2 7749 value: selection.Name value: selection.Name value selection.Name NSContinuouslyUpdatesValue 2 7750 enabled: selection.Name enabled: selection.Name enabled selection.Name NSValueTransformerName NSIsNotNil 2 7752 enabled: selection.Name enabled: selection.Name enabled selection.Name NSValueTransformerName NSIsNotNil 2 7754 value: selection.object1 value: selection.object1 value selection.object1 2 7755 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 2 7763 value: selection.floatValue0 value: selection.floatValue0 value selection.floatValue0 2 7764 audioFileChoose: 7769 audioFileChooseNone: 7770 delegate 7795 changeDisplayGap: 7797 changeDisplayGap: 7798 changeDisplayGap: 7799 changeDisplayGap: 7800 changeDisplayGap: 7801 value: values.DisplayViewCombo_Gap value: values.DisplayViewCombo_Gap value values.DisplayViewCombo_Gap 2 7814 value: values.DisplayViewCombo_Gap value: values.DisplayViewCombo_Gap value values.DisplayViewCombo_Gap NSContinuouslyUpdatesValue 2 7816 value: selection.mainWindow.displayGap value: selection.mainWindow.displayGap value selection.mainWindow.displayGap NSContinuouslyUpdatesValue 2 7842 makeKeyAndOrderFront: 7850 changeDisplayGap: 7851 changeDisplayGap: 7852 value: selection.mainWindow.displayGap value: selection.mainWindow.displayGap value selection.mainWindow.displayGap 2 7853 writeDefaultsDisplayGap: 7854 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 7885 makeKeyAndOrderFront: 7887 slot1Eject: 7888 reset: 7889 value: values.EmulationSLOT1_R4StoragePath value: values.EmulationSLOT1_R4StoragePath value values.EmulationSLOT1_R4StoragePath 2 7891 value: selection.slot1StatusText value: selection.slot1StatusText value selection.slot1StatusText 2 7892 selectedTag: selection.slot1DeviceType selectedTag: selection.slot1DeviceType selectedTag selection.slot1DeviceType 2 7896 chooseSlot1R4Directory: 7897 slot1ManagerWindow 7898 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 7975 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 7976 toolTip: values.EmulationSLOT1_R4StoragePath toolTip: values.EmulationSLOT1_R4StoragePath toolTip values.EmulationSLOT1_R4StoragePath 2 7977 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 7979 loadRecentRom: 7983 clearRecentDocuments: 7999 loadRecentRom: 8000 closeRom: 8001 openRom: 8002 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8011 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 8017 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 8018 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 8019 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8020 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8026 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 8027 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 8028 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 8029 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 8035 value: selection.romNameAndSerialInfo value: selection.romNameAndSerialInfo value selection.romNameAndSerialInfo 2 8036 animate: selection.isRomLoading animate: selection.isRomLoading animate selection.isRomLoading 2 8037 enabled: selection.isRomLoading enabled: selection.isRomLoading enabled selection.isRomLoading NSValueTransformerName NSNegateBoolean 2 8038 enabled: selection.currentRom enabled: selection.currentRom enabled selection.currentRom NSValueTransformerName NSIsNotNil 2 8042 value: selection.maxJITBlockSize value: selection.maxJITBlockSize value selection.maxJITBlockSize 2 8062 value: selection.maxJITBlockSize value: selection.maxJITBlockSize value selection.maxJITBlockSize 2 8063 value: values.Emulation_MaxJITBlockSize value: values.Emulation_MaxJITBlockSize value values.Emulation_MaxJITBlockSize 2 8064 value: values.Emulation_MaxJITBlockSize value: values.Emulation_MaxJITBlockSize value values.Emulation_MaxJITBlockSize 2 8065 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8067 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8068 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8069 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8070 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8071 selectedTag: selection.cpuEmulationEngine selectedTag: selection.cpuEmulationEngine selectedTag selection.cpuEmulationEngine NSConditionallySetsEnabled 2 8072 enabled: isAppRunningOnIntel enabled: isAppRunningOnIntel enabled isAppRunningOnIntel 2 8073 selectedTag: values.Emulation_CPUEmulationEngine selectedTag: values.Emulation_CPUEmulationEngine selectedTag values.Emulation_CPUEmulationEngine NSConditionallySetsEnabled 2 8074 selectAll: 8085 selectNone: 8086 handleChoice: 8087 handleChoice: 8088 handleChoice: 8089 window 8090 delegate 8091 enabled: filesPresent enabled: filesPresent enabled filesPresent 2 8094 enabled: filesPresent enabled: filesPresent enabled filesPresent 2 8095 fileListController 8097 migrationDelegate 8098 updateAndShowWindow: 8133 makeKeyAndOrderFront: 8163 revealGameDataFolderInFinder: 8167 revealRomInFinder: 8168 value: selection.cdsGPU.layerMainGPU value: selection.cdsGPU.layerMainGPU value selection.cdsGPU.layerMainGPU 2 8169 value: selection.cdsGPU.layerMainBG0 value: selection.cdsGPU.layerMainBG0 value selection.cdsGPU.layerMainBG0 2 8170 value: selection.cdsGPU.layerMainBG1 value: selection.cdsGPU.layerMainBG1 value selection.cdsGPU.layerMainBG1 2 8171 value: selection.cdsGPU.layerMainBG2 value: selection.cdsGPU.layerMainBG2 value selection.cdsGPU.layerMainBG2 2 8172 value: selection.cdsGPU.layerMainBG3 value: selection.cdsGPU.layerMainBG3 value selection.cdsGPU.layerMainBG3 2 8173 value: selection.cdsGPU.layerMainOBJ value: selection.cdsGPU.layerMainOBJ value selection.cdsGPU.layerMainOBJ 2 8174 value: selection.cdsGPU.layerSubGPU value: selection.cdsGPU.layerSubGPU value selection.cdsGPU.layerSubGPU 2 8175 value: selection.cdsGPU.layerSubBG0 value: selection.cdsGPU.layerSubBG0 value selection.cdsGPU.layerSubBG0 2 8176 value: selection.cdsGPU.layerSubBG1 value: selection.cdsGPU.layerSubBG1 value selection.cdsGPU.layerSubBG1 2 8177 value: selection.cdsGPU.layerSubBG2 value: selection.cdsGPU.layerSubBG2 value selection.cdsGPU.layerSubBG2 2 8178 value: selection.cdsGPU.layerSubBG3 value: selection.cdsGPU.layerSubBG3 value selection.cdsGPU.layerSubBG3 2 8179 value: selection.cdsGPU.layerSubOBJ value: selection.cdsGPU.layerSubOBJ value selection.cdsGPU.layerSubOBJ 2 8180 selectDisplaySize: 8187 value: selection.render3DDepthComparisonThreshold value: selection.render3DDepthComparisonThreshold value selection.render3DDepthComparisonThreshold 2 8193 value: values.Render3D_DepthComparisonThreshold value: values.Render3D_DepthComparisonThreshold value values.Render3D_DepthComparisonThreshold 2 8198 YES 0 -2 File's Owner -1 First Responder -3 Application 29 YES 19 YES 56 YES 83 YES 81 YES 75 80 72 124 YES 79 112 74 57 YES 58 134 150 136 144 129 143 236 131 YES 149 145 130 295 YES 296 YES 297 298 494 App Delegate 534 535 538 YES 539 YES 541 YES 542 YES 575 YES 576 YES 578 594 596 607 YES 627 YES 628 YES 629 YES 634 635 714 YES Cheat Search Drawer Content View 715 Cheat Search Drawer 783 YES 784 YES 785 787 YES 788 YES 789 794 YES 795 YES 796 YES 797 YES 823 YES 824 825 YES 826 827 YES 828 829 YES 830 831 YES 832 833 YES 834 835 YES 836 843 YES 844 845 YES 846 850 854 855 861 YES 862 YES 865 YES 866 872 YES 875 YES 876 YES 877 YES 878 YES 879 YES 880 883 YES 884 885 YES 886 887 YES 888 889 YES 890 897 YES 898 899 YES 900 901 YES 902 903 YES 904 905 YES 906 907 YES 908 909 YES 910 911 YES 912 913 YES 914 YES 924 YES 925 926 YES 927 928 YES 929 930 YES 931 932 YES 933 934 YES 935 936 YES 937 938 YES 939 940 YES 941 942 YES 943 944 YES 945 946 YES 947 948 YES 951 949 YES 950 952 YES 953 YES 954 955 956 YES 957 YES 958 959 960 YES 961 YES 962 963 964 YES 967 965 YES 966 968 YES 969 YES 970 971 983 YES 984 YES 987 989 990 991 993 998 YES 999 YES 1000 YES 1001 1002 YES 1003 1004 YES 1005 1006 YES 1007 1008 YES 1009 1010 YES 1011 1012 YES 1013 1016 YES 1017 1020 YES 1021 1024 YES 1025 YES 1034 YES 1035 1036 YES 1037 1038 YES 1039 1040 YES 1041 1113 1114 1115 1118 1119 1120 1298 YES General Preferences View 1538 YES 1299 YES 1300 1539 YES 1540 1541 YES 1542 YES 1543 YES 1544 1545 1547 YES 1548 1584 YES Display Preferences View 1615 YES 1616 YES 1619 YES 1620 YES 1621 YES 1626 YES 1627 YES 1628 YES 1629 1630 1631 1632 YES 1633 1634 YES 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 YES 1651 1679 1680 1681 1682 1721 CocoaDS Core Controller 1736 1855 1856 YES 1857 YES 1858 YES 1859 1976 YES 1977 1978 YES 1979 1980 YES 1981 1982 YES 1983 1986 1987 YES 1988 YES 1998 YES 1999 2000 2095 2098 2154 YES 2155 2246 2248 YES Sound Preferences View 2250 YES 2253 YES 2254 2257 YES 2258 YES 2262 2265 YES 2266 2320 YES 2321 2327 YES 2328 YES 2329 2330 2331 2332 2339 YES Emulation Preferences View 2340 2382 YES 2383 YES 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2427 YES 2428 YES 2429 YES 2430 2431 YES 2432 YES 2433 YES 2434 2435 2436 2437 YES 2438 2439 2440 2473 2482 2483 2518 YES 2519 608 YES 2556 2609 2610 2653 ROM Info Panel Controller 2789 YES 2790 YES 2793 YES 2794 2799 YES 2800 2803 YES 2804 2807 YES 2808 2809 YES 2810 2811 YES 2812 2813 YES 2814 2815 YES 2816 YES 2817 YES 2818 2819 2820 2847 YES 2848 YES 2863 YES 2864 2865 YES 2866 2867 2868 YES 2869 2870 YES 2871 YES 2872 2873 2874 YES 2876 YES 2877 2878 File Migration Array Controller 2894 YES 2895 YES 2896 YES 2897 YES 2900 2901 2902 2903 2954 YES 2955 3015 YES 3042 3063 YES 3059 YES 3060 3061 YES 3062 2875 3146 3148 Firmware Panel Controller 3204 YES 3205 YES 3206 3207 3208 3209 3210 3211 3213 3214 3285 YES 3286 3456 YES 3457 YES 3458 YES 3459 YES 3460 YES 3461 YES 3462 3463 3464 3465 3471 YES 3472 3480 YES 3481 3482 3488 YES 3489 YES 3496 YES 3497 3498 3499 YES 3501 YES 3507 YES 3508 3509 3516 YES 3517 3520 Preferences Window Controller 3521 3522 3523 3644 3689 YES 3690 3709 3712 YES 3713 YES 3716 YES 3717 YES 3718 YES 3719 3720 3721 3722 YES 3723 3724 3725 3732 3733 YES 3714 YES 3715 3747 YES 3736 YES 3742 3737 YES 3740 YES 3741 3738 YES 3739 3748 YES 3749 3751 3752 3784 YES 3787 YES 3788 YES 3692 YES 3693 3648 YES 3667 3666 3665 3664 3663 3662 3661 3660 3659 3658 3657 3656 3655 3654 3653 3652 3651 3650 3649 3789 3790 YES 3791 YES 3786 YES 3775 YES 3773 YES 3771 YES 3779 YES Depth Comparison Threshold Text Field 3782 YES 3783 3780 YES 3781 3772 3774 3776 3793 YES 3794 3798 YES 3803 YES 3802 YES 3801 YES 3800 YES 3799 YES 3811 3809 YES 3810 3808 3807 3806 3837 YES 3838 YES 3839 3840 3841 3843 YES 3844 YES 3845 YES 3846 3847 3849 YES 3850 3878 YES 3879 YES 3880 3881 3882 3883 3884 3885 YES 3886 YES 3887 3888 YES 3889 YES 3890 YES 3894 3893 3892 3891 3896 YES 3897 3899 YES 3900 YES 3901 3935 YES 3936 YES 3937 3938 3939 3959 CocoaDS Sound Controller 3965 YES 3966 3967 3968 3969 4024 YES 4001 YES 4004 4003 4002 4027 YES 4028 YES 4029 YES 4030 YES 4031 4032 YES 4033 YES 4034 4035 YES 4036 4037 YES 4038 4039 YES 4040 YES 4041 4043 YES 4044 4045 YES 4046 4047 YES 4048 YES 4049 4050 YES 4051 4053 YES Internal Firmware Drawer Content View 4054 Internal Firmware Drawer 4062 4059 YES 4060 4066 YES 4067 4069 YES 4070 YES 4071 YES 4072 YES 4073 YES 4074 YES 4075 YES 4076 YES 4078 YES 4079 YES 4080 YES 4081 YES 4082 YES 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 YES 4100 YES 4101 4102 4103 4104 4105 4106 4107 4109 4110 4111 4112 4113 4114 4115 4116 4179 YES 4180 4181 YES 4182 YES 4191 YES 4192 YES 4193 YES 4194 YES 4195 YES 4196 YES 4197 YES 4198 YES 4199 YES 4200 YES 4201 YES 4202 YES 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 YES 4220 YES 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4240 YES 4241 4277 YES 4278 4559 YES 4560 4561 YES 4562 4565 YES 4574 YES 4575 YES 4576 YES 4577 4578 4580 4581 YES 4582 4583 YES 4584 4585 YES Internal Cheat View 4586 YES 4587 YES 4588 YES 4589 YES 4590 YES 4593 YES 4594 4597 YES 4598 4599 4600 4601 YES 4602 4603 4604 4605 4606 4610 YES Action Replay Cheat View 4632 YES 4633 YES 4634 4635 4636 4637 4639 YES 4640 4647 4656 Cheats List Array Controller 4660 YES 4661 YES 4662 4663 4664 YES 4665 4673 YES Code Breaker Cheat View 4693 YES 4694 4697 4711 Cheat Selected Item Controller 4715 4731 Cheat Window Controller 4745 YES 4746 4607 YES 4778 4792 YES 4795 4796 4797 YES 4798 4799 YES 4800 YES 4801 4802 4809 YES 4810 4811 YES 4812 4814 YES 4815 4817 YES 4818 4822 YES 4823 4850 YES Exact Value Search View 4851 YES Comparative Search Continue View 4858 YES 4859 YES 4860 YES 4861 YES 4862 YES 4863 YES 4864 4865 4866 4867 4868 4869 4871 YES 4872 YES 4873 4874 4876 YES 4877 YES 4878 4879 YES 4880 YES Comparative Search Start View 4887 YES 4888 YES 4889 YES 4890 4891 4892 4899 4900 YES 4901 YES 4902 YES 4903 4904 4906 YES 4907 4908 YES 4909 4910 YES 4911 YES 4912 YES 4913 4914 4916 Cheat Search List Array Controller 4947 5003 YES 5004 YES 5005 YES 5006 YES 5007 5008 5009 5066 YES 5067 5068 YES 5069 5080 YES 5081 YES 5082 YES 5083 5084 5085 YES 5086 5087 YES 5088 YES 5089 5097 5098 YES 5099 5100 YES 5101 5102 YES 5103 5104 YES 5105 5106 YES 5107 5111 YES 5112 5115 Cheat Database Array Controller 5127 YES 5128 5133 YES 5134 5135 YES 5136 5140 YES 5141 5168 YES 5169 5171 YES 5172 YES 5173 YES 5174 YES 5175 YES 5176 5177 5178 5179 5193 24 YES 23 239 5 92 5329 490 YES 491 YES 980 979 978 977 492 5419 5420 5421 5450 YES 2287 YES 2288 2289 YES 2290 1507 YES 1508 YES 1509 YES 1532 1512 1511 1510 1577 YES 1578 YES 1579 2291 YES 2299 2292 YES 2293 YES 2294 YES 5427 2298 2297 3994 YES 3995 YES 3996 YES 3997 3998 3992 YES 3993 1525 YES 1526 YES 1527 YES 1531 1530 1529 1528 1580 1581 5648 5649 5651 YES 5652 YES 5653 YES 5654 YES 5658 YES 5659 YES 5660 5661 5665 YES 5666 YES 5667 YES 5668 YES 5669 YES 5670 YES 5671 5672 5673 5674 YES 5675 YES 5676 5677 5678 5679 YES 5680 YES 5681 5682 5683 5684 YES 5685 YES 5686 5687 5688 5689 5702 2529 YES 2530 YES 2548 2549 2551 2558 YES 2559 YES 2560 2553 5713 About Window Controller 5933 YES Export ROM Save Panel Accessory 5934 YES 5935 YES 5936 5937 YES 5938 YES 5939 5942 5963 5965 YES 5966 6131 YES 6132 YES 6133 6134 6135 6159 YES 6160 6161 YES 6162 6168 YES 6169 YES 6170 6171 YES 6172 YES 6173 6174 6177 6180 YES 6182 YES 6183 YES 6184 YES 6185 6186 6187 6188 YES 6189 6190 6191 6233 6234 3777 YES 3778 3804 YES 3805 6236 6238 6295 YES 6296 YES 6352 YES Support Request Form View 6353 YES 6354 YES 6355 YES 6356 YES 6357 YES 6358 YES 6359 YES 6360 YES 6361 6362 YES 6363 YES 6364 6365 YES 6366 YES 6368 6369 YES 6374 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 YES Bug Report Form View 6389 YES 6390 YES 6391 YES 6392 YES 6393 YES 6394 YES 6395 YES 6396 YES 6397 6398 YES 6399 YES 6400 6401 YES 6402 YES 6405 YES 6406 YES 6407 6408 YES 6413 6414 6415 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 YES Troubleshooting Info View 6431 YES 6432 YES 6433 YES 6434 6435 6436 6437 6438 6440 6441 Troubleshooting Window Controller 6451 6484 YES 6485 6486 YES 6487 6488 6489 6491 YES 6492 6493 6494 6496 YES 6497 6498 6499 6611 YES 6612 6617 YES 6618 YES 6619 6622 YES 6623 YES 6624 6630 YES 6631 6634 6635 6651 6652 Emulation Control Controller 6931 6998 6999 7002 7014 YES Input Preferences View 7168 YES 7169 7171 YES 7172 YES 7173 YES 7174 YES 7175 YES 7176 YES 7179 YES 7180 YES 7182 YES 7183 YES 7184 YES 7185 YES 7186 7187 7188 7189 7191 7192 7210 YES 7211 YES 7212 YES 7213 7214 7215 7216 YES 7217 7218 7219 7220 7221 7222 7223 7224 7225 YES 7226 YES 7227 YES 7228 YES 7229 YES 7230 YES 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7266 YES 7267 YES 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7293 YES 7285 YES 7286 7287 YES 7288 YES 7289 YES 7292 7290 YES 7291 YES 7294 7295 7301 YES 7302 7305 YES 7308 7309 YES 7312 7313 YES 7316 7317 YES 7320 7353 Input Settings Controller 7354 YES 7355 7358 YES 7359 7392 YES 7393 7395 YES 7396 7398 YES 7399 7401 YES 7402 7404 YES 7405 7433 YES 7434 7436 YES 7437 7439 YES 7440 7442 YES 7443 7445 YES 7446 7449 YES 7450 YES 7451 YES 7452 7454 YES 7455 YES 7456 YES 7457 YES 7458 YES 7459 YES 7460 YES 7462 YES 7463 YES 7464 YES 7465 7466 7468 7469 7470 7471 7472 7473 7474 7486 YES 7487 YES 7488 7489 7461 YES 7467 7515 YES 7516 YES 7517 YES 7521 7520 7519 YES 7518 7526 YES 7525 YES 7522 YES 7531 7528 7537 YES 7540 7541 YES 7542 7543 YES 7544 7545 YES 7546 7551 YES 7552 7553 YES 7554 7555 YES 7556 7583 YES 7584 7128 YES 7132 7131 7130 YES 7129 7137 YES 7136 YES 7135 YES 7134 YES 7133 YES 7142 7141 7140 7139 7138 7594 YES 7595 YES 7596 YES 7597 7598 7599 7601 7602 7603 7600 7604 7605 YES 7606 YES 7607 YES 7610 7612 7624 YES 7625 7666 Input Profile Controller 7707 YES 7708 YES 7715 YES 7716 7725 YES 7726 7729 YES 7730 7740 7190 7759 YES 7760 7761 YES 7762 YES 7765 7766 YES 7767 7771 YES 7772 YES 7773 7774 7775 7776 7777 7778 7779 7780 YES 7781 7792 YES 7793 YES 7794 7802 YES 7803 7804 YES 7805 7806 YES 7807 7808 YES 7809 7810 YES 7811 7812 YES 7813 7817 YES 7818 YES 7820 YES 7821 YES 7822 YES 7823 YES 7824 YES 7825 YES 7826 7827 7828 7829 7830 7831 7836 YES 7837 7838 YES 7839 YES 7840 7843 YES 7844 7845 YES 7846 7847 YES 7848 7855 YES 7856 YES 7871 YES 7872 7877 YES 7878 7880 YES 7881 7886 7899 YES 7857 YES 7862 7861 7860 7859 7858 7863 YES 7864 7866 YES 7867 7875 YES 7876 125 YES 126 7873 YES 7874 8009 YES 7971 YES 7974 7972 YES 7973 7978 7987 YES 7988 YES 7989 YES 8003 7996 7995 YES 7994 7993 7997 YES 7998 7879 8012 YES 8013 YES 8014 8015 8016 8021 YES 8022 YES 8023 8024 8025 8030 YES 8031 YES 8032 8033 8034 8043 YES 8044 8045 YES 8046 YES 8047 8048 YES 8049 8075 YES 8076 YES 8077 8078 8084 2604 8134 YES 8135 YES 8160 YES 8136 YES 8137 8138 YES 8139 8140 YES 8141 8142 YES 8143 8144 YES 8145 8146 YES 8147 8161 YES 8148 YES 8149 8150 YES 8151 8152 YES 8153 8154 YES 8155 8156 YES 8157 8158 YES 8159 8162 8164 8181 YES 8182 YES 8183 YES 8184 YES 8185 YES 2342 YES 2359 YES 2355 YES 2365 YES 2363 YES 2358 YES 2357 YES 2349 YES 2353 YES 2347 YES 2348 2354 2350 2362 2361 2364 2366 2356 2360 2343 YES 2374 YES 4275 YES 2565 YES 2373 YES 2372 YES 2371 YES 2378 2377 2376 2566 4276 2375 2341 YES 6627 YES 2345 YES 2346 6628 6126 YES 6127 YES 8060 YES 8058 YES 8056 YES 8057 8059 YES 8066 8061 6130 6129 6128 2344 YES 2369 YES 2367 YES 2368 2370 5186 YES 5188 YES 5189 8186 8188 YES 8189 8194 YES 8195 YES YES -3.IBPluginDependency 1000.IBPluginDependency 1000.IBViewBoundsToFrameTransform 1001.IBPluginDependency 1002.IBPluginDependency 1002.IBViewBoundsToFrameTransform 1003.IBPluginDependency 1004.IBPluginDependency 1004.IBViewBoundsToFrameTransform 1005.IBPluginDependency 1006.IBPluginDependency 1006.IBViewBoundsToFrameTransform 1007.IBPluginDependency 1008.IBPluginDependency 1008.IBViewBoundsToFrameTransform 1009.IBPluginDependency 1010.IBPluginDependency 1010.IBViewBoundsToFrameTransform 1011.IBPluginDependency 1012.IBPluginDependency 1012.IBViewBoundsToFrameTransform 1013.IBPluginDependency 1016.IBPluginDependency 1016.IBViewBoundsToFrameTransform 1017.IBPluginDependency 1020.IBPluginDependency 1020.IBViewBoundsToFrameTransform 1021.IBPluginDependency 1024.IBPluginDependency 1024.IBViewBoundsToFrameTransform 1025.IBPluginDependency 1034.IBPluginDependency 1034.IBViewBoundsToFrameTransform 1035.IBPluginDependency 1036.IBPluginDependency 1036.IBViewBoundsToFrameTransform 1037.IBPluginDependency 1038.IBPluginDependency 1038.IBViewBoundsToFrameTransform 1039.IBPluginDependency 1040.IBPluginDependency 1040.IBViewBoundsToFrameTransform 1041.IBPluginDependency 1113.IBPluginDependency 1114.IBPluginDependency 1115.IBPluginDependency 1118.IBPluginDependency 1119.IBPluginDependency 112.IBPluginDependency 112.ImportedFromIB2 1120.IBPluginDependency 124.IBPluginDependency 124.ImportedFromIB2 125.IBEditorWindowLastContentRect 125.IBPluginDependency 125.ImportedFromIB2 125.editorWindowContentRectSynchronizationRect 126.IBPluginDependency 126.ImportedFromIB2 129.IBPluginDependency 129.ImportedFromIB2 1298.IBEditorWindowLastContentRect 1298.IBPluginDependency 1299.IBAttributePlaceholdersKey 1299.IBPluginDependency 1299.IBViewBoundsToFrameTransform 130.IBEditorWindowLastContentRect 130.IBPluginDependency 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect 1300.IBPluginDependency 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 1507.IBAttributePlaceholdersKey 1507.IBPluginDependency 1507.IBViewBoundsToFrameTransform 1508.IBPluginDependency 1509.IBEditorWindowLastContentRect 1509.IBPluginDependency 1510.IBPluginDependency 1511.IBPluginDependency 1512.IBPluginDependency 1525.IBAttributePlaceholdersKey 1525.IBPluginDependency 1525.IBViewBoundsToFrameTransform 1526.IBPluginDependency 1527.IBEditorWindowLastContentRect 1527.IBPluginDependency 1528.IBPluginDependency 1529.IBPluginDependency 1530.IBPluginDependency 1531.IBPluginDependency 1532.IBPluginDependency 1538.IBPluginDependency 1538.IBViewBoundsToFrameTransform 1539.IBPluginDependency 1539.IBViewBoundsToFrameTransform 1540.IBPluginDependency 1541.IBPluginDependency 1541.IBViewBoundsToFrameTransform 1542.IBPluginDependency 1543.IBEditorWindowLastContentRect 1543.IBPluginDependency 1544.IBPluginDependency 1545.IBPluginDependency 1547.IBPluginDependency 1547.IBViewBoundsToFrameTransform 1548.IBPluginDependency 1577.IBAttributePlaceholdersKey 1577.IBPluginDependency 1577.IBViewBoundsToFrameTransform 1578.IBPluginDependency 1579.IBNumberFormatterBehaviorMetadataKey 1579.IBNumberFormatterLocalizesFormatMetadataKey 1579.IBNumberFormatterSampleNumberKey 1579.IBPluginDependency 1580.IBPluginDependency 1581.IBPluginDependency 1584.IBEditorWindowLastContentRect 1584.IBPluginDependency 1615.IBAttributePlaceholdersKey 1615.IBPluginDependency 1615.IBViewBoundsToFrameTransform 1616.IBPluginDependency 1619.IBPluginDependency 1626.IBAttributePlaceholdersKey 1626.IBPluginDependency 1626.IBViewBoundsToFrameTransform 1627.IBPluginDependency 1628.IBEditorWindowLastContentRect 1628.IBPluginDependency 1629.IBPluginDependency 1630.IBPluginDependency 1631.IBPluginDependency 1632.IBPluginDependency 1632.IBViewBoundsToFrameTransform 1633.IBPluginDependency 1634.IBPluginDependency 1634.IBViewBoundsToFrameTransform 1635.IBPluginDependency 1636.IBPluginDependency 1637.IBPluginDependency 1638.IBPluginDependency 1639.IBPluginDependency 1640.IBPluginDependency 1641.IBPluginDependency 1642.IBPluginDependency 1643.IBPluginDependency 1644.IBPluginDependency 1645.IBPluginDependency 1646.IBPluginDependency 1647.IBPluginDependency 1648.IBPluginDependency 1649.IBPluginDependency 1650.IBPluginDependency 1650.IBViewBoundsToFrameTransform 1651.IBPluginDependency 1679.IBPluginDependency 1679.toolbarItem.selectable 1680.IBPluginDependency 1680.toolbarItem.selectable 1681.IBPluginDependency 1681.toolbarItem.selectable 1682.IBPluginDependency 1721.IBPluginDependency 1736.IBNumberFormatterBehaviorMetadataKey 1736.IBNumberFormatterLocalizesFormatMetadataKey 1736.IBPluginDependency 1855.IBPluginDependency 1856.IBEditorWindowLastContentRect 1856.IBPluginDependency 1856.IBWindowTemplateEditedContentRect 1856.NSWindowTemplate.visibleAtLaunch 1857.IBPluginDependency 1858.IBPluginDependency 1858.IBViewBoundsToFrameTransform 1859.IBPluginDependency 19.IBPluginDependency 19.ImportedFromIB2 1976.IBPluginDependency 1976.IBViewBoundsToFrameTransform 1977.IBPluginDependency 1978.IBPluginDependency 1978.IBViewBoundsToFrameTransform 1979.IBPluginDependency 1980.IBPluginDependency 1980.IBViewBoundsToFrameTransform 1981.IBPluginDependency 1982.IBPluginDependency 1982.IBViewBoundsToFrameTransform 1983.IBPluginDependency 1986.IBPluginDependency 1987.IBPluginDependency 1987.IBViewBoundsToFrameTransform 1988.IBPluginDependency 1998.IBPluginDependency 1998.IBViewBoundsToFrameTransform 1999.IBPluginDependency 2000.IBNumberFormatterBehaviorMetadataKey 2000.IBNumberFormatterLocalizesFormatMetadataKey 2000.IBPluginDependency 2095.IBPluginDependency 2154.IBPluginDependency 2154.IBViewBoundsToFrameTransform 2155.IBPluginDependency 2246.IBPluginDependency 2246.toolbarItem.selectable 2248.IBEditorWindowLastContentRect 2248.IBPluginDependency 2250.IBPluginDependency 2250.IBViewBoundsToFrameTransform 2253.IBAttributePlaceholdersKey 2253.IBPluginDependency 2253.IBViewBoundsToFrameTransform 2254.IBPluginDependency 2257.IBPluginDependency 2257.IBViewBoundsToFrameTransform 2258.IBPluginDependency 2262.IBNumberFormatterBehaviorMetadataKey 2262.IBNumberFormatterLocalizesFormatMetadataKey 2262.IBPluginDependency 2265.IBViewBoundsToFrameTransform 2287.IBPluginDependency 2287.IBViewBoundsToFrameTransform 2288.IBPluginDependency 2289.IBPluginDependency 2289.IBViewBoundsToFrameTransform 2290.IBPluginDependency 2291.IBPluginDependency 2291.IBViewBoundsToFrameTransform 2292.IBPluginDependency 2292.IBViewBoundsToFrameTransform 2293.IBPluginDependency 2294.IBEditorWindowLastContentRect 2294.IBPluginDependency 2297.IBAttributePlaceholdersKey 2297.IBPluginDependency 2298.IBAttributePlaceholdersKey 2298.IBPluginDependency 2299.IBPluginDependency 23.IBPluginDependency 23.ImportedFromIB2 2320.IBPluginDependency 2320.IBViewBoundsToFrameTransform 2321.IBPluginDependency 2327.IBPluginDependency 2327.IBViewBoundsToFrameTransform 2328.IBPluginDependency 2328.IBViewBoundsToFrameTransform 2329.IBAttributePlaceholdersKey 2329.IBPluginDependency 2330.IBAttributePlaceholdersKey 2330.IBPluginDependency 2331.IBPluginDependency 2332.IBAttributePlaceholdersKey 2339.IBEditorWindowLastContentRect 2339.IBPluginDependency 2340.IBPluginDependency 2340.toolbarItem.selectable 2341.IBPluginDependency 2341.IBViewBoundsToFrameTransform 2342.IBPluginDependency 2342.IBViewBoundsToFrameTransform 2343.IBPluginDependency 2343.IBViewBoundsToFrameTransform 2344.IBPluginDependency 2344.IBViewBoundsToFrameTransform 2345.IBAttributePlaceholdersKey 2345.IBPluginDependency 2346.IBPluginDependency 2347.IBAttributePlaceholdersKey 2347.IBPluginDependency 2347.IBViewBoundsToFrameTransform 2348.IBPluginDependency 2349.IBPluginDependency 2349.IBViewBoundsToFrameTransform 2350.IBPluginDependency 2353.IBPluginDependency 2353.IBViewBoundsToFrameTransform 2354.IBPluginDependency 2355.IBPluginDependency 2355.IBViewBoundsToFrameTransform 2356.IBPluginDependency 2357.IBPluginDependency 2357.IBViewBoundsToFrameTransform 2358.IBPluginDependency 2358.IBViewBoundsToFrameTransform 2359.IBPluginDependency 2359.IBViewBoundsToFrameTransform 236.IBPluginDependency 236.ImportedFromIB2 2360.IBPluginDependency 2361.IBPluginDependency 2362.IBPluginDependency 2363.IBAttributePlaceholdersKey 2363.IBPluginDependency 2364.IBPluginDependency 2365.IBAttributePlaceholdersKey 2365.IBPluginDependency 2366.IBPluginDependency 2367.IBAttributePlaceholdersKey 2367.IBPluginDependency 2368.IBPluginDependency 2369.IBAttributePlaceholdersKey 2369.IBPluginDependency 2370.IBPluginDependency 2371.IBAttributePlaceholdersKey 2371.IBPluginDependency 2371.IBViewBoundsToFrameTransform 2372.IBPluginDependency 2372.IBViewBoundsToFrameTransform 2373.IBPluginDependency 2373.IBViewBoundsToFrameTransform 2374.IBPluginDependency 2374.IBViewBoundsToFrameTransform 2375.IBPluginDependency 2376.IBPluginDependency 2377.IBPluginDependency 2378.IBPluginDependency 2382.IBPluginDependency 2383.IBEditorWindowLastContentRect 2383.IBPluginDependency 2384.IBPluginDependency 2385.IBPluginDependency 2386.IBPluginDependency 2387.IBPluginDependency 2388.IBPluginDependency 2389.IBPluginDependency 239.IBPluginDependency 239.ImportedFromIB2 2390.IBPluginDependency 2391.IBPluginDependency 2392.IBPluginDependency 2393.IBPluginDependency 2394.IBPluginDependency 2395.IBPluginDependency 2396.IBPluginDependency 2397.IBPluginDependency 2398.IBPluginDependency 2399.IBPluginDependency 24.IBEditorWindowLastContentRect 24.IBPluginDependency 24.ImportedFromIB2 24.editorWindowContentRectSynchronizationRect 2427.IBAttributePlaceholdersKey 2427.IBPluginDependency 2427.IBViewBoundsToFrameTransform 2428.IBPluginDependency 2428.IBViewBoundsToFrameTransform 2429.IBAttributePlaceholdersKey 2429.IBPluginDependency 2430.IBPluginDependency 2431.IBPluginDependency 2431.IBViewBoundsToFrameTransform 2432.IBPluginDependency 2433.IBEditorWindowLastContentRect 2433.IBPluginDependency 2434.IBAttributePlaceholdersKey 2434.IBPluginDependency 2435.IBAttributePlaceholdersKey 2435.IBPluginDependency 2436.IBAttributePlaceholdersKey 2436.IBPluginDependency 2437.IBPluginDependency 2437.IBViewBoundsToFrameTransform 2438.IBAttributePlaceholdersKey 2438.IBPluginDependency 2439.IBAttributePlaceholdersKey 2439.IBPluginDependency 2440.IBPluginDependency 2473.IBPluginDependency 2482.IBPluginDependency 2483.IBPluginDependency 2518.IBPluginDependency 2518.IBViewBoundsToFrameTransform 2519.IBPluginDependency 2529.IBPluginDependency 2530.IBEditorWindowLastContentRect 2530.IBPluginDependency 2548.IBPluginDependency 2549.IBPluginDependency 2551.IBPluginDependency 2553.IBPluginDependency 2556.IBPluginDependency 2558.IBPluginDependency 2559.IBEditorWindowLastContentRect 2559.IBPluginDependency 2560.IBPluginDependency 2565.IBAttributePlaceholdersKey 2565.IBPluginDependency 2565.IBViewBoundsToFrameTransform 2566.IBPluginDependency 2604.IBPluginDependency 2609.IBPluginDependency 2610.IBPluginDependency 2653.IBPluginDependency 2789.IBEditorWindowLastContentRect 2789.IBPluginDependency 2789.IBWindowTemplateEditedContentRect 2789.NSWindowTemplate.visibleAtLaunch 2789.windowTemplate.hasMaxSize 2789.windowTemplate.hasMinSize 2789.windowTemplate.maxSize 2789.windowTemplate.minSize 2790.IBPluginDependency 2793.IBPluginDependency 2793.IBViewBoundsToFrameTransform 2794.IBPluginDependency 2799.IBPluginDependency 2799.IBViewBoundsToFrameTransform 2800.IBPluginDependency 2803.IBPluginDependency 2803.IBViewBoundsToFrameTransform 2804.IBPluginDependency 2807.IBPluginDependency 2807.IBViewBoundsToFrameTransform 2808.IBPluginDependency 2809.IBPluginDependency 2809.IBViewBoundsToFrameTransform 2810.IBPluginDependency 2811.IBPluginDependency 2811.IBViewBoundsToFrameTransform 2812.IBPluginDependency 2813.IBPluginDependency 2813.IBViewBoundsToFrameTransform 2814.IBPluginDependency 2815.IBPluginDependency 2815.IBViewBoundsToFrameTransform 2816.IBPluginDependency 2816.IBViewBoundsToFrameTransform 2817.IBPluginDependency 2817.IBViewBoundsToFrameTransform 2818.IBPluginDependency 2819.IBPluginDependency 2820.IBPluginDependency 2847.IBEditorWindowLastContentRect 2847.IBPluginDependency 2847.IBWindowTemplateEditedContentRect 2847.NSWindowTemplate.visibleAtLaunch 2848.IBPluginDependency 2863.IBPluginDependency 2863.IBViewBoundsToFrameTransform 2864.IBPluginDependency 2865.IBPluginDependency 2865.IBViewBoundsToFrameTransform 2866.IBPluginDependency 2867.IBPluginDependency 2868.IBPluginDependency 2869.IBPluginDependency 2870.IBPluginDependency 2871.IBPluginDependency 2872.IBPluginDependency 2873.IBPluginDependency 2878.IBPluginDependency 2894.IBPluginDependency 2894.IBViewBoundsToFrameTransform 2895.IBPluginDependency 2895.IBViewBoundsToFrameTransform 2896.IBPluginDependency 2896.IBViewBoundsToFrameTransform 2897.IBPluginDependency 2897.IBViewBoundsToFrameTransform 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect 2900.IBPluginDependency 2901.IBPluginDependency 2902.IBPluginDependency 2903.IBPluginDependency 295.IBPluginDependency 2954.IBPluginDependency 2954.IBViewBoundsToFrameTransform 2955.IBPluginDependency 296.IBEditorWindowLastContentRect 296.IBPluginDependency 296.editorWindowContentRectSynchronizationRect 297.IBPluginDependency 298.IBPluginDependency 3042.IBPluginDependency 3059.IBPluginDependency 3059.IBViewBoundsToFrameTransform 3060.IBPluginDependency 3061.IBPluginDependency 3061.IBViewBoundsToFrameTransform 3062.IBPluginDependency 3063.IBPluginDependency 3063.IBViewBoundsToFrameTransform 3146.IBPluginDependency 3148.IBPluginDependency 3204.IBPluginDependency 3205.IBEditorWindowLastContentRect 3205.IBPluginDependency 3206.IBPluginDependency 3207.IBPluginDependency 3208.IBPluginDependency 3209.IBPluginDependency 3210.IBPluginDependency 3211.IBPluginDependency 3213.IBPluginDependency 3214.IBPluginDependency 3285.IBPluginDependency 3285.IBViewBoundsToFrameTransform 3286.IBPluginDependency 3456.IBEditorWindowLastContentRect 3456.IBPluginDependency 3456.IBWindowTemplateEditedContentRect 3456.NSWindowTemplate.visibleAtLaunch 3457.IBPluginDependency 3458.IBPluginDependency 3458.IBViewBoundsToFrameTransform 3459.IBPluginDependency 3459.IBViewBoundsToFrameTransform 3460.IBPluginDependency 3460.IBViewBoundsToFrameTransform 3461.IBPluginDependency 3461.IBViewBoundsToFrameTransform 3462.IBPluginDependency 3463.IBPluginDependency 3464.IBPluginDependency 3465.IBPluginDependency 3471.IBPluginDependency 3471.IBViewBoundsToFrameTransform 3472.IBPluginDependency 3480.IBPluginDependency 3480.IBViewBoundsToFrameTransform 3481.IBPluginDependency 3482.IBPluginDependency 3482.IBViewBoundsToFrameTransform 3488.IBEditorWindowLastContentRect 3488.IBPluginDependency 3488.IBWindowTemplateEditedContentRect 3488.NSWindowTemplate.visibleAtLaunch 3489.IBPluginDependency 3496.IBPluginDependency 3496.IBViewBoundsToFrameTransform 3497.IBPluginDependency 3498.IBPluginDependency 3499.IBPluginDependency 3501.IBPluginDependency 3509.IBPluginDependency 3516.IBPluginDependency 3516.IBViewBoundsToFrameTransform 3517.IBPluginDependency 3520.IBPluginDependency 3521.IBPluginDependency 3522.IBPluginDependency 3523.IBPluginDependency 3644.IBPluginDependency 3648.IBPluginDependency 3648.IBViewBoundsToFrameTransform 3665.IBPluginDependency 3666.IBPluginDependency 3667.IBPluginDependency 3689.IBAttributePlaceholdersKey 3689.IBPluginDependency 3689.IBViewBoundsToFrameTransform 3690.IBPluginDependency 3692.IBAttributePlaceholdersKey 3692.IBPluginDependency 3692.IBViewBoundsToFrameTransform 3693.IBPluginDependency 3709.IBPluginDependency 3712.IBEditorWindowLastContentRect 3712.IBPluginDependency 3712.IBWindowTemplateEditedContentRect 3712.NSWindowTemplate.visibleAtLaunch 3713.IBPluginDependency 3714.IBAttributePlaceholdersKey 3714.IBPluginDependency 3714.IBViewBoundsToFrameTransform 3715.IBPluginDependency 3716.IBPluginDependency 3716.IBViewBoundsToFrameTransform 3717.IBPluginDependency 3717.IBViewBoundsToFrameTransform 3718.IBPluginDependency 3718.IBViewBoundsToFrameTransform 3719.IBAttributePlaceholdersKey 3719.IBPluginDependency 3720.IBAttributePlaceholdersKey 3720.IBPluginDependency 3721.IBPluginDependency 3722.IBPluginDependency 3723.IBAttributePlaceholdersKey 3723.IBPluginDependency 3724.IBAttributePlaceholdersKey 3724.IBPluginDependency 3725.IBPluginDependency 3732.IBAttributePlaceholdersKey 3733.IBPluginDependency 3733.IBViewBoundsToFrameTransform 3736.IBAttributePlaceholdersKey 3736.IBPluginDependency 3736.IBViewBoundsToFrameTransform 3737.IBPluginDependency 3737.IBViewBoundsToFrameTransform 3738.IBViewBoundsToFrameTransform 3740.IBPluginDependency 3741.IBNumberFormatterBehaviorMetadataKey 3741.IBNumberFormatterLocalizesFormatMetadataKey 3741.IBPluginDependency 3742.IBPluginDependency 3747.IBPluginDependency 3747.IBViewBoundsToFrameTransform 3748.IBPluginDependency 3748.IBViewBoundsToFrameTransform 3749.IBPluginDependency 3751.IBPluginDependency 3752.IBPluginDependency 3771.IBAttributePlaceholdersKey 3771.IBPluginDependency 3771.IBViewBoundsToFrameTransform 3772.IBPluginDependency 3773.IBAttributePlaceholdersKey 3773.IBPluginDependency 3773.IBViewBoundsToFrameTransform 3774.IBPluginDependency 3775.IBAttributePlaceholdersKey 3775.IBPluginDependency 3775.IBViewBoundsToFrameTransform 3776.IBPluginDependency 3777.IBAttributePlaceholdersKey 3777.IBPluginDependency 3777.IBViewBoundsToFrameTransform 3778.IBPluginDependency 3779.IBAttributePlaceholdersKey 3779.IBPluginDependency 3779.IBViewBoundsToFrameTransform 3780.IBPluginDependency 3781.IBNumberFormatterBehaviorMetadataKey 3781.IBNumberFormatterLocalizesFormatMetadataKey 3781.IBPluginDependency 3782.IBPluginDependency 3782.IBViewBoundsToFrameTransform 3783.IBPluginDependency 3784.IBPluginDependency 3784.IBViewBoundsToFrameTransform 3786.IBPluginDependency 3786.IBViewBoundsToFrameTransform 3789.IBPluginDependency 3790.IBEditorWindowLastContentRect 3790.IBPluginDependency 3790.IBWindowTemplateEditedContentRect 3790.NSWindowTemplate.visibleAtLaunch 3791.IBPluginDependency 3793.IBPluginDependency 3793.IBViewBoundsToFrameTransform 3794.IBPluginDependency 3798.IBPluginDependency 3798.IBViewBoundsToFrameTransform 3799.IBPluginDependency 3799.IBViewBoundsToFrameTransform 3800.IBAttributePlaceholdersKey 3800.IBPluginDependency 3800.IBViewBoundsToFrameTransform 3801.IBAttributePlaceholdersKey 3801.IBPluginDependency 3801.IBViewBoundsToFrameTransform 3802.IBAttributePlaceholdersKey 3802.IBPluginDependency 3802.IBViewBoundsToFrameTransform 3803.IBAttributePlaceholdersKey 3803.IBPluginDependency 3803.IBViewBoundsToFrameTransform 3804.IBAttributePlaceholdersKey 3804.IBPluginDependency 3804.IBViewBoundsToFrameTransform 3805.IBPluginDependency 3806.IBPluginDependency 3807.IBPluginDependency 3808.IBPluginDependency 3809.IBPluginDependency 3810.IBNumberFormatterBehaviorMetadataKey 3810.IBNumberFormatterLocalizesFormatMetadataKey 3810.IBPluginDependency 3811.IBPluginDependency 3837.IBPluginDependency 3837.IBViewBoundsToFrameTransform 3838.IBPluginDependency 3838.IBViewBoundsToFrameTransform 3839.IBAttributePlaceholdersKey 3839.IBPluginDependency 3840.IBAttributePlaceholdersKey 3840.IBPluginDependency 3841.IBPluginDependency 3843.IBAttributePlaceholdersKey 3843.IBPluginDependency 3843.IBViewBoundsToFrameTransform 3844.IBPluginDependency 3845.IBEditorWindowLastContentRect 3845.IBPluginDependency 3846.IBAttributePlaceholdersKey 3846.IBPluginDependency 3847.IBAttributePlaceholdersKey 3847.IBPluginDependency 3849.IBPluginDependency 3849.IBViewBoundsToFrameTransform 3850.IBPluginDependency 3878.IBPluginDependency 3878.IBViewBoundsToFrameTransform 3879.IBPluginDependency 3879.IBViewBoundsToFrameTransform 3880.IBAttributePlaceholdersKey 3880.IBPluginDependency 3881.IBAttributePlaceholdersKey 3881.IBPluginDependency 3882.IBPluginDependency 3883.IBAttributePlaceholdersKey 3884.IBAttributePlaceholdersKey 3885.IBPluginDependency 3885.IBViewBoundsToFrameTransform 3886.IBAttributePlaceholdersKey 3886.IBPluginDependency 3886.IBViewBoundsToFrameTransform 3887.IBPluginDependency 3888.IBAttributePlaceholdersKey 3888.IBPluginDependency 3888.IBViewBoundsToFrameTransform 3889.IBPluginDependency 3890.IBEditorWindowLastContentRect 3890.IBPluginDependency 3891.IBAttributePlaceholdersKey 3891.IBPluginDependency 3892.IBAttributePlaceholdersKey 3892.IBPluginDependency 3893.IBAttributePlaceholdersKey 3893.IBPluginDependency 3894.IBAttributePlaceholdersKey 3894.IBPluginDependency 3896.IBPluginDependency 3896.IBViewBoundsToFrameTransform 3897.IBPluginDependency 3899.IBPluginDependency 3899.IBViewBoundsToFrameTransform 3900.IBAttributePlaceholdersKey 3900.IBPluginDependency 3900.IBViewBoundsToFrameTransform 3901.IBPluginDependency 3935.IBPluginDependency 3936.IBEditorWindowLastContentRect 3936.IBPluginDependency 3937.IBPluginDependency 3938.IBPluginDependency 3939.IBPluginDependency 3959.IBPluginDependency 3965.IBPluginDependency 3965.IBViewBoundsToFrameTransform 3966.IBAttributePlaceholdersKey 3966.IBPluginDependency 3967.IBAttributePlaceholdersKey 3967.IBPluginDependency 3968.IBPluginDependency 3969.IBAttributePlaceholdersKey 3992.IBPluginDependency 3992.IBViewBoundsToFrameTransform 3993.IBPluginDependency 3994.IBAttributePlaceholdersKey 3994.IBPluginDependency 3994.IBViewBoundsToFrameTransform 3995.IBPluginDependency 3996.IBEditorWindowLastContentRect 3996.IBPluginDependency 3997.IBAttributePlaceholdersKey 3997.IBPluginDependency 3998.IBAttributePlaceholdersKey 3998.IBPluginDependency 4001.IBPluginDependency 4001.IBViewBoundsToFrameTransform 4002.IBAttributePlaceholdersKey 4002.IBPluginDependency 4003.IBAttributePlaceholdersKey 4003.IBPluginDependency 4004.IBPluginDependency 4024.IBPluginDependency 4024.IBViewBoundsToFrameTransform 4027.IBEditorWindowLastContentRect 4027.IBPluginDependency 4027.IBWindowTemplateEditedContentRect 4027.NSWindowTemplate.visibleAtLaunch 4028.IBPluginDependency 4029.IBPluginDependency 4029.IBViewBoundsToFrameTransform 4030.IBAttributePlaceholdersKey 4030.IBPluginDependency 4031.IBPluginDependency 4032.IBPluginDependency 4032.IBViewBoundsToFrameTransform 4033.IBAttributePlaceholdersKey 4033.IBPluginDependency 4034.IBPluginDependency 4035.IBAttributePlaceholdersKey 4035.IBPluginDependency 4035.IBViewBoundsToFrameTransform 4036.IBPluginDependency 4037.IBAttributePlaceholdersKey 4037.IBPluginDependency 4037.IBViewBoundsToFrameTransform 4038.IBPluginDependency 4039.IBPluginDependency 4039.IBViewBoundsToFrameTransform 4040.IBPluginDependency 4040.IBViewBoundsToFrameTransform 4041.IBPluginDependency 4043.IBAttributePlaceholdersKey 4043.IBPluginDependency 4043.IBViewBoundsToFrameTransform 4044.IBPluginDependency 4045.IBAttributePlaceholdersKey 4045.IBPluginDependency 4045.IBViewBoundsToFrameTransform 4046.IBPluginDependency 4047.IBPluginDependency 4047.IBViewBoundsToFrameTransform 4048.IBAttributePlaceholdersKey 4048.IBPluginDependency 4048.IBViewBoundsToFrameTransform 4049.IBPluginDependency 4050.IBAttributePlaceholdersKey 4050.IBPluginDependency 4050.IBViewBoundsToFrameTransform 4051.IBPluginDependency 4053.IBEditorWindowLastContentRect 4053.IBPluginDependency 4053.IBViewBoundsToFrameTransform 4054.IBPluginDependency 4059.IBPluginDependency 4059.IBViewBoundsToFrameTransform 4060.IBPluginDependency 4062.IBPluginDependency 4066.IBPluginDependency 4066.IBViewBoundsToFrameTransform 4067.IBPluginDependency 4069.IBAttributePlaceholdersKey 4069.IBPluginDependency 4069.IBViewBoundsToFrameTransform 4070.IBAttributePlaceholdersKey 4070.IBPluginDependency 4070.IBViewBoundsToFrameTransform 4071.IBPluginDependency 4071.IBViewBoundsToFrameTransform 4072.IBPluginDependency 4072.IBViewBoundsToFrameTransform 4073.IBPluginDependency 4073.IBViewBoundsToFrameTransform 4074.IBPluginDependency 4074.IBViewBoundsToFrameTransform 4075.IBPluginDependency 4075.IBViewBoundsToFrameTransform 4076.IBPluginDependency 4076.IBViewBoundsToFrameTransform 4078.IBPluginDependency 4078.IBViewBoundsToFrameTransform 4079.IBPluginDependency 4079.IBViewBoundsToFrameTransform 4080.IBPluginDependency 4080.IBViewBoundsToFrameTransform 4081.IBPluginDependency 4082.IBEditorWindowLastContentRect 4082.IBPluginDependency 4083.IBPluginDependency 4084.IBPluginDependency 4085.IBPluginDependency 4086.IBPluginDependency 4087.IBPluginDependency 4088.IBPluginDependency 4089.IBPluginDependency 4090.IBPluginDependency 4091.IBPluginDependency 4092.IBPluginDependency 4093.IBPluginDependency 4094.IBPluginDependency 4095.IBPluginDependency 4096.IBPluginDependency 4097.IBPluginDependency 4098.IBPluginDependency 4099.IBPluginDependency 4100.IBEditorWindowLastContentRect 4100.IBPluginDependency 4101.IBPluginDependency 4102.IBPluginDependency 4103.IBPluginDependency 4104.IBPluginDependency 4105.IBPluginDependency 4106.IBPluginDependency 4107.IBPluginDependency 4109.IBPluginDependency 4110.IBPluginDependency 4111.IBPluginDependency 4112.IBPluginDependency 4113.IBPluginDependency 4114.IBPluginDependency 4115.IBPluginDependency 4116.IBPluginDependency 4179.IBPluginDependency 4179.IBViewBoundsToFrameTransform 4180.IBPluginDependency 4181.IBEditorWindowLastContentRect 4181.IBPluginDependency 4181.IBWindowTemplateEditedContentRect 4181.NSWindowTemplate.visibleAtLaunch 4182.IBPluginDependency 4191.IBAttributePlaceholdersKey 4191.IBPluginDependency 4191.IBViewBoundsToFrameTransform 4192.IBAttributePlaceholdersKey 4192.IBPluginDependency 4192.IBViewBoundsToFrameTransform 4193.IBPluginDependency 4193.IBViewBoundsToFrameTransform 4194.IBPluginDependency 4194.IBViewBoundsToFrameTransform 4195.IBPluginDependency 4195.IBViewBoundsToFrameTransform 4196.IBPluginDependency 4196.IBViewBoundsToFrameTransform 4197.IBPluginDependency 4197.IBViewBoundsToFrameTransform 4198.IBPluginDependency 4198.IBViewBoundsToFrameTransform 4199.IBPluginDependency 4199.IBViewBoundsToFrameTransform 4200.IBPluginDependency 4200.IBViewBoundsToFrameTransform 4201.IBPluginDependency 4202.IBEditorWindowLastContentRect 4202.IBPluginDependency 4203.IBPluginDependency 4204.IBPluginDependency 4205.IBPluginDependency 4206.IBPluginDependency 4207.IBPluginDependency 4208.IBPluginDependency 4209.IBPluginDependency 4210.IBPluginDependency 4211.IBPluginDependency 4212.IBPluginDependency 4213.IBPluginDependency 4214.IBPluginDependency 4215.IBPluginDependency 4216.IBPluginDependency 4217.IBPluginDependency 4218.IBPluginDependency 4219.IBPluginDependency 4220.IBEditorWindowLastContentRect 4220.IBPluginDependency 4221.IBPluginDependency 4222.IBPluginDependency 4223.IBPluginDependency 4224.IBPluginDependency 4225.IBPluginDependency 4226.IBPluginDependency 4227.IBPluginDependency 4228.IBPluginDependency 4229.IBPluginDependency 4230.IBPluginDependency 4231.IBPluginDependency 4232.IBPluginDependency 4233.IBPluginDependency 4234.IBPluginDependency 4240.IBPluginDependency 4240.IBViewBoundsToFrameTransform 4241.IBPluginDependency 4275.IBPluginDependency 4275.IBViewBoundsToFrameTransform 4276.IBPluginDependency 4277.IBPluginDependency 4277.IBViewBoundsToFrameTransform 4278.IBPluginDependency 4559.IBPluginDependency 4559.IBViewBoundsToFrameTransform 4560.IBPluginDependency 4561.IBPluginDependency 4561.IBViewBoundsToFrameTransform 4562.IBPluginDependency 4565.IBPluginDependency 4565.IBViewBoundsToFrameTransform 4574.IBPluginDependency 4574.IBViewBoundsToFrameTransform 4575.IBPluginDependency 4576.IBEditorWindowLastContentRect 4576.IBPluginDependency 4577.IBPluginDependency 4578.IBPluginDependency 4580.IBPluginDependency 4581.IBPluginDependency 4581.IBViewBoundsToFrameTransform 4582.IBPluginDependency 4583.IBPluginDependency 4583.IBViewBoundsToFrameTransform 4584.IBPluginDependency 4585.IBEditorWindowLastContentRect 4585.IBPluginDependency 4585.IBViewBoundsToFrameTransform 4586.IBPluginDependency 4586.IBViewBoundsToFrameTransform 4587.IBPluginDependency 4587.IBViewBoundsToFrameTransform 4588.IBAttributePlaceholdersKey 4588.IBPluginDependency 4588.IBViewBoundsToFrameTransform 4589.IBPluginDependency 4589.IBViewBoundsToFrameTransform 4590.IBAttributePlaceholdersKey 4590.IBPluginDependency 4590.IBViewBoundsToFrameTransform 4593.IBPluginDependency 4593.IBViewBoundsToFrameTransform 4594.IBPluginDependency 4597.IBPluginDependency 4598.IBPluginDependency 4599.IBPluginDependency 4600.IBPluginDependency 4601.IBAttributePlaceholdersKey 4601.IBPluginDependency 4601.IBViewBoundsToFrameTransform 4604.IBPluginDependency 4605.IBPluginDependency 4606.IBPluginDependency 4610.IBEditorWindowLastContentRect 4610.IBPluginDependency 4610.IBViewBoundsToFrameTransform 4632.IBPluginDependency 4632.IBViewBoundsToFrameTransform 4633.IBPluginDependency 4633.IBViewBoundsToFrameTransform 4634.IBPluginDependency 4635.IBPluginDependency 4636.IBPluginDependency 4637.IBPluginDependency 4639.IBPluginDependency 4639.IBViewBoundsToFrameTransform 4640.IBPluginDependency 4647.IBPluginDependency 4656.IBPluginDependency 4660.IBPluginDependency 4660.IBViewBoundsToFrameTransform 4661.IBPluginDependency 4661.IBViewBoundsToFrameTransform 4662.IBPluginDependency 4663.IBPluginDependency 4664.IBPluginDependency 4665.IBPluginDependency 4673.IBEditorWindowLastContentRect 4673.IBPluginDependency 4673.IBViewBoundsToFrameTransform 4693.IBPluginDependency 4693.IBViewBoundsToFrameTransform 4694.IBPluginDependency 4697.IBPluginDependency 4711.IBPluginDependency 4731.IBPluginDependency 4745.IBPluginDependency 4745.IBViewBoundsToFrameTransform 4746.IBPluginDependency 4778.IBPluginDependency 4792.IBPluginDependency 4792.IBViewBoundsToFrameTransform 4795.IBPluginDependency 4796.IBPluginDependency 4797.IBPluginDependency 4798.IBPluginDependency 4799.IBPluginDependency 4800.IBPluginDependency 4801.IBPluginDependency 4802.IBPluginDependency 4809.IBPluginDependency 4809.IBViewBoundsToFrameTransform 4810.IBPluginDependency 4811.IBPluginDependency 4811.IBViewBoundsToFrameTransform 4812.IBPluginDependency 4814.IBAttributePlaceholdersKey 4814.IBPluginDependency 4814.IBViewBoundsToFrameTransform 4815.IBPluginDependency 4817.IBPluginDependency 4818.IBPluginDependency 4822.IBAttributePlaceholdersKey 4822.IBPluginDependency 4822.IBViewBoundsToFrameTransform 4823.IBPluginDependency 4850.IBEditorWindowLastContentRect 4850.IBPluginDependency 4851.IBEditorWindowLastContentRect 4851.IBPluginDependency 4851.IBViewBoundsToFrameTransform 4858.IBPluginDependency 4858.IBViewBoundsToFrameTransform 4859.IBPluginDependency 4859.IBViewBoundsToFrameTransform 4860.IBPluginDependency 4860.IBViewBoundsToFrameTransform 4861.IBPluginDependency 4861.IBViewBoundsToFrameTransform 4862.IBPluginDependency 4862.IBViewBoundsToFrameTransform 4863.IBPluginDependency 4863.IBViewBoundsToFrameTransform 4864.IBPluginDependency 4865.IBPluginDependency 4866.IBPluginDependency 4867.IBPluginDependency 4868.IBPluginDependency 4869.IBPluginDependency 4871.IBPluginDependency 4871.IBViewBoundsToFrameTransform 4872.IBPluginDependency 4872.IBViewBoundsToFrameTransform 4873.IBPluginDependency 4874.IBPluginDependency 4876.IBPluginDependency 4876.IBViewBoundsToFrameTransform 4877.IBPluginDependency 4877.IBViewBoundsToFrameTransform 4878.IBPluginDependency 4879.IBPluginDependency 4880.IBEditorWindowLastContentRect 4880.IBPluginDependency 4880.IBViewBoundsToFrameTransform 4887.IBPluginDependency 4887.IBViewBoundsToFrameTransform 4888.IBPluginDependency 4888.IBViewBoundsToFrameTransform 4889.IBPluginDependency 4889.IBViewBoundsToFrameTransform 4890.IBPluginDependency 4891.IBPluginDependency 4892.IBPluginDependency 4899.IBPluginDependency 4899.IBViewBoundsToFrameTransform 490.IBPluginDependency 4900.IBPluginDependency 4900.IBViewBoundsToFrameTransform 4901.IBPluginDependency 4902.IBEditorWindowLastContentRect 4902.IBPluginDependency 4903.IBAttributePlaceholdersKey 4903.IBPluginDependency 4904.IBAttributePlaceholdersKey 4904.IBPluginDependency 4906.IBPluginDependency 4906.IBViewBoundsToFrameTransform 4907.IBPluginDependency 4908.IBPluginDependency 4908.IBViewBoundsToFrameTransform 4909.IBPluginDependency 491.IBEditorWindowLastContentRect 491.IBPluginDependency 4910.IBAttributePlaceholdersKey 4910.IBPluginDependency 4910.IBViewBoundsToFrameTransform 4911.IBPluginDependency 4912.IBEditorWindowLastContentRect 4912.IBPluginDependency 4913.IBPluginDependency 4914.IBPluginDependency 4916.IBPluginDependency 492.IBPluginDependency 4947.IBPluginDependency 4947.IBViewBoundsToFrameTransform 5.IBPluginDependency 5.ImportedFromIB2 5003.IBPluginDependency 5003.IBViewBoundsToFrameTransform 5004.IBPluginDependency 5004.IBViewBoundsToFrameTransform 5005.IBPluginDependency 5005.IBViewBoundsToFrameTransform 5006.IBPluginDependency 5006.IBViewBoundsToFrameTransform 5007.IBPluginDependency 5008.IBPluginDependency 5009.IBPluginDependency 5066.IBPluginDependency 5066.IBViewBoundsToFrameTransform 5067.IBPluginDependency 5068.IBAttributePlaceholdersKey 5068.IBPluginDependency 5068.IBViewBoundsToFrameTransform 5069.IBPluginDependency 5080.IBEditorWindowLastContentRect 5080.IBPluginDependency 5080.IBWindowTemplateEditedContentRect 5080.NSWindowTemplate.visibleAtLaunch 5080.windowTemplate.hasMinSize 5080.windowTemplate.minSize 5081.IBPluginDependency 5082.IBPluginDependency 5082.IBViewBoundsToFrameTransform 5083.IBPluginDependency 5084.IBPluginDependency 5085.IBPluginDependency 5086.IBPluginDependency 5087.IBPluginDependency 5088.IBPluginDependency 5089.IBPluginDependency 5097.IBPluginDependency 5098.IBPluginDependency 5098.IBViewBoundsToFrameTransform 5099.IBPluginDependency 5100.IBPluginDependency 5100.IBViewBoundsToFrameTransform 5101.IBPluginDependency 5102.IBPluginDependency 5102.IBViewBoundsToFrameTransform 5103.IBPluginDependency 5104.IBPluginDependency 5104.IBViewBoundsToFrameTransform 5105.IBPluginDependency 5106.IBPluginDependency 5106.IBViewBoundsToFrameTransform 5107.IBPluginDependency 5111.IBPluginDependency 5111.IBViewBoundsToFrameTransform 5112.IBPluginDependency 5115.IBPluginDependency 5127.IBPluginDependency 5127.IBViewBoundsToFrameTransform 5128.IBPluginDependency 5133.IBPluginDependency 5133.IBViewBoundsToFrameTransform 5134.IBPluginDependency 5135.IBPluginDependency 5135.IBViewBoundsToFrameTransform 5136.IBPluginDependency 5140.IBPluginDependency 5140.IBViewBoundsToFrameTransform 5141.IBPluginDependency 5168.IBPluginDependency 5168.IBViewBoundsToFrameTransform 5169.IBPluginDependency 5171.IBPluginDependency 5171.IBViewBoundsToFrameTransform 5172.IBPluginDependency 5172.IBViewBoundsToFrameTransform 5173.IBPluginDependency 5173.IBViewBoundsToFrameTransform 5174.IBPluginDependency 5174.IBViewBoundsToFrameTransform 5175.IBPluginDependency 5175.IBViewBoundsToFrameTransform 5176.IBPluginDependency 5177.IBPluginDependency 5178.IBPluginDependency 5179.IBPluginDependency 5186.IBPluginDependency 5186.IBViewBoundsToFrameTransform 5188.IBAttributePlaceholdersKey 5188.IBPluginDependency 5188.IBViewBoundsToFrameTransform 5189.IBPluginDependency 5193.IBNumberFormatterBehaviorMetadataKey 5193.IBNumberFormatterLocalizesFormatMetadataKey 5193.IBPluginDependency 5329.IBPluginDependency 534.IBPluginDependency 535.IBPluginDependency 538.IBPluginDependency 539.IBEditorWindowLastContentRect 539.IBPluginDependency 541.IBPluginDependency 5419.IBPluginDependency 542.IBEditorWindowLastContentRect 542.IBPluginDependency 5420.IBPluginDependency 5421.IBPluginDependency 5427.IBAttributePlaceholdersKey 5427.IBPluginDependency 5450.IBPluginDependency 5450.IBViewBoundsToFrameTransform 56.IBPluginDependency 56.ImportedFromIB2 5648.IBPluginDependency 5649.IBPluginDependency 5651.IBEditorWindowLastContentRect 5651.IBPluginDependency 5651.IBWindowTemplateEditedContentRect 5651.NSWindowTemplate.visibleAtLaunch 5652.IBPluginDependency 5653.IBPluginDependency 5653.IBViewBoundsToFrameTransform 5654.IBAttributePlaceholdersKey 5654.IBPluginDependency 5654.IBViewBoundsToFrameTransform 5658.IBPluginDependency 5658.IBViewBoundsToFrameTransform 5659.IBPluginDependency 5659.IBViewBoundsToFrameTransform 5660.IBPluginDependency 5661.IBPluginDependency 5667.IBPluginDependency 5668.IBPluginDependency 5669.IBPluginDependency 5670.IBPluginDependency 5670.IBViewBoundsToFrameTransform 5671.IBPluginDependency 5672.IBPluginDependency 5673.IBPluginDependency 5674.IBPluginDependency 5675.IBPluginDependency 5675.IBViewBoundsToFrameTransform 5676.IBPluginDependency 5677.IBPluginDependency 5678.IBPluginDependency 5680.IBPluginDependency 5680.IBViewBoundsToFrameTransform 5681.IBPluginDependency 5682.IBPluginDependency 5683.IBPluginDependency 5685.IBPluginDependency 5685.IBViewBoundsToFrameTransform 5686.IBPluginDependency 5687.IBPluginDependency 5688.IBPluginDependency 5689.IBPluginDependency 57.IBEditorWindowLastContentRect 57.IBPluginDependency 57.ImportedFromIB2 57.editorWindowContentRectSynchronizationRect 5702.IBPluginDependency 5713.IBPluginDependency 575.IBPluginDependency 576.IBEditorWindowLastContentRect 576.IBPluginDependency 578.IBPluginDependency 58.IBPluginDependency 58.ImportedFromIB2 5933.IBEditorWindowLastContentRect 5933.IBPluginDependency 5933.IBViewBoundsToFrameTransform 5934.IBPluginDependency 5934.IBViewBoundsToFrameTransform 5935.IBPluginDependency 5935.IBViewBoundsToFrameTransform 5936.IBPluginDependency 5937.IBPluginDependency 5938.IBEditorWindowLastContentRect 5938.IBPluginDependency 5939.IBPluginDependency 594.IBPluginDependency 5942.IBPluginDependency 596.IBPluginDependency 5963.IBPluginDependency 5965.IBPluginDependency 5965.IBViewBoundsToFrameTransform 5966.IBPluginDependency 607.IBPluginDependency 608.IBEditorWindowLastContentRect 608.IBPluginDependency 6126.IBPluginDependency 6126.IBViewBoundsToFrameTransform 6127.IBPluginDependency 6127.IBViewBoundsToFrameTransform 6128.IBAttributePlaceholdersKey 6128.IBPluginDependency 6129.IBAttributePlaceholdersKey 6129.IBPluginDependency 6130.IBPluginDependency 6131.IBPluginDependency 6131.IBViewBoundsToFrameTransform 6132.IBPluginDependency 6132.IBViewBoundsToFrameTransform 6133.IBAttributePlaceholdersKey 6133.IBPluginDependency 6134.IBAttributePlaceholdersKey 6134.IBPluginDependency 6135.IBPluginDependency 6159.IBAttributePlaceholdersKey 6159.IBPluginDependency 6159.IBViewBoundsToFrameTransform 6160.IBPluginDependency 6161.IBAttributePlaceholdersKey 6161.IBPluginDependency 6162.IBPluginDependency 6168.IBPluginDependency 6169.IBEditorWindowLastContentRect 6169.IBPluginDependency 6170.IBPluginDependency 6171.IBPluginDependency 6172.IBEditorWindowLastContentRect 6172.IBPluginDependency 6173.IBPluginDependency 6174.IBPluginDependency 6177.IBPluginDependency 6180.IBEditorWindowLastContentRect 6180.IBPluginDependency 6180.IBViewBoundsToFrameTransform 6182.IBPluginDependency 6182.IBViewBoundsToFrameTransform 6183.IBPluginDependency 6183.IBViewBoundsToFrameTransform 6184.IBPluginDependency 6184.IBViewBoundsToFrameTransform 6185.IBAttributePlaceholdersKey 6185.IBPluginDependency 6186.IBAttributePlaceholdersKey 6186.IBPluginDependency 6187.IBPluginDependency 6188.IBPluginDependency 6188.IBViewBoundsToFrameTransform 6189.IBPluginDependency 6190.IBAttributePlaceholdersKey 6190.IBPluginDependency 6191.IBAttributePlaceholdersKey 6191.IBPluginDependency 6233.IBAttributePlaceholdersKey 6233.IBPluginDependency 6234.IBAttributePlaceholdersKey 6238.IBPluginDependency 627.IBEditorWindowLastContentRect 627.IBPluginDependency 627.IBWindowTemplateEditedContentRect 627.NSWindowTemplate.visibleAtLaunch 628.IBPluginDependency 629.IBEditorWindowLastContentRect 629.IBPluginDependency 6295.IBEditorWindowLastContentRect 6295.IBPluginDependency 6295.IBWindowTemplateEditedContentRect 6295.NSWindowTemplate.visibleAtLaunch 6295.windowTemplate.hasMaxSize 6295.windowTemplate.hasMinSize 6295.windowTemplate.maxSize 6295.windowTemplate.minSize 6296.IBPluginDependency 634.IBPluginDependency 635.IBPluginDependency 6352.IBEditorWindowLastContentRect 6352.IBPluginDependency 6353.IBPluginDependency 6353.IBViewBoundsToFrameTransform 6354.IBPluginDependency 6354.IBViewBoundsToFrameTransform 6355.IBPluginDependency 6355.IBViewBoundsToFrameTransform 6356.IBPluginDependency 6356.IBViewBoundsToFrameTransform 6357.IBPluginDependency 6357.IBViewBoundsToFrameTransform 6358.IBPluginDependency 6358.IBViewBoundsToFrameTransform 6359.IBPluginDependency 6359.IBViewBoundsToFrameTransform 6360.IBPluginDependency 6360.IBViewBoundsToFrameTransform 6361.IBPluginDependency 6361.IBViewBoundsToFrameTransform 6362.IBPluginDependency 6362.IBViewBoundsToFrameTransform 6363.IBPluginDependency 6363.IBViewBoundsToFrameTransform 6364.IBPluginDependency 6364.IBViewBoundsToFrameTransform 6365.IBPluginDependency 6365.IBViewBoundsToFrameTransform 6366.IBPluginDependency 6366.IBViewBoundsToFrameTransform 6368.IBPluginDependency 6368.IBViewBoundsToFrameTransform 6369.IBPluginDependency 6369.IBViewBoundsToFrameTransform 6374.IBPluginDependency 6376.IBPluginDependency 6377.IBPluginDependency 6378.IBPluginDependency 6379.IBPluginDependency 6380.IBPluginDependency 6381.IBPluginDependency 6382.IBPluginDependency 6383.IBPluginDependency 6384.IBPluginDependency 6385.IBPluginDependency 6386.IBPluginDependency 6387.IBPluginDependency 6388.IBEditorWindowLastContentRect 6388.IBPluginDependency 6388.IBViewBoundsToFrameTransform 6389.IBPluginDependency 6389.IBViewBoundsToFrameTransform 6390.IBPluginDependency 6390.IBViewBoundsToFrameTransform 6391.IBPluginDependency 6391.IBViewBoundsToFrameTransform 6392.IBPluginDependency 6392.IBViewBoundsToFrameTransform 6393.IBPluginDependency 6393.IBViewBoundsToFrameTransform 6394.IBPluginDependency 6394.IBViewBoundsToFrameTransform 6395.IBPluginDependency 6395.IBViewBoundsToFrameTransform 6396.IBPluginDependency 6396.IBViewBoundsToFrameTransform 6397.IBPluginDependency 6397.IBViewBoundsToFrameTransform 6398.IBPluginDependency 6398.IBViewBoundsToFrameTransform 6399.IBPluginDependency 6399.IBViewBoundsToFrameTransform 6400.IBPluginDependency 6400.IBViewBoundsToFrameTransform 6401.IBPluginDependency 6401.IBViewBoundsToFrameTransform 6402.IBPluginDependency 6402.IBViewBoundsToFrameTransform 6405.IBPluginDependency 6405.IBViewBoundsToFrameTransform 6406.IBPluginDependency 6406.IBViewBoundsToFrameTransform 6407.IBPluginDependency 6407.IBViewBoundsToFrameTransform 6408.IBPluginDependency 6408.IBViewBoundsToFrameTransform 6413.IBPluginDependency 6414.IBPluginDependency 6415.IBPluginDependency 6418.IBPluginDependency 6419.IBPluginDependency 6420.IBPluginDependency 6421.IBPluginDependency 6422.IBPluginDependency 6423.IBPluginDependency 6424.IBPluginDependency 6425.IBPluginDependency 6426.IBPluginDependency 6427.IBPluginDependency 6428.IBPluginDependency 6429.IBPluginDependency 6430.IBEditorWindowLastContentRect 6430.IBPluginDependency 6430.IBViewBoundsToFrameTransform 6431.IBPluginDependency 6431.IBViewBoundsToFrameTransform 6432.IBPluginDependency 6432.IBViewBoundsToFrameTransform 6433.IBPluginDependency 6433.IBViewBoundsToFrameTransform 6434.IBPluginDependency 6435.IBPluginDependency 6436.IBPluginDependency 6437.IBPluginDependency 6438.IBPluginDependency 6440.IBPluginDependency 6441.IBPluginDependency 6451.IBPluginDependency 6484.IBPluginDependency 6484.IBViewBoundsToFrameTransform 6485.IBPluginDependency 6486.IBPluginDependency 6487.IBPluginDependency 6488.IBPluginDependency 6489.IBPluginDependency 6491.IBPluginDependency 6491.IBViewBoundsToFrameTransform 6492.IBPluginDependency 6493.IBPluginDependency 6494.IBPluginDependency 6496.IBPluginDependency 6497.IBPluginDependency 6498.IBPluginDependency 6499.IBPluginDependency 6611.IBPluginDependency 6611.IBViewBoundsToFrameTransform 6612.IBPluginDependency 6617.IBPluginDependency 6618.IBAttributePlaceholdersKey 6618.IBPluginDependency 6618.IBViewBoundsToFrameTransform 6619.IBPluginDependency 6622.IBPluginDependency 6622.IBViewBoundsToFrameTransform 6623.IBAttributePlaceholdersKey 6623.IBPluginDependency 6624.IBPluginDependency 6627.IBAttributePlaceholdersKey 6627.IBPluginDependency 6627.IBViewBoundsToFrameTransform 6628.IBPluginDependency 6630.IBAttributePlaceholdersKey 6630.IBPluginDependency 6630.IBViewBoundsToFrameTransform 6631.IBPluginDependency 6634.IBAttributePlaceholdersKey 6634.IBPluginDependency 6635.IBAttributePlaceholdersKey 6651.IBPluginDependency 6652.IBPluginDependency 6931.IBPluginDependency 6998.IBPluginDependency 6999.IBPluginDependency 7002.IBPluginDependency 7014.IBEditorWindowLastContentRect 7014.IBPluginDependency 7014.IBViewBoundsToFrameTransform 7128.IBPluginDependency 7128.IBViewBoundsToFrameTransform 7129.IBPluginDependency 7130.IBPluginDependency 7131.IBPluginDependency 7132.IBPluginDependency 7137.IBPluginDependency 7138.IBPluginDependency 714.IBEditorWindowLastContentRect 714.IBPluginDependency 714.IBViewBoundsToFrameTransform 7140.IBPluginDependency 7141.IBPluginDependency 715.IBPluginDependency 7168.IBPluginDependency 7168.IBViewBoundsToFrameTransform 7169.IBPluginDependency 7171.IBEditorWindowLastContentRect 7171.IBPluginDependency 7171.IBWindowTemplateEditedContentRect 7171.NSWindowTemplate.visibleAtLaunch 7172.IBPluginDependency 7173.IBEditorWindowLastContentRect 7173.IBPluginDependency 7173.IBWindowTemplateEditedContentRect 7173.NSWindowTemplate.visibleAtLaunch 7174.IBPluginDependency 7175.IBEditorWindowLastContentRect 7175.IBPluginDependency 7175.IBWindowTemplateEditedContentRect 7175.NSWindowTemplate.visibleAtLaunch 7176.IBPluginDependency 7179.IBEditorWindowLastContentRect 7179.IBPluginDependency 7179.IBWindowTemplateEditedContentRect 7179.NSWindowTemplate.visibleAtLaunch 7180.IBPluginDependency 7182.IBPluginDependency 7182.IBViewBoundsToFrameTransform 7183.IBPluginDependency 7183.IBViewBoundsToFrameTransform 7184.IBPluginDependency 7184.IBViewBoundsToFrameTransform 7185.IBPluginDependency 7185.IBViewBoundsToFrameTransform 7186.IBAttributePlaceholdersKey 7186.IBPluginDependency 7187.IBPluginDependency 7188.IBAttributePlaceholdersKey 7188.IBPluginDependency 7189.IBAttributePlaceholdersKey 7190.IBAttributePlaceholdersKey 7191.IBPluginDependency 7192.IBPluginDependency 72.IBPluginDependency 72.ImportedFromIB2 7210.IBPluginDependency 7210.IBViewBoundsToFrameTransform 7211.IBPluginDependency 7212.IBEditorWindowLastContentRect 7212.IBPluginDependency 7213.IBPluginDependency 7214.IBPluginDependency 7215.IBPluginDependency 7216.IBPluginDependency 7216.IBViewBoundsToFrameTransform 7217.IBPluginDependency 7218.IBPluginDependency 7219.IBPluginDependency 7220.IBPluginDependency 7221.IBPluginDependency 7222.IBPluginDependency 7223.IBPluginDependency 7224.IBPluginDependency 7225.IBEditorWindowLastContentRect 7225.IBPluginDependency 7225.IBWindowTemplateEditedContentRect 7225.NSWindowTemplate.visibleAtLaunch 7226.IBPluginDependency 7227.IBPluginDependency 7227.IBViewBoundsToFrameTransform 7228.IBPluginDependency 7228.IBViewBoundsToFrameTransform 7229.IBPluginDependency 7230.IBEditorWindowLastContentRect 7230.IBPluginDependency 7231.IBPluginDependency 7232.IBPluginDependency 7233.IBPluginDependency 7234.IBPluginDependency 7235.IBPluginDependency 7236.IBPluginDependency 7237.IBPluginDependency 7238.IBPluginDependency 7239.IBPluginDependency 7240.IBPluginDependency 7241.IBPluginDependency 7266.IBPluginDependency 7266.IBViewBoundsToFrameTransform 7267.IBPluginDependency 7267.IBViewBoundsToFrameTransform 7268.IBPluginDependency 7269.IBPluginDependency 7270.IBPluginDependency 7285.IBPluginDependency 7285.IBViewBoundsToFrameTransform 7286.IBPluginDependency 7287.IBPluginDependency 7287.IBViewBoundsToFrameTransform 7288.IBPluginDependency 7289.IBPluginDependency 7289.IBViewBoundsToFrameTransform 7290.IBPluginDependency 7290.IBViewBoundsToFrameTransform 7291.IBPluginDependency 7292.IBPluginDependency 7293.IBPluginDependency 7293.IBViewBoundsToFrameTransform 7294.IBNumberFormatterBehaviorMetadataKey 7294.IBNumberFormatterLocalizesFormatMetadataKey 7294.IBPluginDependency 7295.IBNumberFormatterBehaviorMetadataKey 7295.IBNumberFormatterLocalizesFormatMetadataKey 7295.IBPluginDependency 7301.IBPluginDependency 7301.IBViewBoundsToFrameTransform 7302.IBPluginDependency 7305.IBPluginDependency 7305.IBViewBoundsToFrameTransform 7308.IBPluginDependency 7309.IBPluginDependency 7309.IBViewBoundsToFrameTransform 7312.IBPluginDependency 7313.IBPluginDependency 7313.IBViewBoundsToFrameTransform 7316.IBPluginDependency 7317.IBPluginDependency 7317.IBViewBoundsToFrameTransform 7320.IBPluginDependency 7353.IBPluginDependency 7354.IBPluginDependency 7354.IBViewBoundsToFrameTransform 7355.IBPluginDependency 7358.IBPluginDependency 7358.IBViewBoundsToFrameTransform 7359.IBPluginDependency 7392.IBPluginDependency 7392.IBViewBoundsToFrameTransform 7393.IBPluginDependency 7395.IBPluginDependency 7395.IBViewBoundsToFrameTransform 7396.IBPluginDependency 7398.IBPluginDependency 7398.IBViewBoundsToFrameTransform 7399.IBPluginDependency 74.IBPluginDependency 74.ImportedFromIB2 7401.IBPluginDependency 7401.IBViewBoundsToFrameTransform 7402.IBPluginDependency 7404.IBPluginDependency 7404.IBViewBoundsToFrameTransform 7405.IBPluginDependency 7433.IBPluginDependency 7433.IBViewBoundsToFrameTransform 7434.IBPluginDependency 7436.IBPluginDependency 7436.IBViewBoundsToFrameTransform 7437.IBPluginDependency 7439.IBPluginDependency 7439.IBViewBoundsToFrameTransform 7440.IBPluginDependency 7442.IBPluginDependency 7442.IBViewBoundsToFrameTransform 7443.IBPluginDependency 7445.IBPluginDependency 7445.IBViewBoundsToFrameTransform 7446.IBPluginDependency 7449.IBEditorWindowLastContentRect 7449.IBPluginDependency 7449.IBWindowTemplateEditedContentRect 7449.NSWindowTemplate.visibleAtLaunch 7450.IBPluginDependency 7451.IBPluginDependency 7451.IBViewBoundsToFrameTransform 7452.IBPluginDependency 7454.IBPluginDependency 7454.IBViewBoundsToFrameTransform 7455.IBPluginDependency 7455.IBViewBoundsToFrameTransform 7456.IBPluginDependency 7456.IBViewBoundsToFrameTransform 7457.IBPluginDependency 7457.IBViewBoundsToFrameTransform 7458.IBPluginDependency 7458.IBViewBoundsToFrameTransform 7459.IBPluginDependency 7459.IBViewBoundsToFrameTransform 7460.IBPluginDependency 7460.IBViewBoundsToFrameTransform 7461.IBPluginDependency 7461.IBViewBoundsToFrameTransform 7462.IBPluginDependency 7462.IBViewBoundsToFrameTransform 7463.IBPluginDependency 7463.IBViewBoundsToFrameTransform 7464.IBPluginDependency 7465.IBNumberFormatterBehaviorMetadataKey 7465.IBNumberFormatterLocalizesFormatMetadataKey 7465.IBPluginDependency 7466.IBPluginDependency 7467.IBPluginDependency 7468.IBPluginDependency 7469.IBPluginDependency 7470.IBPluginDependency 7471.IBPluginDependency 7472.IBPluginDependency 7473.IBPluginDependency 7474.IBPluginDependency 7486.IBPluginDependency 7486.IBViewBoundsToFrameTransform 7487.IBPluginDependency 7487.IBViewBoundsToFrameTransform 7488.IBPluginDependency 7489.IBPluginDependency 75.IBPluginDependency 75.ImportedFromIB2 7515.IBEditorWindowLastContentRect 7515.IBPluginDependency 7515.IBWindowTemplateEditedContentRect 7515.NSWindowTemplate.visibleAtLaunch 7515.windowTemplate.hasMinSize 7515.windowTemplate.minSize 7516.IBPluginDependency 7517.IBPluginDependency 7517.IBViewBoundsToFrameTransform 7518.IBPluginDependency 7519.IBPluginDependency 7520.IBPluginDependency 7521.IBPluginDependency 7526.IBPluginDependency 7540.IBPluginDependency 7541.IBPluginDependency 7541.IBViewBoundsToFrameTransform 7542.IBPluginDependency 7543.IBPluginDependency 7543.IBViewBoundsToFrameTransform 7544.IBPluginDependency 7545.IBPluginDependency 7545.IBViewBoundsToFrameTransform 7546.IBPluginDependency 7551.IBPluginDependency 7551.IBViewBoundsToFrameTransform 7552.IBPluginDependency 7553.IBPluginDependency 7553.IBViewBoundsToFrameTransform 7554.IBPluginDependency 7555.IBPluginDependency 7556.IBPluginDependency 7583.IBPluginDependency 7584.IBPluginDependency 7594.IBPluginDependency 7594.IBViewBoundsToFrameTransform 7595.IBPluginDependency 7596.IBEditorWindowLastContentRect 7596.IBPluginDependency 7597.IBPluginDependency 7598.IBAttributePlaceholdersKey 7598.IBPluginDependency 7599.IBAttributePlaceholdersKey 7599.IBPluginDependency 7600.IBAttributePlaceholdersKey 7600.IBPluginDependency 7601.IBAttributePlaceholdersKey 7601.IBPluginDependency 7602.IBPluginDependency 7603.IBPluginDependency 7604.IBAttributePlaceholdersKey 7604.IBPluginDependency 7605.IBPluginDependency 7605.IBViewBoundsToFrameTransform 7606.IBPluginDependency 7607.IBEditorWindowLastContentRect 7607.IBPluginDependency 7610.IBAttributePlaceholdersKey 7610.IBPluginDependency 7612.IBPluginDependency 7624.IBPluginDependency 7624.IBViewBoundsToFrameTransform 7625.IBPluginDependency 7666.CustomClassName 7666.IBPluginDependency 7707.IBEditorWindowLastContentRect 7707.IBPluginDependency 7707.IBWindowTemplateEditedContentRect 7707.NSWindowTemplate.visibleAtLaunch 7708.IBPluginDependency 7715.IBPluginDependency 7715.IBViewBoundsToFrameTransform 7716.IBPluginDependency 7725.IBPluginDependency 7725.IBViewBoundsToFrameTransform 7726.IBPluginDependency 7729.IBPluginDependency 7729.IBViewBoundsToFrameTransform 7730.IBPluginDependency 7740.IBPluginDependency 7759.IBPluginDependency 7759.IBViewBoundsToFrameTransform 7760.IBPluginDependency 7761.IBPluginDependency 7762.IBPluginDependency 7765.IBNumberFormatterBehaviorMetadataKey 7765.IBNumberFormatterLocalizesFormatMetadataKey 7765.IBPluginDependency 7766.IBPluginDependency 7766.IBViewBoundsToFrameTransform 7767.IBPluginDependency 7771.IBPluginDependency 7772.IBEditorWindowLastContentRect 7772.IBPluginDependency 7773.IBPluginDependency 7774.IBPluginDependency 7775.IBPluginDependency 7776.IBPluginDependency 7777.IBPluginDependency 7778.IBPluginDependency 7779.IBPluginDependency 7780.IBPluginDependency 7780.IBViewBoundsToFrameTransform 7781.IBPluginDependency 7792.IBAttributePlaceholdersKey 7792.IBPluginDependency 7792.IBViewBoundsToFrameTransform 7793.IBPluginDependency 7794.IBNumberFormatterBehaviorMetadataKey 7794.IBNumberFormatterLocalizesFormatMetadataKey 7794.IBNumberFormatterSampleNumberKey 7794.IBPluginDependency 7802.IBAttributePlaceholdersKey 7802.IBPluginDependency 7802.IBViewBoundsToFrameTransform 7803.IBPluginDependency 7804.IBPluginDependency 7804.IBViewBoundsToFrameTransform 7805.IBPluginDependency 7806.IBPluginDependency 7806.IBViewBoundsToFrameTransform 7807.IBPluginDependency 7808.IBPluginDependency 7808.IBViewBoundsToFrameTransform 7809.IBPluginDependency 7810.IBPluginDependency 7810.IBViewBoundsToFrameTransform 7811.IBPluginDependency 7812.IBPluginDependency 7812.IBViewBoundsToFrameTransform 7813.IBPluginDependency 7817.IBEditorWindowLastContentRect 7817.IBPluginDependency 7817.IBWindowTemplateEditedContentRect 7817.NSWindowTemplate.visibleAtLaunch 7818.IBPluginDependency 7820.IBPluginDependency 7820.IBViewBoundsToFrameTransform 7821.IBPluginDependency 7821.IBViewBoundsToFrameTransform 7822.IBPluginDependency 7822.IBViewBoundsToFrameTransform 7823.IBPluginDependency 7823.IBViewBoundsToFrameTransform 7824.IBPluginDependency 7824.IBViewBoundsToFrameTransform 7825.IBPluginDependency 7825.IBViewBoundsToFrameTransform 7826.IBPluginDependency 7827.IBPluginDependency 7828.IBPluginDependency 7829.IBPluginDependency 783.IBPluginDependency 7830.IBPluginDependency 7831.IBPluginDependency 7836.IBPluginDependency 7836.IBViewBoundsToFrameTransform 7837.IBPluginDependency 7838.IBPluginDependency 7838.IBViewBoundsToFrameTransform 7839.IBPluginDependency 784.IBEditorWindowLastContentRect 784.IBPluginDependency 7840.IBNumberFormatterBehaviorMetadataKey 7840.IBNumberFormatterLocalizesFormatMetadataKey 7840.IBPluginDependency 7843.IBAttributePlaceholdersKey 7843.IBPluginDependency 7843.IBViewBoundsToFrameTransform 7844.IBPluginDependency 7845.IBAttributePlaceholdersKey 7845.IBPluginDependency 7845.IBViewBoundsToFrameTransform 7846.IBPluginDependency 7847.IBPluginDependency 7847.IBViewBoundsToFrameTransform 7848.IBPluginDependency 785.IBPluginDependency 7855.IBEditorWindowLastContentRect 7855.IBPluginDependency 7855.IBWindowTemplateEditedContentRect 7855.NSWindowTemplate.visibleAtLaunch 7856.IBPluginDependency 7857.IBPluginDependency 7857.IBViewBoundsToFrameTransform 7858.IBPluginDependency 7859.IBPluginDependency 7860.IBPluginDependency 7863.IBPluginDependency 7863.IBViewBoundsToFrameTransform 7864.IBPluginDependency 7866.IBAttributePlaceholdersKey 7866.IBPluginDependency 7866.IBViewBoundsToFrameTransform 7867.IBPluginDependency 787.IBPluginDependency 7871.IBAttributePlaceholdersKey 7871.IBPluginDependency 7871.IBViewBoundsToFrameTransform 7872.IBPluginDependency 7873.IBAttributePlaceholdersKey 7873.IBPluginDependency 7873.IBViewBoundsToFrameTransform 7874.IBPluginDependency 7875.IBPluginDependency 7875.IBViewBoundsToFrameTransform 7876.IBPluginDependency 7877.IBPluginDependency 7877.IBViewBoundsToFrameTransform 7878.IBPluginDependency 7879.IBPluginDependency 7879.IBViewBoundsToFrameTransform 788.IBEditorWindowLastContentRect 788.IBPluginDependency 7880.IBPluginDependency 7880.IBViewBoundsToFrameTransform 7881.IBPluginDependency 7886.IBPluginDependency 789.IBPluginDependency 7899.IBPluginDependency 7899.IBViewBoundsToFrameTransform 79.IBPluginDependency 79.ImportedFromIB2 794.IBEditorWindowLastContentRect 794.IBPluginDependency 794.IBWindowTemplateEditedContentRect 794.NSWindowTemplate.visibleAtLaunch 795.IBAttributePlaceholdersKey 795.IBPluginDependency 796.IBEditorWindowLastContentRect 796.IBPluginDependency 796.IBWindowTemplateEditedContentRect 796.NSWindowTemplate.visibleAtLaunch 797.IBPluginDependency 7971.IBPluginDependency 7971.IBViewBoundsToFrameTransform 7972.IBPluginDependency 7972.IBViewBoundsToFrameTransform 7973.IBPluginDependency 7974.IBPluginDependency 7978.IBPluginDependency 7978.IBViewBoundsToFrameTransform 7987.IBPluginDependency 7987.IBViewBoundsToFrameTransform 7988.IBPluginDependency 7989.IBEditorWindowLastContentRect 7989.IBPluginDependency 7993.IBPluginDependency 7994.IBPluginDependency 7994.ImportedFromIB2 7995.IBPluginDependency 7995.ImportedFromIB2 7996.IBPluginDependency 7997.IBEditorWindowLastContentRect 7997.IBPluginDependency 7997.ImportedFromIB2 7997.editorWindowContentRectSynchronizationRect 7998.IBPluginDependency 7998.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 8003.IBPluginDependency 8009.IBPluginDependency 8009.IBViewBoundsToFrameTransform 8012.IBPluginDependency 8012.IBViewBoundsToFrameTransform 8013.IBPluginDependency 8013.IBViewBoundsToFrameTransform 8014.IBPluginDependency 8014.IBViewBoundsToFrameTransform 8015.IBPluginDependency 8016.IBPluginDependency 8021.IBPluginDependency 8021.IBViewBoundsToFrameTransform 8022.IBPluginDependency 8022.IBViewBoundsToFrameTransform 8023.IBPluginDependency 8023.IBViewBoundsToFrameTransform 8024.IBPluginDependency 8025.IBPluginDependency 8030.IBPluginDependency 8030.IBViewBoundsToFrameTransform 8031.IBPluginDependency 8031.IBViewBoundsToFrameTransform 8032.IBPluginDependency 8032.IBViewBoundsToFrameTransform 8033.IBPluginDependency 8034.IBPluginDependency 8043.IBPluginDependency 8043.IBViewBoundsToFrameTransform 8044.IBPluginDependency 8045.IBAttributePlaceholdersKey 8045.IBPluginDependency 8045.IBViewBoundsToFrameTransform 8046.IBPluginDependency 8047.IBNumberFormatterBehaviorMetadataKey 8047.IBNumberFormatterLocalizesFormatMetadataKey 8047.IBPluginDependency 8048.IBPluginDependency 8048.IBViewBoundsToFrameTransform 8049.IBPluginDependency 8056.IBPluginDependency 8057.IBPluginDependency 8058.IBAttributePlaceholdersKey 8058.IBPluginDependency 8059.IBPluginDependency 8060.IBPluginDependency 8060.IBViewBoundsToFrameTransform 8061.IBPluginDependency 8066.IBNumberFormatterBehaviorMetadataKey 8066.IBNumberFormatterLocalizesFormatMetadataKey 8066.IBPluginDependency 8075.IBPluginDependency 8075.IBViewBoundsToFrameTransform 8076.IBPluginDependency 8076.IBViewBoundsToFrameTransform 8077.IBPluginDependency 8078.IBPluginDependency 8084.IBPluginDependency 81.IBEditorWindowLastContentRect 81.IBPluginDependency 81.ImportedFromIB2 81.editorWindowContentRectSynchronizationRect 8134.IBEditorWindowLastContentRect 8134.IBPluginDependency 8134.IBWindowTemplateEditedContentRect 8134.NSWindowTemplate.visibleAtLaunch 8135.IBPluginDependency 8136.IBPluginDependency 8136.IBViewBoundsToFrameTransform 8137.IBPluginDependency 8138.IBPluginDependency 8138.IBViewBoundsToFrameTransform 8139.IBPluginDependency 8140.IBPluginDependency 8140.IBViewBoundsToFrameTransform 8141.IBPluginDependency 8142.IBPluginDependency 8142.IBViewBoundsToFrameTransform 8143.IBPluginDependency 8144.IBPluginDependency 8144.IBViewBoundsToFrameTransform 8145.IBPluginDependency 8146.IBPluginDependency 8146.IBViewBoundsToFrameTransform 8147.IBPluginDependency 8148.IBPluginDependency 8148.IBViewBoundsToFrameTransform 8149.IBPluginDependency 8150.IBPluginDependency 8150.IBViewBoundsToFrameTransform 8151.IBPluginDependency 8152.IBPluginDependency 8152.IBViewBoundsToFrameTransform 8153.IBPluginDependency 8154.IBPluginDependency 8154.IBViewBoundsToFrameTransform 8155.IBPluginDependency 8156.IBPluginDependency 8156.IBViewBoundsToFrameTransform 8157.IBPluginDependency 8158.IBPluginDependency 8158.IBViewBoundsToFrameTransform 8159.IBPluginDependency 8160.IBPluginDependency 8160.IBViewBoundsToFrameTransform 8161.IBPluginDependency 8161.IBViewBoundsToFrameTransform 8162.IBPluginDependency 8164.IBPluginDependency 8181.IBPluginDependency 8181.IBViewBoundsToFrameTransform 8182.IBPluginDependency 8183.IBPluginDependency 8184.IBPluginDependency 8185.IBPluginDependency 8186.IBPluginDependency 8188.IBPluginDependency 8188.IBViewBoundsToFrameTransform 8189.IBPluginDependency 8194.IBPluginDependency 8194.IBViewBoundsToFrameTransform 8195.IBPluginDependency 823.IBPluginDependency 823.IBViewBoundsToFrameTransform 824.IBPluginDependency 825.IBPluginDependency 825.IBViewBoundsToFrameTransform 826.IBPluginDependency 827.IBPluginDependency 827.IBViewBoundsToFrameTransform 828.IBPluginDependency 829.IBPluginDependency 829.IBViewBoundsToFrameTransform 83.IBPluginDependency 83.ImportedFromIB2 830.IBPluginDependency 831.IBPluginDependency 831.IBViewBoundsToFrameTransform 832.IBPluginDependency 833.IBPluginDependency 833.IBViewBoundsToFrameTransform 834.IBPluginDependency 835.IBPluginDependency 835.IBViewBoundsToFrameTransform 836.IBPluginDependency 843.IBPluginDependency 843.IBViewBoundsToFrameTransform 844.IBPluginDependency 845.IBPluginDependency 845.IBViewBoundsToFrameTransform 846.IBPluginDependency 850.IBPluginDependency 854.IBPluginDependency 855.IBPluginDependency 861.IBEditorWindowLastContentRect 861.IBPluginDependency 861.IBWindowTemplateEditedContentRect 861.NSWindowTemplate.visibleAtLaunch 862.IBPluginDependency 865.IBViewBoundsToFrameTransform 872.IBPluginDependency 872.IBViewBoundsToFrameTransform 875.IBPluginDependency 875.IBViewBoundsToFrameTransform 876.IBPluginDependency 876.IBViewBoundsToFrameTransform 877.IBPluginDependency 877.IBViewBoundsToFrameTransform 878.IBPluginDependency 878.IBViewBoundsToFrameTransform 879.IBPluginDependency 879.IBViewBoundsToFrameTransform 880.IBPluginDependency 883.IBPluginDependency 883.IBViewBoundsToFrameTransform 884.IBPluginDependency 885.IBPluginDependency 885.IBViewBoundsToFrameTransform 886.IBPluginDependency 887.IBPluginDependency 887.IBViewBoundsToFrameTransform 888.IBPluginDependency 889.IBPluginDependency 889.IBViewBoundsToFrameTransform 890.IBPluginDependency 897.IBPluginDependency 897.IBViewBoundsToFrameTransform 898.IBPluginDependency 899.IBPluginDependency 899.IBViewBoundsToFrameTransform 900.IBPluginDependency 901.IBPluginDependency 901.IBViewBoundsToFrameTransform 902.IBPluginDependency 903.IBPluginDependency 903.IBViewBoundsToFrameTransform 904.IBPluginDependency 905.IBPluginDependency 905.IBViewBoundsToFrameTransform 906.IBPluginDependency 907.IBPluginDependency 907.IBViewBoundsToFrameTransform 908.IBPluginDependency 909.IBPluginDependency 909.IBViewBoundsToFrameTransform 910.IBPluginDependency 911.IBPluginDependency 911.IBViewBoundsToFrameTransform 912.IBPluginDependency 913.IBPluginDependency 913.IBViewBoundsToFrameTransform 914.IBPluginDependency 92.IBPluginDependency 92.ImportedFromIB2 924.IBPluginDependency 924.IBViewBoundsToFrameTransform 925.IBPluginDependency 926.IBPluginDependency 926.IBViewBoundsToFrameTransform 927.IBPluginDependency 928.IBPluginDependency 928.IBViewBoundsToFrameTransform 929.IBPluginDependency 930.IBPluginDependency 930.IBViewBoundsToFrameTransform 931.IBPluginDependency 932.IBPluginDependency 932.IBViewBoundsToFrameTransform 933.IBPluginDependency 934.IBPluginDependency 934.IBViewBoundsToFrameTransform 935.IBPluginDependency 936.IBPluginDependency 936.IBViewBoundsToFrameTransform 937.IBPluginDependency 938.IBPluginDependency 938.IBViewBoundsToFrameTransform 939.IBPluginDependency 940.IBPluginDependency 940.IBViewBoundsToFrameTransform 941.IBPluginDependency 942.IBPluginDependency 942.IBViewBoundsToFrameTransform 943.IBPluginDependency 944.IBPluginDependency 944.IBViewBoundsToFrameTransform 945.IBPluginDependency 946.IBPluginDependency 946.IBViewBoundsToFrameTransform 947.IBPluginDependency 948.IBPluginDependency 948.IBViewBoundsToFrameTransform 949.IBPluginDependency 949.IBViewBoundsToFrameTransform 950.IBPluginDependency 951.IBPluginDependency 952.IBPluginDependency 952.IBViewBoundsToFrameTransform 953.IBPluginDependency 953.IBViewBoundsToFrameTransform 954.IBPluginDependency 955.IBPluginDependency 956.IBPluginDependency 956.IBViewBoundsToFrameTransform 957.IBPluginDependency 957.IBViewBoundsToFrameTransform 958.IBPluginDependency 959.IBPluginDependency 960.IBPluginDependency 960.IBViewBoundsToFrameTransform 961.IBPluginDependency 961.IBViewBoundsToFrameTransform 962.IBPluginDependency 963.IBPluginDependency 964.IBPluginDependency 964.IBViewBoundsToFrameTransform 965.IBPluginDependency 965.IBViewBoundsToFrameTransform 966.IBPluginDependency 967.IBPluginDependency 968.IBPluginDependency 968.IBViewBoundsToFrameTransform 969.IBPluginDependency 969.IBViewBoundsToFrameTransform 970.IBPluginDependency 971.IBPluginDependency 977.IBPluginDependency 978.IBPluginDependency 979.IBPluginDependency 980.IBPluginDependency 983.IBPluginDependency 984.IBEditorWindowLastContentRect 984.IBPluginDependency 987.IBPluginDependency 989.IBPluginDependency 990.IBPluginDependency 991.IBPluginDependency 993.IBPluginDependency 998.IBEditorWindowLastContentRect 998.IBPluginDependency 998.IBWindowTemplateEditedContentRect 998.NSWindowTemplate.visibleAtLaunch 999.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB8AAAwoYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDzgAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCwgAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMAAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDfgAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDp4AAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCAAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDVQAAwhAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDuYAAwhAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDFAAAwtAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDFAAAwp4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDFAAAwlgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDGQAAwkQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1244, 1073}, {143, 23}} com.apple.InterfaceBuilder.CocoaPlugin {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1090, 201}, {520, 450}} com.apple.InterfaceBuilder.CocoaPlugin YES YES com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAweAAAA {{520, 1070}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin {{436, 809}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default size for new DS display views. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDHgAAwngAAA com.apple.InterfaceBuilder.CocoaPlugin {{1217, 377}, {126, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default rotation for new DS display views. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDDwAAwpQAAA com.apple.InterfaceBuilder.CocoaPlugin {{1177, 782}, {126, 113}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABBgAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwxgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCCAAAwoIAAA com.apple.InterfaceBuilder.CocoaPlugin {{1069, 916}, {227, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC5AAAwgQAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip The default rotation for new DS display views. A custom rotation angle may be entered here. (The angle must be between 0º and 360º.) com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDkIAAwggAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1104, 548}, {489, 425}} com.apple.InterfaceBuilder.CocoaPlugin InitialTabViewItem InitialTabViewItem com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBUAAAw8yAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default video filter for new DS display views, producing a variety of visual effects. The incurred CPU usage is dependent on which filter is used. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC6AAAw5QAAA com.apple.InterfaceBuilder.CocoaPlugin {{1170, 567}, {151, 383}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AULoAABAQAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBAAAAw4IAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBAAAAw5KAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1388, 659}, {213, 198}} com.apple.InterfaceBuilder.CocoaPlugin {{1388, 659}, {213, 198}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCdAAAwwgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCaAAAwyEAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCxAAAwv4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCaAAAwrwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwv4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC8AAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwqgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB2AAAwmwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{989, 730}, {400, 373}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDhYAAA ToolTip ToolTip Sets the default sound volume. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCMAAAwmQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDjYAAwmQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGQAABCHAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCngAAwwcAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCTAAAwtYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCjAAAwyMAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDJQAAwyYAAA com.apple.InterfaceBuilder.CocoaPlugin {{796, 565}, {126, 63}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip New display views will show both DS screens by default. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip New display views will show only the DS touch screen by default. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDqAAAwhQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABC1gAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwowAAA ToolTip ToolTip Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting. {{706, 581}, {554, 373}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABEOUAAA com.apple.InterfaceBuilder.CocoaPlugin AUGIAABEDwAAA com.apple.InterfaceBuilder.CocoaPlugin AUGIAABD2IAAA com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDi4AAA ToolTip ToolTip Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwwUAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDDAAAwtQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwtAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDtQAAwtwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDEQAAwmAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAwlgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDtQAAwqYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May CPU usage, depending on if the ROM uses the ARM SWIs. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip For developer usage only. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip For developer usage only. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwoAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDDAAAwiAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwhwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDtQAAwmQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1225, 643}, {156, 293}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1197, 1063}, {194, 73}} com.apple.InterfaceBuilder.CocoaPlugin {{525, 802}, {197, 73}} ToolTip ToolTip Performs no sound interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin AUGIAABBgAAAA com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDUQAAA ToolTip ToolTip Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDEQAAwggAAA com.apple.InterfaceBuilder.CocoaPlugin {{1139, 721}, {204, 63}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Pitch bends the sound depending on the emulation speed. Provides the smoothest sound, regardless of emulation speed. High latency. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sounds like "Dual SPU Synch/Asynch," but is a little smoother and has some added latency. Medium latency. Low CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwxIAAA ToolTip ToolTip Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the use of more complex sound synchronization methods. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB2AAAwggAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1089, 1023}, {198, 113}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1478, 1073}, {129, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwXAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{888, 368}, {700, 399}} com.apple.InterfaceBuilder.CocoaPlugin {{888, 368}, {700, 399}} {600, 9999} {700, 250} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBUAAAw70AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDtQAAw1MAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDSAAAw1MAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAw04AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw7sAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw5sAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw3YAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwzYAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwuwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwlgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1156, 396}, {380, 200}} com.apple.InterfaceBuilder.CocoaPlugin {{1156, 396}, {380, 200}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABEAwAAw1MAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAAC/gAAAw+oAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwzIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDhwAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDEAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwswAAA {{817, 1136}, {512, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw6WAAA com.apple.InterfaceBuilder.CocoaPlugin {{1091, 823}, {315, 313}} com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCuAAAweAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC6AAAwnwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABBsAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{961, 983}, {151, 153}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwgAAAA com.apple.InterfaceBuilder.CocoaPlugin {{1241, 208}, {335, 163}} com.apple.InterfaceBuilder.CocoaPlugin {{1241, 208}, {335, 163}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC5AAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDXAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwswAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADBgAAAww8AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAw10AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGoAABDXwAAA {{502, 517}, {640, 480}} com.apple.InterfaceBuilder.CocoaPlugin {{502, 517}, {640, 480}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAw8EAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC4gAAwiQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAw9UAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enable to use bilinear interpolation on the final video output by default. This creates a smoothed, but slightly blurry, image effect. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC7gAAw72AAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enable to use bilinear interpolation on the final video output. This creates a smoothed, but slightly blurry, image effect. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAxAbAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1328, 256}, {288, 511}} com.apple.InterfaceBuilder.CocoaPlugin {{1328, 256}, {288, 511}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw1oAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDjQAAA com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDBgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwqwAAA ToolTip ToolTip Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the use of more complex sound synchronization methods. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDwAAAA ToolTip ToolTip Sets the current sound volume. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCRAAAw9IAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDLAAAwgAAAA AUGgAABDyQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABD/wAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABChgAAwwAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will produce smoother color transitions than a standard DS. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwuIAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will emulate the DS toon edge marking. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwpIAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwlQAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAweAAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in "The Legend of Zelda: Spirit Tracks." No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDOQAAwegAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwxYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABCJAAAA com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDcQAAA com.apple.InterfaceBuilder.CocoaPlugin {{1315, 254}, {301, 560}} com.apple.InterfaceBuilder.CocoaPlugin {{1315, 254}, {301, 560}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCggAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUKUAABC3AAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCCAAAwfgAAA ToolTip ToolTip When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in "The Legend of Zelda: Spirit Tracks." No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDVwAAwqIAAA ToolTip ToolTip When set, SoftRasterizer will produce smoother color transitions than a standard DS. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwuYAAA ToolTip ToolTip When set, SoftRasterizer will emulate the DS toon edge marking. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwr4AAA ToolTip ToolTip When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwpYAAA ToolTip ToolTip When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAweAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABD3QAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwowAAA ToolTip ToolTip Disables 3D rendering. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default 3D rendering engine for new DS display views. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDXAAAw5qAAA com.apple.InterfaceBuilder.CocoaPlugin {{1229, 938}, {152, 63}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Disables 3D rendering. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCmgAAw5kAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABCJAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwxgAAA ToolTip ToolTip DeSmuME automatically chooses the best number of rendering threads based on your hardware. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on the same thread as the core emulation thread. Best performance option for single processor machines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on two separate threads. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines. ToolTip ToolTip Renders 3D on four separate threads. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDmQAAA ToolTip ToolTip Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwkAAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default number of processing threads that DeSmuME will use for 3D rendering. This is an option for advanced users. For most cases, it's best to keep this set to Automatic. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDegAAwmgAAA com.apple.InterfaceBuilder.CocoaPlugin {{1217, 593}, {166, 103}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip DeSmuME automatically chooses the best number of rendering threads based on your hardware. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on the same thread as the core emulation thread by default. Best performance option for single processor machines. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on two separate threads by default. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on four separate threads by default. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCeAAAwlwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUKUAABDUQAAA ToolTip ToolTip Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwjQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1406, 1073}, {101, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCaAAAwowAAA ToolTip ToolTip Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Pitch bends the sound depending on the emulation speed. Provides the smoothest sound, regardless of emulation speed. High latency. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sounds like "Dual SPU Synch/Asynch," but is a little smoother and has some added latency. Medium latency. Low CPU usage. Recommended setting. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw68AAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default audio output engine. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDIwAAw7CAAA com.apple.InterfaceBuilder.CocoaPlugin {{1047, 994}, {220, 43}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Disables audio output. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Native audio output engine for Mac OS X. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCRAAAwkgAAA ToolTip ToolTip Disables audio output. No CPU usage. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Native audio output engine for Mac OS X. Low CPU usage. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABEEwAAA {{1332, 177}, {286, 522}} com.apple.InterfaceBuilder.CocoaPlugin {{1332, 177}, {286, 522}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABD8AAAA ToolTip ToolTip Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDh4AAA ToolTip ToolTip Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May incur CPU usage, depending on if the ROM uses the ARM SWIs. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwkAAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAweAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDJgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCfAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwkAAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAweAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABCsAAAA ToolTip ToolTip For developer usage only. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB8AAAwrAAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip For developer usage only. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCHAAAwjQAAA com.apple.InterfaceBuilder.CocoaPlugin {{1325, 266}, {260, 328}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMAAAwp4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwpIAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Nicknames should be a maximum of 10 characters. Any additional characters will be truncated. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC3AAAw5kAAA ToolTip ToolTip Messages should be a maximum of 26 characters. Any additional characters will be truncated. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC3AAAw4uAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw5eAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw4oAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw2UAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw0oAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwy4AAA com.apple.InterfaceBuilder.CocoaPlugin AULcAABDOgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAww0AAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC1gAAwzEAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC1gAAw2gAAA com.apple.InterfaceBuilder.CocoaPlugin {{1453, 369}, {136, 291}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1336, 489}, {164, 105}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCVAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin {{999, 689}, {305, 315}} com.apple.InterfaceBuilder.CocoaPlugin {{999, 689}, {305, 315}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Nicknames should be a maximum of 10 characters. Any additional characters will be truncated. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCugAAw3sAAA ToolTip ToolTip Messages should be a maximum of 26 characters. Any additional characters will be truncated. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCugAAw1sAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw5KAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwtoAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwwMAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwrIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwnQAAA com.apple.InterfaceBuilder.CocoaPlugin AULuAABCkAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC6AAAwoAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC6AAAwwYAAA com.apple.InterfaceBuilder.CocoaPlugin {{1388, 295}, {172, 323}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1340, 591}, {172, 123}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwwoAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABAwAAAwuAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC0AAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCPAAAwiAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAwiAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUOxAABCKAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC3gAAw9EAAA com.apple.InterfaceBuilder.CocoaPlugin {{1354, 474}, {209, 71}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAw9EAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAw5KAAA com.apple.InterfaceBuilder.CocoaPlugin {{1014, 313}, {320, 290}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUI8AABCHAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw1UAAA ToolTip ToolTip All addresses start with 0x02. Enter the last 6 digits of the address here in hexadecimal format. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDFwAAw28AAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCAAAAwzcAAA ToolTip ToolTip Enter the numeric value to write to the target address. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCpAAAwzkAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCngAAw1QAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Select the memory size of the target address in bytes. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwrQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{936, 459}, {320, 290}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw7YAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAw6mAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw8SAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDHAAAw7gAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw7gAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{782, 197}, {320, 290}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBsAAAwvIAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AULKAABDDgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAw0QAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw1oAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC9AAAw2oAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Shows/hides the address search drawer. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDNgAAw4aAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Resets the memory address search. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDaQAAw18AAA com.apple.InterfaceBuilder.CocoaPlugin {{1017, 396}, {328, 134}} com.apple.InterfaceBuilder.CocoaPlugin {{1183, 775}, {328, 134}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwoQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwhwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDIwAAwoQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDIwAAwhwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwuAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwsQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwvAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwtQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAwhQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDaQAAwqAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1208, 384}, {328, 134}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC6AAAwqAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwsQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwuAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AQAAAABDbQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC7AAAxALAAA com.apple.InterfaceBuilder.CocoaPlugin {{1393, 502}, {136, 37}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Searches the DS memory for all addresses that currently carry the search value. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Searches the DS memory for any addresses which match the comparative search criteria. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCMAAAxAIAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCMAAAw/gAAA com.apple.InterfaceBuilder.CocoaPlugin {{1268, 1023}, {261, 113}} com.apple.InterfaceBuilder.CocoaPlugin YES YES com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDBQAAw8KAAA com.apple.InterfaceBuilder.CocoaPlugin {{1393, 478}, {198, 37}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDXAAAw2sAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDVwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC+gAAwjAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDqAAAwpIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwgAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwlQAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Immediately writes the value once to the target address. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDRQAAw10AAA com.apple.InterfaceBuilder.CocoaPlugin {{1063, 215}, {500, 416}} com.apple.InterfaceBuilder.CocoaPlugin {{1063, 215}, {500, 416}} {500, 272} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAAC/gAAAw+cAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDgYAAw+gAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBYAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDAAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDwwAAwswAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDkwAAwswAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDvIAAw/SAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw+iAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDCwAAw86AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDywAAw8MAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCpAAAw9CAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwYgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABBgAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwiAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAwiwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDqAAAwpIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC+gAAwjAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDXQAAA ToolTip ToolTip Whenever DeSmuME needs to determine a ROM's save type, use the ADVANsCEne database to determine the save type before using the internal autodetect algorithm. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAweAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{855, 920}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1009, 900}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip New display views will show only the main DS screen by default. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUDAAABDbwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{548, 341}, {550, 450}} com.apple.InterfaceBuilder.CocoaPlugin {{548, 341}, {550, 450}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDGQAAw7gAAA InitialTabViewItem InitialTabViewItem com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBUAAAw5UAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDGQAAw+8AAA com.apple.InterfaceBuilder.CocoaPlugin AUGgAABDvgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADAQAAAw28AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADAQAAAw56AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADCHAAAw56AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADAQAAAw28AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{829, 953}, {203, 183}} com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1005, 913}, {220, 223}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1058, 810}, {450, 35}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMAAAwiQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCGAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1242, 778}, {232, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDHgAAwugAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1141, 1083}, {196, 53}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABEJMAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwkgAAA ToolTip ToolTip Sets the classic interpreter engine to emulate the ARM7 and ARM9 CPUs by default. It features very high compatibility with most configurations, as well as high accuracy with most ROMs. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the dynarec engine to emulate the ARM7 and ARM9 CPUs by default. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDoQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwkgAAA ToolTip ToolTip Uses the classic interpreter engine to emulate the ARM7 and ARM9 CPUs. It features very high compatibility with most configurations, as well as high accuracy with most ROMs. [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.] com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Uses the dynarec engine to emulate the ARM7 and ARM9 CPUs. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.) [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.] com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enable to use vertical sync on the video output. This setting eliminates screen tearing, but may also reduce the video frame rate. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw+aAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Enable to use vertical sync on the video output by default. This setting eliminates screen tearing, but may also reduce the video frame rate. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1406, 1033}, {123, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1406, 1013}, {178, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1069, 398}, {431, 174}} com.apple.InterfaceBuilder.CocoaPlugin AUDAAABC8gAAA com.apple.InterfaceBuilder.CocoaPlugin AUFwAABCUAAAA com.apple.InterfaceBuilder.CocoaPlugin AUNQAABCxAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDdgAAwzcAAA ToolTip ToolTip If the display orientation is vertical, the main screen will be arranged above the touch screen by default. If the display layout is horizontal, the main screen will be arranged left of the touch screen by default. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip If the display orientation is vertical, the touch screen will be arranged above the main screen by default. If the display layout is horizontal, the touch screen will be arranged left of the main screen by default. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwkgAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Arranges the DS screens where one screen is to the left of the other screen by default. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Arranges the DS screens where one screen is above the other screen by default. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU. com.apple.InterfaceBuilder.CocoaPlugin {{975, 868}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin {{975, 868}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin {{832, 932}, {616, 0}} com.apple.InterfaceBuilder.CocoaPlugin {{962, 321}, {580, 592}} com.apple.InterfaceBuilder.CocoaPlugin {{962, 321}, {580, 592}} {580, 592} {580, 592} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{999, 589}, {580, 567}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBYAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDtwAAw7oAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC2gAAw7eAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC2gAAw6iAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAw7YAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAw6cAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAw9CAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw/eAAA com.apple.InterfaceBuilder.CocoaPlugin AUGoAABD4QAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAxAOAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAw/qAAA com.apple.InterfaceBuilder.CocoaPlugin AUGgAABDmAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAw5QAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAw4eAAA com.apple.InterfaceBuilder.CocoaPlugin AUGgAABChAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB0AAAwmgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{423, 222}, {580, 567}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBYAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDFQAAwywAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADC2AAAwycAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADC2AAAwwkAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAwyQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAwwYAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAw1kAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAw3IAAA com.apple.InterfaceBuilder.CocoaPlugin AcNEAABDegAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAw6MAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAw5aAAA com.apple.InterfaceBuilder.CocoaPlugin AcNFAABC0AAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAwsAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAwo4AAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADDPwAAQo4AAA com.apple.InterfaceBuilder.CocoaPlugin AcNFAADDMgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDQgAAwjgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{28, 498}, {580, 567}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAxA6AAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADAAAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDrYAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwugAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCWAAAwzAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDqwAAwpQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Smooths the edges of 3D objects using multisample antialiasing (MSAA). No CPU usage. However, it requires additional VRAM from your GPU. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAwrAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUKUAABCUAAAA ToolTip ToolTip Smooths the edges of 3D objects using multisample antialiasing (MSAA) by default. No CPU usage. However, it requires additional VRAM from your GPU. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAweAAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBgAAAweAAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{982, 94}, {640, 495}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAAC/gAAAw9+AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1271, 124}, {328, 434}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDogAAwhAAAA com.apple.InterfaceBuilder.CocoaPlugin {{1237, 579}, {350, 263}} com.apple.InterfaceBuilder.CocoaPlugin {{1237, 579}, {350, 263}} com.apple.InterfaceBuilder.CocoaPlugin {{1202, 1031}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin {{1202, 1031}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin {{976, 297}, {620, 267}} com.apple.InterfaceBuilder.CocoaPlugin {{976, 297}, {620, 267}} com.apple.InterfaceBuilder.CocoaPlugin {{1085, 723}, {516, 283}} com.apple.InterfaceBuilder.CocoaPlugin {{1085, 723}, {516, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDVQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD7gAAwiQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDAgAAwhQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwxEAAA ToolTip ToolTip Predefined noise samples that simulate sounds like speaking into the microphone. (Some games, such as "The Legend of Zelda: Spirit Tracks," work especially well with this.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Randomly generated white noise that simulates sounds like blowing into the microphone. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Generated pure sine wave tone. Can be adjusted for frequency. ToolTip ToolTip Predefined samples loaded from an audio file. (Whenever the Microphone command is deactivated, sample reading will be reset to the beginning of the file.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCrAAAwqAAAA com.apple.InterfaceBuilder.CocoaPlugin {{1051, 870}, {156, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC2AAAwpoAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1202, 877}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin {{1202, 877}, {350, 125}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwswAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCrAAAwqAAAA com.apple.InterfaceBuilder.CocoaPlugin {{1409, 597}, {156, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABBgAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAw5uAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCkAAAwrYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCvAAAwrwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCkAAAwnwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCvAAAwoQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABCYAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD9QAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDcAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDFQAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDFQAAwoYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD9IAAwkQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAw1oAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw0IAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDxQAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDEAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCVAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCVAAAwoYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDzYAAwhQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw3EAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAws4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAws4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw7EAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCkAAAwjQAAA com.apple.InterfaceBuilder.CocoaPlugin {{1127, 996}, {467, 160}} com.apple.InterfaceBuilder.CocoaPlugin {{1127, 996}, {467, 160}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCbAAAwt4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC3gAAwvIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCxAAAwxIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD9oAAwxIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMgAAwxIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDgIAAwxIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDp4AAwxIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD0AAAwxIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBYAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDEQAAwnwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD6QAAwrQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDjQAAwlwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDOgAAwlwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{996, 161}, {620, 442}} com.apple.InterfaceBuilder.CocoaPlugin {{996, 161}, {620, 442}} {620, 180} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAAC/gAAAw9iAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBmAAAw/IAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD/wAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAw+qAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBYAAAwigAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABEBIAAw+uAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD5wAAw/CAAA com.apple.InterfaceBuilder.CocoaPlugin {{1433, 434}, {136, 143}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Saves the current configuration to the selected profile. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Deletes the selected profile. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Replaces the current configuration with the selected profile. com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Renames the selected profile. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Shows the selected profile. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDQwAAw/CAAA com.apple.InterfaceBuilder.CocoaPlugin {{1166, 544}, {265, 33}} com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Creates a new profile using the current configuration. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCQAAAw/EAAA com.apple.InterfaceBuilder.CocoaPlugin InputProfileController com.apple.InterfaceBuilder.CocoaPlugin {{853, 403}, {452, 115}} com.apple.InterfaceBuilder.CocoaPlugin {{853, 403}, {452, 115}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABByAAAwoYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDqwAAwoAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwwwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDAAAAwnwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDrwAAwiQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1406, 903}, {118, 133}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwgQAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip The default separation for new DS display views. A custom gap percentage may be entered here. (The gap percentage must be between 0% and 200%.) com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDqYAAwhAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the default screen separation for new DS display views. (A value of 100% will create a gap between the screens that has the same relative distance as a hardware DS.) com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDEAAAwhAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDmIAAwjwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDg4AAwjwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDXAAAwjwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMgAAwjwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDCQAAwjwAAA com.apple.InterfaceBuilder.CocoaPlugin {{1120, 724}, {441, 133}} com.apple.InterfaceBuilder.CocoaPlugin {{1120, 724}, {441, 133}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCIAAAwzwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDvYAAw0oAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDDwAAw0oAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCyAAAw0oAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCaAAAw0oAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMgAAwy0AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZQAAwxwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDqQAAwxwAAA com.apple.InterfaceBuilder.CocoaPlugin {{1406, 933}, {136, 163}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the screen separation to 0%, which removes any gap between the screens. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sets the screen separation to 100%, which creates a gap between the screens that has the same relative distance as a hardware DS. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABByAAAwfAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDHgAAwpYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{966, 232}, {640, 329}} com.apple.InterfaceBuilder.CocoaPlugin {{966, 232}, {640, 329}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAwzkAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCZAAAwggAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Choose a directory where the R4 device stores its data. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD9QAAwhgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Sends a SLOT-1 eject IRQ. The emulator will then detect that no device is inserted into SLOT-1. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBYAAAwyQAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Resets the emulation. com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABD+AAAwxYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC3gAAwxYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDNQAAwx8AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGgAABDEgAAA {{1406, 1013}, {70, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDkAAAwx8AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABCfAAAA com.apple.InterfaceBuilder.CocoaPlugin {{1299, 599}, {194, 241}} com.apple.InterfaceBuilder.CocoaPlugin {{1299, 599}, {194, 241}} YES YES com.apple.InterfaceBuilder.CocoaPlugin {{1413, 517}, {204, 521}} com.apple.InterfaceBuilder.CocoaPlugin {{1413, 517}, {204, 521}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGQAABBgAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCSAAAwjAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwjAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDrYAAw2wAAA com.apple.InterfaceBuilder.CocoaPlugin {{1196, 402}, {201, 93}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1163, 392}, {143, 23}} com.apple.InterfaceBuilder.CocoaPlugin {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUQCQABDZgAAA com.apple.InterfaceBuilder.CocoaPlugin AUO2AABDqoAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDxgAAw7iAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDtgAAw7iAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUO5AABDp4AAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDyQAAw7WAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDuQAAw7WAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUHIAABD1IAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCZAAAw+KAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDggAAw+8AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUNGAABBMAAAA com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Changes the maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.) com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC/AAAwjAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCcAAAwiQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Changes the default maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.) com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUO6AABBIAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBYAAAw3sAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDAAAAw3sAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{919, 743}, {325, 393}} com.apple.InterfaceBuilder.CocoaPlugin {{145, 474}, {199, 203}} {{1444, 249}, {173, 339}} com.apple.InterfaceBuilder.CocoaPlugin {{1444, 249}, {173, 339}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw4uAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw4GAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCBAAAwrAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwsYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAw0cAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwzMAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwwYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCBAAAwtgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwwAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwpQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwlgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwggAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDsgAAA com.apple.InterfaceBuilder.CocoaPlugin AUGIAABDJQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBUAAAxEzAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUNnAABA4AAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUPqgABCvgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwz4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwyoAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwxYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwwIAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwtwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwrQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBkAAAwowAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBoAAAwmQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{668, 434}, {580, 588}} com.apple.InterfaceBuilder.CocoaPlugin {{668, 434}, {580, 588}} com.apple.InterfaceBuilder.CocoaPlugin AUFgAABEAIAAA com.apple.InterfaceBuilder.CocoaPlugin AUMaAABDgwAAA com.apple.InterfaceBuilder.CocoaPlugin AUGIAABBgAAAA com.apple.InterfaceBuilder.CocoaPlugin AUOSgABDYAAAA com.apple.InterfaceBuilder.CocoaPlugin AUOSgABCxAAAA com.apple.InterfaceBuilder.CocoaPlugin AUOSgABBgAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwuQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwrIAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwoAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwegAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw+gAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw0wAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwzYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwyAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwwoAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwugAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwrwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwpAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwkgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZwAAwzQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw6IAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw4IAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZwAAwx4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZwAAwwgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZwAAwuQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZwAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZwAAwowAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZwAAwkAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDZwAAwdAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAw0QAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwwQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwogAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwvAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDWwAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwp4AAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDWwAAwowAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwlgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDWwAAwkAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwegAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDWwAAwdAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwpoAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDWwAAwkAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBcAAAwdAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDWwAAwdAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1225, 1043}, {118, 93}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1117, 350}, {467, 128}} com.apple.InterfaceBuilder.CocoaPlugin {{1117, 350}, {467, 128}} com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 8198 YES AppDelegate NSObject YES YES bugReport: launchForums: launchWebsite: supportRequest: YES id id id id YES YES bugReport: launchForums: launchWebsite: supportRequest: YES bugReport: id launchForums: id launchWebsite: id supportRequest: id YES YES aboutWindowController boxARMBinaries boxFileSystem boxGeneralInfo boxMisc boxTitles cdsCoreController cdsSoundController cheatListWindow cheatWindowController emuControlController inputManager inputPrefsView mLoadStateSlot mSaveStateSlot migrationDelegate prefGeneralView prefWindow prefWindowController romInfoPanelController troubleshootingWindow YES NSObjectController NSBox NSBox NSBox NSBox NSBox NSObjectController NSObjectController NSWindow NSObjectController NSObjectController InputManager InputPrefsView NSMenu NSMenu FileMigrationDelegate NSView NSWindow NSObjectController NSObjectController NSWindow YES YES aboutWindowController boxARMBinaries boxFileSystem boxGeneralInfo boxMisc boxTitles cdsCoreController cdsSoundController cheatListWindow cheatWindowController emuControlController inputManager inputPrefsView mLoadStateSlot mSaveStateSlot migrationDelegate prefGeneralView prefWindow prefWindowController romInfoPanelController troubleshootingWindow YES aboutWindowController NSObjectController boxARMBinaries NSBox boxFileSystem NSBox boxGeneralInfo NSBox boxMisc NSBox boxTitles NSBox cdsCoreController NSObjectController cdsSoundController NSObjectController cheatListWindow NSWindow cheatWindowController NSObjectController emuControlController NSObjectController inputManager InputManager inputPrefsView InputPrefsView mLoadStateSlot NSMenu mSaveStateSlot NSMenu migrationDelegate FileMigrationDelegate prefGeneralView NSView prefWindow NSWindow prefWindowController NSObjectController romInfoPanelController NSObjectController troubleshootingWindow NSWindow IBProjectSource userinterface/appDelegate.h CheatWindowDelegate NSObject YES YES addToList: applyConfiguration: closeCheatDatabaseSheet: removeFromList: resetSearch: runComparativeSearch: runExactValueSearch: selectAllCheatsInDatabase: selectCheatSearchStyle: selectCheatType: selectNoneCheatsInDatabase: setInternalCheatValue: viewDatabase: YES id id id id id id id id id id id id id YES YES addToList: applyConfiguration: closeCheatDatabaseSheet: removeFromList: resetSearch: runComparativeSearch: runExactValueSearch: selectAllCheatsInDatabase: selectCheatSearchStyle: selectCheatType: selectNoneCheatsInDatabase: setInternalCheatValue: viewDatabase: YES addToList: id applyConfiguration: id closeCheatDatabaseSheet: id removeFromList: id resetSearch: id runComparativeSearch: id runExactValueSearch: id selectAllCheatsInDatabase: id selectCheatSearchStyle: id selectCheatType: id selectNoneCheatsInDatabase: id setInternalCheatValue: id viewDatabase: id YES YES cheatConfigBox cheatDatabaseController cheatDatabaseSheet cheatListController cheatListTable cheatSearchListController cheatSearchListTable cheatSearchView cheatSelectedItemController cheatWindowController searchField viewConfigureActionReplayCheat viewConfigureCodeBreakerCheat viewConfigureInternalCheat viewConfigureNoSelection viewSearchComparativeContinue viewSearchComparativeStart viewSearchExactValue viewSearchNoSelection window YES NSBox NSArrayController NSWindow NSArrayController NSTableView NSArrayController NSTableView NSView NSObjectController NSObjectController NSSearchField NSView NSView NSView NSView NSView NSView NSView NSView NSWindow YES YES cheatConfigBox cheatDatabaseController cheatDatabaseSheet cheatListController cheatListTable cheatSearchListController cheatSearchListTable cheatSearchView cheatSelectedItemController cheatWindowController searchField viewConfigureActionReplayCheat viewConfigureCodeBreakerCheat viewConfigureInternalCheat viewConfigureNoSelection viewSearchComparativeContinue viewSearchComparativeStart viewSearchExactValue viewSearchNoSelection window YES cheatConfigBox NSBox cheatDatabaseController NSArrayController cheatDatabaseSheet NSWindow cheatListController NSArrayController cheatListTable NSTableView cheatSearchListController NSArrayController cheatSearchListTable NSTableView cheatSearchView NSView cheatSelectedItemController NSObjectController cheatWindowController NSObjectController searchField NSSearchField viewConfigureActionReplayCheat NSView viewConfigureCodeBreakerCheat NSView viewConfigureInternalCheat NSView viewConfigureNoSelection NSView viewSearchComparativeContinue NSView viewSearchComparativeStart NSView viewSearchExactValue NSView viewSearchNoSelection NSView window NSWindow IBProjectSource userinterface/cheatWindowDelegate.h DisplayView NSView IBProjectSource userinterface/DisplayWindowController.h DisplayWindowController NSWindowController YES YES changeCoreSpeed: changeRotationRelative: changeVolume: copy: openRom: reset: saveScreenshotAs: toggleExecutePause: toggleKeepMinDisplaySizeAtNormal: toggleStatusBar: YES id id id id id id id id id id YES YES changeCoreSpeed: changeRotationRelative: changeVolume: copy: openRom: reset: saveScreenshotAs: toggleExecutePause: toggleKeepMinDisplaySizeAtNormal: toggleStatusBar: YES changeCoreSpeed: id changeRotationRelative: id changeVolume: id copy: id openRom: id reset: id saveScreenshotAs: id toggleExecutePause: id toggleKeepMinDisplaySizeAtNormal: id toggleStatusBar: id YES YES saveScreenshotPanelAccessoryView view YES NSView DisplayView YES YES saveScreenshotPanelAccessoryView view YES saveScreenshotPanelAccessoryView NSView view DisplayView EmuControllerDelegate NSObject YES YES changeAudioEngine: changeCoreEmuFlags: changeCoreSpeed: changeDisplayGap: changeDisplayMode: changeDisplayOrder: changeDisplayOrientation: changeFirmwareSettings: changeRomSaveType: changeRotation: changeRotationRelative: changeScale: changeSpuAdvancedLogic: changeSpuInterpolationMode: changeSpuSyncMethod: changeSpuSyncMode: changeVolume: chooseSlot1R4Directory: closeRom: closeSheet: closeWindow: exportRomSave: importRomSave: loadEmuSaveStateSlot: loadRecentRom: newDisplayWindow: openEmuSaveState: openRom: reset: revealGameDataFolderInFinder: revealRomInFinder: revertEmuSaveState: runToolbarCustomizationPalette: saveEmuSaveState: saveEmuSaveStateAs: saveEmuSaveStateSlot: saveScreenshotAs: slot1Eject: toggleAutoFrameSkip: toggleCheats: toggleExecutePause: toggleGPUState: toggleKeepMinDisplaySizeAtNormal: toggleSpeedLimiter: toggleStatusBar: toggleToolbarShown: writeDefaults3DRenderingSettings: writeDefaultsDisplayGap: writeDefaultsDisplayRotation: writeDefaultsDisplayVideoSettings: writeDefaultsEmulationSettings: writeDefaultsHUDSettings: writeDefaultsSlot1Settings: writeDefaultsSoundSettings: YES id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id YES YES changeAudioEngine: changeCoreEmuFlags: changeCoreSpeed: changeDisplayGap: changeDisplayMode: changeDisplayOrder: changeDisplayOrientation: changeFirmwareSettings: changeRomSaveType: changeRotation: changeRotationRelative: changeScale: changeSpuAdvancedLogic: changeSpuInterpolationMode: changeSpuSyncMethod: changeSpuSyncMode: changeVolume: chooseSlot1R4Directory: closeRom: closeSheet: closeWindow: exportRomSave: importRomSave: loadEmuSaveStateSlot: loadRecentRom: newDisplayWindow: openEmuSaveState: openRom: reset: revealGameDataFolderInFinder: revealRomInFinder: revertEmuSaveState: runToolbarCustomizationPalette: saveEmuSaveState: saveEmuSaveStateAs: saveEmuSaveStateSlot: saveScreenshotAs: slot1Eject: toggleAutoFrameSkip: toggleCheats: toggleExecutePause: toggleGPUState: toggleKeepMinDisplaySizeAtNormal: toggleSpeedLimiter: toggleStatusBar: toggleToolbarShown: writeDefaults3DRenderingSettings: writeDefaultsDisplayGap: writeDefaultsDisplayRotation: writeDefaultsDisplayVideoSettings: writeDefaultsEmulationSettings: writeDefaultsHUDSettings: writeDefaultsSlot1Settings: writeDefaultsSoundSettings: YES changeAudioEngine: id changeCoreEmuFlags: id changeCoreSpeed: id changeDisplayGap: id changeDisplayMode: id changeDisplayOrder: id changeDisplayOrientation: id changeFirmwareSettings: id changeRomSaveType: id changeRotation: id changeRotationRelative: id changeScale: id changeSpuAdvancedLogic: id changeSpuInterpolationMode: id changeSpuSyncMethod: id changeSpuSyncMode: id changeVolume: id chooseSlot1R4Directory: id closeRom: id closeSheet: id closeWindow: id exportRomSave: id importRomSave: id loadEmuSaveStateSlot: id loadRecentRom: id newDisplayWindow: id openEmuSaveState: id openRom: id reset: id revealGameDataFolderInFinder: id revealRomInFinder: id revertEmuSaveState: id runToolbarCustomizationPalette: id saveEmuSaveState: id saveEmuSaveStateAs: id saveEmuSaveStateSlot: id saveScreenshotAs: id slot1Eject: id toggleAutoFrameSkip: id toggleCheats: id toggleExecutePause: id toggleGPUState: id toggleKeepMinDisplaySizeAtNormal: id toggleSpeedLimiter: id toggleStatusBar: id toggleToolbarShown: id writeDefaults3DRenderingSettings: id writeDefaultsDisplayGap: id writeDefaultsDisplayRotation: id writeDefaultsDisplayVideoSettings: id writeDefaultsEmulationSettings: id writeDefaultsHUDSettings: id writeDefaultsSlot1Settings: id writeDefaultsSoundSettings: id YES YES cdsCoreController cdsSoundController cheatDatabaseController cheatListController cheatWindowController cheatWindowDelegate exportRomSavePanelAccessoryView firmwarePanelController inputManager romInfoPanelController saveFileMigrationSheet saveStatePrecloseSheet slot1ManagerWindow YES NSObjectController NSObjectController NSArrayController NSArrayController NSObjectController CheatWindowDelegate NSView NSObjectController InputManager NSObjectController NSWindow NSWindow NSWindow YES YES cdsCoreController cdsSoundController cheatDatabaseController cheatListController cheatWindowController cheatWindowDelegate exportRomSavePanelAccessoryView firmwarePanelController inputManager romInfoPanelController saveFileMigrationSheet saveStatePrecloseSheet slot1ManagerWindow YES cdsCoreController NSObjectController cdsSoundController NSObjectController cheatDatabaseController NSArrayController cheatListController NSArrayController cheatWindowController NSObjectController cheatWindowDelegate CheatWindowDelegate exportRomSavePanelAccessoryView NSView firmwarePanelController NSObjectController inputManager InputManager romInfoPanelController NSObjectController saveFileMigrationSheet NSWindow saveStatePrecloseSheet NSWindow slot1ManagerWindow NSWindow IBProjectSource userinterface/EmuControllerDelegate.h FileMigrationDelegate NSObject YES YES handleChoice: selectAll: selectNone: updateAndShowWindow: YES id id id id YES YES handleChoice: selectAll: selectNone: updateAndShowWindow: YES handleChoice: id selectAll: id selectNone: id updateAndShowWindow: id YES YES fileListController window YES NSArrayController NSWindow YES YES fileListController window YES fileListController NSArrayController window NSWindow IBProjectSource userinterface/FileMigrationDelegate.h InputManager NSObject YES YES emuControl hidInputTarget YES EmuControllerDelegate id YES YES emuControl hidInputTarget YES emuControl EmuControllerDelegate hidInputTarget id IBProjectSource userinterface/InputManager.h InputPrefsView NSView YES YES audioFileChoose: audioFileChooseNone: changeSpeed: closeProfileRenameSheet: closeProfileSheet: closeSettingsSheet: profileApply: profileDelete: profileNew: profileRename: profileSave: profileSelect: profileView: removeInput: setInputAdd: showSettingsSheet: YES id id id id id id id id id id id id id id id id YES YES audioFileChoose: audioFileChooseNone: changeSpeed: closeProfileRenameSheet: closeProfileSheet: closeSettingsSheet: profileApply: profileDelete: profileNew: profileRename: profileSave: profileSelect: profileView: removeInput: setInputAdd: showSettingsSheet: YES audioFileChoose: id audioFileChooseNone: id changeSpeed: id closeProfileRenameSheet: id closeProfileSheet: id closeSettingsSheet: id profileApply: id profileDelete: id profileNew: id profileRename: id profileSave: id profileSelect: id profileView: id removeInput: id setInputAdd: id showSettingsSheet: id YES YES inputManager inputPrefOutlineView inputProfileController inputProfileMenu inputProfileNextButton inputProfilePreviousButton inputProfileRenameSheet inputProfileSheet inputSettingsController inputSettingsGPUState inputSettingsLoadStateSlot inputSettingsMicrophone inputSettingsSaveStateSlot inputSettingsSetSpeedLimit inputSettingsTouch prefWindow YES InputManager NSOutlineView InputProfileController NSPopUpButton NSButton NSButton NSWindow NSWindow NSObjectController NSWindow NSWindow NSWindow NSWindow NSWindow NSWindow NSWindow YES YES inputManager inputPrefOutlineView inputProfileController inputProfileMenu inputProfileNextButton inputProfilePreviousButton inputProfileRenameSheet inputProfileSheet inputSettingsController inputSettingsGPUState inputSettingsLoadStateSlot inputSettingsMicrophone inputSettingsSaveStateSlot inputSettingsSetSpeedLimit inputSettingsTouch prefWindow YES inputManager InputManager inputPrefOutlineView NSOutlineView inputProfileController InputProfileController inputProfileMenu NSPopUpButton inputProfileNextButton NSButton inputProfilePreviousButton NSButton inputProfileRenameSheet NSWindow inputProfileSheet NSWindow inputSettingsController NSObjectController inputSettingsGPUState NSWindow inputSettingsLoadStateSlot NSWindow inputSettingsMicrophone NSWindow inputSettingsSaveStateSlot NSWindow inputSettingsSetSpeedLimit NSWindow inputSettingsTouch NSWindow prefWindow NSWindow IBProjectSource userinterface/inputPrefsView.h InputProfileController NSObjectController YES YES inputManager profileOutlineView YES InputManager NSOutlineView YES YES inputManager profileOutlineView YES inputManager InputManager profileOutlineView NSOutlineView IBProjectSource userinterface/InputProfileController.h PreferencesWindowDelegate NSObject YES YES chooseARM7BiosImage: chooseARM9BiosImage: chooseAdvansceneDatabase: chooseCheatDatabase: chooseFirmwareImage: chooseRomForAutoload: closeFirmwareConfigSheet: configureInternalFirmware: selectAutoloadRomOption: selectDisplayMode: selectDisplayRotation: selectDisplaySize: selectSPUSyncMethod: selectSPUSyncMode: selectVideoFilterType: setUseBilinear: showDisplayView: showEmulationView: showGeneralView: showInputView: showSoundView: updateVolumeIcon: YES id id id id id id id id id id id id id id id id id id id id id id YES YES chooseARM7BiosImage: chooseARM9BiosImage: chooseAdvansceneDatabase: chooseCheatDatabase: chooseFirmwareImage: chooseRomForAutoload: closeFirmwareConfigSheet: configureInternalFirmware: selectAutoloadRomOption: selectDisplayMode: selectDisplayRotation: selectDisplaySize: selectSPUSyncMethod: selectSPUSyncMode: selectVideoFilterType: setUseBilinear: showDisplayView: showEmulationView: showGeneralView: showInputView: showSoundView: updateVolumeIcon: YES chooseARM7BiosImage: id chooseARM9BiosImage: id chooseAdvansceneDatabase: id chooseCheatDatabase: id chooseFirmwareImage: id chooseRomForAutoload: id closeFirmwareConfigSheet: id configureInternalFirmware: id selectAutoloadRomOption: id selectDisplayMode: id selectDisplayRotation: id selectDisplaySize: id selectSPUSyncMethod: id selectSPUSyncMode: id selectVideoFilterType: id setUseBilinear: id showDisplayView: id showEmulationView: id showGeneralView: id showInputView: id showSoundView: id updateVolumeIcon: id YES YES cdsCoreController cheatDatabaseController cheatWindowController displayRotationField displayRotationMenu displayRotationMenuCustomItem emuController firmwareConfigSheet prefWindowController previewImageView spuSyncMethodMenu viewDisplay viewEmulation viewGeneral viewInput viewSound window YES NSObjectController NSArrayController NSObjectController NSTextField NSPopUpButton NSMenuItem NSObjectController NSWindow NSObjectController NSImageView NSPopUpButton NSView NSView NSView InputPrefsView NSView NSWindow YES YES cdsCoreController cheatDatabaseController cheatWindowController displayRotationField displayRotationMenu displayRotationMenuCustomItem emuController firmwareConfigSheet prefWindowController previewImageView spuSyncMethodMenu viewDisplay viewEmulation viewGeneral viewInput viewSound window YES cdsCoreController NSObjectController cheatDatabaseController NSArrayController cheatWindowController NSObjectController displayRotationField NSTextField displayRotationMenu NSPopUpButton displayRotationMenuCustomItem NSMenuItem emuController NSObjectController firmwareConfigSheet NSWindow prefWindowController NSObjectController previewImageView NSImageView spuSyncMethodMenu NSPopUpButton viewDisplay NSView viewEmulation NSView viewGeneral NSView viewInput InputPrefsView viewSound NSView window NSWindow IBProjectSource userinterface/preferencesWindowDelegate.h TroubleshootingWindowDelegate NSObject YES YES backForm: continueToFinalForm: copyInfoToPasteboard: copyRomInfoToTextFields: goToWebpage: YES id id id id id YES YES backForm: continueToFinalForm: copyInfoToPasteboard: copyRomInfoToTextFields: goToWebpage: YES backForm: id continueToFinalForm: id copyInfoToPasteboard: id copyRomInfoToTextFields: id goToWebpage: id YES YES romInfoController troubleshootingWindowController viewBugReport viewFinishedForm viewSupportRequest window YES NSObjectController NSObjectController NSView NSView NSView NSWindow YES YES romInfoController troubleshootingWindowController viewBugReport viewFinishedForm viewSupportRequest window YES romInfoController NSObjectController troubleshootingWindowController NSObjectController viewBugReport NSView viewFinishedForm NSView viewSupportRequest NSView window NSWindow IBProjectSource userinterface/troubleshootingWindowDelegate.h YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSArrayController NSObjectController IBFrameworkSource AppKit.framework/Headers/NSArrayController.h NSBox NSView IBFrameworkSource AppKit.framework/Headers/NSBox.h NSBrowser NSControl IBFrameworkSource AppKit.framework/Headers/NSBrowser.h NSButton NSControl IBFrameworkSource AppKit.framework/Headers/NSButton.h NSButtonCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSButtonCell.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSController NSObject IBFrameworkSource AppKit.framework/Headers/NSController.h NSDatePicker NSControl IBFrameworkSource AppKit.framework/Headers/NSDatePicker.h NSDatePickerCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSDatePickerCell.h NSDocumentController NSObject YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES id id id id YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES clearRecentDocuments: id newDocument: id openDocument: id saveAllDocuments: id IBFrameworkSource AppKit.framework/Headers/NSDocumentController.h NSDrawer NSResponder IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSImageCell NSCell IBFrameworkSource AppKit.framework/Headers/NSImageCell.h NSImageView NSControl IBFrameworkSource AppKit.framework/Headers/NSImageView.h NSMatrix NSControl IBFrameworkSource AppKit.framework/Headers/NSMatrix.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMenuItemCell NSButtonCell IBFrameworkSource AppKit.framework/Headers/NSMenuItemCell.h NSMovieView NSView IBFrameworkSource AppKit.framework/Headers/NSMovieView.h NSNumberFormatter NSFormatter IBFrameworkSource Foundation.framework/Headers/NSNumberFormatter.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSObjectController NSController IBFrameworkSource AppKit.framework/Headers/NSObjectController.h NSOutlineView NSTableView NSPanel NSWindow IBFrameworkSource AppKit.framework/Headers/NSPanel.h NSPopUpButton NSButton IBFrameworkSource AppKit.framework/Headers/NSPopUpButton.h NSPopUpButtonCell NSMenuItemCell IBFrameworkSource AppKit.framework/Headers/NSPopUpButtonCell.h NSProgressIndicator NSView IBFrameworkSource AppKit.framework/Headers/NSProgressIndicator.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSScrollView NSView IBFrameworkSource AppKit.framework/Headers/NSScrollView.h NSScroller NSControl IBFrameworkSource AppKit.framework/Headers/NSScroller.h NSSearchField NSTextField IBFrameworkSource AppKit.framework/Headers/NSSearchField.h NSSearchFieldCell NSTextFieldCell IBFrameworkSource AppKit.framework/Headers/NSSearchFieldCell.h NSSlider NSControl IBFrameworkSource AppKit.framework/Headers/NSSlider.h NSSliderCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSSliderCell.h NSStepper NSControl IBFrameworkSource AppKit.framework/Headers/NSStepper.h NSStepperCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSStepperCell.h NSTabView NSView IBFrameworkSource AppKit.framework/Headers/NSTabView.h NSTabViewItem NSObject IBFrameworkSource AppKit.framework/Headers/NSTabViewItem.h NSTableColumn NSObject IBFrameworkSource AppKit.framework/Headers/NSTableColumn.h NSTableHeaderView NSView IBFrameworkSource AppKit.framework/Headers/NSTableHeaderView.h NSTableView NSControl NSText NSView IBFrameworkSource AppKit.framework/Headers/NSText.h NSTextField NSControl IBFrameworkSource AppKit.framework/Headers/NSTextField.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSTextView NSText IBFrameworkSource AppKit.framework/Headers/NSTextView.h NSToolbar NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbar.h NSToolbarItem NSObject NSUserDefaultsController NSController IBFrameworkSource AppKit.framework/Headers/NSUserDefaultsController.h NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h NSWindowController NSResponder showWindow: id showWindow: showWindow: id IBFrameworkSource AppKit.framework/Headers/NSWindowController.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../DeSmuME (XCode 3).xcodeproj 3 YES YES ColorSwatch_Blue_16x16 ColorSwatch_Brown_16x16 ColorSwatch_DarkBlue_16x16 ColorSwatch_DarkGreen_16x16 ColorSwatch_DarkPurple_16x16 ColorSwatch_Gray_16x16 ColorSwatch_Green_16x16 ColorSwatch_LimeGreen_16x16 ColorSwatch_Magenta_16x16 ColorSwatch_Orange_16x16 ColorSwatch_Pink_16x16 ColorSwatch_Red_16x16 ColorSwatch_SeaGreen_16x16 ColorSwatch_Turquoise_16x16 ColorSwatch_Violet_16x16 ColorSwatch_Yellow_16x16 Icon_ActionReplay_32x32 Icon_CodeBreaker_128x128 Icon_DeSmuME_32x32 Icon_Emulation_420x420 Icon_Input_420x420 Icon_ShowHUD_420x420 Icon_Speaker_420x420 Icon_VolumeFull_16x16 NSActionTemplate NSAddTemplate NSApplicationIcon NSMenuCheckmark NSMenuMixedState NSPreferencesGeneral NSRadioButton NSRemoveTemplate NSSwitch YES {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {16, 16} {32, 32} {128, 128} {32, 32} {420, 420} {420, 420} {420, 420} {420, 420} {20, 20} {15, 15} {8, 8} {512, 512} {9, 8} {7, 2} {32, 32} {16, 15} {8, 8} {15, 15} desmume-0.9.9/src/cocoa/translations/English.lproj/InfoPlist.strings0000644000175000017500000000037412140261574026364 0ustar guillaumeguillaume/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright 2013 DeSmuME Team. All rights reserved.";desmume-0.9.9/src/cocoa/translations/English.lproj/DisplayWindow.xib0000644000175000017500000024645512140261574026357 0ustar guillaumeguillaume 1060 10K549 851 1038.36 461.00 com.apple.InterfaceBuilder.CocoaPlugin 851 YES YES com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES DisplayWindowController FirstResponder NSApplication 271 2 {{830, 370}, {256, 408}} 74973184 DeSmuME NSWindow D5552DCE-722B-4ECB-8E0A-8B7CF76EAC70 YES YES YES YES 1 2 YES YES 0135754F-463F-4625-9D27-DEF701AEF50E 2E728430-6055-404B-944F-25594ACBEC39 321036F9-6034-47B1-9CC5-2461D98700F0 41A299FB-4A95-4FA3-9982-8523FF04ACDE C626F2C1-4353-4288-AD59-40FB7F4C1A58 EDBFD998-E031-4AC5-A86A-7114D66FF847 NSToolbarFlexibleSpaceItem NSToolbarSpaceItem YES 0135754F-463F-4625-9D27-DEF701AEF50E Open ROM Open ROM NSImage Icon_OpenROM_420x420 {0, 0} {0, 0} YES YES -1 YES 0 2E728430-6055-404B-944F-25594ACBEC39 Execute Execute/Pause NSImage Icon_Execute_420x420 {0, 0} {0, 0} YES YES -1 YES 0 321036F9-6034-47B1-9CC5-2461D98700F0 Reset Reset NSImage Icon_Reset_420x420 {0, 0} {0, 0} YES YES -1 YES 0 41A299FB-4A95-4FA3-9982-8523FF04ACDE Rotate Right Rotate Right NSImage Icon_RotateCW_420x420 {0, 0} {0, 0} YES YES 90 YES 0 C626F2C1-4353-4288-AD59-40FB7F4C1A58 Rotate Left Rotate Left NSImage Icon_RotateCCW_420x420 {0, 0} {0, 0} YES YES -90 YES 0 EDBFD998-E031-4AC5-A86A-7114D66FF847 Speed 2x Speed 1x/2x NSImage Icon_Speed2x_420x420 {0, 0} {0, 0} YES YES 200 YES 0 NSToolbarFlexibleSpaceItem Flexible Space {1, 5} {20000, 32} YES YES -1 YES 0 YES YES 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState NSToolbarSpaceItem Space {32, 5} {32, 32} YES YES -1 YES 0 YES YES 1048576 2147483647 YES YES {1.79769e+308, 1.79769e+308} {256, 408} 256 YES 5156 {{2, 3}, {16, 16}} 28938 100 289 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{160, 1}, {20, 20}} YES 130560 33554432 NSImage Icon_VolumeFull_16x16 0 2 0 YES YES 294 {{17, 5}, {137, 14}} YES 68288064 272634880 LucidaGrande 11 16 Status Text 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA 45 {{0, 24}, {256, 384}} YES DisplayView 289 {{180, 3}, {56, 15}} YES -2079981824 131072 100 0.0 100 0.0 0 1 NO NO {256, 408} {{0, 0}, {1920, 1178}} {256, 476} {1.79769e+308, 1.79769e+308} 268 YES 268 {{176, 5}, {126, 26}} YES -2076049856 2048 LucidaGrande 13 1044 109199615 1 400 75 TIFF 2147483647 1 _popUpItemAction: YES OtherViews YES BMP 2147483647 _popUpItemAction: 1 GIF 2147483647 _popUpItemAction: 2 JPEG 2147483647 _popUpItemAction: 3 PNG 2147483647 _popUpItemAction: 4 JPEG 2000 2147483647 _popUpItemAction: 5 1 YES YES 2 268 {{38, 11}, {136, 17}} YES 68288064 71304192 Select Image Format: {350, 35} NSView YES window 22 hidden: isShowingStatusBar hidden: isShowingStatusBar hidden isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 52 enabled: isShowingStatusBar enabled: isShowingStatusBar enabled isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 53 hidden: isShowingStatusBar hidden: isShowingStatusBar hidden isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 54 changeCoreSpeed: 56 changeRotationRelative: 57 changeRotationRelative: 58 openRom: 60 delegate 62 view 64 value: emuControl.currentVolumeIcon value: emuControl.currentVolumeIcon value emuControl.currentVolumeIcon 2 65 value: emuControl.statusText value: emuControl.statusText value emuControl.statusText YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 67 animate: emuControl.isWorking animate: emuControl.isWorking animate emuControl.isWorking 2 68 value: emuControl.currentVolumeValue value: emuControl.currentVolumeValue value emuControl.currentVolumeValue 2 88 changeVolume: 89 hidden: isShowingStatusBar hidden: isShowingStatusBar hidden isShowingStatusBar NSValueTransformerName NSNegateBoolean 2 92 saveScreenshotPanelAccessoryView 105 selectedTag: screenshotFileFormat selectedTag: screenshotFileFormat selectedTag screenshotFileFormat 2 106 reset: 107 toggleExecutePause: 108 YES 0 -2 File's Owner -1 First Responder -3 Application 3 YES 4 YES 5 YES 6 YES 8 YES 10 12 13 14 15 16 17 18 19 20 21 63 84 YES 85 93 YES Screenshot Save Panel Accessory 94 YES 95 YES 96 97 YES 98 YES 99 100 101 102 103 104 YES YES -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency 10.IBPluginDependency 10.IBViewBoundsToFrameTransform 100.IBPluginDependency 101.IBPluginDependency 102.IBPluginDependency 103.IBPluginDependency 104.IBPluginDependency 13.IBPluginDependency 14.IBPluginDependency 15.IBPluginDependency 16.IBPluginDependency 17.IBPluginDependency 18.IBPluginDependency 19.IBPluginDependency 20.IBPluginDependency 21.IBPluginDependency 3.IBEditorWindowLastContentRect 3.IBPluginDependency 3.IBWindowTemplateEditedContentRect 3.NSWindowTemplate.visibleAtLaunch 3.editorWindowContentRectSynchronizationRect 3.windowTemplate.hasMinSize 3.windowTemplate.maxSize 3.windowTemplate.minSize 4.IBEditorWindowLastContentRect 4.IBPluginDependency 5.IBPluginDependency 6.IBPluginDependency 6.IBViewBoundsToFrameTransform 63.IBPluginDependency 63.IBViewBoundsToFrameTransform 8.IBViewBoundsToFrameTransform 84.IBPluginDependency 84.IBViewBoundsToFrameTransform 85.IBPluginDependency 93.IBEditorWindowLastContentRect 93.IBPluginDependency 93.IBViewBoundsToFrameTransform 94.IBPluginDependency 94.IBViewBoundsToFrameTransform 95.IBPluginDependency 95.IBViewBoundsToFrameTransform 96.IBPluginDependency 97.IBPluginDependency 98.IBEditorWindowLastContentRect 98.IBPluginDependency 99.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABAQAAAwjAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1316, 313}, {256, 408}} com.apple.InterfaceBuilder.CocoaPlugin {{1316, 313}, {256, 408}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} {256, 408} {{1136, 494}, {616, 227}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwYgAAA com.apple.InterfaceBuilder.CocoaPlugin AQAAAABDnAAAA AULcAAA/gAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCwAAAwZAAAA com.apple.InterfaceBuilder.CocoaPlugin {{1220, 906}, {350, 35}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMAAAwegAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCGAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1185, 897}, {126, 123}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 108 YES DisplayView NSView IBProjectSource userinterface/DisplayWindowController.h DisplayWindowController NSWindowController YES YES changeCoreSpeed: changeRotationRelative: changeVolume: copy: openRom: reset: saveScreenshotAs: toggleExecutePause: toggleKeepMinDisplaySizeAtNormal: toggleStatusBar: YES id id id id id id id id id id YES YES changeCoreSpeed: changeRotationRelative: changeVolume: copy: openRom: reset: saveScreenshotAs: toggleExecutePause: toggleKeepMinDisplaySizeAtNormal: toggleStatusBar: YES changeCoreSpeed: id changeRotationRelative: id changeVolume: id copy: id openRom: id reset: id saveScreenshotAs: id toggleExecutePause: id toggleKeepMinDisplaySizeAtNormal: id toggleStatusBar: id YES YES saveScreenshotPanelAccessoryView view YES NSView DisplayView YES YES saveScreenshotPanelAccessoryView view YES saveScreenshotPanelAccessoryView NSView view DisplayView YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSButton NSControl IBFrameworkSource AppKit.framework/Headers/NSButton.h NSButtonCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSButtonCell.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSImageCell NSCell IBFrameworkSource AppKit.framework/Headers/NSImageCell.h NSImageView NSControl IBFrameworkSource AppKit.framework/Headers/NSImageView.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMenuItemCell NSButtonCell IBFrameworkSource AppKit.framework/Headers/NSMenuItemCell.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSPopUpButton NSButton IBFrameworkSource AppKit.framework/Headers/NSPopUpButton.h NSPopUpButtonCell NSMenuItemCell IBFrameworkSource AppKit.framework/Headers/NSPopUpButtonCell.h NSProgressIndicator NSView IBFrameworkSource AppKit.framework/Headers/NSProgressIndicator.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSSlider NSControl IBFrameworkSource AppKit.framework/Headers/NSSlider.h NSSliderCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSSliderCell.h NSTextField NSControl IBFrameworkSource AppKit.framework/Headers/NSTextField.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSToolbar NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbar.h NSToolbarItem NSObject NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h NSWindowController NSResponder showWindow: id showWindow: showWindow: id IBFrameworkSource AppKit.framework/Headers/NSWindowController.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../DeSmuME (XCode 3).xcodeproj 3 YES YES Icon_Execute_420x420 Icon_OpenROM_420x420 Icon_Reset_420x420 Icon_RotateCCW_420x420 Icon_RotateCW_420x420 Icon_Speed2x_420x420 Icon_VolumeFull_16x16 NSMenuCheckmark NSMenuMixedState YES {420, 420} {420, 420} {420, 420} {420, 420} {420, 420} {420, 420} {20, 20} {9, 8} {7, 2} desmume-0.9.9/src/cocoa/translations/English.lproj/Localizable.strings0000644000175000017500000002264412140261574026702 0ustar guillaumeguillaume/* DeSmuME Strings File */ /* ENGLISH */ /* Dialog Box Titles */ "Open ROM" = "Open ROM"; "Open State File" = "Open State File"; "Save State File" = "Save State File"; "Import ROM Save File" = "Import ROM Save File"; "Export ROM Save File" = "Export ROM Save File"; "Select ROM" = "Select ROM"; "Select ADVANsCEne Database" = "Select ADVANsCEne Database"; "Select R4 Cheat Database" = "Select R4 Cheat Database"; "Select ARM7 BIOS Image" = "Select ARM7 BIOS Image"; "Select ARM9 BIOS Image" = "Select ARM9 BIOS Image"; "Select Firmware Image" = "Select Firmware Image"; "Save Screenshot" = "Save Screenshot"; /* Menus */ "Execute" = "Execute"; "Pause" = "Pause"; "Disable Speed Limit" = "Disable Speed Limit"; "Enable Speed Limit" = "Enable Speed Limit"; "Disable Auto Frame Skip" = "Disable Auto Frame Skip"; "Enable Auto Frame Skip" = "Enable Auto Frame Skip"; "Disable Cheats" = "Disable Cheats"; "Enable Cheats" = "Enable Cheats"; "Disable HUD" = "Disable HUD"; "Enable HUD" = "Enable HUD"; "Hide Status Bar" = "Hide Status Bar"; "Show Status Bar" = "Show Status Bar"; "Speed 1x" = "Speed 1x"; "Speed 2x" = "Speed 2x"; "Slot %d" = "Slot %d"; /* Alert Text */ "A critical file is missing. DeSmuME will now quit." = "A critical file is missing. DeSmuME will now quit."; "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME." = "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME."; /* Status Text */ "Ready." = "Ready."; "Save state file loading failed!" = "Save state file loading failed!"; "Save state file loaded." = "Save state file loaded."; "Save state file saving failed!" = "Save state file saving failed!"; "Save state file saved." = "Save state file saved."; "Save state file reverting failed!" = "Save state file reverting failed!"; "Save state file reverted." = "Save state file reverted."; "ROM save file import failed!" = "ROM save file import failed!"; "ROM save file imported." = "ROM save file imported."; "ROM save file export failed!" = "ROM save file export failed!"; "ROM save file exported." = "ROM save file exported."; "Loading ROM..." = "Loading ROM..."; "ROM loaded." = "ROM loaded."; "ROM loading failed!" = "ROM loading failed!"; "Unloading ROM..." = "Unloading ROM..."; "ROM unloaded." = "ROM unloaded."; "Emulator resetting..." = "Emulator resetting..."; "Emulator reset." = "Emulator reset."; "Cannot generate the save file path!" = "Cannot generate the save file path!"; "Cannot create the save directory!" = "Cannot create the save directory!"; "Speed limit disabled." = "Speed limit disabled."; "Speed limit enabled." = "Speed limit enabled."; "Auto frame skip disabled." = "Auto frame skip disabled."; "Auto frame skip enabled." = "Auto frame skip enabled."; "Cheats disabled." = "Cheats disabled."; "Cheats enabled." = "Cheats enabled."; "HUD disabled." = "HUD disabled."; "HUD enabled." = "HUD enabled."; "Volume: %1.1f%%" = "Volume: %1.1f%%"; /* ROM Info Panel */ "No ROM loaded." = "No ROM loaded."; "%i bytes" = "%i bytes"; /* Display Mode Strings */ "Main" = "Main"; "Touch" = "Touch"; "Combo" = "Combo"; /* LEGACY STRINGS */ /* General */ "DeSmuME Emulator" = "DeSmuME Emulator"; "OK" = "OK"; "Cancel" = "Cancel"; /* File Menu */ //"Slot %d" = "Slot %d"; /* Emulation Menu */ //"Execute" = "Execute"; //"Pause" = "Pause"; /* View Menu */ //"Show Status Bar" = "Show Status Bar"; "Hide Status Bar" = "Hide Status Bar"; /* Dialogs */ "Are you sure you want to quit?" = "Are you sure you want to quit?"; "Are you sure you want to close the ROM?" = "Are you sure you want to close the ROM?"; /* Status Bar Messages */ "No ROM Loaded" = "No ROM loaded"; "Executing" = "Executing"; "Paused" = "Paused"; /* Preferences Window */ "DeSmuME Preferences" = "DeSmuME Preferences"; "Interface" = "Interface"; "Controls" = "Controls"; "DS Firmware" = "DS Firmware"; "Yes" = "Yes"; "No" = "No"; /* Interface Preferences */ "Execute Upon Load" = "Execute Upon Load"; "When Launching, Load" = "When Launching, Load"; "Load Nothing" = "Nothing"; "Load Last ROM" = "Last ROM"; /* Control Preferences */ "A Button" = "A Button"; "B Button" = "B Button"; "X Button" = "X Button"; "Y Button" = "Y Button"; "L Button" = "L Button"; "R Button" = "R Button"; "Up Button" = "Up"; "Down Button" = "Down"; "Left Button" = "Left"; "Right Button" = "Right"; "Start Button" = "Start"; "Select Button" = "Select"; "Up Key" = "[UP]"; "Down Key" = "[DOWN]"; "Left Key" = "[LEFT]"; "Right Key" = "[RIGHT]"; "Space Bar" = "[SPACE]"; "Enter Key" = "[ENTER]"; /* Status Bar */ "No ROM loaded" = "No ROM loaded"; "ROM Loaded" = "ROM Loaded"; "Emulation Executing" = "Executing"; "Emulation Paused" = "Paused"; "Emulation Reset" = "Reset"; /* Errors */ "Error" = "Error"; "An emulation error occurred" = "An emulation error occurred"; desmume-0.9.9/src/cocoa/translations/English.lproj/MainMenu.strings0000644000175000017500000105505012140261574026170 0ustar guillaumeguillaume /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "5"; */ "5.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "19"; */ "19.title" = "Window"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "23"; */ "23.title" = "Minimize"; /* Class = "NSMenu"; title = "Window"; ObjectID = "24"; */ "24.title" = "Window"; /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "About DeSmuME"; /* Class = "NSMenuItem"; title = "Load ROM& "; ObjectID = "72"; */ "72.title" = "Load ROM& "; /* Class = "NSMenuItem"; title = "Save State File"; ObjectID = "75"; */ "75.title" = "Save State File"; /* Class = "NSMenuItem"; title = "Save State File As& "; ObjectID = "80"; */ "80.title" = "Save State File As& "; /* Class = "NSMenu"; title = "File"; ObjectID = "81"; */ "81.title" = "File"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "83"; */ "83.title" = "File"; /* Class = "NSMenuItem"; title = "Revert State File to Saved"; ObjectID = "112"; */ "112.title" = "Revert State File to Saved"; /* Class = "NSMenuItem"; title = "Load Recent ROM"; ObjectID = "124"; */ "124.title" = "Load Recent ROM"; /* Class = "NSMenu"; title = "Load Recent ROM"; ObjectID = "125"; */ "125.title" = "Load Recent ROM"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "126"; */ "126.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "Preferences& "; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = "Services"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = "Services"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "Hide DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Quit DeSmuME"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = "Show All"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "239"; */ "239.title" = "Zoom"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "295"; */ "295.title" = "View"; /* Class = "NSMenu"; title = "View"; ObjectID = "296"; */ "296.title" = "View"; /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "297"; */ "297.title" = "Show Toolbar"; /* Class = "NSMenuItem"; title = "Customize Toolbar& "; ObjectID = "298"; */ "298.title" = "Customize Toolbar& "; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "490"; */ "490.title" = "Help"; /* Class = "NSMenu"; title = "Help"; ObjectID = "491"; */ "491.title" = "Help"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "492"; */ "492.title" = "DeSmuME Help"; /* Class = "NSMenuItem"; title = "Unload ROM"; ObjectID = "534"; */ "534.title" = "Unload ROM"; /* Class = "NSMenuItem"; title = "Open State File..."; ObjectID = "535"; */ "535.title" = "Open State File..."; /* Class = "NSMenuItem"; title = "Load State Slot"; ObjectID = "538"; */ "538.title" = "Load State Slot"; /* Class = "NSMenu"; title = "Load State Slot"; ObjectID = "539"; */ "539.title" = "Load State Slot"; /* Class = "NSMenuItem"; title = "Save State Slot"; ObjectID = "541"; */ "541.title" = "Save State Slot"; /* Class = "NSMenu"; title = "Save State Slot"; ObjectID = "542"; */ "542.title" = "Save State Slot"; /* Class = "NSMenuItem"; title = "Emulation"; ObjectID = "575"; */ "575.title" = "Emulation"; /* Class = "NSMenu"; title = "Emulation"; ObjectID = "576"; */ "576.title" = "Emulation"; /* Class = "NSMenuItem"; title = "Execute"; ObjectID = "594"; */ "594.title" = "Execute"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "596"; */ "596.title" = "Reset"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "607"; */ "607.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "608"; */ "608.title" = "Tools"; /* Class = "NSWindow"; title = "DeSmuME Preferences"; ObjectID = "627"; */ "627.title" = "DeSmuME Preferences"; /* Class = "NSMenuItem"; title = "Display Rotation"; ObjectID = "783"; */ "783.title" = "Display Rotation"; /* Class = "NSMenu"; title = "Display Rotation"; ObjectID = "784"; */ "784.title" = "Display Rotation"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "785"; */ "785.title" = "0"; /* Class = "NSMenuItem"; title = "Display Size"; ObjectID = "787"; */ "787.title" = "Display Size"; /* Class = "NSMenu"; title = "Display Size"; ObjectID = "788"; */ "788.title" = "Display Size"; /* Class = "NSMenuItem"; title = "1x"; ObjectID = "789"; */ "789.title" = "1x"; /* Class = "NSPanel"; title = "HUD Settings"; ObjectID = "794"; */ "794.title" = "HUD Settings"; /* Class = "NSPanel"; title = "Display Video Settings"; ObjectID = "796"; */ "796.title" = "Display Video Settings"; /* Class = "NSButtonCell"; title = "Frame Counter"; ObjectID = "824"; */ "824.title" = "Frame Counter"; /* Class = "NSButtonCell"; title = "Frames Per Second"; ObjectID = "826"; */ "826.title" = "Frames Per Second"; /* Class = "NSButtonCell"; title = "Input"; ObjectID = "828"; */ "828.title" = "Input"; /* Class = "NSButtonCell"; title = "Graphical Input"; ObjectID = "830"; */ "830.title" = "Graphical Input"; /* Class = "NSButtonCell"; title = "Lag Counter"; ObjectID = "832"; */ "832.title" = "Lag Counter"; /* Class = "NSButtonCell"; title = "Microphone"; ObjectID = "834"; */ "834.title" = "Microphone"; /* Class = "NSButtonCell"; title = "Real Time Clock"; ObjectID = "836"; */ "836.title" = "Real Time Clock"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "844"; */ "844.title" = "Save Settings as Default"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "846"; */ "846.title" = "Save Settings as Default"; /* Class = "NSMenuItem"; title = "Show Display Video Settings..."; ObjectID = "854"; */ "854.title" = "Show Display Video Settings..."; /* Class = "NSPanel"; title = "ROM Info"; ObjectID = "861"; */ "861.title" = "ROM Info"; /* Class = "NSBox"; title = "General Info"; ObjectID = "872"; */ "872.title" = "General Info"; /* Class = "NSBox"; title = "Titles"; ObjectID = "875"; */ "875.title" = "Titles"; /* Class = "NSBox"; title = "ARM9 & ARM7 Binaries"; ObjectID = "876"; */ "876.title" = "ARM9 & ARM7 Binaries"; /* Class = "NSBox"; title = "File System"; ObjectID = "877"; */ "877.title" = "File System"; /* Class = "NSBox"; title = "Miscellaneous"; ObjectID = "878"; */ "878.title" = "Miscellaneous"; /* Class = "NSTextFieldCell"; title = "ROM Name: "; ObjectID = "880"; */ "880.title" = "ROM Name: "; /* Class = "NSTextFieldCell"; title = "ROM Serial: "; ObjectID = "884"; */ "884.title" = "ROM Serial: "; /* Class = "NSTextFieldCell"; title = "Maker Code: "; ObjectID = "886"; */ "886.title" = "Maker Code: "; /* Class = "NSTextFieldCell"; title = "Chip Size: "; ObjectID = "888"; */ "888.title" = "Chip Size: "; /* Class = "NSTextFieldCell"; title = "JAPANESE TITLE:"; ObjectID = "890"; */ "890.title" = "JAPANESE TITLE:"; /* Class = "NSTextFieldCell"; title = "ARM9 Binary ROM Offset:"; ObjectID = "898"; */ "898.title" = "ARM9 Binary ROM Offset:"; /* Class = "NSTextFieldCell"; title = "ARM9 Binary Entry Address:"; ObjectID = "900"; */ "900.title" = "ARM9 Binary Entry Address:"; /* Class = "NSTextFieldCell"; title = "ARM9 Binary Start Address:"; ObjectID = "902"; */ "902.title" = "ARM9 Binary Start Address:"; /* Class = "NSTextFieldCell"; title = "ARM9 Binary Size:"; ObjectID = "904"; */ "904.title" = "ARM9 Binary Size:"; /* Class = "NSTextFieldCell"; title = "ARM7 Binary ROM Offset:"; ObjectID = "906"; */ "906.title" = "ARM7 Binary ROM Offset:"; /* Class = "NSTextFieldCell"; title = "ARM7 Binary Entry Address:"; ObjectID = "908"; */ "908.title" = "ARM7 Binary Entry Address:"; /* Class = "NSTextFieldCell"; title = "ARM7 Binary Start Address:"; ObjectID = "910"; */ "910.title" = "ARM7 Binary Start Address:"; /* Class = "NSTextFieldCell"; title = "ARM7 Binary Size:"; ObjectID = "912"; */ "912.title" = "ARM7 Binary Size:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "914"; */ "914.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "ENGLISH TITLE:"; ObjectID = "925"; */ "925.title" = "ENGLISH TITLE:"; /* Class = "NSTextFieldCell"; title = "FRENCH TITLE:"; ObjectID = "927"; */ "927.title" = "FRENCH TITLE:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "929"; */ "929.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "931"; */ "931.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "933"; */ "933.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "935"; */ "935.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "937"; */ "937.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "939"; */ "939.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "941"; */ "941.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "GERMAN TITLE:"; ObjectID = "943"; */ "943.title" = "GERMAN TITLE:"; /* Class = "NSTextFieldCell"; title = "ITALIAN TITLE:"; ObjectID = "945"; */ "945.title" = "ITALIAN TITLE:"; /* Class = "NSTextFieldCell"; title = "SPANISH TITLE:"; ObjectID = "947"; */ "947.title" = "SPANISH TITLE:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "950"; */ "950.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "FNT ROM Offset:"; ObjectID = "951"; */ "951.title" = "FNT ROM Offset:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "954"; */ "954.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "FNT Size:"; ObjectID = "955"; */ "955.title" = "FNT Size:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "958"; */ "958.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "FAT ROM Offset:"; ObjectID = "959"; */ "959.title" = "FAT ROM Offset:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "962"; */ "962.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "FAT Size:"; ObjectID = "963"; */ "963.title" = "FAT Size:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "966"; */ "966.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Icon/Title Region ROM Offset:"; ObjectID = "967"; */ "967.title" = "Icon/Title Region ROM Offset:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "970"; */ "970.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Used ROM Size:"; ObjectID = "971"; */ "971.title" = "Used ROM Size:"; /* Class = "NSMenuItem"; title = "Go to Website..."; ObjectID = "977"; */ "977.title" = "Go to Website..."; /* Class = "NSMenuItem"; title = "Go to Forums..."; ObjectID = "978"; */ "978.title" = "Go to Forums..."; /* Class = "NSMenuItem"; title = "Submit a Bug Report..."; ObjectID = "979"; */ "979.title" = "Submit a Bug Report..."; /* Class = "NSMenuItem"; title = "Speed Limit"; ObjectID = "983"; */ "983.title" = "Speed Limit"; /* Class = "NSMenu"; title = "Speed Limit"; ObjectID = "984"; */ "984.title" = "Speed Limit"; /* Class = "NSMenuItem"; title = "Half"; ObjectID = "987"; */ "987.title" = "Half"; /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "990"; */ "990.title" = "Normal"; /* Class = "NSMenuItem"; title = "Double"; ObjectID = "991"; */ "991.title" = "Double"; /* Class = "NSMenuItem"; title = "Custom..."; ObjectID = "993"; */ "993.title" = "Custom..."; /* Class = "NSPanel"; title = "Set Speed Limit"; ObjectID = "998"; */ "998.title" = "Set Speed Limit"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "1003"; */ "1003.title" = "0x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "1005"; */ "1005.title" = "10x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "1007"; */ "1007.title" = "2x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "1009"; */ "1009.title" = "4x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "1011"; */ "1011.title" = "6x"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "1013"; */ "1013.title" = "8x"; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "1017"; */ "1017.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "1021"; */ "1021.title" = "Speed limit set to: "; /* Class = "NSTextFieldCell"; placeholderString = "%1.2fx"; ObjectID = "1025"; */ "1025.placeholderString" = "%1.2fx"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "1035"; */ "1035.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "1037"; */ "1037.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "1039"; */ "1039.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "1041"; */ "1041.placeholderString" = "?"; /* Class = "NSMenuItem"; title = "90"; ObjectID = "1113"; */ "1113.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "1114"; */ "1114.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "1115"; */ "1115.title" = "270"; /* Class = "NSMenuItem"; title = "2x"; ObjectID = "1118"; */ "1118.title" = "2x"; /* Class = "NSMenuItem"; title = "3x"; ObjectID = "1119"; */ "1119.title" = "3x"; /* Class = "NSMenuItem"; title = "4x"; ObjectID = "1120"; */ "1120.title" = "4x"; /* Class = "NSButtonCell"; title = "Automatically Execute Emulation When Loading a ROM"; ObjectID = "1300"; */ "1300.title" = "Automatically Execute Emulation When Loading a ROM"; /* Class = "NSPopUpButton"; gToolTip = "Sets the default size for new DS display views."; ObjectID = "1507"; */ "1507.gToolTip" = "Sets the default size for new DS display views."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1509"; */ "1509.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "1x"; ObjectID = "1510"; */ "1510.title" = "1x"; /* Class = "NSMenuItem"; title = "2x"; ObjectID = "1511"; */ "1511.title" = "2x"; /* Class = "NSMenuItem"; title = "3x"; ObjectID = "1512"; */ "1512.title" = "3x"; /* Class = "NSPopUpButton"; gToolTip = "Sets the default rotation for new DS display views."; ObjectID = "1525"; */ "1525.gToolTip" = "Sets the default rotation for new DS display views."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1527"; */ "1527.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "1528"; */ "1528.title" = "0"; /* Class = "NSMenuItem"; title = "90"; ObjectID = "1529"; */ "1529.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "1530"; */ "1530.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "1531"; */ "1531.title" = "270"; /* Class = "NSMenuItem"; title = "4x"; ObjectID = "1532"; */ "1532.title" = "4x"; /* Class = "NSBox"; title = "ROM Behavior"; ObjectID = "1538"; */ "1538.title" = "ROM Behavior"; /* Class = "NSButtonCell"; title = "Automatically Load a ROM Upon Launch"; ObjectID = "1540"; */ "1540.title" = "Automatically Load a ROM Upon Launch"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1543"; */ "1543.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Load Last Loaded ROM"; ObjectID = "1544"; */ "1544.title" = "Load Last Loaded ROM"; /* Class = "NSMenuItem"; title = "Load Selected ROM"; ObjectID = "1545"; */ "1545.title" = "Load Selected ROM"; /* Class = "NSTextFieldCell"; placeholderString = "ROM Name"; ObjectID = "1548"; */ "1548.placeholderString" = "ROM Name"; /* Class = "NSTextField"; gToolTip = "The default rotation for new DS display views. A custom rotation angle may be entered here. (The angle must be between 0 and 360.)"; ObjectID = "1577"; */ "1577.gToolTip" = "The default rotation for new DS display views. A custom rotation angle may be entered here. (The angle must be between 0 and 360.)"; /* Class = "NSTextFieldCell"; title = "0"; ObjectID = "1578"; */ "1578.title" = "0"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "1581"; */ "1581.title" = "Custom"; /* Class = "NSTabViewItem"; label = "Display Views"; ObjectID = "1616"; */ "1616.label" = "Display Views"; /* Class = "NSTabViewItem"; label = "Video Output"; ObjectID = "1620"; */ "1620.label" = "Video Output"; /* Class = "NSPopUpButton"; gToolTip = "Sets the default video filter for new DS display views, producing a variety of visual effects. The incurred CPU usage is dependent on which filter is used."; ObjectID = "1626"; */ "1626.gToolTip" = "Sets the default video filter for new DS display views, producing a variety of visual effects. The incurred CPU usage is dependent on which filter is used."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1628"; */ "1628.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "1629"; */ "1629.title" = "None"; /* Class = "NSMenuItem"; title = "LQ2x"; ObjectID = "1630"; */ "1630.title" = "LQ2x"; /* Class = "NSMenuItem"; title = "LQ2xS"; ObjectID = "1631"; */ "1631.title" = "LQ2xS"; /* Class = "NSTextFieldCell"; title = "Preview:"; ObjectID = "1635"; */ "1635.title" = "Preview:"; /* Class = "NSMenuItem"; title = "HQ2x"; ObjectID = "1636"; */ "1636.title" = "HQ2x"; /* Class = "NSMenuItem"; title = "2xSaI"; ObjectID = "1637"; */ "1637.title" = "2xSaI"; /* Class = "NSMenuItem"; title = "HQ2xS"; ObjectID = "1638"; */ "1638.title" = "HQ2xS"; /* Class = "NSMenuItem"; title = "Super 2xSaI"; ObjectID = "1639"; */ "1639.title" = "Super 2xSaI"; /* Class = "NSMenuItem"; title = "Scanline"; ObjectID = "1640"; */ "1640.title" = "Scanline"; /* Class = "NSMenuItem"; title = "Super Eagle"; ObjectID = "1641"; */ "1641.title" = "Super Eagle"; /* Class = "NSMenuItem"; title = "Bilinear"; ObjectID = "1642"; */ "1642.title" = "Bilinear"; /* Class = "NSMenuItem"; title = "Nearest 2x"; ObjectID = "1643"; */ "1643.title" = "Nearest 2x"; /* Class = "NSMenuItem"; title = "Nearest 1.5x"; ObjectID = "1644"; */ "1644.title" = "Nearest 1.5x"; /* Class = "NSMenuItem"; title = "Nearest+ 1.5x"; ObjectID = "1645"; */ "1645.title" = "Nearest+ 1.5x"; /* Class = "NSMenuItem"; title = "EPX"; ObjectID = "1646"; */ "1646.title" = "EPX"; /* Class = "NSMenuItem"; title = "EPX+"; ObjectID = "1647"; */ "1647.title" = "EPX+"; /* Class = "NSMenuItem"; title = "EPX 1.5x"; ObjectID = "1648"; */ "1648.title" = "EPX 1.5x"; /* Class = "NSMenuItem"; title = "EPX+ 1.5x"; ObjectID = "1649"; */ "1649.title" = "EPX+ 1.5x"; /* Class = "NSTextFieldCell"; title = "Video Filter:"; ObjectID = "1651"; */ "1651.title" = "Video Filter:"; /* Class = "NSToolbarItem"; label = "Input"; ObjectID = "1679"; */ "1679.label" = "Input"; /* Class = "NSToolbarItem"; paletteLabel = "Input"; ObjectID = "1679"; */ "1679.paletteLabel" = "Input"; /* Class = "NSToolbarItem"; label = "General"; ObjectID = "1680"; */ "1680.label" = "General"; /* Class = "NSToolbarItem"; paletteLabel = "General"; ObjectID = "1680"; */ "1680.paletteLabel" = "General"; /* Class = "NSToolbarItem"; label = "Display"; ObjectID = "1681"; */ "1681.label" = "Display"; /* Class = "NSToolbarItem"; paletteLabel = "Display"; ObjectID = "1681"; */ "1681.paletteLabel" = "Display"; /* Class = "NSMenuItem"; title = "Custom..."; ObjectID = "1855"; */ "1855.title" = "Custom..."; /* Class = "NSPanel"; title = "Set Rotation"; ObjectID = "1856"; */ "1856.title" = "Set Rotation"; /* Class = "NSTextFieldCell"; title = "0"; ObjectID = "1977"; */ "1977.title" = "0"; /* Class = "NSTextFieldCell"; title = "90"; ObjectID = "1979"; */ "1979.title" = "90"; /* Class = "NSTextFieldCell"; title = "180"; ObjectID = "1981"; */ "1981.title" = "180"; /* Class = "NSTextFieldCell"; title = "270"; ObjectID = "1983"; */ "1983.title" = "270"; /* Class = "NSTextFieldCell"; placeholderString = "rotX"; ObjectID = "1988"; */ "1988.placeholderString" = "rotX"; /* Class = "NSTextFieldCell"; title = "Rotation set to:"; ObjectID = "1999"; */ "1999.title" = "Rotation set to:"; /* Class = "NSMenuItem"; title = "5x"; ObjectID = "2095"; */ "2095.title" = "5x"; /* Class = "NSButtonCell"; title = "Set to 0"; ObjectID = "2155"; */ "2155.title" = "Set to 0"; /* Class = "NSToolbarItem"; label = "Sound"; ObjectID = "2246"; */ "2246.label" = "Sound"; /* Class = "NSToolbarItem"; paletteLabel = "Sound"; ObjectID = "2246"; */ "2246.paletteLabel" = "Sound"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "2250"; */ "2250.title" = "General Settings"; /* Class = "NSSlider"; gToolTip = "Sets the default sound volume."; ObjectID = "2253"; */ "2253.gToolTip" = "Sets the default sound volume."; /* Class = "NSTextFieldCell"; placeholderString = "%1.1f%%"; ObjectID = "2258"; */ "2258.placeholderString" = "%1.1f%%"; /* Class = "NSTextFieldCell"; title = "Display Size:"; ObjectID = "2288"; */ "2288.title" = "Display Size:"; /* Class = "NSTextFieldCell"; title = "Display Rotation:"; ObjectID = "2290"; */ "2290.title" = "Display Rotation:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "2294"; */ "2294.title" = "OtherViews"; /* Class = "NSMenuItem"; gToolTip = "New display views will show both DS screens by default."; ObjectID = "2297"; */ "2297.gToolTip" = "New display views will show both DS screens by default."; /* Class = "NSMenuItem"; title = "Combo"; ObjectID = "2297"; */ "2297.title" = "Combo"; /* Class = "NSMenuItem"; gToolTip = "New display views will show only the DS touch screen by default."; ObjectID = "2298"; */ "2298.gToolTip" = "New display views will show only the DS touch screen by default."; /* Class = "NSMenuItem"; title = "Touch"; ObjectID = "2298"; */ "2298.title" = "Touch"; /* Class = "NSTextFieldCell"; title = "Display Mode:"; ObjectID = "2299"; */ "2299.title" = "Display Mode:"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "2321"; */ "2321.title" = "Choose..."; /* Class = "NSBox"; title = "SPU Interpolation Method"; ObjectID = "2327"; */ "2327.title" = "SPU Interpolation Method"; /* Class = "NSButtonCell"; gToolTip = "Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; ObjectID = "2329"; */ "2329.gToolTip" = "Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; /* Class = "NSButtonCell"; title = "None"; ObjectID = "2329"; */ "2329.title" = "None"; /* Class = "NSButtonCell"; gToolTip = "Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage."; ObjectID = "2330"; */ "2330.gToolTip" = "Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage."; /* Class = "NSButtonCell"; title = "Linear"; ObjectID = "2330"; */ "2330.title" = "Linear"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "2331"; */ "2331.title" = "Radio"; /* Class = "NSButtonCell"; gToolTip = "Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting."; ObjectID = "2332"; */ "2332.gToolTip" = "Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting."; /* Class = "NSButtonCell"; title = "Cosine"; ObjectID = "2332"; */ "2332.title" = "Cosine"; /* Class = "NSToolbarItem"; label = "Emulation"; ObjectID = "2340"; */ "2340.label" = "Emulation"; /* Class = "NSToolbarItem"; paletteLabel = "Emulation"; ObjectID = "2340"; */ "2340.paletteLabel" = "Emulation"; /* Class = "NSBox"; title = "Emulation Timing"; ObjectID = "2341"; */ "2341.title" = "Emulation Timing"; /* Class = "NSBox"; title = "BIOS Configuration"; ObjectID = "2342"; */ "2342.title" = "BIOS Configuration"; /* Class = "NSBox"; title = "Firmware Configuration"; ObjectID = "2343"; */ "2343.title" = "Firmware Configuration"; /* Class = "NSBox"; title = "Debugger Configuration"; ObjectID = "2344"; */ "2344.title" = "Debugger Configuration"; /* Class = "NSButton"; gToolTip = "Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior."; ObjectID = "2345"; */ "2345.gToolTip" = "Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior."; /* Class = "NSButtonCell"; title = "Advanced Bus-Level Timing"; ObjectID = "2346"; */ "2346.title" = "Advanced Bus-Level Timing"; /* Class = "NSButton"; gToolTip = "Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used."; ObjectID = "2347"; */ "2347.gToolTip" = "Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used."; /* Class = "NSButtonCell"; title = "Use External BIOS Images"; ObjectID = "2348"; */ "2348.title" = "Use External BIOS Images"; /* Class = "NSTextFieldCell"; placeholderString = "Set BIOS Image..."; ObjectID = "2350"; */ "2350.placeholderString" = "Set BIOS Image..."; /* Class = "NSTextFieldCell"; title = "ARM9 BIOS Image:"; ObjectID = "2354"; */ "2354.title" = "ARM9 BIOS Image:"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "2356"; */ "2356.title" = "Choose..."; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "2360"; */ "2360.title" = "Choose..."; /* Class = "NSTextFieldCell"; title = "ARM7 BIOS Image:"; ObjectID = "2361"; */ "2361.title" = "ARM7 BIOS Image:"; /* Class = "NSTextFieldCell"; placeholderString = "Set BIOS Image..."; ObjectID = "2362"; */ "2362.placeholderString" = "Set BIOS Image..."; /* Class = "NSButton"; gToolTip = "Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May CPU usage, depending on if the ROM uses the ARM SWIs."; ObjectID = "2363"; */ "2363.gToolTip" = "Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May CPU usage, depending on if the ROM uses the ARM SWIs."; /* Class = "NSButtonCell"; title = "Emulate BIOS Software Interrupts"; ObjectID = "2364"; */ "2364.title" = "Emulate BIOS Software Interrupts"; /* Class = "NSButton"; gToolTip = "Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility."; ObjectID = "2365"; */ "2365.gToolTip" = "Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility."; /* Class = "NSButtonCell"; title = "Patch DelayLoop SWI (speed hack)"; ObjectID = "2366"; */ "2366.title" = "Patch DelayLoop SWI (speed hack)"; /* Class = "NSButton"; gToolTip = "For developer usage only."; ObjectID = "2367"; */ "2367.gToolTip" = "For developer usage only."; /* Class = "NSButtonCell"; title = "Use Debug Console"; ObjectID = "2368"; */ "2368.title" = "Use Debug Console"; /* Class = "NSButton"; gToolTip = "For developer usage only."; ObjectID = "2369"; */ "2369.gToolTip" = "For developer usage only."; /* Class = "NSButtonCell"; title = "Emulate Ensata"; ObjectID = "2370"; */ "2370.title" = "Emulate Ensata"; /* Class = "NSButton"; gToolTip = "Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment."; ObjectID = "2371"; */ "2371.gToolTip" = "Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment."; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "2375"; */ "2375.title" = "Choose..."; /* Class = "NSTextFieldCell"; title = "Firmware Image:"; ObjectID = "2376"; */ "2376.title" = "Firmware Image:"; /* Class = "NSTextFieldCell"; placeholderString = "Set Firmware Image..."; ObjectID = "2377"; */ "2377.placeholderString" = "Set Firmware Image..."; /* Class = "NSButtonCell"; title = "Use External Firmware Image"; ObjectID = "2378"; */ "2378.title" = "Use External Firmware Image"; /* Class = "NSMenuItem"; title = "ROM Save Type"; ObjectID = "2382"; */ "2382.title" = "ROM Save Type"; /* Class = "NSMenu"; title = "ROM Save Type"; ObjectID = "2383"; */ "2383.title" = "ROM Save Type"; /* Class = "NSMenuItem"; title = "Automatic"; ObjectID = "2384"; */ "2384.title" = "Automatic"; /* Class = "NSMenuItem"; title = "EEPROM 4Kb"; ObjectID = "2386"; */ "2386.title" = "EEPROM 4Kb"; /* Class = "NSMenuItem"; title = "EEPROM 64Kb"; ObjectID = "2388"; */ "2388.title" = "EEPROM 64Kb"; /* Class = "NSMenuItem"; title = "EEPROM 512Kb"; ObjectID = "2389"; */ "2389.title" = "EEPROM 512Kb"; /* Class = "NSMenuItem"; title = "FRAM 256Kb"; ObjectID = "2390"; */ "2390.title" = "FRAM 256Kb"; /* Class = "NSMenuItem"; title = "FLASH 2Mb"; ObjectID = "2391"; */ "2391.title" = "FLASH 2Mb"; /* Class = "NSMenuItem"; title = "FLASH 4Mb"; ObjectID = "2392"; */ "2392.title" = "FLASH 4Mb"; /* Class = "NSMenuItem"; title = "FLASH 8Mb"; ObjectID = "2393"; */ "2393.title" = "FLASH 8Mb"; /* Class = "NSMenuItem"; title = "FLASH 16Mb"; ObjectID = "2394"; */ "2394.title" = "FLASH 16Mb"; /* Class = "NSMenuItem"; title = "FLASH 32Mb"; ObjectID = "2395"; */ "2395.title" = "FLASH 32Mb"; /* Class = "NSMenuItem"; title = "FLASH 64Mb"; ObjectID = "2396"; */ "2396.title" = "FLASH 64Mb"; /* Class = "NSMenuItem"; title = "FLASH 256Mb"; ObjectID = "2397"; */ "2397.title" = "FLASH 256Mb"; /* Class = "NSMenuItem"; title = "FLASH 128Mb"; ObjectID = "2398"; */ "2398.title" = "FLASH 128Mb"; /* Class = "NSMenuItem"; title = "FLASH 512Mb"; ObjectID = "2399"; */ "2399.title" = "FLASH 512Mb"; /* Class = "NSBox"; gToolTip = "Performs no sound interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; ObjectID = "2427"; */ "2427.gToolTip" = "Performs no sound interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; /* Class = "NSBox"; title = "SPU Sound Synchronization Method"; ObjectID = "2427"; */ "2427.title" = "SPU Sound Synchronization Method"; /* Class = "NSBox"; title = "SPU Configuration"; ObjectID = "2428"; */ "2428.title" = "SPU Configuration"; /* Class = "NSButton"; gToolTip = "Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage."; ObjectID = "2429"; */ "2429.gToolTip" = "Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage."; /* Class = "NSButtonCell"; title = "Advanced SPU Logic"; ObjectID = "2430"; */ "2430.title" = "Advanced SPU Logic"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "2433"; */ "2433.title" = "OtherViews"; /* Class = "NSMenuItem"; gToolTip = "Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage."; ObjectID = "2434"; */ "2434.gToolTip" = "Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage."; /* Class = "NSMenuItem"; title = "\"N\" Method"; ObjectID = "2434"; */ "2434.title" = "\"N\" Method"; /* Class = "NSMenuItem"; gToolTip = "Pitch bends the sound depending on the emulation speed. Provides the smoothest sound, regardless of emulation speed. High latency. Low CPU usage."; ObjectID = "2435"; */ "2435.gToolTip" = "Pitch bends the sound depending on the emulation speed. Provides the smoothest sound, regardless of emulation speed. High latency. Low CPU usage."; /* Class = "NSMenuItem"; title = "\"Z\" Method"; ObjectID = "2435"; */ "2435.title" = "\"Z\" Method"; /* Class = "NSMenuItem"; gToolTip = "Sounds like \"Dual SPU Synch/Asynch,\" but is a little smoother and has some added latency. Medium latency. Low CPU usage. Recommended setting."; ObjectID = "2436"; */ "2436.gToolTip" = "Sounds like \"Dual SPU Synch/Asynch,\" but is a little smoother and has some added latency. Medium latency. Low CPU usage. Recommended setting."; /* Class = "NSMenuItem"; title = "\"P\" Method"; ObjectID = "2436"; */ "2436.title" = "\"P\" Method"; /* Class = "NSButtonCell"; gToolTip = "Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage."; ObjectID = "2438"; */ "2438.gToolTip" = "Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage."; /* Class = "NSButtonCell"; title = "Dual SPU Synch/Asynch"; ObjectID = "2438"; */ "2438.title" = "Dual SPU Synch/Asynch"; /* Class = "NSButtonCell"; gToolTip = "Enables the use of more complex sound synchronization methods."; ObjectID = "2439"; */ "2439.gToolTip" = "Enables the use of more complex sound synchronization methods."; /* Class = "NSButtonCell"; title = "Synchronous"; ObjectID = "2439"; */ "2439.title" = "Synchronous"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "2440"; */ "2440.title" = "Radio"; /* Class = "NSMenuItem"; title = "Disable Speed Limit"; ObjectID = "2473"; */ "2473.title" = "Disable Speed Limit"; /* Class = "NSMenuItem"; title = "Disable Cheats"; ObjectID = "2482"; */ "2482.title" = "Disable Cheats"; /* Class = "NSMenuItem"; title = "Show Cheat Manager..."; ObjectID = "2483"; */ "2483.title" = "Show Cheat Manager..."; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "2519"; */ "2519.title" = "Save Settings as Default"; /* Class = "NSMenuItem"; title = "Media"; ObjectID = "2529"; */ "2529.title" = "Media"; /* Class = "NSMenu"; title = "Media"; ObjectID = "2530"; */ "2530.title" = "Media"; /* Class = "NSMenuItem"; title = "New Movie Recording"; ObjectID = "2548"; */ "2548.title" = "New Movie Recording"; /* Class = "NSMenuItem"; title = "Open Movie..."; ObjectID = "2549"; */ "2549.title" = "Open Movie..."; /* Class = "NSMenuItem"; title = "Close Movie"; ObjectID = "2551"; */ "2551.title" = "Close Movie"; /* Class = "NSMenuItem"; title = "Save Screenshot As..."; ObjectID = "2553"; */ "2553.title" = "Save Screenshot As..."; /* Class = "NSMenuItem"; title = "Open Recent Movie"; ObjectID = "2558"; */ "2558.title" = "Open Recent Movie"; /* Class = "NSMenu"; title = "Open Recent Movie"; ObjectID = "2559"; */ "2559.title" = "Open Recent Movie"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "2560"; */ "2560.title" = "Clear Menu"; /* Class = "NSButton"; gToolTip = "Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded."; ObjectID = "2565"; */ "2565.gToolTip" = "Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded."; /* Class = "NSButtonCell"; title = "Boot From Firmware"; ObjectID = "2566"; */ "2566.title" = "Boot From Firmware"; /* Class = "NSMenuItem"; title = "Reveal Game Data Folder in Finder"; ObjectID = "2604"; */ "2604.title" = "Reveal Game Data Folder in Finder"; /* Class = "NSMenuItem"; title = "ROM Info"; ObjectID = "2609"; */ "2609.title" = "ROM Info"; /* Class = "NSWindow"; title = "User File Migration"; ObjectID = "2789"; */ "2789.title" = "User File Migration"; /* Class = "NSTextFieldCell"; title = "You have files that were created from a previous version of DeSmuME. Would you like to migrate them to work with this version?"; ObjectID = "2794"; */ "2794.title" = "You have files that were created from a previous version of DeSmuME. Would you like to migrate them to work with this version?"; /* Class = "NSButtonCell"; title = "Migrate By Moving"; ObjectID = "2800"; */ "2800.title" = "Migrate By Moving"; /* Class = "NSButtonCell"; title = "Don't Migrate"; ObjectID = "2804"; */ "2804.title" = "Don't Migrate"; /* Class = "NSButtonCell"; title = "Do not ask on startup"; ObjectID = "2808"; */ "2808.title" = "Do not ask on startup"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2810"; */ "2810.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2812"; */ "2812.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2814"; */ "2814.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2818"; */ "2818.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2819"; */ "2819.placeholderString" = "?"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "2820"; */ "2820.placeholderString" = "?"; /* Class = "NSWindow"; title = "ROM Save File Migration"; ObjectID = "2847"; */ "2847.title" = "ROM Save File Migration"; /* Class = "NSButtonCell"; title = "Migrate By Copying"; ObjectID = "2864"; */ "2864.title" = "Migrate By Copying"; /* Class = "NSTableColumn"; headerCell.title = "Version"; ObjectID = "2870"; */ "2870.headerCell.title" = "Version"; /* Class = "NSTableColumn"; headerCell.title = "Kind"; ObjectID = "2871"; */ "2871.headerCell.title" = "Kind"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "2872"; */ "2872.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "2873"; */ "2873.title" = "Text Cell"; /* Class = "NSTableColumn"; headerCell.title = "Name"; ObjectID = "2874"; */ "2874.headerCell.title" = "Name"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "2875"; */ "2875.title" = "Text Cell"; /* Class = "NSTableColumn"; headerCell.title = "Date Modified"; ObjectID = "2876"; */ "2876.headerCell.title" = "Date Modified"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "2877"; */ "2877.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Migrating the ROM save file will move it to DeSmuME's game data folder. If you do not migrate the save file now, a new file will be created instead. This will be like starting the ROM for the first time."; ObjectID = "2900"; */ "2900.title" = "Migrating the ROM save file will move it to DeSmuME's game data folder. If you do not migrate the save file now, a new file will be created instead. This will be like starting the ROM for the first time."; /* Class = "NSButtonCell"; title = "Don't Migrate"; ObjectID = "2901"; */ "2901.title" = "Don't Migrate"; /* Class = "NSButtonCell"; title = "Migrate"; ObjectID = "2902"; */ "2902.title" = "Migrate"; /* Class = "NSTextFieldCell"; title = "This ROM's save file has not been created yet, but there is a save file with this ROM that has the same file name. Would you like to migrate it to work with DeSmuME?"; ObjectID = "2903"; */ "2903.title" = "This ROM's save file has not been created yet, but there is a save file with this ROM that has the same file name. Would you like to migrate it to work with DeSmuME?"; /* Class = "NSTextFieldCell"; title = "Files from previous versions may not be fully compatible with the current version, especially Save State files. File migration cannot guarantee that all your old files will continue to work."; ObjectID = "2955"; */ "2955.title" = "Files from previous versions may not be fully compatible with the current version, especially Save State files. File migration cannot guarantee that all your old files will continue to work."; /* Class = "NSButtonCell"; title = "Do not show File Migration window on startup"; ObjectID = "3060"; */ "3060.title" = "Do not show File Migration window on startup"; /* Class = "NSButtonCell"; title = "Show File Migration Window"; ObjectID = "3062"; */ "3062.title" = "Show File Migration Window"; /* Class = "NSBox"; title = "User File Migration"; ObjectID = "3063"; */ "3063.title" = "User File Migration"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "3204"; */ "3204.title" = "Edit"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "3205"; */ "3205.title" = "Edit"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "3206"; */ "3206.title" = "Undo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "3207"; */ "3207.title" = "Redo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "3209"; */ "3209.title" = "Cut"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "3210"; */ "3210.title" = "Copy"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "3211"; */ "3211.title" = "Paste"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "3213"; */ "3213.title" = "Delete"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "3214"; */ "3214.title" = "Select All"; /* Class = "NSTextFieldCell"; title = "Selected ROM:"; ObjectID = "3286"; */ "3286.title" = "Selected ROM:"; /* Class = "NSWindow"; title = "Save State"; ObjectID = "3456"; */ "3456.title" = "Save State"; /* Class = "NSTextFieldCell"; title = "Would you like to save the emulation state before closing?"; ObjectID = "3462"; */ "3462.title" = "Would you like to save the emulation state before closing?"; /* Class = "NSTextFieldCell"; title = "If you haven't already saved using this ROM's save, then not saving the emulation state now will cause any unsaved changes to be lost."; ObjectID = "3463"; */ "3463.title" = "If you haven't already saved using this ROM's save, then not saving the emulation state now will cause any unsaved changes to be lost."; /* Class = "NSButtonCell"; title = "Save"; ObjectID = "3464"; */ "3464.title" = "Save"; /* Class = "NSButtonCell"; title = "Don't Save"; ObjectID = "3465"; */ "3465.title" = "Don't Save"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "3472"; */ "3472.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Enable HUD"; ObjectID = "3481"; */ "3481.title" = "Enable HUD"; /* Class = "NSBox"; title = "Box"; ObjectID = "3482"; */ "3482.title" = "Box"; /* Class = "NSWindow"; title = "Cheat Manager"; ObjectID = "3488"; */ "3488.title" = "Cheat Manager"; /* Class = "NSTableColumn"; headerCell.title = "Description"; ObjectID = "3507"; */ "3507.headerCell.title" = "Description"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "3508"; */ "3508.title" = "Text Cell"; /* Class = "NSButtonCell"; title = "View Cheat Database..."; ObjectID = "3517"; */ "3517.title" = "View Cheat Database..."; /* Class = "NSMenuItem"; title = "Export ROM Save File..."; ObjectID = "3522"; */ "3522.title" = "Export ROM Save File..."; /* Class = "NSMenuItem"; title = "Import ROM Save File..."; ObjectID = "3523"; */ "3523.title" = "Import ROM Save File..."; /* Class = "NSMenuItem"; title = "HQ4x"; ObjectID = "3644"; */ "3644.title" = "HQ4x"; /* Class = "NSButtonCell"; title = "EPX 1.5x"; ObjectID = "3649"; */ "3649.title" = "EPX 1.5x"; /* Class = "NSButtonCell"; title = "EPX+"; ObjectID = "3650"; */ "3650.title" = "EPX+"; /* Class = "NSButtonCell"; title = "EPX"; ObjectID = "3651"; */ "3651.title" = "EPX"; /* Class = "NSButtonCell"; title = "Nearest+ 1.5x"; ObjectID = "3652"; */ "3652.title" = "Nearest+ 1.5x"; /* Class = "NSButtonCell"; title = "Nearest 1.5x"; ObjectID = "3653"; */ "3653.title" = "Nearest 1.5x"; /* Class = "NSButtonCell"; title = "Nearest 2x"; ObjectID = "3654"; */ "3654.title" = "Nearest 2x"; /* Class = "NSButtonCell"; title = "Bilinear"; ObjectID = "3655"; */ "3655.title" = "Bilinear"; /* Class = "NSButtonCell"; title = "Scanline"; ObjectID = "3656"; */ "3656.title" = "Scanline"; /* Class = "NSButtonCell"; title = "Super Eagle"; ObjectID = "3657"; */ "3657.title" = "Super Eagle"; /* Class = "NSButtonCell"; title = "Super 2xSaI"; ObjectID = "3658"; */ "3658.title" = "Super 2xSaI"; /* Class = "NSButtonCell"; title = "2xSaI"; ObjectID = "3659"; */ "3659.title" = "2xSaI"; /* Class = "NSButtonCell"; title = "HQ4XS"; ObjectID = "3660"; */ "3660.title" = "HQ4XS"; /* Class = "NSButtonCell"; title = "HQ4x"; ObjectID = "3661"; */ "3661.title" = "HQ4x"; /* Class = "NSButtonCell"; title = "HQ2xS"; ObjectID = "3662"; */ "3662.title" = "HQ2xS"; /* Class = "NSButtonCell"; title = "HQ2x"; ObjectID = "3663"; */ "3663.title" = "HQ2x"; /* Class = "NSButtonCell"; title = "LQ2xS"; ObjectID = "3664"; */ "3664.title" = "LQ2xS"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3665"; */ "3665.title" = "Radio"; /* Class = "NSButtonCell"; title = "LQ2x"; ObjectID = "3666"; */ "3666.title" = "LQ2x"; /* Class = "NSButtonCell"; title = "None"; ObjectID = "3667"; */ "3667.title" = "None"; /* Class = "NSButton"; gToolTip = "Enable to use bilinear interpolation on the final video output by default. This creates a smoothed, but slightly blurry, image effect."; ObjectID = "3689"; */ "3689.gToolTip" = "Enable to use bilinear interpolation on the final video output by default. This creates a smoothed, but slightly blurry, image effect."; /* Class = "NSButtonCell"; title = "Use Bilinear Filtered Output"; ObjectID = "3690"; */ "3690.title" = "Use Bilinear Filtered Output"; /* Class = "NSButton"; gToolTip = "Enable to use bilinear interpolation on the final video output. This creates a smoothed, but slightly blurry, image effect."; ObjectID = "3692"; */ "3692.gToolTip" = "Enable to use bilinear interpolation on the final video output. This creates a smoothed, but slightly blurry, image effect."; /* Class = "NSButtonCell"; title = "Use Bilinear Filtered Output"; ObjectID = "3693"; */ "3693.title" = "Use Bilinear Filtered Output"; /* Class = "NSMenuItem"; title = "Show Sound Settings..."; ObjectID = "3709"; */ "3709.title" = "Show Sound Settings..."; /* Class = "NSPanel"; title = "Sound Settings"; ObjectID = "3712"; */ "3712.title" = "Sound Settings"; /* Class = "NSButton"; gToolTip = "Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage."; ObjectID = "3714"; */ "3714.gToolTip" = "Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage."; /* Class = "NSButtonCell"; title = "Advanced SPU Logic"; ObjectID = "3715"; */ "3715.title" = "Advanced SPU Logic"; /* Class = "NSBox"; title = "SPU Interpolation Method"; ObjectID = "3716"; */ "3716.title" = "SPU Interpolation Method"; /* Class = "NSBox"; title = "SPU Sound Synchronization Method"; ObjectID = "3717"; */ "3717.title" = "SPU Sound Synchronization Method"; /* Class = "NSButtonCell"; gToolTip = "Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; ObjectID = "3719"; */ "3719.gToolTip" = "Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage."; /* Class = "NSButtonCell"; title = "None"; ObjectID = "3719"; */ "3719.title" = "None"; /* Class = "NSButtonCell"; gToolTip = "Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage."; ObjectID = "3720"; */ "3720.gToolTip" = "Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage."; /* Class = "NSButtonCell"; title = "Linear"; ObjectID = "3720"; */ "3720.title" = "Linear"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3721"; */ "3721.title" = "Radio"; /* Class = "NSButtonCell"; gToolTip = "Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage."; ObjectID = "3723"; */ "3723.gToolTip" = "Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage."; /* Class = "NSButtonCell"; title = "Dual SPU Synch/Asynch"; ObjectID = "3723"; */ "3723.title" = "Dual SPU Synch/Asynch"; /* Class = "NSButtonCell"; gToolTip = "Enables the use of more complex sound synchronization methods."; ObjectID = "3724"; */ "3724.gToolTip" = "Enables the use of more complex sound synchronization methods."; /* Class = "NSButtonCell"; title = "Synchronous"; ObjectID = "3724"; */ "3724.title" = "Synchronous"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3725"; */ "3725.title" = "Radio"; /* Class = "NSButtonCell"; gToolTip = "Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting."; ObjectID = "3732"; */ "3732.gToolTip" = "Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting."; /* Class = "NSButtonCell"; title = "Cosine"; ObjectID = "3732"; */ "3732.title" = "Cosine"; /* Class = "NSBox"; title = "SPU Configuration"; ObjectID = "3733"; */ "3733.title" = "SPU Configuration"; /* Class = "NSSlider"; gToolTip = "Sets the current sound volume."; ObjectID = "3736"; */ "3736.gToolTip" = "Sets the current sound volume."; /* Class = "NSTextFieldCell"; placeholderString = "%1.1f%%"; ObjectID = "3740"; */ "3740.placeholderString" = "%1.1f%%"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "3747"; */ "3747.title" = "General Settings"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "3749"; */ "3749.title" = "Save Settings as Default"; /* Class = "NSMenuItem"; title = "Disable Auto Frame Skip"; ObjectID = "3751"; */ "3751.title" = "Disable Auto Frame Skip"; /* Class = "NSButton"; gToolTip = "When set, SoftRasterizer will produce smoother color transitions than a standard DS. No CPU usage."; ObjectID = "3771"; */ "3771.gToolTip" = "When set, SoftRasterizer will produce smoother color transitions than a standard DS. No CPU usage."; /* Class = "NSButtonCell"; title = "High-Precision Color Interpolation"; ObjectID = "3772"; */ "3772.title" = "High-Precision Color Interpolation"; /* Class = "NSButton"; gToolTip = "When set, SoftRasterizer will emulate the DS toon edge marking. Very low CPU usage."; ObjectID = "3773"; */ "3773.gToolTip" = "When set, SoftRasterizer will emulate the DS toon edge marking. Very low CPU usage."; /* Class = "NSButtonCell"; title = "Enable Edge Marking"; ObjectID = "3774"; */ "3774.title" = "Enable Edge Marking"; /* Class = "NSButton"; gToolTip = "When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage."; ObjectID = "3775"; */ "3775.gToolTip" = "When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage."; /* Class = "NSButtonCell"; title = "Enable Fog"; ObjectID = "3776"; */ "3776.title" = "Enable Fog"; /* Class = "NSButton"; gToolTip = "When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage."; ObjectID = "3777"; */ "3777.gToolTip" = "When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage."; /* Class = "NSButtonCell"; title = "Enable Textures"; ObjectID = "3778"; */ "3778.title" = "Enable Textures"; /* Class = "NSTextField"; gToolTip = "When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in \"The Legend of Zelda: Spirit Tracks.\" No CPU usage."; ObjectID = "3779"; */ "3779.gToolTip" = "When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in \"The Legend of Zelda: Spirit Tracks.\" No CPU usage."; /* Class = "NSTextFieldCell"; title = "0"; ObjectID = "3780"; */ "3780.title" = "0"; /* Class = "NSTextFieldCell"; title = "Depth Comparison Threshold:"; ObjectID = "3783"; */ "3783.title" = "Depth Comparison Threshold:"; /* Class = "NSBox"; title = "Video Filters"; ObjectID = "3784"; */ "3784.title" = "Video Filters"; /* Class = "NSBox"; title = "SoftRasterizer Options"; ObjectID = "3786"; */ "3786.title" = "SoftRasterizer Options"; /* Class = "NSTabViewItem"; label = "3D Rendering"; ObjectID = "3787"; */ "3787.label" = "3D Rendering"; /* Class = "NSMenuItem"; title = "Show 3D Rendering Settings..."; ObjectID = "3789"; */ "3789.title" = "Show 3D Rendering Settings..."; /* Class = "NSPanel"; title = "3D Rendering Settings"; ObjectID = "3790"; */ "3790.title" = "3D Rendering Settings"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "3794"; */ "3794.title" = "Save Settings as Default"; /* Class = "NSBox"; title = "SoftRasterizer Options"; ObjectID = "3798"; */ "3798.title" = "SoftRasterizer Options"; /* Class = "NSTextField"; gToolTip = "When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in \"The Legend of Zelda: Spirit Tracks.\" No CPU usage."; ObjectID = "3800"; */ "3800.gToolTip" = "When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in \"The Legend of Zelda: Spirit Tracks.\" No CPU usage."; /* Class = "NSButton"; gToolTip = "When set, SoftRasterizer will produce smoother color transitions than a standard DS. No CPU usage."; ObjectID = "3801"; */ "3801.gToolTip" = "When set, SoftRasterizer will produce smoother color transitions than a standard DS. No CPU usage."; /* Class = "NSButton"; gToolTip = "When set, SoftRasterizer will emulate the DS toon edge marking. Very low CPU usage."; ObjectID = "3802"; */ "3802.gToolTip" = "When set, SoftRasterizer will emulate the DS toon edge marking. Very low CPU usage."; /* Class = "NSButton"; gToolTip = "When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage."; ObjectID = "3803"; */ "3803.gToolTip" = "When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Very low CPU usage."; /* Class = "NSButton"; gToolTip = "When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage."; ObjectID = "3804"; */ "3804.gToolTip" = "When set, the 3D renderer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). May slightly reduce CPU usage."; /* Class = "NSButtonCell"; title = "Enable Textures"; ObjectID = "3805"; */ "3805.title" = "Enable Textures"; /* Class = "NSButtonCell"; title = "Enable Fog"; ObjectID = "3806"; */ "3806.title" = "Enable Fog"; /* Class = "NSButtonCell"; title = "Enable Edge Marking"; ObjectID = "3807"; */ "3807.title" = "Enable Edge Marking"; /* Class = "NSButtonCell"; title = "High-Precision Color Interpolation"; ObjectID = "3808"; */ "3808.title" = "High-Precision Color Interpolation"; /* Class = "NSTextFieldCell"; title = "Depth Comparison Threshold:"; ObjectID = "3811"; */ "3811.title" = "Depth Comparison Threshold:"; /* Class = "NSBox"; title = "3D Rendering Engine"; ObjectID = "3837"; */ "3837.title" = "3D Rendering Engine"; /* Class = "NSButtonCell"; gToolTip = "Disables 3D rendering. No CPU usage."; ObjectID = "3839"; */ "3839.gToolTip" = "Disables 3D rendering. No CPU usage."; /* Class = "NSButtonCell"; title = "None"; ObjectID = "3839"; */ "3839.title" = "None"; /* Class = "NSButtonCell"; gToolTip = "DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting."; ObjectID = "3840"; */ "3840.gToolTip" = "DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting."; /* Class = "NSButtonCell"; title = "SoftRasterizer"; ObjectID = "3840"; */ "3840.title" = "SoftRasterizer"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3841"; */ "3841.title" = "Radio"; /* Class = "NSPopUpButton"; gToolTip = "Sets the default 3D rendering engine for new DS display views."; ObjectID = "3843"; */ "3843.gToolTip" = "Sets the default 3D rendering engine for new DS display views."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "3845"; */ "3845.title" = "OtherViews"; /* Class = "NSMenuItem"; gToolTip = "Disables 3D rendering. No CPU usage."; ObjectID = "3846"; */ "3846.gToolTip" = "Disables 3D rendering. No CPU usage."; /* Class = "NSMenuItem"; title = "None"; ObjectID = "3846"; */ "3846.title" = "None"; /* Class = "NSMenuItem"; gToolTip = "DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting."; ObjectID = "3847"; */ "3847.gToolTip" = "DeSmuME's internal software 3D rendering engine. Has the best 3D emulation accuracy. Very high CPU usage. Recommended setting."; /* Class = "NSMenuItem"; title = "SoftRasterizer"; ObjectID = "3847"; */ "3847.title" = "SoftRasterizer"; /* Class = "NSTextFieldCell"; title = "3D Rendering Engine:"; ObjectID = "3850"; */ "3850.title" = "3D Rendering Engine:"; /* Class = "NSBox"; title = "Rendering Threads"; ObjectID = "3878"; */ "3878.title" = "Rendering Threads"; /* Class = "NSButtonCell"; gToolTip = "DeSmuME automatically chooses the best number of rendering threads based on your hardware."; ObjectID = "3880"; */ "3880.gToolTip" = "DeSmuME automatically chooses the best number of rendering threads based on your hardware."; /* Class = "NSButtonCell"; title = "Automatic"; ObjectID = "3880"; */ "3880.title" = "Automatic"; /* Class = "NSButtonCell"; gToolTip = "Renders 3D on the same thread as the core emulation thread. Best performance option for single processor machines."; ObjectID = "3881"; */ "3881.gToolTip" = "Renders 3D on the same thread as the core emulation thread. Best performance option for single processor machines."; /* Class = "NSButtonCell"; title = "Single-Threaded"; ObjectID = "3881"; */ "3881.title" = "Single-Threaded"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3882"; */ "3882.title" = "Radio"; /* Class = "NSButtonCell"; gToolTip = "Renders 3D on two separate threads. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines."; ObjectID = "3883"; */ "3883.gToolTip" = "Renders 3D on two separate threads. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines."; /* Class = "NSButtonCell"; title = "2 Threads"; ObjectID = "3883"; */ "3883.title" = "2 Threads"; /* Class = "NSButtonCell"; gToolTip = "Renders 3D on four separate threads. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines."; ObjectID = "3884"; */ "3884.gToolTip" = "Renders 3D on four separate threads. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines."; /* Class = "NSButtonCell"; title = "4 Threads"; ObjectID = "3884"; */ "3884.title" = "4 Threads"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "3885"; */ "3885.title" = "General Settings"; /* Class = "NSButton"; gToolTip = "Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines."; ObjectID = "3886"; */ "3886.gToolTip" = "Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines."; /* Class = "NSButtonCell"; title = "Enable Line Hack"; ObjectID = "3887"; */ "3887.title" = "Enable Line Hack"; /* Class = "NSPopUpButton"; gToolTip = "Sets the default number of processing threads that DeSmuME will use for 3D rendering. This is an option for advanced users. For most cases, it's best to keep this set to Automatic."; ObjectID = "3888"; */ "3888.gToolTip" = "Sets the default number of processing threads that DeSmuME will use for 3D rendering. This is an option for advanced users. For most cases, it's best to keep this set to Automatic."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "3890"; */ "3890.title" = "OtherViews"; /* Class = "NSMenuItem"; gToolTip = "DeSmuME automatically chooses the best number of rendering threads based on your hardware."; ObjectID = "3891"; */ "3891.gToolTip" = "DeSmuME automatically chooses the best number of rendering threads based on your hardware."; /* Class = "NSMenuItem"; title = "Automatic"; ObjectID = "3891"; */ "3891.title" = "Automatic"; /* Class = "NSMenuItem"; gToolTip = "Renders 3D on the same thread as the core emulation thread by default. Best performance option for single processor machines."; ObjectID = "3892"; */ "3892.gToolTip" = "Renders 3D on the same thread as the core emulation thread by default. Best performance option for single processor machines."; /* Class = "NSMenuItem"; title = "Single-Threaded"; ObjectID = "3892"; */ "3892.title" = "Single-Threaded"; /* Class = "NSMenuItem"; gToolTip = "Renders 3D on two separate threads by default. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines."; ObjectID = "3893"; */ "3893.gToolTip" = "Renders 3D on two separate threads by default. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines."; /* Class = "NSMenuItem"; title = "2 Threads"; ObjectID = "3893"; */ "3893.title" = "2 Threads"; /* Class = "NSMenuItem"; gToolTip = "Renders 3D on four separate threads by default. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines."; ObjectID = "3894"; */ "3894.gToolTip" = "Renders 3D on four separate threads by default. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines."; /* Class = "NSMenuItem"; title = "4 Threads"; ObjectID = "3894"; */ "3894.title" = "4 Threads"; /* Class = "NSTextFieldCell"; title = "Rendering Threads:"; ObjectID = "3897"; */ "3897.title" = "Rendering Threads:"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "3899"; */ "3899.title" = "General Settings"; /* Class = "NSButton"; gToolTip = "Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines."; ObjectID = "3900"; */ "3900.gToolTip" = "Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines."; /* Class = "NSButtonCell"; title = "Enable Line Hack"; ObjectID = "3901"; */ "3901.title" = "Enable Line Hack"; /* Class = "NSMenuItem"; title = "Display Mode"; ObjectID = "3935"; */ "3935.title" = "Display Mode"; /* Class = "NSMenu"; title = "Display Mode"; ObjectID = "3936"; */ "3936.title" = "Display Mode"; /* Class = "NSMenuItem"; title = "Main"; ObjectID = "3937"; */ "3937.title" = "Main"; /* Class = "NSMenuItem"; title = "Touch"; ObjectID = "3938"; */ "3938.title" = "Touch"; /* Class = "NSMenuItem"; title = "Combo"; ObjectID = "3939"; */ "3939.title" = "Combo"; /* Class = "NSButtonCell"; gToolTip = "Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage."; ObjectID = "3966"; */ "3966.gToolTip" = "Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage."; /* Class = "NSButtonCell"; title = "\"N\" Method"; ObjectID = "3966"; */ "3966.title" = "\"N\" Method"; /* Class = "NSButtonCell"; gToolTip = "Pitch bends the sound depending on the emulation speed. Provides the smoothest sound, regardless of emulation speed. High latency. Low CPU usage."; ObjectID = "3967"; */ "3967.gToolTip" = "Pitch bends the sound depending on the emulation speed. Provides the smoothest sound, regardless of emulation speed. High latency. Low CPU usage."; /* Class = "NSButtonCell"; title = "\"Z\" Method"; ObjectID = "3967"; */ "3967.title" = "\"Z\" Method"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "3968"; */ "3968.title" = "Radio"; /* Class = "NSButtonCell"; gToolTip = "Sounds like \"Dual SPU Synch/Asynch,\" but is a little smoother and has some added latency. Medium latency. Low CPU usage. Recommended setting."; ObjectID = "3969"; */ "3969.gToolTip" = "Sounds like \"Dual SPU Synch/Asynch,\" but is a little smoother and has some added latency. Medium latency. Low CPU usage. Recommended setting."; /* Class = "NSButtonCell"; title = "\"P\" Method"; ObjectID = "3969"; */ "3969.title" = "\"P\" Method"; /* Class = "NSTextFieldCell"; title = "Audio Output Engine: "; ObjectID = "3993"; */ "3993.title" = "Audio Output Engine: "; /* Class = "NSPopUpButton"; gToolTip = "Sets the default audio output engine."; ObjectID = "3994"; */ "3994.gToolTip" = "Sets the default audio output engine."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "3996"; */ "3996.title" = "OtherViews"; /* Class = "NSMenuItem"; gToolTip = "Disables audio output. No CPU usage."; ObjectID = "3997"; */ "3997.gToolTip" = "Disables audio output. No CPU usage."; /* Class = "NSMenuItem"; title = "None"; ObjectID = "3997"; */ "3997.title" = "None"; /* Class = "NSMenuItem"; gToolTip = "Native audio output engine for Mac OS X. Low CPU usage."; ObjectID = "3998"; */ "3998.gToolTip" = "Native audio output engine for Mac OS X. Low CPU usage."; /* Class = "NSMenuItem"; title = "OS X Core Audio"; ObjectID = "3998"; */ "3998.title" = "OS X Core Audio"; /* Class = "NSButtonCell"; gToolTip = "Disables audio output. No CPU usage."; ObjectID = "4002"; */ "4002.gToolTip" = "Disables audio output. No CPU usage."; /* Class = "NSButtonCell"; title = "None"; ObjectID = "4002"; */ "4002.title" = "None"; /* Class = "NSButtonCell"; gToolTip = "Native audio output engine for Mac OS X. Low CPU usage."; ObjectID = "4003"; */ "4003.gToolTip" = "Native audio output engine for Mac OS X. Low CPU usage."; /* Class = "NSButtonCell"; title = "OS X Core Audio"; ObjectID = "4003"; */ "4003.title" = "OS X Core Audio"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "4004"; */ "4004.title" = "Radio"; /* Class = "NSBox"; title = "Audio Output Engine"; ObjectID = "4024"; */ "4024.title" = "Audio Output Engine"; /* Class = "NSPanel"; title = "Emulation Settings"; ObjectID = "4027"; */ "4027.title" = "Emulation Settings"; /* Class = "NSBox"; title = "Emulation Timing"; ObjectID = "4029"; */ "4029.title" = "Emulation Timing"; /* Class = "NSButton"; gToolTip = "Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior."; ObjectID = "4030"; */ "4030.gToolTip" = "Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may dramatically improve performance, but may also cause some ROMs to stop working and cause other ROMs to show erratic behavior."; /* Class = "NSButtonCell"; title = "Advanced Bus-Level Timing"; ObjectID = "4031"; */ "4031.title" = "Advanced Bus-Level Timing"; /* Class = "NSBox"; title = "BIOS Configuration"; ObjectID = "4032"; */ "4032.title" = "BIOS Configuration"; /* Class = "NSButton"; gToolTip = "Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used."; ObjectID = "4033"; */ "4033.gToolTip" = "Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used."; /* Class = "NSButtonCell"; title = "Use External BIOS Images"; ObjectID = "4034"; */ "4034.title" = "Use External BIOS Images"; /* Class = "NSButton"; gToolTip = "Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May incur CPU usage, depending on if the ROM uses the ARM SWIs."; ObjectID = "4035"; */ "4035.gToolTip" = "Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May incur CPU usage, depending on if the ROM uses the ARM SWIs."; /* Class = "NSButtonCell"; title = "Emulate BIOS SWIs"; ObjectID = "4036"; */ "4036.title" = "Emulate BIOS SWIs"; /* Class = "NSButton"; gToolTip = "Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility."; ObjectID = "4037"; */ "4037.gToolTip" = "Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility."; /* Class = "NSButtonCell"; title = "Patch DelayLoop SWI"; ObjectID = "4038"; */ "4038.title" = "Patch DelayLoop SWI"; /* Class = "NSBox"; title = "Firmware Configuration"; ObjectID = "4039"; */ "4039.title" = "Firmware Configuration"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "4041"; */ "4041.title" = "Save Settings as Default"; /* Class = "NSButton"; gToolTip = "Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment."; ObjectID = "4043"; */ "4043.gToolTip" = "Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment."; /* Class = "NSButtonCell"; title = "Use External Firmware Image"; ObjectID = "4044"; */ "4044.title" = "Use External Firmware Image"; /* Class = "NSButton"; gToolTip = "Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded."; ObjectID = "4045"; */ "4045.gToolTip" = "Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded."; /* Class = "NSButtonCell"; title = "Boot From Firmware"; ObjectID = "4046"; */ "4046.title" = "Boot From Firmware"; /* Class = "NSBox"; title = "Debugger Configuration"; ObjectID = "4047"; */ "4047.title" = "Debugger Configuration"; /* Class = "NSButton"; gToolTip = "For developer usage only."; ObjectID = "4048"; */ "4048.gToolTip" = "For developer usage only."; /* Class = "NSButtonCell"; title = "Use Debug Console"; ObjectID = "4049"; */ "4049.title" = "Use Debug Console"; /* Class = "NSButton"; gToolTip = "For developer usage only."; ObjectID = "4050"; */ "4050.gToolTip" = "For developer usage only."; /* Class = "NSButtonCell"; title = "Emulate Ensata"; ObjectID = "4051"; */ "4051.title" = "Emulate Ensata"; /* Class = "NSMenuItem"; title = "Show Emulation Settings..."; ObjectID = "4062"; */ "4062.title" = "Show Emulation Settings..."; /* Class = "NSTextFieldCell"; title = "Configure Internal Firmware:"; ObjectID = "4067"; */ "4067.title" = "Configure Internal Firmware:"; /* Class = "NSTextField"; gToolTip = "Nicknames should be a maximum of 10 characters. Any additional characters will be truncated."; ObjectID = "4069"; */ "4069.gToolTip" = "Nicknames should be a maximum of 10 characters. Any additional characters will be truncated."; /* Class = "NSTextField"; gToolTip = "Messages should be a maximum of 26 characters. Any additional characters will be truncated."; ObjectID = "4070"; */ "4070.gToolTip" = "Messages should be a maximum of 26 characters. Any additional characters will be truncated."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4082"; */ "4082.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Turquoise"; ObjectID = "4083"; */ "4083.title" = "Turquoise"; /* Class = "NSMenuItem"; title = "Blue"; ObjectID = "4084"; */ "4084.title" = "Blue"; /* Class = "NSMenuItem"; title = "Sea Green"; ObjectID = "4085"; */ "4085.title" = "Sea Green"; /* Class = "NSMenuItem"; title = "Dark Purple"; ObjectID = "4086"; */ "4086.title" = "Dark Purple"; /* Class = "NSMenuItem"; title = "Dark Green"; ObjectID = "4087"; */ "4087.title" = "Dark Green"; /* Class = "NSMenuItem"; title = "Violet"; ObjectID = "4088"; */ "4088.title" = "Violet"; /* Class = "NSMenuItem"; title = "Magenta"; ObjectID = "4089"; */ "4089.title" = "Magenta"; /* Class = "NSMenuItem"; title = "Green"; ObjectID = "4090"; */ "4090.title" = "Green"; /* Class = "NSMenuItem"; title = "Dark Blue"; ObjectID = "4091"; */ "4091.title" = "Dark Blue"; /* Class = "NSMenuItem"; title = "Lime Green"; ObjectID = "4092"; */ "4092.title" = "Lime Green"; /* Class = "NSMenuItem"; title = "Yellow"; ObjectID = "4093"; */ "4093.title" = "Yellow"; /* Class = "NSMenuItem"; title = "Orange"; ObjectID = "4094"; */ "4094.title" = "Orange"; /* Class = "NSMenuItem"; title = "Red"; ObjectID = "4095"; */ "4095.title" = "Red"; /* Class = "NSMenuItem"; title = "Pink"; ObjectID = "4096"; */ "4096.title" = "Pink"; /* Class = "NSMenuItem"; title = "Brown"; ObjectID = "4097"; */ "4097.title" = "Brown"; /* Class = "NSMenuItem"; title = "Gray"; ObjectID = "4098"; */ "4098.title" = "Gray"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4100"; */ "4100.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Italian"; ObjectID = "4101"; */ "4101.title" = "Italian"; /* Class = "NSMenuItem"; title = "Spanish"; ObjectID = "4102"; */ "4102.title" = "Spanish"; /* Class = "NSMenuItem"; title = "German"; ObjectID = "4103"; */ "4103.title" = "German"; /* Class = "NSMenuItem"; title = "French"; ObjectID = "4104"; */ "4104.title" = "French"; /* Class = "NSMenuItem"; title = "English"; ObjectID = "4105"; */ "4105.title" = "English"; /* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "4106"; */ "4106.title" = "Japanese"; /* Class = "NSTextFieldCell"; title = "Note: To use this configuration, click Apply, and then reset the emulator. Also, these settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled."; ObjectID = "4107"; */ "4107.title" = "Note: To use this configuration, click Apply, and then reset the emulator. Also, these settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled."; /* Class = "NSTextFieldCell"; title = "Language:"; ObjectID = "4110"; */ "4110.title" = "Language:"; /* Class = "NSTextFieldCell"; title = "Birthday:"; ObjectID = "4111"; */ "4111.title" = "Birthday:"; /* Class = "NSTextFieldCell"; title = "Favorite Color:"; ObjectID = "4112"; */ "4112.title" = "Favorite Color:"; /* Class = "NSTextFieldCell"; title = "Message:"; ObjectID = "4113"; */ "4113.title" = "Message:"; /* Class = "NSTextFieldCell"; title = "Nickname:"; ObjectID = "4114"; */ "4114.title" = "Nickname:"; /* Class = "NSTextFieldCell"; placeholderString = "Enter a message..."; ObjectID = "4115"; */ "4115.placeholderString" = "Enter a message..."; /* Class = "NSTextFieldCell"; placeholderString = "Enter a nickname..."; ObjectID = "4116"; */ "4116.placeholderString" = "Enter a nickname..."; /* Class = "NSButtonCell"; title = "Apply"; ObjectID = "4180"; */ "4180.title" = "Apply"; /* Class = "NSWindow"; title = "Internal Firmware Preferences"; ObjectID = "4181"; */ "4181.title" = "Internal Firmware Preferences"; /* Class = "NSTextField"; gToolTip = "Nicknames should be a maximum of 10 characters. Any additional characters will be truncated."; ObjectID = "4191"; */ "4191.gToolTip" = "Nicknames should be a maximum of 10 characters. Any additional characters will be truncated."; /* Class = "NSTextField"; gToolTip = "Messages should be a maximum of 26 characters. Any additional characters will be truncated."; ObjectID = "4192"; */ "4192.gToolTip" = "Messages should be a maximum of 26 characters. Any additional characters will be truncated."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4202"; */ "4202.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Gray"; ObjectID = "4203"; */ "4203.title" = "Gray"; /* Class = "NSMenuItem"; title = "Brown"; ObjectID = "4204"; */ "4204.title" = "Brown"; /* Class = "NSMenuItem"; title = "Pink"; ObjectID = "4205"; */ "4205.title" = "Pink"; /* Class = "NSMenuItem"; title = "Red"; ObjectID = "4206"; */ "4206.title" = "Red"; /* Class = "NSMenuItem"; title = "Orange"; ObjectID = "4207"; */ "4207.title" = "Orange"; /* Class = "NSMenuItem"; title = "Yellow"; ObjectID = "4208"; */ "4208.title" = "Yellow"; /* Class = "NSMenuItem"; title = "Lime Green"; ObjectID = "4209"; */ "4209.title" = "Lime Green"; /* Class = "NSMenuItem"; title = "Dark Blue"; ObjectID = "4210"; */ "4210.title" = "Dark Blue"; /* Class = "NSMenuItem"; title = "Green"; ObjectID = "4211"; */ "4211.title" = "Green"; /* Class = "NSMenuItem"; title = "Magenta"; ObjectID = "4212"; */ "4212.title" = "Magenta"; /* Class = "NSMenuItem"; title = "Violet"; ObjectID = "4213"; */ "4213.title" = "Violet"; /* Class = "NSMenuItem"; title = "Dark Green"; ObjectID = "4214"; */ "4214.title" = "Dark Green"; /* Class = "NSMenuItem"; title = "Dark Purple"; ObjectID = "4215"; */ "4215.title" = "Dark Purple"; /* Class = "NSMenuItem"; title = "Sea Green"; ObjectID = "4216"; */ "4216.title" = "Sea Green"; /* Class = "NSMenuItem"; title = "Blue"; ObjectID = "4217"; */ "4217.title" = "Blue"; /* Class = "NSMenuItem"; title = "Turquoise"; ObjectID = "4218"; */ "4218.title" = "Turquoise"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4220"; */ "4220.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "4221"; */ "4221.title" = "Japanese"; /* Class = "NSMenuItem"; title = "English"; ObjectID = "4222"; */ "4222.title" = "English"; /* Class = "NSMenuItem"; title = "French"; ObjectID = "4223"; */ "4223.title" = "French"; /* Class = "NSMenuItem"; title = "German"; ObjectID = "4224"; */ "4224.title" = "German"; /* Class = "NSMenuItem"; title = "Spanish"; ObjectID = "4225"; */ "4225.title" = "Spanish"; /* Class = "NSMenuItem"; title = "Italian"; ObjectID = "4226"; */ "4226.title" = "Italian"; /* Class = "NSTextFieldCell"; title = "Language:"; ObjectID = "4228"; */ "4228.title" = "Language:"; /* Class = "NSTextFieldCell"; title = "Birthday:"; ObjectID = "4229"; */ "4229.title" = "Birthday:"; /* Class = "NSTextFieldCell"; title = "Favorite Color:"; ObjectID = "4230"; */ "4230.title" = "Favorite Color:"; /* Class = "NSTextFieldCell"; title = "Message:"; ObjectID = "4231"; */ "4231.title" = "Message:"; /* Class = "NSTextFieldCell"; title = "Nickname:"; ObjectID = "4232"; */ "4232.title" = "Nickname:"; /* Class = "NSTextFieldCell"; placeholderString = "Enter a message..."; ObjectID = "4233"; */ "4233.placeholderString" = "Enter a message..."; /* Class = "NSTextFieldCell"; placeholderString = "Enter a nickname..."; ObjectID = "4234"; */ "4234.placeholderString" = "Enter a nickname..."; /* Class = "NSTextFieldCell"; title = "Note: These settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled."; ObjectID = "4241"; */ "4241.title" = "Note: These settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled."; /* Class = "NSButtonCell"; title = "Configure Internal Firmware..."; ObjectID = "4276"; */ "4276.title" = "Configure Internal Firmware..."; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "4278"; */ "4278.title" = "OK"; /* Class = "NSBox"; title = "Cheat Settings"; ObjectID = "4565"; */ "4565.title" = "Cheat Settings"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4576"; */ "4576.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Internal Cheat"; ObjectID = "4577"; */ "4577.title" = "Internal Cheat"; /* Class = "NSMenuItem"; title = "Action Replay"; ObjectID = "4578"; */ "4578.title" = "Action Replay"; /* Class = "NSButtonCell"; title = "Enable this cheat"; ObjectID = "4582"; */ "4582.title" = "Enable this cheat"; /* Class = "NSButtonCell"; title = "Enable Cheats"; ObjectID = "4584"; */ "4584.title" = "Enable Cheats"; /* Class = "NSBox"; title = "Select Memory Size"; ObjectID = "4586"; */ "4586.title" = "Select Memory Size"; /* Class = "NSTextField"; gToolTip = "All addresses start with 0x02. Enter the last 6 digits of the address here in hexadecimal format."; ObjectID = "4588"; */ "4588.gToolTip" = "All addresses start with 0x02. Enter the last 6 digits of the address here in hexadecimal format."; /* Class = "NSTextField"; gToolTip = "Enter the numeric value to write to the target address."; ObjectID = "4590"; */ "4590.gToolTip" = "Enter the numeric value to write to the target address."; /* Class = "NSTextFieldCell"; title = "0x02"; ObjectID = "4594"; */ "4594.title" = "0x02"; /* Class = "NSTextFieldCell"; title = "Value:"; ObjectID = "4598"; */ "4598.title" = "Value:"; /* Class = "NSTextFieldCell"; title = "Address:"; ObjectID = "4600"; */ "4600.title" = "Address:"; /* Class = "NSMatrix"; gToolTip = "Select the memory size of the target address in bytes."; ObjectID = "4601"; */ "4601.gToolTip" = "Select the memory size of the target address in bytes."; /* Class = "NSButtonCell"; title = "3 Bytes [0 - 16777215]"; ObjectID = "4602"; */ "4602.title" = "3 Bytes [0 - 16777215]"; /* Class = "NSButtonCell"; title = "4 Bytes [0 - 4294967295]"; ObjectID = "4603"; */ "4603.title" = "4 Bytes [0 - 4294967295]"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "4604"; */ "4604.title" = "Radio"; /* Class = "NSButtonCell"; title = "2 Bytes [0 - 65536]"; ObjectID = "4605"; */ "4605.title" = "2 Bytes [0 - 65536]"; /* Class = "NSButtonCell"; title = "1 Byte [0 - 255]"; ObjectID = "4606"; */ "4606.title" = "1 Byte [0 - 255]"; /* Class = "NSTableColumn"; headerCell.title = "Type"; ObjectID = "4607"; */ "4607.headerCell.title" = "Type"; /* Class = "NSTextFieldCell"; title = "Action Replay Code:"; ObjectID = "4637"; */ "4637.title" = "Action Replay Code:"; /* Class = "NSTextFieldCell"; title = "Type:"; ObjectID = "4640"; */ "4640.title" = "Type:"; /* Class = "NSBox"; title = "Box"; ObjectID = "4647"; */ "4647.title" = "Box"; /* Class = "NSTextFieldCell"; title = "Description:"; ObjectID = "4662"; */ "4662.title" = "Description:"; /* Class = "NSButtonCell"; title = "Apply"; ObjectID = "4665"; */ "4665.title" = "Apply"; /* Class = "NSTextFieldCell"; title = "Code Breaker cheats have not been implemented in this version of DeSmuME."; ObjectID = "4694"; */ "4694.title" = "Code Breaker cheats have not been implemented in this version of DeSmuME."; /* Class = "NSTableColumn"; headerCell.title = "Address"; ObjectID = "4799"; */ "4799.headerCell.title" = "Address"; /* Class = "NSTableColumn"; headerCell.title = "Value"; ObjectID = "4800"; */ "4800.headerCell.title" = "Value"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "4801"; */ "4801.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "4802"; */ "4802.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Found: "; ObjectID = "4810"; */ "4810.title" = "Found: "; /* Class = "NSTextFieldCell"; placeholderString = "Search not started."; ObjectID = "4812"; */ "4812.placeholderString" = "Search not started."; /* Class = "NSButton"; gToolTip = "Shows/hides the address search drawer."; ObjectID = "4814"; */ "4814.gToolTip" = "Shows/hides the address search drawer."; /* Class = "NSTextFieldCell"; title = "Search for Address:"; ObjectID = "4818"; */ "4818.title" = "Search for Address:"; /* Class = "NSButton"; gToolTip = "Resets the memory address search."; ObjectID = "4822"; */ "4822.gToolTip" = "Resets the memory address search."; /* Class = "NSButtonCell"; title = "Reset"; ObjectID = "4823"; */ "4823.title" = "Reset"; /* Class = "NSTextFieldCell"; title = "Click the appropriate button based on how the target value is changing."; ObjectID = "4864"; */ "4864.title" = "Click the appropriate button based on how the target value is changing."; /* Class = "NSTextFieldCell"; title = "How is the value changing?"; ObjectID = "4865"; */ "4865.title" = "How is the value changing?"; /* Class = "NSButtonCell"; title = "Value is now lower"; ObjectID = "4866"; */ "4866.title" = "Value is now lower"; /* Class = "NSButtonCell"; title = "Value is now higher"; ObjectID = "4867"; */ "4867.title" = "Value is now higher"; /* Class = "NSButtonCell"; title = "Value did change"; ObjectID = "4868"; */ "4868.title" = "Value did change"; /* Class = "NSButtonCell"; title = "Value is unchanged"; ObjectID = "4869"; */ "4869.title" = "Value is unchanged"; /* Class = "NSTextFieldCell"; title = "Enter a search value, and then click Search."; ObjectID = "4873"; */ "4873.title" = "Enter a search value, and then click Search."; /* Class = "NSTextFieldCell"; title = "Search for an exact value."; ObjectID = "4874"; */ "4874.title" = "Search for an exact value."; /* Class = "NSButtonCell"; title = "Search"; ObjectID = "4878"; */ "4878.title" = "Search"; /* Class = "NSSearchFieldCell"; placeholderString = "Search value"; ObjectID = "4879"; */ "4879.placeholderString" = "Search value"; /* Class = "NSTextFieldCell"; title = "Start a comparative search."; ObjectID = "4890"; */ "4890.title" = "Start a comparative search."; /* Class = "NSTextFieldCell"; title = "Click Start Search to begin a comparative search."; ObjectID = "4891"; */ "4891.title" = "Click Start Search to begin a comparative search."; /* Class = "NSButtonCell"; title = "Start Search"; ObjectID = "4892"; */ "4892.title" = "Start Search"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4902"; */ "4902.title" = "OtherViews"; /* Class = "NSMenuItem"; gToolTip = "Searches the DS memory for all addresses that currently carry the search value."; ObjectID = "4903"; */ "4903.gToolTip" = "Searches the DS memory for all addresses that currently carry the search value."; /* Class = "NSMenuItem"; title = "Exact Value"; ObjectID = "4903"; */ "4903.title" = "Exact Value"; /* Class = "NSMenuItem"; gToolTip = "Searches the DS memory for any addresses which match the comparative search criteria."; ObjectID = "4904"; */ "4904.gToolTip" = "Searches the DS memory for any addresses which match the comparative search criteria."; /* Class = "NSMenuItem"; title = "Comparative"; ObjectID = "4904"; */ "4904.title" = "Comparative"; /* Class = "NSTextFieldCell"; title = "Search Style:"; ObjectID = "4907"; */ "4907.title" = "Search Style:"; /* Class = "NSTextFieldCell"; title = "Sign Type:"; ObjectID = "4909"; */ "4909.title" = "Sign Type:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "4912"; */ "4912.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Unsigned"; ObjectID = "4913"; */ "4913.title" = "Unsigned"; /* Class = "NSMenuItem"; title = "Signed (NOT IMPLEMENTED)"; ObjectID = "4914"; */ "4914.title" = "Signed (NOT IMPLEMENTED)"; /* Class = "NSBox"; title = "Cheat Configuration"; ObjectID = "5003"; */ "5003.title" = "Cheat Configuration"; /* Class = "NSTextFieldCell"; title = "R4 Cheat Database:"; ObjectID = "5007"; */ "5007.title" = "R4 Cheat Database:"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "5008"; */ "5008.title" = "Choose..."; /* Class = "NSTextFieldCell"; placeholderString = "File Name"; ObjectID = "5009"; */ "5009.placeholderString" = "File Name"; /* Class = "NSTextFieldCell"; title = "Note: Enabling this cheat freezes the value in memory. If you only want to change a value without actually freezing it in memory, click Write Once."; ObjectID = "5067"; */ "5067.title" = "Note: Enabling this cheat freezes the value in memory. If you only want to change a value without actually freezing it in memory, click Write Once."; /* Class = "NSButton"; gToolTip = "Immediately writes the value once to the target address."; ObjectID = "5068"; */ "5068.gToolTip" = "Immediately writes the value once to the target address."; /* Class = "NSButtonCell"; title = "Write Once"; ObjectID = "5069"; */ "5069.title" = "Write Once"; /* Class = "NSWindow"; title = "Cheat Database"; ObjectID = "5080"; */ "5080.title" = "Cheat Database"; /* Class = "NSTableColumn"; headerCell.title = "Description"; ObjectID = "5088"; */ "5088.headerCell.title" = "Description"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "5089"; */ "5089.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "R4 Cheats Database:"; ObjectID = "5099"; */ "5099.title" = "R4 Cheats Database:"; /* Class = "NSButtonCell"; title = "Select All"; ObjectID = "5101"; */ "5101.title" = "Select All"; /* Class = "NSButtonCell"; title = "Select None"; ObjectID = "5103"; */ "5103.title" = "Select None"; /* Class = "NSButtonCell"; title = "Add"; ObjectID = "5105"; */ "5105.title" = "Add"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "5107"; */ "5107.title" = "Cancel"; /* Class = "NSTextFieldCell"; title = "Found:"; ObjectID = "5112"; */ "5112.title" = "Found:"; /* Class = "NSTextFieldCell"; title = "ROM Title:"; ObjectID = "5128"; */ "5128.title" = "ROM Title:"; /* Class = "NSTextFieldCell"; placeholderString = "Database file"; ObjectID = "5134"; */ "5134.placeholderString" = "Database file"; /* Class = "NSTextFieldCell"; placeholderString = "Count"; ObjectID = "5136"; */ "5136.placeholderString" = "Count"; /* Class = "NSTextFieldCell"; placeholderString = "ROM title"; ObjectID = "5141"; */ "5141.placeholderString" = "ROM title"; /* Class = "NSTextFieldCell"; title = "This list only shows the first 100 search results."; ObjectID = "5169"; */ "5169.title" = "This list only shows the first 100 search results."; /* Class = "NSBox"; title = "ADVANsCEne Database"; ObjectID = "5171"; */ "5171.title" = "ADVANsCEne Database"; /* Class = "NSTextFieldCell"; placeholderString = "File Name"; ObjectID = "5176"; */ "5176.placeholderString" = "File Name"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "5177"; */ "5177.title" = "Choose..."; /* Class = "NSTextFieldCell"; title = "ADVANsCEne Database:"; ObjectID = "5178"; */ "5178.title" = "ADVANsCEne Database:"; /* Class = "NSTextFieldCell"; title = "You can download the latest ADVANsCEne Database from:\nhttp://www.advanscene.com/offline/datas/ADVANsCEne_RToolDS.zip"; ObjectID = "5179"; */ "5179.title" = "You can download the latest ADVANsCEne Database from:\nhttp://www.advanscene.com/offline/datas/ADVANsCEne_RToolDS.zip"; /* Class = "NSBox"; title = "ROM Save Configuration"; ObjectID = "5186"; */ "5186.title" = "ROM Save Configuration"; /* Class = "NSButton"; gToolTip = "Whenever DeSmuME needs to determine a ROM's save type, use the ADVANsCEne database to determine the save type before using the internal autodetect algorithm."; ObjectID = "5188"; */ "5188.gToolTip" = "Whenever DeSmuME needs to determine a ROM's save type, use the ADVANsCEne database to determine the save type before using the internal autodetect algorithm."; /* Class = "NSButtonCell"; title = "Use ADVANsCEne Database when auto-detecting the ROM save type"; ObjectID = "5189"; */ "5189.title" = "Use ADVANsCEne Database when auto-detecting the ROM save type"; /* Class = "NSMenuItem"; title = "Close State File"; ObjectID = "5329"; */ "5329.title" = "Close State File"; /* Class = "NSMenuItem"; title = "Rotate Right"; ObjectID = "5419"; */ "5419.title" = "Rotate Right"; /* Class = "NSMenuItem"; title = "Rotate Left"; ObjectID = "5421"; */ "5421.title" = "Rotate Left"; /* Class = "NSMenuItem"; gToolTip = "New display views will show only the main DS screen by default."; ObjectID = "5427"; */ "5427.gToolTip" = "New display views will show only the main DS screen by default."; /* Class = "NSMenuItem"; title = "Main"; ObjectID = "5427"; */ "5427.title" = "Main"; /* Class = "NSBox"; title = "General Settings"; ObjectID = "5450"; */ "5450.title" = "General Settings"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "5648"; */ "5648.title" = "Show Status Bar"; /* Class = "NSWindow"; title = "About DeSmuME"; ObjectID = "5651"; */ "5651.title" = "About DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "App Description"; ObjectID = "5661"; */ "5661.placeholderString" = "App Description"; /* Class = "NSTabViewItem"; label = "Change Log"; ObjectID = "5665"; */ "5665.label" = "Change Log"; /* Class = "NSTabViewItem"; label = "Authors"; ObjectID = "5666"; */ "5666.label" = "Authors"; /* Class = "NSTabViewItem"; label = "License"; ObjectID = "5667"; */ "5667.label" = "License"; /* Class = "NSTabViewItem"; label = "Read Me"; ObjectID = "5668"; */ "5668.label" = "Read Me"; /* Class = "NSTextFieldCell"; placeholderString = "Build Info"; ObjectID = "5689"; */ "5689.placeholderString" = "Build Info"; /* Class = "NSMenuItem"; title = "Keep Minimum Display Size at 1x"; ObjectID = "5702"; */ "5702.title" = "Keep Minimum Display Size at 1x"; /* Class = "NSTextFieldCell"; title = "Select ROM Save Format:"; ObjectID = "5936"; */ "5936.title" = "Select ROM Save Format:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "5938"; */ "5938.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "No$GBA ROM Save (.sav)"; ObjectID = "5939"; */ "5939.title" = "No$GBA ROM Save (.sav)"; /* Class = "NSMenuItem"; title = "DeSmuME ROM Save (.dsv)"; ObjectID = "5942"; */ "5942.title" = "DeSmuME ROM Save (.dsv)"; /* Class = "NSMenuItem"; title = "Raw Save File (.sav)"; ObjectID = "5963"; */ "5963.title" = "Raw Save File (.sav)"; /* Class = "NSButtonCell"; title = "Enable Speed Limit"; ObjectID = "5966"; */ "5966.title" = "Enable Speed Limit"; /* Class = "NSBox"; title = "CPU Emulation Engine"; ObjectID = "6126"; */ "6126.title" = "CPU Emulation Engine"; /* Class = "NSButtonCell"; gToolTip = "Sets the classic interpreter engine to emulate the ARM7 and ARM9 CPUs by default. It features very high compatibility with most configurations, as well as high accuracy with most ROMs."; ObjectID = "6128"; */ "6128.gToolTip" = "Sets the classic interpreter engine to emulate the ARM7 and ARM9 CPUs by default. It features very high compatibility with most configurations, as well as high accuracy with most ROMs."; /* Class = "NSButtonCell"; title = "Interpreter"; ObjectID = "6128"; */ "6128.title" = "Interpreter"; /* Class = "NSButtonCell"; gToolTip = "Sets the dynarec engine to emulate the ARM7 and ARM9 CPUs by default. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.)"; ObjectID = "6129"; */ "6129.gToolTip" = "Sets the dynarec engine to emulate the ARM7 and ARM9 CPUs by default. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.)"; /* Class = "NSButtonCell"; title = "Dynamic Recompiler"; ObjectID = "6129"; */ "6129.title" = "Dynamic Recompiler"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "6130"; */ "6130.title" = "Radio"; /* Class = "NSBox"; title = "CPU Emulation Engine"; ObjectID = "6131"; */ "6131.title" = "CPU Emulation Engine"; /* Class = "NSButtonCell"; gToolTip = "Uses the classic interpreter engine to emulate the ARM7 and ARM9 CPUs. It features very high compatibility with most configurations, as well as high accuracy with most ROMs. [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.]"; ObjectID = "6133"; */ "6133.gToolTip" = "Uses the classic interpreter engine to emulate the ARM7 and ARM9 CPUs. It features very high compatibility with most configurations, as well as high accuracy with most ROMs. [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.]"; /* Class = "NSButtonCell"; title = "Interpreter"; ObjectID = "6133"; */ "6133.title" = "Interpreter"; /* Class = "NSButtonCell"; gToolTip = "Uses the dynarec engine to emulate the ARM7 and ARM9 CPUs. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.) [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.]"; ObjectID = "6134"; */ "6134.gToolTip" = "Uses the dynarec engine to emulate the ARM7 and ARM9 CPUs. It features far superior performance to the interpreter engine, but is not compatible with all configurations. Also, some ROMs may not work or may show erratic behavior when using this engine. (This feature is not available on a PowerPC-based Mac.) [Changes to the CPU emulation engine will only take effect after a ROM is loaded or after the emulator is reset.]"; /* Class = "NSButtonCell"; title = "Dynamic Recompiler"; ObjectID = "6134"; */ "6134.title" = "Dynamic Recompiler"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "6135"; */ "6135.title" = "Radio"; /* Class = "NSButton"; gToolTip = "Enable to use vertical sync on the video output. This setting eliminates screen tearing, but may also reduce the video frame rate."; ObjectID = "6159"; */ "6159.gToolTip" = "Enable to use vertical sync on the video output. This setting eliminates screen tearing, but may also reduce the video frame rate."; /* Class = "NSButtonCell"; title = "Use Vertical Sync"; ObjectID = "6160"; */ "6160.title" = "Use Vertical Sync"; /* Class = "NSButton"; gToolTip = "Enable to use vertical sync on the video output by default. This setting eliminates screen tearing, but may also reduce the video frame rate."; ObjectID = "6161"; */ "6161.gToolTip" = "Enable to use vertical sync on the video output by default. This setting eliminates screen tearing, but may also reduce the video frame rate."; /* Class = "NSButtonCell"; title = "Use Vertical Sync"; ObjectID = "6162"; */ "6162.title" = "Use Vertical Sync"; /* Class = "NSMenuItem"; title = "Display Orientation"; ObjectID = "6168"; */ "6168.title" = "Display Orientation"; /* Class = "NSMenu"; title = "Display Orientation"; ObjectID = "6169"; */ "6169.title" = "Display Orientation"; /* Class = "NSMenuItem"; title = "Vertical"; ObjectID = "6170"; */ "6170.title" = "Vertical"; /* Class = "NSMenuItem"; title = "Display Order"; ObjectID = "6171"; */ "6171.title" = "Display Order"; /* Class = "NSMenu"; title = "Display Order"; ObjectID = "6172"; */ "6172.title" = "Display Order"; /* Class = "NSMenuItem"; title = "Main Screen First"; ObjectID = "6173"; */ "6173.title" = "Main Screen First"; /* Class = "NSMenuItem"; title = "Horizontal"; ObjectID = "6174"; */ "6174.title" = "Horizontal"; /* Class = "NSMenuItem"; title = "Touch Screen First"; ObjectID = "6177"; */ "6177.title" = "Touch Screen First"; /* Class = "NSBox"; title = "Combo Display Layout"; ObjectID = "6180"; */ "6180.title" = "Combo Display Layout"; /* Class = "NSBox"; title = "Display Orientation"; ObjectID = "6182"; */ "6182.title" = "Display Orientation"; /* Class = "NSBox"; title = "Display Order"; ObjectID = "6183"; */ "6183.title" = "Display Order"; /* Class = "NSButtonCell"; gToolTip = "If the display orientation is vertical, the main screen will be arranged above the touch screen by default. If the display layout is horizontal, the main screen will be arranged left of the touch screen by default."; ObjectID = "6185"; */ "6185.gToolTip" = "If the display orientation is vertical, the main screen will be arranged above the touch screen by default. If the display layout is horizontal, the main screen will be arranged left of the touch screen by default."; /* Class = "NSButtonCell"; title = "Main Screen First"; ObjectID = "6185"; */ "6185.title" = "Main Screen First"; /* Class = "NSButtonCell"; gToolTip = "If the display orientation is vertical, the touch screen will be arranged above the main screen by default. If the display layout is horizontal, the touch screen will be arranged left of the main screen by default."; ObjectID = "6186"; */ "6186.gToolTip" = "If the display orientation is vertical, the touch screen will be arranged above the main screen by default. If the display layout is horizontal, the touch screen will be arranged left of the main screen by default."; /* Class = "NSButtonCell"; title = "Touch Screen First"; ObjectID = "6186"; */ "6186.title" = "Touch Screen First"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "6187"; */ "6187.title" = "Radio"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "6189"; */ "6189.title" = "Radio"; /* Class = "NSButtonCell"; gToolTip = "Arranges the DS screens where one screen is to the left of the other screen by default."; ObjectID = "6190"; */ "6190.gToolTip" = "Arranges the DS screens where one screen is to the left of the other screen by default."; /* Class = "NSButtonCell"; title = "Horizontal"; ObjectID = "6190"; */ "6190.title" = "Horizontal"; /* Class = "NSButtonCell"; gToolTip = "Arranges the DS screens where one screen is above the other screen by default."; ObjectID = "6191"; */ "6191.gToolTip" = "Arranges the DS screens where one screen is above the other screen by default."; /* Class = "NSButtonCell"; title = "Vertical"; ObjectID = "6191"; */ "6191.title" = "Vertical"; /* Class = "NSMenuItem"; gToolTip = "OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU."; ObjectID = "6233"; */ "6233.gToolTip" = "OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU."; /* Class = "NSMenuItem"; title = "OpenGL"; ObjectID = "6233"; */ "6233.title" = "OpenGL"; /* Class = "NSButtonCell"; gToolTip = "OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU."; ObjectID = "6234"; */ "6234.gToolTip" = "OpenGL-based 3D rendering engine. Some 3D objects may have better looking texturing, but 3D emulation is less accurate overall. Low CPU usage. However, it requires the usage of your GPU."; /* Class = "NSButtonCell"; title = "OpenGL"; ObjectID = "6234"; */ "6234.title" = "OpenGL"; /* Class = "NSButtonCell"; title = "EPX+ 1.5x"; ObjectID = "6236"; */ "6236.title" = "EPX+ 1.5x"; /* Class = "NSMenuItem"; title = "HQ4xS"; ObjectID = "6238"; */ "6238.title" = "HQ4xS"; /* Class = "NSWindow"; title = "Troubleshooting Form"; ObjectID = "6295"; */ "6295.title" = "Troubleshooting Form"; /* Class = "NSBox"; title = "Box"; ObjectID = "6361"; */ "6361.title" = "Box"; /* Class = "NSBox"; title = "Box"; ObjectID = "6364"; */ "6364.title" = "Box"; /* Class = "NSBox"; title = "Box"; ObjectID = "6368"; */ "6368.title" = "Box"; /* Class = "NSTextFieldCell"; title = "And that's it! Click Continue to review your information before submitting it to the DeSmuME team."; ObjectID = "6374"; */ "6374.title" = "And that's it! Click Continue to review your information before submitting it to the DeSmuME team."; /* Class = "NSTextFieldCell"; title = "In the field below, briefly describe your situation and what you need help with. (Please be as specific as possible! It will help us to understand your situation better.)"; ObjectID = "6376"; */ "6376.title" = "In the field below, briefly describe your situation and what you need help with. (Please be as specific as possible! It will help us to understand your situation better.)"; /* Class = "NSTextFieldCell"; title = "Tell us what you need help with."; ObjectID = "6377"; */ "6377.title" = "Tell us what you need help with."; /* Class = "NSTextFieldCell"; title = "Do you need help with using DeSmuME? If so, it never hurts to ask! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your issue quicker and easier."; ObjectID = "6378"; */ "6378.title" = "Do you need help with using DeSmuME? If so, it never hurts to ask! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your issue quicker and easier."; /* Class = "NSTextFieldCell"; title = "DeSmuME Technical Support Request Form"; ObjectID = "6379"; */ "6379.title" = "DeSmuME Technical Support Request Form"; /* Class = "NSTextFieldCell"; title = "Tell us about the ROM."; ObjectID = "6380"; */ "6380.title" = "Tell us about the ROM."; /* Class = "NSTextFieldCell"; title = "If your issue is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.)"; ObjectID = "6381"; */ "6381.title" = "If your issue is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.)"; /* Class = "NSTextFieldCell"; title = "ROM Serial:"; ObjectID = "6382"; */ "6382.title" = "ROM Serial:"; /* Class = "NSTextFieldCell"; title = "ROM Name:"; ObjectID = "6383"; */ "6383.title" = "ROM Name:"; /* Class = "NSButtonCell"; title = "Use Currently Loaded ROM"; ObjectID = "6386"; */ "6386.title" = "Use Currently Loaded ROM"; /* Class = "NSButtonCell"; title = "Continue"; ObjectID = "6387"; */ "6387.title" = "Continue"; /* Class = "NSBox"; title = "Box"; ObjectID = "6397"; */ "6397.title" = "Box"; /* Class = "NSBox"; title = "Box"; ObjectID = "6400"; */ "6400.title" = "Box"; /* Class = "NSBox"; title = "Box"; ObjectID = "6407"; */ "6407.title" = "Box"; /* Class = "NSTextFieldCell"; title = "And that's it! Click Continue to review your information before submitting it to the DeSmuME team."; ObjectID = "6413"; */ "6413.title" = "And that's it! Click Continue to review your information before submitting it to the DeSmuME team."; /* Class = "NSTextFieldCell"; title = "Expected Behavior:"; ObjectID = "6414"; */ "6414.title" = "Expected Behavior:"; /* Class = "NSTextFieldCell"; title = "Observed Behavior:"; ObjectID = "6415"; */ "6415.title" = "Observed Behavior:"; /* Class = "NSTextFieldCell"; title = "In the fields below, give us specific details on what you OBSERVED happened, and then what you EXPECTED to happen."; ObjectID = "6418"; */ "6418.title" = "In the fields below, give us specific details on what you OBSERVED happened, and then what you EXPECTED to happen."; /* Class = "NSTextFieldCell"; title = "Tell us what is happening."; ObjectID = "6419"; */ "6419.title" = "Tell us what is happening."; /* Class = "NSTextFieldCell"; title = "Think you just spotted a bug with DeSmuME? Be sure to let us know! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your bug report quicker and easier."; ObjectID = "6420"; */ "6420.title" = "Think you just spotted a bug with DeSmuME? Be sure to let us know! Just fill out this form and DeSmuME will prepare all the troubleshooting information for you to send to the DeSmuME team. This information will help us respond to your bug report quicker and easier."; /* Class = "NSTextFieldCell"; title = "DeSmuME Bug Report Form"; ObjectID = "6421"; */ "6421.title" = "DeSmuME Bug Report Form"; /* Class = "NSTextFieldCell"; title = "Tell us about the ROM."; ObjectID = "6422"; */ "6422.title" = "Tell us about the ROM."; /* Class = "NSTextFieldCell"; title = "If your bug is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.)"; ObjectID = "6423"; */ "6423.title" = "If your bug is related to a specific ROM, enter its name and serial in the fields below. Otherwise, you may leave these fields blank. (It may be easier to load the ROM first, then click Use Currently Loaded ROM to let DeSmuME fill in this information for you.)"; /* Class = "NSTextFieldCell"; title = "ROM Serial:"; ObjectID = "6424"; */ "6424.title" = "ROM Serial:"; /* Class = "NSTextFieldCell"; title = "ROM Name:"; ObjectID = "6425"; */ "6425.title" = "ROM Name:"; /* Class = "NSButtonCell"; title = "Use Currently Loaded ROM"; ObjectID = "6428"; */ "6428.title" = "Use Currently Loaded ROM"; /* Class = "NSButtonCell"; title = "Continue"; ObjectID = "6429"; */ "6429.title" = "Continue"; /* Class = "NSButtonCell"; title = "Go to Tech Support Webpage"; ObjectID = "6434"; */ "6434.title" = "Go to Tech Support Webpage"; /* Class = "NSButtonCell"; title = "Back"; ObjectID = "6435"; */ "6435.title" = "Back"; /* Class = "NSMenuItem"; title = "Submit a Support Request..."; ObjectID = "6451"; */ "6451.title" = "Submit a Support Request..."; /* Class = "NSTextFieldCell"; title = "Please copy-paste the above information into our tech support webpage. This will ensure the fastest response time from us."; ObjectID = "6485"; */ "6485.title" = "Please copy-paste the above information into our tech support webpage. This will ensure the fastest response time from us."; /* Class = "NSButtonCell"; title = "Copy Info to Clipboard"; ObjectID = "6612"; */ "6612.title" = "Copy Info to Clipboard"; /* Class = "NSBox"; title = "OpenGL Options"; ObjectID = "6617"; */ "6617.title" = "OpenGL Options"; /* Class = "NSButton"; gToolTip = "Smooths the edges of 3D objects using multisample antialiasing (MSAA). No CPU usage. However, it requires additional VRAM from your GPU."; ObjectID = "6618"; */ "6618.gToolTip" = "Smooths the edges of 3D objects using multisample antialiasing (MSAA). No CPU usage. However, it requires additional VRAM from your GPU."; /* Class = "NSButtonCell"; title = "Enable Multisample Antialiasing"; ObjectID = "6619"; */ "6619.title" = "Enable Multisample Antialiasing"; /* Class = "NSBox"; title = "OpenGL Options"; ObjectID = "6622"; */ "6622.title" = "OpenGL Options"; /* Class = "NSButton"; gToolTip = "Smooths the edges of 3D objects using multisample antialiasing (MSAA) by default. No CPU usage. However, it requires additional VRAM from your GPU."; ObjectID = "6623"; */ "6623.gToolTip" = "Smooths the edges of 3D objects using multisample antialiasing (MSAA) by default. No CPU usage. However, it requires additional VRAM from your GPU."; /* Class = "NSButtonCell"; title = "Enable Multisample Antialiasing"; ObjectID = "6624"; */ "6624.title" = "Enable Multisample Antialiasing"; /* Class = "NSButton"; gToolTip = "Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance."; ObjectID = "6627"; */ "6627.gToolTip" = "Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance."; /* Class = "NSButtonCell"; title = "Rigorous 3D Rendering Timing"; ObjectID = "6628"; */ "6628.title" = "Rigorous 3D Rendering Timing"; /* Class = "NSButton"; gToolTip = "Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance."; ObjectID = "6630"; */ "6630.gToolTip" = "Makes emulation timing more accurate, but may reduce ROM compatibility. Enabling this setting may improve 3D rendering performance."; /* Class = "NSButtonCell"; title = "Rigorous 3D Rendering Timing"; ObjectID = "6631"; */ "6631.title" = "Rigorous 3D Rendering Timing"; /* Class = "NSMenuItem"; gToolTip = "Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; ObjectID = "6634"; */ "6634.gToolTip" = "Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; /* Class = "NSMenuItem"; title = "8 Threads"; ObjectID = "6634"; */ "6634.title" = "8 Threads"; /* Class = "NSButtonCell"; gToolTip = "Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; ObjectID = "6635"; */ "6635.gToolTip" = "Renders 3D on eight separate threads by default. May improve 3D performance on multiprocessor machines, but greatly reduces performance on single processor machines."; /* Class = "NSButtonCell"; title = "8 Threads"; ObjectID = "6635"; */ "6635.title" = "8 Threads"; /* Class = "NSMenuItem"; title = "New Display Window"; ObjectID = "6931"; */ "6931.title" = "New Display Window"; /* Class = "NSMenuItem"; title = "Close Window"; ObjectID = "6998"; */ "6998.title" = "Close Window"; /* Class = "NSTableColumn"; headerCell.title = "Input Settings Summary"; ObjectID = "7133"; */ "7133.headerCell.title" = "Input Settings Summary"; /* Class = "NSTableColumn"; headerCell.title = "Input Device"; ObjectID = "7136"; */ "7136.headerCell.title" = "Input Device"; /* Class = "NSTableColumn"; headerCell.title = "Set Command"; ObjectID = "7137"; */ "7137.headerCell.title" = "Set Command"; /* Class = "NSButtonCell"; title = "Command"; ObjectID = "7138"; */ "7138.title" = "Command"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7139"; */ "7139.title" = "Text Cell"; /* Class = "NSButtonCell"; title = "Remove"; ObjectID = "7140"; */ "7140.title" = "Remove"; /* Class = "NSButtonCell"; title = "Settings"; ObjectID = "7141"; */ "7141.title" = "Settings"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7142"; */ "7142.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Click this area to map mouse input."; ObjectID = "7169"; */ "7169.title" = "Click this area to map mouse input."; /* Class = "NSWindow"; title = "InputSettingsTouch"; ObjectID = "7171"; */ "7171.title" = "InputSettingsTouch"; /* Class = "NSWindow"; title = "InputSettingsLoadStateSlot"; ObjectID = "7173"; */ "7173.title" = "InputSettingsLoadStateSlot"; /* Class = "NSWindow"; title = "InputSettingsMicrophone"; ObjectID = "7175"; */ "7175.title" = "InputSettingsMicrophone"; /* Class = "NSWindow"; title = "InputSettingsGPUState"; ObjectID = "7179"; */ "7179.title" = "InputSettingsGPUState"; /* Class = "NSBox"; title = "Audio Sample Generators"; ObjectID = "7182"; */ "7182.title" = "Audio Sample Generators"; /* Class = "NSButtonCell"; gToolTip = "Predefined noise samples that simulate sounds like speaking into the microphone. (Some games, such as \"The Legend of Zelda: Spirit Tracks,\" work especially well with this.)"; ObjectID = "7186"; */ "7186.gToolTip" = "Predefined noise samples that simulate sounds like speaking into the microphone. (Some games, such as \"The Legend of Zelda: Spirit Tracks,\" work especially well with this.)"; /* Class = "NSButtonCell"; title = "Internal Noise Samples"; ObjectID = "7186"; */ "7186.title" = "Internal Noise Samples"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "7187"; */ "7187.title" = "Radio"; /* Class = "NSButtonCell"; gToolTip = "Randomly generated white noise that simulates sounds like blowing into the microphone."; ObjectID = "7188"; */ "7188.gToolTip" = "Randomly generated white noise that simulates sounds like blowing into the microphone."; /* Class = "NSButtonCell"; title = "White Noise"; ObjectID = "7188"; */ "7188.title" = "White Noise"; /* Class = "NSButtonCell"; gToolTip = "Generated pure sine wave tone. Can be adjusted for frequency."; ObjectID = "7189"; */ "7189.gToolTip" = "Generated pure sine wave tone. Can be adjusted for frequency."; /* Class = "NSButtonCell"; title = "Sine Wave"; ObjectID = "7189"; */ "7189.title" = "Sine Wave"; /* Class = "NSButtonCell"; gToolTip = "Predefined samples loaded from an audio file. (Whenever the Microphone command is deactivated, sample reading will be reset to the beginning of the file.)"; ObjectID = "7190"; */ "7190.gToolTip" = "Predefined samples loaded from an audio file. (Whenever the Microphone command is deactivated, sample reading will be reset to the beginning of the file.)"; /* Class = "NSButtonCell"; title = "Audio File"; ObjectID = "7190"; */ "7190.title" = "Audio File"; /* Class = "NSTextFieldCell"; placeholderString = "File Name"; ObjectID = "7191"; */ "7191.placeholderString" = "File Name"; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "7192"; */ "7192.title" = "Choose..."; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "7212"; */ "7212.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Slot 1"; ObjectID = "7213"; */ "7213.title" = "Slot 1"; /* Class = "NSMenuItem"; title = "Slot 2"; ObjectID = "7214"; */ "7214.title" = "Slot 2"; /* Class = "NSMenuItem"; title = "Slot 3"; ObjectID = "7215"; */ "7215.title" = "Slot 3"; /* Class = "NSTextFieldCell"; title = "Load State Slot:"; ObjectID = "7217"; */ "7217.title" = "Load State Slot:"; /* Class = "NSMenuItem"; title = "Slot 4"; ObjectID = "7218"; */ "7218.title" = "Slot 4"; /* Class = "NSMenuItem"; title = "Slot 5"; ObjectID = "7219"; */ "7219.title" = "Slot 5"; /* Class = "NSMenuItem"; title = "Slot 6"; ObjectID = "7220"; */ "7220.title" = "Slot 6"; /* Class = "NSMenuItem"; title = "Slot 7"; ObjectID = "7221"; */ "7221.title" = "Slot 7"; /* Class = "NSMenuItem"; title = "Slot 8"; ObjectID = "7222"; */ "7222.title" = "Slot 8"; /* Class = "NSMenuItem"; title = "Slot 9"; ObjectID = "7223"; */ "7223.title" = "Slot 9"; /* Class = "NSMenuItem"; title = "Slot 10"; ObjectID = "7224"; */ "7224.title" = "Slot 10"; /* Class = "NSWindow"; title = "InputSettingsSaveStateSlot"; ObjectID = "7225"; */ "7225.title" = "InputSettingsSaveStateSlot"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "7230"; */ "7230.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Slot 10"; ObjectID = "7231"; */ "7231.title" = "Slot 10"; /* Class = "NSMenuItem"; title = "Slot 9"; ObjectID = "7232"; */ "7232.title" = "Slot 9"; /* Class = "NSMenuItem"; title = "Slot 8"; ObjectID = "7233"; */ "7233.title" = "Slot 8"; /* Class = "NSMenuItem"; title = "Slot 7"; ObjectID = "7234"; */ "7234.title" = "Slot 7"; /* Class = "NSMenuItem"; title = "Slot 6"; ObjectID = "7235"; */ "7235.title" = "Slot 6"; /* Class = "NSMenuItem"; title = "Slot 5"; ObjectID = "7236"; */ "7236.title" = "Slot 5"; /* Class = "NSMenuItem"; title = "Slot 4"; ObjectID = "7237"; */ "7237.title" = "Slot 4"; /* Class = "NSMenuItem"; title = "Slot 3"; ObjectID = "7238"; */ "7238.title" = "Slot 3"; /* Class = "NSMenuItem"; title = "Slot 2"; ObjectID = "7239"; */ "7239.title" = "Slot 2"; /* Class = "NSMenuItem"; title = "Slot 1"; ObjectID = "7240"; */ "7240.title" = "Slot 1"; /* Class = "NSTextFieldCell"; title = "Save State Slot:"; ObjectID = "7241"; */ "7241.title" = "Save State Slot:"; /* Class = "NSBox"; title = "GPU Layers"; ObjectID = "7266"; */ "7266.title" = "GPU Layers"; /* Class = "NSButtonCell"; title = "Main GPU (All Layers)"; ObjectID = "7268"; */ "7268.title" = "Main GPU (All Layers)"; /* Class = "NSButtonCell"; title = "Main BG0"; ObjectID = "7269"; */ "7269.title" = "Main BG0"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "7270"; */ "7270.title" = "Radio"; /* Class = "NSButtonCell"; title = "Sub GPU (All Layers)"; ObjectID = "7271"; */ "7271.title" = "Sub GPU (All Layers)"; /* Class = "NSButtonCell"; title = "Sub BG0"; ObjectID = "7272"; */ "7272.title" = "Sub BG0"; /* Class = "NSButtonCell"; title = "Main BG1"; ObjectID = "7273"; */ "7273.title" = "Main BG1"; /* Class = "NSButtonCell"; title = "Sub BG1"; ObjectID = "7274"; */ "7274.title" = "Sub BG1"; /* Class = "NSButtonCell"; title = "Sub BG2"; ObjectID = "7275"; */ "7275.title" = "Sub BG2"; /* Class = "NSButtonCell"; title = "Main BG2"; ObjectID = "7276"; */ "7276.title" = "Main BG2"; /* Class = "NSButtonCell"; title = "Main BG3"; ObjectID = "7277"; */ "7277.title" = "Main BG3"; /* Class = "NSButtonCell"; title = "Sub BG3"; ObjectID = "7278"; */ "7278.title" = "Sub BG3"; /* Class = "NSButtonCell"; title = "Main OBJ"; ObjectID = "7279"; */ "7279.title" = "Main OBJ"; /* Class = "NSButtonCell"; title = "Sub OBJ"; ObjectID = "7280"; */ "7280.title" = "Sub OBJ"; /* Class = "NSTextFieldCell"; title = "X:"; ObjectID = "7286"; */ "7286.title" = "X:"; /* Class = "NSTextFieldCell"; title = "Y:"; ObjectID = "7292"; */ "7292.title" = "Y:"; /* Class = "NSBox"; title = "User Defined Coordinates"; ObjectID = "7293"; */ "7293.title" = "User Defined Coordinates"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7302"; */ "7302.title" = "OK"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7308"; */ "7308.title" = "OK"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7312"; */ "7312.title" = "OK"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7316"; */ "7316.title" = "OK"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7320"; */ "7320.title" = "OK"; /* Class = "NSButtonCell"; title = "Use user defined coordinates"; ObjectID = "7355"; */ "7355.title" = "Use user defined coordinates"; /* Class = "NSTextFieldCell"; title = "If this setting is disabled, then the Touch command will read the coordinates from the input device instead."; ObjectID = "7359"; */ "7359.title" = "If this setting is disabled, then the Touch command will read the coordinates from the input device instead."; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7393"; */ "7393.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7396"; */ "7396.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7399"; */ "7399.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7402"; */ "7402.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7405"; */ "7405.title" = "Cancel"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7434"; */ "7434.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7437"; */ "7437.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7440"; */ "7440.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7443"; */ "7443.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7446"; */ "7446.placeholderString" = "Device Info Summary"; /* Class = "NSWindow"; title = "InputSettingsSpeedLimit"; ObjectID = "7449"; */ "7449.title" = "InputSettingsSpeedLimit"; /* Class = "NSTextFieldCell"; placeholderString = "Device Info Summary"; ObjectID = "7452"; */ "7452.placeholderString" = "Device Info Summary"; /* Class = "NSTextFieldCell"; placeholderString = "%1.2fx"; ObjectID = "7464"; */ "7464.placeholderString" = "%1.2fx"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "7466"; */ "7466.title" = "Speed limit set to: "; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "7467"; */ "7467.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "7468"; */ "7468.title" = "8x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "7469"; */ "7469.title" = "6x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "7470"; */ "7470.title" = "4x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "7471"; */ "7471.title" = "2x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "7472"; */ "7472.title" = "10x"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "7473"; */ "7473.title" = "0x"; /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "7488"; */ "7488.title" = "Cancel"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7489"; */ "7489.title" = "OK"; /* Class = "NSWindow"; title = "Input Profile"; ObjectID = "7515"; */ "7515.title" = "Input Profile"; /* Class = "NSTableColumn"; headerCell.title = "Input Settings Summary"; ObjectID = "7522"; */ "7522.headerCell.title" = "Input Settings Summary"; /* Class = "NSTableColumn"; headerCell.title = "Input Device"; ObjectID = "7525"; */ "7525.headerCell.title" = "Input Device"; /* Class = "NSTableColumn"; headerCell.title = "Command"; ObjectID = "7526"; */ "7526.headerCell.title" = "Command"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7528"; */ "7528.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7531"; */ "7531.title" = "Text Cell"; /* Class = "NSTextFieldCell"; title = "Text"; ObjectID = "7540"; */ "7540.title" = "Text"; /* Class = "NSTextFieldCell"; title = "Profile Name"; ObjectID = "7542"; */ "7542.title" = "Profile Name"; /* Class = "NSButtonCell"; title = "Close"; ObjectID = "7544"; */ "7544.title" = "Close"; /* Class = "NSButtonCell"; title = "Apply to Current Configuration"; ObjectID = "7552"; */ "7552.title" = "Apply to Current Configuration"; /* Class = "NSButtonCell"; title = "Next"; ObjectID = "7554"; */ "7554.title" = "Next"; /* Class = "NSButtonCell"; title = "Previous"; ObjectID = "7556"; */ "7556.title" = "Previous"; /* Class = "NSButtonCell"; title = "Delete"; ObjectID = "7584"; */ "7584.title" = "Delete"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "7596"; */ "7596.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Actions"; ObjectID = "7597"; */ "7597.title" = "Actions"; /* Class = "NSMenuItem"; gToolTip = "Saves the current configuration to the selected profile."; ObjectID = "7598"; */ "7598.gToolTip" = "Saves the current configuration to the selected profile."; /* Class = "NSMenuItem"; title = "Save"; ObjectID = "7598"; */ "7598.title" = "Save"; /* Class = "NSMenuItem"; gToolTip = "Deletes the selected profile."; ObjectID = "7599"; */ "7599.gToolTip" = "Deletes the selected profile."; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "7599"; */ "7599.title" = "Delete"; /* Class = "NSMenuItem"; gToolTip = "Replaces the current configuration with the selected profile."; ObjectID = "7600"; */ "7600.gToolTip" = "Replaces the current configuration with the selected profile."; /* Class = "NSMenuItem"; title = "Apply"; ObjectID = "7600"; */ "7600.title" = "Apply"; /* Class = "NSMenuItem"; gToolTip = "Renames the selected profile."; ObjectID = "7601"; */ "7601.gToolTip" = "Renames the selected profile."; /* Class = "NSMenuItem"; title = "Rename"; ObjectID = "7601"; */ "7601.title" = "Rename"; /* Class = "NSMenuItem"; gToolTip = "Shows the selected profile."; ObjectID = "7604"; */ "7604.gToolTip" = "Shows the selected profile."; /* Class = "NSMenuItem"; title = "View"; ObjectID = "7604"; */ "7604.title" = "View"; /* Class = "NSMenu"; title = "InputConfigurationMenu"; ObjectID = "7607"; */ "7607.title" = "InputConfigurationMenu"; /* Class = "NSMenuItem"; gToolTip = "Creates a new profile using the current configuration."; ObjectID = "7610"; */ "7610.gToolTip" = "Creates a new profile using the current configuration."; /* Class = "NSMenuItem"; title = "New..."; ObjectID = "7610"; */ "7610.title" = "New..."; /* Class = "NSTextFieldCell"; title = "Saved Profiles:"; ObjectID = "7625"; */ "7625.title" = "Saved Profiles:"; /* Class = "NSWindow"; title = "Input Profile Rename"; ObjectID = "7707"; */ "7707.title" = "Input Profile Rename"; /* Class = "NSButtonCell"; title = "OK"; ObjectID = "7726"; */ "7726.title" = "OK"; /* Class = "NSTextFieldCell"; title = "Enter a new name for this profile:"; ObjectID = "7730"; */ "7730.title" = "Enter a new name for this profile:"; /* Class = "NSTextFieldCell"; placeholderString = "%1.1f Hz"; ObjectID = "7762"; */ "7762.placeholderString" = "%1.1f Hz"; /* Class = "NSButtonCell"; title = "Choose None"; ObjectID = "7767"; */ "7767.title" = "Choose None"; /* Class = "NSMenuItem"; title = "Display Separation"; ObjectID = "7771"; */ "7771.title" = "Display Separation"; /* Class = "NSMenu"; title = "Display Separation"; ObjectID = "7772"; */ "7772.title" = "Display Separation"; /* Class = "NSMenuItem"; title = "0%"; ObjectID = "7773"; */ "7773.title" = "0%"; /* Class = "NSMenuItem"; title = "50%"; ObjectID = "7774"; */ "7774.title" = "50%"; /* Class = "NSMenuItem"; title = "100%"; ObjectID = "7775"; */ "7775.title" = "100%"; /* Class = "NSMenuItem"; title = "150%"; ObjectID = "7776"; */ "7776.title" = "150%"; /* Class = "NSMenuItem"; title = "200%"; ObjectID = "7777"; */ "7777.title" = "200%"; /* Class = "NSMenuItem"; title = "Custom..."; ObjectID = "7779"; */ "7779.title" = "Custom..."; /* Class = "NSTextFieldCell"; title = "Display Separation:"; ObjectID = "7781"; */ "7781.title" = "Display Separation:"; /* Class = "NSTextField"; gToolTip = "The default separation for new DS display views. A custom gap percentage may be entered here. (The gap percentage must be between 0% and 200%.)"; ObjectID = "7792"; */ "7792.gToolTip" = "The default separation for new DS display views. A custom gap percentage may be entered here. (The gap percentage must be between 0% and 200%.)"; /* Class = "NSTextFieldCell"; title = "0%"; ObjectID = "7793"; */ "7793.title" = "0%"; /* Class = "NSSlider"; gToolTip = "Sets the default screen separation for new DS display views. (A value of 100% will create a gap between the screens that has the same relative distance as a hardware DS.)"; ObjectID = "7802"; */ "7802.gToolTip" = "Sets the default screen separation for new DS display views. (A value of 100% will create a gap between the screens that has the same relative distance as a hardware DS.)"; /* Class = "NSTextFieldCell"; title = "200%"; ObjectID = "7805"; */ "7805.title" = "200%"; /* Class = "NSTextFieldCell"; title = "150%"; ObjectID = "7807"; */ "7807.title" = "150%"; /* Class = "NSTextFieldCell"; title = "100%"; ObjectID = "7809"; */ "7809.title" = "100%"; /* Class = "NSTextFieldCell"; title = "50%"; ObjectID = "7811"; */ "7811.title" = "50%"; /* Class = "NSTextFieldCell"; title = "0%"; ObjectID = "7813"; */ "7813.title" = "0%"; /* Class = "NSPanel"; title = "Set Separation"; ObjectID = "7817"; */ "7817.title" = "Set Separation"; /* Class = "NSTextFieldCell"; title = "0%"; ObjectID = "7826"; */ "7826.title" = "0%"; /* Class = "NSTextFieldCell"; title = "50%"; ObjectID = "7827"; */ "7827.title" = "50%"; /* Class = "NSTextFieldCell"; title = "100%"; ObjectID = "7828"; */ "7828.title" = "100%"; /* Class = "NSTextFieldCell"; title = "150%"; ObjectID = "7829"; */ "7829.title" = "150%"; /* Class = "NSTextFieldCell"; title = "200%"; ObjectID = "7830"; */ "7830.title" = "200%"; /* Class = "NSTextFieldCell"; title = "Gap Percentage:"; ObjectID = "7837"; */ "7837.title" = "Gap Percentage:"; /* Class = "NSTextFieldCell"; placeholderString = "1.1f%"; ObjectID = "7839"; */ "7839.placeholderString" = "1.1f%"; /* Class = "NSButton"; gToolTip = "Sets the screen separation to 0%, which removes any gap between the screens."; ObjectID = "7843"; */ "7843.gToolTip" = "Sets the screen separation to 0%, which removes any gap between the screens."; /* Class = "NSButtonCell"; title = "Set to 0%"; ObjectID = "7844"; */ "7844.title" = "Set to 0%"; /* Class = "NSButton"; gToolTip = "Sets the screen separation to 100%, which creates a gap between the screens that has the same relative distance as a hardware DS."; ObjectID = "7845"; */ "7845.gToolTip" = "Sets the screen separation to 100%, which creates a gap between the screens that has the same relative distance as a hardware DS."; /* Class = "NSButtonCell"; title = "Set to 100%"; ObjectID = "7846"; */ "7846.title" = "Set to 100%"; /* Class = "NSButtonCell"; title = "Save Settings as Default"; ObjectID = "7848"; */ "7848.title" = "Save Settings as Default"; /* Class = "NSWindow"; title = "SLOT-1 Manager"; ObjectID = "7855"; */ "7855.title" = "SLOT-1 Manager"; /* Class = "NSButtonCell"; title = "None"; ObjectID = "7858"; */ "7858.title" = "None"; /* Class = "NSButtonCell"; title = "Retail"; ObjectID = "7859"; */ "7859.title" = "Retail"; /* Class = "NSButtonCell"; title = "Radio"; ObjectID = "7860"; */ "7860.title" = "Radio"; /* Class = "NSButtonCell"; title = "Retail with NAND Flash"; ObjectID = "7861"; */ "7861.title" = "Retail with NAND Flash"; /* Class = "NSButtonCell"; title = "R4"; ObjectID = "7862"; */ "7862.title" = "R4"; /* Class = "NSTextFieldCell"; placeholderString = "Directory Path"; ObjectID = "7864"; */ "7864.placeholderString" = "Directory Path"; /* Class = "NSButton"; gToolTip = "Choose a directory where the R4 device stores its data."; ObjectID = "7866"; */ "7866.gToolTip" = "Choose a directory where the R4 device stores its data."; /* Class = "NSButtonCell"; title = "Choose..."; ObjectID = "7867"; */ "7867.title" = "Choose..."; /* Class = "NSButton"; gToolTip = "Sends a SLOT-1 eject IRQ. The emulator will then detect that no device is inserted into SLOT-1."; ObjectID = "7871"; */ "7871.gToolTip" = "Sends a SLOT-1 eject IRQ. The emulator will then detect that no device is inserted into SLOT-1."; /* Class = "NSButtonCell"; title = "Eject SLOT-1 Device"; ObjectID = "7872"; */ "7872.title" = "Eject SLOT-1 Device"; /* Class = "NSButton"; gToolTip = "Resets the emulation."; ObjectID = "7873"; */ "7873.gToolTip" = "Resets the emulation."; /* Class = "NSButtonCell"; title = "Reset"; ObjectID = "7874"; */ "7874.title" = "Reset"; /* Class = "NSTextFieldCell"; title = "Note: Changes to the SLOT-1 device will only take effect after a ROM is loaded or after the emulator is reset."; ObjectID = "7876"; */ "7876.title" = "Note: Changes to the SLOT-1 device will only take effect after a ROM is loaded or after the emulator is reset."; /* Class = "NSTextFieldCell"; title = "SLOT-1 Status:"; ObjectID = "7878"; */ "7878.title" = "SLOT-1 Status:"; /* Class = "NSBox"; title = "Box"; ObjectID = "7879"; */ "7879.title" = "Box"; /* Class = "NSTextFieldCell"; placeholderString = "slot1StatusText"; ObjectID = "7881"; */ "7881.placeholderString" = "slot1StatusText"; /* Class = "NSMenuItem"; title = "Show SLOT-1 Manager..."; ObjectID = "7886"; */ "7886.title" = "Show SLOT-1 Manager..."; /* Class = "NSBox"; title = "SLOT-1 Device Type"; ObjectID = "7899"; */ "7899.title" = "SLOT-1 Device Type"; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "7973"; */ "7973.title" = "Name:\nSerial:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "7989"; */ "7989.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "Actions"; ObjectID = "7993"; */ "7993.title" = "Actions"; /* Class = "NSMenuItem"; title = "Load ROM& "; ObjectID = "7994"; */ "7994.title" = "Load ROM& "; /* Class = "NSMenuItem"; title = "Load Recent ROM"; ObjectID = "7995"; */ "7995.title" = "Load Recent ROM"; /* Class = "NSMenuItem"; title = "Unload ROM"; ObjectID = "7996"; */ "7996.title" = "Unload ROM"; /* Class = "NSMenu"; title = "Load Recent ROM"; ObjectID = "7997"; */ "7997.title" = "Load Recent ROM"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "7998"; */ "7998.title" = "Clear Menu"; /* Class = "NSBox"; title = "Current ROM"; ObjectID = "8009"; */ "8009.title" = "Current ROM"; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "8015"; */ "8015.title" = "Name:\nSerial:"; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "8024"; */ "8024.title" = "Name:\nSerial:"; /* Class = "NSTextFieldCell"; title = "Name:\nSerial:"; ObjectID = "8033"; */ "8033.title" = "Name:\nSerial:"; /* Class = "NSTextField"; gToolTip = "Changes the maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.)"; ObjectID = "8045"; */ "8045.gToolTip" = "Changes the maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.)"; /* Class = "NSTextFieldCell"; title = "12"; ObjectID = "8046"; */ "8046.title" = "12"; /* Class = "NSTextFieldCell"; title = "Block Size:"; ObjectID = "8049"; */ "8049.title" = "Block Size:"; /* Class = "NSTextFieldCell"; title = "Block Size:"; ObjectID = "8057"; */ "8057.title" = "Block Size:"; /* Class = "NSTextField"; gToolTip = "Changes the default maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.)"; ObjectID = "8058"; */ "8058.gToolTip" = "Changes the default maximum instruction block size for the dynamic recompiler. Larger values improve performance, but may reduce emulation accuracy. (The block size must be between 1 and 100.)"; /* Class = "NSTextFieldCell"; title = "12"; ObjectID = "8059"; */ "8059.title" = "12"; /* Class = "NSButtonCell"; title = "Select None"; ObjectID = "8077"; */ "8077.title" = "Select None"; /* Class = "NSButtonCell"; title = "Select All"; ObjectID = "8078"; */ "8078.title" = "Select All"; /* Class = "NSPanel"; title = "GPU Layers"; ObjectID = "8134"; */ "8134.title" = "GPU Layers"; /* Class = "NSButtonCell"; title = "GPU (All Layers)"; ObjectID = "8137"; */ "8137.title" = "GPU (All Layers)"; /* Class = "NSButtonCell"; title = "BG0"; ObjectID = "8139"; */ "8139.title" = "BG0"; /* Class = "NSButtonCell"; title = "BG1"; ObjectID = "8141"; */ "8141.title" = "BG1"; /* Class = "NSButtonCell"; title = "BG2"; ObjectID = "8143"; */ "8143.title" = "BG2"; /* Class = "NSButtonCell"; title = "BG3"; ObjectID = "8145"; */ "8145.title" = "BG3"; /* Class = "NSButtonCell"; title = "OBJ"; ObjectID = "8147"; */ "8147.title" = "OBJ"; /* Class = "NSButtonCell"; title = "GPU (All Layers)"; ObjectID = "8149"; */ "8149.title" = "GPU (All Layers)"; /* Class = "NSButtonCell"; title = "BG0"; ObjectID = "8151"; */ "8151.title" = "BG0"; /* Class = "NSButtonCell"; title = "BG1"; ObjectID = "8153"; */ "8153.title" = "BG1"; /* Class = "NSButtonCell"; title = "BG2"; ObjectID = "8155"; */ "8155.title" = "BG2"; /* Class = "NSButtonCell"; title = "BG3"; ObjectID = "8157"; */ "8157.title" = "BG3"; /* Class = "NSButtonCell"; title = "OBJ"; ObjectID = "8159"; */ "8159.title" = "OBJ"; /* Class = "NSBox"; title = "Main"; ObjectID = "8160"; */ "8160.title" = "Main"; /* Class = "NSBox"; title = "Sub"; ObjectID = "8161"; */ "8161.title" = "Sub"; /* Class = "NSMenuItem"; title = "Show GPU Layers..."; ObjectID = "8162"; */ "8162.title" = "Show GPU Layers..."; /* Class = "NSMenuItem"; title = "Reveal ROM in Finder"; ObjectID = "8164"; */ "8164.title" = "Reveal ROM in Finder"; /* Class = "NSTabViewItem"; label = "General Settings"; ObjectID = "8182"; */ "8182.label" = "General Settings"; /* Class = "NSTabViewItem"; label = "BIOS and Firmware"; ObjectID = "8183"; */ "8183.label" = "BIOS and Firmware"; /* Class = "NSMenuItem"; title = "5x"; ObjectID = "8186"; */ "8186.title" = "5x"; desmume-0.9.9/src/cocoa/translations/English.lproj/HID_usage_strings.plist0000644000175000017500000012524412140261574027464 0ustar guillaumeguillaume 0x0001 0x0000 Undefined Usage 0x0001 Pointer 0x0002 Mouse 0x0004 Joystick 0x0005 GamePad 0x0006 Keyboard 0x0007 Keypad 0x0008 MultiAxisController 0x0030 X 0x0031 Y 0x0032 Z 0x0033 Rx 0x0034 Ry 0x0035 Rz 0x0036 Slider 0x0037 Dial 0x0038 Wheel 0x0039 Hatswitch 0x003A Counted Buffer 0x003B Byte Count 0x003C Motion Wakeup 0x003D Start 0x003E Select 0x0040 Vx 0x0041 Vy 0x0042 Vz 0x0043 Vbrx 0x0044 Vbry 0x0045 Vbrz 0x0046 Vno 0x0080 System Control 0x0081 System Power Down 0x0082 System Sleep 0x0083 System Wake Up 0x0084 SystemContext Menu 0x0085 System Main Menu 0x0086 System App Menu 0x0087 System Menu help 0x0088 System Menu Exit 0x0089 System Menu 0x008A System Menu Right 0x008B System Menu Left 0x008C System Menu Up 0x008D System Menu Down 0x0090 DPad Up 0x0091 DPad Down 0x0092 DPad Right 0x0093 DPad Left Name Generic Desktop 0x0002 0x0000 Undefined Usage 0x0001 Flight Simulation Device 0x0002 Automobile Simulation Device 0x0003 Tank Simulation Device 0x0004 Spaceship Simulation Device 0x0005 Submarine Simulation Device 0x0006 Sailing Simulation Device 0x0007 Motorcycle Simulation Device 0x0008 Sports Simulation Device 0x0009 Airplane Simulation Device 0x000A Helicopter Simulation Device 0x000B Magic Carpet Simulation Device 0x000C Bicycle Simulation Device 0x0020 Flight Control Stick 0x0021 Flight Stick 0x0022 Cyclic Control 0x0023 Cyclic Trim 0x0024 Flight Yoke 0x0025 Track Control 0x00B0 Aileron 0x00B1 Aileron Trim 0x00B2 Anti Torque Control 0x00B5 Collective Control 0x00B6 Dive Brake 0x00B7 Electronic Countermeasures 0x00B8 Elevator 0x00B9 Elevator Trim 0x00BA Rudder 0x00BB Throttle 0x00BC Flight Communications 0x00BD Flare Release 0x00BE Landing Gear 0x00BF Toe Brake 0x00C0 Trigger 0x00C1 Weapons Arm 0x00C2 Weapons 0x00C3 Wing Flaps 0x00C4 Accelerator 0x00C5 Brake 0x00C6 Clutch 0x00C7 Shifter 0x00C8 Steering 0x00C9 Turret Direction 0x00CA Barrel Elevation 0x00CB Dive Plane 0x00CC Ballast 0x00CD Bicycle Crank 0x00CE Handle Bars 0x00CF Front Brake 0x00D0 Rear Brake Name Simulation 0x0003 0x0000 Undefined Usage 0x0001 Belt 0x0002 Body Suit 0x0003 Flexor 0x0004 Glove 0x0005 Head Tracker 0x0006 Head Mounted Display 0x0007 Hand Tracker 0x0008 Oculometer 0x0009 Vest 0x000A Animatronic Device 0x0020 Stereo Enable 0x0021 Display Enable Name Virtual Reality 0x0004 0x0000 Undefined Usage 0x0001 Baseball Bat 0x0002 Golf Club 0x0003 Rowing Machine 0x0004 Treadmill 0x0030 Oar 0x0031 Slope 0x0032 Rate 0x0033 Stick Speed 0x0034 Stick Face Angle 0x0035 Stick Heel Or Toe 0x0036 Stick Follow Through 0x0037 Stick Tempo 0x0038 Stick Type 0x0039 Stick Height 0x0050 Putter 0x0051 1 Iron 0x0052 2 Iron 0x0053 3 Iron 0x0054 4 Iron 0x0055 5 Iron 0x0056 6 Iron 0x0057 7 Iron 0x0058 8 Iron 0x0059 9 Iron 0x005A 10 Iron 0x005B 11 Iron 0x005C Sand Wedge 0x005D Loft Wedge 0x005E Power Wedge 0x005F 1 Wood 0x0060 3 Wood 0x0061 5 Wood 0x0062 7 Wood 0x0063 9 Wood Name Sport 0x0005 0x0000 Undefined Usage 0x0001 3D Game Controller 0x0002 Pinball Device 0x0003 Gun 0x0020 Point of View 0x0021 Turn Right Or Left 0x0022 Pitch Up Or Down 0x0023 Roll Right Or Left 0x0024 Move Right Or Left 0x0025 Move Forward Or Backward 0x0026 Move Up Or Down 0x0027 Lean Right Or Left 0x0029 Height Of POV 0x002A Flipper 0x002B Secondary Flipper 0x002C Bump 0x002D New Game 0x002E Shoot Ball 0x002F Player 0x0030 Gun Bolt 0x0031 Gun Clip 0x0032 Gun 0x0033 Gun Single Shot 0x0034 Gun Burst 0x0035 Gun Automatic 0x0036 Gun Safety 0x0037 Gamepad Fire Or Jump 0x0039 Gamepad Trigger Name Game 0x0007 0x0000 Undefined Usage 0x0001 Error Roll Over 0x0002 POST Fail 0x0003 Error Undefined 0x0004 A 0x0005 B 0x0006 C 0x0007 D 0x0008 E 0x0009 F 0x000A G 0x000B H 0x000C I 0x000D J 0x000E K 0x000F L 0x0010 M 0x0011 N 0x0012 O 0x0013 P 0x0014 Q 0x0015 R 0x0016 S 0x0017 T 0x0018 U 0x0019 V 0x001A W 0x001B X 0x001C Y 0x001D Z 0x001E 1 0x001F 2 0x0020 3 0x0021 4 0x0022 5 0x0023 6 0x0024 7 0x0025 8 0x0026 9 0x0027 0 0x0028 Return 0x0029 Escape 0x002A Delete 0x002B Tab 0x002C Spacebar 0x002D Dash 0x002E Equal 0x002F Left Square Bracket 0x0030 Right Square Bracket 0x0031 Slash 0x0032 Non-US # 0x0033 Semi-Colan 0x0034 Single Quote 0x0035 Grave Accent 0x0036 Comma 0x0037 Period 0x0038 Slash 0x0039 Caps Lock 0x003A F1 0x003B F2 0x003C F3 0x003D F4 0x003E F5 0x003F F6 0x0040 F7 0x0041 F8 0x0042 F9 0x0043 F10 0x0044 F11 0x0045 F12 0x0046 Print Screen 0x0047 Scroll Lock 0x0048 Pause 0x0049 Insert 0x004A Home 0x004B Page Up 0x004C Delete Forward 0x004D End 0x004E Page Down 0x004F Right Arrow 0x0050 Left Arrow 0x0051 Down Arrow 0x0052 Up Arrow 0x0053 Keypad NumLock 0x0054 Keypad Slash 0x0055 Keypad Asterisk 0x0056 Keypad Dash 0x0057 Keypad Plus 0x0058 Keypad Enter 0x0059 Keypad 1 0x005A Keypad 2 0x005B Keypad 3 0x005C Keypad 4 0x005D Keypad 5 0x005E Keypad 6 0x005F Keypad 7 0x0060 Keypad 8 0x0061 Keypad 9 0x0062 Keypad 0 0x0063 Keypad Period 0x0064 Non-US Backslash 0x0065 Application 0x0066 Power 0x0067 Keypad Equal 0x0068 F13 0x0069 F14 0x006A F15 0x006B F16 0x006C F17 0x006D F18 0x006E F19 0x006F F20 0x0070 F21 0x0071 F22 0x0072 F23 0x0073 F24 0x0074 Execute 0x0075 Help 0x0076 Menu 0x0077 Select 0x0078 Stop 0x0079 Again 0x007A Undo 0x007B Cut 0x007C Copy 0x007D Paste 0x007E Find 0x007F Mute 0x0080 Volume Up 0x0081 Volume Down 0x0082 Locking Caps Lock 0x0083 Locking Num Lock 0x0084 Locking Scroll Lock 0x0085 Keypad Comma 0x0086 Keypad Equal Sign for AS-400 0x0087 International1 0x0088 International2 0x0089 International3 0x008A International4 0x008B International5 0x008C International6 0x008D International7 0x008E International8 0x008F International9 0x0090 LANG1 0x0091 LANG2 0x0092 LANG3 0x0093 LANG4 0x0094 LANG5 0x0095 LANG6 0x0096 LANG7 0x0097 LANG8 0x0098 LANG9 0x0099 Alternate Erase 0x009A SysReq or Attention 0x009B Cancel 0x009C Clear 0x009D Prior 0x009E Return 0x009F Separator 0x00A0 Out 0x00A1 Oper 0x00A2 Clear or Again 0x00A3 CrSel or Props 0x00A4 ExSel 0x00E0 Left Control 0x00E1 Left Shift 0x00E2 Left Alt 0x00E3 Left GUI 0x00E4 Right Control 0x00E5 Right Shift 0x00E6 Right Alt 0x00E7 Right GUI Name Keyboard or Keypad 0x0008 0x0000 Undefined Usage 0x0001 Num Lock 0x0002 Caps Lock 0x0003 Scroll Lock 0x0004 Compose 0x0005 Kana 0x0006 Power 0x0007 Shift 0x0008 DoNotDisturb 0x0009 Mute 0x000A Tone Enable 0x000B High Cut Filter 0x000C Low Cut Filter 0x000D Equalizer Enable 0x000E Sound Field On 0x000F Surround On 0x0010 Repeat 0x0011 Stereo 0x0012 Sampling Rate Detect 0x0013 Spinning 0x0014 CAV 0x0015 CLV 0x0016 Recording Format Detect 0x0017 Off Hook 0x0018 Ring 0x0019 Message Waiting 0x001A Data Mode 0x001B Battery Operation 0x001C Battery OK 0x001D Battery Low 0x001E Speaker 0x001F Headset 0x0020 Hold 0x0021 Microphone 0x0022 Coverage 0x0023 Night Mode 0x0024 Send Calls 0x0025 Call Pickup 0x0026 Conference 0x0027 Stand By 0x0028 Camera On 0x0029 Camera Off 0x002A On Line 0x002B Off Line 0x002C Busy 0x002D Ready 0x002E Paper Out 0x002F Paper Jam 0x0030 Remote 0x0031 Forward 0x0032 Reverse 0x0033 Stop 0x0034 Rewind 0x0035 Fast Forward 0x0036 Play 0x0037 Pause 0x0038 Record 0x0039 Error 0x003A Usage 0x003B Usage In Use Indicator 0x003C Usage Multi Mode indicator 0x003D Indicator On 0x003E Indicator Flash 0x003F Indicator Slow Blink 0x0040 Indicator Fast Blink 0x0041 Indicator Off 0x0042 Flash On Time 0x0043 Slow Blink On Time 0x0044 Slow Blink Off Time 0x0045 Fast Blink On Time 0x0046 Fast Blink Off Time 0x0047 Usage Indicator Color 0x0048 Indicator Red 0x0049 Indicator Green 0x004A Indicator Amber 0x004B Generic Indicator 0x004C System Suspend 0x004D External Power Connected Name LED 0x0009 Name Button 0x000C 0x0000 Undefined Usage 0x0001 Consumer Control 0x0002 Numeric KeyPad 0x0003 Programmable Buttons 0x0020 Plus 10 0x0021 Plus 100 0x0022 AM Or PM 0x0030 Power 0x0031 Reset 0x0032 Sleep 0x0033 Sleep After 0x0034 Sleep Mode 0x0035 Illumination 0x0036 Function Buttons 0x0040 Menu 0x0041 Menu Pick 0x0042 Menu Up 0x0043 Menu Down 0x0044 Menu Left 0x0045 Menu Right 0x0046 Menu Escape 0x0047 Menu Value Increase 0x0048 Menu Value Decrease 0x0060 Data On Screen 0x0061 Closed Caption 0x0062 Closed Caption Select 0x0063 VCR Or TV 0x0064 Broadcast Mode 0x0065 Snapshot 0x0066 Still 0x0080 Selection 0x0081 Assign 0x0082 Mode Step 0x0083 Recall Last 0x0084 Enter Channel 0x0085 Order Movie 0x0086 Channel 0x0087 Media Selection 0x0088 Media Select Computer 0x0089 Media Select TV 0x008A Media Select WWW 0x008B Media Select DVD 0x008E Media Select Video Phone 0x008F Media Select Games 0x0090 Media Select Messages 0x0091 Media Select CD 0x0092 Media Select VCR 0x0093 Media Select Tuner 0x0094 Quit 0x0095 Help 0x0096 Media Select Tape 0x0097 Media Select Cable 0x0098 Media Select Satellite 0x0099 Media Select Security 0x009A Media Select Home 0x009B Media Select Call 0x009C Channel Increment 0x009D Channel Decrement 0x009E Media 0x00A0 VCR Plus 0x00A1 Once 0x00A2 Daily 0x00A3 Weekly 0x00A4 Monthly 0x00B0 Play 0x00B1 Pause 0x00B2 Record 0x00B3 Fast Forward 0x00B4 Rewind 0x00B5 Scan Next Track 0x00B6 Scan Previous Track 0x00B7 Stop 0x00B8 Eject 0x00B9 Random Play 0x00BA Select Disc 0x00BB Enter Disc 0x00BC Repeat 0x00BD Tracking 0x00BE Track Normal 0x00BF Slow Tracking 0x00C0 Frame Forward 0x00C1 Frame Back 0x00C2 Mark 0x00C3 Clear Mark 0x00C4 Repeat From Mark 0x00C5 Return To Mark 0x00C6 Search Mark Forward 0x00C7 Search Mark Backwards 0x00C8 Counter Reset 0x00C9 Show Counter 0x00CA Tracking Increment 0x00CB Tracking Decrement 0x00CC Stop Or Eject 0x00CD Play Or Pause 0x00CE Play Or Skip 0x00E0 Volume 0x00E1 Balance 0x00E2 Mute 0x00E3 Bass 0x00E4 Treble 0x00E5 Bass Boost 0x00E6 Surround Mode 0x00E7 Loudness 0x00E8 MPX 0x00E9 Volume Increment 0x00EA Volume Decrement 0x00F0 Speed 0x00F1 Playback Speed 0x00F2 Standard Play 0x00F3 Long Play 0x00F4 Extended Play 0x00F5 Slow 0x0100 Fan Enable 0x0101 Fan Speed 0x0102 Light Enable 0x0103 Light Illumination Level 0x0104 Climate Control Enable 0x0105 Room Temperature 0x0106 Security Enable 0x0107 Fire Alarm 0x0108 Police Alarm 0x0150 Balance Right 0x0151 Balance Left 0x0152 Bass Increment 0x0153 Bass Decrement 0x0154 Treble Increment 0x0155 Treble Decrement 0x0160 Speaker System 0x0161 Channel Left 0x0162 Channel Right 0x0164 Channel Front 0x0165 Channel Center Front 0x0166 Channel Side 0x0167 Channel Surround 0x0168 Channel Low Frequency Enhancement 0x0169 Channel Top 0x016A Channel Unknown 0x0170 Sub Channel 0x0171 Sub Channel Increment 0x0172 Sub Channel Decrement 0x0173 Alternate Audio Increment 0x0174 Alternate Audio Decrement 0x0180 Application Launch Buttons 0x0181 AL Launch Button Configuration Tool 0x0182 AL Programmable Button Configuration 0x0183 AL Consumer Control Configuration 0x0184 AL Word Processor 0x0185 AL Text Editor 0x0186 AL Spreadsheet 0x0187 AL Graphics Editor 0x0188 AL Presentation App 0x0189 AL Database App 0x018A AL Email Reader 0x018B AL Newsreader 0x018C AL Voicemail 0x018D AL Contacts Or AddressBook 0x018E AL Calendar Or Schedule 0x018F AL Task Or Project Manager 0x0190 AL Log Or Journal Or Timecard 0x0191 AL Checkbook Or Finance 0x0192 AL Calculator 0x0193 AL A Or V Capture Or Playback 0x0194 AL Local Machine Browser 0x0195 AL LAN Or WAN Browser 0x0196 AL Internet Browser 0x0197 AL Remote Networking Or ISP Connect 0x0198 AL Network Conference 0x0199 AL Network Chat 0x019A AL Telephony Or Dialer 0x019B AL Logon 0x019C AL Logoff 0x019D AL Logon Or Logoff 0x019E AL Terminal Lock Or Screensaver 0x019F AL Control Panel 0x01A0 AL Command Line Processor Or Run 0x01A1 AL Process Or Task Manager 0x01A2 AL 0x01A3 AL Next Task Or Application 0x01A4 AL Previous Task Or Application 0x01A5 AL Preemptive Halt Task Or Application 0x0200 Generic GUI Application Controls 0x0201 AC New 0x0202 AC Open 0x0203 AC Close 0x0204 AC Exit 0x0205 AC Maximize 0x0206 AC Minimize 0x0207 AC Save 0x0208 AC Print 0x0209 AC Properties 0x021A AC Undo 0x021B AC Copy 0x021C AC Cut 0x021D AC Paste 0x021E AC 0x021F AC Find 0x0220 AC Find and Replace 0x0221 AC Search 0x0222 AC Go To 0x0223 AC Home 0x0224 AC Back 0x0225 AC Forward 0x0226 AC Stop 0x0227 AC Refresh 0x0228 AC Previous Link 0x0229 AC Next Link 0x022A AC Bookmarks 0x022B AC History 0x022C AC Subscriptions 0x022D AC Zoom In 0x022E AC Zoom Out 0x022F AC Zoom 0x0230 AC Full Screen View 0x0231 AC Normal View 0x0232 AC View Toggle 0x0233 AC Scroll Up 0x0234 AC Scroll Down 0x0235 AC Scroll 0x0236 AC Pan Left 0x0237 AC Pan Right 0x0238 AC Pan 0x0239 AC New Window 0x023A AC Tile Horizontally 0x023B AC Tile Vertically 0x023C AC Format Name Consumer 0x0084 0x0000 Undefined Usage 0x0001 Name Index 0x0002 Present Status 0x0003 Changed Status 0x0004 Uninterruptible Power Supply 0x0005 Power Supply 0x0010 Battery System power module 0x0011 Battery System ID 0x0012 Battery 0x0013 Battery ID 0x0014 Charger 0x0015 Charger ID 0x0016 Power Converter power module 0x0017 Power Converter ID 0x0018 Outlet System power module 0x0019 Outlet System ID 0x001A Input 0x001B Input ID 0x001C Output 0x001D Output ID 0x001E Flow 0x001F Flow ID 0x0020 Outlet 0x0021 Outlet ID 0x0022 Gang 0x0023 Gang ID 0x0024 Power Summary 0x0025 Power Summary ID 0x0030 Voltage 0x0031 Current 0x0032 Frequency 0x0033 Apparent Power 0x0034 RMS Power 0x0035 Percent Load 0x0036 Temperature 0x0037 Humidity 0x0038 Bad Condition Count 0x0040 Nominal Voltage 0x0041 Nominal Current 0x0042 Nominal Frequency 0x0043 Nominal Apparent Power 0x0044 Nominal RMS Power 0x0045 Nominal Percent Load 0x0046 Nominal Temperature 0x0047 Nominal Humidity 0x0050 Switch On Control 0x0051 Switch Off Control 0x0052 Toogle Sequence Control 0x0053 Min Transfer Voltage 0x0054 Max Transfer Voltage 0x0055 Delay Before Reboot 0x0056 Delay Before Startup 0x0057 Delay Before Shutdown 0x0058 Test Request/Result 0x0059 Reset Request/Result 0x005A Audible Alarm Control 0x0060 Present 0x0061 Good 0x0062 Internal Failure 0x0063 Voltage Out Of Range 0x0064 Frequency Out Of Range 0x0065 Overload 0x0066 Over Charged 0x0067 Over Temperature 0x0068 Shutdown Requested 0x0069 Shutdown Imminent 0x006B On/Off Switch Status 0x006C Switchable 0x006D Used 0x006E Boosted 0x006F Bucked 0x0070 Initialized 0x0071 Tested 0x0072 Awaiting Power 0x0073 Communication Lost 0x00FD Manufacturer String Index 0x00FE Product String Index 0x00FF Serial Number String Index Name Power Device Page 0x0085 0x0000 Undefined Usage 0x0001 Mode 0x0002 Status 0x0003 Alarm Warning 0x0004 Charger Mode 0x0005 Charger Status 0x0006 Charger Extended Status 0x0007 Selector State 0x0008 Selector Presets 0x0009 Selector Info 0x0010 Mfg Function 1 0x0011 Mfg Function 2 0x0012 Mfg Function 3 0x0013 Mfg Function 4 0x0014 Mfg Function 5 0x0015 Connection To System Management Bus 0x0016 Output Connection Status 0x0017 Charger Connection 0x0018 Battery Insertion 0x0019 Use Next 0x001A OK To Use 0x001B Battery Supported 0x001C Selector Revision 0x001D Charging Indicator 0x0028 Manufacturer Access 0x0029 Remaining Capacity Limit 0x002A Remaining Time Limit 0x002B At Rate... 0x002C Capacity Mode 0x002D Broadcast To Charger 0x002E Primary Battery 0x002F Charge Controller 0x0040 Terminate Charge 0x0041 Terminate Discharge 0x0042 Below Remaining Capacity Limit 0x0043 Remaining Time Limit Expired 0x0044 Charging 0x0045 Discharging 0x0046 Fully Charged 0x0047 Fully Discharged 0x0048 Conditioning Flag 0x0049 At Rate OK 0x004A SMB Error Code 0x004B Need Replacement 0x0060 At Rate Time To Full 0x0061 At Rate Time To Empty 0x0062 Average Current 0x0063 Max Error 0x0065 Absolute State Of Charge 0x0066 Remaining Capacity 0x0067 Full Charge Capacity 0x0068 Run Time To Empty 0x0069 Average Time To Empty 0x006A Average Time To Full 0x006B Cycle Count 0x0080 Batt Pack Model Level 0x0081 Internal Charge Controller 0x0082 Primary Battery Support 0x0083 Design Capacity 0x0084 Specification Info 0x0085 Manufacturer Date 0x0086 Serial Number 0x0087 Manufacturer Name Index 0x0088 Device Name Index 0x0089 Device Chemistry Index 0x008A Manufacturer Data 0x008B Rechargable 0x008C Warning Capacity Limit 0x008D Capacity Granularity 1 0x008E Capacity Granularity 2 0x008F OEM Information Index 0x00C0 Inhibit Charge 0x00C1 Enable Polling 0x00C2 Reset To Zero 0x00D0 AC Present 0x00D1 Battery Present 0x00D2 Power Fail 0x00D3 Alarm Inhibited 0x00D4 Thermistor Under Range 0x00D5 Thermistor Hot 0x00D6 Thermistor Cold 0x00D7 Thermistor Over Range 0x00D8 Voltage Out Of Range 0x00D9 Current Out Of Range 0x00DA Current Not Regulated 0x00DB Voltage Not Regulated 0x00DC Master Mode 0x00F0 Charger Support Selector 0x00F1 Charger Specification 0x00F2 Charger Level 2 0x00F3 Charger Level 3 Name Battery System Page 0xFF00 Name Vendor desmume-0.9.9/src/cocoa/translations/English.lproj/MainMenu (Legacy).xib0000644000175000017500000117732712140261574026603 0ustar guillaumeguillaume 1040 10K549 851 1038.36 461.00 com.apple.InterfaceBuilder.CocoaPlugin 851 YES YES com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion YES NSApplication FirstResponder NSApplication MainMenu YES DeSmuME 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: DeSmuME YES About DeSmuME 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide DeSmuME h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit DeSmuME q 1048576 2147483647 _NSAppleMenu File 2147483647 submenuAction: File YES Open ROM… o 1048576 2147483647 Open Recent 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 2147483647 ROM Info... i 1048576 2147483647 YES YES 2147483647 Save State As 2147483647 Load State From... 2147483647 YES YES 2147483647 Save State 2147483647 submenuAction: Save State YES Load State 2147483647 submenuAction: Load State YES YES YES 2147483647 Close ROM w 1048576 2147483647 Edit 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1048576 2147483647 YES YES 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Delete 2147483647 Select All a 1048576 2147483647 Emulation 2147483647 submenuAction: Emulation YES Execute 2147483647 Reset 2147483647 YES YES 2147483647 Speed Limit 2147483647 submenuAction: Speed Limit YES 1/4 Speed 2147483647 25 1/2 Speed 2147483647 50 3/4 Speed 2147483647 75 YES YES 2147483647 Normal Speed 2147483647 100 YES YES 2147483647 Double Speed 2147483647 200 None 2147483647 YES YES 2147483647 Custom 2147483647 -1 Backup Media Type 2147483647 submenuAction: Backup Media Type YES Auto Detect 2147483647 YES YES 2147483647 EEPROM 4kbit 2147483647 1 EEPROM 64kbit 2147483647 2 EEPROM 512kbit 2147483647 3 FRAM 256kbit 2147483647 4 FLASH 2mbit 2147483647 5 FLASH 4mbit 2147483647 6 View 2147483647 submenuAction: View YES Size 1x 1 1048576 2147483647 100 Size 2x 2 1048576 2147483647 200 Size 3x 3 1048576 2147483647 300 Size 4x 4 1048576 2147483647 400 YES YES 2147483647 No Smaller Than DS 2147483647 Show Status Bar / 1048576 2147483647 YES YES 2147483647 Rotation 2147483647 submenuAction: Rotation YES 2147483647 90º 2147483647 90 180º 2147483647 180 270º 2147483647 270 YES YES 2147483647 Layers 2147483647 submenuAction: Layers YES Top BG0 2147483647 1 Top BG1 2147483647 2 Top BG2 2147483647 3 Top BG3 2147483647 4 Top OBJ 2147483647 5 YES YES 2147483647 Sub BG0 2147483647 7 Sub BG1 2147483647 8 Sub BG2 2147483647 9 Sub BG3 2147483647 10 Sub OBJ 2147483647 11 YES YES 2147483647 Save Screenshot... 2147483647 Tools 2147483647 submenuAction: Tools YES Show Support Folder in Finder 2147483647 Window 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 2147483647 YES YES 2147483647 Bring All to Front 2147483647 _NSWindowsMenu Help 2147483647 submenuAction: Help YES DeSmuME Help ? 1048576 2147483647 YES YES 2147483647 Go to Website 2147483647 Go to Forums 2147483647 Submit a Bug Report 2147483647 _NSHelpMenu _NSMainMenu AppDelegate 268 YES 268 {{176, 5}, {126, 26}} YES -2076049856 2048 LucidaGrande 13 1044 109199615 1 400 75 TIFF 2147483647 1 _popUpItemAction: YES OtherViews YES BMP 2147483647 _popUpItemAction: 1 GIF 2147483647 _popUpItemAction: 2 JPEG 2147483647 _popUpItemAction: 3 PNG 2147483647 _popUpItemAction: 4 JPEG 2000 2147483647 _popUpItemAction: 5 1 YES YES 2 268 {{38, 11}, {136, 17}} YES 68288064 71304192 Select Image Format: 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA {350, 35} NSView 3 2 {{19, 214}, {500, 500}} 1148716032 About DeSmuME NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 352}, {128, 128}} YES 130560 33554432 NSImage NSApplicationIcon 0 1 0 NO YES 18 {{13, 10}, {474, 340}} YES 1 256 YES 274 YES 2304 YES 2322 {455, 14} YES 6 455 1 10341 0 3 MQA YES YES NSBackgroundColor NSColor YES 6 System selectedTextBackgroundColor 6 System selectedTextColor YES YES NSColor NSCursor NSUnderline YES 1 MCAwIDEAA {8, -8} 13 6 {463, 1e+07} {223, 0} {455, 294} {4, -5} 1 2 256 {{440, 0}, {15, 294}} _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {455, 294}} 16 {{10, 33}, {454, 294}} Read Me 2 256 YES 274 YES 2304 YES 2322 {455, 14} YES 6 455 1 10341 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {463, 1e+07} {223, 0} {455, 294} 2 256 {{440, 0}, {15, 294}} _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {455, 294}} 16 {{10, 33}, {454, 294}} License Item 2 256 YES 274 YES 2304 YES 2322 {430, 14} YES 6 430 1 10341 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {463, 1e+07} {223, 0} {430, 322} 2 256 {{430, 0}, {15, 322}} _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {445, 322}} 16 {{10, 33}, {444, 322}} Authors Item 3 256 YES 274 YES 2304 YES 2322 {430, 14} YES 6 430 1 10341 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES 6 {463, 1e+07} {223, 0} {430, 322} 2 256 {{430, 0}, {15, 322}} _doScroller: 0.96240601503759393 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{-3, -3}, {445, 322}} 16 {{10, 33}, {444, 322}} Change Log 0 YES YES YES 268 {{153, 463}, {320, 17}} YES 70385217 4199424 DeSmuME 268 {{153, 438}, {320, 17}} YES 70385217 4199424 Nintendo DS Emulator 268 {{153, 413}, {320, 17}} YES 70385217 4199424 Version ? 268 {{153, 388}, {320, 17}} YES 70385217 4199424 Date 268 {{153, 363}, {320, 17}} YES 70385217 4199424 http://www.desmume.org {500, 500} {{0, 0}, {1440, 878}} {1.79769e+308, 1.79769e+308} 271 2 {{830, 370}, {256, 408}} 1148716032 DeSmuME NSWindow {1.79769e+308, 1.79769e+308} {256, 408} 256 YES 5156 {{2, 3}, {16, 16}} 28938 100 289 {{180, 3}, {56, 15}} YES -2079981824 131072 100 0.0 100 0.0 0 1 NO NO 289 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{160, 1}, {20, 20}} YES 130560 33554432 NSImage Icon_VolumeFull_16x16 0 2 0 YES YES 294 {{17, 5}, {137, 14}} YES 68288064 272634880 LucidaGrande 11 16 Status Text 301 {{0, 24}, {256, 384}} VideoOutputView {256, 408} {{0, 0}, {1920, 1178}} {256, 430} {1.79769e+308, 1.79769e+308} EmuWindowDelegate 279 2 {{33, 38}, {550, 186}} -461897728 ROM Info NSPanel {1.79769e+308, 1.79769e+308} 256 YES YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 29}, {128, 128}} YES 130560 33554432 0 1 0 NO YES 268 {{164, 152}, {86, 14}} YES 68288064 272630784 File: LucidaGrande-Bold 11 16 3 MAA 2 268 {{252, 152}, {281, 14}} YES 68288064 4195328 ? 3 MAA 268 {{164, 130}, {86, 14}} YES 68288064 272630784 Title: 268 {{252, 130}, {281, 14}} YES 68288064 4195328 ? 268 {{164, 108}, {86, 14}} YES 68288064 272630784 Maker: 268 {{252, 108}, {281, 14}} YES 68288064 4195328 ? 268 {{164, 86}, {86, 14}} YES 68288064 272630784 ROM Size: 268 {{252, 86}, {281, 14}} YES 68288064 4195328 ? bytes 268 {{164, 64}, {86, 14}} YES 68288064 272630784 ARM9 Size: 3 MAA 268 {{252, 64}, {281, 14}} YES 68288064 4195328 ? bytes 3 MAA 268 {{164, 42}, {86, 14}} YES 68288064 272630784 ARM7 Size: 3 MAA 268 {{252, 42}, {281, 14}} YES 68288064 4195328 ? bytes 3 MAA 268 {{164, 20}, {86, 14}} YES 68288064 272630784 Data Size: 3 MAA 268 {{252, 20}, {281, 14}} YES 68288064 4195328 ? bytes 3 MAA {550, 186} {{0, 0}, {1440, 878}} {1.79769e+308, 1.79769e+308} 279 2 {{20, 33}, {467, 166}} -461897728 Custom Speed Limit Window NSPanel {1.79769e+308, 1.79769e+308} 256 YES 268 {{30, 73}, {411, 26}} YES -2079981824 0 10 0.0 1 0.0 6 1 NO NO 268 {{17, 107}, {38, 17}} YES 68288064 138413056 0x 268 {{412, 107}, {38, 17}} YES 68288064 138413056 10x 268 {{97, 107}, {38, 17}} YES 68288064 138413056 2x 268 {{176, 107}, {38, 17}} YES 68288064 138413056 4x 268 {{254, 107}, {38, 17}} YES 68288064 138413056 6x 268 {{335, 107}, {38, 17}} YES 68288064 138413056 8x 268 {{169, 18}, {133, 19}} 100 YES 67239424 134217728 Set to Normal Speed LucidaGrande 12 16 -2038152961 36 400 75 268 {{148, 50}, {123, 17}} YES 68288064 272630784 Speed limit set to: 268 {{273, 50}, {83, 17}} YES 68288064 272630784 YES YES allowsFloats alwaysShowsDecimalSeparator formatterBehavior lenient locale maximumFractionDigits minimumFractionDigits negativeFormat negativeInfinitySymbol nilSymbol numberStyle positiveFormat positiveInfinitySymbol usesGroupingSeparator YES #0.00x -∞ #0.00x +∞ #0.00x #0.00x NaN YES YES YES 0 0 YES NO 1 AAAAAAAAAAAAAAAAAAAAAA 3 YES YES YES . , NO NO YES speedX 268 {{158, 130}, {154, 18}} YES -2080244224 0 Enable Speed Limiter 1211912703 2 NSImage NSSwitch NSSwitch 200 25 {467, 166} {{0, 0}, {1440, 878}} {1.79769e+308, 1.79769e+308} YES isSpeedLimitEnabled isCheatingEnabled speedScalar isFrameSkipEnabled emuFlagAdvancedBusLevelTiming emuFlagUseExternalBios emuFlagEmulateBiosInterrupts emuFlagPatchDelayLoop emuFlagUseExternalFirmware emuFlagFirmwareBoot emuFlagDebugConsole emuFlagEmulateEnsata NintendoDS YES readMePath licensePath authorsPath changeLogPath versionString dateString YES isWorking status volumeIconImage volume isRomLoaded YES YES romFileName romTitle makerCode romSize arm9BinarySize arm7BinarySize dataSize iconImage YES YES terminate: 139 hideOtherApplications: 146 hide: 152 unhideAllApplications: 153 orderFrontDataLinkPanel: 206 delegate 226 clearRecentDocuments: 246 copy: 307 cut: 308 paste: 313 redo: 322 delete: 323 selectAll: 326 undo: 328 performMiniaturize: 354 arrangeInFront: 355 performZoom: 356 showHelp: 360 bugReport: 365 launchForums: 366 launchWebsite: 367 showSupportFolderInFinder: 385 closeRom: 498 openEmuSaveState: 499 saveEmuSaveStateAs: 500 resetCore: 501 executeCoreToggle: 502 speedLimitDisable: 504 changeRomSaveType: 505 changeRomSaveType: 506 changeRomSaveType: 507 changeRomSaveType: 508 changeRomSaveType: 509 changeRomSaveType: 510 changeRomSaveType: 511 changeScale: 512 changeScale: 513 changeScale: 514 changeScale: 515 changeRotation: 516 changeRotation: 517 changeRotation: 518 changeRotation: 519 toggleGPUState: 520 toggleGPUState: 521 toggleGPUState: 522 toggleGPUState: 523 toggleGPUState: 524 toggleGPUState: 525 toggleGPUState: 526 toggleGPUState: 527 toggleGPUState: 528 toggleGPUState: 529 changeCoreSpeed: 530 changeCoreSpeed: 531 changeCoreSpeed: 532 changeCoreSpeed: 533 changeCoreSpeed: 534 openRom: 535 emuWindowController 541 emuWindowController 542 changeVolume: 544 window 545 cdsCoreController 547 mainWindow 548 displayView 551 value: selection.speedScalar value: selection.speedScalar value selection.speedScalar YES YES NSAllowsEditingMultipleValuesSelection NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 578 value: selection.speedScalar value: selection.speedScalar value selection.speedScalar YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEnabled NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 583 changeCoreSpeed: 584 makeKeyAndOrderFront: 585 cdsCoreController 586 makeKeyAndOrderFront: 692 delegate 693 value: selection.volume value: selection.volume value selection.volume 2 694 value: selection.volumeIconImage value: selection.volumeIconImage value selection.volumeIconImage 2 695 value: selection.status value: selection.status value selection.status 2 696 animate: selection.isWorking animate: selection.isWorking animate selection.isWorking 2 697 value: selection.romFileName value: selection.romFileName value selection.romFileName 2 758 value: selection.romTitle value: selection.romTitle value selection.romTitle 2 759 value: selection.makerCode value: selection.makerCode value selection.makerCode 2 760 value: selection.romSize value: selection.romSize value selection.romSize 2 761 value: selection.arm9BinarySize value: selection.arm9BinarySize value selection.arm9BinarySize 2 762 value: selection.arm7BinarySize value: selection.arm7BinarySize value selection.arm7BinarySize 2 763 value: selection.dataSize value: selection.dataSize value selection.dataSize 2 764 value: selection.iconImage value: selection.iconImage value selection.iconImage 2 765 romInfoPanelController 766 romInfoPanelController 767 toggleMinSize: 769 toggleStatusBar: 770 mLoadStateSlot 772 mSaveStateSlot 773 aboutWindowController 822 makeKeyAndOrderFront: 824 value: selection.isSpeedLimitEnabled value: selection.isSpeedLimitEnabled value selection.isSpeedLimitEnabled YES YES NSAllowsEditingMultipleValuesSelection NSConditionallySetsEnabled NSRaisesForNotApplicableKeys NSValidatesImmediately YES 2 840 saveScreenshotAs: 841 saveScreenshotPanelAccessoryView 842 changeScreenshotFileFormat: 843 changeScreenshotFileFormat: 844 changeScreenshotFileFormat: 845 changeScreenshotFileFormat: 846 changeScreenshotFileFormat: 847 changeScreenshotFileFormat: 849 value: selection.versionString value: selection.versionString value selection.versionString 2 850 value: selection.dateString value: selection.dateString value selection.dateString 2 851 readMeTextView 858 valuePath: selection.readMePath valuePath: selection.readMePath valuePath selection.readMePath 2 859 valuePath: selection.licensePath valuePath: selection.licensePath valuePath selection.licensePath 2 860 valuePath: selection.authorsPath valuePath: selection.authorsPath valuePath selection.authorsPath 2 861 valuePath: selection.changeLogPath valuePath: selection.changeLogPath valuePath selection.changeLogPath 2 862 YES 0 -2 File's Owner -1 First Responder 29 YES MainMenu 56 YES 57 YES 58 129 131 YES 130 134 136 143 144 145 149 150 196 -3 Application 210 YES Screenshot Save Panel Accessory 211 YES 212 213 YES 214 YES 215 YES 216 217 218 219 220 225 227 YES 228 YES 230 231 YES 232 233 234 235 237 240 YES 241 251 252 YES 253 YES 255 YES 256 YES 258 259 260 YES 261 YES 262 263 264 265 266 267 269 270 336 YES 337 YES 339 YES 340 YES 341 342 YES 343 YES 348 YES 349 YES 350 351 352 353 357 YES 358 YES 359 361 362 363 364 368 388 YES 390 YES 391 YES 393 YES 394 YES 395 396 397 398 424 425 427 YES 428 YES 429 430 YES 431 YES 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 454 455 456 457 YES 458 YES 459 460 461 YES 462 YES 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 493 497 536 Emulation Window Controller 546 CocoaDS Core Controller 338 552 YES 553 YES 554 YES 555 YES 556 YES 557 YES 558 YES 559 YES 560 YES 561 YES 562 YES 563 YES 564 565 566 567 568 569 570 571 572 573 YES 574 587 YES 588 YES 594 YES 595 698 ROM Info Panel Controller 723 YES 724 YES 725 YES 726 YES 727 YES 728 YES 729 YES 730 YES 731 732 733 734 735 736 737 738 743 YES 744 YES 745 746 748 YES 749 YES 750 751 753 YES 754 YES 755 756 774 YES 775 YES 776 YES 777 778 YES 779 YES 780 YES 781 YES 782 YES 783 YES 784 YES 785 YES 786 YES 787 YES 788 789 YES 790 791 YES 792 793 YES 794 795 YES 796 801 YES 802 803 804 805 YES 806 807 808 809 YES 810 811 812 797 YES 800 799 798 817 About Window Controller 550 834 YES 835 848 YES YES 129.IBPluginDependency 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 196.IBPluginDependency 196.ImportedFromIB2 210.IBEditorWindowLastContentRect 210.IBPluginDependency 211.IBPluginDependency 211.IBViewBoundsToFrameTransform 212.IBPluginDependency 213.IBPluginDependency 213.IBViewBoundsToFrameTransform 214.IBPluginDependency 215.IBEditorWindowLastContentRect 215.IBPluginDependency 216.IBPluginDependency 217.IBPluginDependency 218.IBPluginDependency 219.IBPluginDependency 220.IBPluginDependency 225.IBPluginDependency 227.IBPluginDependency 228.IBEditorWindowLastContentRect 228.IBPluginDependency 230.IBPluginDependency 231.IBPluginDependency 232.IBPluginDependency 233.IBPluginDependency 234.IBPluginDependency 235.IBPluginDependency 237.IBPluginDependency 240.IBEditorWindowLastContentRect 240.IBPluginDependency 241.IBPluginDependency 251.IBPluginDependency 252.IBPluginDependency 253.IBEditorWindowLastContentRect 253.IBPluginDependency 255.IBPluginDependency 256.IBEditorWindowLastContentRect 256.IBPluginDependency 258.IBPluginDependency 259.IBPluginDependency 260.IBPluginDependency 261.IBEditorWindowLastContentRect 261.IBPluginDependency 262.IBPluginDependency 263.IBPluginDependency 264.IBPluginDependency 265.IBPluginDependency 266.IBPluginDependency 267.IBPluginDependency 269.IBPluginDependency 270.IBPluginDependency 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 336.IBPluginDependency 337.IBEditorWindowLastContentRect 337.IBPluginDependency 338.IBPluginDependency 339.IBPluginDependency 340.IBEditorWindowLastContentRect 340.IBPluginDependency 341.IBPluginDependency 342.IBPluginDependency 343.IBEditorWindowLastContentRect 343.IBPluginDependency 348.IBPluginDependency 349.IBEditorWindowLastContentRect 349.IBPluginDependency 350.IBPluginDependency 351.IBPluginDependency 352.IBPluginDependency 353.IBPluginDependency 357.IBPluginDependency 358.IBEditorWindowLastContentRect 358.IBPluginDependency 359.IBPluginDependency 361.IBPluginDependency 362.IBPluginDependency 363.IBPluginDependency 364.IBPluginDependency 368.IBPluginDependency 388.IBEditorWindowLastContentRect 388.IBPluginDependency 388.IBWindowTemplateEditedContentRect 388.NSWindowTemplate.visibleAtLaunch 388.editorWindowContentRectSynchronizationRect 388.windowTemplate.hasMinSize 388.windowTemplate.maxSize 388.windowTemplate.minSize 390.IBPluginDependency 391.IBPluginDependency 391.IBViewBoundsToFrameTransform 393.IBViewBoundsToFrameTransform 394.IBPluginDependency 394.IBViewBoundsToFrameTransform 395.IBPluginDependency 395.IBViewBoundsToFrameTransform 396.IBPluginDependency 398.IBPluginDependency 424.IBPluginDependency 425.IBPluginDependency 427.IBPluginDependency 428.IBEditorWindowLastContentRect 428.IBPluginDependency 429.IBPluginDependency 430.IBPluginDependency 431.IBEditorWindowLastContentRect 431.IBPluginDependency 432.IBPluginDependency 433.IBPluginDependency 434.IBPluginDependency 435.IBPluginDependency 436.IBPluginDependency 437.IBPluginDependency 438.IBPluginDependency 439.IBPluginDependency 440.IBPluginDependency 441.IBPluginDependency 442.IBPluginDependency 443.IBPluginDependency 444.IBPluginDependency 445.IBPluginDependency 446.IBPluginDependency 447.IBPluginDependency 448.IBPluginDependency 449.IBPluginDependency 450.IBPluginDependency 451.IBPluginDependency 452.IBPluginDependency 454.IBPluginDependency 455.IBPluginDependency 456.IBPluginDependency 457.IBPluginDependency 458.IBEditorWindowLastContentRect 458.IBPluginDependency 459.IBPluginDependency 460.IBPluginDependency 461.IBPluginDependency 462.IBEditorWindowLastContentRect 462.IBPluginDependency 463.IBPluginDependency 464.IBPluginDependency 465.IBPluginDependency 466.IBPluginDependency 467.IBPluginDependency 468.IBPluginDependency 469.IBPluginDependency 470.IBPluginDependency 471.IBPluginDependency 472.IBPluginDependency 473.IBPluginDependency 474.IBPluginDependency 475.IBPluginDependency 476.IBPluginDependency 477.IBPluginDependency 478.IBPluginDependency 497.IBPluginDependency 536.IBPluginDependency 546.IBPluginDependency 550.IBPluginDependency 550.IBViewBoundsToFrameTransform 552.IBEditorWindowLastContentRect 552.IBPluginDependency 552.IBWindowTemplateEditedContentRect 552.NSWindowTemplate.visibleAtLaunch 553.IBPluginDependency 554.IBPluginDependency 554.IBViewBoundsToFrameTransform 555.IBPluginDependency 555.IBViewBoundsToFrameTransform 556.IBPluginDependency 556.IBViewBoundsToFrameTransform 557.IBPluginDependency 557.IBViewBoundsToFrameTransform 558.IBPluginDependency 558.IBViewBoundsToFrameTransform 559.IBPluginDependency 559.IBViewBoundsToFrameTransform 56.IBPluginDependency 56.ImportedFromIB2 560.IBPluginDependency 560.IBViewBoundsToFrameTransform 561.IBPluginDependency 561.IBViewBoundsToFrameTransform 562.IBPluginDependency 562.IBViewBoundsToFrameTransform 563.IBPluginDependency 563.IBViewBoundsToFrameTransform 564.IBPluginDependency 565.IBPluginDependency 566.IBPluginDependency 567.IBPluginDependency 568.IBPluginDependency 569.IBPluginDependency 57.IBEditorWindowLastContentRect 57.IBPluginDependency 57.ImportedFromIB2 570.IBPluginDependency 571.IBPluginDependency 572.IBPluginDependency 573.IBPluginDependency 574.IBNumberFormatterBehaviorMetadataKey 574.IBNumberFormatterLocalizesFormatMetadataKey 574.IBPluginDependency 58.IBPluginDependency 58.ImportedFromIB2 587.IBEditorWindowLastContentRect 587.IBPluginDependency 587.IBWindowTemplateEditedContentRect 587.NSWindowTemplate.visibleAtLaunch 588.IBPluginDependency 594.IBViewBoundsToFrameTransform 698.IBPluginDependency 723.IBPluginDependency 723.IBViewBoundsToFrameTransform 724.IBPluginDependency 724.IBViewBoundsToFrameTransform 725.IBPluginDependency 725.IBViewBoundsToFrameTransform 726.IBPluginDependency 726.IBViewBoundsToFrameTransform 727.IBPluginDependency 727.IBViewBoundsToFrameTransform 728.IBPluginDependency 728.IBViewBoundsToFrameTransform 729.IBPluginDependency 729.IBViewBoundsToFrameTransform 730.IBPluginDependency 730.IBViewBoundsToFrameTransform 731.IBPluginDependency 732.IBPluginDependency 733.IBPluginDependency 734.IBPluginDependency 735.IBPluginDependency 736.IBPluginDependency 737.IBPluginDependency 738.IBPluginDependency 743.IBPluginDependency 743.IBViewBoundsToFrameTransform 744.IBPluginDependency 744.IBViewBoundsToFrameTransform 745.IBPluginDependency 746.IBPluginDependency 748.IBPluginDependency 748.IBViewBoundsToFrameTransform 749.IBPluginDependency 749.IBViewBoundsToFrameTransform 750.IBPluginDependency 751.IBPluginDependency 753.IBPluginDependency 753.IBViewBoundsToFrameTransform 754.IBPluginDependency 754.IBViewBoundsToFrameTransform 755.IBPluginDependency 756.IBPluginDependency 774.IBEditorWindowLastContentRect 774.IBPluginDependency 774.IBWindowTemplateEditedContentRect 774.NSWindowTemplate.visibleAtLaunch 775.IBPluginDependency 776.IBPluginDependency 776.IBViewBoundsToFrameTransform 777.IBPluginDependency 778.IBAttributePlaceholdersKey 778.IBPluginDependency 778.IBViewBoundsToFrameTransform 779.IBPluginDependency 780.IBPluginDependency 781.IBPluginDependency 782.IBPluginDependency 787.IBPluginDependency 787.IBViewBoundsToFrameTransform 788.IBPluginDependency 789.IBPluginDependency 789.IBViewBoundsToFrameTransform 790.IBPluginDependency 791.IBPluginDependency 791.IBViewBoundsToFrameTransform 792.IBPluginDependency 793.IBPluginDependency 793.IBViewBoundsToFrameTransform 794.IBPluginDependency 795.IBPluginDependency 795.IBViewBoundsToFrameTransform 796.IBPluginDependency 797.IBPluginDependency 797.IBViewBoundsToFrameTransform 798.IBPluginDependency 799.IBPluginDependency 800.IBPluginDependency 801.IBPluginDependency 801.IBViewBoundsToFrameTransform 802.IBPluginDependency 803.IBPluginDependency 804.IBPluginDependency 805.IBPluginDependency 805.IBViewBoundsToFrameTransform 806.IBPluginDependency 807.IBPluginDependency 808.IBPluginDependency 809.IBPluginDependency 809.IBViewBoundsToFrameTransform 810.IBPluginDependency 811.IBPluginDependency 812.IBPluginDependency 817.IBPluginDependency 834.IBPluginDependency 834.IBViewBoundsToFrameTransform 835.IBPluginDependency 848.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{795, 552}, {350, 35}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCGAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMAAAwiQAAA com.apple.InterfaceBuilder.CocoaPlugin {{960, 460}, {126, 123}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{426, 933}, {201, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{779, 1093}, {143, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{779, 980}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{779, 1000}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{468, 983}, {151, 153}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1026, 1136}, {512, 20}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{512, 1043}, {183, 93}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{598, 913}, {209, 223}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{648, 1113}, {257, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{704, 1063}, {194, 73}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{775, 1043}, {210, 93}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{1040, 685}, {256, 408}} com.apple.InterfaceBuilder.CocoaPlugin {{1040, 685}, {256, 408}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} {256, 408} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBmAAAwZAAAA AULcAAA/gAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABC/AAAwZgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABAQAAAwjAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{678, 913}, {147, 173}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{739, 913}, {164, 153}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{973, 893}, {86, 83}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{973, 733}, {110, 213}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AQAAAABBwAAAA {{360, 696}, {467, 166}} com.apple.InterfaceBuilder.CocoaPlugin {{360, 696}, {467, 166}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDiIAAwoQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDFAAAwoQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDKQAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDp4AAwxgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDfgAAwxgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDMAAAwxgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCwgAAwxgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDzgAAwxgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBiAAAwxgAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABB8AAAwv4AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{336, 953}, {203, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{466, 676}, {550, 186}} com.apple.InterfaceBuilder.CocoaPlugin {{466, 676}, {550, 186}} com.apple.InterfaceBuilder.CocoaPlugin AUGgAABCGAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCmgAAw4AAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDcQAAwyQAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCmgAAw2oAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDcQAAww4AAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCmgAAw1QAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDcQAAwvAAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDGQAAwzMAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDcQAAwsQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDGQAAwx0AAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDcQAAwpgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDGQAAwwcAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDcQAAwlgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDHgAAwwIAAA com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDcQAAwgAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{583, 356}, {500, 500}} com.apple.InterfaceBuilder.CocoaPlugin {{583, 356}, {500, 500}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin AUGgAABDvgAAA com.apple.InterfaceBuilder.CocoaPlugin InitialTabViewItem InitialTabViewItem com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABBUAAAw7wAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDCwAAw/0AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDCwAAw/CAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDGQAAw+QAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDCwAAw9eAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDCwAAw8sAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADBiAAAw56AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADAQAAAw56AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADCHAAAw56AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAADBYAAAw56AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDHgAAwxIAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 862 YES AppDelegate NSObject YES YES bugReport: launchForums: launchWebsite: YES id id id YES YES bugReport: launchForums: launchWebsite: YES bugReport: id launchForums: id launchWebsite: id IBProjectSource userinterface/appDelegate_legacy.h AppDelegate NSObject YES YES aboutWindowController cdsCoreController emuWindowController mLoadStateSlot mSaveStateSlot mainWindow readMeTextView romInfoPanelController YES NSObjectController NSObjectController NSObjectController NSMenu NSMenu NSWindow NSTextView NSObjectController YES YES aboutWindowController cdsCoreController emuWindowController mLoadStateSlot mSaveStateSlot mainWindow readMeTextView romInfoPanelController YES aboutWindowController NSObjectController cdsCoreController NSObjectController emuWindowController NSObjectController mLoadStateSlot NSMenu mSaveStateSlot NSMenu mainWindow NSWindow readMeTextView NSTextView romInfoPanelController NSObjectController IBUserSource EmuWindowDelegate NSObject YES YES changeCoreSpeed: changeRomSaveType: changeRotation: changeRotationRelative: changeScale: changeScreenshotFileFormat: changeVolume: closeRom: copy: executeCoreToggle: exportRomSave: importRomSave: loadEmuSaveStateSlot: openEmuSaveState: openRom: resetCore: revertEmuSaveState: saveEmuSaveState: saveEmuSaveStateAs: saveEmuSaveStateSlot: saveScreenshotAs: speedLimitDisable: toggleGPUState: toggleMinSize: toggleStatusBar: YES id id id id id id id id id id id id id id id id id id id id id id id id id YES YES changeCoreSpeed: changeRomSaveType: changeRotation: changeRotationRelative: changeScale: changeScreenshotFileFormat: changeVolume: closeRom: copy: executeCoreToggle: exportRomSave: importRomSave: loadEmuSaveStateSlot: openEmuSaveState: openRom: resetCore: revertEmuSaveState: saveEmuSaveState: saveEmuSaveStateAs: saveEmuSaveStateSlot: saveScreenshotAs: speedLimitDisable: toggleGPUState: toggleMinSize: toggleStatusBar: YES changeCoreSpeed: id changeRomSaveType: id changeRotation: id changeRotationRelative: id changeScale: id changeScreenshotFileFormat: id changeVolume: id closeRom: id copy: id executeCoreToggle: id exportRomSave: id importRomSave: id loadEmuSaveStateSlot: id openEmuSaveState: id openRom: id resetCore: id revertEmuSaveState: id saveEmuSaveState: id saveEmuSaveStateAs: id saveEmuSaveStateSlot: id saveScreenshotAs: id speedLimitDisable: id toggleGPUState: id toggleMinSize: id toggleStatusBar: id IBProjectSource userinterface/emuWindowDelegate_legacy.h EmuWindowDelegate NSObject YES YES cdsCoreController displayView emuWindowController romInfoPanelController saveScreenshotPanelAccessoryView window YES NSObjectController VideoOutputView NSObjectController NSObjectController NSView NSWindow YES YES cdsCoreController displayView emuWindowController romInfoPanelController saveScreenshotPanelAccessoryView window YES cdsCoreController NSObjectController displayView VideoOutputView emuWindowController NSObjectController romInfoPanelController NSObjectController saveScreenshotPanelAccessoryView NSView window NSWindow IBUserSource FirstResponder NSObject IBUserSource VideoOutputView NSView IBProjectSource video_output_view_legacy.h YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSBrowser NSControl IBFrameworkSource AppKit.framework/Headers/NSBrowser.h NSButton NSControl IBFrameworkSource AppKit.framework/Headers/NSButton.h NSButtonCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSButtonCell.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSController NSObject IBFrameworkSource AppKit.framework/Headers/NSController.h NSDocumentController NSObject YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES id id id id YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES clearRecentDocuments: id newDocument: id openDocument: id saveAllDocuments: id IBFrameworkSource AppKit.framework/Headers/NSDocumentController.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSImageCell NSCell IBFrameworkSource AppKit.framework/Headers/NSImageCell.h NSImageView NSControl IBFrameworkSource AppKit.framework/Headers/NSImageView.h NSMatrix NSControl IBFrameworkSource AppKit.framework/Headers/NSMatrix.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMenuItemCell NSButtonCell IBFrameworkSource AppKit.framework/Headers/NSMenuItemCell.h NSMovieView NSView IBFrameworkSource AppKit.framework/Headers/NSMovieView.h NSNumberFormatter NSFormatter IBFrameworkSource Foundation.framework/Headers/NSNumberFormatter.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSObjectController NSController IBFrameworkSource AppKit.framework/Headers/NSObjectController.h NSPanel NSWindow IBFrameworkSource AppKit.framework/Headers/NSPanel.h NSPopUpButton NSButton IBFrameworkSource AppKit.framework/Headers/NSPopUpButton.h NSPopUpButtonCell NSMenuItemCell IBFrameworkSource AppKit.framework/Headers/NSPopUpButtonCell.h NSProgressIndicator NSView IBFrameworkSource AppKit.framework/Headers/NSProgressIndicator.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSScrollView NSView IBFrameworkSource AppKit.framework/Headers/NSScrollView.h NSScroller NSControl IBFrameworkSource AppKit.framework/Headers/NSScroller.h NSSlider NSControl IBFrameworkSource AppKit.framework/Headers/NSSlider.h NSSliderCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSSliderCell.h NSTabView NSView IBFrameworkSource AppKit.framework/Headers/NSTabView.h NSTabViewItem NSObject IBFrameworkSource AppKit.framework/Headers/NSTabViewItem.h NSTableView NSControl NSText NSView IBFrameworkSource AppKit.framework/Headers/NSText.h NSTextField NSControl IBFrameworkSource AppKit.framework/Headers/NSTextField.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSTextView NSText IBFrameworkSource AppKit.framework/Headers/NSTextView.h NSUserDefaultsController NSController IBFrameworkSource AppKit.framework/Headers/NSUserDefaultsController.h NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../DeSmuME (Legacy).xcodeproj 3 YES YES Icon_VolumeFull_16x16 NSApplicationIcon NSMenuCheckmark NSMenuMixedState NSSwitch YES {20, 20} {512, 512} {9, 8} {7, 2} {15, 15} desmume-0.9.9/src/cocoa/translations/English.lproj/MainMenu (Legacy).strings0000644000175000017500000006601612140261574027501 0ustar guillaumeguillaume /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "About DeSmuME"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "Preferences& "; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = "Services"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = "Services"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "Hide DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Quit DeSmuME"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = "Show All"; /* Class = "NSTextFieldCell"; title = "Select Image Format:"; ObjectID = "212"; */ "212.title" = "Select Image Format:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "215"; */ "215.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "PNG"; ObjectID = "216"; */ "216.title" = "PNG"; /* Class = "NSMenuItem"; title = "BMP"; ObjectID = "217"; */ "217.title" = "BMP"; /* Class = "NSMenuItem"; title = "GIF"; ObjectID = "218"; */ "218.title" = "GIF"; /* Class = "NSMenuItem"; title = "JPEG"; ObjectID = "219"; */ "219.title" = "JPEG"; /* Class = "NSMenuItem"; title = "TIFF"; ObjectID = "220"; */ "220.title" = "TIFF"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "227"; */ "227.title" = "File"; /* Class = "NSMenu"; title = "File"; ObjectID = "228"; */ "228.title" = "File"; /* Class = "NSMenuItem"; title = "Open ROM& "; ObjectID = "230"; */ "230.title" = "Open ROM& "; /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "231"; */ "231.title" = "Open Recent"; /* Class = "NSMenuItem"; title = "ROM Info..."; ObjectID = "233"; */ "233.title" = "ROM Info..."; /* Class = "NSMenuItem"; title = "Save State As"; ObjectID = "234"; */ "234.title" = "Save State As"; /* Class = "NSMenuItem"; title = "Load State From..."; ObjectID = "235"; */ "235.title" = "Load State From..."; /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "240"; */ "240.title" = "Open Recent"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "241"; */ "241.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Load State"; ObjectID = "252"; */ "252.title" = "Load State"; /* Class = "NSMenu"; title = "Load State"; ObjectID = "253"; */ "253.title" = "Load State"; /* Class = "NSMenuItem"; title = "Save State"; ObjectID = "255"; */ "255.title" = "Save State"; /* Class = "NSMenu"; title = "Save State"; ObjectID = "256"; */ "256.title" = "Save State"; /* Class = "NSMenuItem"; title = "Close ROM"; ObjectID = "259"; */ "259.title" = "Close ROM"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "260"; */ "260.title" = "Edit"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "261"; */ "261.title" = "Edit"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "262"; */ "262.title" = "Undo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "263"; */ "263.title" = "Redo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "265"; */ "265.title" = "Cut"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "266"; */ "266.title" = "Copy"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "267"; */ "267.title" = "Paste"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "269"; */ "269.title" = "Delete"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "270"; */ "270.title" = "Select All"; /* Class = "NSMenuItem"; title = "Emulation"; ObjectID = "336"; */ "336.title" = "Emulation"; /* Class = "NSMenu"; title = "Emulation"; ObjectID = "337"; */ "337.title" = "Emulation"; /* Class = "NSMenuItem"; title = "Execute"; ObjectID = "338"; */ "338.title" = "Execute"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "339"; */ "339.title" = "View"; /* Class = "NSMenu"; title = "View"; ObjectID = "340"; */ "340.title" = "View"; /* Class = "NSMenuItem"; title = "Size 1x"; ObjectID = "341"; */ "341.title" = "Size 1x"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "342"; */ "342.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "343"; */ "343.title" = "Tools"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "348"; */ "348.title" = "Window"; /* Class = "NSMenu"; title = "Window"; ObjectID = "349"; */ "349.title" = "Window"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "350"; */ "350.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "351"; */ "351.title" = "Zoom"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "353"; */ "353.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "357"; */ "357.title" = "Help"; /* Class = "NSMenu"; title = "Help"; ObjectID = "358"; */ "358.title" = "Help"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "359"; */ "359.title" = "DeSmuME Help"; /* Class = "NSMenuItem"; title = "Go to Website"; ObjectID = "362"; */ "362.title" = "Go to Website"; /* Class = "NSMenuItem"; title = "Go to Forums"; ObjectID = "363"; */ "363.title" = "Go to Forums"; /* Class = "NSMenuItem"; title = "Submit a Bug Report"; ObjectID = "364"; */ "364.title" = "Submit a Bug Report"; /* Class = "NSMenuItem"; title = "Show Support Folder in Finder"; ObjectID = "368"; */ "368.title" = "Show Support Folder in Finder"; /* Class = "NSWindow"; title = "DeSmuME"; ObjectID = "388"; */ "388.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "Status Text"; ObjectID = "398"; */ "398.placeholderString" = "Status Text"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "424"; */ "424.title" = "Reset"; /* Class = "NSMenuItem"; title = "Speed Limit"; ObjectID = "427"; */ "427.title" = "Speed Limit"; /* Class = "NSMenu"; title = "Speed Limit"; ObjectID = "428"; */ "428.title" = "Speed Limit"; /* Class = "NSMenuItem"; title = "1/4 Speed"; ObjectID = "429"; */ "429.title" = "1/4 Speed"; /* Class = "NSMenuItem"; title = "Backup Media Type"; ObjectID = "430"; */ "430.title" = "Backup Media Type"; /* Class = "NSMenu"; title = "Backup Media Type"; ObjectID = "431"; */ "431.title" = "Backup Media Type"; /* Class = "NSMenuItem"; title = "Auto Detect"; ObjectID = "432"; */ "432.title" = "Auto Detect"; /* Class = "NSMenuItem"; title = "EEPROM 4kbit"; ObjectID = "434"; */ "434.title" = "EEPROM 4kbit"; /* Class = "NSMenuItem"; title = "EEPROM 64kbit"; ObjectID = "435"; */ "435.title" = "EEPROM 64kbit"; /* Class = "NSMenuItem"; title = "EEPROM 512kbit"; ObjectID = "436"; */ "436.title" = "EEPROM 512kbit"; /* Class = "NSMenuItem"; title = "FRAM 256kbit"; ObjectID = "437"; */ "437.title" = "FRAM 256kbit"; /* Class = "NSMenuItem"; title = "FLASH 2mbit"; ObjectID = "438"; */ "438.title" = "FLASH 2mbit"; /* Class = "NSMenuItem"; title = "FLASH 4mbit"; ObjectID = "439"; */ "439.title" = "FLASH 4mbit"; /* Class = "NSMenuItem"; title = "1/2 Speed"; ObjectID = "440"; */ "440.title" = "1/2 Speed"; /* Class = "NSMenuItem"; title = "3/4 Speed"; ObjectID = "441"; */ "441.title" = "3/4 Speed"; /* Class = "NSMenuItem"; title = "Normal Speed"; ObjectID = "443"; */ "443.title" = "Normal Speed"; /* Class = "NSMenuItem"; title = "Double Speed"; ObjectID = "445"; */ "445.title" = "Double Speed"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "446"; */ "446.title" = "None"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "448"; */ "448.title" = "Custom"; /* Class = "NSMenuItem"; title = "Size 2x"; ObjectID = "449"; */ "449.title" = "Size 2x"; /* Class = "NSMenuItem"; title = "Size 3x"; ObjectID = "450"; */ "450.title" = "Size 3x"; /* Class = "NSMenuItem"; title = "Size 4x"; ObjectID = "451"; */ "451.title" = "Size 4x"; /* Class = "NSMenuItem"; title = "No Smaller Than DS"; ObjectID = "454"; */ "454.title" = "No Smaller Than DS"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "455"; */ "455.title" = "Show Status Bar"; /* Class = "NSMenuItem"; title = "Rotation"; ObjectID = "457"; */ "457.title" = "Rotation"; /* Class = "NSMenu"; title = "Rotation"; ObjectID = "458"; */ "458.title" = "Rotation"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "459"; */ "459.title" = "0"; /* Class = "NSMenuItem"; title = "Layers"; ObjectID = "461"; */ "461.title" = "Layers"; /* Class = "NSMenu"; title = "Layers"; ObjectID = "462"; */ "462.title" = "Layers"; /* Class = "NSMenuItem"; title = "Top BG0"; ObjectID = "463"; */ "463.title" = "Top BG0"; /* Class = "NSMenuItem"; title = "Save Screenshot..."; ObjectID = "465"; */ "465.title" = "Save Screenshot..."; /* Class = "NSMenuItem"; title = "90"; ObjectID = "466"; */ "466.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "467"; */ "467.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "468"; */ "468.title" = "270"; /* Class = "NSMenuItem"; title = "Top BG1"; ObjectID = "469"; */ "469.title" = "Top BG1"; /* Class = "NSMenuItem"; title = "Top BG2"; ObjectID = "470"; */ "470.title" = "Top BG2"; /* Class = "NSMenuItem"; title = "Top BG3"; ObjectID = "471"; */ "471.title" = "Top BG3"; /* Class = "NSMenuItem"; title = "Top OBJ"; ObjectID = "472"; */ "472.title" = "Top OBJ"; /* Class = "NSMenuItem"; title = "Sub BG0"; ObjectID = "474"; */ "474.title" = "Sub BG0"; /* Class = "NSMenuItem"; title = "Sub BG1"; ObjectID = "475"; */ "475.title" = "Sub BG1"; /* Class = "NSMenuItem"; title = "Sub BG2"; ObjectID = "476"; */ "476.title" = "Sub BG2"; /* Class = "NSMenuItem"; title = "Sub BG3"; ObjectID = "477"; */ "477.title" = "Sub BG3"; /* Class = "NSMenuItem"; title = "Sub OBJ"; ObjectID = "478"; */ "478.title" = "Sub OBJ"; /* Class = "NSPanel"; title = "Custom Speed Limit Window"; ObjectID = "552"; */ "552.title" = "Custom Speed Limit Window"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "565"; */ "565.title" = "0x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "566"; */ "566.title" = "10x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "567"; */ "567.title" = "2x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "568"; */ "568.title" = "4x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "569"; */ "569.title" = "6x"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "570"; */ "570.title" = "8x"; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "571"; */ "571.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "572"; */ "572.title" = "Speed limit set to: "; /* Class = "NSTextFieldCell"; placeholderString = "speedX"; ObjectID = "573"; */ "573.placeholderString" = "speedX"; /* Class = "NSPanel"; title = "ROM Info"; ObjectID = "587"; */ "587.title" = "ROM Info"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "731"; */ "731.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ROM Size:"; ObjectID = "732"; */ "732.title" = "ROM Size:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "733"; */ "733.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Maker:"; ObjectID = "734"; */ "734.title" = "Maker:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "735"; */ "735.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Title:"; ObjectID = "736"; */ "736.title" = "Title:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "737"; */ "737.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "File:"; ObjectID = "738"; */ "738.title" = "File:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "745"; */ "745.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM9 Size:"; ObjectID = "746"; */ "746.title" = "ARM9 Size:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "750"; */ "750.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM7 Size:"; ObjectID = "751"; */ "751.title" = "ARM7 Size:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "755"; */ "755.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "Data Size:"; ObjectID = "756"; */ "756.title" = "Data Size:"; /* Class = "NSWindow"; title = "About DeSmuME"; ObjectID = "774"; */ "774.title" = "About DeSmuME"; /* Class = "NSTabViewItem"; label = "Read Me"; ObjectID = "779"; */ "779.label" = "Read Me"; /* Class = "NSTabViewItem"; label = "License"; ObjectID = "780"; */ "780.label" = "License"; /* Class = "NSTabViewItem"; label = "Authors"; ObjectID = "783"; */ "783.label" = "Authors"; /* Class = "NSTabViewItem"; label = "Change Log"; ObjectID = "785"; */ "785.label" = "Change Log"; /* Class = "NSTextFieldCell"; title = "DeSmuME"; ObjectID = "788"; */ "788.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; title = "Nintendo DS Emulator"; ObjectID = "790"; */ "790.title" = "Nintendo DS Emulator"; /* Class = "NSTextFieldCell"; placeholderString = "Version ?"; ObjectID = "792"; */ "792.placeholderString" = "Version ?"; /* Class = "NSTextFieldCell"; placeholderString = "Date"; ObjectID = "794"; */ "794.placeholderString" = "Date"; /* Class = "NSTextFieldCell"; title = "http://www.desmume.org"; ObjectID = "796"; */ "796.title" = "http://www.desmume.org"; /* Class = "NSButtonCell"; title = "Enable Speed Limiter"; ObjectID = "835"; */ "835.title" = "Enable Speed Limiter"; /* Class = "NSMenuItem"; title = "JPEG 2000"; ObjectID = "848"; */ "848.title" = "JPEG 2000"; desmume-0.9.9/src/cocoa/translations/Romanian.lproj/0000755000175000017500000000000012140306213023177 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/translations/Romanian.lproj/Localizable.strings0000644000175000017500000002277412140261564027060 0ustar guillaumeguillaume/* DeSmuME Strings File */ /* ROMANIAN */ /* Dialog Box Titles */ "Open ROM" = "Open ROM"; "Open State File" = "Open State File"; "Save State File" = "Save State File"; "Import ROM Save File" = "Import ROM Save File"; "Export ROM Save File" = "Export ROM Save File"; "Select ROM" = "Select ROM"; "Select ADVANsCEne Database" = "Select ADVANsCEne Database"; "Select R4 Cheat Database" = "Select R4 Cheat Database"; "Select ARM7 BIOS Image" = "Select ARM7 BIOS Image"; "Select ARM9 BIOS Image" = "Select ARM9 BIOS Image"; "Select Firmware Image" = "Select Firmware Image"; "Save Screenshot" = "Save Screenshot"; /* Menus */ "Execute" = "Executa"; "Pause" = "Pauza"; "Disable Speed Limit" = "Disable Speed Limit"; "Enable Speed Limit" = "Enable Speed Limit"; "Disable Auto Frame Skip" = "Disable Auto Frame Skip"; "Enable Auto Frame Skip" = "Enable Auto Frame Skip"; "Disable Cheats" = "Disable Cheats"; "Enable Cheats" = "Enable Cheats"; "Disable HUD" = "Disable HUD"; "Enable HUD" = "Enable HUD"; "Hide Status Bar" = "Hide Status Bar"; "Show Status Bar" = "Show Status Bar"; "Speed 1x" = "Speed 1x"; "Speed 2x" = "Speed 2x"; "Slot %d" = "Slot %d"; /* Alert Text */ "A critical file is missing. DeSmuME will now quit." = "A critical file is missing. DeSmuME will now quit."; "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME." = "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME."; /* Status Text */ "Ready." = "Ready."; "Save state file loading failed!" = "Save state file loading failed!"; "Save state file loaded." = "Save state file loaded."; "Save state file saving failed!" = "Save state file saving failed!"; "Save state file saved." = "Save state file saved."; "Save state file reverting failed!" = "Save state file reverting failed!"; "Save state file reverted." = "Save state file reverted."; "ROM save file import failed!" = "ROM save file import failed!"; "ROM save file imported." = "ROM save file imported."; "ROM save file export failed!" = "ROM save file export failed!"; "ROM save file exported." = "ROM save file exported."; "Loading ROM..." = "Loading ROM..."; "ROM loaded." = "ROM loaded."; "ROM loading failed!" = "ROM loading failed!"; "Unloading ROM..." = "Unloading ROM..."; "ROM unloaded." = "ROM unloaded."; "Emulator resetting..." = "Emulator resetting..."; "Emulator reset." = "Emulator reset."; "Cannot generate the save file path!" = "Cannot generate the save file path!"; "Cannot create the save directory!" = "Cannot create the save directory!"; "Speed limit disabled." = "Speed limit disabled."; "Speed limit enabled." = "Speed limit enabled."; "Auto frame skip disabled." = "Auto frame skip disabled."; "Auto frame skip enabled." = "Auto frame skip enabled."; "Cheats disabled." = "Cheats disabled."; "Cheats enabled." = "Cheats enabled."; "HUD disabled." = "HUD disabled."; "HUD enabled." = "HUD enabled."; "Volume: %1.1f%%" = "Volume: %1.1f%%"; /* ROM Info Panel */ "No ROM loaded." = "No ROM loaded."; "%i bytes" = "%i bytes"; /* Display Mode Strings */ "Main" = "Main"; "Touch" = "Touch"; "Combo" = "Combo"; /* LEGACY STRINGS */ /* General */ "DeSmuME Emulator" = "DeSmuME Emulator"; "OK" = "OK"; "Cancel" = "Anuleaza"; /* File Menu */ //"Slot %d" = "Slot %d"; /* Emulation Menu */ //"Execute" = "Executa"; //"Pause" = "Pauza"; /* View Menu */ //"Show Status Bar" = "Show Status Bar"; "Hide Status Bar" = "Hide Status Bar"; /* Dialogs */ "Are you sure you want to quit?" = "Esti Sigur Ca Vrei Sa Iesi?"; "Are you sure you want to close the ROM?" = "Esti Sigur Ca Vrei Sa Inchizi Jocul?"; /* Status Bar Messages */ "No ROM loaded" = "Niciun Joc Nu Sa Incarcat"; "Executing" = "Executa"; "Paused" = "Pauza"; /* Preferences Window */ "DeSmuME Preferences" = "DeSmuME Preferences"; "Interface" = "Interfata"; "Controls" = "Tastatura"; "DS Firmware" = "DS Firmware"; "Yes" = "Da"; "No" = "Nu"; /* Interface Preferences */ "Execute Upon Load" = "Executa Cand Incarca"; "When Launching, Load" = "Cand Lansezi, Incarci"; "Nothing" = "Incarca Nimic"; "Last ROM" = "Incarca Ultimul Joc"; /* Control Preferences */ "A Button" = "A Buton"; "B Button" = "B Buton"; "X Button" = "X Buton"; "Y Button" = "Y Buton"; "L Button" = "L Buton"; "R Button" = "R Buton"; "Up" = "Sus Buton"; "Down" = "Jos Buton"; "Left" = "Stanga Buton"; "Right" = "Dreapta Buton"; "Start" = "Start Buton"; "Select" = "Select Buton"; "[UP]" = "Up Buton"; "[DOWN]" = "Down Buton"; "[LEFT]" = "Left Buton"; "[RIGHT]" = "Right Buton"; "[SPACE]" = "Space Bar"; "[ENTER]" = "Enter Buton"; /* Status Bar */ "No ROM loaded" = "Niciun Joc Nu E Incarcat"; "ROM Loaded" = "Joc Incarcat"; "Executing" = "Emulatia In Executare"; "Paused" = "Emulatia Pusa Pe Pauza"; "Reset" = "Emulatia Resetata"; /* Errors */ "Error" = "Error"; "An emulation error occurred" = "Sa Produs O Eroare La Emulatie"; desmume-0.9.9/src/cocoa/translations/Romanian.lproj/MainMenu (Legacy).strings0000644000175000017500000006676212140261564027663 0ustar guillaumeguillaume /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "About DeSmuME"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "Preferences& "; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = "Services"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = "Services"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "Hide DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Quit DeSmuME"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = "Show All"; /* Class = "NSTextFieldCell"; title = "Select Image Format:"; ObjectID = "212"; */ "212.title" = "Selecteaza Formatul Imaginii:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "215"; */ "215.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "PNG"; ObjectID = "216"; */ "216.title" = "PNG"; /* Class = "NSMenuItem"; title = "BMP"; ObjectID = "217"; */ "217.title" = "BMP"; /* Class = "NSMenuItem"; title = "GIF"; ObjectID = "218"; */ "218.title" = "GIF"; /* Class = "NSMenuItem"; title = "JPEG"; ObjectID = "219"; */ "219.title" = "JPEG"; /* Class = "NSMenuItem"; title = "TIFF"; ObjectID = "220"; */ "220.title" = "TIFF"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "227"; */ "227.title" = "Fisier"; /* Class = "NSMenu"; title = "File"; ObjectID = "228"; */ "228.title" = "Fisier"; /* Class = "NSMenuItem"; title = "Open ROM& "; ObjectID = "230"; */ "230.title" = "Deschide Un Joc& "; /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "231"; */ "231.title" = "Deschis Recent"; /* Class = "NSMenuItem"; title = "ROM Info..."; ObjectID = "233"; */ "233.title" = "Informatii Despre Joc..."; /* Class = "NSMenuItem"; title = "Save State As"; ObjectID = "234"; */ "234.title" = "Salveaza Stare Ca& "; /* Class = "NSMenuItem"; title = "Load State From..."; ObjectID = "235"; */ "235.title" = "Incarca Stare De La& "; /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "240"; */ "240.title" = "Deschis Recent"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "241"; */ "241.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Load State"; ObjectID = "252"; */ "252.title" = "Incarca Stare"; /* Class = "NSMenu"; title = "Load State"; ObjectID = "253"; */ "253.title" = "Incarca Stare"; /* Class = "NSMenuItem"; title = "Save State"; ObjectID = "255"; */ "255.title" = "Salveaza Stare"; /* Class = "NSMenu"; title = "Save State"; ObjectID = "256"; */ "256.title" = "Salveaza Stare"; /* Class = "NSMenuItem"; title = "Close ROM"; ObjectID = "259"; */ "259.title" = "Inchide ROM"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "260"; */ "260.title" = "Edit"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "261"; */ "261.title" = "Edit"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "262"; */ "262.title" = "Undo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "263"; */ "263.title" = "Redo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "265"; */ "265.title" = "Cut"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "266"; */ "266.title" = "Copy"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "267"; */ "267.title" = "Paste"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "269"; */ "269.title" = "Delete"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "270"; */ "270.title" = "Select All"; /* Class = "NSMenuItem"; title = "Emulation"; ObjectID = "336"; */ "336.title" = "Emulatie"; /* Class = "NSMenu"; title = "Emulation"; ObjectID = "337"; */ "337.title" = "Emulatie"; /* Class = "NSMenuItem"; title = "Execute"; ObjectID = "338"; */ "338.title" = "Executa"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "339"; */ "339.title" = "Vizualizeaza"; /* Class = "NSMenu"; title = "View"; ObjectID = "340"; */ "340.title" = "Vizualizeaza"; /* Class = "NSMenuItem"; title = "Size 1x"; ObjectID = "341"; */ "341.title" = "Marimea 1x"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "342"; */ "342.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "343"; */ "343.title" = "Tools"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "348"; */ "348.title" = "Fereastra"; /* Class = "NSMenu"; title = "Window"; ObjectID = "349"; */ "349.title" = "Fereastra"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "350"; */ "350.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "351"; */ "351.title" = "Zoom"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "353"; */ "353.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "357"; */ "357.title" = "Ajutor"; /* Class = "NSMenu"; title = "Help"; ObjectID = "358"; */ "358.title" = "Ajutor"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "359"; */ "359.title" = "DeSmuME Ajutor"; /* Class = "NSMenuItem"; title = "Go to Website"; ObjectID = "362"; */ "362.title" = "Du-Te La Website"; /* Class = "NSMenuItem"; title = "Go to Forums"; ObjectID = "363"; */ "363.title" = "Du-Te La Forums"; /* Class = "NSMenuItem"; title = "Submit a Bug Report"; ObjectID = "364"; */ "364.title" = "Raporteaza O Eroare"; /* Class = "NSMenuItem"; title = "Show Support Folder in Finder"; ObjectID = "368"; */ "368.title" = "Show Support Folder in Finder"; /* Class = "NSWindow"; title = "DeSmuME"; ObjectID = "388"; */ "388.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "Status Text"; ObjectID = "398"; */ "398.placeholderString" = "Status Text"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "424"; */ "424.title" = "Reset"; /* Class = "NSMenuItem"; title = "Speed Limit"; ObjectID = "427"; */ "427.title" = "Vitza Limita"; /* Class = "NSMenu"; title = "Speed Limit"; ObjectID = "428"; */ "428.title" = "Vitza Limita"; /* Class = "NSMenuItem"; title = "1/4 Speed"; ObjectID = "429"; */ "429.title" = "25% Vitza Limita"; /* Class = "NSMenuItem"; title = "Backup Media Type"; ObjectID = "430"; */ "430.title" = "Backup Media Type"; /* Class = "NSMenu"; title = "Backup Media Type"; ObjectID = "431"; */ "431.title" = "Backup Media Type"; /* Class = "NSMenuItem"; title = "Auto Detect"; ObjectID = "432"; */ "432.title" = "Auto Detect"; /* Class = "NSMenuItem"; title = "EEPROM 4kbit"; ObjectID = "434"; */ "434.title" = "EEPROM 4kbit"; /* Class = "NSMenuItem"; title = "EEPROM 64kbit"; ObjectID = "435"; */ "435.title" = "EEPROM 64kbit"; /* Class = "NSMenuItem"; title = "EEPROM 512kbit"; ObjectID = "436"; */ "436.title" = "EEPROM 512kbit"; /* Class = "NSMenuItem"; title = "FRAM 256kbit"; ObjectID = "437"; */ "437.title" = "FRAM 256kbit"; /* Class = "NSMenuItem"; title = "FLASH 2mbit"; ObjectID = "438"; */ "438.title" = "FLASH 2mbit"; /* Class = "NSMenuItem"; title = "FLASH 4mbit"; ObjectID = "439"; */ "439.title" = "FLASH 4mbit"; /* Class = "NSMenuItem"; title = "1/2 Speed"; ObjectID = "440"; */ "440.title" = "50% Vitza Limita"; /* Class = "NSMenuItem"; title = "3/4 Speed"; ObjectID = "441"; */ "441.title" = "75% Vitza Limita"; /* Class = "NSMenuItem"; title = "Normal Speed"; ObjectID = "443"; */ "443.title" = "100% Vitza Limita"; /* Class = "NSMenuItem"; title = "Double Speed"; ObjectID = "445"; */ "445.title" = "200% Vitza Limita"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "446"; */ "446.title" = "Fara Vitza Limita"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "448"; */ "448.title" = "Vitza Limita Reglabila"; /* Class = "NSMenuItem"; title = "Size 2x"; ObjectID = "449"; */ "449.title" = "Marimea 2x"; /* Class = "NSMenuItem"; title = "Size 3x"; ObjectID = "450"; */ "450.title" = "Marimea 3x"; /* Class = "NSMenuItem"; title = "Size 4x"; ObjectID = "451"; */ "451.title" = "Marimea 4x"; /* Class = "NSMenuItem"; title = "No Smaller Than DS"; ObjectID = "454"; */ "454.title" = "No Smaller Than DS"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "455"; */ "455.title" = "Show Status Bar"; /* Class = "NSMenuItem"; title = "Rotation"; ObjectID = "457"; */ "457.title" = "Rotaia"; /* Class = "NSMenu"; title = "Rotation"; ObjectID = "458"; */ "458.title" = "Rotaia"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "459"; */ "459.title" = "0"; /* Class = "NSMenuItem"; title = "Layers"; ObjectID = "461"; */ "461.title" = "Straturi"; /* Class = "NSMenu"; title = "Layers"; ObjectID = "462"; */ "462.title" = "Straturi"; /* Class = "NSMenuItem"; title = "Top BG0"; ObjectID = "463"; */ "463.title" = "Top BG0"; /* Class = "NSMenuItem"; title = "Save Screenshot..."; ObjectID = "465"; */ "465.title" = "Salveaza Screenshot& "; /* Class = "NSMenuItem"; title = "90"; ObjectID = "466"; */ "466.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "467"; */ "467.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "468"; */ "468.title" = "270"; /* Class = "NSMenuItem"; title = "Top BG1"; ObjectID = "469"; */ "469.title" = "Top BG1"; /* Class = "NSMenuItem"; title = "Top BG2"; ObjectID = "470"; */ "470.title" = "Top BG2"; /* Class = "NSMenuItem"; title = "Top BG3"; ObjectID = "471"; */ "471.title" = "Top BG3"; /* Class = "NSMenuItem"; title = "Top OBJ"; ObjectID = "472"; */ "472.title" = "Top OBJ"; /* Class = "NSMenuItem"; title = "Sub BG0"; ObjectID = "474"; */ "474.title" = "Sub BG0"; /* Class = "NSMenuItem"; title = "Sub BG1"; ObjectID = "475"; */ "475.title" = "Sub BG1"; /* Class = "NSMenuItem"; title = "Sub BG2"; ObjectID = "476"; */ "476.title" = "Sub BG2"; /* Class = "NSMenuItem"; title = "Sub BG3"; ObjectID = "477"; */ "477.title" = "Sub BG3"; /* Class = "NSMenuItem"; title = "Sub OBJ"; ObjectID = "478"; */ "478.title" = "Sub OBJ"; /* Class = "NSPanel"; title = "Custom Speed Limit Window"; ObjectID = "552"; */ "552.title" = "Custom Speed Limit Window"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "565"; */ "565.title" = "0x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "566"; */ "566.title" = "10x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "567"; */ "567.title" = "2x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "568"; */ "568.title" = "4x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "569"; */ "569.title" = "6x"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "570"; */ "570.title" = "8x"; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "571"; */ "571.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "572"; */ "572.title" = "Speed limit set to: "; /* Class = "NSTextFieldCell"; placeholderString = "speedX"; ObjectID = "573"; */ "573.placeholderString" = "speedX"; /* Class = "NSPanel"; title = "ROM Info"; ObjectID = "587"; */ "587.title" = "Informatii Despre Joc"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "731"; */ "731.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ROM Size:"; ObjectID = "732"; */ "732.title" = "Marimea Jocului:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "733"; */ "733.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Maker:"; ObjectID = "734"; */ "734.title" = "Cel Care A Facut Jocul:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "735"; */ "735.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Title:"; ObjectID = "736"; */ "736.title" = "Numele Jocului:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "737"; */ "737.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "File:"; ObjectID = "738"; */ "738.title" = "Fifierul Jocului:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "745"; */ "745.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM9 Size:"; ObjectID = "746"; */ "746.title" = "Marimea ARM9:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "750"; */ "750.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM7 Size:"; ObjectID = "751"; */ "751.title" = "Marimea ARM7:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "755"; */ "755.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "Data Size:"; ObjectID = "756"; */ "756.title" = "Marimea Datei:"; /* Class = "NSWindow"; title = "About DeSmuME"; ObjectID = "774"; */ "774.title" = "About DeSmuME"; /* Class = "NSTabViewItem"; label = "Read Me"; ObjectID = "779"; */ "779.label" = "Citeste-Ma"; /* Class = "NSTabViewItem"; label = "License"; ObjectID = "780"; */ "780.label" = "Licenta"; /* Class = "NSTabViewItem"; label = "Authors"; ObjectID = "783"; */ "783.label" = "Autorii"; /* Class = "NSTabViewItem"; label = "Change Log"; ObjectID = "785"; */ "785.label" = "Schimba Log"; /* Class = "NSTextFieldCell"; title = "DeSmuME"; ObjectID = "788"; */ "788.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; title = "Nintendo DS Emulator"; ObjectID = "790"; */ "790.title" = "Nintendo DS Emulator"; /* Class = "NSTextFieldCell"; placeholderString = "Version ?"; ObjectID = "792"; */ "792.placeholderString" = "Version ?"; /* Class = "NSTextFieldCell"; placeholderString = "Date"; ObjectID = "794"; */ "794.placeholderString" = "Date"; /* Class = "NSTextFieldCell"; title = "http://www.desmume.org"; ObjectID = "796"; */ "796.title" = "http://www.desmume.org"; /* Class = "NSButtonCell"; title = "Enable Speed Limiter"; ObjectID = "835"; */ "835.title" = "Enable Speed Limiter"; /* Class = "NSMenuItem"; title = "JPEG 2000"; ObjectID = "848"; */ "848.title" = "JPEG 2000"; desmume-0.9.9/src/cocoa/translations/Norwegian.lproj/0000755000175000017500000000000012140306213023364 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/translations/Norwegian.lproj/Localizable.strings0000644000175000017500000002307412140261574027240 0ustar guillaumeguillaume/* DeSmuME Strings File */ /* NORWEGIAN */ /* Dialog Box Titles */ "Open ROM" = "Open ROM"; "Open State File" = "Open State File"; "Save State File" = "Save State File"; "Import ROM Save File" = "Import ROM Save File"; "Export ROM Save File" = "Export ROM Save File"; "Select ROM" = "Select ROM"; "Select ADVANsCEne Database" = "Select ADVANsCEne Database"; "Select R4 Cheat Database" = "Select R4 Cheat Database"; "Select ARM7 BIOS Image" = "Select ARM7 BIOS Image"; "Select ARM9 BIOS Image" = "Select ARM9 BIOS Image"; "Select Firmware Image" = "Select Firmware Image"; "Save Screenshot" = "Save Screenshot"; /* Menus */ "Execute" = "Kjr"; "Pause" = "Pause"; "Disable Speed Limit" = "Disable Speed Limit"; "Enable Speed Limit" = "Enable Speed Limit"; "Disable Auto Frame Skip" = "Disable Auto Frame Skip"; "Enable Auto Frame Skip" = "Enable Auto Frame Skip"; "Disable Cheats" = "Disable Cheats"; "Enable Cheats" = "Enable Cheats"; "Disable HUD" = "Disable HUD"; "Enable HUD" = "Enable HUD"; "Hide Status Bar" = "Hide Status Bar"; "Show Status Bar" = "Vis Status Linje"; "Speed 1x" = "Speed 1x"; "Speed 2x" = "Speed 2x"; "Slot %d" = "Plass %d"; /* Alert Text */ "A critical file is missing. DeSmuME will now quit." = "A critical file is missing. DeSmuME will now quit."; "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME." = "The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME."; /* Status Text */ "Ready." = "Ready."; "Save state file loading failed!" = "Save state file loading failed!"; "Save state file loaded." = "Save state file loaded."; "Save state file saving failed!" = "Save state file saving failed!"; "Save state file saved." = "Save state file saved."; "Save state file reverting failed!" = "Save state file reverting failed!"; "Save state file reverted." = "Save state file reverted."; "ROM save file import failed!" = "ROM save file import failed!"; "ROM save file imported." = "ROM save file imported."; "ROM save file export failed!" = "ROM save file export failed!"; "ROM save file exported." = "ROM save file exported."; "Loading ROM..." = "Loading ROM..."; "ROM loaded." = "ROM loaded."; "ROM loading failed!" = "ROM loading failed!"; "Unloading ROM..." = "Unloading ROM..."; "ROM unloaded." = "ROM unloaded."; "Emulator resetting..." = "Emulator resetting..."; "Emulator reset." = "Emulator reset."; "Cannot generate the save file path!" = "Cannot generate the save file path!"; "Cannot create the save directory!" = "Cannot create the save directory!"; "Speed limit disabled." = "Speed limit disabled."; "Speed limit enabled." = "Speed limit enabled."; "Auto frame skip disabled." = "Auto frame skip disabled."; "Auto frame skip enabled." = "Auto frame skip enabled."; "Cheats disabled." = "Cheats disabled."; "Cheats enabled." = "Cheats enabled."; "HUD disabled." = "HUD disabled."; "HUD enabled." = "HUD enabled."; "Volume: %1.1f%%" = "Volume: %1.1f%%"; /* ROM Info Panel */ "No ROM loaded." = "No ROM loaded."; "%i bytes" = "%i bytes"; /* Display Mode Strings */ "Main" = "Main"; "Touch" = "Touch"; "Combo" = "Combo"; /* LEGACY STRINGS */ /* General */ "DeSmuME Emulator" = "DeSmuME Emulator"; "OK" = "OK"; "Cancel" = "Avbryt"; /* File Menu */ //"Slot %d" = "Plass %d"; /* Emulation Menu */ //"Execute" = "Kjr"; //"Pause" = "Pause"; /* View Menu */ //"Show Status Bar" = "Vis Status Linje"; "Hide Status Bar" = "Hide Status Bar"; /* Dialogs */ "Are you sure you want to quit?" = "Er du sikker p at du vil avslutte?"; "Are you sure you want to close the ROM?" = "Er du sikker p at du vil lukke ROM'en?"; /* Status Bar Messages */ "No ROM Loaded" = "Ingen ROM Lastet"; "Executing" = "Kjrer"; "Paused" = "Pauset"; /* Preferences Window */ "DeSmuME Preferences" = "DeSmuME Valg"; "Interface" = "Grensesnitt"; "Controls" = "Kontroller"; "DS Firmware" = "DS Firmware"; "Yes" = "Ja"; "No" = "Nei"; /* Interface Preferences */ "Execute Upon Load" = "Kjr Nr Lastet"; "When Launching, Load" = "P Oppstart, Last"; "Load Nothing" = "Last Ingenting"; "Load Last ROM" = "Last Siste ROM"; /* Control Preferences */ "A Button" = "A Knapp"; "B Button" = "B Knapp2"; "X Button" = "X Knapp"; "Y Button" = "Y Knapp"; "L Button" = "L Knapp"; "R Button" = "R Knapp"; "Up Button" = "Opp"; "Down Button" = "Ned"; "Left Button" = "Venstre"; "Right Button" = "Hyre"; "Start Button" = "Start Knapp"; "Select Button" = "Select Knapp"; "Up Key" = "Opp tast"; "Down Key" = "Ned tast"; "Left Key" = "Venstre tast"; "Right Key" = "Hyre tast"; "Space Bar" = "Mellomrom tast"; "Enter Key" = "Enter tast"; /* Status Bar */ "No ROM loaded" = "Ingen ROM lastet"; "ROM Loaded" = "ROM Lastet"; "Emulation Executing" = "Emulering Kjrer"; "Emulation Paused" = "Emulering Pauset"; "Emulation Reset" = "Emulering Restartet"; /* Errors */ "Error" = "Feil"; "An emulation error occurred" = "En emulerings feil oppstod"; desmume-0.9.9/src/cocoa/translations/Norwegian.lproj/MainMenu (Legacy).strings0000644000175000017500000006644012140261574030042 0ustar guillaumeguillaume /* Class = "NSMenu"; title = "MainMenu"; ObjectID = "29"; */ "29.title" = "MainMenu"; /* Class = "NSMenuItem"; title = "DeSmuME"; ObjectID = "56"; */ "56.title" = "DeSmuME"; /* Class = "NSMenu"; title = "DeSmuME"; ObjectID = "57"; */ "57.title" = "DeSmuME"; /* Class = "NSMenuItem"; title = "About DeSmuME"; ObjectID = "58"; */ "58.title" = "Om DeSmuME"; /* Class = "NSMenuItem"; title = "Preferences& "; ObjectID = "129"; */ "129.title" = "Valg& "; /* Class = "NSMenu"; title = "Services"; ObjectID = "130"; */ "130.title" = "Tjenester"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "131"; */ "131.title" = "Tjenester"; /* Class = "NSMenuItem"; title = "Hide DeSmuME"; ObjectID = "134"; */ "134.title" = "Skjul DeSmuME"; /* Class = "NSMenuItem"; title = "Quit DeSmuME"; ObjectID = "136"; */ "136.title" = "Avslutt DeSmuMe"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "145"; */ "145.title" = "Skjul Andre"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "150"; */ "150.title" = "Vis Alle"; /* Class = "NSTextFieldCell"; title = "Select Image Format:"; ObjectID = "212"; */ "212.title" = "Select Image Format:"; /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "215"; */ "215.title" = "OtherViews"; /* Class = "NSMenuItem"; title = "PNG"; ObjectID = "216"; */ "216.title" = "PNG"; /* Class = "NSMenuItem"; title = "BMP"; ObjectID = "217"; */ "217.title" = "BMP"; /* Class = "NSMenuItem"; title = "GIF"; ObjectID = "218"; */ "218.title" = "GIF"; /* Class = "NSMenuItem"; title = "JPEG"; ObjectID = "219"; */ "219.title" = "JPEG"; /* Class = "NSMenuItem"; title = "TIFF"; ObjectID = "220"; */ "220.title" = "TIFF"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "227"; */ "227.title" = "Fil"; /* Class = "NSMenu"; title = "File"; ObjectID = "228"; */ "228.title" = "Fil"; /* Class = "NSMenuItem"; title = "Open ROM& "; ObjectID = "230"; */ "230.title" = "pne ROM& "; /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "231"; */ "231.title" = "pne Nylig"; /* Class = "NSMenuItem"; title = "ROM Info..."; ObjectID = "233"; */ "233.title" = "ROM Info& "; /* Class = "NSMenuItem"; title = "Save State As"; ObjectID = "234"; */ "234.title" = "Lagre Status Som& "; /* Class = "NSMenuItem"; title = "Load State From..."; ObjectID = "235"; */ "235.title" = "Laste Status Fra& "; /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "240"; */ "240.title" = "pne Nylig"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "241"; */ "241.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Load State"; ObjectID = "252"; */ "252.title" = "Laste Status"; /* Class = "NSMenu"; title = "Load State"; ObjectID = "253"; */ "253.title" = "Laste Status"; /* Class = "NSMenuItem"; title = "Save State"; ObjectID = "255"; */ "255.title" = "Lagre Status"; /* Class = "NSMenu"; title = "Save State"; ObjectID = "256"; */ "256.title" = "Lagre Status"; /* Class = "NSMenuItem"; title = "Close ROM"; ObjectID = "259"; */ "259.title" = "Lukk ROM"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "260"; */ "260.title" = "Edit"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "261"; */ "261.title" = "Edit"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "262"; */ "262.title" = "Undo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "263"; */ "263.title" = "Redo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "265"; */ "265.title" = "Cut"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "266"; */ "266.title" = "Copy"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "267"; */ "267.title" = "Paste"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "269"; */ "269.title" = "Delete"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "270"; */ "270.title" = "Select All"; /* Class = "NSMenuItem"; title = "Emulation"; ObjectID = "336"; */ "336.title" = "Emulering"; /* Class = "NSMenu"; title = "Emulation"; ObjectID = "337"; */ "337.title" = "Emulering"; /* Class = "NSMenuItem"; title = "Execute"; ObjectID = "338"; */ "338.title" = "Kjr"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "339"; */ "339.title" = "Se"; /* Class = "NSMenu"; title = "View"; ObjectID = "340"; */ "340.title" = "Se"; /* Class = "NSMenuItem"; title = "Size 1x"; ObjectID = "341"; */ "341.title" = "Strrelse 1x"; /* Class = "NSMenuItem"; title = "Tools"; ObjectID = "342"; */ "342.title" = "Tools"; /* Class = "NSMenu"; title = "Tools"; ObjectID = "343"; */ "343.title" = "Tools"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "348"; */ "348.title" = "Vindu"; /* Class = "NSMenu"; title = "Window"; ObjectID = "349"; */ "349.title" = "Vindu"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "350"; */ "350.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "351"; */ "351.title" = "Zoom"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "353"; */ "353.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "357"; */ "357.title" = "Hjelp"; /* Class = "NSMenu"; title = "Help"; ObjectID = "358"; */ "358.title" = "Hjelp"; /* Class = "NSMenuItem"; title = "DeSmuME Help"; ObjectID = "359"; */ "359.title" = "DeSmuME Hjelp"; /* Class = "NSMenuItem"; title = "Go to Website"; ObjectID = "362"; */ "362.title" = "G Til Hjemmeside"; /* Class = "NSMenuItem"; title = "Go to Forums"; ObjectID = "363"; */ "363.title" = "G Til Forum"; /* Class = "NSMenuItem"; title = "Submit a Bug Report"; ObjectID = "364"; */ "364.title" = "Send Inn En Feil Rapport"; /* Class = "NSMenuItem"; title = "Show Support Folder in Finder"; ObjectID = "368"; */ "368.title" = "Show Support Folder in Finder"; /* Class = "NSWindow"; title = "DeSmuME"; ObjectID = "388"; */ "388.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; placeholderString = "Status Text"; ObjectID = "398"; */ "398.placeholderString" = "Status Text"; /* Class = "NSMenuItem"; title = "Reset"; ObjectID = "424"; */ "424.title" = "Restart"; /* Class = "NSMenuItem"; title = "Speed Limit"; ObjectID = "427"; */ "427.title" = "Fart Begrensning"; /* Class = "NSMenu"; title = "Speed Limit"; ObjectID = "428"; */ "428.title" = "Fart Begrensning"; /* Class = "NSMenuItem"; title = "1/4 Speed"; ObjectID = "429"; */ "429.title" = "Fart Begrensning 25%"; /* Class = "NSMenuItem"; title = "Backup Media Type"; ObjectID = "430"; */ "430.title" = "Backup Media Type"; /* Class = "NSMenu"; title = "Backup Media Type"; ObjectID = "431"; */ "431.title" = "Backup Media Type"; /* Class = "NSMenuItem"; title = "Auto Detect"; ObjectID = "432"; */ "432.title" = "Auto Detect"; /* Class = "NSMenuItem"; title = "EEPROM 4kbit"; ObjectID = "434"; */ "434.title" = "EEPROM 4kbit"; /* Class = "NSMenuItem"; title = "EEPROM 64kbit"; ObjectID = "435"; */ "435.title" = "EEPROM 64kbit"; /* Class = "NSMenuItem"; title = "EEPROM 512kbit"; ObjectID = "436"; */ "436.title" = "EEPROM 512kbit"; /* Class = "NSMenuItem"; title = "FRAM 256kbit"; ObjectID = "437"; */ "437.title" = "FRAM 256kbit"; /* Class = "NSMenuItem"; title = "FLASH 2mbit"; ObjectID = "438"; */ "438.title" = "FLASH 2mbit"; /* Class = "NSMenuItem"; title = "FLASH 4mbit"; ObjectID = "439"; */ "439.title" = "FLASH 4mbit"; /* Class = "NSMenuItem"; title = "1/2 Speed"; ObjectID = "440"; */ "440.title" = "Fart Begrensning 50%"; /* Class = "NSMenuItem"; title = "3/4 Speed"; ObjectID = "441"; */ "441.title" = "Fart Begrensning 75%"; /* Class = "NSMenuItem"; title = "Normal Speed"; ObjectID = "443"; */ "443.title" = "Fart Begrensning 100%"; /* Class = "NSMenuItem"; title = "Double Speed"; ObjectID = "445"; */ "445.title" = "Fart Begrensning 200%"; /* Class = "NSMenuItem"; title = "None"; ObjectID = "446"; */ "446.title" = "Ingen Fart Begrensning"; /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "448"; */ "448.title" = "Egen Fart Begrensning"; /* Class = "NSMenuItem"; title = "Size 2x"; ObjectID = "449"; */ "449.title" = "Strrelse 2x"; /* Class = "NSMenuItem"; title = "Size 3x"; ObjectID = "450"; */ "450.title" = "Strrelse 3x"; /* Class = "NSMenuItem"; title = "Size 4x"; ObjectID = "451"; */ "451.title" = "Strrelse 4x"; /* Class = "NSMenuItem"; title = "No Smaller Than DS"; ObjectID = "454"; */ "454.title" = "Ikke Mindre Enn DS"; /* Class = "NSMenuItem"; title = "Show Status Bar"; ObjectID = "455"; */ "455.title" = "Vis Status Linje"; /* Class = "NSMenuItem"; title = "Rotation"; ObjectID = "457"; */ "457.title" = "Rotasjon"; /* Class = "NSMenu"; title = "Rotation"; ObjectID = "458"; */ "458.title" = "Rotasjon"; /* Class = "NSMenuItem"; title = "0"; ObjectID = "459"; */ "459.title" = "0"; /* Class = "NSMenuItem"; title = "Layers"; ObjectID = "461"; */ "461.title" = "Lag"; /* Class = "NSMenu"; title = "Layers"; ObjectID = "462"; */ "462.title" = "Lag"; /* Class = "NSMenuItem"; title = "Top BG0"; ObjectID = "463"; */ "463.title" = "Top BG0"; /* Class = "NSMenuItem"; title = "Save Screenshot..."; ObjectID = "465"; */ "465.title" = "Lagre Skjermdump& "; /* Class = "NSMenuItem"; title = "90"; ObjectID = "466"; */ "466.title" = "90"; /* Class = "NSMenuItem"; title = "180"; ObjectID = "467"; */ "467.title" = "180"; /* Class = "NSMenuItem"; title = "270"; ObjectID = "468"; */ "468.title" = "270"; /* Class = "NSMenuItem"; title = "Top BG1"; ObjectID = "469"; */ "469.title" = "Top BG1"; /* Class = "NSMenuItem"; title = "Top BG2"; ObjectID = "470"; */ "470.title" = "Top BG2"; /* Class = "NSMenuItem"; title = "Top BG3"; ObjectID = "471"; */ "471.title" = "Top BG3"; /* Class = "NSMenuItem"; title = "Top OBJ"; ObjectID = "472"; */ "472.title" = "Top OBJ"; /* Class = "NSMenuItem"; title = "Sub BG0"; ObjectID = "474"; */ "474.title" = "Sub BG0"; /* Class = "NSMenuItem"; title = "Sub BG1"; ObjectID = "475"; */ "475.title" = "Sub BG1"; /* Class = "NSMenuItem"; title = "Sub BG2"; ObjectID = "476"; */ "476.title" = "Sub BG2"; /* Class = "NSMenuItem"; title = "Sub BG3"; ObjectID = "477"; */ "477.title" = "Sub BG3"; /* Class = "NSMenuItem"; title = "Sub OBJ"; ObjectID = "478"; */ "478.title" = "Sub OBJ"; /* Class = "NSPanel"; title = "Custom Speed Limit Window"; ObjectID = "552"; */ "552.title" = "Egen Fart Begrensning Vindu"; /* Class = "NSTextFieldCell"; title = "0x"; ObjectID = "565"; */ "565.title" = "0x"; /* Class = "NSTextFieldCell"; title = "10x"; ObjectID = "566"; */ "566.title" = "10x"; /* Class = "NSTextFieldCell"; title = "2x"; ObjectID = "567"; */ "567.title" = "2x"; /* Class = "NSTextFieldCell"; title = "4x"; ObjectID = "568"; */ "568.title" = "4x"; /* Class = "NSTextFieldCell"; title = "6x"; ObjectID = "569"; */ "569.title" = "6x"; /* Class = "NSTextFieldCell"; title = "8x"; ObjectID = "570"; */ "570.title" = "8x"; /* Class = "NSButtonCell"; title = "Set to Normal Speed"; ObjectID = "571"; */ "571.title" = "Set to Normal Speed"; /* Class = "NSTextFieldCell"; title = "Speed limit set to: "; ObjectID = "572"; */ "572.title" = "Speed limit set to: "; /* Class = "NSTextFieldCell"; placeholderString = "speedX"; ObjectID = "573"; */ "573.placeholderString" = "speedX"; /* Class = "NSPanel"; title = "ROM Info"; ObjectID = "587"; */ "587.title" = "ROM Info"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "731"; */ "731.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ROM Size:"; ObjectID = "732"; */ "732.title" = "Strrelse:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "733"; */ "733.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Maker:"; ObjectID = "734"; */ "734.title" = "Skaper:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "735"; */ "735.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "Title:"; ObjectID = "736"; */ "736.title" = "Tittel:"; /* Class = "NSTextFieldCell"; placeholderString = "?"; ObjectID = "737"; */ "737.placeholderString" = "?"; /* Class = "NSTextFieldCell"; title = "File:"; ObjectID = "738"; */ "738.title" = "Fil:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "745"; */ "745.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM9 Size:"; ObjectID = "746"; */ "746.title" = "ARM9 Strrelse:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "750"; */ "750.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "ARM7 Size:"; ObjectID = "751"; */ "751.title" = "ARM7 Strrelse:"; /* Class = "NSTextFieldCell"; placeholderString = "? bytes"; ObjectID = "755"; */ "755.placeholderString" = "? bytes"; /* Class = "NSTextFieldCell"; title = "Data Size:"; ObjectID = "756"; */ "756.title" = "Data Strrelse:"; /* Class = "NSWindow"; title = "About DeSmuME"; ObjectID = "774"; */ "774.title" = "About DeSmuME"; /* Class = "NSTabViewItem"; label = "Read Me"; ObjectID = "779"; */ "779.label" = "Les Meg"; /* Class = "NSTabViewItem"; label = "License"; ObjectID = "780"; */ "780.label" = "Lisens"; /* Class = "NSTabViewItem"; label = "Authors"; ObjectID = "783"; */ "783.label" = "Forfattere"; /* Class = "NSTabViewItem"; label = "Change Log"; ObjectID = "785"; */ "785.label" = "Endrings Logg"; /* Class = "NSTextFieldCell"; title = "DeSmuME"; ObjectID = "788"; */ "788.title" = "DeSmuME"; /* Class = "NSTextFieldCell"; title = "Nintendo DS Emulator"; ObjectID = "790"; */ "790.title" = "Nintendo DS Emulator"; /* Class = "NSTextFieldCell"; placeholderString = "Version ?"; ObjectID = "792"; */ "792.placeholderString" = "Version ?"; /* Class = "NSTextFieldCell"; placeholderString = "Date"; ObjectID = "794"; */ "794.placeholderString" = "Date"; /* Class = "NSTextFieldCell"; title = "http://www.desmume.org"; ObjectID = "796"; */ "796.title" = "http://www.desmume.org"; /* Class = "NSButtonCell"; title = "Enable Speed Limiter"; ObjectID = "835"; */ "835.title" = "Enable Speed Limiter"; /* Class = "NSMenuItem"; title = "JPEG 2000"; ObjectID = "848"; */ "848.title" = "JPEG 2000"; desmume-0.9.9/src/cocoa/sndOSX.cpp0000644000175000017500000001054712140261603017461 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2007-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "sndOSX.h" #include "coreaudiosound.h" #include "cocoa_globals.h" // Global sound playback manager static CoreAudioOutput *coreAudioPlaybackManager = NULL; static pthread_mutex_t *mutexAudioSampleReadWrite = NULL; pthread_mutex_t *mutexAudioEmulateCore = NULL; // Sound interface to the SPU SoundInterface_struct SNDOSX = { SNDCORE_OSX, "OS X Core Audio Sound Interface", SNDOSXInit, SNDOSXDeInit, SNDOSXUpdateAudio, SNDOSXGetAudioSpace, SNDOSXMuteAudio, SNDOSXUnMuteAudio, SNDOSXSetVolume, SNDOSXClearBuffer, SNDOSXFetchSamples, SNDOSXPostProcessSamples }; SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDOSX, NULL }; int SNDOSXInit(int buffer_size) { CoreAudioOutput *oldcoreAudioPlaybackManager = coreAudioPlaybackManager; coreAudioPlaybackManager = new CoreAudioOutput(buffer_size / SPU_SAMPLE_SIZE, SPU_SAMPLE_SIZE); delete oldcoreAudioPlaybackManager; if (mutexAudioSampleReadWrite == NULL) { mutexAudioSampleReadWrite = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(mutexAudioSampleReadWrite, NULL); } coreAudioPlaybackManager->start(); return 0; } void SNDOSXDeInit() { delete coreAudioPlaybackManager; coreAudioPlaybackManager = NULL; if (mutexAudioSampleReadWrite != NULL) { pthread_mutex_destroy(mutexAudioSampleReadWrite); free(mutexAudioSampleReadWrite); mutexAudioSampleReadWrite = NULL; } } int SNDOSXReset() { SNDOSXClearBuffer(); return 0; } void SNDOSXUpdateAudio(s16 *buffer, u32 num_samples) { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->writeToBuffer(buffer, num_samples); } u32 SNDOSXGetAudioSpace() { if (coreAudioPlaybackManager == NULL) { return 0; } return (u32)coreAudioPlaybackManager->getAvailableSamples(); } void SNDOSXMuteAudio() { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->mute(); } void SNDOSXUnMuteAudio() { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->unmute(); } void SNDOSXSetVolume(int volume) { if (coreAudioPlaybackManager == NULL) { return; } float newVolumeScalar = (float)volume / 100.0f; if(volume > 100) { newVolumeScalar = 1.0f; } else if(volume < 0) { newVolumeScalar = 0.0f; } coreAudioPlaybackManager->setVolume(newVolumeScalar); } void SNDOSXClearBuffer() { if (coreAudioPlaybackManager == NULL) { return; } coreAudioPlaybackManager->clearBuffer(); } void SNDOSXFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { if (mutexAudioSampleReadWrite == NULL) { return; } pthread_mutex_lock(mutexAudioSampleReadWrite); SPU_DefaultFetchSamples(sampleBuffer, sampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioSampleReadWrite); } size_t SNDOSXPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { size_t processedSampleCount = 0; switch (synchMode) { case ESynchMode_DualSynchAsynch: if (mutexAudioEmulateCore != NULL) { pthread_mutex_lock(mutexAudioEmulateCore); processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, requestedSampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioEmulateCore); } break; case ESynchMode_Synchronous: if (mutexAudioSampleReadWrite != NULL) { pthread_mutex_lock(mutexAudioSampleReadWrite); processedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, requestedSampleCount, synchMode, theSynchronizer); pthread_mutex_unlock(mutexAudioSampleReadWrite); } break; default: break; } return processedSampleCount; } desmume-0.9.9/src/cocoa/cocoa_cheat.mm0000644000175000017500000006440012140261603020357 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_cheat.h" #import "cocoa_core.h" #import "cocoa_globals.h" #import "cocoa_util.h" #include "../MMU.h" @implementation CocoaDSCheatItem static NSImage *iconInternalCheat = nil; static NSImage *iconActionReplay = nil; static NSImage *iconCodeBreaker = nil; @dynamic data; @synthesize willAdd; @dynamic enabled; @dynamic cheatType; @dynamic cheatTypeIcon; @dynamic isSupportedCheatType; @dynamic freezeType; @dynamic description; @dynamic codeCount; @dynamic code; @dynamic memAddress; @dynamic memAddressString; @dynamic memAddressSixDigitString; @dynamic bytes; @dynamic value; @synthesize workingCopy; @synthesize parent; - (id) init { return [self initWithCheatData:nil]; } - (id) initWithCheatData:(CHEATS_LIST *)cheatData { self = [super init]; if(self == nil) { return self; } if (cheatData == NULL) { // Allocate our own cheat item struct since we weren't provided with one. internalData = (CHEATS_LIST *)malloc(sizeof(CHEATS_LIST)); if (internalData == NULL) { [self release]; return nil; } data = internalData; self.enabled = NO; self.cheatType = CHEAT_TYPE_INTERNAL; self.freezeType = 0; self.description = @""; self.code = @""; self.memAddress = 0x00000000; self.bytes = 1; self.value = 0; } else { internalData = NULL; data = cheatData; } if (iconInternalCheat == nil || iconActionReplay == nil || iconCodeBreaker == nil) { iconInternalCheat = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AppIcon_DeSmuME" ofType:@"icns"]]; iconActionReplay = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ActionReplay_128x128" ofType:@"png"]]; iconCodeBreaker = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_CodeBreaker_128x128" ofType:@"png"]]; } pthread_mutex_init(&mutexData, NULL); willAdd = NO; workingCopy = nil; parent = nil; return self; } - (void) dealloc { [self destroyWorkingCopy]; free(internalData); internalData = NULL; pthread_mutex_destroy(&mutexData); [super dealloc]; } - (CHEATS_LIST *) data { pthread_mutex_lock(&mutexData); CHEATS_LIST *returnData = data; pthread_mutex_unlock(&mutexData); return returnData; } - (void) setData:(CHEATS_LIST *)cheatData { if (cheatData == NULL) { return; } pthread_mutex_lock(&mutexData); data = cheatData; pthread_mutex_unlock(&mutexData); [self update]; if (workingCopy != nil) { pthread_mutex_lock(&mutexData); CHEATS_LIST *thisData = data; CHEATS_LIST *workingData = workingCopy.data; *workingData = *thisData; pthread_mutex_unlock(&mutexData); [workingCopy update]; } } - (BOOL) retainData { BOOL result = YES; if (internalData == NULL) { internalData = (CHEATS_LIST *)malloc(sizeof(CHEATS_LIST)); if (internalData == NULL) { result = NO; return result; } } pthread_mutex_lock(&mutexData); *internalData = *data; data = internalData; pthread_mutex_unlock(&mutexData); return result; } - (BOOL) enabled { return data->enabled; } - (void) setEnabled:(BOOL)theState { data->enabled = theState; if (workingCopy != nil) { workingCopy.enabled = theState; } } - (NSString *) description { return [NSString stringWithCString:(const char *)&data->description[0] encoding:NSUTF8StringEncoding]; } - (void) setDescription:(NSString *)desc { if (desc == nil) { memset(&data->description[0], 0, sizeof(data->description)); } else { [desc getCString:&data->description[0] maxLength:sizeof(data->description) encoding:NSUTF8StringEncoding]; } if (workingCopy != nil) { workingCopy.description = desc; } } - (char *) descriptionCString { return &data->description[0]; } - (NSInteger) cheatType { return (NSInteger)data->type; } - (void) setCheatType:(NSInteger)theType { data->type = (u8)theType; switch (theType) { case CHEAT_TYPE_INTERNAL: self.cheatTypeIcon = iconInternalCheat; self.isSupportedCheatType = YES; break; case CHEAT_TYPE_ACTION_REPLAY: self.cheatTypeIcon = iconActionReplay; self.isSupportedCheatType = YES; break; case CHEAT_TYPE_CODE_BREAKER: self.cheatTypeIcon = iconCodeBreaker; self.isSupportedCheatType = NO; break; default: break; } if (workingCopy != nil) { workingCopy.cheatType = theType; } } - (void) setCheatTypeIcon:(NSImage *)theIcon { // Do nothing. This method exists for KVO compliance only. } - (NSImage *) cheatTypeIcon { NSImage *theIcon = nil; switch (self.cheatType) { case CHEAT_TYPE_INTERNAL: theIcon = iconInternalCheat; break; case CHEAT_TYPE_ACTION_REPLAY: theIcon = iconActionReplay; break; case CHEAT_TYPE_CODE_BREAKER: theIcon = iconCodeBreaker; break; default: break; } return theIcon; } - (BOOL) isSupportedCheatType { BOOL isSupported = YES; switch (self.cheatType) { case CHEAT_TYPE_INTERNAL: case CHEAT_TYPE_ACTION_REPLAY: isSupported = YES; break; case CHEAT_TYPE_CODE_BREAKER: isSupported = NO; break; default: break; } return isSupported; } - (void) setIsSupportedCheatType:(BOOL)isSupported { // Do nothing. This method exists for KVO compliance only. } - (NSInteger) freezeType { return (NSInteger)data->freezeType; } - (void) setFreezeType:(NSInteger)theType { data->freezeType = (u8)theType; if (workingCopy != nil) { workingCopy.freezeType = theType; } } - (UInt8) bytes { return (UInt8)(data->size + 1); } - (void) setBytes:(UInt8)byteSize { data->size = (u8)(byteSize - 1); if (workingCopy != nil) { workingCopy.bytes = byteSize; } } - (NSUInteger) codeCount { return (NSUInteger)data->num; } - (void) setCodeCount:(NSUInteger)count { // Do nothing. This method exists for KVO compliance only. } - (NSString *) code { NSString *codeLine = @""; NSString *cheatCodes = @""; NSUInteger numberCodes = self.codeCount; if (numberCodes > MAX_XX_CODE) { return nil; } for (NSUInteger i = 0; i < numberCodes; i++) { codeLine = [NSString stringWithFormat:@"%08X %08X\n", data->code[i][0], data->code[i][1]]; cheatCodes = [cheatCodes stringByAppendingString:codeLine]; } return cheatCodes; } - (void) setCode:(NSString *)theCode { if (theCode == nil) { return; } size_t codeCStringSize = MAX_XX_CODE * 10 * 2 * sizeof(char); char *codeCString = (char *)calloc(codeCStringSize, 1); [theCode getCString:codeCString maxLength:codeCStringSize encoding:NSUTF8StringEncoding]; CHEATS::XXCodeFromString(data, codeCString); free(codeCString); codeCString = NULL; self.codeCount = self.codeCount; self.bytes = self.bytes; if (workingCopy != nil) { workingCopy.code = theCode; } } - (UInt32) memAddress { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return 0; } return (data->code[0][0] | 0x02000000); } - (void) setMemAddress:(UInt32)theAddress { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return; } theAddress &= 0x00FFFFFF; theAddress |= 0x02000000; data->code[0][0] = theAddress; if (workingCopy != nil) { workingCopy.memAddress = theAddress; } } - (NSString *) memAddressString { return [NSString stringWithFormat:@"0x%08X", self.memAddress]; } - (void) setMemAddressString:(NSString *)addressString { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return; } u32 address = 0x00000000; [[NSScanner scannerWithString:addressString] scanHexInt:&address]; self.memAddress = address; if (workingCopy != nil) { workingCopy.memAddressString = addressString; } } - (NSString *) memAddressSixDigitString { return [NSString stringWithFormat:@"%06X", (self.memAddress & 0x00FFFFFF)]; } - (void) setMemAddressSixDigitString:(NSString *)addressString { self.memAddressString = addressString; } - (SInt64) value { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return 0; } return (data->code[0][1]); } - (void) setValue:(SInt64)theValue { if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type { return; } data->code[0][1] = (u32)theValue; if (workingCopy != nil) { workingCopy.value = theValue; } } - (void) update { self.enabled = self.enabled; self.description = self.description; self.cheatType = self.cheatType; self.freezeType = self.freezeType; if (self.cheatType == CHEAT_TYPE_INTERNAL) { self.bytes = self.bytes; self.memAddress = self.memAddress; self.value = self.value; } else { self.code = self.code; } } - (CocoaDSCheatItem *) createWorkingCopy { CocoaDSCheatItem *newWorkingCopy = nil; if (workingCopy != nil) { [workingCopy release]; } newWorkingCopy = [[CocoaDSCheatItem alloc] initWithCheatData:self.data]; [newWorkingCopy retainData]; newWorkingCopy.parent = self; workingCopy = newWorkingCopy; return newWorkingCopy; } - (void) destroyWorkingCopy { [workingCopy release]; workingCopy = nil; } - (void) mergeFromWorkingCopy { if (workingCopy == nil) { return; } CHEATS_LIST *thisData = self.data; CHEATS_LIST *workingData = workingCopy.data; pthread_mutex_lock(&mutexData); *thisData = *workingData; pthread_mutex_unlock(&mutexData); [self update]; } - (void) mergeToParent { if (parent == nil) { return; } CHEATS_LIST *thisData = self.data; CHEATS_LIST *parentData = parent.data; pthread_mutex_lock(&mutexData); *parentData = *thisData; pthread_mutex_unlock(&mutexData); [parent update]; } - (void) setDataWithDictionary:(NSDictionary *)dataDict { if (dataDict == nil) { return; } NSNumber *enabledNumber = (NSNumber *)[dataDict valueForKey:@"enabled"]; if (enabledNumber != nil) { self.enabled = [enabledNumber boolValue]; } NSString *descriptionString = (NSString *)[dataDict valueForKey:@"description"]; if (descriptionString != nil) { self.description = descriptionString; } NSNumber *freezeTypeNumber = (NSNumber *)[dataDict valueForKey:@"freezeType"]; if (freezeTypeNumber != nil) { self.freezeType = [freezeTypeNumber integerValue]; } NSNumber *cheatTypeNumber = (NSNumber *)[dataDict valueForKey:@"cheatType"]; if (cheatTypeNumber != nil) { self.cheatType = [cheatTypeNumber integerValue]; } if (self.cheatType == CHEAT_TYPE_INTERNAL) { NSNumber *bytesNumber = (NSNumber *)[dataDict valueForKey:@"bytes"]; if (bytesNumber != nil) { self.bytes = [bytesNumber unsignedIntegerValue]; } NSNumber *memAddressNumber = (NSNumber *)[dataDict valueForKey:@"memAddress"]; if (memAddressNumber != nil) { self.memAddress = [memAddressNumber unsignedIntegerValue]; } NSNumber *valueNumber = (NSNumber *)[dataDict valueForKey:@"value"]; if (valueNumber != nil) { self.value = [valueNumber integerValue]; } } else { NSString *codeString = (NSString *)[dataDict valueForKey:@"code"]; if (codeString != nil) { self.code = codeString; } } } - (NSDictionary *) dataDictionary { return [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:self.enabled], @"enabled", [NSNumber numberWithInteger:self.cheatType], @"cheatType", self.description, @"description", [NSNumber numberWithInteger:self.freezeType], @"freezeType", [NSNumber numberWithUnsignedInteger:self.codeCount], @"codeCount", [NSNumber numberWithUnsignedInteger:self.bytes], @"bytes", [NSNumber numberWithUnsignedInt:self.memAddress], @"memAddress", self.memAddressString, @"memAddressString", [NSNumber numberWithInteger:self.value], @"value", self.code, @"code", [NSNumber numberWithBool:self.isSupportedCheatType], @"isSupportedCheatType", nil]; } @end @implementation CocoaDSCheatManager @synthesize listData; @synthesize list; @synthesize cdsCore; @synthesize untitledCount; @synthesize dbTitle; @synthesize dbDate; - (id)init { return [self initWithCore:nil fileURL:nil listData:nil]; } - (id) initWithCore:(CocoaDSCore *)core { return [self initWithCore:core fileURL:nil listData:nil]; } - (id) initWithCore:(CocoaDSCore *)core fileURL:(NSURL *)fileURL { return [self initWithCore:core fileURL:fileURL listData:nil]; } - (id) initWithCore:(CocoaDSCore *)core listData:(CHEATS *)cheatList { return [self initWithCore:core fileURL:nil listData:cheatList]; } - (id) initWithCore:(CocoaDSCore *)core fileURL:(NSURL *)fileURL listData:(CHEATS *)cheatList { self = [super init]; if(self == nil) { return self; } if (cheatList == nil) { CHEATS *newListData = new CHEATS(); if (newListData == nil) { [self release]; return nil; } listData = newListData; } else { listData = cheatList; } if (fileURL != nil) { listData->init((char *)[[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]); list = [[CocoaDSCheatManager cheatListWithListObject:listData] retain]; } else { list = [[NSMutableArray alloc] initWithCapacity:100]; if (list == nil) { delete listData; [self release]; return nil; } } cdsCore = [core retain]; untitledCount = 0; dbTitle = nil; dbDate = nil; return self; } - (void)dealloc { self.dbTitle = nil; self.dbDate = nil; self.cdsCore = nil; [list release]; delete (CHEATS *)self.listData; [super dealloc]; } - (BOOL) add:(CocoaDSCheatItem *)cheatItem { BOOL result = NO; if (cheatItem == nil) { return result; } // Get the current pointer to the raw cheat list data. We will need it later // to check if the list got reallocated. CHEATS_LIST *cheatListData = self.listData->getListPtr(); pthread_mutex_lock(self.cdsCore.mutexCoreExecute); switch (cheatItem.cheatType) { case CHEAT_TYPE_INTERNAL: result = self.listData->add(cheatItem.bytes - 1, cheatItem.memAddress, cheatItem.value, [cheatItem descriptionCString], cheatItem.enabled); break; case CHEAT_TYPE_ACTION_REPLAY: { char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; if (cheatCodes != nil) { result = self.listData->add_AR(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled); } break; } case CHEAT_TYPE_CODE_BREAKER: { char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; if (cheatCodes != nil) { result = self.listData->add_CB(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled); } break; } default: break; } pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); if (![self.list containsObject:cheatItem]) { [self.list addObject:cheatItem]; } // Adding a new item may cause the raw list data to get reallocated, which // will break the data pointers. So check for reallocation, and if it occurs, // reset the data pointers for each item. if (cheatListData != self.listData->getListPtr()) { NSUInteger listCount = self.listData->getSize(); for (NSUInteger i = 0; i < listCount; i++) { CocoaDSCheatItem *itemInList = (CocoaDSCheatItem *)[self.list objectAtIndex:i]; itemInList.data = self.listData->getItemByIndex(i); } } else { cheatItem.data = self.listData->getItemByIndex(self.listData->getSize() - 1); } return result; } - (void) remove:(CocoaDSCheatItem *)cheatItem { if (cheatItem == nil) { return; } NSUInteger selectionIndex = [self.list indexOfObject:cheatItem]; if (selectionIndex == NSNotFound) { return; } pthread_mutex_lock(self.cdsCore.mutexCoreExecute); self.listData->remove(selectionIndex); pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); // Removing an item from the raw cheat list data shifts all higher elements // by one, so we need to do the same. NSUInteger listCount = self.listData->getSize(); for (NSUInteger i = selectionIndex; i < listCount; i++) { [(CocoaDSCheatItem *)[self.list objectAtIndex:(i + 1)] setData:self.listData->getItemByIndex(i)]; } cheatItem.data = nil; [self.list removeObject:cheatItem]; } - (BOOL) update:(CocoaDSCheatItem *)cheatItem { BOOL result = NO; if (cheatItem == nil) { return result; } NSUInteger selectionIndex = [self.list indexOfObject:cheatItem]; if (selectionIndex == NSNotFound) { return result; } pthread_mutex_lock(self.cdsCore.mutexCoreExecute); switch (cheatItem.cheatType) { case CHEAT_TYPE_INTERNAL: result = self.listData->update(cheatItem.bytes - 1, cheatItem.memAddress, cheatItem.value, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); break; case CHEAT_TYPE_ACTION_REPLAY: { char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; if (cheatCodes != nil) { result = self.listData->update_AR(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); } break; } case CHEAT_TYPE_CODE_BREAKER: { char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; if (cheatCodes != nil) { result = self.listData->update_CB(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); } break; } default: break; } pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); [cheatItem update]; return result; } - (BOOL) save { pthread_mutex_lock(self.cdsCore.mutexCoreExecute); BOOL result = self.listData->save(); pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); return result; } - (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error { NSMutableArray *newDBList = nil; if (fileURL == nil) { return newDBList; } CHEATSEXPORT *exporter = new CHEATSEXPORT(); BOOL result = exporter->load((char *)[[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]); if (!result) { if (error != nil) { *error = exporter->getErrorCode(); } } else { self.dbTitle = [NSString stringWithCString:(const char *)exporter->gametitle encoding:NSUTF8StringEncoding]; self.dbDate = [NSString stringWithCString:(const char *)exporter->date encoding:NSUTF8StringEncoding]; newDBList = [CocoaDSCheatManager cheatListWithItemStructArray:exporter->getCheats() count:exporter->getCheatsNum()]; if (newDBList != nil) { for (CocoaDSCheatItem *cheatItem in newDBList) { cheatItem.willAdd = NO; [cheatItem retainData]; } } } delete exporter; exporter = nil; return newDBList; } - (void) applyInternalCheat:(CocoaDSCheatItem *)cheatItem { if (cheatItem == nil) { return; } pthread_mutex_lock(self.cdsCore.mutexCoreExecute); [CocoaDSCheatManager applyInternalCheatWithItem:cheatItem]; pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); } + (void) setMasterCheatList:(CocoaDSCheatManager *)cheatListManager { cheats = cheatListManager.listData; } + (void) applyInternalCheatWithItem:(CocoaDSCheatItem *)cheatItem { [CocoaDSCheatManager applyInternalCheatWithAddress:cheatItem.memAddress value:cheatItem.value bytes:cheatItem.bytes]; } + (void) applyInternalCheatWithAddress:(UInt32)address value:(UInt32)value bytes:(NSUInteger)bytes { address &= 0x00FFFFFF; address |= 0x02000000; switch (bytes) { case 1: { u8 oneByteValue = (u8)(value & 0x000000FF); _MMU_write08(address, oneByteValue); break; } case 2: { u16 twoByteValue = (u16)(value & 0x0000FFFF); _MMU_write16(address, twoByteValue); break; } case 3: { u32 threeByteWithExtraValue = _MMU_read32(address); threeByteWithExtraValue &= 0xFF000000; threeByteWithExtraValue |= (value & 0x00FFFFFF); _MMU_write32(address, threeByteWithExtraValue); break; } case 4: _MMU_write32(address, value); break; default: break; } } + (NSMutableArray *) cheatListWithListObject:(CHEATS *)cheatList { if (cheatList == nil) { return nil; } NSMutableArray *newList = [NSMutableArray arrayWithCapacity:100]; if (newList == nil) { return newList; } u32 itemCount = cheatList->getSize(); for (u32 i = 0; i < itemCount; i++) { [newList addObject:[[[CocoaDSCheatItem alloc] initWithCheatData:cheatList->getItemByIndex(i)] autorelease]]; } return newList; } + (NSMutableArray *) cheatListWithItemStructArray:(CHEATS_LIST *)cheatItemArray count:(NSUInteger)itemCount { if (cheatItemArray == nil) { return nil; } NSMutableArray *newList = [NSMutableArray arrayWithCapacity:100]; if (newList == nil) { return newList; } for (NSUInteger i = 0; i < itemCount; i++) { [newList addObject:[[[CocoaDSCheatItem alloc] initWithCheatData:cheatItemArray + i] autorelease]]; } return newList; } + (NSMutableDictionary *) cheatItemWithType:(NSInteger)cheatTypeID description:(NSString *)description { BOOL isSupported = YES; if (cheatTypeID == CHEAT_TYPE_CODE_BREAKER) { isSupported = NO; } return [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], @"enabled", [NSNumber numberWithInteger:cheatTypeID], @"cheatType", description, @"description", [NSNumber numberWithInteger:0], @"freezeType", [NSNumber numberWithUnsignedInteger:0], @"codeCount", [NSNumber numberWithUnsignedInteger:4], @"bytes", [NSNumber numberWithInteger:0], @"memAddress", @"0x00000000", @"memAddressString", [NSNumber numberWithInteger:0], @"value", @"", @"code", [NSNumber numberWithBool:isSupported], @"isSupportedCheatType", nil]; } @end @implementation CocoaDSCheatSearch @synthesize listData; @synthesize addressList; @synthesize cdsCore; @synthesize searchCount; - (id)init { return [self initWithCore:nil]; } - (id) initWithCore:(CocoaDSCore *)core { self = [super init]; if(self == nil) { return self; } CHEATSEARCH *newListData = new CHEATSEARCH(); if (newListData == nil) { [self release]; return nil; } listData = newListData; addressList = nil; cdsCore = [core retain]; searchCount = 0; return self; } - (void)dealloc { pthread_mutex_lock(self.cdsCore.mutexCoreExecute); self.listData->close(); pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); [addressList release]; self.cdsCore = nil; delete (CHEATSEARCH *)self.listData; [super dealloc]; } - (NSUInteger) runExactValueSearch:(NSInteger)value byteSize:(UInt8)byteSize signType:(NSInteger)signType { NSUInteger itemCount = 0; BOOL listExists = YES; if (searchCount == 0) { byteSize--; pthread_mutex_lock(self.cdsCore.mutexCoreExecute); listExists = (NSUInteger)self.listData->start((u8)CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE, (u8)byteSize, (u8)signType); pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); } if (listExists) { pthread_mutex_lock(self.cdsCore.mutexCoreExecute); itemCount = (NSUInteger)self.listData->search((u32)value); NSMutableArray *newAddressList = [[CocoaDSCheatSearch addressListWithListObject:self.listData maxItems:100] retain]; pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); [addressList release]; addressList = newAddressList; searchCount++; } [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.searchDidFinish" object:self userInfo:nil]; return itemCount; } - (void) runExactValueSearchOnThread:(id)object { CocoaDSCheatSearchParams *searchParams = (CocoaDSCheatSearchParams *)object; [self runExactValueSearch:searchParams.value byteSize:searchParams.byteSize signType:searchParams.signType]; } - (NSUInteger) runComparativeSearch:(NSInteger)typeID byteSize:(UInt8)byteSize signType:(NSInteger)signType { NSUInteger itemCount = 0; BOOL listExists = YES; if (searchCount == 0) { byteSize--; pthread_mutex_lock(self.cdsCore.mutexCoreExecute); listExists = (NSUInteger)self.listData->start((u8)CHEATSEARCH_SEARCHSTYLE_COMPARATIVE, (u8)byteSize, (u8)signType); pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); addressList = nil; } else { pthread_mutex_lock(self.cdsCore.mutexCoreExecute); itemCount = (NSUInteger)self.listData->search((u8)typeID); NSMutableArray *newAddressList = [[CocoaDSCheatSearch addressListWithListObject:self.listData maxItems:100] retain]; pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); [addressList release]; addressList = newAddressList; } if (listExists) { searchCount++; } [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.searchDidFinish" object:self userInfo:nil]; return itemCount; } - (void) runComparativeSearchOnThread:(id)object { CocoaDSCheatSearchParams *searchParams = (CocoaDSCheatSearchParams *)object; [self runComparativeSearch:searchParams.comparativeSearchType byteSize:searchParams.byteSize signType:searchParams.signType]; } - (void) reset { pthread_mutex_lock(self.cdsCore.mutexCoreExecute); self.listData->close(); pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); searchCount = 0; [addressList release]; addressList = nil; } + (NSMutableArray *) addressListWithListObject:(CHEATSEARCH *)addressList maxItems:(NSUInteger)maxItemCount { if (addressList == nil) { return nil; } if (maxItemCount == 0) { maxItemCount = 1024 * 1024 * 4; } NSMutableArray *newList = [NSMutableArray arrayWithCapacity:maxItemCount]; if (newList == nil) { return newList; } NSMutableDictionary *newItem = nil; NSUInteger listCount = 0; u32 address; u32 value; addressList->getListReset(); while (addressList->getList(&address, &value) && listCount < maxItemCount) { newItem = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"0x02%06X", address], @"addressString", [NSNumber numberWithUnsignedInteger:value], @"value", nil]; [newList addObject:newItem]; listCount++; } return newList; } @end @implementation CocoaDSCheatSearchParams @synthesize comparativeSearchType; @synthesize value; @synthesize byteSize; @synthesize signType; - (id)init { self = [super init]; if(self == nil) { return self; } comparativeSearchType = CHEATSEARCH_COMPARETYPE_EQUALS_TO; value = 1; byteSize = 4; signType = CHEATSEARCH_UNSIGNED; return self; } @end desmume-0.9.9/src/cocoa/cocoa_util.mm0000644000175000017500000002150012140261603020242 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_util.h" #import "cocoa_globals.h" #import "types.h" #import #include #include #include "../version.h" #undef BOOL @implementation CocoaDSUtil static NSDate *distantFutureDate = [[NSDate distantFuture] retain]; + (void) messageSendOneWay:(NSPort *)sendPort msgID:(NSInteger)msgID { if (sendPort == nil || ![sendPort isValid]) { return; } NSPortMessage *message = [[NSPortMessage alloc] initWithSendPort:sendPort receivePort:nil components:nil]; [message setMsgid:msgID]; [message sendBeforeDate:distantFutureDate]; [message release]; } + (void) messageSendOneWayWithMessageComponents:(NSPort *)sendPort msgID:(NSInteger)msgID array:(NSArray *)msgDataArray { if (sendPort == nil || ![sendPort isValid]) { return; } NSPortMessage *message = [[NSPortMessage alloc] initWithSendPort:sendPort receivePort:nil components:msgDataArray]; [message setMsgid:msgID]; [message sendBeforeDate:distantFutureDate]; [message release]; } + (void) messageSendOneWayWithData:(NSPort *)sendPort msgID:(NSInteger)msgID data:(NSData *)msgData { if (sendPort == nil || ![sendPort isValid]) { return; } NSArray *messageComponents = [[NSArray alloc] initWithObjects:msgData, nil]; [CocoaDSUtil messageSendOneWayWithMessageComponents:sendPort msgID:msgID array:messageComponents]; [messageComponents release]; } + (void) messageSendOneWayWithInteger:(NSPort *)sendPort msgID:(NSInteger)msgID integerValue:(NSInteger)integerValue { if (sendPort == nil || ![sendPort isValid]) { return; } NSData *messageData = [[NSData alloc] initWithBytes:&integerValue length:sizeof(NSInteger)]; [CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData]; [messageData release]; } + (void) messageSendOneWayWithFloat:(NSPort *)sendPort msgID:(NSInteger)msgID floatValue:(float)floatValue { if (sendPort == nil || ![sendPort isValid]) { return; } NSData *messageData = [[NSData alloc] initWithBytes:&floatValue length:sizeof(float)]; [CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData]; [messageData release]; } + (void) messageSendOneWayWithBool:(NSPort *)sendPort msgID:(NSInteger)msgID boolValue:(BOOL)boolValue { if (sendPort == nil || ![sendPort isValid]) { return; } NSData *messageData = [[NSData alloc] initWithBytes:&boolValue length:sizeof(BOOL)]; [CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData]; [messageData release]; } + (void) messageSendOneWayWithRect:(NSPort *)sendPort msgID:(NSInteger)msgID rect:(NSRect)rect { if (sendPort == nil || ![sendPort isValid]) { return; } NSData *messageData = [[NSData alloc] initWithBytes:&rect length:sizeof(NSRect)]; [CocoaDSUtil messageSendOneWayWithData:sendPort msgID:msgID data:messageData]; [messageData release]; } + (NSInteger) getIBActionSenderTag:(id)sender { NSInteger senderTag = 0; if ([sender isKindOfClass:[NSButton class]]) { senderTag = [sender tag]; } else if ([sender respondsToSelector:@selector(selectedCell)]) { senderTag = [[sender selectedCell] tag]; } else if ([sender respondsToSelector:@selector(tag)]) { senderTag = [sender tag]; } return senderTag; } + (BOOL) getIBActionSenderButtonStateBool:(id)sender { BOOL theState = NO; NSInteger buttonState = NSOffState; if ([sender respondsToSelector:@selector(state)]) { buttonState = [sender state]; } if (buttonState == NSOnState) { theState = YES; } return theState; } + (void) quickDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText { NSRunAlertPanel(titleText, messageText, nil, nil, nil); } + (BOOL) quickYesNoDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText { return NSRunAlertPanel(titleText, messageText, NSLocalizedString(@"Yes", nil), NSLocalizedString(@"No", nil), nil) != 0; } + (NSInteger) appVersionNumeric { return (NSInteger)EMU_DESMUME_VERSION_NUMERIC(); } + (NSString *) appInternalVersionString { return [NSString stringWithCString:EMU_DESMUME_VERSION_STRING() encoding:NSUTF8StringEncoding]; } + (NSString *) appInternalNameAndVersionString { return [NSString stringWithCString:EMU_DESMUME_NAME_AND_VERSION() encoding:NSUTF8StringEncoding]; } + (NSString *) appCompilerDetailString { return [NSString stringWithCString:EMU_DESMUME_COMPILER_DETAIL() encoding:NSUTF8StringEncoding]; } + (NSString *) operatingSystemString { NSDictionary *systemDict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]; NSString *productString = (NSString *)[systemDict objectForKey:@"ProductName"]; NSString *versionString = (NSString *)[systemDict objectForKey:@"ProductVersion"]; NSString *buildString = (NSString *)[systemDict objectForKey:@"ProductBuildVersion"]; return [[[[[productString stringByAppendingString:@" v"] stringByAppendingString:versionString] stringByAppendingString:@" ("] stringByAppendingString:buildString] stringByAppendingString:@")"]; } + (NSString *) modelIdentifierString { NSString *modelIdentifierStr = @""; size_t stringLength = 0; char *modelCString = NULL; sysctlbyname("hw.model", NULL, &stringLength, NULL, 0); if (stringLength == 0) { return modelIdentifierStr; } modelCString = (char *)malloc(stringLength * sizeof(char)); sysctlbyname("hw.model", modelCString, &stringLength, NULL, 0); modelIdentifierStr = [NSString stringWithCString:modelCString encoding:NSUTF8StringEncoding]; free(modelCString); return modelIdentifierStr; } @end #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_4 @implementation CocoaDSThread @synthesize thread; @synthesize threadExit; @synthesize autoreleaseInterval; @synthesize sendPort; @synthesize receivePort; - (id)init { return [self initWithAutoreleaseInterval:15.0]; } - (id) initWithAutoreleaseInterval:(NSTimeInterval)interval { // Set up thread info. thread = nil; threadExit = NO; autoreleaseInterval = interval; // Set up thread ports. sendPort = [[NSPort port] retain]; [sendPort setDelegate:self]; receivePort = [[NSPort port] retain]; [receivePort setDelegate:self]; return self; } - (void)dealloc { [self forceThreadExit]; [super dealloc]; } - (void) runThread:(id)object { NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init]; NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; [runLoop addPort:[self receivePort] forMode:NSDefaultRunLoopMode]; [self setThread:[NSThread currentThread]]; do { NSAutoreleasePool *runLoopPool = [[NSAutoreleasePool alloc] init]; NSDate *runDate = [[NSDate alloc] initWithTimeIntervalSinceNow:[self autoreleaseInterval]]; [runLoop runUntilDate:runDate]; [runDate release]; [runLoopPool release]; } while (![self threadExit]); NSPort *tempSendPort = [self sendPort]; [self setSendPort:nil]; [tempSendPort invalidate]; [tempSendPort release]; NSPort *tempReceivePort = [self receivePort]; [self setReceivePort:nil]; [tempReceivePort invalidate]; [tempReceivePort release]; [threadPool release]; [self setThread:nil]; } - (void) forceThreadExit { if ([self thread] == nil) { return; } [self setThreadExit:YES]; // Wait until the thread has shut down. while ([self thread] != nil) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } } - (void)handlePortMessage:(NSPortMessage *)portMessage { NSInteger message = (NSInteger)[portMessage msgid]; switch (message) { case MESSAGE_EXIT_THREAD: [self setThreadExit:YES]; break; default: break; } } @end #endif @implementation NSNotificationCenter (MainThread) - (void)postNotificationOnMainThread:(NSNotification *)notification { [self performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:YES]; } - (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject { NSNotification *notification = [NSNotification notificationWithName:aName object:anObject]; [self postNotificationOnMainThread:notification]; } - (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo { NSNotification *notification = [NSNotification notificationWithName:aName object:anObject userInfo:aUserInfo]; [self postNotificationOnMainThread:notification]; } @end desmume-0.9.9/src/cocoa/cocoa_file.mm0000644000175000017500000011137612140261603020217 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_file.h" #include #import "cocoa_globals.h" #import "cocoa_util.h" #include "../NDSSystem.h" #include "../path.h" #include "../saves.h" #undef BOOL @implementation CocoaDSFile // Global dictionary that can be used for storing URLs. // // Usually, it's best to add directory paths to FileTypeInfo.plist, and then // use directoryByKind:version:port for getting a URL, but this method only // works for application build targets. Other target types, such as plug-in // targets, don't read FileTypeInfo.plist correctly, so we include a global // URL dictionary so that we can manually set and get URLs at runtime. static NSMutableDictionary *_gURLDictionary = nil; /******************************************************************************************** URLDictionary Returns the global URL dictionary. Takes: Nothing. Returns: A reference to the NSMutableDictionary URLDictionary. Details: This should always be used for getting the global URL dictionary. Never try to reference the global URL dictionary directly, since this may change between versions. The first time this method is called, it will automatically allocate the memory for the global URL dictionary. ********************************************************************************************/ + (NSMutableDictionary *) URLDictionary { if (_gURLDictionary == nil) { _gURLDictionary = [[NSMutableDictionary alloc] initWithCapacity:8]; } return _gURLDictionary; } /******************************************************************************************** addURLToURLDictionary:groupKey:fileKind: Adds a URL to the global URL dictionary. Takes: theURL - An NSURL used to store a URL into the dictionary. groupKey - An NSString that represents the key used to group a set URLs together. fileKind - An NSString that represents the file type. Returns: Nothing. Details: This should always be used for adding a URL to the global URL dictionary. Never try to add a URL directly, since this may change between versions. ********************************************************************************************/ + (void) addURLToURLDictionary:(NSURL *)theURL groupKey:(NSString *)groupKey fileKind:(NSString *)fileKind { if (theURL == nil || groupKey == nil || fileKind == nil) { return; } NSMutableDictionary *urlDictionary = [CocoaDSFile URLDictionary]; NSMutableDictionary *groupDictionary = (NSMutableDictionary *)[urlDictionary valueForKey:groupKey]; if (groupDictionary == nil) { groupDictionary = [NSMutableDictionary dictionaryWithCapacity:16]; [urlDictionary setValue:groupDictionary forKey:groupKey]; } [groupDictionary setValue:theURL forKey:fileKind]; } /******************************************************************************************** removeURLFromURLDictionaryByGroupKey:fileKind: Removes a URL from the global URL dictionary. Takes: groupKey - An NSString that represents the key used to group a set URLs together. fileKind - An NSString that represents the file type. Returns: Nothing. Details: This should always be used for removing a URL from the global URL dictionary. Never try to remove a URL directly, since this may change between versions. ********************************************************************************************/ + (void) removeURLFromURLDictionaryByGroupKey:(NSString *)groupKey fileKind:(NSString *)fileKind { if (groupKey == nil || fileKind == nil) { return; } NSMutableDictionary *urlDictionary = [CocoaDSFile URLDictionary]; NSMutableDictionary *groupDictionary = (NSMutableDictionary *)[urlDictionary valueForKey:groupKey]; if (groupDictionary != nil) { [groupDictionary setValue:nil forKey:fileKind]; } } + (BOOL) loadState:(NSURL *)saveStateURL { BOOL result = NO; if (saveStateURL == nil) { return result; } const char *statePath = [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding]; bool cResult = savestate_load(statePath); if(cResult) { result = YES; } return result; } + (BOOL) saveState:(NSURL *)saveStateURL { BOOL result = NO; if (saveStateURL == nil) { return result; } const char *statePath = [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding]; bool cResult = savestate_save(statePath); if(cResult) { result = YES; } return result; } + (BOOL) loadRom:(NSURL *)romURL { BOOL result = NO; if (romURL == nil) { return result; } const char *romPath = [[romURL path] cStringUsingEncoding:NSUTF8StringEncoding]; NSInteger resultCode = NDS_LoadROM(romPath, nil); if (resultCode > 0) { result = YES; } return result; } + (BOOL) importRomSave:(NSURL *)romSaveURL { BOOL result = NO; const char *romSavePath = [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding]; NSInteger resultCode = NDS_ImportSave(romSavePath); if (resultCode == 0) { return result; } result = YES; return result; } + (BOOL) exportRomSaveToURL:(NSURL *)destinationURL romSaveURL:(NSURL *)romSaveURL fileType:(NSInteger)fileTypeID { BOOL result = NO; switch (fileTypeID) { #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 case ROMSAVEFORMAT_DESMUME: { NSString *destinationPath = [[destinationURL path] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager copyItemAtPath:[romSaveURL path] toPath:destinationPath error:nil]; [fileManager release]; break; } #endif case ROMSAVEFORMAT_NOGBA: { const char *destinationPath = [[[destinationURL path] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE_NOGBA] cStringUsingEncoding:NSUTF8StringEncoding]; bool resultCode = NDS_ExportSave(destinationPath); if (resultCode) { result = YES; } break; } case ROMSAVEFORMAT_RAW: { const char *destinationPath = [[[destinationURL path] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE_RAW] cStringUsingEncoding:NSUTF8StringEncoding]; bool resultCode = NDS_ExportSave(destinationPath); if (resultCode) { result = YES; } break; } default: break; } return result; } + (NSURL *) romSaveURLFromRomURL:(NSURL *)romURL { return [NSURL fileURLWithPath:[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:@FILE_EXT_ROM_SAVE]]; } + (NSURL *) cheatsURLFromRomURL:(NSURL *)romURL { return [NSURL fileURLWithPath:[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:@FILE_EXT_CHEAT]]; } + (BOOL) romSaveExists:(NSURL *)romURL { BOOL exists = NO; if (romURL == nil) { return exists; } NSString *romSavePath = [[CocoaDSFile fileURLFromRomURL:romURL toKind:@"ROM Save"] path]; NSFileManager *fileManager = [[NSFileManager alloc] init]; exists = [fileManager isReadableFileAtPath:romSavePath]; [fileManager release]; return exists; } + (BOOL) romSaveExistsWithRom:(NSURL *)romURL { BOOL exists = NO; if (romURL == nil) { return exists; } NSString *romSavePath = [[CocoaDSFile romSaveURLFromRomURL:romURL] path]; NSFileManager *fileManager = [[NSFileManager alloc] init]; exists = [fileManager isReadableFileAtPath:romSavePath]; [fileManager release]; return exists; } /******************************************************************************************** setupAllFilePaths Sets up all application file paths using the current version of the default port. Takes: Nothing. Returns: Nothing. Details: This method uses setupAllFilePathsForVersion:port: for its implementation. ********************************************************************************************/ + (void) setupAllFilePaths { [CocoaDSFile setupAllFilePathsForVersion:nil port:nil]; } /******************************************************************************************** setupAllFilePathsForVersion:port: Sets up all application file paths, reading the paths from FileTypeInfo.plist. Takes: versionString - An NSString that represents the application version. If nil is used, this method assumes the current version. portString - An NSString that represents the port version. If nil is used, this method assumes the default port version. Returns: Nothing. Details: This is an Objective-C to C wrapper function for assigning file paths to the emulation layer. ********************************************************************************************/ + (void) setupAllFilePathsForVersion:(NSString *)versionString port:(NSString *)portString { NSURL *romURL = [CocoaDSFile directoryURLByKind:@"ROM" version:versionString port:portString]; if (romURL != nil) { strlcpy(path.pathToRoms, [[romURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *romSaveURL = [CocoaDSFile directoryURLByKind:@"ROM Save" version:versionString port:portString]; if (romSaveURL != nil) { strlcpy(path.pathToBattery, [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *saveStateURL = [CocoaDSFile directoryURLByKind:@"Save State" version:versionString port:portString]; if (saveStateURL != nil) { strlcpy(path.pathToStates, [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *screenshotURL = [CocoaDSFile directoryURLByKind:@"Screenshot" version:versionString port:portString]; if (screenshotURL != nil) { strlcpy(path.pathToScreenshots, [[screenshotURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *aviURL = [CocoaDSFile directoryURLByKind:@"Video" version:versionString port:portString]; if (aviURL != nil) { strlcpy(path.pathToAviFiles, [[aviURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *cheatURL = [CocoaDSFile directoryURLByKind:@"Cheat" version:versionString port:portString]; if (cheatURL != nil) { strlcpy(path.pathToCheats, [[cheatURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *soundSamplesURL = [CocoaDSFile directoryURLByKind:@"Sound Sample" version:versionString port:portString]; if (soundSamplesURL != nil) { strlcpy(path.pathToSounds, [[soundSamplesURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *firmwareURL = [CocoaDSFile directoryURLByKind:@"Firmware Configuration" version:versionString port:portString]; if (firmwareURL != nil) { strlcpy(path.pathToFirmware, [[firmwareURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *luaURL = [CocoaDSFile directoryURLByKind:@"Lua Script" version:versionString port:portString]; if (luaURL != nil) { strlcpy(path.pathToLua, [[luaURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } } /******************************************************************************************** setupAllFilePathsWithURLDictionary: Sets up all application file paths using the global URLDictionary. This method exists in the case where reading the paths from FileTypeInfo.plist impossible or impractical. Takes: URLDictionaryKey - An NSString that is a group key to the URLDictionary. Returns: Nothing. Details: This is an Objective-C to C wrapper function for assigning file paths to the emulation layer. ********************************************************************************************/ + (void) setupAllFilePathsWithURLDictionary:(NSString *)URLDictionaryKey { if (URLDictionaryKey == nil) { return; } NSDictionary *URLDictionary = (NSDictionary *)[(NSDictionary *)[CocoaDSFile URLDictionary] valueForKey:URLDictionaryKey]; NSURL *romURL = (NSURL *)[URLDictionary valueForKey:@"ROM"]; if (romURL != nil) { strlcpy(path.pathToRoms, [[romURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *romSaveURL = (NSURL *)[URLDictionary valueForKey:@"ROM Save"]; if (romSaveURL != nil) { strlcpy(path.pathToBattery, [[romSaveURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *saveStateURL = (NSURL *)[URLDictionary valueForKey:@"Save State"]; if (saveStateURL != nil) { strlcpy(path.pathToStates, [[saveStateURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *screenshotURL = (NSURL *)[URLDictionary valueForKey:@"Screenshot"]; if (screenshotURL != nil) { strlcpy(path.pathToScreenshots, [[screenshotURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *aviURL = (NSURL *)[URLDictionary valueForKey:@"Video"]; if (aviURL != nil) { strlcpy(path.pathToAviFiles, [[aviURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *cheatURL = (NSURL *)[URLDictionary valueForKey:@"Cheat"]; if (cheatURL != nil) { strlcpy(path.pathToCheats, [[cheatURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *soundSamplesURL = (NSURL *)[URLDictionary valueForKey:@"Sound Sample"]; if (soundSamplesURL != nil) { strlcpy(path.pathToSounds, [[soundSamplesURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *firmwareURL = (NSURL *)[URLDictionary valueForKey:@"Firmware Configuration"]; if (firmwareURL != nil) { strlcpy(path.pathToFirmware, [[firmwareURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } NSURL *luaURL = (NSURL *)[URLDictionary valueForKey:@"Lua Script"]; if (luaURL != nil) { strlcpy(path.pathToLua, [[luaURL path] cStringUsingEncoding:NSUTF8StringEncoding], MAX_PATH); } } + (BOOL) setupAllAppDirectories { BOOL result = YES; NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSDictionary *pathDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; NSDictionary *pathVersionDict = (NSDictionary *)[pathDict valueForKey:currentVersion]; NSDictionary *pathPortDict = (NSDictionary *)[pathVersionDict valueForKey:@PORT_VERSION]; NSDictionary *dirNameDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DirectoryNames"]; NSDictionary *dirNameVersionDict = (NSDictionary *)[dirNameDict valueForKey:currentVersion]; NSDictionary *dirNamePortDict = (NSDictionary *)[dirNameVersionDict valueForKey:@PORT_VERSION]; NSArray *fileKindList = [pathPortDict allKeys]; #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 // Mac OS X v10.4 and earlier. NSEnumerator *enumerator = [fileKindList objectEnumerator]; NSString *fileKind; while ((fileKind = (NSString *)[enumerator nextObject]) != nil) #else // Mac OS X v10.5 and later. for (NSString *fileKind in fileKindList) #endif { NSString *dirPath = (NSString *)[pathPortDict valueForKey:fileKind]; NSString *dirName = (NSString *)[dirNamePortDict valueForKey:fileKind]; if ([dirPath isEqualToString:@PATH_USER_APP_SUPPORT]) { if (![CocoaDSFile createUserAppSupportDirectory:dirName]) { result = NO; } } else if ([dirPath isEqualToString:@PATH_OPEN_EMU]) { // OpenEmu uses its own directory structure, so no need to setup here. continue; } else if ([dirPath isEqualToString:@PATH_WITH_ROM]) { continue; } else { // TODO: Setup directory when using an absolute path. } } return result; } + (NSURL *) saveStateURL { return [CocoaDSFile directoryURLByKind:@"Save State"]; } + (BOOL) saveScreenshot:(NSURL *)fileURL bitmapData:(NSBitmapImageRep *)bitmapImageRep fileType:(NSBitmapImageFileType)fileType { BOOL result = NO; if (fileURL == nil || bitmapImageRep == nil) { return result; } NSString *fileExt = nil; switch (fileType) { case NSTIFFFileType: fileExt = @"tiff"; break; case NSBMPFileType: fileExt = @"bmp"; break; case NSGIFFileType: fileExt = @"gif"; break; case NSJPEGFileType: fileExt = @"jpg"; break; case NSPNGFileType: fileExt = @"png"; break; case NSJPEG2000FileType: fileExt = @"jp2"; break; default: break; } NSURL *saveFileURL = [NSURL fileURLWithPath:[[fileURL path] stringByAppendingPathExtension:fileExt]]; result = [[bitmapImageRep representationUsingType:fileType properties:[NSDictionary dictionary]] writeToURL:saveFileURL atomically:NO]; return result; } /******************************************************************************************** fileKindByURL: Determines a DeSmuME file's type, and returns a description as a string. Takes: fileURL - An NSURL that points to a file. Returns: An NSString representing the file type. The NSString will be nil if the file type is not recognized as a DeSmuME file. Details: This is not the most reliable method for determining a file's type. The current implementation simply checks the file extension to determine the file type. Future implementations could be made more reliable by actually opening the file and validating some header info. ********************************************************************************************/ + (NSString *) fileKindByURL:(NSURL *)fileURL { return [CocoaDSFile fileKindByURL:fileURL version:nil port:nil]; } + (NSString *) fileKindByURL:(NSURL *)fileURL version:(NSString *)versionString port:(NSString *)portString { NSString *fileKind = nil; if (fileURL == nil) { return fileKind; } NSString *lookupVersionStr = versionString; NSString *lookupPortStr = portString; if (lookupVersionStr == nil) { lookupVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } if (lookupPortStr == nil) { lookupPortStr = @PORT_VERSION; } NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSDictionary *fileTypeExtDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"FileTypeByExtensions"]; NSDictionary *versionDict = (NSDictionary *)[fileTypeExtDict valueForKey:lookupVersionStr]; NSDictionary *portDict = (NSDictionary *)[versionDict valueForKey:lookupPortStr]; NSString *fileExt = [[fileURL path] pathExtension]; fileKind = (NSString *)[portDict valueForKey:fileExt]; if (fileKind == nil) { if ([CocoaDSFile isSaveStateSlotExtension:fileExt]) { fileKind = (NSString *)[portDict valueForKey:@FILE_EXT_SAVE_STATE]; } } return fileKind; } + (NSString *) fileVersionByURL:(NSURL *)fileURL { NSString *fileVersion = @"Unknown Version"; if (fileURL == nil) { return fileVersion; } NSString *versionStr = nil; NSString *portStr = nil; NSString *filePath = [fileURL path]; NSURL *versionURL = nil; NSString *versionPath = @PATH_CONFIG_DIRECTORY_0_9_6; versionPath = [versionPath stringByExpandingTildeInPath]; if ([[filePath stringByDeletingLastPathComponent] isEqualToString:versionPath]) { versionStr = @"0.9.6"; portStr = @"GTK"; } versionURL = [CocoaDSFile userAppSupportURL:nil version:@"0.9.7"]; versionPath = [versionURL path]; if (versionPath != nil && [[[filePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] isEqualToString:versionPath]) { versionStr = @"0.9.7"; portStr = @"Cocoa"; } versionURL = [CocoaDSFile userAppSupportURL:nil version:@"0.9.8"]; versionPath = [versionURL path]; if (versionPath != nil && [[[filePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] isEqualToString:versionPath]) { versionStr = @"0.9.8"; portStr = @"Cocoa"; } fileVersion = [[versionStr stringByAppendingString:@" "] stringByAppendingString:portStr]; return fileVersion; } + (BOOL) fileExistsForCurrent:(NSURL *)fileURL { BOOL result = NO; if (fileURL == nil) { return result; } NSString *filePath = [[CocoaDSFile directoryURLByKind:[CocoaDSFile fileKindByURL:fileURL]] path]; filePath = [filePath stringByAppendingPathComponent:[[fileURL path] lastPathComponent]]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager fileExistsAtPath:filePath]; [fileManager release]; return result; } + (NSURL *) fileURLFromRomURL:(NSURL *)romURL toKind:(NSString *)fileKind { return [CocoaDSFile fileURLFromRomURL:romURL toKind:fileKind version:nil port:nil]; } + (NSURL *) fileURLFromRomURL:(NSURL *)romURL toKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString { NSURL *fileURL = nil; NSString *fileExt = [CocoaDSFile fileExtensionByKind:fileKind version:versionString port:portString]; if (fileExt == nil) { return fileURL; } if ([CocoaDSFile isFileKindWithRom:fileKind]) { fileURL = [NSURL fileURLWithPath:[[[romURL path] stringByDeletingPathExtension] stringByAppendingPathExtension:fileExt]]; } else { NSURL *dirURL = [CocoaDSFile directoryURLByKind:fileKind version:versionString port:portString]; if (dirURL != nil) { NSString *newFileName = [[[[romURL path] lastPathComponent] stringByDeletingPathExtension] stringByAppendingPathExtension:fileExt]; fileURL = [NSURL fileURLWithPath:[[dirURL path] stringByAppendingPathComponent:newFileName]]; } } return fileURL; } + (NSString *) fileExtensionByKind:(NSString *)fileKind { return [CocoaDSFile fileExtensionByKind:fileKind version:nil port:nil]; } + (NSString *) fileExtensionByKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString { NSString *fileExt = nil; if (fileKind == nil) { return fileExt; } NSString *lookupVersionStr = versionString; NSString *lookupPortStr = portString; if (lookupVersionStr == nil) { lookupVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } if (lookupPortStr == nil) { lookupPortStr = @PORT_VERSION; } NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSDictionary *fileExtDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"FileExtensionByTypes"]; NSDictionary *versionDict = (NSDictionary *)[fileExtDict valueForKey:lookupVersionStr]; NSDictionary *portDict = (NSDictionary *)[versionDict valueForKey:lookupPortStr]; fileExt = (NSString *)[portDict valueForKey:fileKind]; return fileExt; } + (NSURL *) directoryURLByKind:(NSString *)fileKind { return [CocoaDSFile directoryURLByKind:fileKind version:nil port:nil]; } + (NSURL *) directoryURLByKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString { NSURL *fileURL = nil; NSString *lookupVersionStr = versionString; NSString *lookupPortStr = portString; NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; if (lookupVersionStr == nil) { lookupVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } if (lookupPortStr == nil) { lookupPortStr = @PORT_VERSION; } NSDictionary *pathDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; NSDictionary *pathVersionDict = (NSDictionary *)[pathDict valueForKey:lookupVersionStr]; NSDictionary *pathPortDict = (NSDictionary *)[pathVersionDict valueForKey:lookupPortStr]; NSDictionary *dirNameDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DirectoryNames"]; NSDictionary *dirNameVersionDict = (NSDictionary *)[dirNameDict valueForKey:lookupVersionStr]; NSDictionary *dirNamePortDict = (NSDictionary *)[dirNameVersionDict valueForKey:lookupPortStr]; NSString *dirPath = (NSString *)[pathPortDict valueForKey:fileKind]; if (dirPath != nil) { NSString *dirName = (NSString *)[dirNamePortDict valueForKey:fileKind]; if ([dirPath isEqualToString:@PATH_USER_APP_SUPPORT]) { fileURL = [CocoaDSFile userAppSupportURL:dirName version:lookupVersionStr]; } else if ([dirPath isEqualToString:@PATH_OPEN_EMU]) { NSMutableDictionary *urlDictionary = (NSMutableDictionary *)[[CocoaDSFile URLDictionary] valueForKey:dirPath]; if (urlDictionary != nil) { fileURL = (NSURL *)[urlDictionary valueForKey:fileKind]; } } else if ([dirPath isEqualToString:@PATH_WITH_ROM]) { return fileURL; } else { fileURL = [NSURL fileURLWithPath:[dirPath stringByExpandingTildeInPath]]; } } return fileURL; } + (BOOL) isFileKindWithRom:(NSString *)fileKind { return [CocoaDSFile isFileKindWithRom:fileKind version:nil port:nil]; } + (BOOL) isFileKindWithRom:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString { BOOL result = NO; NSString *lookupVersionStr = versionString; NSString *lookupPortStr = portString; NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; if (lookupVersionStr == nil) { lookupVersionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } if (lookupPortStr == nil) { lookupPortStr = @PORT_VERSION; } NSDictionary *pathDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; NSDictionary *pathVersionDict = (NSDictionary *)[pathDict valueForKey:lookupVersionStr]; NSDictionary *pathPortDict = (NSDictionary *)[pathVersionDict valueForKey:lookupPortStr]; NSString *dirPath = (NSString *)[pathPortDict valueForKey:fileKind]; if ([dirPath isEqualToString:@PATH_WITH_ROM]) { result = YES; } return result; } + (BOOL) saveStateExistsForSlot:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber { BOOL exists = NO; NSString *fileKind = @"Save State"; NSString *saveStateFilePath = nil; if (romURL == nil) { return exists; } if (slotNumber == 10) { slotNumber = 0; } NSString *saveStateFileName = [CocoaDSFile saveSlotFileName:romURL slotNumber:slotNumber]; if (saveStateFileName == nil) { return exists; } if ([CocoaDSFile isFileKindWithRom:fileKind]) { saveStateFilePath = [[[romURL path] stringByDeletingLastPathComponent] stringByAppendingPathComponent:saveStateFileName]; } else { NSURL *dirURL = [CocoaDSFile directoryURLByKind:fileKind]; if (dirURL != nil) { saveStateFilePath = [[dirURL path] stringByAppendingPathComponent:saveStateFileName]; } } NSFileManager *fileManager = [[NSFileManager alloc] init]; exists = [fileManager isReadableFileAtPath:saveStateFilePath]; [fileManager release]; return exists; } /******************************************************************************************** isSaveStateSlotExtension: Determines if a given extension represents a save state file type. Takes: extension - An NSString representing the file extension. Returns: A BOOL indicating if extension represents a save state file type. Details: Save state file extensions are represented by .ds#, where # is an integer that is greater than or equal to 0. ********************************************************************************************/ + (BOOL) isSaveStateSlotExtension:(NSString *)extension { BOOL result = NO; if ([extension length] < 3 || ![extension hasPrefix:@"ds"]) { return result; } NSString *slotNum = [extension substringFromIndex:2]; if ([slotNum isEqualToString:@"0"]) { result = YES; } else if ([slotNum intValue] != 0) { result = YES; } return result; } + (NSString *) saveSlotFileName:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber { if (romURL == nil) { return nil; } if (slotNumber == 10) { slotNumber = 0; } NSString *romFileName = [[romURL path] lastPathComponent]; NSString *fileExt = [NSString stringWithFormat:@"ds%ld", (unsigned long)slotNumber]; return [[romFileName stringByDeletingPathExtension] stringByAppendingPathExtension:fileExt]; } + (NSURL *) userAppSupportBaseURL { NSURL *userAppSupportURL = nil; NSString *userAppSupportPath = nil; NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; NSArray *savePaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); if ([savePaths count] == 0) { return userAppSupportURL; } userAppSupportPath = [[savePaths objectAtIndex:0] stringByAppendingPathComponent:appName]; userAppSupportURL = [NSURL fileURLWithPath:userAppSupportPath]; return userAppSupportURL; } + (NSURL *) userAppSupportURL:(NSString *)directoryName version:(NSString *)versionString { NSURL *userAppSupportURL = [CocoaDSFile userAppSupportBaseURL]; if (userAppSupportURL == nil) { return userAppSupportURL; } NSString *userAppSupportPath = [userAppSupportURL path]; NSString *versionStringForURL = versionString; // If nil is passed in for appVersion, then just use the current app version. if (versionStringForURL == nil) { versionStringForURL = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; } userAppSupportPath = [userAppSupportPath stringByAppendingPathComponent:versionStringForURL]; if (directoryName != nil) { userAppSupportPath = [userAppSupportPath stringByAppendingPathComponent:directoryName]; } userAppSupportURL = [NSURL fileURLWithPath:userAppSupportPath]; return userAppSupportURL; } + (BOOL) createUserAppSupportDirectory:(NSString *)directoryName { BOOL result = NO; NSString *tempPath = nil; NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; if (directoryName == nil) { return result; } NSArray *savePaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); if ([savePaths count] > 0) { tempPath = [savePaths objectAtIndex:0]; } else { return result; } NSFileManager *fileManager = [[NSFileManager alloc] init]; #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 // Mac OS X v10.4 and earlier. BOOL isDir = YES; tempPath = [tempPath stringByAppendingPathComponent:appName]; result = [fileManager createDirectoryAtPath:tempPath attributes:nil]; if (!result) { if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir]) { [fileManager release]; return result; } } tempPath = [tempPath stringByAppendingPathComponent:appVersion]; result = [fileManager createDirectoryAtPath:tempPath attributes:nil]; if (!result) { if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir]) { [fileManager release]; return result; } } tempPath = [tempPath stringByAppendingPathComponent:directoryName]; result = [fileManager createDirectoryAtPath:tempPath attributes:nil]; if (!result) { if(![fileManager fileExistsAtPath:tempPath isDirectory:&isDir]) { [fileManager release]; return result; } } /* In Mac OS X v10.4 and earlier, having the File Manager create new directories where they already exist returns NO. Note that this behavior is not per Apple's own documentation. Therefore, we manually set result=YES at the end to make sure the function returns the right result. */ result = YES; #else // Mac OS X v10.5 and later. Yes, the code is this simple... tempPath = [tempPath stringByAppendingPathComponent:appName]; tempPath = [tempPath stringByAppendingPathComponent:appVersion]; tempPath = [tempPath stringByAppendingPathComponent:directoryName]; result = [fileManager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:NULL]; #endif [fileManager release]; return result; } + (NSURL *) lastLoadedRomURL { return [[[NSDocumentController sharedDocumentController] recentDocumentURLs] objectAtIndex:0]; } #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 + (BOOL) moveFileToCurrentDirectory:(NSURL *)fileURL { BOOL result = NO; if (fileURL == nil) { return result; } NSString *newLocationPath = [[CocoaDSFile directoryURLByKind:[CocoaDSFile fileKindByURL:fileURL]] path]; if (newLocationPath == nil) { return result; } NSString *filePath = [fileURL path]; newLocationPath = [newLocationPath stringByAppendingPathComponent:[filePath lastPathComponent]]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager moveItemAtPath:filePath toPath:newLocationPath error:nil]; [fileManager release]; return result; } + (BOOL) copyFileToCurrentDirectory:(NSURL *)fileURL { BOOL result = NO; if (fileURL == nil) { return result; } NSString *newLocationPath = [[CocoaDSFile directoryURLByKind:[CocoaDSFile fileKindByURL:fileURL]] path]; if (newLocationPath == nil) { return result; } NSString *filePath = [fileURL path]; newLocationPath = [newLocationPath stringByAppendingPathComponent:[filePath lastPathComponent]]; NSFileManager *fileManager = [[NSFileManager alloc] init]; result = [fileManager copyItemAtPath:filePath toPath:newLocationPath error:nil]; [fileManager release]; return result; } + (BOOL) moveFileListToCurrent:(NSMutableArray *)fileList { BOOL result = NO; if (fileList == nil) { return result; } for (NSDictionary *fileDict in fileList) { BOOL willMigrate = [[fileDict valueForKey:@"willMigrate"] boolValue]; if (!willMigrate) { continue; } NSURL *fileURL = [NSURL URLWithString:[fileDict valueForKey:@"URL"]]; [CocoaDSFile moveFileToCurrentDirectory:fileURL]; } result = YES; return result; } + (BOOL) copyFileListToCurrent:(NSMutableArray *)fileList { BOOL result = NO; if (fileList == nil) { return result; } for (NSDictionary *fileDict in fileList) { BOOL willMigrate = [[fileDict valueForKey:@"willMigrate"] boolValue]; if (!willMigrate) { continue; } NSURL *fileURL = [NSURL URLWithString:[fileDict valueForKey:@"URL"]]; [CocoaDSFile copyFileToCurrentDirectory:fileURL]; } result = YES; return result; } + (NSMutableArray *) completeFileList { NSMutableArray *fileList = [NSMutableArray arrayWithCapacity:100]; if (fileList == nil) { return fileList; } NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; NSDictionary *fileTypeInfoRootDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FileTypeInfo" ofType:@"plist"]]; NSArray *versionList = [fileTypeInfoRootDict valueForKey:@"VersionStrings"]; NSDictionary *filePathsDict = (NSDictionary *)[fileTypeInfoRootDict valueForKey:@"DefaultPaths"]; for (NSString *versionKey in versionList) { if ([currentVersion isEqualToString:versionKey]) { continue; } NSDictionary *versionDict = (NSDictionary *)[filePathsDict valueForKey:versionKey]; NSArray *portArray = [versionDict allKeys]; for (NSString *portKey in portArray) { NSDictionary *portDict = (NSDictionary *)[versionDict valueForKey:portKey]; NSArray *fileKindList = [portDict allKeys]; for (NSString *fileKind in fileKindList) { NSURL *dirURL = [CocoaDSFile directoryURLByKind:fileKind version:versionKey port:portKey]; [fileList addObjectsFromArray:[CocoaDSFile appFileList:dirURL fileKind:fileKind]]; } } } return fileList; } + (NSMutableArray *) appFileList:(NSURL *)directoryURL { return [self appFileList:directoryURL fileKind:nil]; } + (NSMutableArray *) appFileList:(NSURL *)directoryURL fileKind:(NSString *)theFileKind { NSMutableArray *outArray = nil; if (directoryURL == nil) { return outArray; } NSString *directoryPath = [directoryURL path]; NSFileManager *fileManager = [[NSFileManager alloc] init]; NSArray *fileList = [fileManager contentsOfDirectoryAtPath:directoryPath error:nil]; if (fileList == nil) { [fileManager release]; return outArray; } outArray = [NSMutableArray arrayWithCapacity:100]; if (outArray == nil) { [fileManager release]; return outArray; } for (NSString *fileName in fileList) { NSNumber *willMigrate = [NSNumber numberWithBool:YES]; NSString *filePath = [directoryPath stringByAppendingPathComponent:fileName]; NSURL *fileURL = [NSURL fileURLWithPath:filePath]; NSString *fileVersion = [CocoaDSFile fileVersionByURL:fileURL]; NSString *fileKind = [CocoaDSFile fileKindByURL:fileURL]; if (fileKind == nil || (theFileKind != nil && ![theFileKind isEqualToString:fileKind]) || [CocoaDSFile fileExistsForCurrent:fileURL]) { continue; } NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:filePath error:nil]; NSMutableDictionary *finalDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: willMigrate, @"willMigrate", fileName, @"name", fileVersion, @"version", fileKind, @"kind", [fileAttributes fileModificationDate], @"dateModified", [fileURL absoluteString], @"URL", nil]; [outArray addObject:finalDict]; } [fileManager release]; return outArray; } #endif @end desmume-0.9.9/src/cocoa/cocoa_rom.mm0000644000175000017500000005723612140261603020101 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_rom.h" #import "cocoa_file.h" #import "cocoa_globals.h" #import "cocoa_util.h" #include "../NDSSystem.h" #include "../MMU.h" #include "../mc.h" #undef BOOL @implementation CocoaDSRom @synthesize header; @synthesize bindings; @synthesize fileURL; @dynamic isDataLoaded; @synthesize saveType; static NSMutableDictionary *saveTypeValues = nil; - (id)init { return [self initWithURL:nil]; } - (id) initWithURL:(NSURL *)theURL { return [self initWithURL:theURL saveType:ROMSAVETYPE_AUTOMATIC]; } - (id) initWithURL:(NSURL *)theURL saveType:(NSInteger)saveTypeID { self = [super init]; if (self == nil) { return self; } if (saveTypeValues == nil) { saveTypeValues = [[NSMutableDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInteger:1], @"eeprom - 4 kbit", [NSNumber numberWithInteger:2], @"eeprom - 64 kbit", [NSNumber numberWithInteger:3], @"eeprom - 512 kbit", [NSNumber numberWithInteger:5], @"flash - 2 mbit", [NSNumber numberWithInteger:6], @"flash - 4 mbit", [NSNumber numberWithInteger:7], @"flash - 8 mbit", [NSNumber numberWithInteger:10], @"flash - 64 mbit", [NSNumber numberWithInteger:0], @"none", [NSNumber numberWithInteger:0], @"tbc", nil]; } header = [[NSMutableDictionary alloc] initWithCapacity:32]; if (header == nil) { [self release]; self = nil; return self; } bindings = [[CocoaDSRom romNotLoadedBindings] retain]; if (bindings == nil) { [header release]; [self release]; self = nil; return self; } fileURL = nil; saveType = saveTypeID; xmlCurrentRom = nil; xmlElementStack = [[NSMutableArray alloc] initWithCapacity:32]; xmlCharacterStack = [[NSMutableArray alloc] initWithCapacity:32]; if (theURL != nil) { [self loadData:theURL]; } return self; } - (void)dealloc { if ([self isDataLoaded]) { NDS_FreeROM(); } [xmlElementStack release]; [xmlCharacterStack release]; [header release]; [bindings release]; [fileURL release]; [super dealloc]; } - (BOOL) isDataLoaded { return (MMU.CART_ROM != MMU.UNUSED_RAM); } - (void) initHeader { const NDS_header *ndsRomHeader = NDS_getROMHeader(); const RomBanner &ndsRomBanner = gameInfo.getRomBanner(); if(self.header == nil || self.bindings == nil) { return; } if (&ndsRomBanner != NULL) { [self.header setValue:[self banner:ndsRomBanner.titles[0]] forKey:@"bannerJapanese"]; [self.header setValue:[self banner:ndsRomBanner.titles[1]] forKey:@"bannerEnglish"]; [self.header setValue:[self banner:ndsRomBanner.titles[2]] forKey:@"bannerFrench"]; [self.header setValue:[self banner:ndsRomBanner.titles[3]] forKey:@"bannerGerman"]; [self.header setValue:[self banner:ndsRomBanner.titles[4]] forKey:@"bannerItalian"]; [self.header setValue:[self banner:ndsRomBanner.titles[5]] forKey:@"bannerSpanish"]; [self.bindings setValue:[self.header objectForKey:@"bannerJapanese"] forKey:@"bannerJapanese"]; [self.bindings setValue:[self.header objectForKey:@"bannerEnglish"] forKey:@"bannerEnglish"]; [self.bindings setValue:[self.header objectForKey:@"bannerFrench"] forKey:@"bannerFrench"]; [self.bindings setValue:[self.header objectForKey:@"bannerGerman"] forKey:@"bannerGerman"]; [self.bindings setValue:[self.header objectForKey:@"bannerItalian"] forKey:@"bannerItalian"]; [self.bindings setValue:[self.header objectForKey:@"bannerSpanish"] forKey:@"bannerSpanish"]; } if (ndsRomHeader != NULL) { [self.header setValue:[self title] forKey:@"gameTitle"]; [self.header setValue:[self code] forKey:@"gameCode"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->makerCode] forKey:@"makerCode"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->cardSize] forKey:@"romSize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9src] forKey:@"arm9BinaryOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9exe] forKey:@"arm9BinaryEntryAddress"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9cpy] forKey:@"arm9BinaryStartAddress"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9binSize] forKey:@"arm9BinarySize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7src] forKey:@"arm7BinaryOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7exe] forKey:@"arm7BinaryEntryAddress"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7cpy] forKey:@"arm7BinaryStartAddress"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7binSize] forKey:@"arm7BinarySize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FNameTblOff] forKey:@"fntOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FNameTblSize] forKey:@"fntTableSize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FATOff] forKey:@"fatOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FATSize] forKey:@"fatSize"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->IconOff] forKey:@"iconOffset"]; [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ROMSize] forKey:@"usedRomSize"]; [self.bindings setValue:[self.header objectForKey:@"gameTitle"] forKey:@"gameTitle"]; [self.bindings setValue:[self.header objectForKey:@"gameCode"] forKey:@"gameCode"]; [self.bindings setValue:[NSString stringWithFormat:@"%04Xh", [[self.header objectForKey:@"makerCode"] intValue]] forKey:@"makerCode"]; [self.bindings setValue:[NSString stringWithFormat:@"%i", [[self.header objectForKey:@"romSize"] intValue]] forKey:@"romSize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryOffset"] intValue]] forKey:@"arm9BinaryOffset"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryEntryAddress"] intValue]] forKey:@"arm9BinaryEntryAddress"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryStartAddress"] intValue]] forKey:@"arm9BinaryStartAddress"]; [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"arm9BinarySize"] intValue]] forKey:@"arm9BinarySize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryOffset"] intValue]] forKey:@"arm7BinaryOffset"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryEntryAddress"] intValue]] forKey:@"arm7BinaryEntryAddress"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryStartAddress"] intValue]] forKey:@"arm7BinaryStartAddress"]; [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"arm7BinarySize"] intValue]] forKey:@"arm7BinarySize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fntOffset"] intValue]] forKey:@"fntOffset"]; [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"fntTableSize"] intValue]] forKey:@"fntTableSize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fatOffset"] intValue]] forKey:@"fatOffset"]; [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"fatSize"] intValue]] forKey:@"fatSize"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fatOffset"] intValue]] forKey:@"fatOffset"]; [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"iconOffset"] intValue]] forKey:@"iconOffset"]; [self.bindings setValue:[NSString stringWithFormat:@"%i", [[self.header objectForKey:@"usedRomSize"] intValue]] forKey:@"usedRomSize"]; } // Get ROM image NSImage *iconImage = [self icon]; if (iconImage != nil) { [header setObject:iconImage forKey:@"iconImage"]; [self.bindings setObject:(NSImage *)[self.header objectForKey:@"iconImage"] forKey:@"iconImage"]; } [self.header setValue:[self internalName] forKey:@"romInternalName"]; [self.header setValue:[self serial] forKey:@"romSerial"]; [self.bindings setValue:[self.header objectForKey:@"romInternalName"] forKey:@"romInternalName"]; [self.bindings setValue:[self.header objectForKey:@"romSerial"] forKey:@"romSerial"]; NSString *romNameAndSerialInfoString = @"Name: "; romNameAndSerialInfoString = [romNameAndSerialInfoString stringByAppendingString:[self.header objectForKey:@"romInternalName"]]; romNameAndSerialInfoString = [[romNameAndSerialInfoString stringByAppendingString:@"\nSerial: "] stringByAppendingString:[self.header objectForKey:@"romSerial"]]; [self.bindings setValue:romNameAndSerialInfoString forKey:@"romNameAndSerialInfo"]; } - (BOOL) loadData:(NSURL *)theURL { [CocoaDSRom changeRomSaveType:saveType]; BOOL result = [CocoaDSFile loadRom:theURL]; if (!result) { NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:NO], @"DidLoad", nil]; [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.loadRomDidFinish" object:self userInfo:userInfo]; [userInfo release]; return result; } fileURL = [theURL copy]; [self initHeader]; NSString *advscDBPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Advanscene_DatabasePath"]; if (advscDBPath != nil) { NSError *xmlError = [[NSError alloc] init]; NSXMLParser *advscDB = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL fileURLWithPath:advscDBPath]]; [advscDB setDelegate:self]; [advscDB parse]; [advscDB release]; [xmlError release]; } NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"DidLoad", self.fileURL, @"URL", nil]; [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.loadRomDidFinish" object:self userInfo:userInfo]; [userInfo release]; return result; } - (void) loadDataOnThread:(id)object { [self retain]; NSURL *theURL = [(NSURL *)object copy]; NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init]; [self loadData:theURL]; [threadPool release]; [theURL release]; [self release]; } - (NSString *) title { NDS_header *ndsRomHeader = NDS_getROMHeader(); if (ndsRomHeader == nil) { return nil; } return [[[NSString alloc] initWithBytes:ndsRomHeader->gameTile length:ROMINFO_GAME_TITLE_LENGTH encoding:NSUTF8StringEncoding] autorelease]; } - (NSString *) code { NDS_header *ndsRomHeader = NDS_getROMHeader(); if (ndsRomHeader == nil) { return nil; } return [[[NSString alloc] initWithBytes:ndsRomHeader->gameCode length:ROMINFO_GAME_CODE_LENGTH encoding:NSUTF8StringEncoding] autorelease]; } - (NSString *) banner:(const UInt16 *)UTF16TextBuffer { NSUInteger bannerLength = ROMINFO_GAME_BANNER_LENGTH * sizeof(*UTF16TextBuffer); return [[[NSString alloc] initWithBytes:UTF16TextBuffer length:bannerLength encoding:NSUTF16LittleEndianStringEncoding] autorelease]; } - (NSString *) internalName { return [NSString stringWithCString:gameInfo.ROMname encoding:NSUTF8StringEncoding]; } - (NSString *) serial { return [NSString stringWithCString:gameInfo.ROMserial encoding:NSUTF8StringEncoding]; } - (NSImage *) icon { NSImage *newImage = nil; NDS_header *ndsRomHeader = NDS_getROMHeader(); if (ndsRomHeader == nil) { return newImage; } NSUInteger iconOffset = ndsRomHeader->IconOff; if(iconOffset == 0) { return newImage; } newImage = [[NSImage alloc] initWithSize:NSMakeSize(32, 32)]; if(newImage == nil) { return newImage; } NSUInteger w = ROM_ICON_WIDTH; NSUInteger h = ROM_ICON_HEIGHT; NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:w pixelsHigh:h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:w * 4 bitsPerPixel:32]; if(imageRep == nil) { [newImage release]; newImage = nil; return newImage; } uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; RomIconToRGBA8888(bitmapData); #ifdef __BIG_ENDIAN__ uint32_t *bitmapDataEnd = bitmapData + (w * h); while (bitmapData < bitmapDataEnd) { *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); } #endif [imageRep autorelease]; [newImage addRepresentation:imageRep]; return [newImage autorelease]; } - (void) handleAdvansceneDatabaseInfo { if (xmlCurrentRom == nil) { return; } // Set the ROM save type. BOOL useAdvscForRomSave = [[NSUserDefaults standardUserDefaults] boolForKey:@"Advanscene_AutoDetectRomSaveType"]; if (useAdvscForRomSave && (saveType == ROMSAVETYPE_AUTOMATIC)) { NSString *saveTypeString = (NSString *)[xmlCurrentRom valueForKey:@"saveType"]; NSInteger saveTypeID = [CocoaDSRom saveTypeByString:saveTypeString]; [CocoaDSRom changeRomSaveType:saveTypeID]; if (saveTypeID != ROMSAVETYPE_AUTOMATIC) { NSLog(@"Set the ROM save type using the ADVANsCEne database: %s.", [saveTypeString cStringUsingEncoding:NSUTF8StringEncoding]); } } } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { NSMutableString *xmlCharacters = [NSMutableString stringWithCapacity:1024]; [xmlCharacters setString:@""]; [xmlCharacterStack addObject:xmlCharacters]; [xmlElementStack addObject:elementName]; if ([elementName isEqualToString:@"game"]) { if (xmlCurrentRom == nil) { xmlCurrentRom = [[NSMutableDictionary alloc] initWithCapacity:32]; } } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName { NSString *xmlElement = (NSString *)[xmlElementStack lastObject]; if (xmlElement == nil || ![xmlElement isEqualToString:elementName]) { return; } NSMutableString *xmlCharacters = (NSMutableString *)[xmlCharacterStack lastObject]; [xmlCharacters setString:[xmlCharacters stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; if ([elementName isEqualToString:@"game"]) { NSString *romHeaderSerial = (NSString *)[self.header valueForKey:@"romSerial"]; NSString *xmlSerial = (NSString *)[xmlCurrentRom valueForKey:@"serial"]; if ([xmlSerial isEqualToString:romHeaderSerial]) { [self handleAdvansceneDatabaseInfo]; [parser abortParsing]; } [xmlCurrentRom release]; xmlCurrentRom = nil; } else { if (xmlCurrentRom != nil) { [xmlCurrentRom setValue:[NSString stringWithString:xmlCharacters] forKey:elementName]; } } [xmlCharacterStack removeLastObject]; [xmlElementStack removeLastObject]; } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSMutableString *xmlCharacters = (NSMutableString *)[xmlCharacterStack lastObject]; if (xmlCharacters != nil) { [xmlCharacters appendString:string]; } } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSInteger errorCode = [parseError code]; if (errorCode == NSXMLParserDelegateAbortedParseError) { return; } } + (void) changeRomSaveType:(NSInteger)saveTypeID { CommonSettings.manualBackupType = (int)saveTypeID; if (saveTypeID != ROMSAVETYPE_AUTOMATIC) { backup_forceManualBackupType(); } } + (NSInteger) saveTypeByString:(NSString *)saveTypeString { NSInteger saveTypeID = 0; if (saveTypeValues == nil) { return saveTypeID; } NSNumber *saveTypeNumber = (NSNumber *)[saveTypeValues valueForKey:[saveTypeString lowercaseString]]; if (saveTypeNumber == nil) { return saveTypeID; } saveTypeID = [saveTypeNumber integerValue]; return saveTypeID; } + (NSMutableDictionary *) romNotLoadedBindings { NSImage *iconImage = [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AppIcon_DeSmuME" ofType:@"icns"]] autorelease]; NSString *romNameAndSerialInfoString = @"Name: "; romNameAndSerialInfoString = [romNameAndSerialInfoString stringByAppendingString:NSSTRING_STATUS_NO_ROM_LOADED]; romNameAndSerialInfoString = [[romNameAndSerialInfoString stringByAppendingString:@"\nSerial: "] stringByAppendingString:NSSTRING_STATUS_NO_ROM_LOADED]; return [NSMutableDictionary dictionaryWithObjectsAndKeys: NSSTRING_STATUS_NO_ROM_LOADED, @"romInternalName", NSSTRING_STATUS_NO_ROM_LOADED, @"romSerial", romNameAndSerialInfoString, @"romNameAndSerialInfo", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerJapanese", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerEnglish", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerFrench", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerGerman", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerItalian", NSSTRING_STATUS_NO_ROM_LOADED, @"bannerSpanish", NSSTRING_STATUS_NO_ROM_LOADED, @"gameTitle", NSSTRING_STATUS_NO_ROM_LOADED, @"gameCode", NSSTRING_STATUS_NO_ROM_LOADED, @"makerCode", [NSString stringWithFormat:NSSTRING_STATUS_NO_ROM_LOADED, 0], @"romSize", [NSString stringWithFormat:@"0x%08X", 0], @"arm9BinaryOffset", [NSString stringWithFormat:@"0x%08X", 0], @"arm9BinaryEntryAddress", [NSString stringWithFormat:@"0x%08X", 0], @"arm9BinaryStartAddress", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"arm9BinarySize", [NSString stringWithFormat:@"0x%08X", 0], @"arm7BinaryOffset", [NSString stringWithFormat:@"0x%08X", 0], @"arm7BinaryEntryAddress", [NSString stringWithFormat:@"0x%08X", 0], @"arm7BinaryStartAddress", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"arm7BinarySize", [NSString stringWithFormat:@"0x%08X", 0], @"fntOffset", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"fntTableSize", [NSString stringWithFormat:@"0x%08X", 0], @"fatOffset", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"fatSize", [NSString stringWithFormat:@"0x%08X", 0], @"iconOffset", [NSString stringWithFormat:NSSTRING_STATUS_NO_ROM_LOADED, 0], @"usedRomSize", iconImage, @"iconImage", nil]; } @end /******************************************************************************************** RomIconToRGBA8888() Reads the icon image data from a ROM and converts it to an RGBA8888 formatted bitmap. Takes: bitmapData - Write pointer for the icon's pixel data. Returns: Nothing. Details: - If bitmapData is NULL, then this function immediately returns and does nothing. - If no ROM is loaded, then bitmapData will have a black square icon. - The caller is responsible for ensuring that bitmapData points to a valid memory location and that the memory block is large enough to hold the pixel data. The written data will be 32x32 pixels in 32-bit color. Therefore, a size of at least 4096 bytes must be allocated. ********************************************************************************************/ void RomIconToRGBA8888(uint32_t *bitmapData) { const NDS_header *ndsRomHeader = NDS_getROMHeader(); // Contains the memory addresses we need to get our read pointer locations. int iconOffset; // Memory location offset for the ROM icon data. const uint16_t *iconClutPtr; // Read pointer for the icon's CLUT. const uint32_t *iconPixPtr; // Read pointer for the icon's pixel data. uint32_t clut[16]; // 4-bit indexed CLUT, storing RGBA8888 values for each color. uint32_t pixRowColors; // Temp location for storing an 8 pixel row of 4-bit indexed color values from the icon's pixel data. unsigned int pixRowIndex; // Temp location for tracking which pixel row of an 8x8 square that we are reading. unsigned int x; // Temp location for tracking which of the 8x8 pixel squares that we are reading (x-dimension). unsigned int y; // Temp location for tracking which of the 8x8 pixel squares that we are reading (y-dimension). uint32_t *bitmapPixPtr; // Write pointer for the RGBA8888 bitmap pixel data, relative to the passed in *bitmapData pointer. if (bitmapData == NULL) { return; } if (ndsRomHeader == NULL) { memset(bitmapData, 0, 4096); // 4096 bytes = 32px * 32px * sizeof(uint32_t) return; } // Set all of our pointers relative to iconOffset. iconOffset = ndsRomHeader->IconOff; iconClutPtr = (uint16_t *)&MMU.CART_ROM[iconOffset + 0x220] + 1; iconPixPtr = (uint32_t *)&MMU.CART_ROM[iconOffset + 0x20]; // Setup the 4-bit CLUT. // // The actual color values are stored with the ROM icon data in RGB555 format. // We convert these color values and store them in the CLUT as RGBA8888 values. // // The first entry always represents the alpha, so we can just ignore it. clut[0] = 0x00000000; RGB555ToRGBA8888Buffer(iconClutPtr, &clut[1], 15); // Load the image from the icon pixel data. // // ROM icons are stored in 4-bit indexed color and have dimensions of 32x32 pixels. // Also, ROM icons are split into 16 separate 8x8 pixel squares arranged in a 4x4 // array. Here, we sequentially read from the ROM data, and adjust our write // location appropriately within the bitmap memory block. for(y = 0; y < 4; y++) { for(x = 0; x < 4; x++) { for(pixRowIndex = 0; pixRowIndex < 8; pixRowIndex++, iconPixPtr++) { // Load the entire row of pixels as a single 32-bit chunk. pixRowColors = *iconPixPtr; // Set the write location. The formula below calculates the proper write // location depending on the position of the read pointer. We use a more // optimized version of this formula in practice. // // bitmapPixPtr = bitmapData + ( ((y * 8) + pixRowIndex) * 32 ) + (x * 8); bitmapPixPtr = bitmapData + ( ((y << 3) + pixRowIndex) << 5 ) + (x << 3); // Set the RGBA8888 bitmap pixels using our CLUT from earlier. #ifdef __BIG_ENDIAN__ *bitmapPixPtr = clut[(pixRowColors & 0x0F000000) >> 24]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0xF0000000) >> 28]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x000F0000) >> 16]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x00F00000) >> 20]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x00000F00) >> 8]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x0000F000) >> 12]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x0000000F)]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x000000F0) >> 4]; #else *bitmapPixPtr = clut[(pixRowColors & 0x0000000F)]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x000000F0) >> 4]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x00000F00) >> 8]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x0000F000) >> 12]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x000F0000) >> 16]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x00F00000) >> 20]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0x0F000000) >> 24]; bitmapPixPtr++; *bitmapPixPtr = clut[(pixRowColors & 0xF0000000) >> 28]; #endif } } } } desmume-0.9.9/src/cocoa/cocoa_file.h0000644000175000017500000000741312140261603020031 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif @interface CocoaDSFile : NSDocument { } + (NSMutableDictionary *) URLDictionary; + (void) addURLToURLDictionary:(NSURL *)theURL groupKey:(NSString *)groupKey fileKind:(NSString *)fileKind; + (void) removeURLFromURLDictionaryByGroupKey:(NSString *)groupKey fileKind:(NSString *)fileKind; + (BOOL) loadState:(NSURL *)saveStateURL; + (BOOL) saveState:(NSURL *)saveStateURL; + (BOOL) loadRom:(NSURL *)romURL; + (BOOL) importRomSave:(NSURL *)romSaveURL; + (BOOL) exportRomSaveToURL:(NSURL *)destinationURL romSaveURL:(NSURL *)romSaveURL fileType:(NSInteger)fileTypeID; + (NSURL *) romSaveURLFromRomURL:(NSURL *)romURL; + (NSURL *) cheatsURLFromRomURL:(NSURL *)romURL; + (BOOL) romSaveExists:(NSURL *)romURL; + (BOOL) romSaveExistsWithRom:(NSURL *)romURL; + (void) setupAllFilePaths; + (void) setupAllFilePathsWithURLDictionary:(NSString *)URLDictionaryKey; + (void) setupAllFilePathsForVersion:(NSString *)versionString port:(NSString *)portString; + (BOOL) setupAllAppDirectories; + (NSURL *) saveStateURL; + (BOOL) saveScreenshot:(NSURL *)fileURL bitmapData:(NSBitmapImageRep *)bitmapImageRep fileType:(NSBitmapImageFileType)fileType; + (BOOL) isFileKindWithRom:(NSString *)fileKind; + (BOOL) isFileKindWithRom:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString; + (BOOL) saveStateExistsForSlot:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber; + (BOOL) isSaveStateSlotExtension:(NSString *)extension; + (NSString *) saveSlotFileName:(NSURL *)romURL slotNumber:(NSUInteger)slotNumber; + (NSString *) fileKindByURL:(NSURL *)fileURL; + (NSString *) fileKindByURL:(NSURL *)fileURL version:(NSString *)versionString port:(NSString *)portString; + (NSString *) fileVersionByURL:(NSURL *)fileURL; + (BOOL) fileExistsForCurrent:(NSURL *)fileURL; + (NSURL *) fileURLFromRomURL:(NSURL *)romURL toKind:(NSString *)fileKind; + (NSURL *) fileURLFromRomURL:(NSURL *)romURL toKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString; + (NSString *) fileExtensionByKind:(NSString *)fileKind; + (NSString *) fileExtensionByKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString; + (NSURL *) directoryURLByKind:(NSString *)fileKind; + (NSURL *) directoryURLByKind:(NSString *)fileKind version:(NSString *)versionString port:(NSString *)portString; + (NSURL *) userAppSupportBaseURL; + (NSURL *) userAppSupportURL:(NSString *)directoryName version:(NSString *)versionString; + (BOOL) createUserAppSupportDirectory:(NSString *)directoryName; + (NSURL *) lastLoadedRomURL; #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 + (BOOL) moveFileToCurrentDirectory:(NSURL *)fileURL; + (BOOL) copyFileToCurrentDirectory:(NSURL *)fileURL; + (BOOL) moveFileListToCurrent:(NSMutableArray *)fileList; + (BOOL) copyFileListToCurrent:(NSMutableArray *)fileList; + (NSMutableArray *) completeFileList; + (NSMutableArray *) appFileList:(NSURL *)directoryURL; + (NSMutableArray *) appFileList:(NSURL *)directoryURL fileKind:(NSString *)theFileKind; #endif @end desmume-0.9.9/src/cocoa/cocoa_input.mm0000644000175000017500000001166512140261603020437 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_input.h" #import "cocoa_globals.h" #include "../NDSSystem.h" #undef BOOL @implementation CocoaDSController @synthesize micMode; @synthesize selectedAudioFileGenerator; - (id)init { self = [super init]; if (self == nil) { return self; } for (unsigned int i = 0; i < DSControllerState_StatesCount; i++) { controllerState[i] = false; } spinlockControllerState = OS_SPINLOCK_INIT; micMode = MICMODE_NONE; selectedAudioFileGenerator = NULL; touchLocation = NSMakePoint(0.0f, 0.0f); return self; } - (void)dealloc { [super dealloc]; } - (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID { if (controlID >= DSControllerState_StatesCount) { return; } OSSpinLockLock(&spinlockControllerState); controllerState[controlID] = (theState) ? true : false; OSSpinLockUnlock(&spinlockControllerState); } - (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation { OSSpinLockLock(&spinlockControllerState); controllerState[DSControllerState_Touch] = (theState) ? true : false; touchLocation = theLocation; OSSpinLockUnlock(&spinlockControllerState); } - (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode { OSSpinLockLock(&spinlockControllerState); controllerState[DSControllerState_Microphone] = (theState) ? true : false; micMode = inputMode; OSSpinLockUnlock(&spinlockControllerState); } - (void) setSineWaveGeneratorFrequency:(const double)freq { sineWaveGenerator.setFrequency(freq); } - (void) flush { OSSpinLockLock(&spinlockControllerState); const NSPoint theLocation = touchLocation; const NSInteger theMicMode = micMode; static bool flushedStates[DSControllerState_StatesCount] = {0}; for (unsigned int i = 0; i < DSControllerState_StatesCount; i++) { flushedStates[i] = controllerState[i]; } OSSpinLockUnlock(&spinlockControllerState); const bool isTouchDown = flushedStates[DSControllerState_Touch]; const bool isMicPressed = flushedStates[DSControllerState_Microphone]; // Setup the DS pad. NDS_setPad(flushedStates[DSControllerState_Right], flushedStates[DSControllerState_Left], flushedStates[DSControllerState_Down], flushedStates[DSControllerState_Up], flushedStates[DSControllerState_Select], flushedStates[DSControllerState_Start], flushedStates[DSControllerState_B], flushedStates[DSControllerState_A], flushedStates[DSControllerState_Y], flushedStates[DSControllerState_X], flushedStates[DSControllerState_L], flushedStates[DSControllerState_R], flushedStates[DSControllerState_Debug], flushedStates[DSControllerState_Lid]); // Setup the DS touch pad. if (isTouchDown) { NDS_setTouchPos((u16)theLocation.x, (u16)theLocation.y); } else { NDS_releaseTouch(); } // Setup the DS mic. AudioGenerator *selectedGenerator = &nullSampleGenerator; switch (theMicMode) { case MICMODE_INTERNAL_NOISE: selectedGenerator = &internalNoiseGenerator; break; case MICMODE_WHITE_NOISE: selectedGenerator = &whiteNoiseGenerator; break; case MICMODE_SINE_WAVE: selectedGenerator = &sineWaveGenerator; break; case MICMODE_AUDIO_FILE: if (selectedAudioFileGenerator != NULL) { selectedGenerator = selectedAudioFileGenerator; } break; default: break; } NDS_setMic(isMicPressed); if (!isMicPressed) { selectedGenerator = &nullSampleGenerator; internalNoiseGenerator.setSamplePosition(0); sineWaveGenerator.setCyclePosition(0.0); if (selectedAudioFileGenerator != NULL) { selectedAudioFileGenerator->setSamplePosition(0); } } static const bool useBufferedSource = false; Mic_SetUseBufferedSource(useBufferedSource); if (useBufferedSource) { static u8 generatedSampleBuffer[(size_t)(MIC_MAX_BUFFER_SAMPLES + 0.5)] = {0}; static const size_t requestedSamples = MIC_MAX_BUFFER_SAMPLES; const size_t availableSamples = micInputBuffer.getAvailableElements(); if (availableSamples < requestedSamples) { micInputBuffer.drop(requestedSamples - availableSamples); } selectedGenerator->generateSampleBlock(requestedSamples, generatedSampleBuffer); micInputBuffer.write(generatedSampleBuffer, requestedSamples); } else { Mic_SetSelectedDirectSampleGenerator(selectedGenerator); } } @end desmume-0.9.9/src/cocoa/cocoa_input_legacy.mm0000644000175000017500000002343112140261603021755 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #import "cocoa_input_legacy.h" #include "../NDSSystem.h" @implementation CocoaDSInput - (id) init { isStateChanged = false; property = [[NSMutableDictionary alloc] init]; [property setValue:[NSDate date] forKey:@"inputTime"]; return self; } - (void) dealloc { [property release]; [super dealloc]; } - (void) setIsStateChanged:(bool)state { isStateChanged = state; } - (bool) isStateChanged { return isStateChanged; } - (void) setInputTime:(NSDate*)inputTime { [property setValue:inputTime forKey:@"inputTime"]; } - (NSDate*) getInputTime { return [property objectForKey:@"inputTime"]; } @end @implementation CocoaDSButton - (id) init { [super init]; [property setValue:[NSNumber numberWithBool:false] forKey:@"press"]; return self; } - (void) dealloc { [super dealloc]; } - (void) setPressed:(bool)inputValue { // Check for state change and set the flag appropriately. if (inputValue != [self getPressed]) { isStateChanged = true; } else { isStateChanged = false; } [property setValue:[NSDate date] forKey:@"inputTime"]; [property setValue:[NSNumber numberWithBool:inputValue] forKey:@"press"]; } - (bool) getPressed { return [[property objectForKey:@"press"] boolValue]; } @end @implementation CocoaDSTouch - (id) init { [super init]; [property setValue:[NSNumber numberWithBool:false] forKey:@"touch"]; [property setValue:[NSNumber numberWithFloat:0.0] forKey:@"x"]; [property setValue:[NSNumber numberWithFloat:0.0] forKey:@"y"]; return self; } - (void) dealloc { [super dealloc]; } - (void) setTouching:(bool)inputValue { // Check for state change and set the flag appropriately. if (inputValue != [self getTouching]) { isStateChanged = true; } else { isStateChanged = false; } [property setValue:[NSDate date] forKey:@"inputTime"]; [property setValue:[NSNumber numberWithBool:inputValue] forKey:@"touch"]; } - (bool) getTouching { return [[property objectForKey:@"touch"] boolValue]; } - (void) setX:(float)inputValue { // Check for state change and set the flag appropriately. if (inputValue != [self getX]) { isStateChanged = true; } else { isStateChanged = false; } [property setValue:[NSDate date] forKey:@"inputTime"]; [property setValue:[NSNumber numberWithFloat:inputValue] forKey:@"x"]; } - (float) getX { return [[property objectForKey:@"x"] floatValue]; } - (void) setY:(float)inputValue { // Check for state change and set the flag appropriately. if (inputValue != [self getY]) { isStateChanged = true; } else { isStateChanged = false; } [property setValue:[NSDate date] forKey:@"inputTime"]; [property setValue:[NSNumber numberWithFloat:inputValue] forKey:@"y"]; } - (float) getY { return [[property objectForKey:@"y"] floatValue]; } - (void) setPoint:(NSPoint)inputValue { // Check for state change and set the flag appropriately. if (inputValue.x != [self getX] || inputValue.y != [self getY]) { isStateChanged = true; } else { isStateChanged = false; } [self setX:inputValue.x]; [self setY:inputValue.y]; } - (NSPoint) getPoint { NSPoint outPoint = {[self getX], [self getY]}; return outPoint; } - (void) setTouchingWithCoords:(bool)isTouching x:(float)xValue y:(float)yValue { // Check for state change and set the flag appropriately. if (isTouching != [self getTouching] || xValue != [self getX] || yValue != [self getY]) { isStateChanged = true; } else { isStateChanged = false; } [property setValue:[NSDate date] forKey:@"inputTime"]; [property setValue:[NSNumber numberWithBool:isTouching] forKey:@"touch"]; [property setValue:[NSNumber numberWithFloat:xValue] forKey:@"x"]; [property setValue:[NSNumber numberWithFloat:yValue] forKey:@"y"]; } - (void) setTouchingWithPoint:(bool)isTouching point:(NSPoint)inputPoint { [self setTouchingWithCoords:isTouching x:inputPoint.x y:inputPoint.y]; } @end @implementation CocoaDSMic - (id) init { [super init]; [property setValue:[NSNumber numberWithBool:false] forKey:@"press"]; return self; } - (void) dealloc { [super dealloc]; } - (void) setPressed:(bool)inputValue { [property setValue:[NSDate date] forKey:@"inputTime"]; [property setValue:[NSNumber numberWithBool:inputValue] forKey:@"press"]; } - (bool) getPressed { return [[property objectForKey:@"press"] boolValue]; } @end @implementation CocoaDSController - (id) init { ndsButton_Up = [[CocoaDSButton alloc] init]; ndsButton_Down = [[CocoaDSButton alloc] init]; ndsButton_Left = [[CocoaDSButton alloc] init]; ndsButton_Right = [[CocoaDSButton alloc] init]; ndsButton_A = [[CocoaDSButton alloc] init]; ndsButton_B = [[CocoaDSButton alloc] init]; ndsButton_X = [[CocoaDSButton alloc] init]; ndsButton_Y = [[CocoaDSButton alloc] init]; ndsButton_Select = [[CocoaDSButton alloc] init]; ndsButton_Start = [[CocoaDSButton alloc] init]; ndsButton_R = [[CocoaDSButton alloc] init]; ndsButton_L = [[CocoaDSButton alloc] init]; ndsButton_Debug = [[CocoaDSButton alloc] init]; ndsButton_Lid = [[CocoaDSButton alloc] init]; ndsTouch = [[CocoaDSTouch alloc] init]; ndsMic = [[CocoaDSMic alloc] init]; return self; } - (void) dealloc { [ndsButton_Up release]; [ndsButton_Down release]; [ndsButton_Left release]; [ndsButton_Right release]; [ndsButton_A release]; [ndsButton_B release]; [ndsButton_X release]; [ndsButton_Y release]; [ndsButton_Select release]; [ndsButton_Start release]; [ndsButton_R release]; [ndsButton_L release]; [ndsButton_Debug release]; [ndsButton_Lid release]; [ndsTouch release]; [ndsMic release]; [super dealloc]; } - (void) setupAllDSInputs { // Setup the DS pad. NDS_setPad([self getRightPressed], [self getLeftPressed], [self getDownPressed], [self getUpPressed], [self getSelectPressed], [self getStartPressed], [self getBPressed], [self getAPressed], [self getYPressed], [self getXPressed], [self getLPressed], [self getRPressed], [self getDebugPressed], [self getLidPressed]); // Setup the DS touch pad. if ([self getTouching]) { NDS_setTouchPos([self getTouchXCoord], [self getTouchYCoord]); } else { NDS_releaseTouch(); } // Setup the DS mic. NDS_setMic([self getMicPressed]); } - (void)touch:(NSPoint)point { [ndsTouch setTouchingWithPoint:true point:point]; } - (void)releaseTouch { [ndsTouch setTouching:false]; } - (bool) getTouching { return [ndsTouch getTouching]; } - (NSPoint) getTouchPoint { return [ndsTouch getPoint]; } - (float) getTouchXCoord { return [ndsTouch getX]; } - (float) getTouchYCoord { return [ndsTouch getY]; } - (void)pressStart { [ndsButton_Start setPressed:true]; } - (void)liftStart { [ndsButton_Start setPressed:false]; } - (bool) getStartPressed { return [ndsButton_Start getPressed]; } - (void)pressSelect { [ndsButton_Select setPressed:true]; } - (void)liftSelect { [ndsButton_Select setPressed:false]; } - (bool) getSelectPressed { return [ndsButton_Select getPressed]; } - (void)pressLeft { [ndsButton_Left setPressed:true]; } - (void)liftLeft { [ndsButton_Left setPressed:false]; } - (bool) getLeftPressed { return [ndsButton_Left getPressed]; } - (void)pressRight { [ndsButton_Right setPressed:true]; } - (void)liftRight { [ndsButton_Right setPressed:false]; } - (bool) getRightPressed { return [ndsButton_Right getPressed]; } - (void)pressUp { [ndsButton_Up setPressed:true]; } - (void)liftUp { [ndsButton_Up setPressed:false]; } - (bool) getUpPressed { return [ndsButton_Up getPressed]; } - (void)pressDown { [ndsButton_Down setPressed:true]; } - (void)liftDown { [ndsButton_Down setPressed:false]; } - (bool) getDownPressed { return [ndsButton_Down getPressed]; } - (void)pressA { [ndsButton_A setPressed:true]; } - (void)liftA { [ndsButton_A setPressed:false]; } - (bool) getAPressed { return [ndsButton_A getPressed]; } - (void)pressB { [ndsButton_B setPressed:true]; } - (void)liftB { [ndsButton_B setPressed:false]; } - (bool) getBPressed { return [ndsButton_B getPressed]; } - (void)pressX { [ndsButton_X setPressed:true]; } - (void)liftX { [ndsButton_X setPressed:false]; } - (bool) getXPressed { return [ndsButton_X getPressed]; } - (void)pressY { [ndsButton_Y setPressed:true]; } - (void)liftY { [ndsButton_Y setPressed:false]; } - (bool) getYPressed { return [ndsButton_Y getPressed]; } - (void)pressL { [ndsButton_L setPressed:true]; } - (void)liftL { [ndsButton_L setPressed:false]; } - (bool) getLPressed { return [ndsButton_L getPressed]; } - (void)pressR { [ndsButton_R setPressed:true]; } - (void)liftR { [ndsButton_R setPressed:false]; } - (bool) getRPressed { return [ndsButton_R getPressed]; } - (void) pressDebug { [ndsButton_Debug setPressed:true]; } - (void) liftDebug { [ndsButton_Debug setPressed:false]; } - (bool) getDebugPressed { return [ndsButton_Debug getPressed]; } - (void) pressLid { [ndsButton_Lid setPressed:true]; } - (void) liftLid { [ndsButton_Lid setPressed:false]; } - (bool) getLidPressed { return [ndsButton_Lid getPressed]; } - (void) pressMic { [ndsMic setPressed:true]; } - (void) liftMic { [ndsMic setPressed:false]; } - (bool) getMicPressed { return [ndsMic getPressed]; } @enddesmume-0.9.9/src/cocoa/DefaultKeyMappings.plist0000644000175000017500000002517112140261603022407 0ustar guillaumeguillaume CommandTagList Up Down Left Right A B X Y L R Start Select Touch Microphone Lid Debug Execute/Pause Reset Mute/Unmute Load State Slot Save State Slot Copy Screen Rotate Display Left Rotate Display Right Set Speed Enable/Disable Speed Limiter Enable/Disable Auto Frame Skip Enable/Disable Cheats Enable/Disable GPU State DefaultInputProfiles Name Default IsDefaultType Mappings Up deviceInfoSummary Keyboard: Up Arrow deviceCode NSEventKeyboard deviceName Keyboard elementCode 126 elementName Up Arrow Down deviceInfoSummary Keyboard: Down Arrow deviceCode NSEventKeyboard deviceName Keyboard elementCode 125 elementName Down Arrow Left deviceInfoSummary Keyboard: Left Arrow deviceCode NSEventKeyboard deviceName Keyboard elementCode 123 elementName Left Arrow Right deviceInfoSummary Keyboard: Right Arrow deviceCode NSEventKeyboard deviceName Keyboard elementCode 124 elementName Right Arrow A deviceInfoSummary Keyboard: X deviceCode NSEventKeyboard deviceName Keyboard elementCode 7 elementName X B deviceInfoSummary Keyboard: Z deviceCode NSEventKeyboard deviceName Keyboard elementCode 6 elementName Z X deviceInfoSummary Keyboard: S deviceCode NSEventKeyboard deviceName Keyboard elementCode 1 elementName S Y deviceInfoSummary Keyboard: A deviceCode NSEventKeyboard deviceName Keyboard elementCode 0 elementName A L deviceInfoSummary Keyboard: Q deviceCode NSEventKeyboard deviceName Keyboard elementCode 12 elementName Q R deviceInfoSummary Keyboard: W deviceCode NSEventKeyboard deviceName Keyboard elementCode 13 elementName W Start deviceInfoSummary Keyboard: Return deviceCode NSEventKeyboard deviceName Keyboard elementCode 36 elementName Return Select deviceInfoSummary Keyboard: Tab deviceCode NSEventKeyboard deviceName Keyboard elementCode 48 elementName Tab Touch deviceInfoSummary Mouse: Primary Button deviceCode NSEventMouse deviceName Mouse elementCode 0 elementName Primary Button inputSettingsSummary Use Device Coordinates useInputForIntCoord Microphone deviceInfoSummary Keyboard: ` (Accent) deviceCode NSEventKeyboard deviceName Keyboard elementCode 50 elementName ` (Accent) inputSettingsSummary Internal Noise Samples intValue1 1 floatValue0 250 Lid deviceInfoSummary Keyboard: Delete (Backspace) deviceCode NSEventKeyboard deviceName Keyboard elementCode 51 elementName Delete (Backspace) Debug HUD deviceInfoSummary Keyboard: H deviceCode NSEventKeyboard deviceName Keyboard elementCode 4 elementName H Execute/Pause deviceInfoSummary Keyboard: Forward Delete deviceCode NSEventKeyboard deviceName Keyboard elementCode 117 elementName Forward Delete Reset deviceInfoSummary Keyboard: Page Down deviceCode NSEventKeyboard deviceName Keyboard elementCode 121 elementName Page Down Mute/Unmute Load State Slot Save State Slot Copy Screen Rotate Display Left deviceInfoSummary Keyboard: [ deviceCode NSEventKeyboard deviceName Keyboard elementCode 33 elementName [ intValue0 -90 Rotate Display Right deviceInfoSummary Keyboard: ] deviceCode NSEventKeyboard deviceName Keyboard elementCode 30 elementName ] intValue0 90 Set Speed deviceInfoSummary Keyboard: - (Dash) deviceCode NSEventKeyboard deviceName Keyboard elementCode 27 elementName - (Dash) inputSettingsSummary 0.50x Speed floatValue0 0.5 deviceInfoSummary Keyboard: = deviceCode NSEventKeyboard deviceName Keyboard elementCode 24 elementName = inputSettingsSummary 2.00x Speed floatValue0 2 Enable/Disable Speed Limiter Enable/Disable Auto Frame Skip Enable/Disable Cheats Enable/Disable GPU State desmume-0.9.9/src/cocoa/DeSmuME.cbp0000644000175000017500000002112712140261603017520 0ustar guillaumeguillaume desmume-0.9.9/src/cocoa/makeapp.sh0000755000175000017500000000241512140261603017547 0ustar guillaumeguillaume#!/bin/bash #This script builds the application bundle so that DeSmuME can run when compiled from Code::Blocks # lipo build/codeblocks/DeSmuME.app/Contents/MacOS/DeSmuME_x86 DeSmuME.app/Contents/MacOS/DeSmuME_ppc -create -output DeSmuME.app/Contents/MacOS/DeSmuME rm -f build/codeblocks/DeSmuME.app/Contents/MacOS/DeSmuME_x86 rm -f build/codeblocks/DeSmuME.app/Contents/MacOS/DeSmuME_ppc # mkdir -p build/codeblocks/DeSmuME.app/Contents/Resources cp Info.plist build/codeblocks/DeSmuME.app/Contents/Info.plist cp PkgInfo build/codeblocks/DeSmuME.app/Contents/PkgInfo cp InfoPlist.strings build/codeblocks/DeSmuME.app/Contents/Resources/InfoPlist.strings cp DeSmuME.icns build/codeblocks/DeSmuME.app/Contents/Resources/DeSmuME.icns cp ../../COPYING build/codeblocks/DeSmuME.app/Contents/Resources/COPYING cp ../../README build/codeblocks/DeSmuME.app/Contents/Resources/README cp ../../README.MAC build/codeblocks/DeSmuME.app/Contents/Resources/README.MAC cp ../../AUTHORS build/codeblocks/DeSmuME.app/Contents/Resources/AUTHORS cp ../../README.TRANSLATION build/codeblocks/DeSmuME.app/Contents/Resources/README.TRANSLATION cp ../../ChangeLog build/codeblocks/DeSmuME.app/Contents/Resources/ChangeLog #Localizations cp -R translations/*.lproj build/codeblocks/DeSmuME.app/Contents/Resources/ desmume-0.9.9/src/cocoa/video_output_view_legacy.mm0000644000175000017500000004015412140261603023233 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "video_output_view_legacy.h" #import "cocoa_globals.h" #import "cocoa_util.h" #import "nds_control_legacy.h" #import "input_legacy.h" #import "cocoa_input_legacy.h" #import "preferences_legacy.h" #import "screen_state_legacy.h" #include "../GPU.h" #include "../NDSSystem.h" #undef BOOL #define HORIZONTAL(angle) ((angle) == -90 || (angle) == -270) #define VERTICAL(angle) ((angle) == 0 || (angle) == -180) #ifdef HAVE_OPENGL #import #endif #ifdef HAVE_OPENGL //screenstate extended to hold rotated copies @interface ScreenState(extended) - (void)rotateTo90; - (void)rotateTo0; @end #endif @implementation VideoOutputView - (id)initWithFrame:(NSRect)frame { //Initialize the view------------------------------------------------------------------ self = [super initWithFrame:frame]; if(self==nil) { [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create a view for video output", nil)]; return nil; } screen_buffer = nil; viewScale = 1.0; viewRotation = 0.0; displayMode = DS_DISPLAY_TYPE_COMBO; gpuStateFlags = GPUSTATE_MAIN_GPU_MASK | GPUSTATE_MAIN_BG0_MASK | GPUSTATE_MAIN_BG1_MASK | GPUSTATE_MAIN_BG2_MASK | GPUSTATE_MAIN_BG3_MASK | GPUSTATE_MAIN_OBJ_MASK | GPUSTATE_SUB_GPU_MASK | GPUSTATE_SUB_BG0_MASK | GPUSTATE_SUB_BG1_MASK | GPUSTATE_SUB_BG2_MASK | GPUSTATE_SUB_BG3_MASK | GPUSTATE_SUB_OBJ_MASK; //Initialize image view if for displaying the screen ---------------------------------------- #ifndef HAVE_OPENGL [self setImageFrameStyle: NSImageFrameNone]; [self setImageScaling:NSScaleToFit]; [self setEditable:NO]; [self setEnabled:NO]; //Initialize the OpenGL context for displaying the screen ----------------------------------- #else //Create the pixel format for our video output view NSOpenGLPixelFormatAttribute attrs[] = { //NSOpenGLPFAFullScreen, NSOpenGLPFAWindow, //need a renderer that can draw to a window //NSOpenGLPFARendererID, some_number, //this picks a particular renderer, for testing (NSOpenGLPixelFormatAttribute)0 }; NSOpenGLPixelFormat* pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; if(pixel_format == nil) { [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create OpenGL pixel format for video output", nil)]; context = nil; [self release]; return nil; } else { context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil]; [pixel_format release]; if(context == nil) { [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create OpenGL context for video output", nil)]; [self release]; return nil; } } //init gl for drawing [self setFrame:frame]; [self setBoundsRotation:0]; #endif //init screen buffer [self setScreenState:[ScreenState blackScreenState]]; cdsController = nil; return self; } - (void)dealloc { #ifdef HAVE_OPENGL [context release]; #endif [screen_buffer release]; [super dealloc]; } - (void)setScreenState:(ScreenState*)screen { if(screen_buffer == screen)return; if(screen == nil) { [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Recieved invalid screen update", nil)]; return; } [screen_buffer release]; //get rid of old screen data screen_buffer = screen; [screen_buffer retain]; //retain the new screendata since we will need it if we have to redraw before we recieve another update //rotate the screen #ifdef HAVE_OPENGL if(HORIZONTAL([self boundsRotation]))[screen_buffer rotateTo90]; #endif //redraw #ifdef HAVE_OPENGL [self display]; #else [self setImage:[screen_buffer image]]; #endif } - (const ScreenState*)screenState { #ifdef HAVE_OPENGL ScreenState *temp = [[ScreenState alloc] initWithScreenState:screen_buffer]; if(HORIZONTAL([self boundsRotation]))[temp rotateTo0]; return temp; #else return screen_buffer; #endif } - (float)screenWidth { return DS_SCREEN_WIDTH; } - (float)screenHeight { return DS_SCREEN_HEIGHT*2; } - (NSSize) normalSize { return [ScreenState size]; } - (void) setScale:(double)scalar { viewScale = scalar; } - (double) scale { return viewScale; } - (void) setRotation:(double)angleDegrees { viewRotation = angleDegrees; [self setBoundsRotation:-angleDegrees]; } - (double) rotation { return viewRotation; } - (void) setDisplayMode:(NSInteger)theMode { // Do nothing. This is a stub function only. } - (NSInteger) displayMode { return displayMode; } - (void) setGpuStateFlags:(UInt32)flags { gpuStateFlags = flags; if (flags & GPUSTATE_MAIN_GPU_MASK) { SetGPUDisplayState(DS_GPU_TYPE_MAIN, true); } else { SetGPUDisplayState(DS_GPU_TYPE_MAIN, false); } if (flags & GPUSTATE_MAIN_BG0_MASK) { SetGPULayerState(DS_GPU_TYPE_MAIN, 0, true); } else { SetGPULayerState(DS_GPU_TYPE_MAIN, 0, false); } if (flags & GPUSTATE_MAIN_BG1_MASK) { SetGPULayerState(DS_GPU_TYPE_MAIN, 1, true); } else { SetGPULayerState(DS_GPU_TYPE_MAIN, 1, false); } if (flags & GPUSTATE_MAIN_BG2_MASK) { SetGPULayerState(DS_GPU_TYPE_MAIN, 2, true); } else { SetGPULayerState(DS_GPU_TYPE_MAIN, 2, false); } if (flags & GPUSTATE_MAIN_BG3_MASK) { SetGPULayerState(DS_GPU_TYPE_MAIN, 3, true); } else { SetGPULayerState(DS_GPU_TYPE_MAIN, 3, false); } if (flags & GPUSTATE_MAIN_OBJ_MASK) { SetGPULayerState(DS_GPU_TYPE_MAIN, 4, true); } else { SetGPULayerState(DS_GPU_TYPE_MAIN, 4, false); } if (flags & GPUSTATE_SUB_GPU_MASK) { SetGPUDisplayState(DS_GPU_TYPE_SUB, true); } else { SetGPUDisplayState(DS_GPU_TYPE_SUB, false); } if (flags & GPUSTATE_SUB_BG0_MASK) { SetGPULayerState(DS_GPU_TYPE_SUB, 0, true); } else { SetGPULayerState(DS_GPU_TYPE_SUB, 0, false); } if (flags & GPUSTATE_SUB_BG1_MASK) { SetGPULayerState(DS_GPU_TYPE_SUB, 1, true); } else { SetGPULayerState(DS_GPU_TYPE_SUB, 1, false); } if (flags & GPUSTATE_SUB_BG2_MASK) { SetGPULayerState(DS_GPU_TYPE_SUB, 2, true); } else { SetGPULayerState(DS_GPU_TYPE_SUB, 2, false); } if (flags & GPUSTATE_SUB_BG3_MASK) { SetGPULayerState(DS_GPU_TYPE_SUB, 3, true); } else { SetGPULayerState(DS_GPU_TYPE_SUB, 3, false); } if (flags & GPUSTATE_SUB_OBJ_MASK) { SetGPULayerState(DS_GPU_TYPE_SUB, 4, true); } else { SetGPULayerState(DS_GPU_TYPE_SUB, 4, false); } } - (UInt32) gpuStateFlags { return gpuStateFlags; } - (void) setCdsController:(CocoaDSController *)theController { cdsController = theController; } - (CocoaDSController*) cdsController { return cdsController; } - (void) setViewToBlack { [self setScreenState:[ScreenState blackScreenState]]; } - (void) setViewToWhite { [self setScreenState:[ScreenState whiteScreenState]]; } - (BOOL) gpuStateByBit:(UInt32)stateBit { BOOL result = NO; UInt32 flags = [self gpuStateFlags]; if (flags & (1 << stateBit)) { result = YES; } return result; } #ifdef HAVE_OPENGL - (void)viewDidMoveToWindow {//if the view moves to another window we need to update the drawable object if(!context)return; //withdraw from recieving updates on previously window, if any [[NSNotificationCenter defaultCenter] removeObserver:context]; if([self window] != nil) { [context setView:self]; //udpate drawable if the window changed [[NSNotificationCenter defaultCenter] addObserver:context selector:@selector(update) name:@"NSWindowDidResizeNotification" object:[self window]]; } else [context clearDrawable]; } #endif #ifdef HAVE_OPENGL - (void)drawRect:(NSRect)bounds { if(screen_buffer == nil)return; //simply dont draw anything if we dont have a screen data object allocated [context makeCurrentContext]; if([self boundsRotation] == 0 || [self boundsRotation] == -180) { //here we send our corrected video buffer off to OpenGL where it gets pretty much //directly copied to the frame buffer (and converted to the devices color format) glDrawPixels(DS_SCREEN_WIDTH, DS_SCREEN_HEIGHT*2, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, (const GLvoid*)[screen_buffer colorData]); } else { glDrawPixels(DS_SCREEN_HEIGHT*2, DS_SCREEN_WIDTH, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, (const GLvoid*)[screen_buffer colorData]); } glFlush(); } #endif #ifdef HAVE_OPENGL - (void)setFrame:(NSRect)rect { [super setFrame:rect]; [context makeCurrentContext]; [context update]; //set the viewport (so the raster pos will be correct) glViewport(0, 0, rect.size.width, rect.size.height); float angle = [self boundsRotation]; if(angle == 0) { glRasterPos2f(-1, 1); glPixelZoom(((float)rect.size.width) / ((float)DS_SCREEN_WIDTH), -((float)rect.size.height) / ((float)DS_SCREEN_HEIGHT*2)); } else if(angle == -90) { glRasterPos2f(-1, 1); glPixelZoom(((float)rect.size.width) / ((float)DS_SCREEN_HEIGHT*2), -((float)rect.size.height) / ((float)DS_SCREEN_WIDTH)); } else if (angle == -180) { glRasterPos2f(1, -1); glPixelZoom(-((float)rect.size.width) / ((float)DS_SCREEN_WIDTH), ((float)rect.size.height) / ((float)DS_SCREEN_HEIGHT*2)); } else if (angle == -270) { glRasterPos2f(1, -1); glPixelZoom(-((float)rect.size.width) / ((float)DS_SCREEN_HEIGHT*2), ((float)rect.size.height) / ((float)DS_SCREEN_WIDTH)); } } #endif #ifdef HAVE_OPENGL - (BOOL)isOpaque { if(screen_buffer) return YES; //if there is no screen buffer, then we can't draw anything //so this view is completely transparent return NO; } #endif #ifdef HAVE_OPENGL - (void)setBoundsRotation:(CGFloat)angle { int angleInt = (int)angle; int old_angle = (int)[self boundsRotation]; [super setBoundsRotation:angleInt]; [context makeCurrentContext]; NSSize size = [self frame].size; if(angleInt == 0) { glRasterPos2f(-1, 1); glPixelZoom(((float)size.width) / ((float)DS_SCREEN_WIDTH), -((float)size.height) / ((float)DS_SCREEN_HEIGHT*2)); } else if(angleInt == -90) { glRasterPos2f(-1, 1); glPixelZoom(((float)size.width) / ((float)DS_SCREEN_HEIGHT*2), -((float)size.height) / ((float)DS_SCREEN_WIDTH)); } else if (angleInt == -180) { glRasterPos2f(1, -1); glPixelZoom(-((float)size.width) / ((float)DS_SCREEN_WIDTH), ((float)size.height) / ((float)DS_SCREEN_HEIGHT*2)); } else if (angleInt == -270) { glRasterPos2f(1, -1); glPixelZoom(-((float)size.width) / ((float)DS_SCREEN_HEIGHT*2), ((float)size.height) / ((float)DS_SCREEN_WIDTH)); } //Rotate the screen buffer if(HORIZONTAL(angleInt) && VERTICAL(old_angle)) [screen_buffer rotateTo90]; if(VERTICAL(angleInt) && HORIZONTAL(old_angle)) [screen_buffer rotateTo0]; } #endif - (NSPoint) convertPointToDS:(NSPoint)touchLoc { const CGFloat doubleDisplayHeight = (CGFloat)(GPU_DISPLAY_HEIGHT * 2); const NSInteger rotation = (NSInteger)[self boundsRotation]; const CGFloat frameWidth = [self frame].size.width; const CGFloat frameHeight = [self frame].size.height; if(rotation == 0) { // Scale touchLoc.x *= (CGFloat)GPU_DISPLAY_WIDTH / frameWidth; touchLoc.y *= doubleDisplayHeight / frameHeight; } else if(rotation == -90) { // Normalize touchLoc.x += frameHeight; // Scale touchLoc.x *= doubleDisplayHeight / frameWidth; touchLoc.y *= (CGFloat)GPU_DISPLAY_WIDTH / frameHeight; } else if(rotation == -180) { // Normalize touchLoc.x += frameWidth; touchLoc.y += frameHeight; // Scale touchLoc.x *= (CGFloat)GPU_DISPLAY_WIDTH / frameWidth; touchLoc.y *= doubleDisplayHeight / frameHeight; } else if(rotation == -270) { // Normalize touchLoc.y += frameWidth; // Scale touchLoc.x *= doubleDisplayHeight / frameWidth; touchLoc.y *= (CGFloat)GPU_DISPLAY_WIDTH / frameHeight; } // Normalize the y-coordinate to the DS. touchLoc.y = GPU_DISPLAY_HEIGHT - touchLoc.y; // Constrain the touch point to the DS dimensions. if (touchLoc.x < 0) { touchLoc.x = 0; } else if (touchLoc.x > (GPU_DISPLAY_WIDTH - 1)) { touchLoc.x = (GPU_DISPLAY_WIDTH - 1); } if (touchLoc.y < 0) { touchLoc.y = 0; } else if (touchLoc.y > (GPU_DISPLAY_HEIGHT - 1)) { touchLoc.y = (GPU_DISPLAY_HEIGHT - 1); } return touchLoc; } - (void)mouseDown:(NSEvent*)event { // Convert the clicked location from window coordinates, to view coordinates, // and finally to DS touchscreen coordinates. NSPoint touchLoc = [event locationInWindow]; touchLoc = [self convertPoint:touchLoc fromView:nil]; touchLoc = [self convertPointToDS:touchLoc]; if(touchLoc.x >= 0 && touchLoc.y >= 0) { [cdsController touch:touchLoc]; } } - (void)mouseDragged:(NSEvent*)event { [self mouseDown:event]; } - (void)mouseUp:(NSEvent*)event { [cdsController releaseTouch]; } @end #ifdef HAVE_OPENGL @implementation ScreenState (extended) - (void)rotateTo90 { int width = [ScreenState width], height = [ScreenState height]; unsigned char temp_buffer[width * height * DS_BPP]; memcpy(temp_buffer, color_data, width * height * DS_BPP); int x, y; for(x = 0; x< width; x++) for(y = 0; y < height; y++) { color_data[(x * height + (height - y - 1)) * 2] = temp_buffer[(y * width + x) * 2]; color_data[(x * height + (height - y - 1)) * 2 + 1] = temp_buffer[(y * width + x) * 2 + 1]; } } - (void)rotateTo0 { int height = [ScreenState width], width = [ScreenState height]; unsigned char temp_buffer[width * height * DS_BPP]; memcpy(temp_buffer, color_data, width * height * DS_BPP); int x, y; for(x = 0; x< width; x++) for(y = 0; y < height; y++) { color_data[((width - x - 1) * height + y) * 2] = temp_buffer[(y * width + x) * 2]; color_data[((width - x - 1) * height + y) * 2 + 1] = temp_buffer[(y * width + x) * 2 + 1]; } } @end #endif void SetGPULayerState(int displayType, unsigned int i, bool state) { GPU *theGpu = NULL; // Check bounds on the layer index. if(i > 4) { return; } switch (displayType) { case DS_GPU_TYPE_MAIN: theGpu = SubScreen.gpu; break; case DS_GPU_TYPE_SUB: theGpu = MainScreen.gpu; break; case DS_GPU_TYPE_COMBO: SetGPULayerState(DS_GPU_TYPE_SUB, i, state); // Recursive call theGpu = MainScreen.gpu; break; default: break; } if (theGpu != NULL) { if (state) { GPU_addBack(theGpu, i); } else { GPU_remove(theGpu, i); } } } bool GetGPULayerState(int displayType, unsigned int i) { bool result = false; // Check bounds on the layer index. if(i > 4) { return result; } switch (displayType) { case DS_GPU_TYPE_MAIN: if (SubScreen.gpu != nil) { result = CommonSettings.dispLayers[SubScreen.gpu->core][i]; } break; case DS_GPU_TYPE_SUB: if (MainScreen.gpu != nil) { result = CommonSettings.dispLayers[MainScreen.gpu->core][i]; } break; case DS_GPU_TYPE_COMBO: if (SubScreen.gpu != nil && MainScreen.gpu != nil) { result = (CommonSettings.dispLayers[SubScreen.gpu->core][i] && CommonSettings.dispLayers[MainScreen.gpu->core][i]); } break; default: break; } return result; } void SetGPUDisplayState(int displayType, bool state) { switch (displayType) { case DS_GPU_TYPE_MAIN: CommonSettings.showGpu.sub = state; break; case DS_GPU_TYPE_SUB: CommonSettings.showGpu.main = state; break; case DS_GPU_TYPE_COMBO: CommonSettings.showGpu.sub = state; CommonSettings.showGpu.main = state; break; default: break; } } bool GetGPUDisplayState(int displayType) { bool result = false; switch (displayType) { case DS_GPU_TYPE_MAIN: result = CommonSettings.showGpu.sub; break; case DS_GPU_TYPE_SUB: result = CommonSettings.showGpu.main; break; case DS_GPU_TYPE_COMBO: result = (CommonSettings.showGpu.sub && CommonSettings.showGpu.main); break; default: break; } return result; } desmume-0.9.9/src/cocoa/nds_control_legacy.mm0000644000175000017500000006644612140261603022013 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "nds_control_legacy.h" #import "cocoa_globals.h" #import "cocoa_file.h" #import "cocoa_util.h" #import "cocoa_input_legacy.h" #import "preferences_legacy.h" #import "screen_state_legacy.h" #include "sndOSX.h" #ifdef HAVE_OPENGL #import #import #endif //DeSmuME general includes #include "../NDSSystem.h" #include "../saves.h" #include "../render3D.h" #include "../GPU.h" #include "../OGLRender.h" #include "../rasterize.h" #undef BOOL //this bool controls whether we will use a timer to constantly check for screen updates //or if we can use inter-thread messaging introduced in leopard to update the screen (more efficient) bool timer_based; //accessed from other files volatile bool execute = true; GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize, &gpu3Dgl, NULL }; struct NDS_fw_config_data macDS_firmware; bool OSXOpenGLRendererInit() { return true; } @implementation NintendoDS - (id)init { // self = [super init]; if(self == nil)return nil; display_object = nil; error_object = nil; frame_skip = -1; //default to auto frame skip speedScalar = SPEED_SCALAR_NORMAL; calcTimeBudget = (NSTimeInterval)(DS_SECONDS_PER_FRAME / speedScalar); isSpeedLimitEnabled = YES; gui_thread = [NSThread currentThread]; loadedRomURL = nil; execution_lock = [[NSLock alloc] init]; sound_lock = [[NSLock alloc] init]; current_screen = nil; mutexCoreExecute = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(mutexCoreExecute, NULL); mutexAudioEmulateCore = mutexCoreExecute; #ifdef GDB_STUB arm9_gdb_port = 0; arm7_gdb_port = 0; arm9_gdb_stub = NULL; arm7_gdb_stub = NULL; struct armcpu_memory_iface *arm9_memio = &arm9_base_memory_iface; struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface; struct armcpu_ctrl_iface *arm9_ctrl_iface; struct armcpu_ctrl_iface *arm7_ctrl_iface; //create GDB stubs if required arm9_gdb_port = [defaults integerForKey:PREF_ARM9_GDB_PORT]; arm7_gdb_port = [defaults integerForKey:PREF_ARM7_GDB_PORT]; if(arm9_gdb_port > 0 && arm9_gdb_port < 65536) { NSLog(@"Using ARM9 GDB port %d", arm9_gdb_port); arm9_gdb_stub = createStub_gdb(arm9_gdb_port, &arm9_memio, &arm9_direct_memory_iface); if ( arm9_gdb_stub == NULL) { NSLog(@"Failed to create ARM9 gdbstub on port %d\n",arm9_gdb_port); exit(1); } } if (arm7_gdb_port > 0 && arm7_gdb_port < 65536) { NSLog(@"Using ARM7 GDB port %d", arm7_gdb_port); arm7_gdb_stub = createStub_gdb(arm7_gdb_port, &arm7_memio, &arm7_base_memory_iface); if ( arm7_gdb_stub == NULL) { NSLog(@"Failed to create ARM7 gdbstub on port %d\n",arm7_gdb_port); exit(1); } } #endif //check if we can send messages on other threads, which we will use for video update //this is for compatibility for tiger and earlier timer_based = ([NSObject instancesRespondToSelector:@selector(performSelector:onThread:withObject:waitUntilDone:)]==NO)?true:false; #ifdef HAVE_JIT CommonSettings.use_jit = false; #endif //Firmware setup #ifdef GDB_STUB NDS_Init(arm9_memio, &arm9_ctrl_iface, arm7_memio, &arm7_ctrl_iface); #else NDS_Init(); #endif //use default firmware NDS_FillDefaultFirmwareConfigData(&macDS_firmware); NDS_CreateDummyFirmware(&macDS_firmware); /* * Activate the GDB stubs * This has to come after the NDS_Init where the cpus are set up. */ #ifdef GDB_STUB if(arm9_gdb_port > 0 && arm9_gdb_port < 65536) { activateStub_gdb( arm9_gdb_stub, arm9_ctrl_iface); } if(arm7_gdb_port > 0 && arm7_gdb_port < 65536) { activateStub_gdb( arm7_gdb_stub, arm7_ctrl_iface); } #endif //3D Init #ifdef HAVE_OPENGL NSOpenGLContext *prev_context = [NSOpenGLContext currentContext]; [prev_context retain]; bool gl_ready = false; NSOpenGLPixelFormatAttribute attrs[] = { NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24, NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8, NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)24, NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)8, NSOpenGLPFAAccelerated, (NSOpenGLPixelFormatAttribute)0 }; if((pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]) == nil) { [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create OpenGL pixel format for 3D rendering", nil)]; context = nil; } else if((context = [[NSOpenGLContext alloc] initWithFormat:pixel_format shareContext:nil]) == nil) { [pixel_format release]; pixel_format = nil; [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Couldn't create OpenGL context for 3D rendering", nil)]; } else { [context makeCurrentContext]; //check extensions BOOL supports_pixel_buffers = NO; const char *extension_list = (const char*)glGetString(GL_EXTENSIONS); if(extension_list) { NSArray *extensions = [[NSString stringWithCString:extension_list encoding:NSASCIIStringEncoding] componentsSeparatedByString:@" "]; supports_pixel_buffers = [extensions containsObject:@"GL_APPLE_pixel_buffer"]; } //attempt to use a pixel-buffer for hopefully hardware accelerated offscreen drawing if(supports_pixel_buffers == YES) { NSOpenGLPixelBuffer *pixel_buffer = [[NSOpenGLPixelBuffer alloc] initWithTextureTarget:GL_TEXTURE_2D textureInternalFormat:GL_RGBA textureMaxMipMapLevel:0 pixelsWide:DS_SCREEN_WIDTH pixelsHigh:DS_SCREEN_HEIGHT*2]; if(pixel_buffer == nil) { GLenum error = glGetError(); NSString *errorStr = [NSString stringWithFormat:@"Error setting up rgba pixel buffer for 3D rendering (glerror: %d)", error]; [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(errorStr, nil)]; } else { [context setPixelBuffer:pixel_buffer cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:0]; [pixel_buffer release]; gl_ready = true; } } //if pixel buffers didn't work out, try simple offscreen renderings (probably software accelerated) if(!gl_ready) { [context setOffScreen:(void*)&gpu_buff width:DS_SCREEN_WIDTH height:DS_SCREEN_HEIGHT rowbytes:DS_SCREEN_WIDTH*5]; gl_ready = true; } } if(context) { [context makeCurrentContext]; oglrender_init = &OSXOpenGLRendererInit; NDS_3D_SetDriver(CORE3DLIST_OPENGL); //NDS_3D_SetDriver(CORE3DLIST_SWRASTERIZE); if(!gpu3D->NDS_3D_Init()) [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Unable to initialize OpenGL components", nil)]; } if(prev_context != nil) //make sure the old context is restored, and make sure our new context is not set in this thread (since the other thread will need it) { [prev_context makeCurrentContext]; [prev_context release]; } else [NSOpenGLContext clearCurrentContext]; #endif //Sound Init muted = false; volume = 100.0; #ifdef DESMUME_COCOA if(SPU_ChangeSoundCore(SNDCORE_OSX, 735 * 4) != 0) [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Unable to initialize sound core", nil)]; else SPU_SetVolume((int)volume); #endif //Breakoff a new thread that will execute the ds stuff finish = false; finished = false; run = false; paused = false; prevCoreState = CORESTATE_PAUSE; [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:context]; //Start a timer to update the screen if(timer_based) { video_update_lock = [[NSLock alloc] init]; [NSTimer scheduledTimerWithTimeInterval:DS_SECONDS_PER_FRAME target:self selector:@selector(videoUpdateTimerHelper) userInfo:nil repeats:YES]; } cdsController = nil; return self; } - (void)setVideoUpdateCallback:(SEL)callback withObject:(id)object { //release object we were previously using [display_object release]; //get and retain the new one display_object = object; [display_object retain]; //set the selector display_func = callback; } - (void)setErrorCallback:(SEL)callback withObject:(id)object; { [error_object release]; error_object = object; [error_object retain]; error_func = callback; } - (void)dealloc { //end the other thread finish = true; while(!finished){} [cdsController release]; [display_object release]; [error_object release]; [context release]; [pixel_format release]; [loadedRomURL release]; [sound_lock release]; [execution_lock release]; pthread_mutex_destroy(mutexCoreExecute); free(mutexCoreExecute); NDS_DeInit(); #ifdef GDB_STUB if(arm9_gdb_port > 0 && arm9_gdb_port < 65536) { destroyStub_gdb(arm9_gdb_stub); } if(arm7_gdb_port > 0 && arm7_gdb_port < 65536) { destroyStub_gdb(arm7_gdb_stub); } #endif [super dealloc]; } - (void) setMasterExecute:(BOOL)theState { //OSSpinLockLock(&spinlockMasterExecute); if (theState) { execute = true; } else { execute = false; } //OSSpinLockUnlock(&spinlockMasterExecute); } - (BOOL) masterExecute { BOOL theState = NO; //OSSpinLockLock(&spinlockMasterExecute); if (execute) { theState = YES; } //OSSpinLockUnlock(&spinlockMasterExecute); return theState; } - (void) setCdsController:(CocoaDSController *)theController { cdsController = theController; } - (CocoaDSController*) cdsController { return cdsController; } - (void)setPlayerName:(NSString*)player_name { //first we convert to UTF-16 which the DS uses to store the nickname NSData *string_chars = [player_name dataUsingEncoding:NSUnicodeStringEncoding]; //copy the bytes macDS_firmware.nickname_len = MIN([string_chars length],MAX_FW_NICKNAME_LENGTH); [string_chars getBytes:macDS_firmware.nickname length:macDS_firmware.nickname_len]; macDS_firmware.nickname[macDS_firmware.nickname_len / 2] = 0; //set the firmware //NDS_CreateDummyFirmware(&macDS_firmware); } - (BOOL) loadRom:(NSURL *)romURL { BOOL result = NO; //pause if not already paused BOOL was_paused = [self paused]; [self pause]; //load the rom result = [CocoaDSFile loadRom:romURL]; if(!result) { //if it didn't work give an error and dont unpause [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:NSLocalizedString(@"Could not open file", nil)]; //continue playing if load didn't work if(was_paused == NO)[self execute]; return result; } /* //clear screen data if(current_screen != nil) { [current_screen release]; current_screen = nil; } */ // Retain a copy of the URL of the currently loaded ROM, since we'll be // using it later. loadedRomURL = romURL; [loadedRomURL retain]; //this is incase emulation stopped from the //emulation core somehow execute = true; result = YES; return result; } - (BOOL) isRomLoaded { return (loadedRomURL==nil)?NO:YES; } - (void)closeROM { [self pause]; /* if(current_screen != nil) { [current_screen release]; current_screen = nil; } */ NDS_FreeROM(); [loadedRomURL release]; loadedRomURL = nil; } - (NSImage *) romIcon { NDS_header *header = NDS_getROMHeader(); if(!header)return nil; if(header->IconOff == 0)return nil; NSImage *result = [[NSImage alloc] initWithSize:NSMakeSize(32, 32)]; if(result == nil)return nil; NSBitmapImageRep *image = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:32 pixelsHigh:32 bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:32 * 4 bitsPerPixel:32]; [image setAlpha:YES]; if(image == nil) { [result release]; return nil; } //load the palette //the pallete contains 16 entries, 2 bytes each //the first entry represents alpha so the value is ignored u8 palette[16*4]; //16 entries at 32 bit (we will convert) int x; for(x = 0; x < 16; x++) { u16 temp = T1ReadWord(MMU.CART_ROM, header->IconOff + 0x220 + x*2); palette[x*4+0] = (temp & 0x001F) << 3; //r palette[x*4+1] = (temp & 0x03E0) >> 5 << 3; //g palette[x*4+2] = (temp & 0x7C00) >> 10 << 3; //b palette[x*4+3] = x==0?0:255; //alpha: color 0 is always transparent } //load the image //the image is 32x32 pixels, each 4bit (correspoding to the pallete) //it's stored just before the pallete u8 *bitmap_data = [image bitmapData]; int y, inner_y, inner_x, offset = 0; for(y = 0; y < 4; y++) //the image is split into 16 squares (4 on each axis) for(x = 0; x < 4; x++) for(inner_y = 0; inner_y < 8; inner_y++) //each square is 8x8 for(inner_x = 0; inner_x < 8; inner_x+=2) //increment by 2 since each byte is two 4bit colors { //grab the color indicies of the next 2 pixels u8 color = T1ReadByte(MMU.CART_ROM, header->IconOff + 0x20 + offset++); //set the first pixel color *(bitmap_data+( (y*8+inner_y)*32*4+(x*8+inner_x+1)*4+0 )) = palette[(color>>4) * 4 + 0]; //r *(bitmap_data+( (y*8+inner_y)*32*4+(x*8+inner_x+1)*4+1 )) = palette[(color>>4) * 4 + 1]; //g *(bitmap_data+( (y*8+inner_y)*32*4+(x*8+inner_x+1)*4+2 )) = palette[(color>>4) * 4 + 2]; //b *(bitmap_data+( (y*8+inner_y)*32*4+(x*8+inner_x+1)*4+3 )) = palette[(color>>4) * 4 + 3]; //a //set the next pixel color *(bitmap_data+( (y*8+inner_y)*32*4+(x*8+inner_x+0)*4+0 )) = palette[(color&0x0F) * 4 + 0]; //r *(bitmap_data+( (y*8+inner_y)*32*4+(x*8+inner_x+0)*4+1 )) = palette[(color&0x0F) * 4 + 1]; //g *(bitmap_data+( (y*8+inner_y)*32*4+(x*8+inner_x+0)*4+2 )) = palette[(color&0x0F) * 4 + 2]; //b *(bitmap_data+( (y*8+inner_y)*32*4+(x*8+inner_x+0)*4+3 )) = palette[(color&0x0F) * 4 + 3]; //a } [result addRepresentation:image]; [image release]; [result autorelease]; return result; } - (NSString *) romFileName { return [[loadedRomURL path] lastPathComponent]; } - (NSString *) romTitle { return [[NSString alloc] initWithCString:(NDS_getROMHeader()->gameTile) encoding:NSUTF8StringEncoding]; } - (NSInteger) romMaker { return NDS_getROMHeader()->makerCode; } - (NSInteger) romSize { return NDS_getROMHeader()->cardSize; } - (NSInteger) romArm9Size { return NDS_getROMHeader()->ARM9binSize; } - (NSInteger) romArm7Size { return NDS_getROMHeader()->ARM7binSize; } - (NSInteger) romDataSize { return NDS_getROMHeader()->ARM7binSize + NDS_getROMHeader()->ARM7src; } - (NSMutableDictionary *) romInfoBindings { if (![self isRomLoaded]) { return [NintendoDS romNotLoadedBindings]; } return [NSMutableDictionary dictionaryWithObjectsAndKeys: [self romFileName], @"romFileName", [self romTitle], @"romTitle", [NSString stringWithFormat:@"%04X", [self romMaker]], @"makerCode", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [self romSize]], @"romSize", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [self romArm9Size]], @"arm9BinarySize", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [self romArm7Size]], @"arm7BinarySize", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [self romDataSize]], @"dataSize", [self romIcon], @"iconImage", nil]; } + (NSMutableDictionary *) romNotLoadedBindings { NSImage *iconImage = [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AppIcon_DeSmuME" ofType:@"icns"]] autorelease]; return [NSMutableDictionary dictionaryWithObjectsAndKeys: NSSTRING_STATUS_NO_ROM_LOADED, @"romFileName", NSSTRING_STATUS_NO_ROM_LOADED, @"romTitle", NSSTRING_STATUS_NO_ROM_LOADED, @"makerCode", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"romSize", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"arm9BinarySize", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"arm7BinarySize", [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"dataSize", iconImage, @"iconImage", nil]; } - (NSURL *) loadedRomURL { return loadedRomURL; } - (void) setCoreState:(NSInteger)coreState { if ([self paused]) { prevCoreState = CORESTATE_PAUSE; } else { prevCoreState = CORESTATE_EXECUTE; } switch (coreState) { case CORESTATE_EXECUTE: [self execute]; break; case CORESTATE_PAUSE: [self pause]; break; default: break; } } - (void) restoreCoreState { switch (prevCoreState) { case CORESTATE_EXECUTE: [self execute]; break; case CORESTATE_PAUSE: [self pause]; break; default: break; } } - (BOOL)executing { return run; } - (void)execute { run = TRUE; } - (BOOL)paused { return !run; } - (void)pause { run = false; //wait for the other thread to stop execution while (!paused) {} } - (void)reset { //note that the execution_lock method would probably be a little better //but the NDS_Reset() function sets execution to false for some reason //we treat execution == false as an emulation error //pausing allows the other thread to not think theres an emulation error //[execution_lock lock]; bool old_run = run; if(old_run) { run = false; while(!paused){} } pthread_mutex_lock(mutexCoreExecute); NDS_Reset(); pthread_mutex_unlock(mutexCoreExecute); //[execution_lock unlock]; run = old_run; //if there was a previous emulation error, clear it, since we reset execute = true; } - (void) setSpeedScalar:(CGFloat)scalar { speedScalar = scalar; [self updateConfig]; } - (CGFloat) speedScalar { return speedScalar; } - (void) setIsSpeedLimitEnabled:(BOOL)theState { isSpeedLimitEnabled = theState; [self updateConfig]; } - (BOOL) isSpeedLimitEnabled { return isSpeedLimitEnabled; } - (void)setSaveType:(int)savetype { if(savetype < 0 || savetype > 6) savetype = 0; // Set the savetype backup_setManualBackupType(savetype); } - (int)saveType { return CommonSettings.manualBackupType; } - (BOOL) isSubScreenLayerDisplayed:(int)i { GPU *theGPU = SubScreen.gpu; BOOL isLayerDisplayed = NO; // Check bounds on the layer index. if(i < 0 || i > 4) { return isLayerDisplayed; } // Check if theGPU exists. if(theGPU == nil) { return isLayerDisplayed; } // CommonSettings.dispLayers is returned as a bool, so we convert // to BOOL here. if (CommonSettings.dispLayers[theGPU->core][i]) { isLayerDisplayed = YES; } return isLayerDisplayed; } - (BOOL) isMainScreenLayerDisplayed:(int)i { GPU *theGPU = MainScreen.gpu; BOOL isLayerDisplayed = NO; // Check bounds on the layer index. if(i < 0 || i > 4) { return isLayerDisplayed; } // Check if theGPU exists. if(theGPU == nil) { return isLayerDisplayed; } // CommonSettings.dispLayers is returned as a bool, so we convert // to BOOL here. if (CommonSettings.dispLayers[theGPU->core][i]) { isLayerDisplayed = YES; } return isLayerDisplayed; } - (void) toggleSubScreenLayer:(int)i { GPU *theGPU = SubScreen.gpu; BOOL isLayerDisplayed; // Check bounds on the layer index. if(i < 0 || i > 4) { return; } // Check if theGPU exists. if(theGPU == nil) { return; } isLayerDisplayed = [self isSubScreenLayerDisplayed:i]; if(isLayerDisplayed == YES) { GPU_remove(theGPU, i); } else { GPU_addBack(theGPU, i); } } - (void) toggleMainScreenLayer:(int)i { GPU *theGPU = MainScreen.gpu; BOOL isLayerDisplayed; // Check bounds on the layer index. if(i < 0 || i > 4) { return; } // Check if theGPU exists. if(theGPU == nil) { return; } isLayerDisplayed = [self isMainScreenLayerDisplayed:i]; if(isLayerDisplayed == YES) { GPU_remove(theGPU, i); } else { GPU_addBack(theGPU, i); } } - (BOOL)hasSound { SoundInterface_struct *core = SPU_SoundCore(); if(!core)return NO; return core != &SNDDummy; } - (void) setVolume:(float)vol { if (vol < 0.0f) { vol = 0.0f; } else if (vol > MAX_VOLUME) { vol = MAX_VOLUME; } volume = vol; [sound_lock lock]; SPU_SetVolume((int)vol); [sound_lock unlock]; } - (float) volume { if([self hasSound]) return volume; return -1; } - (void)enableMute { [sound_lock lock]; SPU_SetVolume(0); [sound_lock unlock]; muted = true; } - (void)disableMute { [sound_lock lock]; SPU_SetVolume((int)volume); [sound_lock unlock]; muted = false; } - (void)toggleMute { if(muted) [self disableMute]; else [self enableMute]; } - (BOOL)muted { return muted?YES:NO; } - (void) copyToPasteboard { if (current_screen == nil) { return; } NSImage *screenshot = [[current_screen image] autorelease]; if (screenshot == nil) { return; } NSPasteboard *pboard = [NSPasteboard generalPasteboard]; [pboard declareTypes:[NSArray arrayWithObjects:NSTIFFPboardType, nil] owner:self]; [pboard setData:[screenshot TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1.0f] forType:NSTIFFPboardType]; } - (NSBitmapImageRep *) bitmapImageRep { NSBitmapImageRep *currentScreenImageRep = nil; if (current_screen == nil) { return currentScreenImageRep; } currentScreenImageRep = [current_screen imageRep]; return currentScreenImageRep; } //---------------------------- //Here's the run function which continuously executes in a separate thread //it's controlled by the run and finish varaiables of the instance //and its status can be determined with the paused and finished variables - (void)videoUpdateHelper:(ScreenState*)screen_data { //we check if the emulation is running before we update the screen //this is because the emulation could have been paused or ended //with a video update call still queued on this thread //this also means it may skip a frame or more upon resuming emulation //the ideal thing would be to find a way to have the pause function //check what video updates are queued on this run loop and perform them if(run) [display_object performSelector:display_func withObject:screen_data]; } - (void)videoUpdateTimerHelper { if(!run || current_screen == nil) { return; } [display_object performSelector:display_func withObject:current_screen]; } - (void)run:(NSOpenGLContext*)gl_context { NSAutoreleasePool *autorelease = [[NSAutoreleasePool alloc] init]; NSDate *loopStartDate; NSDate *emulation_start_date; NSDate *frame_start_date; NSTimeInterval timeBudget; NSTimeInterval timePad; #ifdef HAVE_OPENGL [gl_context retain]; [gl_context makeCurrentContext]; CGLLockContext((CGLContextObj)[gl_context CGLContextObj]); #endif //program main loop while(!finish) { if(!run) { paused = true; } //run the emulator while(run && execute) //run controls when the emulator runs, execute prevents it from continuing execution if there are errors { /* Get the start time for the loop. This will be needed when it comes time to determine the total time spent, and then calculating what timePad should be. */ loopStartDate = [NSDate date]; // Force paused state. paused = false; /* Set up our time budget, which is equal to calcTimeBudget, which is the relationship between DS_SECONDS_PER_FRAME and speed_limit. timeBudget represents how much time we have to spend doing the various functions of making a new frame. The major parts we spend our time on is: - Emulation - Drawing the frame - Pad time The priorities for spending time are the same as the order listed above. timePad represents any excess time that can be released back to the OS. */ timeBudget = calcTimeBudget; timePad = timeBudget; /* Set up the inputs for the emulator. The time taken up by this step should be insignificant, so we won't bother calculating this in the time budget. */ [cdsController setupAllDSInputs]; NDS_beginProcessingInput(); /* Shouldn't need to do any special processing steps in between. We'll just jump directly to ending the input processing. */ NDS_endProcessingInput(); emulation_start_date = [NSDate date]; [self emulateDS]; /* Subtract the emulation time from our time budget. For some reason, [NSDate timeIntervalSinceNow] returns a negative interval if the receiver is an earlier date than now. So to subtract from timeBudget, we add the interval. Go figure. */ timeBudget += [emulation_start_date timeIntervalSinceNow]; /* If we have time left in our time budget, draw the frame. But if we don't have time left in our time budget, then we need to make a decision on whether to simply drop the frame, or just draw the frame. Currently, the decision is to just draw everything because frame drawing time is very negligible. Dropping a whole bunch of frames will NOT yield any significant speed increase. */ if(timeBudget > 0) { frame_start_date = [NSDate date]; [self drawFrame]; // Subtract the drawing time from our time budget. timeBudget += [frame_start_date timeIntervalSinceNow]; } else { // Don't even bother calculating timeBudget. We've already // gone over at this point. [self drawFrame]; } // If there is any time left in the loop, go ahead and pad it. timePad += [loopStartDate timeIntervalSinceNow]; if(timePad > 0) { [self padTime:timePad]; } } //when emulation is paused, return CPU time to the OS [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; } #ifdef HAVE_OPENGL CGLUnlockContext((CGLContextObj)[gl_context CGLContextObj]); [gl_context release]; #endif [autorelease release]; paused = true; finished = true; } - (void) emulateDS { [execution_lock lock]; pthread_mutex_lock(mutexCoreExecute); NDS_exec(); pthread_mutex_unlock(mutexCoreExecute); [sound_lock lock]; SPU_Emulate_user(); [sound_lock unlock]; [execution_lock unlock]; } - (void) drawFrame { ScreenState *new_screen_data = [[ScreenState alloc] initWithColorData:GPU_screen]; if(timer_based) { //for tiger compatibility [video_update_lock lock]; ScreenState *oldScreenData = current_screen; current_screen = new_screen_data; [oldScreenData release]; [video_update_lock unlock]; } else { //for leopard and later ScreenState *oldScreenData = current_screen; current_screen = new_screen_data; //this will generate a warning when compiling on tiger or earlier, but it should //be ok since the purpose of the if statement is to check if this will work [self performSelector:@selector(videoUpdateHelper:) onThread:gui_thread withObject:current_screen waitUntilDone:NO]; [oldScreenData release]; //performSelector will auto retain the screen data while the other thread displays } } - (void) padTime:(NSTimeInterval)timePad { #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 // Code for Mac OS X 10.4 and earlier [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:timePad]]; #else // Code for Mac OS X 10.5 and later [NSThread sleepForTimeInterval:timePad]; #endif } - (void) updateConfig { CGFloat newTimeBudget; // Update speed limit if(!isSpeedLimitEnabled) { newTimeBudget = 0.0; } else { CGFloat theSpeed = speedScalar; if(theSpeed <= SPEED_SCALAR_MIN) { theSpeed = SPEED_SCALAR_MIN; } newTimeBudget = (NSTimeInterval)(DS_SECONDS_PER_FRAME / theSpeed); } calcTimeBudget = newTimeBudget; } @end desmume-0.9.9/src/cocoa/cocoa_rom.h0000644000175000017500000000376212140261603017712 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2011-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface CocoaDSRom : NSObject #else @interface CocoaDSRom : NSObject #endif { NSMutableDictionary *header; NSMutableDictionary *bindings; NSURL *fileURL; NSInteger saveType; NSMutableDictionary *xmlCurrentRom; NSMutableArray *xmlElementStack; NSMutableArray *xmlCharacterStack; } @property (readonly) NSMutableDictionary *header; @property (readonly) NSMutableDictionary *bindings; @property (readonly) NSURL *fileURL; @property (readonly) BOOL isDataLoaded; @property (assign) NSInteger saveType; - (id) initWithURL:(NSURL *)theURL; - (id) initWithURL:(NSURL *)theURL saveType:(NSInteger)saveTypeID; - (void) initHeader; - (BOOL) loadData:(NSURL *)theURL; - (void) loadDataOnThread:(id)object; - (NSString *) title; - (NSString *) code; - (NSString *) banner:(const UInt16 *)UTF16TextBuffer; - (NSString *) internalName; - (NSString *) serial; - (NSImage *) icon; - (void) handleAdvansceneDatabaseInfo; + (void) changeRomSaveType:(NSInteger)saveTypeID; + (NSInteger) saveTypeByString:(NSString *)saveTypeString; + (NSMutableDictionary *) romNotLoadedBindings; @end #ifdef __cplusplus extern "C" { #endif void RomIconToRGBA8888(uint32_t *bitmapData); #ifdef __cplusplus } #endif desmume-0.9.9/src/cocoa/audiosamplegenerator.h0000644000175000017500000000505212140261603022155 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _AUDIO_SAMPLE_GENERATOR_ #define _AUDIO_SAMPLE_GENERATOR_ #include #include "types.h" #define MIC_NULL_SAMPLE_VALUE 64 class AudioGenerator { public: AudioGenerator() {}; virtual ~AudioGenerator() {}; virtual size_t generateSampleBlock(size_t sampleCount, u8 *outBuffer) { if (outBuffer == NULL) { return 0; } for (u8 *i = outBuffer; i < outBuffer + sampleCount; i++) { *i = this->generateSample(); } return sampleCount; } virtual u8 generateSample() { return MIC_NULL_SAMPLE_VALUE; } }; class NullGenerator : public AudioGenerator {}; class AudioSampleBlockGenerator : public AudioGenerator { protected: u8 *_buffer; size_t _sampleCount; size_t _samplePosition; public: AudioSampleBlockGenerator() : _buffer(NULL) , _sampleCount(0) , _samplePosition(0) {}; AudioSampleBlockGenerator(const u8 *audioBuffer, const size_t sampleCount); ~AudioSampleBlockGenerator(); u8* allocate(const size_t sampleCount); u8* getBuffer() const; size_t getSampleCount() const; size_t getSamplePosition() const; void setSamplePosition(size_t thePosition); virtual u8 generateSample(); }; class InternalNoiseGenerator : public AudioSampleBlockGenerator { public: InternalNoiseGenerator(); }; class WhiteNoiseGenerator : public AudioGenerator { public: virtual u8 generateSample(); }; class SineWaveGenerator : public AudioGenerator { protected: double _frequency; double _sampleRate; double _cyclePosition; public: SineWaveGenerator() : _frequency(250.0) , _sampleRate(44100.0) , _cyclePosition(0.0) {}; SineWaveGenerator(const double freq, const double sampleRate); double getFrequency() const; void setFrequency(double freq); double getSampleRate() const; void setSampleRate(double sampleRate); double getCyclePosition() const; void setCyclePosition(double thePosition); virtual u8 generateSample(); }; #endif // _AUDIO_SAMPLE_GENERATOR_ desmume-0.9.9/src/cocoa/AppIcon_ROMSave.icns0000644000175000017500000023573612140261603021353 0ustar guillaumeguillaumeicns;is32E !!9^eC'|ˤ0)}ʼ5&y3$x5"wz4!vs5uѿl5te4t^4qͼV3uķ Q2 \'(1(Wzqvtrd_g^gI/=,&'&& +0-1.76!"!9]:dC'|Ѫ0+tխ7-T\;+VZ<*TT;(SZzwP;'R{rnL:%QxqhcG9#Ryrjb\C9$Myne_VO>7!V|unoj`[T<6!X~(1)Y|swvse`h_iJ/=+%& +/-1.76f!# 9\bC'|ٳ0-g̤o:8$ F6%!F4" E3! D2  C/A.  ?-=+&   ;"Sº̻{)0*\vzxugbi`jJ/<*$%*.,0-66s8mk>[TWVVVWWWWXU[Dil32 #"%&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?8cropqmjpllklopszjmvroql?>J J=ZUw8W H7\wysv}mz3U G7[ҞaGVz4U G6[;|4V F7V|4V D6Uy5U C5Uv6U B3Ts6T B3Tp6T A2Sl6S?0Sj5Q>/Rf6Q>/Rƺc6P=.R¿`5O<-Q»]5N;,PZ4L:+PW5L:*PS4K9*PſQ4I9*O»L3H8)PK3G8)Lü~vrggD3F9'P žW.F5.:蜽۰x#I 45$Kꩻ٬u!H8/9";ZSVUVWW\jbej_figie54? 5/27.%(&''&$" %"!##%86?);/026,4;8:;9:; 53;-8875753456:99"%&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?7cropqmjplkklopszjmvroqk?>J J=ZSw8W H7\xxrunz3U G7[աaETz4U G6Y:x5U C7>z}J}vxI{xrtGJ J=ZSw8W H7\zvpupy3U G7[ڦ`AQz4V F7V9Ҳt6U @C& +9GPhY&}aUQ<*!FN ?B"GN >A#  GM =?" GM ! EL :=  EK 9;  EJ 9;  DJ 8: CI 79 BH 68 AG 57 AF 57 @F 46 >E 46 =D 34   G ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9bՃ 4Of%6:IHGK@WP AF@@ABAE?9a?Ȋ /7%6;IIGHFK@WP @F@A@A@E?9bʂ;h[8!Q!c!ʔ&5;IHGHFI@WO @FA @>D>:a!QeRQRYeZNSlݭ%6;IHGHGK@WO @F@BAA@D=:a'5;IHGHGK@VP @F@ ?D=:a&6;IHGGFJ@WP ?FAA@A@D=:` 90=HHGK@VP >EABBA?E=9Z ;/=HHGJ@WP >E>@@A?D=7N80?@A>C<7O 80=HHGK@WP >D?==?@D<6O80>? =B;7O70@>B;6O70=<==B;7O60?>><@93O&40:HHGGEI?VP 8A<;:;;@93O40:GGFHFJ?WP 9A<=<;9?93Oր30:FGDFGI?WP8@;< :?82O 30:GGFECI?VP7A:9;<;@82O 30:GFDH>UQ 7@;;9?82O+319GGEEDG>UP 7?9<<;9>82O"209FEEH>UP 8?99;<;>71O.209GEEFEI>UO6?:9899>71O&ÿ208GFCG>UM5?9:9:7=72Ò118GFEECF=UO6>89:;9=61O1¿118GFEEDG=TO7>788:9=61O2¿107FFDDCG=TN7>89786=52O %107FFDEDG=TN6>89897<50O5107FFEFCG=TN5>8 98<50P؀ 007GFDECG=TN6>8 97<50O׀006FEBG=SN4>99898<51O8/06EEDFEH=TN4=89::7<50O9/16EDBDCG=TN4=767:7<5/P.16EEDCAF=SN4=87686<5/P/05EDBF@@C9QJ0:5454481,PO)11B@?>?C8QJ0:45482+PP*10A@AA>A8PJ/:5443482+PQ)10@?>@?C8OI.95 382+PR¿)10A?>>=B8PI/93455482+P 0)0/A@??<@7OJ093325482+PU¿(1/@??@>A7NH/93432171+PV(1/@><>>B7NI0834 371*P׀A'1/@?==;?7OH083424371*P׀8}}'1.@>A6MH/83255371*PZ¿}y{'1/@=;<<@6MI.73213371*P€.~|zvy'1-@=:=5MH073 1071*P]}{yywx&1-@=<=><:=<;;:?5LG 173260( PY~||ywusrponligeebf%/,><:=4KG 173212160(P '$#1+=<<=<=4KG 063323260) S$1,=;9;;?4KG 253232260( O ),=<;:8<4JG 253233260) T(,;<9=3IF 253 252#"# xNUR[eVx]]e),;;8;:>3IF 05332 469)<&~,.d_yqYaޞwչUc(+<;998;3IF 46323225458 ,:4n}(+<;::9;2IF,67334328+76 1<i?%&\v+]Yzx 7[C0B$ed(*:99<:<2HF.$2423256.56 .:pq5D1un>0RAhCO?B=~)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtst sttvstwttwx wuvtxuuvttuxwvxwtvxuuwwxu}L97#>8898;2IG!E/4)8033223166,9;! ;D,(@7997;0DD)E)6&91322323167'.2987898799:99:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9b׃ 4Of%6:IHGK@WP AF@@ABAE?9a?Ɋ /7&5;IIGHFK@WP @F@A@A@E?9b˂;h[8!Q!c!ʔ&5;IHGHFI@WO @FA @>D>:a!ᄒ¶SfSQRYeYNRkݬ&5;IHGHGK@WO @F@BAA@D=:a'5;IHGHGK@VP @F@ ?D=9a '5;IHGGFJ@WP ?FAA@A@D>8O 㫭ĸ-3;IHGK@VP/ >EABBA?D>6?Ր*'4;IHGJ@WP >E>@@A?D>56 &4;IHFGFI@WP ?E@?=@@D?56 &4;IHGHGK@WP =D?A@?=C>66&4;IHGHGK@XP =D>?@A>C>56 &4;IHGK@WP >D?==?@C=46͑&4;IHGHGJ@VP >? =B=46ˑ%4;IHFHFK@WQ;C==>@>B<46ʑ%4:IHGHGJ@VP =<==B<46ɑ%4:IHFGFJ@WP ?>>=@;06~~}|{yx$49IGEI?VP 8A<;:;;@;06~}}|{zxw$48HGFHFJ?WP 9A<=<;9?:06~}zzywv#48GGDFGI?WP8@;< :?:/6 ~}}|zyxxvu#48GFFECI?VP7A:9;<;@:/6*~}}|{yxwvut#58GFEFDH>UQ 7@;;9?:/6+~}}{zyxwvvus#58HFEEDG>UP 7?9<<;9=9/6-~}}{zyxwvvusr#48GFFEEH>UP 8?99;<;>9.6.~~}}{zyxwvuusrq#47GEEFEI>UO6?:9899>9/6&~}}|zzyxwvvusrqo"48HECG>UM5?9:9:7=8/6~}}|zzxxv tsrrpo"48HECF=UO6>89:;9=8.6'~}}|{yxwvvutsrqpon"47HEDG=TO7>788:9=8.62~}}|zyxwvvusrrqppml"46GEDDCG=TN7>89786<7.6 %~~}}|zyxwvvussqqppnll"56GEDEDG=TN6>89897;7.6 &~~}}{zyxwvvusrqqponmkk"56GEEFCG=TN5>8 98<7-6 ~}}{zyxwvutsrqpnllji!46HEDECG=TN6>8 97<7-6~}!zyywwvvtsrqppommlkih!45GEFEBG=SN4>99898<7-68~}}|zyyxwvvtsrqppomlljjhh!55FEDFEH=TN4=89::7<7,6~}}|zyxxvtsrqppomlkjiihg!45FDBDCG=TN4=767:8<7,6~}}|zyxwvvutsqpnmlkjiihfe!45FEDCAF=SN4=87686;7,6~}}{zyxwvvutrqpnmlkjiigfed!44EDBF@@C9QJ0:5454483)7 }9zzxxwvutrrqppomllkiihgfedcbba_^]\\[ZYXWVUUTR41C@?>?C8QJ0:45483(7P~}}|zzyxwvvtsrqppomlljiihgfedcbaa_^]\[[ZYXVVUUSQQ40B@AA>A8PJ/:5443483'7Q~}}|zyywwvvtsrqppomlkjiihffecbba`_^]\[[ZYWVVUTSRPP4/A?>@?C8OI.95 383'7<~}}|{yxwvvutsrqppnmlkjiihfeddcba`_^]\[[ZXWVURRQOO40B?>>=B8PI/93455483'7~}}|zyxwvsrrp0omlkjiihgedccbb`_^]\[ZYXWVUUTRQPONN4/B@??<@7OJ093325483'7U~}}{zyxwvvusrrqppnmlkjiigfedcbba_^^]\[[YXWVUUTSQPONMM4/@??@>A7NH/93432172(7V~~}}{zyxwvvusrqppomllkjiigfedcbba_^]]\[[YXWVUUSRQPONNML4/@><>>B7NI0834 362'7~}A{yyxwvutsrqpponlljjihgfedcbba_^]][[ZYXWVUUTRQPONNMKK4.A?==;?7OH083424372'7~}zyyxwvvtsrqpponlkji#ffedcbb`_^]\[[ZXWWVUUSRQPONNMKJI4.A>A6MH/83255372'7Z~}}|zyxwwvusrrqppnmlkjiihfeddcbb`_^]\[[ZXWVUUTRRQPONNMKJIHH4.@=;<<@6MI.73213372'7 ~}}|{yxwvvussrp.nmlkjiihfeddbba_^^]\[[YXWVUUTSQPPONNLKJIHFG4-@=:=5MH073 2061'7 ~}}{zyxwvvusrqp9nllkjiihfedccba`^]]\[[YXWVUUTRQQOONNLKJIHGGF4,@=<=>?4,><:==<<;:87665453,?<:=4KG 173212161&=  $~|{zyyzywwvvuutsrqpqppg3+=<<=<=4KG 063323260( S"1,=;9;;?4KG 253232260( N),=<;:8<4JG 253233260) T(,;<9=3IF 253 252#"#!xNTR[dUw]]d),;;8;:>3IF 05332 469)<&~,.d_yqYaޞwչUc(+<;998;3IF 46323225458 ,:4n}(+<;::9;2IF,67334328+76 1<i?%&\v+]Yzx 7[C0B$ed(*:99<:<2HF.$2423256.56 .:pq5D1un>0RAhCO?B=~)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtst sttvstwttwx wuvtxuuvttuxwvxwtvxuuwwxu}L97#>8898;2IG!E/4)8033223166,9;! ;D,(@7997;0DD)E)6&91322323167'.2987898799:99:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9b؃ 4Of%6:IHGK@WP AF@@ABAE?9a?ˊ /7&5;IIGHFK@WP @F@A@A@E?9b́;h[8!Q!c !ʔ&5;IHGHFI@WO @FA @>D>:a!źUhTPRYdYMRkܬ&5;IHGHGK@WO @F@BAA@D=:`&5;IHGHGK@VP @F@ ?D=:a )5;IHGGFJ@WP ?FAA@A@C?5!7ny =C?@A@BBP|g7:JHGK@VP >EABBA?D@2&!;ACScu½ĽqbTF>B.  :8KHGJ@WP >E>@@A?C@0%   -A?PM :B:! :8JHFGFI@WP ?E@?=@@DA1& :8KHGHGK@WP =D?A@?=B@2& :8KHGHGK@XP =D>?@A>B@0& :8KHGK@WP >D?==>@B@0& :8KHGHGJ@VP >?=A>/& :8KHFHFK@WQ;C==>@>A>0& ;8JHGHGJ@VP =<==A>0& ;8JHFGFJ@WP ?>>/& ;8JHGHFK@WP ;B<==?=@=/& :8KHGJ@WP;B;<<==A=/& :7KHHGFJ@WP :B<=<<;@=/& :7JHHIGK@VP:B<;?=.% :7IGEEFJ@VP:C<==<=?=,% :7JGEI?VP 8A<;:;;?=,% :6JFFHFJ?WP 9A<=<;9><,% :6HFDFGI?WP8@;<:>;,% :6IFFECI?VP7A:9;<;?<+% :6IFEFDH>UQ 7@;;9><+% :5HFEEDG>UP 7?9<<;9=;+% :5HFFEEH>UP 8?99;<;=;*$ :6HEEFEI>UO6?:9899=:+$ :6IECG>UM5?9:9:7<:*$ :5IECF=UO6>89:;9<:*$ :5IEDG=TO7>788:9<:*$ :4HEDDCG=TN7>89786;9+$ :4HEDEDG=TN6>89897;9*$ :4HEEFCG=TN5>898;9)$ :4HEDECG=TN6>897;9)$ 93HEFEBG=SN4>99898;9)$ :3GEDFEH=TN4=89::7;9)$ 93GDBDCG=TN4=767:8;9($ 93GDDCAF=SN4=87686:9($ 92FDBF@@C9QJ0:5454475%# 9/D@?>?C8QJ0:45475$# 8.C@AA>A8PJ/:5443475$# 8.B?>@?C8OI.95375$# 8.C?>>=B8PI/93455475$# 8-C?<@7OJ093325485$# 8-A??@>A7NH/93432174$# 8-A><>>B7NI0834364## 8,B>==;?7OH083424364## 8,B>A6MH/83255364## 8,A=;<<@6MI.73213364"" 7+A<==:=5MH0732063#" 7*A=<=>A@?@?@?@??@?@?B85*=<<=<=4KG 063323260( S#1,=;9;;?4KG 253232260( M*+=<;:8<4JG 253233260) T(,;<9=3IF 253 252#""!wNTQ[dUw\\d),;;8;:>3IF 05332 469)<&~,.d_yqYaޞwչUc(+<;998;3IF 46323225458 ,:4n}(+<;::9;2IF,67334328+76 1<i?%&\v+]Yzx 7[C0B$ed(*:99<:<2HF.$2423256.56 .:pq5D1un>0RAhCO?B=~)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtst sttvstwttwx wuvtxuuvttuxwvxwtvxuuwwxu}L97#>8898;2IG!E/4)8033223166,9;! ;D,(@7997;0DD)E)6&91322323167'.2987898799:99:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0t8mk@13455555555555666666666666666677767776666667777777777777778888888888888888888888999999999::9:::::::::::;;::967;<<"s=!            !! ! !!   !!!!!!!!!!!!!!!!""!!!!!!!!!!!"""""""""""""""""""""""##"""##########$##########$!>  q[?9ܙ#.100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111/$!" ic08w{ jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 vR@tj3˨=Gk9&V2&5"̀nj%_-'ľ[[cB S3/C:O(H6<.+l6V_g,b3]2B9uN## .b޶}".ERWX7)uȴTIL 2ue-gw эvY(%EO?)PNf87 $O*!ΈN}+|S}j(zPf4 /}F\8IЯK:o",+>㠶  a(>t,?Tű9  P9o(uc=s<>s$ Q(I!s:hiY.4eG^Z SIuIc: Ҟa$H A9 -4NK⬉Z\"ǪR:"J&֗G8=vC!j~ސFhkes{jh3,f3>+F4$}v=ծ{6:iˤV A"rf[} U6Q3zE1h#uwslPVP  w۷9[f7} P>@E }4燖PMGybFhnjѫÃ`UȆLN+cʝ2QPtjn)&scl,{|P@ȻĨdÑ8B?'6ejeYW 1PF?br0C >+Cm̞Q1t8oUD851!dTA3ܭ1#+c`mmD l[:y-MAPw|we%{+Z-Oo謟z;KڗBn\OFՓz%3bPOZf+]!!^e"PTͶE;źߍ,@$ˠ#ld9X)`F?قQ@Oʐlu'/"@a6+;Ns'l9,X䚏ut$PDɿZ&paB"0V '&.vQ4Aڏ;o9 ':#) (+۷-i1wD= ;mC5|b[nxERC,~i+$ Ƴ/ o.#NHHJ{{0RsT? y?X(+-mNu, !SYמּ`݆s 2rl6xn*_o#J4ftdJ˨S,v偈Kh73 Ȣe?~`]=@ P޿> Bkp" `3 QkMq͜1RmiOރB! On'|U :708)&[DGښ_GR!puL,4K%(R@A(,*tᷓSXMr%9j3I+F aúT|W _ $Oѽ082+nwdO bl"N:$3MC46 )Xwz6k [O1D~^&@=jsêݤ 5V3oHT\wLKee oh_%aXF7õB6.[ǂ-w˔fNNY4\_f  t΋Z. O89K@ }8"?CEOF&l+E@<Ʊxքͬpꬕ鋩C(I),:]ϫOX$UɔA/j. h}H>&Ӿu _K8Lo\fzhS"* HdߢyOb6rUE쟆]ƚY8ɷ;1GhAv|3AN8"r >G` -s,[u' 4k 2C>TDif𱩯698n}-J1?z3{<8ӒҖc ܒt %UƁݿoX{XpI?A0~D7Ip4";"ߡ W^6'y϶Ez0@pj\> ~*̪Vk>33 KOVmK8JߪӼX*?Vҏ]#nzgU#a87< 3j/ʢM_!eF@b)RPjU&ux'!5`@1L@upeѶ`<ԍ< l{A--@X}GWbՃh1z֡j[pkg1_hw$*e`;h񛴲k>>-ljU^ 6 nb4ҋc7ͥ+0A̓z~CK'bKSҴ'9]V6,u (_nwwiʎ2:woJPN' .v??\u1pv"'l$C~yL䚰bt߆wcj 31u*t0)#nG?,w Q.x pSW@HM)>J֯-tN!wIJ;?q qP-ձʎ<ÉzE 6Q=Ʀ@b:llHfA%U;O`$H_vO|҉܈ gEv *Dnՠ#klr gy7XY8MT9i1tW`}HW ZrFװ26jM1:~~ʲ",;vya`4;F+)8g(3}dQװ<  (v˭JWaDi&?sdXV1hpÐ5rY+/O^WW*J)8u#or–{F$x dbiΎDmԔ{[ZdB?0(;ɡGGQH%?r'}2[/ĦBsoxw2,EK]/F!|8:[8BF >OЉ_GZ;҆b䕶:F?f*!RyO->0Z.o zp8 DU),V#T' yI섉_%'는)_?j!"m&wd\lͻ,u%$ !gGP7^ᗺ雖 ONas]фz)x}" 5onXG~JM-fEs$D\: Rwaf137,$l~rpC͌vfȾENeƣFċ@ Aե=#p Pio$'2` HUs!֥ kT`Ƨd%%T!iK{uDTؽ8z&p0Ar_|nӹfB!o, X[FBT]$gH/1(=+>kn^d9!蘆{YpYeǨ6'MwVCH uQ]!ƆҼ1g'9Hզқ1\Xd&,4n&u&Ndns6j5XZeu-QT4ZX$ dogsZbEf֊XcUOL3Cy $5P鰑׋Ny!pr_E9;-Ҥi/7a45:)q(!u-/Ac'y.n**`)Tx [&m d 7 t$_{#އg)Dޖ~vi횤BcUyRg~jd~":5KQϖ"h(?Zfa?w%FnyD<̱&wl'aiVq ,/D=b\Zz3]%vI?"o8BV\#@Bf;"VTQ-g4GyrZ0ΪAy)AȬp_yF-B-$m4=ŊƊ<%J΢/Dؤ=# %-)5Bחv.c#_(+,*.0U!bYٹŷXH)ֵc&mVm؁G愨8ɶ!]`K:? JkJI7}r[1(Sf{<;0gB9k \B%MT%cH@ qcdR^+NT&u$~}Lw[\PVݜvjV^WM'k(op<,Rc Zl9s _@;!١C!_H]eT]:^;:pZ#1*meE(&­ =.QL\E95 FД+4[\xQ 0SiĄV{.oQ¨-/&޼M%})FQ  8&X5DMko] K4om5z1t —MжCkNpf ϼԁ2֦W<т Ӱ@dKH=DD$5YQ!k" ׀ 3 cFr 5;vss=qYIj̽Z%J LX0$>S6߄TUܞhN7V菼36ރqN{7da @MfaA:+Y*Af^ Nb. Yr'~$eZ{Xuɴ#h EL T^ ᙗ|6rLE|!>% SެK(7fx#K,t_}{&0]aԽ"a 8ǁA|F2O$"SMg3{r4f, =8Ǣ/kAio@b 1ΏL9 yIgҔB}h !qnR|~yT~)h;C:8J79͡t"Y[bxfh_zeRɶb̫ƃw|SyPBhGg$dC6ܕ%6~2:aJeAJ/zzt{e]e'x"\y\mqa!)୐9&ya\yXx rbY갿ƗpWϛc4$~1j/45s %ق`JBMWQ[Bmh0dT]i5d.`1obҷrUr<9cOvh_v`C]z3z}ȸ_DžefCN4!d3@A l2{{7>ig# ܝPT9a!$ (bcGۜ-jBfU!2YFZW)#0Hs2|y֞d BEIO2~%~/ʱLj/ οU;A'c po{1]0TӉ#Lh.Eyw&Op1kb@1utn.RA})ksE?VىZU.<+kԞ6 ’߽N\)mH؄eaJ-v2=eez!ŸV F'CXҳxY,0~RnSymYD͒DӒ †k[LƓ:d8Եye6+ A3?#G7!> G@D q|a. 1~~@۠x!,7زxM=LbM,mE lEh ߸Ð$DЧtN}gsP+%@Oc'9_چ$_zetd̮[XZ_ gէ"vIC7!*,|<{/ƻ ;a{FI4W$PCM1j  'w cyǐSA!6 w[)v\l ChdP0j!5{xC|82d}  48G%PE͖É%ޮ4W|!7uV ]BX(_g~5 fxd+,Pqr)Nѣ<ʧӚ#>;N 8ܧLjP1Xvjz=?Hir}/;k/Q'J~:_a*UZI|g:|+w[P9,5@q\'kT!{o}Z>YJi%Gʤ$pk@Ҷ;_s,Qʃ53$O$Ҍ:|h(܇g%n\bY2sP8* XuTfHQN8GΦ2/ߘsQr*iTx oS:FpBǻ<g@FW2^I^n.X\a3hVm-U׮bEq*_ˌ,5\Iй/cEÏ`A'>#G @muZm0k(/i(q$k&j^{uF&L| < [J00~C__zRk $Dj,mj@vppY%wqIHs#1gѳ O擵X^+]'G5,A5<2ba[76A$ 2erͬgkH iT"CFAv:mamN`DsEQes<$wk{1!N} el&G+d< P ܇\/n7T[>"Qg#@?©Z g`!E&6d8-rgFh$ffVTZ8:2xw^>(r_CI)B}^?xAwӻhGmۃu\/@JČ;#.Jm$@@F2 77@@T#0O#I߈~YrMe h_8N8"-lru>e? &kf+zgiȬbgҷEcrM5Ji*?!4kUH`MuLCq(.c⮁uI8w~ܲ٭ZrAXRKv؝_PhBBa ~ #G\إ{ 3AaDfMK%|*9e97YC'[iQ!HzQw_ZŇ*keUW07?> VƇ9O1MB ^|`vZ,r=YTڅHhI|3Jx<&M%v3ٙ 4(jV?Jf%mW҂ JPe8ti;O{Ol6HyZOM{ h[xiVā}*.DYr\}`+wﴶ~)6 Vӈ9Et* R(.`gq*3N+ԇϣǞ G4.R% }ά I6)E+*SF>2/^~Ჺ -ևw5 *+$!gkne3ExnP~ڀ6}Cv4Z_Xo] T0!e)sot)^MNdͭ=hT Ta12!؍}mHA\dRA+bO2RwkSd6{)Ecd 1l_< _L-zq(0|rcvBֽj6,h+V -?X=a!H 2QLzSj Aen۷[rSuv1ψN۠6DG /+ezWELkUDP55pX'vMlODD֘C;R2-716{4Gf,[H#1A IQTnBzR柄asf-vSGXV;5eyN%笫b8HlσCtu$Cj`:rsvMNT?͵?ο. R );|gc 1j)ov.sd*B>yH?[b*ܰc'EVG>(`Wo|:y[JX?ʞ$*lw :Nߍ,ncm%,^[-zہqPFu $ښ]smmޠ9oiĵ2ʑ9-N Zx:bT$wYk}O_z {l ڶk%_r sUHo>QzP$@/ $SV"Rq6`)CaLXEހ^'(wg3,hdN|ЩCf<#kV>xвZ njiQ='j&uN"rw^?ΗhVgp0vV@V)Jvsr,˟!mW<  ۢz-o8Uzd 1dui s5-4k֜Z 8xmYq2~DHdنt$O)xl/>E k+HQ ^q[Qbߴe2tפ~zksە@oph֕uqPVK db` p|ov#>48sSd,ՏdDۡ @ю\DŽJF$K2ߖ5SGVۈr&c(1)'p1j "&F֏lB>5aN: }mƋq>t7l%iL,LIB\s AdPFG|T-TPGX~{w=5]t͝7`[^((gJ[/`mV8K2场]͗uʦC+{0b͒H̪NZM}twM˶r[{7f bLvN;3_\K?3ҒH˅a\UIg'Qa|kК}YYhC;XxuoPy?|Rcѝ[]˺›PXtݬī-b{R)| <̚ ԷDQj 3F 2O!.,rPDa'Hr}ï/'6B4v)jQ5qLJOFH9z"X[[z24^ kxiIy,t;`*|{D5(=Ր78s0Y'Ixj{A9t{ݯuS4!|,1bdB6pgvp|oXFH^t§o HP|fDڣ mCc^ױ5i-$  ݓ?eYL9&TU8 B yϵe9\WNa֛|.$>u bw*Aǫ)5!bǢ|}̌ ;N)x^V[mdCtVl\W=?:5 ]t>ˊH><QK;舋)HiQ B$?/^+CO jG*G4 &Xŕz-pb_+؉Z^o\WV~ldIʩר|{P졥+ΐw ?Q6Z*󉢸eSM7xwr*UY-;}06T9Ԇ*ZYNc4]"}+1ew1 @ysߩjS@ȰGE#hxOo;OO6F *a86A3qJ1ͻuRc6^똂14"L!WX|Q }PrW`x5D)aL4F%ɉܗޤb`J(xWSQˮaBboiLNH~rV.ΏscAxO@>W.E-ymKDY4S[%]윳kgH" νt4UAUcBnR3WʌEJR6G|Fd$P$U_$8 BD;i ieyC5=7}̤}q`1m}!Fȕ4S,G.lUn IՓz8_#5#(3C%i<ܪO6ș[k;bYdK~P~1:}Q"9tMs-`iH$1̊_9Z3~6DR׉eWCuෛlQt9i(TB-,u?/۳6\Q |zSEr63ʯݒK|a&3L@2Kӧ8'^ +GjE^n|6,zj(7WёRE-ĪTE|b@Y?]mbZmab9aTl8ZY$Y/R76V,十P3򤟏$=½F$WӢRB3L5wN=ioiֆ7)۷ۭQhWd^a5~RzS(>p$Kp4Vݾ)1m/;)% "[jc!*S!yCΪ9/j8ٖ0o= x1E[L6Vws/&U2Ob w ؝Tw=7b*උ*skfm2.1⍂[rr5t.J Q- E3P 4#v~u"pN~Y:p Cx{xј%RLSGQlfyiȑW#&i%@ͮ+!Nhwc.@. /Pf™*P-*9h1-t6+o,]P񨪵xs. MIMO4rKp5,D]ǐ'tK Tn?Nł}8~"H:ߑ>N\NEX%}4HC-8Ԝ5W38dEJJ71.rȤQ, G\l99psSG}݋')/6Sh|աdo;VsK#>ńh0gI A5?EWI:d%żaa\:JJ@r0z pxP‰dB'KsΊ<!۫%"ZV$;-Հ 1-mr0}en*m*R)JR)JR04Z |<2ffboH9~spPVi.oJk̤0Kl;6B!Sur~;YCGEִB%t2E>Ǒiv,tmNs.:0Z_n=GP.zI$I$~lUA DcOjVͪ#Ig_(ۯY&ukrarw]*Inm! 5X1Q*!z AWT@7(SfL 5c*/f2n IcpC U} f*`_}t\εcAmdq6TUh ~~A|{[/߮]j2  N ti ҨKOaOWUG*T JmRs~qb9^\p8*m8 ˴-at "[4gv@u7.^ߌ'셜WabI>rsmN_@4^df_=9'@=#b̠ǫkЦq p*>M}W^lj#1k:O~N]K曐4Vxz-yg w4ҍ^ayxfO{6/@9!"#"R0 dESpjD#;/Va2sRAN Eo΄1$k &I^Y/Bs驪7n2dd M|G1(6w:?M&b"Bkg"Ki' D5Z\ʖ'j7 -jBGoI*8挦:%Qp m[ 6K\x}H{o1ƿvّSptY,yzI xi8x@k&O[vHʹr#Q$I$I "g17Fi@BM L-ŤK8IvwK\9jY4UU>gmdu,+nyk:eK=2]JV%/kő |4}wS`Dr6`}VТ+e8|˱]kf K+ soLxi;\)(S@թMpGGZ"))9o Rwg8LZ` DR>L}3*2J?˜ktzo!J(l,3*"^PSK{Cqa4;/3;XCPmZbm.Vb1\0 ?H~Nzc. ۈGlA .@Ca]!$>W֗G?+ 2L*C@3̥GJԼb9\oMĂјK.VsTN{k4a1Ƌ|%۔sIam lHv\#ԴqVV& ݠ_OhQ>ާ:ZW]EIc$Nu?%礓sUIpdպ3/)FZLO-}t0v3jM i*&:=g{/;%VO՜?>ךڮ;s !6 v8JZ83*e:-UkfCrG&tז,zxZtw230&Z\cb;.%{~Ƶ0WE4E`]{$8†vX4+K4 lB3yKݞ7պg  2.t MoI-[c`Bl3=P.;[7@ҕQN@}qHW3W:*g:8Q~6 ' 03=OaǨ&rrX0T,; A/!U݊ӅKOYn{޻vbmy%`uI0 QܑMJuPwh&X ,S" EM'9n71]2GMSulV[Ftz]}z)C?cPţ$&eeNW7ӟLYYR !3"= /`BgE[p{pۙю^)񔌺sĮB;1{K66Lsxoq 7xr|6"mZ#Ib!m+u><.\͖Uhd<} Ǚ@7LDρfp.ڣ6k\uCYQ%@F~v hɵѾLOUt842sD1z\E r-aM˦{P6?3XHBDlVPD-zduǩV+Dea8PfWgрTMŬ t/&"frvAb7ODŨ09]d A[-Y7*ƪS,9c;ymك!|՘5+go+D oX^=ll~UB2;y_kh17.grZJ=LAbk!e9kT41-+j&oR~u 8Q&z_1 f+-^0%jPwK (qjR{>e;-=uq 9t\glP)ouzxb , _ST2T!vΕostJX5F9|UNz*i# U5< ;ZRƀOpn¹_S7S]hhXocJc3(>B8>{&|Q&j}Z]F/?ɼn=4.Bi%[E->L<)-ԭn zj k;e CebYz@UP u}?^?ZHF?tm0I xכּcsUl# ړ!1Fx+rpv7A-d"6N-VVƈ.+Ié&38b^ٍHiJ:*;yKoIjLlrbh`d=8,KM_{2@S1HXdVTtm,^q6';#̑#-w#*YMJXw h~-t$juaq,a^oa˰? toE Ij1g痒KJZOYOc% Rg+Gn`/] Q sxwɠQ?zN''wb$$l-GKHqLKaXH?.PaDY0u;÷2;MBS:Q9+}iNGu:itGs{rQR^<^#4=ĦnB#H]\y*y2nFGQLT:M!Q>#`0/ "Sǭ-O3 Sۇ7 Ao Z.bڴg'E?]>H5<8|/բDY;\!wkDG&u(vlZv]JquNē;_G^o{]t ϲ8%6W:˸=NFɋ#| vv`64aDD Oos:}CLl@ln)OlZ)mmHq$=mT\+Q@p{uQ#[H`g_;~u]Sghb99+V*ح CL-EbMjuۋ֘ 0$irYsG7 "i.f/MgRRo`i|OƮ8AA:3FD)VcOXWs8.7٬ Y эkWB 2QMpeZ7nG%Y r1:H>Q9G_B*ʕF&B9y0cFU;>vidbx(#cԖrEOw]{romzp4>DT$zWțhlkX B*H6B^`B?gpopt\mE|[-5o'MJG X>7qeʇ> ;x X3NVSd)5d hD2\MSxt$K2XM%8bO>cç',VnEPk@-L cV6ù?7Cf`"ɑEƾjzJaUHFsm;RoJ ̀] x;਌Dre!j }W8A[ˣ.?lKb9X`N S";9³Ee5`hg lp`E-OM1tMo"uhkjx2 X?l9P(sv[@WL¶3U)yqche#cYv.vE]"^g-x(k Ɛ;JO,/mD4UgE35ߤ`lgy5NL]]þECh@iKYpV1V\0~ե?ľ~ǀ A c0nF]ܹ聃 f֓B&b Jq[ %rW\r. t"K(U ㎲k%yFmnP/V\aV/TAMWгm\y;#ui*PAk_Q&u\0!nB8 OpZ beYS|{4$Lg$4#'?@P@_[[.%$p G$0_q>so#ldǓ ^"+ )JPll&o'X.#}3Ϗv/})6{ E򼅵Ǣ9u eD. 6!\(]--HB7Ȱ Kn5@/M9d+50*Kf!"˫ BQ/v-!(ACy߆=gi|㭰;{UcOO~+Jx # Z8 K,)f+΀ Ƴ[PuC<zP+*%KxgMre/v\Svvk$M 6Tl7ܯ6%+~+әjPJwzU寀#3z" ?'` ^i{Tb, KQ<{ճH?&Ux.hyD] v Ke2fd6ɓZmXYZ'nD9j!HHnT5K"ޔ0Qu6<ݶm\ꓷwB&yք>ZwM?|f?Umb;=}aPVNWg 䦟1}xNzWLB yT>lT"/.smsq|S4F0BGu% 푖‘Sh1*MAmB6i򩟤GZ]tCmZRl11-o䐆`Н< uӲ'N@s`l)^ZԏkzBʒdD=0a=o5>*<"zSqtBB"fM0;gV+oפ.bc\3/SThwOI)j9KRWsi'3$$$ KluTr59qoelVѢ(i &^|g ogPX*" xt zTݣI(lXO&7@h_\0p$B{vQcLLe@ HrtMְ`tzK/CPC80љ,H7wO=#cKVp%P%5/ۀ\Q%Jt v<aإk qP `0 W ;:5}tm^:%q@ou5b7F y5I'̸Ӆa*nOt)b~ [HLcP/=YglUMZC;_{~wTvO!{! 'T9I6 ӸdTnLbk X]ƏBii-WE$H~cr,f^EWoKEGj\,ĂcEQMn?}4-V.jb֏wtUN]2=/w~k Gibi#[unm2jTlaMZ`;=j[rEv'b /M:潍 cojV FmNY `._y)F ] 뫼ManA0$%45TSS-(I/39\RT8ȞUS :iۊi|5Ѥp( BϠxҚl\dUxj,COө cc=lä#QƔ ȕ65xzҼٻ*`W9FJjj8S'd{WJ~˽s+`r)tBPJ 5Fx˱)ryf݄^yA9K*"Cv |45sGO+d wc?m^VTvE eDA{9 k&|D={_wkO93R"K BfN)Vzou LYcB&m!cq!H"7'8DSW!Wf߹|06H=p/ʶRbe|E4QVO=,sykk[xStaݸ!=5'Xșxh7udDov[ V߳F@6nڀGꆀ009vzxaexRxە7?6@2sjZHp82IϽ9 2hA@d]*c d[#Ckr30 T0Ąҳ$U |M%(5Sd _,~y<7pjA_BʦMHDp +W֎ &Ys> AJ ؗOķ"kДSS$ߨ.oD2=~;HXWipOM^q>Na} %B198>Y^*+in,&{A4 6]D]zl;;\@>g3 mt w?hfyh-o?ʙzOd,|3I#bLxJJVә$=I J.Wej\+N?9S][pOwwRοj_^>I GFh>$QhqW:EZ{&a\ ~G;DP4ݒ{B#=ٔRYZ\_x"g=}/}V _GXMٰWaDh8`cע9Y8~j-_Z0#:G5$1ޘ#8+t|ߵ}T-HL9CGa"[q\_7itՔ2I H4 U4ybMRflIonJENfYаM9Z~>uRKPEJyzhc-GZo~PO/žh3ұ%ِ3x @ox4'H|/ X WX pH{;[]F_4(Lk{mr: "yY{@5!rwfz|ُKdK>;"3707Bm冧BvxKm_]s 7%reC)d#1\X/*s|DU`("ITm/m4?#jy02洷!*v-Rzo` ؁-gT,FrqXTB6nqu#Kz4h^tN1R5** W,\쐈6W$_}\nwN^i4*s,ϟ^my*.GтPR1SzWx_-Mv%|u=jnjUA&a捳MEB35gaF:p@˘K4}9% 2-YnZk >,H 1KQB`:=KzTk.|^UH%v 9uk侫'P.OW3I2wklg/9C{O w1Xp2.DHeu-/ Ą E[, _މz睇z>Jc6 yX.N `rg=K BB\~_; vRbD,%8O2GBQ}6_YĸHK?T@xU!4yV UNU^;pbBsҪJ= 6=rxqn# d@Ap zпQcV+ۧr,##6C'6ql&e@5dL^@qrK@hD_X4g6IV?/S7vI|QRnxQ;E| +}߉oW8O:@`I'VSΗ@4X)!'~=+Y(A dy82i=+@VY_lkkE6XtF*ƚ I,t)pCb:m_,gu$e^N2-j;o:KPV}85;x8x< /aMNvXJ}F{]RC_o`dQѷ"~(OKefQ;?uSO D9aȕ1 8Ì7_;۝mPӯ!6\*cuf!*#ްO3s b[wN ]GrMf KG=JLfq+s*տOȣҷ+VۼKoS[F@T6ESރzQQf#5ZQ$,p ~^0s Իsk2p+Q@#pC':5@pPrƛpG`6}b#_2(Cxpݧ" %n7m`l~W\x U o&zo#oA!"D*j(װ\p?F#.'́PMIphEvJVҁy?0ɎW7plx'TB~ýM*^ѥ9RYa%^w2j2sӜζWlsvIו25zYC.rSKʘP9{}1Cw~ NP[@6&Ip>8YfoJd7ZVLL>ugIi!q`'j?b Pj{|-RG;,A7G9d} {L Cye<ÞNp>rF(NDn:H+ Zuu$iyyCh^I7LZΔ"]x9E`Rʠzz#{xTo~&4!Y ok~CaWG?b2LG?)H9,l:1L0t̑ZZaz'1+Ĩ tsY8?"o7e{q>F(ۏcq3#;mL$֍N ,-*^(d$;@N#/̨Tuy$@qk=sX^}fȫGHAohx>(0{@b0 w$ѽ4?EyC&kihŢ2ʣ*jPsIhtY)Ӥ3~re8nc Z!ͧZ~2GPi+"{JCfQ閭 !f H|LTQmo܂-Y^>O3STZϡ^55qƔX?Zò[0)ca:=hr⊨([bYV?a'hEaoǭe@&>Iksۧ 4nQ- Hċ?NG!bkqkжy9ǨRi2Lv{cO4& H= >0y̑ cm蓁fNH,9@p!r<*^Mƫ?`f׷8@nQtHVIJ ^h"DNO6Mb3}v_|Gb } 8ֆllbv @#^`\Q8Hm{} 4*:aNJ;uⴕ4*Z PXL].L2%ƨjXȃR5 YKwnoUW}aJG8x=D" R0%t^}u9*14>jsiՌwJlc/$$wnT;B҄Ɠ1e9p93/k282>~QpgӥkXhI>H3-t&tlB\<_;hS2Wߪ(3?ģ}} ]﭅CFg YfQv$1y&*Mb0=ہqicnV Bffdesmume-0.9.9/src/cocoa/Info.plist0000644000175000017500000003030512140261603017541 0ustar guillaumeguillaume CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions nds CFBundleTypeIconFile AppIcon_NintendoDS_ROM.icns CFBundleTypeName Nintendo DS ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions ds.gba CFBundleTypeIconFile AppIcon_NintendoGBA_ROM.icns CFBundleTypeName Gameboy Advance ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dst CFBundleTypeIconFile AppIcon_SaveState.icns CFBundleTypeName DeSmuME Save State CFBundleTypeRole Editor LSItemContentTypes com.desmume.savestate LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dsv CFBundleTypeIconFile AppIcon_ROMSave.icns CFBundleTypeName DeSmuME ROM Save CFBundleTypeRole Editor LSItemContentTypes com.desmume.romsave LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dfc CFBundleTypeIconFile AppIcon_FirmwareConfig.icns CFBundleTypeName DeSmuME Firmware Configuration CFBundleTypeRole Editor LSItemContentTypes com.desmume.firmwareconfig LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dct CFBundleTypeIconFile AppIcon_ROMCheats.icns CFBundleTypeName DeSmuME ROM Cheats CFBundleTypeRole Editor LSItemContentTypes com.desmume.romcheats LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions sav CFBundleTypeIconFile AppIcon_NoGBA_ROMSave.icns CFBundleTypeName No$GBA ROM Save CFBundleTypeRole Viewer LSItemContentTypes de.emubase.nocash.romsave.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions duc CFBundleTypeIconFile AppIcon_ActionReplaySave.icns CFBundleTypeName Action Replay Save CFBundleTypeRole Viewer LSItemContentTypes com.codejunkies.actionreplay.save.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions bin CFBundleTypeIconFile AppIcon_HWImage_NDS.icns CFBundleTypeName Nintendo DS Hardware Image CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.hwimage.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions xml CFBundleTypeIconFile AppIcon_ADVANsCEneDatabase.icns CFBundleTypeName ADVANsCEne Database CFBundleTypeRole Viewer LSItemContentTypes com.advanscene.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dat CFBundleTypeIconFile AppIcon_R4CheatDatabase.icns CFBundleTypeName R4 Cheats Database CFBundleTypeRole Viewer LSItemContentTypes net.gbatemp.cheats.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleExecutable ${PRODUCT_NAME} CFBundleIconFile AppIcon_DeSmuME CFBundleIdentifier org.desmume.DeSmuME CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString v0.9.9 CFBundleSignature DSmM CFBundleVersion 0.9.9 LSApplicationCategoryType public.app-category.entertainment LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright Copyright ©2013 DeSmuME Team. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass NSApplication UTExportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription DeSmuME Save State UTTypeIconFile AppIcon_SaveState.icns UTTypeIdentifier com.desmume.savestate UTTypeTagSpecification public.filename-extension dst UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Save UTTypeIconFile AppIcon_ROMSave.icns UTTypeIdentifier com.desmume.romsave UTTypeTagSpecification public.filename-extension dsv UTTypeConformsTo public.data UTTypeDescription DeSmuME Firmware Configuration UTTypeIconFile AppIcon_FirmwareConfig.icns UTTypeIdentifier com.desmume.firmwareconfig UTTypeTagSpecification public.filename-extension dfc UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Cheats UTTypeIconFile AppIcon_ROMCheats.icns UTTypeIdentifier com.desmume.romcheats UTTypeTagSpecification public.filename-extension dct UTImportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription Nintendo DS ROM UTTypeIconFile AppIcon_NintendoDS_ROM.icns UTTypeIdentifier com.nintendo.rom.ds UTTypeTagSpecification public.filename-extension nds UTTypeConformsTo public.data UTTypeDescription Gameboy Advance ROM UTTypeIconFile AppIcon_NintendoGBA_ROM.icns UTTypeIdentifier com.nintendo.rom.gba UTTypeTagSpecification public.filename-extension ds.gba UTTypeConformsTo public.data UTTypeDescription No$GBA ROM Save UTTypeIconFile AppIcon_NoGBA_ROMSave.icns UTTypeIdentifier de.emubase.nocash.romsave.gba UTTypeTagSpecification public.filename-extension sav UTTypeConformsTo public.data UTTypeDescription Action Replay Save UTTypeIconFile AppIcon_ActionReplaySave.icns UTTypeIdentifier com.codejunkies.actionreplay.save.nintendo.ds UTTypeTagSpecification public.filename-extension duc UTTypeConformsTo public.data UTTypeDescription Nintendo DS Hardware Image UTTypeIconFile AppIcon_HWImage_NDS.icns UTTypeIdentifier com.nintendo.hwimage.ds UTTypeTagSpecification public.filename-extension bin UTTypeConformsTo public.xml UTTypeDescription ADVANsCEne Database UTTypeIconFile AppIcon_ADVANsCEneDatabase.icns UTTypeIdentifier com.advanscene.database.nintendo.ds UTTypeTagSpecification public.filename-extension xml UTTypeConformsTo public.data UTTypeDescription R4 Cheats Database UTTypeIconFile AppIcon_R4CheatDatabase.icns UTTypeIdentifier net.gbatemp.cheats.database.nintendo.ds UTTypeTagSpecification public.filename-extension dat desmume-0.9.9/src/cocoa/AppIcon_NintendoDS_ROM.icns0000644000175000017500000023350712140261603022613 0ustar guillaumeguillaumeicns7Gis32f!# 9\bC'|ٳ0-g̤o:8$ F6%!F4" E3! D2  C/A. ?.C=+'     ;"SȽθ|(1)]m_hZccej`bK.=**-+.%+.,0/66!!!9^dC'|Χ0)y佶6)hu7'hûl9&g­d9$fǻ[9#eǺS9!dķymI9eķzk]A9a±ufVE88hӾ}o_TE37 Z~(1(Xj\eW`ach_bK.=++.,/&,.-0066f!# 9\bC'|ٳ0-g̤o:8$ F6%!F4" E3! D2  C/A. ?-C=+'     ;"SȽθ|(1)]m_hZccej`bK.=**-+.%+.,0/66s8mk>[TWVVVWWWWXU[Dil32 "%&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?7crnpqmjplkkloprzjmvqoqk?>J J=ZSw8W H7\zvpupz3U G7[٤`AQz4V F7V9Ѳt6U @C& +9GPhY&}aUQ<*! FN ?B#GN >A#  GM =?" GM ! EL :=  EK 9;  DJ 9;  DJ 8: CI 79 BH 68 AG 57 AF 57 @F 46 >E 46,=D 34  3D6,@봷w$I 45$>纫~ղʷwq#H8/9'=c^eieeibkcjicmchjkfQih54? 5/25.!#  !#$"!!$#$86?);/01778988989.6:8;9;;::;;53;-88755445465454556:99"%&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?8cropqmjpllklopszjmvroql?>J J=ZSw8W H7\wysv~mz3U G7[ԠaFUz4U G6Z?齽{4U E9Nn8T C8KƁ¾Ƚh9T B7KʂɀĶe9S A5Kɂǃſa9S A5Jɋƿ]:R @4IɊƾY:Q >3IɉŽV:P =1IɈļQ:O=1HɇûN;O<0HɅ{zJ:M;/GɄ}sqF:L:.GɃƿ{tkgB9J9-Gɂƾzrlb^>:I9-GɁŽyqjcZU:9I8-Fļyqjb[RM69G8,F{sld]UME>19F7+G}wnhaYRKC08D7+CĿyuia[PLA81) $:C9(NξÿF1E5.<͸筭w$I 45%FĶض̺yr#H8/9$:_[bfbcg_iahhbkbgijehg54? 5/26/"$!@! "$ $"!!$#$86?);/01778988989.6:8;9;;::;;53;-88755445465454556:99"%&'*(&(**+,**+*J$## OQQEABCBEGDFHHGFFEBIGDEFEFUQ^ C?7crnpqmjplkkloprzjmvqoqk?>J J=ZSw8W H7\zvpupz3U G7[ڦ`AQz4V F7V9Ҳt6U @C& +9GPhY&}aUQ<*! FN ?B"GN >A#  GM =?" GM ! EL :=  EK 9;  EJ 9;  DJ 8: CI 79 BH 68 AG 57 AF 57 @F 46 >E 46,=D 34  3D6,@봷w$I 45$>纫~ղʷwq#H8/9'=c^eieeibkcjicmchjkfQih54? 5/25.!#  !#$"!!$#$86?);/01778988989.6:8;9;;::;;53;-88755445465454556:99l8mk%402111111111112222222222213,;+M)J*L*K*K*K*K*K*K+K*K+K+K+K+K+K+K+K+K+K+K+K+K+K+K*J$KEE"/it32i 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9bՃ 4Of%6:IHGK@WP AF@@ABAE?9a?Ȋ /7&5;IIGHFK@WP @F@A@A@E?9bɁ;h[8!Q!c !ʔ&5;IHGHFI@WO @FA @>D>:a!¶UhTPRYdYMRkܬ&5;IHGHGK@WO @F@BAA@D=9`%6;IHGHGK@VP @F@ ?D=:a 03EABBA?D@2'!;ACScu½ĽqbTF>B.  :8KHGJ@WP >E>@@A?C@1&   -A?PM :B:! :8JHFGFI@WP ?E@?=@@D@1' :8KHGHGK@WP =D?A@?=C@2' :8KHGHGK@XP =D>?@A>B@1' :8KHGK@WP >D?==?@C?0& :8KHGHGJ@VP >?=A?0' :8KHFHFK@WQ;C==>@>A>/& :8KHGHGJ@VP =<==A>0' :8KHFGFJ@WP ?>>/' :8KHGHFK@WP ;B<==?=@=.& :7KHGJ@WP;B;<<==A=/& :7KHHGFJ@WP :B<=<<;@=/' :7JHHIGK@VP:B<;?<.& :7IGEEFJ@VP:C<==<<,& :6HFDFGI?WP8@;<:>;+% :6IFFECI?VP7A:9;<;?;+% :6IFDH>UQ 7@;;9>;+% :5IFEEDG>UP 7?9<<;9=;+% 95HFFEEH>UP 8?99;<;=;*% 95HEEFEI>UO6?:9899=:*% 95IECG>UM5?9:9:7<:+% 95IECF=UO6>89:;9<9*% 95IEDG=TO7>788:9<9*% 93HEDDCG=TN7>89786<9+& 93HEDEDG=TN6>89897;8)% 93HEEFCG=TN5>898;9)% 93IEDECG=TN6>897;8)% 93HEFEBG=SN4>99898;8*% 92GEDFEH=TN4=89::7;8)% 92GDBDCG=TN4=767:7;9(% 92GDDCAF=SN4=87686;8(% 92FDBF@@C9QJ0:5454475%$ 8.D@?>?C8QJ0:45475$$ 8-C@AA>A8PJ/:5443475$# 8-B?>@?C8OI.95375$# 8-C?>>=B8PI/93455475$# 7,C?<@7OJ093325485$# 7,A??@>A7NH/93432174$# 8,A><>>B7NI0834364## 7,B>==;?7OH083424364## 7,A>A6MH/83255364## 8,A=;<<@6MI.73213364## 7+A<==:=5MH0731064## 7*A=<=>A@?@?@A@?@?@?@??@@??@A?C66*><<=<=4KG 063323260) S%0,=;9;;?4KG 253232260( M),=<;:8<4JG 253233260) T(,;<9=3IF 253 252#""ZcWԔYwMUNv\_cv),;;8;:>3IF 05332 469)a-_xYcOo`Ώk`ZXeɷVb%u?v,MDjRPU[^cTfɷVb(+<;998;3IFz 46323225458 ,>i4Yq9Cs5є23_Q03mwJa<:#q`4x"aJtStԒ42aM>(+<;::9;2IFz,67334328+76 1,)e5H^/(BlBʒA:y0WkhBӉ:k@?&^XP>BYǐC:y0Xh(*:99<:<2HFz.$2423256.56 .4C4fiGELshR)QZ@9A}pmL;?9k=orİ4UPZ@9A})*;9778=2HF]l9%9033167/56 *jkjk 6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtssuwtvvwvuurtvuvssvtwxwutxwnrwutustwtuwx0utvtxuuvttuvvtvuuvwxwxvuyxosxwxu}L97#>8898;2IG!E/4)8033223166,9;! ;D,(@7997;0DD)E)6&91322323167'.29878978799::9:9:<<;<;=<<;;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9b׃ 4Of%6:IHGK@WP AF@@ABAE?9a?Ɋ /7&5;IIGHFK@WP @F@A@A@E?9b˂;h[8!Q!c!ʔ&5;IHGHFI@WO @FA @>D>:a!ᄒReSQRYeYNSlݭ&5;IHGHGK@WO @F@BAA@D=:a'5;IHGHGK@VP @F@ ?D=9a +4;IHGGFJ@WP ?FAA@A@D>9Y׍ցEABBA?D>8NҾǗ"¹=.=HHGJ@WP >E>@@A?D>6CƇ ȗ ňȀŽ:/=HHFGFI@WP ?E@?=@@E>6Dǁɇ ȗȀɈɀ;.=HHGHGK@WP =D?A@?=C=7DDŽȈǀȀɀǙǀɁȉǂ:/=HHGHGK@XP =D>?@A>C=6DǔȁǛȀǒ 9/=HHGK@WP >D?==?@C=5D9/=HHGHGJ@VP >? =B<5D8/=HHFHFK@WQ;C==>@>B<5D8/=HHGHGJ@VP =<==B<5D70=HHFGFJ@WP ?>>=@:2DǾ&20;HHGGEI?VP 8A<;:;;@:2Dǽ'20:HGFHFJ?WP 9A<=<;9?92DǼ(11:GGDFGI?WP8@;< :?91DǺ*01:GFFECI?VP7A:9;<;@91Dǹ+01:GFEFDH>UQ 7@;;9?91DǸ,01:GGEEDG>UP 7?9<<;9=81DǷ-/19GFFEEH>UP 8?99;<;>80DǶ..19GEEFEI>UO6?:9899>81Dǵ&.19GECG>UM5?9:9:7=80DǴ&-19GECF=UO6>89:;9=70DDz(-18GEDG=TO7>788:9=70DDZ3,17FFDDCG=TN7>89786<60Dǰ4~,27FFDEDG=TN6>89897<60Dǯ5|+27FEEFCG=TN5>8 98<6/DǮ6z+27GEDECG=TN6>8 97<6/Dǭ7~~x*26GFFEBG=SN4>99898<6/Dǫ9~||w|)26EEDFEH=TN4=89::7<6.Dǫ9~|zyt{)26FDBDCG=TN4=767:8<6.Dǩ;¿}|zwwrw)26FEDCAF=SN4=87686;6.DǨ1~|ywuupu(25DBF@@C9QJ0:5454482*DǕO|{yvusqonljhfdb`^\[YWUSQPLN41C@?>?C8QJ0:45483*DǔP~|zxwusqomligfda`^\ZYWUSQONJK30B@AA>A8PJ/:5443483)EǓQ~|zxvtsqomkigecb`^\ZXVTSPNMKHI40A?>@?C8OI.95 383)EǑS~|zxvtrpomjhgeca`^[ZXVTRPNLKIFG40B?>>=B8PI/93455483)EǐT~{yxvtrpomjhgeca_][YWVTRPNLJHGDE4/B@??<@7OJ093325483)EǏU¿}{yxutrpnljifdca_][YXUSRPNLJHFEBC4/@??@>A7NH/93432171)DǎV}{ywusrpnljhfdba_][YWUSQOMLJHFDC?A4/@><>>B7NI0834 371(DǍW}{yvusqonljhfdba_]ZXVUSQPNKIGFDB@>>4.A?==;?7OH083424372(DnjN~|zxwusqomkjgfdb`^\ZYVTSQOMKIHEDB@>;<4.A><994.A=A6MH/83255371(Dlj[~{zxvtrpomkigeca_][ZXVTRPOMKIGECB?=<:774.A=;<<@6MI.73213372(DLjR~|yxvtrpoljhgeca_][YWUTRPNLJHGECA?=;98554,A=:=5MH073 2061(DLJ]}{yxvtrpnljhgeba_][YWUSQPNLJHFDBA?=;975424,@=<=<:97531/.5,@==<;?5LH173 261'EDŽ`}zxxutrpnljhgeba_][YWUSQPNLJIFDB@?=;985420.,5,?=>><:==:97531/,+)&%#!4+?<:=4KGz 173212160(H}{zywvusqqomlkjhfecba__\]S4+=<<=<=4KG 063323260( S#1,=;9;;?4KG 253232260( O*,=<;:8<4JG 253233260) T(,;<9=3IF 253 252#"# [dXՔYxNUOv\_cw),;;8;:>3IF 05332 469)a-_xYcOo`Ώk`ZXeɷVb%u?v,MDjRPU[^cTfɷVb(+<;998;3IFz 46323225458 ,>i4Yq9Cs5є23_Q03mwJa<:#q`4x"aJtStԒ42aM>(+<;::9;2IFz,67334328+76 1,)e5H^/(BlBʒA:y0WkhBӉ:k@?&^XP>BYǐC:y0Xh(*:99<:<2HFz.$2423256.56 .4C4fiGELshR)QZ@9A}pmL;?9k=orİ4UPZ@9A})*;9778=2HF]l9%9033167/56 *jkjk 6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtssuwtvvwvuurtvuvssvtwxwutxwnrwutustwtuwx0utvtxuuvttuvvtvuuvwxwxvuyxosxwxu}L97#>8898;2IG!E/4)8033223166,9;! ;D,(@7997;0DD)E)6&91322323167'.29878978799::9:9:<<;<;=<<;;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ%7:IHGHGK@VP BGAABDCF?;a9b؃ 4Of%6:IHGK@WP AF@@ABAE?9a?ˊ /7&5;IIGHFK@WP @F@A@A@E?9b́;h[8!Q!c !ʔ&5;IHGHFI@WO @FA @>D>:a!źUhTPRYdYMRkܬ&5;IHGHGK@WO @F@BAA@D=:`%6;IHGHGK@VP @F@ ?D=:a .3EABBA?D@2&!;ACScu½ĽqbTF>B.  :8KHGJ@WP >E>@@A?C@0%   -A?PM :B:! :8JHFGFI@WP ?E@?=@@DA1& :8KHGHGK@WP =D?A@?=B@2& :8KHGHGK@XP =D>?@A>B@0& :8KHGK@WP >D?==>@B@0& :8KHGHGJ@VP >?=A>/& :8KHFHFK@WQ;C==>@>A>0& ;8JHGHGJ@VP =<==A>0& ;8JHFGFJ@WP ?>>/& ;8JHGHFK@WP ;B<==?=@=/& :8KHGJ@WP;B;<<==A=/& :7KHHGFJ@WP :B<=<<;@=/& :7JHHIGK@VP:B<;?=.% :7IGEEFJ@VP:C<==<=?=,% :7JGEI?VP 8A<;:;;?=,% :6JFFHFJ?WP 9A<=<;9><,% :6HFDFGI?WP8@;<:>;,% :6IFFECI?VP7A:9;<;?<+% :6IFEFDH>UQ 7@;;9><+% :5HFEEDG>UP 7?9<<;9=;+% :5HFFEEH>UP 8?99;<;=;*$ :6HEEFEI>UO6?:9899=:+$ :6IECG>UM5?9:9:7<:*$ :5IECF=UO6>89:;9<:*$ :5IEDG=TO7>788:9<:*$ :4HEDDCG=TN7>89786;9+$ :4HEDEDG=TN6>89897;9*$ :4HEEFCG=TN5>898;9)$ :4HEDECG=TN6>897;9)$ 93HEFEBG=SN4>99898;9)$ :3GEDFEH=TN4=89::7;9)$ 93GDBDCG=TN4=767:8;9($ 93GDDCAF=SN4=87686:9($ 92FDBF@@C9QJ0:5454475%# 9/D@?>?C8QJ0:45475$# 8.C@AA>A8PJ/:5443475$# 8.B?>@?C8OI.95375$# 8.C?>>=B8PI/93455475$# 8-C?<@7OJ093325485$# 8-A??@>A7NH/93432174$# 8-A><>>B7NI0834364## 8,B>==;?7OH083424364## 8,B>A6MH/83255364## 8,A=;<<@6MI.73213364"" 7+A<==:=5MH0732063#" 7*A=<=>A@?@?@A@?@?@?@??@@??@?B85*=<<=<=4KG 063323260( S#1,=;9;;?4KG 253232260( M*+=<;:8<4JG 253233260) T(,;<9=3IF 253 252#""ZcWԔYwMUNv\_cv),;;8;:>3IF 05332 469)a-_xYcOo`Ώk`ZXeɷVb%u?v,MDjRPU[^cTfɷVb(+<;998;3IFz 46323225458 ,>i4Yq9Cs5є23_Q03mwJa<:#q`4x"aJtStԒ42aM>(+<;::9;2IFz,67334328+76 1,)e5H^/(BlBʒA:y0WkhBӉ:k@?&^XP>BYǐC:y0Xh(*:99<:<2HFz.$2423256.56 .4C4fiGELshR)QZ@9A}pmL;?9k=orİ4UPZ@9A})*;9778=2HF]l9%9033167/56 *jkjk 6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtssuwtvvwvuurtvuvssvtwxwutxwnrwutustwtuwx0utvtxuuvttuvvtvuuvwxwxvuyxosxwxu}L97#>8898;2IG!E/4)8033223166,9;! ;D,(@7997;0DD)E)6&91322323167'.29878978799::9:9:<<;<;=<<;;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0t8mk@13455555555555666666666666666677767776666667777777777777778888888888888888888888999999999::9:::::::::::;;::967;<<"s=!            !! ! !!   !!!!!!!!!!!!!!!!""!!!!!!!!!!!"""""""""""""""""""""""##"""##########$##########$!>  q[?9ܙ#.100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111/$!" ic08{ jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 zR@psDG|V8zuŷ / /bBUPS:<7 -['abU;Ϙ]~p(sDhl:"k< W& X['abU;Ϙ]~p(sDhlR{KRxbX[na#_ȴTIL 2ue-gw эvY(%EO?)PNf8q? ͣnƀ Q›a,n]&Gg?:qԩ]ڪp6Xڻ FG4 t`$--B-L\߯lw_=Bh$r?/ls$ex!ٟNqch@,n]&Gg?:qԩG.M̲0yfh|kskMG4 t`$åLNPwN;$ԌX_ D dBh$r?/ls$ex"bXޮ"1h#uwslPVP  w۷9[f7} P>@E }4燖VGLGKyBFI}b:.9Цl!ĄzҰmG^ t=D.nY_:W<̽)G$+jT4Ónjsk2_ݍĝmJM}tn>~e?n,'ȂEh@}kƊNP- !}n_,=B"X1} 14 Ym_tﮩ2 cqBGM8'K'C%T\ AI *}GOݼ=xة#9JSRU~$pt&JiT'tCx'fuMC";t X{}utPIm$G]dwn_ J}$rT%'zo0+ݐȶ+x/J ~9?L\[od{! ?~`]=@ P޿> Bkp" `3 QkMq͜1RmiOރB! On'|U :708)&[DGښ_GR!puL,4K%(R@A(,*ṫRt } ɕg ӛX.l19f3u({eXa]zb"4CښD_LF ?׎0'̿tw{pLua\q|ִra|kkNBJ Kh=^z19A-B 0Gv rS̠N'aT6<_ C%N[$6f/˅19W,fBk\do`?l"BKni 4x應(XaB PfmӿܡFc t4J3gG$؜^ ߘ֫AAfטH^bx xN- L݈ׅ-~U;U%d<*yNM&+h*nD'r%Ug;6_i =Jm{5ZG]V2Fdy?Ӿݏٕغg@# s}׿ 9±q$p~ԫ'(>Rit/1D\'P~t6q<1 du6Q :ɼP:9]r󆸱Q9%$R 4 Iiޯ}ZKMW#^T:ߛ| 0A,-(|ap\q r)퀠<-CD{|C,ԕPMP\ZV)z!xF`\0Tm[1߰3M1㊍(BS'=5p-?Ixw3;BuVRf)Wj]tC]qg;%0HOb;|6K9职?~M }mH sqyS&S#ƻ3@>`MCQ;Lt/?gC̎/4r`\"]h/7 r<:_2=p)hZZ}mNWđicbP[J0ڋ4US@ 8 +=͑] dF4i>K#,%15O0AXtTNYjBX%I~9mAG1]f9<kd }[ t,Ҷ0K$yß$g:[idP2% 汊0dO}#S3OҍOC:P}P8#׮Y< B >'n0Ql2<jqo0rRm3;-: ɴlo{_Pjjoab?9R/ơ*B4a o.j\BUİqOj:=p5D1 yh{21D!Qjox(^l ɟ<ď窐gz* [8) <_b45ц!'ց4 >|d+ņŇ5rΦPElEǏ9v3k&o>)Pv)?>iX` X2D-R `E ?bSڰ$}TZQY\H[|_VPFh!ߣqO}E>jEdB[Cw."ܷ oȫsOsxSS Y"P}@8#׮Y< B >'n0Ql(b0-0{$7ԃm9=Fr(~Wl>iW~YWŽcx|ArDzLȧq|#L@xm pF_3HϺ||WD=ऎ1D!Qjox(^l ɟ<ď窐gz* [8) <_b 6fpvh9 >*v!߁Qʩry׫Lp݇XxdqVvdQtZ 6Q=Ʀ@b:llHfA%U;O`$H_vO|҉܈ gEv *Dnՠ#klr gy7XY8MT9i1tW`}HW ZrFװ26jM1:ն~~C3:;Q 2h8c<ۗvsa2;D3s|8{+=96wM-d]~vӖm\\! < DGN^)LKrϴ)pRIN>gkP{VZ} ㈎9̑odƕsn. =XD=ލ%eĜ]h=Q%eem!-= B`oF w&~Ad`A*FM%+?2 ?Yn;mtԀ>2uװ}aa6:J~rE=.,LseÂmM'Þ*/3-` QB[U~ "&u"%~ZLH*Yp;ioo Tj, 1}2֫d YZ/f㽄]p(Feg 74 pDGZ+~fQx"2RaM{ vmˎĉV+yqF Uβ(85`n3>!p((%GE9s@}S[Ȧ>͑]JWI_=OJ*:/qZwr+$˃R,7 :`Y@ <6yG#IE.;`:p5(\W*s&^ۘ·˻5=iuc=6a|؝ԙd2dJ(`|X؆}4 oBG,3 ~x|@˛%ag(g0rY( Gu@ry1{$(!uyz^6@odן]Xh,u;ظ|+bU3 e;܊ B3&X!ӷ<;yH)ռWy\IWoSX@Xd+ g80M%xb;=%1Bec sǩ6bCͭ%IZ0;n&Wpc!Gko *CX v\XI *iŨтMMs8/(8:BL 75gG֭%cTGN,WxvSx.rZ :%\BPs܋fwH8@/ӱI:KSC ʪi %[> Ram0TP b LdZG%kEd?FH]Y䪀 [-:ΰgM]/EiMJCަ.}b}FPTgI4H)W({ƛ\ezk7!P0nSs{WT-z?b 9pʌ=7\uU9e_b}[OZ\>\yAcZí)MjF{ E46`9!,~eyO%"Gf0?}۷8UodxӘQoZ :}KȼNW wfa1ҁOڂ8>Lv[ o[]2Cj%׊2Y_L K N>}*~6%֤^؞f8—l>+m-Wمⓛja5dn='M*4ߚ1d#,KxcrW/TtonZL)Ҁ:XO>ߢRj ڮ^н%]]ulɘp9`މļfv"yO3SNа 3}y K?H *]*I[!gd&.kޕQi=Ѐ.7AYtoҬzBn9Unς5ZCוqĭJq%M0̄j^Ǡ,[VO/ "BZrk$`1KparrYӞsr3%4=ВM|&Slj߳ 5(E^My_ 0 \@Yp^URI׬s'|шcT \ո}=WʶY0nKqhb55anyʲajhai 0-s۪탭Kf7+G˚,Qz#\~":0f%k9LzO4`t",4}@\scd0=zam7O4p6tCaS8*wLawY{&5){IzW\%~F>pbIk ꉫ6n9XK+m]UImwEP\\qzdErQRʨA®IτnFA3n>s!s!+ gw ҳ63#YkT,dC4a_ vKAmbڗ L Û<kM8 j cϪ.qnw(p[RkCҐMrCknHlo -Vf9"nUDH8/XM6^r5Me-ir'/@q0ؾ>+Zbt^7fv|h¼o÷[jaxrWõ@B @B ^t  CH(_޺Lmhɻ8:ӓM_Y# L]3[7FNNjUSג^?3.i GAׯP 8 pN]cx.iFS2-7 ҳ63#YkT,dC4a_ vKAmbڗ L Û<kM8 j cϪ.qnw(p[RkCPx T£xl9ϫB,%L/lѽ"F_c7cw#_,EF) \02i CzXmH) ?L=/L%1 >I릹yUp#8v ͎r|I(,'79wf}~TH(ht7p|3hAU^/DeڔzCQ + M@ ~JShu]̹鍧r>{kWl4Chej}Bnu<[ A_GN_Hx٨5֘[0qnk3> $ښ]smmޠ9oiĵ2ʑ9-N Zx:bT$wYk}O_z {l ڶk%_r sUHo>QzP$@/ $SV"Rq6`)CaLXEހ^'(wg3,hdN|ЩCf<#kV>xвZ njiQ='j&uN"rw^?ΗhVgp0vV@V)Jvsr,˟!mW<  ۢz-o8Uzd 1dui s5-4k֜Z 8xmYq2~DHdنt$O)xl/>E k+HQ ^q[Qbߴe2tפ~zksە@oph֕uqPVK db` p|ov#>48sSd,ՏdDۡ @ю\DŽJF$K2ߖ5SGVۈr&c(1)'p1j "&F֏lB>5aN: }mƋq>t7l%iL,LIB\s AdPFG|T-TPGX~{w=5]t͝7`[^((gJ[/`mV8K2场c)jίֱEKpLԨA%Ծ.=)$LW./UAY\m{cJm l'ʛZ3VT>h!"j~1N)6Ƕ, :b#iW=uUG  ,ncXzh73;M`وmS| b(o.L4ΊngQJ}/KK)-:gS ?Y'T|} ;Ss7(}$~p_ey};v1?#kVϗOhf8eDZzqݯh$.Mb Huzla 8 E۴m7$bNl;Q%ĉld§o HP|fDڣ mCc^ױ5i-$  ݓ?eYR' }S53[X9תY_ s|7}hGȓ7'V1 %1 UKg"qF!8+f!ڷ@ke p">"l#h C0Sp(pPtUx"T_n]kҏ\Lszc $%;0/f U׉n[;݁5=Ì`#˛UZWFafM[.@KG'N1r0yp -a^Ӓ拭+=Ć RZBGy#atڴ:. یbZD /8)I+RUwjqü)Suȃ.f3Gh|(Bpk]z-/ŋRVʹ"+0"--`"!01҈BD3ֺ7G:Rr**|g6y?׳QaA):W/r_/S-Bh~ݓ0drÈpz[\qH%gDz7W5 X:iB sQqʌA GG -`Nv@d&k>=sKA7w)ȉ805fU:`iK B,bPh Iƾ3%ʟ(E5?|r fSϯ 9{CY=d}}MatA.ca'昵1ۅ:dy?Q#@ Y xq4}\7Ɠp7݉&m0mkX:y@t /wy:vBm,ǵx{ˉ)c u#p[d琡FC9T&Opg VGtjL2K<7\ :dpC}\H ` >8BP?ǪٝrG}B,AF0B|~T尲U@ ZY >_ufm{'<{RY}D xw|˨9c!;YFjmڕoS_KQP{28z ZE0$Vщi!#Pǐg$uQa7bv{z¥I=WL2dsU 0}'8nJ-dpdfm'pjA%7t+X5;{CP+) gg]*Y{dBUU5Mnsɽ24|:$bZ71TW-gyAκ\~l`עVsK#>R X ^!}.9US-XwƵCű8m,T"5rM̺@KزJ7ྮhGf:Mm|=0P:/RoLuo&G}"?Ce4 ^ްvKm$4   vM+ _VNgڦhh?JV;d[vs5`6ֿ]_}?f}od]pwS4[SSH"փ6o͹B]&@i 1~7dl(:H~ti>DgΝbM<2jդb˖}Ϧ5խ$ ʄχ3;?MF'0*)Rc_s_qJ2з7Di'ݤ,pd&!?@X}kSw3$^8~Fy'uGH;A*X[Qp#+ ϴ1ĺlέ1Keξ0ci\RkȦ4xʣH Q Yۖ*|M갨z|p]yH4/8x#5 _IlP@XIStc iE6} Diw}k]P V7ZfE-%s3ۊGK+?&EOe) ~=>38CU&^yQaU)hI?pV0b[WSHNfh1J0fأ/t "ÄN1 Y +/N.d _LZR"1U_d7Kan贋=Y彼V!(= $2a$qԶ^D'ʝ"ե&).zP%k.JwJ0i]!)}WUs5ĒZ OQ >37ׄ:Dl J h~ )ñ'V^WX* ؝|7ltvg ~.Zh*\(˨H) `$ Kwkq,ELC3`aqOxZȺϸ#F}d'Sp-͒~Y@&xGN1 7>b'n[^c4 iu+یG92|; K8!3=O:ӼnbKzq&{ȵQX{%lM3oRVg_@G{08Έ ~N7Rd`z.ArJz*{E} M/KXH H(#)4&1zo#eUuuBkgjvNM²l>ڛ֯A#{T@~źn?Z%(aƌj2,\koIJdoј ͜=G U?om 9UGnuϫf;Mװ#z+WOԓ<+̾ɇIξKv^e2v`pVۍO8lIڢѪ*(:lsq'it0,hǕ˥ilBiιNƞ#g}SA[b.' zʨSX5[pZը"r4re vCc$ $I$EAg(=i8wyF3N y40'q,&6t8dnb`ՒDCt~ٮU0x-d,t_ɡ !Ԇ+P-p]uݎupx",r҇ף¹yI|]H($Rhh䩎 r k2 's8{!@eGd([*!_%#5e]8+3fue "Qrw.h{>T2r׃?Y±o.Lq}:c?rtw^An; &e\gwhjmST,_ڭEulB>#<Ds?R(O[C H5:mV7Ŭ,1\fb̫^orXϹ\s// 7UT<\nA ׌Zt$wU86l]Um؏ ɅIAD~RVEAQC}K9f9C׎#95\YDH>=j޲q8;>TIQNir-6GTi" SB*ZPRA 8*:^X}\KIC)Q3qLYaq>ϛ0IdAOq:cM3Pp>oAm&߰ xY69ޫ'ia=@.ne&\Dd\wSClh7 j޶QayT'zwV|$E(Fv%X[(Cjwcl6qp'̋bHm|yW1 'W2x]Lkz(JH;'R3guAv>JJ"28.C)Y^ XF1iRb#meFfY_D;$F. `+nIa({s>9cRͺz=׎kd nff8GmȐ D.Ñ\IYEhF~e+Vz"oJ'iC(Ma@\I#keLPi#J*ߥ;軹`~c1G}B^ QYFG&gV)-rJeuvBɮ?oL{=a[&eIS1EZ@KUYJs@9wA"QZz߆2dY0h9 8HJt1TR6r<~IQB6Ņ/ .FсEzM. 5G==}V [smkWZd>{fFf:LI+nJ<)j_9 ZwLJK|u`J)՚Z}a*ݎ(봘U?S S#e[ +ëdR㟷$ qOqQXǯ笧};+P>H#1Gf^E(h j9,K vow.q[?Rl~Yhyy :j3w)gL}T%|UF`i-%q>Z?8l/TFflvժXkЃL<(ړ7/~g yN@W(Z`K|,`?V曹q-Z*ڵÂ@k VYB↰* V2(P/281j&- Ђ]L" \Glk,10 {a`Z{$ֶDj%ا|t1m&Mokk[} ΏR ] 5 *UKd5{р`rff NH4(װw}~~όv* 2vPl^'95.:YX]u0GS 2Ax$6TWpT : P;U-ό! CiGH1.;ekEHU!wͷR[? ~jn?jgYVM7G ssxF_ ' 6`52,k<^ipz  @ q+7]#ُpe&ƒZVw/Q랃$?jLJ[3rN)9|8Tlrhmጟ:xqUh3ꐯ N&zXYUOA1\NdUb"oŞV7\Hm x92/,t1}D Cm$PUgK:l얩̀r*Dhz 7)P gO>$+^)1{QjtxD+YAaς/F/\-`kcY]hKi<3px9kDH 6k ;:i _[ 2/:O9@p:A" J0r0=~"eim /"q`Eo9=2sv*šGf օŧ{u6# k&o`T+`Rt>1Kc^Slix9^' ,0* Ra(<'PhNj>M`m4 V`AN%'JĶJԆb~!@;ݎ#YvDeci 9/ Z]n7]ÐӠ&*Ùt3pgWI)7v+WbIC:u us]϶W^}ZIivËDNyi^lwS\VGú@Zպ.lXa_zMrIaLz(,ɣ9x0y4~4@$i62P3 {L(\3'Xșxh7udDov߀ ިH *ofZ>ؓ3H?ڈ?6YjQ"! q6sg<侹'WH9Nu:`)vX)'Ug?mK5ԃ|8/A;pJxT{%ʡ*"6|I';JӨA@5E/n/ v6`DdPBF,Iq̂c7$eɂ<7HV~l'MSG$@7(6廬qEyT_}ubk= )!s򩟧-P]V eZu,_D+kryĀ{ρQn  j?-k](f]R@/"'UIidQA)&vMO]e]7jQQ)}<;U<78~LaDV0~~`cW+p6h?ygss Xrʔ3e&/Vk c매qѪ=6dCjm4~݈zfoU݋tX疕PiA 6lMY E?l m.}q\sZ #ƕU0v7CMC^wL=R#l.$8ϼo4ͶM*$^Y2^ !Z2j.ƼWd61Rb>ϝQw5 9@{#7u{2Ц?SԜ)RAldF~o\3K9Dh\E?#-x6-%޶GRÆՄ 6cg%ha͚ۙ8N<$U70f.p(w,5Z@Q"dž~MXg{luks|obN-z))0Jp!N9?njv*q Iȇ:c?4?,H;zkl,˛.usB 9PFn9N4F7hytORW5WwFDӎ-`H м3*1eQ=q#͘&HTW?`;k*C &$')/]erni,)YOȎIbn`]X1qLL9_фF;X dq13͛ W3o GEYAq`7l8WAf'ֿ4 (ګa<@`J !ԫcFfa| 弎7L-v[Hٽخ|K6lmόVqn)٩>(i.29mK'|jz r\TU@R`x w`>|8FHw++W?PijU OVRn; ڊcĘh͉ #΄I4g @= / Mv\/jkM)ОȎyw0iJK([G$7,)xK+|W]9 nC %N znOkA?(V5\w&L^jNgf9iQ.6 bv)+mtʕ|hn^5ԝ>li<3px9kDH 6%#k6fRo*cApw+u?Pl@ 3p6cu9K7*𐵠:-8:&+w3l jn7: j֠sJ%yلa:R lAdž(/|D B1v2>1KifQ hD$ʍ,0(m&BP`Kץ7Z,ۙ(Ȳa$U7b[@񃰸^nԠIpŗx==x:}ɢ8)n@\5gsn!N [%иfU5 :`⼽a^cJ™tt=D4N\|ԐSP~gbT!,̣QA  ;:^rTy)9%DS*KؓG !^l~F3H?ڈ?6YjQ"! q6sg<侹'WH9Nu}DtV͟גQӌE;N!ZM[F=,s er6U&+:t^֜q6K2= um"dSkx>ਔ4j+ʚ>m($XG"RpF].DGTBWl.9*y[@jL@g/{ ʍ:ʝFu_/ć򩟧-P]V eZu,_D+kryĀ{ρQnȹ<$>kVꋯ\tzKΩh [dH4x SXrj;Ɋ*_œ  |8DL6NЛ@"T⹽޾ p JwlSmW+p6h?ygss5J h kbK;f<Ȣ5Gܗ(mI>p?Qe_Q87+wΊT.t*#&В뻟3s5K3sVo"8%o!N.@(e.dlł/"6ǹCʿ&$f{VTV4ezQAd7>hD= V#N mX-Qѽ%8w/ȤWr.{qT/nNWݼ?N:(oçMʋx2[S7^dcx|Cc@e-!Ǒ} tkin=s{ar7'BOØ'I_vkCO~Yf.*Q%r&[OluOؠIxd3+/Z;jul6XQ;:-֭Xڲ{g}E:ixf#[HsQ%[0UU&4ݢē tÌSmEECxF&yt_>4U/&K TC FE Cl\p7v 9uk侫'P.OW3I2wklg/9C{O w1Xp2.DHeu-/ Ą E[, _މz睇z>Jc6 yX.N `rg=K BB\~_; vRbD,%8O2GBQ}6_YĸHK?T@xU!4yV UNU^;pbBsҪJ= 6=rxqn# d@Ap zпQcV+ۧr,##6C'6ql&e@5dL^@qrK@hD_X4g6IV?/S7vI|QRnxQ;E| +}߉oW8O:@`I'VSΗ@4X)!'~=+Y(A dy82i=+@VY_lkkE6XtF*ƚ I,t)pCb:m_,gu$e^N2-j;o:KPV}85;x8x< /aMNvXJ}F{]RC_o`dQѷ"~(OKefQ;?uSO D9aȕ1 8Ì7_;۝mPӯ!6\*cuf!*#ްO3s b[wN ]GrMf KG=JLfq+s*տOȣҷ+VۼKoS[F@T6ESރzQQf#5ZQ$,p ~^0s Իsk2p+Q@#pC':5@pPrƛpG`6}b#_2(Cxpݧ" %n7m`l~W\x U o&zo#oA!"D*j(װ\p?F#.'́PMIphEvJVҁy?0ɎW7plx'TB~ýM*^ѥ9RYa%^w2j2sӜζWlsvIו25zYC.rSKʘP9{}1Cw~ NP[@6&Ip>8YfoJd7ZVLL>ugIi!q`'j?b Pj{|-RG;,A7G9d} {L Cye<ÞNp>rF(NDn:H+ Zuu$iyyCh^I7LZΔ"]x9E`Rʠzz#{xTo~&4!Y ok~CaWG?b2LG?)H9,l:1L0t̑ZZaz'1+Ĩ tsY8?"o7e{q>F(ۏcq3#;mL$֍N ,-*^(d$;@N#/̨Tuy$@qk=sX^}fȫGHAohx>(0{@b0 w$ѽ4?EyC&kihŢ2ʣ*jPsIhtY)Ӥ3~re8nc Z!ͧZ~2GPi+"{JCfQ閭 !f H|LTQmo܂-Y^>O3STZϡ^55qƔX?Zò[0)ca:=hr⊨([bYV?a'hEaoǭe@&>Iksۧ 4nQ- Hċ?NG!bkqkжy9ǨRi2Lv{cO4& H= >0y̑ cm蓁fNH,9@p!r<*^Mƫ?`f׷8@nQtHVIJ ^h"DNO6Mb3}v_|Gb } 8ֆllbv @#^`\Q8Hm{} 4*:aNJ;uⴕ4*Z PXL].L2%ƨjXȃR5 YKwnoUW}aJG8x=D" R0%t^}u9*14>jsiՌwJlc/$$wnT;B҄Ɠ1e9p93/k282>~QpgӥkXhI>H3-t&tlB\<_;hS2Wߪ(3?ģ}} ]﭅CFg YfQv$1y&*Mb0=ہqicnV Bffdesmume-0.9.9/src/cocoa/build_dmg.sh0000644000175000017500000000242612140261603020056 0ustar guillaumeguillaume# Copyright 2006 Guillaume Duhamel # Copyright 2006 Lawrence Sebald # Copyright 2007 Anders Montonen # # This file is part of Yabause. # # Yabause 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. # # Yabause 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 Yabause; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA hdiutil create -megabytes 20 tmp.dmg -layout NONE -fs HFS+ -volname DeSmuME -ov tmp=`hdid tmp.dmg` disk=`echo $tmp | cut -f 1 -d\ ` cp -R build/Release/DeSmuME.app /Volumes/DeSmuME/ cp ../../ChangeLog /Volumes/DeSmuME/ cp ../../README /Volumes/DeSmuME/ cp ../../README.MAC /Volumes/DeSmuME/ cp ../../AUTHORS /Volumes/DeSmuME/ cp ../../COPYING /Volumes/DeSmuME/ hdiutil eject $disk hdiutil convert -format UDZO tmp.dmg -o DeSmuME.dmg rm tmp.dmg desmume-0.9.9/src/cocoa/cocoa_globals.h0000644000175000017500000005113012140261603020530 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #define STRING_DESMUME_WEBSITE "http://desmume.org" #define STRING_DESMUME_SHORT_DESCRIPTION "Nintendo DS Emulator" #define STRING_DESMUME_FORUM_SITE "http://forums.desmume.org/index.php" #define STRING_DESMUME_TECH_SUPPORT_SITE "http://forums.desmume.org/viewforum.php?id=4" #define STRING_DESMUME_BUG_REPORT_SITE "http://sourceforge.net/tracker/?group_id=164579&atid=832291" // User Interface Localized Strings #define NSSTRING_TITLE_OPEN_ROM_PANEL NSLocalizedString(@"Open ROM", nil) #define NSSTRING_TITLE_OPEN_STATE_FILE_PANEL NSLocalizedString(@"Open State File", nil) #define NSSTRING_TITLE_SAVE_STATE_FILE_PANEL NSLocalizedString(@"Save State File", nil) #define NSSTRING_TITLE_IMPORT_ROM_SAVE_PANEL NSLocalizedString(@"Import ROM Save File", nil) #define NSSTRING_TITLE_EXPORT_ROM_SAVE_PANEL NSLocalizedString(@"Export ROM Save File", nil) #define NSSTRING_TITLE_SELECT_ROM_PANEL NSLocalizedString(@"Select ROM", nil) #define NSSTRING_TITLE_SELECT_ADVANSCENE_DB_PANEL NSLocalizedString(@"Select ADVANsCEne Database", nil) #define NSSTRING_TITLE_SELECT_R4_CHEAT_DB_PANEL NSLocalizedString(@"Select R4 Cheat Database", nil) #define NSSTRING_TITLE_SELECT_ARM7_IMAGE_PANEL NSLocalizedString(@"Select ARM7 BIOS Image", nil) #define NSSTRING_TITLE_SELECT_ARM9_IMAGE_PANEL NSLocalizedString(@"Select ARM9 BIOS Image", nil) #define NSSTRING_TITLE_SELECT_FIRMWARE_IMAGE_PANEL NSLocalizedString(@"Select Firmware Image", nil) #define NSSTRING_TITLE_SAVE_SCREENSHOT_PANEL NSLocalizedString(@"Save Screenshot", nil) #define NSSTRING_TITLE_EXECUTE_CONTROL NSLocalizedString(@"Execute", nil) #define NSSTRING_TITLE_PAUSE_CONTROL NSLocalizedString(@"Pause", nil) #define NSSTRING_TITLE_DISABLE_SPEED_LIMIT NSLocalizedString(@"Disable Speed Limit", nil) #define NSSTRING_TITLE_ENABLE_SPEED_LIMIT NSLocalizedString(@"Enable Speed Limit", nil) #define NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP NSLocalizedString(@"Disable Auto Frame Skip", nil) #define NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP NSLocalizedString(@"Enable Auto Frame Skip", nil) #define NSSTRING_TITLE_DISABLE_CHEATS NSLocalizedString(@"Disable Cheats", nil) #define NSSTRING_TITLE_ENABLE_CHEATS NSLocalizedString(@"Enable Cheats", nil) #define NSSTRING_TITLE_DISABLE_HUD NSLocalizedString(@"Disable HUD", nil) #define NSSTRING_TITLE_ENABLE_HUD NSLocalizedString(@"Enable HUD", nil) #define NSSTRING_TITLE_HIDE_STATUS_BAR NSLocalizedString(@"Hide Status Bar", nil) #define NSSTRING_TITLE_SHOW_STATUS_BAR NSLocalizedString(@"Show Status Bar", nil) #define NSSTRING_TITLE_HIDE_TOOLBAR NSLocalizedString(@"Hide Toolbar", nil) #define NSSTRING_TITLE_SHOW_TOOLBAR NSLocalizedString(@"Show Toolbar", nil) #define NSSTRING_TITLE_SPEED_1X NSLocalizedString(@"Speed 1x", nil) #define NSSTRING_TITLE_SPEED_2X NSLocalizedString(@"Speed 2x", nil) #define NSSTRING_TITLE_SLOT_NUMBER NSLocalizedString(@"Slot %ld", nil) #define NSSTRING_TITLE_TECH_SUPPORT_WINDOW_TITLE NSLocalizedString(@"Support Request Form", nil) #define NSSTRING_TITLE_BUG_REPORT_WINDOW_TITLE NSLocalizedString(@"Bug Report Form", nil) #define NSSTRING_TITLE_GO_TECH_SUPPORT_WEBPAGE_TITLE NSLocalizedString(@"Go to Tech Support Webpage", nil) #define NSSTRING_TITLE_GO_BUG_REPORT_WEBPAGE_TITLE NSLocalizedString(@"Go to Bug Report Webpage", nil) #define NSSTRING_HELP_COPY_PASTE_TECH_SUPPORT NSLocalizedString(@"Please copy-paste the above information into our tech support webpage. This will ensure the fastest response time from us.", nil) #define NSSTRING_HELP_COPY_PASTE_BUG_REPORT NSLocalizedString(@"Please copy-paste the above information into our bug report webpage. This will ensure the fastest response time from us.", nil) #define NSSTRING_ALERT_CRITICAL_FILE_MISSING_PRI NSLocalizedString(@"A critical file is missing. DeSmuME will now quit.", nil) #define NSSTRING_ALERT_CRITICAL_FILE_MISSING_SEC NSLocalizedString(@"The file \"DefaultUserPrefs.plist\" is missing. Please reinstall DeSmuME.", nil) #define NSSTRING_STATUS_READY NSLocalizedString(@"Ready.", nil) #define NSSTRING_STATUS_SAVESTATE_LOADING_FAILED NSLocalizedString(@"Save state file loading failed!", nil) #define NSSTRING_STATUS_SAVESTATE_LOADED NSLocalizedString(@"Save state file loaded.", nil) #define NSSTRING_STATUS_SAVESTATE_SAVING_FAILED NSLocalizedString(@"Save state file saving failed!", nil) #define NSSTRING_STATUS_SAVESTATE_SAVED NSLocalizedString(@"Save state file saved.", nil) #define NSSTRING_STATUS_SAVESTATE_REVERTING_FAILED NSLocalizedString(@"Save state file reverting failed!", nil) #define NSSTRING_STATUS_SAVESTATE_REVERTED NSLocalizedString(@"Save state file reverted.", nil) #define NSSTRING_STATUS_ROM_SAVE_IMPORT_FAILED NSLocalizedString(@"ROM save file import failed!", nil) #define NSSTRING_STATUS_ROM_SAVE_IMPORTED NSLocalizedString(@"ROM save file imported.", nil) #define NSSTRING_STATUS_ROM_SAVE_EXPORT_FAILED NSLocalizedString(@"ROM save file export failed!", nil) #define NSSTRING_STATUS_ROM_SAVE_EXPORTED NSLocalizedString(@"ROM save file exported.", nil) #define NSSTRING_STATUS_ROM_LOADING NSLocalizedString(@"Loading ROM...", nil) #define NSSTRING_STATUS_ROM_LOADING_FAILED NSLocalizedString(@"ROM loading failed!", nil) #define NSSTRING_STATUS_ROM_LOADED NSLocalizedString(@"ROM loaded.", nil) #define NSSTRING_STATUS_ROM_UNLOADING NSLocalizedString(@"Unloading ROM...", nil) #define NSSTRING_STATUS_ROM_UNLOADED NSLocalizedString(@"ROM unloaded.", nil) #define NSSTRING_STATUS_EMULATOR_RESETTING NSLocalizedString(@"Emulator resetting...", nil) #define NSSTRING_STATUS_EMULATOR_RESET NSLocalizedString(@"Emulator reset.", nil) #define NSSTRING_STATUS_CANNOT_GENERATE_SAVE_PATH NSLocalizedString(@"Cannot generate the save file path!", nil) #define NSSTRING_STATUS_CANNOT_CREATE_SAVE_DIRECTORY NSLocalizedString(@"Cannot create the save directory!", nil) #define NSSTRING_STATUS_SPEED_LIMIT_DISABLED NSLocalizedString(@"Speed limit disabled.", nil) #define NSSTRING_STATUS_SPEED_LIMIT_ENABLED NSLocalizedString(@"Speed limit enabled.", nil) #define NSSTRING_STATUS_AUTO_FRAME_SKIP_DISABLED NSLocalizedString(@"Auto frame skip disabled.", nil) #define NSSTRING_STATUS_AUTO_FRAME_SKIP_ENABLED NSLocalizedString(@"Auto frame skip enabled.", nil) #define NSSTRING_STATUS_CHEATS_DISABLED NSLocalizedString(@"Cheats disabled.", nil) #define NSSTRING_STATUS_CHEATS_ENABLED NSLocalizedString(@"Cheats enabled.", nil) #define NSSTRING_STATUS_HUD_DISABLED NSLocalizedString(@"HUD disabled.", nil) #define NSSTRING_STATUS_HUD_ENABLED NSLocalizedString(@"HUD enabled.", nil) #define NSSTRING_STATUS_VOLUME NSLocalizedString(@"Volume: %1.1f%%", nil) #define NSSTRING_STATUS_NO_ROM_LOADED NSLocalizedString(@"No ROM loaded.", nil) #define NSSTRING_STATUS_SIZE_BYTES NSLocalizedString(@"%i bytes", nil) #define NSSTRING_STATUS_EMULATION_NOT_RUNNING NSLocalizedString(@"Emulation is not running.", nil) #define NSSTRING_STATUS_SLOT1_UNKNOWN_STATE NSLocalizedString(@"Unknown state.", nil) #define NSSTRING_STATUS_SLOT1_NO_DEVICE NSLocalizedString(@"No device inserted.", nil) #define NSSTRING_STATUS_SLOT1_RETAIL_INSERTED NSLocalizedString(@"Retail cartridge inserted.", nil) #define NSSTRING_STATUS_SLOT1_RETAIL_NAND_INSERTED NSLocalizedString(@"Retail cartridge (with NAND flash) inserted.", nil) #define NSSTRING_STATUS_SLOT1_R4_INSERTED NSLocalizedString(@"R4 cartridge interface inserted.", nil) #define NSSTRING_DISPLAYMODE_MAIN NSLocalizedString(@"Main", nil) #define NSSTRING_DISPLAYMODE_TOUCH NSLocalizedString(@"Touch", nil) #define NSSTRING_DISPLAYMODE_COMBO NSLocalizedString(@"Combo", nil) #define NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED NSLocalizedString(@"%ld Input Mapped", nil) #define NSSTRING_INPUTPREF_NUM_INPUTS_MAPPED_PLURAL NSLocalizedString(@"%ld Inputs Mapped", nil) #define NSSTRING_INPUTPREF_NO_SAVED_PROFILES NSLocalizedString(@"No saved profiles.", nil) #define NSSTRING_INPUTPREF_USE_DEVICE_COORDINATES NSLocalizedString(@"Use Device Coordinates", nil) #define NSSTRING_INPUTPREF_MIC_NONE NSLocalizedString(@"None", nil) #define NSSTRING_INPUTPREF_MIC_INTERNAL_NOISE NSLocalizedString(@"Internal Noise Samples", nil) #define NSSTRING_INPUTPREF_MIC_AUDIO_FILE_NONE_SELECTED NSLocalizedString(@"No audio file selected.", nil) #define NSSTRING_INPUTPREF_MIC_WHITE_NOISE NSLocalizedString(@"White Noise", nil) #define NSSTRING_INPUTPREF_MIC_SINE_WAVE NSLocalizedString(@"%1.1f Hz Sine Wave", nil) #define NSSTRING_INPUTPREF_SPEED_SCALAR NSLocalizedString(@"%1.2fx Speed", nil) #define NSSTRING_INPUTPREF_GPU_STATE_ALL_MAIN NSLocalizedString(@"Main GPU - All Layers", nil) #define NSSTRING_INPUTPREF_GPU_STATE_ALL_SUB NSLocalizedString(@"Sub GPU - All Layers", nil) // LEGACY STRINGS #define NSSTRING_TITLE_OPEN_ROM_PANEL_LEGACY NSLocalizedString(@"Open ROM...", nil) #define NSSTRING_TITLE_OPEN_STATE_FILE_PANEL_LEGACY NSLocalizedString(@"Load State From...", nil) #define NSSTRING_TITLE_SAVE_STATE_FILE_PANEL_LEGACY NSLocalizedString(@"Save State...", nil) #define NSSTRING_STATUS_ROM_UNLOADED_LEGACY NSLocalizedString(@"No ROM Loaded", nil) #define NSSTRING_STATUS_ROM_LOADED_LEGACY NSLocalizedString(@"ROM Loaded", nil) #define NSSTRING_STATUS_ROM_LOADING_FAILED_LEGACY NSLocalizedString(@"Couldn't load ROM", nil) #define NSSTRING_STATUS_EMULATOR_EXECUTING_LEGACY NSLocalizedString(@"Emulation Executing", nil) #define NSSTRING_STATUS_EMULATOR_PAUSED_LEGACY NSLocalizedString(@"Emulation Paused", nil) #define NSSTRING_STATUS_EMULATOR_RESET_LEGACY NSLocalizedString(@"Emulation Reset", nil) #define NSSTRING_ERROR_TITLE_LEGACY NSLocalizedString(@"Error", nil) #define NSSTRING_ERROR_GENERIC_LEGACY NSLocalizedString(@"An emulation error occurred", nil) #define NSSTRING_ERROR_SCREENSHOT_FAILED_LEGACY NSLocalizedString(@"Couldn't create the screenshot image", nil) #define NSSTRING_MESSAGE_TITLE_LEGACY NSLocalizedString(@"DeSmuME Emulator", nil) #define NSSTRING_MESSAGE_ASK_CLOSE_LEGACY NSLocalizedString(@"Are you sure you want to close the ROM?", nil) #define FILENAME_README "README" #define FILENAME_COPYING "COPYING" #define FILENAME_AUTHORS "AUTHORS" #define FILENAME_CHANGELOG "ChangeLog" #define PATH_CONFIG_DIRECTORY_0_9_6 "~/.config/desmume" #define PATH_USER_APP_SUPPORT "${APPSUPPORT}" #define PATH_OPEN_EMU "${OPENEMU}" #define PATH_WITH_ROM "${WITHROM}" #define FILE_EXT_FIRMWARE_CONFIG "dfc" #define FILE_EXT_SAVE_STATE "dst" #define FILE_EXT_ROM_SAVE "dsv" #define FILE_EXT_CHEAT "dct" #define FILE_EXT_ROM_SAVE_NOGBA "sav*" #define FILE_EXT_ROM_SAVE_RAW "sav" #define FILE_EXT_ACTION_REPLAY_SAVE "duc" #define FILE_EXT_ROM_DS "nds" #define FILE_EXT_ROM_GBA "ds.gba" #define FILE_EXT_HW_IMAGE_FILE "bin" #define FILE_EXT_ADVANSCENE_DB "xml" #define FILE_EXT_R4_CHEAT_DB "dat" #define MAX_SAVESTATE_SLOTS 10 #define MAX_VOLUME 100.0f #define MAX_BRIGHTNESS 100.0f #define CHEAT_DESCRIPTION_LENGTH 1024 #define GPU_DISPLAY_WIDTH 256 #define GPU_DISPLAY_HEIGHT 192 #define GPU_DISPLAY_COLOR_DEPTH sizeof(UInt16) #define GPU_SCREEN_SIZE_BYTES (GPU_DISPLAY_WIDTH * GPU_DISPLAY_HEIGHT * GPU_DISPLAY_COLOR_DEPTH) // The numbers are: 256px width, 192px height, 16bit color depth #define DS_DISPLAY_VERTICAL_GAP_TO_HEIGHT_RATIO (21.0/46.0) // Based on the official DS specification: 21mm/46mm #define DS_DISPLAY_GAP (GPU_DISPLAY_HEIGHT * DS_DISPLAY_VERTICAL_GAP_TO_HEIGHT_RATIO) #define WINDOW_STATUS_BAR_HEIGHT 24 // Height of an emulation window status bar in pixels. #define SPEED_SCALAR_QUARTER 0.25 // Speed scalar for quarter execution speed. #define SPEED_SCALAR_HALF 0.5 // Speed scalar for half execution speed. #define SPEED_SCALAR_THREE_QUARTER 0.75 // Speed scalar for three quarters execution speed. #define SPEED_SCALAR_NORMAL 1.0 // Speed scalar for normal execution speed. #define SPEED_SCALAR_DOUBLE 2.0 // Speed scalar for double execution speed. #define SPEED_SCALAR_MIN 0.005 // Lower limit for the speed multiplier. #define DS_FRAMES_PER_SECOND 59.8261 // Number of DS frames per second. #define DS_SECONDS_PER_FRAME (1.0 / DS_FRAMES_PER_SECOND) // The length of time in seconds that, ideally, a frame should be processed within. #define FRAME_SKIP_AGGRESSIVENESS 10.0 // Must be a value between 0.0 (inclusive) and positive infinity. // This value acts as a scalar multiple of the frame skip. #define FRAME_SKIP_SMOOTHNESS 0.90 // Must be a value between 0.00 (inclusive) and 1.00 (exclusive). // Values closer to 0.00 give better video smoothness, but makes the emulation timing more "jumpy." // Values closer to 1.00 makes the emulation timing more accurate, but makes the video look more "choppy." #define FRAME_SKIP_BIAS 0.5 // May be any real number. This value acts as a vector addition to the frame skip. #define MAX_FRAME_SKIP (DS_FRAMES_PER_SECOND / 3.0) #define SPU_SAMPLE_RATE 44100.0 // Samples per second #define SPU_SAMPLE_RESOLUTION 16 // Bits per sample; must be a multiple of 8 #define SPU_NUMBER_CHANNELS 2 // Number of channels #define SPU_SAMPLE_SIZE ((SPU_SAMPLE_RESOLUTION / 8) * SPU_NUMBER_CHANNELS) // Bytes per sample, multiplied by the number of channels #define SPU_BUFFER_BYTES ((SPU_SAMPLE_RATE / DS_FRAMES_PER_SECOND) * SPU_SAMPLE_SIZE) // Note that this value may be returned as floating point #define CLOCKWISE_DEGREES(x) (360.0 - x) // Converts an angle in degrees from normal-direction to clockwise-direction. #define VOLUME_THRESHOLD_LOW 35.0f #define VOLUME_THRESHOLD_HIGH 75.0f #define ROM_ICON_WIDTH 32 #define ROM_ICON_HEIGHT 32 #define ROMINFO_GAME_TITLE_LENGTH 12 #define ROMINFO_GAME_CODE_LENGTH 4 #define ROMINFO_GAME_BANNER_LENGTH 128 #define MIC_SAMPLE_RATE 16000 #define MIC_MAX_BUFFER_SAMPLES (MIC_SAMPLE_RATE / DS_FRAMES_PER_SECOND) #define COCOA_DIALOG_CANCEL 0 #define COCOA_DIALOG_DEFAULT 1 #define COCOA_DIALOG_OK 1 #define COCOA_DIALOG_OPTION 2 enum { ROMAUTOLOADOPTION_LOAD_LAST = 0, ROMAUTOLOADOPTION_LOAD_SELECTED = 1 }; enum { REASONFORCLOSE_NORMAL = 0, REASONFORCLOSE_OPEN, REASONFORCLOSE_TERMINATE }; enum { ROMSAVEFORMAT_DESMUME = 0, ROMSAVEFORMAT_NOGBA = 1, ROMSAVEFORMAT_RAW = 2 }; enum { ROMSAVETYPE_AUTOMATIC = 0 }; enum { EMULATION_ENSATA_BIT = 0, EMULATION_ADVANCED_BUS_LEVEL_TIMING_BIT = 1, EMULATION_USE_EXTERNAL_BIOS_BIT = 2, EMULATION_BIOS_SWI_BIT = 3, EMULATION_PATCH_DELAY_LOOP_BIT = 4, EMULATION_USE_EXTERNAL_FIRMWARE_BIT = 5, EMULATION_BOOT_FROM_FIRMWARE_BIT = 6, EMULATION_SLEEP_BIT = 7, EMULATION_CARD_EJECT_BIT = 8, EMULATION_DEBUG_CONSOLE_BIT = 9, EMULATION_RIGOROUS_TIMING_BIT = 10 }; enum { EMULATION_ENSATA_MASK = 1 << EMULATION_ENSATA_BIT, EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK = 1 << EMULATION_ADVANCED_BUS_LEVEL_TIMING_BIT, EMULATION_USE_EXTERNAL_BIOS_MASK = 1 << EMULATION_USE_EXTERNAL_BIOS_BIT, EMULATION_BIOS_SWI_MASK = 1 << EMULATION_BIOS_SWI_BIT, EMULATION_PATCH_DELAY_LOOP_MASK = 1 << EMULATION_PATCH_DELAY_LOOP_BIT, EMULATION_USE_EXTERNAL_FIRMWARE_MASK = 1 << EMULATION_USE_EXTERNAL_FIRMWARE_BIT, EMULATION_BOOT_FROM_FIRMWARE_MASK = 1 << EMULATION_BOOT_FROM_FIRMWARE_BIT, EMULATION_SLEEP_MASK = 1 << EMULATION_SLEEP_BIT, EMULATION_CARD_EJECT_MASK = 1 << EMULATION_CARD_EJECT_BIT, EMULATION_DEBUG_CONSOLE_MASK = 1 << EMULATION_DEBUG_CONSOLE_BIT, EMULATION_RIGOROUS_TIMING_MASK = 1 << EMULATION_RIGOROUS_TIMING_BIT }; enum { CPU_EMULATION_ENGINE_INTERPRETER = 0, CPU_EMULATION_ENGINE_DYNAMIC_RECOMPILER = 1 }; enum { GPUSTATE_MAIN_GPU_BIT = 0, GPUSTATE_MAIN_BG0_BIT = 1, GPUSTATE_MAIN_BG1_BIT = 2, GPUSTATE_MAIN_BG2_BIT = 3, GPUSTATE_MAIN_BG3_BIT = 4, GPUSTATE_MAIN_OBJ_BIT = 5, GPUSTATE_SUB_GPU_BIT = 6, GPUSTATE_SUB_BG0_BIT = 7, GPUSTATE_SUB_BG1_BIT = 8, GPUSTATE_SUB_BG2_BIT = 9, GPUSTATE_SUB_BG3_BIT = 10, GPUSTATE_SUB_OBJ_BIT = 11 }; enum { GPUSTATE_MAIN_GPU_MASK = 1 << GPUSTATE_MAIN_GPU_BIT, GPUSTATE_MAIN_BG0_MASK = 1 << GPUSTATE_MAIN_BG0_BIT, GPUSTATE_MAIN_BG1_MASK = 1 << GPUSTATE_MAIN_BG1_BIT, GPUSTATE_MAIN_BG2_MASK = 1 << GPUSTATE_MAIN_BG2_BIT, GPUSTATE_MAIN_BG3_MASK = 1 << GPUSTATE_MAIN_BG3_BIT, GPUSTATE_MAIN_OBJ_MASK = 1 << GPUSTATE_MAIN_OBJ_BIT, GPUSTATE_SUB_GPU_MASK = 1 << GPUSTATE_SUB_GPU_BIT, GPUSTATE_SUB_BG0_MASK = 1 << GPUSTATE_SUB_BG0_BIT, GPUSTATE_SUB_BG1_MASK = 1 << GPUSTATE_SUB_BG1_BIT, GPUSTATE_SUB_BG2_MASK = 1 << GPUSTATE_SUB_BG2_BIT, GPUSTATE_SUB_BG3_MASK = 1 << GPUSTATE_SUB_BG3_BIT, GPUSTATE_SUB_OBJ_MASK = 1 << GPUSTATE_SUB_OBJ_BIT }; enum { SPU_SYNC_MODE_DUAL_SYNC_ASYNC = 0, SPU_SYNC_MODE_SYNCHRONOUS = 1 }; enum { SPU_SYNC_METHOD_N = 0, SPU_SYNC_METHOD_Z = 1, SPU_SYNC_METHOD_P = 2 }; enum { CHEAT_TYPE_INTERNAL = 0, CHEAT_TYPE_ACTION_REPLAY = 1, CHEAT_TYPE_CODE_BREAKER = 2 }; enum { CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE = 0, CHEATSEARCH_SEARCHSTYLE_COMPARATIVE = 1 }; enum { CHEATSEARCH_COMPARETYPE_GREATER_THAN = 0, CHEATSEARCH_COMPARETYPE_LESSER_THAN = 1, CHEATSEARCH_COMPARETYPE_EQUALS_TO = 2, CHEATSEARCH_COMPARETYPE_NOT_EQUALS_TO = 3 }; enum { CHEATSEARCH_UNSIGNED = 0, CHEATSEARCH_SIGNED = 1 }; enum { CHEATEXPORT_ERROR_FILE_NOT_FOUND = 1, CHEATEXPORT_ERROR_WRONG_FILE_FORMAT = 2, CHEATEXPORT_ERROR_SERIAL_NOT_FOUND = 3, CHEATEXPORT_ERROR_EXPORT_FAILED = 4 }; /* PORT MESSAGES */ enum { MESSAGE_CHECK_FOR_RESPONSE = 100, // Message to check if a port is responding. Usually sent to make sure that a thread is alive. MESSAGE_CHECK_RESPONSE_ECHO, // Response message when another port sends MESSAGE_CHECK_FOR_RESPONSE. Sent to confirm that a thread is indeed alive. MESSAGE_EXIT_THREAD, // Sent whenever there is a need to stop a thread. MESSAGE_EMU_FRAME_PROCESSED = 1000, // Sent whenever an emulation frame is fully processed. This is mostly used to signal outputs to update themselves based on the new emulation frame. MESSAGE_OUTPUT_FINISHED_FRAME, // Sent from an output device whenever it finishes processing the frame data. MESSAGE_SET_EMULATION_FLAGS, // Video Messages MESSAGE_RESIZE_VIEW, MESSAGE_TRANSFORM_VIEW, MESSAGE_REDRAW_VIEW, MESSAGE_SET_GPU_STATE_FLAGS, MESSAGE_CHANGE_DISPLAY_TYPE, MESSAGE_CHANGE_DISPLAY_ORIENTATION, MESSAGE_CHANGE_DISPLAY_ORDER, MESSAGE_CHANGE_DISPLAY_GAP, MESSAGE_CHANGE_BILINEAR_OUTPUT, MESSAGE_CHANGE_VERTICAL_SYNC, MESSAGE_CHANGE_VIDEO_FILTER, MESSAGE_SET_RENDER3D_METHOD, MESSAGE_SET_RENDER3D_HIGH_PRECISION_COLOR_INTERPOLATION, MESSAGE_SET_RENDER3D_EDGE_MARKING, MESSAGE_SET_RENDER3D_FOG, MESSAGE_SET_RENDER3D_TEXTURES, MESSAGE_SET_RENDER3D_DEPTH_COMPARISON_THRESHOLD, MESSAGE_SET_RENDER3D_THREADS, MESSAGE_SET_RENDER3D_LINE_HACK, MESSAGE_SET_RENDER3D_MULTISAMPLE, MESSAGE_SET_VIEW_TO_BLACK, MESSAGE_SET_VIEW_TO_WHITE, MESSAGE_SET_AUDIO_PROCESS_METHOD, MESSAGE_SET_SPU_ADVANCED_LOGIC, MESSAGE_SET_SPU_SYNC_MODE, MESSAGE_SET_SPU_SYNC_METHOD, MESSAGE_SET_SPU_INTERPOLATION_MODE, MESSAGE_SET_VOLUME, MESSAGE_REQUEST_SCREENSHOT, MESSAGE_COPY_TO_PASTEBOARD }; /* DS DISPLAY TYPES */ enum { DS_DISPLAY_TYPE_MAIN = 0, DS_DISPLAY_TYPE_TOUCH, DS_DISPLAY_TYPE_COMBO }; enum { DS_DISPLAY_ORIENTATION_VERTICAL = 0, DS_DISPLAY_ORIENTATION_HORIZONTAL }; enum { DS_DISPLAY_ORDER_MAIN_FIRST = 0, DS_DISPLAY_ORDER_TOUCH_FIRST }; /* DS GPU TYPES */ enum { DS_GPU_TYPE_MAIN = 0, DS_GPU_TYPE_SUB, DS_GPU_TYPE_COMBO }; /* COCOA DS CORE STATES */ enum { CORESTATE_EXECUTE = 0, CORESTATE_PAUSE }; /* DESMUME 3D RENDERER TYPES */ enum { CORE3DLIST_NULL = 0, CORE3DLIST_SWRASTERIZE, CORE3DLIST_OPENGL }; /* MICROPHONE MODE */ enum { MICMODE_NONE = 0, MICMODE_INTERNAL_NOISE, MICMODE_AUDIO_FILE, MICMODE_WHITE_NOISE, MICMODE_PHYSICAL, MICMODE_SINE_WAVE }; desmume-0.9.9/src/cocoa/cocoa_GPU.h0000644000175000017500000000527412140261603017550 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include #include @interface CocoaDSGPU : NSObject { UInt32 gpuStateFlags; BOOL isCPUCoreCountAuto; OSSpinLock spinlockGpuState; pthread_mutex_t *mutexProducer; } @property (assign) UInt32 gpuStateFlags; @property (assign) pthread_mutex_t *mutexProducer; @property (assign) BOOL layerMainGPU; @property (assign) BOOL layerMainBG0; @property (assign) BOOL layerMainBG1; @property (assign) BOOL layerMainBG2; @property (assign) BOOL layerMainBG3; @property (assign) BOOL layerMainOBJ; @property (assign) BOOL layerSubGPU; @property (assign) BOOL layerSubBG0; @property (assign) BOOL layerSubBG1; @property (assign) BOOL layerSubBG2; @property (assign) BOOL layerSubBG3; @property (assign) BOOL layerSubOBJ; @property (assign) NSInteger render3DRenderingEngine; @property (assign) BOOL render3DHighPrecisionColorInterpolation; @property (assign) BOOL render3DEdgeMarking; @property (assign) BOOL render3DFog; @property (assign) BOOL render3DTextures; @property (assign) NSUInteger render3DDepthComparisonThreshold; @property (assign) NSUInteger render3DThreads; @property (assign) BOOL render3DLineHack; @property (assign) BOOL render3DMultisample; - (BOOL) gpuStateByBit:(const UInt32)stateBit; - (BOOL) isGPUTypeDisplayed:(const NSInteger)theGpuType; - (void) hideGPUType:(const NSInteger)theGpuType; - (void) showGPUType:(const NSInteger)theGpuType; @end #ifdef __cplusplus extern "C" { #endif void SetGPULayerState(const int gpuType, const unsigned int i, const bool state); bool GetGPULayerState(const int gpuType, const unsigned int i); void SetGPUDisplayState(const int gpuType, const bool state); bool GetGPUDisplayState(const int gpuType); bool OSXOpenGLRendererInit(); bool OSXOpenGLRendererBegin(); void OSXOpenGLRendererEnd(); bool CreateOpenGLRenderer(); void DestroyOpenGLRenderer(); void RequestOpenGLRenderer_3_2(bool request_3_2); void SetOpenGLRendererFunctions(bool (*initFunction)(), bool (*beginOGLFunction)(), void (*endOGLFunction)()); #ifdef __cplusplus } #endif desmume-0.9.9/src/cocoa/ringbuffer.h0000644000175000017500000000270712140261603020100 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _RINGBUFFER_ #define _RINGBUFFER_ #include #include class RingBuffer { private: uint8_t *_buffer; size_t _bufferSize; size_t _elementCapacity; size_t _elementSize; int32_t _elementFillCount; // need to use int32_t for OSAtomicAdd32Barrier() size_t _readPosition; size_t _writePosition; public: RingBuffer(const size_t numberElements, const size_t newBufferElementSize); ~RingBuffer(); void clear(); size_t read(void *__restrict__ destBuffer, size_t requestedNumberElements); size_t write(const void *__restrict__ srcBuffer, size_t requestedNumberElements); size_t drop(size_t requestedNumberElements); size_t getAvailableElements() const; size_t getElementCapacity() const; size_t getElementSize() const; bool isEmpty() const; bool isFull() const; }; #endif desmume-0.9.9/src/cocoa/audiosamplegenerator.cpp0000644000175000017500000000750612140261603022516 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifdef __APPLE__ #include #include "utilities.h" #endif // __APPLE__ #include "audiosamplegenerator.h" #include #define NUM_INTERNAL_NOISE_SAMPLES 32 static const u8 noiseSample[NUM_INTERNAL_NOISE_SAMPLES] = { 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0xFF, 0xF4, 0xE1, 0xBF, 0x9A, 0x71, 0x58, 0x5B, 0x5F, 0x62, 0xC2, 0x25, 0x05, 0x01, 0x01, 0x01, 0x01 }; AudioSampleBlockGenerator::AudioSampleBlockGenerator(const u8 *audioBuffer, const size_t sampleCount) { _buffer = (u8 *)malloc(sampleCount * sizeof(u8)); _sampleCount = sampleCount; _samplePosition = 0; memcpy(_buffer, audioBuffer, _sampleCount * sizeof(u8)); } AudioSampleBlockGenerator::~AudioSampleBlockGenerator() { free(this->_buffer); this->_buffer = NULL; } u8* AudioSampleBlockGenerator::allocate(const size_t sampleCount) { if (this->_buffer != NULL) { free(this->_buffer); } this->_buffer = (u8 *)malloc(sampleCount * sizeof(u8)); this->_sampleCount = sampleCount; this->_samplePosition = 0; memset(this->_buffer, MIC_NULL_SAMPLE_VALUE, this->_sampleCount * sizeof(u8)); return this->_buffer; } u8 AudioSampleBlockGenerator::generateSample() { if (this->_samplePosition >= this->_sampleCount) { this->_samplePosition = 0; } return this->_buffer[_samplePosition++]; } u8* AudioSampleBlockGenerator::getBuffer() const { return this->_buffer; } size_t AudioSampleBlockGenerator::getSampleCount() const { return this->_sampleCount; } size_t AudioSampleBlockGenerator::getSamplePosition() const { return this->_samplePosition; } void AudioSampleBlockGenerator::setSamplePosition(size_t thePosition) { this->_samplePosition = thePosition % this->_sampleCount; } InternalNoiseGenerator::InternalNoiseGenerator() { _buffer = (u8 *)malloc(NUM_INTERNAL_NOISE_SAMPLES * sizeof(u8)); _sampleCount = NUM_INTERNAL_NOISE_SAMPLES; _samplePosition = 0; memcpy(_buffer, noiseSample, _sampleCount * sizeof(u8)); } u8 WhiteNoiseGenerator::generateSample() { #ifdef __APPLE__ #ifdef MAC_OS_X_VERSION_10_7 if (IsOSXVersionSupported(10, 7, 0)) { return (u8)(arc4random_uniform(0x00000080) & 0x7F); } return (u8)((arc4random() % 0x00000080) & 0x7F); #else return (u8)((arc4random() % 0x00000080) & 0x7F); #endif #else return (u8)(rand() & 0x7F); #endif } SineWaveGenerator::SineWaveGenerator(const double freq, const double sampleRate) { _frequency = freq; _sampleRate = sampleRate; _cyclePosition = 0.0; } u8 SineWaveGenerator::generateSample() { const u8 sampleValue = (u8)(63.0 * sin(2.0 * M_PI * this->_cyclePosition)) + MIC_NULL_SAMPLE_VALUE; this->_cyclePosition += (this->_frequency / this->_sampleRate); return sampleValue; } double SineWaveGenerator::getFrequency() const { return this->_frequency; } void SineWaveGenerator::setFrequency(double freq) { this->_frequency = freq; } double SineWaveGenerator::getSampleRate() const { return this->_sampleRate; } void SineWaveGenerator::setSampleRate(double sampleRate) { this->_sampleRate = sampleRate; } double SineWaveGenerator::getCyclePosition() const { return this->_cyclePosition; } void SineWaveGenerator::setCyclePosition(double thePosition) { this->_cyclePosition = thePosition; } desmume-0.9.9/src/cocoa/AppIcon_ROMCheats.icns0000644000175000017500000030317012140261603021650 0ustar guillaumeguillaumeicnsxis32" A0a7(.# 1H?)D_1ph4$"&NI:S)Lvk}ELMIY0>B;&Kza`c\AA9<%K||tm^RGF:2<%Htj]TLB5)-:"Qwrg_]UI?<.+9!W(ʿο~(1)Y|txvb_hh^hK.=+%&&%%-,-1.66" A0nF51%'&')0G?)EmBqg(C1.3$MJ:S)Kvn|Jac^o9=C;&LzdjmeDA9<%K||ul\PEE:2<%Htj]UMC6)-:"Qwrg_\UH?<.+9!W(ʿο~(1)Y|txvb_hh^hK.=+%&&%%-,-1.66s8mk@[TWVVVWWWWXU[D(_-il32 !%&'*(&(**+,**+*J$## PRQDABCBEGDFHHGFFEBIGDEFEFUQ^ A>8fqnpqmjplkklopszjmvroqk?>J NAXUw8W %'\xxqunz3U  ֢aDSz4V t޷x4V ":~z}ʱL?O1/#'v~sv~xnedt~{uzyvI=@."K5$"$tl:  6_rzG!U YS0+%# GC#*  e{a%BS:{D;-)&# "" U CHLZ|@>24$ \ !#OCM ;3>eIUKQ|6'T@HCAt@ACE!RR7?M ;48lf~~y!aiSMIJPR`2OK5=L :39~}i@u:&NC4=K828~}~rQQYglbX=/HE?1:4,8fqnpqmjplkklopszjmvroqk?>J NAXUw8W !%(]xxqunz3U #֢aDSz4U  u߷x4V :~z}ɱL?O30!&v~sv~xnedt~{uzyvI=C0$J3" #tm; !7_qzF"W YO.(#! GC, eza&DS;x?7)&$"U!EIKZv98-/!!\!%RCM ;3>fJQCQ|8$D4;754577"RR7?M ;48nh~~y"RWB=9;?AN. OK6=K :39~~}j:4,8fqnpqmjplkklopszjmvroqk?>J NAXUw8W "&(]xwqunz3U ףaDSz4U" t߷x4V " #&9~z}ʱL?O47(!1 v~sv~xnedt~{uzyvI=C0%R>*(/tk:!7_rzG#V ^\82-%- HC*!"ezb'CS=MC51/*')!"'#V!DIK_HG:=+!]"#&" $PC;P <"s}TBB.>A5.00,+),--Xb;@M ;9&^xle7nf{7>><77545:!"VX:>M ;3>eL[QS|8-XDLHFEEGH $RR8?M ;47mg~y$enWPMNTTb5!PK6=K :39~}jAy>)NC4=K828~}~rRR\jpf\@1HE?1:4,G ݂eڐ45)E/E,$`~b۾APͥ(%7:IHGHGK@VP bA &G]74.*)'&#$"! "  <|}~~}phP%   0  #S~}~|zywvuusqqonh7/ 4V`O?WPA/N~[OD>83.,)'&%$"! " #~}N|xjbR8     U~xzywvuusrponlh % 6LbPGAVPB/G?4e[LF>82/*+(&'$$#! #  dnbXE2'   /  'rywvutsqpnojo\ 9G\WDK@WPEH wbVJC;82.-+*)'$$"- #  'Mf[7:;-   !  Fxvvtrqponko_!9CT\GHJ@VPNoiaVKC=841-,*)(%$#"$   !! +! !!""  .trsponmkoL;?PYEFFJ@VPY =uk[SK@;9520-,+(&-%%$"! !  !"  / "#%$"!  'znpomknH;>J^JFFDI?WPKd) oj[PJD=97410-)(('(('&$#""   '&##"!!  #%!&   ?tmlmh7 #=@HUOEGGFI?VP()6HzubYPHC?<7200.++((*)((&$#"#+)&$"!"$$%   Znmg2';?FWEGHEHEJ?VP> %= xqcWPKF@?6322.+**)+,+)'%$" $-$# #  (uU& .BKP\58GGDFGI?WP 6C  zul]WSKDC?=97640.20.+% ypX. #  0'8>ENP\[77HFFECI?VPS7@7 /|sh_WSKDA@>:86312142.-(1}~@"#"!!"!##$#$#"#" !   UQB 8?=4Xoh\WOJEBB=:;83224523'P}|)$('()&'%$%&'$%$%#"$"#"" "##$#$$ GVFPTa_[W77HFEEDG>UP; 6?9>9 tylc]VMJEC@==;7754677%l|J )-,+)*)(&)(*'$&%#%$#$,#$#$%$&''%$" "\VNUchZ[V66HFFEEH>UP' 8?:8<7 }slf_XPKGC@??=;95669!(}+ /.-+,+)(+,*,+*'()'&&$&%&'''*)*)'&'$iKUah[ZZT66HEEFEI>UO5?::7:7# ~xtkbZSMIGEA)<=:98Z}~9(30//.+,.-,.-,,*+),*('(()**++,.,. 9gDfl^ZYXS66HECG>UM>5?9::98;+ nuunc]VRMLHHDCA=>39}}` #$44232/-/2201+,,-,-.-,+*-+.,.011BZFv]ZYWWQ66HECF=UO'6>89:;8;=!Fuxwkd[VSPNMJIFE1i~)~1 "3=7875315644143//020020.++-.00./04344?VYlT[WVVP66HEDG=TO$7>788:9<:)/2|uvqh_YVUTPNJI-0}O~b#/@:<:8:8::<76764323432110/14120134157568ZX]WWVTTN65GEDDCG=TN&7>89786<8.,<X}xuoje^XWWXL%U~3( *E@<;<;>=;=:9;9866445565445 768687:64_WYWVUSRM65GEDEDG=TN%6>89897<6.4L$mwoliec\bD)v~` $'%GGDBB@A?>=?@<9:8:;::9766747898:;=86ZXWUTSQRL65GEEFCG=TN5>898<7,1yD$^}uphpj/P} ;-!COHJFDFCDBA@?<>;;<:;:9;::<;897<7-2y_':_x~nD#+yq! ''=VLMJHHGFGDECCDB@?>;=>>@AAB"DEF?7YTURRQPOI64HEFEBG=SN$4>99898<7-2}}kG'+#''a~}E+5ZRROOMMIKJGJG DCCBDABBAAC EFFGHHID>XSSQQONNH64FEDFEH=TN#4=89::7<7,2|~s]=$*/b~|) 2W]VWURQOPLIJJHFCFHFGEFHJIJKPL%AVQRQONLLG64GDBDCG=TN!4=767:7<7,2|~~{qwc_v ~fXg`^XUQOMMLKIGIIGHKLIJMKQPS#RWXTX1 ?UPQNMLJJE64FDDCAF=SN4=87686;7,2|~~A|O 9yfib`]YZZXTSQQMMOOMONONQTSWXZ[ZY\b]_B >TOOMLJIID63FDBFSMNLJIHHB62FCBDCGv(9t}xrnkfcde`]`_`]^_aaccaegijmpjpponk-"BPLLJIHGGA62FCBFt, ]|wrtpmlkljhjijlmmonntutwwvx|~~}:!(KMKJIHHFE@62FC@D;SM3<6;6+2|H~s* $X~{wvuutwwyyzy}{z7!7OJJIHGEDD>63DCCDBE;RM3;874:5*2|}s>.r/]"&ILIHHFEDBB<62DBADCF;RL2;67886:5)2|E_. 0fJ " %DLIIHGEDBA@<73DCAA@D;RL0<54566:5)2|;}{vg=  .NctG!)DMIIHFEDBA?@;72DB@C:RL2;65654:5)2|~8}xzzwkR1)BSmyt[NE6#!&:JKHIHFEDB@?>?861DBAE:QL0;5656484)2|F~}{zzxutvvyjLC0  *(09KOKHIGFECB@??==761DA@@AE:QK1:56494(2|*~~}{yywvvurplnopni^NQD-,*%&--..11.5E@?JJPPLIGFDCB@??=;;661DA@@?B:QK1:4356584(2|#~}|{zywvutrrqplkihghhgffee_a`]\YWWUT!QOKJJIHGEDCB@?>=<;:460EAAB@C9QK194334484(2|@~~|{yxwvutsqonlmlkjgecba`^]]ZYYXWVUSRPPNMLLJHHGEDCA@?><;:98360DA?D9OK0:4544383)2|K~~|{yxwuusrqpnmlkjhgfeddba`^\[[ZXVVTRRQPNLKIHHGEDCA@?>=;:977260DAAB?C9PJ0:483(2|L~}|{yxwuutrqonmlkjhgfdcb`_^][ZZXWVUSQQPOMLKIHHFECBA@?>=;:8766160DBAA?C9QJ0:4545483(2|M~}|zyxvuusrppnllkjhgedcba_^][ZZYWVUSRQPNMLJIHGFECB@??><;:87754/6/CABB?B9QJ195483(2|N~~}{zywvutsrpommlkihgedcb`_^\[ZZXWVTSRQPNMLJIHGFECB@??><::876543.7/C@>@@C9QJ0:5454483(2|O~~}{yxwvutsqponlljigfeccb`_^\[ZYXWUTRQQPNMKJIHHFECB@??=<;98765322,7/C@?>?C8QJ0:45483(2|P~~|{zywuutsqpnmlljhgfeccb`_^\[ZYXVUTRQQONMKJIHGEDCA@?><<;987653200+6.C@AA>A8PJ/:5443483'2|Q~}|{yxwvussqpnmlkjhgfeccb`_]\[ZYXVUSRQQONLKJIHGEDCA@?>=<:98665311//*6.B?>@?C8OI.95383'2|S~}|zyxwuutrqonmlkjhgfecca`^]\[ZYWVUSRQPOMLKIHHGECBA@?>=<:97664320/-.)6.B?>>=B8PI/93455483'2|B~}|zyxvuutrponmlkjhgfdcba`^]\ZZYWVUSRQQNNLKIHHGECBA@?><;:87664320/-'6-B@??<@7OJ093325483'2|U~~}|zyxvutsrponmlkjhgfecb`_^][ZZXWVUSRQPNNLKIHHFECCA??><;:87654210.--++%6-A??@>A7NH/93432172'2|V~~}|zyxvuusrponlljihfedcba_^][ZZXWVTSQQPNMLJHHGFECB@??=<;:8765321/.--+)*$6-A><>>B7NI0834362'2|W~}{zxwvuusrpomlkkihfedcb`_^\[ZZXVUTSQQONMKJHHGFDCB@??=<;98765331/.--+*((#6-A>==;?7OH083424362&2|N~~}{zywuutsqpnmlkjigfeccb`_^\[ZYXWUTRQQONMLJIHGEDCA@?>=<;98665321/.-,+)('&"6,A>=;:97765321/.-,+)('%%!6,A=A6MH/83255372&2|[~}|{yxwuusrqonmlkjhgedcca`_]\[ZYWVUSQQPONLKIHHGEDCA??><;:97664320/.-,**(&%$%6-A=;<<@6MI.73213372&2|\~}|zyxwuutrponllkjigedcba`^][ZZYWVUSRQQOMLKIHHFEDCA??><<:87664320/--+*)(&%$#"6+A<==:=5MH073 1062&2|]~~}|zyxvutsrqonmlkjhgfdcba_^][ZZYWVUSQQPOMLKIHHFEDBA??><;:87663310..-,*)(&%$$""6+A=<=<;:87654310.--+*)'&%$#! 6+A=<=;?5LH/73313252%3|_~}{zxwvutsrpomlljigfeccb`_^][ZYXVUTSQQONMKJIHGFDCB@??=<;987653210.-,+*('&$$"! 6+A==<;?5LH173252%3|b~}|zyxvuusrponmlkihgeecca_^][[ZXWVUSRRPNMLKIIHFEDBA@?><;:87754320/.-,*)(&%%$"! 6+@=>>=<<:87654320/.-+**('&$#"!!7+?<;;:?5LG 173262%1tzxZwvutrqomllkihfedcb`^]\ZYYWUTSQPONLKJHGFECBA?>=<:98753320..,*))'&$#!  5*?<:=4KGF 173212161&:~}{{yyxxvuusrrp onmlkjhggfebba`__^\[YXVVUTSTQSF5*=<<=<=4KG 063323260) S%1,=;9;;?4KG 253232260( N'),=<;:8<4JG 253233260) T(,;<9=3IF 253 252#"#CxNTR[dUw~XfSݜԔ),;;8;:>3IF 05332 469)D&~,.d_ mڈ,dw]]Ybi^V(+<;998;3IF 46323225458 ,B4n}V7D/ɭkà;=8TREc=@)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtstvstwtsvx wuvtxuuvttux&vuvswvvwxvvxwxutxvwxyv}L97#>8898;2IG!E/4)8033223166,9;!;D,(@7997;0DD)E)6&91322323167'.2987898799::9:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0 5898 7FODG ݂eڐ45)E/E,$`~b۾APͥ(%7:IHGHGK@VP fD &I\XP*X`nOC<51,'%$$""   <|}~~|oiS'  ) #S~}~|zywvuusqqonh71 7ZdO?WPD3Q~XL@:51+)'%$#"    #~}|xjbS:  /  U~~xzywvuusrponlh ' 9PgQGAVP1IA5cUI@:50,('%$$"" $  dncYG3*   + (tywvutsqpnnjo\ 9J`WDL?WP>IM u]SG?850,*(&&%"# ! ! )Mg[7;=/    -  Gxvvtrqponko_#:FZ`GHJ@VPRpe]PG@941/+(('%$#"! "   %   1tqsponmkoL=CS]EFFJ@VP\!842/,+)(&$%$$#" !      'znpomkoJ:510.-+(&$%&%%$#" !      ?tmlmh8 $?ALZPEGGFI?VP+: Gwr_ULD?:52/-,,(%&&#!   Znmh3)>AJ\GFHEHEJ?VPD &> vn\RJE?;:51//*(&&(()(&%$#! # (uV( 0>@JYN5LGEI?VP;'4xj\PJG@<8521.,()(&&$!   C"4?DK[A48HGFHFJ?WP2 :9p{weZOLD?;8452/-+**())(''#@)    8@DMT`58GGDFGI?WP 6B! yqeXQKD?;76440-,+*(#ypY. !2(:BGQS`[77HFFECI?VP7A8 /{naXPIC?=:8531-,-+*&1}~@  =X?KQV`aW68HFEFDH>UQ 8?=4X|h`VNHB=;:7441.-,'M}|*"#! ! !5IYGSWbb[W77HFEEDG>UP 6?9>9 tue_TNHA>:875730,.0#j~}J $&$#"#! ""#""#"!! /!  _XOXehZ[U67HFFEEH>UP' 8?98<7 zqf\SNHD@<987641-//0!( ~* '%&%"!#%%$#"!"! !#" !#'lMYdk[ZZT67HEEFEI>UO5?::7:8$ |skaXRIDC>;;:761 Z}~9%*((''#$&''&%&$#" " !"#"$%$%%';kFip^YZXS67HECG>UMD5?9::98;- oqnd[TMIFAA><:743.;}}a $ #,++*)'&()*)(*'%&%&#%$%$%%''&'('*D]Jx]ZZWWQ77HECF=UO'6>89:;8;="Gnql_XPKGDBA@@;;,j~ ~2 $!!-0. ,**,,-+**(' (()('%$&''((&'(*(*,AW]nT[WVVP66HEDG=TO$7>788::<;)03wmmh\TOIIGECA>+0}~a$ +400//1./1. -,+)*++**)(*)*(')*++,, 9[[]XWVTTN65GEDDCG=TN&7>89786<8.,=Wuojd_XSLMMLB&U~4)!(83211212311//0.,,+,,.,+ **+*,+,,-..*6aWYWVUSRM75GEDEDG=TN%6>89897;7.4M%iwjc_\XWRSA)v ~` &'&::765422330.2/-,+-//.011,7[XWUTSQRL75GEEFCG=TN5>898<7,1zE%\|qib[b^0Q}~;-$:@<:98787563112210/.//.//14540;ZUVTSQPPJ65HEDECG=TN6>897<7-2y`*:]qxxrb=&,yq" ')6D>@=:;::996786645211/311224455766794:YTURRQPOI64HEFEBG=SN$4>99898<7-2}}lI$'"*(a~ }E-1KCA? >>=<:;;9:76/44665657789:99:97?XSSQQONNH74FEDFEH=TN#4=89::7<7,2|~u_?&-0c~ |) 3KNGGDC@AA>=><;<:8698698788:;%<==@B?<# AVQRQONLLG64FDBDCG=TN"4=767:8<7,2|~~{sweauK~f OVPNIHGFFB@>=<=<9::9:<;<=<>A@DBDCEHEH,!!?UPQNMLJJE64FDDCAF=SN4=87686;7,2|~~~A|O 7iUUQMLJJGFDD@?=>A@??>@@BDEGHGIJHJNLM;! ?TOOMLJIID73EDBFv*3croe_[VSQRQOKNMLKKONOPOQQTVXY\XZ\]^\-$DPLLJIHGGA73ECBF63DCCDBE;RM3;874:5*2|G}s?.g~~}yxvwvvxy{{}}P$ (JLIHHFEDBB<73DBADCF;RL2;67876:5)2|E^. 0ax~{~~A $!%ELIIHGEDBA@<73DCAA@D;RL0<54566:5)2|:}{vg>  ,I\wj@$ )ELIIHFEDBA?@;72DB@C:RL2;65654:5)2|~8}xyzwkR2'>Mgpw|zkTJB4" ! (:JKHIHFEDB@?>?972DBAE:QL0;5656484)2|F~}{zzxutuvyjMB2   **1:LNKHIGFECB@??==772DA@@AE:QK1:56494(2|G~~}{yywvvurploopni_ORF/,)&(.-..2306E@?KKPPLIIHGFDCB@??=;;672DA@@?B:QK1:4356685(2|~}|{zywvutrrqplkihgh2geed`a`]\YWXUTTSTPNKJJIHGEDCB@?>=<;:461EAAB@C9QK194334485(2|@~~|{yxwvutsqonlmlkjgecba`^]]ZYYXWVTSRPPNMLLJHHGEDCA@?><;:98370DA?D9OK0:4544383)2|K~~|{yxwuusrqpnmlkjhgfeddba`^]\[ZXWVTRRQPNLKIHHGEDCA@?>=;:977271DAAB?C9PJ0:483)2|L~}|{yxwuutrqonmlkjhgfdcb`_^][ZZXWVUSQQPOMLKIHHFECBA@?>=;:8766170DBAA?C9QJ0:4545483(2|M~}|zyxvuusrppnllkjhgedcba_^][ZZYWVUSRQPNMLJIHGFECB@??><;:87754/70BABB?B9QJ195483(2|N~~}{zywvutsrpommlkihgedcb`_^\[ZZXWVTSRQPNMLJIHGFECB@??><::876543.7/B@>@@C9QJ0:5454483(2|O~~}{yxwvutsqponlljigfeccb`_^\[ZYXWUTRQQPNMKJIHHFECB@??=<;98765322,7/C@?>?C8QJ0:45473(2|P~~|{zywuutsqpnmlljhgfeccb`_^\[ZYXVUTRQQONMKJIHGEDCA@?><<;987653200+6/B@AA>A8PJ/:5443474'3|Q~}|{yxwvussqpnmlkjhgfeccb`_]\[ZYXVUSRQQONLKJIHGEDCA@?>=<:98665311//*7.A?>@?C8OI.95384'3|S~}|zyxwuutrqonmlkjhgfecca`^]\[ZYWVUSRQPOMLKIHHGECBA@?>=<:97664320/-.)7/B?>>=B8PI/93455474'3|B~}|zyxvuutrponmlkjhgfdcba`^]\ZZYWVUSRQQNNLKIHHGECBA@?><;:87664320/-'6.B@??<@7OJ093325484'3|U~~}|zyxvutsrponmlkjhgfecb`_^][ZZXWVUSRQPNNLKIHHFECCA??><;:87654210.--++%6-@??@>A7NH/93432172'2|V~~}|zyxvuusrponlljihfedcba_^][ZZXWVTSQQPNMLJHHGFECB@??=<;:8765321/.--+)*$7.A><>>B7NI0834362&2|W~}{zxwvuusrpomlkkihfedcb`_^\[ZZXVUTSQQONMKJHHGFDCB@??=<;98765331/.--+*((#6-A>==;?7OH083424362&2|N~~}{zywuutsqpnmlkjigfeccb`_^\[ZYXWUTRQQONMLJIHGEDCA@?>=<;98665321/.-,+)('&"6-A>=;:97765321/.-,+)('%%!6-A=A6MH/83255372&2|[~}|{yxwuusrqonmlkjhgedcca`_]\[ZYWVUSQQPONLKIHHGEDCA??><;:97664320/.-,**(&%$%6-A=;<<@6MI.73213372&2|R~}|zyxwuutrponllkjigedcba`^][ZZYWVUSRQQOMLKIHHFEDCA??><<:87664320/--+*)(&%$#"6+A=:=5MH073 2062&2|]~~}|zyxvutsrqonmlkjhgfdcba_^][ZZYWVUSQQPOMLKIHHFEDBA??><;:87663310..-,*)(&%$$""6+A=<=<;:87654310.--+*)'&%$#! 6+A=<=;?5LH/73313261%3|_~}{zxwvutsrpomlljigfeccb`_^][ZYXVUTSQQONMKJIHGFDCB@??=<;987653210.-,+*('&$$"! 7+A==<;?5LH173261%3|b~}|zyxvuusrponmlkihgeecca_^][[ZXWVUSRRPNMLKIIHFEDBA@?><;:87754320/.-,*)(&%%$"! 7,@=>>=<<:87654320/.-+**('&$#"!!6+?<;;:?5LG 173262%1tzxZwvutrqomllkihfedcb`^]\ZYYWUTSQPONLKJHGFECBA?>=<:98753320..,*))'&$#!  6+?<:=4KGF 173212161&:~}{{yyxxvuusrrp onmlkjhggfebba`__^\[YXVVUTQRG5*=<<=<=4KG 063323260( S#1,=;9;;?4KG 253232260( N;*,=<;:8<4JG 253233260) T(,;<9=3IF 253 252#"#CxNTR[dUw~XfSݜԔ),;;8;:>3IF 05332 469)D&~,.d_ mڈ,dw]]Ybi^V(+<;998;3IF 46323225458 ,B4n}V7D/ɭkà;=8TREc=@)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtstvstwtsvx wuvtxuuvttux&vuvswvvwxvvxwxutxvwxyv}L97#>8898;2IG!E/4)8033223166,9;!;D,(@7997;0DD)E)6&91322323167'.2987898799::9:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0 5898 7FOD_?=:$|8UHS-()A[;ђ T<$; $8:IHGJ@VP1"Y(7>LF6cA|`>G ݂eڐ45)E/E,$`~b۾APͥ(%7:IHGHGK@VP lF  !*I\?ˊ /7.&5;IIGHFK@WP )&$!$  ́;h[8!Q!c!ʔ2&5;IHGHFI@WO6 )!" !ĸSfSQRYeYNRkܬ0&5;IHGHGK@WO%*#!    I8&5;IHGHGK@VP"#)"!$   ; (5;IHGGFJ@VQ $))#!!&"   ߞü)4;IHG:K@WM &-*%!"!$,'   l~x*wwvĿ}yxwvuto 6:JHGIAT_Y.H 0*&#"!!',+# 2~uyywx z}~~zx@z}~x 6:JHFGFIBRRA# 20'" "!"!!" #'./*# :~}zx~ yxy|}}|{{yxr6:JHGH8DE&d,& 33)$&%$""!" !"$*,1$5}}~~ ~~~:|zyxr6:JHGHGHA'8 &6:*-+&%#%"! ! "#(+0',w~?~}{zxwwq6:JHGGHC("c94B37/)(%$#"!#! !!"(+/(  q~}~~}B~~}{zyxvvo6:JHGHB)gp#7%0OC=40+*'$%#$!"!!##%)/* q{~}}qrsr~}}~~}|{yxwvuun69JHFD RL74)^ND;4.,*'%#" '*/* q|&}~{_c@+01) )23-Ce_z~|~~|{yxwuusrl6:IHCFr_P C= "eZLC;3/-*'&$#"#""#(.*  Y} ~nT<5 5Um~}~}|{yxvuutrqk7:JCIWOEGGFI?VPB*?FmcZRLHD@;9953//22100/.++%'11.,)'$$ 4$')** Znmh4+>=HYFGHEHEJ?VP> &B|kaYTOHF><;97223125530/-()4+*'#  "'% (tX) 0<94236873210, )"$! !  "$E%4=AIY@48HGFHFJ?WPA :=ssh^ZRNIFCB?=:746577343-@*  $ " !#""! ! !! 5?BKT_58GGDFGI?WP0 6C# ~th_ZTNJHEBA=<89778854/ xqX0($ "%$"#$""#$#" !!  !2'9>EOQ`[77HFFECI?VP37@8 /|qg_ZTMJHFDA?=99::;87/.|@")($'%' ('%" !#$"##"!"! !  >T=JMT``W68HFEFDH>UQz 8?<5Zwoe^XRLJHFCB@<<;==;:-I}|*")-,,-*)*(),*)*)(%%&&($%&&%$$%&''&&%&'#""!#IWEPUaa\W77HFEEDG>UPQ 6?9>9 xumd]VQLJGFFC@?:9>=?*d~}K $/1//-,-+)--.,-//,++(&)('&'&&'(()%++)'($' ^WMVdgY[U67HFFEEH>UP& 8?98<8 }ume_WSPKIGFFC@<>>@%'}~, % $420//0-,/00/011/,-,+**())*))+..- *-#'kMUci[ZZT77HEEFEI>UO<5?::7:9% ypjb[VRMLJJIDBBA@Z}~;!#!.85421.043103/.0././/,+,*,.-,--/110/212#;kGho^YZXS77HECG>UM5?9:G8;+ r~|ukd^\WTONMLIDF9 :}}a! )#)998542157855641212213211//0/133025"E[Jv]ZZWWQ77HECF=UO'6>89:;8;>"H|}rib^ZWVTRPLL6i~~3)&%8@;<;<65<;9979634546$1/21353144546687! BW[mU[WVVP77HEDG=TO$7>788::<;)/4}}woga_][XVTQ12}~b #)$4E>>=>?=?@?><::778976,55865456768:98"9[[]XWVTTN75GEDDCG=TN&7>89786<8.,<[~}urld`a`aS(V~7/&0IDA??AB A??A@=::8::;<;+987:9;::9=<<7!6^WYWVUSRM75GEDEDG=TN%6>89897;7-5M&r{vrnmkejL,v ~a *.,LLHFD=FEBBCDE@?>=?A@?=>;::89;<=898<7,1zD%ezupvq5P}~<4)ISLLJIIJJHIGF5BABCC@@>>=>?>>?>ACCDEF>  ;ZUVTSQPPJ75HEDECG=TN6>897<7-2yb+@fuI&.yMq# -.CZQROLMLKKJIHGHGEEFCBA@CBCCBDEFFHFHHJC  ! 99898<7-2}}lH ),'+*c~}E3=`VUTRPQPONLMKHG EGGEEHEGHIIJJKG"" @XSSQQONNH74FEDFEH=TN#4=89::7<7,2|~vaA(-3c~|, ;[bZYXVTSSPOPN LJHJJIKIJJIKMLN#OSTQO( !!BVQRQONLLG64FDBDCG=TN!4=767:8<7+2|~~|rxeawK~h! #_meb\]\ZZWTQPOOMKMLLMNNOPRSRSUUYVW]XY4! "#@UPQNMLJJE64FDDCAF=SN4=87686;7+2| ~~@|P ?jleb`^\_[VWSSPQTSRTRPTWXX[\\]][^c_aE! "!?TOOMLJIID73EDBFv+9v|vrohiihecdcb_bcddfeefjklnqnpqorn0""&DPLLJIHGGA73ECBFu/Z~wyutqpnnmmooprrprtwvvy|y{~<% ",KMKJIHHFE@63FC@D;SM3<6;6+2|H~t/"V~}{}yz|~{~}}7$"!8OJJIHGEDD>73DCCDBE;RM3;874:5+2|}tA-p.]'""*IKIHHFEDBB<73DBADCF;RL2;67876:5)2|E`21hL!'#(ELIIHGEDBA@<73DCAA@D;RL0<54566:5)2|:}{uh@  .LcuI"'",ELIIHFEDBA?@;72DB@C:RL2;65654:5*2|~8}xzzwkT5 (BTmzt\QH7% &$+?972DBAE:QL0;5656484*2|F~}{zzxutuuxkOE5   "-.4;LNKHIGFECB@??==772DA@@AE:QK1:56495(3|G~~}{yywvvurpmoopnj`QSH2/,*+0011772:FA@JKPOLIIHGFDCB@??=;;672DA@@?B:QK1:4356685(2|I~}|{zywvutrqqplkihhghgfeeda`_\\YYWTTSSTQOKJJIHGEDCB@?>=<;:461EAAB@C9QK194334485(3|~~|{yxwvutsqonl.kigfdba`^]\ZYYXWVTSRQPNMLLJHHGEDCA@?><;:98371DA?D9OK0:4544383(2|K~~|{yxwuusrqpnmlkjhgfeddba`^][[ZXVVTRRQPNLKIHHGEDCA@?>=;:977271DAAB?C9PJ0:483(2|L~}|{yxwuutrqonmlkjhgfdcb`_^][ZZXWVUSQQPOMLKIHHFECBA@?>=;:8766170DBAA?C9QJ0:4545483(2|M~}|zyxvuusrppnllkjhgedcba_^][ZZYWVUSRQPNMLJIHGFECB@??><;:87754/70BABB?B9QJ195483(2|N~~}{zywvutsrpommlkihgedcb`_^\[ZZXWVTSRQPNMLJIHGFECB@??><::876543.70B@>@@C9QJ0:5454483(2|O~~}{yxwvutsqponlljigfeccb`_^\[ZYXWUTRQQPNMKJIHHFECB@??=<;98765322,7/C@?>?C8QJ0:45473(2|P~~|{zywuutsqpnmlljhgfeccb`_^\[ZYXVUTRQQONMKJIHGEDCA@?><<;987653200+6/B@AA>A8PJ/:5443483'2|Q~}|{yxwvussqpnmlkjhgfeccb`_]\[ZYXVUSRQQONLKJIHGEDCA@?>=<:98665311//*7/A?>@?C8OI.95383'2|S~}|zyxwuutrqonmlkjhgfecca`^]\[ZYWVUSRQPOMLKIHHGECBA@?>=<:97664320/-.)7/B?>>=B8PI/93455483'2|B~}|zyxvuutrponmlkjhgfdcba`^]\ZZYWVUSRQQNNLKIHHGECBA@?><;:87664320/-'6.B@??<@7OJ093325483'2|U~~}|zyxvutsrponmlkjhgfecb`_^][ZZXWVUSRQPNNLKIHHFECCA??><;:87654210.--++%6-@??@>A7NH/93432172'2|V~~}|zyxvuusrponlljihfedcba_^][ZZXWVTSQQPNMLJHHGFECB@??=<;:8765321/.--+)*$7.A><>>B7NI0834362&2|W~}{zxwvuusrpomlkkihfedcb`_^\[ZZXVUTSQQONMKJHHGFDCB@??=<;98765331/.--+*((#6-A>==;?7OH083424362&2|N~~}{zywuutsqpnmlkjigfeccb`_^\[ZYXWUTRQQONMLJIHGEDCA@?>=<;98665321/.-,+)('&"6-A>=;:97765321/.-,+)('%%!6-A=A6MH/83255372&2|[~}|{yxwuusrqonmlkjhgedcca`_]\[ZYWVUSQQPONLKIHHGEDCA??><;:97664320/.-,**(&%$%6-A=;<<@6MI.73213363&3|\~}|zyxwuutrponllkjigedcba`^][ZZYWVUSRQQOMLKIHHFEDCA??><<:87664320/--+*)(&%$#"6+A<==:=5MH073 2062&3|]~~}|zyxvutsrqonmlkjhgfdcba_^][ZZYWVUSQQPOMLKIHHFEDBA??><;:87663310..-,*)(&%$$""6+A=<=<;:87654310.--+*)'&%$#! 6+A=<=;?5LH/73313252%3|_~}{zxwvutsrpomlljigfeccb`_^][ZYXVUTSQQONMKJIHGFDCB@??=<;987653210.-,+*('&$$"! 7+A==<;?5LH173252%3|b~}|zyxvuusrponmlkihgeecca_^][[ZXWVUSRRPNMLKIIHFEDBA@?><;:87754320/.-,*)(&%%$"! 7,@=>>=<<:87654320/.-+**('&$#"!!6+?<;;:?5LG 173262%1tzxZwvutrqomllkihfedcb`^]\ZYYWUTSQPONLKJHGFECBA?>=<:98753320..,*))'&$#!  6+?<:=4KGF 173212161&:~}{{yyxxvuusrrp onmlkjhggfebba`__^\[YXVVUTQRG5*=<<=<=4KG 063323260( S#1,=;9;;?4KG 253232260( N;*+=<;:8<4JG 253233260) T(,;<9=3IF 253 252#"#CxNTR[dUw~XfSݜԔ),;;8;:>3IF 05332 469)D&~,.d_ mڈ,dw]]Ybi^V(+<;998;3IF 46323225458 ,B4n}V7D/ɭkà;=8TREc=@)*;9778=2HF]l9%9033167/56 *  6%=9787;1HF=.3(80423167.57 '`> ?88:7;1GF%J)3(813323167.67 *qtstvstwtsvx wuvtxuuvttux&vuvswvvwxvvxwxutxvwxyv}L97#>8898;2IG!E/4)8033223166,9;!;D,(@7997;0DD)E)6&91322323167'.2987898799::9:9:<<;<;=<;=?;3(;:9988:6QH  Hk? 914323167 ##"##$ !  !!"$(:;68998<+/22N E:033233232149789:7*.2101011)5>:;::<<=<==>=>=?:77687;2+ND )I 53232332320233232324*  &43345543433454 345565454456776558987767C5iY .&N)*8133223232322323232287%%&'!"4<533445655456545454556457756556678877667875L)N 1$FB;/413323233223323233232 3233158+!$%79234323654345445544334576556545756975I"=U !3_/7052322322323223232233223323 23:1!,;623434554545453346567 665565J6S 0IZ?3.443232323232232233223323 232275#09345545443465665654565546765568 7764K 7R&,^O;;0/00110/221012 02102001221001101221100102/4425/1001212 121124332332 342232432234554 33445651H4T /+gU#:>9767667676786795786778978779989889:899:;: 99:;9Q"2P,)co)&,+,+,,+,+**+,+,-,-,/4 3P  )AskG-*-,-,-,-.,,-,-..-.--./..//./021234090&I 4UYUTUTUVSSRSRQSRQRSRSTQ PQQPPQRPPQRQPQQPQ TSQQRSRPQQONOPONONNOOPOQ>< ""$"##"&&'&&$(&&(&'(&&'&%&&%%$""('&&$&%$#"%%$$"$&$""#%!"%'""%#$&'()*(%&))&$$&('$ '())'&!"*74      !"#!"!""!" #$##" 0t8mk@13455555555555666666666666666677767776666667777777777777778888888888888888888888999999999::9:::::::::::;;::967;<<"s=!    ! !53p$sTMr%|%;AT< Q(5%"!!!!!!!!!!!"""""""""""""""""""""""##"""##########$##########$!>  q[?9ܙ#.100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111/$!" ic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 d{')O&2e1x*ldÌy"Α٨|`D^6#vi+gޭpjePf/ƗtW'+$?E'BՊ/-JeU\US3F+Cn`sm~lLl d@ ՑCCyC,{\ܾi/uIE>[3"KPeHCGtΔM TC{%yzPZ@qQnJU&g' 4 8:$'*I'nX›~-BԄ/X) &zcw%HVT/| | !@չSjM4NH(Oq= /a^n_L?4vtWx-c|>BpˆJV 7^k]?pm-Yl8 pqGz8c5h% J:[/2.e$ 9 0/ena[3"W]xw|#)Vb ۮfGfdyzI%{cmdh+J~N?uDz_X~9Vi4m3r7sFP;@h/O%t S>?q%bY:W l] v7:_~*CiZ0:y-{Hyme^h~c zDνwX;^a}+tWg\!eFPxc,Js:,-V`l.jSo9Kx7 &ug nSѓ'VQsoO5Fѭ0(L]כּp~P+22Mڨ]WF\$vJ_W*?~]߇CA:V kJsݑH$D4bɶU-3^j ׺ky! Om}f+JڙsC{8Ay#L/އ\.+(cA _>X!=vMxaw7AĖagT-}9D-D[ ϥRݕvHyu`ډMU*#EvNK +ޗLYP;F,Vru`q/t*UFo/S1*0 kf}^jc||P(- -f=HL[v,"[GzwАExi`c;'2 p.'?.YhMR < j8(4D7Zh%w KY4ubqX:֗W9V.oj}tw@5 7* )n ]oPǿϸnY{Y(|b[va3SGƘtFH>1Bɚ0u:oa@et@f'yNCբԔAB[+ϜuyQ(huwqr6)UVkqtɆaR  $؈Zds"{u9n37- ch50@?,>J'%%Mn 1j˶fWhG-Z0 Y,ŕKBH,Lk!%Bt~k|êg ٽ7 ha4]_KJpV68r$Z{i2MLW>,4Oa7G1/&e"b-rG1t&fw׍m‚2chm^7ɇݍ8 C)+ښ3yW,S\RߴHYeV"A6j9V2e#cC(n/0̬Dib20C^u#|;Wniacmgɫ<>-iԷ$l>'!sGjP0wJX'qJz1_2&lVY1c<98#K3elvopjW?m GfDϩϊAm旋P*sdOiwţg|TQ?J'GWZd&Ϋ1ƒjE]N![٭UUUpzLgn *[(IJ+ FLe (m4ɟi6 0ӱIQTa(jx|e=<ؕGgUӴOm(Dh ͢ C& >sMLEm,S߫fYu:=֮6+$6F<3Qi'StV+&wbZ{9P*H;[g\ :e Xu*w- A`=:OS^,y5B]QǦqz#kvxIf@gF tc&oYG(hÊL{atN;R{J݈4_&`YQDSL4{fIǖOr6ALrs^P2ЮHkq"qObT134 k崲.nW |LƁ(g!3c+uIrxn,v;)֢GH#0BZH[pyGUIXq>Ut `O*/}d/ 0ʏ#&ѻ_9L=Y"1M5abs'3Ո,&L ؅!+R] kV /} %92&\3GO=P2 ugj[YT]ӓl&\U!`cS_>,T孾@pZUANhq7_otLB#Kg;>tZTz4.nIV$l dѽUM!w3IO6Lgr5֫@|l3\ 9'ϙw]*1M4!|ԍű2p֚G]:A.ϓ@p`г*mA=wÔlNd5W6X?%D(&X1f]NFJjuڳ{#Gqup[U%{$If@1O{geT;*~ubFb(m=9vOsys5֥ ^Q~ 0&b"˶7j!l/  &ѶFM4-=r Q׀ BV ld2|N}Ծ@'_q|<ږԞ~i>*V 9c|@VA/`p+*X#Clyl>lZ0;n&WpnoYB Nt YL::J2^shݙ] 10R@?Zj&wMܙr,ē91}SMZsׂOtBFM?mFݥRB+$Brw*AۧAr]sSs)Nfs]#}>p09h)e-{ț29ېoyL=?ݾ:^r}^561Ea%^-j+pv ٩w։x7_i2]N]#";j7])DkWu+DM _Q$CCpIC&$?.X'zDg`yaB1LƋiJ0]+U6TlWYsQ';zPBN=*O5o^#`ArNqC8]6/xaj.~F79\t B}|+bպ(V|V߻so5sX]E6r'H& ;yRX 鿦mnlDfZǨr(EiulVM%)bBކs)9,f>SRRzye@C^JXĒ0Zb{Uf'ϙ.CGlp-|@gW`Q^~qwzrh=cxO]:Z̰qו=Xg_z= 3գVHAN۫x9i5m^j#9b@7VR{ڳ/VRv CU+@fxN_K* w&~pLd ν6̵IfqB)+ٽ悁DƮmGVW:\uI@l@yZc|&q\g3;dS'~ҫ끓 mWg%s\@/:8x)ޡRm~5= ~'RtZnss]<0.E/WS BOYk.FevMN^gƌHqǙ%q"߱JIKZ?b|4^jq%;T0 ֒7,wIxMv{ԏ{NCAi$m(_U!dhy\MR\zNMcKY/O%INcPb$t$H4YOC4K DW{J:4x7_X{'>I r1'Bޜ%2Znv%>ަ.}b\ _Ld5j$E&v(Qo<,/aVt}JcFXl` ]pwGV7/`Ue Y2gD%۸hDTNv/~&^֓m{QbFL}ޘ Ԋ@Q5[2xuT1M2íP)75f@lSF5:ۼҚ֡gSCf  3A&; 7,aȣ|ɡ4 g>ϊ5} BaP 2C{fA<Dƒ alN&2J)?pfߨ]rt$ .[:EV25OrOȍV.*p\Ʃv(f|l9-_q!GiNJVH6z 3el}_ E 5@ Qdݱ]fԻ FMN* et|H7CgAf<X5kcNX6ig(9f,CBsԲj]jU8$]S>TAh֠Ary2c)x,Ա1)=y%1zf5Ķ-i.p n\=6qhfؓ~ʅ~R-ngGvȠ ΄ϛ&fg& ɊJ1p4HQ40ł\B}, .`\VJHV$%1$xͧw`B] jlu\A5 =->JƑJNkzff;Mu{=;Q2?@ z<%V;rG_AZZoP{5a+xVZ2 K?gd`A^LoAĤPۍҌ` YQn7)&%Jso oR9\7X#\)w_gF$1 RVB+wýttjķ.Vhn l* 3fekAkkI:Tb>pIEY:*A-',-|/͗2-3)kP`ʔfk㉀hz 96Rbfr t *'꣺݃d(6aslx3j3bS17Ǭ` hl<[ۢ 'ltT){4, ~x°6sz-OݓqJxفXW%zS۷DY )9aP8\òjo/}8>4*|?ep:1IQ4^ٲK7}l;cY4@SqF dT/cP Y/P~C/6^pfzn]S0>Mdf-X0|r=^|-uqv½,b`} ]V >x{˭oꨤClxDPl^N +?\rɔY>LM,_l)ygcɘQ#7^ ԎLFЙܻځkU--(L^0Dyc^/ @Rp9be3#;?1;|DAJZ[zj0oD$kЭ1?d̩Gq]8[3!U|;]0-G1AadNh&Ρ,z _BDzDf!kf/LwqU2pI)] ̙P8`#mVY;HVЄN ӱ~YZ،k`9>ىL]D~;1 YXE iıﹸꆭa <2}p\踶v,Ll`IHZ_D4)VY*n ++WJE]p(\XW zUfȕ8?j2˳@wĽ⤑Tϳ-+^\֙pU+ctڞ\͔%ڗ衷uR֤2ךG4Cœd6[CrN8H}+X.*+WK,bm;\|_*)*hbjY^tx`OiVDer<`E~f M{UT Qx^b:SQ;׶BE}uUz2q~&ķD b25G@ٳbMCg-"ᔩb3QAf@Fԝ)j/bO9 =b!7qR 7*:qj6C>Ȧm!{qjvOJQ)d[AG4Wΐo]-&-\]ɗb>'f@kd0ҶsۨzJ9ݠB2W`4HF!΍ X$9 Fd}1Fu4~6:A' /CLU2ԫz9𧌐Js`~xvX~C97g*xmqZm0Fqg`6v'aݣIpOY<Ƞ-+Y^Et2۔d͝ jl}9HT\S%B]S"S'/yԊ~,VC5=6ȥ%A e ͇7Rw%π/Ǫ!(謯j%_l;=̓ncإ$j>,Kp+''.}ͭ58и <^*B4ZW0(8Beu|KD ҝbӠZq{L ѳ*:̴G|9M 鿲wzFqR{Ǎ?kΥߣK)0|V~r1h.*6 PCoL@JG|P C B7cwXg|N\Ơ,$D+p?6tbݺb]`?.z ʧ)Ek\,R 4̩.$DQϥPIoh63SH_Au 3\Hji%joo:)clj o[t:ƚF8;H,6Jjr\ 4`x-آݨ,;بGpm=mCX_l1䁐%Y{cEH܍fIqB3oђ =cX\J}Yڶ[Ct4|+*fɆ|JPy?E_5?]!#[NZɃ,cCX TFkNdBR_cLj[|_+yr!TOǸYN3aɲ G9-9gmMRK:r3^h 4 5F-gڱ7ַZjR@ӯ$/W& Md*!ϯd]IYk}O_z {lgX,Zx΢fR |K9+#=P[/ƟzFFa S&%Q tyMotMH *bmL|G#"eC*u#~$n2=Y/{Mm+oP $ [6T['⪋dg)ksdce84- l8ホwC6JǩսҤ:1v$r4d|=:(NLJTҖ" ~cmY=Y}M]fx +ќ!io(~;{MgJm.-tޒ&Bm(%|**ihRPRu}&J]0H V(*R(*'Gnh~ᾋW /W(GagS +_r'6vSEr* ;`jրJ͝&WUŀs3n Ӕ@XDQ̱3D";z Z7j/;I@:ۘ{CMձ&|Gb$É40ʭ1u=أlc~~pJJSםk.P;t@\f(*U/nD8=A//C-YhH!lnRl7kAH#ro}@礬:s-K+6ńɳrģdv[PE(nIS%yàsk,F2<ɕreQbDM{̯j8Din6>^*pVXax"^IMQڴ{IV۷wWDj jF9Lի䖆j_"+[ XsP#Ys+K1 |ϰ}WDq8dd>Лbbmt *#(S1,gڵ%E߅&.xOJl~x LRf`ZB< Y|҇QǾO {bhj -WrAQ̺ގ{`>29>LH+ =t; rz+ռ<˯} 0ŽXyF9gFYXۊoef 2 v՘Xϛ(U..Tbc[Z!n7U ?b[3[fTaQ*^A< pSe0h}wO{{"@eᷦR5:+yiS7aх <]qyn_bCY{ڥG4ێR}xI*kua&?}XAX7 B$=V,]PX<o|[RC]hp3U}/jf]|˗'?/bMV4c,:UK+Fav-K9AT8~bq(&lgy",JL]h5&IQTD%6G~hj& 9x!jXcbZA**%ۑ[)RX]B+|K-y§o HP|fDڣ mN`%B|<Ͷ$3HE֒plakF܁"m|8mVG#5ڈƟυ)f[1xwa$ȰU,H?&uL"msnq袥5f MU׉n[)D8+`k/PKٿvq"Dz2'kz;%'i8r?ߓGj~Y [k@ /߫HzxJD]#|RovZ#WxϿr0#;3x(u|-[+[2d dPS.WnxT_5ݪ KIܜglw [#~b<f$T.ipKӜhI[ 0F$E/DsDQ#=ؗH!= ot~_Cϛ7ųt4V#K ]Hyp?IIB'AS0|Y&,e=:!M?>ONu YZ3 "ßYX6 A_@ 'hcP(]sz\aĐ"z=Mx&R^EAeI8հ˧ 1^.c"7Hֱ ׇLM|o 5 VMŢz2mIY.+szÓK U[%0BFř$w}BDBXfC Rmjˊj{$|r,y^c KJV`%R~!xz@a17 \'9w,V; cLt&MC*,OQtE"K:c]mٛ@Y&N6"vA*9Cb,$|z;DDˇT@9wK&ɖx0:TD@&O:ٽx6IKE0=5;9Ou5ȸl +BG66Lr#8iwk;'Ug*M7}cѐ|YCrdl`jRn@Y:InM"g=#De\>\~/ |lSq9fyd7@0? {L&Bzi/zJL:aS*rg: \]$=N!E+w571jVB[jsltK Y0~s>̘Qx`9w39:]K07y$iԔAY\zAX  Rkl ID;Ռ;16Pz8g|[7*lo%'ȡ-]mAoUM 7Aʵ,W֣44(LJ̌5W{R-Zy FT JtW>ߔi۶Gu[1*Oo)${jl߈%H#[ .S;al調x0AVC[M[9pKDĞ`"K(`&E tO^а?K;r:?\fιYj4c6a4Kw3P:V,EpzQTp6Dr<*MQ>)J}t1t/ť`D^f;jHKnD%팇u]0gS>cbywσ!%dǮO$H u5䟢dUvi?ɽյSxy{&?ryM=,cqxOy\ q|1]uzY&F}ؚ>0C?z| 6TݠlB;)<a/S,*%[~KzӼqP|5H`)$/Q×zг02uz!$X񝺉jrbn5H`XZSJc AE6n &|%D$ɗD5h~?$\.j5 =l]Gs+,0#mh_y灀cB& lc+&GE@8R*>5H" DA+8_ 35A!RU,R|{.7IWdG)\觚ctHgʻ{. Ի *$T@qE4] t޸E}vti( W2{}Y;KDST U߾X KM+wWd_S0Lz[yP`&M=:-OeMo㯻 $^n׌'՚!⨉FsVzPNMk9RODb1PK761 @kPcaJC=_R6b@Ҹx233* ʟ'1lbTV{ U8=g*U r|ij%a_ׅ_F{ϱLJCٌxy2-ꯡJߚ(3H?RqPQaU)hI?pV0b[WSHNfh1J0fQ7oJ1?{ûYfV4<'35Ou]2?[eZ2V~;Ď1kX>=i_2.ďߺHCDgtJ;Xvl/t~F-[W oPPϐ1ABN DN:]%ZHt%w>¥@ڊ@*;za>(밑oI> 0<&ǜo̕ ~epT˹I=VTv`P( ^L&7i5"oC[>m DڙE=8h.oP\4W{fHJJe7Đ !StG\{,Z!iyے|IZS"|n5fM2;~I#jFlgoO})s~Bt>1XkXX+Ǫ,eb~TpW)+:e[QjAΔlm ^V3o}@e]pP:KMxavYvI$'IyWBd nٌ>[6X&ݝ~tnd BrtPdۧt^aDɖaU/"`5(/U/V%#bl 0gqZY.WuBI)hڲgE:rѤ(?}QUe2{Eg]@!<"pⴋ;qHKDZhԥ6tS9)RAhy }i#-w+wkW P B 9 -wM !"1Ucr{OڭM;H)^r3dwlVMfh}V.R@ɍ߷VZo4i_XM3FIzzeK驋H[m! MùQfe}3u ʄBFS/ OV{+cI ]*>ubf?d, {CFv נ{=oZrjJ$o[[C2JP0v@YvGĝȠǰ{1A_djJ*1V #˒ac;nRZKpT7!D1 oa ! 3pgg( QKFͅm@;'[ɴs= Q+fr3p'?F(S^zQx5뽡`H dE&x >{*O87;PSĕ,$\Ld]ڦ}+k S嵏c"W3{&dZ381D)@ s3vFC6ݏ/;e*;Q1ˎcFK@lJ.\7oroCT!2!9;XhH>is &ηV)s >܆ф4'K,E ,}|TFyИΑ`$oxxi<͖5( }Lmv>ڏ@+G$.&~Lڗ*Z*^]t.M$VY&s5p԰_zӵ13ޜAU L_ &pmh H vU=zgt-Rg]EuHq=Ň;Z܏&hkYQBXFe*Pق@ԍ?枩 -9]ͽ-8_mSSE\,C#D{̦?8M'j*)HP3&zi9}.?~FZހ{rgMY Գ$ڤFM TJBQn%tVl7֬^DŨ09]d A[-Y7*ƪi%Q#`2&ӗR3$nSqxޒ$t=pɠז?qpsu'vO!5LF1'9_:#y+Jgޖ4wMQ>Upc;p<(+ζ_Bs?,yNE9\2OfYv\_Q2ۚ.V\$3 7xQΤd\$HnMh7X"fWDi21&H ԣN=9?\bU"LSG? ,f:lx14vI|>˟%o 13;թoTlhj-"ϷPװzP/="•qoq1:Oj ,}FMvׯfe2.S fTI]wxRʎUlTco׽nܯY1օ7DKaY^4 %:;}8֝j٧izM>B5^&Q8R'ȳY*Jd&c1k%K55fpc&^( ϖ$ $APKdVpkq7iDX$pa[aa\^lQ9@ CE˰'C; Nfm%JN]WdU`ү!vg)wH#3jΓJǰno{7>9}z<{_^ 7B*]伊srBxvuɫ5uswˤRۢ2˙\}΄B^ -M\6Xz>y~ E%,hx9i~qqM&֍[>QmzG䬆o/& =n(FS)jW{]֒khҝkw~tNY@@TYqƦ+u:. 66p%J XVmsv#GmuYtUrl<6'Lm]YڗóOq&D[;ϽVVUUVm)xrJr:}맴FG^h-~} 25'j_fQ|[{o.E Q}ymՊV:q%#Lh4Rbu>"[1܄ڦ+Z.a=tק歁EWϧ% fNp!`O׭^xem!QMWLzl%i!sEX2 i}(1ŮYaE /\l]E lR%˵4el+zT=Qy1dSS,5rq5LC~itܖ˯ rTKz_6$fZjW0N7hUrSQ@VBhm[}WCEt3y4{20law{Ka퉲;yXu.{LZai(S۔&0^ t5r"휈θϝ|S'9$,QGeEnvɟ fU5O Pew›, Xxr}U)(mⴋDJ/(h n+u/~R~pQu&h0_Kɏۆ76gc>ѽW&>n z+h"L0 өB>xj?w7҉!K8yY ݫb & iW(2$.-[F*c~IC 5HqLKaZFXﯞAn`DҘ/frsfFj/Fits2q.ʇ8KIB ʗ?ȗS_Uh7ʉ}|ih\hEdL;aZkހ1npCF8mЇPNȿu8=Bf |d܍UYXdVk}rt dzu4y g'ofy 9ߧ&,llp`*Lzo D.W{—k) '^Ld^^Bl\貅.cQJTJwq):lT |޲9 =@8#IG8.DӵB-C z>aO/>NX{e`Id;K"F+,NaHa46ŊA~(ݿeRHX>Y+/Xדh)Pf^VWchEd޹@Io8MX$i5jClɠwA"pSPrǞ_Z*r,#=d\IP]*ˣ _Z-L! _(suqy&ǃSF30:?P+hK⍿0;y;On/'s1KT>{*uY P"Gz;rLK*7y}k~La]jpR2zX^ͮ2k_HdxZ#X$n;kVsNe52t[b!K\& _်I騳"t%D?bRNyGLX}O+$}qsd/hp^IE T@~qeJ7*A&)8?),ӠqHjˡܡn0ïN.yz..rb6Н"]hq޵qI};E%neel)"5;7W=pgŬK8Ьx2ͩgg}%-$ u)orv4}ItMb+LKOTb޷23&{"-xB~59UbA+#S!|;oC1 YTX “R sM0@ Uk-FY+FC7PB֯E66x~$KP3t>Yi`1;"EZA;>Z4dhv,h6)H= K 'zp+*Þ!0H9_EI5Z2`YzHE,UIkrm4pv_x&uEjO~jqS*Zim&}/zAmhQ~rq` &>ތj>*o{ f0R3Úch!UJoƗ4,%5Vmm%c92DJ}t5 \hD) rR\"B~jm:6c.nP #}^:%i&RpsC17Rfe /א1NUH,FxӠXY-h?4&WlNhNLw.b Ce7r&c|WNI>,$d>ԎBD8tɥi+kjgLb>۫ƨ+J @8I*FgoMcAÇ0g=\-|ƚ)b]qo:DpxBljyG^H#E !""(FQEim6L3!|Hc"u`;c$:z 7”6rUI8$EYAm~ ӂ̡9VЩoS F-h s%,/$%{$ӎ]Zlt.:MtȪ Aǧa*S#Q "QCоTy@)&lAǚq`~H}Bѹ6{C5,eˎIh ]Q+nJ=^WC̣LDo;G@.u{"JڟlVr;9SLȼύ7EK~슊Z}lF$^D.œ!T(cBЭ: `tNb+|k~{*7;fl-6wbkD(kSl"5U$St]n3=XC!yw]s5A(L;[;[{˛#l-Wfy{Խ;i8ת$,}TBH󜉉7[#?zH/gHcֶvkmQGyrhO i#`u4Ty=Y9KX(F\ -, dq&Nf3OyN>)} 3E"!](mLj S&]19 c$mdol>pTֱClx[yGx /C@:F^㜃5W_z`.0 PoX]s=B5Cd5Z,΢aR2ԠDJ|>xvFl/Y@.xw||H],S_Ȉ?u"ge 3&),xvyGUrQ1O/jr\+0%G6=vZ<m^8~p52>gz6r3uQ uRYnLejڃh %l?b; z* ݣd&DsHHaU׽ ޜP1.b4vo b zXvH̎`8Bl~! v :5@sRA [[`D[hq<󚆤rVB~֩|S{N־EirE1ڹ̺8|tc(<i8DɷK&Rz_f>Lm%FrVTԾ\: -a2?&>n5d3iӾln G\q5YDHȞ l])eaG.m_5`Cx퓿 I:syϹu*=q-|s"&U 3CFO>  'R`gyRG܉nܯha=Vq{8Ԕ0yAo,JzaO@2v͂:yƴp~XVN|W&ۄ2@̭Cc[JKn CNz- 0Via;X9|QC2mv#u9tYؼ-^q!O $JocO(A8# pB+rY:Jp>~٥ .=+)#b tts;{$|t9xJmi:BR`0D Z 2*}d&q! D!WA0ז+,dY>颟=~kD%4-K yyMs<paZ{Sj .܆N+e<'vlb3 (tKK2̉X:Hcx(dŏAYaKХZg4j3xbE3<1 a EXë2 @όóp$4՚͛s#$΢D'0Dy;4Tj4)4Ё7vi˚۫ L/ a-Ug@ ^R4+a*o5 ̺9Dȓ*F%5֕R` 7U̺DL$ӄ##b!ZC1}=$gZQlI-G0lI0a>,b_thg^ Q-|S9%ޖr M3D2][ҹ^}^vfz`ESU~#S_):gAқM3cj ArXvl1rXaPZ8A>]<388jLYݳoKÓ8%mOjs6EfnqC֫>I |"[`rrA)A1ngɮ?'"||MsN֯x>"J L7,h++v[zǻ(1b$6JӾr߾ 0kYf۱N~4M[CkѠ5jL,wxD䜅i@д^'7)~9Uz-.nܧǓrx=ť+ T)1o=1pW%#;TGj,'扚@֑_:!x=WI&.XdjVݲKx6:,.d򶼽jP/4KQ%.Ǫj~+b[":IA׺YN3Lˌ /u;r^$A,Zks`C)hK,ˇ(Ve7z+.2 18$3 gg"ਧ_Va1glc #B2B_5W@ls9'n)XFƔ`tJR~SF/lQ\PȺ_vӎjg.l=]@E s`7W6wFiQ B˧nk7%(G]!ʳ  Fw쬫#moyS>ǕF_=&#)?$pm1_Lo~m ^秐_#~8sj'5DHU)m& $,UOi' ec6D F3gm\b9,⁈ -^}fX hwϬ"`$83 KVc4fʏAR@*; sO qY"ys5K., Re3D=|`2t% zEď(D Uvlia%$0jxVy60iyh s J`MG7L:elNPUzox9o#Ud39ȓ)Yp]G_';Cu`bBqsaE!B|r2[3Eڇ<UKj\"68q;˛_~ZzvrMOAnDb4$ŦsKUŋ` S}}es"CE7k)`Zn$N F 6^snOv$ʄt- _Up"D8WX|wdևUú֢q)+@F)ik"EJrƠ .ۘ&eL.npȼX0wgDs4y2K!rݎhQĠt_sg'\RCA'#v$|#u?|JVz=&[Z2vVwLvcwD{`p=Sk硻 XM)7_-Aٶ;-+(ͬ*@/=lU+ufGlJr;AwB4V{'9PzBoxs =i',*.^s;:NK|jا wS2,j-QU3 |!kBHww#[m$ѯϯdƫ}[gCVPց̕zߧSs"(ĕ {QoȠw@ p%s+[8=nOYZHznz]Q RtvjBW" Z, ?nnc۫_\0?n~E;XUnJT>k0LrXɜς)/Y&(6z@RBW𐶺LJj%=StYp찅=YT=gq.ҫL+C#:8xd͜?L&^ԃ4+z^b/{EeKMiϮYج4yAmNkoaEԥYᲣ &x?Nܝ HtAnbc2ķJQ&AvUF~jblG+|}AO9ltm =n>FrZ'R Q" , 6P #uab8xX6t#Z ' :ī)*C+ ?(1+rM$-_iRF7sv\xY/jRcC`]9#_4'mBa]s:V(qYh xGdT1O5Ai& ?X#sGAny1 8Ì7_;۝mPӯ!K\FE OGHFh|KōZX7J'G) f8U900y(FNK=A%4@e H5[ o ABeW 0ۋ )(nc:[Ň*63=#UOPcCv?vlI%L~Pp: bߵ6>ܝGWp;=FΙq^`zYC.rSKʘP9{}1Cw~ NP[@6&Ip>8YfoJd7ZVLL>ugIi!q`'j?b Pj{|-RG;,A7G9d} {L Cye<ÞNp>rF(NDn:H+ Zuu$iyyCh^I7LZΔ"]x9E`Rʠzz#{xTo~&4!Y ok~CaWG?b2LG?)H9,l:1L0t̑ZZaz'1+Ĩ tsY8?"o7e{q>F(ۏcq3P$Pr O^ɝ^cTe=<3g^G]tw"|.ڥeQ+W1A2!t`[ qHG)70a-Ա܆^ߍ*l3CVnu GU.KUzSm8S()6MF_jYv2<^&@}9nv*굅JY@PJzw'gJ`dl.x9?k8NuOYwE3[U\dc 6\ɡ/xih:_?|{lLAV}׈x:[BƦaͰ4jD|7K\Y*$!7LHYI|xڗD G/7_TzαZx2740Kay_f y0 <+*Kـ70y̑ cm蓁fNH,9@p!r<*^Mƫ?`f׷8@nQtHVIJ ^h"DNO6Mb3}v_|Gb } 8ֆllbv @#^`\Q8Hm{} 4*:aNJ;uⴕ4*Z PXL].L2%ƨjXȃR5 YKwnoUW}aJG8x=D" R0%t^}u9*14>jsiՌwJlc/$$wnT;B҄Ɠ1e9p93/k282>~QpgӥkXhI>H3-t&tlB\<_;hS2Wߪ(3?ģ}} ]﭅CFg YfQv$1y&*Mb0=ہqicnV Bffdesmume-0.9.9/src/cocoa/DeSmuME (Legacy).xcodeproj/0000755000175000017500000000000012140306213022326 5ustar guillaumeguillaumedesmume-0.9.9/src/cocoa/DeSmuME (Legacy).xcodeproj/project.pbxproj0000644000175000017500000125704112140261600025414 0ustar guillaumeguillaume// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 45; objects = { /* Begin PBXBuildFile section */ 1EFD517A0F892B1A00B029BB /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; 1EFD51B70F892B1A00B029BB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 1EFD51B80F892B1A00B029BB /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECE60D9D57F600ED561B /* OpenGL.framework */; }; 1EFD51B90F892B1A00B029BB /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECEF0D9D581900ED561B /* AudioUnit.framework */; }; 1F4B550A0F53924500C8B514 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; 729BECE70D9D57F600ED561B /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECE60D9D57F600ED561B /* OpenGL.framework */; }; 729BECF00D9D581900ED561B /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECEF0D9D581900ED561B /* AudioUnit.framework */; }; 7FA912201426523900E2ABDD /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121A1426523900E2ABDD /* tinystr.cpp */; }; 7FA912211426523900E2ABDD /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121C1426523900E2ABDD /* tinyxml.cpp */; }; 7FA912221426523900E2ABDD /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */; }; 7FA912231426523900E2ABDD /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */; }; 7FA912241426523900E2ABDD /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121A1426523900E2ABDD /* tinystr.cpp */; }; 7FA912251426523900E2ABDD /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121C1426523900E2ABDD /* tinyxml.cpp */; }; 7FA912261426523900E2ABDD /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */; }; 7FA912271426523900E2ABDD /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 956B96C313DF4CF900FCDCD0 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */; }; AB0191D314BD72EC004CB612 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */; }; AB0191D414BD72EC004CB612 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */; }; AB0191D514BD72EC004CB612 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */; }; AB0191D614BD72EC004CB612 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */; }; AB06CCD6135B8AA200E977B3 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB06CCD7135B8AA300E977B3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB06CD3D135B8ACE00E977B3 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0E135B8ACE00E977B3 /* addons.cpp */; }; AB06CD3F135B8ACE00E977B3 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */; }; AB06CD40135B8ACE00E977B3 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD11135B8ACE00E977B3 /* armcpu.cpp */; }; AB06CD41135B8ACE00E977B3 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD12135B8ACE00E977B3 /* bios.cpp */; }; AB06CD42135B8ACE00E977B3 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */; }; AB06CD44135B8ACE00E977B3 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD15135B8ACE00E977B3 /* common.cpp */; }; AB06CD45135B8ACE00E977B3 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD16135B8ACE00E977B3 /* cp15.cpp */; }; AB06CD47135B8ACE00E977B3 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD18135B8ACE00E977B3 /* debug.cpp */; }; AB06CD49135B8ACE00E977B3 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */; }; AB06CD4A135B8ACE00E977B3 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1B135B8ACE00E977B3 /* driver.cpp */; }; AB06CD4B135B8ACE00E977B3 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1C135B8ACE00E977B3 /* emufile.cpp */; }; AB06CD4C135B8ACE00E977B3 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */; }; AB06CD4D135B8ACE00E977B3 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1E135B8ACE00E977B3 /* firmware.cpp */; }; AB06CD4E135B8ACE00E977B3 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */; }; AB06CD50135B8ACE00E977B3 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */; }; AB06CD51135B8ACE00E977B3 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */; }; AB06CD53135B8ACE00E977B3 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD24135B8ACE00E977B3 /* GPU.cpp */; }; AB06CD55135B8ACE00E977B3 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD26135B8ACE00E977B3 /* matrix.cpp */; }; AB06CD56135B8ACE00E977B3 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD27135B8ACE00E977B3 /* mc.cpp */; }; AB06CD59135B8ACE00E977B3 /* mic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2A135B8ACE00E977B3 /* mic.cpp */; }; AB06CD5A135B8ACE00E977B3 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2B135B8ACE00E977B3 /* MMU.cpp */; }; AB06CD5B135B8ACE00E977B3 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2C135B8ACE00E977B3 /* movie.cpp */; }; AB06CD5C135B8ACE00E977B3 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */; }; AB06CD5E135B8ACE00E977B3 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2F135B8ACE00E977B3 /* path.cpp */; }; AB06CD5F135B8ACE00E977B3 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD30135B8ACE00E977B3 /* rasterize.cpp */; }; AB06CD60135B8ACE00E977B3 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD31135B8ACE00E977B3 /* readwrite.cpp */; }; AB06CD61135B8ACE00E977B3 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD32135B8ACE00E977B3 /* render3D.cpp */; }; AB06CD62135B8ACE00E977B3 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */; }; AB06CD63135B8ACE00E977B3 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD34135B8ACE00E977B3 /* rtc.cpp */; }; AB06CD64135B8ACE00E977B3 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD35135B8ACE00E977B3 /* saves.cpp */; }; AB06CD65135B8ACE00E977B3 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD36135B8ACE00E977B3 /* slot1.cpp */; }; AB06CD67135B8ACE00E977B3 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD38135B8ACE00E977B3 /* SPU.cpp */; }; AB06CD68135B8ACE00E977B3 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD39135B8ACE00E977B3 /* texcache.cpp */; }; AB06CD69135B8ACE00E977B3 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */; }; AB06CD6A135B8ACE00E977B3 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3B135B8ACE00E977B3 /* version.cpp */; }; AB06CD6B135B8ACE00E977B3 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3C135B8ACE00E977B3 /* wifi.cpp */; }; AB06CD6C135B8ACE00E977B3 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0E135B8ACE00E977B3 /* addons.cpp */; }; AB06CD6D135B8ACE00E977B3 /* aggdraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0F135B8ACE00E977B3 /* aggdraw.cpp */; }; AB06CD6E135B8ACE00E977B3 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */; }; AB06CD6F135B8ACE00E977B3 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD11135B8ACE00E977B3 /* armcpu.cpp */; }; AB06CD70135B8ACE00E977B3 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD12135B8ACE00E977B3 /* bios.cpp */; }; AB06CD71135B8ACE00E977B3 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */; }; AB06CD72135B8ACE00E977B3 /* commandline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD14135B8ACE00E977B3 /* commandline.cpp */; }; AB06CD73135B8ACE00E977B3 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD15135B8ACE00E977B3 /* common.cpp */; }; AB06CD74135B8ACE00E977B3 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD16135B8ACE00E977B3 /* cp15.cpp */; }; AB06CD75135B8ACE00E977B3 /* ctrlssdl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD17135B8ACE00E977B3 /* ctrlssdl.cpp */; }; AB06CD76135B8ACE00E977B3 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD18135B8ACE00E977B3 /* debug.cpp */; }; AB06CD77135B8ACE00E977B3 /* desmume_config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD19135B8ACE00E977B3 /* desmume_config.cpp */; }; AB06CD78135B8ACE00E977B3 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */; }; AB06CD79135B8ACE00E977B3 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1B135B8ACE00E977B3 /* driver.cpp */; }; AB06CD7A135B8ACE00E977B3 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1C135B8ACE00E977B3 /* emufile.cpp */; }; AB06CD7B135B8ACE00E977B3 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */; }; AB06CD7C135B8ACE00E977B3 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1E135B8ACE00E977B3 /* firmware.cpp */; }; AB06CD7D135B8ACE00E977B3 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */; }; AB06CD7F135B8ACE00E977B3 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */; }; AB06CD80135B8ACE00E977B3 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */; }; AB06CD81135B8ACE00E977B3 /* GPU_osd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD23135B8ACE00E977B3 /* GPU_osd.cpp */; }; AB06CD82135B8ACE00E977B3 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD24135B8ACE00E977B3 /* GPU.cpp */; }; AB06CD83135B8ACE00E977B3 /* lua-engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD25135B8ACE00E977B3 /* lua-engine.cpp */; }; AB06CD84135B8ACE00E977B3 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD26135B8ACE00E977B3 /* matrix.cpp */; }; AB06CD85135B8ACE00E977B3 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD27135B8ACE00E977B3 /* mc.cpp */; }; AB06CD86135B8ACE00E977B3 /* mic_alsa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD28135B8ACE00E977B3 /* mic_alsa.cpp */; }; AB06CD87135B8ACE00E977B3 /* mic_openal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD29135B8ACE00E977B3 /* mic_openal.cpp */; }; AB06CD88135B8ACE00E977B3 /* mic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2A135B8ACE00E977B3 /* mic.cpp */; }; AB06CD89135B8ACE00E977B3 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2B135B8ACE00E977B3 /* MMU.cpp */; }; AB06CD8A135B8ACE00E977B3 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2C135B8ACE00E977B3 /* movie.cpp */; }; AB06CD8B135B8ACE00E977B3 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */; }; AB06CD8D135B8ACE00E977B3 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2F135B8ACE00E977B3 /* path.cpp */; }; AB06CD8E135B8ACE00E977B3 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD30135B8ACE00E977B3 /* rasterize.cpp */; }; AB06CD8F135B8ACE00E977B3 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD31135B8ACE00E977B3 /* readwrite.cpp */; }; AB06CD90135B8ACE00E977B3 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD32135B8ACE00E977B3 /* render3D.cpp */; }; AB06CD91135B8ACE00E977B3 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */; }; AB06CD92135B8ACE00E977B3 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD34135B8ACE00E977B3 /* rtc.cpp */; }; AB06CD93135B8ACE00E977B3 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD35135B8ACE00E977B3 /* saves.cpp */; }; AB06CD94135B8ACE00E977B3 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD36135B8ACE00E977B3 /* slot1.cpp */; }; AB06CD95135B8ACE00E977B3 /* sndsdl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD37135B8ACE00E977B3 /* sndsdl.cpp */; }; AB06CD96135B8ACE00E977B3 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD38135B8ACE00E977B3 /* SPU.cpp */; }; AB06CD97135B8ACE00E977B3 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD39135B8ACE00E977B3 /* texcache.cpp */; }; AB06CD98135B8ACE00E977B3 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */; }; AB06CD99135B8ACE00E977B3 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3B135B8ACE00E977B3 /* version.cpp */; }; AB06CD9A135B8ACE00E977B3 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3C135B8ACE00E977B3 /* wifi.cpp */; }; AB06CE13135B8AEE00E977B3 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */; }; AB06CE14135B8AEE00E977B3 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */; }; AB06CE15135B8AEE00E977B3 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */; }; AB06CE16135B8AEE00E977B3 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */; }; AB06CE17135B8AEE00E977B3 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */; }; AB06CE18135B8AEE00E977B3 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */; }; AB06CE19135B8AEE00E977B3 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */; }; AB06CE1A135B8AEE00E977B3 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */; }; AB06CE1B135B8AEE00E977B3 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */; }; AB06CE1C135B8AEE00E977B3 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */; }; AB06CE1D135B8AEE00E977B3 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */; }; AB06CE26135B8AEE00E977B3 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB4135B8AED00E977B3 /* metaspu.cpp */; }; AB06CE28135B8AEE00E977B3 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB7135B8AED00E977B3 /* SndOut.cpp */; }; AB06CE2A135B8AEE00E977B3 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */; }; AB06CE2D135B8AEE00E977B3 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */; }; AB06CE30135B8AEE00E977B3 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */; }; AB06CE31135B8AEE00E977B3 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */; }; AB06CE35135B8AEE00E977B3 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */; }; AB06CE36135B8AEE00E977B3 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */; }; AB06CE38135B8AEE00E977B3 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */; }; AB06CE39135B8AEE00E977B3 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */; }; AB06CE3A135B8AEE00E977B3 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */; }; AB06CE3B135B8AEE00E977B3 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD6135B8AED00E977B3 /* WavFile.cpp */; }; AB06CE3C135B8AEE00E977B3 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */; }; AB06CE3E135B8AEE00E977B3 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */; }; AB06CE3F135B8AEE00E977B3 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDF135B8AED00E977B3 /* datetime.cpp */; }; AB06CE40135B8AEE00E977B3 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE2135B8AED00E977B3 /* crc.cpp */; }; AB06CE41135B8AEE00E977B3 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE4135B8AED00E977B3 /* decrypt.cpp */; }; AB06CE42135B8AEE00E977B3 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE6135B8AED00E977B3 /* header.cpp */; }; AB06CE43135B8AEE00E977B3 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE8135B8AED00E977B3 /* dlditool.cpp */; }; AB06CE44135B8AEE00E977B3 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE9135B8AED00E977B3 /* emufat.cpp */; }; AB06CE45135B8AEE00E977B3 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDEC135B8AED00E977B3 /* guid.cpp */; }; AB06CE46135B8AEE00E977B3 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF0135B8AED00E977B3 /* cache.cpp */; }; AB06CE47135B8AEE00E977B3 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF3135B8AED00E977B3 /* directory.cpp */; }; AB06CE48135B8AEE00E977B3 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF5135B8AED00E977B3 /* disc.cpp */; }; AB06CE49135B8AEE00E977B3 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF9135B8AED00E977B3 /* fatdir.cpp */; }; AB06CE4A135B8AEE00E977B3 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFB135B8AED00E977B3 /* fatfile.cpp */; }; AB06CE4B135B8AEE00E977B3 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */; }; AB06CE4C135B8AEE00E977B3 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFF135B8AED00E977B3 /* filetime.cpp */; }; AB06CE4D135B8AEE00E977B3 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE01135B8AED00E977B3 /* libfat.cpp */; }; AB06CE4E135B8AEE00E977B3 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */; }; AB06CE4F135B8AEE00E977B3 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE05135B8AED00E977B3 /* lock.cpp */; }; AB06CE50135B8AEE00E977B3 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE08135B8AED00E977B3 /* partition.cpp */; }; AB06CE51135B8AEE00E977B3 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0A135B8AED00E977B3 /* md5.cpp */; }; AB06CE52135B8AEE00E977B3 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0C135B8AED00E977B3 /* task.cpp */; }; AB06CE53135B8AEE00E977B3 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0F135B8AED00E977B3 /* vfat.cpp */; }; AB06CE54135B8AEE00E977B3 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE11135B8AED00E977B3 /* xstring.cpp */; }; AB06CE55135B8AEE00E977B3 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */; }; AB06CE56135B8AEE00E977B3 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */; }; AB06CE57135B8AEE00E977B3 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */; }; AB06CE58135B8AEE00E977B3 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */; }; AB06CE59135B8AEE00E977B3 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */; }; AB06CE5A135B8AEE00E977B3 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */; }; AB06CE5B135B8AEE00E977B3 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */; }; AB06CE5C135B8AEE00E977B3 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */; }; AB06CE5D135B8AEE00E977B3 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */; }; AB06CE5E135B8AEE00E977B3 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */; }; AB06CE5F135B8AEE00E977B3 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */; }; AB06CE63135B8AEE00E977B3 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDAC135B8AED00E977B3 /* main.cpp */; }; AB06CE66135B8AEE00E977B3 /* gdbstub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB0135B8AED00E977B3 /* gdbstub.cpp */; }; AB06CE68135B8AEE00E977B3 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB4135B8AED00E977B3 /* metaspu.cpp */; }; AB06CE6A135B8AEE00E977B3 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB7135B8AED00E977B3 /* SndOut.cpp */; }; AB06CE6C135B8AEE00E977B3 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */; }; AB06CE6F135B8AEE00E977B3 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */; }; AB06CE72135B8AEE00E977B3 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */; }; AB06CE73135B8AEE00E977B3 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */; }; AB06CE77135B8AEE00E977B3 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */; }; AB06CE78135B8AEE00E977B3 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */; }; AB06CE7A135B8AEE00E977B3 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */; }; AB06CE7B135B8AEE00E977B3 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */; }; AB06CE7C135B8AEE00E977B3 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */; }; AB06CE7D135B8AEE00E977B3 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD6135B8AED00E977B3 /* WavFile.cpp */; }; AB06CE7E135B8AEE00E977B3 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */; }; AB06CE80135B8AEE00E977B3 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */; }; AB06CE81135B8AEE00E977B3 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDF135B8AED00E977B3 /* datetime.cpp */; }; AB06CE82135B8AEE00E977B3 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE2135B8AED00E977B3 /* crc.cpp */; }; AB06CE83135B8AEE00E977B3 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE4135B8AED00E977B3 /* decrypt.cpp */; }; AB06CE84135B8AEE00E977B3 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE6135B8AED00E977B3 /* header.cpp */; }; AB06CE85135B8AEE00E977B3 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE8135B8AED00E977B3 /* dlditool.cpp */; }; AB06CE86135B8AEE00E977B3 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE9135B8AED00E977B3 /* emufat.cpp */; }; AB06CE87135B8AEE00E977B3 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDEC135B8AED00E977B3 /* guid.cpp */; }; AB06CE88135B8AEE00E977B3 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF0135B8AED00E977B3 /* cache.cpp */; }; AB06CE89135B8AEE00E977B3 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF3135B8AED00E977B3 /* directory.cpp */; }; AB06CE8A135B8AEE00E977B3 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF5135B8AED00E977B3 /* disc.cpp */; }; AB06CE8B135B8AEE00E977B3 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF9135B8AED00E977B3 /* fatdir.cpp */; }; AB06CE8C135B8AEE00E977B3 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFB135B8AED00E977B3 /* fatfile.cpp */; }; AB06CE8D135B8AEE00E977B3 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */; }; AB06CE8E135B8AEE00E977B3 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFF135B8AED00E977B3 /* filetime.cpp */; }; AB06CE8F135B8AEE00E977B3 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE01135B8AED00E977B3 /* libfat.cpp */; }; AB06CE90135B8AEE00E977B3 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */; }; AB06CE91135B8AEE00E977B3 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE05135B8AED00E977B3 /* lock.cpp */; }; AB06CE92135B8AEE00E977B3 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE08135B8AED00E977B3 /* partition.cpp */; }; AB06CE93135B8AEE00E977B3 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0A135B8AED00E977B3 /* md5.cpp */; }; AB06CE94135B8AEE00E977B3 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0C135B8AED00E977B3 /* task.cpp */; }; AB06CE95135B8AEE00E977B3 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0F135B8AED00E977B3 /* vfat.cpp */; }; AB06CE96135B8AEE00E977B3 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE11135B8AED00E977B3 /* xstring.cpp */; }; AB0A0D1E14AACACC00E83E91 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; }; AB0A0D3714AACE9500E83E91 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; AB0A0D4614AACE9500E83E91 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0E135B8ACE00E977B3 /* addons.cpp */; }; AB0A0D4714AACE9500E83E91 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */; }; AB0A0D4814AACE9500E83E91 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD11135B8ACE00E977B3 /* armcpu.cpp */; }; AB0A0D4914AACE9500E83E91 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD12135B8ACE00E977B3 /* bios.cpp */; }; AB0A0D4A14AACE9500E83E91 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */; }; AB0A0D4B14AACE9500E83E91 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD15135B8ACE00E977B3 /* common.cpp */; }; AB0A0D4C14AACE9500E83E91 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD16135B8ACE00E977B3 /* cp15.cpp */; }; AB0A0D4D14AACE9500E83E91 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD18135B8ACE00E977B3 /* debug.cpp */; }; AB0A0D4E14AACE9500E83E91 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */; }; AB0A0D4F14AACE9500E83E91 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1B135B8ACE00E977B3 /* driver.cpp */; }; AB0A0D5014AACE9500E83E91 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1C135B8ACE00E977B3 /* emufile.cpp */; }; AB0A0D5114AACE9500E83E91 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */; }; AB0A0D5214AACE9500E83E91 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1E135B8ACE00E977B3 /* firmware.cpp */; }; AB0A0D5314AACE9500E83E91 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */; }; AB0A0D5414AACE9500E83E91 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */; }; AB0A0D5514AACE9500E83E91 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */; }; AB0A0D5614AACE9500E83E91 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD24135B8ACE00E977B3 /* GPU.cpp */; }; AB0A0D5714AACE9500E83E91 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD26135B8ACE00E977B3 /* matrix.cpp */; }; AB0A0D5814AACE9500E83E91 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD27135B8ACE00E977B3 /* mc.cpp */; }; AB0A0D5914AACE9500E83E91 /* mic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2A135B8ACE00E977B3 /* mic.cpp */; }; AB0A0D5A14AACE9500E83E91 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2B135B8ACE00E977B3 /* MMU.cpp */; }; AB0A0D5B14AACE9500E83E91 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2C135B8ACE00E977B3 /* movie.cpp */; }; AB0A0D5C14AACE9500E83E91 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */; }; AB0A0D5D14AACE9500E83E91 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2F135B8ACE00E977B3 /* path.cpp */; }; AB0A0D5E14AACE9500E83E91 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD30135B8ACE00E977B3 /* rasterize.cpp */; }; AB0A0D5F14AACE9500E83E91 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD31135B8ACE00E977B3 /* readwrite.cpp */; }; AB0A0D6014AACE9500E83E91 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD32135B8ACE00E977B3 /* render3D.cpp */; }; AB0A0D6114AACE9500E83E91 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */; }; AB0A0D6214AACE9500E83E91 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD34135B8ACE00E977B3 /* rtc.cpp */; }; AB0A0D6314AACE9500E83E91 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD35135B8ACE00E977B3 /* saves.cpp */; }; AB0A0D6414AACE9500E83E91 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD36135B8ACE00E977B3 /* slot1.cpp */; }; AB0A0D6514AACE9500E83E91 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD38135B8ACE00E977B3 /* SPU.cpp */; }; AB0A0D6614AACE9500E83E91 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD39135B8ACE00E977B3 /* texcache.cpp */; }; AB0A0D6714AACE9500E83E91 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */; }; AB0A0D6814AACE9500E83E91 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3B135B8ACE00E977B3 /* version.cpp */; }; AB0A0D6914AACE9500E83E91 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3C135B8ACE00E977B3 /* wifi.cpp */; }; AB0A0D6A14AACE9500E83E91 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */; }; AB0A0D6B14AACE9500E83E91 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */; }; AB0A0D6C14AACE9500E83E91 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */; }; AB0A0D6D14AACE9500E83E91 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */; }; AB0A0D6E14AACE9500E83E91 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */; }; AB0A0D6F14AACE9500E83E91 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */; }; AB0A0D7014AACE9500E83E91 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */; }; AB0A0D7114AACE9500E83E91 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */; }; AB0A0D7214AACE9500E83E91 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */; }; AB0A0D7314AACE9500E83E91 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */; }; AB0A0D7414AACE9500E83E91 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */; }; AB0A0D7514AACE9500E83E91 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB4135B8AED00E977B3 /* metaspu.cpp */; }; AB0A0D7614AACE9500E83E91 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB7135B8AED00E977B3 /* SndOut.cpp */; }; AB0A0D7714AACE9500E83E91 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */; }; AB0A0D7814AACE9500E83E91 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */; }; AB0A0D7914AACE9500E83E91 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */; }; AB0A0D7A14AACE9500E83E91 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */; }; AB0A0D7B14AACE9500E83E91 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */; }; AB0A0D7C14AACE9500E83E91 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */; }; AB0A0D7D14AACE9500E83E91 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */; }; AB0A0D7E14AACE9500E83E91 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */; }; AB0A0D7F14AACE9500E83E91 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */; }; AB0A0D8014AACE9500E83E91 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD6135B8AED00E977B3 /* WavFile.cpp */; }; AB0A0D8114AACE9500E83E91 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */; }; AB0A0D8214AACE9500E83E91 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */; }; AB0A0D8314AACE9500E83E91 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDF135B8AED00E977B3 /* datetime.cpp */; }; AB0A0D8414AACE9500E83E91 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE2135B8AED00E977B3 /* crc.cpp */; }; AB0A0D8514AACE9500E83E91 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE4135B8AED00E977B3 /* decrypt.cpp */; }; AB0A0D8614AACE9500E83E91 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE6135B8AED00E977B3 /* header.cpp */; }; AB0A0D8714AACE9500E83E91 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE8135B8AED00E977B3 /* dlditool.cpp */; }; AB0A0D8814AACE9500E83E91 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE9135B8AED00E977B3 /* emufat.cpp */; }; AB0A0D8914AACE9500E83E91 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDEC135B8AED00E977B3 /* guid.cpp */; }; AB0A0D8A14AACE9500E83E91 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF0135B8AED00E977B3 /* cache.cpp */; }; AB0A0D8B14AACE9500E83E91 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF3135B8AED00E977B3 /* directory.cpp */; }; AB0A0D8C14AACE9500E83E91 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF5135B8AED00E977B3 /* disc.cpp */; }; AB0A0D8D14AACE9500E83E91 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF9135B8AED00E977B3 /* fatdir.cpp */; }; AB0A0D8E14AACE9500E83E91 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFB135B8AED00E977B3 /* fatfile.cpp */; }; AB0A0D8F14AACE9500E83E91 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */; }; AB0A0D9014AACE9500E83E91 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFF135B8AED00E977B3 /* filetime.cpp */; }; AB0A0D9114AACE9500E83E91 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE01135B8AED00E977B3 /* libfat.cpp */; }; AB0A0D9214AACE9500E83E91 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */; }; AB0A0D9314AACE9500E83E91 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE05135B8AED00E977B3 /* lock.cpp */; }; AB0A0D9414AACE9500E83E91 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE08135B8AED00E977B3 /* partition.cpp */; }; AB0A0D9514AACE9500E83E91 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0A135B8AED00E977B3 /* md5.cpp */; }; AB0A0D9614AACE9500E83E91 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0C135B8AED00E977B3 /* task.cpp */; }; AB0A0D9714AACE9500E83E91 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0F135B8AED00E977B3 /* vfat.cpp */; }; AB0A0D9814AACE9500E83E91 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE11135B8AED00E977B3 /* xstring.cpp */; }; AB0A0D9C14AACE9500E83E91 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */; }; AB0A0D9D14AACE9500E83E91 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121A1426523900E2ABDD /* tinystr.cpp */; }; AB0A0D9E14AACE9500E83E91 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121C1426523900E2ABDD /* tinyxml.cpp */; }; AB0A0D9F14AACE9500E83E91 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */; }; AB0A0DA014AACE9500E83E91 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */; }; AB0A0DA214AACE9500E83E91 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB0A0DA314AACE9500E83E91 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECE60D9D57F600ED561B /* OpenGL.framework */; }; AB0A0DA414AACE9500E83E91 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECEF0D9D581900ED561B /* AudioUnit.framework */; }; AB0A0DA514AACE9500E83E91 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB0A0DA614AACE9500E83E91 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB0A0DA714AACE9500E83E91 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; }; AB0A0EAD14AAF77000E83E91 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA714AAF77000E83E91 /* README.MAC */; }; AB0A0EAE14AAF77000E83E91 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA814AAF77000E83E91 /* AUTHORS */; }; AB0A0EAF14AAF77000E83E91 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA914AAF77000E83E91 /* ChangeLog */; }; AB0A0EB014AAF77000E83E91 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAA14AAF77000E83E91 /* COPYING */; }; AB0A0EB114AAF77000E83E91 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAB14AAF77000E83E91 /* README */; }; AB0A0EB314AAF77000E83E91 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA714AAF77000E83E91 /* README.MAC */; }; AB0A0EB414AAF77000E83E91 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA814AAF77000E83E91 /* AUTHORS */; }; AB0A0EB514AAF77000E83E91 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA914AAF77000E83E91 /* ChangeLog */; }; AB0A0EB614AAF77000E83E91 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAA14AAF77000E83E91 /* COPYING */; }; AB0A0EB714AAF77000E83E91 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAB14AAF77000E83E91 /* README */; }; AB0A0EB914AAF77000E83E91 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA714AAF77000E83E91 /* README.MAC */; }; AB0A0EBA14AAF77000E83E91 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA814AAF77000E83E91 /* AUTHORS */; }; AB0A0EBB14AAF77000E83E91 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA914AAF77000E83E91 /* ChangeLog */; }; AB0A0EBC14AAF77000E83E91 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAA14AAF77000E83E91 /* COPYING */; }; AB0A0EBD14AAF77000E83E91 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAB14AAF77000E83E91 /* README */; }; AB0A0EBF14AAF77000E83E91 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA714AAF77000E83E91 /* README.MAC */; }; AB0A0EC014AAF77000E83E91 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA814AAF77000E83E91 /* AUTHORS */; }; AB0A0EC114AAF77000E83E91 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA914AAF77000E83E91 /* ChangeLog */; }; AB0A0EC214AAF77000E83E91 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAA14AAF77000E83E91 /* COPYING */; }; AB0A0EC314AAF77000E83E91 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAB14AAF77000E83E91 /* README */; }; AB0E770314C5635800EF460C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ABEB321914C56182007F0D4C /* InfoPlist.strings */; }; AB0E770414C5635800EF460C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ABEB321914C56182007F0D4C /* InfoPlist.strings */; }; AB0E770514C5635900EF460C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ABEB321914C56182007F0D4C /* InfoPlist.strings */; }; AB0E770614C5635900EF460C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ABEB321914C56182007F0D4C /* InfoPlist.strings */; }; AB18136D15D1FB73007A6CC3 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB18136C15D1FB73007A6CC3 /* arm_jit.cpp */; }; AB18136E15D1FB73007A6CC3 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB18136C15D1FB73007A6CC3 /* arm_jit.cpp */; }; AB18136F15D1FB73007A6CC3 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB18136C15D1FB73007A6CC3 /* arm_jit.cpp */; }; AB18137015D1FB73007A6CC3 /* arm_jit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB18136C15D1FB73007A6CC3 /* arm_jit.cpp */; }; AB1813A615D1FD88007A6CC3 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */; }; AB1814C115D212B4007A6CC3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; AB1814C215D212B4007A6CC3 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA714AAF77000E83E91 /* README.MAC */; }; AB1814C315D212B4007A6CC3 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA814AAF77000E83E91 /* AUTHORS */; }; AB1814C415D212B4007A6CC3 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA914AAF77000E83E91 /* ChangeLog */; }; AB1814C515D212B4007A6CC3 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAA14AAF77000E83E91 /* COPYING */; }; AB1814C615D212B4007A6CC3 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAB14AAF77000E83E91 /* README */; }; AB1814C715D212B4007A6CC3 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */; }; AB1814C815D212B4007A6CC3 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; }; AB1814C915D212B4007A6CC3 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; }; AB1814CA15D212B4007A6CC3 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; }; AB1814CB15D212B4007A6CC3 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; AB1814CC15D212B4007A6CC3 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */; }; AB1814CD15D212B4007A6CC3 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */; }; AB1814CE15D212B4007A6CC3 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */; }; AB1814CF15D212B4007A6CC3 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */; }; AB1814D015D212B4007A6CC3 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */; }; AB1814D115D212B4007A6CC3 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */; }; AB1814D215D212B4007A6CC3 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */; }; AB1814D315D212B4007A6CC3 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */; }; AB1814D415D212B4007A6CC3 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */; }; AB1814D515D212B4007A6CC3 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */; }; AB1814D615D212B4007A6CC3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ABEB321914C56182007F0D4C /* InfoPlist.strings */; }; AB1814D715D212B4007A6CC3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB1814D915D212B4007A6CC3 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */; }; AB1814DA15D212B4007A6CC3 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */; }; AB1814DB15D212B4007A6CC3 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0E135B8ACE00E977B3 /* addons.cpp */; }; AB1814DC15D212B4007A6CC3 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */; }; AB1814DD15D212B4007A6CC3 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD11135B8ACE00E977B3 /* armcpu.cpp */; }; AB1814DE15D212B4007A6CC3 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD12135B8ACE00E977B3 /* bios.cpp */; }; AB1814DF15D212B4007A6CC3 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF0135B8AED00E977B3 /* cache.cpp */; }; AB1814E015D212B4007A6CC3 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */; }; AB1814E115D212B4007A6CC3 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD15135B8ACE00E977B3 /* common.cpp */; }; AB1814E215D212B4007A6CC3 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD16135B8ACE00E977B3 /* cp15.cpp */; }; AB1814E315D212B4007A6CC3 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */; }; AB1814E415D212B4007A6CC3 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE2135B8AED00E977B3 /* crc.cpp */; }; AB1814E515D212B4007A6CC3 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDF135B8AED00E977B3 /* datetime.cpp */; }; AB1814E615D212B4007A6CC3 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD18135B8ACE00E977B3 /* debug.cpp */; }; AB1814E715D212B4007A6CC3 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE4135B8AED00E977B3 /* decrypt.cpp */; }; AB1814E815D212B4007A6CC3 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF3135B8AED00E977B3 /* directory.cpp */; }; AB1814E915D212B4007A6CC3 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */; }; AB1814EA15D212B4007A6CC3 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF5135B8AED00E977B3 /* disc.cpp */; }; AB1814EB15D212B4007A6CC3 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE8135B8AED00E977B3 /* dlditool.cpp */; }; AB1814EC15D212B4007A6CC3 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1B135B8ACE00E977B3 /* driver.cpp */; }; AB1814ED15D212B4007A6CC3 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE9135B8AED00E977B3 /* emufat.cpp */; }; AB1814EE15D212B4007A6CC3 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1C135B8ACE00E977B3 /* emufile.cpp */; }; AB1814EF15D212B4007A6CC3 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF9135B8AED00E977B3 /* fatdir.cpp */; }; AB1814F015D212B4007A6CC3 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFB135B8AED00E977B3 /* fatfile.cpp */; }; AB1814F115D212B4007A6CC3 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */; }; AB1814F215D212B4007A6CC3 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */; }; AB1814F315D212B4007A6CC3 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */; }; AB1814F415D212B4007A6CC3 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFF135B8AED00E977B3 /* filetime.cpp */; }; AB1814F515D212B4007A6CC3 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */; }; AB1814F615D212B4007A6CC3 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1E135B8ACE00E977B3 /* firmware.cpp */; }; AB1814F715D212B4007A6CC3 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */; }; AB1814F815D212B4007A6CC3 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */; }; AB1814F915D212B4007A6CC3 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD24135B8ACE00E977B3 /* GPU.cpp */; }; AB1814FA15D212B4007A6CC3 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */; }; AB1814FB15D212B4007A6CC3 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDEC135B8AED00E977B3 /* guid.cpp */; }; AB1814FC15D212B4007A6CC3 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE6135B8AED00E977B3 /* header.cpp */; }; AB1814FD15D212B4007A6CC3 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE01135B8AED00E977B3 /* libfat.cpp */; }; AB1814FE15D212B4007A6CC3 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */; }; AB1814FF15D212B4007A6CC3 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE05135B8AED00E977B3 /* lock.cpp */; }; AB18150015D212B4007A6CC3 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD26135B8ACE00E977B3 /* matrix.cpp */; }; AB18150115D212B4007A6CC3 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD27135B8ACE00E977B3 /* mc.cpp */; }; AB18150215D212B4007A6CC3 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0A135B8AED00E977B3 /* md5.cpp */; }; AB18150315D212B4007A6CC3 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB4135B8AED00E977B3 /* metaspu.cpp */; }; AB18150415D212B4007A6CC3 /* mic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2A135B8ACE00E977B3 /* mic.cpp */; }; AB18150515D212B4007A6CC3 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2B135B8ACE00E977B3 /* MMU.cpp */; }; AB18150615D212B4007A6CC3 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */; }; AB18150715D212B4007A6CC3 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2C135B8ACE00E977B3 /* movie.cpp */; }; AB18150815D212B4007A6CC3 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */; }; AB18150915D212B4007A6CC3 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE08135B8AED00E977B3 /* partition.cpp */; }; AB18150A15D212B4007A6CC3 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2F135B8ACE00E977B3 /* path.cpp */; }; AB18150B15D212B4007A6CC3 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD30135B8ACE00E977B3 /* rasterize.cpp */; }; AB18150C15D212B4007A6CC3 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */; }; AB18150D15D212B4007A6CC3 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD31135B8ACE00E977B3 /* readwrite.cpp */; }; AB18150E15D212B4007A6CC3 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD32135B8ACE00E977B3 /* render3D.cpp */; }; AB18150F15D212B4007A6CC3 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */; }; AB18151015D212B4007A6CC3 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD34135B8ACE00E977B3 /* rtc.cpp */; }; AB18151115D212B4007A6CC3 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD35135B8ACE00E977B3 /* saves.cpp */; }; AB18151215D212B4007A6CC3 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD36135B8ACE00E977B3 /* slot1.cpp */; }; AB18151315D212B4007A6CC3 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */; }; AB18151415D212B4007A6CC3 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */; }; AB18151515D212B4007A6CC3 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */; }; AB18151615D212B4007A6CC3 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */; }; AB18151715D212B4007A6CC3 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */; }; AB18151815D212B4007A6CC3 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */; }; AB18151915D212B4007A6CC3 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */; }; AB18151A15D212B4007A6CC3 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */; }; AB18151B15D212B4007A6CC3 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */; }; AB18151C15D212B4007A6CC3 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */; }; AB18151D15D212B4007A6CC3 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */; }; AB18151E15D212B4007A6CC3 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */; }; AB18151F15D212B4007A6CC3 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; AB18152015D212B4007A6CC3 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB7135B8AED00E977B3 /* SndOut.cpp */; }; AB18152115D212B4007A6CC3 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */; }; AB18152215D212B4007A6CC3 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD38135B8ACE00E977B3 /* SPU.cpp */; }; AB18152315D212B4007A6CC3 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */; }; AB18152415D212B4007A6CC3 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0C135B8AED00E977B3 /* task.cpp */; }; AB18152515D212B4007A6CC3 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */; }; AB18152615D212B4007A6CC3 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD39135B8ACE00E977B3 /* texcache.cpp */; }; AB18152715D212B4007A6CC3 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */; }; AB18152815D212B4007A6CC3 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */; }; AB18152915D212B4007A6CC3 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121A1426523900E2ABDD /* tinystr.cpp */; }; AB18152A15D212B4007A6CC3 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121C1426523900E2ABDD /* tinyxml.cpp */; }; AB18152B15D212B4007A6CC3 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */; }; AB18152C15D212B4007A6CC3 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */; }; AB18152D15D212B4007A6CC3 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3B135B8ACE00E977B3 /* version.cpp */; }; AB18152E15D212B4007A6CC3 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0F135B8AED00E977B3 /* vfat.cpp */; }; AB18152F15D212B4007A6CC3 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD6135B8AED00E977B3 /* WavFile.cpp */; }; AB18153015D212B4007A6CC3 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3C135B8ACE00E977B3 /* wifi.cpp */; }; AB18153115D212B4007A6CC3 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE11135B8AED00E977B3 /* xstring.cpp */; }; AB18153215D212B4007A6CC3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABAC890814B7943E001B299F /* main.m */; }; AB18153315D212B4007A6CC3 /* appDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */; }; AB18153415D212B4007A6CC3 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; }; AB18153515D212B4007A6CC3 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; }; AB18153615D212B4007A6CC3 /* emuWindowDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */; }; AB18153715D212B4007A6CC3 /* cocoa_input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */; }; AB18153815D212B4007A6CC3 /* input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F614BE3169006EA2D5 /* input_legacy.mm */; }; AB18153915D212B4007A6CC3 /* nds_control_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */; }; AB18153A15D212B4007A6CC3 /* preferences_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */; }; AB18153B15D212B4007A6CC3 /* screen_state_legacy.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */; }; AB18153C15D212B4007A6CC3 /* video_output_view_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */; }; AB18153D15D212B4007A6CC3 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */; }; AB18153E15D212B4007A6CC3 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */; }; AB18154E15D212B4007A6CC3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB18154F15D212B4007A6CC3 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECE60D9D57F600ED561B /* OpenGL.framework */; }; AB18155015D212B4007A6CC3 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECEF0D9D581900ED561B /* AudioUnit.framework */; }; AB18155115D212B4007A6CC3 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB18155215D212B4007A6CC3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB18155315D212B4007A6CC3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; }; AB18155D15D21469007A6CC3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; AB18155E15D21469007A6CC3 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA714AAF77000E83E91 /* README.MAC */; }; AB18155F15D21469007A6CC3 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA814AAF77000E83E91 /* AUTHORS */; }; AB18156015D21469007A6CC3 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA914AAF77000E83E91 /* ChangeLog */; }; AB18156115D21469007A6CC3 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAA14AAF77000E83E91 /* COPYING */; }; AB18156215D21469007A6CC3 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAB14AAF77000E83E91 /* README */; }; AB18156315D21469007A6CC3 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */; }; AB18156415D21469007A6CC3 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; }; AB18156515D21469007A6CC3 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; }; AB18156615D21469007A6CC3 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; }; AB18156715D21469007A6CC3 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; AB18156815D21469007A6CC3 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */; }; AB18156915D21469007A6CC3 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */; }; AB18156A15D21469007A6CC3 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */; }; AB18156B15D21469007A6CC3 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */; }; AB18156C15D21469007A6CC3 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */; }; AB18156D15D21469007A6CC3 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */; }; AB18156E15D21469007A6CC3 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */; }; AB18156F15D21469007A6CC3 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */; }; AB18157015D21469007A6CC3 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */; }; AB18157115D21469007A6CC3 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */; }; AB18157215D21469007A6CC3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ABEB321914C56182007F0D4C /* InfoPlist.strings */; }; AB18157315D21469007A6CC3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB18157515D21469007A6CC3 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */; }; AB18157615D21469007A6CC3 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */; }; AB18157715D21469007A6CC3 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0E135B8ACE00E977B3 /* addons.cpp */; }; AB18157815D21469007A6CC3 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */; }; AB18157915D21469007A6CC3 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD11135B8ACE00E977B3 /* armcpu.cpp */; }; AB18157A15D21469007A6CC3 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD12135B8ACE00E977B3 /* bios.cpp */; }; AB18157B15D21469007A6CC3 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF0135B8AED00E977B3 /* cache.cpp */; }; AB18157C15D21469007A6CC3 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */; }; AB18157D15D21469007A6CC3 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD15135B8ACE00E977B3 /* common.cpp */; }; AB18157E15D21469007A6CC3 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD16135B8ACE00E977B3 /* cp15.cpp */; }; AB18157F15D21469007A6CC3 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */; }; AB18158015D21469007A6CC3 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE2135B8AED00E977B3 /* crc.cpp */; }; AB18158115D21469007A6CC3 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDF135B8AED00E977B3 /* datetime.cpp */; }; AB18158215D21469007A6CC3 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD18135B8ACE00E977B3 /* debug.cpp */; }; AB18158315D21469007A6CC3 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE4135B8AED00E977B3 /* decrypt.cpp */; }; AB18158415D21469007A6CC3 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF3135B8AED00E977B3 /* directory.cpp */; }; AB18158515D21469007A6CC3 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */; }; AB18158615D21469007A6CC3 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF5135B8AED00E977B3 /* disc.cpp */; }; AB18158715D21469007A6CC3 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE8135B8AED00E977B3 /* dlditool.cpp */; }; AB18158815D21469007A6CC3 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1B135B8ACE00E977B3 /* driver.cpp */; }; AB18158915D21469007A6CC3 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE9135B8AED00E977B3 /* emufat.cpp */; }; AB18158A15D21469007A6CC3 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1C135B8ACE00E977B3 /* emufile.cpp */; }; AB18158B15D21469007A6CC3 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF9135B8AED00E977B3 /* fatdir.cpp */; }; AB18158C15D21469007A6CC3 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFB135B8AED00E977B3 /* fatfile.cpp */; }; AB18158D15D21469007A6CC3 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */; }; AB18158E15D21469007A6CC3 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */; }; AB18158F15D21469007A6CC3 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */; }; AB18159015D21469007A6CC3 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFF135B8AED00E977B3 /* filetime.cpp */; }; AB18159115D21469007A6CC3 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */; }; AB18159215D21469007A6CC3 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1E135B8ACE00E977B3 /* firmware.cpp */; }; AB18159315D21469007A6CC3 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */; }; AB18159415D21469007A6CC3 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */; }; AB18159515D21469007A6CC3 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD24135B8ACE00E977B3 /* GPU.cpp */; }; AB18159615D21469007A6CC3 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */; }; AB18159715D21469007A6CC3 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDEC135B8AED00E977B3 /* guid.cpp */; }; AB18159815D21469007A6CC3 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE6135B8AED00E977B3 /* header.cpp */; }; AB18159915D21469007A6CC3 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE01135B8AED00E977B3 /* libfat.cpp */; }; AB18159A15D21469007A6CC3 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */; }; AB18159B15D21469007A6CC3 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE05135B8AED00E977B3 /* lock.cpp */; }; AB18159C15D21469007A6CC3 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD26135B8ACE00E977B3 /* matrix.cpp */; }; AB18159D15D21469007A6CC3 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD27135B8ACE00E977B3 /* mc.cpp */; }; AB18159E15D21469007A6CC3 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0A135B8AED00E977B3 /* md5.cpp */; }; AB18159F15D21469007A6CC3 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB4135B8AED00E977B3 /* metaspu.cpp */; }; AB1815A015D21469007A6CC3 /* mic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2A135B8ACE00E977B3 /* mic.cpp */; }; AB1815A115D21469007A6CC3 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2B135B8ACE00E977B3 /* MMU.cpp */; }; AB1815A215D21469007A6CC3 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */; }; AB1815A315D21469007A6CC3 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2C135B8ACE00E977B3 /* movie.cpp */; }; AB1815A415D21469007A6CC3 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */; }; AB1815A515D21469007A6CC3 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE08135B8AED00E977B3 /* partition.cpp */; }; AB1815A615D21469007A6CC3 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2F135B8ACE00E977B3 /* path.cpp */; }; AB1815A715D21469007A6CC3 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD30135B8ACE00E977B3 /* rasterize.cpp */; }; AB1815A815D21469007A6CC3 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */; }; AB1815A915D21469007A6CC3 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD31135B8ACE00E977B3 /* readwrite.cpp */; }; AB1815AA15D21469007A6CC3 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD32135B8ACE00E977B3 /* render3D.cpp */; }; AB1815AB15D21469007A6CC3 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */; }; AB1815AC15D21469007A6CC3 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD34135B8ACE00E977B3 /* rtc.cpp */; }; AB1815AD15D21469007A6CC3 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD35135B8ACE00E977B3 /* saves.cpp */; }; AB1815AE15D21469007A6CC3 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD36135B8ACE00E977B3 /* slot1.cpp */; }; AB1815AF15D21469007A6CC3 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */; }; AB1815B015D21469007A6CC3 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */; }; AB1815B115D21469007A6CC3 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */; }; AB1815B215D21469007A6CC3 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */; }; AB1815B315D21469007A6CC3 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */; }; AB1815B415D21469007A6CC3 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */; }; AB1815B515D21469007A6CC3 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */; }; AB1815B615D21469007A6CC3 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */; }; AB1815B715D21469007A6CC3 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */; }; AB1815B815D21469007A6CC3 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */; }; AB1815B915D21469007A6CC3 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */; }; AB1815BA15D21469007A6CC3 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */; }; AB1815BB15D21469007A6CC3 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; AB1815BC15D21469007A6CC3 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB7135B8AED00E977B3 /* SndOut.cpp */; }; AB1815BD15D21469007A6CC3 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */; }; AB1815BE15D21469007A6CC3 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD38135B8ACE00E977B3 /* SPU.cpp */; }; AB1815BF15D21469007A6CC3 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */; }; AB1815C015D21469007A6CC3 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0C135B8AED00E977B3 /* task.cpp */; }; AB1815C115D21469007A6CC3 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */; }; AB1815C215D21469007A6CC3 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD39135B8ACE00E977B3 /* texcache.cpp */; }; AB1815C315D21469007A6CC3 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */; }; AB1815C415D21469007A6CC3 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */; }; AB1815C515D21469007A6CC3 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121A1426523900E2ABDD /* tinystr.cpp */; }; AB1815C615D21469007A6CC3 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121C1426523900E2ABDD /* tinyxml.cpp */; }; AB1815C715D21469007A6CC3 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */; }; AB1815C815D21469007A6CC3 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */; }; AB1815C915D21469007A6CC3 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3B135B8ACE00E977B3 /* version.cpp */; }; AB1815CA15D21469007A6CC3 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0F135B8AED00E977B3 /* vfat.cpp */; }; AB1815CB15D21469007A6CC3 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD6135B8AED00E977B3 /* WavFile.cpp */; }; AB1815CC15D21469007A6CC3 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3C135B8ACE00E977B3 /* wifi.cpp */; }; AB1815CD15D21469007A6CC3 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE11135B8AED00E977B3 /* xstring.cpp */; }; AB1815CE15D21469007A6CC3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABAC890814B7943E001B299F /* main.m */; }; AB1815CF15D21469007A6CC3 /* appDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */; }; AB1815D015D21469007A6CC3 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; }; AB1815D115D21469007A6CC3 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; }; AB1815D215D21469007A6CC3 /* emuWindowDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */; }; AB1815D315D21469007A6CC3 /* cocoa_input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */; }; AB1815D415D21469007A6CC3 /* input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F614BE3169006EA2D5 /* input_legacy.mm */; }; AB1815D515D21469007A6CC3 /* nds_control_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */; }; AB1815D615D21469007A6CC3 /* preferences_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */; }; AB1815D715D21469007A6CC3 /* screen_state_legacy.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */; }; AB1815D815D21469007A6CC3 /* video_output_view_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */; }; AB1815D915D21469007A6CC3 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */; }; AB1815DA15D21469007A6CC3 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */; }; AB1815EA15D21469007A6CC3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB1815EB15D21469007A6CC3 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECE60D9D57F600ED561B /* OpenGL.framework */; }; AB1815EC15D21469007A6CC3 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECEF0D9D581900ED561B /* AudioUnit.framework */; }; AB1815ED15D21469007A6CC3 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB1815EE15D21469007A6CC3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB1815EF15D21469007A6CC3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; }; AB1815F915D214F2007A6CC3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; AB1815FA15D214F2007A6CC3 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA714AAF77000E83E91 /* README.MAC */; }; AB1815FB15D214F2007A6CC3 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA814AAF77000E83E91 /* AUTHORS */; }; AB1815FC15D214F2007A6CC3 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EA914AAF77000E83E91 /* ChangeLog */; }; AB1815FD15D214F2007A6CC3 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAA14AAF77000E83E91 /* COPYING */; }; AB1815FE15D214F2007A6CC3 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB0A0EAB14AAF77000E83E91 /* README */; }; AB1815FF15D214F2007A6CC3 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */; }; AB18160015D214F2007A6CC3 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; }; AB18160115D214F2007A6CC3 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; }; AB18160215D214F2007A6CC3 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; }; AB18160315D214F2007A6CC3 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; AB18160415D214F2007A6CC3 /* MainMenu (Legacy).xib in Resources */ = {isa = PBXBuildFile; fileRef = AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */; }; AB18160515D214F2007A6CC3 /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */; }; AB18160615D214F2007A6CC3 /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */; }; AB18160715D214F2007A6CC3 /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */; }; AB18160815D214F2007A6CC3 /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */; }; AB18160915D214F2007A6CC3 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */; }; AB18160A15D214F2007A6CC3 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */; }; AB18160B15D214F2007A6CC3 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */; }; AB18160C15D214F2007A6CC3 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */; }; AB18160D15D214F2007A6CC3 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */; }; AB18160E15D214F2007A6CC3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ABEB321914C56182007F0D4C /* InfoPlist.strings */; }; AB18160F15D214F2007A6CC3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB18161115D214F2007A6CC3 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */; }; AB18161215D214F2007A6CC3 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */; }; AB18161315D214F2007A6CC3 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0E135B8ACE00E977B3 /* addons.cpp */; }; AB18161415D214F2007A6CC3 /* aggdraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0F135B8ACE00E977B3 /* aggdraw.cpp */; }; AB18161515D214F2007A6CC3 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */; }; AB18161615D214F2007A6CC3 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD11135B8ACE00E977B3 /* armcpu.cpp */; }; AB18161715D214F2007A6CC3 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD12135B8ACE00E977B3 /* bios.cpp */; }; AB18161815D214F2007A6CC3 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF0135B8AED00E977B3 /* cache.cpp */; }; AB18161915D214F2007A6CC3 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */; }; AB18161A15D214F2007A6CC3 /* commandline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD14135B8ACE00E977B3 /* commandline.cpp */; }; AB18161B15D214F2007A6CC3 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD15135B8ACE00E977B3 /* common.cpp */; }; AB18161C15D214F2007A6CC3 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD16135B8ACE00E977B3 /* cp15.cpp */; }; AB18161D15D214F2007A6CC3 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */; }; AB18161E15D214F2007A6CC3 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE2135B8AED00E977B3 /* crc.cpp */; }; AB18161F15D214F2007A6CC3 /* ctrlssdl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD17135B8ACE00E977B3 /* ctrlssdl.cpp */; }; AB18162015D214F2007A6CC3 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDF135B8AED00E977B3 /* datetime.cpp */; }; AB18162115D214F2007A6CC3 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD18135B8ACE00E977B3 /* debug.cpp */; }; AB18162215D214F2007A6CC3 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE4135B8AED00E977B3 /* decrypt.cpp */; }; AB18162315D214F2007A6CC3 /* desmume_config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD19135B8ACE00E977B3 /* desmume_config.cpp */; }; AB18162415D214F2007A6CC3 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF3135B8AED00E977B3 /* directory.cpp */; }; AB18162515D214F2007A6CC3 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */; }; AB18162615D214F2007A6CC3 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF5135B8AED00E977B3 /* disc.cpp */; }; AB18162715D214F2007A6CC3 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE8135B8AED00E977B3 /* dlditool.cpp */; }; AB18162815D214F2007A6CC3 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1B135B8ACE00E977B3 /* driver.cpp */; }; AB18162915D214F2007A6CC3 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE9135B8AED00E977B3 /* emufat.cpp */; }; AB18162A15D214F2007A6CC3 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1C135B8ACE00E977B3 /* emufile.cpp */; }; AB18162B15D214F2007A6CC3 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF9135B8AED00E977B3 /* fatdir.cpp */; }; AB18162C15D214F2007A6CC3 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFB135B8AED00E977B3 /* fatfile.cpp */; }; AB18162D15D214F2007A6CC3 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */; }; AB18162E15D214F2007A6CC3 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */; }; AB18162F15D214F2007A6CC3 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */; }; AB18163015D214F2007A6CC3 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFF135B8AED00E977B3 /* filetime.cpp */; }; AB18163115D214F2007A6CC3 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */; }; AB18163215D214F2007A6CC3 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1E135B8ACE00E977B3 /* firmware.cpp */; }; AB18163315D214F2007A6CC3 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */; }; AB18163415D214F2007A6CC3 /* gdbstub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB0135B8AED00E977B3 /* gdbstub.cpp */; }; AB18163515D214F2007A6CC3 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */; }; AB18163615D214F2007A6CC3 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD24135B8ACE00E977B3 /* GPU.cpp */; }; AB18163715D214F2007A6CC3 /* GPU_osd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD23135B8ACE00E977B3 /* GPU_osd.cpp */; }; AB18163815D214F2007A6CC3 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */; }; AB18163915D214F2007A6CC3 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDEC135B8AED00E977B3 /* guid.cpp */; }; AB18163A15D214F2007A6CC3 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE6135B8AED00E977B3 /* header.cpp */; }; AB18163B15D214F2007A6CC3 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE01135B8AED00E977B3 /* libfat.cpp */; }; AB18163C15D214F2007A6CC3 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */; }; AB18163D15D214F2007A6CC3 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE05135B8AED00E977B3 /* lock.cpp */; }; AB18163E15D214F2007A6CC3 /* lua-engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD25135B8ACE00E977B3 /* lua-engine.cpp */; }; AB18163F15D214F2007A6CC3 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDAC135B8AED00E977B3 /* main.cpp */; }; AB18164015D214F2007A6CC3 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD26135B8ACE00E977B3 /* matrix.cpp */; }; AB18164115D214F2007A6CC3 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD27135B8ACE00E977B3 /* mc.cpp */; }; AB18164215D214F2007A6CC3 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0A135B8AED00E977B3 /* md5.cpp */; }; AB18164315D214F2007A6CC3 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB4135B8AED00E977B3 /* metaspu.cpp */; }; AB18164415D214F2007A6CC3 /* mic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2A135B8ACE00E977B3 /* mic.cpp */; }; AB18164515D214F2007A6CC3 /* mic_alsa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD28135B8ACE00E977B3 /* mic_alsa.cpp */; }; AB18164615D214F2007A6CC3 /* mic_openal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD29135B8ACE00E977B3 /* mic_openal.cpp */; }; AB18164715D214F2007A6CC3 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2B135B8ACE00E977B3 /* MMU.cpp */; }; AB18164815D214F2007A6CC3 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */; }; AB18164915D214F2007A6CC3 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2C135B8ACE00E977B3 /* movie.cpp */; }; AB18164A15D214F2007A6CC3 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */; }; AB18164B15D214F2007A6CC3 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE08135B8AED00E977B3 /* partition.cpp */; }; AB18164C15D214F2007A6CC3 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2F135B8ACE00E977B3 /* path.cpp */; }; AB18164D15D214F2007A6CC3 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD30135B8ACE00E977B3 /* rasterize.cpp */; }; AB18164E15D214F2007A6CC3 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */; }; AB18164F15D214F2007A6CC3 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD31135B8ACE00E977B3 /* readwrite.cpp */; }; AB18165015D214F2007A6CC3 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD32135B8ACE00E977B3 /* render3D.cpp */; }; AB18165115D214F2007A6CC3 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */; }; AB18165215D214F2007A6CC3 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD34135B8ACE00E977B3 /* rtc.cpp */; }; AB18165315D214F2007A6CC3 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD35135B8ACE00E977B3 /* saves.cpp */; }; AB18165415D214F2007A6CC3 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD36135B8ACE00E977B3 /* slot1.cpp */; }; AB18165515D214F2007A6CC3 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */; }; AB18165615D214F2007A6CC3 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */; }; AB18165715D214F2007A6CC3 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */; }; AB18165815D214F2007A6CC3 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */; }; AB18165915D214F2007A6CC3 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */; }; AB18165A15D214F2007A6CC3 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */; }; AB18165B15D214F2007A6CC3 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */; }; AB18165C15D214F2007A6CC3 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */; }; AB18165D15D214F2007A6CC3 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */; }; AB18165E15D214F2007A6CC3 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */; }; AB18165F15D214F2007A6CC3 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */; }; AB18166015D214F2007A6CC3 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; AB18166115D214F2007A6CC3 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB7135B8AED00E977B3 /* SndOut.cpp */; }; AB18166215D214F2007A6CC3 /* sndsdl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD37135B8ACE00E977B3 /* sndsdl.cpp */; }; AB18166315D214F2007A6CC3 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */; }; AB18166415D214F2007A6CC3 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD38135B8ACE00E977B3 /* SPU.cpp */; }; AB18166515D214F2007A6CC3 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */; }; AB18166615D214F2007A6CC3 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0C135B8AED00E977B3 /* task.cpp */; }; AB18166715D214F2007A6CC3 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */; }; AB18166815D214F2007A6CC3 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD39135B8ACE00E977B3 /* texcache.cpp */; }; AB18166915D214F2007A6CC3 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */; }; AB18166A15D214F2007A6CC3 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */; }; AB18166B15D214F2007A6CC3 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121A1426523900E2ABDD /* tinystr.cpp */; }; AB18166C15D214F2007A6CC3 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121C1426523900E2ABDD /* tinyxml.cpp */; }; AB18166D15D214F2007A6CC3 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */; }; AB18166E15D214F2007A6CC3 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */; }; AB18166F15D214F2007A6CC3 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3B135B8ACE00E977B3 /* version.cpp */; }; AB18167015D214F2007A6CC3 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0F135B8AED00E977B3 /* vfat.cpp */; }; AB18167115D214F2007A6CC3 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD6135B8AED00E977B3 /* WavFile.cpp */; }; AB18167215D214F2007A6CC3 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3C135B8ACE00E977B3 /* wifi.cpp */; }; AB18167315D214F2007A6CC3 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE11135B8AED00E977B3 /* xstring.cpp */; }; AB18167415D214F2007A6CC3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABAC890814B7943E001B299F /* main.m */; }; AB18167515D214F2007A6CC3 /* appDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */; }; AB18167615D214F2007A6CC3 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; }; AB18167715D214F2007A6CC3 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; }; AB18167815D214F2007A6CC3 /* emuWindowDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */; }; AB18167915D214F2007A6CC3 /* cocoa_input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */; }; AB18167A15D214F2007A6CC3 /* input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F614BE3169006EA2D5 /* input_legacy.mm */; }; AB18167B15D214F2007A6CC3 /* nds_control_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */; }; AB18167C15D214F2007A6CC3 /* preferences_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */; }; AB18167D15D214F2007A6CC3 /* screen_state_legacy.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */; }; AB18167E15D214F2007A6CC3 /* video_output_view_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */; }; AB18167F15D214F2007A6CC3 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */; }; AB18168015D214F2007A6CC3 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */; }; AB18169015D214F2007A6CC3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AB18169115D214F2007A6CC3 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECE60D9D57F600ED561B /* OpenGL.framework */; }; AB18169215D214F2007A6CC3 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECEF0D9D581900ED561B /* AudioUnit.framework */; }; AB1816B415D216D6007A6CC3 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */; }; AB1816B615D216EC007A6CC3 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */; }; AB1816B715D216F2007A6CC3 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */; }; AB1816B815D216F5007A6CC3 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */; }; AB2F5B031704EE0100E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F5B021704EE0100E28885 /* utilities.c */; }; AB2F5B041704EE0100E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F5B021704EE0100E28885 /* utilities.c */; }; AB2F5B051704EE0100E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F5B021704EE0100E28885 /* utilities.c */; }; AB2F5B061704EE0100E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F5B021704EE0100E28885 /* utilities.c */; }; AB2F5B071704EE0100E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F5B021704EE0100E28885 /* utilities.c */; }; AB2F5B081704EE0100E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F5B021704EE0100E28885 /* utilities.c */; }; AB2F5B091704EE0100E28885 /* utilities.c in Sources */ = {isa = PBXBuildFile; fileRef = AB2F5B021704EE0100E28885 /* utilities.c */; }; AB3AD16C14C4F6AD00D7D192 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */; }; AB3AD16D14C4F6AD00D7D192 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */; }; AB3AD16E14C4F6AD00D7D192 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */; }; AB3AD16F14C4F6AD00D7D192 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */; }; AB46780A14ABD4890002FF94 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */; }; AB46780B14ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; }; AB46780C14ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; }; AB46780D14ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; }; AB46780E14ABD4890002FF94 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */; }; AB46780F14ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; }; AB46781014ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; }; AB46781114ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; }; AB46781214ABD4890002FF94 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */; }; AB46781314ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; }; AB46781414ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; }; AB46781514ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; }; AB46781614ABD4890002FF94 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */; }; AB46781714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */; }; AB46781814ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */; }; AB46781914ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */; }; AB4F981716C30117000E90EA /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */; }; AB73B12B14BDA01C00F49C92 /* appDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */; }; AB73B12C14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */; }; AB73B12D14BDA01C00F49C92 /* appDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */; }; AB73B12E14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */; }; AB73B12F14BDA01C00F49C92 /* appDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */; }; AB73B13014BDA01C00F49C92 /* emuWindowDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */; }; AB73B13114BDA01C00F49C92 /* appDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */; }; AB73B13214BDA01C00F49C92 /* emuWindowDelegate_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */; }; AB73B1C514BDA94800F49C92 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */; }; AB73B1C614BDA94800F49C92 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */; }; AB73B1C714BDA94800F49C92 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */; }; AB73B1C814BDA94800F49C92 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */; }; AB73B1C914BDA94800F49C92 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */; }; AB73B1CA14BDA94800F49C92 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */; }; AB73B1CB14BDA94800F49C92 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */; }; AB73B1CC14BDA94800F49C92 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */; }; AB73B1CD14BDA94800F49C92 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */; }; AB73B1CE14BDA94800F49C92 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */; }; AB73B1CF14BDA94800F49C92 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */; }; AB73B1D014BDA94800F49C92 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */; }; AB73B1D114BDA94800F49C92 /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */; }; AB73B1D214BDA94800F49C92 /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */; }; AB73B1D314BDA94800F49C92 /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */; }; AB73B1D414BDA94800F49C92 /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */; }; AB751A681696535D00AFA00D /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */; }; AB7522E414C7D879009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB7522E514C7D879009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB7522E614C7D879009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB7522E714C7D879009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */; }; AB8FE37614B652EC009E20B1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; }; AB8FE37714B652EC009E20B1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; }; AB8FE37814B652EC009E20B1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; }; AB8FE37914B652EC009E20B1 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8FE37514B652EC009E20B1 /* cocoa_util.mm */; }; AB8FE48C14B6657D009E20B1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; }; AB97D29616964D01002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97D29516964D01002AC11B /* Accelerate.framework */; }; AB97D45116964DF2002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97D29516964D01002AC11B /* Accelerate.framework */; }; AB97D45216964E0A002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97D29516964D01002AC11B /* Accelerate.framework */; }; AB97D45316964E0F002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97D29516964D01002AC11B /* Accelerate.framework */; }; AB97D45416964E14002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97D29516964D01002AC11B /* Accelerate.framework */; }; AB97D45516964E26002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97D29516964D01002AC11B /* Accelerate.framework */; }; AB97D45616964E2D002AC11B /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB97D50916964E30002AC11B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB97D58716964E34002AC11B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; }; AB97D58816964E3A002AC11B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB97D29516964D01002AC11B /* Accelerate.framework */; }; AB97D58916964E3F002AC11B /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; AB97D58A16964E42002AC11B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; AB97D58B16964E44002AC11B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1D14AACACC00E83E91 /* libz.dylib */; }; ABAC890914B7943E001B299F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABAC890814B7943E001B299F /* main.m */; }; ABAC890A14B7943E001B299F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABAC890814B7943E001B299F /* main.m */; }; ABAC890B14B7943E001B299F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABAC890814B7943E001B299F /* main.m */; }; ABAC890C14B7943E001B299F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABAC890814B7943E001B299F /* main.m */; }; ABBF053014B5436E00E505A0 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; }; ABBF053114B5436E00E505A0 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; }; ABBF053214B5436E00E505A0 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; }; ABBF053314B5436E00E505A0 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABBF052F14B5436E00E505A0 /* cocoa_file.mm */; }; ABD0A5661501AC5C0074A094 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */; }; ABD0A5671501AC5C0074A094 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */; }; ABD0A5681501AC5C0074A094 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */; }; ABD0A5691501AC5C0074A094 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */; }; ABD0A56A1501AC5C0074A094 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */; }; ABD0A56B1501AC5C0074A094 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */; }; ABD0A56C1501AC5C0074A094 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */; }; ABD0A56D1501AC5C0074A094 /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */; }; ABE240FF14BE3169006EA2D5 /* cocoa_input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */; }; ABE2410014BE3169006EA2D5 /* input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F614BE3169006EA2D5 /* input_legacy.mm */; }; ABE2410114BE3169006EA2D5 /* nds_control_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */; }; ABE2410214BE3169006EA2D5 /* preferences_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */; }; ABE2410314BE3169006EA2D5 /* screen_state_legacy.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */; }; ABE2410414BE3169006EA2D5 /* video_output_view_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */; }; ABE2410514BE3169006EA2D5 /* cocoa_input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */; }; ABE2410614BE3169006EA2D5 /* input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F614BE3169006EA2D5 /* input_legacy.mm */; }; ABE2410714BE3169006EA2D5 /* nds_control_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */; }; ABE2410814BE3169006EA2D5 /* preferences_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */; }; ABE2410914BE3169006EA2D5 /* screen_state_legacy.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */; }; ABE2410A14BE3169006EA2D5 /* video_output_view_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */; }; ABE2410B14BE3169006EA2D5 /* cocoa_input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */; }; ABE2410C14BE3169006EA2D5 /* input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F614BE3169006EA2D5 /* input_legacy.mm */; }; ABE2410D14BE3169006EA2D5 /* nds_control_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */; }; ABE2410E14BE3169006EA2D5 /* preferences_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */; }; ABE2410F14BE3169006EA2D5 /* screen_state_legacy.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */; }; ABE2411014BE3169006EA2D5 /* video_output_view_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */; }; ABE2411114BE3169006EA2D5 /* cocoa_input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */; }; ABE2411214BE3169006EA2D5 /* input_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F614BE3169006EA2D5 /* input_legacy.mm */; }; ABE2411314BE3169006EA2D5 /* nds_control_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */; }; ABE2411414BE3169006EA2D5 /* preferences_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */; }; ABE2411514BE3169006EA2D5 /* screen_state_legacy.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */; }; ABE2411614BE3169006EA2D5 /* video_output_view_legacy.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */; }; ABEFD81D14BB9E65004DB9DC /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */; }; ABEFD81E14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */; }; ABEFD81F14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */; }; ABEFD82014BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */; }; ABEFD82114BB9E65004DB9DC /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */; }; ABEFD82214BB9E65004DB9DC /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */; }; ABEFD82314BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */; }; ABEFD82414BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */; }; ABEFD82514BB9E65004DB9DC /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */; }; ABEFD82614BB9E65004DB9DC /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */; }; ABEFD82714BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */; }; ABEFD82814BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */; }; ABEFD82914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */; }; ABEFD82A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */; }; ABEFD82B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */; }; ABEFD82C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */; }; ABF4007714B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; ABF4007814B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; ABF4007914B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; ABF4007A14B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */; }; ABF4007F14B4F1C000578AE7 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; ABF4008014B4F1C000578AE7 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; ABF4008114B4F1C000578AE7 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; ABF4008214B4F1C000578AE7 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */; }; ABF50BAF169F61540018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B70169F61540018C08D /* assembler.cpp */; }; ABF50BB0169F61540018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B72169F61540018C08D /* assert.cpp */; }; ABF50BB1169F61540018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B74169F61540018C08D /* buffer.cpp */; }; ABF50BB2169F61540018C08D /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B77169F61540018C08D /* compiler.cpp */; }; ABF50BB3169F61540018C08D /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B79169F61540018C08D /* compilercontext.cpp */; }; ABF50BB4169F61540018C08D /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7B169F61540018C08D /* compilerfunc.cpp */; }; ABF50BB5169F61540018C08D /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7D169F61540018C08D /* compileritem.cpp */; }; ABF50BB6169F61540018C08D /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7F169F61540018C08D /* context.cpp */; }; ABF50BB7169F61540018C08D /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B81169F61540018C08D /* cpuinfo.cpp */; }; ABF50BB8169F61540018C08D /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B83169F61540018C08D /* defs.cpp */; }; ABF50BB9169F61540018C08D /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B85169F61540018C08D /* func.cpp */; }; ABF50BBA169F61540018C08D /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B89169F61540018C08D /* logger.cpp */; }; ABF50BBB169F61540018C08D /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8B169F61540018C08D /* memorymanager.cpp */; }; ABF50BBC169F61540018C08D /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8D169F61540018C08D /* memorymarker.cpp */; }; ABF50BBD169F61540018C08D /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8F169F61540018C08D /* operand.cpp */; }; ABF50BBE169F61540018C08D /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B92169F61540018C08D /* stringbuilder.cpp */; }; ABF50BBF169F61540018C08D /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B94169F61540018C08D /* stringutil.cpp */; }; ABF50BC0169F61540018C08D /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B96169F61540018C08D /* virtualmemory.cpp */; }; ABF50BC1169F61540018C08D /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B98169F61540018C08D /* zonememory.cpp */; }; ABF50BC2169F61540018C08D /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9B169F61540018C08D /* x86assembler.cpp */; }; ABF50BC3169F61540018C08D /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9D169F61540018C08D /* x86compiler.cpp */; }; ABF50BC4169F61540018C08D /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9F169F61540018C08D /* x86compilercontext.cpp */; }; ABF50BC5169F61540018C08D /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA1169F61540018C08D /* x86compilerfunc.cpp */; }; ABF50BC6169F61540018C08D /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA3169F61540018C08D /* x86compileritem.cpp */; }; ABF50BC7169F61540018C08D /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA5169F61540018C08D /* x86cpuinfo.cpp */; }; ABF50BC8169F61540018C08D /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA7169F61540018C08D /* x86defs.cpp */; }; ABF50BC9169F61540018C08D /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA9169F61540018C08D /* x86func.cpp */; }; ABF50BCA169F61540018C08D /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BAB169F61540018C08D /* x86operand.cpp */; }; ABF50BCB169F61540018C08D /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BAD169F61540018C08D /* x86util.cpp */; }; ABF50BE9169F61540018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B70169F61540018C08D /* assembler.cpp */; }; ABF50BEA169F61540018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B72169F61540018C08D /* assert.cpp */; }; ABF50BEB169F61540018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B74169F61540018C08D /* buffer.cpp */; }; ABF50BEC169F61540018C08D /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B77169F61540018C08D /* compiler.cpp */; }; ABF50BED169F61540018C08D /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B79169F61540018C08D /* compilercontext.cpp */; }; ABF50BEE169F61540018C08D /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7B169F61540018C08D /* compilerfunc.cpp */; }; ABF50BEF169F61540018C08D /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7D169F61540018C08D /* compileritem.cpp */; }; ABF50BF0169F61540018C08D /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7F169F61540018C08D /* context.cpp */; }; ABF50BF1169F61540018C08D /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B81169F61540018C08D /* cpuinfo.cpp */; }; ABF50BF2169F61540018C08D /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B83169F61540018C08D /* defs.cpp */; }; ABF50BF3169F61540018C08D /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B85169F61540018C08D /* func.cpp */; }; ABF50BF4169F61540018C08D /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B89169F61540018C08D /* logger.cpp */; }; ABF50BF5169F61540018C08D /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8B169F61540018C08D /* memorymanager.cpp */; }; ABF50BF6169F61540018C08D /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8D169F61540018C08D /* memorymarker.cpp */; }; ABF50BF7169F61540018C08D /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8F169F61540018C08D /* operand.cpp */; }; ABF50BF8169F61540018C08D /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B92169F61540018C08D /* stringbuilder.cpp */; }; ABF50BF9169F61540018C08D /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B94169F61540018C08D /* stringutil.cpp */; }; ABF50BFA169F61540018C08D /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B96169F61540018C08D /* virtualmemory.cpp */; }; ABF50BFB169F61540018C08D /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B98169F61540018C08D /* zonememory.cpp */; }; ABF50BFC169F61540018C08D /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9B169F61540018C08D /* x86assembler.cpp */; }; ABF50BFD169F61540018C08D /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9D169F61540018C08D /* x86compiler.cpp */; }; ABF50BFE169F61540018C08D /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9F169F61540018C08D /* x86compilercontext.cpp */; }; ABF50BFF169F61540018C08D /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA1169F61540018C08D /* x86compilerfunc.cpp */; }; ABF50C00169F61540018C08D /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA3169F61540018C08D /* x86compileritem.cpp */; }; ABF50C01169F61540018C08D /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA5169F61540018C08D /* x86cpuinfo.cpp */; }; ABF50C02169F61540018C08D /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA7169F61540018C08D /* x86defs.cpp */; }; ABF50C03169F61540018C08D /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA9169F61540018C08D /* x86func.cpp */; }; ABF50C04169F61540018C08D /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BAB169F61540018C08D /* x86operand.cpp */; }; ABF50C05169F61540018C08D /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BAD169F61540018C08D /* x86util.cpp */; }; ABF50C06169F61540018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B70169F61540018C08D /* assembler.cpp */; }; ABF50C07169F61540018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B72169F61540018C08D /* assert.cpp */; }; ABF50C08169F61540018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B74169F61540018C08D /* buffer.cpp */; }; ABF50C09169F61540018C08D /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B77169F61540018C08D /* compiler.cpp */; }; ABF50C0A169F61540018C08D /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B79169F61540018C08D /* compilercontext.cpp */; }; ABF50C0B169F61540018C08D /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7B169F61540018C08D /* compilerfunc.cpp */; }; ABF50C0C169F61540018C08D /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7D169F61540018C08D /* compileritem.cpp */; }; ABF50C0D169F61540018C08D /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7F169F61540018C08D /* context.cpp */; }; ABF50C0E169F61540018C08D /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B81169F61540018C08D /* cpuinfo.cpp */; }; ABF50C0F169F61540018C08D /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B83169F61540018C08D /* defs.cpp */; }; ABF50C10169F61540018C08D /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B85169F61540018C08D /* func.cpp */; }; ABF50C11169F61540018C08D /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B89169F61540018C08D /* logger.cpp */; }; ABF50C12169F61540018C08D /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8B169F61540018C08D /* memorymanager.cpp */; }; ABF50C13169F61540018C08D /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8D169F61540018C08D /* memorymarker.cpp */; }; ABF50C14169F61540018C08D /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8F169F61540018C08D /* operand.cpp */; }; ABF50C15169F61540018C08D /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B92169F61540018C08D /* stringbuilder.cpp */; }; ABF50C16169F61540018C08D /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B94169F61540018C08D /* stringutil.cpp */; }; ABF50C17169F61540018C08D /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B96169F61540018C08D /* virtualmemory.cpp */; }; ABF50C18169F61540018C08D /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B98169F61540018C08D /* zonememory.cpp */; }; ABF50C19169F61540018C08D /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9B169F61540018C08D /* x86assembler.cpp */; }; ABF50C1A169F61540018C08D /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9D169F61540018C08D /* x86compiler.cpp */; }; ABF50C1B169F61540018C08D /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9F169F61540018C08D /* x86compilercontext.cpp */; }; ABF50C1C169F61540018C08D /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA1169F61540018C08D /* x86compilerfunc.cpp */; }; ABF50C1D169F61540018C08D /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA3169F61540018C08D /* x86compileritem.cpp */; }; ABF50C1E169F61540018C08D /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA5169F61540018C08D /* x86cpuinfo.cpp */; }; ABF50C1F169F61540018C08D /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA7169F61540018C08D /* x86defs.cpp */; }; ABF50C20169F61540018C08D /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA9169F61540018C08D /* x86func.cpp */; }; ABF50C21169F61540018C08D /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BAB169F61540018C08D /* x86operand.cpp */; }; ABF50C22169F61540018C08D /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BAD169F61540018C08D /* x86util.cpp */; }; ABF50C40169F61540018C08D /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B70169F61540018C08D /* assembler.cpp */; }; ABF50C41169F61540018C08D /* assert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B72169F61540018C08D /* assert.cpp */; }; ABF50C42169F61540018C08D /* buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B74169F61540018C08D /* buffer.cpp */; }; ABF50C43169F61540018C08D /* compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B77169F61540018C08D /* compiler.cpp */; }; ABF50C44169F61540018C08D /* compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B79169F61540018C08D /* compilercontext.cpp */; }; ABF50C45169F61540018C08D /* compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7B169F61540018C08D /* compilerfunc.cpp */; }; ABF50C46169F61540018C08D /* compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7D169F61540018C08D /* compileritem.cpp */; }; ABF50C47169F61540018C08D /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B7F169F61540018C08D /* context.cpp */; }; ABF50C48169F61540018C08D /* cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B81169F61540018C08D /* cpuinfo.cpp */; }; ABF50C49169F61540018C08D /* defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B83169F61540018C08D /* defs.cpp */; }; ABF50C4A169F61540018C08D /* func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B85169F61540018C08D /* func.cpp */; }; ABF50C4B169F61540018C08D /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B89169F61540018C08D /* logger.cpp */; }; ABF50C4C169F61540018C08D /* memorymanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8B169F61540018C08D /* memorymanager.cpp */; }; ABF50C4D169F61540018C08D /* memorymarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8D169F61540018C08D /* memorymarker.cpp */; }; ABF50C4E169F61540018C08D /* operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B8F169F61540018C08D /* operand.cpp */; }; ABF50C4F169F61540018C08D /* stringbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B92169F61540018C08D /* stringbuilder.cpp */; }; ABF50C50169F61540018C08D /* stringutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B94169F61540018C08D /* stringutil.cpp */; }; ABF50C51169F61540018C08D /* virtualmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B96169F61540018C08D /* virtualmemory.cpp */; }; ABF50C52169F61540018C08D /* zonememory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B98169F61540018C08D /* zonememory.cpp */; }; ABF50C53169F61540018C08D /* x86assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9B169F61540018C08D /* x86assembler.cpp */; }; ABF50C54169F61540018C08D /* x86compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9D169F61540018C08D /* x86compiler.cpp */; }; ABF50C55169F61540018C08D /* x86compilercontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50B9F169F61540018C08D /* x86compilercontext.cpp */; }; ABF50C56169F61540018C08D /* x86compilerfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA1169F61540018C08D /* x86compilerfunc.cpp */; }; ABF50C57169F61540018C08D /* x86compileritem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA3169F61540018C08D /* x86compileritem.cpp */; }; ABF50C58169F61540018C08D /* x86cpuinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA5169F61540018C08D /* x86cpuinfo.cpp */; }; ABF50C59169F61540018C08D /* x86defs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA7169F61540018C08D /* x86defs.cpp */; }; ABF50C5A169F61540018C08D /* x86func.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BA9169F61540018C08D /* x86func.cpp */; }; ABF50C5B169F61540018C08D /* x86operand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BAB169F61540018C08D /* x86operand.cpp */; }; ABF50C5C169F61540018C08D /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABF50BAD169F61540018C08D /* x86util.cpp */; }; ABFE4242143E32F0009A3CCE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F4B55090F53924500C8B514 /* Localizable.strings */; }; ABFE4251143E32F0009A3CCE /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD0E135B8ACE00E977B3 /* addons.cpp */; }; ABFE4252143E32F0009A3CCE /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */; }; ABFE4253143E32F0009A3CCE /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD11135B8ACE00E977B3 /* armcpu.cpp */; }; ABFE4254143E32F0009A3CCE /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD12135B8ACE00E977B3 /* bios.cpp */; }; ABFE4255143E32F0009A3CCE /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */; }; ABFE4256143E32F0009A3CCE /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD15135B8ACE00E977B3 /* common.cpp */; }; ABFE4257143E32F0009A3CCE /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD16135B8ACE00E977B3 /* cp15.cpp */; }; ABFE4258143E32F0009A3CCE /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD18135B8ACE00E977B3 /* debug.cpp */; }; ABFE4259143E32F0009A3CCE /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */; }; ABFE425A143E32F0009A3CCE /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1B135B8ACE00E977B3 /* driver.cpp */; }; ABFE425B143E32F0009A3CCE /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1C135B8ACE00E977B3 /* emufile.cpp */; }; ABFE425C143E32F0009A3CCE /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */; }; ABFE425D143E32F0009A3CCE /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1E135B8ACE00E977B3 /* firmware.cpp */; }; ABFE425E143E32F0009A3CCE /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */; }; ABFE425F143E32F0009A3CCE /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */; }; ABFE4260143E32F0009A3CCE /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */; }; ABFE4261143E32F0009A3CCE /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD24135B8ACE00E977B3 /* GPU.cpp */; }; ABFE4262143E32F0009A3CCE /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD26135B8ACE00E977B3 /* matrix.cpp */; }; ABFE4263143E32F0009A3CCE /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD27135B8ACE00E977B3 /* mc.cpp */; }; ABFE4264143E32F0009A3CCE /* mic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2A135B8ACE00E977B3 /* mic.cpp */; }; ABFE4265143E32F0009A3CCE /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2B135B8ACE00E977B3 /* MMU.cpp */; }; ABFE4266143E32F0009A3CCE /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2C135B8ACE00E977B3 /* movie.cpp */; }; ABFE4267143E32F0009A3CCE /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */; }; ABFE4268143E32F0009A3CCE /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD2F135B8ACE00E977B3 /* path.cpp */; }; ABFE4269143E32F0009A3CCE /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD30135B8ACE00E977B3 /* rasterize.cpp */; }; ABFE426A143E32F0009A3CCE /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD31135B8ACE00E977B3 /* readwrite.cpp */; }; ABFE426B143E32F0009A3CCE /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD32135B8ACE00E977B3 /* render3D.cpp */; }; ABFE426C143E32F0009A3CCE /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */; }; ABFE426D143E32F0009A3CCE /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD34135B8ACE00E977B3 /* rtc.cpp */; }; ABFE426E143E32F0009A3CCE /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD35135B8ACE00E977B3 /* saves.cpp */; }; ABFE426F143E32F0009A3CCE /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD36135B8ACE00E977B3 /* slot1.cpp */; }; ABFE4270143E32F0009A3CCE /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD38135B8ACE00E977B3 /* SPU.cpp */; }; ABFE4271143E32F0009A3CCE /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD39135B8ACE00E977B3 /* texcache.cpp */; }; ABFE4272143E32F0009A3CCE /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */; }; ABFE4273143E32F0009A3CCE /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3B135B8ACE00E977B3 /* version.cpp */; }; ABFE4274143E32F0009A3CCE /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD3C135B8ACE00E977B3 /* wifi.cpp */; }; ABFE4275143E32F0009A3CCE /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */; }; ABFE4276143E32F0009A3CCE /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */; }; ABFE4277143E32F0009A3CCE /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */; }; ABFE4278143E32F0009A3CCE /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */; }; ABFE4279143E32F0009A3CCE /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */; }; ABFE427A143E32F0009A3CCE /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */; }; ABFE427B143E32F0009A3CCE /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */; }; ABFE427C143E32F0009A3CCE /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */; }; ABFE427D143E32F0009A3CCE /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */; }; ABFE427E143E32F0009A3CCE /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */; }; ABFE427F143E32F0009A3CCE /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */; }; ABFE4280143E32F0009A3CCE /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB4135B8AED00E977B3 /* metaspu.cpp */; }; ABFE4281143E32F0009A3CCE /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDB7135B8AED00E977B3 /* SndOut.cpp */; }; ABFE4282143E32F0009A3CCE /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */; }; ABFE4283143E32F0009A3CCE /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */; }; ABFE4284143E32F0009A3CCE /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */; }; ABFE4285143E32F0009A3CCE /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */; }; ABFE4286143E32F0009A3CCE /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */; }; ABFE4287143E32F0009A3CCE /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */; }; ABFE4288143E32F0009A3CCE /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */; }; ABFE4289143E32F0009A3CCE /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */; }; ABFE428A143E32F0009A3CCE /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */; }; ABFE428B143E32F0009A3CCE /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD6135B8AED00E977B3 /* WavFile.cpp */; }; ABFE428C143E32F0009A3CCE /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */; }; ABFE428D143E32F0009A3CCE /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */; }; ABFE428E143E32F0009A3CCE /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDDF135B8AED00E977B3 /* datetime.cpp */; }; ABFE428F143E32F0009A3CCE /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE2135B8AED00E977B3 /* crc.cpp */; }; ABFE4290143E32F0009A3CCE /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE4135B8AED00E977B3 /* decrypt.cpp */; }; ABFE4291143E32F0009A3CCE /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE6135B8AED00E977B3 /* header.cpp */; }; ABFE4292143E32F0009A3CCE /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE8135B8AED00E977B3 /* dlditool.cpp */; }; ABFE4293143E32F0009A3CCE /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDE9135B8AED00E977B3 /* emufat.cpp */; }; ABFE4294143E32F0009A3CCE /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDEC135B8AED00E977B3 /* guid.cpp */; }; ABFE4295143E32F0009A3CCE /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF0135B8AED00E977B3 /* cache.cpp */; }; ABFE4296143E32F0009A3CCE /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF3135B8AED00E977B3 /* directory.cpp */; }; ABFE4297143E32F0009A3CCE /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF5135B8AED00E977B3 /* disc.cpp */; }; ABFE4298143E32F0009A3CCE /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDF9135B8AED00E977B3 /* fatdir.cpp */; }; ABFE4299143E32F0009A3CCE /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFB135B8AED00E977B3 /* fatfile.cpp */; }; ABFE429A143E32F0009A3CCE /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */; }; ABFE429B143E32F0009A3CCE /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CDFF135B8AED00E977B3 /* filetime.cpp */; }; ABFE429C143E32F0009A3CCE /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE01135B8AED00E977B3 /* libfat.cpp */; }; ABFE429D143E32F0009A3CCE /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */; }; ABFE429E143E32F0009A3CCE /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE05135B8AED00E977B3 /* lock.cpp */; }; ABFE429F143E32F0009A3CCE /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE08135B8AED00E977B3 /* partition.cpp */; }; ABFE42A0143E32F0009A3CCE /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0A135B8AED00E977B3 /* md5.cpp */; }; ABFE42A1143E32F0009A3CCE /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0C135B8AED00E977B3 /* task.cpp */; }; ABFE42A2143E32F0009A3CCE /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE0F135B8AED00E977B3 /* vfat.cpp */; }; ABFE42A3143E32F0009A3CCE /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB06CE11135B8AED00E977B3 /* xstring.cpp */; }; ABFE42A7143E32F0009A3CCE /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */; }; ABFE42A8143E32F0009A3CCE /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121A1426523900E2ABDD /* tinystr.cpp */; }; ABFE42A9143E32F0009A3CCE /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121C1426523900E2ABDD /* tinyxml.cpp */; }; ABFE42AA143E32F0009A3CCE /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */; }; ABFE42AB143E32F0009A3CCE /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */; }; ABFE42AD143E32F0009A3CCE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; ABFE42AE143E32F0009A3CCE /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECE60D9D57F600ED561B /* OpenGL.framework */; }; ABFE42AF143E32F0009A3CCE /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729BECEF0D9D581900ED561B /* AudioUnit.framework */; }; ABFE42B0143E32F0009A3CCE /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; ABFE42B1143E32F0009A3CCE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 1F4B55030F53921B00C8B514 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = translations/English.lproj/Localizable.strings; sourceTree = ""; }; 1F4B550D0F53928000C8B514 /* Italian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Italian; path = translations/Italian.lproj/Localizable.strings; sourceTree = ""; }; 1F4B550E0F53928400C8B514 /* Japanese */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Japanese; path = translations/Japanese.lproj/Localizable.strings; sourceTree = ""; }; 1F4B550F0F53928700C8B514 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = translations/French.lproj/Localizable.strings; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 729BECE60D9D57F600ED561B /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; 729BECEF0D9D581900ED561B /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; 72C000020D9D59E60046B7EA /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = translations/English.lproj/InfoPlist.strings; sourceTree = ""; }; 7FA9121A1426523900E2ABDD /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = ""; }; 7FA9121B1426523900E2ABDD /* tinystr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinystr.h; sourceTree = ""; }; 7FA9121C1426523900E2ABDD /* tinyxml.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxml.cpp; sourceTree = ""; }; 7FA9121D1426523900E2ABDD /* tinyxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinyxml.h; sourceTree = ""; }; 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlerror.cpp; sourceTree = ""; }; 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlparser.cpp; sourceTree = ""; }; 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = ""; }; AB0191D714BD72FC004CB612 /* French */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = French; path = "translations/French.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; AB0191D814BD72FF004CB612 /* Italian */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Italian; path = "translations/Italian.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; AB0191E614BD741B004CB612 /* Japanese */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Japanese; path = "translations/Japanese.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; AB0191E714BD741F004CB612 /* Chinese */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Chinese; path = "translations/Chinese.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; AB0191E814BD7423004CB612 /* Norwegian */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Norwegian; path = "translations/Norwegian.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; AB0191E914BD7425004CB612 /* Romanian */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Romanian; path = "translations/Romanian.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; AB06CB49135B8A4D00E977B3 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = ""; }; AB06CCD5135B8A9B00E977B3 /* DeSmuME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix.pch; sourceTree = ""; }; AB06CCD8135B8ACE00E977B3 /* addons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = addons.h; path = ../addons.h; sourceTree = SOURCE_ROOT; }; AB06CCD9135B8ACE00E977B3 /* agg2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = agg2d.h; path = ../agg2d.h; sourceTree = SOURCE_ROOT; }; AB06CCDA135B8ACE00E977B3 /* aggdraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aggdraw.h; path = ../aggdraw.h; sourceTree = SOURCE_ROOT; }; AB06CCDC135B8ACE00E977B3 /* armcpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = armcpu.h; path = ../armcpu.h; sourceTree = SOURCE_ROOT; }; AB06CCDD135B8ACE00E977B3 /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bios.h; path = ../bios.h; sourceTree = SOURCE_ROOT; }; AB06CCDE135B8ACE00E977B3 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bits.h; path = ../bits.h; sourceTree = SOURCE_ROOT; }; AB06CCDF135B8ACE00E977B3 /* cheatSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cheatSystem.h; path = ../cheatSystem.h; sourceTree = SOURCE_ROOT; }; AB06CCE0135B8ACE00E977B3 /* commandline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = commandline.h; path = ../commandline.h; sourceTree = SOURCE_ROOT; }; AB06CCE1135B8ACE00E977B3 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../common.h; sourceTree = SOURCE_ROOT; }; AB06CCE2135B8ACE00E977B3 /* cp15.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cp15.h; path = ../cp15.h; sourceTree = SOURCE_ROOT; }; AB06CCE3135B8ACE00E977B3 /* ctrlssdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ctrlssdl.h; path = ../ctrlssdl.h; sourceTree = SOURCE_ROOT; }; AB06CCE4135B8ACE00E977B3 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../debug.h; sourceTree = SOURCE_ROOT; }; AB06CCE5135B8ACE00E977B3 /* desmume_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = desmume_config.h; path = ../desmume_config.h; sourceTree = SOURCE_ROOT; }; AB06CCE6135B8ACE00E977B3 /* Disassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Disassembler.h; path = ../Disassembler.h; sourceTree = SOURCE_ROOT; }; AB06CCE7135B8ACE00E977B3 /* driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = driver.h; path = ../driver.h; sourceTree = SOURCE_ROOT; }; AB06CCE8135B8ACE00E977B3 /* emufile_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile_types.h; path = ../emufile_types.h; sourceTree = SOURCE_ROOT; }; AB06CCE9135B8ACE00E977B3 /* emufile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile.h; path = ../emufile.h; sourceTree = SOURCE_ROOT; }; AB06CCEA135B8ACE00E977B3 /* FIFO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FIFO.h; path = ../FIFO.h; sourceTree = SOURCE_ROOT; }; AB06CCEB135B8ACE00E977B3 /* firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = firmware.h; path = ../firmware.h; sourceTree = SOURCE_ROOT; }; AB06CCEC135B8ACE00E977B3 /* fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fs.h; path = ../fs.h; sourceTree = SOURCE_ROOT; }; AB06CCED135B8ACE00E977B3 /* gdbstub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gdbstub.h; path = ../gdbstub.h; sourceTree = SOURCE_ROOT; }; AB06CCEE135B8ACE00E977B3 /* gfx3d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gfx3d.h; path = ../gfx3d.h; sourceTree = SOURCE_ROOT; }; AB06CCEF135B8ACE00E977B3 /* GPU_osd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU_osd.h; path = ../GPU_osd.h; sourceTree = SOURCE_ROOT; }; AB06CCF0135B8ACE00E977B3 /* GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU.h; path = ../GPU.h; sourceTree = SOURCE_ROOT; }; AB06CCF1135B8ACE00E977B3 /* lua-engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lua-engine.h"; path = "../lua-engine.h"; sourceTree = SOURCE_ROOT; }; AB06CCF2135B8ACE00E977B3 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../matrix.h; sourceTree = SOURCE_ROOT; }; AB06CCF3135B8ACE00E977B3 /* mc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mc.h; path = ../mc.h; sourceTree = SOURCE_ROOT; }; AB06CCF4135B8ACE00E977B3 /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mem.h; path = ../mem.h; sourceTree = SOURCE_ROOT; }; AB06CCF5135B8ACE00E977B3 /* mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mic.h; path = ../mic.h; sourceTree = SOURCE_ROOT; }; AB06CCF6135B8ACE00E977B3 /* MMU_timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU_timing.h; path = ../MMU_timing.h; sourceTree = SOURCE_ROOT; }; AB06CCF7135B8ACE00E977B3 /* MMU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU.h; path = ../MMU.h; sourceTree = SOURCE_ROOT; }; AB06CCF8135B8ACE00E977B3 /* movie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = movie.h; path = ../movie.h; sourceTree = SOURCE_ROOT; }; AB06CCF9135B8ACE00E977B3 /* NDSSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NDSSystem.h; path = ../NDSSystem.h; sourceTree = SOURCE_ROOT; }; AB06CCFA135B8ACE00E977B3 /* OGLRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OGLRender.h; path = ../OGLRender.h; sourceTree = SOURCE_ROOT; }; AB06CCFB135B8ACE00E977B3 /* PACKED_END.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED_END.h; path = ../PACKED_END.h; sourceTree = SOURCE_ROOT; }; AB06CCFC135B8ACE00E977B3 /* PACKED.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED.h; path = ../PACKED.h; sourceTree = SOURCE_ROOT; }; AB06CCFD135B8ACE00E977B3 /* path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path.h; path = ../path.h; sourceTree = SOURCE_ROOT; }; AB06CCFE135B8ACE00E977B3 /* rasterize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rasterize.h; path = ../rasterize.h; sourceTree = SOURCE_ROOT; }; AB06CCFF135B8ACE00E977B3 /* readwrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = readwrite.h; path = ../readwrite.h; sourceTree = SOURCE_ROOT; }; AB06CD00135B8ACE00E977B3 /* registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = registers.h; path = ../registers.h; sourceTree = SOURCE_ROOT; }; AB06CD01135B8ACE00E977B3 /* render3D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = render3D.h; path = ../render3D.h; sourceTree = SOURCE_ROOT; }; AB06CD02135B8ACE00E977B3 /* ROMReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ROMReader.h; path = ../ROMReader.h; sourceTree = SOURCE_ROOT; }; AB06CD03135B8ACE00E977B3 /* rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rtc.h; path = ../rtc.h; sourceTree = SOURCE_ROOT; }; AB06CD04135B8ACE00E977B3 /* saves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = saves.h; path = ../saves.h; sourceTree = SOURCE_ROOT; }; AB06CD06135B8ACE00E977B3 /* slot1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slot1.h; path = ../slot1.h; sourceTree = SOURCE_ROOT; }; AB06CD07135B8ACE00E977B3 /* sndsdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndsdl.h; path = ../sndsdl.h; sourceTree = SOURCE_ROOT; }; AB06CD08135B8ACE00E977B3 /* SPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPU.h; path = ../SPU.h; sourceTree = SOURCE_ROOT; }; AB06CD09135B8ACE00E977B3 /* texcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = texcache.h; path = ../texcache.h; sourceTree = SOURCE_ROOT; }; AB06CD0B135B8ACE00E977B3 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../types.h; sourceTree = SOURCE_ROOT; }; AB06CD0C135B8ACE00E977B3 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../version.h; sourceTree = SOURCE_ROOT; }; AB06CD0D135B8ACE00E977B3 /* wifi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wifi.h; path = ../wifi.h; sourceTree = SOURCE_ROOT; }; AB06CD0E135B8ACE00E977B3 /* addons.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = addons.cpp; path = ../addons.cpp; sourceTree = SOURCE_ROOT; }; AB06CD0F135B8ACE00E977B3 /* aggdraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aggdraw.cpp; path = ../aggdraw.cpp; sourceTree = SOURCE_ROOT; }; AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_instructions.cpp; path = ../arm_instructions.cpp; sourceTree = SOURCE_ROOT; }; AB06CD11135B8ACE00E977B3 /* armcpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = armcpu.cpp; path = ../armcpu.cpp; sourceTree = SOURCE_ROOT; }; AB06CD12135B8ACE00E977B3 /* bios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bios.cpp; path = ../bios.cpp; sourceTree = SOURCE_ROOT; }; AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cheatSystem.cpp; path = ../cheatSystem.cpp; sourceTree = SOURCE_ROOT; }; AB06CD14135B8ACE00E977B3 /* commandline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = commandline.cpp; path = ../commandline.cpp; sourceTree = SOURCE_ROOT; }; AB06CD15135B8ACE00E977B3 /* common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.cpp; path = ../common.cpp; sourceTree = SOURCE_ROOT; }; AB06CD16135B8ACE00E977B3 /* cp15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cp15.cpp; path = ../cp15.cpp; sourceTree = SOURCE_ROOT; }; AB06CD17135B8ACE00E977B3 /* ctrlssdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ctrlssdl.cpp; path = ../ctrlssdl.cpp; sourceTree = SOURCE_ROOT; }; AB06CD18135B8ACE00E977B3 /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cpp; path = ../debug.cpp; sourceTree = SOURCE_ROOT; }; AB06CD19135B8ACE00E977B3 /* desmume_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = desmume_config.cpp; path = ../desmume_config.cpp; sourceTree = SOURCE_ROOT; }; AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Disassembler.cpp; path = ../Disassembler.cpp; sourceTree = SOURCE_ROOT; }; AB06CD1B135B8ACE00E977B3 /* driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = driver.cpp; path = ../driver.cpp; sourceTree = SOURCE_ROOT; }; AB06CD1C135B8ACE00E977B3 /* emufile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = emufile.cpp; path = ../emufile.cpp; sourceTree = SOURCE_ROOT; }; AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FIFO.cpp; path = ../FIFO.cpp; sourceTree = SOURCE_ROOT; }; AB06CD1E135B8ACE00E977B3 /* firmware.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = firmware.cpp; path = ../firmware.cpp; sourceTree = SOURCE_ROOT; }; AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "fs-linux.cpp"; path = "../fs-linux.cpp"; sourceTree = SOURCE_ROOT; }; AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gfx3d.cpp; path = ../gfx3d.cpp; sourceTree = SOURCE_ROOT; }; AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd_stub.cpp; path = ../GPU_osd_stub.cpp; sourceTree = SOURCE_ROOT; }; AB06CD23135B8ACE00E977B3 /* GPU_osd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd.cpp; path = ../GPU_osd.cpp; sourceTree = SOURCE_ROOT; }; AB06CD24135B8ACE00E977B3 /* GPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU.cpp; path = ../GPU.cpp; sourceTree = SOURCE_ROOT; }; AB06CD25135B8ACE00E977B3 /* lua-engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "lua-engine.cpp"; path = "../lua-engine.cpp"; sourceTree = SOURCE_ROOT; }; AB06CD26135B8ACE00E977B3 /* matrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = matrix.cpp; path = ../matrix.cpp; sourceTree = SOURCE_ROOT; }; AB06CD27135B8ACE00E977B3 /* mc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mc.cpp; path = ../mc.cpp; sourceTree = SOURCE_ROOT; }; AB06CD28135B8ACE00E977B3 /* mic_alsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_alsa.cpp; path = ../mic_alsa.cpp; sourceTree = SOURCE_ROOT; }; AB06CD29135B8ACE00E977B3 /* mic_openal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_openal.cpp; path = ../mic_openal.cpp; sourceTree = SOURCE_ROOT; }; AB06CD2A135B8ACE00E977B3 /* mic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic.cpp; path = ../mic.cpp; sourceTree = SOURCE_ROOT; }; AB06CD2B135B8ACE00E977B3 /* MMU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MMU.cpp; path = ../MMU.cpp; sourceTree = SOURCE_ROOT; }; AB06CD2C135B8ACE00E977B3 /* movie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = movie.cpp; path = ../movie.cpp; sourceTree = SOURCE_ROOT; }; AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NDSSystem.cpp; path = ../NDSSystem.cpp; sourceTree = SOURCE_ROOT; }; AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender.cpp; path = ../OGLRender.cpp; sourceTree = SOURCE_ROOT; }; AB06CD2F135B8ACE00E977B3 /* path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path.cpp; path = ../path.cpp; sourceTree = SOURCE_ROOT; }; AB06CD30135B8ACE00E977B3 /* rasterize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rasterize.cpp; path = ../rasterize.cpp; sourceTree = SOURCE_ROOT; }; AB06CD31135B8ACE00E977B3 /* readwrite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = readwrite.cpp; path = ../readwrite.cpp; sourceTree = SOURCE_ROOT; }; AB06CD32135B8ACE00E977B3 /* render3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = render3D.cpp; path = ../render3D.cpp; sourceTree = SOURCE_ROOT; }; AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ROMReader.cpp; path = ../ROMReader.cpp; sourceTree = SOURCE_ROOT; }; AB06CD34135B8ACE00E977B3 /* rtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rtc.cpp; path = ../rtc.cpp; sourceTree = SOURCE_ROOT; }; AB06CD35135B8ACE00E977B3 /* saves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = saves.cpp; path = ../saves.cpp; sourceTree = SOURCE_ROOT; }; AB06CD36135B8ACE00E977B3 /* slot1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot1.cpp; path = ../slot1.cpp; sourceTree = SOURCE_ROOT; }; AB06CD37135B8ACE00E977B3 /* sndsdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndsdl.cpp; path = ../sndsdl.cpp; sourceTree = SOURCE_ROOT; }; AB06CD38135B8ACE00E977B3 /* SPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SPU.cpp; path = ../SPU.cpp; sourceTree = SOURCE_ROOT; }; AB06CD39135B8ACE00E977B3 /* texcache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = texcache.cpp; path = ../texcache.cpp; sourceTree = SOURCE_ROOT; }; AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thumb_instructions.cpp; path = ../thumb_instructions.cpp; sourceTree = SOURCE_ROOT; }; AB06CD3B135B8ACE00E977B3 /* version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cpp; path = ../version.cpp; sourceTree = SOURCE_ROOT; }; AB06CD3C135B8ACE00E977B3 /* wifi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wifi.cpp; path = ../wifi.cpp; sourceTree = SOURCE_ROOT; }; AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_none.cpp; sourceTree = ""; }; AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_r4.cpp; sourceTree = ""; }; AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail.cpp; sourceTree = ""; }; AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_expMemory.cpp; sourceTree = ""; }; AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_gbagame.cpp; sourceTree = ""; }; AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_guitarGrip.cpp; sourceTree = ""; }; AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_mpcf.cpp; sourceTree = ""; }; AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_none.cpp; sourceTree = ""; }; AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_paddle.cpp; sourceTree = ""; }; AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_piano.cpp; sourceTree = ""; }; AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_rumblepak.cpp; sourceTree = ""; }; AB06CDAB135B8AED00E977B3 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AB06CDAC135B8AED00E977B3 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; AB06CDB0135B8AED00E977B3 /* gdbstub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gdbstub.cpp; sourceTree = ""; }; AB06CDB1135B8AED00E977B3 /* gdbstub_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gdbstub_internal.h; sourceTree = ""; }; AB06CDB4135B8AED00E977B3 /* metaspu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metaspu.cpp; sourceTree = ""; }; AB06CDB5135B8AED00E977B3 /* metaspu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metaspu.h; sourceTree = ""; }; AB06CDB7135B8AED00E977B3 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = ""; }; AB06CDB8135B8AED00E977B3 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = ""; }; AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AAFilter.cpp; sourceTree = ""; }; AB06CDBC135B8AED00E977B3 /* AAFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAFilter.h; sourceTree = ""; }; AB06CDBD135B8AED00E977B3 /* BPMDetect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMDetect.h; sourceTree = ""; }; AB06CDC0135B8AED00E977B3 /* cpu_detect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_detect.h; sourceTree = ""; }; AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_detect_x86_gcc.cpp; sourceTree = ""; }; AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIFOSampleBuffer.cpp; sourceTree = ""; }; AB06CDC5135B8AED00E977B3 /* FIFOSampleBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSampleBuffer.h; sourceTree = ""; }; AB06CDC6135B8AED00E977B3 /* FIFOSamplePipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSamplePipe.h; sourceTree = ""; }; AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIRFilter.cpp; sourceTree = ""; }; AB06CDC8135B8AED00E977B3 /* FIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRFilter.h; sourceTree = ""; }; AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmx_optimized.cpp; sourceTree = ""; }; AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RateTransposer.cpp; sourceTree = ""; }; AB06CDCE135B8AED00E977B3 /* RateTransposer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RateTransposer.h; sourceTree = ""; }; AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SoundTouch.cpp; sourceTree = ""; }; AB06CDD1135B8AED00E977B3 /* SoundTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundTouch.h; sourceTree = ""; }; AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sse_optimized.cpp; sourceTree = ""; }; AB06CDD3135B8AED00E977B3 /* STTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STTypes.h; sourceTree = ""; }; AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TDStretch.cpp; sourceTree = ""; }; AB06CDD5135B8AED00E977B3 /* TDStretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDStretch.h; sourceTree = ""; }; AB06CDD6135B8AED00E977B3 /* WavFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WavFile.cpp; sourceTree = ""; }; AB06CDD7135B8AED00E977B3 /* WavFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WavFile.h; sourceTree = ""; }; AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = ""; }; AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ConvertUTF.c; sourceTree = ""; }; AB06CDDE135B8AED00E977B3 /* ConvertUTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConvertUTF.h; sourceTree = ""; }; AB06CDDF135B8AED00E977B3 /* datetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = datetime.cpp; sourceTree = ""; }; AB06CDE0135B8AED00E977B3 /* datetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datetime.h; sourceTree = ""; }; AB06CDE2135B8AED00E977B3 /* crc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = crc.cpp; sourceTree = ""; }; AB06CDE3135B8AED00E977B3 /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc.h; sourceTree = ""; }; AB06CDE4135B8AED00E977B3 /* decrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decrypt.cpp; sourceTree = ""; }; AB06CDE5135B8AED00E977B3 /* decrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decrypt.h; sourceTree = ""; }; AB06CDE6135B8AED00E977B3 /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; AB06CDE7135B8AED00E977B3 /* header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = header.h; sourceTree = ""; }; AB06CDE8135B8AED00E977B3 /* dlditool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dlditool.cpp; sourceTree = ""; }; AB06CDE9135B8AED00E977B3 /* emufat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emufat.cpp; sourceTree = ""; }; AB06CDEA135B8AED00E977B3 /* emufat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat.h; sourceTree = ""; }; AB06CDEB135B8AED00E977B3 /* emufat_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat_types.h; sourceTree = ""; }; AB06CDEC135B8AED00E977B3 /* guid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = guid.cpp; sourceTree = ""; }; AB06CDED135B8AED00E977B3 /* guid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guid.h; sourceTree = ""; }; AB06CDEF135B8AED00E977B3 /* bit_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_ops.h; sourceTree = ""; }; AB06CDF0135B8AED00E977B3 /* cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cpp; sourceTree = ""; }; AB06CDF1135B8AED00E977B3 /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; AB06CDF2135B8AED00E977B3 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; AB06CDF3135B8AED00E977B3 /* directory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = directory.cpp; sourceTree = ""; }; AB06CDF4135B8AED00E977B3 /* directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directory.h; sourceTree = ""; }; AB06CDF5135B8AED00E977B3 /* disc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disc.cpp; sourceTree = ""; }; AB06CDF6135B8AED00E977B3 /* disc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc.h; sourceTree = ""; }; AB06CDF7135B8AED00E977B3 /* disc_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc_io.h; sourceTree = ""; }; AB06CDF8135B8AED00E977B3 /* fat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fat.h; sourceTree = ""; }; AB06CDF9135B8AED00E977B3 /* fatdir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatdir.cpp; sourceTree = ""; }; AB06CDFA135B8AED00E977B3 /* fatdir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatdir.h; sourceTree = ""; }; AB06CDFB135B8AED00E977B3 /* fatfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatfile.cpp; sourceTree = ""; }; AB06CDFC135B8AED00E977B3 /* fatfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatfile.h; sourceTree = ""; }; AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_allocation_table.cpp; sourceTree = ""; }; AB06CDFE135B8AED00E977B3 /* file_allocation_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_allocation_table.h; sourceTree = ""; }; AB06CDFF135B8AED00E977B3 /* filetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filetime.cpp; sourceTree = ""; }; AB06CE00135B8AED00E977B3 /* filetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filetime.h; sourceTree = ""; }; AB06CE01135B8AED00E977B3 /* libfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat.cpp; sourceTree = ""; }; AB06CE02135B8AED00E977B3 /* libfat_pc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_pc.h; sourceTree = ""; }; AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat_public_api.cpp; sourceTree = ""; }; AB06CE04135B8AED00E977B3 /* libfat_public_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_public_api.h; sourceTree = ""; }; AB06CE05135B8AED00E977B3 /* lock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lock.cpp; sourceTree = ""; }; AB06CE06135B8AED00E977B3 /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; AB06CE07135B8AED00E977B3 /* mem_allocate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_allocate.h; sourceTree = ""; }; AB06CE08135B8AED00E977B3 /* partition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = partition.cpp; sourceTree = ""; }; AB06CE09135B8AED00E977B3 /* partition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition.h; sourceTree = ""; }; AB06CE0A135B8AED00E977B3 /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = ""; }; AB06CE0B135B8AED00E977B3 /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; AB06CE0C135B8AED00E977B3 /* task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = task.cpp; sourceTree = ""; }; AB06CE0D135B8AED00E977B3 /* task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = task.h; sourceTree = ""; }; AB06CE0E135B8AED00E977B3 /* valuearray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = valuearray.h; sourceTree = ""; }; AB06CE0F135B8AED00E977B3 /* vfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vfat.cpp; sourceTree = ""; }; AB06CE10135B8AED00E977B3 /* vfat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vfat.h; sourceTree = ""; }; AB06CE11135B8AED00E977B3 /* xstring.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xstring.cpp; sourceTree = ""; }; AB06CE12135B8AED00E977B3 /* xstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xstring.h; sourceTree = ""; }; AB0A0D1D14AACACC00E83E91 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; AB0A0DAC14AACE9500E83E91 /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; AB0A0EA714AAF77000E83E91 /* README.MAC */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.MAC; path = ../../README.MAC; sourceTree = SOURCE_ROOT; }; AB0A0EA814AAF77000E83E91 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; }; AB0A0EA914AAF77000E83E91 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; }; AB0A0EAA14AAF77000E83E91 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; }; AB0A0EAB14AAF77000E83E91 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; }; AB18136C15D1FB73007A6CC3 /* arm_jit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_jit.cpp; path = ../arm_jit.cpp; sourceTree = SOURCE_ROOT; }; AB18137115D1FB8F007A6CC3 /* arm_jit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arm_jit.h; path = ../arm_jit.h; sourceTree = SOURCE_ROOT; }; AB18137215D1FBA6007A6CC3 /* instruction_attributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = instruction_attributes.h; path = ../instruction_attributes.h; sourceTree = SOURCE_ROOT; }; AB18137315D1FBA6007A6CC3 /* instructions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = instructions.h; path = ../instructions.h; sourceTree = SOURCE_ROOT; }; AB18155715D212B4007A6CC3 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB1815F315D21469007A6CC3 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB18169615D214F2007A6CC3 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB2F5B011704EE0100E28885 /* utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = ""; }; AB2F5B021704EE0100E28885 /* utilities.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utilities.c; sourceTree = ""; }; AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = FileTypeInfo.plist; sourceTree = ""; }; AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_DeSmuME.icns; sourceTree = ""; }; AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = ""; }; AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = ""; }; AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = ""; }; AB73B12714BDA01C00F49C92 /* appDelegate_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = appDelegate_legacy.h; path = userinterface/appDelegate_legacy.h; sourceTree = ""; }; AB73B12814BDA01C00F49C92 /* emuWindowDelegate_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emuWindowDelegate_legacy.h; path = userinterface/emuWindowDelegate_legacy.h; sourceTree = ""; }; AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = appDelegate_legacy.mm; path = userinterface/appDelegate_legacy.mm; sourceTree = ""; }; AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = emuWindowDelegate_legacy.mm; path = userinterface/emuWindowDelegate_legacy.mm; sourceTree = ""; }; AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Execute_420x420.png; path = images/Icon_Execute_420x420.png; sourceTree = ""; }; AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Pause_420x420.png; path = images/Icon_Pause_420x420.png; sourceTree = ""; }; AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed1x_420x420.png; path = images/Icon_Speed1x_420x420.png; sourceTree = ""; }; AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed2x_420x420.png; path = images/Icon_Speed2x_420x420.png; sourceTree = ""; }; AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_FirmwareConfig.icns; sourceTree = ""; }; AB8FE30A14B647D6009E20B1 /* macosx_10_4_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macosx_10_4_compat.h; sourceTree = ""; }; AB8FE37414B652EC009E20B1 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = ""; }; AB8FE37514B652EC009E20B1 /* cocoa_util.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_util.mm; sourceTree = ""; }; AB97D29516964D01002AC11B /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; ABAC890814B7943E001B299F /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; ABBF045E14B5144D00E505A0 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = "translations/English.lproj/MainMenu (Legacy).xib"; sourceTree = ""; }; ABBF04CB14B51BBB00E505A0 /* Chinese */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Chinese; path = translations/Chinese.lproj/Localizable.strings; sourceTree = ""; }; ABBF04CC14B51BC300E505A0 /* Norwegian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Norwegian; path = translations/Norwegian.lproj/Localizable.strings; sourceTree = ""; }; ABBF04CD14B51BC900E505A0 /* Romanian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Romanian; path = translations/Romanian.lproj/Localizable.strings; sourceTree = ""; }; ABBF052F14B5436E00E505A0 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = ""; }; ABBF053B14B543B600E505A0 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = ""; }; ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = coreaudiosound.cpp; sourceTree = ""; }; ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ringbuffer.cpp; sourceTree = ""; }; ABD0A5641501AC5C0074A094 /* coreaudiosound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coreaudiosound.h; sourceTree = ""; }; ABD0A5651501AC5C0074A094 /* ringbuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ringbuffer.h; sourceTree = ""; }; ABE240E514BE30FC006EA2D5 /* Info (Legacy Debug).plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info (Legacy Debug).plist"; sourceTree = ""; }; ABE240E614BE30FC006EA2D5 /* Info (Legacy).plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info (Legacy).plist"; sourceTree = ""; }; ABE240F314BE3169006EA2D5 /* cocoa_input_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input_legacy.h; sourceTree = ""; }; ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input_legacy.mm; sourceTree = ""; }; ABE240F514BE3169006EA2D5 /* input_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input_legacy.h; sourceTree = ""; }; ABE240F614BE3169006EA2D5 /* input_legacy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = input_legacy.mm; sourceTree = ""; }; ABE240F714BE3169006EA2D5 /* nds_control_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nds_control_legacy.h; sourceTree = ""; }; ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = nds_control_legacy.mm; sourceTree = ""; }; ABE240F914BE3169006EA2D5 /* preferences_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = preferences_legacy.h; sourceTree = ""; }; ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = preferences_legacy.mm; sourceTree = ""; }; ABE240FB14BE3169006EA2D5 /* screen_state_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = screen_state_legacy.h; sourceTree = ""; }; ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = screen_state_legacy.m; sourceTree = ""; }; ABE240FD14BE3169006EA2D5 /* video_output_view_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video_output_view_legacy.h; sourceTree = ""; }; ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = video_output_view_legacy.mm; sourceTree = ""; }; ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeFull_16x16.png; path = images/Icon_VolumeFull_16x16.png; sourceTree = ""; }; ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeMute_16x16.png; path = images/Icon_VolumeMute_16x16.png; sourceTree = ""; }; ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeOneThird_16x16.png; path = images/Icon_VolumeOneThird_16x16.png; sourceTree = ""; }; ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeTwoThird_16x16.png; path = images/Icon_VolumeTwoThird_16x16.png; sourceTree = ""; }; ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = ""; }; ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = ""; }; ABF50B69169F61540018C08D /* AsmJit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsmJit.h; sourceTree = ""; }; ABF50B6A169F61540018C08D /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Config.h; sourceTree = ""; }; ABF50B6B169F61540018C08D /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; ABF50B6C169F61540018C08D /* x86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86.h; sourceTree = ""; }; ABF50B6E169F61540018C08D /* apibegin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apibegin.h; sourceTree = ""; }; ABF50B6F169F61540018C08D /* apiend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apiend.h; sourceTree = ""; }; ABF50B70169F61540018C08D /* assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assembler.cpp; sourceTree = ""; }; ABF50B71169F61540018C08D /* assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assembler.h; sourceTree = ""; }; ABF50B72169F61540018C08D /* assert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assert.cpp; sourceTree = ""; }; ABF50B73169F61540018C08D /* assert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assert.h; sourceTree = ""; }; ABF50B74169F61540018C08D /* buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = buffer.cpp; sourceTree = ""; }; ABF50B75169F61540018C08D /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; ABF50B76169F61540018C08D /* build.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build.h; sourceTree = ""; }; ABF50B77169F61540018C08D /* compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compiler.cpp; sourceTree = ""; }; ABF50B78169F61540018C08D /* compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = ""; }; ABF50B79169F61540018C08D /* compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilercontext.cpp; sourceTree = ""; }; ABF50B7A169F61540018C08D /* compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilercontext.h; sourceTree = ""; }; ABF50B7B169F61540018C08D /* compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compilerfunc.cpp; sourceTree = ""; }; ABF50B7C169F61540018C08D /* compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilerfunc.h; sourceTree = ""; }; ABF50B7D169F61540018C08D /* compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compileritem.cpp; sourceTree = ""; }; ABF50B7E169F61540018C08D /* compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compileritem.h; sourceTree = ""; }; ABF50B7F169F61540018C08D /* context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = context.cpp; sourceTree = ""; }; ABF50B80169F61540018C08D /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; ABF50B81169F61540018C08D /* cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpuinfo.cpp; sourceTree = ""; }; ABF50B82169F61540018C08D /* cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpuinfo.h; sourceTree = ""; }; ABF50B83169F61540018C08D /* defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = defs.cpp; sourceTree = ""; }; ABF50B84169F61540018C08D /* defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defs.h; sourceTree = ""; }; ABF50B85169F61540018C08D /* func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = func.cpp; sourceTree = ""; }; ABF50B86169F61540018C08D /* func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = func.h; sourceTree = ""; }; ABF50B87169F61540018C08D /* intutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intutil.h; sourceTree = ""; }; ABF50B88169F61540018C08D /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; ABF50B89169F61540018C08D /* logger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logger.cpp; sourceTree = ""; }; ABF50B8A169F61540018C08D /* logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logger.h; sourceTree = ""; }; ABF50B8B169F61540018C08D /* memorymanager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymanager.cpp; sourceTree = ""; }; ABF50B8C169F61540018C08D /* memorymanager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymanager.h; sourceTree = ""; }; ABF50B8D169F61540018C08D /* memorymarker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memorymarker.cpp; sourceTree = ""; }; ABF50B8E169F61540018C08D /* memorymarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memorymarker.h; sourceTree = ""; }; ABF50B8F169F61540018C08D /* operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = operand.cpp; sourceTree = ""; }; ABF50B90169F61540018C08D /* operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operand.h; sourceTree = ""; }; ABF50B91169F61540018C08D /* podvector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = podvector.h; sourceTree = ""; }; ABF50B92169F61540018C08D /* stringbuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringbuilder.cpp; sourceTree = ""; }; ABF50B93169F61540018C08D /* stringbuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringbuilder.h; sourceTree = ""; }; ABF50B94169F61540018C08D /* stringutil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutil.cpp; sourceTree = ""; }; ABF50B95169F61540018C08D /* stringutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutil.h; sourceTree = ""; }; ABF50B96169F61540018C08D /* virtualmemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = virtualmemory.cpp; sourceTree = ""; }; ABF50B97169F61540018C08D /* virtualmemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = virtualmemory.h; sourceTree = ""; }; ABF50B98169F61540018C08D /* zonememory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = zonememory.cpp; sourceTree = ""; }; ABF50B99169F61540018C08D /* zonememory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zonememory.h; sourceTree = ""; }; ABF50B9B169F61540018C08D /* x86assembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86assembler.cpp; sourceTree = ""; }; ABF50B9C169F61540018C08D /* x86assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86assembler.h; sourceTree = ""; }; ABF50B9D169F61540018C08D /* x86compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compiler.cpp; sourceTree = ""; }; ABF50B9E169F61540018C08D /* x86compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compiler.h; sourceTree = ""; }; ABF50B9F169F61540018C08D /* x86compilercontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilercontext.cpp; sourceTree = ""; }; ABF50BA0169F61540018C08D /* x86compilercontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilercontext.h; sourceTree = ""; }; ABF50BA1169F61540018C08D /* x86compilerfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compilerfunc.cpp; sourceTree = ""; }; ABF50BA2169F61540018C08D /* x86compilerfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compilerfunc.h; sourceTree = ""; }; ABF50BA3169F61540018C08D /* x86compileritem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86compileritem.cpp; sourceTree = ""; }; ABF50BA4169F61540018C08D /* x86compileritem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86compileritem.h; sourceTree = ""; }; ABF50BA5169F61540018C08D /* x86cpuinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86cpuinfo.cpp; sourceTree = ""; }; ABF50BA6169F61540018C08D /* x86cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86cpuinfo.h; sourceTree = ""; }; ABF50BA7169F61540018C08D /* x86defs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86defs.cpp; sourceTree = ""; }; ABF50BA8169F61540018C08D /* x86defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86defs.h; sourceTree = ""; }; ABF50BA9169F61540018C08D /* x86func.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86func.cpp; sourceTree = ""; }; ABF50BAA169F61540018C08D /* x86func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86func.h; sourceTree = ""; }; ABF50BAB169F61540018C08D /* x86operand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86operand.cpp; sourceTree = ""; }; ABF50BAC169F61540018C08D /* x86operand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86operand.h; sourceTree = ""; }; ABF50BAD169F61540018C08D /* x86util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x86util.cpp; sourceTree = ""; }; ABF50BAE169F61540018C08D /* x86util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86util.h; sourceTree = ""; }; ABF95B4714B4F4FC007912B8 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = ""; }; ABFE42CD143E3398009A3CCE /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; ABFE42CF143E3398009A3CCE /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; ABFE42D1143E3399009A3CCE /* DeSmuME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeSmuME.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1EFD51B60F892B1A00B029BB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D58816964E3A002AC11B /* Accelerate.framework in Frameworks */, AB97D58916964E3F002AC11B /* AppKit.framework in Frameworks */, 1EFD51B90F892B1A00B029BB /* AudioUnit.framework in Frameworks */, 1EFD51B70F892B1A00B029BB /* Cocoa.framework in Frameworks */, AB97D58A16964E42002AC11B /* Foundation.framework in Frameworks */, 1EFD51B80F892B1A00B029BB /* OpenGL.framework in Frameworks */, AB97D58B16964E44002AC11B /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D45216964E0A002AC11B /* Accelerate.framework in Frameworks */, AB06CCD6135B8AA200E977B3 /* AppKit.framework in Frameworks */, 729BECF00D9D581900ED561B /* AudioUnit.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, AB06CCD7135B8AA300E977B3 /* Foundation.framework in Frameworks */, 729BECE70D9D57F600ED561B /* OpenGL.framework in Frameworks */, AB0A0D1E14AACACC00E83E91 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB0A0DA114AACE9500E83E91 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D29616964D01002AC11B /* Accelerate.framework in Frameworks */, AB0A0DA514AACE9500E83E91 /* AppKit.framework in Frameworks */, AB0A0DA414AACE9500E83E91 /* AudioUnit.framework in Frameworks */, AB0A0DA214AACE9500E83E91 /* Cocoa.framework in Frameworks */, AB0A0DA614AACE9500E83E91 /* Foundation.framework in Frameworks */, AB0A0DA314AACE9500E83E91 /* OpenGL.framework in Frameworks */, AB0A0DA714AACE9500E83E91 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB18154D15D212B4007A6CC3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D45316964E0F002AC11B /* Accelerate.framework in Frameworks */, AB18155115D212B4007A6CC3 /* AppKit.framework in Frameworks */, AB18155015D212B4007A6CC3 /* AudioUnit.framework in Frameworks */, AB18154E15D212B4007A6CC3 /* Cocoa.framework in Frameworks */, AB18155215D212B4007A6CC3 /* Foundation.framework in Frameworks */, AB18154F15D212B4007A6CC3 /* OpenGL.framework in Frameworks */, AB18155315D212B4007A6CC3 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB1815E915D21469007A6CC3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D45116964DF2002AC11B /* Accelerate.framework in Frameworks */, AB1815ED15D21469007A6CC3 /* AppKit.framework in Frameworks */, AB1815EC15D21469007A6CC3 /* AudioUnit.framework in Frameworks */, AB1815EA15D21469007A6CC3 /* Cocoa.framework in Frameworks */, AB1815EE15D21469007A6CC3 /* Foundation.framework in Frameworks */, AB1815EB15D21469007A6CC3 /* OpenGL.framework in Frameworks */, AB1815EF15D21469007A6CC3 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; AB18168F15D214F2007A6CC3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D45516964E26002AC11B /* Accelerate.framework in Frameworks */, AB97D45616964E2D002AC11B /* AppKit.framework in Frameworks */, AB18169215D214F2007A6CC3 /* AudioUnit.framework in Frameworks */, AB18169015D214F2007A6CC3 /* Cocoa.framework in Frameworks */, AB97D50916964E30002AC11B /* Foundation.framework in Frameworks */, AB18169115D214F2007A6CC3 /* OpenGL.framework in Frameworks */, AB97D58716964E34002AC11B /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; ABFE42AC143E32F0009A3CCE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AB97D45416964E14002AC11B /* Accelerate.framework in Frameworks */, ABFE42B0143E32F0009A3CCE /* AppKit.framework in Frameworks */, ABFE42AF143E32F0009A3CCE /* AudioUnit.framework in Frameworks */, ABFE42AD143E32F0009A3CCE /* Cocoa.framework in Frameworks */, ABFE42B1143E32F0009A3CCE /* Foundation.framework in Frameworks */, ABFE42AE143E32F0009A3CCE /* OpenGL.framework in Frameworks */, AB8FE48C14B6657D009E20B1 /* libz.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Cocoa Port */ = { isa = PBXGroup; children = ( ABC3ADEC14B7DC6E00D5B13D /* userinterface */, AB2F5B021704EE0100E28885 /* utilities.c */, ABD0A5621501AC5C0074A094 /* coreaudiosound.cpp */, ABD0A5631501AC5C0074A094 /* ringbuffer.cpp */, ABF4007E14B4F1C000578AE7 /* sndOSX.cpp */, ABBF053B14B543B600E505A0 /* cocoa_file.h */, ABF95B4714B4F4FC007912B8 /* cocoa_globals.h */, ABE240F314BE3169006EA2D5 /* cocoa_input_legacy.h */, AB8FE37414B652EC009E20B1 /* cocoa_util.h */, ABD0A5641501AC5C0074A094 /* coreaudiosound.h */, ABE240F514BE3169006EA2D5 /* input_legacy.h */, AB8FE30A14B647D6009E20B1 /* macosx_10_4_compat.h */, ABE240F714BE3169006EA2D5 /* nds_control_legacy.h */, ABE240F914BE3169006EA2D5 /* preferences_legacy.h */, ABD0A5651501AC5C0074A094 /* ringbuffer.h */, ABE240FB14BE3169006EA2D5 /* screen_state_legacy.h */, AB06CB49135B8A4D00E977B3 /* sndOSX.h */, AB2F5B011704EE0100E28885 /* utilities.h */, ABE240FD14BE3169006EA2D5 /* video_output_view_legacy.h */, ABE240FC14BE3169006EA2D5 /* screen_state_legacy.m */, ABBF052F14B5436E00E505A0 /* cocoa_file.mm */, ABE240F414BE3169006EA2D5 /* cocoa_input_legacy.mm */, AB8FE37514B652EC009E20B1 /* cocoa_util.mm */, ABE240F614BE3169006EA2D5 /* input_legacy.mm */, ABE240F814BE3169006EA2D5 /* nds_control_legacy.mm */, ABE240FA14BE3169006EA2D5 /* preferences_legacy.mm */, ABE240FE14BE3169006EA2D5 /* video_output_view_legacy.mm */, ); name = "Cocoa Port"; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( AB97D29516964D01002AC11B /* Accelerate.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 729BECEF0D9D581900ED561B /* AudioUnit.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 729BECE60D9D57F600ED561B /* OpenGL.framework */, AB0A0D1D14AACACC00E83E91 /* libz.dylib */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( ABFE42CD143E3398009A3CCE /* DeSmuME.app */, ABFE42CF143E3398009A3CCE /* DeSmuME.app */, ABFE42D1143E3399009A3CCE /* DeSmuME.app */, AB0A0DAC14AACE9500E83E91 /* DeSmuME.app */, AB18155715D212B4007A6CC3 /* DeSmuME (PPC).app */, AB1815F315D21469007A6CC3 /* DeSmuME (PPC).app */, AB18169615D214F2007A6CC3 /* DeSmuME (PPC).app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* DeSmuME */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Cocoa Port */, 29B97315FDCFA39411CA2CEA /* Core */, 29B97323FDCFA39411CA2CEA /* Frameworks */, AB06CB79135B8A7600E977B3 /* Other Sources */, 19C28FACFE9D520D11CA2CBB /* Products */, 29B97317FDCFA39411CA2CEA /* Resources */, ); name = DeSmuME; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Core */ = { isa = PBXGroup; children = ( AB06CD9B135B8AED00E977B3 /* addons */, AB06CDA7135B8AED00E977B3 /* cli */, AB06CDAF135B8AED00E977B3 /* gdbstub */, AB06CDB3135B8AED00E977B3 /* metaspu */, AB06CDDC135B8AED00E977B3 /* utils */, AB06CD0E135B8ACE00E977B3 /* addons.cpp */, AB06CD0F135B8ACE00E977B3 /* aggdraw.cpp */, AB06CD10135B8ACE00E977B3 /* arm_instructions.cpp */, AB18136C15D1FB73007A6CC3 /* arm_jit.cpp */, AB06CD11135B8ACE00E977B3 /* armcpu.cpp */, AB06CD12135B8ACE00E977B3 /* bios.cpp */, AB06CD13135B8ACE00E977B3 /* cheatSystem.cpp */, AB06CD14135B8ACE00E977B3 /* commandline.cpp */, AB06CD15135B8ACE00E977B3 /* common.cpp */, AB06CD16135B8ACE00E977B3 /* cp15.cpp */, AB06CD17135B8ACE00E977B3 /* ctrlssdl.cpp */, AB06CD18135B8ACE00E977B3 /* debug.cpp */, AB06CD19135B8ACE00E977B3 /* desmume_config.cpp */, AB06CD1A135B8ACE00E977B3 /* Disassembler.cpp */, AB06CD1B135B8ACE00E977B3 /* driver.cpp */, AB06CD1C135B8ACE00E977B3 /* emufile.cpp */, AB06CD1D135B8ACE00E977B3 /* FIFO.cpp */, AB06CD1E135B8ACE00E977B3 /* firmware.cpp */, AB06CD1F135B8ACE00E977B3 /* fs-linux.cpp */, AB06CD21135B8ACE00E977B3 /* gfx3d.cpp */, AB06CD24135B8ACE00E977B3 /* GPU.cpp */, AB06CD23135B8ACE00E977B3 /* GPU_osd.cpp */, AB06CD22135B8ACE00E977B3 /* GPU_osd_stub.cpp */, AB06CD25135B8ACE00E977B3 /* lua-engine.cpp */, AB06CD26135B8ACE00E977B3 /* matrix.cpp */, AB06CD27135B8ACE00E977B3 /* mc.cpp */, AB06CD2A135B8ACE00E977B3 /* mic.cpp */, AB06CD28135B8ACE00E977B3 /* mic_alsa.cpp */, AB06CD29135B8ACE00E977B3 /* mic_openal.cpp */, AB06CD2B135B8ACE00E977B3 /* MMU.cpp */, AB06CD2C135B8ACE00E977B3 /* movie.cpp */, AB06CD2D135B8ACE00E977B3 /* NDSSystem.cpp */, AB06CD2E135B8ACE00E977B3 /* OGLRender.cpp */, AB06CD2F135B8ACE00E977B3 /* path.cpp */, AB06CD30135B8ACE00E977B3 /* rasterize.cpp */, AB06CD31135B8ACE00E977B3 /* readwrite.cpp */, AB06CD32135B8ACE00E977B3 /* render3D.cpp */, AB06CD33135B8ACE00E977B3 /* ROMReader.cpp */, AB06CD34135B8ACE00E977B3 /* rtc.cpp */, AB06CD35135B8ACE00E977B3 /* saves.cpp */, AB06CD36135B8ACE00E977B3 /* slot1.cpp */, AB06CD37135B8ACE00E977B3 /* sndsdl.cpp */, AB06CD38135B8ACE00E977B3 /* SPU.cpp */, AB06CD39135B8ACE00E977B3 /* texcache.cpp */, AB06CD3A135B8ACE00E977B3 /* thumb_instructions.cpp */, AB06CD3B135B8ACE00E977B3 /* version.cpp */, AB06CD3C135B8ACE00E977B3 /* wifi.cpp */, AB06CCD8135B8ACE00E977B3 /* addons.h */, AB06CCD9135B8ACE00E977B3 /* agg2d.h */, AB06CCDA135B8ACE00E977B3 /* aggdraw.h */, AB18137115D1FB8F007A6CC3 /* arm_jit.h */, AB06CCDC135B8ACE00E977B3 /* armcpu.h */, AB06CCDD135B8ACE00E977B3 /* bios.h */, AB06CCDE135B8ACE00E977B3 /* bits.h */, AB06CCDF135B8ACE00E977B3 /* cheatSystem.h */, AB06CCE0135B8ACE00E977B3 /* commandline.h */, AB06CCE1135B8ACE00E977B3 /* common.h */, AB06CCE2135B8ACE00E977B3 /* cp15.h */, AB06CCE3135B8ACE00E977B3 /* ctrlssdl.h */, AB06CCE4135B8ACE00E977B3 /* debug.h */, AB06CCE5135B8ACE00E977B3 /* desmume_config.h */, AB06CCE6135B8ACE00E977B3 /* Disassembler.h */, AB06CCE7135B8ACE00E977B3 /* driver.h */, AB06CCE9135B8ACE00E977B3 /* emufile.h */, AB06CCE8135B8ACE00E977B3 /* emufile_types.h */, AB06CCEA135B8ACE00E977B3 /* FIFO.h */, AB06CCEB135B8ACE00E977B3 /* firmware.h */, AB06CCEC135B8ACE00E977B3 /* fs.h */, AB06CCED135B8ACE00E977B3 /* gdbstub.h */, AB06CCEE135B8ACE00E977B3 /* gfx3d.h */, AB06CCF0135B8ACE00E977B3 /* GPU.h */, AB06CCEF135B8ACE00E977B3 /* GPU_osd.h */, AB18137215D1FBA6007A6CC3 /* instruction_attributes.h */, AB18137315D1FBA6007A6CC3 /* instructions.h */, AB06CCF1135B8ACE00E977B3 /* lua-engine.h */, AB06CCF2135B8ACE00E977B3 /* matrix.h */, AB06CCF3135B8ACE00E977B3 /* mc.h */, AB06CCF4135B8ACE00E977B3 /* mem.h */, AB06CCF5135B8ACE00E977B3 /* mic.h */, AB06CCF7135B8ACE00E977B3 /* MMU.h */, AB06CCF6135B8ACE00E977B3 /* MMU_timing.h */, AB06CCF8135B8ACE00E977B3 /* movie.h */, AB06CCF9135B8ACE00E977B3 /* NDSSystem.h */, AB06CCFA135B8ACE00E977B3 /* OGLRender.h */, AB06CCFC135B8ACE00E977B3 /* PACKED.h */, AB06CCFB135B8ACE00E977B3 /* PACKED_END.h */, AB06CCFD135B8ACE00E977B3 /* path.h */, AB06CCFE135B8ACE00E977B3 /* rasterize.h */, AB06CCFF135B8ACE00E977B3 /* readwrite.h */, AB06CD00135B8ACE00E977B3 /* registers.h */, AB06CD01135B8ACE00E977B3 /* render3D.h */, AB06CD02135B8ACE00E977B3 /* ROMReader.h */, AB06CD03135B8ACE00E977B3 /* rtc.h */, AB06CD04135B8ACE00E977B3 /* saves.h */, AB06CD06135B8ACE00E977B3 /* slot1.h */, AB06CD07135B8ACE00E977B3 /* sndsdl.h */, AB06CD08135B8ACE00E977B3 /* SPU.h */, AB06CD09135B8ACE00E977B3 /* texcache.h */, AB06CD0B135B8ACE00E977B3 /* types.h */, AB06CD0C135B8ACE00E977B3 /* version.h */, AB06CD0D135B8ACE00E977B3 /* wifi.h */, ); name = Core; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( AB4677FA14ABD4790002FF94 /* Images */, 1F4B55090F53924500C8B514 /* Localizable.strings */, AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */, ABE240E514BE30FC006EA2D5 /* Info (Legacy Debug).plist */, ABE240E614BE30FC006EA2D5 /* Info (Legacy).plist */, ABEB321914C56182007F0D4C /* InfoPlist.strings */, AB3AD16B14C4F6AD00D7D192 /* FileTypeInfo.plist */, AB0A0EA714AAF77000E83E91 /* README.MAC */, AB0A0EA814AAF77000E83E91 /* AUTHORS */, AB0A0EA914AAF77000E83E91 /* ChangeLog */, AB0A0EAA14AAF77000E83E91 /* COPYING */, AB0A0EAB14AAF77000E83E91 /* README */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; 7FA912191426523900E2ABDD /* tinyxml */ = { isa = PBXGroup; children = ( 7FA9121A1426523900E2ABDD /* tinystr.cpp */, 7FA9121B1426523900E2ABDD /* tinystr.h */, 7FA9121C1426523900E2ABDD /* tinyxml.cpp */, 7FA9121D1426523900E2ABDD /* tinyxml.h */, 7FA9121E1426523900E2ABDD /* tinyxmlerror.cpp */, 7FA9121F1426523900E2ABDD /* tinyxmlparser.cpp */, ); path = tinyxml; sourceTree = ""; }; AB06CB79135B8A7600E977B3 /* Other Sources */ = { isa = PBXGroup; children = ( ABAC890814B7943E001B299F /* main.m */, AB06CCD5135B8A9B00E977B3 /* DeSmuME_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; AB06CD9B135B8AED00E977B3 /* addons */ = { isa = PBXGroup; children = ( AB06CD9C135B8AED00E977B3 /* slot1_none.cpp */, AB06CD9D135B8AED00E977B3 /* slot1_r4.cpp */, AB06CD9E135B8AED00E977B3 /* slot1_retail.cpp */, 956B96C213DF4CF900FCDCD0 /* slot1_retail_nand.cpp */, AB06CD9F135B8AED00E977B3 /* slot2_expMemory.cpp */, AB06CDA0135B8AED00E977B3 /* slot2_gbagame.cpp */, AB06CDA1135B8AED00E977B3 /* slot2_guitarGrip.cpp */, AB06CDA2135B8AED00E977B3 /* slot2_mpcf.cpp */, AB06CDA3135B8AED00E977B3 /* slot2_none.cpp */, AB06CDA4135B8AED00E977B3 /* slot2_paddle.cpp */, AB06CDA5135B8AED00E977B3 /* slot2_piano.cpp */, AB06CDA6135B8AED00E977B3 /* slot2_rumblepak.cpp */, ); name = addons; path = ../addons; sourceTree = SOURCE_ROOT; }; AB06CDA7135B8AED00E977B3 /* cli */ = { isa = PBXGroup; children = ( AB06CDAC135B8AED00E977B3 /* main.cpp */, AB06CDAB135B8AED00E977B3 /* Info.plist */, ); name = cli; path = ../cli; sourceTree = SOURCE_ROOT; }; AB06CDAF135B8AED00E977B3 /* gdbstub */ = { isa = PBXGroup; children = ( AB06CDB0135B8AED00E977B3 /* gdbstub.cpp */, AB06CDB1135B8AED00E977B3 /* gdbstub_internal.h */, ); name = gdbstub; path = ../gdbstub; sourceTree = SOURCE_ROOT; }; AB06CDB3135B8AED00E977B3 /* metaspu */ = { isa = PBXGroup; children = ( AB06CDB9135B8AED00E977B3 /* SoundTouch */, AB06CDB4135B8AED00E977B3 /* metaspu.cpp */, AB06CDB7135B8AED00E977B3 /* SndOut.cpp */, AB06CDD8135B8AED00E977B3 /* Timestretcher.cpp */, AB06CDB5135B8AED00E977B3 /* metaspu.h */, AB06CDB8135B8AED00E977B3 /* SndOut.h */, ); name = metaspu; path = ../metaspu; sourceTree = SOURCE_ROOT; }; AB06CDB9135B8AED00E977B3 /* SoundTouch */ = { isa = PBXGroup; children = ( AB06CDBB135B8AED00E977B3 /* AAFilter.cpp */, AB06CDC1135B8AED00E977B3 /* cpu_detect_x86_gcc.cpp */, AB06CDC4135B8AED00E977B3 /* FIFOSampleBuffer.cpp */, AB06CDC7135B8AED00E977B3 /* FIRFilter.cpp */, AB06CDCC135B8AED00E977B3 /* mmx_optimized.cpp */, AB06CDCD135B8AED00E977B3 /* RateTransposer.cpp */, AB06CDD0135B8AED00E977B3 /* SoundTouch.cpp */, AB06CDD2135B8AED00E977B3 /* sse_optimized.cpp */, AB06CDD4135B8AED00E977B3 /* TDStretch.cpp */, AB06CDD6135B8AED00E977B3 /* WavFile.cpp */, AB06CDBC135B8AED00E977B3 /* AAFilter.h */, AB06CDBD135B8AED00E977B3 /* BPMDetect.h */, AB06CDC0135B8AED00E977B3 /* cpu_detect.h */, AB06CDC5135B8AED00E977B3 /* FIFOSampleBuffer.h */, AB06CDC6135B8AED00E977B3 /* FIFOSamplePipe.h */, AB06CDC8135B8AED00E977B3 /* FIRFilter.h */, AB06CDCE135B8AED00E977B3 /* RateTransposer.h */, AB06CDD1135B8AED00E977B3 /* SoundTouch.h */, AB06CDD3135B8AED00E977B3 /* STTypes.h */, AB06CDD5135B8AED00E977B3 /* TDStretch.h */, AB06CDD7135B8AED00E977B3 /* WavFile.h */, ); path = SoundTouch; sourceTree = ""; }; AB06CDDC135B8AED00E977B3 /* utils */ = { isa = PBXGroup; children = ( AB18130415D1FB4B007A6CC3 /* AsmJit */, AB06CDE1135B8AED00E977B3 /* decrypt */, AB06CDEE135B8AED00E977B3 /* libfat */, 7FA912191426523900E2ABDD /* tinyxml */, AB06CDDD135B8AED00E977B3 /* ConvertUTF.c */, AB06CDDF135B8AED00E977B3 /* datetime.cpp */, AB06CDE8135B8AED00E977B3 /* dlditool.cpp */, AB06CDE9135B8AED00E977B3 /* emufat.cpp */, AB06CDEC135B8AED00E977B3 /* guid.cpp */, AB06CE0A135B8AED00E977B3 /* md5.cpp */, AB06CE0C135B8AED00E977B3 /* task.cpp */, AB06CE0F135B8AED00E977B3 /* vfat.cpp */, AB06CE11135B8AED00E977B3 /* xstring.cpp */, AB06CDDE135B8AED00E977B3 /* ConvertUTF.h */, AB06CDE0135B8AED00E977B3 /* datetime.h */, AB06CDEA135B8AED00E977B3 /* emufat.h */, AB06CDEB135B8AED00E977B3 /* emufat_types.h */, AB06CDED135B8AED00E977B3 /* guid.h */, AB06CE0B135B8AED00E977B3 /* md5.h */, AB06CE0D135B8AED00E977B3 /* task.h */, AB06CE0E135B8AED00E977B3 /* valuearray.h */, AB06CE10135B8AED00E977B3 /* vfat.h */, AB06CE12135B8AED00E977B3 /* xstring.h */, ); name = utils; path = ../utils; sourceTree = SOURCE_ROOT; }; AB06CDE1135B8AED00E977B3 /* decrypt */ = { isa = PBXGroup; children = ( AB06CDE2135B8AED00E977B3 /* crc.cpp */, AB06CDE4135B8AED00E977B3 /* decrypt.cpp */, AB06CDE6135B8AED00E977B3 /* header.cpp */, AB06CDE3135B8AED00E977B3 /* crc.h */, AB06CDE5135B8AED00E977B3 /* decrypt.h */, AB06CDE7135B8AED00E977B3 /* header.h */, ); path = decrypt; sourceTree = ""; }; AB06CDEE135B8AED00E977B3 /* libfat */ = { isa = PBXGroup; children = ( AB06CDF0135B8AED00E977B3 /* cache.cpp */, AB06CDF3135B8AED00E977B3 /* directory.cpp */, AB06CDF5135B8AED00E977B3 /* disc.cpp */, AB06CDF9135B8AED00E977B3 /* fatdir.cpp */, AB06CDFB135B8AED00E977B3 /* fatfile.cpp */, AB06CDFD135B8AED00E977B3 /* file_allocation_table.cpp */, AB06CDFF135B8AED00E977B3 /* filetime.cpp */, AB06CE01135B8AED00E977B3 /* libfat.cpp */, AB06CE03135B8AED00E977B3 /* libfat_public_api.cpp */, AB06CE05135B8AED00E977B3 /* lock.cpp */, AB06CE08135B8AED00E977B3 /* partition.cpp */, AB06CDEF135B8AED00E977B3 /* bit_ops.h */, AB06CDF1135B8AED00E977B3 /* cache.h */, AB06CDF2135B8AED00E977B3 /* common.h */, AB06CDF4135B8AED00E977B3 /* directory.h */, AB06CDF6135B8AED00E977B3 /* disc.h */, AB06CDF7135B8AED00E977B3 /* disc_io.h */, AB06CDF8135B8AED00E977B3 /* fat.h */, AB06CDFA135B8AED00E977B3 /* fatdir.h */, AB06CDFC135B8AED00E977B3 /* fatfile.h */, AB06CDFE135B8AED00E977B3 /* file_allocation_table.h */, AB06CE00135B8AED00E977B3 /* filetime.h */, AB06CE02135B8AED00E977B3 /* libfat_pc.h */, AB06CE04135B8AED00E977B3 /* libfat_public_api.h */, AB06CE06135B8AED00E977B3 /* lock.h */, AB06CE07135B8AED00E977B3 /* mem_allocate.h */, AB06CE09135B8AED00E977B3 /* partition.h */, ); path = libfat; sourceTree = ""; }; AB18130415D1FB4B007A6CC3 /* AsmJit */ = { isa = PBXGroup; children = ( ABF50B6D169F61540018C08D /* core */, ABF50B9A169F61540018C08D /* x86 */, ABF50B69169F61540018C08D /* AsmJit.h */, ABF50B6A169F61540018C08D /* Config.h */, ABF50B6B169F61540018C08D /* core.h */, ABF50B6C169F61540018C08D /* x86.h */, ); path = AsmJit; sourceTree = ""; }; AB4677FA14ABD4790002FF94 /* Images */ = { isa = PBXGroup; children = ( AB46782914ABD4BF0002FF94 /* App Icons */, ABEFD81914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png */, ABEFD81A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png */, ABEFD81B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png */, ABEFD81C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png */, AB73B1C114BDA94800F49C92 /* Icon_Execute_420x420.png */, AB73B1C214BDA94800F49C92 /* Icon_Pause_420x420.png */, AB73B1C314BDA94800F49C92 /* Icon_Speed1x_420x420.png */, AB73B1C414BDA94800F49C92 /* Icon_Speed2x_420x420.png */, ); name = Images; sourceTree = ""; }; AB46782914ABD4BF0002FF94 /* App Icons */ = { isa = PBXGroup; children = ( AB46780614ABD4890002FF94 /* AppIcon_DeSmuME.icns */, AB46780714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns */, ABF4007614B4F19200578AE7 /* AppIcon_ROMCheats.icns */, AB46780814ABD4890002FF94 /* AppIcon_ROMSave.icns */, AB7522E314C7D879009B97B3 /* AppIcon_FirmwareConfig.icns */, AB46780914ABD4890002FF94 /* AppIcon_SaveState.icns */, ); name = "App Icons"; sourceTree = ""; }; ABC3ADEC14B7DC6E00D5B13D /* userinterface */ = { isa = PBXGroup; children = ( AB73B12714BDA01C00F49C92 /* appDelegate_legacy.h */, AB73B12814BDA01C00F49C92 /* emuWindowDelegate_legacy.h */, AB73B12914BDA01C00F49C92 /* appDelegate_legacy.mm */, AB73B12A14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm */, ); name = userinterface; sourceTree = ""; }; ABF50B6D169F61540018C08D /* core */ = { isa = PBXGroup; children = ( ABF50B70169F61540018C08D /* assembler.cpp */, ABF50B72169F61540018C08D /* assert.cpp */, ABF50B74169F61540018C08D /* buffer.cpp */, ABF50B77169F61540018C08D /* compiler.cpp */, ABF50B79169F61540018C08D /* compilercontext.cpp */, ABF50B7B169F61540018C08D /* compilerfunc.cpp */, ABF50B7D169F61540018C08D /* compileritem.cpp */, ABF50B7F169F61540018C08D /* context.cpp */, ABF50B81169F61540018C08D /* cpuinfo.cpp */, ABF50B83169F61540018C08D /* defs.cpp */, ABF50B85169F61540018C08D /* func.cpp */, ABF50B89169F61540018C08D /* logger.cpp */, ABF50B8B169F61540018C08D /* memorymanager.cpp */, ABF50B8D169F61540018C08D /* memorymarker.cpp */, ABF50B8F169F61540018C08D /* operand.cpp */, ABF50B92169F61540018C08D /* stringbuilder.cpp */, ABF50B94169F61540018C08D /* stringutil.cpp */, ABF50B96169F61540018C08D /* virtualmemory.cpp */, ABF50B98169F61540018C08D /* zonememory.cpp */, ABF50B6E169F61540018C08D /* apibegin.h */, ABF50B6F169F61540018C08D /* apiend.h */, ABF50B71169F61540018C08D /* assembler.h */, ABF50B73169F61540018C08D /* assert.h */, ABF50B75169F61540018C08D /* buffer.h */, ABF50B76169F61540018C08D /* build.h */, ABF50B78169F61540018C08D /* compiler.h */, ABF50B7A169F61540018C08D /* compilercontext.h */, ABF50B7C169F61540018C08D /* compilerfunc.h */, ABF50B7E169F61540018C08D /* compileritem.h */, ABF50B80169F61540018C08D /* context.h */, ABF50B82169F61540018C08D /* cpuinfo.h */, ABF50B84169F61540018C08D /* defs.h */, ABF50B86169F61540018C08D /* func.h */, ABF50B87169F61540018C08D /* intutil.h */, ABF50B88169F61540018C08D /* lock.h */, ABF50B8A169F61540018C08D /* logger.h */, ABF50B8C169F61540018C08D /* memorymanager.h */, ABF50B8E169F61540018C08D /* memorymarker.h */, ABF50B90169F61540018C08D /* operand.h */, ABF50B91169F61540018C08D /* podvector.h */, ABF50B93169F61540018C08D /* stringbuilder.h */, ABF50B95169F61540018C08D /* stringutil.h */, ABF50B97169F61540018C08D /* virtualmemory.h */, ABF50B99169F61540018C08D /* zonememory.h */, ); path = core; sourceTree = ""; }; ABF50B9A169F61540018C08D /* x86 */ = { isa = PBXGroup; children = ( ABF50B9B169F61540018C08D /* x86assembler.cpp */, ABF50B9D169F61540018C08D /* x86compiler.cpp */, ABF50B9F169F61540018C08D /* x86compilercontext.cpp */, ABF50BA1169F61540018C08D /* x86compilerfunc.cpp */, ABF50BA3169F61540018C08D /* x86compileritem.cpp */, ABF50BA5169F61540018C08D /* x86cpuinfo.cpp */, ABF50BA7169F61540018C08D /* x86defs.cpp */, ABF50BA9169F61540018C08D /* x86func.cpp */, ABF50BAB169F61540018C08D /* x86operand.cpp */, ABF50BAD169F61540018C08D /* x86util.cpp */, ABF50B9C169F61540018C08D /* x86assembler.h */, ABF50B9E169F61540018C08D /* x86compiler.h */, ABF50BA0169F61540018C08D /* x86compilercontext.h */, ABF50BA2169F61540018C08D /* x86compilerfunc.h */, ABF50BA4169F61540018C08D /* x86compileritem.h */, ABF50BA6169F61540018C08D /* x86cpuinfo.h */, ABF50BA8169F61540018C08D /* x86defs.h */, ABF50BAA169F61540018C08D /* x86func.h */, ABF50BAC169F61540018C08D /* x86operand.h */, ABF50BAE169F61540018C08D /* x86util.h */, ); path = x86; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1EFD51770F892B1A00B029BB /* DeSmuME_gdbstub (OS X App; Intel; v10.5 Leopard) */ = { isa = PBXNativeTarget; buildConfigurationList = 1EFD51BB0F892B1A00B029BB /* Build configuration list for PBXNativeTarget "DeSmuME_gdbstub (OS X App; Intel; v10.5 Leopard)" */; buildPhases = ( AB73B05614BD7A8B00F49C92 /* ShellScript */, 1EFD51780F892B1A00B029BB /* Resources */, ABE76AA315E0910700F458AE /* ShellScript */, 1EFD517C0F892B1A00B029BB /* Sources */, 1EFD51B60F892B1A00B029BB /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME_gdbstub (OS X App; Intel; v10.5 Leopard)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = ABFE42CF143E3398009A3CCE /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; 8D1107260486CEB800E47090 /* DeSmuME (OS X App; Intel; v10.5 Leopard) */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; v10.5 Leopard)" */; buildPhases = ( AB73B04F14BD79CB00F49C92 /* ShellScript */, 8D1107290486CEB800E47090 /* Resources */, ABE76A9D15E090CE00F458AE /* ShellScript */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; Intel; v10.5 Leopard)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = ABFE42CD143E3398009A3CCE /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; AB0A0D3414AACE9500E83E91 /* DeSmuME (OS X App; Intel; v10.4 Tiger) */ = { isa = PBXNativeTarget; buildConfigurationList = AB0A0DA914AACE9500E83E91 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; v10.4 Tiger)" */; buildPhases = ( AB01918414BD6A0A004CB612 /* ShellScript */, AB0A0D3514AACE9500E83E91 /* Resources */, ABE76A8E15E090A900F458AE /* ShellScript */, AB0A0D3914AACE9500E83E91 /* Sources */, AB0A0DA114AACE9500E83E91 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; Intel; v10.4 Tiger)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB0A0DAC14AACE9500E83E91 /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; AB1814BE15D212B4007A6CC3 /* DeSmuME (OS X App; PowerPC; v10.5 Leopard) */ = { isa = PBXNativeTarget; buildConfigurationList = AB18155415D212B4007A6CC3 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; v10.5 Leopard)" */; buildPhases = ( AB1814BF15D212B4007A6CC3 /* ShellScript */, AB1814C015D212B4007A6CC3 /* Resources */, ABE76A9F15E090E500F458AE /* ShellScript */, AB1814D815D212B4007A6CC3 /* Sources */, AB18154D15D212B4007A6CC3 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; PowerPC; v10.5 Leopard)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB18155715D212B4007A6CC3 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; AB18155A15D21469007A6CC3 /* DeSmuME (OS X App; PowerPC; v10.4 Tiger) */ = { isa = PBXNativeTarget; buildConfigurationList = AB1815F015D21469007A6CC3 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; v10.4 Tiger)" */; buildPhases = ( AB18155B15D21469007A6CC3 /* ShellScript */, AB18155C15D21469007A6CC3 /* Resources */, ABE76A9B15E090C100F458AE /* ShellScript */, AB18157415D21469007A6CC3 /* Sources */, AB1815E915D21469007A6CC3 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; PowerPC; v10.4 Tiger)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB1815F315D21469007A6CC3 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; AB1815F615D214F2007A6CC3 /* DeSmuME_gdbstub (OS X App; PowerPC; v10.5 Leopard) */ = { isa = PBXNativeTarget; buildConfigurationList = AB18169315D214F2007A6CC3 /* Build configuration list for PBXNativeTarget "DeSmuME_gdbstub (OS X App; PowerPC; v10.5 Leopard)" */; buildPhases = ( AB1815F715D214F2007A6CC3 /* ShellScript */, AB1815F815D214F2007A6CC3 /* Resources */, ABE76AA515E0911E00F458AE /* ShellScript */, AB18161015D214F2007A6CC3 /* Sources */, AB18168F15D214F2007A6CC3 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME_gdbstub (OS X App; PowerPC; v10.5 Leopard)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = AB18169615D214F2007A6CC3 /* DeSmuME (PPC).app */; productType = "com.apple.product-type.application"; }; ABFE423F143E32F0009A3CCE /* DeSmuME (OS X App; Intel; v10.6 Snow Leopard) */ = { isa = PBXNativeTarget; buildConfigurationList = ABFE42B3143E32F0009A3CCE /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; v10.6 Snow Leopard)" */; buildPhases = ( AB73B05114BD79D300F49C92 /* ShellScript */, ABFE4240143E32F0009A3CCE /* Resources */, ABE76AA115E090FA00F458AE /* ShellScript */, ABFE4244143E32F0009A3CCE /* Sources */, ABFE42AC143E32F0009A3CCE /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "DeSmuME (OS X App; Intel; v10.6 Snow Leopard)"; productInstallPath = "$(HOME)/Applications"; productName = DeSmuME; productReference = ABFE42D1143E3399009A3CCE /* DeSmuME.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { ORGANIZATIONNAME = "DeSmuME Team"; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (Legacy)" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, TestLocale, Italian, Chinese, Norwegian, Romanian, ); mainGroup = 29B97314FDCFA39411CA2CEA /* DeSmuME */; projectDirPath = ""; projectRoot = ""; targets = ( AB0A0D3414AACE9500E83E91 /* DeSmuME (OS X App; Intel; v10.4 Tiger) */, AB18155A15D21469007A6CC3 /* DeSmuME (OS X App; PowerPC; v10.4 Tiger) */, 8D1107260486CEB800E47090 /* DeSmuME (OS X App; Intel; v10.5 Leopard) */, AB1814BE15D212B4007A6CC3 /* DeSmuME (OS X App; PowerPC; v10.5 Leopard) */, ABFE423F143E32F0009A3CCE /* DeSmuME (OS X App; Intel; v10.6 Snow Leopard) */, 1EFD51770F892B1A00B029BB /* DeSmuME_gdbstub (OS X App; Intel; v10.5 Leopard) */, AB1815F615D214F2007A6CC3 /* DeSmuME_gdbstub (OS X App; PowerPC; v10.5 Leopard) */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1EFD51780F892B1A00B029BB /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 1EFD517A0F892B1A00B029BB /* Localizable.strings in Resources */, AB0A0EB314AAF77000E83E91 /* README.MAC in Resources */, AB0A0EB414AAF77000E83E91 /* AUTHORS in Resources */, AB0A0EB514AAF77000E83E91 /* ChangeLog in Resources */, AB0A0EB614AAF77000E83E91 /* COPYING in Resources */, AB0A0EB714AAF77000E83E91 /* README in Resources */, AB46780E14ABD4890002FF94 /* AppIcon_DeSmuME.icns in Resources */, AB46780F14ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB46781014ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */, AB46781114ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */, ABF4007A14B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */, AB0191D614BD72EC004CB612 /* MainMenu (Legacy).xib in Resources */, ABEFD82514BB9E65004DB9DC /* Icon_VolumeFull_16x16.png in Resources */, ABEFD82614BB9E65004DB9DC /* Icon_VolumeMute_16x16.png in Resources */, ABEFD82714BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png in Resources */, ABEFD82814BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png in Resources */, AB73B1CD14BDA94800F49C92 /* Icon_Execute_420x420.png in Resources */, AB73B1CE14BDA94800F49C92 /* Icon_Pause_420x420.png in Resources */, AB73B1CF14BDA94800F49C92 /* Icon_Speed1x_420x420.png in Resources */, AB73B1D014BDA94800F49C92 /* Icon_Speed2x_420x420.png in Resources */, AB3AD16D14C4F6AD00D7D192 /* FileTypeInfo.plist in Resources */, AB0E770614C5635900EF460C /* InfoPlist.strings in Resources */, AB7522E714C7D879009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 1F4B550A0F53924500C8B514 /* Localizable.strings in Resources */, AB0A0EBF14AAF77000E83E91 /* README.MAC in Resources */, AB0A0EC014AAF77000E83E91 /* AUTHORS in Resources */, AB0A0EC114AAF77000E83E91 /* ChangeLog in Resources */, AB0A0EC214AAF77000E83E91 /* COPYING in Resources */, AB0A0EC314AAF77000E83E91 /* README in Resources */, AB46781614ABD4890002FF94 /* AppIcon_DeSmuME.icns in Resources */, AB46781714ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB46781814ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */, AB46781914ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */, ABF4007714B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */, AB0191D414BD72EC004CB612 /* MainMenu (Legacy).xib in Resources */, ABEFD82914BB9E65004DB9DC /* Icon_VolumeFull_16x16.png in Resources */, ABEFD82A14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png in Resources */, ABEFD82B14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png in Resources */, ABEFD82C14BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png in Resources */, AB73B1D114BDA94800F49C92 /* Icon_Execute_420x420.png in Resources */, AB73B1D214BDA94800F49C92 /* Icon_Pause_420x420.png in Resources */, AB73B1D314BDA94800F49C92 /* Icon_Speed1x_420x420.png in Resources */, AB73B1D414BDA94800F49C92 /* Icon_Speed2x_420x420.png in Resources */, AB3AD16C14C4F6AD00D7D192 /* FileTypeInfo.plist in Resources */, AB0E770414C5635800EF460C /* InfoPlist.strings in Resources */, AB7522E414C7D879009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB0A0D3514AACE9500E83E91 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB0A0D3714AACE9500E83E91 /* Localizable.strings in Resources */, AB0A0EAD14AAF77000E83E91 /* README.MAC in Resources */, AB0A0EAE14AAF77000E83E91 /* AUTHORS in Resources */, AB0A0EAF14AAF77000E83E91 /* ChangeLog in Resources */, AB0A0EB014AAF77000E83E91 /* COPYING in Resources */, AB0A0EB114AAF77000E83E91 /* README in Resources */, AB46780A14ABD4890002FF94 /* AppIcon_DeSmuME.icns in Resources */, AB46780B14ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB46780C14ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */, AB46780D14ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */, ABF4007814B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */, AB0191D314BD72EC004CB612 /* MainMenu (Legacy).xib in Resources */, ABEFD81D14BB9E65004DB9DC /* Icon_VolumeFull_16x16.png in Resources */, ABEFD81E14BB9E65004DB9DC /* Icon_VolumeMute_16x16.png in Resources */, ABEFD81F14BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png in Resources */, ABEFD82014BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png in Resources */, AB73B1C514BDA94800F49C92 /* Icon_Execute_420x420.png in Resources */, AB73B1C614BDA94800F49C92 /* Icon_Pause_420x420.png in Resources */, AB73B1C714BDA94800F49C92 /* Icon_Speed1x_420x420.png in Resources */, AB73B1C814BDA94800F49C92 /* Icon_Speed2x_420x420.png in Resources */, AB3AD16F14C4F6AD00D7D192 /* FileTypeInfo.plist in Resources */, AB0E770314C5635800EF460C /* InfoPlist.strings in Resources */, AB7522E514C7D879009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB1814C015D212B4007A6CC3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB1814C115D212B4007A6CC3 /* Localizable.strings in Resources */, AB1814C215D212B4007A6CC3 /* README.MAC in Resources */, AB1814C315D212B4007A6CC3 /* AUTHORS in Resources */, AB1814C415D212B4007A6CC3 /* ChangeLog in Resources */, AB1814C515D212B4007A6CC3 /* COPYING in Resources */, AB1814C615D212B4007A6CC3 /* README in Resources */, AB1814C715D212B4007A6CC3 /* AppIcon_DeSmuME.icns in Resources */, AB1814C815D212B4007A6CC3 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB1814C915D212B4007A6CC3 /* AppIcon_ROMSave.icns in Resources */, AB1814CA15D212B4007A6CC3 /* AppIcon_SaveState.icns in Resources */, AB1814CB15D212B4007A6CC3 /* AppIcon_ROMCheats.icns in Resources */, AB1814CC15D212B4007A6CC3 /* MainMenu (Legacy).xib in Resources */, AB1814CD15D212B4007A6CC3 /* Icon_VolumeFull_16x16.png in Resources */, AB1814CE15D212B4007A6CC3 /* Icon_VolumeMute_16x16.png in Resources */, AB1814CF15D212B4007A6CC3 /* Icon_VolumeOneThird_16x16.png in Resources */, AB1814D015D212B4007A6CC3 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB1814D115D212B4007A6CC3 /* Icon_Execute_420x420.png in Resources */, AB1814D215D212B4007A6CC3 /* Icon_Pause_420x420.png in Resources */, AB1814D315D212B4007A6CC3 /* Icon_Speed1x_420x420.png in Resources */, AB1814D415D212B4007A6CC3 /* Icon_Speed2x_420x420.png in Resources */, AB1814D515D212B4007A6CC3 /* FileTypeInfo.plist in Resources */, AB1814D615D212B4007A6CC3 /* InfoPlist.strings in Resources */, AB1814D715D212B4007A6CC3 /* AppIcon_FirmwareConfig.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB18155C15D21469007A6CC3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB18155D15D21469007A6CC3 /* Localizable.strings in Resources */, AB18155E15D21469007A6CC3 /* README.MAC in Resources */, AB18155F15D21469007A6CC3 /* AUTHORS in Resources */, AB18156015D21469007A6CC3 /* ChangeLog in Resources */, AB18156115D21469007A6CC3 /* COPYING in Resources */, AB18156215D21469007A6CC3 /* README in Resources */, AB18156315D21469007A6CC3 /* AppIcon_DeSmuME.icns in Resources */, AB18156415D21469007A6CC3 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB18156515D21469007A6CC3 /* AppIcon_ROMSave.icns in Resources */, AB18156615D21469007A6CC3 /* AppIcon_SaveState.icns in Resources */, AB18156715D21469007A6CC3 /* AppIcon_ROMCheats.icns in Resources */, AB18156815D21469007A6CC3 /* MainMenu (Legacy).xib in Resources */, AB18156915D21469007A6CC3 /* Icon_VolumeFull_16x16.png in Resources */, AB18156A15D21469007A6CC3 /* Icon_VolumeMute_16x16.png in Resources */, AB18156B15D21469007A6CC3 /* Icon_VolumeOneThird_16x16.png in Resources */, AB18156C15D21469007A6CC3 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB18156D15D21469007A6CC3 /* Icon_Execute_420x420.png in Resources */, AB18156E15D21469007A6CC3 /* Icon_Pause_420x420.png in Resources */, AB18156F15D21469007A6CC3 /* Icon_Speed1x_420x420.png in Resources */, AB18157015D21469007A6CC3 /* Icon_Speed2x_420x420.png in Resources */, AB18157115D21469007A6CC3 /* FileTypeInfo.plist in Resources */, AB18157215D21469007A6CC3 /* InfoPlist.strings in Resources */, AB18157315D21469007A6CC3 /* AppIcon_FirmwareConfig.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB1815F815D214F2007A6CC3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( AB1815F915D214F2007A6CC3 /* Localizable.strings in Resources */, AB1815FA15D214F2007A6CC3 /* README.MAC in Resources */, AB1815FB15D214F2007A6CC3 /* AUTHORS in Resources */, AB1815FC15D214F2007A6CC3 /* ChangeLog in Resources */, AB1815FD15D214F2007A6CC3 /* COPYING in Resources */, AB1815FE15D214F2007A6CC3 /* README in Resources */, AB1815FF15D214F2007A6CC3 /* AppIcon_DeSmuME.icns in Resources */, AB18160015D214F2007A6CC3 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB18160115D214F2007A6CC3 /* AppIcon_ROMSave.icns in Resources */, AB18160215D214F2007A6CC3 /* AppIcon_SaveState.icns in Resources */, AB18160315D214F2007A6CC3 /* AppIcon_ROMCheats.icns in Resources */, AB18160415D214F2007A6CC3 /* MainMenu (Legacy).xib in Resources */, AB18160515D214F2007A6CC3 /* Icon_VolumeFull_16x16.png in Resources */, AB18160615D214F2007A6CC3 /* Icon_VolumeMute_16x16.png in Resources */, AB18160715D214F2007A6CC3 /* Icon_VolumeOneThird_16x16.png in Resources */, AB18160815D214F2007A6CC3 /* Icon_VolumeTwoThird_16x16.png in Resources */, AB18160915D214F2007A6CC3 /* Icon_Execute_420x420.png in Resources */, AB18160A15D214F2007A6CC3 /* Icon_Pause_420x420.png in Resources */, AB18160B15D214F2007A6CC3 /* Icon_Speed1x_420x420.png in Resources */, AB18160C15D214F2007A6CC3 /* Icon_Speed2x_420x420.png in Resources */, AB18160D15D214F2007A6CC3 /* FileTypeInfo.plist in Resources */, AB18160E15D214F2007A6CC3 /* InfoPlist.strings in Resources */, AB18160F15D214F2007A6CC3 /* AppIcon_FirmwareConfig.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABFE4240143E32F0009A3CCE /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ABFE4242143E32F0009A3CCE /* Localizable.strings in Resources */, AB0A0EB914AAF77000E83E91 /* README.MAC in Resources */, AB0A0EBA14AAF77000E83E91 /* AUTHORS in Resources */, AB0A0EBB14AAF77000E83E91 /* ChangeLog in Resources */, AB0A0EBC14AAF77000E83E91 /* COPYING in Resources */, AB0A0EBD14AAF77000E83E91 /* README in Resources */, AB46781214ABD4890002FF94 /* AppIcon_DeSmuME.icns in Resources */, AB46781314ABD4890002FF94 /* AppIcon_NintendoDS_ROM.icns in Resources */, AB46781414ABD4890002FF94 /* AppIcon_ROMSave.icns in Resources */, AB46781514ABD4890002FF94 /* AppIcon_SaveState.icns in Resources */, ABF4007914B4F19200578AE7 /* AppIcon_ROMCheats.icns in Resources */, AB0191D514BD72EC004CB612 /* MainMenu (Legacy).xib in Resources */, ABEFD82114BB9E65004DB9DC /* Icon_VolumeFull_16x16.png in Resources */, ABEFD82214BB9E65004DB9DC /* Icon_VolumeMute_16x16.png in Resources */, ABEFD82314BB9E65004DB9DC /* Icon_VolumeOneThird_16x16.png in Resources */, ABEFD82414BB9E65004DB9DC /* Icon_VolumeTwoThird_16x16.png in Resources */, AB73B1C914BDA94800F49C92 /* Icon_Execute_420x420.png in Resources */, AB73B1CA14BDA94800F49C92 /* Icon_Pause_420x420.png in Resources */, AB73B1CB14BDA94800F49C92 /* Icon_Speed1x_420x420.png in Resources */, AB73B1CC14BDA94800F49C92 /* Icon_Speed2x_420x420.png in Resources */, AB3AD16E14C4F6AD00D7D192 /* FileTypeInfo.plist in Resources */, AB0E770514C5635900EF460C /* InfoPlist.strings in Resources */, AB7522E614C7D879009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ AB01918414BD6A0A004CB612 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).xib", ); outputPaths = ( "$(SRCROOT)/translations/French.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Italian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Japanese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Chinese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Norwegian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Romanian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu (Legacy).strings\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./French.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./French.lproj/MainMenu (Legacy).strings\" --write \"./French.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Italian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Italian.lproj/MainMenu (Legacy).strings\" --write \"./Italian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Japanese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Japanese.lproj/MainMenu (Legacy).strings\" --write \"./Japanese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Chinese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Chinese.lproj/MainMenu (Legacy).strings\" --write \"./Chinese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Norwegian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Norwegian.lproj/MainMenu (Legacy).strings\" --write \"./Norwegian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Romanian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Romanian.lproj/MainMenu (Legacy).strings\" --write \"./Romanian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\""; }; AB1814BF15D212B4007A6CC3 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).xib", ); outputPaths = ( "$(SRCROOT)/translations/French.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Italian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Japanese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Chinese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Norwegian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Romanian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu (Legacy).strings\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./French.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./French.lproj/MainMenu (Legacy).strings\" --write \"./French.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Italian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Italian.lproj/MainMenu (Legacy).strings\" --write \"./Italian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Japanese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Japanese.lproj/MainMenu (Legacy).strings\" --write \"./Japanese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Chinese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Chinese.lproj/MainMenu (Legacy).strings\" --write \"./Chinese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Norwegian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Norwegian.lproj/MainMenu (Legacy).strings\" --write \"./Norwegian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Romanian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Romanian.lproj/MainMenu (Legacy).strings\" --write \"./Romanian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\""; }; AB18155B15D21469007A6CC3 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).xib", ); outputPaths = ( "$(SRCROOT)/translations/French.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Italian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Japanese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Chinese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Norwegian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Romanian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu (Legacy).strings\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./French.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./French.lproj/MainMenu (Legacy).strings\" --write \"./French.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Italian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Italian.lproj/MainMenu (Legacy).strings\" --write \"./Italian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Japanese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Japanese.lproj/MainMenu (Legacy).strings\" --write \"./Japanese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Chinese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Chinese.lproj/MainMenu (Legacy).strings\" --write \"./Chinese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Norwegian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Norwegian.lproj/MainMenu (Legacy).strings\" --write \"./Norwegian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Romanian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Romanian.lproj/MainMenu (Legacy).strings\" --write \"./Romanian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\""; }; AB1815F715D214F2007A6CC3 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).xib", ); outputPaths = ( "$(SRCROOT)/translations/French.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Italian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Japanese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Chinese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Norwegian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).strings", "$(SRCROOT)/translations/Romanian.lproj/MainMenu (Legacy).xib", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu (Legacy).strings\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./French.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./French.lproj/MainMenu (Legacy).strings\" --write \"./French.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Italian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Italian.lproj/MainMenu (Legacy).strings\" --write \"./Italian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Japanese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Japanese.lproj/MainMenu (Legacy).strings\" --write \"./Japanese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Chinese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Chinese.lproj/MainMenu (Legacy).strings\" --write \"./Chinese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Norwegian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Norwegian.lproj/MainMenu (Legacy).strings\" --write \"./Norwegian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Romanian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Romanian.lproj/MainMenu (Legacy).strings\" --write \"./Romanian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\""; }; AB73B04F14BD79CB00F49C92 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).xib", ); outputPaths = ( "$(SRCROOT)/translations/French.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Italian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Japanese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Chinese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Norwegian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Romanian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu (Legacy).strings\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./French.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./French.lproj/MainMenu (Legacy).strings\" --write \"./French.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Italian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Italian.lproj/MainMenu (Legacy).strings\" --write \"./Italian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Japanese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Japanese.lproj/MainMenu (Legacy).strings\" --write \"./Japanese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Chinese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Chinese.lproj/MainMenu (Legacy).strings\" --write \"./Chinese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Norwegian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Norwegian.lproj/MainMenu (Legacy).strings\" --write \"./Norwegian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Romanian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Romanian.lproj/MainMenu (Legacy).strings\" --write \"./Romanian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\""; }; AB73B05114BD79D300F49C92 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).xib", ); outputPaths = ( "$(SRCROOT)/translations/French.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Italian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Japanese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Chinese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Norwegian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Romanian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).strings", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu (Legacy).strings\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./French.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./French.lproj/MainMenu (Legacy).strings\" --write \"./French.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Italian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Italian.lproj/MainMenu (Legacy).strings\" --write \"./Italian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Japanese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Japanese.lproj/MainMenu (Legacy).strings\" --write \"./Japanese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Chinese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Chinese.lproj/MainMenu (Legacy).strings\" --write \"./Chinese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Norwegian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Norwegian.lproj/MainMenu (Legacy).strings\" --write \"./Norwegian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Romanian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Romanian.lproj/MainMenu (Legacy).strings\" --write \"./Romanian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\""; }; AB73B05614BD7A8B00F49C92 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).xib", ); outputPaths = ( "$(SRCROOT)/translations/French.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Italian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Japanese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Chinese.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/Norwegian.lproj/MainMenu (Legacy).xib", "$(SRCROOT)/translations/English.lproj/MainMenu (Legacy).strings", "$(SRCROOT)/translations/Romanian.lproj/MainMenu (Legacy).xib", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu (Legacy).strings\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./French.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./French.lproj/MainMenu (Legacy).strings\" --write \"./French.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Italian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Italian.lproj/MainMenu (Legacy).strings\" --write \"./Italian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Japanese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Japanese.lproj/MainMenu (Legacy).strings\" --write \"./Japanese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Chinese.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Chinese.lproj/MainMenu (Legacy).strings\" --write \"./Chinese.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Norwegian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Norwegian.lproj/MainMenu (Legacy).strings\" --write \"./Norwegian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\"\n\nrm -f \"./Romanian.lproj/MainMenu (Legacy).xib\"\nibtool --strings-file \"./Romanian.lproj/MainMenu (Legacy).strings\" --write \"./Romanian.lproj/MainMenu (Legacy).xib\" \"./English.lproj/MainMenu (Legacy).xib\""; }; ABE76A8E15E090A900F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76A9B15E090C100F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76A9D15E090CE00F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76A9F15E090E500F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76AA115E090FA00F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76AA315E0910700F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; ABE76AA515E0911E00F458AE /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/../svnrev.h", ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/../../\"\nREV=`svnversion -n`\nprintf \"// REVISION TRACKING\\n\\\n// This file is auto-generated.\\n\\\n// Do not commit this file to the code repository!\\n\\\n#define SVN_REV $REV\\n\\\n#define SVN_REV_STR \\\"$REV\\\"\\n\" > ./src/svnrev.h"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1EFD517C0F892B1A00B029BB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB06CE80135B8AEE00E977B3 /* ConvertUTF.c in Sources */, AB06CE6C135B8AEE00E977B3 /* AAFilter.cpp in Sources */, AB06CD6C135B8ACE00E977B3 /* addons.cpp in Sources */, AB06CD6D135B8ACE00E977B3 /* aggdraw.cpp in Sources */, AB06CD6E135B8ACE00E977B3 /* arm_instructions.cpp in Sources */, AB06CD6F135B8ACE00E977B3 /* armcpu.cpp in Sources */, AB06CD70135B8ACE00E977B3 /* bios.cpp in Sources */, AB06CE88135B8AEE00E977B3 /* cache.cpp in Sources */, AB06CD71135B8ACE00E977B3 /* cheatSystem.cpp in Sources */, AB06CD72135B8ACE00E977B3 /* commandline.cpp in Sources */, AB06CD73135B8ACE00E977B3 /* common.cpp in Sources */, AB06CD74135B8ACE00E977B3 /* cp15.cpp in Sources */, AB06CE6F135B8AEE00E977B3 /* cpu_detect_x86_gcc.cpp in Sources */, AB06CE82135B8AEE00E977B3 /* crc.cpp in Sources */, AB06CD75135B8ACE00E977B3 /* ctrlssdl.cpp in Sources */, AB06CE81135B8AEE00E977B3 /* datetime.cpp in Sources */, AB06CD76135B8ACE00E977B3 /* debug.cpp in Sources */, AB06CE83135B8AEE00E977B3 /* decrypt.cpp in Sources */, AB06CD77135B8ACE00E977B3 /* desmume_config.cpp in Sources */, AB06CE89135B8AEE00E977B3 /* directory.cpp in Sources */, AB06CD78135B8ACE00E977B3 /* Disassembler.cpp in Sources */, AB06CE8A135B8AEE00E977B3 /* disc.cpp in Sources */, AB06CE85135B8AEE00E977B3 /* dlditool.cpp in Sources */, AB06CD79135B8ACE00E977B3 /* driver.cpp in Sources */, AB06CE86135B8AEE00E977B3 /* emufat.cpp in Sources */, AB06CD7A135B8ACE00E977B3 /* emufile.cpp in Sources */, AB06CE8B135B8AEE00E977B3 /* fatdir.cpp in Sources */, AB06CE8C135B8AEE00E977B3 /* fatfile.cpp in Sources */, AB06CD7B135B8ACE00E977B3 /* FIFO.cpp in Sources */, AB06CE72135B8AEE00E977B3 /* FIFOSampleBuffer.cpp in Sources */, AB06CE8D135B8AEE00E977B3 /* file_allocation_table.cpp in Sources */, AB06CE8E135B8AEE00E977B3 /* filetime.cpp in Sources */, AB06CE73135B8AEE00E977B3 /* FIRFilter.cpp in Sources */, AB06CD7C135B8ACE00E977B3 /* firmware.cpp in Sources */, AB06CD7D135B8ACE00E977B3 /* fs-linux.cpp in Sources */, AB06CE66135B8AEE00E977B3 /* gdbstub.cpp in Sources */, AB06CD7F135B8ACE00E977B3 /* gfx3d.cpp in Sources */, AB06CD82135B8ACE00E977B3 /* GPU.cpp in Sources */, AB06CD81135B8ACE00E977B3 /* GPU_osd.cpp in Sources */, AB06CD80135B8ACE00E977B3 /* GPU_osd_stub.cpp in Sources */, AB06CE87135B8AEE00E977B3 /* guid.cpp in Sources */, AB06CE84135B8AEE00E977B3 /* header.cpp in Sources */, AB06CE8F135B8AEE00E977B3 /* libfat.cpp in Sources */, AB06CE90135B8AEE00E977B3 /* libfat_public_api.cpp in Sources */, AB06CE91135B8AEE00E977B3 /* lock.cpp in Sources */, AB06CD83135B8ACE00E977B3 /* lua-engine.cpp in Sources */, AB06CE63135B8AEE00E977B3 /* main.cpp in Sources */, AB06CD84135B8ACE00E977B3 /* matrix.cpp in Sources */, AB06CD85135B8ACE00E977B3 /* mc.cpp in Sources */, AB06CE93135B8AEE00E977B3 /* md5.cpp in Sources */, AB06CE68135B8AEE00E977B3 /* metaspu.cpp in Sources */, AB06CD88135B8ACE00E977B3 /* mic.cpp in Sources */, AB06CD86135B8ACE00E977B3 /* mic_alsa.cpp in Sources */, AB06CD87135B8ACE00E977B3 /* mic_openal.cpp in Sources */, AB06CD89135B8ACE00E977B3 /* MMU.cpp in Sources */, AB06CE77135B8AEE00E977B3 /* mmx_optimized.cpp in Sources */, AB06CD8A135B8ACE00E977B3 /* movie.cpp in Sources */, AB06CD8B135B8ACE00E977B3 /* NDSSystem.cpp in Sources */, AB06CE92135B8AEE00E977B3 /* partition.cpp in Sources */, AB06CD8D135B8ACE00E977B3 /* path.cpp in Sources */, AB06CD8E135B8ACE00E977B3 /* rasterize.cpp in Sources */, AB06CE78135B8AEE00E977B3 /* RateTransposer.cpp in Sources */, AB06CD8F135B8ACE00E977B3 /* readwrite.cpp in Sources */, AB06CD90135B8ACE00E977B3 /* render3D.cpp in Sources */, AB06CD91135B8ACE00E977B3 /* ROMReader.cpp in Sources */, AB06CD92135B8ACE00E977B3 /* rtc.cpp in Sources */, AB06CD93135B8ACE00E977B3 /* saves.cpp in Sources */, AB06CD94135B8ACE00E977B3 /* slot1.cpp in Sources */, AB06CE55135B8AEE00E977B3 /* slot1_none.cpp in Sources */, AB06CE56135B8AEE00E977B3 /* slot1_r4.cpp in Sources */, AB06CE57135B8AEE00E977B3 /* slot1_retail.cpp in Sources */, AB06CE58135B8AEE00E977B3 /* slot2_expMemory.cpp in Sources */, AB06CE59135B8AEE00E977B3 /* slot2_gbagame.cpp in Sources */, AB06CE5A135B8AEE00E977B3 /* slot2_guitarGrip.cpp in Sources */, AB06CE5B135B8AEE00E977B3 /* slot2_mpcf.cpp in Sources */, AB06CE5C135B8AEE00E977B3 /* slot2_none.cpp in Sources */, AB06CE5D135B8AEE00E977B3 /* slot2_paddle.cpp in Sources */, AB06CE5E135B8AEE00E977B3 /* slot2_piano.cpp in Sources */, AB06CE5F135B8AEE00E977B3 /* slot2_rumblepak.cpp in Sources */, ABF4008214B4F1C000578AE7 /* sndOSX.cpp in Sources */, AB06CE6A135B8AEE00E977B3 /* SndOut.cpp in Sources */, AB06CD95135B8ACE00E977B3 /* sndsdl.cpp in Sources */, AB06CE7A135B8AEE00E977B3 /* SoundTouch.cpp in Sources */, AB06CD96135B8ACE00E977B3 /* SPU.cpp in Sources */, AB06CE7B135B8AEE00E977B3 /* sse_optimized.cpp in Sources */, AB06CE94135B8AEE00E977B3 /* task.cpp in Sources */, AB06CE7C135B8AEE00E977B3 /* TDStretch.cpp in Sources */, AB06CD97135B8ACE00E977B3 /* texcache.cpp in Sources */, AB06CD98135B8ACE00E977B3 /* thumb_instructions.cpp in Sources */, AB06CE7E135B8AEE00E977B3 /* Timestretcher.cpp in Sources */, 7FA912241426523900E2ABDD /* tinystr.cpp in Sources */, 7FA912251426523900E2ABDD /* tinyxml.cpp in Sources */, 7FA912261426523900E2ABDD /* tinyxmlerror.cpp in Sources */, 7FA912271426523900E2ABDD /* tinyxmlparser.cpp in Sources */, AB06CD99135B8ACE00E977B3 /* version.cpp in Sources */, AB06CE95135B8AEE00E977B3 /* vfat.cpp in Sources */, AB06CE7D135B8AEE00E977B3 /* WavFile.cpp in Sources */, AB06CD9A135B8ACE00E977B3 /* wifi.cpp in Sources */, AB06CE96135B8AEE00E977B3 /* xstring.cpp in Sources */, ABAC890C14B7943E001B299F /* main.m in Sources */, AB73B12F14BDA01C00F49C92 /* appDelegate_legacy.mm in Sources */, ABBF053314B5436E00E505A0 /* cocoa_file.mm in Sources */, AB8FE37914B652EC009E20B1 /* cocoa_util.mm in Sources */, AB73B13014BDA01C00F49C92 /* emuWindowDelegate_legacy.mm in Sources */, ABE2410B14BE3169006EA2D5 /* cocoa_input_legacy.mm in Sources */, ABE2410C14BE3169006EA2D5 /* input_legacy.mm in Sources */, ABE2410D14BE3169006EA2D5 /* nds_control_legacy.mm in Sources */, ABE2410E14BE3169006EA2D5 /* preferences_legacy.mm in Sources */, ABE2410F14BE3169006EA2D5 /* screen_state_legacy.m in Sources */, ABE2411014BE3169006EA2D5 /* video_output_view_legacy.mm in Sources */, ABD0A5681501AC5C0074A094 /* coreaudiosound.cpp in Sources */, ABD0A5691501AC5C0074A094 /* ringbuffer.cpp in Sources */, AB18137015D1FB73007A6CC3 /* arm_jit.cpp in Sources */, AB1816B715D216F2007A6CC3 /* OGLRender.cpp in Sources */, ABF50BE9169F61540018C08D /* assembler.cpp in Sources */, ABF50BEA169F61540018C08D /* assert.cpp in Sources */, ABF50BEB169F61540018C08D /* buffer.cpp in Sources */, ABF50BEC169F61540018C08D /* compiler.cpp in Sources */, ABF50BED169F61540018C08D /* compilercontext.cpp in Sources */, ABF50BEE169F61540018C08D /* compilerfunc.cpp in Sources */, ABF50BEF169F61540018C08D /* compileritem.cpp in Sources */, ABF50BF0169F61540018C08D /* context.cpp in Sources */, ABF50BF1169F61540018C08D /* cpuinfo.cpp in Sources */, ABF50BF2169F61540018C08D /* defs.cpp in Sources */, ABF50BF3169F61540018C08D /* func.cpp in Sources */, ABF50BF4169F61540018C08D /* logger.cpp in Sources */, ABF50BF5169F61540018C08D /* memorymanager.cpp in Sources */, ABF50BF6169F61540018C08D /* memorymarker.cpp in Sources */, ABF50BF7169F61540018C08D /* operand.cpp in Sources */, ABF50BF8169F61540018C08D /* stringbuilder.cpp in Sources */, ABF50BF9169F61540018C08D /* stringutil.cpp in Sources */, ABF50BFA169F61540018C08D /* virtualmemory.cpp in Sources */, ABF50BFB169F61540018C08D /* zonememory.cpp in Sources */, ABF50BFC169F61540018C08D /* x86assembler.cpp in Sources */, ABF50BFD169F61540018C08D /* x86compiler.cpp in Sources */, ABF50BFE169F61540018C08D /* x86compilercontext.cpp in Sources */, ABF50BFF169F61540018C08D /* x86compilerfunc.cpp in Sources */, ABF50C00169F61540018C08D /* x86compileritem.cpp in Sources */, ABF50C01169F61540018C08D /* x86cpuinfo.cpp in Sources */, ABF50C02169F61540018C08D /* x86defs.cpp in Sources */, ABF50C03169F61540018C08D /* x86func.cpp in Sources */, ABF50C04169F61540018C08D /* x86operand.cpp in Sources */, ABF50C05169F61540018C08D /* x86util.cpp in Sources */, AB2F5B051704EE0100E28885 /* utilities.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB06CE3E135B8AEE00E977B3 /* ConvertUTF.c in Sources */, AB06CE2A135B8AEE00E977B3 /* AAFilter.cpp in Sources */, AB06CD3D135B8ACE00E977B3 /* addons.cpp in Sources */, AB06CD3F135B8ACE00E977B3 /* arm_instructions.cpp in Sources */, AB06CD40135B8ACE00E977B3 /* armcpu.cpp in Sources */, AB06CD41135B8ACE00E977B3 /* bios.cpp in Sources */, AB06CE46135B8AEE00E977B3 /* cache.cpp in Sources */, AB06CD42135B8ACE00E977B3 /* cheatSystem.cpp in Sources */, AB06CD44135B8ACE00E977B3 /* common.cpp in Sources */, AB06CD45135B8ACE00E977B3 /* cp15.cpp in Sources */, AB06CE2D135B8AEE00E977B3 /* cpu_detect_x86_gcc.cpp in Sources */, AB06CE40135B8AEE00E977B3 /* crc.cpp in Sources */, AB06CE3F135B8AEE00E977B3 /* datetime.cpp in Sources */, AB06CD47135B8ACE00E977B3 /* debug.cpp in Sources */, AB06CE41135B8AEE00E977B3 /* decrypt.cpp in Sources */, AB06CE47135B8AEE00E977B3 /* directory.cpp in Sources */, AB06CD49135B8ACE00E977B3 /* Disassembler.cpp in Sources */, AB06CE48135B8AEE00E977B3 /* disc.cpp in Sources */, AB06CE43135B8AEE00E977B3 /* dlditool.cpp in Sources */, AB06CD4A135B8ACE00E977B3 /* driver.cpp in Sources */, AB06CE44135B8AEE00E977B3 /* emufat.cpp in Sources */, AB06CD4B135B8ACE00E977B3 /* emufile.cpp in Sources */, AB06CE49135B8AEE00E977B3 /* fatdir.cpp in Sources */, AB06CE4A135B8AEE00E977B3 /* fatfile.cpp in Sources */, AB06CD4C135B8ACE00E977B3 /* FIFO.cpp in Sources */, AB06CE30135B8AEE00E977B3 /* FIFOSampleBuffer.cpp in Sources */, AB06CE4B135B8AEE00E977B3 /* file_allocation_table.cpp in Sources */, AB06CE4C135B8AEE00E977B3 /* filetime.cpp in Sources */, AB06CE31135B8AEE00E977B3 /* FIRFilter.cpp in Sources */, AB06CD4D135B8ACE00E977B3 /* firmware.cpp in Sources */, AB06CD4E135B8ACE00E977B3 /* fs-linux.cpp in Sources */, AB06CD50135B8ACE00E977B3 /* gfx3d.cpp in Sources */, AB06CD53135B8ACE00E977B3 /* GPU.cpp in Sources */, AB06CD51135B8ACE00E977B3 /* GPU_osd_stub.cpp in Sources */, AB06CE45135B8AEE00E977B3 /* guid.cpp in Sources */, AB06CE42135B8AEE00E977B3 /* header.cpp in Sources */, AB06CE4D135B8AEE00E977B3 /* libfat.cpp in Sources */, AB06CE4E135B8AEE00E977B3 /* libfat_public_api.cpp in Sources */, AB06CE4F135B8AEE00E977B3 /* lock.cpp in Sources */, AB06CD55135B8ACE00E977B3 /* matrix.cpp in Sources */, AB06CD56135B8ACE00E977B3 /* mc.cpp in Sources */, AB06CE51135B8AEE00E977B3 /* md5.cpp in Sources */, AB06CE26135B8AEE00E977B3 /* metaspu.cpp in Sources */, AB06CD59135B8ACE00E977B3 /* mic.cpp in Sources */, AB06CD5A135B8ACE00E977B3 /* MMU.cpp in Sources */, AB06CE35135B8AEE00E977B3 /* mmx_optimized.cpp in Sources */, AB06CD5B135B8ACE00E977B3 /* movie.cpp in Sources */, AB06CD5C135B8ACE00E977B3 /* NDSSystem.cpp in Sources */, AB06CE50135B8AEE00E977B3 /* partition.cpp in Sources */, AB06CD5E135B8ACE00E977B3 /* path.cpp in Sources */, AB06CD5F135B8ACE00E977B3 /* rasterize.cpp in Sources */, AB06CE36135B8AEE00E977B3 /* RateTransposer.cpp in Sources */, AB06CD60135B8ACE00E977B3 /* readwrite.cpp in Sources */, AB06CD61135B8ACE00E977B3 /* render3D.cpp in Sources */, AB06CD62135B8ACE00E977B3 /* ROMReader.cpp in Sources */, AB06CD63135B8ACE00E977B3 /* rtc.cpp in Sources */, AB06CD64135B8ACE00E977B3 /* saves.cpp in Sources */, AB06CD65135B8ACE00E977B3 /* slot1.cpp in Sources */, AB06CE13135B8AEE00E977B3 /* slot1_none.cpp in Sources */, AB06CE14135B8AEE00E977B3 /* slot1_r4.cpp in Sources */, AB06CE15135B8AEE00E977B3 /* slot1_retail.cpp in Sources */, 956B96C313DF4CF900FCDCD0 /* slot1_retail_nand.cpp in Sources */, AB06CE16135B8AEE00E977B3 /* slot2_expMemory.cpp in Sources */, AB06CE17135B8AEE00E977B3 /* slot2_gbagame.cpp in Sources */, AB06CE18135B8AEE00E977B3 /* slot2_guitarGrip.cpp in Sources */, AB06CE19135B8AEE00E977B3 /* slot2_mpcf.cpp in Sources */, AB06CE1A135B8AEE00E977B3 /* slot2_none.cpp in Sources */, AB06CE1B135B8AEE00E977B3 /* slot2_paddle.cpp in Sources */, AB06CE1C135B8AEE00E977B3 /* slot2_piano.cpp in Sources */, AB06CE1D135B8AEE00E977B3 /* slot2_rumblepak.cpp in Sources */, ABF4007F14B4F1C000578AE7 /* sndOSX.cpp in Sources */, AB06CE28135B8AEE00E977B3 /* SndOut.cpp in Sources */, AB06CE38135B8AEE00E977B3 /* SoundTouch.cpp in Sources */, AB06CD67135B8ACE00E977B3 /* SPU.cpp in Sources */, AB06CE39135B8AEE00E977B3 /* sse_optimized.cpp in Sources */, AB06CE52135B8AEE00E977B3 /* task.cpp in Sources */, AB06CE3A135B8AEE00E977B3 /* TDStretch.cpp in Sources */, AB06CD68135B8ACE00E977B3 /* texcache.cpp in Sources */, AB06CD69135B8ACE00E977B3 /* thumb_instructions.cpp in Sources */, AB06CE3C135B8AEE00E977B3 /* Timestretcher.cpp in Sources */, 7FA912201426523900E2ABDD /* tinystr.cpp in Sources */, 7FA912211426523900E2ABDD /* tinyxml.cpp in Sources */, 7FA912221426523900E2ABDD /* tinyxmlerror.cpp in Sources */, 7FA912231426523900E2ABDD /* tinyxmlparser.cpp in Sources */, AB06CD6A135B8ACE00E977B3 /* version.cpp in Sources */, AB06CE53135B8AEE00E977B3 /* vfat.cpp in Sources */, AB06CE3B135B8AEE00E977B3 /* WavFile.cpp in Sources */, AB06CD6B135B8ACE00E977B3 /* wifi.cpp in Sources */, AB06CE54135B8AEE00E977B3 /* xstring.cpp in Sources */, ABAC890914B7943E001B299F /* main.m in Sources */, AB73B13114BDA01C00F49C92 /* appDelegate_legacy.mm in Sources */, ABBF053014B5436E00E505A0 /* cocoa_file.mm in Sources */, AB8FE37714B652EC009E20B1 /* cocoa_util.mm in Sources */, AB73B13214BDA01C00F49C92 /* emuWindowDelegate_legacy.mm in Sources */, ABE2411114BE3169006EA2D5 /* cocoa_input_legacy.mm in Sources */, ABE2411214BE3169006EA2D5 /* input_legacy.mm in Sources */, ABE2411314BE3169006EA2D5 /* nds_control_legacy.mm in Sources */, ABE2411414BE3169006EA2D5 /* preferences_legacy.mm in Sources */, ABE2411514BE3169006EA2D5 /* screen_state_legacy.m in Sources */, ABE2411614BE3169006EA2D5 /* video_output_view_legacy.mm in Sources */, ABD0A56C1501AC5C0074A094 /* coreaudiosound.cpp in Sources */, ABD0A56D1501AC5C0074A094 /* ringbuffer.cpp in Sources */, AB18136D15D1FB73007A6CC3 /* arm_jit.cpp in Sources */, AB1816B415D216D6007A6CC3 /* OGLRender.cpp in Sources */, ABF50C40169F61540018C08D /* assembler.cpp in Sources */, ABF50C41169F61540018C08D /* assert.cpp in Sources */, ABF50C42169F61540018C08D /* buffer.cpp in Sources */, ABF50C43169F61540018C08D /* compiler.cpp in Sources */, ABF50C44169F61540018C08D /* compilercontext.cpp in Sources */, ABF50C45169F61540018C08D /* compilerfunc.cpp in Sources */, ABF50C46169F61540018C08D /* compileritem.cpp in Sources */, ABF50C47169F61540018C08D /* context.cpp in Sources */, ABF50C48169F61540018C08D /* cpuinfo.cpp in Sources */, ABF50C49169F61540018C08D /* defs.cpp in Sources */, ABF50C4A169F61540018C08D /* func.cpp in Sources */, ABF50C4B169F61540018C08D /* logger.cpp in Sources */, ABF50C4C169F61540018C08D /* memorymanager.cpp in Sources */, ABF50C4D169F61540018C08D /* memorymarker.cpp in Sources */, ABF50C4E169F61540018C08D /* operand.cpp in Sources */, ABF50C4F169F61540018C08D /* stringbuilder.cpp in Sources */, ABF50C50169F61540018C08D /* stringutil.cpp in Sources */, ABF50C51169F61540018C08D /* virtualmemory.cpp in Sources */, ABF50C52169F61540018C08D /* zonememory.cpp in Sources */, ABF50C53169F61540018C08D /* x86assembler.cpp in Sources */, ABF50C54169F61540018C08D /* x86compiler.cpp in Sources */, ABF50C55169F61540018C08D /* x86compilercontext.cpp in Sources */, ABF50C56169F61540018C08D /* x86compilerfunc.cpp in Sources */, ABF50C57169F61540018C08D /* x86compileritem.cpp in Sources */, ABF50C58169F61540018C08D /* x86cpuinfo.cpp in Sources */, ABF50C59169F61540018C08D /* x86defs.cpp in Sources */, ABF50C5A169F61540018C08D /* x86func.cpp in Sources */, ABF50C5B169F61540018C08D /* x86operand.cpp in Sources */, ABF50C5C169F61540018C08D /* x86util.cpp in Sources */, AB2F5B081704EE0100E28885 /* utilities.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB0A0D3914AACE9500E83E91 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB0A0D8214AACE9500E83E91 /* ConvertUTF.c in Sources */, AB0A0D7714AACE9500E83E91 /* AAFilter.cpp in Sources */, AB0A0D4614AACE9500E83E91 /* addons.cpp in Sources */, AB0A0D4714AACE9500E83E91 /* arm_instructions.cpp in Sources */, AB0A0D4814AACE9500E83E91 /* armcpu.cpp in Sources */, AB0A0D4914AACE9500E83E91 /* bios.cpp in Sources */, AB0A0D8A14AACE9500E83E91 /* cache.cpp in Sources */, AB0A0D4A14AACE9500E83E91 /* cheatSystem.cpp in Sources */, AB0A0D4B14AACE9500E83E91 /* common.cpp in Sources */, AB0A0D4C14AACE9500E83E91 /* cp15.cpp in Sources */, AB0A0D7814AACE9500E83E91 /* cpu_detect_x86_gcc.cpp in Sources */, AB0A0D8414AACE9500E83E91 /* crc.cpp in Sources */, AB0A0D8314AACE9500E83E91 /* datetime.cpp in Sources */, AB0A0D4D14AACE9500E83E91 /* debug.cpp in Sources */, AB0A0D8514AACE9500E83E91 /* decrypt.cpp in Sources */, AB0A0D8B14AACE9500E83E91 /* directory.cpp in Sources */, AB0A0D4E14AACE9500E83E91 /* Disassembler.cpp in Sources */, AB0A0D8C14AACE9500E83E91 /* disc.cpp in Sources */, AB0A0D8714AACE9500E83E91 /* dlditool.cpp in Sources */, AB0A0D4F14AACE9500E83E91 /* driver.cpp in Sources */, AB0A0D8814AACE9500E83E91 /* emufat.cpp in Sources */, AB0A0D5014AACE9500E83E91 /* emufile.cpp in Sources */, AB0A0D8D14AACE9500E83E91 /* fatdir.cpp in Sources */, AB0A0D8E14AACE9500E83E91 /* fatfile.cpp in Sources */, AB0A0D5114AACE9500E83E91 /* FIFO.cpp in Sources */, AB0A0D7914AACE9500E83E91 /* FIFOSampleBuffer.cpp in Sources */, AB0A0D8F14AACE9500E83E91 /* file_allocation_table.cpp in Sources */, AB0A0D9014AACE9500E83E91 /* filetime.cpp in Sources */, AB0A0D7A14AACE9500E83E91 /* FIRFilter.cpp in Sources */, AB0A0D5214AACE9500E83E91 /* firmware.cpp in Sources */, AB0A0D5314AACE9500E83E91 /* fs-linux.cpp in Sources */, AB0A0D5414AACE9500E83E91 /* gfx3d.cpp in Sources */, AB0A0D5614AACE9500E83E91 /* GPU.cpp in Sources */, AB0A0D5514AACE9500E83E91 /* GPU_osd_stub.cpp in Sources */, AB0A0D8914AACE9500E83E91 /* guid.cpp in Sources */, AB0A0D8614AACE9500E83E91 /* header.cpp in Sources */, AB0A0D9114AACE9500E83E91 /* libfat.cpp in Sources */, AB0A0D9214AACE9500E83E91 /* libfat_public_api.cpp in Sources */, AB0A0D9314AACE9500E83E91 /* lock.cpp in Sources */, AB0A0D5714AACE9500E83E91 /* matrix.cpp in Sources */, AB0A0D5814AACE9500E83E91 /* mc.cpp in Sources */, AB0A0D9514AACE9500E83E91 /* md5.cpp in Sources */, AB0A0D7514AACE9500E83E91 /* metaspu.cpp in Sources */, AB0A0D5914AACE9500E83E91 /* mic.cpp in Sources */, AB0A0D5A14AACE9500E83E91 /* MMU.cpp in Sources */, AB0A0D7B14AACE9500E83E91 /* mmx_optimized.cpp in Sources */, AB0A0D5B14AACE9500E83E91 /* movie.cpp in Sources */, AB0A0D5C14AACE9500E83E91 /* NDSSystem.cpp in Sources */, AB0A0D9414AACE9500E83E91 /* partition.cpp in Sources */, AB0A0D5D14AACE9500E83E91 /* path.cpp in Sources */, AB0A0D5E14AACE9500E83E91 /* rasterize.cpp in Sources */, AB0A0D7C14AACE9500E83E91 /* RateTransposer.cpp in Sources */, AB0A0D5F14AACE9500E83E91 /* readwrite.cpp in Sources */, AB0A0D6014AACE9500E83E91 /* render3D.cpp in Sources */, AB0A0D6114AACE9500E83E91 /* ROMReader.cpp in Sources */, AB0A0D6214AACE9500E83E91 /* rtc.cpp in Sources */, AB0A0D6314AACE9500E83E91 /* saves.cpp in Sources */, AB0A0D6414AACE9500E83E91 /* slot1.cpp in Sources */, AB0A0D6A14AACE9500E83E91 /* slot1_none.cpp in Sources */, AB0A0D6B14AACE9500E83E91 /* slot1_r4.cpp in Sources */, AB0A0D6C14AACE9500E83E91 /* slot1_retail.cpp in Sources */, AB0A0D9C14AACE9500E83E91 /* slot1_retail_nand.cpp in Sources */, AB0A0D6D14AACE9500E83E91 /* slot2_expMemory.cpp in Sources */, AB0A0D6E14AACE9500E83E91 /* slot2_gbagame.cpp in Sources */, AB0A0D6F14AACE9500E83E91 /* slot2_guitarGrip.cpp in Sources */, AB0A0D7014AACE9500E83E91 /* slot2_mpcf.cpp in Sources */, AB0A0D7114AACE9500E83E91 /* slot2_none.cpp in Sources */, AB0A0D7214AACE9500E83E91 /* slot2_paddle.cpp in Sources */, AB0A0D7314AACE9500E83E91 /* slot2_piano.cpp in Sources */, AB0A0D7414AACE9500E83E91 /* slot2_rumblepak.cpp in Sources */, ABF4008014B4F1C000578AE7 /* sndOSX.cpp in Sources */, AB0A0D7614AACE9500E83E91 /* SndOut.cpp in Sources */, AB0A0D7D14AACE9500E83E91 /* SoundTouch.cpp in Sources */, AB0A0D6514AACE9500E83E91 /* SPU.cpp in Sources */, AB0A0D7E14AACE9500E83E91 /* sse_optimized.cpp in Sources */, AB0A0D9614AACE9500E83E91 /* task.cpp in Sources */, AB0A0D7F14AACE9500E83E91 /* TDStretch.cpp in Sources */, AB0A0D6614AACE9500E83E91 /* texcache.cpp in Sources */, AB0A0D6714AACE9500E83E91 /* thumb_instructions.cpp in Sources */, AB0A0D8114AACE9500E83E91 /* Timestretcher.cpp in Sources */, AB0A0D9D14AACE9500E83E91 /* tinystr.cpp in Sources */, AB0A0D9E14AACE9500E83E91 /* tinyxml.cpp in Sources */, AB0A0D9F14AACE9500E83E91 /* tinyxmlerror.cpp in Sources */, AB0A0DA014AACE9500E83E91 /* tinyxmlparser.cpp in Sources */, AB0A0D6814AACE9500E83E91 /* version.cpp in Sources */, AB0A0D9714AACE9500E83E91 /* vfat.cpp in Sources */, AB0A0D8014AACE9500E83E91 /* WavFile.cpp in Sources */, AB0A0D6914AACE9500E83E91 /* wifi.cpp in Sources */, AB0A0D9814AACE9500E83E91 /* xstring.cpp in Sources */, ABAC890B14B7943E001B299F /* main.m in Sources */, AB73B12B14BDA01C00F49C92 /* appDelegate_legacy.mm in Sources */, ABBF053114B5436E00E505A0 /* cocoa_file.mm in Sources */, AB8FE37614B652EC009E20B1 /* cocoa_util.mm in Sources */, AB73B12C14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm in Sources */, ABE240FF14BE3169006EA2D5 /* cocoa_input_legacy.mm in Sources */, ABE2410014BE3169006EA2D5 /* input_legacy.mm in Sources */, ABE2410114BE3169006EA2D5 /* nds_control_legacy.mm in Sources */, ABE2410214BE3169006EA2D5 /* preferences_legacy.mm in Sources */, ABE2410314BE3169006EA2D5 /* screen_state_legacy.m in Sources */, ABE2410414BE3169006EA2D5 /* video_output_view_legacy.mm in Sources */, ABD0A5661501AC5C0074A094 /* coreaudiosound.cpp in Sources */, ABD0A5671501AC5C0074A094 /* ringbuffer.cpp in Sources */, AB18136E15D1FB73007A6CC3 /* arm_jit.cpp in Sources */, AB751A681696535D00AFA00D /* OGLRender.cpp in Sources */, ABF50BAF169F61540018C08D /* assembler.cpp in Sources */, ABF50BB0169F61540018C08D /* assert.cpp in Sources */, ABF50BB1169F61540018C08D /* buffer.cpp in Sources */, ABF50BB2169F61540018C08D /* compiler.cpp in Sources */, ABF50BB3169F61540018C08D /* compilercontext.cpp in Sources */, ABF50BB4169F61540018C08D /* compilerfunc.cpp in Sources */, ABF50BB5169F61540018C08D /* compileritem.cpp in Sources */, ABF50BB6169F61540018C08D /* context.cpp in Sources */, ABF50BB7169F61540018C08D /* cpuinfo.cpp in Sources */, ABF50BB8169F61540018C08D /* defs.cpp in Sources */, ABF50BB9169F61540018C08D /* func.cpp in Sources */, ABF50BBA169F61540018C08D /* logger.cpp in Sources */, ABF50BBB169F61540018C08D /* memorymanager.cpp in Sources */, ABF50BBC169F61540018C08D /* memorymarker.cpp in Sources */, ABF50BBD169F61540018C08D /* operand.cpp in Sources */, ABF50BBE169F61540018C08D /* stringbuilder.cpp in Sources */, ABF50BBF169F61540018C08D /* stringutil.cpp in Sources */, ABF50BC0169F61540018C08D /* virtualmemory.cpp in Sources */, ABF50BC1169F61540018C08D /* zonememory.cpp in Sources */, ABF50BC2169F61540018C08D /* x86assembler.cpp in Sources */, ABF50BC3169F61540018C08D /* x86compiler.cpp in Sources */, ABF50BC4169F61540018C08D /* x86compilercontext.cpp in Sources */, ABF50BC5169F61540018C08D /* x86compilerfunc.cpp in Sources */, ABF50BC6169F61540018C08D /* x86compileritem.cpp in Sources */, ABF50BC7169F61540018C08D /* x86cpuinfo.cpp in Sources */, ABF50BC8169F61540018C08D /* x86defs.cpp in Sources */, ABF50BC9169F61540018C08D /* x86func.cpp in Sources */, ABF50BCA169F61540018C08D /* x86operand.cpp in Sources */, ABF50BCB169F61540018C08D /* x86util.cpp in Sources */, AB2F5B031704EE0100E28885 /* utilities.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB1814D815D212B4007A6CC3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB1814D915D212B4007A6CC3 /* ConvertUTF.c in Sources */, AB1814DA15D212B4007A6CC3 /* AAFilter.cpp in Sources */, AB1814DB15D212B4007A6CC3 /* addons.cpp in Sources */, AB1814DC15D212B4007A6CC3 /* arm_instructions.cpp in Sources */, AB1814DD15D212B4007A6CC3 /* armcpu.cpp in Sources */, AB1814DE15D212B4007A6CC3 /* bios.cpp in Sources */, AB1814DF15D212B4007A6CC3 /* cache.cpp in Sources */, AB1814E015D212B4007A6CC3 /* cheatSystem.cpp in Sources */, AB1814E115D212B4007A6CC3 /* common.cpp in Sources */, AB1814E215D212B4007A6CC3 /* cp15.cpp in Sources */, AB1814E315D212B4007A6CC3 /* cpu_detect_x86_gcc.cpp in Sources */, AB1814E415D212B4007A6CC3 /* crc.cpp in Sources */, AB1814E515D212B4007A6CC3 /* datetime.cpp in Sources */, AB1814E615D212B4007A6CC3 /* debug.cpp in Sources */, AB1814E715D212B4007A6CC3 /* decrypt.cpp in Sources */, AB1814E815D212B4007A6CC3 /* directory.cpp in Sources */, AB1814E915D212B4007A6CC3 /* Disassembler.cpp in Sources */, AB1814EA15D212B4007A6CC3 /* disc.cpp in Sources */, AB1814EB15D212B4007A6CC3 /* dlditool.cpp in Sources */, AB1814EC15D212B4007A6CC3 /* driver.cpp in Sources */, AB1814ED15D212B4007A6CC3 /* emufat.cpp in Sources */, AB1814EE15D212B4007A6CC3 /* emufile.cpp in Sources */, AB1814EF15D212B4007A6CC3 /* fatdir.cpp in Sources */, AB1814F015D212B4007A6CC3 /* fatfile.cpp in Sources */, AB1814F115D212B4007A6CC3 /* FIFO.cpp in Sources */, AB1814F215D212B4007A6CC3 /* FIFOSampleBuffer.cpp in Sources */, AB1814F315D212B4007A6CC3 /* file_allocation_table.cpp in Sources */, AB1814F415D212B4007A6CC3 /* filetime.cpp in Sources */, AB1814F515D212B4007A6CC3 /* FIRFilter.cpp in Sources */, AB1814F615D212B4007A6CC3 /* firmware.cpp in Sources */, AB1814F715D212B4007A6CC3 /* fs-linux.cpp in Sources */, AB1814F815D212B4007A6CC3 /* gfx3d.cpp in Sources */, AB1814F915D212B4007A6CC3 /* GPU.cpp in Sources */, AB1814FA15D212B4007A6CC3 /* GPU_osd_stub.cpp in Sources */, AB1814FB15D212B4007A6CC3 /* guid.cpp in Sources */, AB1814FC15D212B4007A6CC3 /* header.cpp in Sources */, AB1814FD15D212B4007A6CC3 /* libfat.cpp in Sources */, AB1814FE15D212B4007A6CC3 /* libfat_public_api.cpp in Sources */, AB1814FF15D212B4007A6CC3 /* lock.cpp in Sources */, AB18150015D212B4007A6CC3 /* matrix.cpp in Sources */, AB18150115D212B4007A6CC3 /* mc.cpp in Sources */, AB18150215D212B4007A6CC3 /* md5.cpp in Sources */, AB18150315D212B4007A6CC3 /* metaspu.cpp in Sources */, AB18150415D212B4007A6CC3 /* mic.cpp in Sources */, AB18150515D212B4007A6CC3 /* MMU.cpp in Sources */, AB18150615D212B4007A6CC3 /* mmx_optimized.cpp in Sources */, AB18150715D212B4007A6CC3 /* movie.cpp in Sources */, AB18150815D212B4007A6CC3 /* NDSSystem.cpp in Sources */, AB18150915D212B4007A6CC3 /* partition.cpp in Sources */, AB18150A15D212B4007A6CC3 /* path.cpp in Sources */, AB18150B15D212B4007A6CC3 /* rasterize.cpp in Sources */, AB18150C15D212B4007A6CC3 /* RateTransposer.cpp in Sources */, AB18150D15D212B4007A6CC3 /* readwrite.cpp in Sources */, AB18150E15D212B4007A6CC3 /* render3D.cpp in Sources */, AB18150F15D212B4007A6CC3 /* ROMReader.cpp in Sources */, AB18151015D212B4007A6CC3 /* rtc.cpp in Sources */, AB18151115D212B4007A6CC3 /* saves.cpp in Sources */, AB18151215D212B4007A6CC3 /* slot1.cpp in Sources */, AB18151315D212B4007A6CC3 /* slot1_none.cpp in Sources */, AB18151415D212B4007A6CC3 /* slot1_r4.cpp in Sources */, AB18151515D212B4007A6CC3 /* slot1_retail.cpp in Sources */, AB18151615D212B4007A6CC3 /* slot1_retail_nand.cpp in Sources */, AB18151715D212B4007A6CC3 /* slot2_expMemory.cpp in Sources */, AB18151815D212B4007A6CC3 /* slot2_gbagame.cpp in Sources */, AB18151915D212B4007A6CC3 /* slot2_guitarGrip.cpp in Sources */, AB18151A15D212B4007A6CC3 /* slot2_mpcf.cpp in Sources */, AB18151B15D212B4007A6CC3 /* slot2_none.cpp in Sources */, AB18151C15D212B4007A6CC3 /* slot2_paddle.cpp in Sources */, AB18151D15D212B4007A6CC3 /* slot2_piano.cpp in Sources */, AB18151E15D212B4007A6CC3 /* slot2_rumblepak.cpp in Sources */, AB18151F15D212B4007A6CC3 /* sndOSX.cpp in Sources */, AB18152015D212B4007A6CC3 /* SndOut.cpp in Sources */, AB18152115D212B4007A6CC3 /* SoundTouch.cpp in Sources */, AB18152215D212B4007A6CC3 /* SPU.cpp in Sources */, AB18152315D212B4007A6CC3 /* sse_optimized.cpp in Sources */, AB18152415D212B4007A6CC3 /* task.cpp in Sources */, AB18152515D212B4007A6CC3 /* TDStretch.cpp in Sources */, AB18152615D212B4007A6CC3 /* texcache.cpp in Sources */, AB18152715D212B4007A6CC3 /* thumb_instructions.cpp in Sources */, AB18152815D212B4007A6CC3 /* Timestretcher.cpp in Sources */, AB18152915D212B4007A6CC3 /* tinystr.cpp in Sources */, AB18152A15D212B4007A6CC3 /* tinyxml.cpp in Sources */, AB18152B15D212B4007A6CC3 /* tinyxmlerror.cpp in Sources */, AB18152C15D212B4007A6CC3 /* tinyxmlparser.cpp in Sources */, AB18152D15D212B4007A6CC3 /* version.cpp in Sources */, AB18152E15D212B4007A6CC3 /* vfat.cpp in Sources */, AB18152F15D212B4007A6CC3 /* WavFile.cpp in Sources */, AB18153015D212B4007A6CC3 /* wifi.cpp in Sources */, AB18153115D212B4007A6CC3 /* xstring.cpp in Sources */, AB18153215D212B4007A6CC3 /* main.m in Sources */, AB18153315D212B4007A6CC3 /* appDelegate_legacy.mm in Sources */, AB18153415D212B4007A6CC3 /* cocoa_file.mm in Sources */, AB18153515D212B4007A6CC3 /* cocoa_util.mm in Sources */, AB18153615D212B4007A6CC3 /* emuWindowDelegate_legacy.mm in Sources */, AB18153715D212B4007A6CC3 /* cocoa_input_legacy.mm in Sources */, AB18153815D212B4007A6CC3 /* input_legacy.mm in Sources */, AB18153915D212B4007A6CC3 /* nds_control_legacy.mm in Sources */, AB18153A15D212B4007A6CC3 /* preferences_legacy.mm in Sources */, AB18153B15D212B4007A6CC3 /* screen_state_legacy.m in Sources */, AB18153C15D212B4007A6CC3 /* video_output_view_legacy.mm in Sources */, AB18153D15D212B4007A6CC3 /* coreaudiosound.cpp in Sources */, AB18153E15D212B4007A6CC3 /* ringbuffer.cpp in Sources */, AB1816B615D216EC007A6CC3 /* OGLRender.cpp in Sources */, AB2F5B071704EE0100E28885 /* utilities.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB18157415D21469007A6CC3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB18157515D21469007A6CC3 /* ConvertUTF.c in Sources */, AB18157615D21469007A6CC3 /* AAFilter.cpp in Sources */, AB18157715D21469007A6CC3 /* addons.cpp in Sources */, AB18157815D21469007A6CC3 /* arm_instructions.cpp in Sources */, AB18157915D21469007A6CC3 /* armcpu.cpp in Sources */, AB18157A15D21469007A6CC3 /* bios.cpp in Sources */, AB18157B15D21469007A6CC3 /* cache.cpp in Sources */, AB18157C15D21469007A6CC3 /* cheatSystem.cpp in Sources */, AB18157D15D21469007A6CC3 /* common.cpp in Sources */, AB18157E15D21469007A6CC3 /* cp15.cpp in Sources */, AB18157F15D21469007A6CC3 /* cpu_detect_x86_gcc.cpp in Sources */, AB18158015D21469007A6CC3 /* crc.cpp in Sources */, AB18158115D21469007A6CC3 /* datetime.cpp in Sources */, AB18158215D21469007A6CC3 /* debug.cpp in Sources */, AB18158315D21469007A6CC3 /* decrypt.cpp in Sources */, AB18158415D21469007A6CC3 /* directory.cpp in Sources */, AB18158515D21469007A6CC3 /* Disassembler.cpp in Sources */, AB18158615D21469007A6CC3 /* disc.cpp in Sources */, AB18158715D21469007A6CC3 /* dlditool.cpp in Sources */, AB18158815D21469007A6CC3 /* driver.cpp in Sources */, AB18158915D21469007A6CC3 /* emufat.cpp in Sources */, AB18158A15D21469007A6CC3 /* emufile.cpp in Sources */, AB18158B15D21469007A6CC3 /* fatdir.cpp in Sources */, AB18158C15D21469007A6CC3 /* fatfile.cpp in Sources */, AB18158D15D21469007A6CC3 /* FIFO.cpp in Sources */, AB18158E15D21469007A6CC3 /* FIFOSampleBuffer.cpp in Sources */, AB18158F15D21469007A6CC3 /* file_allocation_table.cpp in Sources */, AB18159015D21469007A6CC3 /* filetime.cpp in Sources */, AB18159115D21469007A6CC3 /* FIRFilter.cpp in Sources */, AB18159215D21469007A6CC3 /* firmware.cpp in Sources */, AB18159315D21469007A6CC3 /* fs-linux.cpp in Sources */, AB18159415D21469007A6CC3 /* gfx3d.cpp in Sources */, AB18159515D21469007A6CC3 /* GPU.cpp in Sources */, AB18159615D21469007A6CC3 /* GPU_osd_stub.cpp in Sources */, AB18159715D21469007A6CC3 /* guid.cpp in Sources */, AB18159815D21469007A6CC3 /* header.cpp in Sources */, AB18159915D21469007A6CC3 /* libfat.cpp in Sources */, AB18159A15D21469007A6CC3 /* libfat_public_api.cpp in Sources */, AB18159B15D21469007A6CC3 /* lock.cpp in Sources */, AB18159C15D21469007A6CC3 /* matrix.cpp in Sources */, AB18159D15D21469007A6CC3 /* mc.cpp in Sources */, AB18159E15D21469007A6CC3 /* md5.cpp in Sources */, AB18159F15D21469007A6CC3 /* metaspu.cpp in Sources */, AB1815A015D21469007A6CC3 /* mic.cpp in Sources */, AB1815A115D21469007A6CC3 /* MMU.cpp in Sources */, AB1815A215D21469007A6CC3 /* mmx_optimized.cpp in Sources */, AB1815A315D21469007A6CC3 /* movie.cpp in Sources */, AB1815A415D21469007A6CC3 /* NDSSystem.cpp in Sources */, AB1815A515D21469007A6CC3 /* partition.cpp in Sources */, AB1815A615D21469007A6CC3 /* path.cpp in Sources */, AB1815A715D21469007A6CC3 /* rasterize.cpp in Sources */, AB1815A815D21469007A6CC3 /* RateTransposer.cpp in Sources */, AB1815A915D21469007A6CC3 /* readwrite.cpp in Sources */, AB1815AA15D21469007A6CC3 /* render3D.cpp in Sources */, AB1815AB15D21469007A6CC3 /* ROMReader.cpp in Sources */, AB1815AC15D21469007A6CC3 /* rtc.cpp in Sources */, AB1815AD15D21469007A6CC3 /* saves.cpp in Sources */, AB1815AE15D21469007A6CC3 /* slot1.cpp in Sources */, AB1815AF15D21469007A6CC3 /* slot1_none.cpp in Sources */, AB1815B015D21469007A6CC3 /* slot1_r4.cpp in Sources */, AB1815B115D21469007A6CC3 /* slot1_retail.cpp in Sources */, AB1815B215D21469007A6CC3 /* slot1_retail_nand.cpp in Sources */, AB1815B315D21469007A6CC3 /* slot2_expMemory.cpp in Sources */, AB1815B415D21469007A6CC3 /* slot2_gbagame.cpp in Sources */, AB1815B515D21469007A6CC3 /* slot2_guitarGrip.cpp in Sources */, AB1815B615D21469007A6CC3 /* slot2_mpcf.cpp in Sources */, AB1815B715D21469007A6CC3 /* slot2_none.cpp in Sources */, AB1815B815D21469007A6CC3 /* slot2_paddle.cpp in Sources */, AB1815B915D21469007A6CC3 /* slot2_piano.cpp in Sources */, AB1815BA15D21469007A6CC3 /* slot2_rumblepak.cpp in Sources */, AB1815BB15D21469007A6CC3 /* sndOSX.cpp in Sources */, AB1815BC15D21469007A6CC3 /* SndOut.cpp in Sources */, AB1815BD15D21469007A6CC3 /* SoundTouch.cpp in Sources */, AB1815BE15D21469007A6CC3 /* SPU.cpp in Sources */, AB1815BF15D21469007A6CC3 /* sse_optimized.cpp in Sources */, AB1815C015D21469007A6CC3 /* task.cpp in Sources */, AB1815C115D21469007A6CC3 /* TDStretch.cpp in Sources */, AB1815C215D21469007A6CC3 /* texcache.cpp in Sources */, AB1815C315D21469007A6CC3 /* thumb_instructions.cpp in Sources */, AB1815C415D21469007A6CC3 /* Timestretcher.cpp in Sources */, AB1815C515D21469007A6CC3 /* tinystr.cpp in Sources */, AB1815C615D21469007A6CC3 /* tinyxml.cpp in Sources */, AB1815C715D21469007A6CC3 /* tinyxmlerror.cpp in Sources */, AB1815C815D21469007A6CC3 /* tinyxmlparser.cpp in Sources */, AB1815C915D21469007A6CC3 /* version.cpp in Sources */, AB1815CA15D21469007A6CC3 /* vfat.cpp in Sources */, AB1815CB15D21469007A6CC3 /* WavFile.cpp in Sources */, AB1815CC15D21469007A6CC3 /* wifi.cpp in Sources */, AB1815CD15D21469007A6CC3 /* xstring.cpp in Sources */, AB1815CE15D21469007A6CC3 /* main.m in Sources */, AB1815CF15D21469007A6CC3 /* appDelegate_legacy.mm in Sources */, AB1815D015D21469007A6CC3 /* cocoa_file.mm in Sources */, AB1815D115D21469007A6CC3 /* cocoa_util.mm in Sources */, AB1815D215D21469007A6CC3 /* emuWindowDelegate_legacy.mm in Sources */, AB1815D315D21469007A6CC3 /* cocoa_input_legacy.mm in Sources */, AB1815D415D21469007A6CC3 /* input_legacy.mm in Sources */, AB1815D515D21469007A6CC3 /* nds_control_legacy.mm in Sources */, AB1815D615D21469007A6CC3 /* preferences_legacy.mm in Sources */, AB1815D715D21469007A6CC3 /* screen_state_legacy.m in Sources */, AB1815D815D21469007A6CC3 /* video_output_view_legacy.mm in Sources */, AB1815D915D21469007A6CC3 /* coreaudiosound.cpp in Sources */, AB1815DA15D21469007A6CC3 /* ringbuffer.cpp in Sources */, AB4F981716C30117000E90EA /* OGLRender.cpp in Sources */, AB2F5B091704EE0100E28885 /* utilities.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; AB18161015D214F2007A6CC3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( AB18161115D214F2007A6CC3 /* ConvertUTF.c in Sources */, AB18161215D214F2007A6CC3 /* AAFilter.cpp in Sources */, AB18161315D214F2007A6CC3 /* addons.cpp in Sources */, AB18161415D214F2007A6CC3 /* aggdraw.cpp in Sources */, AB18161515D214F2007A6CC3 /* arm_instructions.cpp in Sources */, AB18161615D214F2007A6CC3 /* armcpu.cpp in Sources */, AB18161715D214F2007A6CC3 /* bios.cpp in Sources */, AB18161815D214F2007A6CC3 /* cache.cpp in Sources */, AB18161915D214F2007A6CC3 /* cheatSystem.cpp in Sources */, AB18161A15D214F2007A6CC3 /* commandline.cpp in Sources */, AB18161B15D214F2007A6CC3 /* common.cpp in Sources */, AB18161C15D214F2007A6CC3 /* cp15.cpp in Sources */, AB18161D15D214F2007A6CC3 /* cpu_detect_x86_gcc.cpp in Sources */, AB18161E15D214F2007A6CC3 /* crc.cpp in Sources */, AB18161F15D214F2007A6CC3 /* ctrlssdl.cpp in Sources */, AB18162015D214F2007A6CC3 /* datetime.cpp in Sources */, AB18162115D214F2007A6CC3 /* debug.cpp in Sources */, AB18162215D214F2007A6CC3 /* decrypt.cpp in Sources */, AB18162315D214F2007A6CC3 /* desmume_config.cpp in Sources */, AB18162415D214F2007A6CC3 /* directory.cpp in Sources */, AB18162515D214F2007A6CC3 /* Disassembler.cpp in Sources */, AB18162615D214F2007A6CC3 /* disc.cpp in Sources */, AB18162715D214F2007A6CC3 /* dlditool.cpp in Sources */, AB18162815D214F2007A6CC3 /* driver.cpp in Sources */, AB18162915D214F2007A6CC3 /* emufat.cpp in Sources */, AB18162A15D214F2007A6CC3 /* emufile.cpp in Sources */, AB18162B15D214F2007A6CC3 /* fatdir.cpp in Sources */, AB18162C15D214F2007A6CC3 /* fatfile.cpp in Sources */, AB18162D15D214F2007A6CC3 /* FIFO.cpp in Sources */, AB18162E15D214F2007A6CC3 /* FIFOSampleBuffer.cpp in Sources */, AB18162F15D214F2007A6CC3 /* file_allocation_table.cpp in Sources */, AB18163015D214F2007A6CC3 /* filetime.cpp in Sources */, AB18163115D214F2007A6CC3 /* FIRFilter.cpp in Sources */, AB18163215D214F2007A6CC3 /* firmware.cpp in Sources */, AB18163315D214F2007A6CC3 /* fs-linux.cpp in Sources */, AB18163415D214F2007A6CC3 /* gdbstub.cpp in Sources */, AB18163515D214F2007A6CC3 /* gfx3d.cpp in Sources */, AB18163615D214F2007A6CC3 /* GPU.cpp in Sources */, AB18163715D214F2007A6CC3 /* GPU_osd.cpp in Sources */, AB18163815D214F2007A6CC3 /* GPU_osd_stub.cpp in Sources */, AB18163915D214F2007A6CC3 /* guid.cpp in Sources */, AB18163A15D214F2007A6CC3 /* header.cpp in Sources */, AB18163B15D214F2007A6CC3 /* libfat.cpp in Sources */, AB18163C15D214F2007A6CC3 /* libfat_public_api.cpp in Sources */, AB18163D15D214F2007A6CC3 /* lock.cpp in Sources */, AB18163E15D214F2007A6CC3 /* lua-engine.cpp in Sources */, AB18163F15D214F2007A6CC3 /* main.cpp in Sources */, AB18164015D214F2007A6CC3 /* matrix.cpp in Sources */, AB18164115D214F2007A6CC3 /* mc.cpp in Sources */, AB18164215D214F2007A6CC3 /* md5.cpp in Sources */, AB18164315D214F2007A6CC3 /* metaspu.cpp in Sources */, AB18164415D214F2007A6CC3 /* mic.cpp in Sources */, AB18164515D214F2007A6CC3 /* mic_alsa.cpp in Sources */, AB18164615D214F2007A6CC3 /* mic_openal.cpp in Sources */, AB18164715D214F2007A6CC3 /* MMU.cpp in Sources */, AB18164815D214F2007A6CC3 /* mmx_optimized.cpp in Sources */, AB18164915D214F2007A6CC3 /* movie.cpp in Sources */, AB18164A15D214F2007A6CC3 /* NDSSystem.cpp in Sources */, AB18164B15D214F2007A6CC3 /* partition.cpp in Sources */, AB18164C15D214F2007A6CC3 /* path.cpp in Sources */, AB18164D15D214F2007A6CC3 /* rasterize.cpp in Sources */, AB18164E15D214F2007A6CC3 /* RateTransposer.cpp in Sources */, AB18164F15D214F2007A6CC3 /* readwrite.cpp in Sources */, AB18165015D214F2007A6CC3 /* render3D.cpp in Sources */, AB18165115D214F2007A6CC3 /* ROMReader.cpp in Sources */, AB18165215D214F2007A6CC3 /* rtc.cpp in Sources */, AB18165315D214F2007A6CC3 /* saves.cpp in Sources */, AB18165415D214F2007A6CC3 /* slot1.cpp in Sources */, AB18165515D214F2007A6CC3 /* slot1_none.cpp in Sources */, AB18165615D214F2007A6CC3 /* slot1_r4.cpp in Sources */, AB18165715D214F2007A6CC3 /* slot1_retail.cpp in Sources */, AB18165815D214F2007A6CC3 /* slot2_expMemory.cpp in Sources */, AB18165915D214F2007A6CC3 /* slot2_gbagame.cpp in Sources */, AB18165A15D214F2007A6CC3 /* slot2_guitarGrip.cpp in Sources */, AB18165B15D214F2007A6CC3 /* slot2_mpcf.cpp in Sources */, AB18165C15D214F2007A6CC3 /* slot2_none.cpp in Sources */, AB18165D15D214F2007A6CC3 /* slot2_paddle.cpp in Sources */, AB18165E15D214F2007A6CC3 /* slot2_piano.cpp in Sources */, AB18165F15D214F2007A6CC3 /* slot2_rumblepak.cpp in Sources */, AB18166015D214F2007A6CC3 /* sndOSX.cpp in Sources */, AB18166115D214F2007A6CC3 /* SndOut.cpp in Sources */, AB18166215D214F2007A6CC3 /* sndsdl.cpp in Sources */, AB18166315D214F2007A6CC3 /* SoundTouch.cpp in Sources */, AB18166415D214F2007A6CC3 /* SPU.cpp in Sources */, AB18166515D214F2007A6CC3 /* sse_optimized.cpp in Sources */, AB18166615D214F2007A6CC3 /* task.cpp in Sources */, AB18166715D214F2007A6CC3 /* TDStretch.cpp in Sources */, AB18166815D214F2007A6CC3 /* texcache.cpp in Sources */, AB18166915D214F2007A6CC3 /* thumb_instructions.cpp in Sources */, AB18166A15D214F2007A6CC3 /* Timestretcher.cpp in Sources */, AB18166B15D214F2007A6CC3 /* tinystr.cpp in Sources */, AB18166C15D214F2007A6CC3 /* tinyxml.cpp in Sources */, AB18166D15D214F2007A6CC3 /* tinyxmlerror.cpp in Sources */, AB18166E15D214F2007A6CC3 /* tinyxmlparser.cpp in Sources */, AB18166F15D214F2007A6CC3 /* version.cpp in Sources */, AB18167015D214F2007A6CC3 /* vfat.cpp in Sources */, AB18167115D214F2007A6CC3 /* WavFile.cpp in Sources */, AB18167215D214F2007A6CC3 /* wifi.cpp in Sources */, AB18167315D214F2007A6CC3 /* xstring.cpp in Sources */, AB18167415D214F2007A6CC3 /* main.m in Sources */, AB18167515D214F2007A6CC3 /* appDelegate_legacy.mm in Sources */, AB18167615D214F2007A6CC3 /* cocoa_file.mm in Sources */, AB18167715D214F2007A6CC3 /* cocoa_util.mm in Sources */, AB18167815D214F2007A6CC3 /* emuWindowDelegate_legacy.mm in Sources */, AB18167915D214F2007A6CC3 /* cocoa_input_legacy.mm in Sources */, AB18167A15D214F2007A6CC3 /* input_legacy.mm in Sources */, AB18167B15D214F2007A6CC3 /* nds_control_legacy.mm in Sources */, AB18167C15D214F2007A6CC3 /* preferences_legacy.mm in Sources */, AB18167D15D214F2007A6CC3 /* screen_state_legacy.m in Sources */, AB18167E15D214F2007A6CC3 /* video_output_view_legacy.mm in Sources */, AB18167F15D214F2007A6CC3 /* coreaudiosound.cpp in Sources */, AB18168015D214F2007A6CC3 /* ringbuffer.cpp in Sources */, AB1816B815D216F5007A6CC3 /* OGLRender.cpp in Sources */, AB2F5B041704EE0100E28885 /* utilities.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABFE4244143E32F0009A3CCE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ABFE428D143E32F0009A3CCE /* ConvertUTF.c in Sources */, ABFE4282143E32F0009A3CCE /* AAFilter.cpp in Sources */, ABFE4251143E32F0009A3CCE /* addons.cpp in Sources */, ABFE4252143E32F0009A3CCE /* arm_instructions.cpp in Sources */, ABFE4253143E32F0009A3CCE /* armcpu.cpp in Sources */, ABFE4254143E32F0009A3CCE /* bios.cpp in Sources */, ABFE4295143E32F0009A3CCE /* cache.cpp in Sources */, ABFE4255143E32F0009A3CCE /* cheatSystem.cpp in Sources */, ABFE4256143E32F0009A3CCE /* common.cpp in Sources */, ABFE4257143E32F0009A3CCE /* cp15.cpp in Sources */, ABFE4283143E32F0009A3CCE /* cpu_detect_x86_gcc.cpp in Sources */, ABFE428F143E32F0009A3CCE /* crc.cpp in Sources */, ABFE428E143E32F0009A3CCE /* datetime.cpp in Sources */, ABFE4258143E32F0009A3CCE /* debug.cpp in Sources */, ABFE4290143E32F0009A3CCE /* decrypt.cpp in Sources */, ABFE4296143E32F0009A3CCE /* directory.cpp in Sources */, ABFE4259143E32F0009A3CCE /* Disassembler.cpp in Sources */, ABFE4297143E32F0009A3CCE /* disc.cpp in Sources */, ABFE4292143E32F0009A3CCE /* dlditool.cpp in Sources */, ABFE425A143E32F0009A3CCE /* driver.cpp in Sources */, ABFE4293143E32F0009A3CCE /* emufat.cpp in Sources */, ABFE425B143E32F0009A3CCE /* emufile.cpp in Sources */, ABFE4298143E32F0009A3CCE /* fatdir.cpp in Sources */, ABFE4299143E32F0009A3CCE /* fatfile.cpp in Sources */, ABFE425C143E32F0009A3CCE /* FIFO.cpp in Sources */, ABFE4284143E32F0009A3CCE /* FIFOSampleBuffer.cpp in Sources */, ABFE429A143E32F0009A3CCE /* file_allocation_table.cpp in Sources */, ABFE429B143E32F0009A3CCE /* filetime.cpp in Sources */, ABFE4285143E32F0009A3CCE /* FIRFilter.cpp in Sources */, ABFE425D143E32F0009A3CCE /* firmware.cpp in Sources */, ABFE425E143E32F0009A3CCE /* fs-linux.cpp in Sources */, ABFE425F143E32F0009A3CCE /* gfx3d.cpp in Sources */, ABFE4261143E32F0009A3CCE /* GPU.cpp in Sources */, ABFE4260143E32F0009A3CCE /* GPU_osd_stub.cpp in Sources */, ABFE4294143E32F0009A3CCE /* guid.cpp in Sources */, ABFE4291143E32F0009A3CCE /* header.cpp in Sources */, ABFE429C143E32F0009A3CCE /* libfat.cpp in Sources */, ABFE429D143E32F0009A3CCE /* libfat_public_api.cpp in Sources */, ABFE429E143E32F0009A3CCE /* lock.cpp in Sources */, ABFE4262143E32F0009A3CCE /* matrix.cpp in Sources */, ABFE4263143E32F0009A3CCE /* mc.cpp in Sources */, ABFE42A0143E32F0009A3CCE /* md5.cpp in Sources */, ABFE4280143E32F0009A3CCE /* metaspu.cpp in Sources */, ABFE4264143E32F0009A3CCE /* mic.cpp in Sources */, ABFE4265143E32F0009A3CCE /* MMU.cpp in Sources */, ABFE4286143E32F0009A3CCE /* mmx_optimized.cpp in Sources */, ABFE4266143E32F0009A3CCE /* movie.cpp in Sources */, ABFE4267143E32F0009A3CCE /* NDSSystem.cpp in Sources */, ABFE429F143E32F0009A3CCE /* partition.cpp in Sources */, ABFE4268143E32F0009A3CCE /* path.cpp in Sources */, ABFE4269143E32F0009A3CCE /* rasterize.cpp in Sources */, ABFE4287143E32F0009A3CCE /* RateTransposer.cpp in Sources */, ABFE426A143E32F0009A3CCE /* readwrite.cpp in Sources */, ABFE426B143E32F0009A3CCE /* render3D.cpp in Sources */, ABFE426C143E32F0009A3CCE /* ROMReader.cpp in Sources */, ABFE426D143E32F0009A3CCE /* rtc.cpp in Sources */, ABFE426E143E32F0009A3CCE /* saves.cpp in Sources */, ABFE426F143E32F0009A3CCE /* slot1.cpp in Sources */, ABFE4275143E32F0009A3CCE /* slot1_none.cpp in Sources */, ABFE4276143E32F0009A3CCE /* slot1_r4.cpp in Sources */, ABFE4277143E32F0009A3CCE /* slot1_retail.cpp in Sources */, ABFE42A7143E32F0009A3CCE /* slot1_retail_nand.cpp in Sources */, ABFE4278143E32F0009A3CCE /* slot2_expMemory.cpp in Sources */, ABFE4279143E32F0009A3CCE /* slot2_gbagame.cpp in Sources */, ABFE427A143E32F0009A3CCE /* slot2_guitarGrip.cpp in Sources */, ABFE427B143E32F0009A3CCE /* slot2_mpcf.cpp in Sources */, ABFE427C143E32F0009A3CCE /* slot2_none.cpp in Sources */, ABFE427D143E32F0009A3CCE /* slot2_paddle.cpp in Sources */, ABFE427E143E32F0009A3CCE /* slot2_piano.cpp in Sources */, ABFE427F143E32F0009A3CCE /* slot2_rumblepak.cpp in Sources */, ABF4008114B4F1C000578AE7 /* sndOSX.cpp in Sources */, ABFE4281143E32F0009A3CCE /* SndOut.cpp in Sources */, ABFE4288143E32F0009A3CCE /* SoundTouch.cpp in Sources */, ABFE4270143E32F0009A3CCE /* SPU.cpp in Sources */, ABFE4289143E32F0009A3CCE /* sse_optimized.cpp in Sources */, ABFE42A1143E32F0009A3CCE /* task.cpp in Sources */, ABFE428A143E32F0009A3CCE /* TDStretch.cpp in Sources */, ABFE4271143E32F0009A3CCE /* texcache.cpp in Sources */, ABFE4272143E32F0009A3CCE /* thumb_instructions.cpp in Sources */, ABFE428C143E32F0009A3CCE /* Timestretcher.cpp in Sources */, ABFE42A8143E32F0009A3CCE /* tinystr.cpp in Sources */, ABFE42A9143E32F0009A3CCE /* tinyxml.cpp in Sources */, ABFE42AA143E32F0009A3CCE /* tinyxmlerror.cpp in Sources */, ABFE42AB143E32F0009A3CCE /* tinyxmlparser.cpp in Sources */, ABFE4273143E32F0009A3CCE /* version.cpp in Sources */, ABFE42A2143E32F0009A3CCE /* vfat.cpp in Sources */, ABFE428B143E32F0009A3CCE /* WavFile.cpp in Sources */, ABFE4274143E32F0009A3CCE /* wifi.cpp in Sources */, ABFE42A3143E32F0009A3CCE /* xstring.cpp in Sources */, ABAC890A14B7943E001B299F /* main.m in Sources */, AB73B12D14BDA01C00F49C92 /* appDelegate_legacy.mm in Sources */, ABBF053214B5436E00E505A0 /* cocoa_file.mm in Sources */, AB8FE37814B652EC009E20B1 /* cocoa_util.mm in Sources */, AB73B12E14BDA01C00F49C92 /* emuWindowDelegate_legacy.mm in Sources */, ABE2410514BE3169006EA2D5 /* cocoa_input_legacy.mm in Sources */, ABE2410614BE3169006EA2D5 /* input_legacy.mm in Sources */, ABE2410714BE3169006EA2D5 /* nds_control_legacy.mm in Sources */, ABE2410814BE3169006EA2D5 /* preferences_legacy.mm in Sources */, ABE2410914BE3169006EA2D5 /* screen_state_legacy.m in Sources */, ABE2410A14BE3169006EA2D5 /* video_output_view_legacy.mm in Sources */, ABD0A56A1501AC5C0074A094 /* coreaudiosound.cpp in Sources */, ABD0A56B1501AC5C0074A094 /* ringbuffer.cpp in Sources */, AB18136F15D1FB73007A6CC3 /* arm_jit.cpp in Sources */, AB1813A615D1FD88007A6CC3 /* OGLRender.cpp in Sources */, ABF50C06169F61540018C08D /* assembler.cpp in Sources */, ABF50C07169F61540018C08D /* assert.cpp in Sources */, ABF50C08169F61540018C08D /* buffer.cpp in Sources */, ABF50C09169F61540018C08D /* compiler.cpp in Sources */, ABF50C0A169F61540018C08D /* compilercontext.cpp in Sources */, ABF50C0B169F61540018C08D /* compilerfunc.cpp in Sources */, ABF50C0C169F61540018C08D /* compileritem.cpp in Sources */, ABF50C0D169F61540018C08D /* context.cpp in Sources */, ABF50C0E169F61540018C08D /* cpuinfo.cpp in Sources */, ABF50C0F169F61540018C08D /* defs.cpp in Sources */, ABF50C10169F61540018C08D /* func.cpp in Sources */, ABF50C11169F61540018C08D /* logger.cpp in Sources */, ABF50C12169F61540018C08D /* memorymanager.cpp in Sources */, ABF50C13169F61540018C08D /* memorymarker.cpp in Sources */, ABF50C14169F61540018C08D /* operand.cpp in Sources */, ABF50C15169F61540018C08D /* stringbuilder.cpp in Sources */, ABF50C16169F61540018C08D /* stringutil.cpp in Sources */, ABF50C17169F61540018C08D /* virtualmemory.cpp in Sources */, ABF50C18169F61540018C08D /* zonememory.cpp in Sources */, ABF50C19169F61540018C08D /* x86assembler.cpp in Sources */, ABF50C1A169F61540018C08D /* x86compiler.cpp in Sources */, ABF50C1B169F61540018C08D /* x86compilercontext.cpp in Sources */, ABF50C1C169F61540018C08D /* x86compilerfunc.cpp in Sources */, ABF50C1D169F61540018C08D /* x86compileritem.cpp in Sources */, ABF50C1E169F61540018C08D /* x86cpuinfo.cpp in Sources */, ABF50C1F169F61540018C08D /* x86defs.cpp in Sources */, ABF50C20169F61540018C08D /* x86func.cpp in Sources */, ABF50C21169F61540018C08D /* x86operand.cpp in Sources */, ABF50C22169F61540018C08D /* x86util.cpp in Sources */, AB2F5B061704EE0100E28885 /* utilities.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 1F4B55090F53924500C8B514 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 1F4B55030F53921B00C8B514 /* English */, 1F4B550F0F53928700C8B514 /* French */, 1F4B550D0F53928000C8B514 /* Italian */, 1F4B550E0F53928400C8B514 /* Japanese */, ABBF04CB14B51BBB00E505A0 /* Chinese */, ABBF04CC14B51BC300E505A0 /* Norwegian */, ABBF04CD14B51BC900E505A0 /* Romanian */, ); name = Localizable.strings; sourceTree = ""; }; AB0191D214BD72EC004CB612 /* MainMenu (Legacy).xib */ = { isa = PBXVariantGroup; children = ( ABBF045E14B5144D00E505A0 /* English */, AB0191D714BD72FC004CB612 /* French */, AB0191D814BD72FF004CB612 /* Italian */, AB0191E614BD741B004CB612 /* Japanese */, AB0191E714BD741F004CB612 /* Chinese */, AB0191E814BD7423004CB612 /* Norwegian */, AB0191E914BD7425004CB612 /* Romanian */, ); name = "MainMenu (Legacy).xib"; sourceTree = ""; }; ABEB321914C56182007F0D4C /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 72C000020D9D59E60046B7EA /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 1EFD51BC0F892B1A00B029BB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( i386, x86_64, ); GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_PREPROCESSOR_DEFINITIONS = GDB_STUB; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; }; name = Debug; }; 1EFD51BD0F892B1A00B029BB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( i386, x86_64, ); GCC_PREPROCESSOR_DEFINITIONS = GDB_STUB; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; SKIP_INSTALL = NO; }; name = Release; }; AB0A0DAA14AACE9500E83E91 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = i386; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_VERSION = 4.0; SDKROOT = macosx10.4; SKIP_INSTALL = NO; VALID_ARCHS = "i386 ppc ppc7400 ppc970"; }; name = Debug; }; AB0A0DAB14AACE9500E83E91 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = i386; GCC_VERSION = 4.0; SDKROOT = macosx10.4; VALID_ARCHS = "i386 ppc ppc7400 ppc970"; }; name = Release; }; AB18155515D212B4007A6CC3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; SKIP_INSTALL = NO; }; name = Debug; }; AB18155615D212B4007A6CC3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; PRODUCT_NAME = "DeSmuME (PPC)"; }; name = Release; }; AB1815F115D21469007A6CC3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ppc; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_VERSION = 4.0; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; SDKROOT = macosx10.4; SKIP_INSTALL = NO; VALID_ARCHS = "i386 ppc ppc7400 ppc970"; }; name = Debug; }; AB1815F215D21469007A6CC3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ppc; GCC_VERSION = 4.0; PRODUCT_NAME = "DeSmuME (PPC)"; SDKROOT = macosx10.4; VALID_ARCHS = "i386 ppc ppc7400 ppc970"; }; name = Release; }; AB18169415D214F2007A6CC3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_PREPROCESSOR_DEFINITIONS = GDB_STUB; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; PRODUCT_NAME = "DeSmuME (Debug, PPC)"; }; name = Debug; }; AB18169515D214F2007A6CC3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, ppc64, ); GCC_PREPROCESSOR_DEFINITIONS = GDB_STUB; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; PRODUCT_NAME = "DeSmuME (PPC)"; SKIP_INSTALL = NO; }; name = Release; }; ABFE42B4143E32F0009A3CCE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( i386, x86_64, ); SDKROOT = macosx10.6; }; name = Debug; }; ABFE42B5143E32F0009A3CCE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( i386, x86_64, ); SDKROOT = macosx10.6; SKIP_INSTALL = NO; }; name = Release; }; C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( i386, x86_64, ); GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; SKIP_INSTALL = NO; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( i386, x86_64, ); GCC_VERSION = com.apple.compilers.llvmgcc42; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( i386, x86_64, ppc, ppc64, ); COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; GCC_ALTIVEC_EXTENSIONS = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_FAST_OBJC_DISPATCH = NO; GCC_MODEL_TUNING = ""; "GCC_MODEL_TUNING[sdk=macosx10.4][arch=ppc]" = G4; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc64]" = G5; GCC_OBJC_CALL_CXX_CDTORS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( _DEBUG, "DEBUG=1", ); GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IBC_STRIP_NIBS = NO; INFOPLIST_FILE = "Info (Legacy Debug).plist"; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "DeSmuME (Debug)"; SDKROOT = macosx10.5; SKIP_INSTALL = YES; STRIP_INSTALLED_PRODUCT = NO; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( i386, x86_64, ppc, ppc64, ); COPY_PHASE_STRIP = NO; GCC_ALTIVEC_EXTENSIONS = YES; GCC_AUTO_VECTORIZATION = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_SSE3_EXTENSIONS = YES; GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; "GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS[arch=i386]" = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; GCC_MODEL_TUNING = ""; "GCC_MODEL_TUNING[sdk=macosx10.4][arch=ppc]" = G4; "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc64]" = G5; GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = NDEBUG; GCC_STRICT_ALIASING = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_UNROLL_LOOPS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "Info (Legacy).plist"; ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = DeSmuME; SDKROOT = macosx10.5; STRIP_INSTALLED_PRODUCT = NO; VALIDATE_PRODUCT = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1EFD51BB0F892B1A00B029BB /* Build configuration list for PBXNativeTarget "DeSmuME_gdbstub (OS X App; Intel; v10.5 Leopard)" */ = { isa = XCConfigurationList; buildConfigurations = ( 1EFD51BC0F892B1A00B029BB /* Debug */, 1EFD51BD0F892B1A00B029BB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB0A0DA914AACE9500E83E91 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; v10.4 Tiger)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB0A0DAA14AACE9500E83E91 /* Debug */, AB0A0DAB14AACE9500E83E91 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB18155415D212B4007A6CC3 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; v10.5 Leopard)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB18155515D212B4007A6CC3 /* Debug */, AB18155615D212B4007A6CC3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB1815F015D21469007A6CC3 /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; PowerPC; v10.4 Tiger)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB1815F115D21469007A6CC3 /* Debug */, AB1815F215D21469007A6CC3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; AB18169315D214F2007A6CC3 /* Build configuration list for PBXNativeTarget "DeSmuME_gdbstub (OS X App; PowerPC; v10.5 Leopard)" */ = { isa = XCConfigurationList; buildConfigurations = ( AB18169415D214F2007A6CC3 /* Debug */, AB18169515D214F2007A6CC3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; ABFE42B3143E32F0009A3CCE /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; v10.6 Snow Leopard)" */ = { isa = XCConfigurationList; buildConfigurations = ( ABFE42B4143E32F0009A3CCE /* Debug */, ABFE42B5143E32F0009A3CCE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DeSmuME (OS X App; Intel; v10.5 Leopard)" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (Legacy)" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } desmume-0.9.9/src/cocoa/preferences_legacy.mm0000644000175000017500000004363112140261603021757 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "preferences_legacy.h" #import "cocoa_util.h" #import "input_legacy.h" /* Preference settings are stored using NSUserDefaults which should put them in a property list in /Users/username/Library/Preferences For the keys we use the same strings you see in the preference menu such as "Execute Upon Load" to keep things simple, of course the unlocalized version of the strings are used so that when you change language it will still finds the settings from before. Also theres no guarantee that localized strings will be unique. */ #define INTERFACE_INTERNAL_NAME @"Interface" #define CONTROLS_INTERNAL_NAME @"Controls" #define FIRMWARE_INTERNAL_NAME @"Firmware" const CGFloat PREFERENCES_WIDTH = 365; /////////////////////////////// NSFont *preferences_font; NSDictionary *preferences_font_attribs; NSMutableDictionary *defaults; /////////////////////////////// //This needs to be called when the program starts void setAppDefaults() { defaults = [[NSMutableDictionary alloc] initWithObjectsAndKeys: //Interface defaults @"Yes", PREF_EXECUTE_UPON_LOAD, PREF_AFTER_LAUNCHED_OPTION_NOTHING, PREF_AFTER_LAUNCHED, //Firmware defaults //@"DeSmuME User", PREF_FIRMWARE_PLAYER_NAME, //@"English", PREF_FIRMWARE_LANGUAGE, nil]; //Input defaults [defaults addEntriesFromDictionary:[InputHandler appDefaults]]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; } /////////////////////////////// #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 @interface PreferencesDelegate : NSObject #else @interface PreferencesDelegate : NSObject #endif {} @end @implementation PreferencesDelegate - (void)windowWillClose:(NSNotification*)aNotification { [NSApp stopModal]; [[NSUserDefaults standardUserDefaults] synchronize]; } - (void)textDidChange:(NSNotification*)notification { //NSText *text_field = [notification object]; //NSString *text = [text_field string]; } - (void)executeUponLoad:(id)sender { BOOL value = ([sender indexOfSelectedItem] == 0) ? YES : NO; [[NSUserDefaults standardUserDefaults] setBool:value forKey:@"ExecuteROMOnLoad"]; } - (void)afterLaunch:(id)sender { if([sender indexOfSelectedItem] == 0) [[NSUserDefaults standardUserDefaults] setObject:PREF_AFTER_LAUNCHED_OPTION_NOTHING forKey:PREF_AFTER_LAUNCHED]; else [[NSUserDefaults standardUserDefaults] setObject:PREF_AFTER_LAUNCHED_OPTION_LAST_ROM forKey:PREF_AFTER_LAUNCHED]; } @end //////////////////////////////////////////////////// #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 @interface ToolbarDelegate : NSObject #else @interface ToolbarDelegate : NSObject #endif { NSWindow *window; NSToolbarItem *interface; NSView *interface_view; NSToolbarItem *controls; NSView *controls_view; NSToolbarItem *ds_firmware; NSView *firmware_view; } - (id)initWithWindow:(NSWindow*)_window generalView:(NSView*)g controlsView:(NSView*)c firmwareView:(NSView*)f; - (void)dealloc; - (NSToolbarItem*)toolbar:(NSToolbar*)toolbar itemForItemIdentifier:(NSString*)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag; - (NSArray*)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar; - (NSArray*)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar; - (NSArray*)toolbarSelectableItemIdentifiers:(NSToolbar*)toolbar; @end @implementation ToolbarDelegate - (id)init { //make sure we go through through the designated init function [self doesNotRecognizeSelector:_cmd]; return nil; } - (id)initWithWindow:(NSWindow*)_window generalView:(NSView*)g controlsView:(NSView*)c firmwareView:(NSView*)f; { self = [super init]; if(self == nil)return nil; window = _window; [window retain]; interface_view = g; [interface_view retain]; controls_view = c; [controls_view retain]; firmware_view = f; [firmware_view retain]; interface = controls = ds_firmware = nil; return self; } - (void)dealloc { [interface release]; [interface_view release]; [controls release]; [controls_view release]; [ds_firmware release]; [firmware_view release]; [window release]; [super dealloc]; } - (NSToolbarItem*)toolbar:(NSToolbar*)toolbar itemForItemIdentifier:(NSString*)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { NSToolbarItem *result; if([itemIdentifier compare:INTERFACE_INTERNAL_NAME] == NSOrderedSame) { if(interface == nil) { interface = [[NSToolbarItem alloc] initWithItemIdentifier:INTERFACE_INTERNAL_NAME]; [interface setImage:[NSApp applicationIconImage]]; [interface setLabel:NSLocalizedString(@"Interface", nil)]; [interface setTarget:self]; [interface setAction:@selector(toolbarItemClicked:)]; } result = interface; } else if([itemIdentifier compare:CONTROLS_INTERNAL_NAME] == NSOrderedSame) { if(controls == nil) { controls = [[NSToolbarItem alloc] initWithItemIdentifier:CONTROLS_INTERNAL_NAME]; [controls setImage:[NSApp applicationIconImage]]; [controls setLabel:NSLocalizedString(@"Controls", nil)]; [controls setTarget:self]; [controls setAction:@selector(toolbarItemClicked:)]; } result = controls; } else if([itemIdentifier compare:FIRMWARE_INTERNAL_NAME] == NSOrderedSame) { if(ds_firmware == nil) { ds_firmware = [[NSToolbarItem alloc] initWithItemIdentifier:FIRMWARE_INTERNAL_NAME]; [ds_firmware setImage:[NSApp applicationIconImage]]; [ds_firmware setLabel:NSLocalizedString(@"DS Firmware", nil)]; [ds_firmware setTarget:self]; [ds_firmware setAction:@selector(toolbarItemClicked:)]; } result = ds_firmware; } else result = nil; return result; } - (NSArray*)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar { return [NSArray arrayWithObjects:INTERFACE_INTERNAL_NAME, CONTROLS_INTERNAL_NAME, FIRMWARE_INTERNAL_NAME, nil]; } - (NSArray*)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar { return [NSArray arrayWithObjects:INTERFACE_INTERNAL_NAME, CONTROLS_INTERNAL_NAME, /*FIRMWARE_INTERNAL_NAME, */nil]; } - (NSArray*)toolbarSelectableItemIdentifiers:(NSToolbar*)toolbar { return [NSArray arrayWithObjects:INTERFACE_INTERNAL_NAME, CONTROLS_INTERNAL_NAME, FIRMWARE_INTERNAL_NAME, nil]; } - (void)toolbarItemClicked:(id)sender { //Check what button was clicked NSString *item_clicked = [sender itemIdentifier]; NSView *new_view; if([item_clicked compare:INTERFACE_INTERNAL_NAME] == NSOrderedSame) { if([interface_view superview] == [window contentView])return; new_view = interface_view; } else if([item_clicked compare:CONTROLS_INTERNAL_NAME] == NSOrderedSame) { if([controls_view superview] == [window contentView])return; new_view = controls_view; } else if([item_clicked compare:FIRMWARE_INTERNAL_NAME] == NSOrderedSame) { if([firmware_view superview] == [window contentView])return; new_view = firmware_view; } else return; //Add/remove views to show only the view we now want to see NSView *content_view = [window contentView]; if(interface_view == new_view)[content_view addSubview:interface_view]; else [interface_view removeFromSuperview]; if(controls_view == new_view)[content_view addSubview:controls_view]; else [controls_view removeFromSuperview]; if(firmware_view == new_view)[content_view addSubview:firmware_view]; else [firmware_view removeFromSuperview]; //Resize window to fit the new information perfectly //we must take into account the size of the titlebar and toolbar //and we also have to recalc the window position to keep the top of the window in the same place, //since coordinates are based from the bottom left NSRect old_window_size = [window frame]; NSRect new_window_size = [window frameRectForContentRect:[new_view frame]]; new_window_size.size.width = PREFERENCES_WIDTH; new_window_size.origin.x = old_window_size.origin.x; new_window_size.origin.y = old_window_size.origin.y + old_window_size.size.height - new_window_size.size.height; [window setFrame:new_window_size display:YES animate:YES]; } @end //////////////////////////////////////////////////// @implementation NSApplication(custom_extensions) NSView *createPreferencesView(NSString *helpinfo, NSDictionary *options, id delegate) { //create the view NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, PREFERENCES_WIDTH, 10)]; //loop through each option in the options list //this is done backwards since we build the view upwards //fixme: because dictionaries lack order, options should not be passed as a dictionary NSArray* keys = [[options allKeys] sortedArrayUsingSelector:@selector(localizedCompare:)]; NSEnumerator *key_enumerator = [keys reverseObjectEnumerator]; NSString *key; NSString *key_raw; NSArray *object; NSRect text_rect = NSMakeRect(5, 5, 220, 29); NSRect button_rect = NSMakeRect(230, 5, PREFERENCES_WIDTH - 235, 26); while ((key_raw = [key_enumerator nextObject])) { object = [options objectForKey:key_raw]; key = NSLocalizedString(key_raw, nil); NSString *current_setting = [[NSUserDefaults standardUserDefaults] objectForKey:key_raw]; if([(NSString *)[object objectAtIndex:0] compare:@"Bool"] == NSOrderedSame) { //Create the button for this option NSPopUpButton *button = [[NSPopUpButton alloc] initWithFrame:button_rect pullsDown:NO]; //Setup the button callback //the items array should have a selector encoded in an NSData //since we can't stick a selector directly in an NSArray SEL action; [[object objectAtIndex:1] getBytes:&action]; [button setAction:action]; [button setTarget:delegate]; [button addItemWithTitle:NSLocalizedString(@"Yes",nil)]; [button addItemWithTitle:NSLocalizedString(@"No",nil)]; [button selectItemAtIndex:([[NSUserDefaults standardUserDefaults] boolForKey:@"ExecuteROMOnLoad"] == YES) ? 0 : 1]; [view addSubview:button]; } else if([(NSString *)[object objectAtIndex:0] compare:@"Array"] == NSOrderedSame) { //Create the button for this option NSPopUpButton *button = [[NSPopUpButton alloc] initWithFrame:button_rect pullsDown:NO]; //button callback SEL action; [[object objectAtIndex:1] getBytes:&action]; [button setAction:action]; [button setTarget:delegate]; int i; bool found = false; for(i = 2; i < [object count]; i++) { //add the item to the popup buttons list [button addItemWithTitle:NSLocalizedString([object objectAtIndex:i],nil)]; //if this is the currently selected or default item if([current_setting compare:[object objectAtIndex:i]] == NSOrderedSame) { found = true; [button selectItemAtIndex:i - 2]; } } if(!found) { //the user setting for this option was not found //get the default value NSString *default_setting = [defaults objectForKey:key_raw]; //show an error [CocoaDSUtil quickDialogUsingTitle:NSLocalizedString(@"Error", nil) message:[NSString stringWithFormat:@"%@ setting corrupt (%@), resetting to default (%@)", key, NSLocalizedString(current_setting, nil), NSLocalizedString(default_setting, nil)]]; //set the setting to default [[NSUserDefaults standardUserDefaults] setObject:default_setting forKey:key_raw]; //show the default setting in the button for(i = 2; i < [object count]; i++) if([current_setting compare:[object objectAtIndex:i]] == NSOrderedSame) ;//[button selectItemAtIndex:i - 2]; fixme } [view addSubview:button]; } else if ([(NSString *)[object objectAtIndex:0] caseInsensitiveCompare:@"Text"] == NSOrderedSame) { //if this preference is a text field //we will create a text field and add it to the view NSRect temp = button_rect; temp.size.height = [current_setting sizeWithAttributes:preferences_font_attribs].height + 2; temp.origin.y += (26. - temp.size.height) / 2.; NSText *text = [[NSText alloc] initWithFrame:temp]; [text setMinSize:temp.size]; [text setMaxSize:temp.size]; [text setFont:preferences_font]; [text setString:current_setting]; [text setEditable:YES]; [text setDrawsBackground:YES]; [text setDelegate:delegate]; [view addSubview:text]; } else if([(NSString *)[object objectAtIndex:0] compare:@"Dictionary"] == NSOrderedSame) { //Create the button for this option NSPopUpButton *button = [[NSPopUpButton alloc] initWithFrame:button_rect pullsDown:NO]; //button callback SEL action; [[object objectAtIndex:1] getBytes:&action]; [button setAction:action]; [button setTarget:delegate]; NSDictionary* keymap = [object objectAtIndex:2]; // Sort elements by name NSArray* keys = [[keymap allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; int i; for(i = 0; i < [keys count]; i++) { //add the item to the popup buttons list NSString* key = [keys objectAtIndex:i]; [button addItemWithTitle:NSLocalizedString(key,nil)]; [[button lastItem] setRepresentedObject:[keymap objectForKey:key]]; if ( [current_setting compare:[keymap valueForKey:key] ] == NSOrderedSame ) { [button selectItemAtIndex:i]; } } [view addSubview:button]; } //Create text for this option text_rect.size.height = [key sizeWithAttributes:preferences_font_attribs].height; text_rect.origin.y = button_rect.origin.y + (26. - [key sizeWithAttributes:preferences_font_attribs].height) / 2.; NSText *text = [[NSText alloc] initWithFrame:text_rect]; [text setFont:preferences_font]; [text setString:key]; [text setEditable:NO]; [text setDrawsBackground:NO]; [text setSelectable:NO]; [text setVerticallyResizable:NO]; [view addSubview:text]; //Increase the y button_rect.origin.y += 29; } //add the info text at the top NSText *help_text = [[NSText alloc] initWithFrame:NSMakeRect(5, button_rect.origin.y, PREFERENCES_WIDTH-10, 25)]; [help_text setDrawsBackground:NO]; [help_text setVerticallyResizable:YES]; [help_text setHorizontallyResizable:NO]; [help_text insertText:helpinfo]; [help_text setSelectable:NO]; [help_text setEditable:NO]; [view addSubview:help_text]; //resize the view to fit the stuff vertically NSRect temprect = [view frame]; temprect.size.height = button_rect.origin.y + [help_text frame].size.height + 3; [view setFrame:temprect]; [help_text release]; return [view autorelease]; } //this is a hack - in the nib we connect preferences to this function name, //since it's there, and then here we override whatever it's actually supposed to do //and replace it with the preference panel. //Incase you were wondering, I actually have no idea what I'm doing. - (void)orderFrontDataLinkPanel:(id)sender //<- Preferences Display Function { //---------------------------------------------------------------------------------------------- //get the applications main bundle //NSBundle* app_bundle = [NSBundle mainBundle]; //get a font for displaying text preferences_font = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSRegularControlSize]]; preferences_font_attribs = [NSDictionary dictionaryWithObjectsAndKeys:preferences_font, NSFontAttributeName, nil]; //create our delegate PreferencesDelegate *delegate = [[PreferencesDelegate alloc] init]; //Create the window ------------------------------------------------------------------------------ //Create interface view NSDictionary *interface_options = [NSDictionary dictionaryWithObjectsAndKeys: [NSArray arrayWithObjects:@"Bool", [NSData dataWithBytes:&@selector(executeUponLoad:) length:sizeof(SEL)], @"Yes", @"No",nil], PREF_EXECUTE_UPON_LOAD, [NSArray arrayWithObjects:@"Array", [NSData dataWithBytes:&@selector(afterLaunch:) length:sizeof(SEL)], PREF_AFTER_LAUNCHED_OPTION_NOTHING, PREF_AFTER_LAUNCHED_OPTION_LAST_ROM, nil], PREF_AFTER_LAUNCHED, nil]; NSView *interface_view = createPreferencesView(@"Use the popup buttons on the right to change settings", interface_options, delegate); //Create the controls view NSView *controls_view = [InputHandler createPreferencesView:PREFERENCES_WIDTH]; [controls_view setFrame:NSMakeRect(0, 0, PREFERENCES_WIDTH, [controls_view frame].size.height)]; //create the preferences window NSWindow *preferences_window = [[NSWindow alloc] initWithContentRect:[interface_view frame] styleMask: NSTitledWindowMask|NSClosableWindowMask backing:NSBackingStoreBuffered defer:NO screen:nil]; [preferences_window setTitle:NSLocalizedString(@"DeSmuME Preferences", nil)]; [preferences_window setDelegate:delegate]; [preferences_window setFrameAutosaveName:@"DeSmuME Preferences Window"]; [preferences_window setFrameOrigin:NSMakePoint(500,500)]; [[preferences_window contentView] addSubview:interface_view]; //create the toolbar delegate ToolbarDelegate *toolbar_delegate = [[ToolbarDelegate alloc] initWithWindow:preferences_window generalView:interface_view controlsView:controls_view firmwareView:nil]; //create the toolbar NSToolbar *toolbar =[[NSToolbar alloc] initWithIdentifier:@"DeSmuMe Preferences"]; [toolbar setDelegate:toolbar_delegate]; [toolbar setSelectedItemIdentifier:INTERFACE_INTERNAL_NAME]; //start with the general tab selected [preferences_window setToolbar:toolbar]; [toolbar release]; //show the window NSWindowController *wc = [[NSWindowController alloc] initWithWindow:preferences_window]; [wc setShouldCascadeWindows:NO]; [wc showWindow:nil]; [wc release]; //run the preferences [NSApp runModalForWindow:preferences_window]; // [toolbar_delegate release]; [preferences_window release]; } @end desmume-0.9.9/src/cocoa/nds_control_legacy.h0000644000175000017500000001062612140261603021616 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif #ifdef GDB_STUB #define OBJ_C #include "../gdbstub.h" #endif #define MAX_SLOTS 10 @class CocoaDSController; @class ScreenState; //This class is a compelte objective-c wrapper for //the core emulation features, other objective-c code inherit //upon or instanciate this to add interfaces for these features //Please only instanciate once. @interface NintendoDS : NSObject { @private NSOpenGLContext* context; //context where the 3d gets renderered to NSOpenGLPixelFormat* pixel_format; //pixel format for opengl 3d renderer NSThread *gui_thread; SEL display_func; //the function id that gets called when the screen is ready to update id display_object; //the object that the above function is called on SEL error_func; id error_object; NSLock *execution_lock; NSLock *sound_lock; pthread_mutex_t *mutexCoreExecute; ScreenState * volatile current_screen; NSLock *video_update_lock; volatile bool finish; //set to true to make the other thread finish volatile bool finished; //set to true by the other thread after it finishes volatile bool run; //set to control execution in other thread volatile bool paused; //sey by other thread to let us know if its executing bool muted; float volume; volatile int frame_skip; volatile int speed_limit; volatile int save_type; CGFloat speedScalar; BOOL isSpeedLimitEnabled; NSTimeInterval calcTimeBudget; CocoaDSController *cdsController; #ifdef GDB_STUB NSInteger arm9_gdb_port; NSInteger arm7_gdb_port; gdbstub_handle_t arm9_gdb_stub; gdbstub_handle_t arm7_gdb_stub; #endif unsigned char gpu_buff[256 * 256 * 5]; //this is where the 3D rendering of the NDS is stored @public NSURL *loadedRomURL; NSInteger prevCoreState; } //Instanciating, setup, and deconstruction - (id)init; - (void)setVideoUpdateCallback:(SEL)callback withObject:(id)object; //this callback should take one ScreenState(below) parameter - (void)setErrorCallback:(SEL)callback withObject:(id)object; - (void)dealloc; // Data accessors - (void) setMasterExecute:(BOOL)theState; - (BOOL) masterExecute; - (void) setCdsController:(CocoaDSController *)theController; - (CocoaDSController*) cdsController; //Firmware control - (void)setPlayerName:(NSString*)player_name; //ROM control - (BOOL) loadRom:(NSURL *)romURL; - (BOOL)isRomLoaded; - (void)closeROM; //ROM Info - (NSImage *)romIcon; - (NSString *) romFileName; - (NSString *)romTitle; - (NSInteger)romMaker; - (NSInteger)romSize; - (NSInteger)romArm9Size; - (NSInteger)romArm7Size; - (NSInteger)romDataSize; - (NSURL *) loadedRomURL; - (NSMutableDictionary *) romInfoBindings; + (NSMutableDictionary *) romNotLoadedBindings; //execution control - (void) setCoreState:(NSInteger)coreState; - (void) restoreCoreState; - (BOOL)executing; - (void)execute; - (BOOL)paused; - (void)pause; - (void)reset; - (void) setSpeedScalar:(CGFloat)scalar; - (CGFloat) speedScalar; - (void) setIsSpeedLimitEnabled:(BOOL)theState; - (BOOL) isSpeedLimitEnabled; - (void)setSaveType:(int)savetype; // see save_types in src/mmu.h - (int)saveType; // default is 0, which is autodetect - (void) updateConfig; - (void) emulateDS; - (void) drawFrame; - (void) padTime:(NSTimeInterval)timePad; - (BOOL) isSubScreenLayerDisplayed:(int)i; - (BOOL) isMainScreenLayerDisplayed:(int)i; - (void) toggleMainScreenLayer:(int)i; - (void) toggleSubScreenLayer:(int)i; //Sound - (BOOL)hasSound; - (void) setVolume:(float)vol; //clamped: 0 to 100 - (float) volume; - (void)enableMute; - (void)disableMute; - (void)toggleMute; - (BOOL)muted; - (void) copyToPasteboard; - (NSBitmapImageRep *) bitmapImageRep; @end bool OSXOpenGLRendererInit(); desmume-0.9.9/src/cocoa/cocoa_input.h0000644000175000017500000000355312140261603020252 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include #include "mic_ext.h" #undef BOOL enum { DSControllerState_Right = 0, DSControllerState_Left, DSControllerState_Down, DSControllerState_Up, DSControllerState_Select, DSControllerState_Start, DSControllerState_B, DSControllerState_A, DSControllerState_Y, DSControllerState_X, DSControllerState_L, DSControllerState_R, DSControllerState_Debug, DSControllerState_Lid, DSControllerState_Touch, DSControllerState_Microphone, DSControllerState_StatesCount }; @interface CocoaDSController : NSObject { NSInteger micMode; NSPoint touchLocation; bool controllerState[DSControllerState_StatesCount]; AudioSampleBlockGenerator *selectedAudioFileGenerator; OSSpinLock spinlockControllerState; } @property (assign) NSInteger micMode; @property (assign) AudioSampleBlockGenerator *selectedAudioFileGenerator; - (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID; - (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation; - (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode; - (void) setSineWaveGeneratorFrequency:(const double)freq; - (void) flush; @end desmume-0.9.9/src/cocoa/DeSmuME_Prefix.pch0000644000175000017500000000157712140261603021052 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifdef __OBJC__ #define OBJ_C #endif #define DESMUME_COCOA #define HAVE_OPENGL #define HAVE_LIBZ #if defined(__i386__) || defined(__x86_64__) #define HAVE_JIT #endif #define PORT_VERSION "Cocoa"desmume-0.9.9/src/cocoa/cocoa_GPU.mm0000644000175000017500000005256412140261603017736 0ustar guillaumeguillaume/* Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_GPU.h" #import "cocoa_globals.h" #include "utilities.h" #include "../NDSSystem.h" #include "../GPU.h" #include "../rasterize.h" #ifdef MAC_OS_X_VERSION_10_7 #include "../OGLRender_3_2.h" #else #include "../OGLRender.h" #endif #include #undef BOOL GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize, &gpu3Dgl, NULL }; @implementation CocoaDSGPU @dynamic gpuStateFlags; @synthesize mutexProducer; @dynamic layerMainGPU; @dynamic layerMainBG0; @dynamic layerMainBG1; @dynamic layerMainBG2; @dynamic layerMainBG3; @dynamic layerMainOBJ; @dynamic layerSubGPU; @dynamic layerSubBG0; @dynamic layerSubBG1; @dynamic layerSubBG2; @dynamic layerSubBG3; @dynamic layerSubOBJ; @dynamic render3DRenderingEngine; @dynamic render3DHighPrecisionColorInterpolation; @dynamic render3DEdgeMarking; @dynamic render3DFog; @dynamic render3DTextures; @dynamic render3DDepthComparisonThreshold; @dynamic render3DThreads; @dynamic render3DLineHack; @dynamic render3DMultisample; - (id)init { self = [super init]; if (self == nil) { return self; } spinlockGpuState = OS_SPINLOCK_INIT; mutexProducer = NULL; gpuStateFlags = GPUSTATE_MAIN_GPU_MASK | GPUSTATE_MAIN_BG0_MASK | GPUSTATE_MAIN_BG1_MASK | GPUSTATE_MAIN_BG2_MASK | GPUSTATE_MAIN_BG3_MASK | GPUSTATE_MAIN_OBJ_MASK | GPUSTATE_SUB_GPU_MASK | GPUSTATE_SUB_BG0_MASK | GPUSTATE_SUB_BG1_MASK | GPUSTATE_SUB_BG2_MASK | GPUSTATE_SUB_BG3_MASK | GPUSTATE_SUB_OBJ_MASK; isCPUCoreCountAuto = NO; SetOpenGLRendererFunctions(&OSXOpenGLRendererInit, &OSXOpenGLRendererBegin, &OSXOpenGLRendererEnd); return self; } - (void)dealloc { DestroyOpenGLRenderer(); [super dealloc]; } - (void) setGpuStateFlags:(UInt32)flags { OSSpinLockLock(&spinlockGpuState); gpuStateFlags = flags; OSSpinLockUnlock(&spinlockGpuState); [self setLayerMainGPU:((flags & GPUSTATE_MAIN_GPU_MASK) != 0)]; [self setLayerMainBG0:((flags & GPUSTATE_MAIN_BG0_MASK) != 0)]; [self setLayerMainBG1:((flags & GPUSTATE_MAIN_BG1_MASK) != 0)]; [self setLayerMainBG2:((flags & GPUSTATE_MAIN_BG2_MASK) != 0)]; [self setLayerMainBG3:((flags & GPUSTATE_MAIN_BG3_MASK) != 0)]; [self setLayerMainOBJ:((flags & GPUSTATE_MAIN_OBJ_MASK) != 0)]; [self setLayerSubGPU:((flags & GPUSTATE_SUB_GPU_MASK) != 0)]; [self setLayerSubBG0:((flags & GPUSTATE_SUB_BG0_MASK) != 0)]; [self setLayerSubBG1:((flags & GPUSTATE_SUB_BG1_MASK) != 0)]; [self setLayerSubBG2:((flags & GPUSTATE_SUB_BG2_MASK) != 0)]; [self setLayerSubBG3:((flags & GPUSTATE_SUB_BG3_MASK) != 0)]; [self setLayerSubOBJ:((flags & GPUSTATE_SUB_OBJ_MASK) != 0)]; } - (UInt32) gpuStateFlags { OSSpinLockLock(&spinlockGpuState); const UInt32 flags = gpuStateFlags; OSSpinLockUnlock(&spinlockGpuState); return flags; } - (void) setRender3DRenderingEngine:(NSInteger)methodID { pthread_mutex_lock(self.mutexProducer); NDS_3D_ChangeCore(methodID); pthread_mutex_unlock(self.mutexProducer); } - (NSInteger) render3DRenderingEngine { pthread_mutex_lock(self.mutexProducer); const NSInteger methodID = (NSInteger)cur3DCore; pthread_mutex_unlock(self.mutexProducer); return methodID; } - (void) setRender3DHighPrecisionColorInterpolation:(BOOL)state { pthread_mutex_lock(self.mutexProducer); CommonSettings.GFX3D_HighResolutionInterpolateColor = state ? true : false; pthread_mutex_unlock(self.mutexProducer); } - (BOOL) render3DHighPrecisionColorInterpolation { pthread_mutex_lock(self.mutexProducer); const BOOL state = CommonSettings.GFX3D_HighResolutionInterpolateColor ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return state; } - (void) setRender3DEdgeMarking:(BOOL)state { pthread_mutex_lock(self.mutexProducer); CommonSettings.GFX3D_EdgeMark = state ? true : false; pthread_mutex_unlock(self.mutexProducer); } - (BOOL) render3DEdgeMarking { pthread_mutex_lock(self.mutexProducer); const BOOL state = CommonSettings.GFX3D_EdgeMark ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return state; } - (void) setRender3DFog:(BOOL)state { pthread_mutex_lock(self.mutexProducer); CommonSettings.GFX3D_Fog = state ? true : false; pthread_mutex_unlock(self.mutexProducer); } - (BOOL) render3DFog { pthread_mutex_lock(self.mutexProducer); const BOOL state = CommonSettings.GFX3D_Fog ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return state; } - (void) setRender3DTextures:(BOOL)state { pthread_mutex_lock(self.mutexProducer); CommonSettings.GFX3D_Texture = state ? true : false; pthread_mutex_unlock(self.mutexProducer); } - (BOOL) render3DTextures { pthread_mutex_lock(self.mutexProducer); const BOOL state = CommonSettings.GFX3D_Texture ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return state; } - (void) setRender3DDepthComparisonThreshold:(NSUInteger)threshold { pthread_mutex_lock(self.mutexProducer); CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = threshold; pthread_mutex_unlock(self.mutexProducer); } - (NSUInteger) render3DDepthComparisonThreshold { pthread_mutex_lock(self.mutexProducer); const NSUInteger threshold = (NSUInteger)CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack; pthread_mutex_unlock(self.mutexProducer); return threshold; } - (void) setRender3DThreads:(NSUInteger)numberThreads { NSUInteger numberCores = [[NSProcessInfo processInfo] activeProcessorCount]; if (numberThreads == 0) { isCPUCoreCountAuto = YES; if (numberCores >= 8) { numberCores = 8; } else if (numberCores >= 4) { numberCores = 4; } else if (numberCores >= 2) { numberCores = 2; } else { numberCores = 1; } } else { isCPUCoreCountAuto = NO; numberCores = numberThreads; } const NSInteger renderingEngineID = [self render3DRenderingEngine]; pthread_mutex_lock(self.mutexProducer); CommonSettings.num_cores = numberCores; if (renderingEngineID == CORE3DLIST_SWRASTERIZE || renderingEngineID == CORE3DLIST_OPENGL) { NDS_3D_ChangeCore(renderingEngineID); } pthread_mutex_unlock(self.mutexProducer); } - (NSUInteger) render3DThreads { pthread_mutex_lock(self.mutexProducer); const NSUInteger numberThreads = isCPUCoreCountAuto ? 0 : (NSUInteger)CommonSettings.num_cores; pthread_mutex_unlock(self.mutexProducer); return numberThreads; } - (void) setRender3DLineHack:(BOOL)state { pthread_mutex_lock(self.mutexProducer); CommonSettings.GFX3D_LineHack = state ? true : false; pthread_mutex_unlock(self.mutexProducer); } - (BOOL) render3DLineHack { pthread_mutex_lock(self.mutexProducer); const BOOL state = CommonSettings.GFX3D_LineHack ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return state; } - (void) setRender3DMultisample:(BOOL)state { pthread_mutex_lock(self.mutexProducer); CommonSettings.GFX3D_Renderer_Multisample = state ? true : false; pthread_mutex_unlock(self.mutexProducer); } - (BOOL) render3DMultisample { pthread_mutex_lock(self.mutexProducer); const BOOL state = CommonSettings.GFX3D_Renderer_Multisample ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return state; } - (void) setLayerMainGPU:(BOOL)gpuState { pthread_mutex_lock(self.mutexProducer); SetGPUDisplayState(DS_GPU_TYPE_MAIN, (gpuState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (gpuState) ? (gpuStateFlags | GPUSTATE_MAIN_GPU_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_GPU_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainGPU { pthread_mutex_lock(self.mutexProducer); const BOOL gpuState = GetGPUDisplayState(DS_GPU_TYPE_MAIN) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return gpuState; } - (void) setLayerMainBG0:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 0, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_BG0_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_BG0_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainBG0 { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 0) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerMainBG1:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 1, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_BG1_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_BG1_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainBG1 { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 1) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerMainBG2:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 2, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_BG2_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_BG2_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainBG2 { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 2) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerMainBG3:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 3, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_BG3_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_BG3_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainBG3 { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 3) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerMainOBJ:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_MAIN, 4, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_MAIN_OBJ_MASK) : (gpuStateFlags & ~GPUSTATE_MAIN_OBJ_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerMainOBJ { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_MAIN, 4) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerSubGPU:(BOOL)gpuState { pthread_mutex_lock(self.mutexProducer); SetGPUDisplayState(DS_GPU_TYPE_SUB, (gpuState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (gpuState) ? (gpuStateFlags | GPUSTATE_SUB_GPU_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_GPU_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubGPU { pthread_mutex_lock(self.mutexProducer); const BOOL gpuState = GetGPUDisplayState(DS_GPU_TYPE_SUB) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return gpuState; } - (void) setLayerSubBG0:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 0, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_BG0_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_BG0_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubBG0 { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 0) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerSubBG1:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 1, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_BG1_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_BG1_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubBG1 { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 1) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerSubBG2:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 2, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_BG2_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_BG2_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubBG2 { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 2) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerSubBG3:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 3, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_BG3_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_BG3_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubBG3 { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 3) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (void) setLayerSubOBJ:(BOOL)layerState { pthread_mutex_lock(self.mutexProducer); SetGPULayerState(DS_GPU_TYPE_SUB, 4, (layerState) ? true : false); pthread_mutex_unlock(self.mutexProducer); OSSpinLockLock(&spinlockGpuState); gpuStateFlags = (layerState) ? (gpuStateFlags | GPUSTATE_SUB_OBJ_MASK) : (gpuStateFlags & ~GPUSTATE_SUB_OBJ_MASK); OSSpinLockUnlock(&spinlockGpuState); } - (BOOL) layerSubOBJ { pthread_mutex_lock(self.mutexProducer); const BOOL layerState = GetGPULayerState(DS_GPU_TYPE_SUB, 4) ? YES : NO; pthread_mutex_unlock(self.mutexProducer); return layerState; } - (BOOL) gpuStateByBit:(const UInt32)stateBit { return ([self gpuStateFlags] & (1 << stateBit)) ? YES : NO; } - (BOOL) isGPUTypeDisplayed:(const NSInteger)theGpuType { BOOL result = NO; const UInt32 flags = [self gpuStateFlags]; switch (theGpuType) { case DS_GPU_TYPE_MAIN: if (flags & GPUSTATE_MAIN_GPU_MASK) { result = YES; } break; case DS_GPU_TYPE_SUB: if (flags & GPUSTATE_SUB_GPU_MASK) { result = YES; } break; case DS_GPU_TYPE_COMBO: if (flags & (GPUSTATE_MAIN_GPU_MASK | GPUSTATE_SUB_GPU_MASK)) { result = YES; } break; default: break; } return result; } - (void) hideGPUType:(const NSInteger)theGpuType { UInt32 flags = [self gpuStateFlags]; switch (theGpuType) { case DS_GPU_TYPE_MAIN: flags &= ~GPUSTATE_MAIN_GPU_MASK; break; case DS_GPU_TYPE_SUB: flags &= ~GPUSTATE_SUB_GPU_MASK; break; case DS_GPU_TYPE_COMBO: flags &= ~GPUSTATE_MAIN_GPU_MASK; flags &= ~GPUSTATE_SUB_GPU_MASK; break; default: break; } [self setGpuStateFlags:flags]; } - (void) showGPUType:(const NSInteger)theGpuType { UInt32 flags = [self gpuStateFlags]; switch (theGpuType) { case DS_GPU_TYPE_MAIN: flags |= GPUSTATE_MAIN_GPU_MASK; break; case DS_GPU_TYPE_SUB: flags |= GPUSTATE_SUB_GPU_MASK; break; case DS_GPU_TYPE_COMBO: flags |= GPUSTATE_MAIN_GPU_MASK; flags |= GPUSTATE_SUB_GPU_MASK; break; default: break; } [self setGpuStateFlags:flags]; } @end void SetGPULayerState(const int gpuType, const unsigned int i, const bool state) { GPU *theGpu = NULL; // Check bounds on the layer index. if(i > 4) { return; } switch (gpuType) { case DS_GPU_TYPE_SUB: theGpu = SubScreen.gpu; break; case DS_GPU_TYPE_MAIN: theGpu = MainScreen.gpu; break; case DS_GPU_TYPE_COMBO: SetGPULayerState(DS_GPU_TYPE_SUB, i, state); // Recursive call theGpu = MainScreen.gpu; break; default: break; } if (theGpu != NULL) { if (state) { GPU_addBack(theGpu, i); } else { GPU_remove(theGpu, i); } } } bool GetGPULayerState(const int gpuType, const unsigned int i) { bool theState = false; // Check bounds on the layer index. if(i > 4) { return theState; } switch (gpuType) { case DS_GPU_TYPE_SUB: if (SubScreen.gpu != NULL) { theState = CommonSettings.dispLayers[SubScreen.gpu->core][i]; } break; case DS_GPU_TYPE_MAIN: if (MainScreen.gpu != NULL) { theState = CommonSettings.dispLayers[MainScreen.gpu->core][i]; } break; case DS_GPU_TYPE_COMBO: if (SubScreen.gpu != NULL && MainScreen.gpu != NULL) { theState = (CommonSettings.dispLayers[SubScreen.gpu->core][i] && CommonSettings.dispLayers[MainScreen.gpu->core][i]); } break; default: break; } return theState; } void SetGPUDisplayState(const int gpuType, const bool state) { switch (gpuType) { case DS_GPU_TYPE_SUB: CommonSettings.showGpu.sub = state; break; case DS_GPU_TYPE_MAIN: CommonSettings.showGpu.main = state; break; case DS_GPU_TYPE_COMBO: CommonSettings.showGpu.sub = state; CommonSettings.showGpu.main = state; break; default: break; } } bool GetGPUDisplayState(const int gpuType) { bool theState = false; switch (gpuType) { case DS_GPU_TYPE_SUB: theState = CommonSettings.showGpu.sub; break; case DS_GPU_TYPE_MAIN: theState = CommonSettings.showGpu.main; break; case DS_GPU_TYPE_COMBO: theState = (CommonSettings.showGpu.sub && CommonSettings.showGpu.main); break; default: break; } return theState; } CGLContextObj OSXOpenGLRendererContext = NULL; CGLPBufferObj OSXOpenGLRendererPBuffer = NULL; bool OSXOpenGLRendererInit() { static bool isContextAlreadyCreated = false; if (!isContextAlreadyCreated) { isContextAlreadyCreated = CreateOpenGLRenderer(); } return true; } bool OSXOpenGLRendererBegin() { CGLSetCurrentContext(OSXOpenGLRendererContext); return true; } void OSXOpenGLRendererEnd() { } bool CreateOpenGLRenderer() { bool result = false; bool useContext_3_2 = false; CGLPixelFormatObj cglPixFormat = NULL; CGLContextObj newContext = NULL; CGLPBufferObj newPBuffer = NULL; GLint virtualScreenCount = 0; CGLPixelFormatAttribute attrs[] = { kCGLPFAColorSize, (CGLPixelFormatAttribute)24, kCGLPFAAlphaSize, (CGLPixelFormatAttribute)8, kCGLPFADepthSize, (CGLPixelFormatAttribute)24, kCGLPFAStencilSize, (CGLPixelFormatAttribute)8, kCGLPFAAccelerated, (CGLPixelFormatAttribute)0, (CGLPixelFormatAttribute)0, (CGLPixelFormatAttribute)0 }; #ifdef MAC_OS_X_VERSION_10_7 // If we can support a 3.2 Core Profile context, then request that in our // pixel format attributes. useContext_3_2 = IsOSXVersionSupported(10, 7, 0); if (useContext_3_2) { attrs[9] = kCGLPFAOpenGLProfile; attrs[10] = (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core; } #endif CGLChoosePixelFormat(attrs, &cglPixFormat, &virtualScreenCount); if (cglPixFormat == NULL) { // Remove the HW rendering requirement and try again. Note that this will // result in SW rendering, which will cause a substantial speed hit. attrs[8] = (CGLPixelFormatAttribute)0; CGLChoosePixelFormat(attrs, &cglPixFormat, &virtualScreenCount); if (cglPixFormat == NULL) { return result; } } CGLCreateContext(cglPixFormat, NULL, &newContext); CGLReleasePixelFormat(cglPixFormat); // Create a PBuffer for legacy contexts since the availability of FBOs // is not guaranteed. if (!useContext_3_2) { CGLCreatePBuffer(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT, GL_TEXTURE_2D, GL_RGBA, 0, &newPBuffer); if (newPBuffer == NULL) { CGLReleaseContext(newContext); return result; } else { GLint virtualScreenID = 0; CGLGetVirtualScreen(newContext, &virtualScreenID); CGLSetPBuffer(newContext, newPBuffer, 0, 0, virtualScreenID); } } RequestOpenGLRenderer_3_2(useContext_3_2); OSXOpenGLRendererContext = newContext; OSXOpenGLRendererPBuffer = newPBuffer; result = true; return result; } void DestroyOpenGLRenderer() { if (OSXOpenGLRendererContext == NULL) { return; } CGLReleasePBuffer(OSXOpenGLRendererPBuffer); CGLReleaseContext(OSXOpenGLRendererContext); OSXOpenGLRendererContext = NULL; OSXOpenGLRendererPBuffer = NULL; } void RequestOpenGLRenderer_3_2(bool request_3_2) { #ifdef OGLRENDER_3_2_H if (request_3_2) { OGLLoadEntryPoints_3_2_Func = &OGLLoadEntryPoints_3_2; OGLCreateRenderer_3_2_Func = &OGLCreateRenderer_3_2; return; } #endif OGLLoadEntryPoints_3_2_Func = NULL; OGLCreateRenderer_3_2_Func = NULL; } void SetOpenGLRendererFunctions(bool (*initFunction)(), bool (*beginOGLFunction)(), void (*endOGLFunction)()) { oglrender_init = initFunction; oglrender_beginOpenGL = beginOGLFunction; oglrender_endOpenGL = endOGLFunction; } desmume-0.9.9/src/cocoa/KeyNames.plist0000644000175000017500000000755612140261603020376 0ustar guillaumeguillaume 12 Q 13 W 14 E 15 R 17 T 16 Y 32 U 34 I 31 O 35 P 0 A 1 S 2 D 3 F 5 G 4 H 38 J 40 K 37 L 6 Z 7 X 8 C 9 V 11 B 45 N 46 M 18 1 19 2 20 3 21 4 23 5 22 6 26 7 28 8 25 9 29 0 122 F1 120 F2 99 F3 118 F4 96 F5 97 F6 98 F7 100 F8 101 F9 109 F10 103 F11 111 F12 105 F13 107 F14 113 F15 106 F16 64 F17 79 F18 80 F19 50 ` (Accent) 27 - (Dash) 24 = 51 Delete (Backspace) 48 Tab 33 [ 30 ] 42 \ 41 ; (Semicolon) 39 ' (Quote) 36 Return 43 , (Comma) 47 . (Period) 44 / 49 Space 115 Home 119 End 116 Page Up 121 Page Down 117 Forward Delete 126 Up Arrow 125 Down Arrow 123 Left Arrow 124 Right Arrow 82 NumPad 0 83 NumPad 1 84 NumPad 2 85 NumPad 3 86 NumPad 4 87 NumPad 5 88 NumPad 6 89 NumPad 7 91 NumPad 8 92 NumPad 9 71 NumPad Clear 81 NumPad = 75 NumPad / 67 NumPad * 78 NumPad - 69 NumPad + 65 NumPad . 76 NumPad Enter 53 Escape desmume-0.9.9/src/cocoa/input_legacy.mm0000644000175000017500000002655312140261603020621 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "input_legacy.h" #import "cocoa_input_legacy.h" #import "preferences_legacy.h" static unsigned char utf8_return = 0x0D; static unsigned char utf8_right[3] = { 0xEF, 0x9C, 0x83 }; static unsigned char utf8_up[3] = { 0xEF, 0x9C, 0x80 }; static unsigned char utf8_down[3] = { 0xEF, 0x9C, 0x81 }; static unsigned char utf8_left[3] = { 0xEF, 0x9C, 0x82 }; // @implementation ControlsDelegate + (id)sharedObject { static ControlsDelegate* object = nil; if(!object)object = [[ControlsDelegate alloc] init]; return object; } - (void)bindingForKeyA:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_A]; } - (void)bindingForKeyB:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_B]; } - (void)bindingForKeyX:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_X]; } - (void)bindingForKeyY:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_Y]; } - (void)bindingForKeyL:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_L]; } - (void)bindingForKeyR:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_R]; } - (void)bindingForKeyUp:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_UP]; } - (void)bindingForKeyDown:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_DOWN]; } - (void)bindingForKeyLeft:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_LEFT]; } - (void)bindingForKeyRight:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_RIGHT]; } - (void)bindingForKeyStart:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_START]; } - (void)bindingForKeySelect:(id)sender { [[NSUserDefaults standardUserDefaults] setValue:[[sender selectedItem] representedObject] forKey:PREF_KEY_SELECT]; } @end // @implementation InputHandler //Class functions --------------------------------- + (NSView*)createPreferencesView:(float)width { NSArray *keys = [NSArray arrayWithObjects: @"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"V", @"W", @"X", @"Y", @"Z", @",", @"<", @".", @">", @"/", @"?", @";", @":", @"'", @"\"", @"[", @"{", @"]", @"}", @"\\", @"|", @"Up Key" , @"Down Key" , @"Left Key" , @"Right Key", @"Space Bar", @"Enter Key", nil]; NSArray *objects = [NSArray arrayWithObjects: @"0" , @"1" , @"2" , @"3" , @"4" , @"5" , @"6" , @"7" , @"8" , @"9", @"aA", @"bB", @"cC", @"dD", @"eE", @"fF", @"gG", @"hH", @"iI", @"jJ", @"kK", @"lL", @"mM", @"nN", @"oO", @"pP", @"qQ", @"rR", @"sS", @"tT", @"vV", @"wW", @"xX", @"yY", @"zZ", @",", @"<", @".", @">", @"/", @"?", @";", @":", @"'", @"\"", @"[", @"{", @"]", @"}", @"\\", @"|", [[[NSString alloc] initWithBytesNoCopy:utf8_up length:3 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], [[[NSString alloc] initWithBytesNoCopy:utf8_down length:3 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], [[[NSString alloc] initWithBytesNoCopy:utf8_left length:3 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], [[[NSString alloc] initWithBytesNoCopy:utf8_right length:3 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], @" ", [[[NSString alloc] initWithBytesNoCopy:&utf8_return length:1 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], nil]; NSDictionary *keyboardMap = [[NSDictionary alloc] initWithObjects:objects forKeys:keys]; NSDictionary *controls_options = [NSDictionary dictionaryWithObjectsAndKeys: [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyA:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_A, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyB:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_B, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyX:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_X, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyY:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_Y, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyL:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_L, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyR:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_R, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyUp:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_UP, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyDown:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_DOWN, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyLeft:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_LEFT, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyRight:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_RIGHT, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeyStart:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_START, [NSArray arrayWithObjects:@"Dictionary", [NSData dataWithBytes:&@selector(bindingForKeySelect:) length:sizeof(SEL)], keyboardMap , nil] , PREF_KEY_SELECT, nil]; return createPreferencesView(@"Use the popup buttons on the right to change settings", controls_options, [ControlsDelegate sharedObject]); } + (NSDictionary*)appDefaults { return [NSDictionary dictionaryWithObjectsAndKeys: @"vV", PREF_KEY_A, @"bB", PREF_KEY_B, @"gG", PREF_KEY_X, @"hH", PREF_KEY_Y, @"cC", PREF_KEY_L, @"nN", PREF_KEY_R, @" ", PREF_KEY_SELECT, [[[NSString alloc] initWithBytesNoCopy:utf8_up length:3 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], PREF_KEY_UP, [[[NSString alloc] initWithBytesNoCopy:utf8_down length:3 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], PREF_KEY_DOWN, [[[NSString alloc] initWithBytesNoCopy:utf8_left length:3 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], PREF_KEY_LEFT, [[[NSString alloc] initWithBytesNoCopy:utf8_right length:3 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], PREF_KEY_RIGHT, [[[NSString alloc] initWithBytesNoCopy:&utf8_return length:1 encoding:NSUTF8StringEncoding freeWhenDone:NO] autorelease], PREF_KEY_START, nil]; } //Member Functions ----------------------------------- - (id)init { //make sure we go through through the designated init function [self doesNotRecognizeSelector:_cmd]; return nil; } - (id) initWithCdsController:(CocoaDSController *)theController { self = [super init]; if(self == nil) { return nil; } cdsController = theController; [cdsController retain]; return self; } - (void)dealloc { [cdsController release]; [super dealloc]; } - (void) setCdsController:(CocoaDSController *)theController { [cdsController release]; cdsController = theController; [cdsController retain]; } - (CocoaDSController *) cdsController { return cdsController; } - (void)keyDown:(NSEvent*)event { if([event isARepeat])return; NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; NSString *chars = [event characters]; if(testKey(chars, [settings stringForKey:PREF_KEY_A ]))[cdsController pressA]; else if(testKey(chars, [settings stringForKey:PREF_KEY_B ]))[cdsController pressB]; else if(testKey(chars, [settings stringForKey:PREF_KEY_SELECT]))[cdsController pressSelect]; else if(testKey(chars, [settings stringForKey:PREF_KEY_START ]))[cdsController pressStart]; else if(testKey(chars, [settings stringForKey:PREF_KEY_RIGHT ]))[cdsController pressRight]; else if(testKey(chars, [settings stringForKey:PREF_KEY_LEFT ]))[cdsController pressLeft]; else if(testKey(chars, [settings stringForKey:PREF_KEY_UP ]))[cdsController pressUp]; else if(testKey(chars, [settings stringForKey:PREF_KEY_DOWN ]))[cdsController pressDown]; else if(testKey(chars, [settings stringForKey:PREF_KEY_R ]))[cdsController pressR]; else if(testKey(chars, [settings stringForKey:PREF_KEY_L ]))[cdsController pressL]; else if(testKey(chars, [settings stringForKey:PREF_KEY_X ]))[cdsController pressX]; else if(testKey(chars, [settings stringForKey:PREF_KEY_Y ]))[cdsController pressY]; } - (void)keyUp:(NSEvent*)event { NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; NSString *chars = [event characters]; if(testKey(chars, [settings stringForKey:PREF_KEY_A ]))[cdsController liftA]; else if(testKey(chars, [settings stringForKey:PREF_KEY_B ]))[cdsController liftB]; else if(testKey(chars, [settings stringForKey:PREF_KEY_SELECT]))[cdsController liftSelect]; else if(testKey(chars, [settings stringForKey:PREF_KEY_START ]))[cdsController liftStart]; else if(testKey(chars, [settings stringForKey:PREF_KEY_RIGHT ]))[cdsController liftRight]; else if(testKey(chars, [settings stringForKey:PREF_KEY_LEFT ]))[cdsController liftLeft]; else if(testKey(chars, [settings stringForKey:PREF_KEY_UP ]))[cdsController liftUp]; else if(testKey(chars, [settings stringForKey:PREF_KEY_DOWN ]))[cdsController liftDown]; else if(testKey(chars, [settings stringForKey:PREF_KEY_R ]))[cdsController liftR]; else if(testKey(chars, [settings stringForKey:PREF_KEY_L ]))[cdsController liftL]; else if(testKey(chars, [settings stringForKey:PREF_KEY_X ]))[cdsController liftX]; else if(testKey(chars, [settings stringForKey:PREF_KEY_Y ]))[cdsController liftY]; } @end inline int testKey(NSString *chars_pressed, NSString *chars_for_key) { //Checks for common characters in chars_pressed and chars_for_key unichar *buffer1 = (unichar*)malloc([chars_pressed length] * sizeof(unichar)); unichar *buffer2 = (unichar*)malloc([chars_for_key length] * sizeof(unichar)); if(!buffer1 || !buffer2)return 0; [chars_pressed getCharacters:buffer1]; [chars_for_key getCharacters:buffer2]; int i1, i2; for(i1 = 0; i1 < [chars_pressed length]; i1++) for(i2 = 0; i2 < [chars_for_key length]; i2++) if(buffer1[i1] == buffer2[i2]) { free(buffer1); free(buffer2); return 1; } free(buffer1); free(buffer2); return 0; } desmume-0.9.9/src/cocoa/cocoa_firmware.mm0000644000175000017500000001671712140261603021117 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_firmware.h" #include "../NDSSystem.h" @implementation CocoaDSFirmware @synthesize data; @dynamic consoleType; @dynamic nickname; @dynamic message; @dynamic favoriteColor; @dynamic birthday; @dynamic language; - (id)init { return [self initWithDictionary:nil]; } - (id) initWithDictionary:(NSDictionary *)fwDataDict { self = [super init]; if (self == nil) { return self; } pthread_mutex_init(&mutex, NULL); // Allocate our own firmware struct since we weren't provided with one. internalData = (struct NDS_fw_config_data *)malloc(sizeof(struct NDS_fw_config_data)); if (internalData == nil) { pthread_mutex_destroy(&mutex); [self release]; return nil; } NDS_FillDefaultFirmwareConfigData(internalData); data = internalData; [self setDataWithDictionary:fwDataDict]; return self; } - (id) initWithFirmwareData:(struct NDS_fw_config_data *)fwData { self = [super init]; if (self == nil) { return self; } pthread_mutex_init(&mutex, NULL); if (fwData == nil) { pthread_mutex_destroy(&mutex); [self release]; return nil; } // Set birth_year to the current year. NSDate *now = [[NSDate alloc] init]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"Y"]; birth_year = [[dateFormatter stringFromDate:now] integerValue]; [dateFormatter release]; [now release]; internalData = NULL; data = fwData; return self; } - (void)dealloc { free(internalData); internalData = NULL; pthread_mutex_destroy(&mutex); [super dealloc]; } - (void) setConsoleType:(NSInteger)theType { pthread_mutex_lock(&mutex); data->ds_type = (NDS_CONSOLE_TYPE)theType; pthread_mutex_unlock(&mutex); } - (NSInteger) consoleType { pthread_mutex_lock(&mutex); NSInteger theType = data->ds_type; pthread_mutex_unlock(&mutex); return theType; } - (void) setNickname:(NSString *)theNickname { pthread_mutex_lock(&mutex); if (theNickname != nil) { NSRange characterRange = {0, [theNickname length]}; if (characterRange.length > MAX_FW_NICKNAME_LENGTH) { characterRange.length = MAX_FW_NICKNAME_LENGTH; } [theNickname getBytes:&data->nickname[0] maxLength:(sizeof(UInt16) * characterRange.length) usedLength:NULL encoding:NSUTF16LittleEndianStringEncoding options:NSStringEncodingConversionAllowLossy range:characterRange remainingRange:NULL]; data->nickname_len = (u8)characterRange.length; } else { memset(&data->nickname[0], 0, sizeof(data->nickname)); data->nickname_len = 0; } pthread_mutex_unlock(&mutex); } - (NSString *) nickname { pthread_mutex_lock(&mutex); NSString *theNickname = [[[NSString alloc] initWithBytes:&data->nickname[0] length:(sizeof(UInt16) * data->nickname_len) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; pthread_mutex_unlock(&mutex); return theNickname; } - (void) setMessage:(NSString *)theMessage { pthread_mutex_lock(&mutex); if (theMessage != nil) { NSRange characterRange = {0, [theMessage length]}; if (characterRange.length > MAX_FW_MESSAGE_LENGTH) { characterRange.length = MAX_FW_MESSAGE_LENGTH; } [theMessage getBytes:&data->message[0] maxLength:(sizeof(UInt16) * characterRange.length) usedLength:NULL encoding:NSUTF16LittleEndianStringEncoding options:NSStringEncodingConversionAllowLossy range:characterRange remainingRange:NULL]; data->message_len = (u8)characterRange.length; } else { memset(&data->message[0], 0, sizeof(data->message)); data->message_len = 0; } pthread_mutex_unlock(&mutex); } - (NSString *) message { pthread_mutex_lock(&mutex); NSString *theMessage = [[[NSString alloc] initWithBytes:&data->message[0] length:(sizeof(UInt16) * data->message_len) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; pthread_mutex_unlock(&mutex); return theMessage; } - (void) setFavoriteColor:(NSInteger)colorID { pthread_mutex_lock(&mutex); data->fav_colour = (u8)colorID; pthread_mutex_unlock(&mutex); } - (NSInteger) favoriteColor { pthread_mutex_lock(&mutex); NSInteger theFavoriteColorID = data->fav_colour; pthread_mutex_unlock(&mutex); return theFavoriteColorID; } - (void) setBirthday:(NSDate *)theDate { pthread_mutex_lock(&mutex); if (theDate != nil) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"M"]; NSInteger theMonth = [[dateFormatter stringFromDate:theDate] integerValue]; [dateFormatter setDateFormat:@"d"]; NSInteger theDay = [[dateFormatter stringFromDate:theDate] integerValue]; [dateFormatter setDateFormat:@"Y"]; NSInteger theYear = [[dateFormatter stringFromDate:theDate] integerValue]; [dateFormatter release]; data->birth_month = (u8)theMonth; data->birth_day = (u8)theDay; birth_year = theYear; } else { data->birth_month = 1; data->birth_day = 1; birth_year = 1970; } pthread_mutex_unlock(&mutex); } - (NSDate *) birthday { pthread_mutex_lock(&mutex); NSDate *theBirthday = [NSDate dateWithString:[NSString stringWithFormat:@"%ld-%ld-%ld 12:00:00 +0000", (unsigned long)birth_year, (unsigned long)data->birth_month, (unsigned long)data->birth_day]]; pthread_mutex_unlock(&mutex); return theBirthday; } - (void) setLanguage:(NSInteger)languageID { pthread_mutex_lock(&mutex); data->language = (u8)languageID; pthread_mutex_unlock(&mutex); } - (NSInteger) language { pthread_mutex_lock(&mutex); NSInteger theLanguageID = data->language; pthread_mutex_unlock(&mutex); return theLanguageID; } - (void) update { // Write the attributes to the DS via the data struct. // We have make a copy of the struct and send that so that the firmware // changes get saved in CommonSettings.InternalFirmwareConf. pthread_mutex_lock(&mutex); struct NDS_fw_config_data newFirmwareData = *data; NDS_CreateDummyFirmware(&newFirmwareData); pthread_mutex_unlock(&mutex); } - (void) setDataWithDictionary:(NSDictionary *)dataDict { if (dataDict == nil) { return; } [self setConsoleType:[(NSNumber *)[dataDict valueForKey:@"ConsoleType"] integerValue]]; [self setNickname:(NSString *)[dataDict valueForKey:@"Nickname"]]; [self setMessage:(NSString *)[dataDict valueForKey:@"Message"]]; [self setFavoriteColor:[(NSNumber *)[dataDict valueForKey:@"FavoriteColor"] integerValue]]; [self setBirthday:(NSDate *)[dataDict valueForKey:@"Birthday"]]; [self setLanguage:[(NSNumber *)[dataDict valueForKey:@"Language"] integerValue]]; } - (NSDictionary *) dataDictionary { return [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInteger:[self consoleType]], @"ConsoleType", [self nickname], @"Nickname", [self message], @"Message", [NSNumber numberWithInteger:[self favoriteColor]], @"FavoriteColor", [self birthday], @"Birthday", [NSNumber numberWithInteger:[self language]], @"Language", nil]; } @end desmume-0.9.9/src/cocoa/cocoa_util.h0000644000175000017500000000610012140261603020057 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #include "utilities.h" #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif @interface CocoaDSUtil : NSObject { } + (void) messageSendOneWay:(NSPort *)sendPort msgID:(NSInteger)msgID; + (void) messageSendOneWayWithMessageComponents:(NSPort *)sendPort msgID:(NSInteger)msgID array:(NSArray *)msgDataArray; + (void) messageSendOneWayWithData:(NSPort *)sendPort msgID:(NSInteger)msgID data:(NSData *)msgData; + (void) messageSendOneWayWithInteger:(NSPort *)sendPort msgID:(NSInteger)msgID integerValue:(NSInteger)integerValue; + (void) messageSendOneWayWithFloat:(NSPort *)sendPort msgID:(NSInteger)msgID floatValue:(float)floatValue; + (void) messageSendOneWayWithBool:(NSPort *)sendPort msgID:(NSInteger)msgID boolValue:(BOOL)boolValue; + (void) messageSendOneWayWithRect:(NSPort *)sendPort msgID:(NSInteger)msgID rect:(NSRect)rect; + (NSInteger) getIBActionSenderTag:(id)sender; + (BOOL) getIBActionSenderButtonStateBool:(id)sender; + (void) quickDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText; + (BOOL) quickYesNoDialogUsingTitle:(NSString *)titleText message:(NSString *)messageText; + (NSInteger) appVersionNumeric; + (NSString *) appInternalVersionString; + (NSString *) appInternalNameAndVersionString; + (NSString *) appCompilerDetailString; + (NSString *) operatingSystemString; + (NSString *) modelIdentifierString; @end #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_4 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 @interface CocoaDSThread : NSObject #else @interface CocoaDSThread : NSObject #endif { NSThread *thread; BOOL threadExit; NSTimeInterval autoreleaseInterval; NSPort *sendPort; NSPort *receivePort; } @property (assign) NSThread *thread; @property (assign) BOOL threadExit; @property (assign) NSTimeInterval autoreleaseInterval; @property (assign) NSPort *sendPort; @property (assign) NSPort *receivePort; - (id) initWithAutoreleaseInterval:(NSTimeInterval)interval; - (void) runThread:(id)object; - (void) forceThreadExit; @end #endif @interface NSNotificationCenter (MainThread) - (void)postNotificationOnMainThread:(NSNotification *)notification; - (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject; - (void)postNotificationOnMainThreadName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo; @end desmume-0.9.9/src/cocoa/Info (Debug).plist0000644000175000017500000003031512140261603020672 0ustar guillaumeguillaume CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions nds CFBundleTypeIconFile AppIcon_NintendoDS_ROM.icns CFBundleTypeName Nintendo DS ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions ds.gba CFBundleTypeIconFile AppIcon_NintendoGBA_ROM.icns CFBundleTypeName Gameboy Advance ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dst CFBundleTypeIconFile AppIcon_SaveState.icns CFBundleTypeName DeSmuME Save State CFBundleTypeRole Editor LSItemContentTypes com.desmume.savestate LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dsv CFBundleTypeIconFile AppIcon_ROMSave.icns CFBundleTypeName DeSmuME ROM Save CFBundleTypeRole Editor LSItemContentTypes com.desmume.romsave LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dfc CFBundleTypeIconFile AppIcon_FirmwareConfig.icns CFBundleTypeName DeSmuME Firmware Configuration CFBundleTypeRole Editor LSItemContentTypes com.desmume.firmwareconfig LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dct CFBundleTypeIconFile AppIcon_ROMCheats.icns CFBundleTypeName DeSmuME ROM Cheats CFBundleTypeRole Editor LSItemContentTypes com.desmume.romcheats LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions sav CFBundleTypeIconFile AppIcon_NoGBA_ROMSave.icns CFBundleTypeName No$GBA ROM Save CFBundleTypeRole Viewer LSItemContentTypes de.emubase.nocash.romsave.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions duc CFBundleTypeIconFile AppIcon_ActionReplaySave.icns CFBundleTypeName Action Replay Save CFBundleTypeRole Viewer LSItemContentTypes com.codejunkies.actionreplay.save.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions bin CFBundleTypeIconFile AppIcon_HWImage_NDS.icns CFBundleTypeName Nintendo DS Hardware Image CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.hwimage.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions xml CFBundleTypeIconFile AppIcon_ADVANsCEneDatabase.icns CFBundleTypeName ADVANsCEne Database CFBundleTypeRole Viewer LSItemContentTypes com.advanscene.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dat CFBundleTypeIconFile AppIcon_R4CheatDatabase.icns CFBundleTypeName R4 Cheats Database CFBundleTypeRole Viewer LSItemContentTypes net.gbatemp.cheats.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleExecutable ${PRODUCT_NAME} CFBundleIconFile AppIcon_DeSmuME CFBundleIdentifier org.desmume.DeSmuME CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString v0.9.9 (Debug) CFBundleSignature DSmM CFBundleVersion 0.9.9 LSApplicationCategoryType public.app-category.entertainment LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright Copyright ©2013 DeSmuME Team. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass NSApplication UTExportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription DeSmuME Save State UTTypeIconFile AppIcon_SaveState.icns UTTypeIdentifier com.desmume.savestate UTTypeTagSpecification public.filename-extension dst UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Save UTTypeIconFile AppIcon_ROMSave.icns UTTypeIdentifier com.desmume.romsave UTTypeTagSpecification public.filename-extension dsv UTTypeConformsTo public.data UTTypeDescription DeSmuME Firmware Configuration UTTypeIconFile AppIcon_FirmwareConfig.icns UTTypeIdentifier com.desmume.firmwareconfig UTTypeTagSpecification public.filename-extension dfc UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Cheats UTTypeIconFile AppIcon_ROMCheats.icns UTTypeIdentifier com.desmume.romcheats UTTypeTagSpecification public.filename-extension dct UTImportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription Nintendo DS ROM UTTypeIconFile AppIcon_NintendoDS_ROM.icns UTTypeIdentifier com.nintendo.rom.ds UTTypeTagSpecification public.filename-extension nds UTTypeConformsTo public.data UTTypeDescription Gameboy Advance ROM UTTypeIconFile AppIcon_NintendoGBA_ROM.icns UTTypeIdentifier com.nintendo.rom.gba UTTypeTagSpecification public.filename-extension ds.gba UTTypeConformsTo public.data UTTypeDescription No$GBA ROM Save UTTypeIconFile AppIcon_NoGBA_ROMSave.icns UTTypeIdentifier de.emubase.nocash.romsave.gba UTTypeTagSpecification public.filename-extension sav UTTypeConformsTo public.data UTTypeDescription Action Replay Save UTTypeIconFile AppIcon_ActionReplaySave.icns UTTypeIdentifier com.codejunkies.actionreplay.save.nintendo.ds UTTypeTagSpecification public.filename-extension duc UTTypeConformsTo public.data UTTypeDescription Nintendo DS Hardware Image UTTypeIconFile AppIcon_HWImage_NDS.icns UTTypeIdentifier com.nintendo.hwimage.ds UTTypeTagSpecification public.filename-extension bin UTTypeConformsTo public.xml UTTypeDescription ADVANsCEne Database UTTypeIconFile AppIcon_ADVANsCEneDatabase.icns UTTypeIdentifier com.advanscene.database.nintendo.ds UTTypeTagSpecification public.filename-extension xml UTTypeConformsTo public.data UTTypeDescription R4 Cheats Database UTTypeIconFile AppIcon_R4CheatDatabase.icns UTTypeIdentifier net.gbatemp.cheats.database.nintendo.ds UTTypeTagSpecification public.filename-extension dat desmume-0.9.9/src/cocoa/cocoa_videofilter.mm0000644000175000017500000001166412140261603021613 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel Copyright (C) 2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import "cocoa_videofilter.h" #import #include "utilities.h" @implementation CocoaVideoFilter - (id)init { return [self initWithSize:NSMakeSize(1, 1) typeID:VideoFilterTypeID_None numberThreads:0]; } - (id) initWithSize:(NSSize)theSize { return [self initWithSize:theSize typeID:VideoFilterTypeID_None numberThreads:0]; } - (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID { return [self initWithSize:theSize typeID:typeID numberThreads:0]; } - (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID numberThreads:(NSUInteger)numThreads { self = [super init]; if (self == nil) { return self; } vf = new VideoFilter((unsigned int)theSize.width, (unsigned int)theSize.height, typeID, numThreads); currentFilterType = typeID; return self; } - (void)dealloc { delete vf; [super dealloc]; } - (BOOL) setSourceSize:(NSSize)theSize { BOOL result = NO; bool cResult = vf->SetSourceSize((unsigned int)theSize.width, (unsigned int)theSize.height); if (cResult) { result = YES; } return result; } - (BOOL) changeFilter:(VideoFilterTypeID)typeID { BOOL result = NO; if (typeID == currentFilterType) { result = YES; } else { bool cResult = vf->ChangeFilterByID(typeID); if (cResult) { result = YES; currentFilterType = typeID; } } return result; } - (UInt32 *) runFilter { return (UInt32 *)vf->RunFilter(); } - (NSImage *) image { NSImage *newImage = [[NSImage alloc] initWithSize:[self destSize]]; if (newImage == nil) { return newImage; } NSBitmapImageRep *newImageRep = [self bitmapImageRep]; if (newImageRep == nil) { [newImage release]; newImage = nil; return newImage; } [newImage addRepresentation:newImageRep]; return [newImage autorelease]; } - (NSBitmapImageRep *) bitmapImageRep { NSUInteger w = (NSUInteger)vf->GetDstWidth(); NSUInteger h = (NSUInteger)vf->GetDstHeight(); NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:w pixelsHigh:h bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:w * 4 bitsPerPixel:32]; if(imageRep == nil) { return imageRep; } uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; RGBA8888ForceOpaqueBuffer((const uint32_t *)[self runFilter], bitmapData, (w * h)); #ifdef __BIG_ENDIAN__ uint32_t *bitmapDataEnd = bitmapData + (w * h); while (bitmapData < bitmapDataEnd) { *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); } #endif return [imageRep autorelease]; } - (VideoFilterTypeID) typeID { return vf->GetTypeID(); } - (NSString *) typeString { return [NSString stringWithCString:vf->GetTypeString() encoding:NSUTF8StringEncoding]; } - (UInt32 *) srcBufferPtr { return (UInt32 *)vf->GetSrcBufferPtr(); } - (UInt32 *) dstBufferPtr { return (UInt32 *)vf->GetDstBufferPtr(); } - (NSSize) srcSize { return NSMakeSize((CGFloat)vf->GetSrcWidth(), (CGFloat)vf->GetSrcHeight()); } - (NSSize) destSize { return NSMakeSize((CGFloat)vf->GetDstWidth(), (CGFloat)vf->GetDstHeight()); } - (VideoFilterParamType) filterParameterType:(VideoFilterParamID)paramID { return vf->GetFilterParameterType(paramID); } - (int) filterParameteri:(VideoFilterParamID)paramID { return vf->GetFilterParameteri(paramID); } - (unsigned int) filterParameterui:(VideoFilterParamID)paramID { return vf->GetFilterParameterui(paramID); } - (float) filterParameterf:(VideoFilterParamID)paramID { return vf->GetFilterParameterf(paramID); } - (void) setFilterParameter:(VideoFilterParamID)paramID intValue:(int)value { vf->SetFilterParameteri(paramID, value); } - (void) setFilterParameter:(VideoFilterParamID)paramID uintValue:(unsigned int)value { vf->SetFilterParameterui(paramID, value); } - (void) setFilterParameter:(VideoFilterParamID)paramID floatValue:(float)value { vf->SetFilterParameterf(paramID, value); } + (NSString *) typeStringByID:(VideoFilterTypeID)typeID { const char *vfTypeCString = VideoFilter::GetTypeStringByID(typeID); NSString *vfTypeString = [NSString stringWithCString:vfTypeCString encoding:NSUTF8StringEncoding]; return vfTypeString; } @end desmume-0.9.9/src/cocoa/cocoa_input_legacy.h0000644000175000017500000000663412140261603021601 0ustar guillaumeguillaume/* Copyright (C) 2011 Roger Manuel This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #import @interface CocoaDSInput : NSObject { bool isStateChanged; NSMutableDictionary *property; } - (id) init; - (void) dealloc; - (void) setIsStateChanged:(bool)state; - (bool) isStateChanged; - (void) setInputTime:(NSDate*)inputTime; - (NSDate*) getInputTime; @end @interface CocoaDSButton : CocoaDSInput { } - (id) init; - (void) dealloc; - (void) setPressed:(bool)inputValue; - (bool) getPressed; @end @interface CocoaDSTouch : CocoaDSInput { } - (id) init; - (void) dealloc; - (void) setTouching:(bool)inputValue; - (bool) getTouching; - (void) setX:(float)inputValue; - (float) getX; - (void) setY:(float)inputValue; - (float) getY; - (void) setPoint:(NSPoint)inputValue; - (NSPoint) getPoint; - (void) setTouchingWithCoords:(bool)isTouching x:(float)xValue y:(float)yValue; - (void) setTouchingWithPoint:(bool)isTouching point:(NSPoint)inputPoint; @end @interface CocoaDSMic : CocoaDSInput { } - (id) init; - (void) dealloc; - (void) setPressed:(bool)inputValue; - (bool) getPressed; @end @interface CocoaDSController : NSObject { CocoaDSButton *ndsButton_Up; CocoaDSButton *ndsButton_Down; CocoaDSButton *ndsButton_Left; CocoaDSButton *ndsButton_Right; CocoaDSButton *ndsButton_A; CocoaDSButton *ndsButton_B; CocoaDSButton *ndsButton_X; CocoaDSButton *ndsButton_Y; CocoaDSButton *ndsButton_Select; CocoaDSButton *ndsButton_Start; CocoaDSButton *ndsButton_R; CocoaDSButton *ndsButton_L; CocoaDSButton *ndsButton_Debug; CocoaDSButton *ndsButton_Lid; CocoaDSTouch *ndsTouch; CocoaDSMic *ndsMic; } - (id) init; - (void) dealloc; - (void) setupAllDSInputs; //touch screen - (void)touch:(NSPoint)point; - (void)releaseTouch; - (bool) getTouching; - (NSPoint) getTouchPoint; - (float) getTouchXCoord; - (float) getTouchYCoord; //button input - (void)pressStart; - (void)liftStart; - (bool) getStartPressed; - (void)pressSelect; - (void)liftSelect; - (bool) getSelectPressed; - (void)pressLeft; - (void)liftLeft; - (bool) getLeftPressed; - (void)pressRight; - (void)liftRight; - (bool) getRightPressed; - (void)pressUp; - (void)liftUp; - (bool) getUpPressed; - (void)pressDown; - (void)liftDown; - (bool) getDownPressed; - (void)pressA; - (void)liftA; - (bool) getAPressed; - (void)pressB; - (void)liftB; - (bool) getBPressed; - (void)pressX; - (void)liftX; - (bool) getXPressed; - (void)pressY; - (void)liftY; - (bool) getYPressed; - (void)pressL; - (void)liftL; - (bool) getLPressed; - (void)pressR; - (void)liftR; - (bool) getRPressed; - (void) pressDebug; - (void) liftDebug; - (bool) getDebugPressed; - (void) pressLid; - (void) liftLid; - (bool) getLidPressed; // Nintendo DS Mic - (void) pressMic; - (void) liftMic; - (bool) getMicPressed; @enddesmume-0.9.9/src/cocoa/DefaultUserPrefs.plist0000644000175000017500000001227212140261603022074 0ustar guillaumeguillaumebplist00>  !"#$%&'()*+,-./0123456789:;<=>?@AABC?EE?E?EE@@?MNO?EREE???E?Z[@@?REE??ERE@@RM@@??EE??_EMR?b_Render3D_Multisample_DisplayViewCombo_Orientation_DisplayView_Size\Sound_Volume_FirmwareConfig_Nickname_Emulation_MaxJITBlockSize_DisplayView_UseVerticalSync_General_ExecuteROMOnLoad_CoreControl_EnableAutoFrameSkip_HUD_FramesPerSecond_Render3D_Textures_Emulation_FirmwareBoot_(Render3D_HighPrecisionColorInterpolation_SPU_AdvancedLogic_Emulation_CPUEmulationEngine_DisplayView_VideoFilter_HUD_RealTimeClock_DisplayView_Mode_General_AppFirstTimeRun_FirmwareConfig_FavoriteColor_General_AutoloadROMOnLaunch_Emulation_BIOSEmulateSWI_FirmwareConfig_Language_CoreControl_EnableCheats_DisplayView_ShowStatusBar_Emulation_UseDebugConsole_HUD_FrameCounter_HUD_GraphicalInput_Render3D_EdgeMarking^HUD_Microphone_FirmwareConfig_Birthday_Input_ControllerMappings_!Render3D_DepthComparisonThreshold_Input_SavedProfiles_Render3D_Threads_Emulation_EmulateEnsata_EmulationSlot1_DeviceType_DisplayView_UseBilinearOutput_ Emulation_AdvancedBusLevelTiming_Emulation_RigorousTiming_Emulation_UseExternalBIOSImages_Render3D_LineHack_Render3D_RenderingEngine\Render3D_Fog_DisplayView_Rotation_General_AutoloadROMOption_Input_AudioInputMode^SPU_SyncMethod_DisplayViewCombo_Order_DisplayViewCombo_Gap_"Emulation_UseExternalFirmwareImage^HUD_LagCounter_CoreControl_EnableSpeedLimit_DisplayView_ShowHUD_General_DoNotAskMigrateYHUD_Input_Sound_AudioOutputEngine_ Advanscene_AutoDetectRomSaveType_SPU_InterpolationMode\SPU_SyncMode_Emulation_BIOSPatchDelayLoopSWI_FirmwareConfig_MessagedWDeSmuME       3A\]^_`abcdefghijklmnopqrstuvwxyz '3<E_Rotate Display LeftZMicrophoneSHUDUResetRUpURightQXTDownQYVSelectQL]Execute/Pause[Copy Screen_Enable/Disable Auto Frame Skip[Mute/Unmute_Enable/Disable GPU StateYSet SpeedTLeftQA_Load State SlotQBSLidUDebug_Save State Slot_Rotate Display Right_Enable/Disable Speed LimiterQRUStartUTouch_Enable/Disable Cheats{|}~[elementNameZdeviceCodeYintValue0[elementCodeZdeviceNameQ[_NSEventKeyboardR33XKeyboardR[elementNameYintValue1ZdeviceCode[elementCodeZdeviceNameZ` (Accent)_NSEventKeyboardR50[elementNameZdeviceCode[elementCodeZdeviceNameQH_NSEventKeyboardQ4[elementNameZdeviceCode[elementCodeZdeviceNameYPage Down_NSEventKeyboardS121[elementNameZdeviceCode[elementCodeZdeviceNameXUp Arrow_NSEventKeyboardS126[elementNameZdeviceCode[elementCodeZdeviceName[Right Arrow_NSEventKeyboardS124[elementNameZdeviceCode[elementCodeZdeviceNameQS_NSEventKeyboardQ1[elementNameZdeviceCode[elementCodeZdeviceNameZDown Arrow_NSEventKeyboardS125n[elementNameZdeviceCode[elementCodeZdeviceName_NSEventKeyboardQ0[elementNameZdeviceCode[elementCodeZdeviceNameSTab_NSEventKeyboardR48[elementNameZdeviceCode[elementCodeZdeviceNameQQ_NSEventKeyboardR12[elementNameZdeviceCode[elementCodeZdeviceName^Forward Delete_NSEventKeyboardS117[elementName[floatValue0ZdeviceCode[elementCodeZdeviceNameX- (Dash)S0.5_NSEventKeyboardR27M[elementName[floatValue0ZdeviceCode[elementCodeZdeviceNameQ=_NSEventKeyboardR24 [elementNameZdeviceCode[elementCodeZdeviceNameZLeft Arrow_NSEventKeyboardS123   b[elementNameZdeviceCode[elementCodeZdeviceName_NSEventKeyboardQ7lementNameZdeviceCode[elementCodeZdeviceNameQZ_NSEventKeyboardQ6 !"#$[elementNameZdeviceCode[elementCodeZdeviceName_Delete (Backspace)_NSEventKeyboardR51()*+,-./01[elementNameZdeviceCodeYintValue0[elementCodeZdeviceNameQ]_NSEventKeyboardZR30456789:;[elementNameZdeviceCode[elementCodeZdeviceNameQW_NSEventKeyboardR13=>?@ABCD[elementNameZdeviceCode[elementCodeZdeviceNameVReturn_NSEventKeyboardR36FGHIJKLENO[elementName_useInputForIntCoordZdeviceCode[elementCodeZdeviceName^Primary Button \NSEventMouseUMouse    _DeSmuME makes you happy!9LYs-Xl#>Xs.Rh{1E`m*I_y !#%-/012345678:;=>?ABCDEFGHQ  ,MYt~   ) 5 @ J V a c u ~   % 1 < > P R U f r }    ) 5 @ L W c u y |    0 4 7 H T _ k v    ' ) ; > A R ^ i u  4@LWcnp*<>?BS_jv)4>JUWiknor #&)>J`kwcdesmume-0.9.9/src/cocoa/coreaudiosound.cpp0000644000175000017500000001550212140261603021322 0ustar guillaumeguillaume/* Copyright (C) 2012-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "coreaudiosound.h" #include "cocoa_globals.h" #include "utilities.h" CoreAudioOutput::CoreAudioOutput(size_t bufferSamples, size_t sampleSize) { OSStatus error = noErr; _spinlockAU = (OSSpinLock *)malloc(sizeof(OSSpinLock)); *_spinlockAU = OS_SPINLOCK_INIT; _buffer = new RingBuffer(bufferSamples, sampleSize); _volume = 1.0f; // Create a new audio unit #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 if (IsOSXVersionSupported(10, 6, 0)) { AudioComponentDescription audioDesc; audioDesc.componentType = kAudioUnitType_Output; audioDesc.componentSubType = kAudioUnitSubType_DefaultOutput; audioDesc.componentManufacturer = kAudioUnitManufacturer_Apple; audioDesc.componentFlags = 0; audioDesc.componentFlagsMask = 0; AudioComponent audioComponent = AudioComponentFindNext(NULL, &audioDesc); if (audioComponent == NULL) { return; } error = AudioComponentInstanceNew(audioComponent, &_au); if (error != noErr) { return; } } else { ComponentDescription audioDesc; audioDesc.componentType = kAudioUnitType_Output; audioDesc.componentSubType = kAudioUnitSubType_DefaultOutput; audioDesc.componentManufacturer = kAudioUnitManufacturer_Apple; audioDesc.componentFlags = 0; audioDesc.componentFlagsMask = 0; Component audioComponent = FindNextComponent(NULL, &audioDesc); if (audioComponent == NULL) { return; } error = OpenAComponent(audioComponent, &_au); if (error != noErr) { return; } } #else ComponentDescription audioDesc; audioDesc.componentType = kAudioUnitType_Output; audioDesc.componentSubType = kAudioUnitSubType_DefaultOutput; audioDesc.componentManufacturer = kAudioUnitManufacturer_Apple; audioDesc.componentFlags = 0; audioDesc.componentFlagsMask = 0; Component audioComponent = FindNextComponent(NULL, &audioDesc); if (audioComponent == NULL) { return; } error = OpenAComponent(audioComponent, &_au); if (error != noErr) { return; } #endif // Set the render callback AURenderCallbackStruct callback; callback.inputProc = &CoreAudioOutputRenderCallback; callback.inputProcRefCon = _buffer; error = AudioUnitSetProperty(_au, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback) ); if(error != noErr) { return; } // Set up the audio unit for audio streaming AudioStreamBasicDescription outputFormat; outputFormat.mSampleRate = SPU_SAMPLE_RATE; outputFormat.mFormatID = kAudioFormatLinearPCM; outputFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kLinearPCMFormatFlagIsPacked; outputFormat.mBytesPerPacket = SPU_SAMPLE_SIZE; outputFormat.mFramesPerPacket = 1; outputFormat.mBytesPerFrame = SPU_SAMPLE_SIZE; outputFormat.mChannelsPerFrame = SPU_NUMBER_CHANNELS; outputFormat.mBitsPerChannel = SPU_SAMPLE_RESOLUTION; error = AudioUnitSetProperty(_au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputFormat, sizeof(outputFormat) ); if(error != noErr) { return; } // Initialize our new audio unit error = AudioUnitInitialize(_au); if(error != noErr) { return; } } CoreAudioOutput::~CoreAudioOutput() { OSSpinLockLock(_spinlockAU); if(_au != NULL) { AudioOutputUnitStop(_au); AudioUnitUninitialize(_au); #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 if (IsOSXVersionSupported(10, 6, 0)) { AudioComponentInstanceDispose(_au); } else { CloseComponent(_au); } #else CloseComponent(_au); #endif _au = NULL; } OSSpinLockUnlock(_spinlockAU); delete _buffer; _buffer = NULL; free(_spinlockAU); _spinlockAU = NULL; } void CoreAudioOutput::start() { this->clearBuffer(); OSSpinLockLock(this->_spinlockAU); AudioUnitReset(this->_au, kAudioUnitScope_Global, 0); AudioOutputUnitStart(this->_au); OSSpinLockUnlock(this->_spinlockAU); } void CoreAudioOutput::stop() { OSSpinLockLock(this->_spinlockAU); AudioOutputUnitStop(this->_au); OSSpinLockUnlock(this->_spinlockAU); this->clearBuffer(); } void CoreAudioOutput::writeToBuffer(const void *buffer, size_t numberSampleFrames) { size_t availableSampleFrames = this->_buffer->getAvailableElements(); if (availableSampleFrames < numberSampleFrames) { this->_buffer->drop(numberSampleFrames - availableSampleFrames); } this->_buffer->write(buffer, numberSampleFrames); } void CoreAudioOutput::clearBuffer() { this->_buffer->clear(); } void CoreAudioOutput::mute() { OSSpinLockLock(this->_spinlockAU); AudioUnitSetParameter(this->_au, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, 0.0f, 0); OSSpinLockUnlock(this->_spinlockAU); } void CoreAudioOutput::unmute() { OSSpinLockLock(this->_spinlockAU); AudioUnitSetParameter(this->_au, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, this->_volume, 0); OSSpinLockUnlock(this->_spinlockAU); } size_t CoreAudioOutput::getAvailableSamples() const { return this->_buffer->getAvailableElements(); } float CoreAudioOutput::getVolume() const { return this->_volume; } void CoreAudioOutput::setVolume(float vol) { this->_volume = vol; OSSpinLockLock(this->_spinlockAU); AudioUnitSetParameter(this->_au, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, vol, 0); OSSpinLockUnlock(this->_spinlockAU); } OSStatus CoreAudioOutputRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { RingBuffer *__restrict__ audioBuffer = (RingBuffer *)inRefCon; UInt8 *__restrict__ playbackBuffer = (UInt8 *)ioData->mBuffers[0].mData; const size_t framesRead = audioBuffer->read(playbackBuffer, inNumberFrames); // Pad any remaining samples. if (framesRead < inNumberFrames) { memset(playbackBuffer + (framesRead * SPU_SAMPLE_SIZE), 0, (inNumberFrames - framesRead) * SPU_SAMPLE_SIZE); } // Copy to other channels. for (UInt32 channel = 1; channel < ioData->mNumberBuffers; channel++) { memcpy(ioData->mBuffers[channel].mData, playbackBuffer, ioData->mBuffers[0].mDataByteSize); } return noErr; } desmume-0.9.9/src/cocoa/Info (Legacy).plist0000644000175000017500000003031612140261603021051 0ustar guillaumeguillaume CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions nds CFBundleTypeIconFile AppIcon_NintendoDS_ROM.icns CFBundleTypeName Nintendo DS ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions ds.gba CFBundleTypeIconFile AppIcon_NintendoGBA_ROM.icns CFBundleTypeName Gameboy Advance ROM CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.rom.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dst CFBundleTypeIconFile AppIcon_SaveState.icns CFBundleTypeName DeSmuME Save State CFBundleTypeRole Editor LSItemContentTypes com.desmume.savestate LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dsv CFBundleTypeIconFile AppIcon_ROMSave.icns CFBundleTypeName DeSmuME ROM Save CFBundleTypeRole Editor LSItemContentTypes com.desmume.romsave LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dfc CFBundleTypeIconFile AppIcon_FirmwareConfig.icns CFBundleTypeName DeSmuME Firmware Configuration CFBundleTypeRole Editor LSItemContentTypes com.desmume.firmwareconfig LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dct CFBundleTypeIconFile AppIcon_ROMCheats.icns CFBundleTypeName DeSmuME ROM Cheats CFBundleTypeRole Editor LSItemContentTypes com.desmume.romcheats LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions sav CFBundleTypeIconFile AppIcon_NoGBA_ROMSave.icns CFBundleTypeName No$GBA ROM Save CFBundleTypeRole Viewer LSItemContentTypes de.emubase.nocash.romsave.gba LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions duc CFBundleTypeIconFile AppIcon_ActionReplaySave.icns CFBundleTypeName Action Replay Save CFBundleTypeRole Viewer LSItemContentTypes com.codejunkies.actionreplay.save.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions bin CFBundleTypeIconFile AppIcon_HWImage_NDS.icns CFBundleTypeName Nintendo DS Hardware Image CFBundleTypeRole Viewer LSItemContentTypes com.nintendo.hwimage.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions xml CFBundleTypeIconFile AppIcon_ADVANsCEneDatabase.icns CFBundleTypeName ADVANsCEne Database CFBundleTypeRole Viewer LSItemContentTypes com.advanscene.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleTypeExtensions dat CFBundleTypeIconFile AppIcon_R4CheatDatabase.icns CFBundleTypeName R4 Cheats Database CFBundleTypeRole Viewer LSItemContentTypes net.gbatemp.cheats.database.nintendo.ds LSTypeIsPackage NSPersistentStoreTypeKey Binary CFBundleExecutable ${PRODUCT_NAME} CFBundleIconFile AppIcon_DeSmuME CFBundleIdentifier org.desmume.DeSmuME CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString v0.9.9 CFBundleSignature DSmM CFBundleVersion 0.9.9 LSApplicationCategoryType public.app-category.entertainment LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright Copyright ©2012 DeSmuME Team. All rights reserved. NSMainNibFile MainMenu (Legacy) NSPrincipalClass NSApplication UTExportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription DeSmuME Save State UTTypeIconFile AppIcon_SaveState.icns UTTypeIdentifier com.desmume.savestate UTTypeTagSpecification public.filename-extension dst UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Save UTTypeIconFile AppIcon_ROMSave.icns UTTypeIdentifier com.desmume.romsave UTTypeTagSpecification public.filename-extension dsv UTTypeConformsTo public.data UTTypeDescription DeSmuME Firmware Configuration UTTypeIconFile AppIcon_FirmwareConfig.icns UTTypeIdentifier com.desmume.firmwareconfig UTTypeTagSpecification public.filename-extension dfc UTTypeConformsTo public.data UTTypeDescription DeSmuME ROM Cheats UTTypeIconFile AppIcon_ROMCheats.icns UTTypeIdentifier com.desmume.romcheats UTTypeTagSpecification public.filename-extension dct UTImportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription Nintendo DS ROM UTTypeIconFile AppIcon_NintendoDS_ROM.icns UTTypeIdentifier com.nintendo.rom.ds UTTypeTagSpecification public.filename-extension nds UTTypeConformsTo public.data UTTypeDescription Gameboy Advance ROM UTTypeIconFile AppIcon_NintendoGBA_ROM.icns UTTypeIdentifier com.nintendo.rom.gba UTTypeTagSpecification public.filename-extension ds.gba UTTypeConformsTo public.data UTTypeDescription No$GBA ROM Save UTTypeIconFile AppIcon_NoGBA_ROMSave.icns UTTypeIdentifier de.emubase.nocash.romsave.gba UTTypeTagSpecification public.filename-extension sav UTTypeConformsTo public.data UTTypeDescription Action Replay Save UTTypeIconFile AppIcon_ActionReplaySave.icns UTTypeIdentifier com.codejunkies.actionreplay.save.nintendo.ds UTTypeTagSpecification public.filename-extension duc UTTypeConformsTo public.data UTTypeDescription Nintendo DS Hardware Image UTTypeIconFile AppIcon_HWImage_NDS.icns UTTypeIdentifier com.nintendo.hwimage.ds UTTypeTagSpecification public.filename-extension bin UTTypeConformsTo public.xml UTTypeDescription ADVANsCEne Database UTTypeIconFile AppIcon_ADVANsCEneDatabase.icns UTTypeIdentifier com.advanscene.database.nintendo.ds UTTypeTagSpecification public.filename-extension xml UTTypeConformsTo public.data UTTypeDescription R4 Cheats Database UTTypeIconFile AppIcon_R4CheatDatabase.icns UTTypeIdentifier net.gbatemp.cheats.database.nintendo.ds UTTypeTagSpecification public.filename-extension dat desmume-0.9.9/src/cocoa/screen_state_legacy.h0000644000175000017500000000323312140261603021745 0ustar guillaumeguillaume/* Copyright (C) 2007 Jeff Bland Copyright (C) 2011 Roger Manuel Copyright (C) 2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #import #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 #include "macosx_10_4_compat.h" #endif #define DS_BPP 2 //bytes per pixel #define DS_SCREEN_X_RATIO (256.0 / (192.0 * 2.0)) #define DS_SCREEN_Y_RATIO ((192.0 * 2.0) / 256.0) #define DS_SCREEN_WIDTH 256 #define DS_SCREEN_HEIGHT 192 //This class is used to return screen data at the end of a frame //we wrap it in a obj-c class so it can be passed to a selector //and so we get retain/release niftyness @interface ScreenState : NSObject { @private unsigned char color_data[DS_SCREEN_WIDTH * DS_SCREEN_HEIGHT*2 * DS_BPP]; } + (NSInteger)width; + (NSInteger)height; + (NSSize)size; + (ScreenState*)blackScreenState; + (ScreenState*)whiteScreenState; - (id)initWithBlack; - (id)initWithWhite; - (id)initWithScreenState:(ScreenState*)state; - (id)initWithColorData:(const unsigned char*)data; - (const unsigned char*)colorData; - (NSImage*)image; - (NSBitmapImageRep*)imageRep; @enddesmume-0.9.9/src/cp15.cpp0000644000175000017500000004253112140261633015770 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2006-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include "cp15.h" #include "debug.h" #include "MMU.h" armcp15_t cp15; bool armcp15_t::reset(armcpu_t * c) { //printf("CP15 Reset\n"); cpu = c; IDCode = 0x41059461; cacheType = 0x0F0D2112; TCMSize = 0x00140180; ctrl = 0x00012078; DCConfig = 0x0; ICConfig = 0x0; writeBuffCtrl = 0x0; und = 0x0; DaccessPerm = 0x22222222; IaccessPerm = 0x22222222; protectBaseSize0 = 0x0; protectBaseSize1 = 0x0; protectBaseSize2 = 0x0; protectBaseSize3 = 0x0; protectBaseSize4 = 0x0; protectBaseSize5 = 0x0; protectBaseSize6 = 0x0; protectBaseSize7 = 0x0; cacheOp = 0x0; DcacheLock = 0x0; IcacheLock = 0x0; ITCMRegion = 0x0C; DTCMRegion = 0x0080000A; processID = 0; MMU.ARM9_RW_MODE = BIT7(ctrl); cpu->intVector = 0xFFFF0000 * (BIT13(ctrl)); cpu->LDTBit = !BIT15(ctrl); //TBit /* preset calculated regionmasks */ for (u8 i=0;i<8;i++) { regionWriteMask_USR[i] = 0 ; regionWriteMask_SYS[i] = 0 ; regionReadMask_USR[i] = 0 ; regionReadMask_SYS[i] = 0 ; regionExecuteMask_USR[i] = 0 ; regionExecuteMask_SYS[i] = 0 ; regionWriteSet_USR[i] = 0 ; regionWriteSet_SYS[i] = 0 ; regionReadSet_USR[i] = 0 ; regionReadSet_SYS[i] = 0 ; regionExecuteSet_USR[i] = 0 ; regionExecuteSet_SYS[i] = 0 ; } ; return true; } #define ACCESSTYPE(val,n) (((val) >> (4*n)) & 0x0F) #define SIZEIDENTIFIER(val) ((((val) >> 1) & 0x1F)) #define SIZEBINARY(val) (1 << (SIZEIDENTIFIER(val)+1)) #define MASKFROMREG(val) (~((SIZEBINARY(val)-1) | 0x3F)) #define SETFROMREG(val) ((val) & MASKFROMREG(val)) /* sets the precalculated regions to mask,set for the affected accesstypes */ void armcp15_t::setSingleRegionAccess(u32 dAccess,u32 iAccess,unsigned char num, u32 mask,u32 set) { switch (ACCESSTYPE(dAccess,num)) { case 4: /* UNP */ case 7: /* UNP */ case 8: /* UNP */ case 9: /* UNP */ case 10: /* UNP */ case 11: /* UNP */ case 12: /* UNP */ case 13: /* UNP */ case 14: /* UNP */ case 15: /* UNP */ case 0: /* no access at all */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = 0 ; regionReadSet_USR[num] = 0xFFFFFFFF ; regionWriteMask_SYS[num] = 0 ; regionWriteSet_SYS[num] = 0xFFFFFFFF ; regionReadMask_SYS[num] = 0 ; regionReadSet_SYS[num] = 0xFFFFFFFF ; break ; case 1: /* no access at USR, all to sys */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = 0 ; regionReadSet_USR[num] = 0xFFFFFFFF ; regionWriteMask_SYS[num] = mask ; regionWriteSet_SYS[num] = set ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; case 2: /* read at USR, all to sys */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = mask ; regionReadSet_USR[num] = set ; regionWriteMask_SYS[num] = mask ; regionWriteSet_SYS[num] = set ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; case 3: /* all to USR, all to sys */ regionWriteMask_USR[num] = mask ; regionWriteSet_USR[num] = set ; regionReadMask_USR[num] = mask ; regionReadSet_USR[num] = set ; regionWriteMask_SYS[num] = mask ; regionWriteSet_SYS[num] = set ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; case 5: /* no access at USR, read to sys */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = 0 ; regionReadSet_USR[num] = 0xFFFFFFFF ; regionWriteMask_SYS[num] = 0 ; regionWriteSet_SYS[num] = 0xFFFFFFFF ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; case 6: /* read at USR, read to sys */ regionWriteMask_USR[num] = 0 ; regionWriteSet_USR[num] = 0xFFFFFFFF ; regionReadMask_USR[num] = mask ; regionReadSet_USR[num] = set ; regionWriteMask_SYS[num] = 0 ; regionWriteSet_SYS[num] = 0xFFFFFFFF ; regionReadMask_SYS[num] = mask ; regionReadSet_SYS[num] = set ; break ; } switch (ACCESSTYPE(iAccess,num)) { case 4: /* UNP */ case 7: /* UNP */ case 8: /* UNP */ case 9: /* UNP */ case 10: /* UNP */ case 11: /* UNP */ case 12: /* UNP */ case 13: /* UNP */ case 14: /* UNP */ case 15: /* UNP */ case 0: /* no access at all */ regionExecuteMask_USR[num] = 0 ; regionExecuteSet_USR[num] = 0xFFFFFFFF ; regionExecuteMask_SYS[num] = 0 ; regionExecuteSet_SYS[num] = 0xFFFFFFFF ; break ; case 1: regionExecuteMask_USR[num] = 0 ; regionExecuteSet_USR[num] = 0xFFFFFFFF ; regionExecuteMask_SYS[num] = mask ; regionExecuteSet_SYS[num] = set ; break ; case 2: case 3: case 6: regionExecuteMask_USR[num] = mask ; regionExecuteSet_USR[num] = set ; regionExecuteMask_SYS[num] = mask ; regionExecuteSet_SYS[num] = set ; break ; } } ; /* precalculate region masks/sets from cp15 register */ void armcp15_t::maskPrecalc() { #define precalc(num) { \ u32 mask = 0, set = 0xFFFFFFFF ; /* (x & 0) == 0xFF..FF is allways false (disabled) */ \ if (BIT_N(protectBaseSize##num,0)) /* if region is enabled */ \ { /* reason for this define: naming includes var */ \ mask = MASKFROMREG(protectBaseSize##num) ; \ set = SETFROMREG(protectBaseSize##num) ; \ if (SIZEIDENTIFIER(protectBaseSize##num)==0x1F) \ { /* for the 4GB region, u32 suffers wraparound */ \ mask = 0 ; set = 0 ; /* (x & 0) == 0 is allways true (enabled) */ \ } \ } \ setSingleRegionAccess(DaccessPerm,IaccessPerm,num,mask,set) ; \ } precalc(0) ; precalc(1) ; precalc(2) ; precalc(3) ; precalc(4) ; precalc(5) ; precalc(6) ; precalc(7) ; #undef precalc } BOOL armcp15_t::isAccessAllowed(u32 address,u32 access) { int i ; if (!(ctrl & 1)) return TRUE ; /* protection checking is not enabled */ for (i=0;i<8;i++) { switch (access) { case CP15_ACCESS_WRITEUSR: if ((address & regionWriteMask_USR[i]) == regionWriteSet_USR[i]) return TRUE ; break ; case CP15_ACCESS_WRITESYS: if ((address & regionWriteMask_SYS[i]) == regionWriteSet_SYS[i]) return TRUE ; break ; case CP15_ACCESS_READUSR: if ((address & regionReadMask_USR[i]) == regionReadSet_USR[i]) return TRUE ; break ; case CP15_ACCESS_READSYS: if ((address & regionReadMask_SYS[i]) == regionReadSet_SYS[i]) return TRUE ; break ; case CP15_ACCESS_EXECUSR: if ((address & regionExecuteMask_USR[i]) == regionExecuteSet_USR[i]) return TRUE ; break ; case CP15_ACCESS_EXECSYS: if ((address & regionExecuteMask_SYS[i]) == regionExecuteSet_SYS[i]) return TRUE ; break ; } } /* when protections are enabled, but no region allows access, deny access */ return FALSE ; } BOOL armcp15_t::dataProcess(u8 CRd, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2) { LOG("Unsupported CP15 operation : DataProcess\n"); return FALSE; } BOOL armcp15_t::load(u8 CRd, u8 adr) { LOG("Unsupported CP15 operation : Load\n"); return FALSE; } BOOL armcp15_t::store(u8 CRd, u8 adr) { LOG("Unsupported CP15 operation : Store\n"); return FALSE; } BOOL armcp15_t::moveCP2ARM(u32 * R, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2) { if (!cpu) { printf("ERROR: cp15 don\'t allocated\n"); return FALSE; } if(cpu->CPSR.bits.mode == USR) return FALSE; switch(CRn) { case 0: if((opcode1 == 0)&&(CRm==0)) { switch(opcode2) { case 1: *R = cacheType; return TRUE; case 2: *R = TCMSize; return TRUE; default: *R = IDCode; return TRUE; } } return FALSE; case 1: if((opcode1==0) && (opcode2==0) && (CRm==0)) { *R = ctrl; //LOG("CP15: CPtoARM ctrl %08X\n", ctrl); return TRUE; } return FALSE; case 2: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 0: *R = DCConfig; return TRUE; case 1: *R = ICConfig; return TRUE; default: return FALSE; } } return FALSE; case 3: if((opcode1==0) && (opcode2==0) && (CRm==0)) { *R = writeBuffCtrl; //LOG("CP15: CPtoARM writeBuffer ctrl %08X\n", writeBuffCtrl); return TRUE; } return FALSE; case 5: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 2: *R = DaccessPerm; return TRUE; case 3: *R = IaccessPerm; return TRUE; default: return FALSE; } } return FALSE; case 6: if((opcode1==0) && (opcode2==0)) { switch(CRm) { case 0: *R = protectBaseSize0; return TRUE; case 1: *R = protectBaseSize1; return TRUE; case 2: *R = protectBaseSize2; return TRUE; case 3: *R = protectBaseSize3; return TRUE; case 4: *R = protectBaseSize4; return TRUE; case 5: *R = protectBaseSize5; return TRUE; case 6: *R = protectBaseSize6; return TRUE; case 7: *R = protectBaseSize7; return TRUE; default: return FALSE; } } return FALSE; case 9: if((opcode1==0)) { switch(CRm) { case 0: switch(opcode2) { case 0: *R = DcacheLock; return TRUE; case 1: *R = IcacheLock; return TRUE; default: return FALSE; } case 1: switch(opcode2) { case 0: *R = DTCMRegion; return TRUE; case 1: *R = ITCMRegion; return TRUE; default: return FALSE; } } } return FALSE; default: LOG("Unsupported CP15 operation : MRC\n"); return FALSE; } } BOOL armcp15_t::moveARM2CP(u32 val, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2) { if (!cpu) { printf("ERROR: cp15 don\'t allocated\n"); return FALSE; } if(cpu->CPSR.bits.mode == USR) return FALSE; switch(CRn) { case 1: if((opcode1==0) && (opcode2==0) && (CRm==0)) { //On the NDS bit0,2,7,12..19 are R/W, Bit3..6 are always set, all other bits are always zero. ctrl = (val & 0x000FF085) | 0x00000078; MMU.ARM9_RW_MODE = BIT7(val); //zero 31-jan-2010: change from 0x0FFF0000 to 0xFFFF0000 per gbatek cpu->intVector = 0xFFFF0000 * (BIT13(val)); cpu->LDTBit = !BIT15(val); //TBit //LOG("CP15: ARMtoCP ctrl %08X (val %08X)\n", ctrl, val); return TRUE; } return FALSE; case 2: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 0: DCConfig = val; return TRUE; case 1: ICConfig = val; return TRUE; default: return FALSE; } } return FALSE; case 3: if((opcode1==0) && (opcode2==0) && (CRm==0)) { writeBuffCtrl = val; //LOG("CP15: ARMtoCP writeBuffer ctrl %08X\n", writeBuffCtrl); return TRUE; } return FALSE; case 5: if((opcode1==0) && (CRm==0)) { switch(opcode2) { case 2: DaccessPerm = val; maskPrecalc(); return TRUE; case 3: IaccessPerm = val; maskPrecalc(); return TRUE; default: return FALSE; } } return FALSE; case 6: if((opcode1==0) && (opcode2==0)) { switch(CRm) { case 0: protectBaseSize0 = val; maskPrecalc(); return TRUE; case 1: protectBaseSize1 = val; maskPrecalc(); return TRUE; case 2: protectBaseSize2 = val; maskPrecalc(); return TRUE; case 3: protectBaseSize3 = val; maskPrecalc(); return TRUE; case 4: protectBaseSize4 = val; maskPrecalc(); return TRUE; case 5: protectBaseSize5 = val; maskPrecalc(); return TRUE; case 6: protectBaseSize6 = val; maskPrecalc(); return TRUE; case 7: protectBaseSize7 = val; maskPrecalc(); return TRUE; default: return FALSE; } } return FALSE; case 7: if((CRm==0)&&(opcode1==0)&&((opcode2==4))) { //CP15wait4IRQ; cpu->waitIRQ = TRUE; cpu->halt_IE_and_IF = TRUE; //IME set deliberately omitted: only SWI sets IME to 1 return TRUE; } return FALSE; case 9: if((opcode1==0)) { switch(CRm) { case 0: switch(opcode2) { case 0: DcacheLock = val; return TRUE; case 1: IcacheLock = val; return TRUE; default: return FALSE; } case 1: switch(opcode2) { case 0: MMU.DTCMRegion = DTCMRegion = val & 0x0FFFF000; return TRUE; case 1: ITCMRegion = val; //ITCM base is not writeable! MMU.ITCMRegion = 0; return TRUE; default: return FALSE; } } } return FALSE; default: return FALSE; } } // Save state void armcp15_t::saveone(EMUFILE* os) { write32le(IDCode,os); write32le(cacheType,os); write32le(TCMSize,os); write32le(ctrl,os); write32le(DCConfig,os); write32le(ICConfig,os); write32le(writeBuffCtrl,os); write32le(und,os); write32le(DaccessPerm,os); write32le(IaccessPerm,os); write32le(protectBaseSize0,os); write32le(protectBaseSize1,os); write32le(protectBaseSize2,os); write32le(protectBaseSize3,os); write32le(protectBaseSize4,os); write32le(protectBaseSize5,os); write32le(protectBaseSize6,os); write32le(protectBaseSize7,os); write32le(cacheOp,os); write32le(DcacheLock,os); write32le(IcacheLock,os); write32le(ITCMRegion,os); write32le(DTCMRegion,os); write32le(processID,os); write32le(RAM_TAG,os); write32le(testState,os); write32le(cacheDbg,os); for(int i=0;i<8;i++) write32le(regionWriteMask_USR[i],os); for(int i=0;i<8;i++) write32le(regionWriteMask_SYS[i],os); for(int i=0;i<8;i++) write32le(regionReadMask_USR[i],os); for(int i=0;i<8;i++) write32le(regionReadMask_SYS[i],os); for(int i=0;i<8;i++) write32le(regionExecuteMask_USR[i],os); for(int i=0;i<8;i++) write32le(regionExecuteMask_SYS[i],os); for(int i=0;i<8;i++) write32le(regionWriteSet_USR[i],os); for(int i=0;i<8;i++) write32le(regionWriteSet_SYS[i],os); for(int i=0;i<8;i++) write32le(regionReadSet_USR[i],os); for(int i=0;i<8;i++) write32le(regionReadSet_SYS[i],os); for(int i=0;i<8;i++) write32le(regionExecuteSet_USR[i],os); for(int i=0;i<8;i++) write32le(regionExecuteSet_SYS[i],os); } bool armcp15_t::loadone(EMUFILE* is) { if(!read32le(&IDCode,is)) return false; if(!read32le(&cacheType,is)) return false; if(!read32le(&TCMSize,is)) return false; if(!read32le(&ctrl,is)) return false; if(!read32le(&DCConfig,is)) return false; if(!read32le(&ICConfig,is)) return false; if(!read32le(&writeBuffCtrl,is)) return false; if(!read32le(&und,is)) return false; if(!read32le(&DaccessPerm,is)) return false; if(!read32le(&IaccessPerm,is)) return false; if(!read32le(&protectBaseSize0,is)) return false; if(!read32le(&protectBaseSize1,is)) return false; if(!read32le(&protectBaseSize2,is)) return false; if(!read32le(&protectBaseSize3,is)) return false; if(!read32le(&protectBaseSize4,is)) return false; if(!read32le(&protectBaseSize5,is)) return false; if(!read32le(&protectBaseSize6,is)) return false; if(!read32le(&protectBaseSize7,is)) return false; if(!read32le(&cacheOp,is)) return false; if(!read32le(&DcacheLock,is)) return false; if(!read32le(&IcacheLock,is)) return false; if(!read32le(&ITCMRegion,is)) return false; if(!read32le(&DTCMRegion,is)) return false; if(!read32le(&processID,is)) return false; if(!read32le(&RAM_TAG,is)) return false; if(!read32le(&testState,is)) return false; if(!read32le(&cacheDbg,is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionWriteMask_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionWriteMask_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionReadMask_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionReadMask_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionExecuteMask_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionExecuteMask_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionWriteSet_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionWriteSet_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionReadSet_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionReadSet_SYS[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionExecuteSet_USR[i],is)) return false; for(int i=0;i<8;i++) if(!read32le(®ionExecuteSet_SYS[i],is)) return false; return true; } /* precalculate region masks/sets from cp15 register ----- JIT */ void maskPrecalc() { #define precalc(num) { \ u32 mask = 0, set = 0xFFFFFFFF ; /* (x & 0) == 0xFF..FF is allways false (disabled) */ \ if (BIT_N(cp15.protectBaseSize##num,0)) /* if region is enabled */ \ { /* reason for this define: naming includes var */ \ mask = MASKFROMREG(cp15.protectBaseSize##num) ; \ set = SETFROMREG(cp15.protectBaseSize##num) ; \ if (SIZEIDENTIFIER(cp15.protectBaseSize##num)==0x1F) \ { /* for the 4GB region, u32 suffers wraparound */ \ mask = 0 ; set = 0 ; /* (x & 0) == 0 is allways true (enabled) */ \ } \ } \ cp15.setSingleRegionAccess(cp15.DaccessPerm,cp15.IaccessPerm,num,mask,set) ; \ } precalc(0) ; precalc(1) ; precalc(2) ; precalc(3) ; precalc(4) ; precalc(5) ; precalc(6) ; precalc(7) ; #undef precalc } desmume-0.9.9/src/mic.cpp0000644000175000017500000001126212140261633015765 0ustar guillaumeguillaume/* mic.cpp - this file is part of DeSmuME * * Copyright (C) 2009-2011 DeSmuME Team * * This file 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, or (at your option) * any later version. * * This file 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef WIN32 #include #include "mic.h" #include "NDSSystem.h" #include "readwrite.h" #define MIC_NULL_SAMPLE_VALUE 0 #define MIC_MAX_BUFFER_SAMPLES 320 #define MIC_BUFFER_SIZE (sizeof(u8) * MIC_MAX_BUFFER_SAMPLES) #define NUM_INTERNAL_NOISE_SAMPLES 32 static u8 *micSampleBuffer = NULL; // Pointer to the internal sample buffer. static u8 *micReadPosition = NULL; // Pointer to the read position of the internal sample buffer. static u8 *micWritePosition = NULL; // Pointer to the write position of the internal sample buffer. static unsigned int micBufferFillCount; // The number of readable samples in the internal sample buffer. static void Mic_BufferClear(void) { if (micSampleBuffer == NULL) { return; } memset(micSampleBuffer, MIC_NULL_SAMPLE_VALUE, MIC_BUFFER_SIZE); micReadPosition = micSampleBuffer; micWritePosition = micSampleBuffer; micBufferFillCount = 0; } BOOL Mic_Init(void) { BOOL result = FALSE; u8 *newBuffer = (u8 *)malloc(MIC_BUFFER_SIZE); if (newBuffer == NULL) { return result; } micSampleBuffer = newBuffer; Mic_BufferClear(); result = TRUE; return result; } void Mic_DeInit(void) { free(micSampleBuffer); micSampleBuffer = NULL; } void Mic_Reset(void) { *micReadPosition = MIC_NULL_SAMPLE_VALUE; micWritePosition = micReadPosition; micBufferFillCount = 0; } static bool Mic_GetActivate(void) { return NDS_getFinalUserInput().mic.micButtonPressed; } static bool Mic_IsBufferFull(void) { return (micBufferFillCount >= MIC_MAX_BUFFER_SAMPLES); } static bool Mic_IsBufferEmpty(void) { return (micBufferFillCount == 0); } static u8 Mic_DefaultBufferRead(void) { u8 theSample = MIC_NULL_SAMPLE_VALUE; if (micSampleBuffer == NULL) { return theSample; } theSample = *micReadPosition; if (Mic_IsBufferEmpty()) { return theSample; } micReadPosition++; micBufferFillCount--; // Move the pointer back to start if we reach the end of the memory block. if (micReadPosition >= (micSampleBuffer + MIC_BUFFER_SIZE)) { micReadPosition = micSampleBuffer; } return theSample; } u8 Mic_ReadSample(void) { // All mic modes other than Physical must have the mic hotkey pressed in order // to work. if (CommonSettings.micMode != TCommonSettings::Physical && !Mic_GetActivate()) { return MIC_NULL_SAMPLE_VALUE; } return Mic_DefaultBufferRead(); } static void Mic_DefaultBufferWrite(u8 theSample) { if (micSampleBuffer == NULL || Mic_IsBufferFull()) { return; } *micWritePosition = theSample; micWritePosition++; micBufferFillCount++; // Move the pointer back to start if we reach the end of the memory block. if (micWritePosition >= (micSampleBuffer + MIC_BUFFER_SIZE)) { micWritePosition = micSampleBuffer; } } static u8 Mic_GenerateInternalNoiseSample(void) { const u8 noiseSample[NUM_INTERNAL_NOISE_SAMPLES] = { 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0xFF, 0xF4, 0xE1, 0xBF, 0x9A, 0x71, 0x58, 0x5B, 0x5F, 0x62, 0xC2, 0x25, 0x05, 0x01, 0x01, 0x01, 0x01 }; static unsigned int i = 0; if (++i >= NUM_INTERNAL_NOISE_SAMPLES) { i = 0; } return noiseSample[i]; } static u8 Mic_GenerateWhiteNoiseSample(void) { return (u8)(rand() & 0xFF); } static u8 Mic_GenerateNullSample(void) { return MIC_NULL_SAMPLE_VALUE; } void Mic_DoNoise(BOOL noise) { u8 (*generator) (void) = NULL; if (micSampleBuffer == NULL) { return; } if (!noise) { generator = &Mic_GenerateNullSample; } else if (CommonSettings.micMode == TCommonSettings::InternalNoise) { generator = &Mic_GenerateInternalNoiseSample; } else if (CommonSettings.micMode == TCommonSettings::Random) { generator = &Mic_GenerateWhiteNoiseSample; } if (generator == NULL) { return; } while (micBufferFillCount < MIC_MAX_BUFFER_SAMPLES) { Mic_DefaultBufferWrite(generator()); } } void mic_savestate(EMUFILE* os) { write32le(-1,os); } bool mic_loadstate(EMUFILE* is, int size) { is->fseek(size, SEEK_CUR); return TRUE; } #endif desmume-0.9.9/src/instruction_attributes.h0000644000175000017500000104700112140261633021512 0ustar guillaumeguillaume/* Copyright (C) 2006 yopyop Copyright (C) 2011 Loren Merritt Copyright (C) 2012 DeSmuME team This file 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 3 of the License, or (at your option) any later version. This file 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 the this software. If not, see . */ #ifndef instruction_attributes_H_ #define instruction_attributes_H_ #include "types.h" #define INSTR_CYCLES_MASK 0x7 #define INSTR_CYCLES(c) c // constant cycles. does not include the penalty for writing to r15 for instructions other than dedicated branches. #define INSTR_CYCLES_VARIABLE 0 // duration to be determined at runtime #define INSTR_CYCLES_V INSTR_CYCLES_VARIABLE #define SRCREG_NONE 0x0000 #define SRCREG_POS0 0x0008 #define SRCREG_POS3 0x0010 #define SRCREG_POS8 0x0020 #define SRCREG_POS12 0x0040 #define SRCREG_POS16 0x0080 #define SRCREG_STM 0x0100 #define BRANCH_NEVER 0x00000000 #define BRANCH_ALWAYS 0x00000800 #define BRANCH_POS0 0x00001000 // branch if (REG_NUM(i,0)|((i>>4)&8))==15 #define BRANCH_POS12 0x00002000 // branch if REG_POS(i,12)==15 #define BRANCH_LDM 0x00004000 #define BRANCH_SWI 0x00008000 // branch if use external SWI - if (cpu->swi_tab == NULL) #define JIT_BYPASS 0x80000000 // JIT makes no assumptions about what this instruction does static const u32 instruction_attributes[4096] = { INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_MUL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_MUL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_POS_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_POS_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_POS_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_MLA INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_MLA_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_POS_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_POS_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_POS_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_UMULL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_UMULL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_POS_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_POS_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_POS_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_UMLAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_UMLAL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_POS_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_POS_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_POS_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSL_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_S INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ASR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ROR_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MRS_CPSR JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QADD JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_B_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_SWP INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_T_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_M_REG_OFF INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_B_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_T_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSL_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_LSL_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_LSR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ASR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ROR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0, //OP_MSR_CPSR INSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS0, //OP_BX JIT_BYPASS, //OP_UND INSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS0, //OP_BLX_REG JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QSUB JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_BKPT INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLAW_B JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULW_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_M_REG_OFF INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLAW_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULW_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSL_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_LSL_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_LSR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ASR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ROR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_PRE_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_PRE_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_PRE_INDE_M_REG_OFF INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MRS_SPSR JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QDADD JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_B_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_SWPB INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_T_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_M_IMM_OFF INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_B_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_T_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSL_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_LSL_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_LSR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ASR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ROR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0, //OP_MSR_SPSR INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0, //OP_CLZ JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QDSUB JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_B_B JIT_BYPASS, //OP_UND INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_T_B INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_M_IMM_OFF INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_B_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_T_T INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSL_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_LSL_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_LSR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ASR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ROR_IMM INSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_PRE_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_PRE_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_PRE_INDE_M_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_PRE_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_PRE_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_PRE_INDE_P_REG_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSL_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_LSL_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_LSR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ASR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_ASR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ROR_IMM INSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_ROR_REG INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSL_IMM JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_PRE_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ASR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_PRE_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ROR_IMM INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_PRE_INDE_P_IMM_OFF INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND JIT_BYPASS, //OP_UND INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_PREIND JIT_BYPASS, //OP_UND INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2 INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES_V | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_STC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_LDC_M_POSTIND JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_STC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_LDC_OPTION JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_STC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_LDC_P_POSTIND JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_LDC_M_IMM_OFF JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_STC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_LDC_M_PREIND JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_LDC_P_IMM_OFF JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_STC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_LDC_P_PREIND JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(2) | BRANCH_NEVER, //OP_MCR JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC JIT_BYPASS, //OP_CDP INSTR_CYCLES(3) | BRANCH_NEVER, //OP_MRC INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI }; static const u32 thumb_attributes[1024] = { INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL_0 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR_0 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR_0 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8 INSTR_CYCLES(1) | BRANCH_NEVER, //OP_AND INSTR_CYCLES(1) | BRANCH_NEVER, //OP_EOR INSTR_CYCLES(2) | BRANCH_NEVER, //OP_LSL_REG INSTR_CYCLES(2) | BRANCH_NEVER, //OP_LSR_REG INSTR_CYCLES(2) | BRANCH_NEVER, //OP_ASR_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADC_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_SBC_REG INSTR_CYCLES(2) | BRANCH_NEVER, //OP_ROR_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_TST INSTR_CYCLES(1) | BRANCH_NEVER, //OP_NEG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMN INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ORR INSTR_CYCLES_V | BRANCH_NEVER, //OP_MUL_REG INSTR_CYCLES(1) | BRANCH_NEVER, //OP_BIC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_MVN INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE INSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE INSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE INSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BX_THUMB INSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BX_THUMB INSTR_CYCLES(4) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BLX_THUMB INSTR_CYCLES(4) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BLX_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_PCREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRSH_REG_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRB_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDRH_IMM_OFF INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_STR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDR_SPREL INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_P_SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_P_SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_M_SP INSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_M_SP JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH_LR INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH_LR INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH_LR INSTR_CYCLES_V | BRANCH_NEVER, //OP_PUSH_LR JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_POP INSTR_CYCLES_V | BRANCH_NEVER, //OP_POP INSTR_CYCLES_V | BRANCH_NEVER, //OP_POP INSTR_CYCLES_V | BRANCH_NEVER, //OP_POP INSTR_CYCLES_V | BRANCH_ALWAYS, //OP_POP_PC INSTR_CYCLES_V | BRANCH_ALWAYS, //OP_POP_PC INSTR_CYCLES_V | BRANCH_ALWAYS, //OP_POP_PC INSTR_CYCLES_V | BRANCH_ALWAYS, //OP_POP_PC JIT_BYPASS, //OP_BKPT_THUMB JIT_BYPASS, //OP_BKPT_THUMB JIT_BYPASS, //OP_BKPT_THUMB JIT_BYPASS, //OP_BKPT_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB JIT_BYPASS, //OP_UND_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_STMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES_V | BRANCH_NEVER, //OP_LDMIA_THUMB INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI_THUMB INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI_THUMB INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI_THUMB INSTR_CYCLES_V | BRANCH_SWI, //OP_SWI_THUMB INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 INSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11 }; #endif desmume-0.9.9/src/cheatSystem.cpp0000644000175000017500000007765412140261633017527 0ustar guillaumeguillaume/* Copyright (C) 2009-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include "cheatSystem.h" #include "NDSSystem.h" #include "mem.h" #include "MMU.h" #include "debug.h" #include "utils/xstring.h" #ifndef _MSC_VER #include #endif CHEATS *cheats = NULL; CHEATSEARCH *cheatSearch = NULL; void CHEATS::clear() { list.resize(0); currentGet = 0; } void CHEATS::init(char *path) { clear(); strcpy((char *)filename, path); load(); } BOOL CHEATS::add(u8 size, u32 address, u32 val, char *description, BOOL enabled) { size_t num = list.size(); list.push_back(CHEATS_LIST()); list[num].code[0][0] = address & 0x00FFFFFF; list[num].code[0][1] = val; list[num].num = 1; list[num].type = 0; list[num].size = size; this->setDescription(description, num); list[num].enabled = enabled; return TRUE; } BOOL CHEATS::update(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos) { if (pos >= list.size()) return FALSE; list[pos].code[0][0] = address & 0x00FFFFFF; list[pos].code[0][1] = val; list[pos].num = 1; list[pos].type = 0; list[pos].size = size; this->setDescription(description, pos); list[pos].enabled = enabled; return TRUE; } void CHEATS::ARparser(CHEATS_LIST& list) { u8 type = 0; u8 subtype = 0; u32 hi = 0; u32 lo = 0; u32 addr = 0; u32 val = 0; // AR temporary vars & flags u32 offset = 0; u32 datareg = 0; u32 loopcount = 0; u32 counter = 0; u32 if_flag = 0; s32 loopbackline = 0; u32 loop_flag = 0; for (int i=0; i < list.num; i++) { type = list.code[i][0] >> 28; subtype = (list.code[i][0] >> 24) & 0x0F; hi = list.code[i][0] & 0x0FFFFFFF; lo = list.code[i][1]; if (if_flag > 0) { if ( (type == 0x0D) && (subtype == 0)) if_flag--; // ENDIF if ( (type == 0x0D) && (subtype == 2)) // NEXT & Flush { if (loop_flag) i = (loopbackline-1); else { offset = 0; datareg = 0; loopcount = 0; counter = 0; if_flag = 0; loop_flag = 0; } } continue; } switch (type) { case 0x00: { if (hi==0) { //manual hook } else if ((hi==0x0000AA99) && (lo==0)) // 0000AA99 00000000 parameter bytes 9..10 for above code (padded with 00s) { //parameter bytes 9..10 for above code (padded with 00s) } else // 0XXXXXXX YYYYYYYY word[XXXXXXX+offset] = YYYYYYYY { addr = hi + offset; _MMU_write32(addr, lo); } } break; case 0x01: // 1XXXXXXX 0000YYYY half[XXXXXXX+offset] = YYYY addr = hi + offset; _MMU_write16(addr, lo); break; case 0x02: // 2XXXXXXX 000000YY byte[XXXXXXX+offset] = YY addr = hi + offset; _MMU_write08(addr, lo); break; case 0x03: // 3XXXXXXX YYYYYYYY IF YYYYYYYY > word[XXXXXXX] ;unsigned if (hi == 0) hi = offset; // V1.54+ val = _MMU_read32(hi); if ( lo > val ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x04: // 4XXXXXXX YYYYYYYY IF YYYYYYYY < word[XXXXXXX] ;unsigned if ((hi == 0x04332211) && (lo == 88776655)) //44332211 88776655 parameter bytes 1..8 for above code (example) { break; } if (hi == 0) hi = offset; // V1.54+ val = _MMU_read32(hi); if ( lo < val ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x05: // 5XXXXXXX YYYYYYYY IF YYYYYYYY = word[XXXXXXX] if (hi == 0) hi = offset; // V1.54+ val = _MMU_read32(hi); if ( lo == val ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x06: // 6XXXXXXX YYYYYYYY IF YYYYYYYY <> word[XXXXXXX] if (hi == 0) hi = offset; // V1.54+ val = _MMU_read32(hi); if ( lo != val ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x07: // 7XXXXXXX ZZZZYYYY IF YYYY > ((not ZZZZ) AND half[XXXXXXX]) if (hi == 0) hi = offset; // V1.54+ val = _MMU_read16(hi); if ( (lo & 0xFFFF) > ( (~(lo >> 16)) & val) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x08: // 8XXXXXXX ZZZZYYYY IF YYYY < ((not ZZZZ) AND half[XXXXXXX]) if (hi == 0) hi = offset; // V1.54+ val = _MMU_read16(hi); if ( (lo & 0xFFFF) < ( (~(lo >> 16)) & val) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x09: // 9XXXXXXX ZZZZYYYY IF YYYY = ((not ZZZZ) AND half[XXXXXXX]) if (hi == 0) hi = offset; // V1.54+ val = _MMU_read16(hi); if ( (lo & 0xFFFF) == ( (~(lo >> 16)) & val) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x0A: // AXXXXXXX ZZZZYYYY IF YYYY <> ((not ZZZZ) AND half[XXXXXXX]) if (hi == 0) hi = offset; // V1.54+ val = _MMU_read16(hi); if ( (lo & 0xFFFF) != ( (~(lo >> 16)) & val) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x0B: // BXXXXXXX 00000000 offset = word[XXXXXXX+offset] addr = hi + offset; offset = _MMU_read32(addr);; break; case 0x0C: switch (subtype) { case 0x0: // C0000000 YYYYYYYY FOR loopcount=0 to YYYYYYYY ;execute Y+1 times if (loopcount < (lo+1)) loop_flag = 1; else loop_flag = 0; loopcount++; loopbackline = i; break; case 0x4: // C4000000 00000000 offset = address of the C4000000 code ; V1.54 printf("AR: untested code C4\n"); break; case 0x5: // C5000000 XXXXYYYY counter=counter+1, IF (counter AND YYYY) = XXXX ; V1.54 counter++; if ( (counter & (lo & 0xFFFF)) == ((lo >> 8) & 0xFFFF) ) { if (if_flag > 0) if_flag--; } else { if_flag++; } break; case 0x6: // C6000000 XXXXXXXX [XXXXXXXX]=offset ; V1.54 _MMU_write32(lo, offset); break; } break; case 0x0D: { switch (subtype) { case 0x0: // D0000000 00000000 ENDIF break; case 0x1: // D1000000 00000000 NEXT loopcount if (loop_flag) i = (loopbackline-1); break; case 0x2: // D2000000 00000000 NEXT loopcount, and then FLUSH everything if (loop_flag) i = (loopbackline-1); else { offset = 0; datareg = 0; loopcount = 0; counter = 0; if_flag = 0; loop_flag = 0; } break; case 0x3: // D3000000 XXXXXXXX offset = XXXXXXXX offset = lo; break; case 0x4: // D4000000 XXXXXXXX datareg = datareg + XXXXXXXX datareg += lo; break; case 0x5: // D5000000 XXXXXXXX datareg = XXXXXXXX datareg = lo; break; case 0x6: // D6000000 XXXXXXXX word[XXXXXXXX+offset]=datareg, offset=offset+4 addr = lo + offset; _MMU_write32(addr, datareg); offset += 4; break; case 0x7: // D7000000 XXXXXXXX half[XXXXXXXX+offset]=datareg, offset=offset+2 addr = lo + offset; _MMU_write16(addr, datareg); offset += 2; break; case 0x8: // D8000000 XXXXXXXX byte[XXXXXXXX+offset]=datareg, offset=offset+1 addr = lo + offset; _MMU_write08(addr, datareg); offset += 1; break; case 0x9: // D9000000 XXXXXXXX datareg = word[XXXXXXXX+offset] addr = lo + offset; datareg = _MMU_read32(addr); break; case 0xA: // DA000000 XXXXXXXX datareg = half[XXXXXXXX+offset] addr = lo + offset; datareg = _MMU_read16(addr); break; case 0xB: // DB000000 XXXXXXXX datareg = byte[XXXXXXXX+offset] ;bugged on pre-v1.54 addr = lo + offset; datareg = _MMU_read08(addr); break; case 0xC: // DC000000 XXXXXXXX offset = offset + XXXXXXXX offset += lo; break; } } break; case 0xE: // EXXXXXXX YYYYYYYY Copy YYYYYYYY parameter bytes to [XXXXXXXX+offset...] { u8 *tmp_code = (u8*)(list.code[i+1]); u32 addr = hi+offset; u32 maxByteReadLocation = ((2 * 4) * (MAX_XX_CODE - i - 1)) - 1; // 2 = 2 array dimensions, 4 = 4 bytes per array element if (lo <= maxByteReadLocation) { for (u32 t = 0; t < lo; t++) { u8 tmp = tmp_code[t]; _MMU_write08(addr, tmp); addr++; } } i += (lo / 8); } break; case 0xF: // FXXXXXXX YYYYYYYY Copy YYYYYYYY bytes from [offset..] to [XXXXXXX...] for (u32 t = 0; t < lo; t++) { u8 tmp = _MMU_read08(offset+t); _MMU_write08(hi+t, tmp); } break; default: PROGINFO("AR: ERROR uknown command 0x%2X at %08X:%08X\n", type, hi, lo); break; } } } BOOL CHEATS::add_AR_Direct(CHEATS_LIST cheat) { size_t num = list.size(); list.push_back(cheat); list[num].type = 1; return TRUE; } BOOL CHEATS::add_AR(char *code, char *description, BOOL enabled) { //if (num == MAX_CHEAT_LIST) return FALSE; size_t num = list.size(); CHEATS_LIST temp; if (!CHEATS::XXCodeFromString(&temp, code)) return FALSE; list.push_back(temp); list[num].type = 1; this->setDescription(description, num); list[num].enabled = enabled; return TRUE; } BOOL CHEATS::update_AR(char *code, char *description, BOOL enabled, u32 pos) { if (pos >= list.size()) return FALSE; if (code != NULL) { if (!CHEATS::XXCodeFromString(this->getItemByIndex(pos), code)) return FALSE; this->setDescription(description, pos); list[pos].type = 1; } list[pos].enabled = enabled; return TRUE; } BOOL CHEATS::add_CB(char *code, char *description, BOOL enabled) { //if (num == MAX_CHEAT_LIST) return FALSE; size_t num = list.size(); if (!CHEATS::XXCodeFromString(this->getItemByIndex(num), code)) return FALSE; list[num].type = 2; this->setDescription(description, num); list[num].enabled = enabled; return TRUE; } BOOL CHEATS::update_CB(char *code, char *description, BOOL enabled, u32 pos) { if (pos >= list.size()) return FALSE; if (code != NULL) { if (!CHEATS::XXCodeFromString(this->getItemByIndex(pos), code)) return FALSE; list[pos].type = 2; this->setDescription(description, pos); } list[pos].enabled = enabled; return TRUE; } BOOL CHEATS::remove(u32 pos) { if (pos >= list.size()) return FALSE; if (list.size() == 0) return FALSE; list.erase(list.begin()+pos); return TRUE; } void CHEATS::getListReset() { currentGet = 0; return; } BOOL CHEATS::getList(CHEATS_LIST *cheat) { BOOL result = FALSE; if (currentGet >= this->list.size()) { this->getListReset(); return result; } result = this->get(cheat, currentGet++); return result; } CHEATS_LIST* CHEATS::getListPtr() { return &this->list[0]; } BOOL CHEATS::get(CHEATS_LIST *cheat, u32 pos) { CHEATS_LIST *item = this->getItemByIndex(pos); if (item == NULL) { return FALSE; } *cheat = *item; return TRUE; } CHEATS_LIST* CHEATS::getItemByIndex(const u32 pos) { if (pos >= this->getSize()) { return NULL; } return &this->list[pos]; } u32 CHEATS::getSize() { return list.size(); } void CHEATS::setDescription(const char *description, u32 pos) { strncpy(list[pos].description, description, sizeof(list[pos].description)); list[pos].description[sizeof(list[pos].description) - 1] = '\0'; } BOOL CHEATS::save() { const char *types[] = {"DS", "AR", "CB"}; std::string cheatLineStr = ""; FILE *flist = fopen((char *)filename, "w"); if (flist) { fprintf(flist, "; DeSmuME cheats file. VERSION %i.%03i\n", CHEAT_VERSION_MAJOR, CHEAT_VERSION_MINOR); fprintf(flist, "Name=%s\n", gameInfo.ROMname); fprintf(flist, "Serial=%s\n", gameInfo.ROMserial); fputs("\n; cheats list\n", flist); for (size_t i = 0; i < list.size(); i++) { if (list[i].num == 0) continue; char buf1[8] = {0}; sprintf(buf1, "%s %c ", types[list[i].type], list[i].enabled?'1':'0'); cheatLineStr = buf1; for (int t = 0; t < list[i].num; t++) { char buf2[10] = { 0 }; u32 adr = list[i].code[t][0]; if (list[i].type == 0) { //size of the cheat is written out as adr highest nybble adr &= 0x0FFFFFFF; adr |= (list[i].size << 28); } sprintf(buf2, "%08X", adr); cheatLineStr += buf2; sprintf(buf2, "%08X", list[i].code[t][1]); cheatLineStr += buf2; if (t < (list[i].num - 1)) cheatLineStr += ","; } cheatLineStr += " ;"; cheatLineStr += trim(list[i].description); fprintf(flist, "%s\n", cheatLineStr.c_str()); } fputs("\n", flist); fclose(flist); return TRUE; } return FALSE; } char *CHEATS::clearCode(char *s) { char *buf = s; if (!s) return NULL; if (!*s) return s; for (u32 i = 0; i < strlen(s); i++) { if (s[i] == ';') break; if (strchr(hexValid, s[i])) { *buf = s[i]; buf++; } } *buf = 0; return s; } BOOL CHEATS::load() { FILE *flist = fopen((char *)filename, "r"); if (flist == NULL) { return FALSE; } size_t readSize = (MAX_XX_CODE * 17) + sizeof(list[0].description) + 7; if (readSize < CHEAT_FILE_MIN_FGETS_BUFFER) { readSize = CHEAT_FILE_MIN_FGETS_BUFFER; } char *buf = (char *)malloc(readSize); if (buf == NULL) { fclose(flist); return FALSE; } readSize *= sizeof(*buf); std::string codeStr = ""; u32 last = 0; u32 line = 0; INFO("Load cheats: %s\n", filename); clear(); last = 0; line = 0; while (!feof(flist)) { CHEATS_LIST tmp_cht; line++; // only for debug memset(buf, 0, readSize); if (fgets(buf, readSize, flist) == NULL) { //INFO("Cheats: Failed to read from flist at line %i\n", line); continue; } trim(buf); if ((strlen(buf) == 0) || (buf[0] == ';')) continue; if(!strncasecmp(buf,"name=",5)) continue; if(!strncasecmp(buf,"serial=",7)) continue; memset(&tmp_cht, 0, sizeof(tmp_cht)); if ((buf[0] == 'D') && (buf[1] == 'S')) // internal tmp_cht.type = 0; else if ((buf[0] == 'A') && (buf[1] == 'R')) // Action Replay tmp_cht.type = 1; else if ((buf[0] == 'B') && (buf[1] == 'S')) // Codebreaker tmp_cht.type = 2; else continue; // TODO: CB not supported if (tmp_cht.type == 3) { INFO("Cheats: Codebreaker code no supported at line %i\n", line); continue; } codeStr = (char *)(buf + 5); codeStr = clearCode((char *)codeStr.c_str()); if (codeStr.empty() || (codeStr.length() % 16 != 0)) { INFO("Cheats: Syntax error at line %i\n", line); continue; } tmp_cht.enabled = (buf[3] == '0')?FALSE:TRUE; u32 descr_pos = (u32)(std::max(strchr((char*)buf, ';') - buf, 0)); if (descr_pos != 0) { strncpy(tmp_cht.description, (buf + descr_pos + 1), sizeof(tmp_cht.description)); tmp_cht.description[sizeof(tmp_cht.description) - 1] = '\0'; } tmp_cht.num = codeStr.length() / 16; if ((tmp_cht.type == 0) && (tmp_cht.num > 1)) { INFO("Cheats: Too many values for internal cheat\n", line); continue; } for (int i = 0; i < tmp_cht.num; i++) { char tmp_buf[9] = {0}; strncpy(tmp_buf, &codeStr[i * 16], 8); sscanf_s(tmp_buf, "%x", &tmp_cht.code[i][0]); if (tmp_cht.type == 0) { tmp_cht.size = std::min(3, ((tmp_cht.code[i][0] & 0xF0000000) >> 28)); tmp_cht.code[i][0] &= 0x00FFFFFF; } strncpy(tmp_buf, &codeStr[(i * 16) + 8], 8); sscanf_s(tmp_buf, "%x", &tmp_cht.code[i][1]); } list.push_back(tmp_cht); last++; } free(buf); buf = NULL; fclose(flist); INFO("Added %i cheat codes\n", list.size()); return TRUE; } void CHEATS::process() { if (CommonSettings.cheatsDisable) return; if (list.size() == 0) return; size_t num = list.size(); for (size_t i = 0; i < num; i++) { if (!list[i].enabled) continue; switch (list[i].type) { case 0: // internal cheat system { //INFO("list at 0x02|%06X value %i (size %i)\n",list[i].code[0], list[i].lo[0], list[i].size); u32 addr = list[i].code[0][0] | 0x02000000; u32 val = list[i].code[0][1]; switch (list[i].size) { case 0: _MMU_write08(addr,val); break; case 1: _MMU_write16(addr,val); break; case 2: { u32 tmp = _MMU_read32(addr); tmp &= 0xFF000000; tmp |= (val & 0x00FFFFFF); _MMU_write32(addr,tmp); break; } case 3: _MMU_write32(addr,val); break; } break; } //end case 0 internal cheat system case 1: // Action Replay ARparser(list[i]); break; case 2: // Codebreaker break; default: continue; } } } void CHEATS::getXXcodeString(CHEATS_LIST list, char *res_buf) { char buf[50] = { 0 }; for (int i=0; i < list.num; i++) { sprintf(buf, "%08X %08X\n", list.code[i][0], list.code[i][1]); strcat(res_buf, buf); } } BOOL CHEATS::XXCodeFromString(CHEATS_LIST *cheatItem, const std::string codeString) { return CHEATS::XXCodeFromString(cheatItem, codeString.c_str()); } BOOL CHEATS::XXCodeFromString(CHEATS_LIST *cheatItem, const char *codeString) { BOOL result = FALSE; if (cheatItem == NULL || codeString == NULL) { return result; } int count = 0; u16 t = 0; char tmp_buf[sizeof(cheatItem->code) * 2 + 1]; memset(tmp_buf, 0, sizeof(tmp_buf)); size_t code_len = strlen(codeString); // remove wrong chars for (size_t i=0; i < code_len; i++) { char c = codeString[i]; //apparently 100% of pokemon codes were typed with the letter O in place of zero in some places //so let's try to adjust for that here static const char *AR_Valid = "Oo0123456789ABCDEFabcdef"; if (strchr(AR_Valid, c)) { if(c=='o' || c=='O') c='0'; tmp_buf[t++] = c; } } size_t len = strlen(tmp_buf); if ((len % 16) != 0) return result; // error // TODO: syntax check count = (len / 16); for (int i=0; i < count; i++) { char buf[9] = {0}; memcpy(buf, tmp_buf+(i*16), 8); sscanf(buf, "%x", &cheatItem->code[i][0]); memcpy(buf, tmp_buf+(i*16) + 8, 8); sscanf(buf, "%x", &cheatItem->code[i][1]); } cheatItem->num = count; cheatItem->size = 0; result = TRUE; return result; } // ========================================== search BOOL CHEATSEARCH::start(u8 type, u8 size, u8 sign) { if (statMem) return FALSE; if (mem) return FALSE; statMem = new u8 [ ( 4 * 1024 * 1024 ) / 8 ]; memset(statMem, 0xFF, ( 4 * 1024 * 1024 ) / 8); // comparative search type (need 8Mb RAM !!! (4+4)) mem = new u8 [ ( 4 * 1024 * 1024 ) ]; memcpy(mem, MMU.MMU_MEM[0][0x20], ( 4 * 1024 * 1024 ) ); _type = type; _size = size; _sign = sign; amount = 0; lastRecord = 0; //INFO("Cheat search system is inited (type %s)\n", type?"comparative":"exact"); return TRUE; } BOOL CHEATSEARCH::close() { if (statMem) { delete [] statMem; statMem = NULL; } if (mem) { delete [] mem; mem = NULL; } amount = 0; lastRecord = 0; //INFO("Cheat search system is closed\n"); return FALSE; } u32 CHEATSEARCH::search(u32 val) { amount = 0; switch (_size) { case 0: // 1 byte for (u32 i = 0; i < (4 * 1024 * 1024); i++) { u32 addr = (i >> 3); u32 offs = (i % 8); if (statMem[addr] & (1<> 3); u32 offs = (i % 8); if (statMem[addr] & (3<> 3); u32 offs = (i % 8); if (statMem[addr] & (0x7<> 3); u32 offs = (i % 8); if (statMem[addr] & (0xF<> 3); u32 offs = (i % 8); if (statMem[addr] & (1< T1ReadByte(mem, i)); break; case 1: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadByte(mem, i)); break; case 2: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadByte(mem, i)); break; case 3: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadByte(mem, i)); break; default: res = FALSE; break; } if ( res ) { statMem[addr] |= (1<> 3); u32 offs = (i % 8); if (statMem[addr] & (3< T1ReadWord(mem, i)); break; case 1: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadWord(mem, i)); break; case 2: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadWord(mem, i)); break; case 3: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadWord(mem, i)); break; default: res = FALSE; break; } if ( res ) { statMem[addr] |= (3<> 3); u32 offs = (i % 8); if (statMem[addr] & (7< (T1ReadLong(mem, i) & 0x00FFFFFF) ); break; case 1: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) < (T1ReadLong(mem, i) & 0x00FFFFFF) ); break; case 2: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) == (T1ReadLong(mem, i) & 0x00FFFFFF) ); break; case 3: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) != (T1ReadLong(mem, i) & 0x00FFFFFF) ); break; default: res = FALSE; break; } if ( res ) { statMem[addr] |= (7<> 3); u32 offs = (i % 8); if (statMem[addr] & (0xF< T1ReadLong(mem, i)); break; case 1: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadLong(mem, i)); break; case 2: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadLong(mem, i)); break; case 3: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadLong(mem, i)); break; default: res = FALSE; break; } if ( res ) { statMem[addr] |= (0xF<> 3); u32 offs = (i % 8); if (statMem[addr] & (stepMem<> j; key = 0x0000; if (BIT_N(x, 23)) key |= 0x8000; if (BIT_N(k, 22)) key |= 0x4000; if (BIT_N(k, 21)) key |= 0x2000; if (BIT_N(k, 20)) key |= 0x1000; if (BIT_N(k, 19)) key |= 0x0800; if (BIT_N(k, 18)) key |= 0x0400; if (BIT_N(k, 17) != BIT_N(x, 31)) key |= 0x0200; if (BIT_N(k, 16) != BIT_N(x, 30)) key |= 0x0100; if (BIT_N(k, 30) != BIT_N(k, 29)) key |= 0x0080; if (BIT_N(k, 29) != BIT_N(k, 28)) key |= 0x0040; if (BIT_N(k, 28) != BIT_N(k, 27)) key |= 0x0020; if (BIT_N(k, 27) != BIT_N(k, 26)) key |= 0x0010; if (BIT_N(k, 26) != BIT_N(k, 25)) key |= 0x0008; if (BIT_N(k, 25) != BIT_N(k, 24)) key |= 0x0004; if (BIT_N(k, 25) != BIT_N(x, 26)) key |= 0x0002; if (BIT_N(k, 24) != BIT_N(x, 25)) key |= 0x0001; buf[i] ^= _xor; } buf+= 512; r += 512; n += 1; } } bool CHEATSEXPORT::load(char *path) { error = 0; fp = fopen(path, "rb"); if (!fp) { printf("Error open database\n"); error = 1; return false; } const char *headerID = "R4 CheatCode"; char buf[255] = {0}; fread(buf, 1, strlen(headerID), fp); if (strncmp(buf, headerID, strlen(headerID)) != 0) { // check encrypted R4decrypt((u8 *)buf, strlen(headerID), 0); if (strcmp(buf, headerID) != 0) { error = 2; return false; } encrypted = true; } fseek(fp, 0, SEEK_END); fsize = ftell(fp); fseek(fp, 0, SEEK_SET); if (!search()) { printf("ERROR: cheat in database not found\n"); error = 3; return false; } if (!getCodes()) { printf("ERROR: export cheats failed\n"); error = 4; return false; } return true; } void CHEATSEXPORT::close() { if (fp) fclose(fp); if (cheats) { delete [] cheats; cheats = NULL; } } bool CHEATSEXPORT::search() { if (!fp) return false; u32 pos = 0x0100; FAT_R4 fat_tmp = {0}; u8 buf[512] = {0}; CRC = 0; encOffset = 0; u32 t = 0; memset(date, 0, sizeof(date)); if (encrypted) { fseek(fp, 0, SEEK_SET); fread(&buf[0], 1, 512, fp); R4decrypt((u8 *)&buf[0], 512, 0); memcpy(&date[0], &buf[0x10], 16); } else { fseek(fp, 0x10, SEEK_SET); fread(&date, 16, 1, fp); fseek(fp, pos, SEEK_SET); fread(&fat_tmp, sizeof(fat), 1, fp); } while (1) { if (encrypted) { memcpy(&fat, &buf[pos % 512], sizeof(fat)); pos += sizeof(fat); if ((pos>>9) > t) { t++; fread(&buf[0], 1, 512, fp); R4decrypt((u8 *)&buf[0], 512, t); } memcpy(&fat_tmp, &buf[pos % 512], sizeof(fat_tmp)); // next } else { memcpy(&fat, &fat_tmp, sizeof(fat)); fread(&fat_tmp, sizeof(fat_tmp), 1, fp); } //printf("serial: %s, offset %08X\n", fat.serial, fat.addr); if (memcmp(gameInfo.header.gameCode, &fat.serial[0], 4) == 0) { dataSize = fat_tmp.addr?(fat_tmp.addr - fat.addr):0; if (encrypted) { encOffset = fat.addr % 512; dataSize += encOffset; } if (!dataSize) return false; CRC = fat.CRC; char buf[5] = {0}; memcpy(&buf, &fat.serial[0], 4); printf("Cheats: found %s CRC %08X at 0x%08llX, size %i byte(s)\n", buf, fat.CRC, fat.addr, dataSize - encOffset); return true; } if (fat.addr == 0) break; } memset(&fat, 0, sizeof(FAT_R4)); return false; } bool CHEATSEXPORT::getCodes() { if (!fp) return false; u32 pos = 0; u32 pos_cht = 0; u8 *data = new u8 [dataSize+8]; if (!data) return false; memset(data, 0, dataSize+8); fseek(fp, fat.addr - encOffset, SEEK_SET); if (fread(data, 1, dataSize, fp) != dataSize) { delete [] data; data = NULL; return false; } if (encrypted) R4decrypt(data, dataSize, fat.addr >> 9); intptr_t ptrMask = (~0 << 2); u8 *gameTitlePtr = (u8 *)data + encOffset; memset(gametitle, 0, CHEAT_DB_GAME_TITLE_SIZE); memcpy(gametitle, gameTitlePtr, strlen((const char *)gameTitlePtr)); u32 *cmd = (u32 *)(((intptr_t)gameTitlePtr + strlen((const char *)gameTitlePtr) + 4) & ptrMask); numCheats = cmd[0] & 0x0FFFFFFF; cmd += 9; cheats = new CHEATS_LIST[numCheats]; memset(cheats, 0, sizeof(CHEATS_LIST) * numCheats); while (pos < numCheats) { u32 folderNum = 1; u8 *folderName = NULL; u8 *folderNote = NULL; if ((*cmd & 0xF0000000) == 0x10000000) // Folder { folderNum = (*cmd & 0x00FFFFFF); folderName = (u8*)((intptr_t)cmd + 4); folderNote = (u8*)((intptr_t)folderName + strlen((char*)folderName) + 1); pos++; cmd = (u32 *)(((intptr_t)folderName + strlen((char*)folderName) + 1 + strlen((char*)folderNote) + 1 + 3) & ptrMask); } for (u32 i = 0; i < folderNum; i++) // in folder { u8 *cheatName = (u8 *)((intptr_t)cmd + 4); u8 *cheatNote = (u8 *)((intptr_t)cheatName + strlen((char*)cheatName) + 1); u32 *cheatData = (u32 *)(((intptr_t)cheatNote + strlen((char*)cheatNote) + 1 + 3) & ptrMask); u32 cheatDataLen = *cheatData++; u32 numberCodes = cheatDataLen / 2; if (numberCodes <= MAX_XX_CODE) { std::string descriptionStr = ""; if ( folderName && *folderName ) { descriptionStr += (char *)folderName; descriptionStr += ": "; } descriptionStr += (char *)cheatName; if ( cheatNote && *cheatNote ) { descriptionStr += " | "; descriptionStr += (char *)cheatNote; } strncpy(cheats[pos_cht].description, descriptionStr.c_str(), sizeof(cheats[pos_cht].description)); cheats[pos_cht].description[sizeof(cheats[pos_cht].description) - 1] = '\0'; cheats[pos_cht].num = numberCodes; cheats[pos_cht].type = 1; for(u32 j = 0, t = 0; j < numberCodes; j++, t+=2 ) { cheats[pos_cht].code[j][0] = (u32)*(cheatData+t); //printf("%i: %08X ", j, cheats[pos_cht].code[j][0]); cheats[pos_cht].code[j][1] = (u32)*(cheatData+t+1); //printf("%08X\n", cheats[pos_cht].code[j][1]); } pos_cht++; } pos++; cmd = (u32 *)((intptr_t)cmd + ((*cmd + 1)*4)); } }; delete [] data; numCheats = pos_cht; //for (int i = 0; i < numCheats; i++) // printf("%i: %s\n", i, cheats[i].description); return true; } CHEATS_LIST *CHEATSEXPORT::getCheats() { return cheats; } u32 CHEATSEXPORT::getCheatsNum() { return numCheats; } desmume-0.9.9/src/rasterize.h0000644000175000017500000000411312140261633016667 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _RASTERIZE_H_ #define _RASTERIZE_H_ #include "render3D.h" #include "gfx3d.h" extern GPU3DInterface gpu3DRasterize; union FragmentColor { u32 color; struct { u8 r,g,b,a; }; }; inline FragmentColor MakeFragmentColor(u8 r, u8 g,u8 b,u8 a) { FragmentColor ret; ret.r = r; ret.g = g; ret.b = b; ret.a = a; return ret; } struct Fragment { u32 depth; struct { u8 opaque, translucent; } polyid; u8 stencil; struct { u8 isTranslucentPoly:1; u8 fogged:1; }; }; class TexCacheItem; class SoftRasterizerEngine { public: //debug: int _debug_drawClippedUserPoly; SoftRasterizerEngine(); void initFramebuffer(const int width, const int height, const bool clearImage); void framebufferProcess(); void updateToonTable(); void updateFogTable(); void updateFloatColors(); void performClipping(bool hirez); template void performViewportTransforms(int width, int height); void performCoordAdjustment(const bool skipBackfacing); void performBackfaceTests(); void setupTextures(const bool skipBackfacing); FragmentColor toonTable[32]; u8 fogTable[32768]; GFX3D_Clipper clipper; GFX3D_Clipper::TClippedPoly *clippedPolys; int clippedPolyCounter; TexCacheItem* polyTexKeys[POLYLIST_SIZE]; bool polyVisible[POLYLIST_SIZE]; bool polyBackfacing[POLYLIST_SIZE]; Fragment *screen; FragmentColor *screenColor; POLYLIST* polylist; VERTLIST* vertlist; INDEXLIST* indexlist; int width, height; }; #endif desmume-0.9.9/src/addons.cpp0000644000175000017500000000357512140261633016475 0ustar guillaumeguillaume/* Copyright (C) 2009-2012 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "addons.h" #include //this is the currently-configured cflash mode ADDON_CFLASH_MODE CFlash_Mode; //this is the currently-configured path (directory or filename) for cflash. //it should be viewed as a parameter for the above. std::string CFlash_Path; char GBAgameName[MAX_PATH]; extern ADDONINTERFACE addonNone; extern ADDONINTERFACE addonCFlash; extern ADDONINTERFACE addonRumblePak; extern ADDONINTERFACE addonGBAgame; extern ADDONINTERFACE addonGuitarGrip; extern ADDONINTERFACE addonExpMemory; extern ADDONINTERFACE addonPiano; extern ADDONINTERFACE addonPaddle; //extern ADDONINTERFACE addonExternalMic; ADDONINTERFACE addonList[NDS_ADDON_COUNT] = { addonNone, addonCFlash, addonRumblePak, addonGBAgame, addonGuitarGrip, addonExpMemory, addonPiano, addonPaddle }; ADDONINTERFACE addon = addonCFlash; // default none pak NDS_ADDON_TYPE addon_type = NDS_ADDON_CFLASH; BOOL addonsInit() { return addon.init(); } void addonsClose() { addon.close(); } void addonsReset() { addon.reset(); } BOOL addonsChangePak(NDS_ADDON_TYPE type) { if (type > NDS_ADDON_COUNT) return FALSE; addon.close(); addon = addonList[type]; addon_type = type; printf("Slot 2: %s\n", addon.name); return addon.init(); } desmume-0.9.9/src/mic_alsa.cpp0000644000175000017500000001032612140261633016765 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include #include #include "types.h" #include "mic.h" #include "debug.h" #include "readwrite.h" #include "emufile.h" #define MIC_BUFSIZE 4096 BOOL Mic_Inited = FALSE; u8 Mic_Buffer[2][MIC_BUFSIZE]; u16 Mic_BufPos; u8 Mic_PlayBuf; u8 Mic_WriteBuf; int MicButtonPressed; /* Alsa stuff */ static snd_pcm_t *pcm_handle; BOOL Mic_Init() { snd_pcm_hw_params_t *hwparams; snd_pcm_uframes_t mic_bufsize, periods; int err; if (Mic_Inited) return TRUE; if ((err = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { g_printerr("Failed to open device: %s\n", snd_strerror(err)); return FALSE; } /* Hardware params */ snd_pcm_hw_params_alloca(&hwparams); if ((err = snd_pcm_hw_params_any(pcm_handle, hwparams)) < 0) { g_printerr("Failed to setup hw parameters: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { g_printerr("Failed to set access: %s\n", snd_strerror(err)); return FALSE; } /* 8bit signed, mono, 16000hz */ if ((err = snd_pcm_hw_params_set_format(pcm_handle, hwparams, SND_PCM_FORMAT_S8)) < 0) { g_printerr("Failed to set format: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 1)) < 0) { g_printerr("Failed to set channels: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params_set_rate(pcm_handle, hwparams, 16000, 0)) < 0) { g_printerr("Failed to set rate: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params(pcm_handle, hwparams)) < 0) { g_printerr("Failed to set hw parameters: %s\n", snd_strerror(err)); return FALSE; } /* Query the driver for buffer and period sizes */ if ((err = snd_pcm_hw_params_get_buffer_size(hwparams, &mic_bufsize)) < 0) { g_printerr("Failed to get buffer size: %s\n", snd_strerror(err)); return FALSE; } if ((err = snd_pcm_hw_params_get_period_size(hwparams, &periods, 0)) < 0) { g_printerr("Failed to get period size: %s\n", snd_strerror(err)); return FALSE; } Mic_Inited = TRUE; Mic_Reset(); return TRUE; } void Mic_Reset() { if (!Mic_Inited) return; memset(Mic_Buffer, 0, MIC_BUFSIZE * 2); Mic_BufPos = 0; Mic_PlayBuf = 1; Mic_WriteBuf = 0; } void Mic_DeInit() { if (!Mic_Inited) return; Mic_Inited = FALSE; snd_pcm_drop(pcm_handle); snd_pcm_close(pcm_handle); } static void snd_pcm_read() { int error; error = snd_pcm_readi(pcm_handle, Mic_Buffer[Mic_WriteBuf], MIC_BUFSIZE); if (error < 0) error = snd_pcm_recover(pcm_handle, error, 0); if (error < 0) LOG("snd_pcm_readi FAIL!: %s\n", snd_strerror(error)); } u8 Mic_ReadSample() { u8 tmp; u8 ret; if (!Mic_Inited) return 0; tmp = Mic_Buffer[Mic_PlayBuf][Mic_BufPos >> 1]; if (Mic_BufPos & 0x1) { ret = ((tmp & 0x1) << 7); } else { ret = ((tmp & 0xFE) >> 1); snd_pcm_read(); } Mic_BufPos++; if (Mic_BufPos >= (MIC_BUFSIZE << 1)) { snd_pcm_read(); Mic_BufPos = 0; Mic_PlayBuf ^= 1; Mic_WriteBuf ^= 1; } return ret; } /* FIXME: stub! */ void mic_savestate(EMUFILE* os) { write32le((u32)(-1),os); } bool mic_loadstate(EMUFILE* is, int size) { is->fseek(size, SEEK_CUR); return TRUE; } desmume-0.9.9/src/fs-linux.cpp0000644000175000017500000000504312140261633016762 0ustar guillaumeguillaume/* Copyright (C) 2006 Guillaume Duhamel This file is part of DeSmuME DeSmuME 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. DeSmuME 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 DeSmuME; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "fs.h" #include #include #include #include #include #include typedef struct { DIR * dir; char * path; } FsLinuxDir; const char FS_SEPARATOR = '/'; void * FsReadFirst(const char * path, FsEntry * entry) { FsLinuxDir * dir; struct dirent * e; struct stat s; char buffer[512+1]; /* DirSpec[256] + '/' + dirent.d_name[256] */ DIR * tmp; dir = (FsLinuxDir*)malloc(sizeof(FsLinuxDir)); if (!dir) return NULL; tmp = opendir(path); if (!tmp) { free(dir); return NULL; } dir->dir = tmp; e = readdir(tmp); if (!e) { closedir(tmp); free(dir); return NULL; } strcpy(entry->cFileName, e->d_name); // there's no 8.3 file names support on linux :) strcpy(entry->cAlternateFileName, ""); entry->flags = 0; dir->path = strdup(path); sprintf(buffer, "%s/%s", dir->path, e->d_name); stat(buffer, &s); if (S_ISDIR(s.st_mode)) { entry->flags = FS_IS_DIR; entry->fileSize = 0; } else { entry->fileSize = s.st_size; } return dir; } int FsReadNext(void * search, FsEntry * entry) { FsLinuxDir * dir = (FsLinuxDir*)search; struct dirent * e; struct stat s; char buffer[1024]; e = readdir(dir->dir); if (!e) return 0; strcpy(entry->cFileName, e->d_name); // there's no 8.3 file names support on linux :) strcpy(entry->cAlternateFileName, ""); entry->flags = 0; sprintf(buffer, "%s/%s", dir->path, e->d_name); stat(buffer, &s); if (S_ISDIR(s.st_mode)) { entry->flags = FS_IS_DIR; entry->fileSize = 0; } else { entry->fileSize = s.st_size; } return 1; } void FsClose(void * search) { FsLinuxDir *linuxdir = (FsLinuxDir *) search; DIR * dir = linuxdir->dir; closedir(dir); free(linuxdir->path); free(search); } int FsError(void) { return 0; } desmume-0.9.9/src/driver.cpp0000644000175000017500000001370112140261633016510 0ustar guillaumeguillaume/* Copyright (C) 2009-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "types.h" #include "driver.h" #include "rasterize.h" #include "gfx3d.h" #include "texcache.h" #ifdef HAVE_WX #include "wx/wxprec.h" #include "wx/wx.h" #include "wxdlg/wxdlg3dViewer.h" const int kViewportWidth = 256; const int kViewportHeight = 192; static SoftRasterizerEngine engine; static Fragment _screen[kViewportWidth*kViewportHeight]; static FragmentColor _screenColor[kViewportWidth*kViewportHeight]; extern void _HACK_Viewer_ExecUnit(SoftRasterizerEngine* engine); class Mywxdlg3dViewer : public wxdlg3dViewer { public: Mywxdlg3dViewer() : wxdlg3dViewer(NULL) {} virtual void RepaintPanel() { Refresh(false); Update(); } void NewFrame() { listPolys->SetItemCount(viewer3d_state->polylist.count); labelFrameCounter->SetLabel(wxString::Format(wxT("Frame: %d"),viewer3d_state->frameNumber)); labelUserPolycount->SetLabel(wxString::Format(wxT("User Polys: %d"),viewer3d_state->polylist.count)); labelFinalPolycount->SetLabel(wxString::Format(wxT("Final Polys: %d"),viewer3d_state->polylist.count)); //tree->DeleteAllItems(); //tree->Freeze(); //wxTreeItemId root = tree->AddRoot(""); //for(int i=0;ipolylist.count;i++) //{ // tree->AppendItem(root,"hai kirin"); //} //tree->Thaw(); } virtual wxString OnGetItemText(const wxListCtrl* list, long item, long column) const { return wxT("hi"); } virtual void OnListPolysSelected( wxListEvent& event ) { panelTexture->Refresh(false); engine._debug_drawClippedUserPoly = GetSelectedListviewItem(listPolys); } void RedrawPanel(wxClientDC* dc) { //------------ //do the 3d work.. engine.polylist = &viewer3d_state->polylist; engine.vertlist = &viewer3d_state->vertlist; engine.indexlist = &viewer3d_state->indexlist; engine.screen = _screen; engine.screenColor = _screenColor; engine.width = kViewportWidth; engine.height = kViewportHeight; engine.updateFogTable(); engine.initFramebuffer(kViewportWidth,kViewportHeight,gfx3d.state.enableClearImage?true:false); engine.updateToonTable(); engine.updateFloatColors(); engine.performClipping(checkMaterialInterpolate->IsChecked()); engine.performViewportTransforms(kViewportWidth,kViewportHeight); engine.performBackfaceTests(); engine.performCoordAdjustment(false); engine.setupTextures(false); _HACK_Viewer_ExecUnit(&engine); //------------ //dc.SetBackground(*wxGREEN_BRUSH); dc.Clear(); u8 framebuffer[kViewportWidth*kViewportHeight*3]; for(int y=0,i=0;yDrawBitmap(bitmap,0,0); } virtual void _OnPaintPanel( wxPaintEvent& event ) { wxClientDC dc(wxDynamicCast(event.GetEventObject(), wxWindow)); RedrawPanel(&dc); } int GetSelectedListviewItem(wxListCtrl* list) { return list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); } virtual void OnPaintPanelTexture( wxPaintEvent& event ) { wxPaintDC dc(wxDynamicCast(event.GetEventObject(), wxWindow)); dc.SetBackground(*wxBLACK_BRUSH); dc.Clear(); int selection = GetSelectedListviewItem(listPolys); if(selection < 0) return; if(selection>=viewer3d_state->polylist.count) return; POLY& poly = viewer3d_state->polylist.list[selection]; TexCacheItem* texkey = TexCache_SetTexture(TexFormat_32bpp,poly.texParam,poly.texPalette); const u32 w = texkey->sizeX; const u32 h = texkey->sizeY; u8* const bmpdata = new u8[w*h*4]; for(u32 i=0;idecoded[i*4]; bmpdata[i*3+1] = texkey->decoded[i*4+1]; bmpdata[i*3+2] = texkey->decoded[i*4+2]; } for(u32 i=0;idecoded[i*4+3]; wxImage image(w,h,false); image.InitAlpha(); image.SetData(bmpdata,true); image.SetAlpha(bmpdata+w*h*3,true); wxBitmap bitmap(image); double xscale = (double)panelTexture->GetSize().x / w; double yscale = (double)panelTexture->GetSize().y / h; dc.SetUserScale(xscale,yscale); dc.DrawBitmap(bitmap,0,0); delete[] bmpdata; } }; class VIEW3D_Driver_WX : public VIEW3D_Driver { public: VIEW3D_Driver_WX() : viewer(NULL) {} ~VIEW3D_Driver_WX() { delete viewer; } virtual bool IsRunning() { return viewer != NULL; } virtual void Launch() { if(viewer) return; delete viewer; viewer = new Mywxdlg3dViewer(); viewer->Show(true); } void Close() { delete viewer; viewer = NULL; } virtual void NewFrame() { if(!viewer) return; if(!viewer->IsShown()) { Close(); return; } viewer->NewFrame(); viewer->RepaintPanel(); } private: Mywxdlg3dViewer *viewer; }; #endif static VIEW3D_Driver nullView3d; BaseDriver::BaseDriver() : view3d(NULL) { VIEW3D_Shutdown(); } void BaseDriver::VIEW3D_Shutdown() { if(view3d != &nullView3d) delete view3d; view3d = &nullView3d; } void BaseDriver::VIEW3D_Init() { VIEW3D_Shutdown(); #ifdef HAVE_WX view3d = new VIEW3D_Driver_WX(); #endif } BaseDriver::~BaseDriver() { } desmume-0.9.9/src/mem.h0000644000175000017500000001117112140261633015437 0ustar guillaumeguillaume/* Copyright (C) 2005 Theo Berkau Copyright (C) 2005-2006 Guillaume Duhamel Copyright (C) 2008-2010 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef MEM_H #define MEM_H #include #include #include "types.h" //this was originally declared in MMU.h but we suffered some organizational problems and had to remove it enum MMU_ACCESS_TYPE { MMU_AT_CODE, //used for cpu prefetches MMU_AT_DATA, //used for cpu read/write MMU_AT_GPU, //used for gpu read/write MMU_AT_DMA, //used for dma read/write (blocks access to TCM) MMU_AT_DEBUG, //used for emulator debugging functions (bypasses some debug handling) }; static INLINE u8 T1ReadByte(u8* const mem, const u32 addr) { return mem[addr]; } static INLINE u16 T1ReadWord_guaranteedAligned(void* const mem, const u32 addr) { assert((addr&1)==0); #ifdef WORDS_BIGENDIAN return (((u8*)mem)[addr + 1] << 8) | ((u8*)mem)[addr]; #else return *(u16*)((u8*)mem + addr); #endif } static INLINE u16 T1ReadWord(void* const mem, const u32 addr) { #ifdef WORDS_BIGENDIAN return (((u8*)mem)[addr + 1] << 8) | ((u8*)mem)[addr]; #else return *((u16 *) ((u8*)mem + addr)); #endif } static INLINE u32 T1ReadLong_guaranteedAligned(u8* const mem, const u32 addr) { assert((addr&3)==0); #ifdef WORDS_BIGENDIAN return (mem[addr + 3] << 24 | mem[addr + 2] << 16 | mem[addr + 1] << 8 | mem[addr]); #else return *(u32*)(mem + addr); #endif } static INLINE u32 T1ReadLong(u8* const mem, u32 addr) { addr &= ~3; #ifdef WORDS_BIGENDIAN return (mem[addr + 3] << 24 | mem[addr + 2] << 16 | mem[addr + 1] << 8 | mem[addr]); #else return *(u32*)(mem + addr); #endif } static INLINE u64 T1ReadQuad(u8* const mem, const u32 addr) { #ifdef WORDS_BIGENDIAN return (u64(mem[addr + 7]) << 56 | u64(mem[addr + 6]) << 48 | u64(mem[addr + 5]) << 40 | u64(mem[addr + 4]) << 32 | u64(mem[addr + 3]) << 24 | u64(mem[addr + 2]) << 16 | u64(mem[addr + 1]) << 8 | u64(mem[addr ])); #else return *((u64 *) (mem + addr)); #endif } static INLINE void T1WriteByte(u8* const mem, const u32 addr, const u8 val) { mem[addr] = val; } static INLINE void T1WriteWord(u8* const mem, const u32 addr, const u16 val) { #ifdef WORDS_BIGENDIAN mem[addr + 1] = val >> 8; mem[addr] = val & 0xFF; #else *((u16 *) (mem + addr)) = val; #endif } static INLINE void T1WriteLong(u8* const mem, const u32 addr, const u32 val) { #ifdef WORDS_BIGENDIAN mem[addr + 3] = val >> 24; mem[addr + 2] = (val >> 16) & 0xFF; mem[addr + 1] = (val >> 8) & 0xFF; mem[addr] = val & 0xFF; #else *((u32 *) (mem + addr)) = val; #endif } static INLINE void T1WriteQuad(u8* const mem, const u32 addr, const u64 val) { #ifdef WORDS_BIGENDIAN mem[addr + 7] = (val >> 56); mem[addr + 6] = (val >> 48) & 0xFF; mem[addr + 5] = (val >> 40) & 0xFF; mem[addr + 4] = (val >> 32) & 0xFF; mem[addr + 3] = (val >> 24) & 0xFF; mem[addr + 2] = (val >> 16) & 0xFF; mem[addr + 1] = (val >> 8) & 0xFF; mem[addr] = val & 0xFF; #else *((u64 *) (mem + addr)) = val; #endif } //static INLINE u8 T2ReadByte(u8* const mem, const u32 addr) //{ //#ifdef WORDS_BIGENDIAN // return mem[addr ^ 1]; //#else // return mem[addr]; //#endif //} // static INLINE u16 HostReadWord(u8* const mem, const u32 addr) { return *((u16 *) (mem + addr)); } // //static INLINE u32 T2ReadLong(u8* const mem, const u32 addr) //{ //#ifdef WORDS_BIGENDIAN // return *((u16 *) (mem + addr + 2)) << 16 | *((u16 *) (mem + addr)); //#else // return *((u32 *) (mem + addr)); //#endif //} // //static INLINE void T2WriteByte(u8* const mem, const u32 addr, const u8 val) //{ //#ifdef WORDS_BIGENDIAN // mem[addr ^ 1] = val; //#else // mem[addr] = val; //#endif //} static INLINE void HostWriteWord(u8* const mem, const u32 addr, const u16 val) { *((u16 *) (mem + addr)) = val; } static INLINE void HostWriteTwoWords(u8* const mem, const u32 addr, const u32 val) { #ifdef WORDS_BIGENDIAN *((u16 *) (mem + addr + 2)) = val >> 16; *((u16 *) (mem + addr)) = val & 0xFFFF; #else *((u32 *) (mem + addr)) = val; #endif } #endif desmume-0.9.9/src/emufile.h0000644000175000017500000002004412140261633016306 0ustar guillaumeguillaume/* The MIT License Copyright (C) 2009-2012 DeSmuME team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ //don't use emufile for files bigger than 2GB! you have been warned! some day this will be fixed. #ifndef EMUFILE_H #define EMUFILE_H #include #include #include #include #include #include #include #include "emufile_types.h" #ifdef _MSC_VER #include #else #include #endif class EMUFILE { protected: bool failbit; public: EMUFILE() : failbit(false) {} //returns a new EMUFILE which is guranteed to be in memory. the EMUFILE you call this on may be deleted. use the returned EMUFILE in its place virtual EMUFILE* memwrap() = 0; virtual ~EMUFILE() {} static bool readAllBytes(std::vector* buf, const std::string& fname); bool fail(bool unset=false) { bool ret = failbit; if(unset) unfail(); return ret; } void unfail() { failbit=false; } bool eof() { return size()==ftell(); } size_t fread(const void *ptr, size_t bytes){ return _fread(ptr,bytes); } void unget() { fseek(-1,SEEK_CUR); } //virtuals public: virtual FILE *get_fp() = 0; virtual int fprintf(const char *format, ...) = 0; virtual int fgetc() = 0; virtual int fputc(int c) = 0; virtual size_t _fread(const void *ptr, size_t bytes) = 0; //removing these return values for now so we can find any code that might be using them and make sure //they handle the return values correctly virtual void fwrite(const void *ptr, size_t bytes) = 0; void write64le(u64* val); void write64le(u64 val); size_t read64le(u64* val); u64 read64le(); void write32le(u32* val); void write32le(s32* val) { write32le((u32*)val); } void write32le(u32 val); size_t read32le(u32* val); size_t read32le(s32* val); u32 read32le(); void write16le(u16* val); void write16le(s16* val) { write16le((u16*)val); } void write16le(u16 val); size_t read16le(s16* Bufo); size_t read16le(u16* val); u16 read16le(); void write8le(u8* val); void write8le(u8 val); size_t read8le(u8* val); u8 read8le(); void writedouble(double* val); void writedouble(double val); double readdouble(); size_t readdouble(double* val); virtual int fseek(int offset, int origin) = 0; virtual int ftell() = 0; virtual int size() = 0; virtual void fflush() = 0; virtual void truncate(s32 length) = 0; }; //todo - handle read-only specially? class EMUFILE_MEMORY : public EMUFILE { protected: std::vector *vec; bool ownvec; s32 pos, len; void reserve(u32 amt) { if(vec->size() < amt) vec->resize(amt); } public: EMUFILE_MEMORY(std::vector *underlying) : vec(underlying), ownvec(false), pos(0), len((s32)underlying->size()) { } EMUFILE_MEMORY(u32 preallocate) : vec(new std::vector()), ownvec(true), pos(0), len(0) { vec->resize(preallocate); len = preallocate; } EMUFILE_MEMORY() : vec(new std::vector()), ownvec(true), pos(0), len(0) { vec->reserve(1024); } EMUFILE_MEMORY(void* buf, s32 size) : vec(new std::vector()), ownvec(true), pos(0), len(size) { vec->resize(size); if(size != 0) memcpy(&vec->front(),buf,size); } ~EMUFILE_MEMORY() { if(ownvec) delete vec; } virtual EMUFILE* memwrap(); virtual void truncate(s32 length) { vec->resize(length); len = length; if(pos>length) pos=length; } u8* buf() { if(size()==0) reserve(1); return &(*vec)[0]; } std::vector* get_vec() { return vec; }; virtual FILE *get_fp() { return NULL; } virtual int fprintf(const char *format, ...) { va_list argptr; va_start(argptr, format); //we dont generate straight into the buffer because it will null terminate (one more byte than we want) int amt = vsnprintf(0,0,format,argptr); char* tempbuf = new char[amt+1]; va_end(argptr); va_start(argptr, format); vsprintf(tempbuf,format,argptr); fwrite(tempbuf,amt); delete[] tempbuf; va_end(argptr); return amt; }; virtual int fgetc() { u8 temp; //need an optimized codepath //if(_fread(&temp,1) != 1) // return EOF; //else return temp; u32 remain = len-pos; if(remain<1) { failbit = true; return -1; } temp = buf()[pos]; pos++; return temp; } virtual int fputc(int c) { u8 temp = (u8)c; //TODO //if(fwrite(&temp,1)!=1) return EOF; fwrite(&temp,1); return 0; } virtual size_t _fread(const void *ptr, size_t bytes); //removing these return values for now so we can find any code that might be using them and make sure //they handle the return values correctly virtual void fwrite(const void *ptr, size_t bytes){ reserve(pos+(s32)bytes); memcpy(buf()+pos,ptr,bytes); pos += (s32)bytes; len = std::max(pos,len); } virtual int fseek(int offset, int origin){ //work differently for read-only...? switch(origin) { case SEEK_SET: pos = offset; break; case SEEK_CUR: pos += offset; break; case SEEK_END: pos = size()+offset; break; default: assert(false); } reserve(pos); return 0; } virtual int ftell() { return pos; } virtual void fflush() {} void trim() { vec->resize(len); } virtual int size() { return (int)len; } }; class EMUFILE_FILE : public EMUFILE { protected: FILE* fp; std::string fname; char mode[16]; private: void open(const char* fname, const char* mode) { fp = fopen(fname,mode); if(!fp) failbit = true; this->fname = fname; strcpy(this->mode,mode); } public: EMUFILE_FILE(const std::string& fname, const char* mode) { open(fname.c_str(),mode); } EMUFILE_FILE(const char* fname, const char* mode) { open(fname,mode); } virtual ~EMUFILE_FILE() { if(NULL != fp) fclose(fp); } virtual FILE *get_fp() { return fp; } virtual EMUFILE* memwrap(); bool is_open() { return fp != NULL; } virtual void truncate(s32 length); virtual int fprintf(const char *format, ...) { va_list argptr; va_start(argptr, format); int ret = ::vfprintf(fp, format, argptr); va_end(argptr); return ret; }; virtual int fgetc() { return ::fgetc(fp); } virtual int fputc(int c) { return ::fputc(c, fp); } virtual size_t _fread(const void *ptr, size_t bytes){ size_t ret = ::fread((void*)ptr, 1, bytes, fp); if(ret < bytes) failbit = true; return ret; } //removing these return values for now so we can find any code that might be using them and make sure //they handle the return values correctly virtual void fwrite(const void *ptr, size_t bytes){ size_t ret = ::fwrite((void*)ptr, 1, bytes, fp); if(ret < bytes) failbit = true; } virtual int fseek(int offset, int origin) { return ::fseek(fp, offset, origin); } virtual int ftell() { return (u32)::ftell(fp); } virtual int size() { int oldpos = ftell(); fseek(0,SEEK_END); int len = ftell(); fseek(oldpos,SEEK_SET); return len; } virtual void fflush() { ::fflush(fp); } }; #endif desmume-0.9.9/src/PACKED.h0000644000175000017500000000030712140261633015607 0ustar guillaumeguillaume#ifndef __GNUC__ #pragma pack(push, 1) #pragma warning(disable : 4103) #endif #ifndef __PACKED #ifdef __GNUC__ #define __PACKED __attribute__((__packed__)) #else #define __PACKED #endif #endif desmume-0.9.9/src/firmware.cpp0000644000175000017500000005664612140261633017050 0ustar guillaumeguillaume/* Copyright (C) 2009-2011 DeSmuME Team This file 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 file 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 the this software. If not, see . */ #include "firmware.h" #include "NDSSystem.h" #include "path.h" #define DWNUM(i) ((i) >> 2) bool CFIRMWARE::getKeyBuf() { FILE *file = fopen(CommonSettings.ARM7BIOS, "rb"); if (!file) return false; fseek(file, 0x30, SEEK_SET); size_t res = fread(keyBuf, 4, 0x412, file); fclose(file); return (res == 0x412); } void CFIRMWARE::crypt64BitUp(u32 *ptr) { u32 Y = ptr[0]; u32 X = ptr[1]; for(u32 i = 0x00; i <= 0x0F; i++) { u32 Z = (keyBuf[i] ^ X); X = keyBuf[DWNUM(0x048 + (((Z >> 24) & 0xFF) << 2))]; X = (keyBuf[DWNUM(0x448 + (((Z >> 16) & 0xFF) << 2))] + X); X = (keyBuf[DWNUM(0x848 + (((Z >> 8) & 0xFF) << 2))] ^ X); X = (keyBuf[DWNUM(0xC48 + ((Z & 0xFF) << 2))] + X); X = (Y ^ X); Y = Z; } ptr[0] = (X ^ keyBuf[DWNUM(0x40)]); ptr[1] = (Y ^ keyBuf[DWNUM(0x44)]); } void CFIRMWARE::crypt64BitDown(u32 *ptr) { u32 Y = ptr[0]; u32 X = ptr[1]; for(u32 i = 0x11; i >= 0x02; i--) { u32 Z = (keyBuf[i] ^ X); X = keyBuf[DWNUM(0x048 + (((Z >> 24) & 0xFF) << 2))]; X = (keyBuf[DWNUM(0x448 + (((Z >> 16) & 0xFF) << 2))] + X); X = (keyBuf[DWNUM(0x848 + (((Z >> 8) & 0xFF) << 2))] ^ X); X = (keyBuf[DWNUM(0xC48 + ((Z & 0xFF) << 2))] + X); X = (Y ^ X); Y = Z; } ptr[0] = (X ^ keyBuf[DWNUM(0x04)]); ptr[1] = (Y ^ keyBuf[DWNUM(0x00)]); } #define bswap32(val) (((val & 0x000000FF) << 24) | ((val & 0x0000FF00) << 8) | ((val & 0x00FF0000) >> 8) | ((val & 0xFF000000) >> 24)) void CFIRMWARE::applyKeycode(u32 modulo) { crypt64BitUp(&keyCode[1]); crypt64BitUp(&keyCode[0]); u32 scratch[2] = {0x00000000, 0x00000000}; for(u32 i = 0; i <= 0x44; i += 4) { keyBuf[DWNUM(i)] = (keyBuf[DWNUM(i)] ^ bswap32(keyCode[DWNUM(i % modulo)])); } for(u32 i = 0; i <= 0x1040; i += 8) { crypt64BitUp(scratch); keyBuf[DWNUM(i)] = scratch[1]; keyBuf[DWNUM(i+4)] = scratch[0]; } } #undef bswap32 bool CFIRMWARE::initKeycode(u32 idCode, int level, u32 modulo) { if(getKeyBuf() == FALSE) return FALSE; keyCode[0] = idCode; keyCode[1] = (idCode >> 1); keyCode[2] = (idCode << 1); if(level >= 1) applyKeycode(modulo); if(level >= 2) applyKeycode(modulo); keyCode[1] <<= 1; keyCode[2] >>= 1; if(level >= 3) applyKeycode(modulo); return TRUE; } u16 CFIRMWARE::getBootCodeCRC16() { unsigned int i, j; u32 crc = 0xFFFF; const u16 val[8] = {0xC0C1, 0xC181, 0xC301, 0xC601, 0xCC01, 0xD801, 0xF001, 0xA001}; for(i = 0; i < size9; i++) { crc = (crc ^ tmp_data9[i]); for(j = 0; j < 8; j++) { if(crc & 0x0001) crc = ((crc >> 1) ^ (val[j] << (7-j))); else crc = (crc >> 1); } } for(i = 0; i < size7; i++) { crc = (crc ^ tmp_data7[i]); for(j = 0; j < 8; j++) { if(crc & 0x0001) crc = ((crc >> 1) ^ (val[j] << (7-j))); else crc = (crc >> 1); } } return (crc & 0xFFFF); } u32 CFIRMWARE::decrypt(const u8 *in, u8* &out) { u32 curBlock[2] = { 0 }; u32 blockSize = 0; u32 xLen = 0; u32 i = 0, j = 0; u32 xIn = 4, xOut = 0; u32 len = 0; u32 offset = 0; u32 windowOffset = 0; u8 d = 0; u16 data = 0; memcpy(curBlock, in, 8); crypt64BitDown(curBlock); blockSize = (curBlock[0] >> 8); if (blockSize == 0) return (0); out = new u8 [blockSize]; if (!out ) return (0); memset(out, 0xFF, blockSize); xLen = blockSize; while(xLen > 0) { d = T1ReadByte((u8*)curBlock, (xIn % 8)); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); crypt64BitDown(curBlock); } for(i = 0; i < 8; i++) { if(d & 0x80) { data = (T1ReadByte((u8*)curBlock, (xIn % 8)) << 8); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); crypt64BitDown(curBlock); } data |= T1ReadByte((u8*)curBlock, (xIn % 8)); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); crypt64BitDown(curBlock); } len = (data >> 12) + 3; offset = (data & 0xFFF); windowOffset = (xOut - offset - 1); for(j = 0; j < len; j++) { T1WriteByte(out, xOut, T1ReadByte(out, windowOffset)); xOut++; windowOffset++; xLen--; if(xLen == 0) return (blockSize); } } else { T1WriteByte(out, xOut, T1ReadByte((u8*)curBlock, (xIn % 8))); xOut++; xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); crypt64BitDown(curBlock); } xLen--; if(xLen == 0) return (blockSize); } d = ((d << 1) & 0xFF); } } return (blockSize); } u32 CFIRMWARE::decompress(const u8 *in, u8* &out) { u32 curBlock[2] = { 0 }; u32 blockSize = 0; u32 xLen = 0; u32 i = 0, j = 0; u32 xIn = 4, xOut = 0; u32 len = 0; u32 offset = 0; u32 windowOffset = 0; u8 d = 0; u16 data = 0; memcpy(curBlock, in, 8); blockSize = (curBlock[0] >> 8); if (blockSize == 0) return (0); out = new u8 [blockSize]; if (!out ) return (0); memset(out, 0xFF, blockSize); xLen = blockSize; while(xLen > 0) { d = T1ReadByte((u8*)curBlock, (xIn % 8)); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); } for(i = 0; i < 8; i++) { if(d & 0x80) { data = (T1ReadByte((u8*)curBlock, (xIn % 8)) << 8); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); } data |= T1ReadByte((u8*)curBlock, (xIn % 8)); xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); } len = (data >> 12) + 3; offset = (data & 0xFFF); windowOffset = (xOut - offset - 1); for(j = 0; j < len; j++) { T1WriteByte(out, xOut, T1ReadByte(out, windowOffset)); xOut++; windowOffset++; xLen--; if(xLen == 0) return (blockSize); } } else { T1WriteByte(out, xOut, T1ReadByte((u8*)curBlock, (xIn % 8))); xOut++; xIn++; if((xIn % 8) == 0) { memcpy(curBlock, in + xIn, 8); } xLen--; if(xLen == 0) return (blockSize); } d = ((d << 1) & 0xFF); } } return (blockSize); } //================================================================================ bool CFIRMWARE::load() { u32 size = 0; u8 *data = NULL; u16 shift1 = 0, shift2 = 0, shift3 = 0, shift4 = 0; u32 part1addr = 0, part2addr = 0, part3addr = 0, part4addr = 0, part5addr = 0; u32 part1ram = 0, part2ram = 0; u32 src = 0; if (CommonSettings.UseExtFirmware == false) return false; if (strlen(CommonSettings.Firmware) == 0) return false; FILE *fp = fopen(CommonSettings.Firmware, "rb"); if (!fp) return false; fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); if( (size != 256*1024) && (size != 512*1024) ) { fclose(fp); return false; } #if 1 if (size == 512*1024) { INFO("ERROR: 32Mbit (512Kb) firmware not supported\n"); fclose(fp); return false; } #endif data = new u8 [size]; if (!data) { fclose(fp); return false; } if (fread(data, 1, size, fp) != size) { delete [] data; fclose(fp); return false; } memcpy(&header, data, sizeof(header)); if ((header.fw_identifier[0] != 'M') || (header.fw_identifier[1] != 'A') || (header.fw_identifier[2] != 'C')) { delete [] data; fclose(fp); return false; } shift1 = ((header.shift_amounts >> 0) & 0x07); shift2 = ((header.shift_amounts >> 3) & 0x07); shift3 = ((header.shift_amounts >> 6) & 0x07); shift4 = ((header.shift_amounts >> 9) & 0x07); // todo - add support for 512Kb part1addr = (header.part1_rom_boot9_addr << (2 + shift1)); part1ram = (0x02800000 - (header.part1_ram_boot9_addr << (2+shift2))); part2addr = (header.part2_rom_boot7_addr << (2+shift3)); part2ram = (0x03810000 - (header.part2_ram_boot7_addr << (2+shift4))); part3addr = (header.part3_rom_gui9_addr << 3); part4addr = (header.part4_rom_wifi7_addr << 3); part5addr = (header.part5_data_gfx_addr << 3); ARM9bootAddr = part1ram; ARM7bootAddr = part2ram; if(initKeycode(T1ReadLong(data, 0x08), 1, 0xC) == FALSE) { delete [] data; fclose(fp); return false; } #if 0 crypt64BitDown((u32*)&data[0x18]); #else // fix touch coords data[0x18] = 0x00; data[0x19] = 0x00; data[0x1A] = 0x00; data[0x1B] = 0x00; data[0x1C] = 0x00; data[0x1D] = 0xFF; data[0x1E] = 0x00; data[0x1F] = 0x00; #endif if(initKeycode(T1ReadLong(data, 0x08), 2, 0xC) == FALSE) { delete [] data; fclose(fp); return false; } size9 = decrypt(data + part1addr, tmp_data9); if (!tmp_data9) { delete [] data; fclose(fp); return false; } size7 = decrypt(data + part2addr, tmp_data7); if (!tmp_data7) { delete [] tmp_data9; delete [] data; fclose(fp); return false; } u16 crc16_mine = getBootCodeCRC16(); if (crc16_mine != header.part12_boot_crc16) { INFO("Firmware: ERROR: the boot code CRC16 (0x%04X) doesn't match the value in the firmware header (0x%04X)", crc16_mine, header.part12_boot_crc16); delete [] tmp_data9; delete [] tmp_data7; delete [] data; fclose(fp); return false; } // Copy firmware boot codes to their respective locations src = 0; for(u32 i = 0; i < (size9 >> 2); i++) { _MMU_write32(part1ram, T1ReadLong(tmp_data9, src)); src += 4; part1ram += 4; } src = 0; for(u32 i = 0; i < (size7 >> 2); i++) { _MMU_write32(part2ram, T1ReadLong(tmp_data7, src)); src += 4; part2ram += 4; } delete [] tmp_data7; delete [] tmp_data9; patched = false; if (data[0x17C] != 0xFF) patched = true; INFO("Firmware:\n"); INFO("- path: %s\n", CommonSettings.Firmware); INFO("- size: %i bytes (%i Mbit)\n", size, size/1024/8); INFO("- CRC : 0x%04X\n", header.part12_boot_crc16); INFO("- header: \n"); INFO(" * size firmware %i\n", ((header.shift_amounts >> 12) & 0xF) * 128 * 1024); INFO(" * ARM9 boot code address: 0x%08X\n", part1addr); INFO(" * ARM9 boot code RAM address: 0x%08X\n", ARM9bootAddr); INFO(" * ARM9 unpacked size: 0x%08X (%i) bytes\n", size9, size9); INFO(" * ARM9 GUI code address: 0x%08X\n", part3addr); INFO("\n"); INFO(" * ARM7 boot code address: 0x%08X\n", part2addr); INFO(" * ARM7 boot code RAM address: 0x%08X\n", ARM7bootAddr); INFO(" * ARM7 WiFi code address: 0x%08X\n", part4addr); INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", size7, size7); INFO("\n"); INFO(" * Data/GFX address: 0x%08X\n", part5addr); if (patched) { u32 patch_offset = 0x3FC80; if (data[0x17C] > 1) patch_offset = 0x3F680; memcpy(&header, data + patch_offset, sizeof(header)); shift1 = ((header.shift_amounts >> 0) & 0x07); shift2 = ((header.shift_amounts >> 3) & 0x07); shift3 = ((header.shift_amounts >> 6) & 0x07); shift4 = ((header.shift_amounts >> 9) & 0x07); // todo - add support for 512Kb part1addr = (header.part1_rom_boot9_addr << (2 + shift1)); part1ram = (0x02800000 - (header.part1_ram_boot9_addr << (2+shift2))); part2addr = (header.part2_rom_boot7_addr << (2+shift3)); part2ram = (0x03810000 - (header.part2_ram_boot7_addr << (2+shift4))); ARM9bootAddr = part1ram; ARM7bootAddr = part2ram; size9 = decompress(data + part1addr, tmp_data9); if (!tmp_data9) { delete [] data; fclose(fp); return false; } size7 = decompress(data + part2addr, tmp_data7); if (!tmp_data7) { delete [] tmp_data9; delete [] data; fclose(fp); return false; }; // Copy firmware boot codes to their respective locations src = 0; for(u32 i = 0; i < (size9 >> 2); i++) { _MMU_write32(part1ram, T1ReadLong(tmp_data9, src)); src += 4; part1ram += 4; } src = 0; for(u32 i = 0; i < (size7 >> 2); i++) { _MMU_write32(part2ram, T1ReadLong(tmp_data7, src)); src += 4; part2ram += 4; } delete [] tmp_data7; delete [] tmp_data9; INFO("\nFlashme:\n"); INFO("- header: \n"); INFO(" * ARM9 boot code address: 0x%08X\n", part1addr); INFO(" * ARM9 boot code RAM address: 0x%08X\n", ARM9bootAddr); INFO(" * ARM9 unpacked size: 0x%08X (%i) bytes\n", size9, size9); INFO("\n"); INFO(" * ARM7 boot code address: 0x%08X\n", part2addr); INFO(" * ARM7 boot code RAM address: 0x%08X\n", ARM7bootAddr); INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", size7, size7); } // Generate the path for the external firmware config file. std::string extFilePath = CFIRMWARE::GetExternalFilePath(); strncpy(MMU.fw.userfile, extFilePath.c_str(), MAX_PATH); fclose(fp); fp = fopen(MMU.fw.userfile, "rb"); if (fp) { fseek(fp, 0, SEEK_END); if (ftell(fp) == (0x100 + 0x1D6 + 0x300)) { fseek(fp, 0, SEEK_SET); char buf[0x301]; memset(buf, 0, sizeof(buf)); if (fread(buf, 1, 0x100, fp) == 0x100) { printf("- loaded firmware config from %s:\n", MMU.fw.userfile); memcpy(&data[0x3FE00], &buf[0], 0x100); memcpy(&data[0x3FF00], &buf[0], 0x100); printf(" * User settings\n"); memset(buf, 0, sizeof(buf)); if (fread(buf, 1, 0x1D6, fp) == 0x1D6) { memcpy(&data[0x002A], &buf[0], 0x1D6); printf(" * WiFi settings\n"); memset(buf, 0, sizeof(buf)); if (fread(buf, 1, 0x300, fp) == 0x300) { memcpy(&data[0x3FA00], &buf[0], 0x300); printf(" * WiFi AP settings\n"); } } } } else printf("- failed loading firmware config from %s (wrong file size)\n", MMU.fw.userfile); fclose(fp); } printf("\n"); // TODO: add 512Kb support memcpy(MMU.fw.data, data, 256*1024); MMU.fw.fp = NULL; delete [] data; data = NULL; return true; } std::string CFIRMWARE::GetExternalFilePath() { std::string fwPath = CommonSettings.Firmware; std::string fwFileName = Path::GetFileNameFromPathWithoutExt(fwPath); std::string configPath = path.pathToBattery; std::string finalPath = configPath + DIRECTORY_DELIMITER_CHAR + fwFileName + FILE_EXT_DELIMITER_CHAR + FW_CONFIG_FILE_EXT; return finalPath; } //===================================================================================================== static u32 calc_CRC16( u32 start, const u8 *data, int count) { int i,j; u32 crc = start & 0xffff; const u16 val[8] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 }; for(i = 0; i < count; i++) { crc = crc ^ data[i]; for(j = 0; j < 8; j++) { int do_bit = 0; if ( crc & 0x1) do_bit = 1; crc = crc >> 1; if ( do_bit) { crc = crc ^ (val[j] << (7-j)); } } } return crc; } int copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data) { /* * Determine which of the two user settings in the firmware is the current * and valid one and then copy this into the destination buffer. * * The current setting will have a greater count. * Settings are only valid if its CRC16 is correct. */ int user1_valid = 0; int user2_valid = 0; u32 user_settings_offset; u32 fw_crc; u32 crc; int copy_good = 0; user_settings_offset = fw_data[0x20]; user_settings_offset |= fw_data[0x21] << 8; user_settings_offset <<= 3; if ( user_settings_offset <= 0x3FE00) { s32 copy_settings_offset = -1; crc = calc_CRC16( 0xffff, &fw_data[user_settings_offset], NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT); fw_crc = fw_data[user_settings_offset + 0x72]; fw_crc |= fw_data[user_settings_offset + 0x73] << 8; if ( crc == fw_crc) { user1_valid = 1; } crc = calc_CRC16( 0xffff, &fw_data[user_settings_offset + 0x100], NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT); fw_crc = fw_data[user_settings_offset + 0x100 + 0x72]; fw_crc |= fw_data[user_settings_offset + 0x100 + 0x73] << 8; if ( crc == fw_crc) { user2_valid = 1; } if ( user1_valid) { if ( user2_valid) { u16 count1, count2; count1 = fw_data[user_settings_offset + 0x70]; count1 |= fw_data[user_settings_offset + 0x71] << 8; count2 = fw_data[user_settings_offset + 0x100 + 0x70]; count2 |= fw_data[user_settings_offset + 0x100 + 0x71] << 8; if ( count2 > count1) { copy_settings_offset = user_settings_offset + 0x100; } else { copy_settings_offset = user_settings_offset; } } else { copy_settings_offset = user_settings_offset; } } else if ( user2_valid) { /* copy the second user settings */ copy_settings_offset = user_settings_offset + 0x100; } if ( copy_settings_offset > 0) { memcpy( dest_buffer, &fw_data[copy_settings_offset], NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT); copy_good = 1; } } return copy_good; } static void fill_user_data_area( struct NDS_fw_config_data *user_settings,u8 *data, int count) { u32 crc; int i; u8 *ts_cal_data_area; memset( data, 0, 0x100); // version data[0x00] = 5; data[0x01] = 0; // colour data[0x02] = user_settings->fav_colour; // birthday month and day data[0x03] = user_settings->birth_month; data[0x04] = user_settings->birth_day; //nickname and length for ( i = 0; i < MAX_FW_NICKNAME_LENGTH; i++) { data[0x06 + (i * 2)] = user_settings->nickname[i] & 0xff; data[0x06 + (i * 2) + 1] = (user_settings->nickname[i] >> 8) & 0xff; } data[0x1a] = user_settings->nickname_len; //Message for ( i = 0; i < MAX_FW_MESSAGE_LENGTH; i++) { data[0x1c + (i * 2)] = user_settings->message[i] & 0xff; data[0x1c + (i * 2) + 1] = (user_settings->message[i] >> 8) & 0xff; } data[0x50] = user_settings->message_len; //touch screen calibration ts_cal_data_area = &data[0x58]; for ( i = 0; i < 2; i++) { // ADC x y *ts_cal_data_area++ = user_settings->touch_cal[i].adc_x & 0xff; *ts_cal_data_area++ = (user_settings->touch_cal[i].adc_x >> 8) & 0xff; *ts_cal_data_area++ = user_settings->touch_cal[i].adc_y & 0xff; *ts_cal_data_area++ = (user_settings->touch_cal[i].adc_y >> 8) & 0xff; //screen x y *ts_cal_data_area++ = user_settings->touch_cal[i].screen_x; *ts_cal_data_area++ = user_settings->touch_cal[i].screen_y; } //language and flags data[0x64] = user_settings->language; data[0x65] = 0xfc; //update count and crc data[0x70] = count & 0xff; data[0x71] = (count >> 8) & 0xff; crc = calc_CRC16( 0xffff, data, 0x70); data[0x72] = crc & 0xff; data[0x73] = (crc >> 8) & 0xff; memset( &data[0x74], 0xff, 0x100 - 0x74); } // creates an firmware flash image, which contains all needed info to initiate a wifi connection int NDS_CreateDummyFirmware( struct NDS_fw_config_data *user_settings) { //Create the firmware header memset( MMU.fw.data, 0, 0x40000); //firmware identifier MMU.fw.data[0x8] = 'M'; MMU.fw.data[0x8 + 1] = 'A'; MMU.fw.data[0x8 + 2] = 'C'; MMU.fw.data[0x8 + 3] = 'P'; // DS type if ( user_settings->ds_type == NDS_CONSOLE_TYPE_LITE) MMU.fw.data[0x1d] = 0x20; else MMU.fw.data[0x1d] = 0xff; //User Settings offset 0x3fe00 / 8 MMU.fw.data[0x20] = 0xc0; MMU.fw.data[0x21] = 0x7f; //User settings (at 0x3FE00 and 0x3FF00) fill_user_data_area( user_settings, &MMU.fw.data[ 0x3FE00], 0); fill_user_data_area( user_settings, &MMU.fw.data[ 0x3FF00], 1); // Wifi config length MMU.fw.data[0x2C] = 0x38; MMU.fw.data[0x2D] = 0x01; MMU.fw.data[0x2E] = 0x00; //Wifi version MMU.fw.data[0x2F] = 0x00; //MAC address memcpy((MMU.fw.data + 0x36), FW_Mac, sizeof(FW_Mac)); //Enabled channels MMU.fw.data[0x3C] = 0xFE; MMU.fw.data[0x3D] = 0x3F; MMU.fw.data[0x3E] = 0xFF; MMU.fw.data[0x3F] = 0xFF; //RF related MMU.fw.data[0x40] = 0x02; MMU.fw.data[0x41] = 0x18; MMU.fw.data[0x42] = 0x0C; MMU.fw.data[0x43] = 0x01; //Wifi I/O init values memcpy((MMU.fw.data + 0x44), FW_WIFIInit, sizeof(FW_WIFIInit)); //Wifi BB init values memcpy((MMU.fw.data + 0x64), FW_BBInit, sizeof(FW_BBInit)); //Wifi RF init values memcpy((MMU.fw.data + 0xCE), FW_RFInit, sizeof(FW_RFInit)); //Wifi channel-related init values memcpy((MMU.fw.data + 0xF2), FW_RFChannel, sizeof(FW_RFChannel)); memcpy((MMU.fw.data + 0x146), FW_BBChannel, sizeof(FW_BBChannel)); memset((MMU.fw.data + 0x154), 0x10, 0xE); //WFC profiles memcpy((MMU.fw.data + 0x3FA40), &FW_WFCProfile1, sizeof(FW_WFCProfile)); memcpy((MMU.fw.data + 0x3FB40), &FW_WFCProfile2, sizeof(FW_WFCProfile)); memcpy((MMU.fw.data + 0x3FC40), &FW_WFCProfile3, sizeof(FW_WFCProfile)); (*(u16*)(MMU.fw.data + 0x3FAFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FA00), 0xFE); (*(u16*)(MMU.fw.data + 0x3FBFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FB00), 0xFE); (*(u16*)(MMU.fw.data + 0x3FCFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FC00), 0xFE); MMU.fw.data[0x162] = 0x19; memset((MMU.fw.data + 0x163), 0xFF, 0x9D); //Wifi settings CRC16 (*(u16*)(MMU.fw.data + 0x2A)) = calc_CRC16(0, (MMU.fw.data + 0x2C), 0x138); if (&CommonSettings.InternalFirmConf != user_settings) memcpy(&CommonSettings.InternalFirmConf, user_settings, sizeof(struct NDS_fw_config_data)); return TRUE ; } void NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config) { const char *default_nickname = "DeSmuME"; const char *default_message = "DeSmuME makes you happy!"; int i; int str_length; memset( fw_config, 0, sizeof( struct NDS_fw_config_data)); fw_config->ds_type = NDS_CONSOLE_TYPE_FAT; fw_config->fav_colour = 7; fw_config->birth_day = 23; fw_config->birth_month = 6; str_length = strlen( default_nickname); for ( i = 0; i < str_length; i++) { fw_config->nickname[i] = default_nickname[i]; } fw_config->nickname_len = str_length; str_length = strlen( default_message); for ( i = 0; i < str_length; i++) { fw_config->message[i] = default_message[i]; } fw_config->message_len = str_length; //default to English fw_config->language = 1; // default touchscreen calibration //ANCIENT DESMUME VALUES fw_config->touch_cal[0].adc_x = 0x200; fw_config->touch_cal[0].adc_y = 0x200; fw_config->touch_cal[0].screen_x = 0x20 + 1; // calibration screen coords are 1-based, fw_config->touch_cal[0].screen_y = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong. //VALUES FROM NOCASH //fw_config->touch_cal[0].adc_x = 0x02DF; //fw_config->touch_cal[0].adc_y = 0x032C; //fw_config->touch_cal[0].screen_x = 0x20; //fw_config->touch_cal[0].screen_y = 0x20; //ANCIENT DESMUME VALUES fw_config->touch_cal[1].adc_x = 0xe00; fw_config->touch_cal[1].adc_y = 0x800; fw_config->touch_cal[1].screen_x = 0xe0 + 1; fw_config->touch_cal[1].screen_y = 0x80 + 1; //VALUES FROM NOCASH //fw_config->touch_cal[1].adc_x = 0x0D3B; //fw_config->touch_cal[1].adc_y = 0x0CE7; //fw_config->touch_cal[1].screen_x = 0xE0; //fw_config->touch_cal[1].screen_y = 0xA0; } void NDS_PatchFirmwareMAC() { memcpy((MMU.fw.data + 0x36), FW_Mac, sizeof(FW_Mac)); (*(u16*)(MMU.fw.data + 0x2A)) = calc_CRC16(0, (MMU.fw.data + 0x2C), 0x138); } desmume-0.9.9/src/mic.h0000644000175000017500000000211612140261633015430 0ustar guillaumeguillaume/* Copyright (C) 2009-2011 DeSmuME Team This file 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 file 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 the this software. If not, see . */ #ifndef MIC_H #define MIC_H #include #include "emufile.h" #include "types.h" #ifdef WIN32 static char MicSampleName[256]; bool LoadSample(const char *name); #endif extern int MicDisplay; #ifdef FAKE_MIC void Mic_DoNoise(BOOL); #endif BOOL Mic_Init(void); void Mic_Reset(void); void Mic_DeInit(void); u8 Mic_ReadSample(void); void mic_savestate(EMUFILE* os); bool mic_loadstate(EMUFILE* is, int size); #endif // MIC_H desmume-0.9.9/src/FIFO.h0000644000175000017500000000433412140261633015407 0ustar guillaumeguillaume/* Copyright 2006 yopyop Copyright 2007 shash Copyright 2007-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef FIFO_H #define FIFO_H #include "types.h" //=================================================== IPC FIFO typedef struct { u32 buf[16]; u8 head; u8 tail; u8 size; } IPC_FIFO; extern IPC_FIFO ipc_fifo[2]; extern void IPC_FIFOinit(u8 proc); extern void IPC_FIFOsend(u8 proc, u32 val); extern u32 IPC_FIFOrecv(u8 proc); extern void IPC_FIFOcnt(u8 proc, u16 val); //=================================================== GFX FIFO //yeah, its oversize for now. thats a simpler solution //moon seems to overdrive the fifo with immediate dmas //i think this might be nintendo code too #define HACK_GXIFO_SIZE 200000 typedef struct { u8 cmd[HACK_GXIFO_SIZE]; u32 param[HACK_GXIFO_SIZE]; u32 head; // start position u32 tail; // tail u32 size; // size FIFO buffer u32 matrix_stack_op_size; //number of matrix stack items in the fifo (stack is busy when this is nonzero) } GFX_FIFO; typedef struct { u8 cmd[4]; u32 param[4]; u8 head; u8 tail; u8 size; } GFX_PIPE; extern GFX_PIPE gxPIPE; extern GFX_FIFO gxFIFO; extern void GFX_PIPEclear(); extern void GFX_FIFOclear(); extern void GFX_FIFOsend(u8 cmd, u32 param); extern BOOL GFX_PIPErecv(u8 *cmd, u32 *param); extern void GFX_FIFOcnt(u32 val); //=================================================== Display memory FIFO typedef struct { u32 buf[0x6000]; // 256x192 32K color u32 head; // head u32 tail; // tail } DISP_FIFO; extern DISP_FIFO disp_fifo; extern void DISP_FIFOinit(); extern void DISP_FIFOsend(u32 val); extern u32 DISP_FIFOrecv(); #endif desmume-0.9.9/src/commandline.h0000644000175000017500000000534412140261633017154 0ustar guillaumeguillaume/* Copyright (C) 2009-2011 DeSmuME team This file 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 file 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 the this software. If not, see . */ #ifndef _COMMANDLINE_H_ #define _COMMANDLINE_H_ #include #include "types.h" //I hate C. we have to forward declare these with more detail than I like typedef struct _GOptionContext GOptionContext; typedef struct _GError GError; //hacky commandline options that i didnt want to route through commonoptions extern int _commandline_linux_nojoy; //this class will also eventually try to take over the responsibility of using the args that it handles //for example: preparing the emulator run by loading the rom, savestate, and/or movie in the correct pattern. //it should also populate CommonSettings with its initial values class CommandLine { public: //actual options: these may move to another sturct int load_slot; int depth_threshold; int autodetect_method; std::string nds_file; std::string play_movie_file; std::string record_movie_file; int arm9_gdb_port, arm7_gdb_port; int start_paused; std::string cflash_image; std::string cflash_path; std::string gbaslot_rom; std::string slot1; std::string console_type; std::string slot1_fat_dir; #ifndef _MSC_VER int disable_sound; int disable_limiter; #endif //load up the common commandline options void loadCommonOptions(); bool parse(int argc,char **argv); //validate the common commandline options bool validate(); //process movie play/record commands void process_movieCommands(); //etc. void process_addonCommands(); bool is_cflash_configured; //print a little help message for cases when erroneous commandlines are entered void errorHelp(const char* binName); CommandLine(); ~CommandLine(); GError *error; GOptionContext *ctx; private: char* _play_movie_file; char* _record_movie_file; char* _cflash_image; char* _cflash_path; char* _gbaslot_rom; char* _bios_arm9, *_bios_arm7; int _bios_swi; int _spu_advanced; int _num_cores; int _rigorous_timing; int _advanced_timing; #ifdef HAVE_JIT int _cpu_mode; int _jit_size; #endif char* _slot1; char *_slot1_fat_dir; char* _console_type; }; #endif desmume-0.9.9/src/render3D.cpp0000644000175000017500000001305012140261633016660 0ustar guillaumeguillaume/* Copyright (C) 2006-2007 shash Copyright (C) 2008-2013 DeSmuME team This file 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 file 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 the this software. If not, see . */ #include "render3D.h" #include "gfx3d.h" #include "MMU.h" #include "texcache.h" int cur3DCore = GPU3D_NULL; GPU3DInterface gpu3DNull = { "None", Default3D_Init, Default3D_Reset, Default3D_Close, Default3D_Render, Default3D_RenderFinish, Default3D_VramReconfigureSignal }; GPU3DInterface *gpu3D = &gpu3DNull; static bool default3DAlreadyClearedLayer = false; char Default3D_Init() { default3DAlreadyClearedLayer = false; return 1; } void Default3D_Reset() { default3DAlreadyClearedLayer = false; TexCache_Reset(); } void Default3D_Close() { memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen)); default3DAlreadyClearedLayer = false; } void Default3D_Render() { if (!default3DAlreadyClearedLayer) { memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen)); default3DAlreadyClearedLayer = true; } } void Default3D_RenderFinish() { // Do nothing } void Default3D_VramReconfigureSignal() { TexCache_Invalidate(); } void NDS_3D_SetDriver (int core3DIndex) { cur3DCore = core3DIndex; gpu3D = core3DList[cur3DCore]; } bool NDS_3D_ChangeCore(int newCore) { gpu3D->NDS_3D_Close(); NDS_3D_SetDriver(newCore); if(gpu3D->NDS_3D_Init() == 0) { NDS_3D_SetDriver(GPU3D_NULL); gpu3D->NDS_3D_Init(); return false; } return true; } Render3DError Render3D::BeginRender(const GFX3D_State *renderState) { return RENDER3DERROR_NOERR; } Render3DError Render3D::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { return RENDER3DERROR_NOERR; } Render3DError Render3D::DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) { return RENDER3DERROR_NOERR; } Render3DError Render3D::PostRender() { return RENDER3DERROR_NOERR; } Render3DError Render3D::EndRender(const u64 frameCount) { return RENDER3DERROR_NOERR; } Render3DError Render3D::UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll) { return RENDER3DERROR_NOERR; } Render3DError Render3D::UpdateToonTable(const u16 *toonTableBuffer) { return RENDER3DERROR_NOERR; } Render3DError Render3D::ClearFramebuffer(const GFX3D_State *renderState) { Render3DError error = RENDER3DERROR_NOERR; struct GFX3D_ClearColor { u8 r; u8 g; u8 b; u8 a; } clearColor; clearColor.r = renderState->clearColor & 0x1F; clearColor.g = (renderState->clearColor >> 5) & 0x1F; clearColor.b = (renderState->clearColor >> 10) & 0x1F; clearColor.a = (renderState->clearColor >> 16) & 0x1F; const u8 clearStencil = (renderState->clearColor >> 24) & 0x3F; if (renderState->enableClearImage) { const u16 *__restrict clearColorBuffer = (u16 *__restrict)MMU.texInfo.textureSlotAddr[2]; const u16 *__restrict clearDepthBuffer = (u16 *__restrict)MMU.texInfo.textureSlotAddr[3]; const u16 scrollBits = T1ReadWord(MMU.ARM9_REG, 0x356); //CLRIMAGE_OFFSET const u8 xScroll = scrollBits & 0xFF; const u8 yScroll = (scrollBits >> 8) & 0xFF; error = this->UpdateClearImage(clearColorBuffer, clearDepthBuffer, clearStencil, xScroll, yScroll); if (error == RENDER3DERROR_NOERR) { error = this->ClearUsingImage(); } else { error = this->ClearUsingValues(clearColor.r, clearColor.g, clearColor.b, clearColor.a, renderState->clearDepth, clearStencil); } } else { error = this->ClearUsingValues(clearColor.r, clearColor.g, clearColor.b, clearColor.a, renderState->clearDepth, clearStencil); } return error; } Render3DError Render3D::ClearUsingImage() const { return RENDER3DERROR_NOERR; } Render3DError Render3D::ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const { return RENDER3DERROR_NOERR; } Render3DError Render3D::SetupPolygon(const POLY *thePoly) { return RENDER3DERROR_NOERR; } Render3DError Render3D::SetupTexture(const POLY *thePoly, bool enableTexturing) { return RENDER3DERROR_NOERR; } Render3DError Render3D::SetupViewport(const POLY *thePoly) { return RENDER3DERROR_NOERR; } Render3DError Render3D::Reset() { return RENDER3DERROR_NOERR; } Render3DError Render3D::Render(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, const u64 frameCount) { Render3DError error = RENDER3DERROR_NOERR; error = this->BeginRender(renderState); if (error != RENDER3DERROR_NOERR) { return error; } this->UpdateToonTable(renderState->u16ToonTable); this->ClearFramebuffer(renderState); this->PreRender(renderState, vertList, polyList, indexList); this->DoRender(renderState, vertList, polyList, indexList); this->PostRender(); this->EndRender(frameCount); return error; } Render3DError Render3D::RenderFinish() { return RENDER3DERROR_NOERR; } Render3DError Render3D::VramReconfigureSignal() { TexCache_Invalidate(); return RENDER3DERROR_NOERR; } desmume-0.9.9/install-sh0000755000175000017500000003325612140304537015736 0ustar guillaumeguillaume#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: desmume-0.9.9/Makefile.in0000644000175000017500000006160412140304540015767 0ustar guillaumeguillaume# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in \ $(top_srcdir)/autopackage/default.apspec.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ TODO compile config.guess config.sub depcomp install-sh \ missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = autopackage/default.apspec CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@ GTKGLEXT_LIBS = @GTKGLEXT_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LDFLAGS = @LDFLAGS@ LIBAGG_CFLAGS = @LIBAGG_CFLAGS@ LIBAGG_LIBS = @LIBAGG_LIBS@ LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@ LIBGLADE_LIBS = @LIBGLADE_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@ LIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_DIR = @PO_DIR@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SDLCONFIG = @SDLCONFIG@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UI_DIR = @UI_DIR@ UPDATEDESKTOP = @UPDATEDESKTOP@ USE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ desmume_arch = @desmume_arch@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README.LIN README.MAC README.WIN dsm.txt dsv.txt autogen.sh \ $(PO_FILES_IN) DISTCLEANFILES = $(PO_FILES) SUBDIRS = $(PO_DIR) src all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): autopackage/default.apspec: $(top_builddir)/config.status $(top_srcdir)/autopackage/default.apspec.in cd $(top_builddir) && $(SHELL) ./config.status $@ # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: desmume-0.9.9/dsm.txt0000644000175000017500000001054112140261635015247 0ustar guillaumeguillaumeDSM is ascii plain text. It is derived from the FCEUX FM2 format. It consists of several key-value pairs followed by an inputlog section. The inputlog section can be identified by its starting with a | (pipe). The inputlog section terminates at eof. Newlines may be \r\n or \n Key-value pairs consist of a key identifier, followed by a space separator, followed by the value text. Value text is always terminated by a newline, which the value text will not include. The value text is parsed differently depending on the type of the key. The key-value pairs may be in any order, except that the first key must be version. Integer keys (also used for booleans, with a 1 or 0) will have a value that is a simple integer not to exceed 32bits - version (required) - the version of the movie file format; for now it is always 3 - emuVersion (required) - the version of the emulator used to produce the movie - rerecordCount (optional) - the rerecord count - romChecksum (optional) - the CRC32 of the rom used to make the movie. should match values specified on advanscene.com - romSerial (optional) - a concatenation of other uniquely identifying information about the rom (name,gamecode,makercode) - useExtBios (optional) - were bios files was used? defaults to false. - swiFromBios (optional) - were swi emulated by ExtBios? (alternative is internal HLE bios). defaults to false. The rom identification information may be used at a later point to warn about mismatches between movies and roms, but is not right now. String keys have values that consist of the remainder of the key-value pair line. As a consequence, string values cannot contain newlines. - romFilename (required) - the name of the file used to record the movie - comment (optional) - simply a memo. by convention, the first token in the comment value is the subject of the comment. by convention, subsequent comments with the same subject will have their ordering preserved and may be used to approximate multiline comments. by convention, the author of the movie should be stored in comment(s) with a subject of: author Hex string keys (used for binary blobs) will have a value that is like 0x0123456789ABCDEF... - romChecksum (required) - this is currently unused. GUID keys have a value which is in the standard guid format: 452DE2C3-EF43-2FA9-77AC-0677FC51543B - guid (required) a unique identifier for a movie, generated when the movie is created, which is used when loading a savestate to make sure it belongs to the current movie. The inputlog section consists of lines beginning and ending with a | (pipe). The fields are as follows, except as noted in note C. |c|.............XXX YYY Z| 'R','L','D','U','T','S','B','A','Y','X','W','E','G' field c is a variable length decimal integer which is a bitfield corresponding to miscellaneous input states which are valid at the start of the frame. Therefore, no miscellaneous commands is represented by a value of 0. Here are the currently defined bit values: 0x01 - Microphone Noise (hardcoded noise sample; to be held through duration of frame) 0x02 - Reset 0x04 - Lid the format of the main section is as follows: the field begins with 13 characters which constitute a bitfield. any character other than ' ' or '.' means that the button was pressed. by convention, the following mnemonics will be used in a column to remind us of which button corresponds to which column: RLDUTSBAYXWEG (Right,Left,Down,Up,sTart,Select,B,A,Y,X,lshoulder,rshoulder,debuG) This ordering is based on FCEUX to a certain extent, and arbitrary after that. W and E were chosen for shoulders to suggest West and East for Left and Right. While the emulator supports a 'lid' button, and to some extent a 'blow' button, these are not supported in the movies. XXX: %03d, the x position of the stylus (0,0 topleft, 255,191 bottomright) YYY: %03d, the y position of the stylus Z: %1d, 1 if the stylus is pressed pressed; 0 if not Additional fields after this main section may be added later without breaking the file format. * Notes * A. There is no key-value pair that indicates the length of the movie. This must be read by scanning the inputlog and counting the number of lines. B. All movies start from power-on. C. The emulator uses these framerate constants arm7_cycles_per_frame = 560190 frames_per_second = 59.8261 desmume-0.9.9/depcomp0000755000175000017500000005064312140304540015300 0ustar guillaumeguillaume#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. # 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, 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 for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: desmume-0.9.9/dsv.txt0000644000175000017500000000340012140261635015254 0ustar guillaumeguillaumeThe desmume save file format is merely a raw save file with a FOOTER. This was chosen in order to maximize compatibility with other emulators, which tend load the savefile as-is and let the game read out of whatever range it is expecting. To assist with this, before writing the save file, desmume will pad the raw save file out to the next highest known length. Note that this may sometimes be incorrect if the savefile hasnt been written through to the end during initialization. This could cause other emulators to fail to recognize the save file. Additionally, the footer makes it easier to analyze save files, because the game's data will be at the correct addresses starting at offset 0x0000. The footer format can be identified by locating the 16Byte ascii string "|-DESMUME SAVE-|" at the end of the file. This corresponds with the following save structure: struct Footer { u32 actually_written_size; u32 padded_size; u32 save_type; //(not currently used) u32 address_size; //address bus size u32 save_size; //size parameter of the save type (not currently used) u32 version_number; //should be 0 char cookie[16]; }; note that padded_size should be where you see the end of the raw save data and the beginning of desmume-specific information, including some junk before the actual footer. actually_written_size is the highest address (plus one) written to by the game. The new desmume savefile system tries to make as few decisions as possible, which is the reason for the behavior of actually_written_size and the disuse of save_type and save_size. If few decisions are made, then few mistakes can be made. That is the idea, anyway. We'll make decisions later if we need to. save_type and save_size are reserved in case we do.